sp_armthumb.c 4.7 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937110938110939110940110941110942110943110944110945110946110947110948110949110950110951110952110953110954110955110956110957110958110959110960110961110962110963110964110965110966110967110968110969110970110971110972110973110974110975110976110977110978110979110980110981110982110983110984110985110986110987110988110989110990110991110992110993110994110995110996110997110998110999111000111001111002111003111004111005111006111007111008111009111010111011111012111013111014111015111016111017111018111019111020111021111022111023111024111025111026111027111028111029111030111031111032111033111034111035111036111037111038111039111040111041111042111043111044111045111046111047111048111049111050111051111052111053111054111055111056111057111058111059111060111061111062111063111064111065111066111067111068111069111070111071111072111073111074111075111076111077111078111079111080111081111082111083111084111085111086111087111088111089111090111091111092111093111094111095111096111097111098111099111100111101111102111103111104111105111106111107111108111109111110111111111112111113111114111115111116111117111118111119111120111121111122111123111124111125111126111127111128111129111130111131111132111133111134111135111136111137111138111139111140111141111142111143111144111145111146111147111148111149111150111151111152111153111154111155111156111157111158111159111160111161111162111163111164111165111166111167111168111169111170111171111172111173111174111175111176111177111178111179111180111181111182111183111184111185111186111187111188111189111190111191111192111193111194111195111196111197111198111199111200111201111202111203111204111205111206111207111208111209111210111211111212111213111214111215111216111217111218111219111220111221111222111223111224111225111226111227111228111229111230111231111232111233111234111235111236111237111238111239111240111241111242111243111244111245111246111247111248111249111250111251111252111253111254111255111256111257111258111259111260111261111262111263111264111265111266111267111268111269111270111271111272111273111274111275111276111277111278111279111280111281111282111283111284111285111286111287111288111289111290111291111292111293111294111295111296111297111298111299111300111301111302111303111304111305111306111307111308111309111310111311111312111313111314111315111316111317111318111319111320111321111322111323111324111325111326111327111328111329111330111331111332111333111334111335111336111337111338111339111340111341111342111343111344111345111346111347111348111349111350111351111352111353111354111355111356111357111358111359111360111361111362111363111364111365111366111367111368111369111370111371111372111373111374111375111376111377111378111379111380111381111382111383111384111385111386111387111388111389111390111391111392111393111394111395111396111397111398111399111400111401111402111403111404111405111406111407111408111409111410111411111412111413111414111415111416111417111418111419111420111421111422111423111424111425111426111427111428111429111430111431111432111433111434111435111436111437111438111439111440111441111442111443111444111445111446111447111448111449111450111451111452111453111454111455111456111457111458111459111460111461111462111463111464111465111466111467111468111469111470111471111472111473111474111475111476111477111478111479111480111481111482111483111484111485111486111487111488111489111490111491111492111493111494111495111496111497111498111499111500111501111502111503111504111505111506111507111508111509111510111511111512111513111514111515111516111517111518111519111520111521111522111523111524111525111526111527111528111529111530111531111532111533111534111535111536111537111538111539111540111541111542111543111544111545111546111547111548111549111550111551111552111553111554111555111556111557111558111559111560111561111562111563111564111565111566111567111568111569111570111571111572111573111574111575111576111577111578111579111580111581111582111583111584111585111586111587111588111589111590111591111592111593111594111595111596111597111598111599111600111601111602111603111604111605111606111607111608111609111610111611111612111613111614111615111616111617111618111619111620111621111622111623111624111625111626111627111628111629111630111631111632111633111634111635111636111637111638111639111640111641111642111643111644111645111646111647111648111649111650111651111652111653111654111655111656111657111658111659111660111661111662111663111664111665111666111667111668111669111670111671111672111673111674111675111676111677111678111679111680111681111682111683111684111685111686111687111688111689111690111691111692111693111694111695111696111697111698111699111700111701111702111703111704111705111706111707111708111709111710111711111712111713111714111715111716111717111718111719111720111721111722111723111724111725111726111727111728111729111730111731111732111733111734111735111736111737111738111739111740111741111742111743111744111745111746111747111748111749111750111751111752111753111754111755111756111757111758111759111760111761111762111763111764111765111766111767111768111769111770111771111772111773111774111775111776111777111778111779111780111781111782111783111784111785111786111787111788111789111790111791111792111793111794111795111796111797111798111799111800111801111802111803111804111805111806111807111808111809111810111811111812111813111814111815111816111817111818111819111820111821111822111823111824111825111826111827111828111829111830111831111832111833111834111835111836111837111838111839111840111841111842111843111844111845111846111847111848111849111850111851111852111853111854111855111856111857111858111859111860111861111862111863111864111865111866111867111868111869111870111871111872111873111874111875111876111877111878111879111880111881111882111883111884111885111886111887111888111889111890111891111892111893111894111895111896111897111898111899111900111901111902111903111904111905111906111907111908111909111910111911111912111913111914111915111916111917111918111919111920111921111922111923111924111925111926111927111928111929111930111931111932111933111934111935111936111937111938111939111940111941111942111943111944111945111946111947111948111949111950111951111952111953111954111955111956111957111958111959111960111961111962111963111964111965111966111967111968111969111970111971111972111973111974111975111976111977111978111979111980111981111982111983111984111985111986111987111988111989111990111991111992111993111994111995111996111997111998111999112000112001112002112003112004112005112006112007112008112009112010112011112012112013112014112015112016112017112018112019112020112021112022112023112024112025112026112027112028112029112030112031112032112033112034112035112036112037112038112039112040112041112042112043112044112045112046112047112048112049112050112051112052112053112054112055112056112057112058112059112060112061112062112063112064112065112066112067112068112069112070112071112072112073112074112075112076112077112078112079112080112081112082112083112084112085112086112087112088112089112090112091112092112093112094112095112096112097112098112099112100112101112102112103112104112105112106112107112108112109112110112111112112112113112114112115112116112117112118112119112120112121112122112123112124112125112126112127112128112129112130112131112132112133112134112135112136112137112138112139112140112141112142112143112144112145112146112147112148112149112150112151112152112153112154112155112156112157112158112159112160112161112162112163112164112165112166112167112168112169112170112171112172112173112174112175112176112177112178112179112180112181112182112183112184112185112186112187112188112189112190112191112192112193112194112195112196112197112198112199112200112201112202112203112204112205112206112207112208112209112210112211112212112213112214112215112216112217112218112219112220112221112222112223112224112225112226112227112228112229112230112231112232112233112234112235112236112237112238112239112240112241112242112243112244112245112246112247112248112249112250112251112252112253112254112255112256112257112258112259112260112261112262112263112264112265112266112267112268112269112270112271112272112273112274112275112276112277112278112279112280112281112282112283112284112285112286112287112288112289112290112291112292112293112294112295112296112297112298112299112300112301112302112303112304112305112306112307112308112309112310112311112312112313112314112315112316112317112318112319112320112321112322112323112324112325112326112327112328112329112330112331112332112333112334112335112336112337112338112339112340112341112342112343112344112345112346112347112348112349112350112351112352112353112354112355112356112357112358112359112360112361112362112363112364112365112366112367112368112369112370112371112372112373112374112375112376112377112378112379112380112381112382112383112384112385112386112387112388112389112390112391112392112393112394112395112396112397112398112399112400112401112402112403112404112405112406112407112408112409112410112411112412112413112414112415112416112417112418112419112420112421112422112423112424112425112426112427112428112429112430112431112432112433112434112435112436112437112438112439112440112441112442112443112444112445112446112447112448112449112450112451112452112453112454112455112456112457112458112459112460112461112462112463112464112465112466112467112468112469112470112471112472112473112474112475112476112477112478112479112480112481112482112483112484112485112486112487112488112489112490112491112492112493112494112495112496112497112498112499112500112501112502112503112504112505112506112507112508112509112510112511112512112513112514112515112516112517112518112519112520112521112522112523112524112525112526112527112528112529112530112531112532112533112534112535112536112537112538112539112540112541112542112543112544112545112546112547112548112549112550112551112552112553112554112555112556112557112558112559112560112561112562112563112564112565112566112567112568112569112570112571112572112573112574112575112576112577112578112579112580112581112582112583112584112585112586112587112588112589112590112591112592112593112594112595112596112597112598112599112600112601112602112603112604112605112606112607112608112609112610112611112612112613112614112615112616112617112618112619112620112621112622112623112624112625112626112627112628112629112630112631112632112633112634112635112636112637112638112639112640112641112642112643112644112645112646112647112648112649112650112651112652112653112654112655112656112657112658112659112660112661112662112663112664112665112666112667112668112669112670112671112672112673112674112675112676112677112678112679112680112681112682112683112684112685112686112687112688112689112690112691112692112693112694112695112696112697112698112699112700112701112702112703112704112705112706112707112708112709112710112711112712112713112714112715112716112717112718112719112720112721112722112723112724112725112726112727112728112729112730112731112732112733112734112735112736112737112738112739112740112741112742112743112744112745112746112747112748112749112750112751112752112753112754112755112756112757112758112759112760112761112762112763112764112765112766112767112768112769112770112771112772112773112774112775112776112777112778112779112780112781112782112783112784112785112786112787112788112789112790112791112792112793112794112795112796112797112798112799112800112801112802112803112804112805112806112807112808112809112810112811112812112813112814112815112816112817112818112819112820112821112822112823112824112825112826112827112828112829112830112831112832112833112834112835112836112837112838112839112840112841112842112843112844112845112846112847112848112849112850112851112852112853112854112855112856112857112858112859112860112861112862112863112864112865112866112867112868112869112870112871112872112873112874112875112876112877112878112879112880112881112882112883112884112885112886112887112888112889112890112891112892112893112894112895112896112897112898112899112900112901112902112903112904112905112906112907112908112909112910112911112912112913112914112915112916112917112918112919112920112921112922112923112924112925112926112927112928112929112930112931112932112933112934112935112936112937112938112939112940112941112942112943112944112945112946112947112948112949112950112951112952112953112954112955112956112957112958112959112960112961112962112963112964112965112966112967112968112969112970112971112972112973112974112975112976112977112978112979112980112981112982112983112984112985112986112987112988112989112990112991112992112993112994112995112996112997112998112999113000113001113002113003113004113005113006113007113008113009113010113011113012113013113014113015113016113017113018113019113020113021113022113023113024113025113026113027113028113029113030113031113032113033113034113035113036113037113038113039113040113041113042113043113044113045113046113047113048113049113050113051113052113053113054113055113056113057113058113059113060113061113062113063113064113065113066113067113068113069113070113071113072113073113074113075113076113077113078113079113080113081113082113083113084113085113086113087113088113089113090113091113092113093113094113095113096113097113098113099113100113101113102113103113104113105113106113107113108113109113110113111113112113113113114113115113116113117113118113119113120113121113122113123113124113125113126113127113128113129113130113131113132113133113134113135113136113137113138113139113140113141113142113143113144113145113146113147113148113149113150113151113152113153113154113155113156113157113158113159113160113161113162113163113164113165113166113167113168113169113170113171113172113173113174113175113176113177113178113179113180113181113182113183113184113185113186113187113188113189113190113191113192113193113194113195113196113197113198113199113200113201113202113203113204113205113206113207113208113209113210113211113212113213113214113215113216113217113218113219113220113221113222113223113224113225113226113227113228113229113230113231113232113233113234113235113236113237113238113239113240113241113242113243113244113245113246113247113248113249113250113251113252113253113254113255113256113257113258113259113260113261113262113263113264113265113266113267113268113269113270113271113272113273113274113275113276113277113278113279113280113281113282113283113284113285113286113287113288113289113290113291113292113293113294113295113296113297113298113299113300113301113302113303113304113305113306113307113308113309113310113311113312113313113314113315113316113317113318113319113320113321113322113323113324113325113326113327113328113329113330113331113332113333113334113335113336113337113338113339113340113341113342113343113344113345113346113347113348113349113350113351113352113353113354113355113356113357113358113359113360113361113362113363113364113365113366113367113368113369113370113371113372113373113374113375113376113377113378113379113380113381113382113383113384113385113386113387113388113389113390113391113392113393113394113395113396113397113398113399113400113401113402113403113404113405113406113407113408113409113410113411113412113413113414113415113416113417113418113419113420113421113422113423113424113425113426113427113428113429113430113431113432113433113434113435113436113437113438113439113440113441113442113443113444113445113446113447113448113449113450113451113452113453113454113455113456113457113458113459113460113461113462113463113464113465113466113467113468113469113470113471113472113473113474113475113476113477113478113479113480113481113482113483113484113485113486113487113488113489113490113491113492113493113494113495113496113497113498113499113500113501113502113503113504113505113506113507113508113509113510113511113512113513113514113515113516113517113518113519113520113521113522113523113524113525113526113527113528113529113530113531113532113533113534113535113536113537113538113539113540113541113542113543113544113545113546113547113548113549113550113551113552113553113554113555113556113557113558113559113560113561113562113563113564113565113566113567113568113569113570113571113572113573113574113575113576113577113578113579113580113581113582113583113584113585113586113587113588113589113590113591113592113593113594113595113596113597113598113599113600113601113602113603113604113605113606113607113608113609113610113611113612113613113614113615113616113617113618113619113620113621113622113623113624113625113626113627113628113629113630113631113632113633113634113635113636113637113638113639113640113641113642113643113644113645113646113647113648113649113650113651113652113653113654113655113656113657113658113659113660113661113662113663113664113665113666113667113668113669113670113671113672113673113674113675113676113677113678113679113680113681113682113683113684113685113686113687113688113689113690113691113692113693113694113695113696113697113698113699113700113701113702113703113704113705113706113707113708113709113710113711113712113713113714113715113716113717113718113719113720113721113722113723113724113725113726113727113728113729113730113731113732113733113734113735113736113737113738113739113740113741113742113743113744113745113746113747113748113749113750113751113752113753113754113755113756113757113758113759113760113761113762113763113764113765113766113767113768113769113770113771113772113773113774113775113776113777113778113779113780113781113782113783113784113785113786113787113788113789113790113791113792113793113794113795113796113797113798113799113800113801113802113803113804113805113806113807113808113809113810113811113812113813113814113815113816113817113818113819113820113821113822113823113824113825113826113827113828113829113830113831113832113833113834113835113836113837113838113839113840113841113842113843113844113845113846113847113848113849113850113851113852113853113854113855113856113857113858113859113860113861113862113863113864113865113866113867113868113869113870113871113872113873113874113875113876113877113878113879113880113881113882113883113884113885113886113887113888113889113890113891113892113893113894113895113896113897113898113899113900113901113902113903113904113905113906113907113908113909113910113911113912113913113914113915113916113917113918113919113920113921113922113923113924113925113926113927113928113929113930113931113932113933113934113935113936113937113938113939113940113941113942113943113944113945113946113947113948113949113950113951113952113953113954113955113956113957113958113959113960113961113962113963113964113965113966113967113968113969113970113971113972113973113974113975113976113977113978113979113980113981113982113983113984113985113986113987113988113989113990113991113992113993113994113995113996113997113998113999114000114001114002114003114004114005114006114007114008114009114010114011114012114013114014114015114016114017114018114019114020114021114022114023114024114025114026114027114028114029114030114031114032114033114034114035114036114037114038114039114040114041114042114043114044114045114046114047114048114049114050114051114052114053114054114055114056114057114058114059114060114061114062114063114064114065114066114067114068114069114070114071114072114073114074114075114076114077114078114079114080114081114082114083114084114085114086114087114088114089114090114091114092114093114094114095114096114097114098114099114100114101114102114103114104114105114106114107114108114109114110114111114112114113114114114115114116114117114118114119114120114121114122114123114124114125114126114127114128114129114130114131114132114133114134114135114136114137114138114139114140114141114142114143114144114145114146114147114148114149114150114151114152114153114154114155114156114157114158114159114160114161114162114163114164114165114166114167114168114169114170114171114172114173114174114175114176114177114178114179114180114181114182114183114184114185114186114187114188114189114190114191114192114193114194114195114196114197114198114199114200114201114202114203114204114205114206114207114208114209114210114211114212114213114214114215114216114217114218114219114220114221114222114223114224114225114226114227114228114229114230114231114232114233114234114235114236114237114238114239114240114241114242114243114244114245114246114247114248114249114250114251114252114253114254114255114256114257114258114259114260114261114262114263114264114265114266114267114268114269114270114271114272114273114274114275114276114277114278114279114280114281114282114283114284114285114286114287114288114289114290114291114292114293114294114295114296114297114298114299114300114301114302114303114304114305114306114307114308114309114310114311114312114313114314114315114316114317114318114319114320114321114322114323114324114325114326114327114328114329114330114331114332114333114334114335114336114337114338114339114340114341114342114343114344114345114346114347114348114349114350114351114352114353114354114355114356114357114358114359114360114361114362114363114364114365114366114367114368114369114370114371114372114373114374114375114376114377114378114379114380114381114382114383114384114385114386114387114388114389114390114391114392114393114394114395114396114397114398114399114400114401114402114403114404114405114406114407114408114409114410114411114412114413114414114415114416114417114418114419114420114421114422114423114424114425114426114427114428114429114430114431114432114433114434114435114436114437114438114439114440114441114442114443114444114445114446114447114448114449114450114451114452114453114454114455114456114457114458114459114460114461114462114463114464114465114466114467114468114469114470114471114472114473114474114475114476114477114478114479114480114481114482114483114484114485114486114487114488114489114490114491114492114493114494114495114496114497114498114499114500114501114502114503114504114505114506114507114508114509114510114511114512114513114514114515114516114517114518114519114520114521114522114523114524114525114526114527114528114529114530114531114532114533114534114535114536114537114538114539114540114541114542114543114544114545114546114547114548114549114550114551114552114553114554114555114556114557114558114559114560114561114562114563114564114565114566114567114568114569114570114571114572114573114574114575114576114577114578114579114580114581114582114583114584114585114586114587114588114589114590114591114592114593114594114595114596114597114598114599114600114601114602114603114604114605114606114607114608114609114610114611114612114613114614114615114616114617114618114619114620114621114622114623114624114625114626114627114628114629114630114631114632114633114634114635114636114637114638114639114640114641114642114643114644114645114646114647114648114649114650114651114652114653114654114655114656114657114658114659114660114661114662114663114664114665114666114667114668114669114670114671114672114673114674114675114676114677114678114679114680114681114682114683114684114685114686114687114688114689114690114691114692114693114694114695114696114697114698114699114700114701114702114703114704114705114706114707114708114709114710114711114712114713114714114715114716114717114718114719114720114721114722114723114724114725114726114727114728114729114730114731114732114733114734114735114736114737114738114739114740114741114742114743114744114745114746114747114748114749114750114751114752114753114754114755114756114757114758114759114760114761114762114763114764114765114766114767114768114769114770114771114772114773114774114775114776114777114778114779114780114781114782114783114784114785114786114787114788114789114790114791114792114793114794114795114796114797114798114799114800114801114802114803114804114805114806114807114808114809114810114811114812114813114814114815114816114817114818114819114820114821114822114823114824114825114826114827114828114829114830114831114832114833114834114835114836114837114838114839114840114841114842114843114844114845114846114847114848114849114850114851114852114853114854114855114856114857114858114859114860114861114862114863114864114865114866114867114868114869114870114871114872114873114874114875114876114877114878114879114880114881114882114883114884114885114886114887114888114889114890114891114892114893114894114895114896114897114898114899114900114901114902114903114904114905114906114907114908114909114910114911114912114913114914114915114916114917114918114919114920114921114922114923114924114925114926114927114928114929114930114931114932114933114934114935114936114937114938114939114940114941114942114943114944114945114946114947114948114949114950114951114952114953114954114955114956114957114958114959114960114961114962114963114964114965114966114967114968114969114970114971114972114973114974114975114976114977114978114979114980114981114982114983114984114985114986114987114988114989114990114991114992114993114994114995114996114997114998114999115000115001115002115003115004115005115006115007115008115009115010115011115012115013115014115015115016115017115018115019115020115021115022115023115024115025115026115027115028115029115030115031115032115033115034115035115036115037115038115039115040115041115042115043115044115045115046115047115048115049115050115051115052115053115054115055115056115057115058115059115060115061115062115063115064115065115066115067115068115069115070115071115072115073115074115075115076115077115078115079115080115081115082115083115084115085115086115087115088115089115090115091115092115093115094115095115096115097115098115099115100115101115102115103115104115105115106115107115108115109115110115111115112115113115114115115115116115117115118115119115120115121115122115123115124115125115126115127115128115129115130115131115132115133115134115135115136115137115138115139115140115141115142115143115144115145115146115147115148115149115150115151115152115153115154115155115156115157115158115159115160115161115162115163115164115165115166115167115168115169115170115171115172115173115174115175115176115177115178115179115180115181115182115183115184115185115186115187115188115189115190115191115192115193115194115195115196115197115198115199115200115201115202115203115204115205115206115207115208115209115210115211115212115213115214115215115216115217115218115219115220115221115222115223115224115225115226115227115228115229115230115231115232115233115234115235115236115237115238115239115240115241115242115243115244115245115246115247115248115249115250115251115252115253115254115255115256115257115258115259115260115261115262115263115264115265115266115267115268115269115270115271115272115273115274115275115276115277115278115279115280115281115282115283115284115285115286115287115288115289115290115291115292115293115294115295115296115297115298115299115300115301115302115303115304115305115306115307115308115309115310115311115312115313115314115315115316115317115318115319115320115321115322115323115324115325115326115327115328115329115330115331115332115333115334115335115336115337115338115339115340115341115342115343115344115345115346115347115348115349115350115351115352115353115354115355115356115357115358115359115360115361115362115363115364115365115366115367115368115369115370115371115372115373115374115375115376115377115378115379115380115381115382115383115384115385115386115387115388115389115390115391115392115393115394115395115396115397115398115399115400115401115402115403115404115405115406115407115408115409115410115411115412115413115414115415115416115417115418115419115420115421115422115423115424115425115426115427115428115429115430115431115432115433115434115435115436115437115438115439115440115441115442115443115444115445115446115447115448115449115450115451115452115453115454115455115456115457115458115459115460115461115462115463115464115465115466115467115468115469115470115471115472115473115474115475115476115477115478115479115480115481115482115483115484115485115486115487115488115489115490115491115492115493115494115495115496115497115498115499115500115501115502115503115504115505115506115507115508115509115510115511115512115513115514115515115516115517115518115519115520115521115522115523115524115525115526115527115528115529115530115531115532115533115534115535115536115537115538115539115540115541115542115543115544115545115546115547115548115549115550115551115552115553115554115555115556115557115558115559115560115561115562115563115564115565115566115567115568115569115570115571115572115573115574115575115576115577115578115579115580115581115582115583115584115585115586115587115588115589115590115591115592115593115594115595115596115597115598115599115600115601115602115603115604115605115606115607115608115609115610115611115612115613115614115615115616115617115618115619115620115621115622115623115624115625115626115627115628115629115630115631115632115633115634115635115636115637115638115639115640115641115642115643115644115645115646115647115648115649115650115651115652115653115654115655115656115657115658115659115660115661115662115663115664115665115666115667115668115669115670115671115672115673115674115675115676115677115678115679115680115681115682115683115684115685115686115687115688115689115690115691115692115693115694115695115696115697115698115699115700115701115702115703115704115705115706115707115708115709115710115711115712115713115714115715115716115717115718115719115720115721115722115723115724115725115726115727115728115729115730115731115732115733115734115735115736115737115738115739115740115741115742115743115744115745115746115747115748115749115750115751115752115753115754115755115756115757115758115759115760115761115762115763115764115765115766115767115768115769115770115771115772115773115774115775115776115777115778115779115780115781115782115783115784115785115786115787115788115789115790115791115792115793115794115795115796115797115798115799115800115801115802115803115804115805115806115807115808115809115810115811115812115813115814115815115816115817115818115819115820115821115822115823115824115825115826115827115828115829115830115831115832115833115834115835115836115837115838115839115840115841115842115843115844115845115846115847115848115849115850115851115852115853115854115855115856115857115858115859115860115861115862115863115864115865115866115867115868115869115870115871115872115873115874115875115876115877115878115879115880115881115882115883115884115885115886115887115888115889115890115891115892115893115894115895115896115897115898115899115900115901115902115903115904115905115906115907115908115909115910115911115912115913115914115915115916115917115918115919115920115921115922115923115924115925115926115927115928115929115930115931115932115933115934115935115936115937115938115939115940115941115942115943115944115945115946115947115948115949115950115951115952115953115954115955115956115957115958115959115960115961115962115963115964115965115966115967115968115969115970115971115972115973115974115975115976115977115978115979115980115981115982115983115984115985115986115987115988115989115990115991115992115993115994115995115996115997115998115999116000116001116002116003116004116005116006116007116008116009116010116011116012116013116014116015116016116017116018116019116020116021116022116023116024116025116026116027116028116029116030116031116032116033116034116035116036116037116038116039116040116041116042116043116044116045116046116047116048116049116050116051116052116053116054116055116056116057116058116059116060116061116062116063116064116065116066116067116068116069116070116071116072116073116074116075116076116077116078116079116080116081116082116083116084116085116086116087116088116089116090116091116092116093116094116095116096116097116098116099116100116101116102116103116104116105116106116107116108116109116110116111116112116113116114116115116116116117116118116119116120116121116122116123116124116125116126116127116128116129116130116131116132116133116134116135116136116137116138116139116140116141116142116143116144116145116146116147116148116149116150116151116152116153116154116155116156116157116158116159116160116161116162116163116164116165116166116167116168116169116170116171116172116173116174116175116176116177116178116179116180116181116182116183116184116185116186116187116188116189116190116191116192116193116194116195116196116197116198116199116200116201116202116203116204116205116206116207116208116209116210116211116212116213116214116215116216116217116218116219116220116221116222116223116224116225116226116227116228116229116230116231116232116233116234116235116236116237116238116239116240116241116242116243116244116245116246116247116248116249116250116251116252116253116254116255116256116257116258116259116260116261116262116263116264116265116266116267116268116269116270116271116272116273116274116275116276116277116278116279116280116281116282116283116284116285116286116287116288116289116290116291116292116293116294116295116296116297116298116299116300116301116302116303116304116305116306116307116308116309116310116311116312116313116314116315116316116317116318116319116320116321116322116323116324116325116326116327116328116329116330116331116332116333116334116335116336116337116338116339116340116341116342116343116344116345116346116347116348116349116350116351116352116353116354116355116356116357116358116359116360116361116362116363116364116365116366116367116368116369116370116371116372116373116374116375116376116377116378116379116380116381116382116383116384116385116386116387116388116389116390116391116392116393116394116395116396116397116398116399116400116401116402116403116404116405116406116407116408116409116410116411116412116413116414116415116416116417116418116419116420116421116422116423116424116425116426116427116428116429116430116431116432116433116434116435116436116437116438116439116440116441116442116443116444116445116446116447116448116449116450116451116452116453116454116455116456116457116458116459116460116461116462116463116464116465116466116467116468116469116470116471116472116473116474116475116476116477116478116479116480116481116482116483116484116485116486116487116488116489116490116491116492116493116494116495116496116497116498116499116500116501116502116503116504116505116506116507116508116509116510116511116512116513116514116515116516116517116518116519116520116521116522116523116524116525116526116527116528116529116530116531116532116533116534116535116536116537116538116539116540116541116542116543116544116545116546116547116548116549116550116551116552116553116554116555116556116557116558116559116560116561116562116563116564116565116566116567116568116569116570116571116572116573116574116575116576116577116578116579116580116581116582116583116584116585116586116587116588116589116590116591116592116593116594116595116596116597116598116599116600116601116602116603116604116605116606116607116608116609116610116611116612116613116614116615116616116617116618116619116620116621116622116623116624116625116626116627116628116629116630116631116632116633116634116635116636116637116638116639116640116641116642116643116644116645116646116647116648116649116650116651116652116653116654116655116656116657116658116659116660116661116662116663116664116665116666116667116668116669116670116671116672116673116674116675116676116677116678116679116680116681116682116683116684116685116686116687116688116689116690116691116692116693116694116695116696116697116698116699116700116701116702116703116704116705116706116707116708116709116710116711116712116713116714116715116716116717116718116719116720116721116722116723116724116725116726116727116728116729116730116731116732116733116734116735116736116737116738116739116740116741116742116743116744116745116746116747116748116749116750116751116752116753116754116755116756116757116758116759116760116761116762116763116764116765116766116767116768116769116770116771116772116773116774116775116776116777116778116779116780116781116782116783116784116785116786116787116788116789116790116791116792116793116794116795116796116797116798116799116800116801116802116803116804116805116806116807116808116809116810116811116812116813116814116815116816116817116818116819116820116821116822116823116824116825116826116827116828116829116830116831116832116833116834116835116836116837116838116839116840116841116842116843116844116845116846116847116848116849116850116851116852116853116854116855116856116857116858116859116860116861116862116863116864116865116866116867116868116869116870116871116872116873116874116875116876116877116878116879116880116881116882116883116884116885116886116887116888116889116890116891116892116893116894116895116896116897116898116899116900116901116902116903116904116905116906116907116908116909116910116911116912116913116914116915116916116917116918116919116920116921116922116923116924116925116926116927116928116929116930116931116932116933116934116935116936116937116938116939116940116941116942116943116944116945116946116947116948116949116950116951116952116953116954116955116956116957116958116959116960116961116962116963116964116965116966116967116968116969116970116971116972116973116974116975116976116977116978116979116980116981116982116983116984116985116986116987116988116989116990116991116992116993116994116995116996116997116998116999117000117001117002117003117004117005117006117007117008117009117010117011117012117013117014117015117016117017117018117019117020117021117022117023117024117025117026117027117028117029117030117031117032117033117034117035117036117037117038117039117040117041117042117043117044117045117046117047117048117049117050117051117052117053117054117055117056117057117058117059117060117061117062117063117064117065117066117067117068117069117070117071117072117073117074117075117076117077117078117079117080117081117082117083117084117085117086117087117088117089117090117091117092117093117094117095117096117097117098117099117100117101117102117103117104117105117106117107117108117109117110117111117112117113117114117115117116117117117118117119117120117121117122117123117124117125117126117127117128117129117130117131117132117133117134117135117136117137117138117139117140117141117142117143117144117145117146117147117148117149117150117151117152117153117154117155117156117157117158117159117160117161117162117163117164117165117166117167117168117169117170117171117172117173117174117175117176117177117178117179117180117181117182117183117184117185117186117187117188117189117190117191117192117193117194117195117196117197117198117199117200117201117202117203117204117205117206117207117208117209117210117211117212117213117214117215117216117217117218117219117220117221117222117223117224117225117226117227117228117229117230117231117232117233117234117235117236117237117238117239117240117241117242117243117244117245117246117247117248117249117250117251117252117253117254117255117256117257117258117259117260117261117262117263117264117265117266117267117268117269117270117271117272117273117274117275117276117277117278117279117280117281117282117283117284117285117286117287117288117289117290117291117292117293117294117295117296117297117298117299117300117301117302117303117304117305117306117307117308117309117310117311117312117313117314117315117316117317117318117319117320117321117322117323117324117325117326117327117328117329117330117331117332117333117334117335117336117337117338117339117340117341117342117343117344117345117346117347117348117349117350117351117352117353117354117355117356117357117358117359117360117361117362117363117364117365117366117367117368117369117370117371117372117373117374117375117376117377117378117379117380117381117382117383117384117385117386117387117388117389117390117391117392117393117394117395117396117397117398117399117400117401117402117403117404117405117406117407117408117409117410117411117412117413117414117415117416117417117418117419117420117421117422117423117424117425117426117427117428117429117430117431117432117433117434117435117436117437117438117439117440117441117442117443117444117445117446117447117448117449117450117451117452117453117454117455117456117457117458117459117460117461117462117463117464117465117466117467117468117469117470117471117472117473117474117475117476117477117478117479117480117481117482117483117484117485117486117487117488117489117490117491117492117493117494117495117496117497117498117499117500117501117502117503117504117505117506117507117508117509117510117511117512117513117514117515117516117517117518117519117520117521117522117523117524117525117526117527117528117529117530117531117532117533117534117535117536117537117538117539117540117541117542117543117544117545117546117547117548117549117550117551117552117553117554117555117556117557117558117559117560117561117562117563117564117565117566117567117568117569117570117571117572117573117574117575117576117577117578117579117580117581117582117583117584117585117586117587117588117589117590117591117592117593117594117595117596117597117598117599117600117601117602117603117604117605117606117607117608117609117610117611117612117613117614117615117616117617117618117619117620117621117622117623117624117625117626117627117628117629117630117631117632117633117634117635117636117637117638117639117640117641117642117643117644117645117646117647117648117649117650117651117652117653117654117655117656117657117658117659117660117661117662117663117664117665117666117667117668117669117670117671117672117673117674117675117676117677117678117679117680117681117682117683117684117685117686117687117688117689117690117691117692117693117694117695117696117697117698117699117700117701117702117703117704117705117706117707117708117709117710117711117712117713117714117715117716117717117718117719117720117721117722117723117724117725117726117727117728117729117730117731117732117733117734117735117736117737117738117739117740117741117742117743117744117745117746117747117748117749117750117751117752117753117754117755117756117757117758117759117760117761117762117763117764117765117766117767117768117769117770117771117772117773117774117775117776117777117778117779117780117781117782117783117784117785117786117787117788117789117790117791117792117793117794117795117796117797117798117799117800117801117802117803117804117805117806117807117808117809117810117811117812117813117814117815117816117817117818117819117820117821117822117823117824117825117826117827117828117829117830117831117832117833117834117835117836117837117838117839117840117841117842117843117844117845117846117847117848117849117850117851117852117853117854117855117856117857117858117859117860117861117862117863117864117865117866117867117868117869117870117871117872117873117874117875117876117877117878117879117880117881117882117883117884117885117886117887117888117889117890117891117892117893117894117895117896117897117898117899117900117901117902117903117904117905117906117907117908117909117910117911117912117913117914117915117916117917117918117919117920117921117922117923117924117925117926117927117928117929117930117931117932117933117934117935117936117937117938117939117940117941117942117943117944117945117946117947117948117949117950117951117952117953117954117955117956117957117958117959117960117961117962117963117964117965117966117967117968117969117970117971117972117973117974117975117976117977117978117979117980117981117982117983117984117985117986117987117988117989117990117991117992117993117994117995117996117997117998117999118000118001118002118003118004118005118006118007118008118009118010118011118012118013118014118015118016118017118018118019118020118021118022118023118024118025118026118027118028118029118030118031118032118033118034118035118036118037118038118039118040118041118042118043118044118045118046118047118048118049118050118051118052118053118054118055118056118057118058118059118060118061118062118063118064118065118066118067118068118069118070118071118072118073118074118075118076118077118078118079118080118081118082118083118084118085118086118087118088118089118090118091118092118093118094118095118096118097118098118099118100118101118102118103118104118105118106118107118108118109118110118111118112118113118114118115118116118117118118118119118120118121118122118123118124118125118126118127118128118129118130118131118132118133118134118135118136118137118138118139118140118141118142118143118144118145118146118147118148118149118150118151118152118153118154118155118156118157118158118159118160118161118162118163118164118165118166118167118168118169118170118171118172118173118174118175118176118177118178118179118180118181118182118183118184118185118186118187118188118189118190118191118192118193118194118195118196118197118198118199118200118201118202118203118204118205118206118207118208118209118210118211118212118213118214118215118216118217118218118219118220118221118222118223118224118225118226118227118228118229118230118231118232118233118234118235118236118237118238118239118240118241118242118243118244118245118246118247118248118249118250118251118252118253118254118255118256118257118258118259118260118261118262118263118264118265118266118267118268118269118270118271118272118273118274118275118276118277118278118279118280118281118282118283118284118285118286118287118288118289118290118291118292118293118294118295118296118297118298118299118300118301118302118303118304118305118306118307118308118309118310118311118312118313118314118315118316118317118318118319118320118321118322118323118324118325118326118327118328118329118330118331118332118333118334118335118336118337118338118339118340118341118342118343118344118345118346118347118348118349118350118351118352118353118354118355118356118357118358118359118360118361118362118363118364118365118366118367118368118369118370118371118372118373118374118375118376118377118378118379118380118381118382118383118384118385118386118387118388118389118390118391118392118393118394118395118396118397118398118399118400118401118402118403118404118405118406118407118408118409118410118411118412118413118414118415118416118417118418118419118420118421118422118423118424118425118426118427118428118429118430118431118432118433118434118435118436118437118438118439118440118441118442118443118444118445118446118447118448118449118450118451118452118453118454118455118456118457118458118459118460118461118462118463118464118465118466118467118468118469118470118471118472118473118474118475118476118477118478118479118480118481118482118483118484118485118486118487118488118489118490118491118492118493118494118495118496118497118498118499118500118501118502118503118504118505118506118507118508118509118510118511118512118513118514118515118516118517118518118519118520118521118522118523118524118525118526118527118528118529118530118531118532118533118534118535118536118537118538118539118540118541118542118543118544118545118546118547118548118549118550118551118552118553118554118555118556118557118558118559118560118561118562118563118564118565118566118567118568118569118570118571118572118573118574118575118576118577118578118579118580118581118582118583118584118585118586118587118588118589118590118591118592118593118594118595118596118597118598118599118600118601118602118603118604118605118606118607118608118609118610118611118612118613118614118615118616118617118618118619118620118621118622118623118624118625118626118627118628118629118630118631118632118633118634118635118636118637118638118639118640118641118642118643118644118645118646118647118648118649118650118651118652118653118654118655118656118657118658118659118660118661118662118663118664118665118666118667118668118669118670118671118672118673118674118675118676118677118678118679118680118681118682118683118684118685118686118687118688118689118690118691118692118693118694118695118696118697118698118699118700118701118702118703118704118705118706118707118708118709118710118711118712118713118714118715118716118717118718118719118720118721118722118723118724118725118726118727118728118729118730118731118732118733118734118735118736118737118738118739118740118741118742118743118744118745118746118747118748118749118750118751118752118753118754118755118756118757118758118759118760118761118762118763118764118765118766118767118768118769118770118771118772118773118774118775118776118777118778118779118780118781118782118783118784118785118786118787118788118789118790118791118792118793118794118795118796118797118798118799118800118801118802118803118804118805118806118807118808118809118810118811118812118813118814118815118816118817118818118819118820118821118822118823118824118825118826118827118828118829118830118831118832118833118834118835118836118837118838118839118840118841118842118843118844118845118846118847118848118849118850118851118852118853118854118855118856118857118858118859118860118861118862118863118864118865118866118867118868118869118870118871118872118873118874118875118876118877118878118879118880118881118882118883118884118885118886118887118888118889118890118891118892118893118894118895118896118897118898118899118900118901118902118903118904118905118906118907118908118909118910118911118912118913118914118915118916118917118918118919118920118921118922118923118924118925118926118927118928118929118930118931118932118933118934118935118936118937118938118939118940118941118942118943118944118945118946118947118948118949118950118951118952118953118954118955118956118957118958118959118960118961118962118963118964118965118966118967118968118969118970118971118972118973118974118975118976118977118978118979118980118981118982118983118984118985118986118987118988118989118990118991118992118993118994118995118996118997118998118999119000119001119002119003119004119005119006119007119008119009119010119011119012119013119014119015119016119017119018119019119020119021119022119023119024119025119026119027119028119029119030119031119032119033119034119035119036119037119038119039119040119041119042119043119044119045119046119047119048119049119050119051119052119053119054119055119056119057119058119059119060119061119062119063119064119065119066119067119068119069119070119071119072119073119074119075119076119077119078119079119080119081119082119083119084119085119086119087119088119089119090119091119092119093119094119095119096119097119098119099119100119101119102119103119104119105119106119107119108119109119110119111119112119113119114119115119116119117119118119119119120119121119122119123119124119125119126119127119128119129119130119131119132119133119134119135119136119137119138119139119140119141119142119143119144119145119146119147119148119149119150119151119152119153119154119155119156119157119158119159119160119161119162119163119164119165119166119167119168119169119170119171119172119173119174119175119176119177119178119179119180119181119182119183119184119185119186119187119188119189119190119191119192119193119194119195119196119197119198119199119200119201119202119203119204119205119206119207119208119209119210119211119212119213119214119215119216119217119218119219119220119221119222119223119224119225119226119227119228119229119230119231119232119233119234119235119236119237119238119239119240119241119242119243119244119245119246119247119248119249119250119251119252119253119254119255119256119257119258119259119260119261119262119263119264119265119266119267119268119269119270119271119272119273119274119275119276119277119278119279119280119281119282119283119284119285119286119287119288119289119290119291119292119293119294119295119296119297119298119299119300119301119302119303119304119305119306119307119308119309119310119311119312119313119314119315119316119317119318119319119320119321119322119323119324119325119326119327119328119329119330119331119332119333119334119335119336119337119338119339119340119341119342119343119344119345119346119347119348119349119350119351119352119353119354119355119356119357119358119359119360119361119362119363119364119365119366119367119368119369119370119371119372119373119374119375119376119377119378119379119380119381119382119383119384119385119386119387119388119389119390119391119392119393119394119395119396119397119398119399119400119401119402119403119404119405119406119407119408119409119410119411119412119413119414119415119416119417119418119419119420119421119422119423119424119425119426119427119428119429119430119431119432119433119434119435119436119437119438119439119440119441119442119443119444119445119446119447119448119449119450119451119452119453119454119455119456119457119458119459119460119461119462119463119464119465119466119467119468119469119470119471119472119473119474119475119476119477119478119479119480119481119482119483119484119485119486119487119488119489119490119491119492119493119494119495119496119497119498119499119500119501119502119503119504119505119506119507119508119509119510119511119512119513119514119515119516119517119518119519119520119521119522119523119524119525119526119527119528119529119530119531119532119533119534119535119536119537119538119539119540119541119542119543119544119545119546119547119548119549119550119551119552119553119554119555119556119557119558119559119560119561119562119563119564119565119566119567119568119569119570119571119572119573119574119575119576119577119578119579119580119581119582119583119584119585119586119587119588119589119590119591119592119593119594119595119596119597119598119599119600119601119602119603119604119605119606119607119608119609119610119611119612119613119614119615119616119617119618119619119620119621119622119623119624119625119626119627119628119629119630119631119632119633119634119635119636119637119638119639119640119641119642119643119644119645119646119647119648119649119650119651119652119653119654119655119656119657119658119659119660119661119662119663119664119665119666119667119668119669119670119671119672119673119674119675119676119677119678119679119680119681119682119683119684119685119686119687119688119689119690119691119692119693119694119695119696119697119698119699119700119701119702119703119704119705119706119707119708119709119710119711119712119713119714119715119716119717119718119719119720119721119722119723119724119725119726119727119728119729119730119731119732119733119734119735119736119737119738119739119740119741119742119743119744119745119746119747119748119749119750119751119752119753119754119755119756119757119758119759119760119761119762119763119764119765119766119767119768119769119770119771119772119773119774119775119776119777119778119779119780119781119782119783119784119785119786119787119788119789119790119791119792119793119794119795119796119797119798119799119800119801119802119803119804119805119806119807119808119809119810119811119812119813119814119815119816119817119818119819119820119821119822119823119824119825119826119827119828119829119830119831119832119833119834119835119836119837119838119839119840119841119842119843119844119845119846119847119848119849119850119851119852119853119854119855119856119857119858119859119860119861119862119863119864119865119866119867119868119869119870119871119872119873119874119875119876119877119878119879119880119881119882119883119884119885119886119887119888119889119890119891119892119893119894119895119896119897119898119899119900119901119902119903119904119905119906119907119908119909119910119911119912119913119914119915119916119917119918119919119920119921119922119923119924119925119926119927119928119929119930119931119932119933119934119935119936119937119938119939119940119941119942119943119944119945119946119947119948119949119950119951119952119953119954119955119956119957119958119959119960119961119962119963119964119965119966119967119968119969119970119971119972119973119974119975119976119977119978119979119980119981119982119983119984119985119986119987119988119989119990119991119992119993119994119995119996119997119998119999120000120001120002120003120004120005120006120007120008120009120010120011120012120013120014120015120016120017120018120019120020120021120022120023120024120025120026120027120028120029120030120031120032120033120034120035120036120037120038120039120040120041120042120043120044120045120046120047120048120049120050120051120052120053120054120055120056120057120058120059120060120061120062120063120064120065120066120067120068120069120070120071120072120073120074120075120076120077120078120079120080120081120082120083120084120085120086120087120088120089120090120091120092120093120094120095120096120097120098120099120100120101120102120103120104120105120106120107120108120109120110120111120112120113120114120115120116120117120118120119120120120121120122120123120124120125120126120127120128120129120130120131120132120133120134120135120136120137120138120139120140120141120142120143120144120145120146120147120148120149120150120151120152120153120154120155120156120157120158120159120160120161120162120163120164120165120166120167120168120169120170120171120172120173120174120175120176120177120178120179120180120181120182120183120184120185120186120187120188120189120190120191120192120193120194120195120196120197120198120199120200120201120202120203120204120205120206120207120208120209120210120211120212120213120214120215120216120217120218120219120220120221120222120223120224120225120226120227120228120229120230120231120232120233120234120235120236120237120238120239120240120241120242120243120244120245120246120247120248120249120250120251120252120253120254120255120256120257120258120259120260120261120262120263120264120265120266120267120268120269120270120271120272120273120274120275120276120277120278120279120280120281120282120283120284120285120286120287120288120289120290120291120292120293120294120295120296120297120298120299120300120301120302120303120304120305120306120307120308120309120310120311120312120313120314120315120316120317120318120319120320120321120322120323120324120325120326120327120328120329120330120331120332120333120334120335120336120337120338120339120340120341120342120343120344120345120346120347120348120349120350120351120352120353120354120355120356120357120358120359120360120361120362120363120364120365120366120367120368120369120370120371120372120373120374120375120376120377120378120379120380120381120382120383120384120385120386120387120388120389120390120391120392120393120394120395120396120397120398120399120400120401120402120403120404120405120406120407120408120409120410120411120412120413120414120415120416120417120418120419120420120421120422120423120424120425120426120427120428120429120430120431120432120433120434120435120436120437120438120439120440120441120442120443120444120445120446120447120448120449120450120451120452120453120454120455120456120457120458120459120460120461120462120463120464120465120466120467120468120469120470120471120472120473120474120475120476120477120478120479120480120481120482120483120484120485120486120487120488120489120490120491120492120493120494120495120496120497120498120499120500120501120502120503120504120505120506120507120508120509120510120511120512120513120514120515120516120517120518120519120520120521120522120523120524120525120526120527120528120529120530120531120532120533120534120535120536120537120538120539120540120541120542120543120544120545120546120547120548120549120550120551120552120553120554120555120556120557120558120559120560120561120562120563120564120565120566120567120568120569120570120571120572120573120574120575120576120577120578120579120580120581120582120583120584120585120586120587120588120589120590120591120592120593120594120595120596120597120598120599120600120601120602120603120604120605120606120607120608120609120610120611120612120613120614120615120616120617120618120619120620120621120622120623120624120625120626120627120628120629120630120631120632120633120634120635120636120637120638120639120640120641120642120643120644120645120646120647120648120649120650120651120652120653120654120655120656120657120658120659120660120661120662120663120664120665120666120667120668120669120670120671120672120673120674120675120676120677120678120679120680120681120682120683120684120685120686120687120688120689120690120691120692120693120694120695120696120697120698120699120700120701120702120703120704120705120706120707120708120709120710120711120712120713120714120715120716120717120718120719120720120721120722120723120724120725120726120727120728120729120730120731120732120733120734120735120736120737120738120739120740120741120742120743120744120745120746120747120748120749120750120751120752120753120754120755120756120757120758120759120760120761120762120763120764120765120766120767120768120769120770120771120772120773120774120775120776120777120778120779120780120781120782120783120784120785120786120787120788120789120790120791120792120793120794120795120796120797120798120799120800120801120802120803120804120805120806120807120808120809120810120811120812120813120814120815120816120817120818120819120820120821120822120823120824120825120826120827120828120829120830120831120832120833120834120835120836120837120838120839120840120841120842120843120844120845120846120847120848120849120850120851120852120853120854120855120856120857120858120859120860120861120862120863120864120865120866120867120868120869120870120871120872120873120874120875120876120877120878120879120880120881120882120883120884120885120886120887120888120889120890120891120892120893120894120895120896120897120898120899120900120901120902120903120904120905120906120907120908120909120910120911120912120913120914120915120916120917120918120919120920120921120922120923120924120925120926120927120928120929120930120931120932120933120934120935120936120937120938120939120940120941120942120943120944120945120946120947120948120949120950120951120952120953120954120955120956120957120958120959120960120961120962120963120964120965120966120967120968120969120970120971120972120973120974120975120976120977120978120979120980120981120982120983120984120985120986120987120988120989120990120991120992120993120994120995120996120997120998120999121000121001121002121003121004121005121006121007121008121009121010121011121012121013121014121015121016121017121018121019121020121021121022121023121024121025121026121027121028121029121030121031121032121033121034121035121036121037121038121039121040121041121042121043121044121045121046121047121048121049121050121051121052121053121054121055121056121057121058121059121060121061121062121063121064121065121066121067121068121069121070121071121072121073121074121075121076121077121078121079121080121081121082121083121084121085121086121087121088121089121090121091121092121093121094121095121096121097121098121099121100121101121102121103121104121105121106121107121108121109121110121111121112121113121114121115121116121117121118121119121120121121121122121123121124121125121126121127121128121129121130121131121132121133121134121135121136121137121138121139121140121141121142121143121144121145121146121147121148121149121150121151121152121153121154121155121156121157121158121159121160121161121162121163121164121165121166121167121168121169121170121171121172121173121174121175121176121177121178121179121180121181121182121183121184121185121186121187121188121189121190121191121192121193121194121195121196121197121198121199121200121201121202121203121204121205121206121207121208121209121210121211121212121213121214121215121216121217121218121219121220121221121222121223121224121225121226121227121228121229121230121231121232121233121234121235121236121237121238121239121240121241121242121243121244121245121246121247121248121249121250121251121252121253121254121255121256121257121258121259121260121261121262121263121264121265121266121267121268121269121270121271121272121273121274121275121276121277121278121279121280121281121282121283121284121285121286121287121288121289121290121291121292121293121294121295121296121297121298121299121300121301121302121303121304121305121306121307121308121309121310121311121312121313121314121315121316121317121318121319121320121321121322121323121324121325121326121327121328121329121330121331121332121333121334121335121336121337121338121339121340121341121342121343121344121345121346121347121348121349121350121351121352121353121354121355121356121357121358121359121360121361121362121363121364121365121366121367121368121369121370121371121372121373121374121375121376121377121378121379121380121381121382121383121384121385121386121387121388121389121390121391121392121393121394121395121396121397121398121399121400121401121402121403121404121405121406121407121408121409121410121411121412121413121414121415121416121417121418121419121420121421121422121423121424121425121426121427121428121429121430121431121432121433121434121435121436121437121438121439121440121441121442121443121444121445121446121447121448121449121450121451121452121453121454121455121456121457121458121459121460121461121462121463121464121465121466121467121468121469121470121471121472121473121474121475121476121477121478121479121480121481121482121483121484121485121486121487121488121489121490121491121492121493121494121495121496121497121498121499121500121501121502121503121504121505121506121507121508121509121510121511121512121513121514121515121516121517121518121519121520121521121522121523121524121525121526121527121528121529121530121531121532121533121534121535121536121537121538121539121540121541121542121543121544121545121546121547121548121549121550121551121552121553121554121555121556121557121558121559121560121561121562121563121564121565121566121567121568121569121570121571121572121573121574121575121576121577121578121579121580121581121582121583121584121585121586121587121588121589121590121591121592121593121594121595121596121597121598121599121600121601121602121603121604121605121606121607121608121609121610121611121612121613121614121615121616121617121618121619121620121621121622121623121624121625121626121627121628121629121630121631121632121633121634121635121636121637121638121639121640121641121642121643121644121645121646121647121648121649121650121651121652121653121654121655121656121657121658121659121660121661121662121663121664121665121666121667121668121669121670121671121672121673121674121675121676121677121678121679121680121681121682121683121684121685121686121687121688121689121690121691121692121693121694121695121696121697121698121699121700121701121702121703121704121705121706121707121708121709121710121711121712121713121714121715121716121717121718121719121720121721121722121723121724121725121726121727121728121729121730121731121732121733121734121735121736121737121738121739121740121741121742121743121744121745121746121747121748121749121750121751121752121753121754121755121756121757121758121759121760121761121762121763121764121765121766121767121768121769121770121771121772121773121774121775121776121777121778121779121780121781121782121783121784121785121786121787121788121789121790121791121792121793121794121795121796121797121798121799121800121801121802121803121804121805121806121807121808121809121810121811121812121813121814121815121816121817121818121819121820121821121822121823121824121825121826121827121828121829121830121831121832121833121834121835121836121837121838121839121840121841121842121843121844121845121846121847121848121849121850121851121852121853121854121855121856121857121858121859121860121861121862121863121864121865121866121867121868121869121870121871121872121873121874121875121876121877121878121879121880121881121882121883121884121885121886121887121888121889121890121891121892121893121894121895121896121897121898121899121900121901121902121903121904121905121906121907121908121909121910121911121912121913121914121915121916121917121918121919121920121921121922121923121924121925121926121927121928121929121930121931121932121933121934121935121936121937121938121939121940121941121942121943121944121945121946121947121948121949121950121951121952121953121954121955121956121957121958121959121960121961121962121963121964121965121966121967121968121969121970121971121972121973121974121975121976121977121978121979121980121981121982121983121984121985121986121987121988121989121990121991121992121993121994121995121996121997121998121999122000122001122002122003122004122005122006122007122008122009122010122011122012122013122014122015122016122017122018122019122020122021122022122023122024122025122026122027122028122029122030122031122032122033122034122035122036122037122038122039122040122041122042122043122044122045122046122047122048122049122050122051122052122053122054122055122056122057122058122059122060122061122062122063122064122065122066122067122068122069122070122071122072122073122074122075122076122077122078122079122080122081122082122083122084122085122086122087122088122089122090122091122092122093122094122095122096122097122098122099122100122101122102122103122104122105122106122107122108122109122110122111122112122113122114122115122116122117122118122119122120122121122122122123122124122125122126122127122128122129122130122131122132122133122134122135122136122137122138122139122140122141122142122143122144122145122146122147122148122149122150122151122152122153122154122155122156122157122158122159122160122161122162122163122164122165122166122167122168122169122170122171122172122173122174122175122176122177122178122179122180122181122182122183122184122185122186122187122188122189122190122191122192122193122194122195122196122197122198122199122200122201122202122203122204122205122206122207122208122209122210122211122212122213122214122215122216122217122218122219122220122221122222122223122224122225122226122227122228122229122230122231122232122233122234122235122236122237122238122239122240122241122242122243122244122245122246122247122248122249122250122251122252122253122254122255122256122257122258122259122260122261122262122263122264122265122266122267122268122269122270122271122272122273122274122275122276122277122278122279122280122281122282122283122284122285122286122287122288122289122290122291122292122293122294122295122296122297122298122299122300122301122302122303122304122305122306122307122308122309122310122311122312122313122314122315122316122317122318122319122320122321122322122323122324122325122326122327122328122329122330122331122332122333122334122335122336122337122338122339122340122341122342122343122344122345122346122347122348122349122350122351122352122353122354122355122356122357122358122359122360122361122362122363122364122365122366122367122368122369122370122371122372122373122374122375122376122377122378122379122380122381122382122383122384122385122386122387122388122389122390122391122392122393122394122395122396122397122398122399122400122401122402122403122404122405122406122407122408122409122410122411122412122413122414122415122416122417122418122419122420122421122422122423122424122425122426122427122428122429122430122431122432122433122434122435122436122437122438122439122440122441122442122443122444122445122446122447122448122449122450122451122452122453122454122455122456122457122458122459122460122461122462122463122464122465122466122467122468122469122470122471122472122473122474122475122476122477122478122479122480122481122482122483122484122485122486122487122488122489122490122491122492122493122494122495122496122497122498122499122500122501122502122503122504122505122506122507122508122509122510122511122512122513122514122515122516122517122518122519122520122521122522122523122524122525122526122527122528122529122530122531122532122533122534122535122536122537122538122539122540122541122542122543122544122545122546122547122548122549122550122551122552122553122554122555122556122557122558122559122560122561122562122563122564122565122566122567122568122569122570122571122572122573122574122575122576122577122578122579122580122581122582122583122584122585122586122587122588122589122590122591122592122593122594122595122596122597122598122599122600122601122602122603122604122605122606122607122608122609122610122611122612122613122614122615122616122617122618122619122620122621122622122623122624122625122626122627122628122629122630122631122632122633122634122635122636122637122638122639122640122641122642122643122644122645122646122647122648122649122650122651122652122653122654122655122656122657122658122659122660122661122662122663122664122665122666122667122668122669122670122671122672122673122674122675122676122677122678122679122680122681122682122683122684122685122686122687122688122689122690122691122692122693122694122695122696122697122698122699122700122701122702122703122704122705122706122707122708122709122710122711122712122713122714122715122716122717122718122719122720122721122722122723122724122725122726122727122728122729122730122731122732122733122734122735122736122737122738122739122740122741122742122743122744122745122746122747122748122749122750122751122752122753122754122755122756122757122758122759122760122761122762122763122764122765122766122767122768122769122770122771122772122773122774122775122776122777122778122779122780122781122782122783122784122785122786122787122788122789122790122791122792122793122794122795122796122797122798122799122800122801122802122803122804122805122806122807122808122809122810122811122812122813122814122815122816122817122818122819122820122821122822122823122824122825122826122827122828122829122830122831122832122833122834122835122836122837122838122839122840122841122842122843122844122845122846122847122848122849122850122851122852122853122854122855122856122857122858122859122860122861122862122863122864122865122866122867122868122869122870122871122872122873122874122875122876122877122878122879122880122881122882122883122884122885122886122887122888122889122890122891122892122893122894122895122896122897122898122899122900122901122902122903122904122905122906122907122908122909122910122911122912122913122914122915122916122917122918122919122920122921122922122923122924122925122926122927122928122929122930122931122932122933122934122935122936122937122938122939122940122941122942122943122944122945122946122947122948122949122950122951122952122953122954122955122956122957122958122959122960122961122962122963122964122965122966122967122968122969122970122971122972122973122974122975122976122977122978122979122980122981122982122983122984122985122986122987122988122989122990122991122992122993122994122995122996122997122998122999123000123001123002123003123004123005123006123007123008123009123010123011123012123013123014123015123016123017123018123019123020123021123022123023123024123025123026123027123028123029123030123031123032123033123034123035123036123037123038123039123040123041123042123043123044123045123046123047123048123049123050123051123052123053123054123055123056123057123058123059123060123061123062123063123064123065123066123067123068123069123070123071123072123073123074123075123076123077123078123079123080123081123082123083123084123085123086123087123088123089123090123091123092123093123094123095123096123097123098123099123100123101123102123103123104123105123106123107123108123109123110123111123112123113123114123115123116123117123118123119123120123121123122123123123124123125123126123127123128123129123130123131123132123133123134123135123136123137123138123139123140123141123142123143123144123145123146123147123148123149123150123151123152123153123154123155123156123157123158123159123160123161123162123163123164123165123166123167123168123169123170123171123172123173123174123175123176123177123178123179123180123181123182123183123184123185123186123187123188123189123190123191123192123193123194123195123196123197123198123199123200123201123202123203123204123205123206123207123208123209123210123211123212123213123214123215123216123217123218123219123220123221123222123223123224123225123226123227123228123229123230123231123232123233123234123235123236123237123238123239123240123241123242123243123244123245123246123247123248123249123250123251123252123253123254123255123256123257123258123259123260123261123262123263123264123265123266123267123268123269123270123271123272123273123274123275123276123277123278123279123280123281123282123283123284123285123286123287123288123289123290123291123292123293123294123295123296123297123298123299123300123301123302123303123304123305123306123307123308123309123310123311123312123313123314123315123316123317123318123319123320123321123322123323123324123325123326123327123328123329123330123331123332123333123334123335123336123337123338123339123340123341123342123343123344123345123346123347123348123349123350123351123352123353123354123355123356123357123358123359123360123361123362123363123364123365123366123367123368123369123370123371123372123373123374123375123376123377123378123379123380123381123382123383123384123385123386123387123388123389123390123391123392123393123394123395123396123397123398123399123400123401123402123403123404123405123406123407123408123409123410123411123412123413123414123415123416123417123418123419123420123421123422123423123424123425123426123427123428123429123430123431123432123433123434123435123436123437123438123439123440123441123442123443123444123445123446123447123448123449123450123451123452123453123454123455123456123457123458123459123460123461123462123463123464123465123466123467123468123469123470123471123472123473123474123475123476123477123478123479123480123481123482123483123484123485123486123487123488123489123490123491123492123493123494123495123496123497123498123499123500123501123502123503123504123505123506123507123508123509123510123511123512123513123514123515123516123517123518123519123520123521123522123523123524123525123526123527123528123529123530123531123532123533123534123535123536123537123538123539123540123541123542123543123544123545123546123547123548123549123550123551123552123553123554123555123556123557123558123559123560123561123562123563123564123565123566123567123568123569123570123571123572123573123574123575123576123577123578123579123580123581123582123583123584123585123586123587123588123589123590123591123592123593123594123595123596123597123598123599123600123601123602123603123604123605123606123607123608123609123610123611123612123613123614123615123616123617123618123619123620123621123622123623123624123625123626123627123628123629123630123631123632123633123634123635123636123637123638123639123640123641123642123643123644123645123646123647123648123649123650123651123652123653123654123655123656123657123658123659123660123661123662123663123664123665123666123667123668123669123670123671123672123673123674123675123676123677123678123679123680123681123682123683123684123685123686123687123688123689123690123691123692123693123694123695123696123697123698123699123700123701123702123703123704123705123706123707123708123709123710123711123712123713123714123715123716123717123718123719123720123721123722123723123724123725123726123727123728123729123730123731123732123733123734123735123736123737123738123739123740123741123742123743123744123745123746123747123748123749123750123751123752123753123754123755123756123757123758123759123760123761123762123763123764123765123766123767123768123769123770123771123772123773123774123775123776123777123778123779123780123781123782123783123784123785123786123787123788123789123790123791123792123793123794123795123796123797123798123799123800123801123802123803123804123805123806123807123808123809123810123811123812123813123814123815123816123817123818123819123820123821123822123823123824123825123826123827123828123829123830123831123832123833123834123835123836123837123838123839123840123841123842123843123844123845123846123847123848123849123850123851123852123853123854123855123856123857123858123859123860123861123862123863123864123865123866123867123868123869123870123871123872123873123874123875123876123877123878123879123880123881123882123883123884123885123886123887123888123889123890123891123892123893123894123895123896123897123898123899123900123901123902123903123904123905123906123907123908123909123910123911123912123913123914123915123916123917123918123919123920123921123922123923123924123925123926123927123928123929123930123931123932123933123934123935123936123937123938123939123940123941123942123943123944123945123946123947123948123949123950123951123952123953123954123955123956123957123958123959123960123961123962123963123964123965123966123967123968123969123970123971123972123973123974123975123976123977123978123979123980123981123982123983123984123985123986123987123988123989123990123991123992123993123994123995123996123997123998123999124000124001124002124003124004124005124006124007124008124009124010124011124012124013124014124015124016124017124018124019124020124021124022124023124024124025124026124027124028124029124030124031124032124033124034124035124036124037124038124039124040124041124042124043124044124045124046124047124048124049124050124051124052124053124054124055124056124057124058124059124060124061124062124063124064124065124066124067124068124069124070124071124072124073124074124075124076124077124078124079124080124081124082124083124084124085124086124087124088124089124090124091124092124093124094124095124096124097124098124099124100124101124102124103124104124105124106124107124108124109124110124111124112124113124114124115124116124117124118124119124120124121124122124123124124124125124126124127124128124129124130124131124132124133124134124135124136124137124138124139124140124141124142124143124144124145124146124147124148124149124150124151124152124153124154124155124156124157124158124159124160124161124162124163124164124165124166124167124168124169124170124171124172124173124174124175124176124177124178124179124180124181124182124183124184124185124186124187124188124189124190124191124192124193124194124195124196124197124198124199124200124201124202124203124204124205124206124207124208124209124210124211124212124213124214124215124216124217124218124219124220124221124222124223124224124225124226124227124228124229124230124231124232124233124234124235124236124237124238124239124240124241124242124243124244124245124246124247124248124249124250124251124252124253124254124255124256124257124258124259124260124261124262124263124264124265124266124267124268124269124270124271124272124273124274124275124276124277124278124279124280124281124282124283124284124285124286124287124288124289124290124291124292124293124294124295124296124297124298124299124300124301124302124303124304124305124306124307124308124309124310124311124312124313124314124315124316124317124318124319124320124321124322124323124324124325124326124327124328124329124330124331124332124333124334124335124336124337124338124339124340124341124342124343124344124345124346124347124348124349124350124351124352124353124354124355124356124357124358124359124360124361124362124363124364124365124366124367124368124369124370124371124372124373124374124375124376124377124378124379124380124381124382124383124384124385124386124387124388124389124390124391124392124393124394124395124396124397124398124399124400124401124402124403124404124405124406124407124408124409124410124411124412124413124414124415124416124417124418124419124420124421124422124423124424124425124426124427124428124429124430124431124432124433124434124435124436124437124438124439124440124441124442124443124444124445124446124447124448124449124450124451124452124453124454124455124456124457124458124459124460124461124462124463124464124465124466124467124468124469124470124471124472124473124474124475124476124477124478124479124480124481124482124483124484124485124486124487124488124489124490124491124492124493124494124495124496124497124498124499124500124501124502124503124504124505124506124507124508124509124510124511124512124513124514124515124516124517124518124519124520124521124522124523124524124525124526124527124528124529124530124531124532124533124534124535124536124537124538124539124540124541124542124543124544124545124546124547124548124549124550124551124552124553124554124555124556124557124558124559124560124561124562124563124564124565124566124567124568124569124570124571124572124573124574124575124576124577124578124579124580124581124582124583124584124585124586124587124588124589124590124591124592124593124594124595124596124597124598124599124600124601124602124603124604124605124606124607124608124609124610124611124612124613124614124615124616124617124618124619124620124621124622124623124624124625124626124627124628124629124630124631124632124633124634124635124636124637124638124639124640124641124642124643124644124645124646124647124648124649124650124651124652124653124654124655124656124657124658124659124660124661124662124663124664124665124666124667124668124669124670124671124672124673124674124675124676124677124678124679124680124681124682124683124684124685124686124687124688124689124690124691124692124693124694124695124696124697124698124699124700124701124702124703124704124705124706124707124708124709124710124711124712124713124714124715124716124717124718124719124720124721124722124723124724124725124726124727124728124729124730124731124732124733124734124735124736124737124738124739124740124741124742124743124744124745124746124747124748124749124750124751124752124753124754124755124756124757124758124759124760124761124762124763124764124765124766124767124768124769124770124771124772124773124774124775124776124777124778124779124780124781124782124783124784124785124786124787124788124789124790124791124792124793124794124795124796124797124798124799124800124801124802124803124804124805124806124807124808124809124810124811124812124813124814124815124816124817124818124819124820124821124822124823124824124825124826124827124828124829124830124831124832124833124834124835124836124837124838124839124840124841124842124843124844124845124846124847124848124849124850124851124852124853124854124855124856124857124858124859124860124861124862124863124864124865124866124867124868124869124870124871124872124873124874124875124876124877124878124879124880124881124882124883124884124885124886124887124888124889124890124891124892124893124894124895124896124897124898124899124900124901124902124903124904124905124906124907124908124909124910124911124912124913124914124915124916124917124918124919124920124921124922124923124924124925124926124927124928124929124930124931124932124933124934124935124936124937124938124939124940124941124942124943124944124945124946124947124948124949124950124951124952124953124954124955124956124957124958124959124960124961124962124963124964124965124966124967124968124969124970124971124972124973124974124975124976124977124978124979124980124981124982124983124984124985124986124987124988124989124990124991124992124993124994124995124996124997124998124999125000125001125002125003125004125005125006125007125008125009125010125011125012125013125014125015125016125017125018125019125020125021125022125023125024125025125026125027125028125029125030125031125032125033125034125035125036125037125038125039125040125041125042125043125044125045125046125047125048125049125050125051125052125053125054125055125056125057125058125059125060125061125062125063125064125065125066125067125068125069125070125071125072125073125074125075125076125077125078125079125080125081125082125083125084125085125086125087125088125089125090125091125092125093125094125095125096125097125098125099125100125101125102125103125104125105125106125107125108125109125110125111125112125113125114125115125116125117125118125119125120125121125122125123125124125125125126125127125128125129125130125131125132125133125134125135125136125137125138125139125140125141125142125143125144125145125146125147125148125149125150125151125152125153125154125155125156125157125158125159125160125161125162125163125164125165125166125167125168125169125170125171125172125173125174125175125176125177125178125179125180125181125182125183125184125185125186125187125188125189125190125191125192125193125194125195125196125197125198125199125200125201125202125203125204125205125206125207125208125209125210125211125212125213125214125215125216125217125218125219125220125221125222125223125224125225125226125227125228125229125230125231125232125233125234125235125236125237125238125239125240125241125242125243125244125245125246125247125248125249125250125251125252125253125254125255125256125257125258125259125260125261125262125263125264125265125266125267125268125269125270125271125272125273125274125275125276125277125278125279125280125281125282125283125284125285125286125287125288125289125290125291125292125293125294125295125296125297125298125299125300125301125302125303125304125305125306125307125308125309125310125311125312125313125314125315125316125317125318125319125320125321125322125323125324125325125326125327125328125329125330125331125332125333125334125335125336125337125338125339125340125341125342125343125344125345125346125347125348125349125350125351125352125353125354125355125356125357125358125359125360125361125362125363125364125365125366125367125368125369125370125371125372125373125374125375125376125377125378125379125380125381125382125383125384125385125386125387125388125389125390125391125392125393125394125395125396125397125398125399125400125401125402125403125404125405125406125407125408125409125410125411125412125413125414125415125416125417125418125419125420125421125422125423125424125425125426125427125428125429125430125431125432125433125434125435125436125437125438125439125440125441125442125443125444125445125446125447125448125449125450125451125452125453125454125455125456125457125458125459125460125461125462125463125464125465125466125467125468125469125470125471125472125473125474125475125476125477125478125479125480125481125482125483125484125485125486125487125488125489125490125491125492125493125494125495125496125497125498125499125500125501125502125503125504125505125506125507125508125509125510125511125512125513125514125515125516125517125518125519125520125521125522125523125524125525125526125527125528125529125530125531125532125533125534125535125536125537125538125539125540125541125542125543125544125545125546125547125548125549125550125551125552125553125554125555125556125557125558125559125560125561125562125563125564125565125566125567125568125569125570125571125572125573125574125575125576125577125578125579125580125581125582125583125584125585125586125587125588125589125590125591125592125593125594125595125596125597125598125599125600125601125602125603125604125605125606125607125608125609125610125611125612125613125614125615125616125617125618125619125620125621125622125623125624125625125626125627125628125629125630125631125632125633125634125635125636125637125638125639125640125641125642125643125644125645125646125647125648125649125650125651125652125653125654125655125656125657125658125659125660125661125662125663125664125665125666125667125668125669125670125671125672125673125674125675125676125677125678125679125680125681125682125683125684125685125686125687125688125689125690125691125692125693125694125695125696125697125698125699125700125701125702125703125704125705125706125707125708125709125710125711125712125713125714125715125716125717125718125719125720125721125722125723125724125725125726125727125728125729125730125731125732125733125734125735125736125737125738125739125740125741125742125743125744125745125746125747125748125749125750125751125752125753125754125755125756125757125758125759125760125761125762125763125764125765125766125767125768125769125770125771125772125773125774125775125776125777125778125779125780125781125782125783125784125785125786125787125788125789125790125791125792125793125794125795125796125797125798125799125800125801125802125803125804125805125806125807125808125809125810125811125812125813125814125815125816125817125818125819125820125821125822125823125824125825125826125827125828125829125830125831125832125833125834125835125836125837125838125839125840125841125842125843125844125845125846125847125848125849125850125851125852125853125854125855125856125857125858125859125860125861125862125863125864125865125866125867125868125869125870125871125872125873125874125875125876125877125878125879125880125881125882125883125884125885125886125887125888125889125890125891125892125893125894125895125896125897125898125899125900125901125902125903125904125905125906125907125908125909125910125911125912125913125914125915125916125917125918125919125920125921125922125923125924125925125926125927125928125929125930125931125932125933125934125935125936125937125938125939125940125941125942125943125944125945125946125947125948125949125950125951125952125953125954125955125956125957125958125959125960125961125962125963125964125965125966125967125968125969125970125971125972125973125974125975125976125977125978125979125980125981125982125983125984125985125986125987125988125989125990125991125992125993125994125995125996125997125998125999126000126001126002126003126004126005126006126007126008126009126010126011126012126013126014126015126016126017126018126019126020126021126022126023126024126025126026126027126028126029126030126031126032126033126034126035126036126037126038126039126040126041126042126043126044126045126046126047126048126049126050126051126052126053126054126055126056126057126058126059126060126061126062126063126064126065126066126067126068126069126070126071126072126073126074126075126076126077126078126079126080126081126082126083126084126085126086126087126088126089126090126091126092126093126094126095126096126097126098126099126100126101126102126103126104126105126106126107126108126109126110126111126112126113126114126115126116126117126118126119126120126121126122126123126124126125126126126127126128126129126130126131126132126133126134126135126136126137126138126139126140126141126142126143126144126145126146126147126148126149126150126151126152126153126154126155126156126157126158126159126160126161126162126163126164126165126166126167126168126169126170126171126172126173126174126175126176126177126178126179126180126181126182126183126184126185126186126187126188126189126190126191126192126193126194126195126196126197126198126199126200126201126202126203126204126205126206126207126208126209126210126211126212126213126214126215126216126217126218126219126220126221126222126223126224126225126226126227126228126229126230126231126232126233126234126235126236126237126238126239126240126241126242126243126244126245126246126247126248126249126250126251126252126253126254126255126256126257126258126259126260126261126262126263126264126265126266126267126268126269126270126271126272126273126274126275126276126277126278126279126280126281126282126283126284126285126286126287126288126289126290126291126292126293126294126295126296126297126298126299126300126301126302126303126304126305126306126307126308126309126310126311126312126313126314126315126316126317126318126319126320126321126322126323126324126325126326126327126328126329126330126331126332126333126334126335126336126337126338126339126340126341126342126343126344126345126346126347126348126349126350126351126352126353126354126355126356126357126358126359126360126361126362126363126364126365126366126367126368126369126370126371126372126373126374126375126376126377126378126379126380126381126382126383126384126385126386126387126388126389126390126391126392126393126394126395126396126397126398126399126400126401126402126403126404126405126406126407126408126409126410126411126412126413126414126415126416126417126418126419126420126421126422126423126424126425126426126427126428126429126430126431126432126433126434126435126436126437126438126439126440126441126442126443126444126445126446126447126448126449126450126451126452126453126454126455126456126457126458126459126460126461126462126463126464126465126466126467126468126469126470126471126472126473126474126475126476126477126478126479126480126481126482126483126484126485126486126487126488126489126490126491126492126493126494126495126496126497126498126499126500126501126502126503126504126505126506126507126508126509126510126511126512126513126514126515126516126517126518126519126520126521126522126523126524126525126526126527126528126529126530126531126532126533126534126535126536126537126538126539126540126541126542126543126544126545126546126547126548126549126550126551126552126553126554126555126556126557126558126559126560126561126562126563126564126565126566126567126568126569126570126571126572126573126574126575126576126577126578126579126580126581126582126583126584126585126586126587126588126589126590126591126592126593126594126595126596126597126598126599126600126601126602126603126604126605126606126607126608126609126610126611126612126613126614126615126616126617126618126619126620126621126622126623126624126625126626126627126628126629126630126631126632126633126634126635126636126637126638126639126640126641126642126643126644126645126646126647126648126649126650126651126652126653126654126655126656126657126658126659126660126661126662126663126664126665126666126667126668126669126670126671126672126673126674126675126676126677126678126679126680126681126682126683126684126685126686126687126688126689126690126691126692126693126694126695126696126697126698126699126700126701126702126703126704126705126706126707126708126709126710126711126712126713126714126715126716126717126718126719126720126721126722126723126724126725126726126727126728126729126730126731126732126733126734126735126736126737126738126739126740126741126742126743126744126745126746126747126748126749126750126751126752126753126754126755126756126757126758126759126760126761126762126763126764126765126766126767126768126769126770126771126772126773126774126775126776126777126778126779126780126781126782126783126784126785126786126787126788126789126790126791126792126793126794126795126796126797126798126799126800126801126802126803126804126805126806126807126808126809126810126811126812126813126814126815126816126817126818126819126820126821126822126823126824126825126826126827126828126829126830126831126832126833126834126835126836126837126838126839126840126841126842126843126844126845126846126847126848126849126850126851126852126853126854126855126856126857126858126859126860126861126862126863126864126865126866126867126868126869126870126871126872126873126874126875126876126877126878126879126880126881126882126883126884126885126886126887126888126889126890126891126892126893126894126895126896126897126898126899126900126901126902126903126904126905126906126907126908126909126910126911126912126913126914126915126916126917126918126919126920126921126922126923126924126925126926126927126928126929126930126931126932126933126934126935126936126937126938126939126940126941126942126943126944126945126946126947126948126949126950126951126952126953126954126955126956126957126958126959126960126961126962126963126964126965126966126967126968126969126970126971126972126973126974126975126976126977126978126979126980126981126982126983126984126985126986126987126988126989126990126991126992126993126994126995126996126997126998126999127000127001127002127003127004127005127006127007127008127009127010127011127012127013127014127015127016127017127018127019127020127021127022127023127024127025127026127027127028127029127030127031127032127033127034127035127036127037127038127039127040127041127042127043127044127045127046127047127048127049127050127051127052127053127054127055127056127057127058127059127060127061127062127063127064127065127066127067127068127069127070127071127072127073127074127075127076127077127078127079127080127081127082127083127084127085127086127087127088127089127090127091127092127093127094127095127096127097127098127099127100127101127102127103127104127105127106127107127108127109127110127111127112127113127114127115127116127117127118127119127120127121127122127123127124127125127126127127127128127129127130127131127132127133127134127135127136127137127138127139127140127141127142127143127144127145127146127147127148127149127150127151127152127153127154127155127156127157127158127159127160127161127162127163127164127165127166127167127168127169127170127171127172127173127174127175127176127177127178127179127180127181127182127183127184127185127186127187127188127189127190127191127192127193127194127195127196127197127198127199127200127201127202127203127204127205127206127207127208127209127210127211127212127213127214127215127216127217127218127219127220127221127222127223127224127225127226127227127228127229127230127231127232127233127234127235127236127237127238127239127240127241127242127243127244127245127246127247127248127249127250127251127252127253127254127255127256127257127258127259127260127261127262127263127264127265127266127267127268127269127270127271127272127273127274127275127276127277127278127279127280127281127282127283127284127285127286127287127288127289127290127291127292127293127294127295127296127297127298127299127300127301127302127303127304127305127306127307127308127309127310127311127312127313127314127315127316127317127318127319127320127321127322127323127324127325127326127327127328127329127330127331127332127333127334127335127336127337127338127339127340127341127342127343127344127345127346127347127348127349127350127351127352127353127354127355127356127357127358127359127360127361127362127363127364127365127366127367127368127369127370127371127372127373127374127375127376127377127378127379127380127381127382127383127384127385127386127387127388127389127390127391127392127393127394127395127396127397127398127399127400127401127402127403127404127405127406127407127408127409127410127411127412127413127414127415127416127417127418127419127420127421127422127423127424127425127426127427127428127429127430127431127432127433127434127435127436127437127438127439127440127441127442127443127444127445127446127447127448127449127450127451127452127453127454127455127456127457127458127459127460127461127462127463127464127465127466127467127468127469127470127471127472127473127474127475127476127477127478127479127480127481127482127483127484127485127486127487127488127489127490127491127492127493127494127495127496127497127498127499127500127501127502127503127504127505127506127507127508127509127510127511127512127513127514127515127516127517127518127519127520127521127522127523127524127525127526127527127528127529127530127531127532127533127534127535127536127537127538127539127540127541127542127543127544127545127546127547127548127549127550127551127552127553127554127555127556127557127558127559127560127561127562127563127564127565127566127567127568127569127570127571127572127573127574127575127576127577127578127579127580127581127582127583127584127585127586127587127588127589127590127591127592127593127594127595127596127597127598127599127600127601127602127603127604127605127606127607127608127609127610127611127612127613127614127615127616127617127618127619127620127621127622127623127624127625127626127627127628127629127630127631127632127633127634127635127636127637127638127639127640127641127642127643127644127645127646127647127648127649127650127651127652127653127654127655127656127657127658127659127660127661127662127663127664127665127666127667127668127669127670127671127672127673127674127675127676127677127678127679127680127681127682127683127684127685127686127687127688127689127690127691127692127693127694127695127696127697127698127699127700127701127702127703127704127705127706127707127708127709127710127711127712127713127714127715127716127717127718127719127720127721127722127723127724127725127726127727127728127729127730127731127732127733127734127735127736127737127738127739127740127741127742127743127744127745127746127747127748127749127750127751127752127753127754127755127756127757127758127759127760127761127762127763127764127765127766127767127768127769127770127771127772127773127774127775127776127777127778127779127780127781127782127783127784127785127786127787127788127789127790127791127792127793127794127795127796127797127798127799127800127801127802127803127804127805127806127807127808127809127810127811127812127813127814127815127816127817127818127819127820127821127822127823127824127825127826127827127828127829127830127831127832127833127834127835127836127837127838127839127840127841127842127843127844127845127846127847127848127849127850127851127852127853127854127855127856127857127858127859127860127861127862127863127864127865127866127867127868127869127870127871127872127873127874127875127876127877127878127879127880127881127882127883127884127885127886127887127888127889127890127891127892127893127894127895127896127897127898127899127900127901127902127903127904127905127906127907127908127909127910127911127912127913127914127915127916127917127918127919127920127921127922127923127924127925127926127927127928127929127930127931127932127933127934127935127936127937127938127939127940127941127942127943127944127945127946127947127948127949127950127951127952127953127954127955127956127957127958127959127960127961127962127963127964127965127966127967127968127969127970127971127972127973127974127975127976127977127978127979127980127981127982127983127984127985127986127987127988127989127990127991127992127993127994127995127996127997127998127999128000128001128002128003128004128005128006128007128008128009128010128011128012128013128014128015128016128017128018128019128020128021128022128023128024128025128026128027128028128029128030128031128032128033128034128035128036128037128038128039128040128041128042128043128044128045128046128047128048128049128050128051128052128053128054128055128056128057128058128059128060128061128062128063128064128065128066128067128068128069128070128071128072128073128074128075128076128077128078128079128080128081128082128083128084128085128086128087128088128089128090128091128092128093128094128095128096128097128098128099128100128101128102128103128104128105128106128107128108128109128110128111128112128113128114128115128116128117128118128119128120128121128122128123128124128125128126128127128128128129128130128131128132128133128134128135128136128137128138128139128140128141128142128143128144128145128146128147128148128149128150128151128152128153128154128155128156128157128158128159128160128161128162128163128164128165128166128167128168128169128170128171128172128173128174128175128176128177128178128179128180128181128182128183128184128185128186128187128188128189128190128191128192128193128194128195128196128197128198128199128200128201128202128203128204128205128206128207128208128209128210128211128212128213128214128215128216128217128218128219128220128221128222128223128224128225128226128227128228128229128230128231128232128233128234128235128236128237128238128239128240128241128242128243128244128245128246128247128248128249128250128251128252128253128254128255128256128257128258128259128260128261128262128263128264128265128266128267128268128269128270128271128272128273128274128275128276128277128278128279128280128281128282128283128284128285128286128287128288128289128290128291128292128293128294128295128296128297128298128299128300128301128302128303128304128305128306128307128308128309128310128311128312128313128314128315128316128317128318128319128320128321128322128323128324128325128326128327128328128329128330128331128332128333128334128335128336128337128338128339128340128341128342128343128344128345128346128347128348128349128350128351128352128353128354128355128356128357128358128359128360128361128362128363128364128365128366128367128368128369128370128371128372128373128374128375128376128377128378128379128380128381128382128383128384128385128386128387128388128389128390128391128392128393128394128395128396128397128398128399128400128401128402128403128404128405128406128407128408128409128410128411128412128413128414128415128416128417128418128419128420128421128422128423128424128425128426128427128428128429128430128431128432128433128434128435128436128437128438128439128440128441128442128443128444128445128446128447128448128449128450128451128452128453128454128455128456128457128458128459128460128461128462128463128464128465128466128467128468128469128470128471128472128473128474128475128476128477128478128479128480128481128482128483128484128485128486128487128488128489128490128491128492128493128494128495128496128497128498128499128500128501128502128503128504128505128506128507128508128509128510128511128512128513128514128515128516128517128518128519128520128521128522128523128524128525128526128527128528128529128530128531128532128533128534128535128536128537128538128539128540128541128542128543128544128545128546128547128548128549128550128551128552128553128554128555128556128557128558128559128560128561128562128563128564128565128566128567128568128569128570128571128572128573128574128575128576128577128578128579128580128581128582128583128584128585128586128587128588128589128590128591128592128593128594128595128596128597128598128599128600128601128602128603128604128605128606128607128608128609128610128611128612128613128614128615128616128617128618128619128620128621128622128623128624128625128626128627128628128629128630128631128632128633128634128635128636128637128638128639128640128641128642128643128644128645128646128647128648128649128650128651128652128653128654128655128656128657128658128659128660128661128662128663128664128665128666128667128668128669128670128671128672128673128674128675128676128677128678128679128680128681128682128683128684128685128686128687128688128689128690128691128692128693128694128695128696128697128698128699128700128701128702128703128704128705128706128707128708128709128710128711128712128713128714128715128716128717128718128719128720128721128722128723128724128725128726128727128728128729128730128731128732128733128734128735128736128737128738128739128740128741128742128743128744128745128746128747128748128749128750128751128752128753128754128755128756128757128758128759128760128761128762128763128764128765128766128767128768128769128770128771128772128773128774128775128776128777128778128779128780128781128782128783128784128785128786128787128788128789128790128791128792128793128794128795128796128797128798128799128800128801128802128803128804128805128806128807128808128809128810128811128812128813128814128815128816128817128818128819128820128821128822128823128824128825128826128827128828128829128830128831128832128833128834128835128836128837128838128839128840128841128842128843128844128845128846128847128848128849128850128851128852128853128854128855128856128857128858128859128860128861128862128863128864128865128866128867128868128869128870128871128872128873128874128875128876128877128878128879128880128881128882128883128884128885128886128887128888128889128890128891128892128893128894128895128896128897128898128899128900128901128902128903128904128905128906128907128908128909128910128911128912128913128914128915128916128917128918128919128920128921128922128923128924128925128926128927128928128929128930128931128932128933128934128935128936128937128938128939128940128941128942128943128944128945128946128947128948128949128950128951128952128953128954128955128956128957128958128959128960128961128962128963128964128965128966128967128968128969128970128971128972128973128974128975128976128977128978128979128980128981128982128983128984128985128986128987128988128989128990128991128992128993128994128995128996128997128998128999129000129001129002129003129004129005129006129007129008129009129010129011129012129013129014129015129016129017129018129019129020129021129022129023129024129025129026129027129028129029129030129031129032129033129034129035129036129037129038129039129040129041129042129043129044129045129046129047129048129049129050129051129052129053129054129055129056129057129058129059129060129061129062129063129064129065129066129067129068129069129070129071129072129073129074129075129076129077129078129079129080129081129082129083129084129085129086129087129088129089129090129091129092129093129094129095129096129097129098129099129100129101129102129103129104129105129106129107129108129109129110129111129112129113129114129115129116129117129118129119129120129121129122129123129124129125129126129127129128129129129130129131129132129133129134129135129136129137129138129139129140129141129142129143129144129145129146129147129148129149129150129151129152129153129154129155129156129157129158129159129160129161129162129163129164129165129166129167129168129169129170129171129172129173129174129175129176129177129178129179129180129181129182129183129184129185129186129187129188129189129190129191129192129193129194129195129196129197129198129199129200129201129202129203129204129205129206129207129208129209129210129211129212129213129214129215129216129217129218129219129220129221129222129223129224129225129226129227129228129229129230129231129232129233129234129235129236129237129238129239129240129241129242129243129244129245129246129247129248129249129250129251129252129253129254129255129256129257129258129259129260129261129262129263129264129265129266129267129268129269129270129271129272129273129274129275129276129277129278129279129280129281129282129283129284129285129286129287129288129289129290129291129292129293129294129295129296129297129298129299129300129301129302129303129304129305129306129307129308129309129310129311129312129313129314129315129316129317129318129319129320129321129322129323129324129325129326129327129328129329129330129331129332129333129334129335129336129337129338129339129340129341129342129343129344129345129346129347129348129349129350129351129352129353129354129355129356129357129358129359129360129361129362129363129364129365129366129367129368129369129370129371129372129373129374129375129376129377129378129379129380129381129382129383129384129385129386129387129388129389129390129391129392129393129394129395129396129397129398129399129400129401129402129403129404129405129406129407129408129409129410129411129412129413129414129415129416129417129418129419129420129421129422129423129424129425129426129427129428129429129430129431129432129433129434129435129436129437129438129439129440129441129442129443129444129445129446129447129448129449129450129451129452129453129454129455129456129457129458129459129460129461129462129463129464129465129466129467129468129469129470129471129472129473129474129475129476129477129478129479129480129481129482129483129484129485129486129487129488129489129490129491129492129493129494129495129496129497129498129499129500129501129502129503129504129505129506129507129508129509129510129511129512129513129514129515129516129517129518129519129520129521129522129523129524129525129526129527129528129529129530129531129532129533129534129535129536129537129538129539129540129541129542129543129544129545129546129547129548129549129550129551129552129553129554129555129556129557129558129559129560129561129562129563129564129565129566129567129568129569129570129571129572129573129574129575129576129577129578129579129580129581129582129583129584129585129586129587129588129589129590129591129592129593129594129595129596129597129598129599129600129601129602129603129604129605129606129607129608129609129610129611129612129613129614129615129616129617129618129619129620129621129622129623129624129625129626129627129628129629129630129631129632129633129634129635129636129637129638129639129640129641129642129643129644129645129646129647129648129649129650129651129652129653129654129655129656129657129658129659129660129661129662129663129664129665129666129667129668129669129670129671129672129673129674129675129676129677129678129679129680129681129682129683129684129685129686129687129688129689129690129691129692129693129694129695129696129697129698129699129700129701129702129703129704129705129706129707129708129709129710129711129712129713129714129715129716129717129718129719129720129721129722129723129724129725129726129727129728129729129730129731129732129733129734129735129736129737129738129739129740129741129742129743129744129745129746129747129748129749129750129751129752129753129754129755129756129757129758129759129760129761129762129763129764129765129766129767129768129769129770129771129772129773129774129775129776129777129778129779129780129781129782129783129784129785129786129787129788129789129790129791129792129793129794129795129796129797129798129799129800129801129802129803129804129805129806129807129808129809129810129811129812129813129814129815129816129817129818129819129820129821129822129823129824129825129826129827129828129829129830129831129832129833129834129835129836129837129838129839129840129841129842129843129844129845129846129847129848129849129850129851129852129853129854129855129856129857129858129859129860129861129862129863129864129865129866129867129868129869129870129871129872129873129874129875129876129877129878129879129880129881129882129883129884129885129886129887129888129889129890129891129892129893129894129895129896129897129898129899129900129901129902129903129904129905129906129907129908129909129910129911129912129913129914129915129916129917129918129919129920129921129922129923129924129925129926129927129928129929129930129931129932129933129934129935129936129937129938129939129940129941129942129943129944129945129946129947129948129949129950129951129952129953129954129955129956129957129958129959129960129961129962129963129964129965129966129967129968129969129970129971129972129973129974129975129976129977129978129979129980129981129982129983129984129985129986129987129988129989129990129991129992129993129994129995129996129997129998129999130000130001130002130003130004130005130006130007130008130009130010130011130012130013130014130015130016130017130018130019130020130021130022130023130024130025130026130027130028130029130030130031130032130033130034130035130036130037130038130039130040130041130042130043130044130045130046130047130048130049130050130051130052130053130054130055130056130057130058130059130060130061130062130063130064130065130066130067130068130069130070130071130072130073130074130075130076130077130078130079130080130081130082130083130084130085130086130087130088130089130090130091130092130093130094130095130096130097130098130099130100130101130102130103130104130105130106130107130108130109130110130111130112130113130114130115130116130117130118130119130120130121130122130123130124130125130126130127130128130129130130130131130132130133130134130135130136130137130138130139130140130141130142130143130144130145130146130147130148130149130150130151130152130153130154130155130156130157130158130159130160130161130162130163130164130165130166130167130168130169130170130171130172130173130174130175130176130177130178130179130180130181130182130183130184130185130186130187130188130189130190130191130192130193130194130195130196130197130198130199130200130201130202130203130204130205130206130207130208130209130210130211130212130213130214130215130216130217130218130219130220130221130222130223130224130225130226130227130228130229130230130231130232130233130234130235130236130237130238130239130240130241130242130243130244130245130246130247130248130249130250130251130252130253130254130255130256130257130258130259130260130261130262130263130264130265130266130267130268130269130270130271130272130273130274130275130276130277130278130279130280130281130282130283130284130285130286130287130288130289130290130291130292130293130294130295130296130297130298130299130300130301130302130303130304130305130306130307130308130309130310130311130312130313130314130315130316130317130318130319130320130321130322130323130324130325130326130327130328130329130330130331130332130333130334130335130336130337130338130339130340130341130342130343130344130345130346130347130348130349130350130351130352130353130354130355130356130357130358130359130360130361130362130363130364130365130366130367130368130369130370130371130372130373130374130375130376130377130378130379130380130381130382130383130384130385130386130387130388130389130390130391130392130393130394130395130396130397130398130399130400130401130402130403130404130405130406130407130408130409130410130411130412130413130414130415130416130417130418130419130420130421130422130423130424130425130426130427130428130429130430130431130432130433130434130435130436130437130438130439130440130441130442130443130444130445130446130447130448130449130450130451130452130453130454130455130456130457130458130459130460130461130462130463130464130465130466130467130468130469130470130471130472130473130474130475130476130477130478130479130480130481130482130483130484130485130486130487130488130489130490130491130492130493130494130495130496130497130498130499130500130501130502130503130504130505130506130507130508130509130510130511130512130513130514130515130516130517130518130519130520130521130522130523130524130525130526130527130528130529130530130531130532130533130534130535130536130537130538130539130540130541130542130543130544130545130546130547130548130549130550130551130552130553130554130555130556130557130558130559130560130561130562130563130564130565130566130567130568130569130570130571130572130573130574130575130576130577130578130579130580130581130582130583130584130585130586130587130588130589130590130591130592130593130594130595130596130597130598130599130600130601130602130603130604130605130606130607130608130609130610130611130612130613130614130615130616130617130618130619130620130621130622130623130624130625130626130627130628130629130630130631130632130633130634130635130636130637130638130639130640130641130642130643130644130645130646130647130648130649130650130651130652130653130654130655130656130657130658130659130660130661130662130663130664130665130666130667130668130669130670130671130672130673130674130675130676130677130678130679130680130681130682130683130684130685130686130687130688130689130690130691130692130693130694130695130696130697130698130699130700130701130702130703130704130705130706130707130708130709130710130711130712130713130714130715130716130717130718130719130720130721130722130723130724130725130726130727130728130729130730130731130732130733130734130735130736130737130738130739130740130741130742130743130744130745130746130747130748130749130750130751130752130753130754130755130756130757130758130759130760130761130762130763130764130765130766130767130768130769130770130771130772130773130774130775130776130777130778130779130780130781130782130783130784130785130786130787130788130789130790130791130792130793130794130795130796130797130798130799130800130801130802130803130804130805130806130807130808130809130810130811130812130813130814130815130816130817130818130819130820130821130822130823130824130825130826130827130828130829130830130831130832130833130834130835130836130837130838130839130840130841130842130843130844130845130846130847130848130849130850130851130852130853130854130855130856130857130858130859130860130861130862130863130864130865130866130867130868130869130870130871130872130873130874130875130876130877130878130879130880130881130882130883130884130885130886130887130888130889130890130891130892130893130894130895130896130897130898130899130900130901130902130903130904130905130906130907130908130909130910130911130912130913130914130915130916130917130918130919130920130921130922130923130924130925130926130927130928130929130930130931130932130933130934130935130936130937130938130939130940130941130942130943130944130945130946130947130948130949130950130951130952130953130954130955130956130957130958130959130960130961130962130963130964130965130966130967130968130969130970130971130972130973130974130975130976130977130978130979130980130981130982130983130984130985130986130987130988130989130990130991130992130993130994130995130996130997130998130999131000131001131002131003131004131005131006131007131008131009131010131011131012131013131014131015131016131017131018131019131020131021131022131023131024131025131026131027131028131029131030131031131032131033131034131035131036131037131038131039131040131041131042131043131044131045131046131047131048131049131050131051131052131053131054131055131056131057131058131059131060131061131062131063131064131065131066131067131068131069131070131071131072131073131074131075131076131077131078131079131080131081131082131083131084131085131086131087131088131089131090131091131092131093131094131095131096131097131098131099131100131101131102131103131104131105131106131107131108131109131110131111131112131113131114131115131116131117131118131119131120131121131122131123131124131125131126131127131128131129131130131131131132131133131134131135131136131137131138131139131140131141131142131143131144131145131146131147131148131149131150131151131152131153131154131155131156131157131158131159131160131161131162131163131164131165131166131167131168131169131170131171131172131173131174131175131176131177131178131179131180131181131182131183131184131185131186131187131188131189131190131191131192131193131194131195131196131197131198131199131200131201131202131203131204131205131206131207131208131209131210131211131212131213131214131215131216131217131218131219131220131221131222131223131224131225131226131227131228131229131230131231131232131233131234131235131236131237131238131239131240131241131242131243131244131245131246131247131248131249131250131251131252131253131254131255131256131257131258131259131260131261131262131263131264131265131266131267131268131269131270131271131272131273131274131275131276131277131278131279131280131281131282131283131284131285131286131287131288131289131290131291131292131293131294131295131296131297131298131299131300131301131302131303131304131305131306131307131308131309131310131311131312131313131314131315131316131317131318131319131320131321131322131323131324131325131326131327131328131329131330131331131332131333131334131335131336131337131338131339131340131341131342131343131344131345131346131347131348131349131350131351131352131353131354131355131356131357131358131359131360131361131362131363131364131365131366131367131368131369131370131371131372131373131374131375131376131377131378131379131380131381131382131383131384131385131386131387131388131389131390131391131392131393131394131395131396131397131398131399131400131401131402131403131404131405131406131407131408131409131410131411131412131413131414131415131416131417131418131419131420131421131422131423131424131425131426131427131428131429131430131431131432131433131434131435131436131437131438131439131440131441131442131443131444131445131446131447131448131449131450131451131452131453131454131455131456131457131458131459131460131461131462131463131464131465131466131467131468131469131470131471131472131473131474131475131476131477131478131479131480131481131482131483131484131485131486131487131488131489131490131491131492131493131494131495131496131497131498131499131500131501131502131503131504131505131506131507131508131509131510131511131512131513131514131515131516131517131518131519131520131521131522131523131524131525131526131527131528131529131530131531131532131533131534131535131536131537131538131539131540131541131542131543131544131545131546131547131548131549131550131551131552131553131554131555131556131557131558131559131560131561131562131563131564131565131566131567131568131569131570131571131572131573131574131575131576131577131578131579131580131581131582131583131584131585131586131587131588131589131590131591131592131593131594131595131596131597131598131599131600131601131602131603131604131605131606131607131608131609131610131611131612131613131614131615131616131617131618131619131620131621131622131623131624131625131626131627131628131629131630131631131632131633131634131635131636131637131638131639131640131641131642131643131644131645131646131647131648131649131650131651131652131653131654131655131656131657131658131659131660131661131662131663131664131665131666131667131668131669131670131671131672131673131674131675131676131677131678131679131680131681131682131683131684131685131686131687131688131689131690131691131692131693131694131695131696131697131698131699131700131701131702131703131704131705131706131707131708131709131710131711131712131713131714131715131716131717131718131719131720131721131722131723131724131725131726131727131728131729131730131731131732131733131734131735131736131737131738131739131740131741131742131743131744131745131746131747131748131749131750131751131752131753131754131755131756131757131758131759131760131761131762131763131764131765131766131767131768131769131770131771131772131773131774131775131776131777131778131779131780131781131782131783131784131785131786131787131788131789131790131791131792131793131794131795131796131797131798131799131800131801131802131803131804131805131806131807131808131809131810131811131812131813131814131815131816131817131818131819131820131821131822131823131824131825131826131827131828131829131830131831131832131833131834131835131836131837131838131839131840131841131842131843131844131845131846131847131848131849131850131851131852131853131854131855131856131857131858131859131860131861131862131863131864131865131866131867131868131869131870131871131872131873131874131875131876131877131878131879131880131881131882131883131884131885131886131887131888131889131890131891131892131893131894131895131896131897131898131899131900131901131902131903131904131905131906131907131908131909131910131911131912131913131914131915131916131917131918131919131920131921131922131923131924131925131926131927131928131929131930131931131932131933131934131935131936131937131938131939131940131941131942131943131944131945131946131947131948131949131950131951131952131953131954131955131956131957131958131959131960131961131962131963131964131965131966131967131968131969131970131971131972131973131974131975131976131977131978131979131980131981131982131983131984131985131986131987131988131989131990131991131992131993131994131995131996131997131998131999132000132001132002132003132004132005132006132007132008132009132010132011132012132013132014132015132016132017132018132019132020132021132022132023132024132025132026132027132028132029132030132031132032132033132034132035132036132037132038132039132040132041132042132043132044132045132046132047132048132049132050132051132052132053132054132055132056132057132058132059132060132061132062132063132064132065132066132067132068132069132070132071132072132073132074132075132076132077132078132079132080132081132082132083132084132085132086132087132088132089132090132091132092132093132094132095132096132097132098132099132100132101132102132103132104132105132106132107132108132109132110132111132112132113132114132115132116132117132118132119132120132121132122132123132124132125132126132127132128132129132130132131132132132133132134132135132136132137132138132139132140132141132142132143132144132145132146132147132148132149132150132151132152132153132154132155132156132157132158132159132160132161132162132163132164132165132166132167132168132169132170132171132172132173132174132175132176132177132178132179132180132181132182132183132184132185132186132187132188132189132190132191132192132193132194132195132196132197132198132199132200132201132202132203132204132205132206132207132208132209132210132211132212132213132214132215132216132217132218132219132220132221132222132223132224132225132226132227132228132229132230132231132232132233132234132235132236132237132238132239132240132241132242132243132244132245132246132247132248132249132250132251132252132253132254132255132256132257132258132259132260132261132262132263132264132265132266132267132268132269132270132271132272132273132274132275132276132277132278132279132280132281132282132283132284132285132286132287132288132289132290132291132292132293132294132295132296132297132298132299132300132301132302132303132304132305132306132307132308132309132310132311132312132313132314132315132316132317132318132319132320132321132322132323132324132325132326132327132328132329132330132331132332132333132334132335132336132337132338132339132340132341132342132343132344132345132346132347132348132349132350132351132352132353132354132355132356132357132358132359132360132361132362132363132364132365132366132367132368132369132370132371132372132373132374132375132376132377132378132379132380132381132382132383132384132385132386132387132388132389132390132391132392132393132394132395132396132397132398132399132400132401132402132403132404132405132406132407132408132409132410132411132412132413132414132415132416132417132418132419132420132421132422132423132424132425132426132427132428132429132430132431132432132433132434132435132436132437132438132439132440132441132442132443132444132445132446132447132448132449132450132451132452132453132454132455132456132457132458132459132460132461132462132463132464132465132466132467132468132469132470132471132472132473132474132475132476132477132478132479132480132481132482132483132484132485132486132487132488132489132490132491132492132493132494132495132496132497132498132499132500132501132502132503132504132505132506132507132508132509132510132511132512132513132514132515132516132517132518132519132520132521132522132523132524132525132526132527132528132529132530132531132532132533132534132535132536132537132538132539132540132541132542132543132544132545132546132547132548132549132550132551132552132553132554132555132556132557132558132559132560132561132562132563132564132565132566132567132568132569132570132571132572132573132574132575132576132577132578132579132580132581132582132583132584132585132586132587132588132589132590132591132592132593132594132595132596132597132598132599132600132601132602132603132604132605132606132607132608132609132610132611132612132613132614132615132616132617132618132619132620132621132622132623132624132625132626132627132628132629132630132631132632132633132634132635132636132637132638132639132640132641132642132643132644132645132646132647132648132649132650132651132652132653132654132655132656132657132658132659132660132661132662132663132664132665132666132667132668132669132670132671132672132673132674132675132676132677132678132679132680132681132682132683132684132685132686132687132688132689132690132691132692132693132694132695132696132697132698132699132700132701132702132703132704132705132706132707132708132709132710132711132712132713132714132715132716132717132718132719132720132721132722132723132724132725132726132727132728132729132730132731132732132733132734132735132736132737132738132739132740132741132742132743132744132745132746132747132748132749132750132751132752132753132754132755132756132757132758132759132760132761132762132763132764132765132766132767132768132769132770132771132772132773132774132775132776132777132778132779132780132781132782132783132784132785132786132787132788132789132790132791132792132793132794132795132796132797132798132799132800132801132802132803132804132805132806132807132808132809132810132811132812132813132814132815132816132817132818132819132820132821132822132823132824132825132826132827132828132829132830132831132832132833132834132835132836132837132838132839132840132841132842132843132844132845132846132847132848132849132850132851132852132853132854132855132856132857132858132859132860132861132862132863132864132865132866132867132868132869132870132871132872132873132874132875132876132877132878132879132880132881132882132883132884132885132886132887132888132889132890132891132892132893132894132895132896132897132898132899132900132901132902132903132904132905132906132907132908132909132910132911132912132913132914132915132916132917132918132919132920132921132922132923132924132925132926132927132928132929132930132931132932132933132934132935132936132937132938132939132940132941132942132943132944132945132946132947132948132949132950132951132952132953132954132955132956132957132958132959132960132961132962132963132964132965132966132967132968132969132970132971132972132973132974132975132976132977132978132979132980132981132982132983132984132985132986132987132988132989132990132991132992132993132994132995132996132997132998132999133000133001133002133003133004133005133006133007133008133009133010133011133012133013133014133015133016133017133018133019133020133021133022133023133024133025133026133027133028133029133030133031133032133033133034133035133036133037133038133039133040133041133042133043133044133045133046133047133048133049133050133051133052133053133054133055133056133057133058133059133060133061133062133063133064133065133066133067133068133069133070133071133072133073133074133075133076133077133078133079133080133081133082133083133084133085133086133087133088133089133090133091133092133093133094133095133096133097133098133099133100133101133102133103133104133105133106133107133108133109133110133111133112133113133114133115133116133117133118133119133120133121133122133123133124133125133126133127133128133129133130133131133132133133133134133135133136133137133138133139133140133141133142133143133144133145133146133147133148133149133150133151133152133153133154133155133156133157133158133159133160133161133162133163133164133165133166133167133168133169133170133171133172133173133174133175133176133177133178133179133180133181133182133183133184133185133186133187133188133189133190133191133192133193133194133195133196133197133198133199133200133201133202133203133204133205133206133207133208133209133210133211133212133213133214133215133216133217133218133219133220133221133222133223133224133225133226133227133228133229133230133231133232133233133234133235133236133237133238133239133240133241133242133243133244133245133246133247133248133249133250133251133252133253133254133255133256133257133258133259133260133261133262133263133264133265133266133267133268133269133270133271133272133273133274133275133276133277133278133279133280133281133282133283133284133285133286133287133288133289133290133291133292133293133294133295133296133297133298133299133300133301133302133303133304133305133306133307133308133309133310133311133312133313133314133315133316133317133318133319133320133321133322133323133324133325133326133327133328133329133330133331133332133333133334133335133336133337133338133339133340133341133342133343133344133345133346133347133348133349133350133351133352133353133354133355133356133357133358133359133360133361133362133363133364133365133366133367133368133369133370133371133372133373133374133375133376133377133378133379133380133381133382133383133384133385133386133387133388133389133390133391133392133393133394133395133396133397133398133399133400133401133402133403133404133405133406133407133408133409133410133411133412133413133414133415133416133417133418133419133420133421133422133423133424133425133426133427133428133429133430133431133432133433133434133435133436133437133438133439133440133441133442133443133444133445133446133447133448133449133450133451133452133453133454133455133456133457133458133459133460133461133462133463133464133465133466133467133468133469133470133471133472133473133474133475133476133477133478133479133480133481133482133483133484133485133486133487133488133489133490133491133492133493133494133495133496133497133498133499133500133501133502133503133504133505133506133507133508133509133510133511133512133513133514133515133516133517133518133519133520133521133522133523133524133525133526133527133528133529133530133531133532133533133534133535133536133537133538133539133540133541133542133543133544133545133546133547133548133549133550133551133552133553133554133555133556133557133558133559133560133561133562133563133564133565133566133567133568133569133570133571133572133573133574133575133576133577133578133579133580133581133582133583133584133585133586133587133588133589133590133591133592133593133594133595133596133597133598133599133600133601133602133603133604133605133606133607133608133609133610133611133612133613133614133615133616133617133618133619133620133621133622133623133624133625133626133627133628133629133630133631133632133633133634133635133636133637133638133639133640133641133642133643133644133645133646133647133648133649133650133651133652133653133654133655133656133657133658133659133660133661133662133663133664133665133666133667133668133669133670133671133672133673133674133675133676133677133678133679133680133681133682133683133684133685133686133687133688133689133690133691133692133693133694133695133696133697133698133699133700133701133702133703133704133705133706133707133708133709133710133711133712133713133714133715133716133717133718133719133720133721133722133723133724133725133726133727133728133729133730133731133732133733133734133735133736133737133738133739133740133741133742133743133744133745133746133747133748133749133750133751133752133753133754133755133756133757133758133759133760133761133762133763133764133765133766133767133768133769133770133771133772133773133774133775133776133777133778133779133780133781133782133783133784133785133786133787133788133789133790133791133792133793133794133795133796133797133798133799133800133801133802133803133804133805133806133807133808133809133810133811133812133813133814133815133816133817133818133819133820133821133822133823133824133825133826133827133828133829133830133831133832133833133834133835133836133837133838133839133840133841133842133843133844133845133846133847133848133849133850133851133852133853133854133855133856133857133858133859133860133861133862133863133864133865133866133867133868133869133870133871133872133873133874133875133876133877133878133879133880133881133882133883133884133885133886133887133888133889133890133891133892133893133894133895133896133897133898133899133900133901133902133903133904133905133906133907133908133909133910133911133912133913133914133915133916133917133918133919133920133921133922133923133924133925133926133927133928133929133930133931133932133933133934133935133936133937133938133939133940133941133942133943133944133945133946133947133948133949133950133951133952133953133954133955133956133957133958133959133960133961133962133963133964133965133966133967133968133969133970133971133972133973133974133975133976133977133978133979133980133981133982133983133984133985133986133987133988133989133990133991133992133993133994133995133996133997133998133999134000134001134002134003134004134005134006134007134008134009134010134011134012134013134014134015134016134017134018134019134020134021134022134023134024134025134026134027134028134029134030134031134032134033134034134035134036134037134038134039134040134041134042134043134044134045134046134047134048134049134050134051134052134053134054134055134056134057134058134059134060134061134062134063134064134065134066134067134068134069134070134071134072134073134074134075134076134077134078134079134080134081134082134083134084134085134086134087134088134089134090134091134092134093134094134095134096134097134098134099134100134101134102134103134104134105134106134107134108134109134110134111134112134113134114134115134116134117134118134119134120134121134122134123134124134125134126134127134128134129134130134131134132134133134134134135134136134137134138134139134140134141134142134143134144134145134146134147134148134149134150134151134152134153134154134155134156134157134158134159134160134161134162134163134164134165134166134167134168134169134170134171134172134173134174134175134176134177134178134179134180134181134182134183134184134185134186134187134188134189134190134191134192134193134194134195134196134197134198134199134200134201134202134203134204134205134206134207134208134209134210134211134212134213134214134215134216134217134218134219134220134221134222134223134224134225134226134227134228134229134230134231134232134233134234134235134236134237134238134239134240134241134242134243134244134245134246134247134248134249134250134251134252134253134254134255134256134257134258134259134260134261134262134263134264134265134266134267134268134269134270134271134272134273134274134275134276134277134278134279134280134281134282134283134284134285134286134287134288134289134290134291134292134293134294134295134296134297134298134299134300134301134302134303134304134305134306134307134308134309134310134311134312134313134314134315134316134317134318134319134320134321134322134323134324134325134326134327134328134329134330134331134332134333134334134335134336134337134338134339134340134341134342134343134344134345134346134347134348134349134350134351134352134353134354134355134356134357134358134359134360134361134362134363134364134365134366134367134368134369134370134371134372134373134374134375134376134377134378134379134380134381134382134383134384134385134386134387134388134389134390134391134392134393134394134395134396134397134398134399134400134401134402134403134404134405134406134407134408134409134410134411134412134413134414134415134416134417134418134419134420134421134422134423134424134425134426134427134428134429134430134431134432134433134434134435134436134437134438134439134440134441134442134443134444134445134446134447134448134449134450134451134452134453134454134455134456134457134458134459134460134461134462134463134464134465134466134467134468134469134470134471134472134473134474134475134476134477134478134479134480134481134482134483134484134485134486134487134488134489134490134491134492134493134494134495134496134497134498134499134500134501134502134503134504134505134506134507134508134509134510134511134512134513134514134515134516134517134518134519134520134521134522134523134524134525134526134527134528134529134530134531134532134533134534134535134536134537134538134539134540134541134542134543134544134545134546134547134548134549134550134551134552134553134554134555134556134557134558134559134560134561134562134563134564134565134566134567134568134569134570134571134572134573134574134575134576134577134578134579134580134581134582134583134584134585134586134587134588134589134590134591134592134593134594134595134596134597134598134599134600134601134602134603134604134605134606134607134608134609134610134611134612134613134614134615134616134617134618134619134620134621134622134623134624134625134626134627134628134629134630134631134632134633134634134635134636134637134638134639134640134641134642134643134644134645134646134647134648134649134650134651134652134653134654134655134656134657134658134659134660134661134662134663134664134665134666134667134668134669134670134671134672134673134674134675134676134677134678134679134680134681134682134683134684134685134686134687134688134689134690134691134692134693134694134695134696134697134698134699134700134701134702134703134704134705134706134707134708134709134710134711134712134713134714134715134716134717134718134719134720134721134722134723134724134725134726134727134728134729134730134731134732134733134734134735134736134737134738134739134740134741134742134743134744134745134746134747134748134749134750134751134752134753134754134755134756134757134758134759134760134761134762134763134764134765134766134767134768134769134770134771134772134773134774134775134776134777134778134779134780134781134782134783134784134785134786134787134788134789134790134791134792134793134794134795134796134797134798134799134800134801134802134803134804134805134806134807134808134809134810134811134812134813134814134815134816134817134818134819134820134821134822134823134824134825134826134827134828134829134830134831134832134833134834134835134836134837134838134839134840134841134842134843134844134845134846134847134848134849134850134851134852134853134854134855134856134857134858134859134860134861134862134863134864134865134866134867134868134869134870134871134872134873134874134875134876134877134878134879134880134881134882134883134884134885134886134887134888134889134890134891134892134893134894134895134896134897134898134899134900134901134902134903134904134905134906134907134908134909134910134911134912134913134914134915134916134917134918134919134920134921134922134923134924134925134926134927134928134929134930134931134932134933134934134935134936134937134938134939134940134941134942134943134944134945134946134947134948134949134950134951134952134953134954134955134956134957134958134959134960134961134962134963134964134965134966134967134968134969134970134971134972134973134974134975134976134977134978134979134980134981134982134983134984134985134986134987134988134989134990134991134992134993134994134995134996134997134998134999135000135001135002135003135004135005135006135007135008135009135010135011135012135013135014135015135016135017135018135019135020135021135022135023135024135025135026135027135028135029135030135031135032135033135034135035135036135037135038135039135040135041135042135043135044135045135046135047135048135049135050135051135052135053135054135055135056135057135058135059135060135061135062135063135064135065135066135067135068135069135070135071135072135073135074135075135076135077135078135079135080135081135082135083135084135085135086135087135088135089135090135091135092135093135094135095135096135097135098135099135100135101135102135103135104135105135106135107135108135109135110135111135112135113135114135115135116135117135118135119135120135121135122135123135124135125135126135127135128135129135130135131135132135133135134135135135136135137135138135139135140135141135142135143135144135145135146135147135148135149135150135151135152135153135154135155135156135157135158135159135160135161135162135163135164135165135166135167135168135169135170135171135172135173135174135175135176135177135178135179135180135181135182135183135184135185135186135187135188135189135190135191135192135193135194135195135196135197135198135199135200135201135202135203135204135205135206135207135208135209135210135211135212135213135214135215135216135217135218135219135220135221135222135223135224135225135226135227135228135229135230135231135232135233135234135235135236135237135238135239135240135241135242135243135244135245135246135247135248135249135250135251135252135253135254135255135256135257135258135259135260135261135262135263135264135265135266135267135268135269135270135271135272135273135274135275135276135277135278135279135280135281135282135283135284135285135286135287135288135289135290135291135292135293135294135295135296135297135298135299135300135301135302135303135304135305135306135307135308135309135310135311135312135313135314135315135316135317135318135319135320135321135322135323135324135325135326135327135328135329135330135331135332135333135334135335135336135337135338135339135340135341135342135343135344135345135346135347135348135349135350135351135352135353135354135355135356135357135358135359135360135361135362135363135364135365135366135367135368135369135370135371135372135373135374135375135376135377135378135379135380135381135382135383135384135385135386135387135388135389135390135391135392135393135394135395135396135397135398135399135400135401135402135403135404135405135406135407135408135409135410135411135412135413135414135415135416135417135418135419135420135421135422135423135424135425135426135427135428135429135430135431135432135433135434135435135436135437135438135439135440135441135442135443135444135445135446135447135448135449135450135451135452135453135454135455135456135457135458135459135460135461135462135463135464135465135466135467135468135469135470135471135472135473135474135475135476135477135478135479135480135481135482135483135484135485135486135487135488135489135490135491135492135493135494135495135496135497135498135499135500135501135502135503135504135505135506135507135508135509135510135511135512135513135514135515135516135517135518135519135520135521135522135523135524135525135526135527135528135529135530135531135532135533135534135535135536135537135538135539135540135541135542135543135544135545135546135547135548135549135550135551135552135553135554135555135556135557135558135559135560135561135562135563135564135565135566135567135568135569135570135571135572135573135574135575135576135577135578135579135580135581135582135583135584135585135586135587135588135589135590135591135592135593135594135595135596135597135598135599135600135601135602135603135604135605135606135607135608135609135610135611135612135613135614135615135616135617135618135619135620135621135622135623135624135625135626135627135628135629135630135631135632135633135634135635135636135637135638135639135640135641135642135643135644135645135646135647135648135649135650135651135652135653135654135655135656135657135658135659135660135661135662135663135664135665135666135667135668135669135670135671135672135673135674135675135676135677135678135679135680135681135682135683135684135685135686135687135688135689135690135691135692135693135694135695135696135697135698135699135700135701135702135703135704135705135706135707135708135709135710135711135712135713135714135715135716135717135718135719135720135721135722135723135724135725135726135727135728135729135730135731135732135733135734135735135736135737135738135739135740135741135742135743135744135745135746135747135748135749135750135751135752135753135754135755135756135757135758135759135760135761135762135763135764135765135766135767135768135769135770135771135772135773135774135775135776135777135778135779135780135781135782135783135784135785135786135787135788135789135790135791135792135793135794135795135796135797135798135799135800135801135802135803135804135805135806135807135808135809135810135811135812135813135814135815135816135817135818135819135820135821135822135823135824135825135826135827135828135829135830135831135832135833135834135835135836135837135838135839135840135841135842135843135844135845135846135847135848135849135850135851135852135853135854135855135856135857135858135859135860135861135862135863135864135865135866135867135868135869135870135871135872135873135874135875135876135877135878135879135880135881135882135883135884135885135886135887135888135889135890135891135892135893135894135895135896135897135898135899135900135901135902135903135904135905135906135907135908135909135910135911135912135913135914135915135916135917135918135919135920135921135922135923135924135925135926135927135928135929135930135931135932135933135934135935135936135937135938135939135940135941135942135943135944135945135946135947135948135949135950135951135952135953135954135955135956135957135958135959135960135961135962135963135964135965135966135967135968135969135970135971135972135973135974135975135976135977135978135979135980135981135982135983135984135985135986135987135988135989135990135991135992135993135994135995135996135997135998135999136000136001136002136003136004136005136006136007136008136009136010136011136012136013136014136015136016136017136018136019136020136021136022136023136024136025136026136027136028136029136030136031136032136033136034136035136036136037136038136039136040136041136042136043136044136045136046136047136048136049136050136051136052136053136054136055136056136057136058136059136060136061136062136063136064136065136066136067136068136069136070136071136072136073136074136075136076136077136078136079136080136081136082136083136084136085136086136087136088136089136090136091136092136093136094136095136096136097136098136099136100136101136102136103136104136105136106136107136108136109136110136111136112136113136114136115136116136117136118136119136120136121136122136123136124136125136126136127136128136129136130136131136132136133136134136135136136136137136138136139136140136141136142136143136144136145136146136147136148136149136150136151136152136153136154136155136156136157136158136159136160136161136162136163136164136165136166136167136168136169136170136171136172136173136174136175136176136177136178136179136180136181136182136183136184136185136186136187136188136189136190136191136192136193136194136195136196136197136198136199136200136201136202136203136204136205136206136207136208136209136210136211136212136213136214136215136216136217136218136219136220136221136222136223136224136225136226136227136228136229136230136231136232136233136234136235136236136237136238136239136240136241136242136243136244136245136246136247136248136249136250136251136252136253136254136255136256136257136258136259136260136261136262136263136264136265136266136267136268136269136270136271136272136273136274136275136276136277136278136279136280136281136282136283136284136285136286136287136288136289136290136291136292136293136294136295136296136297136298136299136300136301136302136303136304136305136306136307136308136309136310136311136312136313136314136315136316136317136318136319136320136321136322136323136324136325136326136327136328136329136330136331136332136333136334136335136336136337136338136339136340136341136342136343136344136345136346136347136348136349136350136351136352136353136354136355136356136357136358136359136360136361136362136363136364136365136366136367136368136369136370136371136372136373136374136375136376136377136378136379136380136381136382136383136384136385136386136387136388136389136390136391136392136393136394136395136396136397136398136399136400136401136402136403136404136405136406136407136408136409136410136411136412136413136414136415136416136417136418136419136420136421136422136423136424136425136426136427136428136429136430136431136432136433136434136435136436136437136438136439136440136441136442136443136444136445136446136447136448136449136450136451136452136453136454136455136456136457136458136459136460136461136462136463136464136465136466136467136468136469136470136471136472136473136474136475136476136477136478136479136480136481136482136483136484136485136486136487136488136489136490136491136492136493136494136495136496136497136498136499136500136501136502136503136504136505136506136507136508136509136510136511136512136513136514136515136516136517136518136519136520136521136522136523136524136525136526136527136528136529136530136531136532136533136534136535136536136537136538136539136540136541136542136543136544136545136546136547136548136549136550136551136552136553136554136555136556136557136558136559136560136561136562136563136564136565136566136567136568136569136570136571136572136573136574136575136576136577136578136579136580136581136582136583136584136585136586136587136588136589136590136591136592136593136594136595136596136597136598136599136600136601136602136603136604136605136606136607136608136609136610136611136612136613136614136615136616136617136618136619136620136621136622136623136624136625136626136627136628136629136630136631136632136633136634136635136636136637136638136639136640136641136642136643136644136645136646136647136648136649136650136651136652136653136654136655136656136657136658136659136660136661136662136663136664136665136666136667136668136669136670136671136672136673136674136675136676136677136678136679136680136681136682136683136684136685136686136687136688136689136690136691136692136693136694136695136696136697136698136699136700136701136702136703136704136705136706136707136708136709136710136711136712136713136714136715136716136717136718136719136720136721136722136723136724136725136726136727136728136729136730136731136732136733136734136735136736136737136738136739136740136741136742136743136744136745136746136747136748136749136750136751136752136753136754136755136756136757136758136759136760136761136762136763136764136765136766136767136768136769136770136771136772136773136774136775136776136777136778136779136780136781136782136783136784136785136786136787136788136789136790136791136792136793136794136795136796136797136798136799136800136801136802136803136804136805136806136807136808136809136810136811136812136813136814136815136816136817136818136819136820136821136822136823136824136825136826136827136828136829136830136831136832136833136834136835136836136837136838136839136840136841136842136843136844136845136846136847136848136849136850136851136852136853136854136855136856136857136858136859136860136861136862136863136864136865136866136867136868136869136870136871136872136873136874136875136876136877136878136879136880136881136882136883136884136885136886136887136888136889136890136891136892136893136894136895136896136897136898136899136900136901136902136903136904136905136906136907136908136909136910136911136912136913136914136915136916136917136918136919136920136921136922136923136924136925136926136927136928136929136930136931136932136933136934136935136936136937136938136939136940136941136942136943136944136945136946136947136948136949136950136951136952136953136954136955136956136957136958136959136960136961136962136963136964136965136966136967136968136969136970136971136972136973136974136975136976136977136978136979136980136981136982136983136984136985136986136987136988136989136990136991136992136993136994136995136996136997136998136999137000137001137002137003137004137005137006137007137008137009137010137011137012137013137014137015137016137017137018137019137020137021137022137023137024137025137026137027137028137029137030137031137032137033137034137035137036137037137038137039137040137041137042137043137044137045137046137047137048137049137050137051137052137053137054137055137056137057137058137059137060137061137062137063137064137065137066137067137068137069137070137071137072137073137074137075137076137077137078137079137080137081137082137083137084137085137086137087137088137089137090137091137092137093137094137095137096137097137098137099137100137101137102137103137104137105137106137107137108137109137110137111137112137113137114137115137116137117137118137119137120137121137122137123137124137125137126137127137128137129137130137131137132137133137134137135137136137137137138137139137140137141137142137143137144137145137146137147137148137149137150137151137152137153137154137155137156137157137158137159137160137161137162137163137164137165137166137167137168137169137170137171137172137173137174137175137176137177137178137179137180137181137182137183137184137185137186137187137188137189137190137191137192137193137194137195137196137197137198137199137200137201137202137203137204137205137206137207137208137209137210137211137212137213137214137215137216137217137218137219137220137221137222137223137224137225137226137227137228137229137230137231137232137233137234137235137236137237137238137239137240137241137242137243137244137245137246137247137248137249137250137251137252137253137254137255137256137257137258137259137260137261137262137263137264137265137266137267137268137269137270137271137272137273137274137275137276137277137278137279137280137281137282137283137284137285137286137287137288137289137290137291137292137293137294137295137296137297137298137299137300137301137302137303137304137305137306137307137308137309137310137311137312137313137314137315137316137317137318137319137320137321137322137323137324137325137326137327137328137329137330137331137332137333137334137335137336137337137338137339137340137341137342137343137344137345137346137347137348137349137350137351137352137353137354137355137356137357137358137359137360137361137362137363137364137365137366137367137368137369137370137371137372137373137374137375137376137377137378137379137380137381137382137383137384137385137386137387137388137389137390137391137392137393137394137395137396137397137398137399137400137401137402137403137404137405137406137407137408137409137410137411137412137413137414137415137416137417137418137419137420137421137422137423137424137425137426137427137428137429137430137431137432137433137434137435137436137437137438137439137440137441137442137443137444137445137446137447137448137449137450137451137452137453137454137455137456137457137458137459137460137461137462137463137464137465137466137467137468137469137470137471137472137473137474137475137476137477137478137479137480137481137482137483137484137485137486137487137488137489137490137491137492137493137494137495137496137497137498137499137500137501137502137503137504137505137506137507137508137509137510137511137512137513137514137515137516137517137518137519137520137521137522137523137524137525137526137527137528137529137530137531137532137533137534137535137536137537137538137539137540137541137542137543137544137545137546137547137548137549137550137551137552137553137554137555137556137557137558137559137560137561137562137563137564137565137566137567137568137569137570137571137572137573137574137575137576137577137578137579137580137581137582137583137584137585137586137587137588137589137590137591137592137593137594137595137596137597137598137599137600137601137602137603137604137605137606137607137608137609137610137611137612137613137614137615137616137617137618137619137620137621137622137623137624137625137626137627137628137629137630137631137632137633137634137635137636137637137638137639137640137641137642137643137644137645137646137647137648137649137650137651137652137653137654137655137656137657137658137659137660137661137662137663137664137665137666137667137668137669137670137671137672137673137674137675137676137677137678137679137680137681137682137683137684137685137686137687137688137689137690137691137692137693137694137695137696137697137698137699137700137701137702137703137704137705137706137707137708137709137710137711137712137713137714137715137716137717137718137719137720137721137722137723137724137725137726137727137728137729137730137731137732137733137734137735137736137737137738137739137740137741137742137743137744137745137746137747137748137749137750137751137752137753137754137755137756137757137758137759137760137761137762137763137764137765137766137767137768137769137770137771137772137773137774137775137776137777137778137779137780137781137782137783137784137785137786137787137788137789137790137791137792137793137794137795137796137797137798137799137800137801137802137803137804137805137806137807137808137809137810137811137812137813137814137815137816137817137818137819137820137821137822137823137824137825137826137827137828137829137830137831137832137833137834137835137836137837137838137839137840137841137842137843137844137845137846137847137848137849137850137851137852137853137854137855137856137857137858137859137860137861137862137863137864137865137866137867137868137869137870137871137872137873137874137875137876137877137878137879137880137881137882137883137884137885137886137887137888137889137890137891137892137893137894137895137896137897137898137899137900137901137902137903137904137905137906137907137908137909137910137911137912137913137914137915137916137917137918137919137920137921137922137923137924137925137926137927137928137929137930137931137932137933137934137935137936137937137938137939137940137941137942137943137944137945137946137947137948137949137950137951137952137953137954137955137956137957137958137959137960137961137962137963137964137965137966137967137968137969137970137971137972137973137974137975137976137977137978137979137980137981137982137983137984137985137986137987137988137989137990137991137992137993137994137995137996137997137998137999138000138001138002138003138004138005138006138007138008138009138010138011138012138013138014138015138016138017138018138019138020138021138022138023138024138025138026138027138028138029138030138031138032138033138034138035138036138037138038138039138040138041138042138043138044138045138046138047138048138049138050138051138052138053138054138055138056138057138058138059138060138061138062138063138064138065138066138067138068138069138070138071138072138073138074138075138076138077138078138079138080138081138082138083138084138085138086138087138088138089138090138091138092138093138094138095138096138097138098138099138100138101138102138103138104138105138106138107138108138109138110138111138112138113138114138115138116138117138118138119138120138121138122138123138124138125138126138127138128138129138130138131138132138133138134138135138136138137138138138139138140138141138142138143138144138145138146138147138148138149138150138151138152138153138154138155138156138157138158138159138160138161138162138163138164138165138166138167138168138169138170138171138172138173138174138175138176138177138178138179138180138181138182138183138184138185138186138187138188138189138190138191138192138193138194138195138196138197138198138199138200138201138202138203138204138205138206138207138208138209138210138211138212138213138214138215138216138217138218138219138220138221138222138223138224138225138226138227138228138229138230138231138232138233138234138235138236138237138238138239138240138241138242138243138244138245138246138247138248138249138250138251138252138253138254138255138256138257138258138259138260138261138262138263138264138265138266138267138268138269138270138271138272138273138274138275138276138277138278138279138280138281138282138283138284138285138286138287138288138289138290138291138292138293138294138295138296138297138298138299138300138301138302138303138304138305138306138307138308138309138310138311138312138313138314138315138316138317138318138319138320138321138322138323138324138325138326138327138328138329138330138331138332138333138334138335138336138337138338138339138340138341138342138343138344138345138346138347138348138349138350138351138352138353138354138355138356138357138358138359138360138361138362138363138364138365138366138367138368138369138370138371138372138373138374138375138376138377138378138379138380138381138382138383138384138385138386138387138388138389138390138391138392138393138394138395138396138397138398138399138400138401138402138403138404138405138406138407138408138409138410138411138412138413138414138415138416138417138418138419138420138421138422138423138424138425138426138427138428138429138430138431138432138433138434138435138436138437138438138439138440138441138442138443138444138445138446138447138448138449138450138451138452138453138454138455138456138457138458138459138460138461138462138463138464138465138466138467138468138469138470138471138472138473138474138475138476138477138478138479138480138481138482138483138484138485138486138487138488138489138490138491138492138493138494138495138496138497138498138499138500138501138502138503138504138505138506138507138508138509138510138511138512138513138514138515138516138517138518138519138520138521138522138523138524138525138526138527138528138529138530138531138532138533138534138535138536138537138538138539138540138541138542138543138544138545138546138547138548138549138550138551138552138553138554138555138556138557138558138559138560138561138562138563138564138565138566138567138568138569138570138571138572138573138574138575138576138577138578138579138580138581138582138583138584138585138586138587138588138589138590138591138592138593138594138595138596138597138598138599138600138601138602138603138604138605138606138607138608138609138610138611138612138613138614138615138616138617138618138619138620138621138622138623138624138625138626138627138628138629138630138631138632138633138634138635138636138637138638138639138640138641138642138643138644138645138646138647138648138649138650138651138652138653138654138655138656138657138658138659138660138661138662138663138664138665138666138667138668138669138670138671138672138673138674138675138676138677138678138679138680138681138682138683138684138685138686138687138688138689138690138691138692138693138694138695138696138697138698138699138700138701138702138703138704138705138706138707138708138709138710138711138712138713138714138715138716138717138718138719138720138721138722138723138724138725138726138727138728138729138730138731138732138733138734138735138736138737138738138739138740138741138742138743138744138745138746138747138748138749138750138751138752138753138754138755138756138757138758138759138760138761138762138763138764138765138766138767138768138769138770138771138772138773138774138775138776138777138778138779138780138781138782138783138784138785138786138787138788138789138790138791138792138793138794138795138796138797138798138799138800138801138802138803138804138805138806138807138808138809138810138811138812138813138814138815138816138817138818138819138820138821138822138823138824138825138826138827138828138829138830138831138832138833138834138835138836138837138838138839138840138841138842138843138844138845138846138847138848138849138850138851138852138853138854138855138856138857138858138859138860138861138862138863138864138865138866138867138868138869138870138871138872138873138874138875138876138877138878138879138880138881138882138883138884138885138886138887138888138889138890138891138892138893138894138895138896138897138898138899138900138901138902138903138904138905138906138907138908138909138910138911138912138913138914138915138916138917138918138919138920138921138922138923138924138925138926138927138928138929138930138931138932138933138934138935138936138937138938138939138940138941138942138943138944138945138946138947138948138949138950138951138952138953138954138955138956138957138958138959138960138961138962138963138964138965138966138967138968138969138970138971138972138973138974138975138976138977138978138979138980138981138982138983138984138985138986138987138988138989138990138991138992138993138994138995138996138997138998138999139000139001139002139003139004139005139006139007139008139009139010139011139012139013139014139015139016139017139018139019139020139021139022139023139024139025139026139027139028139029139030139031139032139033139034139035139036139037139038139039139040139041139042139043139044139045139046139047139048139049139050139051139052139053139054139055139056139057139058139059139060139061139062139063139064139065139066139067139068139069139070139071139072139073139074139075139076139077139078139079139080139081139082139083139084139085139086139087139088139089139090139091139092139093139094139095139096139097139098139099139100139101139102139103139104139105139106139107139108139109139110139111139112139113139114139115139116139117139118139119139120139121139122139123139124139125139126139127139128139129139130139131139132139133139134139135139136139137139138139139139140139141139142139143139144139145139146139147139148139149139150139151139152139153139154139155139156139157139158139159139160139161139162139163139164139165139166139167139168139169139170139171139172139173139174139175139176139177139178139179139180139181139182139183139184139185139186139187139188139189139190139191139192139193139194139195139196139197139198139199139200139201139202139203139204139205139206139207139208139209139210139211139212139213139214139215139216139217139218139219139220139221139222139223139224139225139226139227139228139229139230139231139232139233139234139235139236139237139238139239139240139241139242139243139244139245139246139247139248139249139250139251139252139253139254139255139256139257139258139259139260139261139262139263139264139265139266139267139268139269139270139271139272139273139274139275139276139277139278139279139280139281139282139283139284139285139286139287139288139289139290139291139292139293139294139295139296139297139298139299139300139301139302139303139304139305139306139307139308139309139310139311139312139313139314139315139316139317139318139319139320139321139322139323139324139325139326139327139328139329139330139331139332139333139334139335139336139337139338139339139340139341139342139343139344139345139346139347139348139349139350139351139352139353139354139355139356139357139358139359139360139361139362139363139364139365139366139367139368139369139370139371139372139373139374139375139376139377139378139379139380139381139382139383139384139385139386139387139388139389139390139391139392139393139394139395139396139397139398139399139400139401139402139403139404139405139406139407139408139409139410139411139412139413139414139415139416139417139418139419139420139421139422139423139424139425139426139427139428139429139430139431139432139433139434139435139436139437139438139439139440139441139442139443139444139445139446139447139448139449139450139451139452139453139454139455139456139457139458139459139460139461139462139463139464139465139466139467139468139469139470139471139472139473139474139475139476139477139478139479139480139481139482139483139484139485139486139487139488139489139490139491139492139493139494139495139496139497139498139499139500139501139502139503139504139505139506139507139508139509139510139511139512139513139514139515139516139517139518139519139520139521139522139523139524139525139526139527139528139529139530139531139532139533139534139535139536139537139538139539139540139541139542139543139544139545139546139547139548139549139550139551139552139553139554139555139556139557139558139559139560139561139562139563139564139565139566139567139568139569139570139571139572139573139574139575139576139577139578139579139580139581139582139583139584139585139586139587139588139589139590139591139592139593139594139595139596139597139598139599139600139601139602139603139604139605139606139607139608139609139610139611139612139613139614139615139616139617139618139619139620139621139622139623139624139625139626139627139628139629139630139631139632139633139634139635139636139637139638139639139640139641139642139643139644139645139646139647139648139649139650139651139652139653139654139655139656139657139658139659139660139661139662139663139664139665139666139667139668139669139670139671139672139673139674139675139676139677139678139679139680139681139682139683139684139685139686139687139688139689139690139691139692139693139694139695139696139697139698139699139700139701139702139703139704139705139706139707139708139709139710139711139712139713139714139715139716139717139718139719139720139721139722139723139724139725139726139727139728139729139730139731139732139733139734139735139736139737139738139739139740139741139742139743139744139745139746139747139748139749139750139751139752139753139754139755139756139757139758139759139760139761139762139763139764139765139766139767139768139769139770139771139772139773139774139775139776139777139778139779139780139781139782139783139784139785139786139787139788139789139790139791139792139793139794139795139796139797139798139799139800139801139802139803139804139805139806139807139808139809139810139811139812139813139814139815139816139817139818139819139820139821139822139823139824139825139826139827139828139829139830139831139832139833139834139835139836139837139838139839139840139841139842139843139844139845139846139847139848139849139850139851139852139853139854139855139856139857139858139859139860139861139862139863139864139865139866139867139868139869139870139871139872139873139874139875139876139877139878139879139880139881139882139883139884139885139886139887139888139889139890139891139892139893139894139895139896139897139898139899139900139901139902139903139904139905139906139907139908139909139910139911139912139913139914139915139916139917139918139919139920139921139922139923139924139925139926139927139928139929139930139931139932139933139934139935139936139937139938139939139940139941139942139943139944139945139946139947139948139949139950139951139952139953139954139955139956139957139958139959139960139961139962139963139964139965139966139967139968139969139970139971139972139973139974139975139976139977139978139979139980139981139982139983139984139985139986139987139988139989139990139991139992139993139994139995139996139997139998139999140000140001140002140003140004140005140006140007140008140009140010140011140012140013140014140015140016140017140018140019140020140021140022140023140024140025140026140027140028140029140030140031140032140033140034140035140036140037140038140039140040140041140042140043140044140045140046140047140048140049140050140051140052140053140054140055140056140057140058140059140060140061140062140063140064140065140066140067140068140069140070140071140072140073140074140075140076140077140078140079140080140081140082140083140084140085140086140087140088140089140090140091140092140093140094140095140096140097140098140099140100140101140102140103140104140105140106140107140108140109140110140111140112140113140114140115140116140117140118140119140120140121140122140123140124140125140126140127140128140129140130140131140132140133140134140135140136140137140138140139140140140141140142140143140144140145140146140147140148140149140150140151140152140153140154140155140156140157140158140159140160140161140162140163140164140165140166140167140168140169140170140171140172140173140174140175140176140177140178140179140180140181140182140183140184140185140186140187140188140189140190140191140192140193140194140195140196140197140198140199140200140201140202140203140204140205140206140207140208140209140210140211140212140213140214140215140216140217140218140219140220140221140222140223140224140225140226140227140228140229140230140231140232140233140234140235140236140237140238140239140240140241140242140243140244140245140246140247140248140249140250140251140252140253140254140255140256140257140258140259140260140261140262140263140264140265140266140267140268140269140270140271140272140273140274140275140276140277140278140279140280140281140282140283140284140285140286140287140288140289140290140291140292140293140294140295140296140297140298140299140300140301140302140303140304140305140306140307140308140309140310140311140312140313140314140315140316140317140318140319140320140321140322140323140324140325140326140327140328140329140330140331140332140333140334140335140336140337140338140339140340140341140342140343140344140345140346140347140348140349140350140351140352140353140354140355140356140357140358140359140360140361140362140363140364140365140366140367140368140369140370140371140372140373140374140375140376140377140378140379140380140381140382140383140384140385140386140387140388140389140390140391140392140393140394140395140396140397140398140399140400140401140402140403140404140405140406140407140408140409140410140411140412140413140414140415140416140417140418140419140420140421140422140423140424140425140426140427140428140429140430140431140432140433140434140435140436140437140438140439140440140441140442140443140444140445140446140447140448140449140450140451140452140453140454140455140456140457140458140459140460140461140462140463140464140465140466140467140468140469140470140471140472140473140474140475140476140477140478140479140480140481140482140483140484140485140486140487140488140489140490140491140492140493140494140495140496140497140498140499140500140501140502140503140504140505140506140507140508140509140510140511140512140513140514140515140516140517140518140519140520140521140522140523140524140525140526140527140528140529140530140531140532140533140534140535140536140537140538140539140540140541140542140543140544140545140546140547140548140549140550140551140552140553140554140555140556140557140558140559140560140561140562140563140564140565140566140567140568140569140570140571140572140573140574140575140576140577140578140579140580140581140582140583140584140585140586140587140588140589140590140591140592140593140594140595140596140597140598140599140600140601140602140603140604140605140606140607140608140609140610140611140612140613140614140615140616140617140618140619140620140621140622140623140624140625140626140627140628140629140630140631140632140633140634140635140636140637140638140639140640140641140642140643140644140645140646140647140648140649140650140651140652140653140654140655140656140657140658140659140660140661140662140663140664140665140666140667140668140669140670140671140672140673140674140675140676140677140678140679140680140681140682140683140684140685140686140687140688140689140690140691140692140693140694140695140696140697140698140699140700140701140702140703140704140705140706140707140708140709140710140711140712140713140714140715140716140717140718140719140720140721140722140723140724140725140726140727140728140729140730140731140732140733140734140735140736140737140738140739140740140741140742140743140744140745140746140747140748140749140750140751140752140753140754140755140756140757140758140759140760140761140762140763140764140765140766140767140768140769140770140771140772140773140774140775140776140777140778140779140780140781140782140783140784140785140786140787140788140789140790140791140792140793140794140795140796140797140798140799140800140801140802140803140804140805140806140807140808140809140810140811140812140813140814140815140816140817140818140819140820140821140822140823140824140825140826140827140828140829140830140831140832140833140834140835140836140837140838140839140840140841140842140843140844140845140846140847140848140849140850140851140852140853140854140855140856140857140858140859140860140861140862140863140864140865140866140867140868140869140870140871140872140873140874140875140876140877140878140879140880140881140882140883140884140885140886140887140888140889140890140891140892140893140894140895140896140897140898140899140900140901140902140903140904140905140906140907140908140909140910140911140912140913140914140915140916140917140918140919140920140921140922140923140924140925140926140927140928140929140930140931140932140933140934140935140936140937140938140939140940140941140942140943140944140945140946140947140948140949140950140951140952140953140954140955140956140957140958140959140960140961140962140963140964140965140966140967140968140969140970140971140972140973140974140975140976140977140978140979140980140981140982140983140984140985140986140987140988140989140990140991140992140993140994140995140996140997140998140999141000141001141002141003141004141005141006141007141008141009141010141011141012141013141014141015141016141017141018141019141020141021141022141023141024141025141026141027141028141029141030141031141032141033141034141035141036141037141038141039141040141041141042141043141044141045141046141047141048141049141050141051141052141053141054141055141056141057141058141059141060141061141062141063141064141065141066141067141068141069141070141071141072141073141074141075141076141077141078141079141080141081141082141083141084141085141086141087141088141089141090141091141092141093141094141095141096141097141098141099141100141101141102141103141104141105141106141107141108141109141110141111141112141113141114141115141116141117141118141119141120141121141122141123141124141125141126141127141128141129141130141131141132141133141134141135141136141137141138141139141140141141141142141143141144141145141146141147141148141149141150141151141152141153141154141155141156141157141158141159141160141161141162141163141164141165141166141167141168141169141170141171141172141173141174141175141176141177141178141179141180141181141182141183141184141185141186141187141188141189141190141191141192141193141194141195141196141197141198141199141200141201141202141203141204141205141206141207141208141209141210141211141212141213141214141215141216141217141218141219141220141221141222141223141224141225141226141227141228141229141230141231141232141233141234141235141236141237141238141239141240141241141242141243141244141245141246141247141248141249141250141251141252141253141254141255141256141257141258141259141260141261141262141263141264141265141266141267141268141269141270141271141272141273141274141275141276141277141278141279141280141281141282141283141284141285141286141287141288141289141290141291141292141293141294141295141296141297141298141299141300141301141302141303141304141305141306141307141308141309141310141311141312141313141314141315141316141317141318141319141320141321141322141323141324141325141326141327141328141329141330141331141332141333141334141335141336141337141338141339141340141341141342141343141344141345141346141347141348141349141350141351141352141353141354141355141356141357141358141359141360141361141362141363141364141365141366141367141368141369141370141371141372141373141374141375141376141377141378141379141380141381141382141383141384141385141386141387141388141389141390141391141392141393141394141395141396141397141398141399141400141401141402141403141404141405141406141407141408141409141410141411141412141413141414141415141416141417141418141419141420141421141422141423141424141425141426141427141428141429141430141431141432141433141434141435141436141437141438141439141440141441141442141443141444141445141446141447141448141449141450141451141452141453141454141455141456141457141458141459141460141461141462141463141464141465141466141467141468141469141470141471141472141473141474141475141476141477141478141479141480141481141482141483141484141485141486141487141488141489141490141491141492141493141494141495141496141497141498141499141500141501141502141503141504141505141506141507141508141509141510141511141512141513141514141515141516141517141518141519141520141521141522141523141524141525141526141527141528141529141530141531141532141533141534141535141536141537141538141539141540141541141542141543141544141545141546141547141548141549141550141551141552141553141554141555141556141557141558141559141560141561141562141563141564141565141566141567141568141569141570141571141572141573141574141575141576141577141578141579141580141581141582141583141584141585141586141587141588141589141590141591141592141593141594141595141596141597141598141599141600141601141602141603141604141605141606141607141608141609141610141611141612141613141614141615141616141617141618141619141620141621141622141623141624141625141626141627141628141629141630141631141632141633141634141635141636141637141638141639141640141641141642141643141644141645141646141647141648141649141650141651141652141653141654141655141656141657141658141659141660141661141662141663141664141665141666141667141668141669141670141671141672141673141674141675141676141677141678141679141680141681141682141683141684141685141686141687141688141689141690141691141692141693141694141695141696141697141698141699141700141701141702141703141704141705141706141707141708141709141710141711141712141713141714141715141716141717141718141719141720141721141722141723141724141725141726141727141728141729141730141731141732141733141734141735141736141737141738141739141740141741141742141743141744141745141746141747141748141749141750141751141752141753141754141755141756141757141758141759141760141761141762141763141764141765141766141767141768141769141770141771141772141773141774141775141776141777141778141779141780141781141782141783141784141785141786141787141788141789141790141791141792141793141794141795141796141797141798141799141800141801141802141803141804141805141806141807141808141809141810141811141812141813141814141815141816141817141818141819141820141821141822141823141824141825141826141827141828141829141830141831141832141833141834141835141836141837141838141839141840141841141842141843141844141845141846141847141848141849141850141851141852141853141854141855141856141857141858141859141860141861141862141863141864141865141866141867141868141869141870141871141872141873141874141875141876141877141878141879141880141881141882141883141884141885141886141887141888141889141890141891141892141893141894141895141896141897141898141899141900141901141902141903141904141905141906141907141908141909141910141911141912141913141914141915141916141917141918141919141920141921141922141923141924141925141926141927141928141929141930141931141932141933141934141935141936141937141938141939141940141941141942141943141944141945141946141947141948141949141950141951141952141953141954141955141956141957141958141959141960141961141962141963141964141965141966141967141968141969141970141971141972141973141974141975141976141977141978141979141980141981141982141983141984141985141986141987141988141989141990141991141992141993141994141995141996141997141998141999142000142001142002142003142004142005142006142007142008142009142010142011142012142013142014142015142016142017142018142019142020142021142022142023142024142025142026142027142028142029142030142031142032142033142034142035142036142037142038142039142040142041142042142043142044142045142046142047142048142049142050142051142052142053142054142055142056142057142058142059142060142061142062142063142064142065142066142067142068142069142070142071142072142073142074142075142076142077142078142079142080142081142082142083142084142085142086142087142088142089142090142091142092142093142094142095142096142097142098142099142100142101142102142103142104142105142106142107142108142109142110142111142112142113142114142115142116142117142118142119142120142121142122142123142124142125142126142127142128142129142130142131142132142133142134142135142136142137142138142139142140142141142142142143142144142145142146142147142148142149142150142151142152142153142154142155142156142157142158142159142160142161142162142163142164142165142166142167142168142169142170142171142172142173142174142175142176142177142178142179142180142181142182142183142184142185142186142187142188142189142190142191142192142193142194142195142196142197142198142199142200142201142202142203142204142205142206142207142208142209142210142211142212142213142214142215142216142217142218142219142220142221142222142223142224142225142226142227142228142229142230142231142232142233142234142235142236142237142238142239142240142241142242142243142244142245142246142247142248142249142250142251142252142253142254142255142256142257142258142259142260142261142262142263142264142265142266142267142268142269142270142271142272142273142274142275142276142277142278142279142280142281142282142283142284142285142286142287142288142289142290142291142292142293142294142295142296142297142298142299142300142301142302142303142304142305142306142307142308142309142310142311142312142313142314142315142316142317142318142319142320142321142322142323142324142325142326142327142328142329142330142331142332142333142334142335142336142337142338142339142340142341142342142343142344142345142346142347142348142349142350142351142352142353142354142355142356142357142358142359142360142361142362142363142364142365142366142367142368142369142370142371142372142373142374142375142376142377142378142379142380142381142382142383142384142385142386142387142388142389142390142391142392142393142394142395142396142397142398142399142400142401142402142403142404142405142406142407142408142409142410142411142412142413142414142415142416142417142418142419142420142421142422142423142424142425142426142427142428142429142430142431142432142433142434142435142436142437142438142439142440142441142442142443142444142445142446142447142448142449142450142451142452142453142454142455142456142457142458142459142460142461142462142463142464142465142466142467142468142469142470142471142472142473142474142475142476142477142478142479142480142481142482142483142484142485142486142487142488142489142490142491142492142493142494142495142496142497142498142499142500142501142502142503142504142505142506142507142508142509142510142511142512142513142514142515142516142517142518142519142520142521142522142523142524142525142526142527142528142529142530142531142532142533142534142535142536142537142538142539142540142541142542142543142544142545142546142547142548142549142550142551142552142553142554142555142556142557142558142559142560142561142562142563142564142565142566142567142568142569142570142571142572142573142574142575142576142577142578142579142580142581142582142583142584142585142586142587142588142589142590142591142592142593142594142595142596142597142598142599142600142601142602142603142604142605142606142607142608142609142610142611142612142613142614142615142616142617142618142619142620142621142622142623142624142625142626142627142628142629142630142631142632142633142634142635142636142637142638142639142640142641142642142643142644142645142646142647142648142649142650142651142652142653142654142655142656142657142658142659142660142661142662142663142664142665142666142667142668142669142670142671142672142673142674142675142676142677142678142679142680142681142682142683142684142685142686142687142688142689142690142691142692142693142694142695142696142697142698142699142700142701142702142703142704142705142706142707142708142709142710142711142712142713142714142715142716142717142718142719142720142721142722142723142724142725142726142727142728142729142730142731142732142733142734142735142736142737142738142739142740142741142742142743142744142745142746142747142748142749142750142751142752142753142754142755142756142757142758142759142760142761142762142763142764142765142766142767142768142769142770142771142772142773142774142775142776142777142778142779142780142781142782142783142784142785142786142787142788142789142790142791142792142793142794142795142796142797142798142799142800142801142802142803142804142805142806142807142808142809142810142811142812142813142814142815142816142817142818142819142820142821142822142823142824142825142826142827142828142829142830142831142832142833142834142835142836142837142838142839142840142841142842142843142844142845142846142847142848142849142850142851142852142853142854142855142856142857142858142859142860142861142862142863142864142865142866142867142868142869142870142871142872142873142874142875142876142877142878142879142880142881142882142883142884142885142886142887142888142889142890142891142892142893142894142895142896142897142898142899142900142901142902142903142904142905142906142907142908142909142910142911142912142913142914142915142916142917142918142919142920142921142922142923142924142925142926142927142928142929142930142931142932142933142934142935142936142937142938142939142940142941142942142943142944142945142946142947142948142949142950142951142952142953142954142955142956142957142958142959142960142961142962142963142964142965142966142967142968142969142970142971142972142973142974142975142976142977142978142979142980142981142982142983142984142985142986142987142988142989142990142991142992142993142994142995142996142997142998142999143000143001143002143003143004143005143006143007143008143009143010143011143012143013143014143015143016143017143018143019143020143021143022143023143024143025143026143027143028143029143030143031143032143033143034143035143036143037143038143039143040143041143042143043143044143045143046143047143048143049143050143051143052143053143054143055143056143057143058143059143060143061143062143063143064143065143066143067143068143069143070143071143072143073143074143075143076143077143078143079143080143081143082143083143084143085143086143087143088143089143090143091143092143093143094143095143096143097143098143099143100143101143102143103143104143105143106143107143108143109143110143111143112143113143114143115143116143117143118143119143120143121143122143123143124143125143126143127143128143129143130143131143132143133143134143135143136143137143138143139143140143141143142143143143144143145143146143147143148143149143150143151143152143153143154143155143156143157143158143159143160143161143162143163143164143165143166143167143168143169143170143171143172143173143174143175143176143177143178143179143180143181143182143183143184143185143186143187143188143189143190143191143192143193143194143195143196143197143198143199143200143201143202143203143204143205143206143207143208143209143210143211143212143213143214143215143216143217143218143219143220143221143222143223143224143225143226143227143228143229143230143231143232143233143234143235143236143237143238143239143240143241143242143243143244143245143246143247143248143249143250143251143252143253143254143255143256143257143258143259143260143261143262143263143264143265143266143267143268143269143270143271143272143273143274143275143276143277143278143279143280143281143282143283143284143285143286143287143288143289143290143291143292143293143294143295143296143297143298143299143300143301143302143303143304143305143306143307143308143309143310143311143312143313143314143315143316143317143318143319143320143321143322143323143324143325143326143327143328143329143330143331143332143333143334143335143336143337143338143339143340143341143342143343143344143345143346143347143348143349143350143351143352143353143354143355143356143357143358143359143360143361143362143363143364143365143366143367143368143369143370143371143372143373143374143375143376143377143378143379143380143381143382143383143384143385143386143387143388143389143390143391143392143393143394143395143396143397143398143399143400143401143402143403143404143405143406143407143408143409143410143411143412143413143414143415143416143417143418143419143420143421143422143423143424143425143426143427143428143429143430143431143432143433143434143435143436143437143438143439143440143441143442143443143444143445143446143447143448143449143450143451143452143453143454143455143456143457143458143459143460143461143462143463143464143465143466143467143468143469143470143471143472143473143474143475143476143477143478143479143480143481143482143483143484143485143486143487143488143489143490143491143492143493143494143495143496143497143498143499143500143501143502143503143504143505143506143507143508143509143510143511143512143513143514143515143516143517143518143519143520143521143522143523143524143525143526143527143528143529143530143531143532143533143534143535143536143537143538143539143540143541143542143543143544143545143546143547143548143549143550143551143552143553143554143555143556143557143558143559143560143561143562143563143564143565143566143567143568143569143570143571143572143573143574143575143576143577143578143579143580143581143582143583143584143585143586143587143588143589143590143591143592143593143594143595143596143597143598143599143600143601143602143603143604143605143606143607143608143609143610143611143612143613143614143615143616143617143618143619143620143621143622143623143624143625143626143627143628143629143630143631143632143633143634143635143636143637143638143639143640143641143642143643143644143645143646143647143648143649143650143651143652143653143654143655143656143657143658143659143660143661143662143663143664143665143666143667143668143669143670143671143672143673143674143675143676143677143678143679143680143681143682143683143684143685143686143687143688143689143690143691143692143693143694143695143696143697143698143699143700143701143702143703143704143705143706143707143708143709143710143711143712143713143714143715143716143717143718143719143720143721143722143723143724143725143726143727143728143729143730143731143732143733143734143735143736143737143738143739143740143741143742143743143744143745143746143747143748143749143750143751143752143753143754143755143756143757143758143759143760143761143762143763143764143765143766143767143768143769143770143771143772143773143774143775143776143777143778143779143780143781143782143783143784143785143786143787143788143789143790143791143792143793143794143795143796143797143798143799143800143801143802143803143804143805143806143807143808143809143810143811143812143813143814143815143816143817143818143819143820143821143822143823143824143825143826143827143828143829143830143831143832143833143834143835143836143837143838143839143840143841143842143843143844143845143846143847143848143849143850143851143852143853143854143855143856143857143858143859143860143861143862143863143864143865143866143867143868143869143870143871143872143873143874143875143876143877143878143879143880143881143882143883143884143885143886143887143888143889143890143891143892143893143894143895143896143897143898143899143900143901143902143903143904143905143906143907143908143909143910143911143912143913143914143915143916143917143918143919143920143921143922143923143924143925143926143927143928143929143930143931143932143933143934143935143936143937143938143939143940143941143942143943143944143945143946143947143948143949143950143951143952143953143954143955143956143957143958143959143960143961143962143963143964143965143966143967143968143969143970143971143972143973143974143975143976143977143978143979143980143981143982143983143984143985143986143987143988143989143990143991143992143993143994143995143996143997143998143999144000144001144002144003144004144005144006144007144008144009144010144011144012144013144014144015144016144017144018144019144020144021144022144023144024144025144026144027144028144029144030144031144032144033144034144035144036144037144038144039144040144041144042144043144044144045144046144047144048144049144050144051144052144053144054144055144056144057144058144059144060144061144062144063144064144065144066144067144068144069144070144071144072144073144074144075144076144077144078144079144080144081144082144083144084144085144086144087144088144089144090144091144092144093144094144095144096144097144098144099144100144101144102144103144104144105144106144107144108144109144110144111144112144113144114144115144116144117144118144119144120144121144122144123144124144125144126144127144128144129144130144131144132144133144134144135144136144137144138144139144140144141144142144143144144144145144146144147144148144149144150144151144152144153144154144155144156144157144158144159144160144161144162144163144164144165144166144167144168144169144170144171144172144173144174144175144176144177144178144179144180144181144182144183144184144185144186144187144188144189144190144191144192144193144194144195144196144197144198144199144200144201144202144203144204144205144206144207144208144209144210144211144212144213144214144215144216144217144218144219144220144221144222144223144224144225144226144227144228144229144230144231144232144233144234144235144236144237144238144239144240144241144242144243144244144245144246144247144248144249144250144251144252144253144254144255144256144257144258144259144260144261144262144263144264144265144266144267144268144269144270144271144272144273144274144275144276144277144278144279144280144281144282144283144284144285144286144287144288144289144290144291144292144293144294144295144296144297144298144299144300144301144302144303144304144305144306144307144308144309144310144311144312144313144314144315144316144317144318144319144320144321144322144323144324144325144326144327144328144329144330144331144332144333144334144335144336144337144338144339144340144341144342144343144344144345144346144347144348144349144350144351144352144353144354144355144356144357144358144359144360144361144362144363144364144365144366144367144368144369144370144371144372144373144374144375144376144377144378144379144380144381144382144383144384144385144386144387144388144389144390144391144392144393144394144395144396144397144398144399144400144401144402144403144404144405144406144407144408144409144410144411144412144413144414144415144416144417144418144419144420144421144422144423144424144425144426144427144428144429144430144431144432144433144434144435144436144437144438144439144440144441144442144443144444144445144446144447144448144449144450144451144452144453144454144455144456144457144458144459144460144461144462144463144464144465144466144467144468144469144470144471144472144473144474144475144476144477144478144479144480144481144482144483144484144485144486144487144488144489144490144491144492144493144494144495144496144497144498144499144500144501144502144503144504144505144506144507144508144509144510144511144512144513144514144515144516144517144518144519144520144521144522144523144524144525144526144527144528144529144530144531144532144533144534144535144536144537144538144539144540144541144542144543144544144545144546144547144548144549144550144551144552144553144554144555144556144557144558144559144560144561144562144563144564144565144566144567144568144569144570144571144572144573144574144575144576144577144578144579144580144581144582144583144584144585144586144587144588144589144590144591144592144593144594144595144596144597144598144599144600144601144602144603144604144605144606144607144608144609144610144611144612144613144614144615144616144617144618144619144620144621144622144623144624144625144626144627144628144629144630144631144632144633144634144635144636144637144638144639144640144641144642144643144644144645144646144647144648144649144650144651144652144653144654144655144656144657144658144659144660144661144662144663144664144665144666144667144668144669144670144671144672144673144674144675144676144677144678144679144680144681144682144683144684144685144686144687144688144689144690144691144692144693144694144695144696144697144698144699144700144701144702144703144704144705144706144707144708144709144710144711144712144713144714144715144716144717144718144719144720144721144722144723144724144725144726144727144728144729144730144731144732144733144734144735144736144737144738144739144740144741144742144743144744144745144746144747144748144749144750144751144752144753144754144755144756144757144758144759144760144761144762144763144764144765144766144767144768144769144770144771144772144773144774144775144776144777144778144779144780144781144782144783144784144785144786144787144788144789144790144791144792144793144794144795144796144797144798144799144800144801144802144803144804144805144806144807144808144809144810144811144812144813144814144815144816144817144818144819144820144821144822144823144824144825144826144827144828144829144830144831144832144833144834144835144836144837144838144839144840144841144842144843144844144845144846144847144848144849144850144851144852144853144854144855144856144857144858144859144860144861144862144863144864144865144866144867144868144869144870144871144872144873144874144875144876144877144878144879144880144881144882144883144884144885144886144887144888144889144890144891144892144893144894144895144896144897144898144899144900144901144902144903144904144905144906144907144908144909144910144911144912144913144914144915144916144917144918144919144920144921144922144923144924144925144926144927144928144929144930144931144932144933144934144935144936144937144938144939144940144941144942144943144944144945144946144947144948144949144950144951144952144953144954144955144956144957144958144959144960144961144962144963144964144965144966144967144968144969144970144971144972144973144974144975144976144977144978144979144980144981144982144983144984144985144986144987144988144989144990144991144992144993144994144995144996144997144998144999145000145001145002145003145004145005145006145007145008145009145010145011145012145013145014145015145016145017145018145019145020145021145022145023145024145025145026145027145028145029145030145031145032145033145034145035145036145037145038145039145040145041145042145043145044145045145046145047145048145049145050145051145052145053145054145055145056145057145058145059145060145061145062145063145064145065145066145067145068145069145070145071145072145073145074145075145076145077145078145079145080145081145082145083145084145085145086145087145088145089145090145091145092145093145094145095145096145097145098145099145100145101145102145103145104145105145106145107145108145109145110145111145112145113145114145115145116145117145118145119145120145121145122145123145124145125145126145127145128145129145130145131145132145133145134145135145136145137145138145139145140145141145142145143145144145145145146145147145148145149145150145151145152145153145154145155145156145157145158145159145160145161145162145163145164145165145166145167145168145169145170145171145172145173145174145175145176145177145178145179145180145181145182145183145184145185145186145187145188145189145190145191145192145193145194145195145196145197145198145199145200145201145202145203145204145205145206145207145208145209145210145211145212145213145214145215145216145217145218145219145220145221145222145223145224145225145226145227145228145229145230145231145232145233145234145235145236145237145238145239145240145241145242145243145244145245145246145247145248145249145250145251145252145253145254145255145256145257145258145259145260145261145262145263145264145265145266145267145268145269145270145271145272145273145274145275145276145277145278145279145280145281145282145283145284145285145286145287145288145289145290145291145292145293145294145295145296145297145298145299145300145301145302145303145304145305145306145307145308145309145310145311145312145313145314145315145316145317145318145319145320145321145322145323145324145325145326145327145328145329145330145331145332145333145334145335145336145337145338145339145340145341145342145343145344145345145346145347145348145349145350145351145352145353145354145355145356145357145358145359145360145361145362145363145364145365145366145367145368145369145370145371145372145373145374145375145376145377145378145379145380145381145382145383145384145385145386145387145388145389145390145391145392145393145394145395145396145397145398145399145400145401145402145403145404145405145406145407145408145409145410145411145412145413145414145415145416145417145418145419145420145421145422145423145424145425145426145427145428145429145430145431145432145433145434145435145436145437145438145439145440145441145442145443145444145445145446145447145448145449145450145451145452145453145454145455145456145457145458145459145460145461145462145463145464145465145466145467145468145469145470145471145472145473145474145475145476145477145478145479145480145481145482145483145484145485145486145487145488145489145490145491145492145493145494145495145496145497145498145499145500145501145502145503145504145505145506145507145508145509145510145511145512145513145514145515145516145517145518145519145520145521145522145523145524145525145526145527145528145529145530145531145532145533145534145535145536145537145538145539145540145541145542145543145544145545145546145547145548145549145550145551145552145553145554145555145556145557145558145559145560145561145562145563145564145565145566145567145568145569145570145571145572145573145574145575145576145577145578145579145580145581145582145583145584145585145586145587145588145589145590145591145592145593145594145595145596145597145598145599145600145601145602145603145604145605145606145607145608145609145610145611145612145613145614145615145616145617145618145619145620145621145622145623145624145625145626145627145628145629145630145631145632145633145634145635145636145637145638145639145640145641145642145643145644145645145646145647145648145649145650145651145652145653145654145655145656145657145658145659145660145661145662145663145664145665145666145667145668145669145670145671145672145673145674145675145676145677145678145679145680145681145682145683145684145685145686145687145688145689145690145691145692145693145694145695145696145697145698145699145700145701145702145703145704145705145706145707145708145709145710145711145712145713145714145715145716145717145718145719145720145721145722145723145724145725145726145727145728145729145730145731145732145733145734145735145736145737145738145739145740145741145742145743145744145745145746145747145748145749145750145751145752145753145754145755145756145757145758145759145760145761145762145763145764145765145766145767145768145769145770145771145772145773145774145775145776145777145778145779145780145781145782145783145784145785145786145787145788145789145790145791145792145793145794145795145796145797145798145799145800145801145802145803145804145805145806145807145808145809145810145811145812145813145814145815145816145817145818145819145820145821145822145823145824145825145826145827145828145829145830145831145832145833145834145835145836145837145838145839145840145841145842145843145844145845145846145847145848145849145850145851145852145853145854145855145856145857145858145859145860145861145862145863145864145865145866145867145868145869145870145871145872145873145874145875145876145877145878145879145880145881145882145883145884145885145886145887145888145889145890145891145892145893145894145895145896145897145898145899145900145901145902145903145904145905145906145907145908145909145910145911145912145913145914145915145916145917145918145919145920145921145922145923145924145925145926145927145928145929145930145931145932145933145934145935145936145937145938145939145940145941145942145943145944145945145946145947145948145949145950145951145952145953145954145955145956145957145958145959145960145961145962145963145964145965145966145967145968145969145970145971145972145973145974145975145976145977145978145979145980145981145982145983145984145985145986145987145988145989145990145991145992145993145994145995145996145997145998145999146000146001146002146003146004146005146006146007146008146009146010146011146012146013146014146015146016146017146018146019146020146021146022146023146024146025146026146027146028146029146030146031146032146033146034146035146036146037146038146039146040146041146042146043146044146045146046146047146048146049146050146051146052146053146054146055146056146057146058146059146060146061146062146063146064146065146066146067146068146069146070146071146072146073146074146075146076146077146078146079146080146081146082146083146084146085146086146087146088146089146090146091146092146093146094146095146096146097146098146099146100146101146102146103146104146105146106146107146108146109146110146111146112146113146114146115146116146117146118146119146120146121146122146123146124146125146126146127146128146129146130146131146132146133146134146135146136146137146138146139146140146141146142146143146144146145146146146147146148146149146150146151146152146153146154146155146156146157146158146159146160146161146162146163146164146165146166146167146168146169146170146171146172146173146174146175146176146177146178146179146180146181146182146183146184146185146186146187146188146189146190146191146192146193146194146195146196146197146198146199146200146201146202146203146204146205146206146207146208146209146210146211146212146213146214146215146216146217146218146219146220146221146222146223146224146225146226146227146228146229146230146231146232146233146234146235146236146237146238146239146240146241146242146243146244146245146246146247146248146249146250146251146252146253146254146255146256146257146258146259146260146261146262146263146264146265146266146267146268146269146270146271146272146273146274146275146276146277146278146279146280146281146282146283146284146285146286146287146288146289146290146291146292146293146294146295146296146297146298146299146300146301146302146303146304146305146306146307146308146309146310146311146312146313146314146315146316146317146318146319146320146321146322146323146324146325146326146327146328146329146330146331146332146333146334146335146336146337146338146339146340146341146342146343146344146345146346146347146348146349146350146351146352146353146354146355146356146357146358146359146360146361146362146363146364146365146366146367146368146369146370146371146372146373146374146375146376146377146378146379146380146381146382146383146384146385146386146387146388146389146390146391146392146393146394146395146396146397146398146399146400146401146402146403146404146405146406146407146408146409146410146411146412146413146414146415146416146417146418146419146420146421146422146423146424146425146426146427146428146429146430146431146432146433146434146435146436146437146438146439146440146441146442146443146444146445146446146447146448146449146450146451146452146453146454146455146456146457146458146459146460146461146462146463146464146465146466146467146468146469146470146471146472146473146474146475146476146477146478146479146480146481146482146483146484146485146486146487146488146489146490146491146492146493146494146495146496146497146498146499146500146501146502146503146504146505146506146507146508146509146510146511146512146513146514146515146516146517146518146519146520146521146522146523146524146525146526146527146528146529146530146531146532146533146534146535146536146537146538146539146540146541146542146543146544146545146546146547146548146549146550146551146552146553146554146555146556146557146558146559146560146561146562146563146564146565146566146567146568146569146570146571146572146573146574146575146576146577146578146579146580146581146582146583146584146585146586146587146588146589146590146591146592146593146594146595146596146597146598146599146600146601146602146603146604146605146606146607146608146609146610146611146612146613146614146615146616146617146618146619146620146621146622146623146624146625146626146627146628146629146630146631146632146633146634146635146636146637146638146639146640146641146642146643146644146645146646146647146648146649146650146651146652146653146654146655146656146657146658146659146660146661146662146663146664146665146666146667146668146669146670146671146672146673146674146675146676146677146678146679146680146681146682146683146684146685146686146687146688146689146690146691146692146693146694146695146696146697146698146699146700146701146702146703146704146705146706146707146708146709146710146711146712146713146714146715146716146717146718146719146720146721146722146723146724146725146726146727146728146729146730146731146732146733146734146735146736146737146738146739146740146741146742146743146744146745146746146747146748146749146750146751146752146753146754146755146756146757146758146759146760146761146762146763146764146765146766146767146768146769146770146771146772146773146774146775146776146777146778146779146780146781146782146783146784146785146786146787146788146789146790146791146792146793146794146795146796146797146798146799146800146801146802146803146804146805146806146807146808146809146810146811146812146813146814146815146816146817146818146819146820146821146822146823146824146825146826146827146828146829146830146831146832146833146834146835146836146837146838146839146840146841146842146843146844146845146846146847146848146849146850146851146852146853146854146855146856146857146858146859146860146861146862146863146864146865146866146867146868146869146870146871146872146873146874146875146876146877146878146879146880146881146882146883146884146885146886146887146888146889146890146891146892146893146894146895146896146897146898146899146900146901146902146903146904146905146906146907146908146909146910146911146912146913146914146915146916146917146918146919146920146921146922146923146924146925146926146927146928146929146930146931146932146933146934146935146936146937146938146939146940146941146942146943146944146945146946146947146948146949146950146951146952146953146954146955146956146957146958146959146960146961146962146963146964146965146966146967146968146969146970146971146972146973146974146975146976146977146978146979146980146981146982146983146984146985146986146987146988146989146990146991146992146993146994146995146996146997146998146999147000147001147002147003147004147005147006147007147008147009147010147011147012147013147014147015147016147017147018147019147020147021147022147023147024147025147026147027147028147029147030147031147032147033147034147035147036147037147038147039147040147041147042147043147044147045147046147047147048147049147050147051147052147053147054147055147056147057147058147059147060147061147062147063147064147065147066147067147068147069147070147071147072147073147074147075147076147077147078147079147080147081147082147083147084147085147086147087147088147089147090147091147092147093147094147095147096147097147098147099147100147101147102147103147104147105147106147107147108147109147110147111147112147113147114147115147116147117147118147119147120147121147122147123147124147125147126147127147128147129147130147131147132147133147134147135147136147137147138147139147140147141147142147143147144147145147146147147147148147149147150147151147152147153147154147155147156147157147158147159147160147161147162147163147164147165147166147167147168147169147170147171147172147173147174147175147176147177147178147179147180147181147182147183147184147185147186147187147188147189147190147191147192147193147194147195147196147197147198147199147200147201147202147203147204147205147206147207147208147209147210147211147212147213147214147215147216147217147218147219147220147221147222147223147224147225147226147227147228147229147230147231147232147233147234147235147236147237147238147239147240147241147242147243147244147245147246147247147248147249147250147251147252147253147254147255147256147257147258147259147260147261147262147263147264147265147266147267147268147269147270147271147272147273147274147275147276147277147278147279147280147281147282147283147284147285147286147287147288147289147290147291147292147293147294147295147296147297147298147299147300147301147302147303147304147305147306147307147308147309147310147311147312147313147314147315147316147317147318147319147320147321147322147323147324147325147326147327147328147329147330147331147332147333147334147335147336147337147338147339147340147341147342147343147344147345147346147347147348147349147350147351147352147353147354147355147356147357147358147359147360147361147362147363147364147365147366147367147368147369147370147371147372147373147374147375147376147377147378147379147380147381147382147383147384147385147386147387147388147389147390147391147392147393147394147395147396147397147398147399147400147401147402147403147404147405147406147407147408147409147410147411147412147413147414147415147416147417147418147419147420147421147422147423147424147425147426147427147428147429147430147431147432147433147434147435147436147437147438147439147440147441147442147443147444147445147446147447147448147449147450147451147452147453147454147455147456147457147458147459147460147461147462147463147464147465147466147467147468147469147470147471147472147473147474147475147476147477147478147479147480147481147482147483147484147485147486147487147488147489147490147491147492147493147494147495147496147497147498147499147500147501147502147503147504147505147506147507147508147509147510147511147512147513147514147515147516147517147518147519147520147521147522147523147524147525147526147527147528147529147530147531147532147533147534147535147536147537147538147539147540147541147542147543147544147545147546147547147548147549147550147551147552147553147554147555147556147557147558147559147560147561147562147563147564147565147566147567147568147569147570147571147572147573147574147575147576147577147578147579147580147581147582147583147584147585147586147587147588147589147590147591147592147593147594147595147596147597147598147599147600147601147602147603147604147605147606147607147608147609147610147611147612147613147614147615147616147617147618147619147620147621147622147623147624147625147626147627147628147629147630147631147632147633147634147635147636147637147638147639147640147641147642147643147644147645147646147647147648147649147650147651147652147653147654147655147656147657147658147659147660147661147662147663147664147665147666147667147668147669147670147671147672147673147674147675147676147677147678147679147680147681147682147683147684147685147686147687147688147689147690147691147692147693147694147695147696147697147698147699147700147701147702147703147704147705147706147707147708147709147710147711147712147713147714147715147716147717147718147719147720147721147722147723147724147725147726147727147728147729147730147731147732147733147734147735147736147737147738147739147740147741147742147743147744147745147746147747147748147749147750147751147752147753147754147755147756147757147758147759147760147761147762147763147764147765147766147767147768147769147770147771147772147773147774147775147776147777147778147779147780147781147782147783147784147785147786147787147788147789147790147791147792147793147794147795147796147797147798147799147800147801147802147803147804147805147806147807147808147809147810147811147812147813147814147815147816147817147818147819147820147821147822147823147824147825147826147827147828147829147830147831147832147833147834147835147836147837147838147839147840147841147842147843147844147845147846147847147848147849147850147851147852147853147854147855147856147857147858147859147860147861147862147863147864147865147866147867147868147869147870147871147872147873147874147875147876147877147878147879147880147881147882147883147884147885147886147887147888147889147890147891147892147893147894147895147896147897147898147899147900147901147902147903147904147905147906147907147908147909147910147911147912147913147914147915147916147917147918147919147920147921147922147923147924147925147926147927147928147929147930147931147932147933147934147935147936147937147938147939147940147941147942147943147944147945147946147947147948147949147950147951147952147953147954147955147956147957147958147959147960147961147962147963147964147965147966147967147968147969147970147971147972147973147974147975147976147977147978147979147980147981147982147983147984147985147986147987147988147989147990147991147992147993147994147995147996147997147998147999148000148001148002148003148004148005148006148007148008148009148010148011148012148013148014148015148016148017148018148019148020148021148022148023148024148025148026148027148028148029148030148031148032148033148034148035148036148037148038148039148040148041148042148043148044148045148046148047148048148049148050148051148052148053148054148055148056148057148058148059148060148061148062148063148064148065148066148067148068148069148070148071148072148073148074148075148076148077148078148079148080148081148082148083148084148085148086148087148088148089148090148091148092148093148094148095148096148097148098148099148100148101148102148103148104148105148106148107148108148109148110148111148112148113148114148115148116148117148118148119148120148121148122148123148124148125148126148127148128148129148130148131148132148133148134148135148136148137148138148139148140148141148142148143148144148145148146148147148148148149148150148151148152148153148154148155148156148157148158148159148160148161148162148163148164148165148166148167148168148169148170148171148172148173148174148175148176148177148178148179148180148181148182148183148184148185148186148187148188148189148190148191148192148193148194148195148196148197148198148199148200148201148202148203148204148205148206148207148208148209148210148211148212148213148214148215148216148217148218148219148220148221148222148223148224148225148226148227148228148229148230148231148232148233148234148235148236148237148238148239148240148241148242148243148244148245148246148247148248148249148250148251148252148253148254148255148256148257148258148259148260148261148262148263148264148265148266148267148268148269148270148271148272148273148274148275148276148277148278148279148280148281148282148283148284148285148286148287148288148289148290148291148292148293148294148295148296148297148298148299148300148301148302148303148304148305148306148307148308148309148310148311148312148313148314148315148316148317148318148319148320148321148322148323148324148325148326148327148328148329148330148331148332148333148334148335148336148337148338148339148340148341148342148343148344148345148346148347148348148349148350148351148352148353148354148355148356148357148358148359148360148361148362148363148364148365148366148367148368148369148370148371148372148373148374148375148376148377148378148379148380148381148382148383148384148385148386148387148388148389148390148391148392148393148394148395148396148397148398148399148400148401148402148403148404148405148406148407148408148409148410148411148412148413148414148415148416148417148418148419148420148421148422148423148424148425148426148427148428148429148430148431148432148433148434148435148436148437148438148439148440148441148442148443148444148445148446148447148448148449148450148451148452148453148454148455148456148457148458148459148460148461148462148463148464148465148466148467148468148469148470148471148472148473148474148475148476148477148478148479148480148481148482148483148484148485148486148487148488148489148490148491148492148493148494148495148496148497148498148499148500148501148502148503148504148505148506148507148508148509148510148511148512148513148514148515148516148517148518148519148520148521148522148523148524148525148526148527148528148529148530148531148532148533148534148535148536148537148538148539148540148541148542148543148544148545148546148547148548148549148550148551148552148553148554148555148556148557148558148559148560148561148562148563148564148565148566148567148568148569148570148571148572148573148574148575148576148577148578148579148580148581148582148583148584148585148586148587148588148589148590148591148592148593148594148595148596148597148598148599148600148601148602148603148604148605148606148607148608148609148610148611148612148613148614148615148616148617148618148619148620148621148622148623148624148625148626148627148628148629148630148631148632148633148634148635148636148637148638148639148640148641148642148643148644148645148646148647148648148649148650148651148652148653148654148655148656148657148658148659148660148661148662148663148664148665148666148667148668148669148670148671148672148673148674148675148676148677148678148679148680148681148682148683148684148685148686148687148688148689148690148691148692148693148694148695148696148697148698148699148700148701148702148703148704148705148706148707148708148709148710148711148712148713148714148715148716148717148718148719148720148721148722148723148724148725148726148727148728148729148730148731148732148733148734148735148736148737148738148739148740148741148742148743148744148745148746148747148748148749148750148751148752148753148754148755148756148757148758148759148760148761148762148763148764148765148766148767148768148769148770148771148772148773148774148775148776148777148778148779148780148781148782148783148784148785148786148787148788148789148790148791148792148793148794148795148796148797148798148799148800148801148802148803148804148805148806148807148808148809148810148811148812148813148814148815148816148817148818148819148820148821148822148823148824148825148826148827148828148829148830148831148832148833148834148835148836148837148838148839148840148841148842148843148844148845148846148847148848148849148850148851148852148853148854148855148856148857148858148859148860148861148862148863148864148865148866148867148868148869148870148871148872148873148874148875148876148877148878148879148880148881148882148883148884148885148886148887148888148889148890148891148892148893148894148895148896148897148898148899148900148901148902148903148904148905148906148907148908148909148910148911148912148913148914148915148916148917148918148919148920148921148922148923148924148925148926148927148928148929148930148931148932148933148934148935148936148937148938148939148940148941148942148943148944148945148946148947148948148949148950148951148952148953148954148955148956148957148958148959148960148961148962148963148964148965148966148967148968148969148970148971148972148973148974148975148976148977148978148979148980148981148982148983148984148985148986148987148988148989148990148991148992148993148994148995148996148997148998148999149000149001149002149003149004149005149006149007149008149009149010149011149012149013149014149015149016149017149018149019149020149021149022149023149024149025149026149027149028149029149030149031149032149033149034149035149036149037149038149039149040149041149042149043149044149045149046149047149048149049149050149051149052149053149054149055149056149057149058149059149060149061149062149063149064149065149066149067149068149069149070149071149072149073149074149075149076149077149078149079149080149081149082149083149084149085149086149087149088149089149090149091149092149093149094149095149096149097149098149099149100149101149102149103149104149105149106149107149108149109149110149111149112149113149114149115149116149117149118149119149120149121149122149123149124149125149126149127149128149129149130149131149132149133149134149135149136149137149138149139149140149141149142149143149144149145149146149147149148149149149150149151149152149153149154149155149156149157149158149159149160149161149162149163149164149165149166149167149168149169149170149171149172149173149174149175149176149177149178149179149180149181149182149183149184149185149186149187149188149189149190149191149192149193149194149195149196149197149198149199149200149201149202149203149204149205149206149207149208149209149210149211149212149213149214149215149216149217149218149219149220149221149222149223149224149225149226149227149228149229149230149231149232149233149234149235149236149237149238149239149240149241149242149243149244149245149246149247149248149249149250149251149252149253149254149255149256149257149258149259149260149261149262149263149264149265149266149267149268149269149270149271149272149273149274149275149276149277149278149279149280149281149282149283149284149285149286149287149288149289149290149291149292149293149294149295149296149297149298149299149300149301149302149303149304149305149306149307149308149309149310149311149312149313149314149315149316149317149318149319149320149321149322149323149324149325149326149327149328149329149330149331149332149333149334149335149336149337149338149339149340149341149342149343149344149345149346149347149348149349149350149351149352149353149354149355149356149357149358149359149360149361149362149363149364149365149366149367149368149369149370149371149372149373149374149375149376149377149378149379149380149381149382149383149384149385149386149387149388149389149390149391149392149393149394149395149396149397149398149399149400149401149402149403149404149405149406149407149408149409149410149411149412149413149414149415149416149417149418149419149420149421149422149423149424149425149426149427149428149429149430149431149432149433149434149435149436149437149438149439149440149441149442149443149444149445149446149447149448149449149450149451149452149453149454149455149456149457149458149459149460149461149462149463149464149465149466149467149468149469149470149471149472149473149474149475149476149477149478149479149480149481149482149483149484149485149486149487149488149489149490149491149492149493149494149495149496149497149498149499149500149501149502149503149504149505149506149507149508149509149510149511149512149513149514149515149516149517149518149519149520149521149522149523149524149525149526149527149528149529149530149531149532149533149534149535149536149537149538149539149540149541149542149543149544149545149546149547149548149549149550149551149552149553149554149555149556149557149558149559149560149561149562149563149564149565149566149567149568149569149570149571149572149573149574149575149576149577149578149579149580149581149582149583149584149585149586149587149588149589149590149591149592149593149594149595149596149597149598149599149600149601149602149603149604149605149606149607149608149609149610149611149612149613149614149615149616149617149618149619149620149621149622149623149624149625149626149627149628149629149630149631149632149633149634149635149636149637149638149639149640149641149642149643149644149645149646149647149648149649149650149651149652149653149654149655149656149657149658149659149660149661149662149663149664149665149666149667149668149669149670149671149672149673149674149675149676149677149678149679149680149681149682149683149684149685149686149687149688149689149690149691149692149693149694149695149696149697149698149699149700149701149702149703149704149705149706149707149708149709149710149711149712149713149714149715149716149717149718149719149720149721149722149723149724149725149726149727149728149729149730149731149732149733149734149735149736149737149738149739149740149741149742149743149744149745149746149747149748149749149750149751149752149753149754149755149756149757149758149759149760149761149762149763149764149765149766149767149768149769149770149771149772149773149774149775149776149777149778149779149780149781149782149783149784149785149786149787149788149789149790149791149792149793149794149795149796149797149798149799149800149801149802149803149804149805149806149807149808149809149810149811149812149813149814149815149816149817149818149819149820149821149822149823149824149825149826149827149828149829149830149831149832149833149834149835149836149837149838149839149840149841149842149843149844149845149846149847149848149849149850149851149852149853149854149855149856149857149858149859149860149861149862149863149864149865149866149867149868149869149870149871149872149873149874149875149876149877149878149879149880149881149882149883149884149885149886149887149888149889149890149891149892149893149894149895149896149897149898149899149900149901149902149903149904149905149906149907149908149909149910149911149912149913149914149915149916149917149918149919149920149921149922149923149924149925149926149927149928149929149930149931149932149933149934149935149936149937149938149939149940149941149942149943149944149945149946149947149948149949149950149951149952149953149954149955149956149957149958149959149960149961149962149963149964149965149966149967149968149969149970149971149972149973149974149975149976149977149978149979149980149981149982149983149984149985149986149987149988149989149990149991149992149993149994149995149996149997149998149999150000150001150002150003150004150005150006150007150008150009150010150011150012150013150014150015150016150017150018150019150020150021150022150023150024150025150026150027150028150029150030150031150032150033150034150035150036150037150038150039150040150041150042150043150044150045150046150047150048150049150050150051150052150053150054150055150056150057150058150059150060150061150062150063150064150065150066150067150068150069150070150071150072150073150074150075150076150077150078150079150080150081150082150083150084150085150086150087150088150089150090150091150092150093150094150095150096150097150098150099150100150101150102150103150104150105150106150107150108150109150110150111150112150113150114150115150116150117150118150119150120150121150122150123150124150125150126150127150128150129150130150131150132150133150134150135150136150137150138150139150140150141150142150143150144150145150146150147150148150149150150150151150152150153150154150155150156150157150158150159150160150161150162150163150164150165150166150167150168150169150170150171150172150173150174150175150176150177150178150179150180150181150182150183150184150185150186150187150188150189150190150191150192150193150194150195150196150197150198150199150200150201150202150203150204150205150206150207150208150209150210150211150212150213150214150215150216150217150218150219150220150221150222150223150224150225150226150227150228150229150230150231150232150233150234150235150236150237150238150239150240150241150242150243150244150245150246150247150248150249150250150251150252150253150254150255150256150257150258150259150260150261150262150263150264150265150266150267150268150269150270150271150272150273150274150275150276150277150278150279150280150281150282150283150284150285150286150287150288150289150290150291150292150293150294150295150296150297150298150299150300150301150302150303150304150305150306150307150308150309150310150311150312150313150314150315150316150317150318150319150320150321150322150323150324150325150326150327150328150329150330150331150332150333150334150335150336150337150338150339150340150341150342150343150344150345150346150347150348150349150350150351150352150353150354150355150356150357150358150359150360150361150362150363150364150365150366150367150368150369150370150371150372150373150374150375150376150377150378150379150380150381150382150383150384150385150386150387150388150389150390150391150392150393150394150395150396150397150398150399150400150401150402150403150404150405150406150407150408150409150410150411150412150413150414150415150416150417150418150419150420150421150422150423150424150425150426150427150428150429150430150431150432150433150434150435150436150437150438150439150440150441150442150443150444150445150446150447150448150449150450150451150452150453150454150455150456150457150458150459150460150461150462150463150464150465150466150467150468150469150470150471150472150473150474150475150476150477150478150479150480150481150482150483150484150485150486150487150488150489150490150491150492150493150494150495150496150497150498150499150500150501150502150503150504150505150506150507150508150509150510150511150512150513150514150515150516150517150518150519150520150521150522150523150524150525150526150527150528150529150530150531150532150533150534150535150536150537150538150539150540150541150542150543150544150545150546150547150548150549150550150551150552150553150554150555150556150557150558150559150560150561150562150563150564150565150566150567150568150569150570150571150572150573150574150575150576150577150578150579150580150581150582150583150584150585150586150587150588150589150590150591150592150593150594150595150596150597150598150599150600150601150602150603150604150605150606150607150608150609150610150611150612150613150614150615150616150617150618150619150620150621150622150623150624150625150626150627150628150629150630150631150632150633150634150635150636150637150638150639150640150641150642150643150644150645150646150647150648150649150650150651150652150653150654150655150656150657150658150659150660150661150662150663150664150665150666150667150668150669150670150671150672150673150674150675150676150677150678150679150680150681150682150683150684150685150686150687150688150689150690150691150692150693150694150695150696150697150698150699150700150701150702150703150704150705150706150707150708150709150710150711150712150713150714150715150716150717150718150719150720150721150722150723150724150725150726150727150728150729150730150731150732150733150734150735150736150737150738150739150740150741150742150743150744150745150746150747150748150749150750150751150752150753150754150755150756150757150758150759150760150761150762150763150764150765150766150767150768150769150770150771150772150773150774150775150776150777150778150779150780150781150782150783150784150785150786150787150788150789150790150791150792150793150794150795150796150797150798150799150800150801150802150803150804150805150806150807150808150809150810150811150812150813150814150815150816150817150818150819150820150821150822150823150824150825150826150827150828150829150830150831150832150833150834150835150836150837150838150839150840150841150842150843150844150845150846150847150848150849150850150851150852150853150854150855150856150857150858150859150860150861150862150863150864150865150866150867150868150869150870150871150872150873150874150875150876150877150878150879150880150881150882150883150884150885150886150887150888150889150890150891150892150893150894150895150896150897150898150899150900150901150902150903150904150905150906150907150908150909150910150911150912150913150914150915150916150917150918150919150920150921150922150923150924150925150926150927150928150929150930150931150932150933150934150935150936150937150938150939150940150941150942150943150944150945150946150947150948150949150950150951150952150953150954150955150956150957150958150959150960150961150962150963150964150965150966150967150968150969150970150971150972150973150974150975150976150977150978150979150980150981150982150983150984150985150986150987150988150989150990150991150992150993150994150995150996150997150998150999151000151001151002151003151004151005151006151007151008151009151010151011151012151013151014151015151016151017151018151019151020151021151022151023151024151025151026151027151028151029151030151031151032151033151034151035151036151037151038151039151040151041151042151043151044151045151046151047151048151049151050151051151052151053151054151055151056151057151058151059151060151061151062151063151064151065151066151067151068151069151070151071151072151073151074151075151076151077151078151079151080151081151082151083151084151085151086151087151088151089151090151091151092151093151094151095151096151097151098151099151100151101151102151103151104151105151106151107151108151109151110151111151112151113151114151115151116151117151118151119151120151121151122151123151124151125151126151127151128151129151130151131151132151133151134151135151136151137151138151139151140151141151142151143151144151145151146151147151148151149151150151151151152151153151154151155151156151157151158151159151160151161151162151163151164151165151166151167151168151169151170151171151172151173151174151175151176151177151178151179151180151181151182151183151184151185151186151187151188151189151190151191151192151193151194151195151196151197151198151199151200151201151202151203151204151205151206151207151208151209151210151211151212151213151214151215151216151217151218151219151220151221151222151223151224151225151226151227151228151229151230151231151232151233151234151235151236151237151238151239151240151241151242151243151244151245151246151247151248151249151250151251151252151253151254151255151256151257151258151259151260151261151262151263151264151265151266151267151268151269151270151271151272151273151274151275151276151277151278151279151280151281151282151283151284151285151286151287151288151289151290151291151292151293151294151295151296151297151298151299151300151301151302151303151304151305151306151307151308151309151310151311151312151313151314151315151316151317151318151319151320151321151322151323151324151325151326151327151328151329151330151331151332151333151334151335151336151337151338151339151340151341151342151343151344151345151346151347151348151349151350151351151352151353151354151355151356151357151358151359151360151361151362151363151364151365151366151367151368151369151370151371151372151373151374151375151376151377151378151379151380151381151382151383151384151385151386151387151388151389151390151391151392151393151394151395151396151397151398151399151400151401151402151403151404151405151406151407151408151409151410151411151412151413151414151415151416151417151418151419151420151421151422151423151424151425151426151427151428151429151430151431151432151433151434151435151436151437151438151439151440151441151442151443151444151445151446151447151448151449151450151451151452151453151454151455151456151457151458151459151460151461151462151463151464151465151466151467151468151469151470151471151472151473151474151475151476151477151478151479151480151481151482151483151484151485151486151487151488151489151490151491151492151493151494151495151496151497151498151499151500151501151502151503151504151505151506151507151508151509151510151511151512151513151514151515151516151517151518151519151520151521151522151523151524151525151526151527151528151529151530151531151532151533151534151535151536151537151538151539151540151541151542151543151544151545151546151547151548151549151550151551151552151553151554151555151556151557151558151559151560151561151562151563151564151565151566151567151568151569151570151571151572151573151574151575151576151577151578151579151580151581151582151583151584151585151586151587151588151589151590151591151592151593151594151595151596151597151598151599151600151601151602151603151604151605151606151607151608151609151610151611151612151613151614151615151616151617151618151619151620151621151622151623151624151625151626151627151628151629151630151631151632151633151634151635151636151637151638151639151640151641151642151643151644151645151646151647151648151649151650151651151652151653151654151655151656151657151658151659151660151661151662151663151664151665151666151667151668151669151670151671151672151673151674151675151676151677151678151679151680151681151682151683151684151685151686151687151688151689151690151691151692151693151694151695151696151697151698151699151700151701151702151703151704151705151706151707151708151709151710151711151712151713151714151715151716151717151718151719151720151721151722151723151724151725151726151727151728151729151730151731151732151733151734151735151736151737151738151739151740151741151742151743151744151745151746151747151748151749151750151751151752151753151754151755151756151757151758151759151760151761151762151763151764151765151766151767151768151769151770151771151772151773151774151775151776151777151778151779151780151781151782151783151784151785151786151787151788151789151790151791151792151793151794151795151796151797151798151799151800151801151802151803151804151805151806151807151808151809151810151811151812151813151814151815151816151817151818151819151820151821151822151823151824151825151826151827151828151829151830151831151832151833151834151835151836151837151838151839151840151841151842151843151844151845151846151847151848151849151850151851151852151853151854151855151856151857151858151859151860151861151862151863151864151865151866151867151868151869151870151871151872151873151874151875151876151877151878151879151880151881151882151883151884151885151886151887151888151889151890151891151892151893151894151895151896151897151898151899151900151901151902151903151904151905151906151907151908151909151910151911151912151913151914151915151916151917151918151919151920151921151922151923151924151925151926151927151928151929151930151931151932151933151934151935151936151937151938151939151940151941151942151943151944151945151946151947151948151949151950151951151952151953151954151955151956151957151958151959151960151961151962151963151964151965151966151967151968151969151970151971151972151973151974151975151976151977151978151979151980151981151982151983151984151985151986151987151988151989151990151991151992151993151994151995151996151997151998151999152000152001152002152003152004152005152006152007152008152009152010152011152012152013152014152015152016152017152018152019152020152021152022152023152024152025152026152027152028152029152030152031152032152033152034152035152036152037152038152039152040152041152042152043152044152045152046152047152048152049152050152051152052152053152054152055152056152057152058152059152060152061152062152063152064152065152066152067152068152069152070152071152072152073152074152075152076152077152078152079152080152081152082152083152084152085152086152087152088152089152090152091152092152093152094152095152096152097152098152099152100152101152102152103152104152105152106152107152108152109152110152111152112152113152114152115152116152117152118152119152120152121152122152123152124152125152126152127152128152129152130152131152132152133152134152135152136152137152138152139152140152141152142152143152144152145152146152147152148152149152150152151152152152153152154152155152156152157152158152159152160152161152162152163152164152165152166152167152168152169152170152171152172152173152174152175152176152177152178152179152180152181152182152183152184152185152186152187152188152189152190152191152192152193152194152195152196152197152198152199152200152201152202152203152204152205152206152207152208152209152210152211152212152213152214152215152216152217152218152219152220152221152222152223152224152225152226152227152228152229152230152231152232152233152234152235152236152237152238152239152240152241152242152243152244152245152246152247152248152249152250152251152252152253152254152255152256152257152258152259152260152261152262152263152264152265152266152267152268152269152270152271152272152273152274152275152276152277152278152279152280152281152282152283152284152285152286152287152288152289152290152291152292152293152294152295152296152297152298152299152300152301152302152303152304152305152306152307152308152309152310152311152312152313152314152315152316152317152318152319152320152321152322152323152324152325152326152327152328152329152330152331152332152333152334152335152336152337152338152339152340152341152342152343152344152345152346152347152348152349152350152351152352152353152354152355152356152357152358152359152360152361152362152363152364152365152366152367152368152369152370152371152372152373152374152375152376152377152378152379152380152381152382152383152384152385152386152387152388152389152390152391152392152393152394152395152396152397152398152399152400152401152402152403152404152405152406152407152408152409152410152411152412152413152414152415152416152417152418152419152420152421152422152423152424152425152426152427152428152429152430152431152432152433152434152435152436152437152438152439152440152441152442152443152444152445152446152447152448152449152450152451152452152453152454152455152456152457152458152459152460152461152462152463152464152465152466152467152468152469152470152471152472152473152474152475152476152477152478152479152480152481152482152483152484152485152486152487152488152489152490152491152492152493152494152495152496152497152498152499152500152501152502152503152504152505152506152507152508152509152510152511152512152513152514152515152516152517152518152519152520152521152522152523152524152525152526152527152528152529152530152531152532152533152534152535152536152537152538152539152540152541152542152543152544152545152546152547152548152549152550152551152552152553152554152555152556152557152558152559152560152561152562152563152564152565152566152567152568152569152570152571152572152573152574152575152576152577152578152579152580152581152582152583152584152585152586152587152588152589152590152591152592152593152594152595152596152597152598152599152600152601152602152603152604152605152606152607152608152609152610152611152612152613152614152615152616152617152618152619152620152621152622152623152624152625152626152627152628152629152630152631152632152633152634152635152636152637152638152639152640152641152642152643152644152645152646152647152648152649152650152651152652152653152654152655152656152657152658152659152660152661152662152663152664152665152666152667152668152669152670152671152672152673152674152675152676152677152678152679152680152681152682152683152684152685152686152687152688152689152690152691152692152693152694152695152696152697152698152699152700152701152702152703152704152705152706152707152708152709152710152711152712152713152714152715152716152717152718152719152720152721152722152723152724152725152726152727152728152729152730152731152732152733152734152735152736152737152738152739152740152741152742152743152744152745152746152747152748152749152750152751152752152753152754152755152756152757152758152759152760152761152762152763152764152765152766152767152768152769152770152771152772152773152774152775152776152777152778152779152780152781152782152783152784152785152786152787152788152789152790152791152792152793152794152795152796152797152798152799152800152801152802152803152804152805152806152807152808152809152810152811152812152813152814152815152816152817152818152819152820152821152822152823152824152825152826152827152828152829152830152831152832152833152834152835152836152837152838152839152840152841152842152843152844152845152846152847152848152849152850152851152852152853152854152855152856152857152858152859152860152861152862152863152864152865152866152867152868152869152870152871152872152873152874152875152876152877152878152879152880152881152882152883152884152885152886152887152888152889152890152891152892152893152894152895152896152897152898152899152900152901152902152903152904152905152906152907152908152909152910152911152912152913152914152915152916152917152918152919152920152921152922152923152924152925152926152927152928152929152930152931152932152933152934152935152936152937152938152939152940152941152942152943152944152945152946152947152948152949152950152951152952152953152954152955152956152957152958152959152960152961152962152963152964152965152966152967152968152969152970152971152972152973152974152975152976152977152978152979152980152981152982152983152984152985152986152987152988152989152990152991152992152993152994152995152996152997152998152999153000153001153002153003153004153005153006153007153008153009153010153011153012153013153014153015153016153017153018153019153020153021153022153023153024153025153026153027153028153029153030153031153032153033153034153035153036153037153038153039153040153041153042153043153044153045153046153047153048153049153050153051153052153053153054153055153056153057153058153059153060153061153062153063153064153065153066153067153068153069153070153071153072153073153074153075153076153077153078153079153080153081153082153083153084153085153086153087153088153089153090153091153092153093153094153095153096153097153098153099153100153101153102153103153104153105153106153107153108153109153110153111153112153113153114153115153116153117153118153119153120153121153122153123153124153125153126153127153128153129153130153131153132153133153134153135153136153137153138153139153140153141153142153143153144153145153146153147153148153149153150153151153152153153153154153155153156153157153158153159153160153161153162153163153164153165153166153167153168153169153170153171153172153173153174153175153176153177153178153179153180153181153182153183153184153185153186153187153188153189153190153191153192153193153194153195153196153197153198153199153200153201153202153203153204153205153206153207153208153209153210153211153212153213153214153215153216153217153218153219153220153221153222153223153224153225153226153227153228153229153230153231153232153233153234153235153236153237153238153239153240153241153242153243153244153245153246153247153248153249153250153251153252153253153254153255153256153257153258153259153260153261153262153263153264153265153266153267153268153269153270153271153272153273153274153275153276153277153278153279153280153281153282153283153284153285153286153287153288153289153290153291153292153293153294153295153296153297153298153299153300153301153302153303153304153305153306153307153308153309153310153311153312153313153314153315153316153317153318153319153320153321153322153323153324153325153326153327153328153329153330153331153332153333153334153335153336153337153338153339153340153341153342153343153344153345153346153347153348153349153350153351153352153353153354153355153356153357153358153359153360153361153362153363153364153365153366153367153368153369153370153371153372153373153374153375153376153377153378153379153380153381153382153383153384153385153386153387153388153389153390153391153392153393153394153395153396153397153398153399153400153401153402153403153404153405153406153407153408153409153410153411153412153413153414153415153416153417153418153419153420153421153422153423153424153425153426153427153428153429153430153431153432153433153434153435153436153437153438153439153440153441153442153443153444153445153446153447153448153449153450153451153452153453153454153455153456153457153458153459153460153461153462153463153464153465153466153467153468153469153470153471153472153473153474153475153476153477153478153479153480153481153482153483153484153485153486153487153488153489153490153491153492153493153494153495153496153497153498153499153500153501153502153503153504153505153506153507153508153509153510153511153512153513153514153515153516153517153518153519153520153521153522153523153524153525153526153527153528153529153530153531153532153533153534153535153536153537153538153539153540153541153542153543153544153545153546153547153548153549153550153551153552153553153554153555153556153557153558153559153560153561153562153563153564153565153566153567153568153569153570153571153572153573153574153575153576153577153578153579153580153581153582153583153584153585153586153587153588153589153590153591153592153593153594153595153596153597153598153599153600153601153602153603153604153605153606153607153608153609153610153611153612153613153614153615153616153617153618153619153620153621153622153623153624153625153626153627153628153629153630153631153632153633153634153635153636153637153638153639153640153641153642153643153644153645153646153647153648153649153650153651153652153653153654153655153656153657153658153659153660153661153662153663153664153665153666153667153668153669153670153671153672153673153674153675153676153677153678153679153680153681153682153683153684153685153686153687153688153689153690153691153692153693153694153695153696153697153698153699153700153701153702153703153704153705153706153707153708153709153710153711153712153713153714153715153716153717153718153719153720153721153722153723153724153725153726153727153728153729153730153731153732153733153734153735153736153737153738153739153740153741153742153743153744153745153746153747153748153749153750153751153752153753153754153755153756153757153758153759153760153761153762153763153764153765153766153767153768153769153770153771153772153773153774153775153776153777153778153779153780153781153782153783153784153785153786153787153788153789153790153791153792153793153794153795153796153797153798153799153800153801153802153803153804153805153806153807153808153809153810153811153812153813153814153815153816153817153818153819153820153821153822153823153824153825153826153827153828153829153830153831153832153833153834153835153836153837153838153839153840153841153842153843153844153845153846153847153848153849153850153851153852153853153854153855153856153857153858153859153860153861153862153863153864153865153866153867153868153869153870153871153872153873153874153875153876153877153878153879153880153881153882153883153884153885153886153887153888153889153890153891153892153893153894153895153896153897153898153899153900153901153902153903153904153905153906153907153908153909153910153911153912153913153914153915153916153917153918153919153920153921153922153923153924153925153926153927153928153929153930153931153932153933153934153935153936153937153938153939153940153941153942153943153944153945153946153947153948153949153950153951153952153953153954153955153956153957153958153959153960153961153962153963153964153965153966153967153968153969153970153971153972153973153974153975153976153977153978153979153980153981153982153983153984153985153986153987153988153989153990153991153992153993153994153995153996153997153998153999154000154001154002154003154004154005154006154007154008154009154010154011154012154013154014154015154016154017154018154019154020154021154022154023154024154025154026154027154028154029154030154031154032154033154034154035154036154037154038154039154040154041154042154043154044154045154046154047154048154049154050154051154052154053154054154055154056154057154058154059154060154061154062154063154064154065154066154067154068154069154070154071154072154073154074154075154076154077154078154079154080154081154082154083154084154085154086154087154088154089154090154091154092154093154094154095154096154097154098154099154100154101154102154103154104154105154106154107154108154109154110154111154112154113154114154115154116154117154118154119154120154121154122154123154124154125154126154127154128154129154130154131154132154133154134154135154136154137154138154139154140154141154142154143154144154145154146154147154148154149154150154151154152154153154154154155154156154157154158154159154160154161154162154163154164154165154166154167154168154169154170154171154172154173154174154175154176154177154178154179154180154181154182154183154184154185154186154187154188154189154190154191154192154193154194154195154196154197154198154199154200154201154202154203154204154205154206154207154208154209154210154211154212154213154214154215154216154217154218154219154220154221154222154223154224154225154226154227154228154229154230154231154232154233154234154235154236154237154238154239154240154241154242154243154244154245154246154247154248154249154250154251154252154253154254154255154256154257154258154259154260154261154262154263154264154265154266154267154268154269154270154271154272154273154274154275154276154277154278154279154280154281154282154283154284154285154286154287154288154289154290154291154292154293154294154295154296154297154298154299154300154301154302154303154304154305154306154307154308154309154310154311154312154313154314154315154316154317154318154319154320154321154322154323154324154325154326154327154328154329154330154331154332154333154334154335154336154337154338154339154340154341154342154343154344154345154346154347154348154349154350154351154352154353154354154355154356154357154358154359154360154361154362154363154364154365154366154367154368154369154370154371154372154373154374154375154376154377154378154379154380154381154382154383154384154385154386154387154388154389154390154391154392154393154394154395154396154397154398154399154400154401154402154403154404154405154406154407154408154409154410154411154412154413154414154415154416154417154418154419154420154421154422154423154424154425154426154427154428154429154430154431154432154433154434154435154436154437154438154439154440154441154442154443154444154445154446154447154448154449154450154451154452154453154454154455154456154457154458154459154460154461154462154463154464154465154466154467154468154469154470154471154472154473154474154475154476154477154478154479154480154481154482154483154484154485154486154487154488154489154490154491154492154493154494154495154496154497154498154499154500154501154502154503154504154505154506154507154508154509154510154511154512154513154514154515154516154517154518154519154520154521154522154523154524154525154526154527154528154529154530154531154532154533154534154535154536154537154538154539154540154541154542154543154544154545154546154547154548154549154550154551154552154553154554154555154556154557154558154559154560154561154562154563154564154565154566154567154568154569154570154571154572154573154574154575154576154577154578154579154580154581154582154583154584154585154586154587154588154589154590154591154592154593154594154595154596154597154598154599154600154601154602154603154604154605154606154607154608154609154610154611154612154613154614154615154616154617154618154619154620154621154622154623154624154625154626154627154628154629154630154631154632154633154634154635154636154637154638154639154640154641154642154643154644154645154646154647154648154649154650154651154652154653154654154655154656154657154658154659154660154661154662154663154664154665154666154667154668154669154670154671154672154673154674154675154676154677154678154679154680154681154682154683154684154685154686154687154688154689154690154691154692154693154694154695154696154697154698154699154700154701154702154703154704154705154706154707154708154709154710154711154712154713154714154715154716154717154718154719154720154721154722154723154724154725154726154727154728154729154730154731154732154733154734154735154736154737154738154739154740154741154742154743154744154745154746154747154748154749154750154751154752154753154754154755154756154757154758154759154760154761154762154763154764154765154766154767154768154769154770154771154772154773154774154775154776154777154778154779154780154781154782154783154784154785154786154787154788154789154790154791154792154793154794154795154796154797154798154799154800154801154802154803154804154805154806154807154808154809154810154811154812154813154814154815154816154817154818154819154820154821154822154823154824154825154826154827154828154829154830154831154832154833154834154835154836154837154838154839154840154841154842154843154844154845154846154847154848154849154850154851154852154853154854154855154856154857154858154859154860154861154862154863154864154865154866154867154868154869154870154871154872154873154874154875154876154877154878154879154880154881154882154883154884154885154886154887154888154889154890154891154892154893154894154895154896154897154898154899154900154901154902154903154904154905154906154907154908154909154910154911154912154913154914154915154916154917154918154919154920154921154922154923154924154925154926154927154928154929154930154931154932154933154934154935154936154937154938154939154940154941154942154943154944154945154946154947154948154949154950154951154952154953154954154955154956154957154958154959154960154961154962154963154964154965154966154967154968154969154970154971154972154973154974154975154976154977154978154979154980154981154982154983154984154985154986154987154988154989154990154991154992154993154994154995154996154997154998154999155000155001155002155003155004155005155006155007155008155009155010155011155012155013155014155015155016155017155018155019155020155021155022155023155024155025155026155027155028155029155030155031155032155033155034155035155036155037155038155039155040155041155042155043155044155045155046155047155048155049155050155051155052155053155054155055155056155057155058155059155060155061155062155063155064155065155066155067155068155069155070155071155072155073155074155075155076155077155078155079155080155081155082155083155084155085155086155087155088155089155090155091155092155093155094155095155096155097155098155099155100155101155102155103155104155105155106155107155108155109155110155111155112155113155114155115155116155117155118155119155120155121155122155123155124155125155126155127155128155129155130155131155132155133155134155135155136155137155138155139155140155141155142155143155144155145155146155147155148155149155150155151155152155153155154155155155156155157155158155159155160155161155162155163155164155165155166155167155168155169155170155171155172155173155174155175155176155177155178155179155180155181155182155183155184155185155186155187155188155189155190155191155192155193155194155195155196155197155198155199155200155201155202155203155204155205155206155207155208155209155210155211155212155213155214155215155216155217155218155219155220155221155222155223155224155225155226155227155228155229155230155231155232155233155234155235155236155237155238155239155240155241155242155243155244155245155246155247155248155249155250155251155252155253155254155255155256155257155258155259155260155261155262155263155264155265155266155267155268155269155270155271155272155273155274155275155276155277155278155279155280155281155282155283155284155285155286155287155288155289155290155291155292155293155294155295155296155297155298155299155300155301155302155303155304155305155306155307155308155309155310155311155312155313155314155315155316155317155318155319155320155321155322155323155324155325155326155327155328155329155330155331155332155333155334155335155336155337155338155339155340155341155342155343155344155345155346155347155348155349155350155351155352155353155354155355155356155357155358155359155360155361155362155363155364155365155366155367155368155369155370155371155372155373155374155375155376155377155378155379155380155381155382155383155384155385155386155387155388155389155390155391155392155393155394155395155396155397155398155399155400155401155402155403155404155405155406155407155408155409155410155411155412155413155414155415155416155417155418155419155420155421155422155423155424155425155426155427155428155429155430155431155432155433155434155435155436155437155438155439155440155441155442155443155444155445155446155447155448155449155450155451155452155453155454155455155456155457155458155459155460155461155462155463155464155465155466155467155468155469155470155471155472155473155474155475155476155477155478155479155480155481155482155483155484155485155486155487155488155489155490155491155492155493155494155495155496155497155498155499155500155501155502155503155504155505155506155507155508155509155510155511155512155513155514155515155516155517155518155519155520155521155522155523155524155525155526155527155528155529155530155531155532155533155534155535155536155537155538155539155540155541155542155543155544155545155546155547155548155549155550155551155552155553155554155555155556155557155558155559155560155561155562155563155564155565155566155567155568155569155570155571155572155573155574155575155576155577155578155579155580155581155582155583155584155585155586155587155588155589155590155591155592155593155594155595155596155597155598155599155600155601155602155603155604155605155606155607155608155609155610155611155612155613155614155615155616155617155618155619155620155621155622155623155624155625155626155627155628155629155630155631155632155633155634155635155636155637155638155639155640155641155642155643155644155645155646155647155648155649155650155651155652155653155654155655155656155657155658155659155660155661155662155663155664155665155666155667155668155669155670155671155672155673155674155675155676155677155678155679155680155681155682155683155684155685155686155687155688155689155690155691155692155693155694155695155696155697155698155699155700155701155702155703155704155705155706155707155708155709155710155711155712155713155714155715155716155717155718155719155720155721155722155723155724155725155726155727155728155729155730155731155732155733155734155735155736155737155738155739155740155741155742155743155744155745155746155747155748155749155750155751155752155753155754155755155756155757155758155759155760155761155762155763155764155765155766155767155768155769155770155771155772155773155774155775155776155777155778155779155780155781155782155783155784155785155786155787155788155789155790155791155792155793155794155795155796155797155798155799155800155801155802155803155804155805155806155807155808155809155810155811155812155813155814155815155816155817155818155819155820155821155822155823155824155825155826155827155828155829155830155831155832155833155834155835155836155837155838155839155840155841155842155843155844155845155846155847155848155849155850155851155852155853155854155855155856155857155858155859155860155861155862155863155864155865155866155867155868155869155870155871155872155873155874155875155876155877155878155879155880155881155882155883155884155885155886155887155888155889155890155891155892155893155894155895155896155897155898155899155900155901155902155903155904155905155906155907155908155909155910155911155912155913155914155915155916155917155918155919155920155921155922155923155924155925155926155927155928155929155930155931155932155933155934155935155936155937155938155939155940155941155942155943155944155945155946155947155948155949155950155951155952155953155954155955155956155957155958155959155960155961155962155963155964155965155966155967155968155969155970155971155972155973155974155975155976155977155978155979155980155981155982155983155984155985155986155987155988155989155990155991155992155993155994155995155996155997155998155999156000156001156002156003156004156005156006156007156008156009156010156011156012156013156014156015156016156017156018156019156020156021156022156023156024156025156026156027156028156029156030156031156032156033156034156035156036156037156038156039156040156041156042156043156044156045156046156047156048156049156050156051156052156053156054156055156056156057156058156059156060156061156062156063156064156065156066156067156068156069156070156071156072156073156074156075156076156077156078156079156080156081156082156083156084156085156086156087156088156089156090156091156092156093156094156095156096156097156098156099156100156101156102156103156104156105156106156107156108156109156110156111156112156113156114156115156116156117156118156119156120156121156122156123156124156125156126156127156128156129156130156131156132156133156134156135156136156137156138156139156140156141156142156143156144156145156146156147156148156149156150156151156152156153156154156155156156156157156158156159156160156161156162156163156164156165156166156167156168156169156170156171156172156173156174156175156176156177156178156179156180156181156182156183156184156185156186156187156188156189156190156191156192156193156194156195156196156197156198156199156200156201156202156203156204156205156206156207156208156209156210156211156212156213156214156215156216156217156218156219156220156221156222156223156224156225156226156227156228156229156230156231156232156233156234156235156236156237156238156239156240156241156242156243156244156245156246156247156248156249156250156251156252156253156254156255156256156257156258156259156260156261156262156263156264156265156266156267156268156269156270156271156272156273156274156275156276156277156278156279156280156281156282156283156284156285156286156287156288156289156290156291156292156293156294156295156296156297156298156299156300156301156302156303156304156305156306156307156308156309156310156311156312156313156314156315156316156317156318156319156320156321156322156323156324156325156326156327156328156329156330156331156332156333156334156335156336156337156338156339156340156341156342156343156344156345156346156347156348156349156350156351156352156353156354156355156356156357156358156359156360156361156362156363156364156365156366156367156368156369156370156371156372156373156374156375156376156377156378156379156380156381156382156383156384156385156386156387156388156389156390156391156392156393156394156395156396156397156398156399156400156401156402156403156404156405156406156407156408156409156410156411156412156413156414156415156416156417156418156419156420156421156422156423156424156425156426156427156428156429156430156431156432156433156434156435156436156437156438156439156440156441156442156443156444156445156446156447156448156449156450156451156452156453156454156455156456156457156458156459156460156461156462156463156464156465156466156467156468156469156470156471156472156473156474156475156476156477156478156479156480156481156482156483156484156485156486156487156488156489156490156491156492156493156494156495156496156497156498156499156500156501156502156503156504156505156506156507156508156509156510156511156512156513156514156515156516156517156518156519156520156521156522156523156524156525156526156527156528156529156530156531156532156533156534156535156536156537156538156539156540156541156542156543156544156545156546156547156548156549156550156551156552156553156554156555156556156557156558156559156560156561156562156563156564156565156566156567156568156569156570156571156572156573156574156575156576156577156578156579156580156581156582156583156584156585156586156587156588156589156590156591156592156593156594156595156596156597156598156599156600156601156602156603156604156605156606156607156608156609156610156611156612156613156614156615156616156617156618156619156620156621156622156623156624156625156626156627156628156629156630156631156632156633156634156635156636156637156638156639156640156641156642156643156644156645156646156647156648156649156650156651156652156653156654156655156656156657156658156659156660156661156662156663156664156665156666156667156668156669156670156671156672156673156674156675156676156677156678156679156680156681156682156683156684156685156686156687156688156689156690156691156692156693156694156695156696156697156698156699156700156701156702156703156704156705156706156707156708156709156710156711156712156713156714156715156716156717156718156719156720156721156722156723156724156725156726156727156728156729156730156731156732156733156734156735156736156737156738156739156740156741156742156743156744156745156746156747156748156749156750156751156752156753156754156755156756156757156758156759156760156761156762156763156764156765156766156767156768156769156770156771156772156773156774156775156776156777156778156779156780156781156782156783156784156785156786156787156788156789156790156791156792156793156794156795156796156797156798156799156800156801156802156803156804156805156806156807156808156809156810156811156812156813156814156815156816156817156818156819156820156821156822156823156824156825156826156827156828156829156830156831156832156833156834156835156836156837156838156839156840156841156842156843156844156845156846156847156848156849156850156851156852156853156854156855156856156857156858156859156860156861156862156863156864156865156866156867156868156869156870156871156872156873156874156875156876156877156878156879156880156881156882156883156884156885156886156887156888156889156890156891156892156893156894156895156896156897156898156899156900156901156902156903156904156905156906156907156908156909156910156911156912156913156914156915156916156917156918156919156920156921156922156923156924156925156926156927156928156929156930156931156932156933156934156935156936156937156938156939156940156941156942156943156944156945156946156947156948156949156950156951156952156953156954156955156956156957156958156959156960156961156962156963156964156965156966156967156968156969156970156971156972156973156974156975156976156977156978156979156980156981156982156983156984156985156986156987156988156989156990156991156992156993156994156995156996156997156998156999157000157001157002157003157004157005157006157007157008157009157010157011157012157013157014157015157016157017157018157019157020157021157022157023157024157025157026157027157028157029157030157031157032157033157034157035157036157037157038157039157040157041157042157043157044157045157046157047157048157049157050157051157052157053157054157055157056157057157058157059157060157061157062157063157064157065157066157067157068157069157070157071157072157073157074157075157076157077157078157079157080157081157082157083157084157085157086157087157088157089157090157091157092157093157094157095157096157097157098157099157100157101157102157103157104157105157106157107157108157109157110157111157112157113157114157115157116157117157118157119157120157121157122157123157124157125157126157127157128157129157130157131157132157133157134157135157136157137157138157139157140157141157142157143157144157145157146157147157148157149157150157151157152157153157154157155157156157157157158157159157160157161157162157163157164157165157166157167157168157169157170157171157172157173157174157175157176157177157178157179157180157181157182157183157184157185157186157187157188157189157190157191157192157193157194157195157196157197157198157199157200157201157202157203157204157205157206157207157208157209157210157211157212157213157214157215157216157217157218157219157220157221157222157223157224157225157226157227157228157229157230157231157232157233157234157235157236157237157238157239157240157241157242157243157244157245157246157247157248157249157250157251157252157253157254157255157256157257157258157259157260157261157262157263157264157265157266157267157268157269157270157271157272157273157274157275157276157277157278157279157280157281157282157283157284157285157286157287157288157289157290157291157292157293157294157295157296157297157298157299157300157301157302157303157304157305157306157307157308157309157310157311157312157313157314157315157316157317157318157319157320157321157322157323157324157325157326157327157328157329157330157331157332157333157334157335157336157337157338157339157340157341157342157343157344157345157346157347157348157349157350157351157352157353157354157355157356157357157358157359157360157361157362157363157364157365157366157367157368157369157370157371157372157373157374157375157376157377157378157379157380157381157382157383157384157385157386157387157388157389157390157391157392157393157394157395157396157397157398157399157400157401157402157403157404157405157406157407157408157409157410157411157412157413157414157415157416157417157418157419157420157421157422157423157424157425157426157427157428157429157430157431157432157433157434157435157436157437157438157439157440157441157442157443157444157445157446157447157448157449157450157451157452157453157454157455157456157457157458157459157460157461157462157463157464157465157466157467157468157469157470157471157472157473157474157475157476157477157478157479157480157481157482157483157484157485157486157487157488157489157490157491157492157493157494157495157496157497157498157499157500157501157502157503157504157505157506157507157508157509157510157511157512157513157514157515157516157517157518157519157520157521157522157523157524157525157526157527157528157529157530157531157532157533157534157535157536157537157538157539157540157541157542157543157544157545157546157547157548157549157550157551157552157553157554157555157556157557157558157559157560157561157562157563157564157565157566157567157568157569157570157571157572157573157574157575157576157577157578157579157580157581157582157583157584157585157586157587157588157589157590157591157592157593157594157595157596157597157598157599157600157601157602157603157604157605157606157607157608157609157610157611157612157613157614157615157616157617157618157619157620157621157622157623157624157625157626157627157628157629157630157631157632157633157634157635157636157637157638157639157640157641157642157643157644157645157646157647157648157649157650157651157652157653157654157655157656157657157658157659157660157661157662157663157664157665157666157667157668157669157670157671157672157673157674157675157676157677157678157679157680157681157682157683157684157685157686157687157688157689157690157691157692157693157694157695157696157697157698157699157700157701157702157703157704157705157706157707157708157709157710157711157712157713157714157715157716157717157718157719157720157721157722157723157724157725157726157727157728157729157730157731157732157733157734157735157736157737157738157739157740157741157742157743157744157745157746157747157748157749157750157751157752157753157754157755157756157757157758157759157760157761157762157763157764157765157766157767157768157769157770157771157772157773157774157775157776157777157778157779157780157781157782157783157784157785157786157787157788157789157790157791157792157793157794157795157796157797157798157799157800157801157802157803157804157805157806157807157808157809157810157811157812157813157814157815157816157817157818157819157820157821157822157823157824157825157826157827157828157829157830157831157832157833157834157835157836157837157838157839157840157841157842157843157844157845157846157847157848157849157850157851157852157853157854157855157856157857157858157859157860157861157862157863157864157865157866157867157868157869157870157871157872157873157874157875157876157877157878157879157880157881157882157883157884157885157886157887157888157889157890157891157892157893157894157895157896157897157898157899157900157901157902157903157904157905157906157907157908157909157910157911157912157913157914157915157916157917157918157919157920157921157922157923157924157925157926157927157928157929157930157931157932157933157934157935157936157937157938157939157940157941157942157943157944157945157946157947157948157949157950157951157952157953157954157955157956157957157958157959157960157961157962157963157964157965157966157967157968157969157970157971157972157973157974157975157976157977157978157979157980157981157982157983157984157985157986157987157988157989157990157991157992157993157994157995157996157997157998157999158000158001158002158003158004158005158006158007158008158009158010158011158012158013158014158015158016158017158018158019158020158021158022158023158024158025158026158027158028158029158030158031158032158033158034158035158036158037158038158039158040158041158042158043158044158045158046158047158048158049158050158051158052158053158054158055158056158057158058158059158060158061158062158063158064158065158066158067158068158069158070158071158072158073158074158075158076158077158078158079158080158081158082158083158084158085158086158087158088158089158090158091158092158093158094158095158096158097158098158099158100158101158102158103158104158105158106158107158108158109158110158111158112158113158114158115158116158117158118158119158120158121158122158123158124158125158126158127158128158129158130158131158132158133158134158135158136158137158138158139158140158141158142158143158144158145158146158147158148158149158150158151158152158153158154158155158156158157158158158159158160158161158162158163158164158165158166158167158168158169158170158171158172158173158174158175158176158177158178158179158180158181158182158183158184158185158186158187158188158189158190158191158192158193158194158195158196158197158198158199158200158201158202158203158204158205158206158207158208158209158210158211158212158213158214158215158216158217158218158219158220158221158222158223158224158225158226158227158228158229158230158231158232158233158234158235158236158237158238158239158240158241158242158243158244158245158246158247158248158249158250158251158252158253158254158255158256158257158258158259158260158261158262158263158264158265158266158267158268158269158270158271158272158273158274158275158276158277158278158279158280158281158282158283158284158285158286158287158288158289158290158291158292158293158294158295158296158297158298158299158300158301158302158303158304158305158306158307158308158309158310158311158312158313158314158315158316158317158318158319158320158321158322158323158324158325158326158327158328158329158330158331158332158333158334158335158336158337158338158339158340158341158342158343158344158345158346158347158348158349158350158351158352158353158354158355158356158357158358158359158360158361158362158363158364158365158366158367158368158369158370158371158372158373158374158375158376158377158378158379158380158381158382158383158384158385158386158387158388158389158390158391158392158393158394158395158396158397158398158399158400158401158402158403158404158405158406158407158408158409158410158411158412158413158414158415158416158417158418158419158420158421158422158423158424158425158426158427158428158429158430158431158432158433158434158435158436158437158438158439158440158441158442158443158444158445158446158447158448158449158450158451158452158453158454158455158456158457158458158459158460158461158462158463158464158465158466158467158468158469158470158471158472158473158474158475158476158477158478158479158480158481158482158483158484158485158486158487158488158489158490158491158492158493158494158495158496158497158498158499158500158501158502158503158504158505158506158507158508158509158510158511158512158513158514158515158516158517158518158519158520158521158522158523158524158525158526158527158528158529158530158531158532158533158534158535158536158537158538158539158540158541158542158543158544158545158546158547158548158549158550158551158552158553158554158555158556158557158558158559158560158561158562158563158564158565158566158567158568158569158570158571158572158573158574158575158576158577158578158579158580158581158582158583158584158585158586158587158588158589158590158591158592158593158594158595158596158597158598158599158600158601158602158603158604158605158606158607158608158609158610158611158612158613158614158615158616158617158618158619158620158621158622158623158624158625158626158627158628158629158630158631158632158633158634158635158636158637158638158639158640158641158642158643158644158645158646158647158648158649158650158651158652158653158654158655158656158657158658158659158660158661158662158663158664158665158666158667158668158669158670158671158672158673158674158675158676158677158678158679158680158681158682158683158684158685158686158687158688158689158690158691158692158693158694158695158696158697158698158699158700158701158702158703158704158705158706158707158708158709158710158711158712158713158714158715158716158717158718158719158720158721158722158723158724158725158726158727158728158729158730158731158732158733158734158735158736158737158738158739158740158741158742158743158744158745158746158747158748158749158750158751158752158753158754158755158756158757158758158759158760158761158762158763158764158765158766158767158768158769158770158771158772158773158774158775158776158777158778158779158780158781158782158783158784158785158786158787158788158789158790158791158792158793158794158795158796158797158798158799158800158801158802158803158804158805158806158807158808158809158810158811158812158813158814158815158816158817158818158819158820158821158822158823158824158825158826158827158828158829158830158831158832158833158834158835158836158837158838158839158840158841158842158843158844158845158846158847158848158849158850158851158852158853158854158855158856158857158858158859158860158861158862158863158864158865158866158867158868158869158870158871158872158873158874158875158876158877158878158879158880158881158882158883158884158885158886158887158888158889158890158891158892158893158894158895158896158897158898158899158900158901158902158903158904158905158906158907158908158909158910158911158912158913158914158915158916158917158918158919158920158921158922158923158924158925158926158927158928158929158930158931158932158933158934158935158936158937158938158939158940158941158942158943158944158945158946158947158948158949158950158951158952158953158954158955158956158957158958158959158960158961158962158963158964158965158966158967158968158969158970158971158972158973158974158975158976158977158978158979158980158981158982158983158984158985158986158987158988158989158990158991158992158993158994158995158996158997158998158999159000159001159002159003159004159005159006159007159008159009159010159011159012159013159014159015159016159017159018159019159020159021159022159023159024159025159026159027159028159029159030159031159032159033159034159035159036159037159038159039159040159041159042159043159044159045159046159047159048159049159050159051159052159053159054159055159056159057159058159059159060159061159062159063159064159065159066159067159068159069159070159071159072159073159074159075159076159077159078159079159080159081159082159083159084159085159086159087159088159089159090159091159092159093159094159095159096159097159098159099159100159101159102159103159104159105159106159107159108159109159110159111159112159113159114159115159116159117159118159119159120159121159122159123159124159125159126159127159128159129159130159131159132159133159134159135159136159137159138159139159140159141159142159143159144159145159146159147159148159149159150159151159152159153159154159155159156159157159158159159159160159161159162159163159164159165159166159167159168159169159170159171159172159173159174159175159176159177159178159179159180159181159182159183159184159185159186159187159188159189159190159191159192159193159194159195159196159197159198159199159200159201159202159203159204159205159206159207159208159209159210159211159212159213159214159215159216159217159218159219159220159221159222159223159224159225159226159227159228159229159230159231159232159233159234159235159236159237159238159239159240159241159242159243159244159245159246159247159248159249159250159251159252159253159254159255159256159257159258159259159260159261159262159263159264159265159266159267159268159269159270159271159272159273159274159275159276159277159278159279159280159281159282159283159284159285159286159287159288159289159290159291159292159293159294159295159296159297159298159299159300159301159302159303159304159305159306159307159308159309159310159311159312159313159314159315159316159317159318159319159320159321159322159323159324159325159326159327159328159329159330159331159332159333159334159335159336159337159338159339159340159341159342159343159344159345159346159347159348159349159350159351159352159353159354159355159356159357159358159359159360159361159362159363159364159365159366159367159368159369159370159371159372159373159374159375159376159377159378159379159380159381159382159383159384159385159386159387159388159389159390159391159392159393159394159395159396159397159398159399159400159401159402159403159404159405159406159407159408159409159410159411159412159413159414159415159416159417159418159419159420159421159422159423159424159425159426159427159428159429159430159431159432159433159434159435159436159437159438159439159440159441159442159443159444159445159446159447159448159449159450159451159452159453159454159455159456159457159458159459159460159461159462159463159464159465159466159467159468159469159470159471159472159473159474159475159476159477159478159479159480159481159482159483159484159485159486159487159488159489159490159491159492159493159494159495159496159497159498159499159500159501159502159503159504159505159506159507159508159509159510159511159512159513159514159515159516159517159518159519159520159521159522159523159524159525159526159527159528159529159530159531159532159533159534159535159536159537159538159539159540159541159542159543159544159545159546159547159548159549159550159551159552159553159554159555159556159557159558159559159560159561159562159563159564159565159566159567159568159569159570159571159572159573159574159575159576159577159578159579159580159581159582159583159584159585159586159587159588159589159590159591159592159593159594159595159596159597159598159599159600159601159602159603159604159605159606159607159608159609159610159611159612159613159614159615159616159617159618159619159620159621159622159623159624159625159626159627159628159629159630159631159632159633159634159635159636159637159638159639159640159641159642159643159644159645159646159647159648159649159650159651159652159653159654159655159656159657159658159659159660159661159662159663159664159665159666159667159668159669159670159671159672159673159674159675159676159677159678159679159680159681159682159683159684159685159686159687159688159689159690159691159692159693159694159695159696159697159698159699159700159701159702159703159704159705159706159707159708159709159710159711159712159713159714159715159716159717159718159719159720159721159722159723159724159725159726159727159728159729159730159731159732159733159734159735159736159737159738159739159740159741159742159743159744159745159746159747159748159749159750159751159752159753159754159755159756159757159758159759159760159761159762159763159764159765159766159767159768159769159770159771159772159773159774159775159776159777159778159779159780159781159782159783159784159785159786159787159788159789159790159791159792159793159794159795159796159797159798159799159800159801159802159803159804159805159806159807159808159809159810159811159812159813159814159815159816159817159818159819159820159821159822159823159824159825159826159827159828159829159830159831159832159833159834159835159836159837159838159839159840159841159842159843159844159845159846159847159848159849159850159851159852159853159854159855159856159857159858159859159860159861159862159863159864159865159866159867159868159869159870159871159872159873159874159875159876159877159878159879159880159881159882159883159884159885159886159887159888159889159890159891159892159893159894159895159896159897159898159899159900159901159902159903159904159905159906159907159908159909159910159911159912159913159914159915159916159917159918159919159920159921159922159923159924159925159926159927159928159929159930159931159932159933159934159935159936159937159938159939159940159941159942159943159944159945159946159947159948159949159950159951159952159953159954159955159956159957159958159959159960159961159962159963159964159965159966159967159968159969159970159971159972159973159974159975159976159977159978159979159980159981159982159983159984159985159986159987159988159989159990159991159992159993159994159995159996159997159998159999160000160001160002160003160004160005160006160007160008160009160010160011160012160013160014160015160016160017160018160019160020160021160022160023160024160025160026160027160028160029160030160031160032160033160034160035160036160037160038160039160040160041160042160043160044160045160046160047160048160049160050160051160052160053160054160055160056160057160058160059160060160061160062160063160064160065160066160067160068160069160070160071160072160073160074160075160076160077160078160079160080160081160082160083160084160085160086160087160088160089160090160091160092160093160094160095160096160097160098160099160100160101160102160103160104160105160106160107160108160109160110160111160112160113160114160115160116160117160118160119160120160121160122160123160124160125160126160127160128160129160130160131160132160133160134160135160136160137160138160139160140160141160142160143160144160145160146160147160148160149160150160151160152160153160154160155160156160157160158160159160160160161160162160163160164160165160166160167160168160169160170160171160172160173160174160175160176160177160178160179160180160181160182160183160184160185160186160187160188160189160190160191160192160193160194160195160196160197160198160199160200160201160202160203160204160205160206160207160208160209160210160211160212160213160214160215160216160217160218160219160220160221160222160223160224160225160226160227160228160229160230160231160232160233160234160235160236160237160238160239160240160241160242160243160244160245160246160247160248160249160250160251160252160253160254160255160256160257160258160259160260160261160262160263160264160265160266160267160268160269160270160271160272160273160274160275160276160277160278160279160280160281160282160283160284160285160286160287160288160289160290160291160292160293160294160295160296160297160298160299160300160301160302160303160304160305160306160307160308160309160310160311160312160313160314160315160316160317160318160319160320160321160322160323160324160325160326160327160328160329160330160331160332160333160334160335160336160337160338160339160340160341160342160343160344160345160346160347160348160349160350160351160352160353160354160355160356160357160358160359160360160361160362160363160364160365160366160367160368160369160370160371160372160373160374160375160376160377160378160379160380160381160382160383160384160385160386160387160388160389160390160391160392160393160394160395160396160397160398160399160400160401160402160403160404160405160406160407160408160409160410160411160412160413160414160415160416160417160418160419160420160421160422160423160424160425160426160427160428160429160430160431160432160433160434160435160436160437160438160439160440160441160442160443160444160445160446160447160448160449160450160451160452160453160454160455160456160457160458160459160460160461160462160463160464160465160466160467160468160469160470160471160472160473160474160475160476160477160478160479160480160481160482160483160484160485160486160487160488160489160490160491160492160493160494160495160496160497160498160499160500160501160502160503160504160505160506160507160508160509160510160511160512160513160514160515160516160517160518160519160520160521160522160523160524160525160526160527160528160529160530160531160532160533160534160535160536160537160538160539160540160541160542160543160544160545160546160547160548160549160550160551160552160553160554160555160556160557160558160559160560160561160562160563160564160565160566160567160568160569160570160571160572160573160574160575160576160577160578160579160580160581160582160583160584160585160586160587160588160589160590160591160592160593160594160595160596160597160598160599160600160601160602160603160604160605160606160607160608160609160610160611160612160613160614160615160616160617160618160619160620160621160622160623160624160625160626160627160628160629160630160631160632160633160634160635160636160637160638160639160640160641160642160643160644160645160646160647160648160649160650160651160652160653160654160655160656160657160658160659160660160661160662160663160664160665160666160667160668160669160670160671160672160673160674160675160676160677160678160679160680160681160682160683160684160685160686160687160688160689160690160691160692160693160694160695160696160697160698160699160700160701160702160703160704160705160706160707160708160709160710160711160712160713160714160715160716160717160718160719160720160721160722160723160724160725160726160727160728160729160730160731160732160733160734160735160736160737160738160739160740160741160742160743160744160745160746160747160748160749160750160751160752160753160754160755160756160757160758160759160760160761160762160763160764160765160766160767160768160769160770160771160772160773160774160775160776160777160778160779160780160781160782160783160784160785160786160787160788160789160790160791160792160793160794160795160796160797160798160799160800160801160802160803160804160805160806160807160808160809160810160811160812160813160814160815160816160817160818160819160820160821160822160823160824160825160826160827160828160829160830160831160832160833160834160835160836160837160838160839160840160841160842160843160844160845160846160847160848160849160850160851160852160853160854160855160856160857160858160859160860160861160862160863160864160865160866160867160868160869160870160871160872160873160874160875160876160877160878160879160880160881160882160883160884160885160886160887160888160889160890160891160892160893160894160895160896160897160898160899160900160901160902160903160904160905160906160907160908160909160910160911160912160913160914160915160916160917160918160919160920160921160922160923160924160925160926160927160928160929160930160931160932160933160934160935160936160937160938160939160940160941160942160943160944160945160946160947160948160949160950160951160952160953160954160955160956160957160958160959160960160961160962160963160964160965160966160967160968160969160970160971160972160973160974160975160976160977160978160979160980160981160982160983160984160985160986160987160988160989160990160991160992160993160994160995160996160997160998160999161000161001161002161003161004161005161006161007161008161009161010161011161012161013161014161015161016161017161018161019161020161021161022161023161024161025161026161027161028161029161030161031161032161033161034161035161036161037161038161039161040161041161042161043161044161045161046161047161048161049161050161051161052161053161054161055161056161057161058161059161060161061161062161063161064161065161066161067161068161069161070161071161072161073161074161075161076161077161078161079161080161081161082161083161084161085161086161087161088161089161090161091161092161093161094161095161096161097161098161099161100161101161102161103161104161105161106161107161108161109161110161111161112161113161114161115161116161117161118161119161120161121161122161123161124161125161126161127161128161129161130161131161132161133161134161135161136161137161138161139161140161141161142161143161144161145161146161147161148161149161150161151161152161153161154161155161156161157161158161159161160161161161162161163161164161165161166161167161168161169161170161171161172161173161174161175161176161177161178161179161180161181161182161183161184161185161186161187161188161189161190161191161192161193161194161195161196161197161198161199161200161201161202161203161204161205161206161207161208161209161210161211161212161213161214161215161216161217161218161219161220161221161222161223161224161225161226161227161228161229161230161231161232161233161234161235161236161237161238161239161240161241161242161243161244161245161246161247161248161249161250161251161252161253161254161255161256161257161258161259161260161261161262161263161264161265161266161267161268161269161270161271161272161273161274161275161276161277161278161279161280161281161282161283161284161285161286161287161288161289161290161291161292161293161294161295161296161297161298161299161300161301161302161303161304161305161306161307161308161309161310161311161312161313161314161315161316161317161318161319161320161321161322161323161324161325161326161327161328161329161330161331161332161333161334161335161336161337161338161339161340161341161342161343161344161345161346161347161348161349161350161351161352161353161354161355161356161357161358161359161360161361161362161363161364161365161366161367161368161369161370161371161372161373161374161375161376161377161378161379161380161381161382161383161384161385161386161387161388161389161390161391161392161393161394161395161396161397161398161399161400161401161402161403161404161405161406161407161408161409161410161411161412161413161414161415161416161417161418161419161420161421161422161423161424161425161426161427161428161429161430161431161432161433161434161435161436161437161438161439161440161441161442161443161444161445161446161447161448161449161450161451161452161453161454161455161456161457161458161459161460161461161462161463161464161465161466161467161468161469161470161471161472161473161474161475161476161477161478161479161480161481161482161483161484161485161486161487161488161489161490161491161492161493161494161495161496161497161498161499161500161501161502161503161504161505161506161507161508161509161510161511161512161513161514161515161516161517161518161519161520161521161522161523161524161525161526161527161528161529161530161531161532161533161534161535161536161537161538161539161540161541161542161543161544161545161546161547161548161549161550161551161552161553161554161555161556161557161558161559161560161561161562161563161564161565161566161567161568161569161570161571161572161573161574161575161576161577161578161579161580161581161582161583161584161585161586161587161588161589161590161591161592161593161594161595161596161597161598161599161600161601161602161603161604161605161606161607161608161609161610161611161612161613161614161615161616161617161618161619161620161621161622161623161624161625161626161627161628161629161630161631161632161633161634161635161636161637161638161639161640161641161642161643161644161645161646161647161648161649161650161651161652161653161654161655161656161657161658161659161660161661161662161663161664161665161666161667161668161669161670161671161672161673161674161675161676161677161678161679161680161681161682161683161684161685161686161687161688161689161690161691161692161693161694161695161696161697161698161699161700161701161702161703161704161705161706161707161708161709161710161711161712161713161714161715161716161717161718161719161720161721161722161723161724161725161726161727161728161729161730161731161732161733161734161735161736161737161738161739161740161741161742161743161744161745161746161747161748161749161750161751161752161753161754161755161756161757161758161759161760161761161762161763161764161765161766161767161768161769161770161771161772161773161774161775161776161777161778161779161780161781161782161783161784161785161786161787161788161789161790161791161792161793161794161795161796161797161798161799161800161801161802161803161804161805161806161807161808161809161810161811161812161813161814161815161816161817161818161819161820161821161822161823161824161825161826161827161828161829161830161831161832161833161834161835161836161837161838161839161840161841161842161843161844161845161846161847161848161849161850161851161852161853161854161855161856161857161858161859161860161861161862161863161864161865161866161867161868161869161870161871161872161873161874161875161876161877161878161879161880161881161882161883161884161885161886161887161888161889161890161891161892161893161894161895161896161897161898161899161900161901161902161903161904161905161906161907161908161909161910161911161912161913161914161915161916161917161918161919161920161921161922161923161924161925161926161927161928161929161930161931161932161933161934161935161936161937161938161939161940161941161942161943161944161945161946161947161948161949161950161951161952161953161954161955161956161957161958161959161960161961161962161963161964161965161966161967161968161969161970161971161972161973161974161975161976161977161978161979161980161981161982161983161984161985161986161987161988161989161990161991161992161993161994161995161996161997161998161999162000162001162002162003162004162005162006162007162008162009162010162011162012162013162014162015162016162017162018162019162020162021162022162023162024162025162026162027162028162029162030162031162032162033162034162035162036162037162038162039162040162041162042162043162044162045162046162047162048162049162050162051162052162053162054162055162056162057162058162059162060162061162062162063162064162065162066162067162068162069162070162071162072162073162074162075162076162077162078162079162080162081162082162083162084162085162086162087162088162089162090162091162092162093162094162095162096162097162098162099162100162101162102162103162104162105162106162107162108162109162110162111162112162113162114162115162116162117162118162119162120162121162122162123162124162125162126162127162128162129162130162131162132162133162134162135162136162137162138162139162140162141162142162143162144162145162146162147162148162149162150162151162152162153162154162155162156162157162158162159162160162161162162162163162164162165162166162167162168162169162170162171162172162173162174162175162176162177162178162179162180162181162182162183162184162185162186162187162188162189162190162191162192162193162194162195162196162197162198162199162200162201162202162203162204162205162206162207162208162209162210162211162212162213162214162215162216162217162218162219162220162221162222162223162224162225162226162227162228162229162230162231162232162233162234162235162236162237162238162239162240162241162242162243162244162245162246162247162248162249162250162251162252162253162254162255162256162257162258162259162260162261162262162263162264162265162266162267162268162269162270162271162272162273162274162275162276162277162278162279162280162281162282162283162284162285162286162287162288162289162290162291162292162293162294162295162296162297162298162299162300162301162302162303162304162305162306162307162308162309162310162311162312162313162314162315162316162317162318162319162320162321162322162323162324162325162326162327162328162329162330162331162332162333162334162335162336162337162338162339162340162341162342162343162344162345162346162347162348162349162350162351162352162353162354162355162356162357162358162359162360162361162362162363162364162365162366162367162368162369162370162371162372162373162374162375162376162377162378162379162380162381162382162383162384162385162386162387162388162389162390162391162392162393162394162395162396162397162398162399162400162401162402162403162404162405162406162407162408162409162410162411162412162413162414162415162416162417162418162419162420162421162422162423162424162425162426162427162428162429162430162431162432162433162434162435162436162437162438162439162440162441162442162443162444162445162446162447162448162449162450162451162452162453162454162455162456162457162458162459162460162461162462162463162464162465162466162467162468162469162470162471162472162473162474162475162476162477162478162479162480162481162482162483162484162485162486162487162488162489162490162491162492162493162494162495162496162497162498162499162500162501162502162503162504162505162506162507162508162509162510162511162512162513162514162515162516162517162518162519162520162521162522162523162524162525162526162527162528162529162530162531162532162533162534162535162536162537162538162539162540162541162542162543162544162545162546162547162548162549162550162551162552162553162554162555162556162557162558162559162560162561162562162563162564162565162566162567162568162569162570162571162572162573162574162575162576162577162578162579162580162581162582162583162584162585162586162587162588162589162590162591162592162593162594162595162596162597162598162599162600162601162602162603162604162605162606162607162608162609162610162611162612162613162614162615162616162617162618162619162620162621162622162623162624162625162626162627162628162629162630162631162632162633162634162635162636162637162638162639162640162641162642162643162644162645162646162647162648162649162650162651162652162653162654162655162656162657162658162659162660162661162662162663162664162665162666162667162668162669162670162671162672162673162674162675162676162677162678162679162680162681162682162683162684162685162686162687162688162689162690162691162692162693162694162695162696162697162698162699162700162701162702162703162704162705162706162707162708162709162710162711162712162713162714162715162716162717162718162719162720162721162722162723162724162725162726162727162728162729162730162731162732162733162734162735162736162737162738162739162740162741162742162743162744162745162746162747162748162749162750162751162752162753162754162755162756162757162758162759162760162761162762162763162764162765162766162767162768162769162770162771162772162773162774162775162776162777162778162779162780162781162782162783162784162785162786162787162788162789162790162791162792162793162794162795162796162797162798162799162800162801162802162803162804162805162806162807162808162809162810162811162812162813162814162815162816162817162818162819162820162821162822162823162824162825162826162827162828162829162830162831162832162833162834162835162836162837162838162839162840162841162842162843162844162845162846162847162848162849162850162851162852162853162854162855162856162857162858162859162860162861162862162863162864162865162866162867162868162869162870162871162872162873162874162875162876162877162878162879162880162881162882162883162884162885162886162887162888162889162890162891162892162893162894162895162896162897162898162899162900162901162902162903162904162905162906162907162908162909162910162911162912162913162914162915162916162917162918162919162920162921162922162923162924162925162926162927162928162929162930162931162932162933162934162935162936162937162938162939162940162941162942162943162944162945162946162947162948162949162950162951162952162953162954162955162956162957162958162959162960162961162962162963162964162965162966162967162968162969162970162971162972162973162974162975162976162977162978162979162980162981162982162983162984162985162986162987162988162989162990162991162992162993162994162995162996162997162998162999163000163001163002163003163004163005163006163007163008163009163010163011163012163013163014163015163016163017163018163019163020163021163022163023163024163025163026163027163028163029163030163031163032163033163034163035163036163037163038163039163040163041163042163043163044163045163046163047163048163049163050163051163052163053163054163055163056163057163058163059163060163061163062163063163064163065163066163067163068163069163070163071163072163073163074163075163076163077163078163079163080163081163082163083163084163085163086163087163088163089163090163091163092163093163094163095163096163097163098163099163100163101163102163103163104163105163106163107163108163109163110163111163112163113163114163115163116163117163118163119163120163121163122163123163124163125163126163127163128163129163130163131163132163133163134163135163136163137163138163139163140163141163142163143163144163145163146163147163148163149163150163151163152163153163154163155163156163157163158163159163160163161163162163163163164163165163166163167163168163169163170163171163172163173163174163175163176163177163178163179163180163181163182163183163184163185163186163187163188163189163190163191163192163193163194163195163196163197163198163199163200163201163202163203163204163205163206163207163208163209163210163211163212163213163214163215163216163217163218163219163220163221163222163223163224163225163226163227163228163229163230163231163232163233163234163235163236163237163238163239163240163241163242163243163244163245163246163247163248163249163250163251163252163253163254163255163256163257163258163259163260163261163262163263163264163265163266163267163268163269163270163271163272163273163274163275163276163277163278163279163280163281163282163283163284163285163286163287163288163289163290163291163292163293163294163295163296163297163298163299163300163301163302163303163304163305163306163307163308163309163310163311163312163313163314163315163316163317163318163319163320163321163322163323163324163325163326163327163328163329163330163331163332163333163334163335163336163337163338163339163340163341163342163343163344163345163346163347163348163349163350163351163352163353163354163355163356163357163358163359163360163361163362163363163364163365163366163367163368163369163370163371163372163373163374163375163376163377163378163379163380163381163382163383163384163385163386163387163388163389163390163391163392163393163394163395163396163397163398163399163400163401163402163403163404163405163406163407163408163409163410163411163412163413163414163415163416163417163418163419163420163421163422163423163424163425163426163427163428163429163430163431163432163433163434163435163436163437163438163439163440163441163442163443163444163445163446163447163448163449163450163451163452163453163454163455163456163457163458163459163460163461163462163463163464163465163466163467163468163469163470163471163472163473163474163475163476163477163478163479163480163481163482163483163484163485163486163487163488163489163490163491163492163493163494163495163496163497163498163499163500163501163502163503163504163505163506163507163508163509163510163511163512163513163514163515163516163517163518163519163520163521163522163523163524163525163526163527163528163529163530163531163532163533163534163535163536163537163538163539163540163541163542163543163544163545163546163547163548163549163550163551163552163553163554163555163556163557163558163559163560163561163562163563163564163565163566163567163568163569163570163571163572163573163574163575163576163577163578163579163580163581163582163583163584163585163586163587163588163589163590163591163592163593163594163595163596163597163598163599163600163601163602163603163604163605163606163607163608163609163610163611163612163613163614163615163616163617163618163619163620163621163622163623163624163625163626163627163628163629163630163631163632163633163634163635163636163637163638163639163640163641163642163643163644163645163646163647163648163649163650163651163652163653163654163655163656163657163658163659163660163661163662163663163664163665163666163667163668163669163670163671163672163673163674163675163676163677163678163679163680163681163682163683163684163685163686163687163688163689163690163691163692163693163694163695163696163697163698163699163700163701163702163703163704163705163706163707163708163709163710163711163712163713163714163715163716163717163718163719163720163721163722163723163724163725163726163727163728163729163730163731163732163733163734163735163736163737163738163739163740163741163742163743163744163745163746163747163748163749163750163751163752163753163754163755163756163757163758163759163760163761163762163763163764163765163766163767163768163769163770163771163772163773163774163775163776163777163778163779163780163781163782163783163784163785163786163787163788163789163790163791163792163793163794163795163796163797163798163799163800163801163802163803163804163805163806163807163808163809163810163811163812163813163814163815163816163817163818163819163820163821163822163823163824163825163826163827163828163829163830163831163832163833163834163835163836163837163838163839163840163841163842163843163844163845163846163847163848163849163850163851163852163853163854163855163856163857163858163859163860163861163862163863163864163865163866163867163868163869163870163871163872163873163874163875163876163877163878163879163880163881163882163883163884163885163886163887163888163889163890163891163892163893163894163895163896163897163898163899163900163901163902163903163904163905163906163907163908163909163910163911163912163913163914163915163916163917163918163919163920163921163922163923163924163925163926163927163928163929163930163931163932163933163934163935163936163937163938163939163940163941163942163943163944163945163946163947163948163949163950163951163952163953163954163955163956163957163958163959163960163961163962163963163964163965163966163967163968163969163970163971163972163973163974163975163976163977163978163979163980163981163982163983163984163985163986163987163988163989163990163991163992163993163994163995163996163997163998163999164000164001164002164003164004164005164006164007164008164009164010164011164012164013164014164015164016164017164018164019164020164021164022164023164024164025164026164027164028164029164030164031164032164033164034164035164036164037164038164039164040164041164042164043164044164045164046164047164048164049164050164051164052164053164054164055164056164057164058164059164060164061164062164063164064164065164066164067164068164069164070164071164072164073164074164075164076164077164078164079164080164081164082164083164084164085164086164087164088164089164090164091164092164093164094164095164096164097164098164099164100164101164102164103164104164105164106164107164108164109164110164111164112164113164114164115164116164117164118164119164120164121164122164123164124164125164126164127164128164129164130164131164132164133164134164135164136164137164138164139164140164141164142164143164144164145164146164147164148164149164150164151164152164153164154164155164156164157164158164159164160164161164162164163164164164165164166164167164168164169164170164171164172164173164174164175164176164177164178164179164180164181164182164183164184164185164186164187164188164189164190164191164192164193164194164195164196164197164198164199164200164201164202164203164204164205164206164207164208164209164210164211164212164213164214164215164216164217164218164219164220164221164222164223164224164225164226164227164228164229164230164231164232164233164234164235164236164237164238164239164240164241164242164243164244164245164246164247164248164249164250164251164252164253164254164255164256164257164258164259164260164261164262164263164264164265164266164267164268164269164270164271164272164273164274164275164276164277164278164279164280164281164282164283164284164285164286164287164288164289164290164291164292164293164294164295164296164297164298164299164300164301164302164303164304164305164306164307164308164309164310164311164312164313164314164315164316164317164318164319164320164321164322164323164324164325164326164327164328164329164330164331164332164333164334164335164336164337164338164339164340164341164342164343164344164345164346164347164348164349164350164351164352164353164354164355164356164357164358164359164360164361164362164363164364164365164366164367164368164369164370164371164372164373164374164375164376164377164378164379164380164381164382164383164384164385164386164387164388164389164390164391164392164393164394164395164396164397164398164399164400164401164402164403164404164405164406164407164408164409164410164411164412164413164414164415164416164417164418164419164420164421164422164423164424164425164426164427164428164429164430164431164432164433164434164435164436164437164438164439164440164441164442164443164444164445164446164447164448164449164450164451164452164453164454164455164456164457164458164459164460164461164462164463164464164465164466164467164468164469164470164471164472164473164474164475164476164477164478164479164480164481164482164483164484164485164486164487164488164489164490164491164492164493164494164495164496164497164498164499164500164501164502164503164504164505164506164507164508164509164510164511164512164513164514164515164516164517164518164519164520164521164522164523164524164525164526164527164528164529164530164531164532164533164534164535164536164537164538164539164540164541164542164543164544164545164546164547164548164549164550164551164552164553164554164555164556164557164558164559164560164561164562164563164564164565164566164567164568164569164570164571164572164573164574164575164576164577164578164579164580164581164582164583164584164585164586164587164588164589164590164591164592164593164594164595164596164597164598164599164600164601164602164603164604164605164606164607164608164609164610164611164612164613164614164615164616164617164618164619164620164621164622164623164624164625164626164627164628164629164630164631164632164633164634164635164636164637164638164639164640164641164642164643164644164645164646164647164648164649164650164651164652164653164654164655164656164657164658164659164660164661164662164663164664164665164666164667164668164669164670164671164672164673164674164675164676164677164678164679164680164681164682164683164684164685164686164687164688164689164690164691164692164693164694164695164696164697164698164699164700164701164702164703164704164705164706164707164708164709164710164711164712164713164714164715164716164717164718164719164720164721164722164723164724164725164726164727164728164729164730164731164732164733164734164735164736164737164738164739164740164741164742164743164744164745164746164747164748164749164750164751164752164753164754164755164756164757164758164759164760164761164762164763164764164765164766164767164768164769164770164771164772164773164774164775164776164777164778164779164780164781164782164783164784164785164786164787164788164789164790164791164792164793164794164795164796164797164798164799164800164801164802164803164804164805164806164807164808164809164810164811164812164813164814164815164816164817164818164819164820164821164822164823164824164825164826164827164828164829164830164831164832164833164834164835164836164837164838164839164840164841164842164843164844164845164846164847164848164849164850164851164852164853164854164855164856164857164858164859164860164861164862164863164864164865164866164867164868164869164870164871164872164873164874164875164876164877164878164879164880164881164882164883164884164885164886164887164888164889164890164891164892164893164894164895164896164897164898164899164900164901164902164903164904164905164906164907164908164909164910164911164912164913164914164915164916164917164918164919164920164921164922164923164924164925164926164927164928164929164930164931164932164933164934164935164936164937164938164939164940164941164942164943164944164945164946164947164948164949164950164951164952164953164954164955164956164957164958164959164960164961164962164963164964164965164966164967164968164969164970164971164972164973164974164975164976164977164978164979164980164981164982164983164984164985164986164987164988164989164990164991164992164993164994164995164996164997164998164999165000165001165002165003165004165005165006165007165008165009165010165011165012165013165014165015165016165017165018165019165020165021165022165023165024165025165026165027165028165029165030165031165032165033165034165035165036165037165038165039165040165041165042165043165044165045165046165047165048165049165050165051165052165053165054165055165056165057165058165059165060165061165062165063165064165065165066165067165068165069165070165071165072165073165074165075165076165077165078165079165080165081165082165083165084165085165086165087165088165089165090165091165092165093165094165095165096165097165098165099165100165101165102165103165104165105165106165107165108165109165110165111165112165113165114165115165116165117165118165119165120165121165122165123165124165125165126165127165128165129165130165131165132165133165134165135165136165137165138165139165140165141165142165143165144165145165146165147165148165149165150165151165152165153165154165155165156165157165158165159165160165161165162165163165164165165165166165167165168165169165170165171165172165173165174165175165176165177165178165179165180165181165182165183165184165185165186165187165188165189165190165191165192165193165194165195165196165197165198165199165200165201165202165203165204165205165206165207165208165209165210165211165212165213165214165215165216165217165218165219165220165221165222165223165224165225165226165227165228165229165230165231165232165233165234165235165236165237165238165239165240165241165242165243165244165245165246165247165248165249165250165251165252165253165254165255165256165257165258165259165260165261165262165263165264165265165266165267165268165269165270165271165272165273165274165275165276165277165278165279165280165281165282165283165284165285165286165287165288165289165290165291165292165293165294165295165296165297165298165299165300165301165302165303165304165305165306165307165308165309165310165311165312165313165314165315165316165317165318165319165320165321165322165323165324165325165326165327165328165329165330165331165332165333165334165335165336165337165338165339165340165341165342165343165344165345165346165347165348165349165350165351165352165353165354165355165356165357165358165359165360165361165362165363165364165365165366165367165368165369165370165371165372165373165374165375165376165377165378165379165380165381165382165383165384165385165386165387165388165389165390165391165392165393165394165395165396165397165398165399165400165401165402165403165404165405165406165407165408165409165410165411165412165413165414165415165416165417165418165419165420165421165422165423165424165425165426165427165428165429165430165431165432165433165434165435165436165437165438165439165440165441165442165443165444165445165446165447165448165449165450165451165452165453165454165455165456165457165458165459165460165461165462165463165464165465165466165467165468165469165470165471165472165473165474165475165476165477165478165479165480165481165482165483165484165485165486165487165488165489165490165491165492165493165494165495165496165497165498165499165500165501165502165503165504165505165506165507165508165509165510165511165512165513165514165515165516165517165518165519165520165521165522165523165524165525165526165527165528165529165530165531165532165533165534165535165536165537165538165539165540165541165542165543165544165545165546165547165548165549165550165551165552165553165554165555165556165557165558165559165560165561165562165563165564165565165566165567165568165569165570165571165572165573165574165575165576165577165578165579165580165581165582165583165584165585165586165587165588165589165590165591165592165593165594165595165596165597165598165599165600165601165602165603165604165605165606165607165608165609165610165611165612165613165614165615165616165617165618165619165620165621165622165623165624165625165626165627165628165629165630165631165632165633165634165635165636165637165638165639165640165641165642165643165644165645165646165647165648165649165650165651165652165653165654165655165656165657165658165659165660165661165662165663165664165665165666165667165668165669165670165671165672165673165674165675165676165677165678165679165680165681165682165683165684165685165686165687165688165689165690165691165692165693165694165695165696165697165698165699165700165701165702165703165704165705165706165707165708165709165710165711165712165713165714165715165716165717165718165719165720165721165722165723165724165725165726165727165728165729165730165731165732165733165734165735165736165737165738165739165740165741165742165743165744165745165746165747165748165749165750165751165752165753165754165755165756165757165758165759165760165761165762165763165764165765165766165767165768165769165770165771165772165773165774165775165776165777165778165779165780165781165782165783165784165785165786165787165788165789165790165791165792165793165794165795165796165797165798165799165800165801165802165803165804165805165806165807165808165809165810165811165812165813165814165815165816165817165818165819165820165821165822165823165824165825165826165827165828165829165830165831165832165833165834165835165836165837165838165839165840165841165842165843165844165845165846165847165848165849165850165851165852165853165854165855165856165857165858165859165860165861165862165863165864165865165866165867165868165869165870165871165872165873165874165875165876165877165878165879165880165881165882165883165884165885165886165887165888165889165890165891165892165893165894165895165896165897165898165899165900165901165902165903165904165905165906165907165908165909165910165911165912165913165914165915165916165917165918165919165920165921165922165923165924165925165926165927165928165929165930165931165932165933165934165935165936165937165938165939165940165941165942165943165944165945165946165947165948165949165950165951165952165953165954165955165956165957165958165959165960165961165962165963165964165965165966165967165968165969165970165971165972165973165974165975165976165977165978165979165980165981165982165983165984165985165986165987165988165989165990165991165992165993165994165995165996165997165998165999166000166001166002166003166004166005166006166007166008166009166010166011166012166013166014166015166016166017166018166019166020166021166022166023166024166025166026166027166028166029166030166031166032166033166034166035166036166037166038166039166040166041166042166043166044166045166046166047166048166049166050166051166052166053166054166055166056166057166058166059166060166061166062166063166064166065166066166067166068166069166070166071166072166073166074166075166076166077166078166079166080166081166082166083166084166085166086166087166088166089166090166091166092166093166094166095166096166097166098166099166100166101166102166103166104166105166106166107166108166109166110166111166112166113166114166115166116166117166118166119166120166121166122166123166124166125166126166127166128166129166130166131166132166133166134166135166136166137166138166139166140166141166142166143166144166145166146166147166148166149166150166151166152166153166154166155166156166157166158166159166160166161166162166163166164166165166166166167166168166169166170166171166172166173166174166175166176166177166178166179166180166181166182166183166184166185166186166187166188166189166190166191166192166193166194166195166196166197166198166199166200166201166202166203166204166205166206166207166208166209166210166211166212166213166214166215166216166217166218166219166220166221166222166223166224166225166226166227166228166229166230166231166232166233166234166235166236166237166238166239166240166241166242166243166244166245166246166247166248166249166250166251166252166253166254166255166256166257166258166259166260166261166262166263166264166265166266166267166268166269166270166271166272166273166274166275166276166277166278166279166280166281166282166283166284166285166286166287166288166289166290166291166292166293166294166295166296166297166298166299166300166301166302166303166304166305166306166307166308166309166310166311166312166313166314166315166316166317166318166319166320166321166322166323166324166325166326166327166328166329166330166331166332166333166334166335166336166337166338166339166340166341166342166343166344166345166346166347166348166349166350166351166352166353166354166355166356166357166358166359166360166361166362166363166364166365166366166367166368166369166370166371166372166373166374166375166376166377166378166379166380166381166382166383166384166385166386166387166388166389166390166391166392166393166394166395166396166397166398166399166400166401166402166403166404166405166406166407166408166409166410166411166412166413166414166415166416166417166418166419166420166421166422166423166424166425166426166427166428166429166430166431166432166433166434166435166436166437166438166439166440166441166442166443166444166445166446166447166448166449166450166451166452166453166454166455166456166457166458166459166460166461166462166463166464166465166466166467166468166469166470166471166472166473166474166475166476166477166478166479166480166481166482166483166484166485166486166487166488166489166490166491166492166493166494166495166496166497166498166499166500166501166502166503166504166505166506166507166508166509166510166511166512166513166514166515166516166517166518166519166520166521166522166523166524166525166526166527166528166529166530166531166532166533166534166535166536166537166538166539166540166541166542166543166544166545166546166547166548166549166550166551166552166553166554166555166556166557166558166559166560166561166562166563166564166565166566166567166568166569166570166571166572166573166574166575166576166577166578166579166580166581166582166583166584166585166586166587166588166589166590166591166592166593166594166595166596166597166598166599166600166601166602166603166604166605166606166607166608166609166610166611166612166613166614166615166616166617166618166619166620166621166622166623166624166625166626166627166628166629166630166631166632166633166634166635166636166637166638166639166640166641166642166643166644166645166646166647166648166649166650166651166652166653166654166655166656166657166658166659166660166661166662166663166664166665166666166667166668166669166670166671166672166673166674166675166676166677166678166679166680166681166682166683166684166685166686166687166688166689166690166691166692166693166694166695166696166697166698166699166700166701166702166703166704166705166706166707166708166709166710166711166712166713166714166715166716166717166718166719166720166721166722166723166724166725166726166727166728166729166730166731166732166733166734166735166736166737166738166739166740166741166742166743166744166745166746166747166748166749166750166751166752166753166754166755166756166757166758166759166760166761166762166763166764166765166766166767166768166769166770166771166772166773166774166775166776166777166778166779166780166781166782166783166784166785166786166787166788166789166790166791166792166793166794166795166796166797166798166799166800166801166802166803166804166805166806166807166808166809166810166811166812166813166814166815166816166817166818166819166820166821166822166823166824166825166826166827166828166829166830166831166832166833166834166835166836166837166838166839166840166841166842166843166844166845166846166847166848166849166850166851166852166853166854166855166856166857166858166859166860166861166862166863166864166865166866166867166868166869166870166871166872166873166874166875166876166877166878166879166880166881166882166883166884166885166886166887166888166889166890166891166892166893166894166895166896166897166898166899166900166901166902166903166904166905166906166907166908166909166910166911166912166913166914166915166916166917166918166919166920166921166922166923166924166925166926166927166928166929166930166931166932166933166934166935166936166937166938166939166940166941166942166943166944166945166946166947166948166949166950166951166952166953166954166955166956166957166958166959166960166961166962166963166964166965166966166967166968166969166970166971166972166973166974166975166976166977166978166979166980166981166982166983166984166985166986166987166988166989166990166991166992166993166994166995166996166997166998166999167000167001167002167003167004167005167006167007167008167009167010167011167012167013167014167015167016167017167018167019167020167021167022167023167024167025167026167027167028167029167030167031167032167033167034167035167036167037167038167039167040167041167042167043167044167045167046167047167048167049167050167051167052167053167054167055167056167057167058167059167060167061167062167063167064167065167066167067167068167069167070167071167072167073167074167075167076167077167078167079167080167081167082167083167084167085167086167087167088167089167090167091167092167093167094167095167096167097167098167099167100167101167102167103167104167105167106167107167108167109167110167111167112167113167114167115167116167117167118167119167120167121167122167123167124167125167126167127167128167129167130167131167132167133167134167135167136167137167138167139167140167141167142167143167144167145167146167147167148167149167150167151167152167153167154167155167156167157167158167159167160167161167162167163167164167165167166167167167168167169167170167171167172167173167174167175167176167177167178167179167180167181167182167183167184167185167186167187167188167189167190167191167192167193167194167195167196167197167198167199167200167201167202167203167204167205167206167207167208167209167210167211167212167213167214167215167216167217167218167219167220167221167222167223167224167225167226167227167228167229167230167231167232167233167234167235167236167237167238167239167240167241167242167243167244167245167246167247167248167249167250167251167252167253167254167255167256167257167258167259167260167261167262167263167264167265167266167267167268167269167270167271167272167273167274167275167276167277167278167279167280167281167282167283167284167285167286167287167288167289167290167291167292167293167294167295167296167297167298167299167300167301167302167303167304167305167306167307167308167309167310167311167312167313167314167315167316167317167318167319167320167321167322167323167324167325167326167327167328167329167330167331167332167333167334167335167336167337167338167339167340167341167342167343167344167345167346167347167348167349167350167351167352167353167354167355167356167357167358167359167360167361167362167363167364167365167366167367167368167369167370167371167372167373167374167375167376167377167378167379167380167381167382167383167384167385167386167387167388167389167390167391167392167393167394167395167396167397167398167399167400167401167402167403167404167405167406167407167408167409167410167411167412167413167414167415167416167417167418167419167420167421167422167423167424167425167426167427167428167429167430167431167432167433167434167435167436167437167438167439167440167441167442167443167444167445167446167447167448167449167450167451167452167453167454167455167456167457167458167459167460167461167462167463167464167465167466167467167468167469167470167471167472167473167474167475167476167477167478167479167480167481167482167483167484167485167486167487167488167489167490167491167492167493167494167495167496167497167498167499167500167501167502167503167504167505167506167507167508167509167510167511167512167513167514167515167516167517167518167519167520167521167522167523167524167525167526167527167528167529167530167531167532167533167534167535167536167537167538167539167540167541167542167543167544167545167546167547167548167549167550167551167552167553167554167555167556167557167558167559167560167561167562167563167564167565167566167567167568167569167570167571167572167573167574167575167576167577167578167579167580167581167582167583167584167585167586167587167588167589167590167591167592167593167594167595167596167597167598167599167600167601167602167603167604167605167606167607167608167609167610167611167612167613167614167615167616167617167618167619167620167621167622167623167624167625167626167627167628167629167630167631167632167633167634167635167636167637167638167639167640167641167642167643167644167645167646167647167648167649167650167651167652167653167654167655167656167657167658167659167660167661167662167663167664167665167666167667167668167669167670167671167672167673167674167675167676167677167678167679167680167681167682167683167684167685167686167687167688167689167690167691167692167693167694167695167696167697167698167699167700167701167702167703167704167705167706167707167708167709167710167711167712167713167714167715167716167717167718167719167720167721167722167723167724167725167726167727167728167729167730167731167732167733167734167735167736167737167738167739167740167741167742167743167744167745167746167747167748167749167750167751167752167753167754167755167756167757167758167759167760167761167762167763167764167765167766167767167768167769167770167771167772167773167774167775167776167777167778167779167780167781167782167783167784167785167786167787167788167789167790167791167792167793167794167795167796167797167798167799167800167801167802167803167804167805167806167807167808167809167810167811167812167813167814167815167816167817167818167819167820167821167822167823167824167825167826167827167828167829167830167831167832167833167834167835167836167837167838167839167840167841167842167843167844167845167846167847167848167849167850167851167852167853167854167855167856167857167858167859167860167861167862167863167864167865167866167867167868167869167870167871167872167873167874167875167876167877167878167879167880167881167882167883167884167885167886167887167888167889167890167891167892167893167894167895167896167897167898167899167900167901167902167903167904167905167906167907167908167909167910167911167912167913167914167915167916167917167918167919167920167921167922167923167924167925167926167927167928167929167930167931167932167933167934167935167936167937167938167939167940167941167942167943167944167945167946167947167948167949167950167951167952167953167954167955167956167957167958167959167960167961167962167963167964167965167966167967167968167969167970167971167972167973167974167975167976167977167978167979167980167981167982167983167984167985167986167987167988167989167990167991167992167993167994167995167996167997167998167999168000168001168002168003168004168005168006168007168008168009168010168011168012168013168014168015168016168017168018168019168020168021168022168023168024168025168026168027168028168029168030168031168032168033168034168035168036168037168038168039168040168041168042168043168044168045168046168047168048168049168050168051168052168053168054168055168056168057168058168059168060168061168062168063168064168065168066168067168068168069168070168071168072168073168074168075168076168077168078168079168080168081168082168083168084168085168086168087168088168089168090168091168092168093168094168095168096168097168098168099168100168101168102168103168104168105168106168107168108168109168110168111168112168113168114168115168116168117168118168119168120168121168122168123168124168125168126168127168128168129168130168131168132168133168134168135168136168137168138168139168140168141168142168143168144168145168146168147168148168149168150168151168152168153168154168155168156168157168158168159168160168161168162168163168164168165168166168167168168168169168170168171168172168173168174168175168176168177168178168179168180168181168182168183168184168185168186168187168188168189168190168191168192168193168194168195168196168197168198168199168200168201168202168203168204168205168206168207168208168209168210168211168212168213168214168215168216168217168218168219168220168221168222168223168224168225168226168227168228168229168230168231168232168233168234168235168236168237168238168239168240168241168242168243168244168245168246168247168248168249168250168251168252168253168254168255168256168257168258168259168260168261168262168263168264168265168266168267168268168269168270168271168272168273168274168275168276168277168278168279168280168281168282168283168284168285168286168287168288168289168290168291168292168293168294168295168296168297168298168299168300168301168302168303168304168305168306168307168308168309168310168311168312168313168314168315168316168317168318168319168320168321168322168323168324168325168326168327168328168329168330168331168332168333168334168335168336168337168338168339168340168341168342168343168344168345168346168347168348168349168350168351168352168353168354168355168356168357168358168359168360168361168362168363168364168365168366168367168368168369168370168371168372168373168374168375168376168377168378168379168380168381168382168383168384168385168386168387168388168389168390168391168392168393168394168395168396168397168398168399168400168401168402168403168404168405168406168407168408168409168410168411168412168413168414168415168416168417168418168419168420168421168422168423168424168425168426168427168428168429168430168431168432168433168434168435168436168437168438168439168440168441168442168443168444168445168446168447168448168449168450168451168452168453168454168455168456168457168458168459168460168461168462168463168464168465168466168467168468168469168470168471168472168473168474168475168476168477168478168479168480168481168482168483168484168485168486168487168488168489168490168491168492168493168494168495168496168497168498168499168500168501168502168503168504168505168506168507168508168509168510168511168512168513168514168515168516168517168518168519168520168521168522168523168524168525168526168527168528168529168530168531168532168533168534168535168536168537168538168539168540168541168542168543168544168545168546168547168548168549168550168551168552168553168554168555168556168557168558168559168560168561168562168563168564168565168566168567168568168569168570168571168572168573168574168575168576168577168578168579168580168581168582168583168584168585168586168587168588168589168590168591168592168593168594168595168596168597168598168599168600168601168602168603168604168605168606168607168608168609168610168611168612168613168614168615168616168617168618168619168620168621168622168623168624168625168626168627168628168629168630168631168632168633168634168635168636168637168638168639168640168641168642168643168644168645168646168647168648168649168650168651168652168653168654168655168656168657168658168659168660168661168662168663168664168665168666168667168668168669168670168671168672168673168674168675168676168677168678168679168680168681168682168683168684168685168686168687168688168689168690168691168692168693168694168695168696168697168698168699168700168701168702168703168704168705168706168707168708168709168710168711168712168713168714168715168716168717168718168719168720168721168722168723168724168725168726168727168728168729168730168731168732168733168734168735168736168737168738168739168740168741168742168743168744168745168746168747168748168749168750168751168752168753168754168755168756168757168758168759168760168761168762168763168764168765168766168767168768168769168770168771168772168773168774168775168776168777168778168779168780168781168782168783168784168785168786168787168788168789168790168791168792168793168794168795168796168797168798168799168800168801168802168803168804168805168806168807168808168809168810168811168812168813168814168815168816168817168818168819168820168821168822168823168824168825168826168827168828168829168830168831168832168833168834168835168836168837168838168839168840168841168842168843168844168845168846168847168848168849168850168851168852168853168854168855168856168857168858168859168860168861168862168863168864168865168866168867168868168869168870168871168872168873168874168875168876168877168878168879168880168881168882168883168884168885168886168887168888168889168890168891168892168893168894168895168896168897168898168899168900168901168902168903168904168905168906168907168908168909168910168911168912168913168914168915168916168917168918168919168920168921168922168923168924168925168926168927168928168929168930168931168932168933168934168935168936168937168938168939168940168941168942168943168944168945168946168947168948168949168950168951168952168953168954168955168956168957168958168959168960168961168962168963168964168965168966168967168968168969168970168971168972168973168974168975168976168977168978168979168980168981168982168983168984168985168986168987168988168989168990168991168992168993168994168995168996168997168998168999169000169001169002169003169004169005169006169007169008169009169010169011169012169013169014169015169016169017169018169019169020169021169022169023169024169025169026169027169028169029169030169031169032169033169034169035169036169037169038169039169040169041169042169043169044169045169046169047169048169049169050169051169052169053169054169055169056169057169058169059169060169061169062169063169064169065169066169067169068169069169070169071169072169073169074169075169076169077169078169079169080169081169082169083169084169085169086169087169088169089169090169091169092169093169094169095169096169097169098169099169100169101169102169103169104169105169106169107169108169109169110169111169112169113169114169115169116169117169118169119169120169121169122169123169124169125169126169127169128169129169130169131169132169133169134169135169136169137169138169139169140169141169142169143169144169145169146169147169148169149169150169151169152169153169154169155169156169157169158169159169160169161169162169163169164169165169166169167169168169169169170169171169172169173169174169175169176169177169178169179169180169181169182169183169184169185169186169187169188169189169190169191169192169193169194169195169196169197169198169199169200169201169202169203169204169205169206169207169208169209169210169211169212169213169214169215169216169217169218169219169220169221169222169223169224169225169226169227169228169229169230169231169232169233169234169235169236169237169238169239169240169241169242169243169244169245169246169247169248169249169250169251169252169253169254169255169256169257169258169259169260169261169262169263169264169265169266169267169268169269169270169271169272169273169274169275169276169277169278169279169280169281169282169283169284169285169286169287169288169289169290169291169292169293169294169295169296169297169298169299169300169301169302169303169304169305169306169307169308169309169310169311169312169313169314169315169316169317169318169319169320169321169322169323169324169325169326169327169328169329169330169331169332169333169334169335169336169337169338169339169340169341169342169343169344169345169346169347169348169349169350169351169352169353169354169355169356169357169358169359169360169361169362169363169364169365169366169367169368169369169370169371169372169373169374169375169376169377169378169379169380169381169382169383169384169385169386169387169388169389169390169391169392169393169394169395169396169397169398169399169400169401169402169403169404169405169406169407169408169409169410169411169412169413169414169415169416169417169418169419169420169421169422169423169424169425169426169427169428169429169430169431169432169433169434169435169436169437169438169439169440169441169442169443169444169445169446169447169448169449169450169451169452169453169454169455169456169457169458169459169460169461169462169463169464169465169466169467169468169469169470169471169472169473169474169475169476169477169478169479169480169481169482169483169484169485169486169487169488169489169490169491169492169493169494169495169496169497169498169499169500169501169502169503169504169505169506169507169508169509169510169511169512169513169514169515169516169517169518169519169520169521169522169523169524169525169526169527169528169529169530169531169532169533169534169535169536169537169538169539169540169541169542169543169544169545169546169547169548169549169550169551169552169553169554169555169556169557169558169559169560169561169562169563169564169565169566169567169568169569169570169571169572169573169574169575169576169577169578169579169580169581169582169583169584169585169586169587169588169589169590169591169592169593169594169595169596169597169598169599169600169601169602169603169604169605169606169607169608169609169610169611169612169613169614169615169616169617169618169619169620169621169622169623169624169625169626169627169628169629169630169631169632169633169634169635169636169637169638169639169640169641169642169643169644169645169646169647169648169649169650169651169652169653169654169655169656169657169658169659169660169661169662169663169664169665169666169667169668169669169670169671169672169673169674169675169676169677169678169679169680169681169682169683169684169685169686169687169688169689169690169691169692169693169694169695169696169697169698169699169700169701169702169703169704169705169706169707169708169709169710169711169712169713169714169715169716169717169718169719169720169721169722169723169724169725169726169727169728169729169730169731169732169733169734169735169736169737169738169739169740169741169742169743169744169745169746169747169748169749169750169751169752169753169754169755169756169757169758169759169760169761169762169763169764169765169766169767169768169769169770169771169772169773169774169775169776169777169778169779169780169781169782169783169784169785169786169787169788169789169790169791169792169793169794169795169796169797169798169799169800169801169802169803169804169805169806169807169808169809169810169811169812169813169814169815169816169817169818169819169820169821169822169823169824169825169826169827169828169829169830169831169832169833169834169835169836169837169838169839169840169841169842169843169844169845169846169847169848169849169850169851169852169853169854169855169856169857169858169859169860169861169862169863169864169865169866169867169868169869169870169871169872169873169874169875169876169877169878169879169880169881169882169883169884169885169886169887169888169889169890169891169892169893169894169895169896169897169898169899169900169901169902169903169904169905169906169907169908169909169910169911169912169913169914169915169916169917169918169919169920169921169922169923169924169925169926169927169928169929169930169931169932169933169934169935169936169937169938169939169940169941169942169943169944169945169946169947169948169949169950169951169952169953169954169955169956169957169958169959169960169961169962169963169964169965169966169967169968169969169970169971169972169973169974169975169976169977169978169979169980169981169982169983169984169985169986169987169988169989169990169991169992169993169994169995169996169997169998169999170000170001170002170003170004170005170006170007170008170009170010170011170012170013170014170015170016170017170018170019170020170021170022170023170024170025170026170027170028170029170030170031170032170033170034170035170036170037170038170039170040170041170042170043170044170045170046170047170048170049170050170051170052170053170054170055170056170057170058170059170060170061170062170063170064170065170066170067170068170069170070170071170072170073170074170075170076170077170078170079170080170081170082170083170084170085170086170087170088170089170090170091170092170093170094170095170096170097170098170099170100170101170102170103170104170105170106170107170108170109170110170111170112170113170114170115170116170117170118170119170120170121170122170123170124170125170126170127170128170129170130170131170132170133170134170135170136170137170138170139170140170141170142170143170144170145170146170147170148170149170150170151170152170153170154170155170156170157170158170159170160170161170162170163170164170165170166170167170168170169170170170171170172170173170174170175170176170177170178170179170180170181170182170183170184170185170186170187170188170189170190170191170192170193170194170195170196170197170198170199170200170201170202170203170204170205170206170207170208170209170210170211170212170213170214170215170216170217170218170219170220170221170222170223170224170225170226170227170228170229170230170231170232170233170234170235170236170237170238170239170240170241170242170243170244170245170246170247170248170249170250170251170252170253170254170255170256170257170258170259170260170261170262170263170264170265170266170267170268170269170270170271170272170273170274170275170276170277170278170279170280170281170282170283170284170285170286170287170288170289170290170291170292170293170294170295170296170297170298170299170300170301170302170303170304170305170306170307170308170309170310170311170312170313170314170315170316170317170318170319170320170321170322170323170324170325170326170327170328170329170330170331170332170333170334170335170336170337170338170339170340170341170342170343170344170345170346170347170348170349170350170351170352170353170354170355170356170357170358170359170360170361170362170363170364170365170366170367170368170369170370170371170372170373170374170375170376170377170378170379170380170381170382170383170384170385170386170387170388170389170390170391170392170393170394170395170396170397170398170399170400170401170402170403170404170405170406170407170408170409170410170411170412170413170414170415170416170417170418170419170420170421170422170423170424170425170426170427170428170429170430170431170432170433170434170435170436170437170438170439170440170441170442170443170444170445170446170447170448170449170450170451170452170453170454170455170456170457170458170459170460170461170462170463170464170465170466170467170468170469170470170471170472170473170474170475170476170477170478170479170480170481170482170483170484170485170486170487170488170489170490170491170492170493170494170495170496170497170498170499170500170501170502170503170504170505170506170507170508170509170510170511170512170513170514170515170516170517170518170519170520170521170522170523170524170525170526170527170528170529170530170531170532170533170534170535170536170537170538170539170540170541170542170543170544170545170546170547170548170549170550170551170552170553170554170555170556170557170558170559170560170561170562170563170564170565170566170567170568170569170570170571170572170573170574170575170576170577170578170579170580170581170582170583170584170585170586170587170588170589170590170591170592170593170594170595170596170597170598170599170600170601170602170603170604170605170606170607170608170609170610170611170612170613170614170615170616170617170618170619170620170621170622170623170624170625170626170627170628170629170630170631170632170633170634170635170636170637170638170639170640170641170642170643170644170645170646170647170648170649170650170651170652170653170654170655170656170657170658170659170660170661170662170663170664170665170666170667170668170669170670170671170672170673170674170675170676170677170678170679170680170681170682170683170684170685170686170687170688170689170690170691170692170693170694170695170696170697170698170699170700170701170702170703170704170705170706170707170708170709170710170711170712170713170714170715170716170717170718170719170720170721170722170723170724170725170726170727170728170729170730170731170732170733170734170735170736170737170738170739170740170741170742170743170744170745170746170747170748170749170750170751170752170753170754170755170756170757170758170759170760170761170762170763170764170765170766170767170768170769170770170771170772170773170774170775170776170777170778170779170780170781170782170783170784170785170786170787170788170789170790170791170792170793170794170795170796170797170798170799170800170801170802170803170804170805170806170807170808170809170810170811170812170813170814170815170816170817170818170819170820170821170822170823170824170825170826170827170828170829170830170831170832170833170834170835170836170837170838170839170840170841170842170843170844170845170846170847170848170849170850170851170852170853170854170855170856170857170858170859170860170861170862170863170864170865170866170867170868170869170870170871170872170873170874170875170876170877170878170879170880170881170882170883170884170885170886170887170888170889170890170891170892170893170894170895170896170897170898170899170900170901170902170903170904170905170906170907170908170909170910170911170912170913170914170915170916170917170918170919170920170921170922170923170924170925170926170927170928170929170930170931170932170933170934170935170936170937170938170939170940170941170942170943170944170945170946170947170948170949170950170951170952170953170954170955170956170957170958170959170960170961170962170963170964170965170966170967170968170969170970170971170972170973170974170975170976170977170978170979170980170981170982170983170984170985170986170987170988170989170990170991170992170993170994170995170996170997170998170999171000171001171002171003171004171005171006171007171008171009171010171011171012171013171014171015171016171017171018171019171020171021171022171023171024171025171026171027171028171029171030171031171032171033171034171035171036171037171038171039171040171041171042171043171044171045171046171047171048171049171050171051171052171053171054171055171056171057171058171059171060171061171062171063171064171065171066171067171068171069171070171071171072171073171074171075171076171077171078171079171080171081171082171083171084171085171086171087171088171089171090171091171092171093171094171095171096171097171098171099171100171101171102171103171104171105171106171107171108171109171110171111171112171113171114171115171116171117171118171119171120171121171122171123171124171125171126171127171128171129171130171131171132171133171134171135171136171137171138171139171140171141171142171143171144171145171146171147171148171149171150171151171152171153171154171155171156171157171158171159171160171161171162171163171164171165171166171167171168171169171170171171171172171173171174171175171176171177171178171179171180171181171182171183171184171185171186171187171188171189171190171191171192171193171194171195171196171197171198171199171200171201171202171203171204171205171206171207171208171209171210171211171212171213171214171215171216171217171218171219171220171221171222171223171224171225171226171227171228171229171230171231171232171233171234171235171236171237171238171239171240171241171242171243171244171245171246171247171248171249171250171251171252171253171254171255171256171257171258171259171260171261171262171263171264171265171266171267171268171269171270171271171272171273171274171275171276171277171278171279171280171281171282171283171284171285171286171287171288171289171290171291171292171293171294171295171296171297171298171299171300171301171302171303171304171305171306171307171308171309171310171311171312171313171314171315171316171317171318171319171320171321171322171323171324171325171326171327171328171329171330171331171332171333171334171335171336171337171338171339171340171341171342171343171344171345171346171347171348171349171350171351171352171353171354171355171356171357171358171359171360171361171362171363171364171365171366171367171368171369171370171371171372171373171374171375171376171377171378171379171380171381171382171383171384171385171386171387171388171389171390171391171392171393171394171395171396171397171398171399171400171401171402171403171404171405171406171407171408171409171410171411171412171413171414171415171416171417171418171419171420171421171422171423171424171425171426171427171428171429171430171431171432171433171434171435171436171437171438171439171440171441171442171443171444171445171446171447171448171449171450171451171452171453171454171455171456171457171458171459171460171461171462171463171464171465171466171467171468171469171470171471171472171473171474171475171476171477171478171479171480171481171482171483171484171485171486171487171488171489171490171491171492171493171494171495171496171497171498171499171500171501171502171503171504171505171506171507171508171509171510171511171512171513171514171515171516171517171518171519171520171521171522171523171524171525171526171527171528171529171530171531171532171533171534171535171536171537171538171539171540171541171542171543171544171545171546171547171548171549171550171551171552171553171554171555171556171557171558171559171560171561171562171563171564171565171566171567171568171569171570171571171572171573171574171575171576171577171578171579171580171581171582171583171584171585171586171587171588171589171590171591171592171593171594171595171596171597171598171599171600171601171602171603171604171605171606171607171608171609171610171611171612171613171614171615171616171617171618171619171620171621171622171623171624171625171626171627171628171629171630171631171632171633171634171635171636171637171638171639171640171641171642171643171644171645171646171647171648171649171650171651171652171653171654171655171656171657171658171659171660171661171662171663171664171665171666171667171668171669171670171671171672171673171674171675171676171677171678171679171680171681171682171683171684171685171686171687171688171689171690171691171692171693171694171695171696171697171698171699171700171701171702171703171704171705171706171707171708171709171710171711171712171713171714171715171716171717171718171719171720171721171722171723171724171725171726171727171728171729171730171731171732171733171734171735171736171737171738171739171740171741171742171743171744171745171746171747171748171749171750171751171752171753171754171755171756171757171758171759171760171761171762171763171764171765171766171767171768171769171770171771171772171773171774171775171776171777171778171779171780171781171782171783171784171785171786171787171788171789171790171791171792171793171794171795171796171797171798171799171800171801171802171803171804171805171806171807171808171809171810171811171812171813171814171815171816171817171818171819171820171821171822171823171824171825171826171827171828171829171830171831171832171833171834171835171836171837171838171839171840171841171842171843171844171845171846171847171848171849171850171851171852171853171854171855171856171857171858171859171860171861171862171863171864171865171866171867171868171869171870171871171872171873171874171875171876171877171878171879171880171881171882171883171884171885171886171887171888171889171890171891171892171893171894171895171896171897171898171899171900171901171902171903171904171905171906171907171908171909171910171911171912171913171914171915171916171917171918171919171920171921171922171923171924171925171926171927171928171929171930171931171932171933171934171935171936171937171938171939171940171941171942171943171944171945171946171947171948171949171950171951171952171953171954171955171956171957171958171959171960171961171962171963171964171965171966171967171968171969171970171971171972171973171974171975171976171977171978171979171980171981171982171983171984171985171986171987171988171989171990171991171992171993171994171995171996171997171998171999172000172001172002172003172004172005172006172007172008172009172010172011172012172013172014172015172016172017172018172019172020172021172022172023172024172025172026172027172028172029172030172031172032172033172034172035172036172037172038172039172040172041172042172043172044172045172046172047172048172049172050172051172052172053172054172055172056172057172058172059172060172061172062172063172064172065172066172067172068172069172070172071172072172073172074172075172076172077172078172079172080172081172082172083172084172085172086172087172088172089172090172091172092172093172094172095172096172097172098172099172100172101172102172103172104172105172106172107172108172109172110172111172112172113172114172115172116172117172118172119172120172121172122172123172124172125172126172127172128172129172130172131172132172133172134172135172136172137172138172139172140172141172142172143172144172145172146172147172148172149172150172151172152172153172154172155172156172157172158172159172160172161172162172163172164172165172166172167172168172169172170172171172172172173172174172175172176172177172178172179172180172181172182172183172184172185172186172187172188172189172190172191172192172193172194172195172196172197172198172199172200172201172202172203172204172205172206172207172208172209172210172211172212172213172214172215172216172217172218172219172220172221172222172223172224172225172226172227172228172229172230172231172232172233172234172235172236172237172238172239172240172241172242172243172244172245172246172247172248172249172250172251172252172253172254172255172256172257172258172259172260172261172262172263172264172265172266172267172268172269172270172271172272172273172274172275172276172277172278172279172280172281172282172283172284172285172286172287172288172289172290172291172292172293172294172295172296172297172298172299172300172301172302172303172304172305172306172307172308172309172310172311172312172313172314172315172316172317172318172319172320172321172322172323172324172325172326172327172328172329172330172331172332172333172334172335172336172337172338172339172340172341172342172343172344172345172346172347172348172349172350172351172352172353172354172355172356172357172358172359172360172361172362172363172364172365172366172367172368172369172370172371172372172373172374172375172376172377172378172379172380172381172382172383172384172385172386172387172388172389172390172391172392172393172394172395172396172397172398172399172400172401172402172403172404172405172406172407172408172409172410172411172412172413172414172415172416172417172418172419172420172421172422172423172424172425172426172427172428172429172430172431172432172433172434172435172436172437172438172439172440172441172442172443172444172445172446172447172448172449172450172451172452172453172454172455172456172457172458172459172460172461172462172463172464172465172466172467172468172469172470172471172472172473172474172475172476172477172478172479172480172481172482172483172484172485172486172487172488172489172490172491172492172493172494172495172496172497172498172499172500172501172502172503172504172505172506172507172508172509172510172511172512172513172514172515172516172517172518172519172520172521172522172523172524172525172526172527172528172529172530172531172532172533172534172535172536172537172538172539172540172541172542172543172544172545172546172547172548172549172550172551172552172553172554172555172556172557172558172559172560172561172562172563172564172565172566172567172568172569172570172571172572172573172574172575172576172577172578172579172580172581172582172583172584172585172586172587172588172589172590172591172592172593172594172595172596172597172598172599172600172601172602172603172604172605172606172607172608172609172610172611172612172613172614172615172616172617172618172619172620172621172622172623172624172625172626172627172628172629172630172631172632172633172634172635172636172637172638172639172640172641172642172643172644172645172646172647172648172649172650172651172652172653172654172655172656172657172658172659172660172661172662172663172664172665172666172667172668172669172670172671172672172673172674172675172676172677172678172679172680172681172682172683172684172685172686172687172688172689172690172691172692172693172694172695172696172697172698172699172700172701172702172703172704172705172706172707172708172709172710172711172712172713172714172715172716172717172718172719172720172721172722172723172724172725172726172727172728172729172730172731172732172733172734172735172736172737172738172739172740172741172742172743172744172745172746172747172748172749172750172751172752172753172754172755172756172757172758172759172760172761172762172763172764172765172766172767172768172769172770172771172772172773172774172775172776172777172778172779172780172781172782172783172784172785172786172787172788172789172790172791172792172793172794172795172796172797172798172799172800172801172802172803172804172805172806172807172808172809172810172811172812172813172814172815172816172817172818172819172820172821172822172823172824172825172826172827172828172829172830172831172832172833172834172835172836172837172838172839172840172841172842172843172844172845172846172847172848172849172850172851172852172853172854172855172856172857172858172859172860172861172862172863172864172865172866172867172868172869172870172871172872172873172874172875172876172877172878172879172880172881172882172883172884172885172886172887172888172889172890172891172892172893172894172895172896172897172898172899172900172901172902172903172904172905172906172907172908172909172910172911172912172913172914172915172916172917172918172919172920172921172922172923172924172925172926172927172928172929172930172931172932172933172934172935172936172937172938172939172940172941172942172943172944172945172946172947172948172949172950172951172952172953172954172955172956172957172958172959172960172961172962172963172964172965172966172967172968172969172970172971172972172973172974172975172976172977172978172979172980172981172982172983172984172985172986172987172988172989172990172991172992172993172994172995172996172997172998172999173000173001173002173003173004173005173006173007173008173009173010173011173012173013173014173015173016173017173018173019173020173021173022173023173024173025173026173027173028173029173030173031173032173033173034173035173036173037173038173039173040173041173042173043173044173045173046173047173048173049173050173051173052173053173054173055173056173057173058173059173060173061173062173063173064173065173066173067173068173069173070173071173072173073173074173075173076173077173078173079173080173081173082173083173084173085173086173087173088173089173090173091173092173093173094173095173096173097173098173099173100173101173102173103173104173105173106173107173108173109173110173111173112173113173114173115173116173117173118173119173120173121173122173123173124173125173126173127173128173129173130173131173132173133173134173135173136173137173138173139173140173141173142173143173144173145173146173147173148173149173150173151173152173153173154173155173156173157173158173159173160173161173162173163173164173165173166173167173168173169173170173171173172173173173174173175173176173177173178173179173180173181173182173183173184173185173186173187173188173189173190173191173192173193173194173195173196173197173198173199173200173201173202173203173204173205173206173207173208173209173210173211173212173213173214173215173216173217173218173219173220173221173222173223173224173225173226173227173228173229173230173231173232173233173234173235173236173237173238173239173240173241173242173243173244173245173246173247173248173249173250173251173252173253173254173255173256173257173258173259173260173261173262173263173264173265173266173267173268173269173270173271173272173273173274173275173276173277173278173279173280173281173282173283173284173285173286173287173288173289173290173291173292173293173294173295173296173297173298173299173300173301173302173303173304173305173306173307173308173309173310173311173312173313173314173315173316173317173318173319173320173321173322173323173324173325173326173327173328173329173330173331173332173333173334173335173336173337173338173339173340173341173342173343173344173345173346173347173348173349173350173351173352173353173354173355173356173357173358173359173360173361173362173363173364173365173366173367173368173369173370173371173372173373173374173375173376173377173378173379173380173381173382173383173384173385173386173387173388173389173390173391173392173393173394173395173396173397173398173399173400173401173402173403173404173405173406173407173408173409173410173411173412173413173414173415173416173417173418173419173420173421173422173423173424173425173426173427173428173429173430173431173432173433173434173435173436173437173438173439173440173441173442173443173444173445173446173447173448173449173450173451173452173453173454173455173456173457173458173459173460173461173462173463173464173465173466173467173468173469173470173471173472173473173474173475173476173477173478173479173480173481173482173483173484173485173486173487173488173489173490173491173492173493173494173495173496173497173498173499173500173501173502173503173504173505173506173507173508173509173510173511173512173513173514173515173516173517173518173519173520173521173522173523173524173525173526173527173528173529173530173531173532173533173534173535173536173537173538173539173540173541173542173543173544173545173546173547173548173549173550173551173552173553173554173555173556173557173558173559173560173561173562173563173564173565173566173567173568173569173570173571173572173573173574173575173576173577173578173579173580173581173582173583173584173585173586173587173588173589173590173591173592173593173594173595173596173597173598173599173600173601173602173603173604173605173606173607173608173609173610173611173612173613173614173615173616173617173618173619173620173621173622173623173624173625173626173627173628173629173630173631173632173633173634173635173636173637173638173639173640173641173642173643173644173645173646173647173648173649173650173651173652173653173654173655173656173657173658173659173660173661173662173663173664173665173666173667173668173669173670173671173672173673173674173675173676173677173678173679173680173681173682173683173684173685173686173687173688173689173690173691173692173693173694173695173696173697173698173699173700173701173702173703173704173705173706173707173708173709173710173711173712173713173714173715173716173717173718173719173720173721173722173723173724173725173726173727173728173729173730173731173732173733173734173735173736173737173738173739173740173741173742173743173744173745173746173747173748173749173750173751173752173753173754173755173756173757173758173759173760173761173762173763173764173765173766173767173768173769173770173771173772173773173774173775173776173777173778173779173780173781173782173783173784173785173786173787173788173789173790173791173792173793173794173795173796173797173798173799173800173801173802173803173804173805173806173807173808173809173810173811173812173813173814173815173816173817173818173819173820173821173822173823173824173825173826173827173828173829173830173831173832173833173834173835173836173837173838173839173840173841173842173843173844173845173846173847173848173849173850173851173852173853173854173855173856173857173858173859173860173861173862173863173864173865173866173867173868173869173870173871173872173873173874173875173876173877173878173879173880173881173882173883173884173885173886173887173888173889173890173891173892173893173894173895173896173897173898173899173900173901173902173903173904173905173906173907173908173909173910173911173912173913173914173915173916173917173918173919173920173921173922173923173924173925173926173927173928173929173930173931173932173933173934173935173936173937173938173939173940173941173942173943173944173945173946173947173948173949173950173951173952173953173954173955173956173957173958173959173960173961173962173963173964173965173966173967173968173969173970173971173972173973173974173975173976173977173978173979173980173981173982173983173984173985173986173987173988173989173990173991173992173993173994173995173996173997173998173999174000174001174002174003174004174005174006174007174008174009174010174011174012174013174014174015174016174017174018174019174020174021174022174023174024174025174026174027174028174029174030174031174032174033174034174035174036174037174038174039174040174041174042174043174044174045174046174047174048174049174050174051174052174053174054174055174056174057174058174059174060174061174062174063174064174065174066174067174068174069174070174071174072174073174074174075174076174077174078174079174080174081174082174083174084174085174086174087174088174089174090174091174092174093174094174095174096174097174098174099174100174101174102174103174104174105174106174107174108174109174110174111174112174113174114174115174116174117174118174119174120174121174122174123174124174125174126174127174128174129174130174131174132174133174134174135174136174137174138174139174140174141174142174143174144174145174146174147174148174149174150174151174152174153174154174155174156174157174158174159174160174161174162174163174164174165174166174167174168174169174170174171174172174173174174174175174176174177174178174179174180174181174182174183174184174185174186174187174188174189174190174191174192174193174194174195174196174197174198174199174200174201174202174203174204174205174206174207174208174209174210174211174212174213174214174215174216174217174218174219174220174221174222174223174224174225174226174227174228174229174230174231174232174233174234174235174236174237174238174239174240174241174242174243174244174245174246174247174248174249174250174251174252174253174254174255174256174257174258174259174260174261174262174263174264174265174266174267174268174269174270174271174272174273174274174275174276174277174278174279174280174281174282174283174284174285174286174287174288174289174290174291174292174293174294174295174296174297174298174299174300174301174302174303174304174305174306174307174308174309174310174311174312174313174314174315174316174317174318174319174320174321174322174323174324174325174326174327174328174329174330174331174332174333174334174335174336174337174338174339174340174341174342174343174344174345174346174347174348174349174350174351174352174353174354174355174356174357174358174359174360174361174362174363174364174365174366174367174368174369174370174371174372174373174374174375174376174377174378174379174380174381174382174383174384174385174386174387174388174389174390174391174392174393174394174395174396174397174398174399174400174401174402174403174404174405174406174407174408174409174410174411174412174413174414174415174416174417174418174419174420174421174422174423174424174425174426174427174428174429174430174431174432174433174434174435174436174437174438174439174440174441174442174443174444174445174446174447174448174449174450174451174452174453174454174455174456174457174458174459174460174461174462174463174464174465174466174467174468174469174470174471174472174473174474174475174476174477174478174479174480174481174482174483174484174485174486174487174488174489174490174491174492174493174494174495174496174497174498174499174500174501174502174503174504174505174506174507174508174509174510174511174512174513174514174515174516174517174518174519174520174521174522174523174524174525174526174527174528174529174530174531174532174533174534174535174536174537174538174539174540174541174542174543174544174545174546174547174548174549174550174551174552174553174554174555174556174557174558174559174560174561174562174563174564174565174566174567174568174569174570174571174572174573174574174575174576174577174578174579174580174581174582174583174584174585174586174587174588174589174590174591174592174593174594174595174596174597174598174599174600174601174602174603174604174605174606174607174608174609174610174611174612174613174614174615174616174617174618174619174620174621174622174623174624174625174626174627174628174629174630174631174632174633174634174635174636174637174638174639174640174641174642174643174644174645174646174647174648174649174650174651174652174653174654174655174656174657174658174659174660174661174662174663174664174665174666174667174668174669174670174671174672174673174674174675174676174677174678174679174680174681174682174683174684174685174686174687174688174689174690174691174692174693174694174695174696174697174698174699174700174701174702174703174704174705174706174707174708174709174710174711174712174713174714174715174716174717174718174719174720174721174722174723174724174725174726174727174728174729174730174731174732174733174734174735174736174737174738174739174740174741174742174743174744174745174746174747174748174749174750174751174752174753174754174755174756174757174758174759174760174761174762174763174764174765174766174767174768174769174770174771174772174773174774174775174776174777174778174779174780174781174782174783174784174785174786174787174788174789174790174791174792174793174794174795174796174797174798174799174800174801174802174803174804174805174806174807174808174809174810174811174812174813174814174815174816174817174818174819174820174821174822174823174824174825174826174827174828174829174830174831174832174833174834174835174836174837174838174839174840174841174842174843174844174845174846174847174848174849174850174851174852174853174854174855174856174857174858174859174860174861174862174863174864174865174866174867174868174869174870174871174872174873174874174875174876174877174878174879174880174881174882174883174884174885174886174887174888174889174890174891174892174893174894174895174896174897174898174899174900174901174902174903174904174905174906174907174908174909174910174911174912174913174914174915174916174917174918174919174920174921174922174923174924174925174926174927174928174929174930174931174932174933174934174935174936174937174938174939174940174941174942174943174944174945174946174947174948174949174950174951174952174953174954174955174956174957174958174959174960174961174962174963174964174965174966174967174968174969174970174971174972174973174974174975174976174977174978174979174980174981174982174983174984174985174986174987174988174989174990174991174992174993174994174995174996174997174998174999175000175001175002175003175004175005175006175007175008175009175010175011175012175013175014175015175016175017175018175019175020175021175022175023175024175025175026175027175028175029175030175031175032175033175034175035175036175037175038175039175040175041175042175043175044175045175046175047175048175049175050175051175052175053175054175055175056175057175058175059175060175061175062175063175064175065175066175067175068175069175070175071175072175073175074175075175076175077175078175079175080175081175082175083175084175085175086175087175088175089175090175091175092175093175094175095175096175097175098175099175100175101175102175103175104175105175106175107175108175109175110175111175112175113175114175115175116175117175118175119175120175121175122175123175124175125175126175127175128175129175130175131175132175133175134175135175136175137175138175139175140175141175142175143175144175145175146175147175148175149175150175151175152175153175154175155175156175157175158175159175160175161175162175163175164175165175166175167175168175169175170175171175172175173175174175175175176175177175178175179175180175181175182175183175184175185175186175187175188175189175190175191175192175193175194175195175196175197175198175199175200175201175202175203175204175205175206175207175208175209175210175211175212175213175214175215175216175217175218175219175220175221175222175223175224175225175226175227175228175229175230175231175232175233175234175235175236175237175238175239175240175241175242175243175244175245175246175247175248175249175250175251175252175253175254175255175256175257175258175259175260175261175262175263175264175265175266175267175268175269175270175271175272175273175274175275175276175277175278175279175280175281175282175283175284175285175286175287175288175289175290175291175292175293175294175295175296175297175298175299175300175301175302175303175304175305175306175307175308175309175310175311175312175313175314175315175316175317175318175319175320175321175322175323175324175325175326175327175328175329175330175331175332175333175334175335175336175337175338175339175340175341175342175343175344175345175346175347175348175349175350175351175352175353175354175355175356175357175358175359175360175361175362175363175364175365175366175367175368175369175370175371175372175373175374175375175376175377175378175379175380175381175382175383175384175385175386175387175388175389175390175391175392175393175394175395175396175397175398175399175400175401175402175403175404175405175406175407175408175409175410175411175412175413175414175415175416175417175418175419175420175421175422175423175424175425175426175427175428175429175430175431175432175433175434175435175436175437175438175439175440175441175442175443175444175445175446175447175448175449175450175451175452175453175454175455175456175457175458175459175460175461175462175463175464175465175466175467175468175469175470175471175472175473175474175475175476175477175478175479175480175481175482175483175484175485175486175487175488175489175490175491175492175493175494175495175496175497175498175499175500175501175502175503175504175505175506175507175508175509175510175511175512175513175514175515175516175517175518175519175520175521175522175523175524175525175526175527175528175529175530175531175532175533175534175535175536175537175538175539175540175541175542175543175544175545175546175547175548175549175550175551175552175553175554175555175556175557175558175559175560175561175562175563175564175565175566175567175568175569175570175571175572175573175574175575175576175577175578175579175580175581175582175583175584175585175586175587175588175589175590175591175592175593175594175595175596175597175598175599175600175601175602175603175604175605175606175607175608175609175610175611175612175613175614175615175616175617175618175619175620175621175622175623175624175625175626175627175628175629175630175631175632175633175634175635175636175637175638175639175640175641175642175643175644175645175646175647175648175649175650175651175652175653175654175655175656175657175658175659175660175661175662175663175664175665175666175667175668175669175670175671175672175673175674175675175676175677175678175679175680175681175682175683175684175685175686175687175688175689175690175691175692175693175694175695175696175697175698175699175700175701175702175703175704175705175706175707175708175709175710175711175712175713175714175715175716175717175718175719175720175721175722175723175724175725175726175727175728175729175730175731175732175733175734175735175736175737175738175739175740175741175742175743175744175745175746175747175748175749175750175751175752175753175754175755175756175757175758175759175760175761175762175763175764175765175766175767175768175769175770175771175772175773175774175775175776175777175778175779175780175781175782175783175784175785175786175787175788175789175790175791175792175793175794175795175796175797175798175799175800175801175802175803175804175805175806175807175808175809175810175811175812175813175814175815175816175817175818175819175820175821175822175823175824175825175826175827175828175829175830175831175832175833175834175835175836175837175838175839175840175841175842175843175844175845175846175847175848175849175850175851175852175853175854175855175856175857175858175859175860175861175862175863175864175865175866175867175868175869175870175871175872175873175874175875175876175877175878175879175880175881175882175883175884175885175886175887175888175889175890175891175892175893175894175895175896175897175898175899175900175901175902175903175904175905175906175907175908175909175910175911175912175913175914175915175916175917175918175919175920175921175922175923175924175925175926175927175928175929175930175931175932175933175934175935175936175937175938175939175940175941175942175943175944175945175946175947175948175949175950175951175952175953175954175955175956175957175958175959175960175961175962175963175964175965175966175967175968175969175970175971175972175973175974175975175976175977175978175979175980175981175982175983175984175985175986175987175988175989175990175991175992175993175994175995175996175997175998175999176000176001176002176003176004176005176006176007176008176009176010176011176012176013176014176015176016176017176018176019176020176021176022176023176024176025176026176027176028176029176030176031176032176033176034176035176036176037176038176039176040176041176042176043176044176045176046176047176048176049176050176051176052176053176054176055176056176057176058176059176060176061176062176063176064176065176066176067176068176069176070176071176072176073176074176075176076176077176078176079176080176081176082176083176084176085176086176087176088176089176090176091176092176093176094176095176096176097176098176099176100176101176102176103176104176105176106176107176108176109176110176111176112176113176114176115176116176117176118176119176120176121176122176123176124176125176126176127176128176129176130176131176132176133176134176135176136176137176138176139176140176141176142176143176144176145176146176147176148176149176150176151176152176153176154176155176156176157176158176159176160176161176162176163176164176165176166176167176168176169176170176171176172176173176174176175176176176177176178176179176180176181176182176183176184176185176186176187176188176189176190176191176192176193176194176195176196176197176198176199176200176201176202176203176204176205176206176207176208176209176210176211176212176213176214176215176216176217176218176219176220176221176222176223176224176225176226176227176228176229176230176231176232176233176234176235176236176237176238176239176240176241176242176243176244176245176246176247176248176249176250176251176252176253176254176255176256176257176258176259176260176261176262176263176264176265176266176267176268176269176270176271176272176273176274176275176276176277176278176279176280176281176282176283176284176285176286176287176288176289176290176291176292176293176294176295176296176297176298176299176300176301176302176303176304176305176306176307176308176309176310176311176312176313176314176315176316176317176318176319176320176321176322176323176324176325176326176327176328176329176330176331176332176333176334176335176336176337176338176339176340176341176342176343176344176345176346176347176348176349176350176351176352176353176354176355176356176357176358176359176360176361176362176363176364176365176366176367176368176369176370176371176372176373176374176375176376176377176378176379176380176381176382176383176384176385176386176387176388176389176390176391176392176393176394176395176396176397176398176399176400176401176402176403176404176405176406176407176408176409176410176411176412176413176414176415176416176417176418176419176420176421176422176423176424176425176426176427176428176429176430176431176432176433176434176435176436176437176438176439176440176441176442176443176444176445176446176447176448176449176450176451176452176453176454176455176456176457176458176459176460176461176462176463176464176465176466176467176468176469176470176471176472176473176474176475176476176477176478176479176480176481176482176483176484176485176486176487176488176489176490176491176492176493176494176495176496176497176498176499176500176501176502176503176504176505176506176507176508176509176510176511176512176513176514176515176516176517176518176519176520176521176522176523176524176525176526176527176528176529176530176531176532176533176534176535176536176537176538176539176540176541176542176543176544176545176546176547176548176549176550176551176552176553176554176555176556176557176558176559176560176561176562176563176564176565176566176567176568176569176570176571176572176573176574176575176576176577176578176579176580176581176582176583176584176585176586176587176588176589176590176591176592176593176594176595176596176597176598176599176600176601176602176603176604176605176606176607176608176609176610176611176612176613176614176615176616176617176618176619176620176621176622176623176624176625176626176627176628176629176630176631176632176633176634176635176636176637176638176639176640176641176642176643176644176645176646176647176648176649176650176651176652176653176654176655176656176657176658176659176660176661176662176663176664176665176666176667176668176669176670176671176672176673176674176675176676176677176678176679176680176681176682176683176684176685176686176687176688176689176690176691176692176693176694176695176696176697176698176699176700176701176702176703176704176705176706176707176708176709176710176711176712176713176714176715176716176717176718176719176720176721176722176723176724176725176726176727176728176729176730176731176732176733176734176735176736176737176738176739176740176741176742176743176744176745176746176747176748176749176750176751176752176753176754176755176756176757176758176759176760176761176762176763176764176765176766176767176768176769176770176771176772176773176774176775176776176777176778176779176780176781176782176783176784176785176786176787176788176789176790176791176792176793176794176795176796176797176798176799176800176801176802176803176804176805176806176807176808176809176810176811176812176813176814176815176816176817176818176819176820176821176822176823176824176825176826176827176828176829176830176831176832176833176834176835176836176837176838176839176840176841176842176843176844176845176846176847176848176849176850176851176852176853176854176855176856176857176858176859176860176861176862176863176864176865176866176867176868176869176870176871176872176873176874176875176876176877176878176879176880176881176882176883176884176885176886176887176888176889176890176891176892176893176894176895176896176897176898176899176900176901176902176903176904176905176906176907176908176909176910176911176912176913176914176915176916176917176918176919176920176921176922176923176924176925176926176927176928176929176930176931176932176933176934176935176936176937176938176939176940176941176942176943176944176945176946176947176948176949176950176951176952176953176954176955176956176957176958176959176960176961176962176963176964176965176966176967176968176969176970176971176972176973176974176975176976176977176978176979176980176981176982176983176984176985176986176987176988176989176990176991176992176993176994176995176996176997176998176999177000177001177002177003177004177005177006177007177008177009177010177011177012177013177014177015177016177017177018177019177020177021177022177023177024177025177026177027177028177029177030177031177032177033177034177035177036177037177038177039177040177041177042177043177044177045177046177047177048177049177050177051177052177053177054177055177056177057177058177059177060177061177062177063177064177065177066177067177068177069177070177071177072177073177074177075177076177077177078177079177080177081177082177083177084177085177086177087177088177089177090177091177092177093177094177095177096177097177098177099177100177101177102177103177104177105177106177107177108177109177110177111177112177113177114177115177116177117177118177119177120177121177122177123177124177125177126177127177128177129177130177131177132177133177134177135177136177137177138177139177140177141177142177143177144177145177146177147177148177149177150177151177152177153177154177155177156177157177158177159177160177161177162177163177164177165177166177167177168177169177170177171177172177173177174177175177176177177177178177179177180177181177182177183177184177185177186177187177188177189177190177191177192177193177194177195177196177197177198177199177200177201177202177203177204177205177206177207177208177209177210177211177212177213177214177215177216177217177218177219177220177221177222177223177224177225177226177227177228177229177230177231177232177233177234177235177236177237177238177239177240177241177242177243177244177245177246177247177248177249177250177251177252177253177254177255177256177257177258177259177260177261177262177263177264177265177266177267177268177269177270177271177272177273177274177275177276177277177278177279177280177281177282177283177284177285177286177287177288177289177290177291177292177293177294177295177296177297177298177299177300177301177302177303177304177305177306177307177308177309177310177311177312177313177314177315177316177317177318177319177320177321177322177323177324177325177326177327177328177329177330177331177332177333177334177335177336177337177338177339177340177341177342177343177344177345177346177347177348177349177350177351177352177353177354177355177356177357177358177359177360177361177362177363177364177365177366177367177368177369177370177371177372177373177374177375177376177377177378177379177380177381177382177383177384177385177386177387177388177389177390177391177392177393177394177395177396177397177398177399177400177401177402177403177404177405177406177407177408177409177410177411177412177413177414177415177416177417177418177419177420177421177422177423177424177425177426177427177428177429177430177431177432177433177434177435177436177437177438177439177440177441177442177443177444177445177446177447177448177449177450177451177452177453177454177455177456177457177458177459177460177461177462177463177464177465177466177467177468177469177470177471177472177473177474177475177476177477177478177479177480177481177482177483177484177485177486177487177488177489177490177491177492177493177494177495177496177497177498177499177500177501177502177503177504177505177506177507177508177509177510177511177512177513177514177515177516177517177518177519177520177521177522177523177524177525177526177527177528177529177530177531177532177533177534177535177536177537177538177539177540177541177542177543177544177545177546177547177548177549177550177551177552177553177554177555177556177557177558177559177560177561177562177563177564177565177566177567177568177569177570177571177572177573177574177575177576177577177578177579177580177581177582177583177584177585177586177587177588177589177590177591177592177593177594177595177596177597177598177599177600177601177602177603177604177605177606177607177608177609177610177611177612177613177614177615177616177617177618177619177620177621177622177623177624177625177626177627177628177629177630177631177632177633177634177635177636177637177638177639177640177641177642177643177644177645177646177647177648177649177650177651177652177653177654177655177656177657177658177659177660177661177662177663177664177665177666177667177668177669177670177671177672177673177674177675177676177677177678177679177680177681177682177683177684177685177686177687177688177689177690177691177692177693177694177695177696177697177698177699177700177701177702177703177704177705177706177707177708177709177710177711177712177713177714177715177716177717177718177719177720177721177722177723177724177725177726177727177728177729177730177731177732177733177734177735177736177737177738177739177740177741177742177743177744177745177746177747177748177749177750177751177752177753177754177755177756177757177758177759177760177761177762177763177764177765177766177767177768177769177770177771177772177773177774177775177776177777177778177779177780177781177782177783177784177785177786177787177788177789177790177791177792177793177794177795177796177797177798177799177800177801177802177803177804177805177806177807177808177809177810177811177812177813177814177815177816177817177818177819177820177821177822177823177824177825177826177827177828177829177830177831177832177833177834177835177836177837177838177839177840177841177842177843177844177845177846177847177848177849177850177851177852177853177854177855177856177857177858177859177860177861177862177863177864177865177866177867177868177869177870177871177872177873177874177875177876177877177878177879177880177881177882177883177884177885177886177887177888177889177890177891177892177893177894177895177896177897177898177899177900177901177902177903177904177905177906177907177908177909177910177911177912177913177914177915177916177917177918177919177920177921177922177923177924177925177926177927177928177929177930177931177932177933177934177935177936177937177938177939177940177941177942177943177944177945177946177947177948177949177950177951177952177953177954177955177956177957177958177959177960177961177962177963177964177965177966177967177968177969177970177971177972177973177974177975177976177977177978177979177980177981177982177983177984177985177986177987177988177989177990177991177992177993177994177995177996177997177998177999178000178001178002178003178004178005178006178007178008178009178010178011178012178013178014178015178016178017178018178019178020178021178022178023178024178025178026178027178028178029178030178031178032178033178034178035178036178037178038178039178040178041178042178043178044178045178046178047178048178049178050178051178052178053178054178055178056178057178058178059178060178061178062178063178064178065178066178067178068178069178070178071178072178073178074178075178076178077178078178079178080178081178082178083178084178085178086178087178088178089178090178091178092178093178094178095178096178097178098178099178100178101178102178103178104178105178106178107178108178109178110178111178112178113178114178115178116178117178118178119178120178121178122178123178124178125178126178127178128178129178130178131178132178133178134178135178136178137178138178139178140178141178142178143178144178145178146178147178148178149178150178151178152178153178154178155178156178157178158178159178160178161178162178163178164178165178166178167178168178169178170178171178172178173178174178175178176178177178178178179178180178181178182178183178184178185178186178187178188178189178190178191178192178193178194178195178196178197178198178199178200178201178202178203178204178205178206178207178208178209178210178211178212178213178214178215178216178217178218178219178220178221178222178223178224178225178226178227178228178229178230178231178232178233178234178235178236178237178238178239178240178241178242178243178244178245178246178247178248178249178250178251178252178253178254178255178256178257178258178259178260178261178262178263178264178265178266178267178268178269178270178271178272178273178274178275178276178277178278178279178280178281178282178283178284178285178286178287178288178289178290178291178292178293178294178295178296178297178298178299178300178301178302178303178304178305178306178307178308178309178310178311178312178313178314178315178316178317178318178319178320178321178322178323178324178325178326178327178328178329178330178331178332178333178334178335178336178337178338178339178340178341178342178343178344178345178346178347178348178349178350178351178352178353178354178355178356178357178358178359178360178361178362178363178364178365178366178367178368178369178370178371178372178373178374178375178376178377178378178379178380178381178382178383178384178385178386178387178388178389178390178391178392178393178394178395178396178397178398178399178400178401178402178403178404178405178406178407178408178409178410178411178412178413178414178415178416178417178418178419178420178421178422178423178424178425178426178427178428178429178430178431178432178433178434178435178436178437178438178439178440178441178442178443178444178445178446178447178448178449178450178451178452178453178454178455178456178457178458178459178460178461178462178463178464178465178466178467178468178469178470178471178472178473178474178475178476178477178478178479178480178481178482178483178484178485178486178487178488178489178490178491178492178493178494178495178496178497178498178499178500178501178502178503178504178505178506178507178508178509178510178511178512178513178514178515178516178517178518178519178520178521178522178523178524178525178526178527178528178529178530178531178532178533178534178535178536178537178538178539178540178541178542178543178544178545178546178547178548178549178550178551178552178553178554178555178556178557178558178559178560178561178562178563178564178565178566178567178568178569178570178571178572178573178574178575178576178577178578178579178580178581178582178583178584178585178586178587178588178589178590178591178592178593178594178595178596178597178598178599178600178601178602178603178604178605178606178607178608178609178610178611178612178613178614178615178616178617178618178619178620178621178622178623178624178625178626178627178628178629178630178631178632178633178634178635178636178637178638178639178640178641178642178643178644178645178646178647178648178649178650178651178652178653178654178655178656178657178658178659178660178661178662178663178664178665178666178667178668178669178670178671178672178673178674178675178676178677178678178679178680178681178682178683178684178685178686178687178688178689178690178691178692178693178694178695178696178697178698178699178700178701178702178703178704178705178706178707178708178709178710178711178712178713178714178715178716178717178718178719178720178721178722178723178724178725178726178727178728178729178730178731178732178733178734178735178736178737178738178739178740178741178742178743178744178745178746178747178748178749178750178751178752178753178754178755178756178757178758178759178760178761178762178763178764178765178766178767178768178769178770178771178772178773178774178775178776178777178778178779178780178781178782178783178784178785178786178787178788178789178790178791178792178793178794178795178796178797178798178799178800178801178802178803178804178805178806178807178808178809178810178811178812178813178814178815178816178817178818178819178820178821178822178823178824178825178826178827178828178829178830178831178832178833178834178835178836178837178838178839178840178841178842178843178844178845178846178847178848178849178850178851178852178853178854178855178856178857178858178859178860178861178862178863178864178865178866178867178868178869178870178871178872178873178874178875178876178877178878178879178880178881178882178883178884178885178886178887178888178889178890178891178892178893178894178895178896178897178898178899178900178901178902178903178904178905178906178907178908178909178910178911178912178913178914178915178916178917178918178919178920178921178922178923178924178925178926178927178928178929178930178931178932178933178934178935178936178937178938178939178940178941178942178943178944178945178946178947178948178949178950178951178952178953178954178955178956178957178958178959178960178961178962178963178964178965178966178967178968178969178970178971178972178973178974178975178976178977178978178979178980178981178982178983178984178985178986178987178988178989178990178991178992178993178994178995178996178997178998178999179000179001179002179003179004179005179006179007179008179009179010179011179012179013179014179015179016179017179018179019179020179021179022179023179024179025179026179027179028179029179030179031179032179033179034179035179036179037179038179039179040179041179042179043179044179045179046179047179048179049179050179051179052179053179054179055179056179057179058179059179060179061179062179063179064179065179066179067179068179069179070179071179072179073179074179075179076179077179078179079179080179081179082179083179084179085179086179087179088179089179090179091179092179093179094179095179096179097179098179099179100179101179102179103179104179105179106179107179108179109179110179111179112179113179114179115179116179117179118179119179120179121179122179123179124179125179126179127179128179129179130179131179132179133179134179135179136179137179138179139179140179141179142179143179144179145179146179147179148179149179150179151179152179153179154179155179156179157179158179159179160179161179162179163179164179165179166179167179168179169179170179171179172179173179174179175179176179177179178179179179180179181179182179183179184179185179186179187179188179189179190179191179192179193179194179195179196179197179198179199179200179201179202179203179204179205179206179207179208179209179210179211179212179213179214179215179216179217179218179219179220179221179222179223179224179225179226179227179228179229179230179231179232179233179234179235179236179237179238179239179240179241179242179243179244179245179246179247179248179249179250179251179252179253179254179255179256179257179258179259179260179261179262179263179264179265179266179267179268179269179270179271179272179273179274179275179276179277179278179279179280179281179282179283179284179285179286179287179288179289179290179291179292179293179294179295179296179297179298179299179300179301179302179303179304179305179306179307179308179309179310179311179312179313179314179315179316179317179318179319179320179321179322179323179324179325179326179327179328179329179330179331179332179333179334179335179336179337179338179339179340179341179342179343179344179345179346179347179348179349179350179351179352179353179354179355179356179357179358179359179360179361179362179363179364179365179366179367179368179369179370179371179372179373179374179375179376179377179378179379179380179381179382179383179384179385179386179387179388179389179390179391179392179393179394179395179396179397179398179399179400179401179402179403179404179405179406179407179408179409179410179411179412179413179414179415179416179417179418179419179420179421179422179423179424179425179426179427179428179429179430179431179432179433179434179435179436179437179438179439179440179441179442179443179444179445179446179447179448179449179450179451179452179453179454179455179456179457179458179459179460179461179462179463179464179465179466179467179468179469179470179471179472179473179474179475179476179477179478179479179480179481179482179483179484179485179486179487179488179489179490179491179492179493179494179495179496179497179498179499179500179501179502179503179504179505179506179507179508179509179510179511179512179513179514179515179516179517179518179519179520179521179522179523179524179525179526179527179528179529179530179531179532179533179534179535179536179537179538179539179540179541179542179543179544179545179546179547179548179549179550179551179552179553179554179555179556179557179558179559179560179561179562179563179564179565179566179567179568179569179570179571179572179573179574179575179576179577179578179579179580179581179582179583179584179585179586179587179588179589179590179591179592179593179594179595179596179597179598179599179600179601179602179603179604179605179606179607179608179609179610179611179612179613179614179615179616179617179618179619179620179621179622179623179624179625179626179627179628179629179630179631179632179633179634179635179636179637179638179639179640179641179642179643179644179645179646179647179648179649179650179651179652179653179654179655179656179657179658179659179660179661179662179663179664179665179666179667179668179669179670179671179672179673179674179675179676179677179678179679179680179681179682179683179684179685179686179687179688179689179690179691179692179693179694179695179696179697179698179699179700179701179702179703179704179705179706179707179708179709179710179711179712179713179714179715179716179717179718179719179720179721179722179723179724179725179726179727179728179729179730179731179732179733179734179735179736179737179738179739179740179741179742179743179744179745179746179747179748179749179750179751179752179753179754179755179756179757179758179759179760179761179762179763179764179765179766179767179768179769179770179771179772179773179774179775179776179777179778179779179780179781179782179783179784179785179786179787179788179789179790179791179792179793179794179795179796179797179798179799179800179801179802179803179804179805179806179807179808179809179810179811179812179813179814179815179816179817179818179819179820179821179822179823179824179825179826179827179828179829179830179831179832179833179834179835179836179837179838179839179840179841179842179843179844179845179846179847179848179849179850179851179852179853179854179855179856179857179858179859179860179861179862179863179864179865179866179867179868179869179870179871179872179873179874179875179876179877179878179879179880179881179882179883179884179885179886179887179888179889179890179891179892179893179894179895179896179897179898179899179900179901179902179903179904179905179906179907179908179909179910179911179912179913179914179915179916179917179918179919179920179921179922179923179924179925179926179927179928179929179930179931179932179933179934179935179936179937179938179939179940179941179942179943179944179945179946179947179948179949179950179951179952179953179954179955179956179957179958179959179960179961179962179963179964179965179966179967179968179969179970179971179972179973179974179975179976179977179978179979179980179981179982179983179984179985179986179987179988179989179990179991179992179993179994179995179996179997179998179999180000180001180002180003180004180005180006180007180008180009180010180011180012180013180014180015180016180017180018180019180020180021180022180023180024180025180026180027180028180029180030180031180032180033180034180035180036180037180038180039180040180041180042180043180044180045180046180047180048180049180050180051180052180053180054180055180056180057180058180059180060180061180062180063180064180065180066180067180068180069180070180071180072180073180074180075180076180077180078180079180080180081180082180083180084180085180086180087180088180089180090180091180092180093180094180095180096180097180098180099180100180101180102180103180104180105180106180107180108180109180110180111180112180113180114180115180116180117180118180119180120180121180122180123180124180125180126180127180128180129180130180131180132180133180134180135180136180137180138180139180140180141180142180143180144180145180146180147180148180149180150180151180152180153180154180155180156180157180158180159180160180161180162180163180164180165180166180167180168180169180170180171180172180173180174180175180176180177180178180179180180180181180182180183180184180185180186180187180188180189180190180191180192180193180194180195180196180197180198180199180200180201180202180203180204180205180206180207180208180209180210180211180212180213180214180215180216180217180218180219180220180221180222180223180224180225180226180227180228180229180230180231180232180233180234180235180236180237180238180239180240180241180242180243180244180245180246180247180248180249180250180251180252180253180254180255180256180257180258180259180260180261180262180263180264180265180266180267180268180269180270180271180272180273180274180275180276180277180278180279180280180281180282180283180284180285180286180287180288180289180290180291180292180293180294180295180296180297180298180299180300180301180302180303180304180305180306180307180308180309180310180311180312180313180314180315180316180317180318180319180320180321180322180323180324180325180326180327180328180329180330180331180332180333180334180335180336180337180338180339180340180341180342180343180344180345180346180347180348180349180350180351180352180353180354180355180356180357180358180359180360180361180362180363180364180365180366180367180368180369180370180371180372180373180374180375180376180377180378180379180380180381180382180383180384180385180386180387180388180389180390180391180392180393180394180395180396180397180398180399180400180401180402180403180404180405180406180407180408180409180410180411180412180413180414180415180416180417180418180419180420180421180422180423180424180425180426180427180428180429180430180431180432180433180434180435180436180437180438180439180440180441180442180443180444180445180446180447180448180449180450180451180452180453180454180455180456180457180458180459180460180461180462180463180464180465180466180467180468180469180470180471180472180473180474180475180476180477180478180479180480180481180482180483180484180485180486180487180488180489180490180491180492180493180494180495180496180497180498180499180500180501180502180503180504180505180506180507180508180509180510180511180512180513180514180515180516180517180518180519180520180521180522180523180524180525180526180527180528180529180530180531180532180533180534180535180536180537180538180539180540180541180542180543180544180545180546180547180548180549180550180551180552180553180554180555180556180557180558180559180560180561180562180563180564180565180566180567180568180569180570180571180572180573180574180575180576180577180578180579180580180581180582180583180584180585180586180587180588180589180590180591180592180593180594180595180596180597180598180599180600180601180602180603180604180605180606180607180608180609180610180611180612180613180614180615180616180617180618180619180620180621180622180623180624180625180626180627180628180629180630180631180632180633180634180635180636180637180638180639180640180641180642180643180644180645180646180647180648180649180650180651180652180653180654180655180656180657180658180659180660180661180662180663180664180665180666180667180668180669180670180671180672180673180674180675180676180677180678180679180680180681180682180683180684180685180686180687180688180689180690180691180692180693180694180695180696180697180698180699180700180701180702180703180704180705180706180707180708180709180710180711180712180713180714180715180716180717180718180719180720180721180722180723180724180725180726180727180728180729180730180731180732180733180734180735180736180737180738180739180740180741180742180743180744180745180746180747180748180749180750180751180752180753180754180755180756180757180758180759180760180761180762180763180764180765180766180767180768180769180770180771180772180773180774180775180776180777180778180779180780180781180782180783180784180785180786180787180788180789180790180791180792180793180794180795180796180797180798180799180800180801180802180803180804180805180806180807180808180809180810180811180812180813180814180815180816180817180818180819180820180821180822180823180824180825180826180827180828180829180830180831180832180833180834180835180836180837180838180839180840180841180842180843180844180845180846180847180848180849180850180851180852180853180854180855180856180857180858180859180860180861180862180863180864180865180866180867180868180869180870180871180872180873180874180875180876180877180878180879180880180881180882180883180884180885180886180887180888180889180890180891180892180893180894180895180896180897180898180899180900180901180902180903180904180905180906180907180908180909180910180911180912180913180914180915180916180917180918180919180920180921180922180923180924180925180926180927180928180929180930180931180932180933180934180935180936180937180938180939180940180941180942180943180944180945180946180947180948180949180950180951180952180953180954180955180956180957180958180959180960180961180962180963180964180965180966180967180968180969180970180971180972180973180974180975180976180977180978180979180980180981180982180983180984180985180986180987180988180989180990180991180992180993180994180995180996180997180998180999181000181001181002181003181004181005181006181007181008181009181010181011181012181013181014181015181016181017181018181019181020181021181022181023181024181025181026181027181028181029181030181031181032181033181034181035181036181037181038181039181040181041181042181043181044181045181046181047181048181049181050181051181052181053181054181055181056181057181058181059181060181061181062181063181064181065181066181067181068181069181070181071181072181073181074181075181076181077181078181079181080181081181082181083181084181085181086181087181088181089181090181091181092181093181094181095181096181097181098181099181100181101181102181103181104181105181106181107181108181109181110181111181112181113181114181115181116181117181118181119181120181121181122181123181124181125181126181127181128181129181130181131181132181133181134181135181136181137181138181139181140181141181142181143181144181145181146181147181148181149181150181151181152181153181154181155181156181157181158181159181160181161181162181163181164181165181166181167181168181169181170181171181172181173181174181175181176181177181178181179181180181181181182181183181184181185181186181187181188181189181190181191181192181193181194181195181196181197181198181199181200181201181202181203181204181205181206181207181208181209181210181211181212181213181214181215181216181217181218181219181220181221181222181223181224181225181226181227181228181229181230181231181232181233181234181235181236181237181238181239181240181241181242181243181244181245181246181247181248181249181250181251181252181253181254181255181256181257181258181259181260181261181262181263181264181265181266181267181268181269181270181271181272181273181274181275181276181277181278181279181280181281181282181283181284181285181286181287181288181289181290181291181292181293181294181295181296181297181298181299181300181301181302181303181304181305181306181307181308181309181310181311181312181313181314181315181316181317181318181319181320181321181322181323181324181325181326181327181328181329181330181331181332181333181334181335181336181337181338181339181340181341181342181343181344181345181346181347181348181349181350181351181352181353181354181355181356181357181358181359181360181361181362181363181364181365181366181367181368181369181370181371181372181373181374181375181376181377181378181379181380181381181382181383181384181385181386181387181388181389181390181391181392181393181394181395181396181397181398181399181400181401181402181403181404181405181406181407181408181409181410181411181412181413181414181415181416181417181418181419181420181421181422181423181424181425181426181427181428181429181430181431181432181433181434181435181436181437181438181439181440181441181442181443181444181445181446181447181448181449181450181451181452181453181454181455181456181457181458181459181460181461181462181463181464181465181466181467181468181469181470181471181472181473181474181475181476181477181478181479181480181481181482181483181484181485181486181487181488181489181490181491181492181493181494181495181496181497181498181499181500181501181502181503181504181505181506181507181508181509181510181511181512181513181514181515181516181517181518181519181520181521181522181523181524181525181526181527181528181529181530181531181532181533181534181535181536181537181538181539181540181541181542181543181544181545181546181547181548181549181550181551181552181553181554181555181556181557181558181559181560181561181562181563181564181565181566181567181568181569181570181571181572181573181574181575181576181577181578181579181580181581181582181583181584181585181586181587181588181589181590181591181592181593181594181595181596181597181598181599181600181601181602181603181604181605181606181607181608181609181610181611181612181613181614181615181616181617181618181619181620181621181622181623181624181625181626181627181628181629181630181631181632181633181634181635181636181637181638181639181640181641181642181643181644181645181646181647181648181649181650181651181652181653181654181655181656181657181658181659181660181661181662181663181664181665181666181667181668181669181670181671181672181673181674181675181676181677181678181679181680181681181682181683181684181685181686181687181688181689181690181691181692181693181694181695181696181697181698181699181700181701181702181703181704181705181706181707181708181709181710181711181712181713181714181715181716181717181718181719181720181721181722181723181724181725181726181727181728181729181730181731181732181733181734181735181736181737181738181739181740181741181742181743181744181745181746181747181748181749181750181751181752181753181754181755181756181757181758181759181760181761181762181763181764181765181766181767181768181769181770181771181772181773181774181775181776181777181778181779181780181781181782181783181784181785181786181787181788181789181790181791181792181793181794181795181796181797181798181799181800181801181802181803181804181805181806181807181808181809181810181811181812181813181814181815181816181817181818181819181820181821181822181823181824181825181826181827181828181829181830181831181832181833181834181835181836181837181838181839181840181841181842181843181844181845181846181847181848181849181850181851181852181853181854181855181856181857181858181859181860181861181862181863181864181865181866181867181868181869181870181871181872181873181874181875181876181877181878181879181880181881181882181883181884181885181886181887181888181889181890181891181892181893181894181895181896181897181898181899181900181901181902181903181904181905181906181907181908181909181910181911181912181913181914181915181916181917181918181919181920181921181922181923181924181925181926181927181928181929181930181931181932181933181934181935181936181937181938181939181940181941181942181943181944181945181946181947181948181949181950181951181952181953181954181955181956181957181958181959181960181961181962181963181964181965181966181967181968181969181970181971181972181973181974181975181976181977181978181979181980181981181982181983181984181985181986181987181988181989181990181991181992181993181994181995181996181997181998181999182000182001182002182003182004182005182006182007182008182009182010182011182012182013182014182015182016182017182018182019182020182021182022182023182024182025182026182027182028182029182030182031182032182033182034182035182036182037182038182039182040182041182042182043182044182045182046182047182048182049182050182051182052182053182054182055182056182057182058182059182060182061182062182063182064182065182066182067182068182069182070182071182072182073182074182075182076182077182078182079182080182081182082182083182084182085182086182087182088182089182090182091182092182093182094182095182096182097182098182099182100182101182102182103182104182105182106182107182108182109182110182111182112182113182114182115182116182117182118182119182120182121182122182123182124182125182126182127182128182129182130182131182132182133182134182135182136182137182138182139182140182141182142182143182144182145182146182147182148182149182150182151182152182153182154182155182156182157182158182159182160182161182162182163182164182165182166182167182168182169182170182171182172182173182174182175182176182177182178182179182180182181182182182183182184182185182186182187182188182189182190182191182192182193182194182195182196182197182198182199182200182201182202182203182204182205182206182207182208182209182210182211182212182213182214182215182216182217182218182219182220182221182222182223182224182225182226182227182228182229182230182231182232182233182234182235182236182237182238182239182240182241182242182243182244182245182246182247182248182249182250182251182252182253182254182255182256182257182258182259182260182261182262182263182264182265182266182267182268182269182270182271182272182273182274182275182276182277182278182279182280182281182282182283182284182285182286182287182288182289182290182291182292182293182294182295182296182297182298182299182300182301182302182303182304182305182306182307182308182309182310182311182312182313182314182315182316182317182318182319182320182321182322182323182324182325182326182327182328182329182330182331182332182333182334182335182336182337182338182339182340182341182342182343182344182345182346182347182348182349182350182351182352182353182354182355182356182357182358182359182360182361182362182363182364182365182366182367182368182369182370182371182372182373182374182375182376182377182378182379182380182381182382182383182384182385182386182387182388182389182390182391182392182393182394182395182396182397182398182399182400182401182402182403182404182405182406182407182408182409182410182411182412182413182414182415182416182417182418182419182420182421182422182423182424182425182426182427182428182429182430182431182432182433182434182435182436182437182438182439182440182441182442182443182444182445182446182447182448182449182450182451182452182453182454182455182456182457182458182459182460182461182462182463182464182465182466182467182468182469182470182471182472182473182474182475182476182477182478182479182480182481182482182483182484182485182486182487182488182489182490182491182492182493182494182495182496182497182498182499182500182501182502182503182504182505182506182507182508182509182510182511182512182513182514182515182516182517182518182519182520182521182522182523182524182525182526182527182528182529182530182531182532182533182534182535182536182537182538182539182540182541182542182543182544182545182546182547182548182549182550182551182552182553182554182555182556182557182558182559182560182561182562182563182564182565182566182567182568182569182570182571182572182573182574182575182576182577182578182579182580182581182582182583182584182585182586182587182588182589182590182591182592182593182594182595182596182597182598182599182600182601182602182603182604182605182606182607182608182609182610182611182612182613182614182615182616182617182618182619182620182621182622182623182624182625182626182627182628182629182630182631182632182633182634182635182636182637182638182639182640182641182642182643182644182645182646182647182648182649182650182651182652182653182654182655182656182657182658182659182660182661182662182663182664182665182666182667182668182669182670182671182672182673182674182675182676182677182678182679182680182681182682182683182684182685182686182687182688182689182690182691182692182693182694182695182696182697182698182699182700182701182702182703182704182705182706182707182708182709182710182711182712182713182714182715182716182717182718182719182720182721182722182723182724182725182726182727182728182729182730182731182732182733182734182735182736182737182738182739182740182741182742182743182744182745182746182747182748182749182750182751182752182753182754182755182756182757182758182759182760182761182762182763182764182765182766182767182768182769182770182771182772182773182774182775182776182777182778182779182780182781182782182783182784182785182786182787182788182789182790182791182792182793182794182795182796182797182798182799182800182801182802182803182804182805182806182807182808182809182810182811182812182813182814182815182816182817182818182819182820182821182822182823182824182825182826182827182828182829182830182831182832182833182834182835182836182837182838182839182840182841182842182843182844182845182846182847182848182849182850182851182852182853182854182855182856182857182858182859182860182861182862182863182864182865182866182867182868182869182870182871182872182873182874182875182876182877182878182879182880182881182882182883182884182885182886182887182888182889182890182891182892182893182894182895182896182897182898182899182900182901182902182903182904182905182906182907182908182909182910182911182912182913182914182915182916182917182918182919182920182921182922182923182924182925182926182927182928182929182930182931182932182933182934182935182936182937182938182939182940182941182942182943182944182945182946182947182948182949182950182951182952182953182954182955182956182957182958182959182960182961182962182963182964182965182966182967182968182969182970182971182972182973182974182975182976182977182978182979182980182981182982182983182984182985182986182987182988182989182990182991182992182993182994182995182996182997182998182999183000183001183002183003183004183005183006183007183008183009183010183011183012183013183014183015183016183017183018183019183020183021183022183023183024183025183026183027183028183029183030183031183032183033183034183035183036183037183038183039183040183041183042183043183044183045183046183047183048183049183050183051183052183053183054183055183056183057183058183059183060183061183062183063183064183065183066183067183068183069183070183071183072183073183074183075183076183077183078183079183080183081183082183083183084183085183086183087183088183089183090183091183092183093183094183095183096183097183098183099183100183101183102183103183104183105183106183107183108183109183110183111183112183113183114183115183116183117183118183119183120183121183122183123183124183125183126183127183128183129183130183131183132183133183134183135183136183137183138183139183140183141183142183143183144183145183146183147183148183149183150183151183152183153183154183155183156183157183158183159183160183161183162183163183164183165183166183167183168183169183170183171183172183173183174183175183176183177183178183179183180183181183182183183183184183185183186183187183188183189183190183191183192183193183194183195183196183197183198183199183200183201183202183203183204183205183206183207183208183209183210183211183212183213183214183215183216183217183218183219183220183221183222183223183224183225183226183227183228183229183230183231183232183233183234183235183236183237183238183239183240183241183242183243183244183245183246183247183248183249183250183251183252183253183254183255183256183257183258183259183260183261183262183263183264183265183266183267183268183269183270183271183272183273183274183275183276183277183278183279183280183281183282183283183284183285183286183287183288183289183290183291183292183293183294183295183296183297183298183299183300183301183302183303183304183305183306183307183308183309183310183311183312183313183314183315183316183317183318183319183320183321183322183323183324183325183326183327183328183329183330183331183332183333183334183335183336183337183338183339183340183341183342183343183344183345183346183347183348183349183350183351183352183353183354183355183356183357183358183359183360183361183362183363183364183365183366183367183368183369183370183371183372183373183374183375183376183377183378183379183380183381183382183383183384183385183386183387183388183389183390183391183392183393183394183395183396183397183398183399183400183401183402183403183404183405183406183407183408183409183410183411183412183413183414183415183416183417183418183419183420183421183422183423183424183425183426183427183428183429183430183431183432183433183434183435183436183437183438183439183440183441183442183443183444183445183446183447183448183449183450183451183452183453183454183455183456183457183458183459183460183461183462183463183464183465183466183467183468183469183470183471183472183473183474183475183476183477183478183479183480183481183482183483183484183485183486183487183488183489183490183491183492183493183494183495183496183497183498183499183500183501183502183503183504183505183506183507183508183509183510183511183512183513183514183515183516183517183518183519183520183521183522183523183524183525183526183527183528183529183530183531183532183533183534183535183536183537183538183539183540183541183542183543183544183545183546183547183548183549183550183551183552183553183554183555183556183557183558183559183560183561183562183563183564183565183566183567183568183569183570183571183572183573183574183575183576183577183578183579183580183581183582183583183584183585183586183587183588183589183590183591183592183593183594183595183596183597183598183599183600183601183602183603183604183605183606183607183608183609183610183611183612183613183614183615183616183617183618183619183620183621183622183623183624183625183626183627183628183629183630183631183632183633183634183635183636183637183638183639183640183641183642183643183644183645183646183647183648183649183650183651183652183653183654183655183656183657183658183659183660183661183662183663183664183665183666183667183668183669183670183671183672183673183674183675183676183677183678183679183680183681183682183683183684183685183686183687183688183689183690183691183692183693183694183695183696183697183698183699183700183701183702183703183704183705183706183707183708183709183710183711183712183713183714183715183716183717183718183719183720183721183722183723183724183725183726183727183728183729183730183731183732183733183734183735183736183737183738183739183740183741183742183743183744183745183746183747183748183749183750183751183752183753183754183755183756183757183758183759183760183761183762183763183764183765183766183767183768183769183770183771183772183773183774183775183776183777183778183779183780183781183782183783183784183785183786183787183788183789183790183791183792183793183794183795183796183797183798183799183800183801183802183803183804183805183806183807183808183809183810183811183812183813183814183815183816183817183818183819183820183821183822183823183824183825183826183827183828183829183830183831183832183833183834183835183836183837183838183839183840183841183842183843183844183845183846183847183848183849183850183851183852183853183854183855183856183857183858183859183860183861183862183863183864183865183866183867183868183869183870183871183872183873183874183875183876183877183878183879183880183881183882183883183884183885183886183887183888183889183890183891183892183893183894183895183896183897183898183899183900183901183902183903183904183905183906183907183908183909183910183911183912183913183914183915183916183917183918183919183920183921183922183923183924183925183926183927183928183929183930183931183932183933183934183935183936183937183938183939183940183941183942183943183944183945183946183947183948183949183950183951183952183953183954183955183956183957183958183959183960183961183962183963183964183965183966183967183968183969183970183971183972183973183974183975183976183977183978183979183980183981183982183983183984183985183986183987183988183989183990183991183992183993183994183995183996183997183998183999184000184001184002184003184004184005184006184007184008184009184010184011184012184013184014184015184016184017184018184019184020184021184022184023184024184025184026184027184028184029184030184031184032184033184034184035184036184037184038184039184040184041184042184043184044184045184046184047184048184049184050184051184052184053184054184055184056184057184058184059184060184061184062184063184064184065184066184067184068184069184070184071184072184073184074184075184076184077184078184079184080184081184082184083184084184085184086184087184088184089184090184091184092184093184094184095184096184097184098184099184100184101184102184103184104184105184106184107184108184109184110184111184112184113184114184115184116184117184118184119184120184121184122184123184124184125184126184127184128184129184130184131184132184133184134184135184136184137184138184139184140184141184142184143184144184145184146184147184148184149184150184151184152184153184154184155184156184157184158184159184160184161184162184163184164184165184166184167184168184169184170184171184172184173184174184175184176184177184178184179184180184181184182184183184184184185184186184187184188184189184190184191184192184193184194184195184196184197184198184199184200184201184202184203184204184205184206184207184208184209184210184211184212184213184214184215184216184217184218184219184220184221184222184223184224184225184226184227184228184229184230184231184232184233184234184235184236184237184238184239184240184241184242184243184244184245184246184247184248184249184250184251184252184253184254184255184256184257184258184259184260184261184262184263184264184265184266184267184268184269184270184271184272184273184274184275184276184277184278184279184280184281184282184283184284184285184286184287184288184289184290184291184292184293184294184295184296184297184298184299184300184301184302184303184304184305184306184307184308184309184310184311184312184313184314184315184316184317184318184319184320184321184322184323184324184325184326184327184328184329184330184331184332184333184334184335184336184337184338184339184340184341184342184343184344184345184346184347184348184349184350184351184352184353184354184355184356184357184358184359184360184361184362184363184364184365184366184367184368184369184370184371184372184373184374184375184376184377184378184379184380184381184382184383184384184385184386184387184388184389184390184391184392184393184394184395184396184397184398184399184400184401184402184403184404184405184406184407184408184409184410184411184412184413184414184415184416184417184418184419184420184421184422184423184424184425184426184427184428184429184430184431184432184433184434184435184436184437184438184439184440184441184442184443184444184445184446184447184448184449184450184451184452184453184454184455184456184457184458184459184460184461184462184463184464184465184466184467184468184469184470184471184472184473184474184475184476184477184478184479184480184481184482184483184484184485184486184487184488184489184490184491184492184493184494184495184496184497184498184499184500184501184502184503184504184505184506184507184508184509184510184511184512184513184514184515184516184517184518184519184520184521184522184523184524184525184526184527184528184529184530184531184532184533184534184535184536184537184538184539184540184541184542184543184544184545184546184547184548184549184550184551184552184553184554184555184556184557184558184559184560184561184562184563184564184565184566184567184568184569184570184571184572184573184574184575184576184577184578184579184580184581184582184583184584184585184586184587184588184589184590184591184592184593184594184595184596184597184598184599184600184601184602184603184604184605184606184607184608184609184610184611184612184613184614184615184616184617184618184619184620184621184622184623184624184625184626184627184628184629184630184631184632184633184634184635184636184637184638184639184640184641184642184643184644184645184646184647184648184649184650184651184652184653184654184655184656184657184658184659184660184661184662184663184664184665184666184667184668184669184670184671184672184673184674184675184676184677184678184679184680184681184682184683184684184685184686184687184688184689184690184691184692184693184694184695184696184697184698184699184700184701184702184703184704184705184706184707184708184709184710184711184712184713184714184715184716184717184718184719184720184721184722184723184724184725184726184727184728184729184730184731184732184733184734184735184736184737184738184739184740184741184742184743184744184745184746184747184748184749184750184751184752184753184754184755184756184757184758184759184760184761184762184763184764184765184766184767184768184769184770184771184772184773184774184775184776184777184778184779184780184781184782184783184784184785184786184787184788184789184790184791184792184793184794184795184796184797184798184799184800184801184802184803184804184805184806184807184808184809184810184811184812184813184814184815184816184817184818184819184820184821184822184823184824184825184826184827184828184829184830184831184832184833184834184835184836184837184838184839184840184841184842184843184844184845184846184847184848184849184850184851184852184853184854184855184856184857184858184859184860184861184862184863184864184865184866184867184868184869184870184871184872184873184874184875184876184877184878184879184880184881184882184883184884184885184886184887184888184889184890184891184892184893184894184895184896184897184898184899184900184901184902184903184904184905184906184907184908184909184910184911184912184913184914184915184916184917184918184919184920184921184922184923184924184925184926184927184928184929184930184931184932184933184934184935184936184937184938184939184940184941184942184943184944184945184946184947184948184949184950184951184952184953184954184955184956184957184958184959184960184961184962184963184964184965184966184967184968184969184970184971184972184973184974184975184976184977184978184979184980184981184982184983184984184985184986184987184988184989184990184991184992184993184994184995184996184997184998184999185000185001185002185003185004185005185006185007185008185009185010185011185012185013185014185015185016185017185018185019185020185021185022185023185024185025185026185027185028185029185030185031185032185033185034185035185036185037185038185039185040185041185042185043185044185045185046185047185048185049185050185051185052185053185054185055185056185057185058185059185060185061185062185063185064185065185066185067185068185069185070185071185072185073185074185075185076185077185078185079185080185081185082185083185084185085185086185087185088185089185090185091185092185093185094185095185096185097185098185099185100185101185102185103185104185105185106185107185108185109185110185111185112185113185114185115185116185117185118185119185120185121185122185123185124185125185126185127185128185129185130185131185132185133185134185135185136185137185138185139185140185141185142185143185144185145185146185147185148185149185150185151185152185153185154185155185156185157185158185159185160185161185162185163185164185165185166185167185168185169185170185171185172185173185174185175185176185177185178185179185180185181185182185183185184185185185186185187185188185189185190185191185192185193185194185195185196185197185198185199185200185201185202185203185204185205185206185207185208185209185210185211185212185213185214185215185216185217185218185219185220185221185222185223185224185225185226185227185228185229185230185231185232185233185234185235185236185237185238185239185240185241185242185243185244185245185246185247185248185249185250185251185252185253185254185255185256185257185258185259185260185261185262185263185264185265185266185267185268185269185270185271185272185273185274185275185276185277185278185279185280185281185282185283185284185285185286185287185288185289185290185291185292185293185294185295185296185297185298185299185300185301185302185303185304185305185306185307185308185309185310185311185312185313185314185315185316185317185318185319185320185321185322185323185324185325185326185327185328185329185330185331185332185333185334185335185336185337185338185339185340185341185342185343185344185345185346185347185348185349185350185351185352185353185354185355185356185357185358185359185360185361185362185363185364185365185366185367185368185369185370185371185372185373185374185375185376185377185378185379185380185381185382185383185384185385185386185387185388185389185390185391185392185393185394185395185396185397185398185399185400185401185402185403185404185405185406185407185408185409185410185411185412185413185414185415185416185417185418185419185420185421185422185423185424185425185426185427185428185429185430185431185432185433185434185435185436185437185438185439185440185441185442185443185444185445185446185447185448185449185450185451185452185453185454185455185456185457185458185459185460185461185462185463185464185465185466185467185468185469185470185471185472185473185474185475185476185477185478185479185480185481185482185483185484185485185486185487185488185489185490185491185492185493185494185495185496185497185498185499185500185501185502185503185504185505185506185507185508185509185510185511185512185513185514185515185516185517185518185519185520185521185522185523185524185525185526185527185528185529185530185531185532185533185534185535185536185537185538185539185540185541185542185543185544185545185546185547185548185549185550185551185552185553185554185555185556185557185558185559185560185561185562185563185564185565185566185567185568185569185570185571185572185573185574185575185576185577185578185579185580185581185582185583185584185585185586185587185588185589185590185591185592185593185594185595185596185597185598185599185600185601185602185603185604185605185606185607185608185609185610185611185612185613185614185615185616185617185618185619185620185621185622185623185624185625185626185627185628185629185630185631185632185633185634185635185636185637185638185639185640185641185642185643185644185645185646185647185648185649185650185651185652185653185654185655185656185657185658185659185660185661185662185663185664185665185666185667185668185669185670185671185672185673185674185675185676185677185678185679185680185681185682185683185684185685185686185687185688185689185690185691185692185693185694185695185696185697185698185699185700185701185702185703185704185705185706185707185708185709185710185711185712185713185714185715185716185717185718185719185720185721185722185723185724185725185726185727185728185729185730185731185732185733185734185735185736185737185738185739185740185741185742185743185744185745185746185747185748185749185750185751185752185753185754185755185756185757185758185759185760185761185762185763185764185765185766185767185768185769185770185771185772185773185774185775185776185777185778185779185780185781185782185783185784185785185786185787185788185789185790185791185792185793185794185795185796185797185798185799185800185801185802185803185804185805185806185807185808185809185810185811185812185813185814185815185816185817185818185819185820185821185822185823185824185825185826185827185828185829185830185831185832185833185834185835185836185837185838185839185840185841185842185843185844185845185846185847185848185849185850185851185852185853185854185855185856185857185858185859185860185861185862185863185864185865185866185867185868185869185870185871185872185873185874185875185876185877185878185879185880185881185882185883185884185885185886185887185888185889185890185891185892185893185894185895185896185897185898185899185900185901185902185903185904185905185906185907185908185909185910185911185912185913185914185915185916185917185918185919185920185921185922185923185924185925185926185927185928185929185930185931185932185933185934185935185936185937185938185939185940185941185942185943185944185945185946185947185948185949185950185951185952185953185954185955185956185957185958185959185960185961185962185963185964185965185966185967185968185969185970185971185972185973185974185975185976185977185978185979185980185981185982185983185984185985185986185987185988185989185990185991185992185993185994185995185996185997185998185999186000186001186002186003186004186005186006186007186008186009186010186011186012186013186014186015186016186017186018186019186020186021186022186023186024186025186026186027186028186029186030186031186032186033186034186035186036186037186038186039186040186041186042186043186044186045186046186047186048186049186050186051186052186053186054186055186056186057186058186059186060186061186062186063186064186065186066186067186068186069186070186071186072186073186074186075186076186077186078186079186080186081186082186083186084186085186086186087186088186089186090186091186092186093186094186095186096186097186098186099186100186101186102186103186104186105186106186107186108186109186110186111186112186113186114186115186116186117186118186119186120186121186122186123186124186125186126186127186128186129186130186131186132186133186134186135186136186137186138186139186140186141186142186143186144186145186146186147186148186149186150186151186152186153186154186155186156186157186158186159186160186161186162186163186164186165186166186167186168186169186170186171186172186173186174186175186176186177186178186179186180186181186182186183186184186185186186186187186188186189186190186191186192186193186194186195186196186197186198186199186200186201186202186203186204186205186206186207186208186209186210186211186212186213186214186215186216186217186218186219186220186221186222186223186224186225186226186227186228186229186230186231186232186233186234186235186236186237186238186239186240186241186242186243186244186245186246186247186248186249186250186251186252186253186254186255186256186257186258186259186260186261186262186263186264186265186266186267186268186269186270186271186272186273186274186275186276186277186278186279186280186281186282186283186284186285186286186287186288186289186290186291186292186293186294186295186296186297186298186299186300186301186302186303186304186305186306186307186308186309186310186311186312186313186314186315186316186317186318186319186320186321186322186323186324186325186326186327186328186329186330186331186332186333186334186335186336186337186338186339186340186341186342186343186344186345186346186347186348186349186350186351186352186353186354186355186356186357186358186359186360186361186362186363186364186365186366186367186368186369186370186371186372186373186374186375186376186377186378186379186380186381186382186383186384186385186386186387186388186389186390186391186392186393186394186395186396186397186398186399186400186401186402186403186404186405186406186407186408186409186410186411186412186413186414186415186416186417186418186419186420186421186422186423186424186425186426186427186428186429186430186431186432186433186434186435186436186437186438186439186440186441186442186443186444186445186446186447186448186449186450186451186452186453186454186455186456186457186458186459186460186461186462186463186464186465186466186467186468186469186470186471186472186473186474186475186476186477186478186479186480186481186482186483186484186485186486186487186488186489186490186491186492186493186494186495186496186497186498186499186500186501186502186503186504186505186506186507186508186509186510186511186512186513186514186515186516186517186518186519186520186521186522186523186524186525186526186527186528186529186530186531186532186533186534186535186536186537186538186539186540186541186542186543186544186545186546186547186548186549186550186551186552186553186554186555186556186557186558186559186560186561186562186563186564186565186566186567186568186569186570186571186572186573186574186575186576186577186578186579186580186581186582186583186584186585186586186587186588186589186590186591186592186593186594186595186596186597186598186599186600186601186602186603186604186605186606186607186608186609186610186611186612186613186614186615186616186617186618186619186620186621186622186623186624186625186626186627186628186629186630186631186632186633186634186635186636186637186638186639186640186641186642186643186644186645186646186647186648186649186650186651186652186653186654186655186656186657186658186659186660186661186662186663186664186665186666186667186668186669186670186671186672186673186674186675186676186677186678186679186680186681186682186683186684186685186686186687186688186689186690186691186692186693186694186695186696186697186698186699186700186701186702186703186704186705186706186707186708186709186710186711186712186713186714186715186716186717186718186719186720186721186722186723186724186725186726186727186728186729186730186731186732186733186734186735186736186737186738186739186740186741186742186743186744186745186746186747186748186749186750186751186752186753186754186755186756186757186758186759186760186761186762186763186764186765186766186767186768186769186770186771186772186773186774186775186776186777186778186779186780186781186782186783186784186785186786186787186788186789186790186791186792186793186794186795186796186797186798186799186800186801186802186803186804186805186806186807186808186809186810186811186812186813186814186815186816186817186818186819186820186821186822186823186824186825186826186827186828186829186830186831186832186833186834186835186836186837186838186839186840186841186842186843186844186845186846186847186848186849186850186851186852186853186854186855186856186857186858186859186860186861186862186863186864186865186866186867186868186869186870186871186872186873186874186875186876186877186878186879186880186881186882186883186884186885186886186887186888186889186890186891186892186893186894186895186896186897186898186899186900186901186902186903186904186905186906186907186908186909186910186911186912186913186914186915186916186917186918186919186920186921186922186923186924186925186926186927186928186929186930186931186932186933186934186935186936186937186938186939186940186941186942186943186944186945186946186947186948186949186950186951186952186953186954186955186956186957186958186959186960186961186962186963186964186965186966186967186968186969186970186971186972186973186974186975186976186977186978186979186980186981186982186983186984186985186986186987186988186989186990186991186992186993186994186995186996186997186998186999187000187001187002187003187004187005187006187007187008187009187010187011187012187013187014187015187016187017187018187019187020187021187022187023187024187025187026187027187028187029187030187031187032187033187034187035187036187037187038187039187040187041187042187043187044187045187046187047187048187049187050187051187052187053187054187055187056187057187058187059187060187061187062187063187064187065187066187067187068187069187070187071187072187073187074187075187076187077187078187079187080187081187082187083187084187085187086187087187088187089187090187091187092187093187094187095187096187097187098187099187100187101187102187103187104187105187106187107187108187109187110187111187112187113187114187115187116187117187118187119187120187121187122187123187124187125187126187127187128187129187130187131187132187133187134187135187136187137187138187139187140187141187142187143187144187145187146187147187148187149187150187151187152187153187154187155187156187157187158187159187160187161187162187163187164187165187166187167187168187169187170187171187172187173187174187175187176187177187178187179187180187181187182187183187184187185187186187187187188187189187190187191187192187193187194187195187196187197187198187199187200187201187202187203187204187205187206187207187208187209187210187211187212187213187214187215187216187217187218187219187220187221187222187223187224187225187226187227187228187229187230187231187232187233187234187235187236187237187238187239187240187241187242187243187244187245187246187247187248187249187250187251187252187253187254187255187256187257187258187259187260187261187262187263187264187265187266187267187268187269187270187271187272187273187274187275187276187277187278187279187280187281187282187283187284187285187286187287187288187289187290187291187292187293187294187295187296187297187298187299187300187301187302187303187304187305187306187307187308187309187310187311187312187313187314187315187316187317187318187319187320187321187322187323187324187325187326187327187328187329187330187331187332187333187334187335187336187337187338187339187340187341187342187343187344187345187346187347187348187349187350187351187352187353187354187355187356187357187358187359187360187361187362187363187364187365187366187367187368187369187370187371187372187373187374187375187376187377187378187379187380187381187382187383187384187385187386187387187388187389187390187391187392187393187394187395187396187397187398187399187400187401187402187403187404187405187406187407187408187409187410187411187412187413187414187415187416187417187418187419187420187421187422187423187424187425187426187427187428187429187430187431187432187433187434187435187436187437187438187439187440187441187442187443187444187445187446187447187448187449187450187451187452187453187454187455187456187457187458187459187460187461187462187463187464187465187466187467187468187469187470187471187472187473187474187475187476187477187478187479187480187481187482187483187484187485187486187487187488187489187490187491187492187493187494187495187496187497187498187499187500187501187502187503187504187505187506187507187508187509187510187511187512187513187514187515187516187517187518187519187520187521187522187523187524187525187526187527187528187529187530187531187532187533187534187535187536187537187538187539187540187541187542187543187544187545187546187547187548187549187550187551187552187553187554187555187556187557187558187559187560187561187562187563187564187565187566187567187568187569187570187571187572187573187574187575187576187577187578187579187580187581187582187583187584187585187586187587187588187589187590187591187592187593187594187595187596187597187598187599187600187601187602187603187604187605187606187607187608187609187610187611187612187613187614187615187616187617187618187619187620187621187622187623187624187625187626187627187628187629187630187631187632187633187634187635187636187637187638187639187640187641187642187643187644187645187646187647187648187649187650187651187652187653187654187655187656187657187658187659187660187661187662187663187664187665187666187667187668187669187670187671187672187673187674187675187676187677187678187679187680187681187682187683187684187685187686187687187688187689187690187691187692187693187694187695187696187697187698187699187700187701187702187703187704187705187706187707187708187709187710187711187712187713187714187715187716187717187718187719187720187721187722187723187724187725187726187727187728187729187730187731187732187733187734187735187736187737187738187739187740187741187742187743187744187745187746187747187748187749187750187751187752187753187754187755187756187757187758187759187760187761187762187763187764187765187766187767187768187769187770187771187772187773187774187775187776187777187778187779187780187781187782187783187784187785187786187787187788187789187790187791187792187793187794187795187796187797187798187799187800187801187802187803187804187805187806187807187808187809187810187811187812187813187814187815187816187817187818187819187820187821187822187823187824187825187826187827187828187829187830187831187832187833187834187835187836187837187838187839187840187841187842187843187844187845187846187847187848187849187850187851187852187853187854187855187856187857187858187859187860187861187862187863187864187865187866187867187868187869187870187871187872187873187874187875187876187877187878187879187880187881187882187883187884187885187886187887187888187889187890187891187892187893187894187895187896187897187898187899187900187901187902187903187904187905187906187907187908187909187910187911187912187913187914187915187916187917187918187919187920187921187922187923187924187925187926187927187928187929187930187931187932187933187934187935187936187937187938187939187940187941187942187943187944187945187946187947187948187949187950187951187952187953187954187955187956187957187958187959187960187961187962187963187964187965187966187967187968187969187970187971187972187973187974187975187976187977187978187979187980187981187982187983187984187985187986187987187988187989187990187991187992187993187994187995187996187997187998187999188000188001188002188003188004188005188006188007188008188009188010188011188012188013188014188015188016188017188018188019188020188021188022188023188024188025188026188027188028188029188030188031188032188033188034188035188036188037188038188039188040188041188042188043188044188045188046188047188048188049188050188051188052188053188054188055188056188057188058188059188060188061188062188063188064188065188066188067188068188069188070188071188072188073188074188075188076188077188078188079188080188081188082188083188084188085188086188087188088188089188090188091188092188093188094188095188096188097188098188099188100188101188102188103188104188105188106188107188108188109188110188111188112188113188114188115188116188117188118188119188120188121188122188123188124188125188126188127188128188129188130188131188132188133188134188135188136188137188138188139188140188141188142188143188144188145188146188147188148188149188150188151188152188153188154188155188156188157188158188159188160188161188162188163188164188165188166188167188168188169188170188171188172188173188174188175188176188177188178188179188180188181188182188183188184188185188186188187188188188189188190188191188192188193188194188195188196188197188198188199188200188201188202188203188204188205188206188207188208188209188210188211188212188213188214188215188216188217188218188219188220188221188222188223188224188225188226188227188228188229188230188231188232188233188234188235188236188237188238188239188240188241188242188243188244188245188246188247188248188249188250188251188252188253188254188255188256188257188258188259188260188261188262188263188264188265188266188267188268188269188270188271188272188273188274188275188276188277188278188279188280188281188282188283188284188285188286188287188288188289188290188291188292188293188294188295188296188297188298188299188300188301188302188303188304188305188306188307188308188309188310188311188312188313188314188315188316188317188318188319188320188321188322188323188324188325188326188327188328188329188330188331188332188333188334188335188336188337188338188339188340188341188342188343188344188345188346188347188348188349188350188351188352188353188354188355188356188357188358188359188360188361188362188363188364188365188366188367188368188369188370188371188372188373188374188375188376188377188378188379188380188381188382188383188384188385188386188387188388188389188390188391188392188393188394188395188396188397188398188399188400188401188402188403188404188405188406188407188408188409188410188411188412188413188414188415188416188417188418188419188420188421188422188423188424188425188426188427188428188429188430188431188432188433188434188435188436188437188438188439188440188441188442188443188444188445188446188447188448188449188450188451188452188453188454188455188456188457188458188459188460188461188462188463188464188465188466188467188468188469188470188471188472188473188474188475188476188477188478188479188480188481188482188483188484188485188486188487188488188489188490188491188492188493188494188495188496188497188498188499188500188501188502188503188504188505188506188507188508188509188510188511188512188513188514188515188516188517188518188519188520188521188522188523188524188525188526188527188528188529188530188531188532188533188534188535188536188537188538188539188540188541188542188543188544188545188546188547188548188549188550188551188552188553188554188555188556188557188558188559188560188561188562188563188564188565188566188567188568188569188570188571188572188573188574188575188576188577188578188579188580188581188582188583188584188585188586188587188588188589188590188591188592188593188594188595188596188597188598188599188600188601188602188603188604188605188606188607188608188609188610188611188612188613188614188615188616188617188618188619188620188621188622188623188624188625188626188627188628188629188630188631188632188633188634188635188636188637188638188639188640188641188642188643188644188645188646188647188648188649188650188651188652188653188654188655188656188657188658188659188660188661188662188663188664188665188666188667188668188669188670188671188672188673188674188675188676188677188678188679188680188681188682188683188684188685188686188687188688188689188690188691188692188693188694188695188696188697188698188699188700188701188702188703188704188705188706188707188708188709188710188711188712188713188714188715188716188717188718188719188720188721188722188723188724188725188726188727188728188729188730188731188732188733188734188735188736188737188738188739188740188741188742188743188744188745188746188747188748188749188750188751188752188753188754188755188756188757188758188759188760188761188762188763188764188765188766188767188768188769188770188771188772188773188774188775188776188777188778188779188780188781188782188783188784188785188786188787188788188789188790188791188792188793188794188795188796188797188798188799188800188801188802188803188804188805188806188807188808188809188810188811188812188813188814188815188816188817188818188819188820188821188822188823188824188825188826188827188828188829188830188831188832188833188834188835188836188837188838188839188840188841188842188843188844188845188846188847188848188849188850188851188852188853188854188855188856188857188858188859188860188861188862188863188864188865188866188867188868188869188870188871188872188873188874188875188876188877188878188879188880188881188882188883188884188885188886188887188888188889188890188891188892188893188894188895188896188897188898188899188900188901188902188903188904188905188906188907188908188909188910188911188912188913188914188915188916188917188918188919188920188921188922188923188924188925188926188927188928188929188930188931188932188933188934188935188936188937188938188939188940188941188942188943188944188945188946188947188948188949188950188951188952188953188954188955188956188957188958188959188960188961188962188963188964188965188966188967188968188969188970188971188972188973188974188975188976188977188978188979188980188981188982188983188984188985188986188987188988188989188990188991188992188993188994188995188996188997188998188999189000189001189002189003189004189005189006189007189008189009189010189011189012189013189014189015189016189017189018189019189020189021189022189023189024189025189026189027189028189029189030189031189032189033189034189035189036189037189038189039189040189041189042189043189044189045189046189047189048189049189050189051189052189053189054189055189056189057189058189059189060189061189062189063189064189065189066189067189068189069189070189071189072189073189074189075189076189077189078189079189080189081189082189083189084189085189086189087189088189089189090189091189092189093189094189095189096189097189098189099189100189101189102189103189104189105189106189107189108189109189110189111189112189113189114189115189116189117189118189119189120189121189122189123189124189125189126189127189128189129189130189131189132189133189134189135189136189137189138189139189140189141189142189143189144189145189146189147189148189149189150189151189152189153189154189155189156189157189158189159189160189161189162189163189164189165189166189167189168189169189170189171189172189173189174189175189176189177189178189179189180189181189182189183189184189185189186189187189188189189189190189191189192189193189194189195189196189197189198189199189200189201189202189203189204189205189206189207189208189209189210189211189212189213189214189215189216189217189218189219189220189221189222189223189224189225189226189227189228189229189230189231189232189233189234189235189236189237189238189239189240189241189242189243189244189245189246189247189248189249189250189251189252189253189254189255189256189257189258189259189260189261189262189263189264189265189266189267189268189269189270189271189272189273189274189275189276189277189278189279189280189281189282189283189284189285189286189287189288189289189290189291189292189293189294189295189296189297189298189299189300189301189302189303189304189305189306189307189308189309189310189311189312189313189314189315189316189317189318189319189320189321189322189323189324189325189326189327189328189329189330189331189332189333189334189335189336189337189338189339189340189341189342189343189344189345189346189347189348189349189350189351189352189353189354189355189356189357189358189359189360189361189362189363189364189365189366189367189368189369189370189371189372189373189374189375189376189377189378189379189380189381189382189383189384189385189386189387189388189389189390189391189392189393189394189395189396189397189398189399189400189401189402189403189404189405189406189407189408189409189410189411189412189413189414189415189416189417189418189419189420189421189422189423189424189425189426189427189428189429189430189431189432189433189434189435189436189437189438189439189440189441189442189443189444189445189446189447189448189449189450189451189452189453189454189455189456189457189458189459189460189461189462189463189464189465189466189467189468189469189470189471189472189473189474189475189476189477189478189479189480189481189482189483189484189485189486189487189488189489189490189491189492189493189494189495189496189497189498189499189500189501189502189503189504189505189506189507189508189509189510189511189512189513189514189515189516189517189518189519189520189521189522189523189524189525189526189527189528189529189530189531189532189533189534189535189536189537189538189539189540189541189542189543189544189545189546189547189548189549189550189551189552189553189554189555189556189557189558189559189560189561189562189563189564189565189566189567189568189569189570189571189572189573189574189575189576189577189578189579189580189581189582189583189584189585189586189587189588189589189590189591189592189593189594189595189596189597189598189599189600189601189602189603189604189605189606189607189608189609189610189611189612189613189614189615189616189617189618189619189620189621189622189623189624189625189626189627189628189629189630189631189632189633189634189635189636189637189638189639189640189641189642189643189644189645189646189647189648189649189650189651189652189653189654189655189656189657189658189659189660189661189662189663189664189665189666189667189668189669189670189671189672189673189674189675189676189677189678189679189680189681189682189683189684189685189686189687189688189689189690189691189692189693189694189695189696189697189698189699189700189701189702189703189704189705189706189707189708189709189710189711189712189713189714189715189716189717189718189719189720189721189722189723189724189725189726189727189728189729189730189731189732189733189734189735189736189737189738189739189740189741189742189743189744189745189746189747189748189749189750189751189752189753189754189755189756189757189758189759189760189761189762189763189764189765189766189767189768189769189770189771189772189773189774189775189776189777189778189779189780189781189782189783189784189785189786189787189788189789189790189791189792189793189794189795189796189797189798189799189800189801189802189803189804189805189806189807189808189809189810189811189812189813189814189815189816189817189818189819189820189821189822189823189824189825189826189827189828189829189830189831189832189833189834189835189836189837189838189839189840189841189842189843189844189845189846189847189848189849189850189851189852189853189854189855189856189857189858189859189860189861189862189863189864189865189866189867189868189869189870189871189872189873189874189875189876189877189878189879189880189881189882189883189884189885189886189887189888189889189890189891189892189893189894189895189896189897189898189899189900189901189902189903189904189905189906189907189908189909189910189911189912189913189914189915189916189917189918189919189920189921189922189923189924189925189926189927189928189929189930189931189932189933189934189935189936189937189938189939189940189941189942189943189944189945189946189947189948189949189950189951189952189953189954189955189956189957189958189959189960189961189962189963189964189965189966189967189968189969189970189971189972189973189974189975189976189977189978189979189980189981189982189983189984189985189986189987189988189989189990189991189992189993189994189995189996189997189998189999190000190001190002190003190004190005190006190007190008190009190010190011190012190013190014190015190016190017190018190019190020190021190022190023190024190025190026190027190028190029190030190031190032190033190034190035190036190037190038190039190040190041190042190043190044190045190046190047190048190049190050190051190052190053190054190055190056190057190058190059190060190061190062190063190064190065190066190067190068190069190070190071190072190073190074190075190076190077190078190079190080190081190082190083190084190085190086190087190088190089190090190091190092190093190094190095190096190097190098190099190100190101190102190103190104190105190106190107190108190109190110190111190112190113190114190115190116190117190118190119190120190121190122190123190124190125190126190127190128190129190130190131190132190133190134190135190136190137190138190139190140190141190142190143190144190145190146190147190148190149190150190151190152190153190154190155190156190157190158190159190160190161190162190163190164190165190166190167190168190169190170190171190172190173190174190175190176190177190178190179190180190181190182190183190184190185190186190187190188190189190190190191190192190193190194190195190196190197190198190199190200190201190202190203190204190205190206190207190208190209190210190211190212190213190214190215190216190217190218190219190220190221190222190223190224190225190226190227190228190229190230190231190232190233190234190235190236190237190238190239190240190241190242190243190244190245190246190247190248190249190250190251190252190253190254190255190256190257190258190259190260190261190262190263190264190265190266190267190268190269190270190271190272190273190274190275190276190277190278190279190280190281190282190283190284190285190286190287190288190289190290190291190292190293190294190295190296190297190298190299190300190301190302190303190304190305190306190307190308190309190310190311190312190313190314190315190316190317190318190319190320190321190322190323190324190325190326190327190328190329190330190331190332190333190334190335190336190337190338190339190340190341190342190343190344190345190346190347190348190349190350190351190352190353190354190355190356190357190358190359190360190361190362190363190364190365190366190367190368190369190370190371190372190373190374190375190376190377190378190379190380190381190382190383190384190385190386190387190388190389190390190391190392190393190394190395190396190397190398190399190400190401190402190403190404190405190406190407190408190409190410190411190412190413190414190415190416190417190418190419190420190421190422190423190424190425190426190427190428190429190430190431190432190433190434190435190436190437190438190439190440190441190442190443190444190445190446190447190448190449190450190451190452190453190454190455190456190457190458190459190460190461190462190463190464190465190466190467190468190469190470190471190472190473190474190475190476190477190478190479190480190481190482190483190484190485190486190487190488190489190490190491190492190493190494190495190496190497190498190499190500190501190502190503190504190505190506190507190508190509190510190511190512190513190514190515190516190517190518190519190520190521190522190523190524190525190526190527190528190529190530190531190532190533190534190535190536190537190538190539190540190541190542190543190544190545190546190547190548190549190550190551190552190553190554190555190556190557190558190559190560190561190562190563190564190565190566190567190568190569190570190571190572190573190574190575190576190577190578190579190580190581190582190583190584190585190586190587190588190589190590190591190592190593190594190595190596190597190598190599190600190601190602190603190604190605190606190607190608190609190610190611190612190613190614190615190616190617190618190619190620190621190622190623190624190625190626190627190628190629190630190631190632190633190634190635190636190637190638190639190640190641190642190643190644190645190646190647190648190649190650190651190652190653190654190655190656190657190658190659190660190661190662190663190664190665190666190667190668190669190670190671190672190673190674190675190676190677190678190679190680190681190682190683190684190685190686190687190688190689190690190691190692190693190694190695190696190697190698190699190700190701190702190703190704190705190706190707190708190709190710190711190712190713190714190715190716190717190718190719190720190721190722190723190724190725190726190727190728190729190730190731190732190733190734190735190736190737190738190739190740190741190742190743190744190745190746190747190748190749190750190751190752190753190754190755190756190757190758190759190760190761190762190763190764190765190766190767190768190769190770190771190772190773190774190775190776190777190778190779190780190781190782190783190784190785190786190787190788190789190790190791190792190793190794190795190796190797190798190799190800190801190802190803190804190805190806190807190808190809190810190811190812190813190814190815190816190817190818190819190820190821190822190823190824190825190826190827190828190829190830190831190832190833190834190835190836190837190838190839190840190841190842190843190844190845190846190847190848190849190850190851190852190853190854190855190856190857190858190859190860190861190862190863190864190865190866190867190868190869190870190871190872190873190874190875190876190877190878190879190880190881190882190883190884190885190886190887190888190889190890190891190892190893190894190895190896190897190898190899190900190901190902190903190904190905190906190907190908190909190910190911190912190913190914190915190916190917190918190919190920190921190922190923190924190925190926190927190928190929190930190931190932190933190934190935190936190937190938190939190940190941190942190943190944190945190946190947190948190949190950190951190952190953190954190955190956190957190958190959190960190961190962190963190964190965190966190967190968190969190970190971190972190973190974190975190976190977190978190979190980190981190982190983190984190985190986190987190988190989190990190991190992190993190994190995190996190997190998190999191000191001191002191003191004191005191006191007191008191009191010191011191012191013191014191015191016191017191018191019191020191021191022191023191024191025191026191027191028191029191030191031191032191033191034191035191036191037191038191039191040191041191042191043191044191045191046191047191048191049191050191051191052191053191054191055191056191057191058191059191060191061191062191063191064191065191066191067191068191069191070191071191072191073191074191075191076191077191078191079191080191081191082191083191084191085191086191087191088191089191090191091191092191093191094191095191096191097191098191099191100191101191102191103191104191105191106191107191108191109191110191111191112191113191114191115191116191117191118191119191120191121191122191123191124191125191126191127191128191129191130191131191132191133191134191135191136191137191138191139191140191141191142191143191144191145191146191147191148191149191150191151191152191153191154191155191156191157191158191159191160191161191162191163191164191165191166191167191168191169191170191171191172191173191174191175191176191177191178191179191180191181191182191183191184191185191186191187191188191189191190191191191192191193191194191195191196191197191198191199191200191201191202191203191204191205191206191207191208191209191210191211191212191213191214191215191216191217191218191219191220191221191222191223191224191225191226191227191228191229191230191231191232191233191234191235191236191237191238191239191240191241191242191243191244191245191246191247191248191249191250191251191252191253191254191255191256191257191258191259191260191261191262191263191264191265191266191267191268191269191270191271191272191273191274191275191276191277191278191279191280191281191282191283191284191285191286191287191288191289191290191291191292191293191294191295191296191297191298191299191300191301191302191303191304191305191306191307191308191309191310191311191312191313191314191315191316191317191318191319191320191321191322191323191324191325191326191327191328191329191330191331191332191333191334191335191336191337191338191339191340191341191342191343191344191345191346191347191348191349191350191351191352191353191354191355191356191357191358191359191360191361191362191363191364191365191366191367191368191369191370191371191372191373191374191375191376191377191378191379191380191381191382191383191384191385191386191387191388191389191390191391191392191393191394191395191396191397191398191399191400191401191402191403191404191405191406191407191408191409191410191411191412191413191414191415191416191417191418191419191420191421191422191423191424191425191426191427191428191429191430191431191432191433191434191435191436191437191438191439191440191441191442191443191444191445191446191447191448191449191450191451191452191453191454191455191456191457191458191459191460191461191462191463191464191465191466191467191468191469191470191471191472191473191474191475191476191477191478191479191480191481191482191483191484191485191486191487191488191489191490191491191492191493191494191495191496191497191498191499191500191501191502191503191504191505191506191507191508191509191510191511191512191513191514191515191516191517191518191519191520191521191522191523191524191525191526191527191528191529191530191531191532191533191534191535191536191537191538191539191540191541191542191543191544191545191546191547191548191549191550191551191552191553191554191555191556191557191558191559191560191561191562191563191564191565191566191567191568191569191570191571191572191573191574191575191576191577191578191579191580191581191582191583191584191585191586191587191588191589191590191591191592191593191594191595191596191597191598191599191600191601191602191603191604191605191606191607191608191609191610191611191612191613191614191615191616191617191618191619191620191621191622191623191624191625191626191627191628191629191630191631191632191633191634191635191636191637191638191639191640191641191642191643191644191645191646191647191648191649191650191651191652191653191654191655191656191657191658191659191660191661191662191663191664191665191666191667191668191669191670191671191672191673191674191675191676191677191678191679191680191681191682191683191684191685191686191687191688191689191690191691191692191693191694191695191696191697191698191699191700191701191702191703191704191705191706191707191708191709191710191711191712191713191714191715191716191717191718191719191720191721191722191723191724191725191726191727191728191729191730191731191732191733191734191735191736191737191738191739191740191741191742191743191744191745191746191747191748191749191750191751191752191753191754191755191756191757191758191759191760191761191762191763191764191765191766191767191768191769191770191771191772191773191774191775191776191777191778191779191780191781191782191783191784191785191786191787191788191789191790191791191792191793191794191795191796191797191798191799191800191801191802191803191804191805191806191807191808191809191810191811191812191813191814191815191816191817191818191819191820191821191822191823191824191825191826191827191828191829191830191831191832191833191834191835191836191837191838191839191840191841191842191843191844191845191846191847191848191849191850191851191852191853191854191855191856191857191858191859191860191861191862191863191864191865191866191867191868191869191870191871191872191873191874191875191876191877191878191879191880191881191882191883191884191885191886191887191888191889191890191891191892191893191894191895191896191897191898191899191900191901191902191903191904191905191906191907191908191909191910191911191912191913191914191915191916191917191918191919191920191921191922191923191924191925191926191927191928191929191930191931191932191933191934191935191936191937191938191939191940191941191942191943191944191945191946191947191948191949191950191951191952191953191954191955191956191957191958191959191960191961191962191963191964191965191966191967191968191969191970191971191972191973191974191975191976191977191978191979191980191981191982191983191984191985191986191987191988191989191990191991191992191993191994191995191996191997191998191999192000192001192002192003192004192005192006192007192008192009192010192011192012192013192014192015192016192017192018192019192020192021192022192023192024192025192026192027192028192029192030192031192032192033192034192035192036192037192038192039192040192041192042192043192044192045192046192047192048192049192050192051192052192053192054192055192056192057192058192059192060192061192062192063192064192065192066192067192068192069192070192071192072192073192074192075192076192077192078192079192080192081192082192083192084192085192086192087192088192089192090192091192092192093192094192095192096192097192098192099192100192101192102192103192104192105192106192107192108192109192110192111192112192113192114192115192116192117192118192119192120192121192122192123192124192125192126192127192128192129192130192131192132192133192134192135192136192137192138192139192140192141192142192143192144192145192146192147192148192149192150192151192152192153192154192155192156192157192158192159192160192161192162192163192164192165192166192167192168192169192170192171192172192173192174192175192176192177192178192179192180192181192182192183192184192185192186192187192188192189192190192191192192192193192194192195192196192197192198192199192200192201192202192203192204192205192206192207192208192209192210192211192212192213192214192215192216192217192218192219192220192221192222192223192224192225192226192227192228192229192230192231192232192233192234192235192236192237192238192239192240192241192242192243192244192245192246192247192248192249192250192251192252192253192254192255192256192257192258192259192260192261192262192263192264192265192266192267192268192269192270192271192272192273192274192275192276192277192278192279192280192281192282192283192284192285192286192287192288192289192290192291192292192293192294192295192296192297192298192299192300192301192302192303192304192305192306192307192308192309192310192311192312192313192314192315192316192317192318192319192320192321192322192323192324192325192326192327192328192329192330192331192332192333192334192335192336192337192338192339192340192341192342192343192344192345192346192347192348192349192350192351192352192353192354192355192356192357192358192359192360192361192362192363192364192365192366192367192368192369192370192371192372192373192374192375192376192377192378192379192380192381192382192383192384192385192386192387192388192389192390192391192392192393192394192395192396192397192398192399192400192401192402192403192404192405192406192407192408192409192410192411192412192413192414192415192416192417192418192419192420192421192422192423192424192425192426192427192428192429192430192431192432192433192434192435192436192437192438192439192440192441192442192443192444192445192446192447192448192449192450192451192452192453192454192455192456192457192458192459192460192461192462192463192464192465192466192467192468192469192470192471192472192473192474192475192476192477192478192479192480192481192482192483192484192485192486192487192488192489192490192491192492192493192494192495192496192497192498192499192500192501192502192503192504192505192506192507192508192509192510192511192512192513192514192515192516192517192518192519192520192521192522192523192524192525192526192527192528192529192530192531192532192533192534192535192536192537192538192539192540192541192542192543192544192545192546192547192548192549192550192551192552192553192554192555192556192557192558192559192560192561192562192563192564192565192566192567192568192569192570192571192572192573192574192575192576192577192578192579192580192581192582192583192584192585192586192587192588192589192590192591192592192593192594192595192596192597192598192599192600192601192602192603192604192605192606192607192608192609192610192611192612192613192614192615192616192617192618192619192620192621192622192623192624192625192626192627192628192629192630192631192632192633192634192635192636192637192638192639192640192641192642192643192644192645192646192647192648192649192650192651192652192653192654192655192656192657192658192659192660192661192662192663192664192665192666192667192668192669192670192671192672192673192674192675192676192677192678192679192680192681192682192683192684192685192686192687192688192689192690192691192692192693192694192695192696192697192698192699192700192701192702192703192704192705192706192707192708192709192710192711192712192713192714192715192716192717192718192719192720192721192722192723192724192725192726192727192728192729192730192731192732192733192734192735192736192737192738192739192740192741192742192743192744192745192746192747192748192749192750192751192752192753192754192755192756192757192758192759192760192761192762192763192764192765192766192767192768192769192770192771192772192773192774192775192776192777192778192779192780192781192782192783192784192785192786192787192788192789192790192791192792192793192794192795192796192797192798192799192800192801192802192803192804192805192806192807192808192809192810192811192812192813192814192815192816192817192818192819192820192821192822192823192824192825192826192827192828192829192830192831192832192833192834192835192836192837192838192839192840192841192842192843192844192845192846192847192848192849192850192851192852192853192854192855192856192857192858192859192860192861192862192863192864192865192866192867192868192869192870192871192872192873192874192875192876192877192878192879192880192881192882192883192884192885192886192887192888192889192890192891192892192893192894192895192896192897192898192899192900192901192902192903192904192905192906192907192908192909192910192911192912192913192914192915192916192917192918192919192920192921192922192923192924192925192926192927192928192929192930192931192932192933192934192935192936192937192938192939192940192941192942192943192944192945192946192947192948192949192950192951192952192953192954192955192956192957192958192959192960192961192962192963192964192965192966192967192968192969192970192971192972192973192974192975192976192977192978192979192980192981192982192983192984192985192986192987192988192989192990192991192992192993192994192995192996192997192998192999193000193001193002193003193004193005193006193007193008193009193010193011193012193013193014193015193016193017193018193019193020193021193022193023193024193025193026193027193028193029193030193031193032193033193034193035193036193037193038193039193040193041193042193043193044193045193046193047193048193049193050193051193052193053193054193055193056193057193058193059193060193061193062193063193064193065193066193067193068193069193070193071193072193073193074193075193076193077193078193079193080193081193082193083193084193085193086193087193088193089193090193091193092193093193094193095193096193097193098193099193100193101193102193103193104193105193106193107193108193109193110193111193112193113193114193115193116193117193118193119193120193121193122193123193124193125193126193127193128193129193130193131193132193133193134193135193136193137193138193139193140193141193142193143193144193145193146193147193148193149193150193151193152193153193154193155193156193157193158193159193160193161193162193163193164193165193166193167193168193169193170193171193172193173193174193175193176193177193178193179193180193181193182193183193184193185193186193187193188193189193190193191193192193193193194193195193196193197193198193199193200193201193202193203193204193205193206193207193208193209193210193211193212193213193214193215193216193217193218193219193220193221193222193223193224193225193226193227193228193229193230193231193232193233193234193235193236193237193238193239193240193241193242193243193244193245193246193247193248193249193250193251193252193253193254193255193256193257193258193259193260193261193262193263193264193265193266193267193268193269193270193271193272193273193274193275193276193277193278193279193280193281193282193283193284193285193286193287193288193289193290193291193292193293193294193295193296193297193298193299193300193301193302193303193304193305193306193307193308193309193310193311193312193313193314193315193316193317193318193319193320193321193322193323193324193325193326193327193328193329193330193331193332193333193334193335193336193337193338193339193340193341193342193343193344193345193346193347193348193349193350193351193352193353193354193355193356193357193358193359193360193361193362193363193364193365193366193367193368193369193370193371193372193373193374193375193376193377193378193379193380193381193382193383193384193385193386193387193388193389193390193391193392193393193394193395193396193397193398193399193400193401193402193403193404193405193406193407193408193409193410193411193412193413193414193415193416193417193418193419193420193421193422193423193424193425193426193427193428193429193430193431193432193433193434193435193436193437193438193439193440193441193442193443193444193445193446193447193448193449193450193451193452193453193454193455193456193457193458193459193460193461193462193463193464193465193466193467193468193469193470193471193472193473193474193475193476193477193478193479193480193481193482193483193484193485193486193487193488193489193490193491193492193493193494193495193496193497193498193499193500193501193502193503193504193505193506193507193508193509193510193511193512193513193514193515193516193517193518193519193520193521193522193523193524193525193526193527193528193529193530193531193532193533193534193535193536193537193538193539193540193541193542193543193544193545193546193547193548193549193550193551193552193553193554193555193556193557193558193559193560193561193562193563193564193565193566193567193568193569193570193571193572193573193574193575193576193577193578193579193580193581193582193583193584193585193586193587193588193589193590193591193592193593193594193595193596193597193598193599193600193601193602193603193604193605193606193607193608193609193610193611193612193613193614193615193616193617193618193619193620193621193622193623193624193625193626193627193628193629193630193631193632193633193634193635193636193637193638193639193640193641193642193643193644193645193646193647193648193649193650193651193652193653193654193655193656193657193658193659193660193661193662193663193664193665193666193667193668193669193670193671193672193673193674193675193676193677193678193679193680193681193682193683193684193685193686193687193688193689193690193691193692193693193694193695193696193697193698193699193700193701193702193703193704193705193706193707193708193709193710193711193712193713193714193715193716193717193718193719193720193721193722193723193724193725193726193727193728193729193730193731193732193733193734193735193736193737193738193739193740193741193742193743193744193745193746193747193748193749193750193751193752193753193754193755193756193757193758193759193760193761193762193763193764193765193766193767193768193769193770193771193772193773193774193775193776193777193778193779193780193781193782193783193784193785193786193787193788193789193790193791193792193793193794193795193796193797193798193799193800193801193802193803193804193805193806193807193808193809193810193811193812193813193814193815193816193817193818193819193820193821193822193823193824193825193826193827193828193829193830193831193832193833193834193835193836193837193838193839193840193841193842193843193844193845193846193847193848193849193850193851193852193853193854193855193856193857193858193859193860193861193862193863193864193865193866193867193868193869193870193871193872193873193874193875193876193877193878193879193880193881193882193883193884193885193886193887193888193889193890193891193892193893193894193895193896193897193898193899193900193901193902193903193904193905193906193907193908193909193910193911193912193913193914193915193916193917193918193919193920193921193922193923193924193925193926193927193928193929193930193931193932193933193934193935193936193937193938193939193940193941193942193943193944193945193946193947193948193949193950193951193952193953193954193955193956193957193958193959193960193961193962193963193964193965193966193967193968193969193970193971193972193973193974193975193976193977193978193979193980193981193982193983193984193985193986193987193988193989193990193991193992193993193994193995193996193997193998193999194000194001194002194003194004194005194006194007194008194009194010194011194012194013194014194015194016194017194018194019194020194021194022194023194024194025194026194027194028194029194030194031194032194033194034194035194036194037194038194039194040194041194042194043194044194045194046194047194048194049194050194051194052194053194054194055194056194057194058194059194060194061194062194063194064194065194066194067194068194069194070194071194072194073194074194075194076194077194078194079194080194081194082194083194084194085194086194087194088194089194090194091194092194093194094194095194096194097194098194099194100194101194102194103194104194105194106194107194108194109194110194111194112194113194114194115194116194117194118194119194120194121194122194123194124194125194126194127194128194129194130194131194132194133194134194135194136194137194138194139194140194141194142194143194144194145194146194147194148194149194150194151194152194153194154194155194156194157194158194159194160194161194162194163194164194165194166194167194168194169194170194171194172194173194174194175194176194177194178194179194180194181194182194183194184194185194186194187194188194189194190194191194192194193194194194195194196194197194198194199194200194201194202194203194204194205194206194207194208194209194210194211194212194213194214194215194216194217194218194219194220194221194222194223194224194225194226194227194228194229194230194231194232194233194234194235194236194237194238194239194240194241194242194243194244194245194246194247194248194249194250194251194252194253194254194255194256194257194258194259194260194261194262194263194264194265194266194267194268194269194270194271194272194273194274194275194276194277194278194279194280194281194282194283194284194285194286194287194288194289194290194291194292194293194294194295194296194297194298194299194300194301194302194303194304194305194306194307194308194309194310194311194312194313194314194315194316194317194318194319194320194321194322194323194324194325194326194327194328194329194330194331194332194333194334194335194336194337194338194339194340194341194342194343194344194345194346194347194348194349194350194351194352194353194354194355194356194357194358194359194360194361194362194363194364194365194366194367194368194369194370194371194372194373194374194375194376194377194378194379194380194381194382194383194384194385194386194387194388194389194390194391194392194393194394194395194396194397194398194399194400194401194402194403194404194405194406194407194408194409194410194411194412194413194414194415194416194417194418194419194420194421194422194423194424194425194426194427194428194429194430194431194432194433194434194435194436194437194438194439194440194441194442194443194444194445194446194447194448194449194450194451194452194453194454194455194456194457194458194459194460194461194462194463194464194465194466194467194468194469194470194471194472194473194474194475194476194477194478194479194480194481194482194483194484194485194486194487194488194489194490194491194492194493194494194495194496194497194498194499194500194501194502194503194504194505194506194507194508194509194510194511194512194513194514194515194516194517194518194519194520194521194522194523194524194525194526194527194528194529194530194531194532194533194534194535194536194537194538194539194540194541194542194543194544194545194546194547194548194549194550194551194552194553194554194555194556194557194558194559194560194561194562194563194564194565194566194567194568194569194570194571194572194573194574194575194576194577194578194579194580194581194582194583194584194585194586194587194588194589194590194591194592194593194594194595194596194597194598194599194600194601194602194603194604194605194606194607194608194609194610194611194612194613194614194615194616194617194618194619194620194621194622194623194624194625194626194627194628194629194630194631194632194633194634194635194636194637194638194639194640194641194642194643194644194645194646194647194648194649194650194651194652194653194654194655194656194657194658194659194660194661194662194663194664194665194666194667194668194669194670194671194672194673194674194675194676194677194678194679194680194681194682194683194684194685194686194687194688194689194690194691194692194693194694194695194696194697194698194699194700194701194702194703194704194705194706194707194708194709194710194711194712194713194714194715194716194717194718194719194720194721194722194723194724194725194726194727194728194729194730194731194732194733194734194735194736194737194738194739194740194741194742194743194744194745194746194747194748194749194750194751194752194753194754194755194756194757194758194759194760194761194762194763194764194765194766194767194768194769194770194771194772194773194774194775194776194777194778194779194780194781194782194783194784194785194786194787194788194789194790194791194792194793194794194795194796194797194798194799194800194801194802194803194804194805194806194807194808194809194810194811194812194813194814194815194816194817194818194819194820194821194822194823194824194825194826194827194828194829194830194831194832194833194834194835194836194837194838194839194840194841194842194843194844194845194846194847194848194849194850194851194852194853194854194855194856194857194858194859194860194861194862194863194864194865194866194867194868194869194870194871194872194873194874194875194876194877194878194879194880194881194882194883194884194885194886194887194888194889194890194891194892194893194894194895194896194897194898194899194900194901194902194903194904194905194906194907194908194909194910194911194912194913194914194915194916194917194918194919194920194921194922194923194924194925194926194927194928194929194930194931194932194933194934194935194936194937194938194939194940194941194942194943194944194945194946194947194948194949194950194951194952194953194954194955194956194957194958194959194960194961194962194963194964194965194966194967194968194969194970194971194972194973194974194975194976194977194978194979194980194981194982194983194984194985194986194987194988194989194990194991194992194993194994194995194996194997194998194999195000195001195002195003195004195005195006195007195008195009195010195011195012195013195014195015195016195017195018195019195020195021195022195023195024195025195026195027195028195029195030195031195032195033195034195035195036195037195038195039195040195041195042195043195044195045195046195047195048195049195050195051195052195053195054195055195056195057195058195059195060195061195062195063195064195065195066195067195068195069195070195071195072195073195074195075195076195077195078195079195080195081195082195083195084195085195086195087195088195089195090195091195092195093195094195095195096195097195098195099195100195101195102195103195104195105195106195107195108195109195110195111195112195113195114195115195116195117195118195119195120195121195122195123195124195125195126195127195128195129195130195131195132195133195134195135195136195137195138195139195140195141195142195143195144195145195146195147195148195149195150195151195152195153195154195155195156195157195158195159195160195161195162195163195164195165195166195167195168195169195170195171195172195173195174195175195176195177195178195179195180195181195182195183195184195185195186195187195188195189195190195191195192195193195194195195195196195197195198195199195200195201195202195203195204195205195206195207195208195209195210195211195212195213195214195215195216195217195218195219195220195221195222195223195224195225195226195227195228195229195230195231195232195233195234195235195236195237195238195239195240195241195242195243195244195245195246195247195248195249195250195251195252195253195254195255195256195257195258195259195260195261195262195263195264195265195266195267195268195269195270195271195272195273195274195275195276195277195278195279195280195281195282195283195284195285195286195287195288195289195290195291195292195293195294195295195296195297195298195299195300195301195302195303195304195305195306195307195308195309195310195311195312195313195314195315195316195317195318195319195320195321195322195323195324195325195326195327195328195329195330195331195332195333195334195335195336195337195338195339195340195341195342195343195344195345195346195347195348195349195350195351195352195353195354195355195356195357195358195359195360195361195362195363195364195365195366195367195368195369195370195371195372195373195374195375195376195377195378195379195380195381195382195383195384195385195386195387195388195389195390195391195392195393195394195395195396195397195398195399195400195401195402195403195404195405195406195407195408195409195410195411195412195413195414195415195416195417195418195419195420195421195422195423195424195425195426195427195428195429195430195431195432195433195434195435195436195437195438195439195440195441195442195443195444195445195446195447195448195449195450195451195452195453195454195455195456195457195458195459195460195461195462195463195464195465195466195467195468195469195470195471195472195473195474195475195476195477195478195479195480195481195482195483195484195485195486195487195488195489195490195491195492195493195494195495195496195497195498195499195500195501195502195503195504195505195506195507195508195509195510195511195512195513195514195515195516195517195518195519195520195521195522195523195524195525195526195527195528195529195530195531195532195533195534195535195536195537195538195539195540195541195542195543195544195545195546195547195548195549195550195551195552195553195554195555195556195557195558195559195560195561195562195563195564195565195566195567195568195569195570195571195572195573195574195575195576195577195578195579195580195581195582195583195584195585195586195587195588195589195590195591195592195593195594195595195596195597195598195599195600195601195602195603195604195605195606195607195608195609195610195611195612195613195614195615195616195617195618195619195620195621195622195623195624195625195626195627195628195629195630195631195632195633195634195635195636195637195638195639195640195641195642195643195644195645195646195647195648195649195650195651195652195653195654195655195656195657195658195659195660195661195662195663195664195665195666195667195668195669195670195671195672195673195674195675195676195677195678195679195680195681195682195683195684195685195686195687195688195689195690195691195692195693195694195695195696195697195698195699195700195701195702195703195704195705195706195707195708195709195710195711195712195713195714195715195716195717195718195719195720195721195722195723195724195725195726195727195728195729195730195731195732195733195734195735195736195737195738195739195740195741195742195743195744195745195746195747195748195749195750195751195752195753195754195755195756195757195758195759195760195761195762195763195764195765195766195767195768195769195770195771195772195773195774195775195776195777195778195779195780195781195782195783195784195785195786195787195788195789195790195791195792195793195794195795195796195797195798195799195800195801195802195803195804195805195806195807195808195809195810195811195812195813195814195815195816195817195818195819195820195821195822195823195824195825195826195827195828195829195830195831195832195833195834195835195836195837195838195839195840195841195842195843195844195845195846195847195848195849195850195851195852195853195854195855195856195857195858195859195860195861195862195863195864195865195866195867195868195869195870195871195872195873195874195875195876195877195878195879195880195881195882195883195884195885195886195887195888195889195890195891195892195893195894195895195896195897195898195899195900195901195902195903195904195905195906195907195908195909195910195911195912195913195914195915195916195917195918195919195920195921195922195923195924195925195926195927195928195929195930195931195932195933195934195935195936195937195938195939195940195941195942195943195944195945195946195947195948195949195950195951195952195953195954195955195956195957195958195959195960195961195962195963195964195965195966195967195968195969195970195971195972195973195974195975195976195977195978195979195980195981195982195983195984195985195986195987195988195989195990195991195992195993195994195995195996195997195998195999196000196001196002196003196004196005196006196007196008196009196010196011196012196013196014196015196016196017196018196019196020196021196022196023196024196025196026196027196028196029196030196031196032196033196034196035196036196037196038196039196040196041196042196043196044196045196046196047196048196049196050196051196052196053196054196055196056196057196058196059196060196061196062196063196064196065196066196067196068196069196070196071196072196073196074196075196076196077196078196079196080196081196082196083196084196085196086196087196088196089196090196091196092196093196094196095196096196097196098196099196100196101196102196103196104196105196106196107196108196109196110196111196112196113196114196115196116196117196118196119196120196121196122196123196124196125196126196127196128196129196130196131196132196133196134196135196136196137196138196139196140196141196142196143196144196145196146196147196148196149196150196151196152196153196154196155196156196157196158196159196160196161196162196163196164196165196166196167196168196169196170196171196172196173196174196175196176196177196178196179196180196181196182196183196184196185196186196187196188196189196190196191196192196193196194196195196196196197196198196199196200196201196202196203196204196205196206196207196208196209196210196211196212196213196214196215196216196217196218196219196220196221196222196223196224196225196226196227196228196229196230196231196232196233196234196235196236196237196238196239196240196241196242196243196244196245196246196247196248196249196250196251196252196253196254196255196256196257196258196259196260196261196262196263196264196265196266196267196268196269196270196271196272196273196274196275196276196277196278196279196280196281196282196283196284196285196286196287196288196289196290196291196292196293196294196295196296196297196298196299196300196301196302196303196304196305196306196307196308196309196310196311196312196313196314196315196316196317196318196319196320196321196322196323196324196325196326196327196328196329196330196331196332196333196334196335196336196337196338196339196340196341196342196343196344196345196346196347196348196349196350196351196352196353196354196355196356196357196358196359196360196361196362196363196364196365196366196367196368196369196370196371196372196373196374196375196376196377196378196379196380196381196382196383196384196385196386196387196388196389196390196391196392196393196394196395196396196397196398196399196400196401196402196403196404196405196406196407196408196409196410196411196412196413196414196415196416196417196418196419196420196421196422196423196424196425196426196427196428196429196430196431196432196433196434196435196436196437196438196439196440196441196442196443196444196445196446196447196448196449196450196451196452196453196454196455196456196457196458196459196460196461196462196463196464196465196466196467196468196469196470196471196472196473196474196475196476196477196478196479196480196481196482196483196484196485196486196487196488196489196490196491196492196493196494196495196496196497196498196499196500196501196502196503196504196505196506196507196508196509196510196511196512196513196514196515196516196517196518196519196520196521196522196523196524196525196526196527196528196529196530196531196532196533196534196535196536196537196538196539196540196541196542196543196544196545196546196547196548196549196550196551196552196553196554196555196556196557196558196559196560196561196562196563196564196565196566196567196568196569196570196571196572196573196574196575196576196577196578196579196580196581196582196583196584196585196586196587196588196589196590196591196592196593196594196595196596196597196598196599196600196601196602196603196604196605196606196607196608196609196610196611196612196613196614196615196616196617196618196619196620196621196622196623196624196625196626196627196628196629196630196631196632196633196634196635196636196637196638196639196640196641196642196643196644196645196646196647196648196649196650196651196652196653196654196655196656196657196658196659196660196661196662196663196664196665196666196667196668196669196670196671196672196673196674196675196676196677196678196679196680196681196682196683196684196685196686196687196688196689196690196691196692196693196694196695196696196697196698196699196700196701196702196703196704196705196706196707196708196709196710196711196712196713196714196715196716196717196718196719196720196721196722196723196724196725196726196727196728196729196730196731196732196733196734196735196736196737196738196739196740196741196742196743196744196745196746196747196748196749196750196751196752196753196754196755196756196757196758196759196760196761196762196763196764196765196766196767196768196769196770196771196772196773196774196775196776196777196778196779196780196781196782196783196784196785196786196787196788196789196790196791196792196793196794196795196796196797196798196799196800196801196802196803196804196805196806196807196808196809196810196811196812196813196814196815196816196817196818196819196820196821196822196823196824196825196826196827196828196829196830196831196832196833196834196835196836196837196838196839196840196841196842196843196844196845196846196847196848196849196850196851196852196853196854196855196856196857196858196859196860196861196862196863196864196865196866196867196868196869196870196871196872196873196874196875196876196877196878196879196880196881196882196883196884196885196886196887196888196889196890196891196892196893196894196895196896196897196898196899196900196901196902196903196904196905196906196907196908196909196910196911196912196913196914196915196916196917196918196919196920196921196922196923196924196925196926196927196928196929196930196931196932196933196934196935196936196937196938196939196940196941196942196943196944196945196946196947196948196949196950196951196952196953196954196955196956196957196958196959196960196961196962196963196964196965196966196967196968196969196970196971196972196973196974196975196976196977196978196979196980196981196982196983196984196985196986196987196988196989196990196991196992196993196994196995196996196997196998196999197000197001197002197003197004197005197006197007197008197009197010197011197012197013197014197015197016197017197018197019197020197021197022197023197024197025197026197027197028197029197030197031197032197033197034197035197036197037197038197039197040197041197042197043197044197045197046197047197048197049197050197051197052197053197054197055197056197057197058197059197060197061197062197063197064197065197066197067197068197069197070197071197072197073197074197075197076197077197078197079197080197081197082197083197084197085197086197087197088197089197090197091197092197093197094197095197096197097197098197099197100197101197102197103197104197105197106197107197108197109197110197111197112197113197114197115197116197117197118197119197120197121197122197123197124197125197126197127197128197129197130197131197132197133197134197135197136197137197138197139197140197141197142197143197144197145197146197147197148197149197150197151197152197153197154197155197156197157197158197159197160197161197162197163197164197165197166197167197168197169197170197171197172197173197174197175197176197177197178197179197180197181197182197183197184197185197186197187197188197189197190197191197192197193197194197195197196197197197198197199197200197201197202197203197204197205197206197207197208197209197210197211197212197213197214197215197216197217197218197219197220197221197222197223197224197225197226197227197228197229197230197231197232197233197234197235197236197237197238197239197240197241197242197243197244197245197246197247197248197249197250197251197252197253197254197255197256197257197258197259197260197261197262197263197264197265197266197267197268197269197270197271197272197273197274197275197276197277197278197279197280197281197282197283197284197285197286197287197288197289197290197291197292197293197294197295197296197297197298197299197300197301197302197303197304197305197306197307197308197309197310197311197312197313197314197315197316197317197318197319197320197321197322197323197324197325197326197327197328197329197330197331197332197333197334197335197336197337197338197339197340197341197342197343197344197345197346197347197348197349197350197351197352197353197354197355197356197357197358197359197360197361197362197363197364197365197366197367197368197369197370197371197372197373197374197375197376197377197378197379197380197381197382197383197384197385197386197387197388197389197390197391197392197393197394197395197396197397197398197399197400197401197402197403197404197405197406197407197408197409197410197411197412197413197414197415197416197417197418197419197420197421197422197423197424197425197426197427197428197429197430197431197432197433197434197435197436197437197438197439197440197441197442197443197444197445197446197447197448197449197450197451197452197453197454197455197456197457197458197459197460197461197462197463197464197465197466197467197468197469197470197471197472197473197474197475197476197477197478197479197480197481197482197483197484197485197486197487197488197489197490197491197492197493197494197495197496197497197498197499197500197501197502197503197504197505197506197507197508197509197510197511197512197513197514197515197516197517197518197519197520197521197522197523197524197525197526197527197528197529197530197531197532197533197534197535197536197537197538197539197540197541197542197543197544197545197546197547197548197549197550197551197552197553197554197555197556197557197558197559197560197561197562197563197564197565197566197567197568197569197570197571197572197573197574197575197576197577197578197579197580197581197582197583197584197585197586197587197588197589197590197591197592197593197594197595197596197597197598197599197600197601197602197603197604197605197606197607197608197609197610197611197612197613197614197615197616197617197618197619197620197621197622197623197624197625197626197627197628197629197630197631197632197633197634197635197636197637197638197639197640197641197642197643197644197645197646197647197648197649197650197651197652197653197654197655197656197657197658197659197660197661197662197663197664197665197666197667197668197669197670197671197672197673197674197675197676197677197678197679197680197681197682197683197684197685197686197687197688197689197690197691197692197693197694197695197696197697197698197699197700197701197702197703197704197705197706197707197708197709197710197711197712197713197714197715197716197717197718197719197720197721197722197723197724197725197726197727197728197729197730197731197732197733197734197735197736197737197738197739197740197741197742197743197744197745197746197747197748197749197750197751197752197753197754197755197756197757197758197759197760197761197762197763197764197765197766197767197768197769197770197771197772197773197774197775197776197777197778197779197780197781197782197783197784197785197786197787197788197789197790197791197792197793197794197795197796197797197798197799197800197801197802197803197804197805197806197807197808197809197810197811197812197813197814197815197816197817197818197819197820197821197822197823197824197825197826197827197828197829197830197831197832197833197834197835197836197837197838197839197840197841197842197843197844197845197846197847197848197849197850197851197852197853197854197855197856197857197858197859197860197861197862197863197864197865197866197867197868197869197870197871197872197873197874197875197876197877197878197879197880197881197882197883197884197885197886197887197888197889197890197891197892197893197894197895197896197897197898197899197900197901197902197903197904197905197906197907197908197909197910197911197912197913197914197915197916197917197918197919197920197921197922197923197924197925197926197927197928197929197930197931197932197933197934197935197936197937197938197939197940197941197942197943197944197945197946197947197948197949197950197951197952197953197954197955197956197957197958197959197960197961197962197963197964197965197966197967197968197969197970197971197972197973197974197975197976197977197978197979197980197981197982197983197984197985197986197987197988197989197990197991197992197993197994197995197996197997197998197999198000198001198002198003198004198005198006198007198008198009198010198011198012198013198014198015198016198017198018198019198020198021198022198023198024198025198026198027198028198029198030198031198032198033198034198035198036198037198038198039198040198041198042198043198044198045198046198047198048198049198050198051198052198053198054198055198056198057198058198059198060198061198062198063198064198065198066198067198068198069198070198071198072198073198074198075198076198077198078198079198080198081198082198083198084198085198086198087198088198089198090198091198092198093198094198095198096198097198098198099198100198101198102198103198104198105198106198107198108198109198110198111198112198113198114198115198116198117198118198119198120198121198122198123198124198125198126198127198128198129198130198131198132198133198134198135198136198137198138198139198140198141198142198143198144198145198146198147198148198149198150198151198152198153198154198155198156198157198158198159198160198161198162198163198164198165198166198167198168198169198170198171198172198173198174198175198176198177198178198179198180198181198182198183198184198185198186198187198188198189198190198191198192198193198194198195198196198197198198198199198200198201198202198203198204198205198206198207198208198209198210198211198212198213198214198215198216198217198218198219198220198221198222198223198224198225198226198227198228198229198230198231198232198233198234198235198236198237198238198239198240198241198242198243198244198245198246198247198248198249198250198251198252198253198254198255198256198257198258198259198260198261198262198263198264198265198266198267198268198269198270198271198272198273198274198275198276198277198278198279198280198281198282198283198284198285198286198287198288198289198290198291198292198293198294198295198296198297198298198299198300198301198302198303198304198305198306198307198308198309198310198311198312198313198314198315198316198317198318198319198320198321198322198323198324198325198326198327198328198329198330198331198332198333198334198335198336198337198338198339198340198341198342198343198344198345198346198347198348198349198350198351198352198353198354198355198356198357198358198359198360198361198362198363198364198365198366198367198368198369198370198371198372198373198374198375198376198377198378198379198380198381198382198383198384198385198386198387198388198389198390198391198392198393198394198395198396198397198398198399198400198401198402198403198404198405198406198407198408198409198410198411198412198413198414198415198416198417198418198419198420198421198422198423198424198425198426198427198428198429198430198431198432198433198434198435198436198437198438198439198440198441198442198443198444198445198446198447198448198449198450198451198452198453198454198455198456198457198458198459198460198461198462198463198464198465198466198467198468198469198470198471198472198473198474198475198476198477198478198479198480198481198482198483198484198485198486198487198488198489198490198491198492198493198494198495198496198497198498198499198500198501198502198503198504198505198506198507198508198509198510198511198512198513198514198515198516198517198518198519198520198521198522198523198524198525198526198527198528198529198530198531198532198533198534198535198536198537198538198539198540198541198542198543198544198545198546198547198548198549198550198551198552198553198554198555198556198557198558198559198560198561198562198563198564198565198566198567198568198569198570198571198572198573198574198575198576198577198578198579198580198581198582198583198584198585198586198587198588198589198590198591198592198593198594198595198596198597198598198599198600198601198602198603198604198605198606198607198608198609198610198611198612198613198614198615198616198617198618198619198620198621198622198623198624198625198626198627198628198629198630198631198632198633198634198635198636198637198638198639198640198641198642198643198644198645198646198647198648198649198650198651198652198653198654198655198656198657198658198659198660198661198662198663198664198665198666198667198668198669198670198671198672198673198674198675198676198677198678198679198680198681198682198683198684198685198686198687198688198689198690198691198692198693198694198695198696198697198698198699198700198701198702198703198704198705198706198707198708198709198710198711198712198713198714198715198716198717198718198719198720198721198722198723198724198725198726198727198728198729198730198731198732198733198734198735198736198737198738198739198740198741198742198743198744198745198746198747198748198749198750198751198752198753198754198755198756198757198758198759198760198761198762198763198764198765198766198767198768198769198770198771198772198773198774198775198776198777198778198779198780198781198782198783198784198785198786198787198788198789198790198791198792198793198794198795198796198797198798198799198800198801198802198803198804198805198806198807198808198809198810198811198812198813198814198815198816198817198818198819198820198821198822198823198824198825198826198827198828198829198830198831198832198833198834198835198836198837198838198839198840198841198842198843198844198845198846198847198848198849198850198851198852198853198854198855198856198857198858198859198860198861198862198863198864198865198866198867198868198869198870198871198872198873198874198875198876198877198878198879198880198881198882198883198884198885198886198887198888198889198890198891198892198893198894198895198896198897198898198899198900198901198902198903198904198905198906198907198908198909198910198911198912198913198914198915198916198917198918198919198920198921198922198923198924198925198926198927198928198929198930198931198932198933198934198935198936198937198938198939198940198941198942198943198944198945198946198947198948198949198950198951198952198953198954198955198956198957198958198959198960198961198962198963198964198965198966198967198968198969198970198971198972198973198974198975198976198977198978198979198980198981198982198983198984198985198986198987198988198989198990198991198992198993198994198995198996198997198998198999199000199001199002199003199004199005199006199007199008199009199010199011199012199013199014199015199016199017199018199019199020199021199022199023199024199025199026199027199028199029199030199031199032199033199034199035199036199037199038199039199040199041199042199043199044199045199046199047199048199049199050199051199052199053199054199055199056199057199058199059199060199061199062199063199064199065199066199067199068199069199070199071199072199073199074199075199076199077199078199079199080199081199082199083199084199085199086199087199088199089199090199091199092199093199094199095199096199097199098199099199100199101199102199103199104199105199106199107199108199109199110199111199112199113199114199115199116199117199118199119199120199121199122199123199124199125199126199127199128199129199130199131199132199133199134199135199136199137199138199139199140199141199142199143199144199145199146199147199148199149199150199151199152199153199154199155199156199157199158199159199160199161199162199163199164199165199166199167199168199169199170199171199172199173199174199175199176199177199178199179199180199181199182199183199184199185199186199187199188199189199190199191199192199193199194199195199196199197199198199199199200199201199202199203199204199205199206199207199208199209199210199211199212199213199214199215199216199217199218199219199220199221199222199223199224199225199226199227199228199229199230199231199232199233199234199235199236199237199238199239199240199241199242199243199244199245199246199247199248199249199250199251199252199253199254199255199256199257199258199259199260199261199262199263199264199265199266199267199268199269199270199271199272199273199274199275199276199277199278199279199280199281199282199283199284199285199286199287199288199289199290199291199292199293199294199295199296199297199298199299199300199301199302199303199304199305199306199307199308199309199310199311199312199313199314199315199316199317199318199319199320199321199322199323199324199325199326199327199328199329199330199331199332199333199334199335199336199337199338199339199340199341199342199343199344199345199346199347199348199349199350199351199352199353199354199355199356199357199358199359199360199361199362199363199364199365199366199367199368199369199370199371199372199373199374199375199376199377199378199379199380199381199382199383199384199385199386199387199388199389199390199391199392199393199394199395199396199397199398199399199400199401199402199403199404199405199406199407199408199409199410199411199412199413199414199415199416199417199418199419199420199421199422199423199424199425199426199427199428199429199430199431199432199433199434199435199436199437199438199439199440199441199442199443199444199445199446199447199448199449199450199451199452199453199454199455199456199457199458199459199460199461199462199463199464199465199466199467199468199469199470199471199472199473199474199475199476199477199478199479199480199481199482199483199484199485199486199487199488199489199490199491199492199493199494199495199496199497199498199499199500199501199502199503199504199505199506199507199508199509199510199511199512199513199514199515199516199517199518199519199520199521199522199523199524199525199526199527199528199529199530199531199532199533199534199535199536199537199538199539199540199541199542199543199544199545199546199547199548199549199550199551199552199553199554199555199556199557199558199559199560199561199562199563199564199565199566199567199568199569199570199571199572199573199574199575199576199577199578199579199580199581199582199583199584199585199586199587199588199589199590199591199592199593199594199595199596199597199598199599199600199601199602199603199604199605199606199607199608199609199610199611199612199613199614199615199616199617199618199619199620199621199622199623199624199625199626199627199628199629199630199631199632199633199634199635199636199637199638199639199640199641199642199643199644199645199646199647199648199649199650199651199652199653199654199655199656199657199658199659199660199661199662199663199664199665199666199667199668199669199670199671199672199673199674199675199676199677199678199679199680199681199682199683199684199685199686199687199688199689199690199691199692199693199694199695199696199697199698199699199700199701199702199703199704199705199706199707199708199709199710199711199712199713199714199715199716199717199718199719199720199721199722199723199724199725199726199727199728199729199730199731199732199733199734199735199736199737199738199739199740199741199742199743199744199745199746199747199748199749199750199751199752199753199754199755199756199757199758199759199760199761199762199763199764199765199766199767199768199769199770199771199772199773199774199775199776199777199778199779199780199781199782199783199784199785199786199787199788199789199790199791199792199793199794199795199796199797199798199799199800199801199802199803199804199805199806199807199808199809199810199811199812199813199814199815199816199817199818199819199820199821199822199823199824199825199826199827199828199829199830199831199832199833199834199835199836199837199838199839199840199841199842199843199844199845199846199847199848199849199850199851199852199853199854199855199856199857199858199859199860199861199862199863199864199865199866199867199868199869199870199871199872199873199874199875199876199877199878199879199880199881199882199883199884199885199886199887199888199889199890199891199892199893199894199895199896199897199898199899199900199901199902199903199904199905199906199907199908199909199910199911199912199913199914199915199916199917199918199919199920199921199922199923199924199925199926199927199928199929199930199931199932199933199934199935199936199937199938199939199940199941199942199943199944199945199946199947199948199949199950199951199952199953199954199955199956199957199958199959199960199961199962199963199964199965199966199967199968199969199970199971199972199973199974199975199976199977199978199979199980199981199982199983199984199985199986199987199988199989199990199991199992199993199994199995199996199997199998199999200000200001200002200003200004200005200006200007200008200009200010200011200012200013200014200015200016200017200018200019200020200021200022200023200024200025200026200027200028200029200030200031200032200033200034200035200036200037200038200039200040200041200042200043200044200045200046200047200048200049200050200051200052200053200054200055200056200057200058200059200060200061200062200063200064200065200066200067200068200069200070200071200072200073200074200075200076200077200078200079200080200081200082200083200084200085200086200087200088200089200090200091200092200093200094200095200096200097200098200099200100200101200102200103200104200105200106200107200108200109
  1. /* sp.c
  2. *
  3. * Copyright (C) 2006-2021 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. /* Implementation by Sean Parkinson. */
  22. #ifdef HAVE_CONFIG_H
  23. #include <config.h>
  24. #endif
  25. #include <wolfssl/wolfcrypt/settings.h>
  26. #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) || \
  27. defined(WOLFSSL_HAVE_SP_ECC)
  28. #include <wolfssl/wolfcrypt/error-crypt.h>
  29. #include <wolfssl/wolfcrypt/cpuid.h>
  30. #ifdef NO_INLINE
  31. #include <wolfssl/wolfcrypt/misc.h>
  32. #else
  33. #define WOLFSSL_MISC_INCLUDED
  34. #include <wolfcrypt/src/misc.c>
  35. #endif
  36. #ifdef RSA_LOW_MEM
  37. #ifndef WOLFSSL_SP_SMALL
  38. #define WOLFSSL_SP_SMALL
  39. #endif
  40. #endif
  41. #include <wolfssl/wolfcrypt/sp.h>
  42. #ifdef WOLFSSL_SP_ARM_THUMB_ASM
  43. #define SP_PRINT_NUM(var, name, total, words, bits) \
  44. do { \
  45. int ii; \
  46. fprintf(stderr, name "=0x"); \
  47. for (ii = words - 1; ii >= 0; ii--) \
  48. fprintf(stderr, SP_PRINT_FMT, (var)[ii]); \
  49. fprintf(stderr, "\n"); \
  50. } while (0)
  51. #define SP_PRINT_VAL(var, name) \
  52. fprintf(stderr, name "=0x" SP_PRINT_FMT "\n", var)
  53. #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH)
  54. #ifndef WOLFSSL_SP_NO_2048
  55. /* Read big endian unsigned byte array into r.
  56. *
  57. * r A single precision integer.
  58. * size Maximum number of bytes to convert
  59. * a Byte array.
  60. * n Number of bytes in array to read.
  61. */
  62. static void sp_2048_from_bin(sp_digit* r, int size, const byte* a, int n)
  63. {
  64. int i;
  65. int j = 0;
  66. word32 s = 0;
  67. r[0] = 0;
  68. for (i = n-1; i >= 0; i--) {
  69. r[j] |= (((sp_digit)a[i]) << s);
  70. if (s >= 24U) {
  71. r[j] &= 0xffffffff;
  72. s = 32U - s;
  73. if (j + 1 >= size) {
  74. break;
  75. }
  76. r[++j] = (sp_digit)a[i] >> s;
  77. s = 8U - s;
  78. }
  79. else {
  80. s += 8U;
  81. }
  82. }
  83. for (j++; j < size; j++) {
  84. r[j] = 0;
  85. }
  86. }
  87. /* Convert an mp_int to an array of sp_digit.
  88. *
  89. * r A single precision integer.
  90. * size Maximum number of bytes to convert
  91. * a A multi-precision integer.
  92. */
  93. static void sp_2048_from_mp(sp_digit* r, int size, const mp_int* a)
  94. {
  95. #if DIGIT_BIT == 32
  96. int j;
  97. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  98. for (j = a->used; j < size; j++) {
  99. r[j] = 0;
  100. }
  101. #elif DIGIT_BIT > 32
  102. int i;
  103. int j = 0;
  104. word32 s = 0;
  105. r[0] = 0;
  106. for (i = 0; i < a->used && j < size; i++) {
  107. r[j] |= ((sp_digit)a->dp[i] << s);
  108. r[j] &= 0xffffffff;
  109. s = 32U - s;
  110. if (j + 1 >= size) {
  111. break;
  112. }
  113. /* lint allow cast of mismatch word32 and mp_digit */
  114. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  115. while ((s + 32U) <= (word32)DIGIT_BIT) {
  116. s += 32U;
  117. r[j] &= 0xffffffff;
  118. if (j + 1 >= size) {
  119. break;
  120. }
  121. if (s < (word32)DIGIT_BIT) {
  122. /* lint allow cast of mismatch word32 and mp_digit */
  123. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  124. }
  125. else {
  126. r[++j] = (sp_digit)0;
  127. }
  128. }
  129. s = (word32)DIGIT_BIT - s;
  130. }
  131. for (j++; j < size; j++) {
  132. r[j] = 0;
  133. }
  134. #else
  135. int i;
  136. int j = 0;
  137. int s = 0;
  138. r[0] = 0;
  139. for (i = 0; i < a->used && j < size; i++) {
  140. r[j] |= ((sp_digit)a->dp[i]) << s;
  141. if (s + DIGIT_BIT >= 32) {
  142. r[j] &= 0xffffffff;
  143. if (j + 1 >= size) {
  144. break;
  145. }
  146. s = 32 - s;
  147. if (s == DIGIT_BIT) {
  148. r[++j] = 0;
  149. s = 0;
  150. }
  151. else {
  152. r[++j] = a->dp[i] >> s;
  153. s = DIGIT_BIT - s;
  154. }
  155. }
  156. else {
  157. s += DIGIT_BIT;
  158. }
  159. }
  160. for (j++; j < size; j++) {
  161. r[j] = 0;
  162. }
  163. #endif
  164. }
  165. /* Write r as big endian to byte array.
  166. * Fixed length number of bytes written: 256
  167. *
  168. * r A single precision integer.
  169. * a Byte array.
  170. */
  171. static void sp_2048_to_bin_64(sp_digit* r, byte* a)
  172. {
  173. int i;
  174. int j;
  175. int s = 0;
  176. int b;
  177. j = 2048 / 8 - 1;
  178. a[j] = 0;
  179. for (i=0; i<64 && j>=0; i++) {
  180. b = 0;
  181. /* lint allow cast of mismatch sp_digit and int */
  182. a[j--] |= (byte)(r[i] << s); /*lint !e9033*/
  183. b += 8 - s;
  184. if (j < 0) {
  185. break;
  186. }
  187. while (b < 32) {
  188. a[j--] = (byte)(r[i] >> b);
  189. b += 8;
  190. if (j < 0) {
  191. break;
  192. }
  193. }
  194. s = 8 - (b - 32);
  195. if (j >= 0) {
  196. a[j] = 0;
  197. }
  198. if (s != 0) {
  199. j++;
  200. }
  201. }
  202. }
  203. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  204. /* Normalize the values in each word to 32.
  205. *
  206. * a Array of sp_digit to normalize.
  207. */
  208. #define sp_2048_norm_64(a)
  209. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  210. /* Normalize the values in each word to 32.
  211. *
  212. * a Array of sp_digit to normalize.
  213. */
  214. #define sp_2048_norm_64(a)
  215. #ifndef WOLFSSL_SP_SMALL
  216. #ifndef WOLFSSL_SP_LARGE_CODE
  217. /* Multiply a and b into r. (r = a * b)
  218. *
  219. * r A single precision integer.
  220. * a A single precision integer.
  221. * b A single precision integer.
  222. */
  223. SP_NOINLINE static void sp_2048_mul_8(sp_digit* r, const sp_digit* a,
  224. const sp_digit* b)
  225. {
  226. sp_digit t[8 * 2];
  227. sp_digit* tmp = t;
  228. __asm__ __volatile__ (
  229. "movs r3, #0\n\t"
  230. "movs r4, #0\n\t"
  231. "mov r8, r3\n\t"
  232. "mov r11, %[tmp]\n\t"
  233. "mov r9, %[a]\n\t"
  234. "mov r10, %[b]\n\t"
  235. "movs r6, #32\n\t"
  236. "add r6, r6, r9\n\t"
  237. "mov r12, r6\n\t"
  238. "\n"
  239. "L_sp_2048_mul_8_words_%=:\n\t"
  240. "movs %[tmp], #0\n\t"
  241. "movs r5, #0\n\t"
  242. "movs r6, #28\n\t"
  243. "mov %[a], r8\n\t"
  244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  245. "subs %[a], %[a], r6\n\t"
  246. #else
  247. "sub %[a], %[a], r6\n\t"
  248. #endif
  249. #ifdef WOLFSSL_KEIL
  250. "sbcs r6, r6, r6\n\t"
  251. #elif defined(__clang__)
  252. "sbcs r6, r6\n\t"
  253. #else
  254. "sbc r6, r6\n\t"
  255. #endif
  256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  257. "mvns r6, r6\n\t"
  258. #else
  259. "mvn r6, r6\n\t"
  260. #endif
  261. #ifdef WOLFSSL_KEIL
  262. "ands %[a], %[a], r6\n\t"
  263. #elif defined(__clang__)
  264. "ands %[a], r6\n\t"
  265. #else
  266. "and %[a], r6\n\t"
  267. #endif
  268. "mov %[b], r8\n\t"
  269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  270. "subs %[b], %[b], %[a]\n\t"
  271. #else
  272. "sub %[b], %[b], %[a]\n\t"
  273. #endif
  274. "add %[a], %[a], r9\n\t"
  275. "add %[b], %[b], r10\n\t"
  276. "\n"
  277. "L_sp_2048_mul_8_mul_%=:\n\t"
  278. "# Multiply Start\n\t"
  279. "ldrh r6, [%[a]]\n\t"
  280. "ldrh r7, [%[b]]\n\t"
  281. #ifdef WOLFSSL_KEIL
  282. "muls r7, r6, r7\n\t"
  283. #elif defined(__clang__)
  284. "muls r7, r6\n\t"
  285. #else
  286. "mul r7, r6\n\t"
  287. #endif
  288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  289. "adds r3, r3, r7\n\t"
  290. #else
  291. "add r3, r3, r7\n\t"
  292. #endif
  293. #ifdef WOLFSSL_KEIL
  294. "adcs r4, r4, %[tmp]\n\t"
  295. #elif defined(__clang__)
  296. "adcs r4, %[tmp]\n\t"
  297. #else
  298. "adc r4, %[tmp]\n\t"
  299. #endif
  300. #ifdef WOLFSSL_KEIL
  301. "adcs r5, r5, %[tmp]\n\t"
  302. #elif defined(__clang__)
  303. "adcs r5, %[tmp]\n\t"
  304. #else
  305. "adc r5, %[tmp]\n\t"
  306. #endif
  307. "ldr r7, [%[b]]\n\t"
  308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  309. "lsrs r7, r7, #16\n\t"
  310. #else
  311. "lsr r7, r7, #16\n\t"
  312. #endif
  313. #ifdef WOLFSSL_KEIL
  314. "muls r6, r7, r6\n\t"
  315. #elif defined(__clang__)
  316. "muls r6, r7\n\t"
  317. #else
  318. "mul r6, r7\n\t"
  319. #endif
  320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  321. "lsrs r7, r6, #16\n\t"
  322. #else
  323. "lsr r7, r6, #16\n\t"
  324. #endif
  325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  326. "lsls r6, r6, #16\n\t"
  327. #else
  328. "lsl r6, r6, #16\n\t"
  329. #endif
  330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  331. "adds r3, r3, r6\n\t"
  332. #else
  333. "add r3, r3, r6\n\t"
  334. #endif
  335. #ifdef WOLFSSL_KEIL
  336. "adcs r4, r4, r7\n\t"
  337. #elif defined(__clang__)
  338. "adcs r4, r7\n\t"
  339. #else
  340. "adc r4, r7\n\t"
  341. #endif
  342. #ifdef WOLFSSL_KEIL
  343. "adcs r5, r5, %[tmp]\n\t"
  344. #elif defined(__clang__)
  345. "adcs r5, %[tmp]\n\t"
  346. #else
  347. "adc r5, %[tmp]\n\t"
  348. #endif
  349. "ldr r6, [%[a]]\n\t"
  350. "ldr r7, [%[b]]\n\t"
  351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  352. "lsrs r6, r6, #16\n\t"
  353. #else
  354. "lsr r6, r6, #16\n\t"
  355. #endif
  356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  357. "lsrs r7, r7, #16\n\t"
  358. #else
  359. "lsr r7, r7, #16\n\t"
  360. #endif
  361. #ifdef WOLFSSL_KEIL
  362. "muls r7, r6, r7\n\t"
  363. #elif defined(__clang__)
  364. "muls r7, r6\n\t"
  365. #else
  366. "mul r7, r6\n\t"
  367. #endif
  368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  369. "adds r4, r4, r7\n\t"
  370. #else
  371. "add r4, r4, r7\n\t"
  372. #endif
  373. #ifdef WOLFSSL_KEIL
  374. "adcs r5, r5, %[tmp]\n\t"
  375. #elif defined(__clang__)
  376. "adcs r5, %[tmp]\n\t"
  377. #else
  378. "adc r5, %[tmp]\n\t"
  379. #endif
  380. "ldrh r7, [%[b]]\n\t"
  381. #ifdef WOLFSSL_KEIL
  382. "muls r6, r7, r6\n\t"
  383. #elif defined(__clang__)
  384. "muls r6, r7\n\t"
  385. #else
  386. "mul r6, r7\n\t"
  387. #endif
  388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  389. "lsrs r7, r6, #16\n\t"
  390. #else
  391. "lsr r7, r6, #16\n\t"
  392. #endif
  393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  394. "lsls r6, r6, #16\n\t"
  395. #else
  396. "lsl r6, r6, #16\n\t"
  397. #endif
  398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  399. "adds r3, r3, r6\n\t"
  400. #else
  401. "add r3, r3, r6\n\t"
  402. #endif
  403. #ifdef WOLFSSL_KEIL
  404. "adcs r4, r4, r7\n\t"
  405. #elif defined(__clang__)
  406. "adcs r4, r7\n\t"
  407. #else
  408. "adc r4, r7\n\t"
  409. #endif
  410. #ifdef WOLFSSL_KEIL
  411. "adcs r5, r5, %[tmp]\n\t"
  412. #elif defined(__clang__)
  413. "adcs r5, %[tmp]\n\t"
  414. #else
  415. "adc r5, %[tmp]\n\t"
  416. #endif
  417. "# Multiply Done\n\t"
  418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  419. "adds %[a], %[a], #4\n\t"
  420. #else
  421. "add %[a], %[a], #4\n\t"
  422. #endif
  423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  424. "subs %[b], %[b], #4\n\t"
  425. #else
  426. "sub %[b], %[b], #4\n\t"
  427. #endif
  428. "cmp %[a], r12\n\t"
  429. "beq L_sp_2048_mul_8_done_mul_%=\n\t"
  430. "mov r6, r8\n\t"
  431. "add r6, r6, r9\n\t"
  432. "cmp %[a], r6\n\t"
  433. "ble L_sp_2048_mul_8_mul_%=\n\t"
  434. "\n"
  435. "L_sp_2048_mul_8_done_mul_%=:\n\t"
  436. "mov %[tmp], r11\n\t"
  437. "mov r7, r8\n\t"
  438. "str r3, [%[tmp], r7]\n\t"
  439. "movs r3, r4\n\t"
  440. "movs r4, r5\n\t"
  441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  442. "adds r7, r7, #4\n\t"
  443. #else
  444. "add r7, r7, #4\n\t"
  445. #endif
  446. "mov r8, r7\n\t"
  447. "movs r6, #56\n\t"
  448. "cmp r7, r6\n\t"
  449. "ble L_sp_2048_mul_8_words_%=\n\t"
  450. "str r3, [%[tmp], r7]\n\t"
  451. "mov %[a], r9\n\t"
  452. "mov %[b], r10\n\t"
  453. : [a] "+r" (a), [b] "+r" (b), [tmp] "+r" (tmp)
  454. :
  455. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  456. );
  457. XMEMCPY(r, t, sizeof(t));
  458. }
  459. #else
  460. /* Multiply a and b into r. (r = a * b)
  461. *
  462. * r A single precision integer.
  463. * a A single precision integer.
  464. * b A single precision integer.
  465. */
  466. SP_NOINLINE static void sp_2048_mul_8(sp_digit* r, const sp_digit* a,
  467. const sp_digit* b)
  468. {
  469. __asm__ __volatile__ (
  470. "sub sp, sp, #32\n\t"
  471. "mov r8, %[r]\n\t"
  472. "mov r9, %[a]\n\t"
  473. "mov r10, %[b]\n\t"
  474. "movs %[r], #0\n\t"
  475. "# A[0] * B[0]\n\t"
  476. "ldr %[a], [%[a]]\n\t"
  477. "ldr %[b], [%[b]]\n\t"
  478. "uxth r6, %[a]\n\t"
  479. "uxth r3, %[b]\n\t"
  480. #ifdef WOLFSSL_KEIL
  481. "muls r3, r6, r3\n\t"
  482. #elif defined(__clang__)
  483. "muls r3, r6\n\t"
  484. #else
  485. "mul r3, r6\n\t"
  486. #endif
  487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  488. "lsrs r7, %[b], #16\n\t"
  489. #else
  490. "lsr r7, %[b], #16\n\t"
  491. #endif
  492. #ifdef WOLFSSL_KEIL
  493. "muls r6, r7, r6\n\t"
  494. #elif defined(__clang__)
  495. "muls r6, r7\n\t"
  496. #else
  497. "mul r6, r7\n\t"
  498. #endif
  499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  500. "lsrs r4, r6, #16\n\t"
  501. #else
  502. "lsr r4, r6, #16\n\t"
  503. #endif
  504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  505. "lsls r6, r6, #16\n\t"
  506. #else
  507. "lsl r6, r6, #16\n\t"
  508. #endif
  509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  510. "adds r3, r3, r6\n\t"
  511. #else
  512. "add r3, r3, r6\n\t"
  513. #endif
  514. #ifdef WOLFSSL_KEIL
  515. "adcs r4, r4, %[r]\n\t"
  516. #elif defined(__clang__)
  517. "adcs r4, %[r]\n\t"
  518. #else
  519. "adc r4, %[r]\n\t"
  520. #endif
  521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  522. "lsrs r6, %[a], #16\n\t"
  523. #else
  524. "lsr r6, %[a], #16\n\t"
  525. #endif
  526. #ifdef WOLFSSL_KEIL
  527. "muls r7, r6, r7\n\t"
  528. #elif defined(__clang__)
  529. "muls r7, r6\n\t"
  530. #else
  531. "mul r7, r6\n\t"
  532. #endif
  533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  534. "adds r4, r4, r7\n\t"
  535. #else
  536. "add r4, r4, r7\n\t"
  537. #endif
  538. "uxth r7, %[b]\n\t"
  539. #ifdef WOLFSSL_KEIL
  540. "muls r6, r7, r6\n\t"
  541. #elif defined(__clang__)
  542. "muls r6, r7\n\t"
  543. #else
  544. "mul r6, r7\n\t"
  545. #endif
  546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  547. "lsrs r7, r6, #16\n\t"
  548. #else
  549. "lsr r7, r6, #16\n\t"
  550. #endif
  551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  552. "lsls r6, r6, #16\n\t"
  553. #else
  554. "lsl r6, r6, #16\n\t"
  555. #endif
  556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  557. "adds r3, r3, r6\n\t"
  558. #else
  559. "add r3, r3, r6\n\t"
  560. #endif
  561. #ifdef WOLFSSL_KEIL
  562. "adcs r4, r4, r7\n\t"
  563. #elif defined(__clang__)
  564. "adcs r4, r7\n\t"
  565. #else
  566. "adc r4, r7\n\t"
  567. #endif
  568. "movs r5, #0\n\t"
  569. "str r3, [sp]\n\t"
  570. "# A[0] * B[1]\n\t"
  571. "movs r3, #0\n\t"
  572. "mov %[a], r9\n\t"
  573. "mov %[b], r10\n\t"
  574. "ldr %[a], [%[a]]\n\t"
  575. "ldr %[b], [%[b], #4]\n\t"
  576. "uxth r6, %[a]\n\t"
  577. "uxth r7, %[b]\n\t"
  578. #ifdef WOLFSSL_KEIL
  579. "muls r7, r6, r7\n\t"
  580. #elif defined(__clang__)
  581. "muls r7, r6\n\t"
  582. #else
  583. "mul r7, r6\n\t"
  584. #endif
  585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  586. "adds r4, r4, r7\n\t"
  587. #else
  588. "add r4, r4, r7\n\t"
  589. #endif
  590. #ifdef WOLFSSL_KEIL
  591. "adcs r5, r5, %[r]\n\t"
  592. #elif defined(__clang__)
  593. "adcs r5, %[r]\n\t"
  594. #else
  595. "adc r5, %[r]\n\t"
  596. #endif
  597. #ifdef WOLFSSL_KEIL
  598. "adcs r3, r3, %[r]\n\t"
  599. #elif defined(__clang__)
  600. "adcs r3, %[r]\n\t"
  601. #else
  602. "adc r3, %[r]\n\t"
  603. #endif
  604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  605. "lsrs r7, %[b], #16\n\t"
  606. #else
  607. "lsr r7, %[b], #16\n\t"
  608. #endif
  609. #ifdef WOLFSSL_KEIL
  610. "muls r6, r7, r6\n\t"
  611. #elif defined(__clang__)
  612. "muls r6, r7\n\t"
  613. #else
  614. "mul r6, r7\n\t"
  615. #endif
  616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  617. "lsrs r7, r6, #16\n\t"
  618. #else
  619. "lsr r7, r6, #16\n\t"
  620. #endif
  621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  622. "lsls r6, r6, #16\n\t"
  623. #else
  624. "lsl r6, r6, #16\n\t"
  625. #endif
  626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  627. "adds r4, r4, r6\n\t"
  628. #else
  629. "add r4, r4, r6\n\t"
  630. #endif
  631. #ifdef WOLFSSL_KEIL
  632. "adcs r5, r5, r7\n\t"
  633. #elif defined(__clang__)
  634. "adcs r5, r7\n\t"
  635. #else
  636. "adc r5, r7\n\t"
  637. #endif
  638. #ifdef WOLFSSL_KEIL
  639. "adcs r3, r3, %[r]\n\t"
  640. #elif defined(__clang__)
  641. "adcs r3, %[r]\n\t"
  642. #else
  643. "adc r3, %[r]\n\t"
  644. #endif
  645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  646. "lsrs r6, %[a], #16\n\t"
  647. #else
  648. "lsr r6, %[a], #16\n\t"
  649. #endif
  650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  651. "lsrs r7, %[b], #16\n\t"
  652. #else
  653. "lsr r7, %[b], #16\n\t"
  654. #endif
  655. #ifdef WOLFSSL_KEIL
  656. "muls r7, r6, r7\n\t"
  657. #elif defined(__clang__)
  658. "muls r7, r6\n\t"
  659. #else
  660. "mul r7, r6\n\t"
  661. #endif
  662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  663. "adds r5, r5, r7\n\t"
  664. #else
  665. "add r5, r5, r7\n\t"
  666. #endif
  667. #ifdef WOLFSSL_KEIL
  668. "adcs r3, r3, %[r]\n\t"
  669. #elif defined(__clang__)
  670. "adcs r3, %[r]\n\t"
  671. #else
  672. "adc r3, %[r]\n\t"
  673. #endif
  674. "uxth r7, %[b]\n\t"
  675. #ifdef WOLFSSL_KEIL
  676. "muls r6, r7, r6\n\t"
  677. #elif defined(__clang__)
  678. "muls r6, r7\n\t"
  679. #else
  680. "mul r6, r7\n\t"
  681. #endif
  682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  683. "lsrs r7, r6, #16\n\t"
  684. #else
  685. "lsr r7, r6, #16\n\t"
  686. #endif
  687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  688. "lsls r6, r6, #16\n\t"
  689. #else
  690. "lsl r6, r6, #16\n\t"
  691. #endif
  692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  693. "adds r4, r4, r6\n\t"
  694. #else
  695. "add r4, r4, r6\n\t"
  696. #endif
  697. #ifdef WOLFSSL_KEIL
  698. "adcs r5, r5, r7\n\t"
  699. #elif defined(__clang__)
  700. "adcs r5, r7\n\t"
  701. #else
  702. "adc r5, r7\n\t"
  703. #endif
  704. #ifdef WOLFSSL_KEIL
  705. "adcs r3, r3, %[r]\n\t"
  706. #elif defined(__clang__)
  707. "adcs r3, %[r]\n\t"
  708. #else
  709. "adc r3, %[r]\n\t"
  710. #endif
  711. "# A[1] * B[0]\n\t"
  712. "mov %[a], r9\n\t"
  713. "mov %[b], r10\n\t"
  714. "ldr %[a], [%[a], #4]\n\t"
  715. "ldr %[b], [%[b]]\n\t"
  716. "uxth r6, %[a]\n\t"
  717. "uxth r7, %[b]\n\t"
  718. #ifdef WOLFSSL_KEIL
  719. "muls r7, r6, r7\n\t"
  720. #elif defined(__clang__)
  721. "muls r7, r6\n\t"
  722. #else
  723. "mul r7, r6\n\t"
  724. #endif
  725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  726. "adds r4, r4, r7\n\t"
  727. #else
  728. "add r4, r4, r7\n\t"
  729. #endif
  730. #ifdef WOLFSSL_KEIL
  731. "adcs r5, r5, %[r]\n\t"
  732. #elif defined(__clang__)
  733. "adcs r5, %[r]\n\t"
  734. #else
  735. "adc r5, %[r]\n\t"
  736. #endif
  737. #ifdef WOLFSSL_KEIL
  738. "adcs r3, r3, %[r]\n\t"
  739. #elif defined(__clang__)
  740. "adcs r3, %[r]\n\t"
  741. #else
  742. "adc r3, %[r]\n\t"
  743. #endif
  744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  745. "lsrs r7, %[b], #16\n\t"
  746. #else
  747. "lsr r7, %[b], #16\n\t"
  748. #endif
  749. #ifdef WOLFSSL_KEIL
  750. "muls r6, r7, r6\n\t"
  751. #elif defined(__clang__)
  752. "muls r6, r7\n\t"
  753. #else
  754. "mul r6, r7\n\t"
  755. #endif
  756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  757. "lsrs r7, r6, #16\n\t"
  758. #else
  759. "lsr r7, r6, #16\n\t"
  760. #endif
  761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  762. "lsls r6, r6, #16\n\t"
  763. #else
  764. "lsl r6, r6, #16\n\t"
  765. #endif
  766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  767. "adds r4, r4, r6\n\t"
  768. #else
  769. "add r4, r4, r6\n\t"
  770. #endif
  771. #ifdef WOLFSSL_KEIL
  772. "adcs r5, r5, r7\n\t"
  773. #elif defined(__clang__)
  774. "adcs r5, r7\n\t"
  775. #else
  776. "adc r5, r7\n\t"
  777. #endif
  778. #ifdef WOLFSSL_KEIL
  779. "adcs r3, r3, %[r]\n\t"
  780. #elif defined(__clang__)
  781. "adcs r3, %[r]\n\t"
  782. #else
  783. "adc r3, %[r]\n\t"
  784. #endif
  785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  786. "lsrs r6, %[a], #16\n\t"
  787. #else
  788. "lsr r6, %[a], #16\n\t"
  789. #endif
  790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  791. "lsrs r7, %[b], #16\n\t"
  792. #else
  793. "lsr r7, %[b], #16\n\t"
  794. #endif
  795. #ifdef WOLFSSL_KEIL
  796. "muls r7, r6, r7\n\t"
  797. #elif defined(__clang__)
  798. "muls r7, r6\n\t"
  799. #else
  800. "mul r7, r6\n\t"
  801. #endif
  802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  803. "adds r5, r5, r7\n\t"
  804. #else
  805. "add r5, r5, r7\n\t"
  806. #endif
  807. #ifdef WOLFSSL_KEIL
  808. "adcs r3, r3, %[r]\n\t"
  809. #elif defined(__clang__)
  810. "adcs r3, %[r]\n\t"
  811. #else
  812. "adc r3, %[r]\n\t"
  813. #endif
  814. "uxth r7, %[b]\n\t"
  815. #ifdef WOLFSSL_KEIL
  816. "muls r6, r7, r6\n\t"
  817. #elif defined(__clang__)
  818. "muls r6, r7\n\t"
  819. #else
  820. "mul r6, r7\n\t"
  821. #endif
  822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  823. "lsrs r7, r6, #16\n\t"
  824. #else
  825. "lsr r7, r6, #16\n\t"
  826. #endif
  827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  828. "lsls r6, r6, #16\n\t"
  829. #else
  830. "lsl r6, r6, #16\n\t"
  831. #endif
  832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  833. "adds r4, r4, r6\n\t"
  834. #else
  835. "add r4, r4, r6\n\t"
  836. #endif
  837. #ifdef WOLFSSL_KEIL
  838. "adcs r5, r5, r7\n\t"
  839. #elif defined(__clang__)
  840. "adcs r5, r7\n\t"
  841. #else
  842. "adc r5, r7\n\t"
  843. #endif
  844. #ifdef WOLFSSL_KEIL
  845. "adcs r3, r3, %[r]\n\t"
  846. #elif defined(__clang__)
  847. "adcs r3, %[r]\n\t"
  848. #else
  849. "adc r3, %[r]\n\t"
  850. #endif
  851. "str r4, [sp, #4]\n\t"
  852. "# A[2] * B[0]\n\t"
  853. "movs r4, #0\n\t"
  854. "mov %[a], r9\n\t"
  855. "mov %[b], r10\n\t"
  856. "ldr %[a], [%[a], #8]\n\t"
  857. "ldr %[b], [%[b]]\n\t"
  858. "uxth r6, %[a]\n\t"
  859. "uxth r7, %[b]\n\t"
  860. #ifdef WOLFSSL_KEIL
  861. "muls r7, r6, r7\n\t"
  862. #elif defined(__clang__)
  863. "muls r7, r6\n\t"
  864. #else
  865. "mul r7, r6\n\t"
  866. #endif
  867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  868. "adds r5, r5, r7\n\t"
  869. #else
  870. "add r5, r5, r7\n\t"
  871. #endif
  872. #ifdef WOLFSSL_KEIL
  873. "adcs r3, r3, %[r]\n\t"
  874. #elif defined(__clang__)
  875. "adcs r3, %[r]\n\t"
  876. #else
  877. "adc r3, %[r]\n\t"
  878. #endif
  879. #ifdef WOLFSSL_KEIL
  880. "adcs r4, r4, %[r]\n\t"
  881. #elif defined(__clang__)
  882. "adcs r4, %[r]\n\t"
  883. #else
  884. "adc r4, %[r]\n\t"
  885. #endif
  886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  887. "lsrs r7, %[b], #16\n\t"
  888. #else
  889. "lsr r7, %[b], #16\n\t"
  890. #endif
  891. #ifdef WOLFSSL_KEIL
  892. "muls r6, r7, r6\n\t"
  893. #elif defined(__clang__)
  894. "muls r6, r7\n\t"
  895. #else
  896. "mul r6, r7\n\t"
  897. #endif
  898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  899. "lsrs r7, r6, #16\n\t"
  900. #else
  901. "lsr r7, r6, #16\n\t"
  902. #endif
  903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  904. "lsls r6, r6, #16\n\t"
  905. #else
  906. "lsl r6, r6, #16\n\t"
  907. #endif
  908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  909. "adds r5, r5, r6\n\t"
  910. #else
  911. "add r5, r5, r6\n\t"
  912. #endif
  913. #ifdef WOLFSSL_KEIL
  914. "adcs r3, r3, r7\n\t"
  915. #elif defined(__clang__)
  916. "adcs r3, r7\n\t"
  917. #else
  918. "adc r3, r7\n\t"
  919. #endif
  920. #ifdef WOLFSSL_KEIL
  921. "adcs r4, r4, %[r]\n\t"
  922. #elif defined(__clang__)
  923. "adcs r4, %[r]\n\t"
  924. #else
  925. "adc r4, %[r]\n\t"
  926. #endif
  927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  928. "lsrs r6, %[a], #16\n\t"
  929. #else
  930. "lsr r6, %[a], #16\n\t"
  931. #endif
  932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  933. "lsrs r7, %[b], #16\n\t"
  934. #else
  935. "lsr r7, %[b], #16\n\t"
  936. #endif
  937. #ifdef WOLFSSL_KEIL
  938. "muls r7, r6, r7\n\t"
  939. #elif defined(__clang__)
  940. "muls r7, r6\n\t"
  941. #else
  942. "mul r7, r6\n\t"
  943. #endif
  944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  945. "adds r3, r3, r7\n\t"
  946. #else
  947. "add r3, r3, r7\n\t"
  948. #endif
  949. #ifdef WOLFSSL_KEIL
  950. "adcs r4, r4, %[r]\n\t"
  951. #elif defined(__clang__)
  952. "adcs r4, %[r]\n\t"
  953. #else
  954. "adc r4, %[r]\n\t"
  955. #endif
  956. "uxth r7, %[b]\n\t"
  957. #ifdef WOLFSSL_KEIL
  958. "muls r6, r7, r6\n\t"
  959. #elif defined(__clang__)
  960. "muls r6, r7\n\t"
  961. #else
  962. "mul r6, r7\n\t"
  963. #endif
  964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  965. "lsrs r7, r6, #16\n\t"
  966. #else
  967. "lsr r7, r6, #16\n\t"
  968. #endif
  969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  970. "lsls r6, r6, #16\n\t"
  971. #else
  972. "lsl r6, r6, #16\n\t"
  973. #endif
  974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  975. "adds r5, r5, r6\n\t"
  976. #else
  977. "add r5, r5, r6\n\t"
  978. #endif
  979. #ifdef WOLFSSL_KEIL
  980. "adcs r3, r3, r7\n\t"
  981. #elif defined(__clang__)
  982. "adcs r3, r7\n\t"
  983. #else
  984. "adc r3, r7\n\t"
  985. #endif
  986. #ifdef WOLFSSL_KEIL
  987. "adcs r4, r4, %[r]\n\t"
  988. #elif defined(__clang__)
  989. "adcs r4, %[r]\n\t"
  990. #else
  991. "adc r4, %[r]\n\t"
  992. #endif
  993. "# A[1] * B[1]\n\t"
  994. "mov %[a], r9\n\t"
  995. "mov %[b], r10\n\t"
  996. "ldr %[a], [%[a], #4]\n\t"
  997. "ldr %[b], [%[b], #4]\n\t"
  998. "uxth r6, %[a]\n\t"
  999. "uxth r7, %[b]\n\t"
  1000. #ifdef WOLFSSL_KEIL
  1001. "muls r7, r6, r7\n\t"
  1002. #elif defined(__clang__)
  1003. "muls r7, r6\n\t"
  1004. #else
  1005. "mul r7, r6\n\t"
  1006. #endif
  1007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1008. "adds r5, r5, r7\n\t"
  1009. #else
  1010. "add r5, r5, r7\n\t"
  1011. #endif
  1012. #ifdef WOLFSSL_KEIL
  1013. "adcs r3, r3, %[r]\n\t"
  1014. #elif defined(__clang__)
  1015. "adcs r3, %[r]\n\t"
  1016. #else
  1017. "adc r3, %[r]\n\t"
  1018. #endif
  1019. #ifdef WOLFSSL_KEIL
  1020. "adcs r4, r4, %[r]\n\t"
  1021. #elif defined(__clang__)
  1022. "adcs r4, %[r]\n\t"
  1023. #else
  1024. "adc r4, %[r]\n\t"
  1025. #endif
  1026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1027. "lsrs r7, %[b], #16\n\t"
  1028. #else
  1029. "lsr r7, %[b], #16\n\t"
  1030. #endif
  1031. #ifdef WOLFSSL_KEIL
  1032. "muls r6, r7, r6\n\t"
  1033. #elif defined(__clang__)
  1034. "muls r6, r7\n\t"
  1035. #else
  1036. "mul r6, r7\n\t"
  1037. #endif
  1038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1039. "lsrs r7, r6, #16\n\t"
  1040. #else
  1041. "lsr r7, r6, #16\n\t"
  1042. #endif
  1043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1044. "lsls r6, r6, #16\n\t"
  1045. #else
  1046. "lsl r6, r6, #16\n\t"
  1047. #endif
  1048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1049. "adds r5, r5, r6\n\t"
  1050. #else
  1051. "add r5, r5, r6\n\t"
  1052. #endif
  1053. #ifdef WOLFSSL_KEIL
  1054. "adcs r3, r3, r7\n\t"
  1055. #elif defined(__clang__)
  1056. "adcs r3, r7\n\t"
  1057. #else
  1058. "adc r3, r7\n\t"
  1059. #endif
  1060. #ifdef WOLFSSL_KEIL
  1061. "adcs r4, r4, %[r]\n\t"
  1062. #elif defined(__clang__)
  1063. "adcs r4, %[r]\n\t"
  1064. #else
  1065. "adc r4, %[r]\n\t"
  1066. #endif
  1067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1068. "lsrs r6, %[a], #16\n\t"
  1069. #else
  1070. "lsr r6, %[a], #16\n\t"
  1071. #endif
  1072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1073. "lsrs r7, %[b], #16\n\t"
  1074. #else
  1075. "lsr r7, %[b], #16\n\t"
  1076. #endif
  1077. #ifdef WOLFSSL_KEIL
  1078. "muls r7, r6, r7\n\t"
  1079. #elif defined(__clang__)
  1080. "muls r7, r6\n\t"
  1081. #else
  1082. "mul r7, r6\n\t"
  1083. #endif
  1084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1085. "adds r3, r3, r7\n\t"
  1086. #else
  1087. "add r3, r3, r7\n\t"
  1088. #endif
  1089. #ifdef WOLFSSL_KEIL
  1090. "adcs r4, r4, %[r]\n\t"
  1091. #elif defined(__clang__)
  1092. "adcs r4, %[r]\n\t"
  1093. #else
  1094. "adc r4, %[r]\n\t"
  1095. #endif
  1096. "uxth r7, %[b]\n\t"
  1097. #ifdef WOLFSSL_KEIL
  1098. "muls r6, r7, r6\n\t"
  1099. #elif defined(__clang__)
  1100. "muls r6, r7\n\t"
  1101. #else
  1102. "mul r6, r7\n\t"
  1103. #endif
  1104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1105. "lsrs r7, r6, #16\n\t"
  1106. #else
  1107. "lsr r7, r6, #16\n\t"
  1108. #endif
  1109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1110. "lsls r6, r6, #16\n\t"
  1111. #else
  1112. "lsl r6, r6, #16\n\t"
  1113. #endif
  1114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1115. "adds r5, r5, r6\n\t"
  1116. #else
  1117. "add r5, r5, r6\n\t"
  1118. #endif
  1119. #ifdef WOLFSSL_KEIL
  1120. "adcs r3, r3, r7\n\t"
  1121. #elif defined(__clang__)
  1122. "adcs r3, r7\n\t"
  1123. #else
  1124. "adc r3, r7\n\t"
  1125. #endif
  1126. #ifdef WOLFSSL_KEIL
  1127. "adcs r4, r4, %[r]\n\t"
  1128. #elif defined(__clang__)
  1129. "adcs r4, %[r]\n\t"
  1130. #else
  1131. "adc r4, %[r]\n\t"
  1132. #endif
  1133. "# A[0] * B[2]\n\t"
  1134. "mov %[a], r9\n\t"
  1135. "mov %[b], r10\n\t"
  1136. "ldr %[a], [%[a]]\n\t"
  1137. "ldr %[b], [%[b], #8]\n\t"
  1138. "uxth r6, %[a]\n\t"
  1139. "uxth r7, %[b]\n\t"
  1140. #ifdef WOLFSSL_KEIL
  1141. "muls r7, r6, r7\n\t"
  1142. #elif defined(__clang__)
  1143. "muls r7, r6\n\t"
  1144. #else
  1145. "mul r7, r6\n\t"
  1146. #endif
  1147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1148. "adds r5, r5, r7\n\t"
  1149. #else
  1150. "add r5, r5, r7\n\t"
  1151. #endif
  1152. #ifdef WOLFSSL_KEIL
  1153. "adcs r3, r3, %[r]\n\t"
  1154. #elif defined(__clang__)
  1155. "adcs r3, %[r]\n\t"
  1156. #else
  1157. "adc r3, %[r]\n\t"
  1158. #endif
  1159. #ifdef WOLFSSL_KEIL
  1160. "adcs r4, r4, %[r]\n\t"
  1161. #elif defined(__clang__)
  1162. "adcs r4, %[r]\n\t"
  1163. #else
  1164. "adc r4, %[r]\n\t"
  1165. #endif
  1166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1167. "lsrs r7, %[b], #16\n\t"
  1168. #else
  1169. "lsr r7, %[b], #16\n\t"
  1170. #endif
  1171. #ifdef WOLFSSL_KEIL
  1172. "muls r6, r7, r6\n\t"
  1173. #elif defined(__clang__)
  1174. "muls r6, r7\n\t"
  1175. #else
  1176. "mul r6, r7\n\t"
  1177. #endif
  1178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1179. "lsrs r7, r6, #16\n\t"
  1180. #else
  1181. "lsr r7, r6, #16\n\t"
  1182. #endif
  1183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1184. "lsls r6, r6, #16\n\t"
  1185. #else
  1186. "lsl r6, r6, #16\n\t"
  1187. #endif
  1188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1189. "adds r5, r5, r6\n\t"
  1190. #else
  1191. "add r5, r5, r6\n\t"
  1192. #endif
  1193. #ifdef WOLFSSL_KEIL
  1194. "adcs r3, r3, r7\n\t"
  1195. #elif defined(__clang__)
  1196. "adcs r3, r7\n\t"
  1197. #else
  1198. "adc r3, r7\n\t"
  1199. #endif
  1200. #ifdef WOLFSSL_KEIL
  1201. "adcs r4, r4, %[r]\n\t"
  1202. #elif defined(__clang__)
  1203. "adcs r4, %[r]\n\t"
  1204. #else
  1205. "adc r4, %[r]\n\t"
  1206. #endif
  1207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1208. "lsrs r6, %[a], #16\n\t"
  1209. #else
  1210. "lsr r6, %[a], #16\n\t"
  1211. #endif
  1212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1213. "lsrs r7, %[b], #16\n\t"
  1214. #else
  1215. "lsr r7, %[b], #16\n\t"
  1216. #endif
  1217. #ifdef WOLFSSL_KEIL
  1218. "muls r7, r6, r7\n\t"
  1219. #elif defined(__clang__)
  1220. "muls r7, r6\n\t"
  1221. #else
  1222. "mul r7, r6\n\t"
  1223. #endif
  1224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1225. "adds r3, r3, r7\n\t"
  1226. #else
  1227. "add r3, r3, r7\n\t"
  1228. #endif
  1229. #ifdef WOLFSSL_KEIL
  1230. "adcs r4, r4, %[r]\n\t"
  1231. #elif defined(__clang__)
  1232. "adcs r4, %[r]\n\t"
  1233. #else
  1234. "adc r4, %[r]\n\t"
  1235. #endif
  1236. "uxth r7, %[b]\n\t"
  1237. #ifdef WOLFSSL_KEIL
  1238. "muls r6, r7, r6\n\t"
  1239. #elif defined(__clang__)
  1240. "muls r6, r7\n\t"
  1241. #else
  1242. "mul r6, r7\n\t"
  1243. #endif
  1244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1245. "lsrs r7, r6, #16\n\t"
  1246. #else
  1247. "lsr r7, r6, #16\n\t"
  1248. #endif
  1249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1250. "lsls r6, r6, #16\n\t"
  1251. #else
  1252. "lsl r6, r6, #16\n\t"
  1253. #endif
  1254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1255. "adds r5, r5, r6\n\t"
  1256. #else
  1257. "add r5, r5, r6\n\t"
  1258. #endif
  1259. #ifdef WOLFSSL_KEIL
  1260. "adcs r3, r3, r7\n\t"
  1261. #elif defined(__clang__)
  1262. "adcs r3, r7\n\t"
  1263. #else
  1264. "adc r3, r7\n\t"
  1265. #endif
  1266. #ifdef WOLFSSL_KEIL
  1267. "adcs r4, r4, %[r]\n\t"
  1268. #elif defined(__clang__)
  1269. "adcs r4, %[r]\n\t"
  1270. #else
  1271. "adc r4, %[r]\n\t"
  1272. #endif
  1273. "str r5, [sp, #8]\n\t"
  1274. "# A[0] * B[3]\n\t"
  1275. "movs r5, #0\n\t"
  1276. "mov %[a], r9\n\t"
  1277. "mov %[b], r10\n\t"
  1278. "ldr %[a], [%[a]]\n\t"
  1279. "ldr %[b], [%[b], #12]\n\t"
  1280. "uxth r6, %[a]\n\t"
  1281. "uxth r7, %[b]\n\t"
  1282. #ifdef WOLFSSL_KEIL
  1283. "muls r7, r6, r7\n\t"
  1284. #elif defined(__clang__)
  1285. "muls r7, r6\n\t"
  1286. #else
  1287. "mul r7, r6\n\t"
  1288. #endif
  1289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1290. "adds r3, r3, r7\n\t"
  1291. #else
  1292. "add r3, r3, r7\n\t"
  1293. #endif
  1294. #ifdef WOLFSSL_KEIL
  1295. "adcs r4, r4, %[r]\n\t"
  1296. #elif defined(__clang__)
  1297. "adcs r4, %[r]\n\t"
  1298. #else
  1299. "adc r4, %[r]\n\t"
  1300. #endif
  1301. #ifdef WOLFSSL_KEIL
  1302. "adcs r5, r5, %[r]\n\t"
  1303. #elif defined(__clang__)
  1304. "adcs r5, %[r]\n\t"
  1305. #else
  1306. "adc r5, %[r]\n\t"
  1307. #endif
  1308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1309. "lsrs r7, %[b], #16\n\t"
  1310. #else
  1311. "lsr r7, %[b], #16\n\t"
  1312. #endif
  1313. #ifdef WOLFSSL_KEIL
  1314. "muls r6, r7, r6\n\t"
  1315. #elif defined(__clang__)
  1316. "muls r6, r7\n\t"
  1317. #else
  1318. "mul r6, r7\n\t"
  1319. #endif
  1320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1321. "lsrs r7, r6, #16\n\t"
  1322. #else
  1323. "lsr r7, r6, #16\n\t"
  1324. #endif
  1325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1326. "lsls r6, r6, #16\n\t"
  1327. #else
  1328. "lsl r6, r6, #16\n\t"
  1329. #endif
  1330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1331. "adds r3, r3, r6\n\t"
  1332. #else
  1333. "add r3, r3, r6\n\t"
  1334. #endif
  1335. #ifdef WOLFSSL_KEIL
  1336. "adcs r4, r4, r7\n\t"
  1337. #elif defined(__clang__)
  1338. "adcs r4, r7\n\t"
  1339. #else
  1340. "adc r4, r7\n\t"
  1341. #endif
  1342. #ifdef WOLFSSL_KEIL
  1343. "adcs r5, r5, %[r]\n\t"
  1344. #elif defined(__clang__)
  1345. "adcs r5, %[r]\n\t"
  1346. #else
  1347. "adc r5, %[r]\n\t"
  1348. #endif
  1349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1350. "lsrs r6, %[a], #16\n\t"
  1351. #else
  1352. "lsr r6, %[a], #16\n\t"
  1353. #endif
  1354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1355. "lsrs r7, %[b], #16\n\t"
  1356. #else
  1357. "lsr r7, %[b], #16\n\t"
  1358. #endif
  1359. #ifdef WOLFSSL_KEIL
  1360. "muls r7, r6, r7\n\t"
  1361. #elif defined(__clang__)
  1362. "muls r7, r6\n\t"
  1363. #else
  1364. "mul r7, r6\n\t"
  1365. #endif
  1366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1367. "adds r4, r4, r7\n\t"
  1368. #else
  1369. "add r4, r4, r7\n\t"
  1370. #endif
  1371. #ifdef WOLFSSL_KEIL
  1372. "adcs r5, r5, %[r]\n\t"
  1373. #elif defined(__clang__)
  1374. "adcs r5, %[r]\n\t"
  1375. #else
  1376. "adc r5, %[r]\n\t"
  1377. #endif
  1378. "uxth r7, %[b]\n\t"
  1379. #ifdef WOLFSSL_KEIL
  1380. "muls r6, r7, r6\n\t"
  1381. #elif defined(__clang__)
  1382. "muls r6, r7\n\t"
  1383. #else
  1384. "mul r6, r7\n\t"
  1385. #endif
  1386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1387. "lsrs r7, r6, #16\n\t"
  1388. #else
  1389. "lsr r7, r6, #16\n\t"
  1390. #endif
  1391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1392. "lsls r6, r6, #16\n\t"
  1393. #else
  1394. "lsl r6, r6, #16\n\t"
  1395. #endif
  1396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1397. "adds r3, r3, r6\n\t"
  1398. #else
  1399. "add r3, r3, r6\n\t"
  1400. #endif
  1401. #ifdef WOLFSSL_KEIL
  1402. "adcs r4, r4, r7\n\t"
  1403. #elif defined(__clang__)
  1404. "adcs r4, r7\n\t"
  1405. #else
  1406. "adc r4, r7\n\t"
  1407. #endif
  1408. #ifdef WOLFSSL_KEIL
  1409. "adcs r5, r5, %[r]\n\t"
  1410. #elif defined(__clang__)
  1411. "adcs r5, %[r]\n\t"
  1412. #else
  1413. "adc r5, %[r]\n\t"
  1414. #endif
  1415. "# A[1] * B[2]\n\t"
  1416. "mov %[a], r9\n\t"
  1417. "mov %[b], r10\n\t"
  1418. "ldr %[a], [%[a], #4]\n\t"
  1419. "ldr %[b], [%[b], #8]\n\t"
  1420. "uxth r6, %[a]\n\t"
  1421. "uxth r7, %[b]\n\t"
  1422. #ifdef WOLFSSL_KEIL
  1423. "muls r7, r6, r7\n\t"
  1424. #elif defined(__clang__)
  1425. "muls r7, r6\n\t"
  1426. #else
  1427. "mul r7, r6\n\t"
  1428. #endif
  1429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1430. "adds r3, r3, r7\n\t"
  1431. #else
  1432. "add r3, r3, r7\n\t"
  1433. #endif
  1434. #ifdef WOLFSSL_KEIL
  1435. "adcs r4, r4, %[r]\n\t"
  1436. #elif defined(__clang__)
  1437. "adcs r4, %[r]\n\t"
  1438. #else
  1439. "adc r4, %[r]\n\t"
  1440. #endif
  1441. #ifdef WOLFSSL_KEIL
  1442. "adcs r5, r5, %[r]\n\t"
  1443. #elif defined(__clang__)
  1444. "adcs r5, %[r]\n\t"
  1445. #else
  1446. "adc r5, %[r]\n\t"
  1447. #endif
  1448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1449. "lsrs r7, %[b], #16\n\t"
  1450. #else
  1451. "lsr r7, %[b], #16\n\t"
  1452. #endif
  1453. #ifdef WOLFSSL_KEIL
  1454. "muls r6, r7, r6\n\t"
  1455. #elif defined(__clang__)
  1456. "muls r6, r7\n\t"
  1457. #else
  1458. "mul r6, r7\n\t"
  1459. #endif
  1460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1461. "lsrs r7, r6, #16\n\t"
  1462. #else
  1463. "lsr r7, r6, #16\n\t"
  1464. #endif
  1465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1466. "lsls r6, r6, #16\n\t"
  1467. #else
  1468. "lsl r6, r6, #16\n\t"
  1469. #endif
  1470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1471. "adds r3, r3, r6\n\t"
  1472. #else
  1473. "add r3, r3, r6\n\t"
  1474. #endif
  1475. #ifdef WOLFSSL_KEIL
  1476. "adcs r4, r4, r7\n\t"
  1477. #elif defined(__clang__)
  1478. "adcs r4, r7\n\t"
  1479. #else
  1480. "adc r4, r7\n\t"
  1481. #endif
  1482. #ifdef WOLFSSL_KEIL
  1483. "adcs r5, r5, %[r]\n\t"
  1484. #elif defined(__clang__)
  1485. "adcs r5, %[r]\n\t"
  1486. #else
  1487. "adc r5, %[r]\n\t"
  1488. #endif
  1489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1490. "lsrs r6, %[a], #16\n\t"
  1491. #else
  1492. "lsr r6, %[a], #16\n\t"
  1493. #endif
  1494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1495. "lsrs r7, %[b], #16\n\t"
  1496. #else
  1497. "lsr r7, %[b], #16\n\t"
  1498. #endif
  1499. #ifdef WOLFSSL_KEIL
  1500. "muls r7, r6, r7\n\t"
  1501. #elif defined(__clang__)
  1502. "muls r7, r6\n\t"
  1503. #else
  1504. "mul r7, r6\n\t"
  1505. #endif
  1506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1507. "adds r4, r4, r7\n\t"
  1508. #else
  1509. "add r4, r4, r7\n\t"
  1510. #endif
  1511. #ifdef WOLFSSL_KEIL
  1512. "adcs r5, r5, %[r]\n\t"
  1513. #elif defined(__clang__)
  1514. "adcs r5, %[r]\n\t"
  1515. #else
  1516. "adc r5, %[r]\n\t"
  1517. #endif
  1518. "uxth r7, %[b]\n\t"
  1519. #ifdef WOLFSSL_KEIL
  1520. "muls r6, r7, r6\n\t"
  1521. #elif defined(__clang__)
  1522. "muls r6, r7\n\t"
  1523. #else
  1524. "mul r6, r7\n\t"
  1525. #endif
  1526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1527. "lsrs r7, r6, #16\n\t"
  1528. #else
  1529. "lsr r7, r6, #16\n\t"
  1530. #endif
  1531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1532. "lsls r6, r6, #16\n\t"
  1533. #else
  1534. "lsl r6, r6, #16\n\t"
  1535. #endif
  1536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1537. "adds r3, r3, r6\n\t"
  1538. #else
  1539. "add r3, r3, r6\n\t"
  1540. #endif
  1541. #ifdef WOLFSSL_KEIL
  1542. "adcs r4, r4, r7\n\t"
  1543. #elif defined(__clang__)
  1544. "adcs r4, r7\n\t"
  1545. #else
  1546. "adc r4, r7\n\t"
  1547. #endif
  1548. #ifdef WOLFSSL_KEIL
  1549. "adcs r5, r5, %[r]\n\t"
  1550. #elif defined(__clang__)
  1551. "adcs r5, %[r]\n\t"
  1552. #else
  1553. "adc r5, %[r]\n\t"
  1554. #endif
  1555. "# A[2] * B[1]\n\t"
  1556. "mov %[a], r9\n\t"
  1557. "mov %[b], r10\n\t"
  1558. "ldr %[a], [%[a], #8]\n\t"
  1559. "ldr %[b], [%[b], #4]\n\t"
  1560. "uxth r6, %[a]\n\t"
  1561. "uxth r7, %[b]\n\t"
  1562. #ifdef WOLFSSL_KEIL
  1563. "muls r7, r6, r7\n\t"
  1564. #elif defined(__clang__)
  1565. "muls r7, r6\n\t"
  1566. #else
  1567. "mul r7, r6\n\t"
  1568. #endif
  1569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1570. "adds r3, r3, r7\n\t"
  1571. #else
  1572. "add r3, r3, r7\n\t"
  1573. #endif
  1574. #ifdef WOLFSSL_KEIL
  1575. "adcs r4, r4, %[r]\n\t"
  1576. #elif defined(__clang__)
  1577. "adcs r4, %[r]\n\t"
  1578. #else
  1579. "adc r4, %[r]\n\t"
  1580. #endif
  1581. #ifdef WOLFSSL_KEIL
  1582. "adcs r5, r5, %[r]\n\t"
  1583. #elif defined(__clang__)
  1584. "adcs r5, %[r]\n\t"
  1585. #else
  1586. "adc r5, %[r]\n\t"
  1587. #endif
  1588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1589. "lsrs r7, %[b], #16\n\t"
  1590. #else
  1591. "lsr r7, %[b], #16\n\t"
  1592. #endif
  1593. #ifdef WOLFSSL_KEIL
  1594. "muls r6, r7, r6\n\t"
  1595. #elif defined(__clang__)
  1596. "muls r6, r7\n\t"
  1597. #else
  1598. "mul r6, r7\n\t"
  1599. #endif
  1600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1601. "lsrs r7, r6, #16\n\t"
  1602. #else
  1603. "lsr r7, r6, #16\n\t"
  1604. #endif
  1605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1606. "lsls r6, r6, #16\n\t"
  1607. #else
  1608. "lsl r6, r6, #16\n\t"
  1609. #endif
  1610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1611. "adds r3, r3, r6\n\t"
  1612. #else
  1613. "add r3, r3, r6\n\t"
  1614. #endif
  1615. #ifdef WOLFSSL_KEIL
  1616. "adcs r4, r4, r7\n\t"
  1617. #elif defined(__clang__)
  1618. "adcs r4, r7\n\t"
  1619. #else
  1620. "adc r4, r7\n\t"
  1621. #endif
  1622. #ifdef WOLFSSL_KEIL
  1623. "adcs r5, r5, %[r]\n\t"
  1624. #elif defined(__clang__)
  1625. "adcs r5, %[r]\n\t"
  1626. #else
  1627. "adc r5, %[r]\n\t"
  1628. #endif
  1629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1630. "lsrs r6, %[a], #16\n\t"
  1631. #else
  1632. "lsr r6, %[a], #16\n\t"
  1633. #endif
  1634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1635. "lsrs r7, %[b], #16\n\t"
  1636. #else
  1637. "lsr r7, %[b], #16\n\t"
  1638. #endif
  1639. #ifdef WOLFSSL_KEIL
  1640. "muls r7, r6, r7\n\t"
  1641. #elif defined(__clang__)
  1642. "muls r7, r6\n\t"
  1643. #else
  1644. "mul r7, r6\n\t"
  1645. #endif
  1646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1647. "adds r4, r4, r7\n\t"
  1648. #else
  1649. "add r4, r4, r7\n\t"
  1650. #endif
  1651. #ifdef WOLFSSL_KEIL
  1652. "adcs r5, r5, %[r]\n\t"
  1653. #elif defined(__clang__)
  1654. "adcs r5, %[r]\n\t"
  1655. #else
  1656. "adc r5, %[r]\n\t"
  1657. #endif
  1658. "uxth r7, %[b]\n\t"
  1659. #ifdef WOLFSSL_KEIL
  1660. "muls r6, r7, r6\n\t"
  1661. #elif defined(__clang__)
  1662. "muls r6, r7\n\t"
  1663. #else
  1664. "mul r6, r7\n\t"
  1665. #endif
  1666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1667. "lsrs r7, r6, #16\n\t"
  1668. #else
  1669. "lsr r7, r6, #16\n\t"
  1670. #endif
  1671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1672. "lsls r6, r6, #16\n\t"
  1673. #else
  1674. "lsl r6, r6, #16\n\t"
  1675. #endif
  1676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1677. "adds r3, r3, r6\n\t"
  1678. #else
  1679. "add r3, r3, r6\n\t"
  1680. #endif
  1681. #ifdef WOLFSSL_KEIL
  1682. "adcs r4, r4, r7\n\t"
  1683. #elif defined(__clang__)
  1684. "adcs r4, r7\n\t"
  1685. #else
  1686. "adc r4, r7\n\t"
  1687. #endif
  1688. #ifdef WOLFSSL_KEIL
  1689. "adcs r5, r5, %[r]\n\t"
  1690. #elif defined(__clang__)
  1691. "adcs r5, %[r]\n\t"
  1692. #else
  1693. "adc r5, %[r]\n\t"
  1694. #endif
  1695. "# A[3] * B[0]\n\t"
  1696. "mov %[a], r9\n\t"
  1697. "mov %[b], r10\n\t"
  1698. "ldr %[a], [%[a], #12]\n\t"
  1699. "ldr %[b], [%[b]]\n\t"
  1700. "uxth r6, %[a]\n\t"
  1701. "uxth r7, %[b]\n\t"
  1702. #ifdef WOLFSSL_KEIL
  1703. "muls r7, r6, r7\n\t"
  1704. #elif defined(__clang__)
  1705. "muls r7, r6\n\t"
  1706. #else
  1707. "mul r7, r6\n\t"
  1708. #endif
  1709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1710. "adds r3, r3, r7\n\t"
  1711. #else
  1712. "add r3, r3, r7\n\t"
  1713. #endif
  1714. #ifdef WOLFSSL_KEIL
  1715. "adcs r4, r4, %[r]\n\t"
  1716. #elif defined(__clang__)
  1717. "adcs r4, %[r]\n\t"
  1718. #else
  1719. "adc r4, %[r]\n\t"
  1720. #endif
  1721. #ifdef WOLFSSL_KEIL
  1722. "adcs r5, r5, %[r]\n\t"
  1723. #elif defined(__clang__)
  1724. "adcs r5, %[r]\n\t"
  1725. #else
  1726. "adc r5, %[r]\n\t"
  1727. #endif
  1728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1729. "lsrs r7, %[b], #16\n\t"
  1730. #else
  1731. "lsr r7, %[b], #16\n\t"
  1732. #endif
  1733. #ifdef WOLFSSL_KEIL
  1734. "muls r6, r7, r6\n\t"
  1735. #elif defined(__clang__)
  1736. "muls r6, r7\n\t"
  1737. #else
  1738. "mul r6, r7\n\t"
  1739. #endif
  1740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1741. "lsrs r7, r6, #16\n\t"
  1742. #else
  1743. "lsr r7, r6, #16\n\t"
  1744. #endif
  1745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1746. "lsls r6, r6, #16\n\t"
  1747. #else
  1748. "lsl r6, r6, #16\n\t"
  1749. #endif
  1750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1751. "adds r3, r3, r6\n\t"
  1752. #else
  1753. "add r3, r3, r6\n\t"
  1754. #endif
  1755. #ifdef WOLFSSL_KEIL
  1756. "adcs r4, r4, r7\n\t"
  1757. #elif defined(__clang__)
  1758. "adcs r4, r7\n\t"
  1759. #else
  1760. "adc r4, r7\n\t"
  1761. #endif
  1762. #ifdef WOLFSSL_KEIL
  1763. "adcs r5, r5, %[r]\n\t"
  1764. #elif defined(__clang__)
  1765. "adcs r5, %[r]\n\t"
  1766. #else
  1767. "adc r5, %[r]\n\t"
  1768. #endif
  1769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1770. "lsrs r6, %[a], #16\n\t"
  1771. #else
  1772. "lsr r6, %[a], #16\n\t"
  1773. #endif
  1774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1775. "lsrs r7, %[b], #16\n\t"
  1776. #else
  1777. "lsr r7, %[b], #16\n\t"
  1778. #endif
  1779. #ifdef WOLFSSL_KEIL
  1780. "muls r7, r6, r7\n\t"
  1781. #elif defined(__clang__)
  1782. "muls r7, r6\n\t"
  1783. #else
  1784. "mul r7, r6\n\t"
  1785. #endif
  1786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1787. "adds r4, r4, r7\n\t"
  1788. #else
  1789. "add r4, r4, r7\n\t"
  1790. #endif
  1791. #ifdef WOLFSSL_KEIL
  1792. "adcs r5, r5, %[r]\n\t"
  1793. #elif defined(__clang__)
  1794. "adcs r5, %[r]\n\t"
  1795. #else
  1796. "adc r5, %[r]\n\t"
  1797. #endif
  1798. "uxth r7, %[b]\n\t"
  1799. #ifdef WOLFSSL_KEIL
  1800. "muls r6, r7, r6\n\t"
  1801. #elif defined(__clang__)
  1802. "muls r6, r7\n\t"
  1803. #else
  1804. "mul r6, r7\n\t"
  1805. #endif
  1806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1807. "lsrs r7, r6, #16\n\t"
  1808. #else
  1809. "lsr r7, r6, #16\n\t"
  1810. #endif
  1811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1812. "lsls r6, r6, #16\n\t"
  1813. #else
  1814. "lsl r6, r6, #16\n\t"
  1815. #endif
  1816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1817. "adds r3, r3, r6\n\t"
  1818. #else
  1819. "add r3, r3, r6\n\t"
  1820. #endif
  1821. #ifdef WOLFSSL_KEIL
  1822. "adcs r4, r4, r7\n\t"
  1823. #elif defined(__clang__)
  1824. "adcs r4, r7\n\t"
  1825. #else
  1826. "adc r4, r7\n\t"
  1827. #endif
  1828. #ifdef WOLFSSL_KEIL
  1829. "adcs r5, r5, %[r]\n\t"
  1830. #elif defined(__clang__)
  1831. "adcs r5, %[r]\n\t"
  1832. #else
  1833. "adc r5, %[r]\n\t"
  1834. #endif
  1835. "str r3, [sp, #12]\n\t"
  1836. "# A[4] * B[0]\n\t"
  1837. "movs r3, #0\n\t"
  1838. "mov %[a], r9\n\t"
  1839. "mov %[b], r10\n\t"
  1840. "ldr %[a], [%[a], #16]\n\t"
  1841. "ldr %[b], [%[b]]\n\t"
  1842. "uxth r6, %[a]\n\t"
  1843. "uxth r7, %[b]\n\t"
  1844. #ifdef WOLFSSL_KEIL
  1845. "muls r7, r6, r7\n\t"
  1846. #elif defined(__clang__)
  1847. "muls r7, r6\n\t"
  1848. #else
  1849. "mul r7, r6\n\t"
  1850. #endif
  1851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1852. "adds r4, r4, r7\n\t"
  1853. #else
  1854. "add r4, r4, r7\n\t"
  1855. #endif
  1856. #ifdef WOLFSSL_KEIL
  1857. "adcs r5, r5, %[r]\n\t"
  1858. #elif defined(__clang__)
  1859. "adcs r5, %[r]\n\t"
  1860. #else
  1861. "adc r5, %[r]\n\t"
  1862. #endif
  1863. #ifdef WOLFSSL_KEIL
  1864. "adcs r3, r3, %[r]\n\t"
  1865. #elif defined(__clang__)
  1866. "adcs r3, %[r]\n\t"
  1867. #else
  1868. "adc r3, %[r]\n\t"
  1869. #endif
  1870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1871. "lsrs r7, %[b], #16\n\t"
  1872. #else
  1873. "lsr r7, %[b], #16\n\t"
  1874. #endif
  1875. #ifdef WOLFSSL_KEIL
  1876. "muls r6, r7, r6\n\t"
  1877. #elif defined(__clang__)
  1878. "muls r6, r7\n\t"
  1879. #else
  1880. "mul r6, r7\n\t"
  1881. #endif
  1882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1883. "lsrs r7, r6, #16\n\t"
  1884. #else
  1885. "lsr r7, r6, #16\n\t"
  1886. #endif
  1887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1888. "lsls r6, r6, #16\n\t"
  1889. #else
  1890. "lsl r6, r6, #16\n\t"
  1891. #endif
  1892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1893. "adds r4, r4, r6\n\t"
  1894. #else
  1895. "add r4, r4, r6\n\t"
  1896. #endif
  1897. #ifdef WOLFSSL_KEIL
  1898. "adcs r5, r5, r7\n\t"
  1899. #elif defined(__clang__)
  1900. "adcs r5, r7\n\t"
  1901. #else
  1902. "adc r5, r7\n\t"
  1903. #endif
  1904. #ifdef WOLFSSL_KEIL
  1905. "adcs r3, r3, %[r]\n\t"
  1906. #elif defined(__clang__)
  1907. "adcs r3, %[r]\n\t"
  1908. #else
  1909. "adc r3, %[r]\n\t"
  1910. #endif
  1911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1912. "lsrs r6, %[a], #16\n\t"
  1913. #else
  1914. "lsr r6, %[a], #16\n\t"
  1915. #endif
  1916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1917. "lsrs r7, %[b], #16\n\t"
  1918. #else
  1919. "lsr r7, %[b], #16\n\t"
  1920. #endif
  1921. #ifdef WOLFSSL_KEIL
  1922. "muls r7, r6, r7\n\t"
  1923. #elif defined(__clang__)
  1924. "muls r7, r6\n\t"
  1925. #else
  1926. "mul r7, r6\n\t"
  1927. #endif
  1928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1929. "adds r5, r5, r7\n\t"
  1930. #else
  1931. "add r5, r5, r7\n\t"
  1932. #endif
  1933. #ifdef WOLFSSL_KEIL
  1934. "adcs r3, r3, %[r]\n\t"
  1935. #elif defined(__clang__)
  1936. "adcs r3, %[r]\n\t"
  1937. #else
  1938. "adc r3, %[r]\n\t"
  1939. #endif
  1940. "uxth r7, %[b]\n\t"
  1941. #ifdef WOLFSSL_KEIL
  1942. "muls r6, r7, r6\n\t"
  1943. #elif defined(__clang__)
  1944. "muls r6, r7\n\t"
  1945. #else
  1946. "mul r6, r7\n\t"
  1947. #endif
  1948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1949. "lsrs r7, r6, #16\n\t"
  1950. #else
  1951. "lsr r7, r6, #16\n\t"
  1952. #endif
  1953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1954. "lsls r6, r6, #16\n\t"
  1955. #else
  1956. "lsl r6, r6, #16\n\t"
  1957. #endif
  1958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1959. "adds r4, r4, r6\n\t"
  1960. #else
  1961. "add r4, r4, r6\n\t"
  1962. #endif
  1963. #ifdef WOLFSSL_KEIL
  1964. "adcs r5, r5, r7\n\t"
  1965. #elif defined(__clang__)
  1966. "adcs r5, r7\n\t"
  1967. #else
  1968. "adc r5, r7\n\t"
  1969. #endif
  1970. #ifdef WOLFSSL_KEIL
  1971. "adcs r3, r3, %[r]\n\t"
  1972. #elif defined(__clang__)
  1973. "adcs r3, %[r]\n\t"
  1974. #else
  1975. "adc r3, %[r]\n\t"
  1976. #endif
  1977. "# A[3] * B[1]\n\t"
  1978. "mov %[a], r9\n\t"
  1979. "mov %[b], r10\n\t"
  1980. "ldr %[a], [%[a], #12]\n\t"
  1981. "ldr %[b], [%[b], #4]\n\t"
  1982. "uxth r6, %[a]\n\t"
  1983. "uxth r7, %[b]\n\t"
  1984. #ifdef WOLFSSL_KEIL
  1985. "muls r7, r6, r7\n\t"
  1986. #elif defined(__clang__)
  1987. "muls r7, r6\n\t"
  1988. #else
  1989. "mul r7, r6\n\t"
  1990. #endif
  1991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1992. "adds r4, r4, r7\n\t"
  1993. #else
  1994. "add r4, r4, r7\n\t"
  1995. #endif
  1996. #ifdef WOLFSSL_KEIL
  1997. "adcs r5, r5, %[r]\n\t"
  1998. #elif defined(__clang__)
  1999. "adcs r5, %[r]\n\t"
  2000. #else
  2001. "adc r5, %[r]\n\t"
  2002. #endif
  2003. #ifdef WOLFSSL_KEIL
  2004. "adcs r3, r3, %[r]\n\t"
  2005. #elif defined(__clang__)
  2006. "adcs r3, %[r]\n\t"
  2007. #else
  2008. "adc r3, %[r]\n\t"
  2009. #endif
  2010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2011. "lsrs r7, %[b], #16\n\t"
  2012. #else
  2013. "lsr r7, %[b], #16\n\t"
  2014. #endif
  2015. #ifdef WOLFSSL_KEIL
  2016. "muls r6, r7, r6\n\t"
  2017. #elif defined(__clang__)
  2018. "muls r6, r7\n\t"
  2019. #else
  2020. "mul r6, r7\n\t"
  2021. #endif
  2022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2023. "lsrs r7, r6, #16\n\t"
  2024. #else
  2025. "lsr r7, r6, #16\n\t"
  2026. #endif
  2027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2028. "lsls r6, r6, #16\n\t"
  2029. #else
  2030. "lsl r6, r6, #16\n\t"
  2031. #endif
  2032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2033. "adds r4, r4, r6\n\t"
  2034. #else
  2035. "add r4, r4, r6\n\t"
  2036. #endif
  2037. #ifdef WOLFSSL_KEIL
  2038. "adcs r5, r5, r7\n\t"
  2039. #elif defined(__clang__)
  2040. "adcs r5, r7\n\t"
  2041. #else
  2042. "adc r5, r7\n\t"
  2043. #endif
  2044. #ifdef WOLFSSL_KEIL
  2045. "adcs r3, r3, %[r]\n\t"
  2046. #elif defined(__clang__)
  2047. "adcs r3, %[r]\n\t"
  2048. #else
  2049. "adc r3, %[r]\n\t"
  2050. #endif
  2051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2052. "lsrs r6, %[a], #16\n\t"
  2053. #else
  2054. "lsr r6, %[a], #16\n\t"
  2055. #endif
  2056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2057. "lsrs r7, %[b], #16\n\t"
  2058. #else
  2059. "lsr r7, %[b], #16\n\t"
  2060. #endif
  2061. #ifdef WOLFSSL_KEIL
  2062. "muls r7, r6, r7\n\t"
  2063. #elif defined(__clang__)
  2064. "muls r7, r6\n\t"
  2065. #else
  2066. "mul r7, r6\n\t"
  2067. #endif
  2068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2069. "adds r5, r5, r7\n\t"
  2070. #else
  2071. "add r5, r5, r7\n\t"
  2072. #endif
  2073. #ifdef WOLFSSL_KEIL
  2074. "adcs r3, r3, %[r]\n\t"
  2075. #elif defined(__clang__)
  2076. "adcs r3, %[r]\n\t"
  2077. #else
  2078. "adc r3, %[r]\n\t"
  2079. #endif
  2080. "uxth r7, %[b]\n\t"
  2081. #ifdef WOLFSSL_KEIL
  2082. "muls r6, r7, r6\n\t"
  2083. #elif defined(__clang__)
  2084. "muls r6, r7\n\t"
  2085. #else
  2086. "mul r6, r7\n\t"
  2087. #endif
  2088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2089. "lsrs r7, r6, #16\n\t"
  2090. #else
  2091. "lsr r7, r6, #16\n\t"
  2092. #endif
  2093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2094. "lsls r6, r6, #16\n\t"
  2095. #else
  2096. "lsl r6, r6, #16\n\t"
  2097. #endif
  2098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2099. "adds r4, r4, r6\n\t"
  2100. #else
  2101. "add r4, r4, r6\n\t"
  2102. #endif
  2103. #ifdef WOLFSSL_KEIL
  2104. "adcs r5, r5, r7\n\t"
  2105. #elif defined(__clang__)
  2106. "adcs r5, r7\n\t"
  2107. #else
  2108. "adc r5, r7\n\t"
  2109. #endif
  2110. #ifdef WOLFSSL_KEIL
  2111. "adcs r3, r3, %[r]\n\t"
  2112. #elif defined(__clang__)
  2113. "adcs r3, %[r]\n\t"
  2114. #else
  2115. "adc r3, %[r]\n\t"
  2116. #endif
  2117. "# A[2] * B[2]\n\t"
  2118. "mov %[a], r9\n\t"
  2119. "mov %[b], r10\n\t"
  2120. "ldr %[a], [%[a], #8]\n\t"
  2121. "ldr %[b], [%[b], #8]\n\t"
  2122. "uxth r6, %[a]\n\t"
  2123. "uxth r7, %[b]\n\t"
  2124. #ifdef WOLFSSL_KEIL
  2125. "muls r7, r6, r7\n\t"
  2126. #elif defined(__clang__)
  2127. "muls r7, r6\n\t"
  2128. #else
  2129. "mul r7, r6\n\t"
  2130. #endif
  2131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2132. "adds r4, r4, r7\n\t"
  2133. #else
  2134. "add r4, r4, r7\n\t"
  2135. #endif
  2136. #ifdef WOLFSSL_KEIL
  2137. "adcs r5, r5, %[r]\n\t"
  2138. #elif defined(__clang__)
  2139. "adcs r5, %[r]\n\t"
  2140. #else
  2141. "adc r5, %[r]\n\t"
  2142. #endif
  2143. #ifdef WOLFSSL_KEIL
  2144. "adcs r3, r3, %[r]\n\t"
  2145. #elif defined(__clang__)
  2146. "adcs r3, %[r]\n\t"
  2147. #else
  2148. "adc r3, %[r]\n\t"
  2149. #endif
  2150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2151. "lsrs r7, %[b], #16\n\t"
  2152. #else
  2153. "lsr r7, %[b], #16\n\t"
  2154. #endif
  2155. #ifdef WOLFSSL_KEIL
  2156. "muls r6, r7, r6\n\t"
  2157. #elif defined(__clang__)
  2158. "muls r6, r7\n\t"
  2159. #else
  2160. "mul r6, r7\n\t"
  2161. #endif
  2162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2163. "lsrs r7, r6, #16\n\t"
  2164. #else
  2165. "lsr r7, r6, #16\n\t"
  2166. #endif
  2167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2168. "lsls r6, r6, #16\n\t"
  2169. #else
  2170. "lsl r6, r6, #16\n\t"
  2171. #endif
  2172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2173. "adds r4, r4, r6\n\t"
  2174. #else
  2175. "add r4, r4, r6\n\t"
  2176. #endif
  2177. #ifdef WOLFSSL_KEIL
  2178. "adcs r5, r5, r7\n\t"
  2179. #elif defined(__clang__)
  2180. "adcs r5, r7\n\t"
  2181. #else
  2182. "adc r5, r7\n\t"
  2183. #endif
  2184. #ifdef WOLFSSL_KEIL
  2185. "adcs r3, r3, %[r]\n\t"
  2186. #elif defined(__clang__)
  2187. "adcs r3, %[r]\n\t"
  2188. #else
  2189. "adc r3, %[r]\n\t"
  2190. #endif
  2191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2192. "lsrs r6, %[a], #16\n\t"
  2193. #else
  2194. "lsr r6, %[a], #16\n\t"
  2195. #endif
  2196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2197. "lsrs r7, %[b], #16\n\t"
  2198. #else
  2199. "lsr r7, %[b], #16\n\t"
  2200. #endif
  2201. #ifdef WOLFSSL_KEIL
  2202. "muls r7, r6, r7\n\t"
  2203. #elif defined(__clang__)
  2204. "muls r7, r6\n\t"
  2205. #else
  2206. "mul r7, r6\n\t"
  2207. #endif
  2208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2209. "adds r5, r5, r7\n\t"
  2210. #else
  2211. "add r5, r5, r7\n\t"
  2212. #endif
  2213. #ifdef WOLFSSL_KEIL
  2214. "adcs r3, r3, %[r]\n\t"
  2215. #elif defined(__clang__)
  2216. "adcs r3, %[r]\n\t"
  2217. #else
  2218. "adc r3, %[r]\n\t"
  2219. #endif
  2220. "uxth r7, %[b]\n\t"
  2221. #ifdef WOLFSSL_KEIL
  2222. "muls r6, r7, r6\n\t"
  2223. #elif defined(__clang__)
  2224. "muls r6, r7\n\t"
  2225. #else
  2226. "mul r6, r7\n\t"
  2227. #endif
  2228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2229. "lsrs r7, r6, #16\n\t"
  2230. #else
  2231. "lsr r7, r6, #16\n\t"
  2232. #endif
  2233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2234. "lsls r6, r6, #16\n\t"
  2235. #else
  2236. "lsl r6, r6, #16\n\t"
  2237. #endif
  2238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2239. "adds r4, r4, r6\n\t"
  2240. #else
  2241. "add r4, r4, r6\n\t"
  2242. #endif
  2243. #ifdef WOLFSSL_KEIL
  2244. "adcs r5, r5, r7\n\t"
  2245. #elif defined(__clang__)
  2246. "adcs r5, r7\n\t"
  2247. #else
  2248. "adc r5, r7\n\t"
  2249. #endif
  2250. #ifdef WOLFSSL_KEIL
  2251. "adcs r3, r3, %[r]\n\t"
  2252. #elif defined(__clang__)
  2253. "adcs r3, %[r]\n\t"
  2254. #else
  2255. "adc r3, %[r]\n\t"
  2256. #endif
  2257. "# A[1] * B[3]\n\t"
  2258. "mov %[a], r9\n\t"
  2259. "mov %[b], r10\n\t"
  2260. "ldr %[a], [%[a], #4]\n\t"
  2261. "ldr %[b], [%[b], #12]\n\t"
  2262. "uxth r6, %[a]\n\t"
  2263. "uxth r7, %[b]\n\t"
  2264. #ifdef WOLFSSL_KEIL
  2265. "muls r7, r6, r7\n\t"
  2266. #elif defined(__clang__)
  2267. "muls r7, r6\n\t"
  2268. #else
  2269. "mul r7, r6\n\t"
  2270. #endif
  2271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2272. "adds r4, r4, r7\n\t"
  2273. #else
  2274. "add r4, r4, r7\n\t"
  2275. #endif
  2276. #ifdef WOLFSSL_KEIL
  2277. "adcs r5, r5, %[r]\n\t"
  2278. #elif defined(__clang__)
  2279. "adcs r5, %[r]\n\t"
  2280. #else
  2281. "adc r5, %[r]\n\t"
  2282. #endif
  2283. #ifdef WOLFSSL_KEIL
  2284. "adcs r3, r3, %[r]\n\t"
  2285. #elif defined(__clang__)
  2286. "adcs r3, %[r]\n\t"
  2287. #else
  2288. "adc r3, %[r]\n\t"
  2289. #endif
  2290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2291. "lsrs r7, %[b], #16\n\t"
  2292. #else
  2293. "lsr r7, %[b], #16\n\t"
  2294. #endif
  2295. #ifdef WOLFSSL_KEIL
  2296. "muls r6, r7, r6\n\t"
  2297. #elif defined(__clang__)
  2298. "muls r6, r7\n\t"
  2299. #else
  2300. "mul r6, r7\n\t"
  2301. #endif
  2302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2303. "lsrs r7, r6, #16\n\t"
  2304. #else
  2305. "lsr r7, r6, #16\n\t"
  2306. #endif
  2307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2308. "lsls r6, r6, #16\n\t"
  2309. #else
  2310. "lsl r6, r6, #16\n\t"
  2311. #endif
  2312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2313. "adds r4, r4, r6\n\t"
  2314. #else
  2315. "add r4, r4, r6\n\t"
  2316. #endif
  2317. #ifdef WOLFSSL_KEIL
  2318. "adcs r5, r5, r7\n\t"
  2319. #elif defined(__clang__)
  2320. "adcs r5, r7\n\t"
  2321. #else
  2322. "adc r5, r7\n\t"
  2323. #endif
  2324. #ifdef WOLFSSL_KEIL
  2325. "adcs r3, r3, %[r]\n\t"
  2326. #elif defined(__clang__)
  2327. "adcs r3, %[r]\n\t"
  2328. #else
  2329. "adc r3, %[r]\n\t"
  2330. #endif
  2331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2332. "lsrs r6, %[a], #16\n\t"
  2333. #else
  2334. "lsr r6, %[a], #16\n\t"
  2335. #endif
  2336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2337. "lsrs r7, %[b], #16\n\t"
  2338. #else
  2339. "lsr r7, %[b], #16\n\t"
  2340. #endif
  2341. #ifdef WOLFSSL_KEIL
  2342. "muls r7, r6, r7\n\t"
  2343. #elif defined(__clang__)
  2344. "muls r7, r6\n\t"
  2345. #else
  2346. "mul r7, r6\n\t"
  2347. #endif
  2348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2349. "adds r5, r5, r7\n\t"
  2350. #else
  2351. "add r5, r5, r7\n\t"
  2352. #endif
  2353. #ifdef WOLFSSL_KEIL
  2354. "adcs r3, r3, %[r]\n\t"
  2355. #elif defined(__clang__)
  2356. "adcs r3, %[r]\n\t"
  2357. #else
  2358. "adc r3, %[r]\n\t"
  2359. #endif
  2360. "uxth r7, %[b]\n\t"
  2361. #ifdef WOLFSSL_KEIL
  2362. "muls r6, r7, r6\n\t"
  2363. #elif defined(__clang__)
  2364. "muls r6, r7\n\t"
  2365. #else
  2366. "mul r6, r7\n\t"
  2367. #endif
  2368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2369. "lsrs r7, r6, #16\n\t"
  2370. #else
  2371. "lsr r7, r6, #16\n\t"
  2372. #endif
  2373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2374. "lsls r6, r6, #16\n\t"
  2375. #else
  2376. "lsl r6, r6, #16\n\t"
  2377. #endif
  2378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2379. "adds r4, r4, r6\n\t"
  2380. #else
  2381. "add r4, r4, r6\n\t"
  2382. #endif
  2383. #ifdef WOLFSSL_KEIL
  2384. "adcs r5, r5, r7\n\t"
  2385. #elif defined(__clang__)
  2386. "adcs r5, r7\n\t"
  2387. #else
  2388. "adc r5, r7\n\t"
  2389. #endif
  2390. #ifdef WOLFSSL_KEIL
  2391. "adcs r3, r3, %[r]\n\t"
  2392. #elif defined(__clang__)
  2393. "adcs r3, %[r]\n\t"
  2394. #else
  2395. "adc r3, %[r]\n\t"
  2396. #endif
  2397. "# A[0] * B[4]\n\t"
  2398. "mov %[a], r9\n\t"
  2399. "mov %[b], r10\n\t"
  2400. "ldr %[a], [%[a]]\n\t"
  2401. "ldr %[b], [%[b], #16]\n\t"
  2402. "uxth r6, %[a]\n\t"
  2403. "uxth r7, %[b]\n\t"
  2404. #ifdef WOLFSSL_KEIL
  2405. "muls r7, r6, r7\n\t"
  2406. #elif defined(__clang__)
  2407. "muls r7, r6\n\t"
  2408. #else
  2409. "mul r7, r6\n\t"
  2410. #endif
  2411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2412. "adds r4, r4, r7\n\t"
  2413. #else
  2414. "add r4, r4, r7\n\t"
  2415. #endif
  2416. #ifdef WOLFSSL_KEIL
  2417. "adcs r5, r5, %[r]\n\t"
  2418. #elif defined(__clang__)
  2419. "adcs r5, %[r]\n\t"
  2420. #else
  2421. "adc r5, %[r]\n\t"
  2422. #endif
  2423. #ifdef WOLFSSL_KEIL
  2424. "adcs r3, r3, %[r]\n\t"
  2425. #elif defined(__clang__)
  2426. "adcs r3, %[r]\n\t"
  2427. #else
  2428. "adc r3, %[r]\n\t"
  2429. #endif
  2430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2431. "lsrs r7, %[b], #16\n\t"
  2432. #else
  2433. "lsr r7, %[b], #16\n\t"
  2434. #endif
  2435. #ifdef WOLFSSL_KEIL
  2436. "muls r6, r7, r6\n\t"
  2437. #elif defined(__clang__)
  2438. "muls r6, r7\n\t"
  2439. #else
  2440. "mul r6, r7\n\t"
  2441. #endif
  2442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2443. "lsrs r7, r6, #16\n\t"
  2444. #else
  2445. "lsr r7, r6, #16\n\t"
  2446. #endif
  2447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2448. "lsls r6, r6, #16\n\t"
  2449. #else
  2450. "lsl r6, r6, #16\n\t"
  2451. #endif
  2452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2453. "adds r4, r4, r6\n\t"
  2454. #else
  2455. "add r4, r4, r6\n\t"
  2456. #endif
  2457. #ifdef WOLFSSL_KEIL
  2458. "adcs r5, r5, r7\n\t"
  2459. #elif defined(__clang__)
  2460. "adcs r5, r7\n\t"
  2461. #else
  2462. "adc r5, r7\n\t"
  2463. #endif
  2464. #ifdef WOLFSSL_KEIL
  2465. "adcs r3, r3, %[r]\n\t"
  2466. #elif defined(__clang__)
  2467. "adcs r3, %[r]\n\t"
  2468. #else
  2469. "adc r3, %[r]\n\t"
  2470. #endif
  2471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2472. "lsrs r6, %[a], #16\n\t"
  2473. #else
  2474. "lsr r6, %[a], #16\n\t"
  2475. #endif
  2476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2477. "lsrs r7, %[b], #16\n\t"
  2478. #else
  2479. "lsr r7, %[b], #16\n\t"
  2480. #endif
  2481. #ifdef WOLFSSL_KEIL
  2482. "muls r7, r6, r7\n\t"
  2483. #elif defined(__clang__)
  2484. "muls r7, r6\n\t"
  2485. #else
  2486. "mul r7, r6\n\t"
  2487. #endif
  2488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2489. "adds r5, r5, r7\n\t"
  2490. #else
  2491. "add r5, r5, r7\n\t"
  2492. #endif
  2493. #ifdef WOLFSSL_KEIL
  2494. "adcs r3, r3, %[r]\n\t"
  2495. #elif defined(__clang__)
  2496. "adcs r3, %[r]\n\t"
  2497. #else
  2498. "adc r3, %[r]\n\t"
  2499. #endif
  2500. "uxth r7, %[b]\n\t"
  2501. #ifdef WOLFSSL_KEIL
  2502. "muls r6, r7, r6\n\t"
  2503. #elif defined(__clang__)
  2504. "muls r6, r7\n\t"
  2505. #else
  2506. "mul r6, r7\n\t"
  2507. #endif
  2508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2509. "lsrs r7, r6, #16\n\t"
  2510. #else
  2511. "lsr r7, r6, #16\n\t"
  2512. #endif
  2513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2514. "lsls r6, r6, #16\n\t"
  2515. #else
  2516. "lsl r6, r6, #16\n\t"
  2517. #endif
  2518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2519. "adds r4, r4, r6\n\t"
  2520. #else
  2521. "add r4, r4, r6\n\t"
  2522. #endif
  2523. #ifdef WOLFSSL_KEIL
  2524. "adcs r5, r5, r7\n\t"
  2525. #elif defined(__clang__)
  2526. "adcs r5, r7\n\t"
  2527. #else
  2528. "adc r5, r7\n\t"
  2529. #endif
  2530. #ifdef WOLFSSL_KEIL
  2531. "adcs r3, r3, %[r]\n\t"
  2532. #elif defined(__clang__)
  2533. "adcs r3, %[r]\n\t"
  2534. #else
  2535. "adc r3, %[r]\n\t"
  2536. #endif
  2537. "str r4, [sp, #16]\n\t"
  2538. "# A[0] * B[5]\n\t"
  2539. "movs r4, #0\n\t"
  2540. "mov %[a], r9\n\t"
  2541. "mov %[b], r10\n\t"
  2542. "ldr %[a], [%[a]]\n\t"
  2543. "ldr %[b], [%[b], #20]\n\t"
  2544. "uxth r6, %[a]\n\t"
  2545. "uxth r7, %[b]\n\t"
  2546. #ifdef WOLFSSL_KEIL
  2547. "muls r7, r6, r7\n\t"
  2548. #elif defined(__clang__)
  2549. "muls r7, r6\n\t"
  2550. #else
  2551. "mul r7, r6\n\t"
  2552. #endif
  2553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2554. "adds r5, r5, r7\n\t"
  2555. #else
  2556. "add r5, r5, r7\n\t"
  2557. #endif
  2558. #ifdef WOLFSSL_KEIL
  2559. "adcs r3, r3, %[r]\n\t"
  2560. #elif defined(__clang__)
  2561. "adcs r3, %[r]\n\t"
  2562. #else
  2563. "adc r3, %[r]\n\t"
  2564. #endif
  2565. #ifdef WOLFSSL_KEIL
  2566. "adcs r4, r4, %[r]\n\t"
  2567. #elif defined(__clang__)
  2568. "adcs r4, %[r]\n\t"
  2569. #else
  2570. "adc r4, %[r]\n\t"
  2571. #endif
  2572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2573. "lsrs r7, %[b], #16\n\t"
  2574. #else
  2575. "lsr r7, %[b], #16\n\t"
  2576. #endif
  2577. #ifdef WOLFSSL_KEIL
  2578. "muls r6, r7, r6\n\t"
  2579. #elif defined(__clang__)
  2580. "muls r6, r7\n\t"
  2581. #else
  2582. "mul r6, r7\n\t"
  2583. #endif
  2584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2585. "lsrs r7, r6, #16\n\t"
  2586. #else
  2587. "lsr r7, r6, #16\n\t"
  2588. #endif
  2589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2590. "lsls r6, r6, #16\n\t"
  2591. #else
  2592. "lsl r6, r6, #16\n\t"
  2593. #endif
  2594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2595. "adds r5, r5, r6\n\t"
  2596. #else
  2597. "add r5, r5, r6\n\t"
  2598. #endif
  2599. #ifdef WOLFSSL_KEIL
  2600. "adcs r3, r3, r7\n\t"
  2601. #elif defined(__clang__)
  2602. "adcs r3, r7\n\t"
  2603. #else
  2604. "adc r3, r7\n\t"
  2605. #endif
  2606. #ifdef WOLFSSL_KEIL
  2607. "adcs r4, r4, %[r]\n\t"
  2608. #elif defined(__clang__)
  2609. "adcs r4, %[r]\n\t"
  2610. #else
  2611. "adc r4, %[r]\n\t"
  2612. #endif
  2613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2614. "lsrs r6, %[a], #16\n\t"
  2615. #else
  2616. "lsr r6, %[a], #16\n\t"
  2617. #endif
  2618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2619. "lsrs r7, %[b], #16\n\t"
  2620. #else
  2621. "lsr r7, %[b], #16\n\t"
  2622. #endif
  2623. #ifdef WOLFSSL_KEIL
  2624. "muls r7, r6, r7\n\t"
  2625. #elif defined(__clang__)
  2626. "muls r7, r6\n\t"
  2627. #else
  2628. "mul r7, r6\n\t"
  2629. #endif
  2630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2631. "adds r3, r3, r7\n\t"
  2632. #else
  2633. "add r3, r3, r7\n\t"
  2634. #endif
  2635. #ifdef WOLFSSL_KEIL
  2636. "adcs r4, r4, %[r]\n\t"
  2637. #elif defined(__clang__)
  2638. "adcs r4, %[r]\n\t"
  2639. #else
  2640. "adc r4, %[r]\n\t"
  2641. #endif
  2642. "uxth r7, %[b]\n\t"
  2643. #ifdef WOLFSSL_KEIL
  2644. "muls r6, r7, r6\n\t"
  2645. #elif defined(__clang__)
  2646. "muls r6, r7\n\t"
  2647. #else
  2648. "mul r6, r7\n\t"
  2649. #endif
  2650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2651. "lsrs r7, r6, #16\n\t"
  2652. #else
  2653. "lsr r7, r6, #16\n\t"
  2654. #endif
  2655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2656. "lsls r6, r6, #16\n\t"
  2657. #else
  2658. "lsl r6, r6, #16\n\t"
  2659. #endif
  2660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2661. "adds r5, r5, r6\n\t"
  2662. #else
  2663. "add r5, r5, r6\n\t"
  2664. #endif
  2665. #ifdef WOLFSSL_KEIL
  2666. "adcs r3, r3, r7\n\t"
  2667. #elif defined(__clang__)
  2668. "adcs r3, r7\n\t"
  2669. #else
  2670. "adc r3, r7\n\t"
  2671. #endif
  2672. #ifdef WOLFSSL_KEIL
  2673. "adcs r4, r4, %[r]\n\t"
  2674. #elif defined(__clang__)
  2675. "adcs r4, %[r]\n\t"
  2676. #else
  2677. "adc r4, %[r]\n\t"
  2678. #endif
  2679. "# A[1] * B[4]\n\t"
  2680. "mov %[a], r9\n\t"
  2681. "mov %[b], r10\n\t"
  2682. "ldr %[a], [%[a], #4]\n\t"
  2683. "ldr %[b], [%[b], #16]\n\t"
  2684. "uxth r6, %[a]\n\t"
  2685. "uxth r7, %[b]\n\t"
  2686. #ifdef WOLFSSL_KEIL
  2687. "muls r7, r6, r7\n\t"
  2688. #elif defined(__clang__)
  2689. "muls r7, r6\n\t"
  2690. #else
  2691. "mul r7, r6\n\t"
  2692. #endif
  2693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2694. "adds r5, r5, r7\n\t"
  2695. #else
  2696. "add r5, r5, r7\n\t"
  2697. #endif
  2698. #ifdef WOLFSSL_KEIL
  2699. "adcs r3, r3, %[r]\n\t"
  2700. #elif defined(__clang__)
  2701. "adcs r3, %[r]\n\t"
  2702. #else
  2703. "adc r3, %[r]\n\t"
  2704. #endif
  2705. #ifdef WOLFSSL_KEIL
  2706. "adcs r4, r4, %[r]\n\t"
  2707. #elif defined(__clang__)
  2708. "adcs r4, %[r]\n\t"
  2709. #else
  2710. "adc r4, %[r]\n\t"
  2711. #endif
  2712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2713. "lsrs r7, %[b], #16\n\t"
  2714. #else
  2715. "lsr r7, %[b], #16\n\t"
  2716. #endif
  2717. #ifdef WOLFSSL_KEIL
  2718. "muls r6, r7, r6\n\t"
  2719. #elif defined(__clang__)
  2720. "muls r6, r7\n\t"
  2721. #else
  2722. "mul r6, r7\n\t"
  2723. #endif
  2724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2725. "lsrs r7, r6, #16\n\t"
  2726. #else
  2727. "lsr r7, r6, #16\n\t"
  2728. #endif
  2729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2730. "lsls r6, r6, #16\n\t"
  2731. #else
  2732. "lsl r6, r6, #16\n\t"
  2733. #endif
  2734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2735. "adds r5, r5, r6\n\t"
  2736. #else
  2737. "add r5, r5, r6\n\t"
  2738. #endif
  2739. #ifdef WOLFSSL_KEIL
  2740. "adcs r3, r3, r7\n\t"
  2741. #elif defined(__clang__)
  2742. "adcs r3, r7\n\t"
  2743. #else
  2744. "adc r3, r7\n\t"
  2745. #endif
  2746. #ifdef WOLFSSL_KEIL
  2747. "adcs r4, r4, %[r]\n\t"
  2748. #elif defined(__clang__)
  2749. "adcs r4, %[r]\n\t"
  2750. #else
  2751. "adc r4, %[r]\n\t"
  2752. #endif
  2753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2754. "lsrs r6, %[a], #16\n\t"
  2755. #else
  2756. "lsr r6, %[a], #16\n\t"
  2757. #endif
  2758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2759. "lsrs r7, %[b], #16\n\t"
  2760. #else
  2761. "lsr r7, %[b], #16\n\t"
  2762. #endif
  2763. #ifdef WOLFSSL_KEIL
  2764. "muls r7, r6, r7\n\t"
  2765. #elif defined(__clang__)
  2766. "muls r7, r6\n\t"
  2767. #else
  2768. "mul r7, r6\n\t"
  2769. #endif
  2770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2771. "adds r3, r3, r7\n\t"
  2772. #else
  2773. "add r3, r3, r7\n\t"
  2774. #endif
  2775. #ifdef WOLFSSL_KEIL
  2776. "adcs r4, r4, %[r]\n\t"
  2777. #elif defined(__clang__)
  2778. "adcs r4, %[r]\n\t"
  2779. #else
  2780. "adc r4, %[r]\n\t"
  2781. #endif
  2782. "uxth r7, %[b]\n\t"
  2783. #ifdef WOLFSSL_KEIL
  2784. "muls r6, r7, r6\n\t"
  2785. #elif defined(__clang__)
  2786. "muls r6, r7\n\t"
  2787. #else
  2788. "mul r6, r7\n\t"
  2789. #endif
  2790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2791. "lsrs r7, r6, #16\n\t"
  2792. #else
  2793. "lsr r7, r6, #16\n\t"
  2794. #endif
  2795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2796. "lsls r6, r6, #16\n\t"
  2797. #else
  2798. "lsl r6, r6, #16\n\t"
  2799. #endif
  2800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2801. "adds r5, r5, r6\n\t"
  2802. #else
  2803. "add r5, r5, r6\n\t"
  2804. #endif
  2805. #ifdef WOLFSSL_KEIL
  2806. "adcs r3, r3, r7\n\t"
  2807. #elif defined(__clang__)
  2808. "adcs r3, r7\n\t"
  2809. #else
  2810. "adc r3, r7\n\t"
  2811. #endif
  2812. #ifdef WOLFSSL_KEIL
  2813. "adcs r4, r4, %[r]\n\t"
  2814. #elif defined(__clang__)
  2815. "adcs r4, %[r]\n\t"
  2816. #else
  2817. "adc r4, %[r]\n\t"
  2818. #endif
  2819. "# A[2] * B[3]\n\t"
  2820. "mov %[a], r9\n\t"
  2821. "mov %[b], r10\n\t"
  2822. "ldr %[a], [%[a], #8]\n\t"
  2823. "ldr %[b], [%[b], #12]\n\t"
  2824. "uxth r6, %[a]\n\t"
  2825. "uxth r7, %[b]\n\t"
  2826. #ifdef WOLFSSL_KEIL
  2827. "muls r7, r6, r7\n\t"
  2828. #elif defined(__clang__)
  2829. "muls r7, r6\n\t"
  2830. #else
  2831. "mul r7, r6\n\t"
  2832. #endif
  2833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2834. "adds r5, r5, r7\n\t"
  2835. #else
  2836. "add r5, r5, r7\n\t"
  2837. #endif
  2838. #ifdef WOLFSSL_KEIL
  2839. "adcs r3, r3, %[r]\n\t"
  2840. #elif defined(__clang__)
  2841. "adcs r3, %[r]\n\t"
  2842. #else
  2843. "adc r3, %[r]\n\t"
  2844. #endif
  2845. #ifdef WOLFSSL_KEIL
  2846. "adcs r4, r4, %[r]\n\t"
  2847. #elif defined(__clang__)
  2848. "adcs r4, %[r]\n\t"
  2849. #else
  2850. "adc r4, %[r]\n\t"
  2851. #endif
  2852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2853. "lsrs r7, %[b], #16\n\t"
  2854. #else
  2855. "lsr r7, %[b], #16\n\t"
  2856. #endif
  2857. #ifdef WOLFSSL_KEIL
  2858. "muls r6, r7, r6\n\t"
  2859. #elif defined(__clang__)
  2860. "muls r6, r7\n\t"
  2861. #else
  2862. "mul r6, r7\n\t"
  2863. #endif
  2864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2865. "lsrs r7, r6, #16\n\t"
  2866. #else
  2867. "lsr r7, r6, #16\n\t"
  2868. #endif
  2869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2870. "lsls r6, r6, #16\n\t"
  2871. #else
  2872. "lsl r6, r6, #16\n\t"
  2873. #endif
  2874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2875. "adds r5, r5, r6\n\t"
  2876. #else
  2877. "add r5, r5, r6\n\t"
  2878. #endif
  2879. #ifdef WOLFSSL_KEIL
  2880. "adcs r3, r3, r7\n\t"
  2881. #elif defined(__clang__)
  2882. "adcs r3, r7\n\t"
  2883. #else
  2884. "adc r3, r7\n\t"
  2885. #endif
  2886. #ifdef WOLFSSL_KEIL
  2887. "adcs r4, r4, %[r]\n\t"
  2888. #elif defined(__clang__)
  2889. "adcs r4, %[r]\n\t"
  2890. #else
  2891. "adc r4, %[r]\n\t"
  2892. #endif
  2893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2894. "lsrs r6, %[a], #16\n\t"
  2895. #else
  2896. "lsr r6, %[a], #16\n\t"
  2897. #endif
  2898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2899. "lsrs r7, %[b], #16\n\t"
  2900. #else
  2901. "lsr r7, %[b], #16\n\t"
  2902. #endif
  2903. #ifdef WOLFSSL_KEIL
  2904. "muls r7, r6, r7\n\t"
  2905. #elif defined(__clang__)
  2906. "muls r7, r6\n\t"
  2907. #else
  2908. "mul r7, r6\n\t"
  2909. #endif
  2910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2911. "adds r3, r3, r7\n\t"
  2912. #else
  2913. "add r3, r3, r7\n\t"
  2914. #endif
  2915. #ifdef WOLFSSL_KEIL
  2916. "adcs r4, r4, %[r]\n\t"
  2917. #elif defined(__clang__)
  2918. "adcs r4, %[r]\n\t"
  2919. #else
  2920. "adc r4, %[r]\n\t"
  2921. #endif
  2922. "uxth r7, %[b]\n\t"
  2923. #ifdef WOLFSSL_KEIL
  2924. "muls r6, r7, r6\n\t"
  2925. #elif defined(__clang__)
  2926. "muls r6, r7\n\t"
  2927. #else
  2928. "mul r6, r7\n\t"
  2929. #endif
  2930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2931. "lsrs r7, r6, #16\n\t"
  2932. #else
  2933. "lsr r7, r6, #16\n\t"
  2934. #endif
  2935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2936. "lsls r6, r6, #16\n\t"
  2937. #else
  2938. "lsl r6, r6, #16\n\t"
  2939. #endif
  2940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2941. "adds r5, r5, r6\n\t"
  2942. #else
  2943. "add r5, r5, r6\n\t"
  2944. #endif
  2945. #ifdef WOLFSSL_KEIL
  2946. "adcs r3, r3, r7\n\t"
  2947. #elif defined(__clang__)
  2948. "adcs r3, r7\n\t"
  2949. #else
  2950. "adc r3, r7\n\t"
  2951. #endif
  2952. #ifdef WOLFSSL_KEIL
  2953. "adcs r4, r4, %[r]\n\t"
  2954. #elif defined(__clang__)
  2955. "adcs r4, %[r]\n\t"
  2956. #else
  2957. "adc r4, %[r]\n\t"
  2958. #endif
  2959. "# A[3] * B[2]\n\t"
  2960. "mov %[a], r9\n\t"
  2961. "mov %[b], r10\n\t"
  2962. "ldr %[a], [%[a], #12]\n\t"
  2963. "ldr %[b], [%[b], #8]\n\t"
  2964. "uxth r6, %[a]\n\t"
  2965. "uxth r7, %[b]\n\t"
  2966. #ifdef WOLFSSL_KEIL
  2967. "muls r7, r6, r7\n\t"
  2968. #elif defined(__clang__)
  2969. "muls r7, r6\n\t"
  2970. #else
  2971. "mul r7, r6\n\t"
  2972. #endif
  2973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2974. "adds r5, r5, r7\n\t"
  2975. #else
  2976. "add r5, r5, r7\n\t"
  2977. #endif
  2978. #ifdef WOLFSSL_KEIL
  2979. "adcs r3, r3, %[r]\n\t"
  2980. #elif defined(__clang__)
  2981. "adcs r3, %[r]\n\t"
  2982. #else
  2983. "adc r3, %[r]\n\t"
  2984. #endif
  2985. #ifdef WOLFSSL_KEIL
  2986. "adcs r4, r4, %[r]\n\t"
  2987. #elif defined(__clang__)
  2988. "adcs r4, %[r]\n\t"
  2989. #else
  2990. "adc r4, %[r]\n\t"
  2991. #endif
  2992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2993. "lsrs r7, %[b], #16\n\t"
  2994. #else
  2995. "lsr r7, %[b], #16\n\t"
  2996. #endif
  2997. #ifdef WOLFSSL_KEIL
  2998. "muls r6, r7, r6\n\t"
  2999. #elif defined(__clang__)
  3000. "muls r6, r7\n\t"
  3001. #else
  3002. "mul r6, r7\n\t"
  3003. #endif
  3004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3005. "lsrs r7, r6, #16\n\t"
  3006. #else
  3007. "lsr r7, r6, #16\n\t"
  3008. #endif
  3009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3010. "lsls r6, r6, #16\n\t"
  3011. #else
  3012. "lsl r6, r6, #16\n\t"
  3013. #endif
  3014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3015. "adds r5, r5, r6\n\t"
  3016. #else
  3017. "add r5, r5, r6\n\t"
  3018. #endif
  3019. #ifdef WOLFSSL_KEIL
  3020. "adcs r3, r3, r7\n\t"
  3021. #elif defined(__clang__)
  3022. "adcs r3, r7\n\t"
  3023. #else
  3024. "adc r3, r7\n\t"
  3025. #endif
  3026. #ifdef WOLFSSL_KEIL
  3027. "adcs r4, r4, %[r]\n\t"
  3028. #elif defined(__clang__)
  3029. "adcs r4, %[r]\n\t"
  3030. #else
  3031. "adc r4, %[r]\n\t"
  3032. #endif
  3033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3034. "lsrs r6, %[a], #16\n\t"
  3035. #else
  3036. "lsr r6, %[a], #16\n\t"
  3037. #endif
  3038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3039. "lsrs r7, %[b], #16\n\t"
  3040. #else
  3041. "lsr r7, %[b], #16\n\t"
  3042. #endif
  3043. #ifdef WOLFSSL_KEIL
  3044. "muls r7, r6, r7\n\t"
  3045. #elif defined(__clang__)
  3046. "muls r7, r6\n\t"
  3047. #else
  3048. "mul r7, r6\n\t"
  3049. #endif
  3050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3051. "adds r3, r3, r7\n\t"
  3052. #else
  3053. "add r3, r3, r7\n\t"
  3054. #endif
  3055. #ifdef WOLFSSL_KEIL
  3056. "adcs r4, r4, %[r]\n\t"
  3057. #elif defined(__clang__)
  3058. "adcs r4, %[r]\n\t"
  3059. #else
  3060. "adc r4, %[r]\n\t"
  3061. #endif
  3062. "uxth r7, %[b]\n\t"
  3063. #ifdef WOLFSSL_KEIL
  3064. "muls r6, r7, r6\n\t"
  3065. #elif defined(__clang__)
  3066. "muls r6, r7\n\t"
  3067. #else
  3068. "mul r6, r7\n\t"
  3069. #endif
  3070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3071. "lsrs r7, r6, #16\n\t"
  3072. #else
  3073. "lsr r7, r6, #16\n\t"
  3074. #endif
  3075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3076. "lsls r6, r6, #16\n\t"
  3077. #else
  3078. "lsl r6, r6, #16\n\t"
  3079. #endif
  3080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3081. "adds r5, r5, r6\n\t"
  3082. #else
  3083. "add r5, r5, r6\n\t"
  3084. #endif
  3085. #ifdef WOLFSSL_KEIL
  3086. "adcs r3, r3, r7\n\t"
  3087. #elif defined(__clang__)
  3088. "adcs r3, r7\n\t"
  3089. #else
  3090. "adc r3, r7\n\t"
  3091. #endif
  3092. #ifdef WOLFSSL_KEIL
  3093. "adcs r4, r4, %[r]\n\t"
  3094. #elif defined(__clang__)
  3095. "adcs r4, %[r]\n\t"
  3096. #else
  3097. "adc r4, %[r]\n\t"
  3098. #endif
  3099. "# A[4] * B[1]\n\t"
  3100. "mov %[a], r9\n\t"
  3101. "mov %[b], r10\n\t"
  3102. "ldr %[a], [%[a], #16]\n\t"
  3103. "ldr %[b], [%[b], #4]\n\t"
  3104. "uxth r6, %[a]\n\t"
  3105. "uxth r7, %[b]\n\t"
  3106. #ifdef WOLFSSL_KEIL
  3107. "muls r7, r6, r7\n\t"
  3108. #elif defined(__clang__)
  3109. "muls r7, r6\n\t"
  3110. #else
  3111. "mul r7, r6\n\t"
  3112. #endif
  3113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3114. "adds r5, r5, r7\n\t"
  3115. #else
  3116. "add r5, r5, r7\n\t"
  3117. #endif
  3118. #ifdef WOLFSSL_KEIL
  3119. "adcs r3, r3, %[r]\n\t"
  3120. #elif defined(__clang__)
  3121. "adcs r3, %[r]\n\t"
  3122. #else
  3123. "adc r3, %[r]\n\t"
  3124. #endif
  3125. #ifdef WOLFSSL_KEIL
  3126. "adcs r4, r4, %[r]\n\t"
  3127. #elif defined(__clang__)
  3128. "adcs r4, %[r]\n\t"
  3129. #else
  3130. "adc r4, %[r]\n\t"
  3131. #endif
  3132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3133. "lsrs r7, %[b], #16\n\t"
  3134. #else
  3135. "lsr r7, %[b], #16\n\t"
  3136. #endif
  3137. #ifdef WOLFSSL_KEIL
  3138. "muls r6, r7, r6\n\t"
  3139. #elif defined(__clang__)
  3140. "muls r6, r7\n\t"
  3141. #else
  3142. "mul r6, r7\n\t"
  3143. #endif
  3144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3145. "lsrs r7, r6, #16\n\t"
  3146. #else
  3147. "lsr r7, r6, #16\n\t"
  3148. #endif
  3149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3150. "lsls r6, r6, #16\n\t"
  3151. #else
  3152. "lsl r6, r6, #16\n\t"
  3153. #endif
  3154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3155. "adds r5, r5, r6\n\t"
  3156. #else
  3157. "add r5, r5, r6\n\t"
  3158. #endif
  3159. #ifdef WOLFSSL_KEIL
  3160. "adcs r3, r3, r7\n\t"
  3161. #elif defined(__clang__)
  3162. "adcs r3, r7\n\t"
  3163. #else
  3164. "adc r3, r7\n\t"
  3165. #endif
  3166. #ifdef WOLFSSL_KEIL
  3167. "adcs r4, r4, %[r]\n\t"
  3168. #elif defined(__clang__)
  3169. "adcs r4, %[r]\n\t"
  3170. #else
  3171. "adc r4, %[r]\n\t"
  3172. #endif
  3173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3174. "lsrs r6, %[a], #16\n\t"
  3175. #else
  3176. "lsr r6, %[a], #16\n\t"
  3177. #endif
  3178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3179. "lsrs r7, %[b], #16\n\t"
  3180. #else
  3181. "lsr r7, %[b], #16\n\t"
  3182. #endif
  3183. #ifdef WOLFSSL_KEIL
  3184. "muls r7, r6, r7\n\t"
  3185. #elif defined(__clang__)
  3186. "muls r7, r6\n\t"
  3187. #else
  3188. "mul r7, r6\n\t"
  3189. #endif
  3190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3191. "adds r3, r3, r7\n\t"
  3192. #else
  3193. "add r3, r3, r7\n\t"
  3194. #endif
  3195. #ifdef WOLFSSL_KEIL
  3196. "adcs r4, r4, %[r]\n\t"
  3197. #elif defined(__clang__)
  3198. "adcs r4, %[r]\n\t"
  3199. #else
  3200. "adc r4, %[r]\n\t"
  3201. #endif
  3202. "uxth r7, %[b]\n\t"
  3203. #ifdef WOLFSSL_KEIL
  3204. "muls r6, r7, r6\n\t"
  3205. #elif defined(__clang__)
  3206. "muls r6, r7\n\t"
  3207. #else
  3208. "mul r6, r7\n\t"
  3209. #endif
  3210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3211. "lsrs r7, r6, #16\n\t"
  3212. #else
  3213. "lsr r7, r6, #16\n\t"
  3214. #endif
  3215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3216. "lsls r6, r6, #16\n\t"
  3217. #else
  3218. "lsl r6, r6, #16\n\t"
  3219. #endif
  3220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3221. "adds r5, r5, r6\n\t"
  3222. #else
  3223. "add r5, r5, r6\n\t"
  3224. #endif
  3225. #ifdef WOLFSSL_KEIL
  3226. "adcs r3, r3, r7\n\t"
  3227. #elif defined(__clang__)
  3228. "adcs r3, r7\n\t"
  3229. #else
  3230. "adc r3, r7\n\t"
  3231. #endif
  3232. #ifdef WOLFSSL_KEIL
  3233. "adcs r4, r4, %[r]\n\t"
  3234. #elif defined(__clang__)
  3235. "adcs r4, %[r]\n\t"
  3236. #else
  3237. "adc r4, %[r]\n\t"
  3238. #endif
  3239. "# A[5] * B[0]\n\t"
  3240. "mov %[a], r9\n\t"
  3241. "mov %[b], r10\n\t"
  3242. "ldr %[a], [%[a], #20]\n\t"
  3243. "ldr %[b], [%[b]]\n\t"
  3244. "uxth r6, %[a]\n\t"
  3245. "uxth r7, %[b]\n\t"
  3246. #ifdef WOLFSSL_KEIL
  3247. "muls r7, r6, r7\n\t"
  3248. #elif defined(__clang__)
  3249. "muls r7, r6\n\t"
  3250. #else
  3251. "mul r7, r6\n\t"
  3252. #endif
  3253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3254. "adds r5, r5, r7\n\t"
  3255. #else
  3256. "add r5, r5, r7\n\t"
  3257. #endif
  3258. #ifdef WOLFSSL_KEIL
  3259. "adcs r3, r3, %[r]\n\t"
  3260. #elif defined(__clang__)
  3261. "adcs r3, %[r]\n\t"
  3262. #else
  3263. "adc r3, %[r]\n\t"
  3264. #endif
  3265. #ifdef WOLFSSL_KEIL
  3266. "adcs r4, r4, %[r]\n\t"
  3267. #elif defined(__clang__)
  3268. "adcs r4, %[r]\n\t"
  3269. #else
  3270. "adc r4, %[r]\n\t"
  3271. #endif
  3272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3273. "lsrs r7, %[b], #16\n\t"
  3274. #else
  3275. "lsr r7, %[b], #16\n\t"
  3276. #endif
  3277. #ifdef WOLFSSL_KEIL
  3278. "muls r6, r7, r6\n\t"
  3279. #elif defined(__clang__)
  3280. "muls r6, r7\n\t"
  3281. #else
  3282. "mul r6, r7\n\t"
  3283. #endif
  3284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3285. "lsrs r7, r6, #16\n\t"
  3286. #else
  3287. "lsr r7, r6, #16\n\t"
  3288. #endif
  3289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3290. "lsls r6, r6, #16\n\t"
  3291. #else
  3292. "lsl r6, r6, #16\n\t"
  3293. #endif
  3294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3295. "adds r5, r5, r6\n\t"
  3296. #else
  3297. "add r5, r5, r6\n\t"
  3298. #endif
  3299. #ifdef WOLFSSL_KEIL
  3300. "adcs r3, r3, r7\n\t"
  3301. #elif defined(__clang__)
  3302. "adcs r3, r7\n\t"
  3303. #else
  3304. "adc r3, r7\n\t"
  3305. #endif
  3306. #ifdef WOLFSSL_KEIL
  3307. "adcs r4, r4, %[r]\n\t"
  3308. #elif defined(__clang__)
  3309. "adcs r4, %[r]\n\t"
  3310. #else
  3311. "adc r4, %[r]\n\t"
  3312. #endif
  3313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3314. "lsrs r6, %[a], #16\n\t"
  3315. #else
  3316. "lsr r6, %[a], #16\n\t"
  3317. #endif
  3318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3319. "lsrs r7, %[b], #16\n\t"
  3320. #else
  3321. "lsr r7, %[b], #16\n\t"
  3322. #endif
  3323. #ifdef WOLFSSL_KEIL
  3324. "muls r7, r6, r7\n\t"
  3325. #elif defined(__clang__)
  3326. "muls r7, r6\n\t"
  3327. #else
  3328. "mul r7, r6\n\t"
  3329. #endif
  3330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3331. "adds r3, r3, r7\n\t"
  3332. #else
  3333. "add r3, r3, r7\n\t"
  3334. #endif
  3335. #ifdef WOLFSSL_KEIL
  3336. "adcs r4, r4, %[r]\n\t"
  3337. #elif defined(__clang__)
  3338. "adcs r4, %[r]\n\t"
  3339. #else
  3340. "adc r4, %[r]\n\t"
  3341. #endif
  3342. "uxth r7, %[b]\n\t"
  3343. #ifdef WOLFSSL_KEIL
  3344. "muls r6, r7, r6\n\t"
  3345. #elif defined(__clang__)
  3346. "muls r6, r7\n\t"
  3347. #else
  3348. "mul r6, r7\n\t"
  3349. #endif
  3350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3351. "lsrs r7, r6, #16\n\t"
  3352. #else
  3353. "lsr r7, r6, #16\n\t"
  3354. #endif
  3355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3356. "lsls r6, r6, #16\n\t"
  3357. #else
  3358. "lsl r6, r6, #16\n\t"
  3359. #endif
  3360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3361. "adds r5, r5, r6\n\t"
  3362. #else
  3363. "add r5, r5, r6\n\t"
  3364. #endif
  3365. #ifdef WOLFSSL_KEIL
  3366. "adcs r3, r3, r7\n\t"
  3367. #elif defined(__clang__)
  3368. "adcs r3, r7\n\t"
  3369. #else
  3370. "adc r3, r7\n\t"
  3371. #endif
  3372. #ifdef WOLFSSL_KEIL
  3373. "adcs r4, r4, %[r]\n\t"
  3374. #elif defined(__clang__)
  3375. "adcs r4, %[r]\n\t"
  3376. #else
  3377. "adc r4, %[r]\n\t"
  3378. #endif
  3379. "str r5, [sp, #20]\n\t"
  3380. "# A[6] * B[0]\n\t"
  3381. "movs r5, #0\n\t"
  3382. "mov %[a], r9\n\t"
  3383. "mov %[b], r10\n\t"
  3384. "ldr %[a], [%[a], #24]\n\t"
  3385. "ldr %[b], [%[b]]\n\t"
  3386. "uxth r6, %[a]\n\t"
  3387. "uxth r7, %[b]\n\t"
  3388. #ifdef WOLFSSL_KEIL
  3389. "muls r7, r6, r7\n\t"
  3390. #elif defined(__clang__)
  3391. "muls r7, r6\n\t"
  3392. #else
  3393. "mul r7, r6\n\t"
  3394. #endif
  3395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3396. "adds r3, r3, r7\n\t"
  3397. #else
  3398. "add r3, r3, r7\n\t"
  3399. #endif
  3400. #ifdef WOLFSSL_KEIL
  3401. "adcs r4, r4, %[r]\n\t"
  3402. #elif defined(__clang__)
  3403. "adcs r4, %[r]\n\t"
  3404. #else
  3405. "adc r4, %[r]\n\t"
  3406. #endif
  3407. #ifdef WOLFSSL_KEIL
  3408. "adcs r5, r5, %[r]\n\t"
  3409. #elif defined(__clang__)
  3410. "adcs r5, %[r]\n\t"
  3411. #else
  3412. "adc r5, %[r]\n\t"
  3413. #endif
  3414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3415. "lsrs r7, %[b], #16\n\t"
  3416. #else
  3417. "lsr r7, %[b], #16\n\t"
  3418. #endif
  3419. #ifdef WOLFSSL_KEIL
  3420. "muls r6, r7, r6\n\t"
  3421. #elif defined(__clang__)
  3422. "muls r6, r7\n\t"
  3423. #else
  3424. "mul r6, r7\n\t"
  3425. #endif
  3426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3427. "lsrs r7, r6, #16\n\t"
  3428. #else
  3429. "lsr r7, r6, #16\n\t"
  3430. #endif
  3431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3432. "lsls r6, r6, #16\n\t"
  3433. #else
  3434. "lsl r6, r6, #16\n\t"
  3435. #endif
  3436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3437. "adds r3, r3, r6\n\t"
  3438. #else
  3439. "add r3, r3, r6\n\t"
  3440. #endif
  3441. #ifdef WOLFSSL_KEIL
  3442. "adcs r4, r4, r7\n\t"
  3443. #elif defined(__clang__)
  3444. "adcs r4, r7\n\t"
  3445. #else
  3446. "adc r4, r7\n\t"
  3447. #endif
  3448. #ifdef WOLFSSL_KEIL
  3449. "adcs r5, r5, %[r]\n\t"
  3450. #elif defined(__clang__)
  3451. "adcs r5, %[r]\n\t"
  3452. #else
  3453. "adc r5, %[r]\n\t"
  3454. #endif
  3455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3456. "lsrs r6, %[a], #16\n\t"
  3457. #else
  3458. "lsr r6, %[a], #16\n\t"
  3459. #endif
  3460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3461. "lsrs r7, %[b], #16\n\t"
  3462. #else
  3463. "lsr r7, %[b], #16\n\t"
  3464. #endif
  3465. #ifdef WOLFSSL_KEIL
  3466. "muls r7, r6, r7\n\t"
  3467. #elif defined(__clang__)
  3468. "muls r7, r6\n\t"
  3469. #else
  3470. "mul r7, r6\n\t"
  3471. #endif
  3472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3473. "adds r4, r4, r7\n\t"
  3474. #else
  3475. "add r4, r4, r7\n\t"
  3476. #endif
  3477. #ifdef WOLFSSL_KEIL
  3478. "adcs r5, r5, %[r]\n\t"
  3479. #elif defined(__clang__)
  3480. "adcs r5, %[r]\n\t"
  3481. #else
  3482. "adc r5, %[r]\n\t"
  3483. #endif
  3484. "uxth r7, %[b]\n\t"
  3485. #ifdef WOLFSSL_KEIL
  3486. "muls r6, r7, r6\n\t"
  3487. #elif defined(__clang__)
  3488. "muls r6, r7\n\t"
  3489. #else
  3490. "mul r6, r7\n\t"
  3491. #endif
  3492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3493. "lsrs r7, r6, #16\n\t"
  3494. #else
  3495. "lsr r7, r6, #16\n\t"
  3496. #endif
  3497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3498. "lsls r6, r6, #16\n\t"
  3499. #else
  3500. "lsl r6, r6, #16\n\t"
  3501. #endif
  3502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3503. "adds r3, r3, r6\n\t"
  3504. #else
  3505. "add r3, r3, r6\n\t"
  3506. #endif
  3507. #ifdef WOLFSSL_KEIL
  3508. "adcs r4, r4, r7\n\t"
  3509. #elif defined(__clang__)
  3510. "adcs r4, r7\n\t"
  3511. #else
  3512. "adc r4, r7\n\t"
  3513. #endif
  3514. #ifdef WOLFSSL_KEIL
  3515. "adcs r5, r5, %[r]\n\t"
  3516. #elif defined(__clang__)
  3517. "adcs r5, %[r]\n\t"
  3518. #else
  3519. "adc r5, %[r]\n\t"
  3520. #endif
  3521. "# A[5] * B[1]\n\t"
  3522. "mov %[a], r9\n\t"
  3523. "mov %[b], r10\n\t"
  3524. "ldr %[a], [%[a], #20]\n\t"
  3525. "ldr %[b], [%[b], #4]\n\t"
  3526. "uxth r6, %[a]\n\t"
  3527. "uxth r7, %[b]\n\t"
  3528. #ifdef WOLFSSL_KEIL
  3529. "muls r7, r6, r7\n\t"
  3530. #elif defined(__clang__)
  3531. "muls r7, r6\n\t"
  3532. #else
  3533. "mul r7, r6\n\t"
  3534. #endif
  3535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3536. "adds r3, r3, r7\n\t"
  3537. #else
  3538. "add r3, r3, r7\n\t"
  3539. #endif
  3540. #ifdef WOLFSSL_KEIL
  3541. "adcs r4, r4, %[r]\n\t"
  3542. #elif defined(__clang__)
  3543. "adcs r4, %[r]\n\t"
  3544. #else
  3545. "adc r4, %[r]\n\t"
  3546. #endif
  3547. #ifdef WOLFSSL_KEIL
  3548. "adcs r5, r5, %[r]\n\t"
  3549. #elif defined(__clang__)
  3550. "adcs r5, %[r]\n\t"
  3551. #else
  3552. "adc r5, %[r]\n\t"
  3553. #endif
  3554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3555. "lsrs r7, %[b], #16\n\t"
  3556. #else
  3557. "lsr r7, %[b], #16\n\t"
  3558. #endif
  3559. #ifdef WOLFSSL_KEIL
  3560. "muls r6, r7, r6\n\t"
  3561. #elif defined(__clang__)
  3562. "muls r6, r7\n\t"
  3563. #else
  3564. "mul r6, r7\n\t"
  3565. #endif
  3566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3567. "lsrs r7, r6, #16\n\t"
  3568. #else
  3569. "lsr r7, r6, #16\n\t"
  3570. #endif
  3571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3572. "lsls r6, r6, #16\n\t"
  3573. #else
  3574. "lsl r6, r6, #16\n\t"
  3575. #endif
  3576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3577. "adds r3, r3, r6\n\t"
  3578. #else
  3579. "add r3, r3, r6\n\t"
  3580. #endif
  3581. #ifdef WOLFSSL_KEIL
  3582. "adcs r4, r4, r7\n\t"
  3583. #elif defined(__clang__)
  3584. "adcs r4, r7\n\t"
  3585. #else
  3586. "adc r4, r7\n\t"
  3587. #endif
  3588. #ifdef WOLFSSL_KEIL
  3589. "adcs r5, r5, %[r]\n\t"
  3590. #elif defined(__clang__)
  3591. "adcs r5, %[r]\n\t"
  3592. #else
  3593. "adc r5, %[r]\n\t"
  3594. #endif
  3595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3596. "lsrs r6, %[a], #16\n\t"
  3597. #else
  3598. "lsr r6, %[a], #16\n\t"
  3599. #endif
  3600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3601. "lsrs r7, %[b], #16\n\t"
  3602. #else
  3603. "lsr r7, %[b], #16\n\t"
  3604. #endif
  3605. #ifdef WOLFSSL_KEIL
  3606. "muls r7, r6, r7\n\t"
  3607. #elif defined(__clang__)
  3608. "muls r7, r6\n\t"
  3609. #else
  3610. "mul r7, r6\n\t"
  3611. #endif
  3612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3613. "adds r4, r4, r7\n\t"
  3614. #else
  3615. "add r4, r4, r7\n\t"
  3616. #endif
  3617. #ifdef WOLFSSL_KEIL
  3618. "adcs r5, r5, %[r]\n\t"
  3619. #elif defined(__clang__)
  3620. "adcs r5, %[r]\n\t"
  3621. #else
  3622. "adc r5, %[r]\n\t"
  3623. #endif
  3624. "uxth r7, %[b]\n\t"
  3625. #ifdef WOLFSSL_KEIL
  3626. "muls r6, r7, r6\n\t"
  3627. #elif defined(__clang__)
  3628. "muls r6, r7\n\t"
  3629. #else
  3630. "mul r6, r7\n\t"
  3631. #endif
  3632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3633. "lsrs r7, r6, #16\n\t"
  3634. #else
  3635. "lsr r7, r6, #16\n\t"
  3636. #endif
  3637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3638. "lsls r6, r6, #16\n\t"
  3639. #else
  3640. "lsl r6, r6, #16\n\t"
  3641. #endif
  3642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3643. "adds r3, r3, r6\n\t"
  3644. #else
  3645. "add r3, r3, r6\n\t"
  3646. #endif
  3647. #ifdef WOLFSSL_KEIL
  3648. "adcs r4, r4, r7\n\t"
  3649. #elif defined(__clang__)
  3650. "adcs r4, r7\n\t"
  3651. #else
  3652. "adc r4, r7\n\t"
  3653. #endif
  3654. #ifdef WOLFSSL_KEIL
  3655. "adcs r5, r5, %[r]\n\t"
  3656. #elif defined(__clang__)
  3657. "adcs r5, %[r]\n\t"
  3658. #else
  3659. "adc r5, %[r]\n\t"
  3660. #endif
  3661. "# A[4] * B[2]\n\t"
  3662. "mov %[a], r9\n\t"
  3663. "mov %[b], r10\n\t"
  3664. "ldr %[a], [%[a], #16]\n\t"
  3665. "ldr %[b], [%[b], #8]\n\t"
  3666. "uxth r6, %[a]\n\t"
  3667. "uxth r7, %[b]\n\t"
  3668. #ifdef WOLFSSL_KEIL
  3669. "muls r7, r6, r7\n\t"
  3670. #elif defined(__clang__)
  3671. "muls r7, r6\n\t"
  3672. #else
  3673. "mul r7, r6\n\t"
  3674. #endif
  3675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3676. "adds r3, r3, r7\n\t"
  3677. #else
  3678. "add r3, r3, r7\n\t"
  3679. #endif
  3680. #ifdef WOLFSSL_KEIL
  3681. "adcs r4, r4, %[r]\n\t"
  3682. #elif defined(__clang__)
  3683. "adcs r4, %[r]\n\t"
  3684. #else
  3685. "adc r4, %[r]\n\t"
  3686. #endif
  3687. #ifdef WOLFSSL_KEIL
  3688. "adcs r5, r5, %[r]\n\t"
  3689. #elif defined(__clang__)
  3690. "adcs r5, %[r]\n\t"
  3691. #else
  3692. "adc r5, %[r]\n\t"
  3693. #endif
  3694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3695. "lsrs r7, %[b], #16\n\t"
  3696. #else
  3697. "lsr r7, %[b], #16\n\t"
  3698. #endif
  3699. #ifdef WOLFSSL_KEIL
  3700. "muls r6, r7, r6\n\t"
  3701. #elif defined(__clang__)
  3702. "muls r6, r7\n\t"
  3703. #else
  3704. "mul r6, r7\n\t"
  3705. #endif
  3706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3707. "lsrs r7, r6, #16\n\t"
  3708. #else
  3709. "lsr r7, r6, #16\n\t"
  3710. #endif
  3711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3712. "lsls r6, r6, #16\n\t"
  3713. #else
  3714. "lsl r6, r6, #16\n\t"
  3715. #endif
  3716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3717. "adds r3, r3, r6\n\t"
  3718. #else
  3719. "add r3, r3, r6\n\t"
  3720. #endif
  3721. #ifdef WOLFSSL_KEIL
  3722. "adcs r4, r4, r7\n\t"
  3723. #elif defined(__clang__)
  3724. "adcs r4, r7\n\t"
  3725. #else
  3726. "adc r4, r7\n\t"
  3727. #endif
  3728. #ifdef WOLFSSL_KEIL
  3729. "adcs r5, r5, %[r]\n\t"
  3730. #elif defined(__clang__)
  3731. "adcs r5, %[r]\n\t"
  3732. #else
  3733. "adc r5, %[r]\n\t"
  3734. #endif
  3735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3736. "lsrs r6, %[a], #16\n\t"
  3737. #else
  3738. "lsr r6, %[a], #16\n\t"
  3739. #endif
  3740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3741. "lsrs r7, %[b], #16\n\t"
  3742. #else
  3743. "lsr r7, %[b], #16\n\t"
  3744. #endif
  3745. #ifdef WOLFSSL_KEIL
  3746. "muls r7, r6, r7\n\t"
  3747. #elif defined(__clang__)
  3748. "muls r7, r6\n\t"
  3749. #else
  3750. "mul r7, r6\n\t"
  3751. #endif
  3752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3753. "adds r4, r4, r7\n\t"
  3754. #else
  3755. "add r4, r4, r7\n\t"
  3756. #endif
  3757. #ifdef WOLFSSL_KEIL
  3758. "adcs r5, r5, %[r]\n\t"
  3759. #elif defined(__clang__)
  3760. "adcs r5, %[r]\n\t"
  3761. #else
  3762. "adc r5, %[r]\n\t"
  3763. #endif
  3764. "uxth r7, %[b]\n\t"
  3765. #ifdef WOLFSSL_KEIL
  3766. "muls r6, r7, r6\n\t"
  3767. #elif defined(__clang__)
  3768. "muls r6, r7\n\t"
  3769. #else
  3770. "mul r6, r7\n\t"
  3771. #endif
  3772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3773. "lsrs r7, r6, #16\n\t"
  3774. #else
  3775. "lsr r7, r6, #16\n\t"
  3776. #endif
  3777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3778. "lsls r6, r6, #16\n\t"
  3779. #else
  3780. "lsl r6, r6, #16\n\t"
  3781. #endif
  3782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3783. "adds r3, r3, r6\n\t"
  3784. #else
  3785. "add r3, r3, r6\n\t"
  3786. #endif
  3787. #ifdef WOLFSSL_KEIL
  3788. "adcs r4, r4, r7\n\t"
  3789. #elif defined(__clang__)
  3790. "adcs r4, r7\n\t"
  3791. #else
  3792. "adc r4, r7\n\t"
  3793. #endif
  3794. #ifdef WOLFSSL_KEIL
  3795. "adcs r5, r5, %[r]\n\t"
  3796. #elif defined(__clang__)
  3797. "adcs r5, %[r]\n\t"
  3798. #else
  3799. "adc r5, %[r]\n\t"
  3800. #endif
  3801. "# A[3] * B[3]\n\t"
  3802. "mov %[a], r9\n\t"
  3803. "mov %[b], r10\n\t"
  3804. "ldr %[a], [%[a], #12]\n\t"
  3805. "ldr %[b], [%[b], #12]\n\t"
  3806. "uxth r6, %[a]\n\t"
  3807. "uxth r7, %[b]\n\t"
  3808. #ifdef WOLFSSL_KEIL
  3809. "muls r7, r6, r7\n\t"
  3810. #elif defined(__clang__)
  3811. "muls r7, r6\n\t"
  3812. #else
  3813. "mul r7, r6\n\t"
  3814. #endif
  3815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3816. "adds r3, r3, r7\n\t"
  3817. #else
  3818. "add r3, r3, r7\n\t"
  3819. #endif
  3820. #ifdef WOLFSSL_KEIL
  3821. "adcs r4, r4, %[r]\n\t"
  3822. #elif defined(__clang__)
  3823. "adcs r4, %[r]\n\t"
  3824. #else
  3825. "adc r4, %[r]\n\t"
  3826. #endif
  3827. #ifdef WOLFSSL_KEIL
  3828. "adcs r5, r5, %[r]\n\t"
  3829. #elif defined(__clang__)
  3830. "adcs r5, %[r]\n\t"
  3831. #else
  3832. "adc r5, %[r]\n\t"
  3833. #endif
  3834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3835. "lsrs r7, %[b], #16\n\t"
  3836. #else
  3837. "lsr r7, %[b], #16\n\t"
  3838. #endif
  3839. #ifdef WOLFSSL_KEIL
  3840. "muls r6, r7, r6\n\t"
  3841. #elif defined(__clang__)
  3842. "muls r6, r7\n\t"
  3843. #else
  3844. "mul r6, r7\n\t"
  3845. #endif
  3846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3847. "lsrs r7, r6, #16\n\t"
  3848. #else
  3849. "lsr r7, r6, #16\n\t"
  3850. #endif
  3851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3852. "lsls r6, r6, #16\n\t"
  3853. #else
  3854. "lsl r6, r6, #16\n\t"
  3855. #endif
  3856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3857. "adds r3, r3, r6\n\t"
  3858. #else
  3859. "add r3, r3, r6\n\t"
  3860. #endif
  3861. #ifdef WOLFSSL_KEIL
  3862. "adcs r4, r4, r7\n\t"
  3863. #elif defined(__clang__)
  3864. "adcs r4, r7\n\t"
  3865. #else
  3866. "adc r4, r7\n\t"
  3867. #endif
  3868. #ifdef WOLFSSL_KEIL
  3869. "adcs r5, r5, %[r]\n\t"
  3870. #elif defined(__clang__)
  3871. "adcs r5, %[r]\n\t"
  3872. #else
  3873. "adc r5, %[r]\n\t"
  3874. #endif
  3875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3876. "lsrs r6, %[a], #16\n\t"
  3877. #else
  3878. "lsr r6, %[a], #16\n\t"
  3879. #endif
  3880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3881. "lsrs r7, %[b], #16\n\t"
  3882. #else
  3883. "lsr r7, %[b], #16\n\t"
  3884. #endif
  3885. #ifdef WOLFSSL_KEIL
  3886. "muls r7, r6, r7\n\t"
  3887. #elif defined(__clang__)
  3888. "muls r7, r6\n\t"
  3889. #else
  3890. "mul r7, r6\n\t"
  3891. #endif
  3892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3893. "adds r4, r4, r7\n\t"
  3894. #else
  3895. "add r4, r4, r7\n\t"
  3896. #endif
  3897. #ifdef WOLFSSL_KEIL
  3898. "adcs r5, r5, %[r]\n\t"
  3899. #elif defined(__clang__)
  3900. "adcs r5, %[r]\n\t"
  3901. #else
  3902. "adc r5, %[r]\n\t"
  3903. #endif
  3904. "uxth r7, %[b]\n\t"
  3905. #ifdef WOLFSSL_KEIL
  3906. "muls r6, r7, r6\n\t"
  3907. #elif defined(__clang__)
  3908. "muls r6, r7\n\t"
  3909. #else
  3910. "mul r6, r7\n\t"
  3911. #endif
  3912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3913. "lsrs r7, r6, #16\n\t"
  3914. #else
  3915. "lsr r7, r6, #16\n\t"
  3916. #endif
  3917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3918. "lsls r6, r6, #16\n\t"
  3919. #else
  3920. "lsl r6, r6, #16\n\t"
  3921. #endif
  3922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3923. "adds r3, r3, r6\n\t"
  3924. #else
  3925. "add r3, r3, r6\n\t"
  3926. #endif
  3927. #ifdef WOLFSSL_KEIL
  3928. "adcs r4, r4, r7\n\t"
  3929. #elif defined(__clang__)
  3930. "adcs r4, r7\n\t"
  3931. #else
  3932. "adc r4, r7\n\t"
  3933. #endif
  3934. #ifdef WOLFSSL_KEIL
  3935. "adcs r5, r5, %[r]\n\t"
  3936. #elif defined(__clang__)
  3937. "adcs r5, %[r]\n\t"
  3938. #else
  3939. "adc r5, %[r]\n\t"
  3940. #endif
  3941. "# A[2] * B[4]\n\t"
  3942. "mov %[a], r9\n\t"
  3943. "mov %[b], r10\n\t"
  3944. "ldr %[a], [%[a], #8]\n\t"
  3945. "ldr %[b], [%[b], #16]\n\t"
  3946. "uxth r6, %[a]\n\t"
  3947. "uxth r7, %[b]\n\t"
  3948. #ifdef WOLFSSL_KEIL
  3949. "muls r7, r6, r7\n\t"
  3950. #elif defined(__clang__)
  3951. "muls r7, r6\n\t"
  3952. #else
  3953. "mul r7, r6\n\t"
  3954. #endif
  3955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3956. "adds r3, r3, r7\n\t"
  3957. #else
  3958. "add r3, r3, r7\n\t"
  3959. #endif
  3960. #ifdef WOLFSSL_KEIL
  3961. "adcs r4, r4, %[r]\n\t"
  3962. #elif defined(__clang__)
  3963. "adcs r4, %[r]\n\t"
  3964. #else
  3965. "adc r4, %[r]\n\t"
  3966. #endif
  3967. #ifdef WOLFSSL_KEIL
  3968. "adcs r5, r5, %[r]\n\t"
  3969. #elif defined(__clang__)
  3970. "adcs r5, %[r]\n\t"
  3971. #else
  3972. "adc r5, %[r]\n\t"
  3973. #endif
  3974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3975. "lsrs r7, %[b], #16\n\t"
  3976. #else
  3977. "lsr r7, %[b], #16\n\t"
  3978. #endif
  3979. #ifdef WOLFSSL_KEIL
  3980. "muls r6, r7, r6\n\t"
  3981. #elif defined(__clang__)
  3982. "muls r6, r7\n\t"
  3983. #else
  3984. "mul r6, r7\n\t"
  3985. #endif
  3986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3987. "lsrs r7, r6, #16\n\t"
  3988. #else
  3989. "lsr r7, r6, #16\n\t"
  3990. #endif
  3991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3992. "lsls r6, r6, #16\n\t"
  3993. #else
  3994. "lsl r6, r6, #16\n\t"
  3995. #endif
  3996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3997. "adds r3, r3, r6\n\t"
  3998. #else
  3999. "add r3, r3, r6\n\t"
  4000. #endif
  4001. #ifdef WOLFSSL_KEIL
  4002. "adcs r4, r4, r7\n\t"
  4003. #elif defined(__clang__)
  4004. "adcs r4, r7\n\t"
  4005. #else
  4006. "adc r4, r7\n\t"
  4007. #endif
  4008. #ifdef WOLFSSL_KEIL
  4009. "adcs r5, r5, %[r]\n\t"
  4010. #elif defined(__clang__)
  4011. "adcs r5, %[r]\n\t"
  4012. #else
  4013. "adc r5, %[r]\n\t"
  4014. #endif
  4015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4016. "lsrs r6, %[a], #16\n\t"
  4017. #else
  4018. "lsr r6, %[a], #16\n\t"
  4019. #endif
  4020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4021. "lsrs r7, %[b], #16\n\t"
  4022. #else
  4023. "lsr r7, %[b], #16\n\t"
  4024. #endif
  4025. #ifdef WOLFSSL_KEIL
  4026. "muls r7, r6, r7\n\t"
  4027. #elif defined(__clang__)
  4028. "muls r7, r6\n\t"
  4029. #else
  4030. "mul r7, r6\n\t"
  4031. #endif
  4032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4033. "adds r4, r4, r7\n\t"
  4034. #else
  4035. "add r4, r4, r7\n\t"
  4036. #endif
  4037. #ifdef WOLFSSL_KEIL
  4038. "adcs r5, r5, %[r]\n\t"
  4039. #elif defined(__clang__)
  4040. "adcs r5, %[r]\n\t"
  4041. #else
  4042. "adc r5, %[r]\n\t"
  4043. #endif
  4044. "uxth r7, %[b]\n\t"
  4045. #ifdef WOLFSSL_KEIL
  4046. "muls r6, r7, r6\n\t"
  4047. #elif defined(__clang__)
  4048. "muls r6, r7\n\t"
  4049. #else
  4050. "mul r6, r7\n\t"
  4051. #endif
  4052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4053. "lsrs r7, r6, #16\n\t"
  4054. #else
  4055. "lsr r7, r6, #16\n\t"
  4056. #endif
  4057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4058. "lsls r6, r6, #16\n\t"
  4059. #else
  4060. "lsl r6, r6, #16\n\t"
  4061. #endif
  4062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4063. "adds r3, r3, r6\n\t"
  4064. #else
  4065. "add r3, r3, r6\n\t"
  4066. #endif
  4067. #ifdef WOLFSSL_KEIL
  4068. "adcs r4, r4, r7\n\t"
  4069. #elif defined(__clang__)
  4070. "adcs r4, r7\n\t"
  4071. #else
  4072. "adc r4, r7\n\t"
  4073. #endif
  4074. #ifdef WOLFSSL_KEIL
  4075. "adcs r5, r5, %[r]\n\t"
  4076. #elif defined(__clang__)
  4077. "adcs r5, %[r]\n\t"
  4078. #else
  4079. "adc r5, %[r]\n\t"
  4080. #endif
  4081. "# A[1] * B[5]\n\t"
  4082. "mov %[a], r9\n\t"
  4083. "mov %[b], r10\n\t"
  4084. "ldr %[a], [%[a], #4]\n\t"
  4085. "ldr %[b], [%[b], #20]\n\t"
  4086. "uxth r6, %[a]\n\t"
  4087. "uxth r7, %[b]\n\t"
  4088. #ifdef WOLFSSL_KEIL
  4089. "muls r7, r6, r7\n\t"
  4090. #elif defined(__clang__)
  4091. "muls r7, r6\n\t"
  4092. #else
  4093. "mul r7, r6\n\t"
  4094. #endif
  4095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4096. "adds r3, r3, r7\n\t"
  4097. #else
  4098. "add r3, r3, r7\n\t"
  4099. #endif
  4100. #ifdef WOLFSSL_KEIL
  4101. "adcs r4, r4, %[r]\n\t"
  4102. #elif defined(__clang__)
  4103. "adcs r4, %[r]\n\t"
  4104. #else
  4105. "adc r4, %[r]\n\t"
  4106. #endif
  4107. #ifdef WOLFSSL_KEIL
  4108. "adcs r5, r5, %[r]\n\t"
  4109. #elif defined(__clang__)
  4110. "adcs r5, %[r]\n\t"
  4111. #else
  4112. "adc r5, %[r]\n\t"
  4113. #endif
  4114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4115. "lsrs r7, %[b], #16\n\t"
  4116. #else
  4117. "lsr r7, %[b], #16\n\t"
  4118. #endif
  4119. #ifdef WOLFSSL_KEIL
  4120. "muls r6, r7, r6\n\t"
  4121. #elif defined(__clang__)
  4122. "muls r6, r7\n\t"
  4123. #else
  4124. "mul r6, r7\n\t"
  4125. #endif
  4126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4127. "lsrs r7, r6, #16\n\t"
  4128. #else
  4129. "lsr r7, r6, #16\n\t"
  4130. #endif
  4131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4132. "lsls r6, r6, #16\n\t"
  4133. #else
  4134. "lsl r6, r6, #16\n\t"
  4135. #endif
  4136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4137. "adds r3, r3, r6\n\t"
  4138. #else
  4139. "add r3, r3, r6\n\t"
  4140. #endif
  4141. #ifdef WOLFSSL_KEIL
  4142. "adcs r4, r4, r7\n\t"
  4143. #elif defined(__clang__)
  4144. "adcs r4, r7\n\t"
  4145. #else
  4146. "adc r4, r7\n\t"
  4147. #endif
  4148. #ifdef WOLFSSL_KEIL
  4149. "adcs r5, r5, %[r]\n\t"
  4150. #elif defined(__clang__)
  4151. "adcs r5, %[r]\n\t"
  4152. #else
  4153. "adc r5, %[r]\n\t"
  4154. #endif
  4155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4156. "lsrs r6, %[a], #16\n\t"
  4157. #else
  4158. "lsr r6, %[a], #16\n\t"
  4159. #endif
  4160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4161. "lsrs r7, %[b], #16\n\t"
  4162. #else
  4163. "lsr r7, %[b], #16\n\t"
  4164. #endif
  4165. #ifdef WOLFSSL_KEIL
  4166. "muls r7, r6, r7\n\t"
  4167. #elif defined(__clang__)
  4168. "muls r7, r6\n\t"
  4169. #else
  4170. "mul r7, r6\n\t"
  4171. #endif
  4172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4173. "adds r4, r4, r7\n\t"
  4174. #else
  4175. "add r4, r4, r7\n\t"
  4176. #endif
  4177. #ifdef WOLFSSL_KEIL
  4178. "adcs r5, r5, %[r]\n\t"
  4179. #elif defined(__clang__)
  4180. "adcs r5, %[r]\n\t"
  4181. #else
  4182. "adc r5, %[r]\n\t"
  4183. #endif
  4184. "uxth r7, %[b]\n\t"
  4185. #ifdef WOLFSSL_KEIL
  4186. "muls r6, r7, r6\n\t"
  4187. #elif defined(__clang__)
  4188. "muls r6, r7\n\t"
  4189. #else
  4190. "mul r6, r7\n\t"
  4191. #endif
  4192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4193. "lsrs r7, r6, #16\n\t"
  4194. #else
  4195. "lsr r7, r6, #16\n\t"
  4196. #endif
  4197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4198. "lsls r6, r6, #16\n\t"
  4199. #else
  4200. "lsl r6, r6, #16\n\t"
  4201. #endif
  4202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4203. "adds r3, r3, r6\n\t"
  4204. #else
  4205. "add r3, r3, r6\n\t"
  4206. #endif
  4207. #ifdef WOLFSSL_KEIL
  4208. "adcs r4, r4, r7\n\t"
  4209. #elif defined(__clang__)
  4210. "adcs r4, r7\n\t"
  4211. #else
  4212. "adc r4, r7\n\t"
  4213. #endif
  4214. #ifdef WOLFSSL_KEIL
  4215. "adcs r5, r5, %[r]\n\t"
  4216. #elif defined(__clang__)
  4217. "adcs r5, %[r]\n\t"
  4218. #else
  4219. "adc r5, %[r]\n\t"
  4220. #endif
  4221. "# A[0] * B[6]\n\t"
  4222. "mov %[a], r9\n\t"
  4223. "mov %[b], r10\n\t"
  4224. "ldr %[a], [%[a]]\n\t"
  4225. "ldr %[b], [%[b], #24]\n\t"
  4226. "uxth r6, %[a]\n\t"
  4227. "uxth r7, %[b]\n\t"
  4228. #ifdef WOLFSSL_KEIL
  4229. "muls r7, r6, r7\n\t"
  4230. #elif defined(__clang__)
  4231. "muls r7, r6\n\t"
  4232. #else
  4233. "mul r7, r6\n\t"
  4234. #endif
  4235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4236. "adds r3, r3, r7\n\t"
  4237. #else
  4238. "add r3, r3, r7\n\t"
  4239. #endif
  4240. #ifdef WOLFSSL_KEIL
  4241. "adcs r4, r4, %[r]\n\t"
  4242. #elif defined(__clang__)
  4243. "adcs r4, %[r]\n\t"
  4244. #else
  4245. "adc r4, %[r]\n\t"
  4246. #endif
  4247. #ifdef WOLFSSL_KEIL
  4248. "adcs r5, r5, %[r]\n\t"
  4249. #elif defined(__clang__)
  4250. "adcs r5, %[r]\n\t"
  4251. #else
  4252. "adc r5, %[r]\n\t"
  4253. #endif
  4254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4255. "lsrs r7, %[b], #16\n\t"
  4256. #else
  4257. "lsr r7, %[b], #16\n\t"
  4258. #endif
  4259. #ifdef WOLFSSL_KEIL
  4260. "muls r6, r7, r6\n\t"
  4261. #elif defined(__clang__)
  4262. "muls r6, r7\n\t"
  4263. #else
  4264. "mul r6, r7\n\t"
  4265. #endif
  4266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4267. "lsrs r7, r6, #16\n\t"
  4268. #else
  4269. "lsr r7, r6, #16\n\t"
  4270. #endif
  4271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4272. "lsls r6, r6, #16\n\t"
  4273. #else
  4274. "lsl r6, r6, #16\n\t"
  4275. #endif
  4276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4277. "adds r3, r3, r6\n\t"
  4278. #else
  4279. "add r3, r3, r6\n\t"
  4280. #endif
  4281. #ifdef WOLFSSL_KEIL
  4282. "adcs r4, r4, r7\n\t"
  4283. #elif defined(__clang__)
  4284. "adcs r4, r7\n\t"
  4285. #else
  4286. "adc r4, r7\n\t"
  4287. #endif
  4288. #ifdef WOLFSSL_KEIL
  4289. "adcs r5, r5, %[r]\n\t"
  4290. #elif defined(__clang__)
  4291. "adcs r5, %[r]\n\t"
  4292. #else
  4293. "adc r5, %[r]\n\t"
  4294. #endif
  4295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4296. "lsrs r6, %[a], #16\n\t"
  4297. #else
  4298. "lsr r6, %[a], #16\n\t"
  4299. #endif
  4300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4301. "lsrs r7, %[b], #16\n\t"
  4302. #else
  4303. "lsr r7, %[b], #16\n\t"
  4304. #endif
  4305. #ifdef WOLFSSL_KEIL
  4306. "muls r7, r6, r7\n\t"
  4307. #elif defined(__clang__)
  4308. "muls r7, r6\n\t"
  4309. #else
  4310. "mul r7, r6\n\t"
  4311. #endif
  4312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4313. "adds r4, r4, r7\n\t"
  4314. #else
  4315. "add r4, r4, r7\n\t"
  4316. #endif
  4317. #ifdef WOLFSSL_KEIL
  4318. "adcs r5, r5, %[r]\n\t"
  4319. #elif defined(__clang__)
  4320. "adcs r5, %[r]\n\t"
  4321. #else
  4322. "adc r5, %[r]\n\t"
  4323. #endif
  4324. "uxth r7, %[b]\n\t"
  4325. #ifdef WOLFSSL_KEIL
  4326. "muls r6, r7, r6\n\t"
  4327. #elif defined(__clang__)
  4328. "muls r6, r7\n\t"
  4329. #else
  4330. "mul r6, r7\n\t"
  4331. #endif
  4332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4333. "lsrs r7, r6, #16\n\t"
  4334. #else
  4335. "lsr r7, r6, #16\n\t"
  4336. #endif
  4337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4338. "lsls r6, r6, #16\n\t"
  4339. #else
  4340. "lsl r6, r6, #16\n\t"
  4341. #endif
  4342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4343. "adds r3, r3, r6\n\t"
  4344. #else
  4345. "add r3, r3, r6\n\t"
  4346. #endif
  4347. #ifdef WOLFSSL_KEIL
  4348. "adcs r4, r4, r7\n\t"
  4349. #elif defined(__clang__)
  4350. "adcs r4, r7\n\t"
  4351. #else
  4352. "adc r4, r7\n\t"
  4353. #endif
  4354. #ifdef WOLFSSL_KEIL
  4355. "adcs r5, r5, %[r]\n\t"
  4356. #elif defined(__clang__)
  4357. "adcs r5, %[r]\n\t"
  4358. #else
  4359. "adc r5, %[r]\n\t"
  4360. #endif
  4361. "str r3, [sp, #24]\n\t"
  4362. "# A[0] * B[7]\n\t"
  4363. "movs r3, #0\n\t"
  4364. "mov %[a], r9\n\t"
  4365. "mov %[b], r10\n\t"
  4366. "ldr %[a], [%[a]]\n\t"
  4367. "ldr %[b], [%[b], #28]\n\t"
  4368. "uxth r6, %[a]\n\t"
  4369. "uxth r7, %[b]\n\t"
  4370. #ifdef WOLFSSL_KEIL
  4371. "muls r7, r6, r7\n\t"
  4372. #elif defined(__clang__)
  4373. "muls r7, r6\n\t"
  4374. #else
  4375. "mul r7, r6\n\t"
  4376. #endif
  4377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4378. "adds r4, r4, r7\n\t"
  4379. #else
  4380. "add r4, r4, r7\n\t"
  4381. #endif
  4382. #ifdef WOLFSSL_KEIL
  4383. "adcs r5, r5, %[r]\n\t"
  4384. #elif defined(__clang__)
  4385. "adcs r5, %[r]\n\t"
  4386. #else
  4387. "adc r5, %[r]\n\t"
  4388. #endif
  4389. #ifdef WOLFSSL_KEIL
  4390. "adcs r3, r3, %[r]\n\t"
  4391. #elif defined(__clang__)
  4392. "adcs r3, %[r]\n\t"
  4393. #else
  4394. "adc r3, %[r]\n\t"
  4395. #endif
  4396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4397. "lsrs r7, %[b], #16\n\t"
  4398. #else
  4399. "lsr r7, %[b], #16\n\t"
  4400. #endif
  4401. #ifdef WOLFSSL_KEIL
  4402. "muls r6, r7, r6\n\t"
  4403. #elif defined(__clang__)
  4404. "muls r6, r7\n\t"
  4405. #else
  4406. "mul r6, r7\n\t"
  4407. #endif
  4408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4409. "lsrs r7, r6, #16\n\t"
  4410. #else
  4411. "lsr r7, r6, #16\n\t"
  4412. #endif
  4413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4414. "lsls r6, r6, #16\n\t"
  4415. #else
  4416. "lsl r6, r6, #16\n\t"
  4417. #endif
  4418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4419. "adds r4, r4, r6\n\t"
  4420. #else
  4421. "add r4, r4, r6\n\t"
  4422. #endif
  4423. #ifdef WOLFSSL_KEIL
  4424. "adcs r5, r5, r7\n\t"
  4425. #elif defined(__clang__)
  4426. "adcs r5, r7\n\t"
  4427. #else
  4428. "adc r5, r7\n\t"
  4429. #endif
  4430. #ifdef WOLFSSL_KEIL
  4431. "adcs r3, r3, %[r]\n\t"
  4432. #elif defined(__clang__)
  4433. "adcs r3, %[r]\n\t"
  4434. #else
  4435. "adc r3, %[r]\n\t"
  4436. #endif
  4437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4438. "lsrs r6, %[a], #16\n\t"
  4439. #else
  4440. "lsr r6, %[a], #16\n\t"
  4441. #endif
  4442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4443. "lsrs r7, %[b], #16\n\t"
  4444. #else
  4445. "lsr r7, %[b], #16\n\t"
  4446. #endif
  4447. #ifdef WOLFSSL_KEIL
  4448. "muls r7, r6, r7\n\t"
  4449. #elif defined(__clang__)
  4450. "muls r7, r6\n\t"
  4451. #else
  4452. "mul r7, r6\n\t"
  4453. #endif
  4454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4455. "adds r5, r5, r7\n\t"
  4456. #else
  4457. "add r5, r5, r7\n\t"
  4458. #endif
  4459. #ifdef WOLFSSL_KEIL
  4460. "adcs r3, r3, %[r]\n\t"
  4461. #elif defined(__clang__)
  4462. "adcs r3, %[r]\n\t"
  4463. #else
  4464. "adc r3, %[r]\n\t"
  4465. #endif
  4466. "uxth r7, %[b]\n\t"
  4467. #ifdef WOLFSSL_KEIL
  4468. "muls r6, r7, r6\n\t"
  4469. #elif defined(__clang__)
  4470. "muls r6, r7\n\t"
  4471. #else
  4472. "mul r6, r7\n\t"
  4473. #endif
  4474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4475. "lsrs r7, r6, #16\n\t"
  4476. #else
  4477. "lsr r7, r6, #16\n\t"
  4478. #endif
  4479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4480. "lsls r6, r6, #16\n\t"
  4481. #else
  4482. "lsl r6, r6, #16\n\t"
  4483. #endif
  4484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4485. "adds r4, r4, r6\n\t"
  4486. #else
  4487. "add r4, r4, r6\n\t"
  4488. #endif
  4489. #ifdef WOLFSSL_KEIL
  4490. "adcs r5, r5, r7\n\t"
  4491. #elif defined(__clang__)
  4492. "adcs r5, r7\n\t"
  4493. #else
  4494. "adc r5, r7\n\t"
  4495. #endif
  4496. #ifdef WOLFSSL_KEIL
  4497. "adcs r3, r3, %[r]\n\t"
  4498. #elif defined(__clang__)
  4499. "adcs r3, %[r]\n\t"
  4500. #else
  4501. "adc r3, %[r]\n\t"
  4502. #endif
  4503. "# A[1] * B[6]\n\t"
  4504. "mov %[a], r9\n\t"
  4505. "mov %[b], r10\n\t"
  4506. "ldr %[a], [%[a], #4]\n\t"
  4507. "ldr %[b], [%[b], #24]\n\t"
  4508. "uxth r6, %[a]\n\t"
  4509. "uxth r7, %[b]\n\t"
  4510. #ifdef WOLFSSL_KEIL
  4511. "muls r7, r6, r7\n\t"
  4512. #elif defined(__clang__)
  4513. "muls r7, r6\n\t"
  4514. #else
  4515. "mul r7, r6\n\t"
  4516. #endif
  4517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4518. "adds r4, r4, r7\n\t"
  4519. #else
  4520. "add r4, r4, r7\n\t"
  4521. #endif
  4522. #ifdef WOLFSSL_KEIL
  4523. "adcs r5, r5, %[r]\n\t"
  4524. #elif defined(__clang__)
  4525. "adcs r5, %[r]\n\t"
  4526. #else
  4527. "adc r5, %[r]\n\t"
  4528. #endif
  4529. #ifdef WOLFSSL_KEIL
  4530. "adcs r3, r3, %[r]\n\t"
  4531. #elif defined(__clang__)
  4532. "adcs r3, %[r]\n\t"
  4533. #else
  4534. "adc r3, %[r]\n\t"
  4535. #endif
  4536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4537. "lsrs r7, %[b], #16\n\t"
  4538. #else
  4539. "lsr r7, %[b], #16\n\t"
  4540. #endif
  4541. #ifdef WOLFSSL_KEIL
  4542. "muls r6, r7, r6\n\t"
  4543. #elif defined(__clang__)
  4544. "muls r6, r7\n\t"
  4545. #else
  4546. "mul r6, r7\n\t"
  4547. #endif
  4548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4549. "lsrs r7, r6, #16\n\t"
  4550. #else
  4551. "lsr r7, r6, #16\n\t"
  4552. #endif
  4553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4554. "lsls r6, r6, #16\n\t"
  4555. #else
  4556. "lsl r6, r6, #16\n\t"
  4557. #endif
  4558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4559. "adds r4, r4, r6\n\t"
  4560. #else
  4561. "add r4, r4, r6\n\t"
  4562. #endif
  4563. #ifdef WOLFSSL_KEIL
  4564. "adcs r5, r5, r7\n\t"
  4565. #elif defined(__clang__)
  4566. "adcs r5, r7\n\t"
  4567. #else
  4568. "adc r5, r7\n\t"
  4569. #endif
  4570. #ifdef WOLFSSL_KEIL
  4571. "adcs r3, r3, %[r]\n\t"
  4572. #elif defined(__clang__)
  4573. "adcs r3, %[r]\n\t"
  4574. #else
  4575. "adc r3, %[r]\n\t"
  4576. #endif
  4577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4578. "lsrs r6, %[a], #16\n\t"
  4579. #else
  4580. "lsr r6, %[a], #16\n\t"
  4581. #endif
  4582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4583. "lsrs r7, %[b], #16\n\t"
  4584. #else
  4585. "lsr r7, %[b], #16\n\t"
  4586. #endif
  4587. #ifdef WOLFSSL_KEIL
  4588. "muls r7, r6, r7\n\t"
  4589. #elif defined(__clang__)
  4590. "muls r7, r6\n\t"
  4591. #else
  4592. "mul r7, r6\n\t"
  4593. #endif
  4594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4595. "adds r5, r5, r7\n\t"
  4596. #else
  4597. "add r5, r5, r7\n\t"
  4598. #endif
  4599. #ifdef WOLFSSL_KEIL
  4600. "adcs r3, r3, %[r]\n\t"
  4601. #elif defined(__clang__)
  4602. "adcs r3, %[r]\n\t"
  4603. #else
  4604. "adc r3, %[r]\n\t"
  4605. #endif
  4606. "uxth r7, %[b]\n\t"
  4607. #ifdef WOLFSSL_KEIL
  4608. "muls r6, r7, r6\n\t"
  4609. #elif defined(__clang__)
  4610. "muls r6, r7\n\t"
  4611. #else
  4612. "mul r6, r7\n\t"
  4613. #endif
  4614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4615. "lsrs r7, r6, #16\n\t"
  4616. #else
  4617. "lsr r7, r6, #16\n\t"
  4618. #endif
  4619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4620. "lsls r6, r6, #16\n\t"
  4621. #else
  4622. "lsl r6, r6, #16\n\t"
  4623. #endif
  4624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4625. "adds r4, r4, r6\n\t"
  4626. #else
  4627. "add r4, r4, r6\n\t"
  4628. #endif
  4629. #ifdef WOLFSSL_KEIL
  4630. "adcs r5, r5, r7\n\t"
  4631. #elif defined(__clang__)
  4632. "adcs r5, r7\n\t"
  4633. #else
  4634. "adc r5, r7\n\t"
  4635. #endif
  4636. #ifdef WOLFSSL_KEIL
  4637. "adcs r3, r3, %[r]\n\t"
  4638. #elif defined(__clang__)
  4639. "adcs r3, %[r]\n\t"
  4640. #else
  4641. "adc r3, %[r]\n\t"
  4642. #endif
  4643. "# A[2] * B[5]\n\t"
  4644. "mov %[a], r9\n\t"
  4645. "mov %[b], r10\n\t"
  4646. "ldr %[a], [%[a], #8]\n\t"
  4647. "ldr %[b], [%[b], #20]\n\t"
  4648. "uxth r6, %[a]\n\t"
  4649. "uxth r7, %[b]\n\t"
  4650. #ifdef WOLFSSL_KEIL
  4651. "muls r7, r6, r7\n\t"
  4652. #elif defined(__clang__)
  4653. "muls r7, r6\n\t"
  4654. #else
  4655. "mul r7, r6\n\t"
  4656. #endif
  4657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4658. "adds r4, r4, r7\n\t"
  4659. #else
  4660. "add r4, r4, r7\n\t"
  4661. #endif
  4662. #ifdef WOLFSSL_KEIL
  4663. "adcs r5, r5, %[r]\n\t"
  4664. #elif defined(__clang__)
  4665. "adcs r5, %[r]\n\t"
  4666. #else
  4667. "adc r5, %[r]\n\t"
  4668. #endif
  4669. #ifdef WOLFSSL_KEIL
  4670. "adcs r3, r3, %[r]\n\t"
  4671. #elif defined(__clang__)
  4672. "adcs r3, %[r]\n\t"
  4673. #else
  4674. "adc r3, %[r]\n\t"
  4675. #endif
  4676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4677. "lsrs r7, %[b], #16\n\t"
  4678. #else
  4679. "lsr r7, %[b], #16\n\t"
  4680. #endif
  4681. #ifdef WOLFSSL_KEIL
  4682. "muls r6, r7, r6\n\t"
  4683. #elif defined(__clang__)
  4684. "muls r6, r7\n\t"
  4685. #else
  4686. "mul r6, r7\n\t"
  4687. #endif
  4688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4689. "lsrs r7, r6, #16\n\t"
  4690. #else
  4691. "lsr r7, r6, #16\n\t"
  4692. #endif
  4693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4694. "lsls r6, r6, #16\n\t"
  4695. #else
  4696. "lsl r6, r6, #16\n\t"
  4697. #endif
  4698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4699. "adds r4, r4, r6\n\t"
  4700. #else
  4701. "add r4, r4, r6\n\t"
  4702. #endif
  4703. #ifdef WOLFSSL_KEIL
  4704. "adcs r5, r5, r7\n\t"
  4705. #elif defined(__clang__)
  4706. "adcs r5, r7\n\t"
  4707. #else
  4708. "adc r5, r7\n\t"
  4709. #endif
  4710. #ifdef WOLFSSL_KEIL
  4711. "adcs r3, r3, %[r]\n\t"
  4712. #elif defined(__clang__)
  4713. "adcs r3, %[r]\n\t"
  4714. #else
  4715. "adc r3, %[r]\n\t"
  4716. #endif
  4717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4718. "lsrs r6, %[a], #16\n\t"
  4719. #else
  4720. "lsr r6, %[a], #16\n\t"
  4721. #endif
  4722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4723. "lsrs r7, %[b], #16\n\t"
  4724. #else
  4725. "lsr r7, %[b], #16\n\t"
  4726. #endif
  4727. #ifdef WOLFSSL_KEIL
  4728. "muls r7, r6, r7\n\t"
  4729. #elif defined(__clang__)
  4730. "muls r7, r6\n\t"
  4731. #else
  4732. "mul r7, r6\n\t"
  4733. #endif
  4734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4735. "adds r5, r5, r7\n\t"
  4736. #else
  4737. "add r5, r5, r7\n\t"
  4738. #endif
  4739. #ifdef WOLFSSL_KEIL
  4740. "adcs r3, r3, %[r]\n\t"
  4741. #elif defined(__clang__)
  4742. "adcs r3, %[r]\n\t"
  4743. #else
  4744. "adc r3, %[r]\n\t"
  4745. #endif
  4746. "uxth r7, %[b]\n\t"
  4747. #ifdef WOLFSSL_KEIL
  4748. "muls r6, r7, r6\n\t"
  4749. #elif defined(__clang__)
  4750. "muls r6, r7\n\t"
  4751. #else
  4752. "mul r6, r7\n\t"
  4753. #endif
  4754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4755. "lsrs r7, r6, #16\n\t"
  4756. #else
  4757. "lsr r7, r6, #16\n\t"
  4758. #endif
  4759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4760. "lsls r6, r6, #16\n\t"
  4761. #else
  4762. "lsl r6, r6, #16\n\t"
  4763. #endif
  4764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4765. "adds r4, r4, r6\n\t"
  4766. #else
  4767. "add r4, r4, r6\n\t"
  4768. #endif
  4769. #ifdef WOLFSSL_KEIL
  4770. "adcs r5, r5, r7\n\t"
  4771. #elif defined(__clang__)
  4772. "adcs r5, r7\n\t"
  4773. #else
  4774. "adc r5, r7\n\t"
  4775. #endif
  4776. #ifdef WOLFSSL_KEIL
  4777. "adcs r3, r3, %[r]\n\t"
  4778. #elif defined(__clang__)
  4779. "adcs r3, %[r]\n\t"
  4780. #else
  4781. "adc r3, %[r]\n\t"
  4782. #endif
  4783. "# A[3] * B[4]\n\t"
  4784. "mov %[a], r9\n\t"
  4785. "mov %[b], r10\n\t"
  4786. "ldr %[a], [%[a], #12]\n\t"
  4787. "ldr %[b], [%[b], #16]\n\t"
  4788. "uxth r6, %[a]\n\t"
  4789. "uxth r7, %[b]\n\t"
  4790. #ifdef WOLFSSL_KEIL
  4791. "muls r7, r6, r7\n\t"
  4792. #elif defined(__clang__)
  4793. "muls r7, r6\n\t"
  4794. #else
  4795. "mul r7, r6\n\t"
  4796. #endif
  4797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4798. "adds r4, r4, r7\n\t"
  4799. #else
  4800. "add r4, r4, r7\n\t"
  4801. #endif
  4802. #ifdef WOLFSSL_KEIL
  4803. "adcs r5, r5, %[r]\n\t"
  4804. #elif defined(__clang__)
  4805. "adcs r5, %[r]\n\t"
  4806. #else
  4807. "adc r5, %[r]\n\t"
  4808. #endif
  4809. #ifdef WOLFSSL_KEIL
  4810. "adcs r3, r3, %[r]\n\t"
  4811. #elif defined(__clang__)
  4812. "adcs r3, %[r]\n\t"
  4813. #else
  4814. "adc r3, %[r]\n\t"
  4815. #endif
  4816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4817. "lsrs r7, %[b], #16\n\t"
  4818. #else
  4819. "lsr r7, %[b], #16\n\t"
  4820. #endif
  4821. #ifdef WOLFSSL_KEIL
  4822. "muls r6, r7, r6\n\t"
  4823. #elif defined(__clang__)
  4824. "muls r6, r7\n\t"
  4825. #else
  4826. "mul r6, r7\n\t"
  4827. #endif
  4828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4829. "lsrs r7, r6, #16\n\t"
  4830. #else
  4831. "lsr r7, r6, #16\n\t"
  4832. #endif
  4833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4834. "lsls r6, r6, #16\n\t"
  4835. #else
  4836. "lsl r6, r6, #16\n\t"
  4837. #endif
  4838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4839. "adds r4, r4, r6\n\t"
  4840. #else
  4841. "add r4, r4, r6\n\t"
  4842. #endif
  4843. #ifdef WOLFSSL_KEIL
  4844. "adcs r5, r5, r7\n\t"
  4845. #elif defined(__clang__)
  4846. "adcs r5, r7\n\t"
  4847. #else
  4848. "adc r5, r7\n\t"
  4849. #endif
  4850. #ifdef WOLFSSL_KEIL
  4851. "adcs r3, r3, %[r]\n\t"
  4852. #elif defined(__clang__)
  4853. "adcs r3, %[r]\n\t"
  4854. #else
  4855. "adc r3, %[r]\n\t"
  4856. #endif
  4857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4858. "lsrs r6, %[a], #16\n\t"
  4859. #else
  4860. "lsr r6, %[a], #16\n\t"
  4861. #endif
  4862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4863. "lsrs r7, %[b], #16\n\t"
  4864. #else
  4865. "lsr r7, %[b], #16\n\t"
  4866. #endif
  4867. #ifdef WOLFSSL_KEIL
  4868. "muls r7, r6, r7\n\t"
  4869. #elif defined(__clang__)
  4870. "muls r7, r6\n\t"
  4871. #else
  4872. "mul r7, r6\n\t"
  4873. #endif
  4874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4875. "adds r5, r5, r7\n\t"
  4876. #else
  4877. "add r5, r5, r7\n\t"
  4878. #endif
  4879. #ifdef WOLFSSL_KEIL
  4880. "adcs r3, r3, %[r]\n\t"
  4881. #elif defined(__clang__)
  4882. "adcs r3, %[r]\n\t"
  4883. #else
  4884. "adc r3, %[r]\n\t"
  4885. #endif
  4886. "uxth r7, %[b]\n\t"
  4887. #ifdef WOLFSSL_KEIL
  4888. "muls r6, r7, r6\n\t"
  4889. #elif defined(__clang__)
  4890. "muls r6, r7\n\t"
  4891. #else
  4892. "mul r6, r7\n\t"
  4893. #endif
  4894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4895. "lsrs r7, r6, #16\n\t"
  4896. #else
  4897. "lsr r7, r6, #16\n\t"
  4898. #endif
  4899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4900. "lsls r6, r6, #16\n\t"
  4901. #else
  4902. "lsl r6, r6, #16\n\t"
  4903. #endif
  4904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4905. "adds r4, r4, r6\n\t"
  4906. #else
  4907. "add r4, r4, r6\n\t"
  4908. #endif
  4909. #ifdef WOLFSSL_KEIL
  4910. "adcs r5, r5, r7\n\t"
  4911. #elif defined(__clang__)
  4912. "adcs r5, r7\n\t"
  4913. #else
  4914. "adc r5, r7\n\t"
  4915. #endif
  4916. #ifdef WOLFSSL_KEIL
  4917. "adcs r3, r3, %[r]\n\t"
  4918. #elif defined(__clang__)
  4919. "adcs r3, %[r]\n\t"
  4920. #else
  4921. "adc r3, %[r]\n\t"
  4922. #endif
  4923. "# A[4] * B[3]\n\t"
  4924. "mov %[a], r9\n\t"
  4925. "mov %[b], r10\n\t"
  4926. "ldr %[a], [%[a], #16]\n\t"
  4927. "ldr %[b], [%[b], #12]\n\t"
  4928. "uxth r6, %[a]\n\t"
  4929. "uxth r7, %[b]\n\t"
  4930. #ifdef WOLFSSL_KEIL
  4931. "muls r7, r6, r7\n\t"
  4932. #elif defined(__clang__)
  4933. "muls r7, r6\n\t"
  4934. #else
  4935. "mul r7, r6\n\t"
  4936. #endif
  4937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4938. "adds r4, r4, r7\n\t"
  4939. #else
  4940. "add r4, r4, r7\n\t"
  4941. #endif
  4942. #ifdef WOLFSSL_KEIL
  4943. "adcs r5, r5, %[r]\n\t"
  4944. #elif defined(__clang__)
  4945. "adcs r5, %[r]\n\t"
  4946. #else
  4947. "adc r5, %[r]\n\t"
  4948. #endif
  4949. #ifdef WOLFSSL_KEIL
  4950. "adcs r3, r3, %[r]\n\t"
  4951. #elif defined(__clang__)
  4952. "adcs r3, %[r]\n\t"
  4953. #else
  4954. "adc r3, %[r]\n\t"
  4955. #endif
  4956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4957. "lsrs r7, %[b], #16\n\t"
  4958. #else
  4959. "lsr r7, %[b], #16\n\t"
  4960. #endif
  4961. #ifdef WOLFSSL_KEIL
  4962. "muls r6, r7, r6\n\t"
  4963. #elif defined(__clang__)
  4964. "muls r6, r7\n\t"
  4965. #else
  4966. "mul r6, r7\n\t"
  4967. #endif
  4968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4969. "lsrs r7, r6, #16\n\t"
  4970. #else
  4971. "lsr r7, r6, #16\n\t"
  4972. #endif
  4973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4974. "lsls r6, r6, #16\n\t"
  4975. #else
  4976. "lsl r6, r6, #16\n\t"
  4977. #endif
  4978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4979. "adds r4, r4, r6\n\t"
  4980. #else
  4981. "add r4, r4, r6\n\t"
  4982. #endif
  4983. #ifdef WOLFSSL_KEIL
  4984. "adcs r5, r5, r7\n\t"
  4985. #elif defined(__clang__)
  4986. "adcs r5, r7\n\t"
  4987. #else
  4988. "adc r5, r7\n\t"
  4989. #endif
  4990. #ifdef WOLFSSL_KEIL
  4991. "adcs r3, r3, %[r]\n\t"
  4992. #elif defined(__clang__)
  4993. "adcs r3, %[r]\n\t"
  4994. #else
  4995. "adc r3, %[r]\n\t"
  4996. #endif
  4997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4998. "lsrs r6, %[a], #16\n\t"
  4999. #else
  5000. "lsr r6, %[a], #16\n\t"
  5001. #endif
  5002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5003. "lsrs r7, %[b], #16\n\t"
  5004. #else
  5005. "lsr r7, %[b], #16\n\t"
  5006. #endif
  5007. #ifdef WOLFSSL_KEIL
  5008. "muls r7, r6, r7\n\t"
  5009. #elif defined(__clang__)
  5010. "muls r7, r6\n\t"
  5011. #else
  5012. "mul r7, r6\n\t"
  5013. #endif
  5014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5015. "adds r5, r5, r7\n\t"
  5016. #else
  5017. "add r5, r5, r7\n\t"
  5018. #endif
  5019. #ifdef WOLFSSL_KEIL
  5020. "adcs r3, r3, %[r]\n\t"
  5021. #elif defined(__clang__)
  5022. "adcs r3, %[r]\n\t"
  5023. #else
  5024. "adc r3, %[r]\n\t"
  5025. #endif
  5026. "uxth r7, %[b]\n\t"
  5027. #ifdef WOLFSSL_KEIL
  5028. "muls r6, r7, r6\n\t"
  5029. #elif defined(__clang__)
  5030. "muls r6, r7\n\t"
  5031. #else
  5032. "mul r6, r7\n\t"
  5033. #endif
  5034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5035. "lsrs r7, r6, #16\n\t"
  5036. #else
  5037. "lsr r7, r6, #16\n\t"
  5038. #endif
  5039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5040. "lsls r6, r6, #16\n\t"
  5041. #else
  5042. "lsl r6, r6, #16\n\t"
  5043. #endif
  5044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5045. "adds r4, r4, r6\n\t"
  5046. #else
  5047. "add r4, r4, r6\n\t"
  5048. #endif
  5049. #ifdef WOLFSSL_KEIL
  5050. "adcs r5, r5, r7\n\t"
  5051. #elif defined(__clang__)
  5052. "adcs r5, r7\n\t"
  5053. #else
  5054. "adc r5, r7\n\t"
  5055. #endif
  5056. #ifdef WOLFSSL_KEIL
  5057. "adcs r3, r3, %[r]\n\t"
  5058. #elif defined(__clang__)
  5059. "adcs r3, %[r]\n\t"
  5060. #else
  5061. "adc r3, %[r]\n\t"
  5062. #endif
  5063. "# A[5] * B[2]\n\t"
  5064. "mov %[a], r9\n\t"
  5065. "mov %[b], r10\n\t"
  5066. "ldr %[a], [%[a], #20]\n\t"
  5067. "ldr %[b], [%[b], #8]\n\t"
  5068. "uxth r6, %[a]\n\t"
  5069. "uxth r7, %[b]\n\t"
  5070. #ifdef WOLFSSL_KEIL
  5071. "muls r7, r6, r7\n\t"
  5072. #elif defined(__clang__)
  5073. "muls r7, r6\n\t"
  5074. #else
  5075. "mul r7, r6\n\t"
  5076. #endif
  5077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5078. "adds r4, r4, r7\n\t"
  5079. #else
  5080. "add r4, r4, r7\n\t"
  5081. #endif
  5082. #ifdef WOLFSSL_KEIL
  5083. "adcs r5, r5, %[r]\n\t"
  5084. #elif defined(__clang__)
  5085. "adcs r5, %[r]\n\t"
  5086. #else
  5087. "adc r5, %[r]\n\t"
  5088. #endif
  5089. #ifdef WOLFSSL_KEIL
  5090. "adcs r3, r3, %[r]\n\t"
  5091. #elif defined(__clang__)
  5092. "adcs r3, %[r]\n\t"
  5093. #else
  5094. "adc r3, %[r]\n\t"
  5095. #endif
  5096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5097. "lsrs r7, %[b], #16\n\t"
  5098. #else
  5099. "lsr r7, %[b], #16\n\t"
  5100. #endif
  5101. #ifdef WOLFSSL_KEIL
  5102. "muls r6, r7, r6\n\t"
  5103. #elif defined(__clang__)
  5104. "muls r6, r7\n\t"
  5105. #else
  5106. "mul r6, r7\n\t"
  5107. #endif
  5108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5109. "lsrs r7, r6, #16\n\t"
  5110. #else
  5111. "lsr r7, r6, #16\n\t"
  5112. #endif
  5113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5114. "lsls r6, r6, #16\n\t"
  5115. #else
  5116. "lsl r6, r6, #16\n\t"
  5117. #endif
  5118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5119. "adds r4, r4, r6\n\t"
  5120. #else
  5121. "add r4, r4, r6\n\t"
  5122. #endif
  5123. #ifdef WOLFSSL_KEIL
  5124. "adcs r5, r5, r7\n\t"
  5125. #elif defined(__clang__)
  5126. "adcs r5, r7\n\t"
  5127. #else
  5128. "adc r5, r7\n\t"
  5129. #endif
  5130. #ifdef WOLFSSL_KEIL
  5131. "adcs r3, r3, %[r]\n\t"
  5132. #elif defined(__clang__)
  5133. "adcs r3, %[r]\n\t"
  5134. #else
  5135. "adc r3, %[r]\n\t"
  5136. #endif
  5137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5138. "lsrs r6, %[a], #16\n\t"
  5139. #else
  5140. "lsr r6, %[a], #16\n\t"
  5141. #endif
  5142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5143. "lsrs r7, %[b], #16\n\t"
  5144. #else
  5145. "lsr r7, %[b], #16\n\t"
  5146. #endif
  5147. #ifdef WOLFSSL_KEIL
  5148. "muls r7, r6, r7\n\t"
  5149. #elif defined(__clang__)
  5150. "muls r7, r6\n\t"
  5151. #else
  5152. "mul r7, r6\n\t"
  5153. #endif
  5154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5155. "adds r5, r5, r7\n\t"
  5156. #else
  5157. "add r5, r5, r7\n\t"
  5158. #endif
  5159. #ifdef WOLFSSL_KEIL
  5160. "adcs r3, r3, %[r]\n\t"
  5161. #elif defined(__clang__)
  5162. "adcs r3, %[r]\n\t"
  5163. #else
  5164. "adc r3, %[r]\n\t"
  5165. #endif
  5166. "uxth r7, %[b]\n\t"
  5167. #ifdef WOLFSSL_KEIL
  5168. "muls r6, r7, r6\n\t"
  5169. #elif defined(__clang__)
  5170. "muls r6, r7\n\t"
  5171. #else
  5172. "mul r6, r7\n\t"
  5173. #endif
  5174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5175. "lsrs r7, r6, #16\n\t"
  5176. #else
  5177. "lsr r7, r6, #16\n\t"
  5178. #endif
  5179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5180. "lsls r6, r6, #16\n\t"
  5181. #else
  5182. "lsl r6, r6, #16\n\t"
  5183. #endif
  5184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5185. "adds r4, r4, r6\n\t"
  5186. #else
  5187. "add r4, r4, r6\n\t"
  5188. #endif
  5189. #ifdef WOLFSSL_KEIL
  5190. "adcs r5, r5, r7\n\t"
  5191. #elif defined(__clang__)
  5192. "adcs r5, r7\n\t"
  5193. #else
  5194. "adc r5, r7\n\t"
  5195. #endif
  5196. #ifdef WOLFSSL_KEIL
  5197. "adcs r3, r3, %[r]\n\t"
  5198. #elif defined(__clang__)
  5199. "adcs r3, %[r]\n\t"
  5200. #else
  5201. "adc r3, %[r]\n\t"
  5202. #endif
  5203. "# A[6] * B[1]\n\t"
  5204. "mov %[a], r9\n\t"
  5205. "mov %[b], r10\n\t"
  5206. "ldr %[a], [%[a], #24]\n\t"
  5207. "ldr %[b], [%[b], #4]\n\t"
  5208. "uxth r6, %[a]\n\t"
  5209. "uxth r7, %[b]\n\t"
  5210. #ifdef WOLFSSL_KEIL
  5211. "muls r7, r6, r7\n\t"
  5212. #elif defined(__clang__)
  5213. "muls r7, r6\n\t"
  5214. #else
  5215. "mul r7, r6\n\t"
  5216. #endif
  5217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5218. "adds r4, r4, r7\n\t"
  5219. #else
  5220. "add r4, r4, r7\n\t"
  5221. #endif
  5222. #ifdef WOLFSSL_KEIL
  5223. "adcs r5, r5, %[r]\n\t"
  5224. #elif defined(__clang__)
  5225. "adcs r5, %[r]\n\t"
  5226. #else
  5227. "adc r5, %[r]\n\t"
  5228. #endif
  5229. #ifdef WOLFSSL_KEIL
  5230. "adcs r3, r3, %[r]\n\t"
  5231. #elif defined(__clang__)
  5232. "adcs r3, %[r]\n\t"
  5233. #else
  5234. "adc r3, %[r]\n\t"
  5235. #endif
  5236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5237. "lsrs r7, %[b], #16\n\t"
  5238. #else
  5239. "lsr r7, %[b], #16\n\t"
  5240. #endif
  5241. #ifdef WOLFSSL_KEIL
  5242. "muls r6, r7, r6\n\t"
  5243. #elif defined(__clang__)
  5244. "muls r6, r7\n\t"
  5245. #else
  5246. "mul r6, r7\n\t"
  5247. #endif
  5248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5249. "lsrs r7, r6, #16\n\t"
  5250. #else
  5251. "lsr r7, r6, #16\n\t"
  5252. #endif
  5253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5254. "lsls r6, r6, #16\n\t"
  5255. #else
  5256. "lsl r6, r6, #16\n\t"
  5257. #endif
  5258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5259. "adds r4, r4, r6\n\t"
  5260. #else
  5261. "add r4, r4, r6\n\t"
  5262. #endif
  5263. #ifdef WOLFSSL_KEIL
  5264. "adcs r5, r5, r7\n\t"
  5265. #elif defined(__clang__)
  5266. "adcs r5, r7\n\t"
  5267. #else
  5268. "adc r5, r7\n\t"
  5269. #endif
  5270. #ifdef WOLFSSL_KEIL
  5271. "adcs r3, r3, %[r]\n\t"
  5272. #elif defined(__clang__)
  5273. "adcs r3, %[r]\n\t"
  5274. #else
  5275. "adc r3, %[r]\n\t"
  5276. #endif
  5277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5278. "lsrs r6, %[a], #16\n\t"
  5279. #else
  5280. "lsr r6, %[a], #16\n\t"
  5281. #endif
  5282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5283. "lsrs r7, %[b], #16\n\t"
  5284. #else
  5285. "lsr r7, %[b], #16\n\t"
  5286. #endif
  5287. #ifdef WOLFSSL_KEIL
  5288. "muls r7, r6, r7\n\t"
  5289. #elif defined(__clang__)
  5290. "muls r7, r6\n\t"
  5291. #else
  5292. "mul r7, r6\n\t"
  5293. #endif
  5294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5295. "adds r5, r5, r7\n\t"
  5296. #else
  5297. "add r5, r5, r7\n\t"
  5298. #endif
  5299. #ifdef WOLFSSL_KEIL
  5300. "adcs r3, r3, %[r]\n\t"
  5301. #elif defined(__clang__)
  5302. "adcs r3, %[r]\n\t"
  5303. #else
  5304. "adc r3, %[r]\n\t"
  5305. #endif
  5306. "uxth r7, %[b]\n\t"
  5307. #ifdef WOLFSSL_KEIL
  5308. "muls r6, r7, r6\n\t"
  5309. #elif defined(__clang__)
  5310. "muls r6, r7\n\t"
  5311. #else
  5312. "mul r6, r7\n\t"
  5313. #endif
  5314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5315. "lsrs r7, r6, #16\n\t"
  5316. #else
  5317. "lsr r7, r6, #16\n\t"
  5318. #endif
  5319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5320. "lsls r6, r6, #16\n\t"
  5321. #else
  5322. "lsl r6, r6, #16\n\t"
  5323. #endif
  5324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5325. "adds r4, r4, r6\n\t"
  5326. #else
  5327. "add r4, r4, r6\n\t"
  5328. #endif
  5329. #ifdef WOLFSSL_KEIL
  5330. "adcs r5, r5, r7\n\t"
  5331. #elif defined(__clang__)
  5332. "adcs r5, r7\n\t"
  5333. #else
  5334. "adc r5, r7\n\t"
  5335. #endif
  5336. #ifdef WOLFSSL_KEIL
  5337. "adcs r3, r3, %[r]\n\t"
  5338. #elif defined(__clang__)
  5339. "adcs r3, %[r]\n\t"
  5340. #else
  5341. "adc r3, %[r]\n\t"
  5342. #endif
  5343. "# A[7] * B[0]\n\t"
  5344. "mov %[a], r9\n\t"
  5345. "mov %[b], r10\n\t"
  5346. "ldr %[a], [%[a], #28]\n\t"
  5347. "ldr %[b], [%[b]]\n\t"
  5348. "uxth r6, %[a]\n\t"
  5349. "uxth r7, %[b]\n\t"
  5350. #ifdef WOLFSSL_KEIL
  5351. "muls r7, r6, r7\n\t"
  5352. #elif defined(__clang__)
  5353. "muls r7, r6\n\t"
  5354. #else
  5355. "mul r7, r6\n\t"
  5356. #endif
  5357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5358. "adds r4, r4, r7\n\t"
  5359. #else
  5360. "add r4, r4, r7\n\t"
  5361. #endif
  5362. #ifdef WOLFSSL_KEIL
  5363. "adcs r5, r5, %[r]\n\t"
  5364. #elif defined(__clang__)
  5365. "adcs r5, %[r]\n\t"
  5366. #else
  5367. "adc r5, %[r]\n\t"
  5368. #endif
  5369. #ifdef WOLFSSL_KEIL
  5370. "adcs r3, r3, %[r]\n\t"
  5371. #elif defined(__clang__)
  5372. "adcs r3, %[r]\n\t"
  5373. #else
  5374. "adc r3, %[r]\n\t"
  5375. #endif
  5376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5377. "lsrs r7, %[b], #16\n\t"
  5378. #else
  5379. "lsr r7, %[b], #16\n\t"
  5380. #endif
  5381. #ifdef WOLFSSL_KEIL
  5382. "muls r6, r7, r6\n\t"
  5383. #elif defined(__clang__)
  5384. "muls r6, r7\n\t"
  5385. #else
  5386. "mul r6, r7\n\t"
  5387. #endif
  5388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5389. "lsrs r7, r6, #16\n\t"
  5390. #else
  5391. "lsr r7, r6, #16\n\t"
  5392. #endif
  5393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5394. "lsls r6, r6, #16\n\t"
  5395. #else
  5396. "lsl r6, r6, #16\n\t"
  5397. #endif
  5398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5399. "adds r4, r4, r6\n\t"
  5400. #else
  5401. "add r4, r4, r6\n\t"
  5402. #endif
  5403. #ifdef WOLFSSL_KEIL
  5404. "adcs r5, r5, r7\n\t"
  5405. #elif defined(__clang__)
  5406. "adcs r5, r7\n\t"
  5407. #else
  5408. "adc r5, r7\n\t"
  5409. #endif
  5410. #ifdef WOLFSSL_KEIL
  5411. "adcs r3, r3, %[r]\n\t"
  5412. #elif defined(__clang__)
  5413. "adcs r3, %[r]\n\t"
  5414. #else
  5415. "adc r3, %[r]\n\t"
  5416. #endif
  5417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5418. "lsrs r6, %[a], #16\n\t"
  5419. #else
  5420. "lsr r6, %[a], #16\n\t"
  5421. #endif
  5422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5423. "lsrs r7, %[b], #16\n\t"
  5424. #else
  5425. "lsr r7, %[b], #16\n\t"
  5426. #endif
  5427. #ifdef WOLFSSL_KEIL
  5428. "muls r7, r6, r7\n\t"
  5429. #elif defined(__clang__)
  5430. "muls r7, r6\n\t"
  5431. #else
  5432. "mul r7, r6\n\t"
  5433. #endif
  5434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5435. "adds r5, r5, r7\n\t"
  5436. #else
  5437. "add r5, r5, r7\n\t"
  5438. #endif
  5439. #ifdef WOLFSSL_KEIL
  5440. "adcs r3, r3, %[r]\n\t"
  5441. #elif defined(__clang__)
  5442. "adcs r3, %[r]\n\t"
  5443. #else
  5444. "adc r3, %[r]\n\t"
  5445. #endif
  5446. "uxth r7, %[b]\n\t"
  5447. #ifdef WOLFSSL_KEIL
  5448. "muls r6, r7, r6\n\t"
  5449. #elif defined(__clang__)
  5450. "muls r6, r7\n\t"
  5451. #else
  5452. "mul r6, r7\n\t"
  5453. #endif
  5454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5455. "lsrs r7, r6, #16\n\t"
  5456. #else
  5457. "lsr r7, r6, #16\n\t"
  5458. #endif
  5459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5460. "lsls r6, r6, #16\n\t"
  5461. #else
  5462. "lsl r6, r6, #16\n\t"
  5463. #endif
  5464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5465. "adds r4, r4, r6\n\t"
  5466. #else
  5467. "add r4, r4, r6\n\t"
  5468. #endif
  5469. #ifdef WOLFSSL_KEIL
  5470. "adcs r5, r5, r7\n\t"
  5471. #elif defined(__clang__)
  5472. "adcs r5, r7\n\t"
  5473. #else
  5474. "adc r5, r7\n\t"
  5475. #endif
  5476. #ifdef WOLFSSL_KEIL
  5477. "adcs r3, r3, %[r]\n\t"
  5478. #elif defined(__clang__)
  5479. "adcs r3, %[r]\n\t"
  5480. #else
  5481. "adc r3, %[r]\n\t"
  5482. #endif
  5483. "str r4, [sp, #28]\n\t"
  5484. "# A[7] * B[1]\n\t"
  5485. "movs r4, #0\n\t"
  5486. "mov %[a], r9\n\t"
  5487. "mov %[b], r10\n\t"
  5488. "ldr %[a], [%[a], #28]\n\t"
  5489. "ldr %[b], [%[b], #4]\n\t"
  5490. "uxth r6, %[a]\n\t"
  5491. "uxth r7, %[b]\n\t"
  5492. #ifdef WOLFSSL_KEIL
  5493. "muls r7, r6, r7\n\t"
  5494. #elif defined(__clang__)
  5495. "muls r7, r6\n\t"
  5496. #else
  5497. "mul r7, r6\n\t"
  5498. #endif
  5499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5500. "adds r5, r5, r7\n\t"
  5501. #else
  5502. "add r5, r5, r7\n\t"
  5503. #endif
  5504. #ifdef WOLFSSL_KEIL
  5505. "adcs r3, r3, %[r]\n\t"
  5506. #elif defined(__clang__)
  5507. "adcs r3, %[r]\n\t"
  5508. #else
  5509. "adc r3, %[r]\n\t"
  5510. #endif
  5511. #ifdef WOLFSSL_KEIL
  5512. "adcs r4, r4, %[r]\n\t"
  5513. #elif defined(__clang__)
  5514. "adcs r4, %[r]\n\t"
  5515. #else
  5516. "adc r4, %[r]\n\t"
  5517. #endif
  5518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5519. "lsrs r7, %[b], #16\n\t"
  5520. #else
  5521. "lsr r7, %[b], #16\n\t"
  5522. #endif
  5523. #ifdef WOLFSSL_KEIL
  5524. "muls r6, r7, r6\n\t"
  5525. #elif defined(__clang__)
  5526. "muls r6, r7\n\t"
  5527. #else
  5528. "mul r6, r7\n\t"
  5529. #endif
  5530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5531. "lsrs r7, r6, #16\n\t"
  5532. #else
  5533. "lsr r7, r6, #16\n\t"
  5534. #endif
  5535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5536. "lsls r6, r6, #16\n\t"
  5537. #else
  5538. "lsl r6, r6, #16\n\t"
  5539. #endif
  5540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5541. "adds r5, r5, r6\n\t"
  5542. #else
  5543. "add r5, r5, r6\n\t"
  5544. #endif
  5545. #ifdef WOLFSSL_KEIL
  5546. "adcs r3, r3, r7\n\t"
  5547. #elif defined(__clang__)
  5548. "adcs r3, r7\n\t"
  5549. #else
  5550. "adc r3, r7\n\t"
  5551. #endif
  5552. #ifdef WOLFSSL_KEIL
  5553. "adcs r4, r4, %[r]\n\t"
  5554. #elif defined(__clang__)
  5555. "adcs r4, %[r]\n\t"
  5556. #else
  5557. "adc r4, %[r]\n\t"
  5558. #endif
  5559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5560. "lsrs r6, %[a], #16\n\t"
  5561. #else
  5562. "lsr r6, %[a], #16\n\t"
  5563. #endif
  5564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5565. "lsrs r7, %[b], #16\n\t"
  5566. #else
  5567. "lsr r7, %[b], #16\n\t"
  5568. #endif
  5569. #ifdef WOLFSSL_KEIL
  5570. "muls r7, r6, r7\n\t"
  5571. #elif defined(__clang__)
  5572. "muls r7, r6\n\t"
  5573. #else
  5574. "mul r7, r6\n\t"
  5575. #endif
  5576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5577. "adds r3, r3, r7\n\t"
  5578. #else
  5579. "add r3, r3, r7\n\t"
  5580. #endif
  5581. #ifdef WOLFSSL_KEIL
  5582. "adcs r4, r4, %[r]\n\t"
  5583. #elif defined(__clang__)
  5584. "adcs r4, %[r]\n\t"
  5585. #else
  5586. "adc r4, %[r]\n\t"
  5587. #endif
  5588. "uxth r7, %[b]\n\t"
  5589. #ifdef WOLFSSL_KEIL
  5590. "muls r6, r7, r6\n\t"
  5591. #elif defined(__clang__)
  5592. "muls r6, r7\n\t"
  5593. #else
  5594. "mul r6, r7\n\t"
  5595. #endif
  5596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5597. "lsrs r7, r6, #16\n\t"
  5598. #else
  5599. "lsr r7, r6, #16\n\t"
  5600. #endif
  5601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5602. "lsls r6, r6, #16\n\t"
  5603. #else
  5604. "lsl r6, r6, #16\n\t"
  5605. #endif
  5606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5607. "adds r5, r5, r6\n\t"
  5608. #else
  5609. "add r5, r5, r6\n\t"
  5610. #endif
  5611. #ifdef WOLFSSL_KEIL
  5612. "adcs r3, r3, r7\n\t"
  5613. #elif defined(__clang__)
  5614. "adcs r3, r7\n\t"
  5615. #else
  5616. "adc r3, r7\n\t"
  5617. #endif
  5618. #ifdef WOLFSSL_KEIL
  5619. "adcs r4, r4, %[r]\n\t"
  5620. #elif defined(__clang__)
  5621. "adcs r4, %[r]\n\t"
  5622. #else
  5623. "adc r4, %[r]\n\t"
  5624. #endif
  5625. "# A[6] * B[2]\n\t"
  5626. "mov %[a], r9\n\t"
  5627. "mov %[b], r10\n\t"
  5628. "ldr %[a], [%[a], #24]\n\t"
  5629. "ldr %[b], [%[b], #8]\n\t"
  5630. "uxth r6, %[a]\n\t"
  5631. "uxth r7, %[b]\n\t"
  5632. #ifdef WOLFSSL_KEIL
  5633. "muls r7, r6, r7\n\t"
  5634. #elif defined(__clang__)
  5635. "muls r7, r6\n\t"
  5636. #else
  5637. "mul r7, r6\n\t"
  5638. #endif
  5639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5640. "adds r5, r5, r7\n\t"
  5641. #else
  5642. "add r5, r5, r7\n\t"
  5643. #endif
  5644. #ifdef WOLFSSL_KEIL
  5645. "adcs r3, r3, %[r]\n\t"
  5646. #elif defined(__clang__)
  5647. "adcs r3, %[r]\n\t"
  5648. #else
  5649. "adc r3, %[r]\n\t"
  5650. #endif
  5651. #ifdef WOLFSSL_KEIL
  5652. "adcs r4, r4, %[r]\n\t"
  5653. #elif defined(__clang__)
  5654. "adcs r4, %[r]\n\t"
  5655. #else
  5656. "adc r4, %[r]\n\t"
  5657. #endif
  5658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5659. "lsrs r7, %[b], #16\n\t"
  5660. #else
  5661. "lsr r7, %[b], #16\n\t"
  5662. #endif
  5663. #ifdef WOLFSSL_KEIL
  5664. "muls r6, r7, r6\n\t"
  5665. #elif defined(__clang__)
  5666. "muls r6, r7\n\t"
  5667. #else
  5668. "mul r6, r7\n\t"
  5669. #endif
  5670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5671. "lsrs r7, r6, #16\n\t"
  5672. #else
  5673. "lsr r7, r6, #16\n\t"
  5674. #endif
  5675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5676. "lsls r6, r6, #16\n\t"
  5677. #else
  5678. "lsl r6, r6, #16\n\t"
  5679. #endif
  5680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5681. "adds r5, r5, r6\n\t"
  5682. #else
  5683. "add r5, r5, r6\n\t"
  5684. #endif
  5685. #ifdef WOLFSSL_KEIL
  5686. "adcs r3, r3, r7\n\t"
  5687. #elif defined(__clang__)
  5688. "adcs r3, r7\n\t"
  5689. #else
  5690. "adc r3, r7\n\t"
  5691. #endif
  5692. #ifdef WOLFSSL_KEIL
  5693. "adcs r4, r4, %[r]\n\t"
  5694. #elif defined(__clang__)
  5695. "adcs r4, %[r]\n\t"
  5696. #else
  5697. "adc r4, %[r]\n\t"
  5698. #endif
  5699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5700. "lsrs r6, %[a], #16\n\t"
  5701. #else
  5702. "lsr r6, %[a], #16\n\t"
  5703. #endif
  5704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5705. "lsrs r7, %[b], #16\n\t"
  5706. #else
  5707. "lsr r7, %[b], #16\n\t"
  5708. #endif
  5709. #ifdef WOLFSSL_KEIL
  5710. "muls r7, r6, r7\n\t"
  5711. #elif defined(__clang__)
  5712. "muls r7, r6\n\t"
  5713. #else
  5714. "mul r7, r6\n\t"
  5715. #endif
  5716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5717. "adds r3, r3, r7\n\t"
  5718. #else
  5719. "add r3, r3, r7\n\t"
  5720. #endif
  5721. #ifdef WOLFSSL_KEIL
  5722. "adcs r4, r4, %[r]\n\t"
  5723. #elif defined(__clang__)
  5724. "adcs r4, %[r]\n\t"
  5725. #else
  5726. "adc r4, %[r]\n\t"
  5727. #endif
  5728. "uxth r7, %[b]\n\t"
  5729. #ifdef WOLFSSL_KEIL
  5730. "muls r6, r7, r6\n\t"
  5731. #elif defined(__clang__)
  5732. "muls r6, r7\n\t"
  5733. #else
  5734. "mul r6, r7\n\t"
  5735. #endif
  5736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5737. "lsrs r7, r6, #16\n\t"
  5738. #else
  5739. "lsr r7, r6, #16\n\t"
  5740. #endif
  5741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5742. "lsls r6, r6, #16\n\t"
  5743. #else
  5744. "lsl r6, r6, #16\n\t"
  5745. #endif
  5746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5747. "adds r5, r5, r6\n\t"
  5748. #else
  5749. "add r5, r5, r6\n\t"
  5750. #endif
  5751. #ifdef WOLFSSL_KEIL
  5752. "adcs r3, r3, r7\n\t"
  5753. #elif defined(__clang__)
  5754. "adcs r3, r7\n\t"
  5755. #else
  5756. "adc r3, r7\n\t"
  5757. #endif
  5758. #ifdef WOLFSSL_KEIL
  5759. "adcs r4, r4, %[r]\n\t"
  5760. #elif defined(__clang__)
  5761. "adcs r4, %[r]\n\t"
  5762. #else
  5763. "adc r4, %[r]\n\t"
  5764. #endif
  5765. "# A[5] * B[3]\n\t"
  5766. "mov %[a], r9\n\t"
  5767. "mov %[b], r10\n\t"
  5768. "ldr %[a], [%[a], #20]\n\t"
  5769. "ldr %[b], [%[b], #12]\n\t"
  5770. "uxth r6, %[a]\n\t"
  5771. "uxth r7, %[b]\n\t"
  5772. #ifdef WOLFSSL_KEIL
  5773. "muls r7, r6, r7\n\t"
  5774. #elif defined(__clang__)
  5775. "muls r7, r6\n\t"
  5776. #else
  5777. "mul r7, r6\n\t"
  5778. #endif
  5779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5780. "adds r5, r5, r7\n\t"
  5781. #else
  5782. "add r5, r5, r7\n\t"
  5783. #endif
  5784. #ifdef WOLFSSL_KEIL
  5785. "adcs r3, r3, %[r]\n\t"
  5786. #elif defined(__clang__)
  5787. "adcs r3, %[r]\n\t"
  5788. #else
  5789. "adc r3, %[r]\n\t"
  5790. #endif
  5791. #ifdef WOLFSSL_KEIL
  5792. "adcs r4, r4, %[r]\n\t"
  5793. #elif defined(__clang__)
  5794. "adcs r4, %[r]\n\t"
  5795. #else
  5796. "adc r4, %[r]\n\t"
  5797. #endif
  5798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5799. "lsrs r7, %[b], #16\n\t"
  5800. #else
  5801. "lsr r7, %[b], #16\n\t"
  5802. #endif
  5803. #ifdef WOLFSSL_KEIL
  5804. "muls r6, r7, r6\n\t"
  5805. #elif defined(__clang__)
  5806. "muls r6, r7\n\t"
  5807. #else
  5808. "mul r6, r7\n\t"
  5809. #endif
  5810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5811. "lsrs r7, r6, #16\n\t"
  5812. #else
  5813. "lsr r7, r6, #16\n\t"
  5814. #endif
  5815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5816. "lsls r6, r6, #16\n\t"
  5817. #else
  5818. "lsl r6, r6, #16\n\t"
  5819. #endif
  5820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5821. "adds r5, r5, r6\n\t"
  5822. #else
  5823. "add r5, r5, r6\n\t"
  5824. #endif
  5825. #ifdef WOLFSSL_KEIL
  5826. "adcs r3, r3, r7\n\t"
  5827. #elif defined(__clang__)
  5828. "adcs r3, r7\n\t"
  5829. #else
  5830. "adc r3, r7\n\t"
  5831. #endif
  5832. #ifdef WOLFSSL_KEIL
  5833. "adcs r4, r4, %[r]\n\t"
  5834. #elif defined(__clang__)
  5835. "adcs r4, %[r]\n\t"
  5836. #else
  5837. "adc r4, %[r]\n\t"
  5838. #endif
  5839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5840. "lsrs r6, %[a], #16\n\t"
  5841. #else
  5842. "lsr r6, %[a], #16\n\t"
  5843. #endif
  5844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5845. "lsrs r7, %[b], #16\n\t"
  5846. #else
  5847. "lsr r7, %[b], #16\n\t"
  5848. #endif
  5849. #ifdef WOLFSSL_KEIL
  5850. "muls r7, r6, r7\n\t"
  5851. #elif defined(__clang__)
  5852. "muls r7, r6\n\t"
  5853. #else
  5854. "mul r7, r6\n\t"
  5855. #endif
  5856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5857. "adds r3, r3, r7\n\t"
  5858. #else
  5859. "add r3, r3, r7\n\t"
  5860. #endif
  5861. #ifdef WOLFSSL_KEIL
  5862. "adcs r4, r4, %[r]\n\t"
  5863. #elif defined(__clang__)
  5864. "adcs r4, %[r]\n\t"
  5865. #else
  5866. "adc r4, %[r]\n\t"
  5867. #endif
  5868. "uxth r7, %[b]\n\t"
  5869. #ifdef WOLFSSL_KEIL
  5870. "muls r6, r7, r6\n\t"
  5871. #elif defined(__clang__)
  5872. "muls r6, r7\n\t"
  5873. #else
  5874. "mul r6, r7\n\t"
  5875. #endif
  5876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5877. "lsrs r7, r6, #16\n\t"
  5878. #else
  5879. "lsr r7, r6, #16\n\t"
  5880. #endif
  5881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5882. "lsls r6, r6, #16\n\t"
  5883. #else
  5884. "lsl r6, r6, #16\n\t"
  5885. #endif
  5886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5887. "adds r5, r5, r6\n\t"
  5888. #else
  5889. "add r5, r5, r6\n\t"
  5890. #endif
  5891. #ifdef WOLFSSL_KEIL
  5892. "adcs r3, r3, r7\n\t"
  5893. #elif defined(__clang__)
  5894. "adcs r3, r7\n\t"
  5895. #else
  5896. "adc r3, r7\n\t"
  5897. #endif
  5898. #ifdef WOLFSSL_KEIL
  5899. "adcs r4, r4, %[r]\n\t"
  5900. #elif defined(__clang__)
  5901. "adcs r4, %[r]\n\t"
  5902. #else
  5903. "adc r4, %[r]\n\t"
  5904. #endif
  5905. "# A[4] * B[4]\n\t"
  5906. "mov %[a], r9\n\t"
  5907. "mov %[b], r10\n\t"
  5908. "ldr %[a], [%[a], #16]\n\t"
  5909. "ldr %[b], [%[b], #16]\n\t"
  5910. "uxth r6, %[a]\n\t"
  5911. "uxth r7, %[b]\n\t"
  5912. #ifdef WOLFSSL_KEIL
  5913. "muls r7, r6, r7\n\t"
  5914. #elif defined(__clang__)
  5915. "muls r7, r6\n\t"
  5916. #else
  5917. "mul r7, r6\n\t"
  5918. #endif
  5919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5920. "adds r5, r5, r7\n\t"
  5921. #else
  5922. "add r5, r5, r7\n\t"
  5923. #endif
  5924. #ifdef WOLFSSL_KEIL
  5925. "adcs r3, r3, %[r]\n\t"
  5926. #elif defined(__clang__)
  5927. "adcs r3, %[r]\n\t"
  5928. #else
  5929. "adc r3, %[r]\n\t"
  5930. #endif
  5931. #ifdef WOLFSSL_KEIL
  5932. "adcs r4, r4, %[r]\n\t"
  5933. #elif defined(__clang__)
  5934. "adcs r4, %[r]\n\t"
  5935. #else
  5936. "adc r4, %[r]\n\t"
  5937. #endif
  5938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5939. "lsrs r7, %[b], #16\n\t"
  5940. #else
  5941. "lsr r7, %[b], #16\n\t"
  5942. #endif
  5943. #ifdef WOLFSSL_KEIL
  5944. "muls r6, r7, r6\n\t"
  5945. #elif defined(__clang__)
  5946. "muls r6, r7\n\t"
  5947. #else
  5948. "mul r6, r7\n\t"
  5949. #endif
  5950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5951. "lsrs r7, r6, #16\n\t"
  5952. #else
  5953. "lsr r7, r6, #16\n\t"
  5954. #endif
  5955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5956. "lsls r6, r6, #16\n\t"
  5957. #else
  5958. "lsl r6, r6, #16\n\t"
  5959. #endif
  5960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5961. "adds r5, r5, r6\n\t"
  5962. #else
  5963. "add r5, r5, r6\n\t"
  5964. #endif
  5965. #ifdef WOLFSSL_KEIL
  5966. "adcs r3, r3, r7\n\t"
  5967. #elif defined(__clang__)
  5968. "adcs r3, r7\n\t"
  5969. #else
  5970. "adc r3, r7\n\t"
  5971. #endif
  5972. #ifdef WOLFSSL_KEIL
  5973. "adcs r4, r4, %[r]\n\t"
  5974. #elif defined(__clang__)
  5975. "adcs r4, %[r]\n\t"
  5976. #else
  5977. "adc r4, %[r]\n\t"
  5978. #endif
  5979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5980. "lsrs r6, %[a], #16\n\t"
  5981. #else
  5982. "lsr r6, %[a], #16\n\t"
  5983. #endif
  5984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5985. "lsrs r7, %[b], #16\n\t"
  5986. #else
  5987. "lsr r7, %[b], #16\n\t"
  5988. #endif
  5989. #ifdef WOLFSSL_KEIL
  5990. "muls r7, r6, r7\n\t"
  5991. #elif defined(__clang__)
  5992. "muls r7, r6\n\t"
  5993. #else
  5994. "mul r7, r6\n\t"
  5995. #endif
  5996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5997. "adds r3, r3, r7\n\t"
  5998. #else
  5999. "add r3, r3, r7\n\t"
  6000. #endif
  6001. #ifdef WOLFSSL_KEIL
  6002. "adcs r4, r4, %[r]\n\t"
  6003. #elif defined(__clang__)
  6004. "adcs r4, %[r]\n\t"
  6005. #else
  6006. "adc r4, %[r]\n\t"
  6007. #endif
  6008. "uxth r7, %[b]\n\t"
  6009. #ifdef WOLFSSL_KEIL
  6010. "muls r6, r7, r6\n\t"
  6011. #elif defined(__clang__)
  6012. "muls r6, r7\n\t"
  6013. #else
  6014. "mul r6, r7\n\t"
  6015. #endif
  6016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6017. "lsrs r7, r6, #16\n\t"
  6018. #else
  6019. "lsr r7, r6, #16\n\t"
  6020. #endif
  6021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6022. "lsls r6, r6, #16\n\t"
  6023. #else
  6024. "lsl r6, r6, #16\n\t"
  6025. #endif
  6026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6027. "adds r5, r5, r6\n\t"
  6028. #else
  6029. "add r5, r5, r6\n\t"
  6030. #endif
  6031. #ifdef WOLFSSL_KEIL
  6032. "adcs r3, r3, r7\n\t"
  6033. #elif defined(__clang__)
  6034. "adcs r3, r7\n\t"
  6035. #else
  6036. "adc r3, r7\n\t"
  6037. #endif
  6038. #ifdef WOLFSSL_KEIL
  6039. "adcs r4, r4, %[r]\n\t"
  6040. #elif defined(__clang__)
  6041. "adcs r4, %[r]\n\t"
  6042. #else
  6043. "adc r4, %[r]\n\t"
  6044. #endif
  6045. "# A[3] * B[5]\n\t"
  6046. "mov %[a], r9\n\t"
  6047. "mov %[b], r10\n\t"
  6048. "ldr %[a], [%[a], #12]\n\t"
  6049. "ldr %[b], [%[b], #20]\n\t"
  6050. "uxth r6, %[a]\n\t"
  6051. "uxth r7, %[b]\n\t"
  6052. #ifdef WOLFSSL_KEIL
  6053. "muls r7, r6, r7\n\t"
  6054. #elif defined(__clang__)
  6055. "muls r7, r6\n\t"
  6056. #else
  6057. "mul r7, r6\n\t"
  6058. #endif
  6059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6060. "adds r5, r5, r7\n\t"
  6061. #else
  6062. "add r5, r5, r7\n\t"
  6063. #endif
  6064. #ifdef WOLFSSL_KEIL
  6065. "adcs r3, r3, %[r]\n\t"
  6066. #elif defined(__clang__)
  6067. "adcs r3, %[r]\n\t"
  6068. #else
  6069. "adc r3, %[r]\n\t"
  6070. #endif
  6071. #ifdef WOLFSSL_KEIL
  6072. "adcs r4, r4, %[r]\n\t"
  6073. #elif defined(__clang__)
  6074. "adcs r4, %[r]\n\t"
  6075. #else
  6076. "adc r4, %[r]\n\t"
  6077. #endif
  6078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6079. "lsrs r7, %[b], #16\n\t"
  6080. #else
  6081. "lsr r7, %[b], #16\n\t"
  6082. #endif
  6083. #ifdef WOLFSSL_KEIL
  6084. "muls r6, r7, r6\n\t"
  6085. #elif defined(__clang__)
  6086. "muls r6, r7\n\t"
  6087. #else
  6088. "mul r6, r7\n\t"
  6089. #endif
  6090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6091. "lsrs r7, r6, #16\n\t"
  6092. #else
  6093. "lsr r7, r6, #16\n\t"
  6094. #endif
  6095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6096. "lsls r6, r6, #16\n\t"
  6097. #else
  6098. "lsl r6, r6, #16\n\t"
  6099. #endif
  6100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6101. "adds r5, r5, r6\n\t"
  6102. #else
  6103. "add r5, r5, r6\n\t"
  6104. #endif
  6105. #ifdef WOLFSSL_KEIL
  6106. "adcs r3, r3, r7\n\t"
  6107. #elif defined(__clang__)
  6108. "adcs r3, r7\n\t"
  6109. #else
  6110. "adc r3, r7\n\t"
  6111. #endif
  6112. #ifdef WOLFSSL_KEIL
  6113. "adcs r4, r4, %[r]\n\t"
  6114. #elif defined(__clang__)
  6115. "adcs r4, %[r]\n\t"
  6116. #else
  6117. "adc r4, %[r]\n\t"
  6118. #endif
  6119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6120. "lsrs r6, %[a], #16\n\t"
  6121. #else
  6122. "lsr r6, %[a], #16\n\t"
  6123. #endif
  6124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6125. "lsrs r7, %[b], #16\n\t"
  6126. #else
  6127. "lsr r7, %[b], #16\n\t"
  6128. #endif
  6129. #ifdef WOLFSSL_KEIL
  6130. "muls r7, r6, r7\n\t"
  6131. #elif defined(__clang__)
  6132. "muls r7, r6\n\t"
  6133. #else
  6134. "mul r7, r6\n\t"
  6135. #endif
  6136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6137. "adds r3, r3, r7\n\t"
  6138. #else
  6139. "add r3, r3, r7\n\t"
  6140. #endif
  6141. #ifdef WOLFSSL_KEIL
  6142. "adcs r4, r4, %[r]\n\t"
  6143. #elif defined(__clang__)
  6144. "adcs r4, %[r]\n\t"
  6145. #else
  6146. "adc r4, %[r]\n\t"
  6147. #endif
  6148. "uxth r7, %[b]\n\t"
  6149. #ifdef WOLFSSL_KEIL
  6150. "muls r6, r7, r6\n\t"
  6151. #elif defined(__clang__)
  6152. "muls r6, r7\n\t"
  6153. #else
  6154. "mul r6, r7\n\t"
  6155. #endif
  6156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6157. "lsrs r7, r6, #16\n\t"
  6158. #else
  6159. "lsr r7, r6, #16\n\t"
  6160. #endif
  6161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6162. "lsls r6, r6, #16\n\t"
  6163. #else
  6164. "lsl r6, r6, #16\n\t"
  6165. #endif
  6166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6167. "adds r5, r5, r6\n\t"
  6168. #else
  6169. "add r5, r5, r6\n\t"
  6170. #endif
  6171. #ifdef WOLFSSL_KEIL
  6172. "adcs r3, r3, r7\n\t"
  6173. #elif defined(__clang__)
  6174. "adcs r3, r7\n\t"
  6175. #else
  6176. "adc r3, r7\n\t"
  6177. #endif
  6178. #ifdef WOLFSSL_KEIL
  6179. "adcs r4, r4, %[r]\n\t"
  6180. #elif defined(__clang__)
  6181. "adcs r4, %[r]\n\t"
  6182. #else
  6183. "adc r4, %[r]\n\t"
  6184. #endif
  6185. "# A[2] * B[6]\n\t"
  6186. "mov %[a], r9\n\t"
  6187. "mov %[b], r10\n\t"
  6188. "ldr %[a], [%[a], #8]\n\t"
  6189. "ldr %[b], [%[b], #24]\n\t"
  6190. "uxth r6, %[a]\n\t"
  6191. "uxth r7, %[b]\n\t"
  6192. #ifdef WOLFSSL_KEIL
  6193. "muls r7, r6, r7\n\t"
  6194. #elif defined(__clang__)
  6195. "muls r7, r6\n\t"
  6196. #else
  6197. "mul r7, r6\n\t"
  6198. #endif
  6199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6200. "adds r5, r5, r7\n\t"
  6201. #else
  6202. "add r5, r5, r7\n\t"
  6203. #endif
  6204. #ifdef WOLFSSL_KEIL
  6205. "adcs r3, r3, %[r]\n\t"
  6206. #elif defined(__clang__)
  6207. "adcs r3, %[r]\n\t"
  6208. #else
  6209. "adc r3, %[r]\n\t"
  6210. #endif
  6211. #ifdef WOLFSSL_KEIL
  6212. "adcs r4, r4, %[r]\n\t"
  6213. #elif defined(__clang__)
  6214. "adcs r4, %[r]\n\t"
  6215. #else
  6216. "adc r4, %[r]\n\t"
  6217. #endif
  6218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6219. "lsrs r7, %[b], #16\n\t"
  6220. #else
  6221. "lsr r7, %[b], #16\n\t"
  6222. #endif
  6223. #ifdef WOLFSSL_KEIL
  6224. "muls r6, r7, r6\n\t"
  6225. #elif defined(__clang__)
  6226. "muls r6, r7\n\t"
  6227. #else
  6228. "mul r6, r7\n\t"
  6229. #endif
  6230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6231. "lsrs r7, r6, #16\n\t"
  6232. #else
  6233. "lsr r7, r6, #16\n\t"
  6234. #endif
  6235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6236. "lsls r6, r6, #16\n\t"
  6237. #else
  6238. "lsl r6, r6, #16\n\t"
  6239. #endif
  6240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6241. "adds r5, r5, r6\n\t"
  6242. #else
  6243. "add r5, r5, r6\n\t"
  6244. #endif
  6245. #ifdef WOLFSSL_KEIL
  6246. "adcs r3, r3, r7\n\t"
  6247. #elif defined(__clang__)
  6248. "adcs r3, r7\n\t"
  6249. #else
  6250. "adc r3, r7\n\t"
  6251. #endif
  6252. #ifdef WOLFSSL_KEIL
  6253. "adcs r4, r4, %[r]\n\t"
  6254. #elif defined(__clang__)
  6255. "adcs r4, %[r]\n\t"
  6256. #else
  6257. "adc r4, %[r]\n\t"
  6258. #endif
  6259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6260. "lsrs r6, %[a], #16\n\t"
  6261. #else
  6262. "lsr r6, %[a], #16\n\t"
  6263. #endif
  6264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6265. "lsrs r7, %[b], #16\n\t"
  6266. #else
  6267. "lsr r7, %[b], #16\n\t"
  6268. #endif
  6269. #ifdef WOLFSSL_KEIL
  6270. "muls r7, r6, r7\n\t"
  6271. #elif defined(__clang__)
  6272. "muls r7, r6\n\t"
  6273. #else
  6274. "mul r7, r6\n\t"
  6275. #endif
  6276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6277. "adds r3, r3, r7\n\t"
  6278. #else
  6279. "add r3, r3, r7\n\t"
  6280. #endif
  6281. #ifdef WOLFSSL_KEIL
  6282. "adcs r4, r4, %[r]\n\t"
  6283. #elif defined(__clang__)
  6284. "adcs r4, %[r]\n\t"
  6285. #else
  6286. "adc r4, %[r]\n\t"
  6287. #endif
  6288. "uxth r7, %[b]\n\t"
  6289. #ifdef WOLFSSL_KEIL
  6290. "muls r6, r7, r6\n\t"
  6291. #elif defined(__clang__)
  6292. "muls r6, r7\n\t"
  6293. #else
  6294. "mul r6, r7\n\t"
  6295. #endif
  6296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6297. "lsrs r7, r6, #16\n\t"
  6298. #else
  6299. "lsr r7, r6, #16\n\t"
  6300. #endif
  6301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6302. "lsls r6, r6, #16\n\t"
  6303. #else
  6304. "lsl r6, r6, #16\n\t"
  6305. #endif
  6306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6307. "adds r5, r5, r6\n\t"
  6308. #else
  6309. "add r5, r5, r6\n\t"
  6310. #endif
  6311. #ifdef WOLFSSL_KEIL
  6312. "adcs r3, r3, r7\n\t"
  6313. #elif defined(__clang__)
  6314. "adcs r3, r7\n\t"
  6315. #else
  6316. "adc r3, r7\n\t"
  6317. #endif
  6318. #ifdef WOLFSSL_KEIL
  6319. "adcs r4, r4, %[r]\n\t"
  6320. #elif defined(__clang__)
  6321. "adcs r4, %[r]\n\t"
  6322. #else
  6323. "adc r4, %[r]\n\t"
  6324. #endif
  6325. "# A[1] * B[7]\n\t"
  6326. "mov %[a], r9\n\t"
  6327. "mov %[b], r10\n\t"
  6328. "ldr %[a], [%[a], #4]\n\t"
  6329. "ldr %[b], [%[b], #28]\n\t"
  6330. "uxth r6, %[a]\n\t"
  6331. "uxth r7, %[b]\n\t"
  6332. #ifdef WOLFSSL_KEIL
  6333. "muls r7, r6, r7\n\t"
  6334. #elif defined(__clang__)
  6335. "muls r7, r6\n\t"
  6336. #else
  6337. "mul r7, r6\n\t"
  6338. #endif
  6339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6340. "adds r5, r5, r7\n\t"
  6341. #else
  6342. "add r5, r5, r7\n\t"
  6343. #endif
  6344. #ifdef WOLFSSL_KEIL
  6345. "adcs r3, r3, %[r]\n\t"
  6346. #elif defined(__clang__)
  6347. "adcs r3, %[r]\n\t"
  6348. #else
  6349. "adc r3, %[r]\n\t"
  6350. #endif
  6351. #ifdef WOLFSSL_KEIL
  6352. "adcs r4, r4, %[r]\n\t"
  6353. #elif defined(__clang__)
  6354. "adcs r4, %[r]\n\t"
  6355. #else
  6356. "adc r4, %[r]\n\t"
  6357. #endif
  6358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6359. "lsrs r7, %[b], #16\n\t"
  6360. #else
  6361. "lsr r7, %[b], #16\n\t"
  6362. #endif
  6363. #ifdef WOLFSSL_KEIL
  6364. "muls r6, r7, r6\n\t"
  6365. #elif defined(__clang__)
  6366. "muls r6, r7\n\t"
  6367. #else
  6368. "mul r6, r7\n\t"
  6369. #endif
  6370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6371. "lsrs r7, r6, #16\n\t"
  6372. #else
  6373. "lsr r7, r6, #16\n\t"
  6374. #endif
  6375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6376. "lsls r6, r6, #16\n\t"
  6377. #else
  6378. "lsl r6, r6, #16\n\t"
  6379. #endif
  6380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6381. "adds r5, r5, r6\n\t"
  6382. #else
  6383. "add r5, r5, r6\n\t"
  6384. #endif
  6385. #ifdef WOLFSSL_KEIL
  6386. "adcs r3, r3, r7\n\t"
  6387. #elif defined(__clang__)
  6388. "adcs r3, r7\n\t"
  6389. #else
  6390. "adc r3, r7\n\t"
  6391. #endif
  6392. #ifdef WOLFSSL_KEIL
  6393. "adcs r4, r4, %[r]\n\t"
  6394. #elif defined(__clang__)
  6395. "adcs r4, %[r]\n\t"
  6396. #else
  6397. "adc r4, %[r]\n\t"
  6398. #endif
  6399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6400. "lsrs r6, %[a], #16\n\t"
  6401. #else
  6402. "lsr r6, %[a], #16\n\t"
  6403. #endif
  6404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6405. "lsrs r7, %[b], #16\n\t"
  6406. #else
  6407. "lsr r7, %[b], #16\n\t"
  6408. #endif
  6409. #ifdef WOLFSSL_KEIL
  6410. "muls r7, r6, r7\n\t"
  6411. #elif defined(__clang__)
  6412. "muls r7, r6\n\t"
  6413. #else
  6414. "mul r7, r6\n\t"
  6415. #endif
  6416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6417. "adds r3, r3, r7\n\t"
  6418. #else
  6419. "add r3, r3, r7\n\t"
  6420. #endif
  6421. #ifdef WOLFSSL_KEIL
  6422. "adcs r4, r4, %[r]\n\t"
  6423. #elif defined(__clang__)
  6424. "adcs r4, %[r]\n\t"
  6425. #else
  6426. "adc r4, %[r]\n\t"
  6427. #endif
  6428. "uxth r7, %[b]\n\t"
  6429. #ifdef WOLFSSL_KEIL
  6430. "muls r6, r7, r6\n\t"
  6431. #elif defined(__clang__)
  6432. "muls r6, r7\n\t"
  6433. #else
  6434. "mul r6, r7\n\t"
  6435. #endif
  6436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6437. "lsrs r7, r6, #16\n\t"
  6438. #else
  6439. "lsr r7, r6, #16\n\t"
  6440. #endif
  6441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6442. "lsls r6, r6, #16\n\t"
  6443. #else
  6444. "lsl r6, r6, #16\n\t"
  6445. #endif
  6446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6447. "adds r5, r5, r6\n\t"
  6448. #else
  6449. "add r5, r5, r6\n\t"
  6450. #endif
  6451. #ifdef WOLFSSL_KEIL
  6452. "adcs r3, r3, r7\n\t"
  6453. #elif defined(__clang__)
  6454. "adcs r3, r7\n\t"
  6455. #else
  6456. "adc r3, r7\n\t"
  6457. #endif
  6458. #ifdef WOLFSSL_KEIL
  6459. "adcs r4, r4, %[r]\n\t"
  6460. #elif defined(__clang__)
  6461. "adcs r4, %[r]\n\t"
  6462. #else
  6463. "adc r4, %[r]\n\t"
  6464. #endif
  6465. "mov %[r], r8\n\t"
  6466. "str r5, [%[r], #32]\n\t"
  6467. "movs %[r], #0\n\t"
  6468. "# A[2] * B[7]\n\t"
  6469. "movs r5, #0\n\t"
  6470. "mov %[a], r9\n\t"
  6471. "mov %[b], r10\n\t"
  6472. "ldr %[a], [%[a], #8]\n\t"
  6473. "ldr %[b], [%[b], #28]\n\t"
  6474. "uxth r6, %[a]\n\t"
  6475. "uxth r7, %[b]\n\t"
  6476. #ifdef WOLFSSL_KEIL
  6477. "muls r7, r6, r7\n\t"
  6478. #elif defined(__clang__)
  6479. "muls r7, r6\n\t"
  6480. #else
  6481. "mul r7, r6\n\t"
  6482. #endif
  6483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6484. "adds r3, r3, r7\n\t"
  6485. #else
  6486. "add r3, r3, r7\n\t"
  6487. #endif
  6488. #ifdef WOLFSSL_KEIL
  6489. "adcs r4, r4, %[r]\n\t"
  6490. #elif defined(__clang__)
  6491. "adcs r4, %[r]\n\t"
  6492. #else
  6493. "adc r4, %[r]\n\t"
  6494. #endif
  6495. #ifdef WOLFSSL_KEIL
  6496. "adcs r5, r5, %[r]\n\t"
  6497. #elif defined(__clang__)
  6498. "adcs r5, %[r]\n\t"
  6499. #else
  6500. "adc r5, %[r]\n\t"
  6501. #endif
  6502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6503. "lsrs r7, %[b], #16\n\t"
  6504. #else
  6505. "lsr r7, %[b], #16\n\t"
  6506. #endif
  6507. #ifdef WOLFSSL_KEIL
  6508. "muls r6, r7, r6\n\t"
  6509. #elif defined(__clang__)
  6510. "muls r6, r7\n\t"
  6511. #else
  6512. "mul r6, r7\n\t"
  6513. #endif
  6514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6515. "lsrs r7, r6, #16\n\t"
  6516. #else
  6517. "lsr r7, r6, #16\n\t"
  6518. #endif
  6519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6520. "lsls r6, r6, #16\n\t"
  6521. #else
  6522. "lsl r6, r6, #16\n\t"
  6523. #endif
  6524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6525. "adds r3, r3, r6\n\t"
  6526. #else
  6527. "add r3, r3, r6\n\t"
  6528. #endif
  6529. #ifdef WOLFSSL_KEIL
  6530. "adcs r4, r4, r7\n\t"
  6531. #elif defined(__clang__)
  6532. "adcs r4, r7\n\t"
  6533. #else
  6534. "adc r4, r7\n\t"
  6535. #endif
  6536. #ifdef WOLFSSL_KEIL
  6537. "adcs r5, r5, %[r]\n\t"
  6538. #elif defined(__clang__)
  6539. "adcs r5, %[r]\n\t"
  6540. #else
  6541. "adc r5, %[r]\n\t"
  6542. #endif
  6543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6544. "lsrs r6, %[a], #16\n\t"
  6545. #else
  6546. "lsr r6, %[a], #16\n\t"
  6547. #endif
  6548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6549. "lsrs r7, %[b], #16\n\t"
  6550. #else
  6551. "lsr r7, %[b], #16\n\t"
  6552. #endif
  6553. #ifdef WOLFSSL_KEIL
  6554. "muls r7, r6, r7\n\t"
  6555. #elif defined(__clang__)
  6556. "muls r7, r6\n\t"
  6557. #else
  6558. "mul r7, r6\n\t"
  6559. #endif
  6560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6561. "adds r4, r4, r7\n\t"
  6562. #else
  6563. "add r4, r4, r7\n\t"
  6564. #endif
  6565. #ifdef WOLFSSL_KEIL
  6566. "adcs r5, r5, %[r]\n\t"
  6567. #elif defined(__clang__)
  6568. "adcs r5, %[r]\n\t"
  6569. #else
  6570. "adc r5, %[r]\n\t"
  6571. #endif
  6572. "uxth r7, %[b]\n\t"
  6573. #ifdef WOLFSSL_KEIL
  6574. "muls r6, r7, r6\n\t"
  6575. #elif defined(__clang__)
  6576. "muls r6, r7\n\t"
  6577. #else
  6578. "mul r6, r7\n\t"
  6579. #endif
  6580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6581. "lsrs r7, r6, #16\n\t"
  6582. #else
  6583. "lsr r7, r6, #16\n\t"
  6584. #endif
  6585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6586. "lsls r6, r6, #16\n\t"
  6587. #else
  6588. "lsl r6, r6, #16\n\t"
  6589. #endif
  6590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6591. "adds r3, r3, r6\n\t"
  6592. #else
  6593. "add r3, r3, r6\n\t"
  6594. #endif
  6595. #ifdef WOLFSSL_KEIL
  6596. "adcs r4, r4, r7\n\t"
  6597. #elif defined(__clang__)
  6598. "adcs r4, r7\n\t"
  6599. #else
  6600. "adc r4, r7\n\t"
  6601. #endif
  6602. #ifdef WOLFSSL_KEIL
  6603. "adcs r5, r5, %[r]\n\t"
  6604. #elif defined(__clang__)
  6605. "adcs r5, %[r]\n\t"
  6606. #else
  6607. "adc r5, %[r]\n\t"
  6608. #endif
  6609. "# A[3] * B[6]\n\t"
  6610. "mov %[a], r9\n\t"
  6611. "mov %[b], r10\n\t"
  6612. "ldr %[a], [%[a], #12]\n\t"
  6613. "ldr %[b], [%[b], #24]\n\t"
  6614. "uxth r6, %[a]\n\t"
  6615. "uxth r7, %[b]\n\t"
  6616. #ifdef WOLFSSL_KEIL
  6617. "muls r7, r6, r7\n\t"
  6618. #elif defined(__clang__)
  6619. "muls r7, r6\n\t"
  6620. #else
  6621. "mul r7, r6\n\t"
  6622. #endif
  6623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6624. "adds r3, r3, r7\n\t"
  6625. #else
  6626. "add r3, r3, r7\n\t"
  6627. #endif
  6628. #ifdef WOLFSSL_KEIL
  6629. "adcs r4, r4, %[r]\n\t"
  6630. #elif defined(__clang__)
  6631. "adcs r4, %[r]\n\t"
  6632. #else
  6633. "adc r4, %[r]\n\t"
  6634. #endif
  6635. #ifdef WOLFSSL_KEIL
  6636. "adcs r5, r5, %[r]\n\t"
  6637. #elif defined(__clang__)
  6638. "adcs r5, %[r]\n\t"
  6639. #else
  6640. "adc r5, %[r]\n\t"
  6641. #endif
  6642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6643. "lsrs r7, %[b], #16\n\t"
  6644. #else
  6645. "lsr r7, %[b], #16\n\t"
  6646. #endif
  6647. #ifdef WOLFSSL_KEIL
  6648. "muls r6, r7, r6\n\t"
  6649. #elif defined(__clang__)
  6650. "muls r6, r7\n\t"
  6651. #else
  6652. "mul r6, r7\n\t"
  6653. #endif
  6654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6655. "lsrs r7, r6, #16\n\t"
  6656. #else
  6657. "lsr r7, r6, #16\n\t"
  6658. #endif
  6659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6660. "lsls r6, r6, #16\n\t"
  6661. #else
  6662. "lsl r6, r6, #16\n\t"
  6663. #endif
  6664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6665. "adds r3, r3, r6\n\t"
  6666. #else
  6667. "add r3, r3, r6\n\t"
  6668. #endif
  6669. #ifdef WOLFSSL_KEIL
  6670. "adcs r4, r4, r7\n\t"
  6671. #elif defined(__clang__)
  6672. "adcs r4, r7\n\t"
  6673. #else
  6674. "adc r4, r7\n\t"
  6675. #endif
  6676. #ifdef WOLFSSL_KEIL
  6677. "adcs r5, r5, %[r]\n\t"
  6678. #elif defined(__clang__)
  6679. "adcs r5, %[r]\n\t"
  6680. #else
  6681. "adc r5, %[r]\n\t"
  6682. #endif
  6683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6684. "lsrs r6, %[a], #16\n\t"
  6685. #else
  6686. "lsr r6, %[a], #16\n\t"
  6687. #endif
  6688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6689. "lsrs r7, %[b], #16\n\t"
  6690. #else
  6691. "lsr r7, %[b], #16\n\t"
  6692. #endif
  6693. #ifdef WOLFSSL_KEIL
  6694. "muls r7, r6, r7\n\t"
  6695. #elif defined(__clang__)
  6696. "muls r7, r6\n\t"
  6697. #else
  6698. "mul r7, r6\n\t"
  6699. #endif
  6700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6701. "adds r4, r4, r7\n\t"
  6702. #else
  6703. "add r4, r4, r7\n\t"
  6704. #endif
  6705. #ifdef WOLFSSL_KEIL
  6706. "adcs r5, r5, %[r]\n\t"
  6707. #elif defined(__clang__)
  6708. "adcs r5, %[r]\n\t"
  6709. #else
  6710. "adc r5, %[r]\n\t"
  6711. #endif
  6712. "uxth r7, %[b]\n\t"
  6713. #ifdef WOLFSSL_KEIL
  6714. "muls r6, r7, r6\n\t"
  6715. #elif defined(__clang__)
  6716. "muls r6, r7\n\t"
  6717. #else
  6718. "mul r6, r7\n\t"
  6719. #endif
  6720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6721. "lsrs r7, r6, #16\n\t"
  6722. #else
  6723. "lsr r7, r6, #16\n\t"
  6724. #endif
  6725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6726. "lsls r6, r6, #16\n\t"
  6727. #else
  6728. "lsl r6, r6, #16\n\t"
  6729. #endif
  6730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6731. "adds r3, r3, r6\n\t"
  6732. #else
  6733. "add r3, r3, r6\n\t"
  6734. #endif
  6735. #ifdef WOLFSSL_KEIL
  6736. "adcs r4, r4, r7\n\t"
  6737. #elif defined(__clang__)
  6738. "adcs r4, r7\n\t"
  6739. #else
  6740. "adc r4, r7\n\t"
  6741. #endif
  6742. #ifdef WOLFSSL_KEIL
  6743. "adcs r5, r5, %[r]\n\t"
  6744. #elif defined(__clang__)
  6745. "adcs r5, %[r]\n\t"
  6746. #else
  6747. "adc r5, %[r]\n\t"
  6748. #endif
  6749. "# A[4] * B[5]\n\t"
  6750. "mov %[a], r9\n\t"
  6751. "mov %[b], r10\n\t"
  6752. "ldr %[a], [%[a], #16]\n\t"
  6753. "ldr %[b], [%[b], #20]\n\t"
  6754. "uxth r6, %[a]\n\t"
  6755. "uxth r7, %[b]\n\t"
  6756. #ifdef WOLFSSL_KEIL
  6757. "muls r7, r6, r7\n\t"
  6758. #elif defined(__clang__)
  6759. "muls r7, r6\n\t"
  6760. #else
  6761. "mul r7, r6\n\t"
  6762. #endif
  6763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6764. "adds r3, r3, r7\n\t"
  6765. #else
  6766. "add r3, r3, r7\n\t"
  6767. #endif
  6768. #ifdef WOLFSSL_KEIL
  6769. "adcs r4, r4, %[r]\n\t"
  6770. #elif defined(__clang__)
  6771. "adcs r4, %[r]\n\t"
  6772. #else
  6773. "adc r4, %[r]\n\t"
  6774. #endif
  6775. #ifdef WOLFSSL_KEIL
  6776. "adcs r5, r5, %[r]\n\t"
  6777. #elif defined(__clang__)
  6778. "adcs r5, %[r]\n\t"
  6779. #else
  6780. "adc r5, %[r]\n\t"
  6781. #endif
  6782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6783. "lsrs r7, %[b], #16\n\t"
  6784. #else
  6785. "lsr r7, %[b], #16\n\t"
  6786. #endif
  6787. #ifdef WOLFSSL_KEIL
  6788. "muls r6, r7, r6\n\t"
  6789. #elif defined(__clang__)
  6790. "muls r6, r7\n\t"
  6791. #else
  6792. "mul r6, r7\n\t"
  6793. #endif
  6794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6795. "lsrs r7, r6, #16\n\t"
  6796. #else
  6797. "lsr r7, r6, #16\n\t"
  6798. #endif
  6799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6800. "lsls r6, r6, #16\n\t"
  6801. #else
  6802. "lsl r6, r6, #16\n\t"
  6803. #endif
  6804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6805. "adds r3, r3, r6\n\t"
  6806. #else
  6807. "add r3, r3, r6\n\t"
  6808. #endif
  6809. #ifdef WOLFSSL_KEIL
  6810. "adcs r4, r4, r7\n\t"
  6811. #elif defined(__clang__)
  6812. "adcs r4, r7\n\t"
  6813. #else
  6814. "adc r4, r7\n\t"
  6815. #endif
  6816. #ifdef WOLFSSL_KEIL
  6817. "adcs r5, r5, %[r]\n\t"
  6818. #elif defined(__clang__)
  6819. "adcs r5, %[r]\n\t"
  6820. #else
  6821. "adc r5, %[r]\n\t"
  6822. #endif
  6823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6824. "lsrs r6, %[a], #16\n\t"
  6825. #else
  6826. "lsr r6, %[a], #16\n\t"
  6827. #endif
  6828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6829. "lsrs r7, %[b], #16\n\t"
  6830. #else
  6831. "lsr r7, %[b], #16\n\t"
  6832. #endif
  6833. #ifdef WOLFSSL_KEIL
  6834. "muls r7, r6, r7\n\t"
  6835. #elif defined(__clang__)
  6836. "muls r7, r6\n\t"
  6837. #else
  6838. "mul r7, r6\n\t"
  6839. #endif
  6840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6841. "adds r4, r4, r7\n\t"
  6842. #else
  6843. "add r4, r4, r7\n\t"
  6844. #endif
  6845. #ifdef WOLFSSL_KEIL
  6846. "adcs r5, r5, %[r]\n\t"
  6847. #elif defined(__clang__)
  6848. "adcs r5, %[r]\n\t"
  6849. #else
  6850. "adc r5, %[r]\n\t"
  6851. #endif
  6852. "uxth r7, %[b]\n\t"
  6853. #ifdef WOLFSSL_KEIL
  6854. "muls r6, r7, r6\n\t"
  6855. #elif defined(__clang__)
  6856. "muls r6, r7\n\t"
  6857. #else
  6858. "mul r6, r7\n\t"
  6859. #endif
  6860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6861. "lsrs r7, r6, #16\n\t"
  6862. #else
  6863. "lsr r7, r6, #16\n\t"
  6864. #endif
  6865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6866. "lsls r6, r6, #16\n\t"
  6867. #else
  6868. "lsl r6, r6, #16\n\t"
  6869. #endif
  6870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6871. "adds r3, r3, r6\n\t"
  6872. #else
  6873. "add r3, r3, r6\n\t"
  6874. #endif
  6875. #ifdef WOLFSSL_KEIL
  6876. "adcs r4, r4, r7\n\t"
  6877. #elif defined(__clang__)
  6878. "adcs r4, r7\n\t"
  6879. #else
  6880. "adc r4, r7\n\t"
  6881. #endif
  6882. #ifdef WOLFSSL_KEIL
  6883. "adcs r5, r5, %[r]\n\t"
  6884. #elif defined(__clang__)
  6885. "adcs r5, %[r]\n\t"
  6886. #else
  6887. "adc r5, %[r]\n\t"
  6888. #endif
  6889. "# A[5] * B[4]\n\t"
  6890. "mov %[a], r9\n\t"
  6891. "mov %[b], r10\n\t"
  6892. "ldr %[a], [%[a], #20]\n\t"
  6893. "ldr %[b], [%[b], #16]\n\t"
  6894. "uxth r6, %[a]\n\t"
  6895. "uxth r7, %[b]\n\t"
  6896. #ifdef WOLFSSL_KEIL
  6897. "muls r7, r6, r7\n\t"
  6898. #elif defined(__clang__)
  6899. "muls r7, r6\n\t"
  6900. #else
  6901. "mul r7, r6\n\t"
  6902. #endif
  6903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6904. "adds r3, r3, r7\n\t"
  6905. #else
  6906. "add r3, r3, r7\n\t"
  6907. #endif
  6908. #ifdef WOLFSSL_KEIL
  6909. "adcs r4, r4, %[r]\n\t"
  6910. #elif defined(__clang__)
  6911. "adcs r4, %[r]\n\t"
  6912. #else
  6913. "adc r4, %[r]\n\t"
  6914. #endif
  6915. #ifdef WOLFSSL_KEIL
  6916. "adcs r5, r5, %[r]\n\t"
  6917. #elif defined(__clang__)
  6918. "adcs r5, %[r]\n\t"
  6919. #else
  6920. "adc r5, %[r]\n\t"
  6921. #endif
  6922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6923. "lsrs r7, %[b], #16\n\t"
  6924. #else
  6925. "lsr r7, %[b], #16\n\t"
  6926. #endif
  6927. #ifdef WOLFSSL_KEIL
  6928. "muls r6, r7, r6\n\t"
  6929. #elif defined(__clang__)
  6930. "muls r6, r7\n\t"
  6931. #else
  6932. "mul r6, r7\n\t"
  6933. #endif
  6934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6935. "lsrs r7, r6, #16\n\t"
  6936. #else
  6937. "lsr r7, r6, #16\n\t"
  6938. #endif
  6939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6940. "lsls r6, r6, #16\n\t"
  6941. #else
  6942. "lsl r6, r6, #16\n\t"
  6943. #endif
  6944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6945. "adds r3, r3, r6\n\t"
  6946. #else
  6947. "add r3, r3, r6\n\t"
  6948. #endif
  6949. #ifdef WOLFSSL_KEIL
  6950. "adcs r4, r4, r7\n\t"
  6951. #elif defined(__clang__)
  6952. "adcs r4, r7\n\t"
  6953. #else
  6954. "adc r4, r7\n\t"
  6955. #endif
  6956. #ifdef WOLFSSL_KEIL
  6957. "adcs r5, r5, %[r]\n\t"
  6958. #elif defined(__clang__)
  6959. "adcs r5, %[r]\n\t"
  6960. #else
  6961. "adc r5, %[r]\n\t"
  6962. #endif
  6963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6964. "lsrs r6, %[a], #16\n\t"
  6965. #else
  6966. "lsr r6, %[a], #16\n\t"
  6967. #endif
  6968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6969. "lsrs r7, %[b], #16\n\t"
  6970. #else
  6971. "lsr r7, %[b], #16\n\t"
  6972. #endif
  6973. #ifdef WOLFSSL_KEIL
  6974. "muls r7, r6, r7\n\t"
  6975. #elif defined(__clang__)
  6976. "muls r7, r6\n\t"
  6977. #else
  6978. "mul r7, r6\n\t"
  6979. #endif
  6980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6981. "adds r4, r4, r7\n\t"
  6982. #else
  6983. "add r4, r4, r7\n\t"
  6984. #endif
  6985. #ifdef WOLFSSL_KEIL
  6986. "adcs r5, r5, %[r]\n\t"
  6987. #elif defined(__clang__)
  6988. "adcs r5, %[r]\n\t"
  6989. #else
  6990. "adc r5, %[r]\n\t"
  6991. #endif
  6992. "uxth r7, %[b]\n\t"
  6993. #ifdef WOLFSSL_KEIL
  6994. "muls r6, r7, r6\n\t"
  6995. #elif defined(__clang__)
  6996. "muls r6, r7\n\t"
  6997. #else
  6998. "mul r6, r7\n\t"
  6999. #endif
  7000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7001. "lsrs r7, r6, #16\n\t"
  7002. #else
  7003. "lsr r7, r6, #16\n\t"
  7004. #endif
  7005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7006. "lsls r6, r6, #16\n\t"
  7007. #else
  7008. "lsl r6, r6, #16\n\t"
  7009. #endif
  7010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7011. "adds r3, r3, r6\n\t"
  7012. #else
  7013. "add r3, r3, r6\n\t"
  7014. #endif
  7015. #ifdef WOLFSSL_KEIL
  7016. "adcs r4, r4, r7\n\t"
  7017. #elif defined(__clang__)
  7018. "adcs r4, r7\n\t"
  7019. #else
  7020. "adc r4, r7\n\t"
  7021. #endif
  7022. #ifdef WOLFSSL_KEIL
  7023. "adcs r5, r5, %[r]\n\t"
  7024. #elif defined(__clang__)
  7025. "adcs r5, %[r]\n\t"
  7026. #else
  7027. "adc r5, %[r]\n\t"
  7028. #endif
  7029. "# A[6] * B[3]\n\t"
  7030. "mov %[a], r9\n\t"
  7031. "mov %[b], r10\n\t"
  7032. "ldr %[a], [%[a], #24]\n\t"
  7033. "ldr %[b], [%[b], #12]\n\t"
  7034. "uxth r6, %[a]\n\t"
  7035. "uxth r7, %[b]\n\t"
  7036. #ifdef WOLFSSL_KEIL
  7037. "muls r7, r6, r7\n\t"
  7038. #elif defined(__clang__)
  7039. "muls r7, r6\n\t"
  7040. #else
  7041. "mul r7, r6\n\t"
  7042. #endif
  7043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7044. "adds r3, r3, r7\n\t"
  7045. #else
  7046. "add r3, r3, r7\n\t"
  7047. #endif
  7048. #ifdef WOLFSSL_KEIL
  7049. "adcs r4, r4, %[r]\n\t"
  7050. #elif defined(__clang__)
  7051. "adcs r4, %[r]\n\t"
  7052. #else
  7053. "adc r4, %[r]\n\t"
  7054. #endif
  7055. #ifdef WOLFSSL_KEIL
  7056. "adcs r5, r5, %[r]\n\t"
  7057. #elif defined(__clang__)
  7058. "adcs r5, %[r]\n\t"
  7059. #else
  7060. "adc r5, %[r]\n\t"
  7061. #endif
  7062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7063. "lsrs r7, %[b], #16\n\t"
  7064. #else
  7065. "lsr r7, %[b], #16\n\t"
  7066. #endif
  7067. #ifdef WOLFSSL_KEIL
  7068. "muls r6, r7, r6\n\t"
  7069. #elif defined(__clang__)
  7070. "muls r6, r7\n\t"
  7071. #else
  7072. "mul r6, r7\n\t"
  7073. #endif
  7074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7075. "lsrs r7, r6, #16\n\t"
  7076. #else
  7077. "lsr r7, r6, #16\n\t"
  7078. #endif
  7079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7080. "lsls r6, r6, #16\n\t"
  7081. #else
  7082. "lsl r6, r6, #16\n\t"
  7083. #endif
  7084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7085. "adds r3, r3, r6\n\t"
  7086. #else
  7087. "add r3, r3, r6\n\t"
  7088. #endif
  7089. #ifdef WOLFSSL_KEIL
  7090. "adcs r4, r4, r7\n\t"
  7091. #elif defined(__clang__)
  7092. "adcs r4, r7\n\t"
  7093. #else
  7094. "adc r4, r7\n\t"
  7095. #endif
  7096. #ifdef WOLFSSL_KEIL
  7097. "adcs r5, r5, %[r]\n\t"
  7098. #elif defined(__clang__)
  7099. "adcs r5, %[r]\n\t"
  7100. #else
  7101. "adc r5, %[r]\n\t"
  7102. #endif
  7103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7104. "lsrs r6, %[a], #16\n\t"
  7105. #else
  7106. "lsr r6, %[a], #16\n\t"
  7107. #endif
  7108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7109. "lsrs r7, %[b], #16\n\t"
  7110. #else
  7111. "lsr r7, %[b], #16\n\t"
  7112. #endif
  7113. #ifdef WOLFSSL_KEIL
  7114. "muls r7, r6, r7\n\t"
  7115. #elif defined(__clang__)
  7116. "muls r7, r6\n\t"
  7117. #else
  7118. "mul r7, r6\n\t"
  7119. #endif
  7120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7121. "adds r4, r4, r7\n\t"
  7122. #else
  7123. "add r4, r4, r7\n\t"
  7124. #endif
  7125. #ifdef WOLFSSL_KEIL
  7126. "adcs r5, r5, %[r]\n\t"
  7127. #elif defined(__clang__)
  7128. "adcs r5, %[r]\n\t"
  7129. #else
  7130. "adc r5, %[r]\n\t"
  7131. #endif
  7132. "uxth r7, %[b]\n\t"
  7133. #ifdef WOLFSSL_KEIL
  7134. "muls r6, r7, r6\n\t"
  7135. #elif defined(__clang__)
  7136. "muls r6, r7\n\t"
  7137. #else
  7138. "mul r6, r7\n\t"
  7139. #endif
  7140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7141. "lsrs r7, r6, #16\n\t"
  7142. #else
  7143. "lsr r7, r6, #16\n\t"
  7144. #endif
  7145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7146. "lsls r6, r6, #16\n\t"
  7147. #else
  7148. "lsl r6, r6, #16\n\t"
  7149. #endif
  7150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7151. "adds r3, r3, r6\n\t"
  7152. #else
  7153. "add r3, r3, r6\n\t"
  7154. #endif
  7155. #ifdef WOLFSSL_KEIL
  7156. "adcs r4, r4, r7\n\t"
  7157. #elif defined(__clang__)
  7158. "adcs r4, r7\n\t"
  7159. #else
  7160. "adc r4, r7\n\t"
  7161. #endif
  7162. #ifdef WOLFSSL_KEIL
  7163. "adcs r5, r5, %[r]\n\t"
  7164. #elif defined(__clang__)
  7165. "adcs r5, %[r]\n\t"
  7166. #else
  7167. "adc r5, %[r]\n\t"
  7168. #endif
  7169. "# A[7] * B[2]\n\t"
  7170. "mov %[a], r9\n\t"
  7171. "mov %[b], r10\n\t"
  7172. "ldr %[a], [%[a], #28]\n\t"
  7173. "ldr %[b], [%[b], #8]\n\t"
  7174. "uxth r6, %[a]\n\t"
  7175. "uxth r7, %[b]\n\t"
  7176. #ifdef WOLFSSL_KEIL
  7177. "muls r7, r6, r7\n\t"
  7178. #elif defined(__clang__)
  7179. "muls r7, r6\n\t"
  7180. #else
  7181. "mul r7, r6\n\t"
  7182. #endif
  7183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7184. "adds r3, r3, r7\n\t"
  7185. #else
  7186. "add r3, r3, r7\n\t"
  7187. #endif
  7188. #ifdef WOLFSSL_KEIL
  7189. "adcs r4, r4, %[r]\n\t"
  7190. #elif defined(__clang__)
  7191. "adcs r4, %[r]\n\t"
  7192. #else
  7193. "adc r4, %[r]\n\t"
  7194. #endif
  7195. #ifdef WOLFSSL_KEIL
  7196. "adcs r5, r5, %[r]\n\t"
  7197. #elif defined(__clang__)
  7198. "adcs r5, %[r]\n\t"
  7199. #else
  7200. "adc r5, %[r]\n\t"
  7201. #endif
  7202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7203. "lsrs r7, %[b], #16\n\t"
  7204. #else
  7205. "lsr r7, %[b], #16\n\t"
  7206. #endif
  7207. #ifdef WOLFSSL_KEIL
  7208. "muls r6, r7, r6\n\t"
  7209. #elif defined(__clang__)
  7210. "muls r6, r7\n\t"
  7211. #else
  7212. "mul r6, r7\n\t"
  7213. #endif
  7214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7215. "lsrs r7, r6, #16\n\t"
  7216. #else
  7217. "lsr r7, r6, #16\n\t"
  7218. #endif
  7219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7220. "lsls r6, r6, #16\n\t"
  7221. #else
  7222. "lsl r6, r6, #16\n\t"
  7223. #endif
  7224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7225. "adds r3, r3, r6\n\t"
  7226. #else
  7227. "add r3, r3, r6\n\t"
  7228. #endif
  7229. #ifdef WOLFSSL_KEIL
  7230. "adcs r4, r4, r7\n\t"
  7231. #elif defined(__clang__)
  7232. "adcs r4, r7\n\t"
  7233. #else
  7234. "adc r4, r7\n\t"
  7235. #endif
  7236. #ifdef WOLFSSL_KEIL
  7237. "adcs r5, r5, %[r]\n\t"
  7238. #elif defined(__clang__)
  7239. "adcs r5, %[r]\n\t"
  7240. #else
  7241. "adc r5, %[r]\n\t"
  7242. #endif
  7243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7244. "lsrs r6, %[a], #16\n\t"
  7245. #else
  7246. "lsr r6, %[a], #16\n\t"
  7247. #endif
  7248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7249. "lsrs r7, %[b], #16\n\t"
  7250. #else
  7251. "lsr r7, %[b], #16\n\t"
  7252. #endif
  7253. #ifdef WOLFSSL_KEIL
  7254. "muls r7, r6, r7\n\t"
  7255. #elif defined(__clang__)
  7256. "muls r7, r6\n\t"
  7257. #else
  7258. "mul r7, r6\n\t"
  7259. #endif
  7260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7261. "adds r4, r4, r7\n\t"
  7262. #else
  7263. "add r4, r4, r7\n\t"
  7264. #endif
  7265. #ifdef WOLFSSL_KEIL
  7266. "adcs r5, r5, %[r]\n\t"
  7267. #elif defined(__clang__)
  7268. "adcs r5, %[r]\n\t"
  7269. #else
  7270. "adc r5, %[r]\n\t"
  7271. #endif
  7272. "uxth r7, %[b]\n\t"
  7273. #ifdef WOLFSSL_KEIL
  7274. "muls r6, r7, r6\n\t"
  7275. #elif defined(__clang__)
  7276. "muls r6, r7\n\t"
  7277. #else
  7278. "mul r6, r7\n\t"
  7279. #endif
  7280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7281. "lsrs r7, r6, #16\n\t"
  7282. #else
  7283. "lsr r7, r6, #16\n\t"
  7284. #endif
  7285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7286. "lsls r6, r6, #16\n\t"
  7287. #else
  7288. "lsl r6, r6, #16\n\t"
  7289. #endif
  7290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7291. "adds r3, r3, r6\n\t"
  7292. #else
  7293. "add r3, r3, r6\n\t"
  7294. #endif
  7295. #ifdef WOLFSSL_KEIL
  7296. "adcs r4, r4, r7\n\t"
  7297. #elif defined(__clang__)
  7298. "adcs r4, r7\n\t"
  7299. #else
  7300. "adc r4, r7\n\t"
  7301. #endif
  7302. #ifdef WOLFSSL_KEIL
  7303. "adcs r5, r5, %[r]\n\t"
  7304. #elif defined(__clang__)
  7305. "adcs r5, %[r]\n\t"
  7306. #else
  7307. "adc r5, %[r]\n\t"
  7308. #endif
  7309. "mov %[r], r8\n\t"
  7310. "str r3, [%[r], #36]\n\t"
  7311. "movs %[r], #0\n\t"
  7312. "# A[7] * B[3]\n\t"
  7313. "movs r3, #0\n\t"
  7314. "mov %[a], r9\n\t"
  7315. "mov %[b], r10\n\t"
  7316. "ldr %[a], [%[a], #28]\n\t"
  7317. "ldr %[b], [%[b], #12]\n\t"
  7318. "uxth r6, %[a]\n\t"
  7319. "uxth r7, %[b]\n\t"
  7320. #ifdef WOLFSSL_KEIL
  7321. "muls r7, r6, r7\n\t"
  7322. #elif defined(__clang__)
  7323. "muls r7, r6\n\t"
  7324. #else
  7325. "mul r7, r6\n\t"
  7326. #endif
  7327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7328. "adds r4, r4, r7\n\t"
  7329. #else
  7330. "add r4, r4, r7\n\t"
  7331. #endif
  7332. #ifdef WOLFSSL_KEIL
  7333. "adcs r5, r5, %[r]\n\t"
  7334. #elif defined(__clang__)
  7335. "adcs r5, %[r]\n\t"
  7336. #else
  7337. "adc r5, %[r]\n\t"
  7338. #endif
  7339. #ifdef WOLFSSL_KEIL
  7340. "adcs r3, r3, %[r]\n\t"
  7341. #elif defined(__clang__)
  7342. "adcs r3, %[r]\n\t"
  7343. #else
  7344. "adc r3, %[r]\n\t"
  7345. #endif
  7346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7347. "lsrs r7, %[b], #16\n\t"
  7348. #else
  7349. "lsr r7, %[b], #16\n\t"
  7350. #endif
  7351. #ifdef WOLFSSL_KEIL
  7352. "muls r6, r7, r6\n\t"
  7353. #elif defined(__clang__)
  7354. "muls r6, r7\n\t"
  7355. #else
  7356. "mul r6, r7\n\t"
  7357. #endif
  7358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7359. "lsrs r7, r6, #16\n\t"
  7360. #else
  7361. "lsr r7, r6, #16\n\t"
  7362. #endif
  7363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7364. "lsls r6, r6, #16\n\t"
  7365. #else
  7366. "lsl r6, r6, #16\n\t"
  7367. #endif
  7368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7369. "adds r4, r4, r6\n\t"
  7370. #else
  7371. "add r4, r4, r6\n\t"
  7372. #endif
  7373. #ifdef WOLFSSL_KEIL
  7374. "adcs r5, r5, r7\n\t"
  7375. #elif defined(__clang__)
  7376. "adcs r5, r7\n\t"
  7377. #else
  7378. "adc r5, r7\n\t"
  7379. #endif
  7380. #ifdef WOLFSSL_KEIL
  7381. "adcs r3, r3, %[r]\n\t"
  7382. #elif defined(__clang__)
  7383. "adcs r3, %[r]\n\t"
  7384. #else
  7385. "adc r3, %[r]\n\t"
  7386. #endif
  7387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7388. "lsrs r6, %[a], #16\n\t"
  7389. #else
  7390. "lsr r6, %[a], #16\n\t"
  7391. #endif
  7392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7393. "lsrs r7, %[b], #16\n\t"
  7394. #else
  7395. "lsr r7, %[b], #16\n\t"
  7396. #endif
  7397. #ifdef WOLFSSL_KEIL
  7398. "muls r7, r6, r7\n\t"
  7399. #elif defined(__clang__)
  7400. "muls r7, r6\n\t"
  7401. #else
  7402. "mul r7, r6\n\t"
  7403. #endif
  7404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7405. "adds r5, r5, r7\n\t"
  7406. #else
  7407. "add r5, r5, r7\n\t"
  7408. #endif
  7409. #ifdef WOLFSSL_KEIL
  7410. "adcs r3, r3, %[r]\n\t"
  7411. #elif defined(__clang__)
  7412. "adcs r3, %[r]\n\t"
  7413. #else
  7414. "adc r3, %[r]\n\t"
  7415. #endif
  7416. "uxth r7, %[b]\n\t"
  7417. #ifdef WOLFSSL_KEIL
  7418. "muls r6, r7, r6\n\t"
  7419. #elif defined(__clang__)
  7420. "muls r6, r7\n\t"
  7421. #else
  7422. "mul r6, r7\n\t"
  7423. #endif
  7424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7425. "lsrs r7, r6, #16\n\t"
  7426. #else
  7427. "lsr r7, r6, #16\n\t"
  7428. #endif
  7429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7430. "lsls r6, r6, #16\n\t"
  7431. #else
  7432. "lsl r6, r6, #16\n\t"
  7433. #endif
  7434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7435. "adds r4, r4, r6\n\t"
  7436. #else
  7437. "add r4, r4, r6\n\t"
  7438. #endif
  7439. #ifdef WOLFSSL_KEIL
  7440. "adcs r5, r5, r7\n\t"
  7441. #elif defined(__clang__)
  7442. "adcs r5, r7\n\t"
  7443. #else
  7444. "adc r5, r7\n\t"
  7445. #endif
  7446. #ifdef WOLFSSL_KEIL
  7447. "adcs r3, r3, %[r]\n\t"
  7448. #elif defined(__clang__)
  7449. "adcs r3, %[r]\n\t"
  7450. #else
  7451. "adc r3, %[r]\n\t"
  7452. #endif
  7453. "# A[6] * B[4]\n\t"
  7454. "mov %[a], r9\n\t"
  7455. "mov %[b], r10\n\t"
  7456. "ldr %[a], [%[a], #24]\n\t"
  7457. "ldr %[b], [%[b], #16]\n\t"
  7458. "uxth r6, %[a]\n\t"
  7459. "uxth r7, %[b]\n\t"
  7460. #ifdef WOLFSSL_KEIL
  7461. "muls r7, r6, r7\n\t"
  7462. #elif defined(__clang__)
  7463. "muls r7, r6\n\t"
  7464. #else
  7465. "mul r7, r6\n\t"
  7466. #endif
  7467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7468. "adds r4, r4, r7\n\t"
  7469. #else
  7470. "add r4, r4, r7\n\t"
  7471. #endif
  7472. #ifdef WOLFSSL_KEIL
  7473. "adcs r5, r5, %[r]\n\t"
  7474. #elif defined(__clang__)
  7475. "adcs r5, %[r]\n\t"
  7476. #else
  7477. "adc r5, %[r]\n\t"
  7478. #endif
  7479. #ifdef WOLFSSL_KEIL
  7480. "adcs r3, r3, %[r]\n\t"
  7481. #elif defined(__clang__)
  7482. "adcs r3, %[r]\n\t"
  7483. #else
  7484. "adc r3, %[r]\n\t"
  7485. #endif
  7486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7487. "lsrs r7, %[b], #16\n\t"
  7488. #else
  7489. "lsr r7, %[b], #16\n\t"
  7490. #endif
  7491. #ifdef WOLFSSL_KEIL
  7492. "muls r6, r7, r6\n\t"
  7493. #elif defined(__clang__)
  7494. "muls r6, r7\n\t"
  7495. #else
  7496. "mul r6, r7\n\t"
  7497. #endif
  7498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7499. "lsrs r7, r6, #16\n\t"
  7500. #else
  7501. "lsr r7, r6, #16\n\t"
  7502. #endif
  7503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7504. "lsls r6, r6, #16\n\t"
  7505. #else
  7506. "lsl r6, r6, #16\n\t"
  7507. #endif
  7508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7509. "adds r4, r4, r6\n\t"
  7510. #else
  7511. "add r4, r4, r6\n\t"
  7512. #endif
  7513. #ifdef WOLFSSL_KEIL
  7514. "adcs r5, r5, r7\n\t"
  7515. #elif defined(__clang__)
  7516. "adcs r5, r7\n\t"
  7517. #else
  7518. "adc r5, r7\n\t"
  7519. #endif
  7520. #ifdef WOLFSSL_KEIL
  7521. "adcs r3, r3, %[r]\n\t"
  7522. #elif defined(__clang__)
  7523. "adcs r3, %[r]\n\t"
  7524. #else
  7525. "adc r3, %[r]\n\t"
  7526. #endif
  7527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7528. "lsrs r6, %[a], #16\n\t"
  7529. #else
  7530. "lsr r6, %[a], #16\n\t"
  7531. #endif
  7532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7533. "lsrs r7, %[b], #16\n\t"
  7534. #else
  7535. "lsr r7, %[b], #16\n\t"
  7536. #endif
  7537. #ifdef WOLFSSL_KEIL
  7538. "muls r7, r6, r7\n\t"
  7539. #elif defined(__clang__)
  7540. "muls r7, r6\n\t"
  7541. #else
  7542. "mul r7, r6\n\t"
  7543. #endif
  7544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7545. "adds r5, r5, r7\n\t"
  7546. #else
  7547. "add r5, r5, r7\n\t"
  7548. #endif
  7549. #ifdef WOLFSSL_KEIL
  7550. "adcs r3, r3, %[r]\n\t"
  7551. #elif defined(__clang__)
  7552. "adcs r3, %[r]\n\t"
  7553. #else
  7554. "adc r3, %[r]\n\t"
  7555. #endif
  7556. "uxth r7, %[b]\n\t"
  7557. #ifdef WOLFSSL_KEIL
  7558. "muls r6, r7, r6\n\t"
  7559. #elif defined(__clang__)
  7560. "muls r6, r7\n\t"
  7561. #else
  7562. "mul r6, r7\n\t"
  7563. #endif
  7564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7565. "lsrs r7, r6, #16\n\t"
  7566. #else
  7567. "lsr r7, r6, #16\n\t"
  7568. #endif
  7569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7570. "lsls r6, r6, #16\n\t"
  7571. #else
  7572. "lsl r6, r6, #16\n\t"
  7573. #endif
  7574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7575. "adds r4, r4, r6\n\t"
  7576. #else
  7577. "add r4, r4, r6\n\t"
  7578. #endif
  7579. #ifdef WOLFSSL_KEIL
  7580. "adcs r5, r5, r7\n\t"
  7581. #elif defined(__clang__)
  7582. "adcs r5, r7\n\t"
  7583. #else
  7584. "adc r5, r7\n\t"
  7585. #endif
  7586. #ifdef WOLFSSL_KEIL
  7587. "adcs r3, r3, %[r]\n\t"
  7588. #elif defined(__clang__)
  7589. "adcs r3, %[r]\n\t"
  7590. #else
  7591. "adc r3, %[r]\n\t"
  7592. #endif
  7593. "# A[5] * B[5]\n\t"
  7594. "mov %[a], r9\n\t"
  7595. "mov %[b], r10\n\t"
  7596. "ldr %[a], [%[a], #20]\n\t"
  7597. "ldr %[b], [%[b], #20]\n\t"
  7598. "uxth r6, %[a]\n\t"
  7599. "uxth r7, %[b]\n\t"
  7600. #ifdef WOLFSSL_KEIL
  7601. "muls r7, r6, r7\n\t"
  7602. #elif defined(__clang__)
  7603. "muls r7, r6\n\t"
  7604. #else
  7605. "mul r7, r6\n\t"
  7606. #endif
  7607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7608. "adds r4, r4, r7\n\t"
  7609. #else
  7610. "add r4, r4, r7\n\t"
  7611. #endif
  7612. #ifdef WOLFSSL_KEIL
  7613. "adcs r5, r5, %[r]\n\t"
  7614. #elif defined(__clang__)
  7615. "adcs r5, %[r]\n\t"
  7616. #else
  7617. "adc r5, %[r]\n\t"
  7618. #endif
  7619. #ifdef WOLFSSL_KEIL
  7620. "adcs r3, r3, %[r]\n\t"
  7621. #elif defined(__clang__)
  7622. "adcs r3, %[r]\n\t"
  7623. #else
  7624. "adc r3, %[r]\n\t"
  7625. #endif
  7626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7627. "lsrs r7, %[b], #16\n\t"
  7628. #else
  7629. "lsr r7, %[b], #16\n\t"
  7630. #endif
  7631. #ifdef WOLFSSL_KEIL
  7632. "muls r6, r7, r6\n\t"
  7633. #elif defined(__clang__)
  7634. "muls r6, r7\n\t"
  7635. #else
  7636. "mul r6, r7\n\t"
  7637. #endif
  7638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7639. "lsrs r7, r6, #16\n\t"
  7640. #else
  7641. "lsr r7, r6, #16\n\t"
  7642. #endif
  7643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7644. "lsls r6, r6, #16\n\t"
  7645. #else
  7646. "lsl r6, r6, #16\n\t"
  7647. #endif
  7648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7649. "adds r4, r4, r6\n\t"
  7650. #else
  7651. "add r4, r4, r6\n\t"
  7652. #endif
  7653. #ifdef WOLFSSL_KEIL
  7654. "adcs r5, r5, r7\n\t"
  7655. #elif defined(__clang__)
  7656. "adcs r5, r7\n\t"
  7657. #else
  7658. "adc r5, r7\n\t"
  7659. #endif
  7660. #ifdef WOLFSSL_KEIL
  7661. "adcs r3, r3, %[r]\n\t"
  7662. #elif defined(__clang__)
  7663. "adcs r3, %[r]\n\t"
  7664. #else
  7665. "adc r3, %[r]\n\t"
  7666. #endif
  7667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7668. "lsrs r6, %[a], #16\n\t"
  7669. #else
  7670. "lsr r6, %[a], #16\n\t"
  7671. #endif
  7672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7673. "lsrs r7, %[b], #16\n\t"
  7674. #else
  7675. "lsr r7, %[b], #16\n\t"
  7676. #endif
  7677. #ifdef WOLFSSL_KEIL
  7678. "muls r7, r6, r7\n\t"
  7679. #elif defined(__clang__)
  7680. "muls r7, r6\n\t"
  7681. #else
  7682. "mul r7, r6\n\t"
  7683. #endif
  7684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7685. "adds r5, r5, r7\n\t"
  7686. #else
  7687. "add r5, r5, r7\n\t"
  7688. #endif
  7689. #ifdef WOLFSSL_KEIL
  7690. "adcs r3, r3, %[r]\n\t"
  7691. #elif defined(__clang__)
  7692. "adcs r3, %[r]\n\t"
  7693. #else
  7694. "adc r3, %[r]\n\t"
  7695. #endif
  7696. "uxth r7, %[b]\n\t"
  7697. #ifdef WOLFSSL_KEIL
  7698. "muls r6, r7, r6\n\t"
  7699. #elif defined(__clang__)
  7700. "muls r6, r7\n\t"
  7701. #else
  7702. "mul r6, r7\n\t"
  7703. #endif
  7704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7705. "lsrs r7, r6, #16\n\t"
  7706. #else
  7707. "lsr r7, r6, #16\n\t"
  7708. #endif
  7709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7710. "lsls r6, r6, #16\n\t"
  7711. #else
  7712. "lsl r6, r6, #16\n\t"
  7713. #endif
  7714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7715. "adds r4, r4, r6\n\t"
  7716. #else
  7717. "add r4, r4, r6\n\t"
  7718. #endif
  7719. #ifdef WOLFSSL_KEIL
  7720. "adcs r5, r5, r7\n\t"
  7721. #elif defined(__clang__)
  7722. "adcs r5, r7\n\t"
  7723. #else
  7724. "adc r5, r7\n\t"
  7725. #endif
  7726. #ifdef WOLFSSL_KEIL
  7727. "adcs r3, r3, %[r]\n\t"
  7728. #elif defined(__clang__)
  7729. "adcs r3, %[r]\n\t"
  7730. #else
  7731. "adc r3, %[r]\n\t"
  7732. #endif
  7733. "# A[4] * B[6]\n\t"
  7734. "mov %[a], r9\n\t"
  7735. "mov %[b], r10\n\t"
  7736. "ldr %[a], [%[a], #16]\n\t"
  7737. "ldr %[b], [%[b], #24]\n\t"
  7738. "uxth r6, %[a]\n\t"
  7739. "uxth r7, %[b]\n\t"
  7740. #ifdef WOLFSSL_KEIL
  7741. "muls r7, r6, r7\n\t"
  7742. #elif defined(__clang__)
  7743. "muls r7, r6\n\t"
  7744. #else
  7745. "mul r7, r6\n\t"
  7746. #endif
  7747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7748. "adds r4, r4, r7\n\t"
  7749. #else
  7750. "add r4, r4, r7\n\t"
  7751. #endif
  7752. #ifdef WOLFSSL_KEIL
  7753. "adcs r5, r5, %[r]\n\t"
  7754. #elif defined(__clang__)
  7755. "adcs r5, %[r]\n\t"
  7756. #else
  7757. "adc r5, %[r]\n\t"
  7758. #endif
  7759. #ifdef WOLFSSL_KEIL
  7760. "adcs r3, r3, %[r]\n\t"
  7761. #elif defined(__clang__)
  7762. "adcs r3, %[r]\n\t"
  7763. #else
  7764. "adc r3, %[r]\n\t"
  7765. #endif
  7766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7767. "lsrs r7, %[b], #16\n\t"
  7768. #else
  7769. "lsr r7, %[b], #16\n\t"
  7770. #endif
  7771. #ifdef WOLFSSL_KEIL
  7772. "muls r6, r7, r6\n\t"
  7773. #elif defined(__clang__)
  7774. "muls r6, r7\n\t"
  7775. #else
  7776. "mul r6, r7\n\t"
  7777. #endif
  7778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7779. "lsrs r7, r6, #16\n\t"
  7780. #else
  7781. "lsr r7, r6, #16\n\t"
  7782. #endif
  7783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7784. "lsls r6, r6, #16\n\t"
  7785. #else
  7786. "lsl r6, r6, #16\n\t"
  7787. #endif
  7788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7789. "adds r4, r4, r6\n\t"
  7790. #else
  7791. "add r4, r4, r6\n\t"
  7792. #endif
  7793. #ifdef WOLFSSL_KEIL
  7794. "adcs r5, r5, r7\n\t"
  7795. #elif defined(__clang__)
  7796. "adcs r5, r7\n\t"
  7797. #else
  7798. "adc r5, r7\n\t"
  7799. #endif
  7800. #ifdef WOLFSSL_KEIL
  7801. "adcs r3, r3, %[r]\n\t"
  7802. #elif defined(__clang__)
  7803. "adcs r3, %[r]\n\t"
  7804. #else
  7805. "adc r3, %[r]\n\t"
  7806. #endif
  7807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7808. "lsrs r6, %[a], #16\n\t"
  7809. #else
  7810. "lsr r6, %[a], #16\n\t"
  7811. #endif
  7812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7813. "lsrs r7, %[b], #16\n\t"
  7814. #else
  7815. "lsr r7, %[b], #16\n\t"
  7816. #endif
  7817. #ifdef WOLFSSL_KEIL
  7818. "muls r7, r6, r7\n\t"
  7819. #elif defined(__clang__)
  7820. "muls r7, r6\n\t"
  7821. #else
  7822. "mul r7, r6\n\t"
  7823. #endif
  7824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7825. "adds r5, r5, r7\n\t"
  7826. #else
  7827. "add r5, r5, r7\n\t"
  7828. #endif
  7829. #ifdef WOLFSSL_KEIL
  7830. "adcs r3, r3, %[r]\n\t"
  7831. #elif defined(__clang__)
  7832. "adcs r3, %[r]\n\t"
  7833. #else
  7834. "adc r3, %[r]\n\t"
  7835. #endif
  7836. "uxth r7, %[b]\n\t"
  7837. #ifdef WOLFSSL_KEIL
  7838. "muls r6, r7, r6\n\t"
  7839. #elif defined(__clang__)
  7840. "muls r6, r7\n\t"
  7841. #else
  7842. "mul r6, r7\n\t"
  7843. #endif
  7844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7845. "lsrs r7, r6, #16\n\t"
  7846. #else
  7847. "lsr r7, r6, #16\n\t"
  7848. #endif
  7849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7850. "lsls r6, r6, #16\n\t"
  7851. #else
  7852. "lsl r6, r6, #16\n\t"
  7853. #endif
  7854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7855. "adds r4, r4, r6\n\t"
  7856. #else
  7857. "add r4, r4, r6\n\t"
  7858. #endif
  7859. #ifdef WOLFSSL_KEIL
  7860. "adcs r5, r5, r7\n\t"
  7861. #elif defined(__clang__)
  7862. "adcs r5, r7\n\t"
  7863. #else
  7864. "adc r5, r7\n\t"
  7865. #endif
  7866. #ifdef WOLFSSL_KEIL
  7867. "adcs r3, r3, %[r]\n\t"
  7868. #elif defined(__clang__)
  7869. "adcs r3, %[r]\n\t"
  7870. #else
  7871. "adc r3, %[r]\n\t"
  7872. #endif
  7873. "# A[3] * B[7]\n\t"
  7874. "mov %[a], r9\n\t"
  7875. "mov %[b], r10\n\t"
  7876. "ldr %[a], [%[a], #12]\n\t"
  7877. "ldr %[b], [%[b], #28]\n\t"
  7878. "uxth r6, %[a]\n\t"
  7879. "uxth r7, %[b]\n\t"
  7880. #ifdef WOLFSSL_KEIL
  7881. "muls r7, r6, r7\n\t"
  7882. #elif defined(__clang__)
  7883. "muls r7, r6\n\t"
  7884. #else
  7885. "mul r7, r6\n\t"
  7886. #endif
  7887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7888. "adds r4, r4, r7\n\t"
  7889. #else
  7890. "add r4, r4, r7\n\t"
  7891. #endif
  7892. #ifdef WOLFSSL_KEIL
  7893. "adcs r5, r5, %[r]\n\t"
  7894. #elif defined(__clang__)
  7895. "adcs r5, %[r]\n\t"
  7896. #else
  7897. "adc r5, %[r]\n\t"
  7898. #endif
  7899. #ifdef WOLFSSL_KEIL
  7900. "adcs r3, r3, %[r]\n\t"
  7901. #elif defined(__clang__)
  7902. "adcs r3, %[r]\n\t"
  7903. #else
  7904. "adc r3, %[r]\n\t"
  7905. #endif
  7906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7907. "lsrs r7, %[b], #16\n\t"
  7908. #else
  7909. "lsr r7, %[b], #16\n\t"
  7910. #endif
  7911. #ifdef WOLFSSL_KEIL
  7912. "muls r6, r7, r6\n\t"
  7913. #elif defined(__clang__)
  7914. "muls r6, r7\n\t"
  7915. #else
  7916. "mul r6, r7\n\t"
  7917. #endif
  7918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7919. "lsrs r7, r6, #16\n\t"
  7920. #else
  7921. "lsr r7, r6, #16\n\t"
  7922. #endif
  7923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7924. "lsls r6, r6, #16\n\t"
  7925. #else
  7926. "lsl r6, r6, #16\n\t"
  7927. #endif
  7928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7929. "adds r4, r4, r6\n\t"
  7930. #else
  7931. "add r4, r4, r6\n\t"
  7932. #endif
  7933. #ifdef WOLFSSL_KEIL
  7934. "adcs r5, r5, r7\n\t"
  7935. #elif defined(__clang__)
  7936. "adcs r5, r7\n\t"
  7937. #else
  7938. "adc r5, r7\n\t"
  7939. #endif
  7940. #ifdef WOLFSSL_KEIL
  7941. "adcs r3, r3, %[r]\n\t"
  7942. #elif defined(__clang__)
  7943. "adcs r3, %[r]\n\t"
  7944. #else
  7945. "adc r3, %[r]\n\t"
  7946. #endif
  7947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7948. "lsrs r6, %[a], #16\n\t"
  7949. #else
  7950. "lsr r6, %[a], #16\n\t"
  7951. #endif
  7952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7953. "lsrs r7, %[b], #16\n\t"
  7954. #else
  7955. "lsr r7, %[b], #16\n\t"
  7956. #endif
  7957. #ifdef WOLFSSL_KEIL
  7958. "muls r7, r6, r7\n\t"
  7959. #elif defined(__clang__)
  7960. "muls r7, r6\n\t"
  7961. #else
  7962. "mul r7, r6\n\t"
  7963. #endif
  7964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7965. "adds r5, r5, r7\n\t"
  7966. #else
  7967. "add r5, r5, r7\n\t"
  7968. #endif
  7969. #ifdef WOLFSSL_KEIL
  7970. "adcs r3, r3, %[r]\n\t"
  7971. #elif defined(__clang__)
  7972. "adcs r3, %[r]\n\t"
  7973. #else
  7974. "adc r3, %[r]\n\t"
  7975. #endif
  7976. "uxth r7, %[b]\n\t"
  7977. #ifdef WOLFSSL_KEIL
  7978. "muls r6, r7, r6\n\t"
  7979. #elif defined(__clang__)
  7980. "muls r6, r7\n\t"
  7981. #else
  7982. "mul r6, r7\n\t"
  7983. #endif
  7984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7985. "lsrs r7, r6, #16\n\t"
  7986. #else
  7987. "lsr r7, r6, #16\n\t"
  7988. #endif
  7989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7990. "lsls r6, r6, #16\n\t"
  7991. #else
  7992. "lsl r6, r6, #16\n\t"
  7993. #endif
  7994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7995. "adds r4, r4, r6\n\t"
  7996. #else
  7997. "add r4, r4, r6\n\t"
  7998. #endif
  7999. #ifdef WOLFSSL_KEIL
  8000. "adcs r5, r5, r7\n\t"
  8001. #elif defined(__clang__)
  8002. "adcs r5, r7\n\t"
  8003. #else
  8004. "adc r5, r7\n\t"
  8005. #endif
  8006. #ifdef WOLFSSL_KEIL
  8007. "adcs r3, r3, %[r]\n\t"
  8008. #elif defined(__clang__)
  8009. "adcs r3, %[r]\n\t"
  8010. #else
  8011. "adc r3, %[r]\n\t"
  8012. #endif
  8013. "mov %[r], r8\n\t"
  8014. "str r4, [%[r], #40]\n\t"
  8015. "movs %[r], #0\n\t"
  8016. "# A[4] * B[7]\n\t"
  8017. "movs r4, #0\n\t"
  8018. "mov %[a], r9\n\t"
  8019. "mov %[b], r10\n\t"
  8020. "ldr %[a], [%[a], #16]\n\t"
  8021. "ldr %[b], [%[b], #28]\n\t"
  8022. "uxth r6, %[a]\n\t"
  8023. "uxth r7, %[b]\n\t"
  8024. #ifdef WOLFSSL_KEIL
  8025. "muls r7, r6, r7\n\t"
  8026. #elif defined(__clang__)
  8027. "muls r7, r6\n\t"
  8028. #else
  8029. "mul r7, r6\n\t"
  8030. #endif
  8031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8032. "adds r5, r5, r7\n\t"
  8033. #else
  8034. "add r5, r5, r7\n\t"
  8035. #endif
  8036. #ifdef WOLFSSL_KEIL
  8037. "adcs r3, r3, %[r]\n\t"
  8038. #elif defined(__clang__)
  8039. "adcs r3, %[r]\n\t"
  8040. #else
  8041. "adc r3, %[r]\n\t"
  8042. #endif
  8043. #ifdef WOLFSSL_KEIL
  8044. "adcs r4, r4, %[r]\n\t"
  8045. #elif defined(__clang__)
  8046. "adcs r4, %[r]\n\t"
  8047. #else
  8048. "adc r4, %[r]\n\t"
  8049. #endif
  8050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8051. "lsrs r7, %[b], #16\n\t"
  8052. #else
  8053. "lsr r7, %[b], #16\n\t"
  8054. #endif
  8055. #ifdef WOLFSSL_KEIL
  8056. "muls r6, r7, r6\n\t"
  8057. #elif defined(__clang__)
  8058. "muls r6, r7\n\t"
  8059. #else
  8060. "mul r6, r7\n\t"
  8061. #endif
  8062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8063. "lsrs r7, r6, #16\n\t"
  8064. #else
  8065. "lsr r7, r6, #16\n\t"
  8066. #endif
  8067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8068. "lsls r6, r6, #16\n\t"
  8069. #else
  8070. "lsl r6, r6, #16\n\t"
  8071. #endif
  8072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8073. "adds r5, r5, r6\n\t"
  8074. #else
  8075. "add r5, r5, r6\n\t"
  8076. #endif
  8077. #ifdef WOLFSSL_KEIL
  8078. "adcs r3, r3, r7\n\t"
  8079. #elif defined(__clang__)
  8080. "adcs r3, r7\n\t"
  8081. #else
  8082. "adc r3, r7\n\t"
  8083. #endif
  8084. #ifdef WOLFSSL_KEIL
  8085. "adcs r4, r4, %[r]\n\t"
  8086. #elif defined(__clang__)
  8087. "adcs r4, %[r]\n\t"
  8088. #else
  8089. "adc r4, %[r]\n\t"
  8090. #endif
  8091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8092. "lsrs r6, %[a], #16\n\t"
  8093. #else
  8094. "lsr r6, %[a], #16\n\t"
  8095. #endif
  8096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8097. "lsrs r7, %[b], #16\n\t"
  8098. #else
  8099. "lsr r7, %[b], #16\n\t"
  8100. #endif
  8101. #ifdef WOLFSSL_KEIL
  8102. "muls r7, r6, r7\n\t"
  8103. #elif defined(__clang__)
  8104. "muls r7, r6\n\t"
  8105. #else
  8106. "mul r7, r6\n\t"
  8107. #endif
  8108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8109. "adds r3, r3, r7\n\t"
  8110. #else
  8111. "add r3, r3, r7\n\t"
  8112. #endif
  8113. #ifdef WOLFSSL_KEIL
  8114. "adcs r4, r4, %[r]\n\t"
  8115. #elif defined(__clang__)
  8116. "adcs r4, %[r]\n\t"
  8117. #else
  8118. "adc r4, %[r]\n\t"
  8119. #endif
  8120. "uxth r7, %[b]\n\t"
  8121. #ifdef WOLFSSL_KEIL
  8122. "muls r6, r7, r6\n\t"
  8123. #elif defined(__clang__)
  8124. "muls r6, r7\n\t"
  8125. #else
  8126. "mul r6, r7\n\t"
  8127. #endif
  8128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8129. "lsrs r7, r6, #16\n\t"
  8130. #else
  8131. "lsr r7, r6, #16\n\t"
  8132. #endif
  8133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8134. "lsls r6, r6, #16\n\t"
  8135. #else
  8136. "lsl r6, r6, #16\n\t"
  8137. #endif
  8138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8139. "adds r5, r5, r6\n\t"
  8140. #else
  8141. "add r5, r5, r6\n\t"
  8142. #endif
  8143. #ifdef WOLFSSL_KEIL
  8144. "adcs r3, r3, r7\n\t"
  8145. #elif defined(__clang__)
  8146. "adcs r3, r7\n\t"
  8147. #else
  8148. "adc r3, r7\n\t"
  8149. #endif
  8150. #ifdef WOLFSSL_KEIL
  8151. "adcs r4, r4, %[r]\n\t"
  8152. #elif defined(__clang__)
  8153. "adcs r4, %[r]\n\t"
  8154. #else
  8155. "adc r4, %[r]\n\t"
  8156. #endif
  8157. "# A[5] * B[6]\n\t"
  8158. "mov %[a], r9\n\t"
  8159. "mov %[b], r10\n\t"
  8160. "ldr %[a], [%[a], #20]\n\t"
  8161. "ldr %[b], [%[b], #24]\n\t"
  8162. "uxth r6, %[a]\n\t"
  8163. "uxth r7, %[b]\n\t"
  8164. #ifdef WOLFSSL_KEIL
  8165. "muls r7, r6, r7\n\t"
  8166. #elif defined(__clang__)
  8167. "muls r7, r6\n\t"
  8168. #else
  8169. "mul r7, r6\n\t"
  8170. #endif
  8171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8172. "adds r5, r5, r7\n\t"
  8173. #else
  8174. "add r5, r5, r7\n\t"
  8175. #endif
  8176. #ifdef WOLFSSL_KEIL
  8177. "adcs r3, r3, %[r]\n\t"
  8178. #elif defined(__clang__)
  8179. "adcs r3, %[r]\n\t"
  8180. #else
  8181. "adc r3, %[r]\n\t"
  8182. #endif
  8183. #ifdef WOLFSSL_KEIL
  8184. "adcs r4, r4, %[r]\n\t"
  8185. #elif defined(__clang__)
  8186. "adcs r4, %[r]\n\t"
  8187. #else
  8188. "adc r4, %[r]\n\t"
  8189. #endif
  8190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8191. "lsrs r7, %[b], #16\n\t"
  8192. #else
  8193. "lsr r7, %[b], #16\n\t"
  8194. #endif
  8195. #ifdef WOLFSSL_KEIL
  8196. "muls r6, r7, r6\n\t"
  8197. #elif defined(__clang__)
  8198. "muls r6, r7\n\t"
  8199. #else
  8200. "mul r6, r7\n\t"
  8201. #endif
  8202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8203. "lsrs r7, r6, #16\n\t"
  8204. #else
  8205. "lsr r7, r6, #16\n\t"
  8206. #endif
  8207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8208. "lsls r6, r6, #16\n\t"
  8209. #else
  8210. "lsl r6, r6, #16\n\t"
  8211. #endif
  8212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8213. "adds r5, r5, r6\n\t"
  8214. #else
  8215. "add r5, r5, r6\n\t"
  8216. #endif
  8217. #ifdef WOLFSSL_KEIL
  8218. "adcs r3, r3, r7\n\t"
  8219. #elif defined(__clang__)
  8220. "adcs r3, r7\n\t"
  8221. #else
  8222. "adc r3, r7\n\t"
  8223. #endif
  8224. #ifdef WOLFSSL_KEIL
  8225. "adcs r4, r4, %[r]\n\t"
  8226. #elif defined(__clang__)
  8227. "adcs r4, %[r]\n\t"
  8228. #else
  8229. "adc r4, %[r]\n\t"
  8230. #endif
  8231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8232. "lsrs r6, %[a], #16\n\t"
  8233. #else
  8234. "lsr r6, %[a], #16\n\t"
  8235. #endif
  8236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8237. "lsrs r7, %[b], #16\n\t"
  8238. #else
  8239. "lsr r7, %[b], #16\n\t"
  8240. #endif
  8241. #ifdef WOLFSSL_KEIL
  8242. "muls r7, r6, r7\n\t"
  8243. #elif defined(__clang__)
  8244. "muls r7, r6\n\t"
  8245. #else
  8246. "mul r7, r6\n\t"
  8247. #endif
  8248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8249. "adds r3, r3, r7\n\t"
  8250. #else
  8251. "add r3, r3, r7\n\t"
  8252. #endif
  8253. #ifdef WOLFSSL_KEIL
  8254. "adcs r4, r4, %[r]\n\t"
  8255. #elif defined(__clang__)
  8256. "adcs r4, %[r]\n\t"
  8257. #else
  8258. "adc r4, %[r]\n\t"
  8259. #endif
  8260. "uxth r7, %[b]\n\t"
  8261. #ifdef WOLFSSL_KEIL
  8262. "muls r6, r7, r6\n\t"
  8263. #elif defined(__clang__)
  8264. "muls r6, r7\n\t"
  8265. #else
  8266. "mul r6, r7\n\t"
  8267. #endif
  8268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8269. "lsrs r7, r6, #16\n\t"
  8270. #else
  8271. "lsr r7, r6, #16\n\t"
  8272. #endif
  8273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8274. "lsls r6, r6, #16\n\t"
  8275. #else
  8276. "lsl r6, r6, #16\n\t"
  8277. #endif
  8278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8279. "adds r5, r5, r6\n\t"
  8280. #else
  8281. "add r5, r5, r6\n\t"
  8282. #endif
  8283. #ifdef WOLFSSL_KEIL
  8284. "adcs r3, r3, r7\n\t"
  8285. #elif defined(__clang__)
  8286. "adcs r3, r7\n\t"
  8287. #else
  8288. "adc r3, r7\n\t"
  8289. #endif
  8290. #ifdef WOLFSSL_KEIL
  8291. "adcs r4, r4, %[r]\n\t"
  8292. #elif defined(__clang__)
  8293. "adcs r4, %[r]\n\t"
  8294. #else
  8295. "adc r4, %[r]\n\t"
  8296. #endif
  8297. "# A[6] * B[5]\n\t"
  8298. "mov %[a], r9\n\t"
  8299. "mov %[b], r10\n\t"
  8300. "ldr %[a], [%[a], #24]\n\t"
  8301. "ldr %[b], [%[b], #20]\n\t"
  8302. "uxth r6, %[a]\n\t"
  8303. "uxth r7, %[b]\n\t"
  8304. #ifdef WOLFSSL_KEIL
  8305. "muls r7, r6, r7\n\t"
  8306. #elif defined(__clang__)
  8307. "muls r7, r6\n\t"
  8308. #else
  8309. "mul r7, r6\n\t"
  8310. #endif
  8311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8312. "adds r5, r5, r7\n\t"
  8313. #else
  8314. "add r5, r5, r7\n\t"
  8315. #endif
  8316. #ifdef WOLFSSL_KEIL
  8317. "adcs r3, r3, %[r]\n\t"
  8318. #elif defined(__clang__)
  8319. "adcs r3, %[r]\n\t"
  8320. #else
  8321. "adc r3, %[r]\n\t"
  8322. #endif
  8323. #ifdef WOLFSSL_KEIL
  8324. "adcs r4, r4, %[r]\n\t"
  8325. #elif defined(__clang__)
  8326. "adcs r4, %[r]\n\t"
  8327. #else
  8328. "adc r4, %[r]\n\t"
  8329. #endif
  8330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8331. "lsrs r7, %[b], #16\n\t"
  8332. #else
  8333. "lsr r7, %[b], #16\n\t"
  8334. #endif
  8335. #ifdef WOLFSSL_KEIL
  8336. "muls r6, r7, r6\n\t"
  8337. #elif defined(__clang__)
  8338. "muls r6, r7\n\t"
  8339. #else
  8340. "mul r6, r7\n\t"
  8341. #endif
  8342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8343. "lsrs r7, r6, #16\n\t"
  8344. #else
  8345. "lsr r7, r6, #16\n\t"
  8346. #endif
  8347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8348. "lsls r6, r6, #16\n\t"
  8349. #else
  8350. "lsl r6, r6, #16\n\t"
  8351. #endif
  8352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8353. "adds r5, r5, r6\n\t"
  8354. #else
  8355. "add r5, r5, r6\n\t"
  8356. #endif
  8357. #ifdef WOLFSSL_KEIL
  8358. "adcs r3, r3, r7\n\t"
  8359. #elif defined(__clang__)
  8360. "adcs r3, r7\n\t"
  8361. #else
  8362. "adc r3, r7\n\t"
  8363. #endif
  8364. #ifdef WOLFSSL_KEIL
  8365. "adcs r4, r4, %[r]\n\t"
  8366. #elif defined(__clang__)
  8367. "adcs r4, %[r]\n\t"
  8368. #else
  8369. "adc r4, %[r]\n\t"
  8370. #endif
  8371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8372. "lsrs r6, %[a], #16\n\t"
  8373. #else
  8374. "lsr r6, %[a], #16\n\t"
  8375. #endif
  8376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8377. "lsrs r7, %[b], #16\n\t"
  8378. #else
  8379. "lsr r7, %[b], #16\n\t"
  8380. #endif
  8381. #ifdef WOLFSSL_KEIL
  8382. "muls r7, r6, r7\n\t"
  8383. #elif defined(__clang__)
  8384. "muls r7, r6\n\t"
  8385. #else
  8386. "mul r7, r6\n\t"
  8387. #endif
  8388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8389. "adds r3, r3, r7\n\t"
  8390. #else
  8391. "add r3, r3, r7\n\t"
  8392. #endif
  8393. #ifdef WOLFSSL_KEIL
  8394. "adcs r4, r4, %[r]\n\t"
  8395. #elif defined(__clang__)
  8396. "adcs r4, %[r]\n\t"
  8397. #else
  8398. "adc r4, %[r]\n\t"
  8399. #endif
  8400. "uxth r7, %[b]\n\t"
  8401. #ifdef WOLFSSL_KEIL
  8402. "muls r6, r7, r6\n\t"
  8403. #elif defined(__clang__)
  8404. "muls r6, r7\n\t"
  8405. #else
  8406. "mul r6, r7\n\t"
  8407. #endif
  8408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8409. "lsrs r7, r6, #16\n\t"
  8410. #else
  8411. "lsr r7, r6, #16\n\t"
  8412. #endif
  8413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8414. "lsls r6, r6, #16\n\t"
  8415. #else
  8416. "lsl r6, r6, #16\n\t"
  8417. #endif
  8418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8419. "adds r5, r5, r6\n\t"
  8420. #else
  8421. "add r5, r5, r6\n\t"
  8422. #endif
  8423. #ifdef WOLFSSL_KEIL
  8424. "adcs r3, r3, r7\n\t"
  8425. #elif defined(__clang__)
  8426. "adcs r3, r7\n\t"
  8427. #else
  8428. "adc r3, r7\n\t"
  8429. #endif
  8430. #ifdef WOLFSSL_KEIL
  8431. "adcs r4, r4, %[r]\n\t"
  8432. #elif defined(__clang__)
  8433. "adcs r4, %[r]\n\t"
  8434. #else
  8435. "adc r4, %[r]\n\t"
  8436. #endif
  8437. "# A[7] * B[4]\n\t"
  8438. "mov %[a], r9\n\t"
  8439. "mov %[b], r10\n\t"
  8440. "ldr %[a], [%[a], #28]\n\t"
  8441. "ldr %[b], [%[b], #16]\n\t"
  8442. "uxth r6, %[a]\n\t"
  8443. "uxth r7, %[b]\n\t"
  8444. #ifdef WOLFSSL_KEIL
  8445. "muls r7, r6, r7\n\t"
  8446. #elif defined(__clang__)
  8447. "muls r7, r6\n\t"
  8448. #else
  8449. "mul r7, r6\n\t"
  8450. #endif
  8451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8452. "adds r5, r5, r7\n\t"
  8453. #else
  8454. "add r5, r5, r7\n\t"
  8455. #endif
  8456. #ifdef WOLFSSL_KEIL
  8457. "adcs r3, r3, %[r]\n\t"
  8458. #elif defined(__clang__)
  8459. "adcs r3, %[r]\n\t"
  8460. #else
  8461. "adc r3, %[r]\n\t"
  8462. #endif
  8463. #ifdef WOLFSSL_KEIL
  8464. "adcs r4, r4, %[r]\n\t"
  8465. #elif defined(__clang__)
  8466. "adcs r4, %[r]\n\t"
  8467. #else
  8468. "adc r4, %[r]\n\t"
  8469. #endif
  8470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8471. "lsrs r7, %[b], #16\n\t"
  8472. #else
  8473. "lsr r7, %[b], #16\n\t"
  8474. #endif
  8475. #ifdef WOLFSSL_KEIL
  8476. "muls r6, r7, r6\n\t"
  8477. #elif defined(__clang__)
  8478. "muls r6, r7\n\t"
  8479. #else
  8480. "mul r6, r7\n\t"
  8481. #endif
  8482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8483. "lsrs r7, r6, #16\n\t"
  8484. #else
  8485. "lsr r7, r6, #16\n\t"
  8486. #endif
  8487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8488. "lsls r6, r6, #16\n\t"
  8489. #else
  8490. "lsl r6, r6, #16\n\t"
  8491. #endif
  8492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8493. "adds r5, r5, r6\n\t"
  8494. #else
  8495. "add r5, r5, r6\n\t"
  8496. #endif
  8497. #ifdef WOLFSSL_KEIL
  8498. "adcs r3, r3, r7\n\t"
  8499. #elif defined(__clang__)
  8500. "adcs r3, r7\n\t"
  8501. #else
  8502. "adc r3, r7\n\t"
  8503. #endif
  8504. #ifdef WOLFSSL_KEIL
  8505. "adcs r4, r4, %[r]\n\t"
  8506. #elif defined(__clang__)
  8507. "adcs r4, %[r]\n\t"
  8508. #else
  8509. "adc r4, %[r]\n\t"
  8510. #endif
  8511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8512. "lsrs r6, %[a], #16\n\t"
  8513. #else
  8514. "lsr r6, %[a], #16\n\t"
  8515. #endif
  8516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8517. "lsrs r7, %[b], #16\n\t"
  8518. #else
  8519. "lsr r7, %[b], #16\n\t"
  8520. #endif
  8521. #ifdef WOLFSSL_KEIL
  8522. "muls r7, r6, r7\n\t"
  8523. #elif defined(__clang__)
  8524. "muls r7, r6\n\t"
  8525. #else
  8526. "mul r7, r6\n\t"
  8527. #endif
  8528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8529. "adds r3, r3, r7\n\t"
  8530. #else
  8531. "add r3, r3, r7\n\t"
  8532. #endif
  8533. #ifdef WOLFSSL_KEIL
  8534. "adcs r4, r4, %[r]\n\t"
  8535. #elif defined(__clang__)
  8536. "adcs r4, %[r]\n\t"
  8537. #else
  8538. "adc r4, %[r]\n\t"
  8539. #endif
  8540. "uxth r7, %[b]\n\t"
  8541. #ifdef WOLFSSL_KEIL
  8542. "muls r6, r7, r6\n\t"
  8543. #elif defined(__clang__)
  8544. "muls r6, r7\n\t"
  8545. #else
  8546. "mul r6, r7\n\t"
  8547. #endif
  8548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8549. "lsrs r7, r6, #16\n\t"
  8550. #else
  8551. "lsr r7, r6, #16\n\t"
  8552. #endif
  8553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8554. "lsls r6, r6, #16\n\t"
  8555. #else
  8556. "lsl r6, r6, #16\n\t"
  8557. #endif
  8558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8559. "adds r5, r5, r6\n\t"
  8560. #else
  8561. "add r5, r5, r6\n\t"
  8562. #endif
  8563. #ifdef WOLFSSL_KEIL
  8564. "adcs r3, r3, r7\n\t"
  8565. #elif defined(__clang__)
  8566. "adcs r3, r7\n\t"
  8567. #else
  8568. "adc r3, r7\n\t"
  8569. #endif
  8570. #ifdef WOLFSSL_KEIL
  8571. "adcs r4, r4, %[r]\n\t"
  8572. #elif defined(__clang__)
  8573. "adcs r4, %[r]\n\t"
  8574. #else
  8575. "adc r4, %[r]\n\t"
  8576. #endif
  8577. "mov %[r], r8\n\t"
  8578. "str r5, [%[r], #44]\n\t"
  8579. "movs %[r], #0\n\t"
  8580. "# A[7] * B[5]\n\t"
  8581. "movs r5, #0\n\t"
  8582. "mov %[a], r9\n\t"
  8583. "mov %[b], r10\n\t"
  8584. "ldr %[a], [%[a], #28]\n\t"
  8585. "ldr %[b], [%[b], #20]\n\t"
  8586. "uxth r6, %[a]\n\t"
  8587. "uxth r7, %[b]\n\t"
  8588. #ifdef WOLFSSL_KEIL
  8589. "muls r7, r6, r7\n\t"
  8590. #elif defined(__clang__)
  8591. "muls r7, r6\n\t"
  8592. #else
  8593. "mul r7, r6\n\t"
  8594. #endif
  8595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8596. "adds r3, r3, r7\n\t"
  8597. #else
  8598. "add r3, r3, r7\n\t"
  8599. #endif
  8600. #ifdef WOLFSSL_KEIL
  8601. "adcs r4, r4, %[r]\n\t"
  8602. #elif defined(__clang__)
  8603. "adcs r4, %[r]\n\t"
  8604. #else
  8605. "adc r4, %[r]\n\t"
  8606. #endif
  8607. #ifdef WOLFSSL_KEIL
  8608. "adcs r5, r5, %[r]\n\t"
  8609. #elif defined(__clang__)
  8610. "adcs r5, %[r]\n\t"
  8611. #else
  8612. "adc r5, %[r]\n\t"
  8613. #endif
  8614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8615. "lsrs r7, %[b], #16\n\t"
  8616. #else
  8617. "lsr r7, %[b], #16\n\t"
  8618. #endif
  8619. #ifdef WOLFSSL_KEIL
  8620. "muls r6, r7, r6\n\t"
  8621. #elif defined(__clang__)
  8622. "muls r6, r7\n\t"
  8623. #else
  8624. "mul r6, r7\n\t"
  8625. #endif
  8626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8627. "lsrs r7, r6, #16\n\t"
  8628. #else
  8629. "lsr r7, r6, #16\n\t"
  8630. #endif
  8631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8632. "lsls r6, r6, #16\n\t"
  8633. #else
  8634. "lsl r6, r6, #16\n\t"
  8635. #endif
  8636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8637. "adds r3, r3, r6\n\t"
  8638. #else
  8639. "add r3, r3, r6\n\t"
  8640. #endif
  8641. #ifdef WOLFSSL_KEIL
  8642. "adcs r4, r4, r7\n\t"
  8643. #elif defined(__clang__)
  8644. "adcs r4, r7\n\t"
  8645. #else
  8646. "adc r4, r7\n\t"
  8647. #endif
  8648. #ifdef WOLFSSL_KEIL
  8649. "adcs r5, r5, %[r]\n\t"
  8650. #elif defined(__clang__)
  8651. "adcs r5, %[r]\n\t"
  8652. #else
  8653. "adc r5, %[r]\n\t"
  8654. #endif
  8655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8656. "lsrs r6, %[a], #16\n\t"
  8657. #else
  8658. "lsr r6, %[a], #16\n\t"
  8659. #endif
  8660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8661. "lsrs r7, %[b], #16\n\t"
  8662. #else
  8663. "lsr r7, %[b], #16\n\t"
  8664. #endif
  8665. #ifdef WOLFSSL_KEIL
  8666. "muls r7, r6, r7\n\t"
  8667. #elif defined(__clang__)
  8668. "muls r7, r6\n\t"
  8669. #else
  8670. "mul r7, r6\n\t"
  8671. #endif
  8672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8673. "adds r4, r4, r7\n\t"
  8674. #else
  8675. "add r4, r4, r7\n\t"
  8676. #endif
  8677. #ifdef WOLFSSL_KEIL
  8678. "adcs r5, r5, %[r]\n\t"
  8679. #elif defined(__clang__)
  8680. "adcs r5, %[r]\n\t"
  8681. #else
  8682. "adc r5, %[r]\n\t"
  8683. #endif
  8684. "uxth r7, %[b]\n\t"
  8685. #ifdef WOLFSSL_KEIL
  8686. "muls r6, r7, r6\n\t"
  8687. #elif defined(__clang__)
  8688. "muls r6, r7\n\t"
  8689. #else
  8690. "mul r6, r7\n\t"
  8691. #endif
  8692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8693. "lsrs r7, r6, #16\n\t"
  8694. #else
  8695. "lsr r7, r6, #16\n\t"
  8696. #endif
  8697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8698. "lsls r6, r6, #16\n\t"
  8699. #else
  8700. "lsl r6, r6, #16\n\t"
  8701. #endif
  8702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8703. "adds r3, r3, r6\n\t"
  8704. #else
  8705. "add r3, r3, r6\n\t"
  8706. #endif
  8707. #ifdef WOLFSSL_KEIL
  8708. "adcs r4, r4, r7\n\t"
  8709. #elif defined(__clang__)
  8710. "adcs r4, r7\n\t"
  8711. #else
  8712. "adc r4, r7\n\t"
  8713. #endif
  8714. #ifdef WOLFSSL_KEIL
  8715. "adcs r5, r5, %[r]\n\t"
  8716. #elif defined(__clang__)
  8717. "adcs r5, %[r]\n\t"
  8718. #else
  8719. "adc r5, %[r]\n\t"
  8720. #endif
  8721. "# A[6] * B[6]\n\t"
  8722. "mov %[a], r9\n\t"
  8723. "mov %[b], r10\n\t"
  8724. "ldr %[a], [%[a], #24]\n\t"
  8725. "ldr %[b], [%[b], #24]\n\t"
  8726. "uxth r6, %[a]\n\t"
  8727. "uxth r7, %[b]\n\t"
  8728. #ifdef WOLFSSL_KEIL
  8729. "muls r7, r6, r7\n\t"
  8730. #elif defined(__clang__)
  8731. "muls r7, r6\n\t"
  8732. #else
  8733. "mul r7, r6\n\t"
  8734. #endif
  8735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8736. "adds r3, r3, r7\n\t"
  8737. #else
  8738. "add r3, r3, r7\n\t"
  8739. #endif
  8740. #ifdef WOLFSSL_KEIL
  8741. "adcs r4, r4, %[r]\n\t"
  8742. #elif defined(__clang__)
  8743. "adcs r4, %[r]\n\t"
  8744. #else
  8745. "adc r4, %[r]\n\t"
  8746. #endif
  8747. #ifdef WOLFSSL_KEIL
  8748. "adcs r5, r5, %[r]\n\t"
  8749. #elif defined(__clang__)
  8750. "adcs r5, %[r]\n\t"
  8751. #else
  8752. "adc r5, %[r]\n\t"
  8753. #endif
  8754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8755. "lsrs r7, %[b], #16\n\t"
  8756. #else
  8757. "lsr r7, %[b], #16\n\t"
  8758. #endif
  8759. #ifdef WOLFSSL_KEIL
  8760. "muls r6, r7, r6\n\t"
  8761. #elif defined(__clang__)
  8762. "muls r6, r7\n\t"
  8763. #else
  8764. "mul r6, r7\n\t"
  8765. #endif
  8766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8767. "lsrs r7, r6, #16\n\t"
  8768. #else
  8769. "lsr r7, r6, #16\n\t"
  8770. #endif
  8771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8772. "lsls r6, r6, #16\n\t"
  8773. #else
  8774. "lsl r6, r6, #16\n\t"
  8775. #endif
  8776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8777. "adds r3, r3, r6\n\t"
  8778. #else
  8779. "add r3, r3, r6\n\t"
  8780. #endif
  8781. #ifdef WOLFSSL_KEIL
  8782. "adcs r4, r4, r7\n\t"
  8783. #elif defined(__clang__)
  8784. "adcs r4, r7\n\t"
  8785. #else
  8786. "adc r4, r7\n\t"
  8787. #endif
  8788. #ifdef WOLFSSL_KEIL
  8789. "adcs r5, r5, %[r]\n\t"
  8790. #elif defined(__clang__)
  8791. "adcs r5, %[r]\n\t"
  8792. #else
  8793. "adc r5, %[r]\n\t"
  8794. #endif
  8795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8796. "lsrs r6, %[a], #16\n\t"
  8797. #else
  8798. "lsr r6, %[a], #16\n\t"
  8799. #endif
  8800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8801. "lsrs r7, %[b], #16\n\t"
  8802. #else
  8803. "lsr r7, %[b], #16\n\t"
  8804. #endif
  8805. #ifdef WOLFSSL_KEIL
  8806. "muls r7, r6, r7\n\t"
  8807. #elif defined(__clang__)
  8808. "muls r7, r6\n\t"
  8809. #else
  8810. "mul r7, r6\n\t"
  8811. #endif
  8812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8813. "adds r4, r4, r7\n\t"
  8814. #else
  8815. "add r4, r4, r7\n\t"
  8816. #endif
  8817. #ifdef WOLFSSL_KEIL
  8818. "adcs r5, r5, %[r]\n\t"
  8819. #elif defined(__clang__)
  8820. "adcs r5, %[r]\n\t"
  8821. #else
  8822. "adc r5, %[r]\n\t"
  8823. #endif
  8824. "uxth r7, %[b]\n\t"
  8825. #ifdef WOLFSSL_KEIL
  8826. "muls r6, r7, r6\n\t"
  8827. #elif defined(__clang__)
  8828. "muls r6, r7\n\t"
  8829. #else
  8830. "mul r6, r7\n\t"
  8831. #endif
  8832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8833. "lsrs r7, r6, #16\n\t"
  8834. #else
  8835. "lsr r7, r6, #16\n\t"
  8836. #endif
  8837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8838. "lsls r6, r6, #16\n\t"
  8839. #else
  8840. "lsl r6, r6, #16\n\t"
  8841. #endif
  8842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8843. "adds r3, r3, r6\n\t"
  8844. #else
  8845. "add r3, r3, r6\n\t"
  8846. #endif
  8847. #ifdef WOLFSSL_KEIL
  8848. "adcs r4, r4, r7\n\t"
  8849. #elif defined(__clang__)
  8850. "adcs r4, r7\n\t"
  8851. #else
  8852. "adc r4, r7\n\t"
  8853. #endif
  8854. #ifdef WOLFSSL_KEIL
  8855. "adcs r5, r5, %[r]\n\t"
  8856. #elif defined(__clang__)
  8857. "adcs r5, %[r]\n\t"
  8858. #else
  8859. "adc r5, %[r]\n\t"
  8860. #endif
  8861. "# A[5] * B[7]\n\t"
  8862. "mov %[a], r9\n\t"
  8863. "mov %[b], r10\n\t"
  8864. "ldr %[a], [%[a], #20]\n\t"
  8865. "ldr %[b], [%[b], #28]\n\t"
  8866. "uxth r6, %[a]\n\t"
  8867. "uxth r7, %[b]\n\t"
  8868. #ifdef WOLFSSL_KEIL
  8869. "muls r7, r6, r7\n\t"
  8870. #elif defined(__clang__)
  8871. "muls r7, r6\n\t"
  8872. #else
  8873. "mul r7, r6\n\t"
  8874. #endif
  8875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8876. "adds r3, r3, r7\n\t"
  8877. #else
  8878. "add r3, r3, r7\n\t"
  8879. #endif
  8880. #ifdef WOLFSSL_KEIL
  8881. "adcs r4, r4, %[r]\n\t"
  8882. #elif defined(__clang__)
  8883. "adcs r4, %[r]\n\t"
  8884. #else
  8885. "adc r4, %[r]\n\t"
  8886. #endif
  8887. #ifdef WOLFSSL_KEIL
  8888. "adcs r5, r5, %[r]\n\t"
  8889. #elif defined(__clang__)
  8890. "adcs r5, %[r]\n\t"
  8891. #else
  8892. "adc r5, %[r]\n\t"
  8893. #endif
  8894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8895. "lsrs r7, %[b], #16\n\t"
  8896. #else
  8897. "lsr r7, %[b], #16\n\t"
  8898. #endif
  8899. #ifdef WOLFSSL_KEIL
  8900. "muls r6, r7, r6\n\t"
  8901. #elif defined(__clang__)
  8902. "muls r6, r7\n\t"
  8903. #else
  8904. "mul r6, r7\n\t"
  8905. #endif
  8906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8907. "lsrs r7, r6, #16\n\t"
  8908. #else
  8909. "lsr r7, r6, #16\n\t"
  8910. #endif
  8911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8912. "lsls r6, r6, #16\n\t"
  8913. #else
  8914. "lsl r6, r6, #16\n\t"
  8915. #endif
  8916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8917. "adds r3, r3, r6\n\t"
  8918. #else
  8919. "add r3, r3, r6\n\t"
  8920. #endif
  8921. #ifdef WOLFSSL_KEIL
  8922. "adcs r4, r4, r7\n\t"
  8923. #elif defined(__clang__)
  8924. "adcs r4, r7\n\t"
  8925. #else
  8926. "adc r4, r7\n\t"
  8927. #endif
  8928. #ifdef WOLFSSL_KEIL
  8929. "adcs r5, r5, %[r]\n\t"
  8930. #elif defined(__clang__)
  8931. "adcs r5, %[r]\n\t"
  8932. #else
  8933. "adc r5, %[r]\n\t"
  8934. #endif
  8935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8936. "lsrs r6, %[a], #16\n\t"
  8937. #else
  8938. "lsr r6, %[a], #16\n\t"
  8939. #endif
  8940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8941. "lsrs r7, %[b], #16\n\t"
  8942. #else
  8943. "lsr r7, %[b], #16\n\t"
  8944. #endif
  8945. #ifdef WOLFSSL_KEIL
  8946. "muls r7, r6, r7\n\t"
  8947. #elif defined(__clang__)
  8948. "muls r7, r6\n\t"
  8949. #else
  8950. "mul r7, r6\n\t"
  8951. #endif
  8952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8953. "adds r4, r4, r7\n\t"
  8954. #else
  8955. "add r4, r4, r7\n\t"
  8956. #endif
  8957. #ifdef WOLFSSL_KEIL
  8958. "adcs r5, r5, %[r]\n\t"
  8959. #elif defined(__clang__)
  8960. "adcs r5, %[r]\n\t"
  8961. #else
  8962. "adc r5, %[r]\n\t"
  8963. #endif
  8964. "uxth r7, %[b]\n\t"
  8965. #ifdef WOLFSSL_KEIL
  8966. "muls r6, r7, r6\n\t"
  8967. #elif defined(__clang__)
  8968. "muls r6, r7\n\t"
  8969. #else
  8970. "mul r6, r7\n\t"
  8971. #endif
  8972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8973. "lsrs r7, r6, #16\n\t"
  8974. #else
  8975. "lsr r7, r6, #16\n\t"
  8976. #endif
  8977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8978. "lsls r6, r6, #16\n\t"
  8979. #else
  8980. "lsl r6, r6, #16\n\t"
  8981. #endif
  8982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8983. "adds r3, r3, r6\n\t"
  8984. #else
  8985. "add r3, r3, r6\n\t"
  8986. #endif
  8987. #ifdef WOLFSSL_KEIL
  8988. "adcs r4, r4, r7\n\t"
  8989. #elif defined(__clang__)
  8990. "adcs r4, r7\n\t"
  8991. #else
  8992. "adc r4, r7\n\t"
  8993. #endif
  8994. #ifdef WOLFSSL_KEIL
  8995. "adcs r5, r5, %[r]\n\t"
  8996. #elif defined(__clang__)
  8997. "adcs r5, %[r]\n\t"
  8998. #else
  8999. "adc r5, %[r]\n\t"
  9000. #endif
  9001. "mov %[r], r8\n\t"
  9002. "str r3, [%[r], #48]\n\t"
  9003. "movs %[r], #0\n\t"
  9004. "# A[6] * B[7]\n\t"
  9005. "movs r3, #0\n\t"
  9006. "mov %[a], r9\n\t"
  9007. "mov %[b], r10\n\t"
  9008. "ldr %[a], [%[a], #24]\n\t"
  9009. "ldr %[b], [%[b], #28]\n\t"
  9010. "uxth r6, %[a]\n\t"
  9011. "uxth r7, %[b]\n\t"
  9012. #ifdef WOLFSSL_KEIL
  9013. "muls r7, r6, r7\n\t"
  9014. #elif defined(__clang__)
  9015. "muls r7, r6\n\t"
  9016. #else
  9017. "mul r7, r6\n\t"
  9018. #endif
  9019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9020. "adds r4, r4, r7\n\t"
  9021. #else
  9022. "add r4, r4, r7\n\t"
  9023. #endif
  9024. #ifdef WOLFSSL_KEIL
  9025. "adcs r5, r5, %[r]\n\t"
  9026. #elif defined(__clang__)
  9027. "adcs r5, %[r]\n\t"
  9028. #else
  9029. "adc r5, %[r]\n\t"
  9030. #endif
  9031. #ifdef WOLFSSL_KEIL
  9032. "adcs r3, r3, %[r]\n\t"
  9033. #elif defined(__clang__)
  9034. "adcs r3, %[r]\n\t"
  9035. #else
  9036. "adc r3, %[r]\n\t"
  9037. #endif
  9038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9039. "lsrs r7, %[b], #16\n\t"
  9040. #else
  9041. "lsr r7, %[b], #16\n\t"
  9042. #endif
  9043. #ifdef WOLFSSL_KEIL
  9044. "muls r6, r7, r6\n\t"
  9045. #elif defined(__clang__)
  9046. "muls r6, r7\n\t"
  9047. #else
  9048. "mul r6, r7\n\t"
  9049. #endif
  9050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9051. "lsrs r7, r6, #16\n\t"
  9052. #else
  9053. "lsr r7, r6, #16\n\t"
  9054. #endif
  9055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9056. "lsls r6, r6, #16\n\t"
  9057. #else
  9058. "lsl r6, r6, #16\n\t"
  9059. #endif
  9060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9061. "adds r4, r4, r6\n\t"
  9062. #else
  9063. "add r4, r4, r6\n\t"
  9064. #endif
  9065. #ifdef WOLFSSL_KEIL
  9066. "adcs r5, r5, r7\n\t"
  9067. #elif defined(__clang__)
  9068. "adcs r5, r7\n\t"
  9069. #else
  9070. "adc r5, r7\n\t"
  9071. #endif
  9072. #ifdef WOLFSSL_KEIL
  9073. "adcs r3, r3, %[r]\n\t"
  9074. #elif defined(__clang__)
  9075. "adcs r3, %[r]\n\t"
  9076. #else
  9077. "adc r3, %[r]\n\t"
  9078. #endif
  9079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9080. "lsrs r6, %[a], #16\n\t"
  9081. #else
  9082. "lsr r6, %[a], #16\n\t"
  9083. #endif
  9084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9085. "lsrs r7, %[b], #16\n\t"
  9086. #else
  9087. "lsr r7, %[b], #16\n\t"
  9088. #endif
  9089. #ifdef WOLFSSL_KEIL
  9090. "muls r7, r6, r7\n\t"
  9091. #elif defined(__clang__)
  9092. "muls r7, r6\n\t"
  9093. #else
  9094. "mul r7, r6\n\t"
  9095. #endif
  9096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9097. "adds r5, r5, r7\n\t"
  9098. #else
  9099. "add r5, r5, r7\n\t"
  9100. #endif
  9101. #ifdef WOLFSSL_KEIL
  9102. "adcs r3, r3, %[r]\n\t"
  9103. #elif defined(__clang__)
  9104. "adcs r3, %[r]\n\t"
  9105. #else
  9106. "adc r3, %[r]\n\t"
  9107. #endif
  9108. "uxth r7, %[b]\n\t"
  9109. #ifdef WOLFSSL_KEIL
  9110. "muls r6, r7, r6\n\t"
  9111. #elif defined(__clang__)
  9112. "muls r6, r7\n\t"
  9113. #else
  9114. "mul r6, r7\n\t"
  9115. #endif
  9116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9117. "lsrs r7, r6, #16\n\t"
  9118. #else
  9119. "lsr r7, r6, #16\n\t"
  9120. #endif
  9121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9122. "lsls r6, r6, #16\n\t"
  9123. #else
  9124. "lsl r6, r6, #16\n\t"
  9125. #endif
  9126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9127. "adds r4, r4, r6\n\t"
  9128. #else
  9129. "add r4, r4, r6\n\t"
  9130. #endif
  9131. #ifdef WOLFSSL_KEIL
  9132. "adcs r5, r5, r7\n\t"
  9133. #elif defined(__clang__)
  9134. "adcs r5, r7\n\t"
  9135. #else
  9136. "adc r5, r7\n\t"
  9137. #endif
  9138. #ifdef WOLFSSL_KEIL
  9139. "adcs r3, r3, %[r]\n\t"
  9140. #elif defined(__clang__)
  9141. "adcs r3, %[r]\n\t"
  9142. #else
  9143. "adc r3, %[r]\n\t"
  9144. #endif
  9145. "# A[7] * B[6]\n\t"
  9146. "mov %[a], r9\n\t"
  9147. "mov %[b], r10\n\t"
  9148. "ldr %[a], [%[a], #28]\n\t"
  9149. "ldr %[b], [%[b], #24]\n\t"
  9150. "uxth r6, %[a]\n\t"
  9151. "uxth r7, %[b]\n\t"
  9152. #ifdef WOLFSSL_KEIL
  9153. "muls r7, r6, r7\n\t"
  9154. #elif defined(__clang__)
  9155. "muls r7, r6\n\t"
  9156. #else
  9157. "mul r7, r6\n\t"
  9158. #endif
  9159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9160. "adds r4, r4, r7\n\t"
  9161. #else
  9162. "add r4, r4, r7\n\t"
  9163. #endif
  9164. #ifdef WOLFSSL_KEIL
  9165. "adcs r5, r5, %[r]\n\t"
  9166. #elif defined(__clang__)
  9167. "adcs r5, %[r]\n\t"
  9168. #else
  9169. "adc r5, %[r]\n\t"
  9170. #endif
  9171. #ifdef WOLFSSL_KEIL
  9172. "adcs r3, r3, %[r]\n\t"
  9173. #elif defined(__clang__)
  9174. "adcs r3, %[r]\n\t"
  9175. #else
  9176. "adc r3, %[r]\n\t"
  9177. #endif
  9178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9179. "lsrs r7, %[b], #16\n\t"
  9180. #else
  9181. "lsr r7, %[b], #16\n\t"
  9182. #endif
  9183. #ifdef WOLFSSL_KEIL
  9184. "muls r6, r7, r6\n\t"
  9185. #elif defined(__clang__)
  9186. "muls r6, r7\n\t"
  9187. #else
  9188. "mul r6, r7\n\t"
  9189. #endif
  9190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9191. "lsrs r7, r6, #16\n\t"
  9192. #else
  9193. "lsr r7, r6, #16\n\t"
  9194. #endif
  9195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9196. "lsls r6, r6, #16\n\t"
  9197. #else
  9198. "lsl r6, r6, #16\n\t"
  9199. #endif
  9200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9201. "adds r4, r4, r6\n\t"
  9202. #else
  9203. "add r4, r4, r6\n\t"
  9204. #endif
  9205. #ifdef WOLFSSL_KEIL
  9206. "adcs r5, r5, r7\n\t"
  9207. #elif defined(__clang__)
  9208. "adcs r5, r7\n\t"
  9209. #else
  9210. "adc r5, r7\n\t"
  9211. #endif
  9212. #ifdef WOLFSSL_KEIL
  9213. "adcs r3, r3, %[r]\n\t"
  9214. #elif defined(__clang__)
  9215. "adcs r3, %[r]\n\t"
  9216. #else
  9217. "adc r3, %[r]\n\t"
  9218. #endif
  9219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9220. "lsrs r6, %[a], #16\n\t"
  9221. #else
  9222. "lsr r6, %[a], #16\n\t"
  9223. #endif
  9224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9225. "lsrs r7, %[b], #16\n\t"
  9226. #else
  9227. "lsr r7, %[b], #16\n\t"
  9228. #endif
  9229. #ifdef WOLFSSL_KEIL
  9230. "muls r7, r6, r7\n\t"
  9231. #elif defined(__clang__)
  9232. "muls r7, r6\n\t"
  9233. #else
  9234. "mul r7, r6\n\t"
  9235. #endif
  9236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9237. "adds r5, r5, r7\n\t"
  9238. #else
  9239. "add r5, r5, r7\n\t"
  9240. #endif
  9241. #ifdef WOLFSSL_KEIL
  9242. "adcs r3, r3, %[r]\n\t"
  9243. #elif defined(__clang__)
  9244. "adcs r3, %[r]\n\t"
  9245. #else
  9246. "adc r3, %[r]\n\t"
  9247. #endif
  9248. "uxth r7, %[b]\n\t"
  9249. #ifdef WOLFSSL_KEIL
  9250. "muls r6, r7, r6\n\t"
  9251. #elif defined(__clang__)
  9252. "muls r6, r7\n\t"
  9253. #else
  9254. "mul r6, r7\n\t"
  9255. #endif
  9256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9257. "lsrs r7, r6, #16\n\t"
  9258. #else
  9259. "lsr r7, r6, #16\n\t"
  9260. #endif
  9261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9262. "lsls r6, r6, #16\n\t"
  9263. #else
  9264. "lsl r6, r6, #16\n\t"
  9265. #endif
  9266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9267. "adds r4, r4, r6\n\t"
  9268. #else
  9269. "add r4, r4, r6\n\t"
  9270. #endif
  9271. #ifdef WOLFSSL_KEIL
  9272. "adcs r5, r5, r7\n\t"
  9273. #elif defined(__clang__)
  9274. "adcs r5, r7\n\t"
  9275. #else
  9276. "adc r5, r7\n\t"
  9277. #endif
  9278. #ifdef WOLFSSL_KEIL
  9279. "adcs r3, r3, %[r]\n\t"
  9280. #elif defined(__clang__)
  9281. "adcs r3, %[r]\n\t"
  9282. #else
  9283. "adc r3, %[r]\n\t"
  9284. #endif
  9285. "mov %[r], r8\n\t"
  9286. "str r4, [%[r], #52]\n\t"
  9287. "movs %[r], #0\n\t"
  9288. "# A[7] * B[7]\n\t"
  9289. "mov %[a], r9\n\t"
  9290. "mov %[b], r10\n\t"
  9291. "ldr %[a], [%[a], #28]\n\t"
  9292. "ldr %[b], [%[b], #28]\n\t"
  9293. "uxth r6, %[a]\n\t"
  9294. "uxth r7, %[b]\n\t"
  9295. #ifdef WOLFSSL_KEIL
  9296. "muls r7, r6, r7\n\t"
  9297. #elif defined(__clang__)
  9298. "muls r7, r6\n\t"
  9299. #else
  9300. "mul r7, r6\n\t"
  9301. #endif
  9302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9303. "adds r5, r5, r7\n\t"
  9304. #else
  9305. "add r5, r5, r7\n\t"
  9306. #endif
  9307. #ifdef WOLFSSL_KEIL
  9308. "adcs r3, r3, %[r]\n\t"
  9309. #elif defined(__clang__)
  9310. "adcs r3, %[r]\n\t"
  9311. #else
  9312. "adc r3, %[r]\n\t"
  9313. #endif
  9314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9315. "lsrs r7, %[b], #16\n\t"
  9316. #else
  9317. "lsr r7, %[b], #16\n\t"
  9318. #endif
  9319. #ifdef WOLFSSL_KEIL
  9320. "muls r6, r7, r6\n\t"
  9321. #elif defined(__clang__)
  9322. "muls r6, r7\n\t"
  9323. #else
  9324. "mul r6, r7\n\t"
  9325. #endif
  9326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9327. "lsrs r7, r6, #16\n\t"
  9328. #else
  9329. "lsr r7, r6, #16\n\t"
  9330. #endif
  9331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9332. "lsls r6, r6, #16\n\t"
  9333. #else
  9334. "lsl r6, r6, #16\n\t"
  9335. #endif
  9336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9337. "adds r5, r5, r6\n\t"
  9338. #else
  9339. "add r5, r5, r6\n\t"
  9340. #endif
  9341. #ifdef WOLFSSL_KEIL
  9342. "adcs r3, r3, r7\n\t"
  9343. #elif defined(__clang__)
  9344. "adcs r3, r7\n\t"
  9345. #else
  9346. "adc r3, r7\n\t"
  9347. #endif
  9348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9349. "lsrs r6, %[a], #16\n\t"
  9350. #else
  9351. "lsr r6, %[a], #16\n\t"
  9352. #endif
  9353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9354. "lsrs r7, %[b], #16\n\t"
  9355. #else
  9356. "lsr r7, %[b], #16\n\t"
  9357. #endif
  9358. #ifdef WOLFSSL_KEIL
  9359. "muls r7, r6, r7\n\t"
  9360. #elif defined(__clang__)
  9361. "muls r7, r6\n\t"
  9362. #else
  9363. "mul r7, r6\n\t"
  9364. #endif
  9365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9366. "adds r3, r3, r7\n\t"
  9367. #else
  9368. "add r3, r3, r7\n\t"
  9369. #endif
  9370. "uxth r7, %[b]\n\t"
  9371. #ifdef WOLFSSL_KEIL
  9372. "muls r6, r7, r6\n\t"
  9373. #elif defined(__clang__)
  9374. "muls r6, r7\n\t"
  9375. #else
  9376. "mul r6, r7\n\t"
  9377. #endif
  9378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9379. "lsrs r7, r6, #16\n\t"
  9380. #else
  9381. "lsr r7, r6, #16\n\t"
  9382. #endif
  9383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9384. "lsls r6, r6, #16\n\t"
  9385. #else
  9386. "lsl r6, r6, #16\n\t"
  9387. #endif
  9388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9389. "adds r5, r5, r6\n\t"
  9390. #else
  9391. "add r5, r5, r6\n\t"
  9392. #endif
  9393. #ifdef WOLFSSL_KEIL
  9394. "adcs r3, r3, r7\n\t"
  9395. #elif defined(__clang__)
  9396. "adcs r3, r7\n\t"
  9397. #else
  9398. "adc r3, r7\n\t"
  9399. #endif
  9400. "mov %[r], r8\n\t"
  9401. "str r5, [%[r], #56]\n\t"
  9402. "str r3, [%[r], #60]\n\t"
  9403. "pop {r3, r4, r5, r6}\n\t"
  9404. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  9405. "pop {r3, r4, r5, r6}\n\t"
  9406. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  9407. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  9408. :
  9409. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  9410. );
  9411. }
  9412. #endif /* !WOLFSSL_SP_LARGE_CODE */
  9413. #ifndef WOLFSSL_SP_LARGE_CODE
  9414. /* Square a and put result in r. (r = a * a)
  9415. *
  9416. * r A single precision integer.
  9417. * a A single precision integer.
  9418. */
  9419. SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a)
  9420. {
  9421. __asm__ __volatile__ (
  9422. "movs r3, #0\n\t"
  9423. "movs r4, #0\n\t"
  9424. "movs r5, #0\n\t"
  9425. "mov r8, r3\n\t"
  9426. "mov r11, %[r]\n\t"
  9427. "movs r6, #0x40\n\t"
  9428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9429. "negs r6, r6\n\t"
  9430. #else
  9431. "neg r6, r6\n\t"
  9432. #endif
  9433. "add sp, sp, r6\n\t"
  9434. "mov r10, sp\n\t"
  9435. "mov r9, %[a]\n\t"
  9436. "\n"
  9437. "L_sp_2048_sqr_8_words_%=:\n\t"
  9438. "movs %[r], #0\n\t"
  9439. "movs r6, #28\n\t"
  9440. "mov %[a], r8\n\t"
  9441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9442. "subs %[a], %[a], r6\n\t"
  9443. #else
  9444. "sub %[a], %[a], r6\n\t"
  9445. #endif
  9446. #ifdef WOLFSSL_KEIL
  9447. "sbcs r6, r6, r6\n\t"
  9448. #elif defined(__clang__)
  9449. "sbcs r6, r6\n\t"
  9450. #else
  9451. "sbc r6, r6\n\t"
  9452. #endif
  9453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9454. "mvns r6, r6\n\t"
  9455. #else
  9456. "mvn r6, r6\n\t"
  9457. #endif
  9458. #ifdef WOLFSSL_KEIL
  9459. "ands %[a], %[a], r6\n\t"
  9460. #elif defined(__clang__)
  9461. "ands %[a], r6\n\t"
  9462. #else
  9463. "and %[a], r6\n\t"
  9464. #endif
  9465. "mov r2, r8\n\t"
  9466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9467. "subs r2, r2, %[a]\n\t"
  9468. #else
  9469. "sub r2, r2, %[a]\n\t"
  9470. #endif
  9471. "add %[a], %[a], r9\n\t"
  9472. "add r2, r2, r9\n\t"
  9473. "\n"
  9474. "L_sp_2048_sqr_8_mul_%=:\n\t"
  9475. "cmp r2, %[a]\n\t"
  9476. "beq L_sp_2048_sqr_8_sqr_%=\n\t"
  9477. "# Multiply * 2: Start\n\t"
  9478. "ldrh r6, [%[a]]\n\t"
  9479. "ldrh r7, [r2]\n\t"
  9480. #ifdef WOLFSSL_KEIL
  9481. "muls r7, r6, r7\n\t"
  9482. #elif defined(__clang__)
  9483. "muls r7, r6\n\t"
  9484. #else
  9485. "mul r7, r6\n\t"
  9486. #endif
  9487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9488. "adds r3, r3, r7\n\t"
  9489. #else
  9490. "add r3, r3, r7\n\t"
  9491. #endif
  9492. #ifdef WOLFSSL_KEIL
  9493. "adcs r4, r4, %[r]\n\t"
  9494. #elif defined(__clang__)
  9495. "adcs r4, %[r]\n\t"
  9496. #else
  9497. "adc r4, %[r]\n\t"
  9498. #endif
  9499. #ifdef WOLFSSL_KEIL
  9500. "adcs r5, r5, %[r]\n\t"
  9501. #elif defined(__clang__)
  9502. "adcs r5, %[r]\n\t"
  9503. #else
  9504. "adc r5, %[r]\n\t"
  9505. #endif
  9506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9507. "adds r3, r3, r7\n\t"
  9508. #else
  9509. "add r3, r3, r7\n\t"
  9510. #endif
  9511. #ifdef WOLFSSL_KEIL
  9512. "adcs r4, r4, %[r]\n\t"
  9513. #elif defined(__clang__)
  9514. "adcs r4, %[r]\n\t"
  9515. #else
  9516. "adc r4, %[r]\n\t"
  9517. #endif
  9518. #ifdef WOLFSSL_KEIL
  9519. "adcs r5, r5, %[r]\n\t"
  9520. #elif defined(__clang__)
  9521. "adcs r5, %[r]\n\t"
  9522. #else
  9523. "adc r5, %[r]\n\t"
  9524. #endif
  9525. "ldr r7, [r2]\n\t"
  9526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9527. "lsrs r7, r7, #16\n\t"
  9528. #else
  9529. "lsr r7, r7, #16\n\t"
  9530. #endif
  9531. #ifdef WOLFSSL_KEIL
  9532. "muls r6, r7, r6\n\t"
  9533. #elif defined(__clang__)
  9534. "muls r6, r7\n\t"
  9535. #else
  9536. "mul r6, r7\n\t"
  9537. #endif
  9538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9539. "lsrs r7, r6, #16\n\t"
  9540. #else
  9541. "lsr r7, r6, #16\n\t"
  9542. #endif
  9543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9544. "lsls r6, r6, #16\n\t"
  9545. #else
  9546. "lsl r6, r6, #16\n\t"
  9547. #endif
  9548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9549. "adds r3, r3, r6\n\t"
  9550. #else
  9551. "add r3, r3, r6\n\t"
  9552. #endif
  9553. #ifdef WOLFSSL_KEIL
  9554. "adcs r4, r4, r7\n\t"
  9555. #elif defined(__clang__)
  9556. "adcs r4, r7\n\t"
  9557. #else
  9558. "adc r4, r7\n\t"
  9559. #endif
  9560. #ifdef WOLFSSL_KEIL
  9561. "adcs r5, r5, %[r]\n\t"
  9562. #elif defined(__clang__)
  9563. "adcs r5, %[r]\n\t"
  9564. #else
  9565. "adc r5, %[r]\n\t"
  9566. #endif
  9567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9568. "adds r3, r3, r6\n\t"
  9569. #else
  9570. "add r3, r3, r6\n\t"
  9571. #endif
  9572. #ifdef WOLFSSL_KEIL
  9573. "adcs r4, r4, r7\n\t"
  9574. #elif defined(__clang__)
  9575. "adcs r4, r7\n\t"
  9576. #else
  9577. "adc r4, r7\n\t"
  9578. #endif
  9579. #ifdef WOLFSSL_KEIL
  9580. "adcs r5, r5, %[r]\n\t"
  9581. #elif defined(__clang__)
  9582. "adcs r5, %[r]\n\t"
  9583. #else
  9584. "adc r5, %[r]\n\t"
  9585. #endif
  9586. "ldr r6, [%[a]]\n\t"
  9587. "ldr r7, [r2]\n\t"
  9588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9589. "lsrs r6, r6, #16\n\t"
  9590. #else
  9591. "lsr r6, r6, #16\n\t"
  9592. #endif
  9593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9594. "lsrs r7, r7, #16\n\t"
  9595. #else
  9596. "lsr r7, r7, #16\n\t"
  9597. #endif
  9598. #ifdef WOLFSSL_KEIL
  9599. "muls r7, r6, r7\n\t"
  9600. #elif defined(__clang__)
  9601. "muls r7, r6\n\t"
  9602. #else
  9603. "mul r7, r6\n\t"
  9604. #endif
  9605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9606. "adds r4, r4, r7\n\t"
  9607. #else
  9608. "add r4, r4, r7\n\t"
  9609. #endif
  9610. #ifdef WOLFSSL_KEIL
  9611. "adcs r5, r5, %[r]\n\t"
  9612. #elif defined(__clang__)
  9613. "adcs r5, %[r]\n\t"
  9614. #else
  9615. "adc r5, %[r]\n\t"
  9616. #endif
  9617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9618. "adds r4, r4, r7\n\t"
  9619. #else
  9620. "add r4, r4, r7\n\t"
  9621. #endif
  9622. #ifdef WOLFSSL_KEIL
  9623. "adcs r5, r5, %[r]\n\t"
  9624. #elif defined(__clang__)
  9625. "adcs r5, %[r]\n\t"
  9626. #else
  9627. "adc r5, %[r]\n\t"
  9628. #endif
  9629. "ldrh r7, [r2]\n\t"
  9630. #ifdef WOLFSSL_KEIL
  9631. "muls r6, r7, r6\n\t"
  9632. #elif defined(__clang__)
  9633. "muls r6, r7\n\t"
  9634. #else
  9635. "mul r6, r7\n\t"
  9636. #endif
  9637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9638. "lsrs r7, r6, #16\n\t"
  9639. #else
  9640. "lsr r7, r6, #16\n\t"
  9641. #endif
  9642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9643. "lsls r6, r6, #16\n\t"
  9644. #else
  9645. "lsl r6, r6, #16\n\t"
  9646. #endif
  9647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9648. "adds r3, r3, r6\n\t"
  9649. #else
  9650. "add r3, r3, r6\n\t"
  9651. #endif
  9652. #ifdef WOLFSSL_KEIL
  9653. "adcs r4, r4, r7\n\t"
  9654. #elif defined(__clang__)
  9655. "adcs r4, r7\n\t"
  9656. #else
  9657. "adc r4, r7\n\t"
  9658. #endif
  9659. #ifdef WOLFSSL_KEIL
  9660. "adcs r5, r5, %[r]\n\t"
  9661. #elif defined(__clang__)
  9662. "adcs r5, %[r]\n\t"
  9663. #else
  9664. "adc r5, %[r]\n\t"
  9665. #endif
  9666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9667. "adds r3, r3, r6\n\t"
  9668. #else
  9669. "add r3, r3, r6\n\t"
  9670. #endif
  9671. #ifdef WOLFSSL_KEIL
  9672. "adcs r4, r4, r7\n\t"
  9673. #elif defined(__clang__)
  9674. "adcs r4, r7\n\t"
  9675. #else
  9676. "adc r4, r7\n\t"
  9677. #endif
  9678. #ifdef WOLFSSL_KEIL
  9679. "adcs r5, r5, %[r]\n\t"
  9680. #elif defined(__clang__)
  9681. "adcs r5, %[r]\n\t"
  9682. #else
  9683. "adc r5, %[r]\n\t"
  9684. #endif
  9685. "# Multiply * 2: Done\n\t"
  9686. "bal L_sp_2048_sqr_8_done_sqr_%=\n\t"
  9687. "\n"
  9688. "L_sp_2048_sqr_8_sqr_%=:\n\t"
  9689. "mov r12, r2\n\t"
  9690. "ldr r2, [%[a]]\n\t"
  9691. "# Square: Start\n\t"
  9692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9693. "lsrs r7, r2, #16\n\t"
  9694. #else
  9695. "lsr r7, r2, #16\n\t"
  9696. #endif
  9697. "uxth r6, r2\n\t"
  9698. #ifdef WOLFSSL_KEIL
  9699. "muls r6, r6, r6\n\t"
  9700. #elif defined(__clang__)
  9701. "muls r6, r6\n\t"
  9702. #else
  9703. "mul r6, r6\n\t"
  9704. #endif
  9705. #ifdef WOLFSSL_KEIL
  9706. "muls r7, r7, r7\n\t"
  9707. #elif defined(__clang__)
  9708. "muls r7, r7\n\t"
  9709. #else
  9710. "mul r7, r7\n\t"
  9711. #endif
  9712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9713. "adds r3, r3, r6\n\t"
  9714. #else
  9715. "add r3, r3, r6\n\t"
  9716. #endif
  9717. #ifdef WOLFSSL_KEIL
  9718. "adcs r4, r4, r7\n\t"
  9719. #elif defined(__clang__)
  9720. "adcs r4, r7\n\t"
  9721. #else
  9722. "adc r4, r7\n\t"
  9723. #endif
  9724. #ifdef WOLFSSL_KEIL
  9725. "adcs r5, r5, %[r]\n\t"
  9726. #elif defined(__clang__)
  9727. "adcs r5, %[r]\n\t"
  9728. #else
  9729. "adc r5, %[r]\n\t"
  9730. #endif
  9731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9732. "lsrs r7, r2, #16\n\t"
  9733. #else
  9734. "lsr r7, r2, #16\n\t"
  9735. #endif
  9736. "uxth r6, r2\n\t"
  9737. #ifdef WOLFSSL_KEIL
  9738. "muls r6, r7, r6\n\t"
  9739. #elif defined(__clang__)
  9740. "muls r6, r7\n\t"
  9741. #else
  9742. "mul r6, r7\n\t"
  9743. #endif
  9744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9745. "lsrs r7, r6, #15\n\t"
  9746. #else
  9747. "lsr r7, r6, #15\n\t"
  9748. #endif
  9749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9750. "lsls r6, r6, #17\n\t"
  9751. #else
  9752. "lsl r6, r6, #17\n\t"
  9753. #endif
  9754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9755. "adds r3, r3, r6\n\t"
  9756. #else
  9757. "add r3, r3, r6\n\t"
  9758. #endif
  9759. #ifdef WOLFSSL_KEIL
  9760. "adcs r4, r4, r7\n\t"
  9761. #elif defined(__clang__)
  9762. "adcs r4, r7\n\t"
  9763. #else
  9764. "adc r4, r7\n\t"
  9765. #endif
  9766. #ifdef WOLFSSL_KEIL
  9767. "adcs r5, r5, %[r]\n\t"
  9768. #elif defined(__clang__)
  9769. "adcs r5, %[r]\n\t"
  9770. #else
  9771. "adc r5, %[r]\n\t"
  9772. #endif
  9773. "# Square: Done\n\t"
  9774. "mov r2, r12\n\t"
  9775. "\n"
  9776. "L_sp_2048_sqr_8_done_sqr_%=:\n\t"
  9777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9778. "adds %[a], %[a], #4\n\t"
  9779. #else
  9780. "add %[a], %[a], #4\n\t"
  9781. #endif
  9782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9783. "subs r2, r2, #4\n\t"
  9784. #else
  9785. "sub r2, r2, #4\n\t"
  9786. #endif
  9787. "movs r6, #32\n\t"
  9788. "add r6, r6, r9\n\t"
  9789. "cmp %[a], r6\n\t"
  9790. "beq L_sp_2048_sqr_8_done_mul_%=\n\t"
  9791. "cmp %[a], r2\n\t"
  9792. "bgt L_sp_2048_sqr_8_done_mul_%=\n\t"
  9793. "mov r7, r8\n\t"
  9794. "add r7, r7, r9\n\t"
  9795. "cmp %[a], r7\n\t"
  9796. "ble L_sp_2048_sqr_8_mul_%=\n\t"
  9797. "\n"
  9798. "L_sp_2048_sqr_8_done_mul_%=:\n\t"
  9799. "mov %[r], r10\n\t"
  9800. "mov r7, r8\n\t"
  9801. "str r3, [%[r], r7]\n\t"
  9802. "movs r3, r4\n\t"
  9803. "movs r4, r5\n\t"
  9804. "movs r5, #0\n\t"
  9805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9806. "adds r7, r7, #4\n\t"
  9807. #else
  9808. "add r7, r7, #4\n\t"
  9809. #endif
  9810. "mov r8, r7\n\t"
  9811. "movs r6, #56\n\t"
  9812. "cmp r7, r6\n\t"
  9813. "ble L_sp_2048_sqr_8_words_%=\n\t"
  9814. "mov %[a], r9\n\t"
  9815. "str r3, [%[r], r7]\n\t"
  9816. "mov %[r], r11\n\t"
  9817. "mov %[a], r10\n\t"
  9818. "movs r3, #60\n\t"
  9819. "\n"
  9820. "L_sp_2048_sqr_8_store_%=:\n\t"
  9821. "ldr r6, [%[a], r3]\n\t"
  9822. "str r6, [%[r], r3]\n\t"
  9823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9824. "subs r3, r3, #4\n\t"
  9825. #else
  9826. "sub r3, r3, #4\n\t"
  9827. #endif
  9828. "bge L_sp_2048_sqr_8_store_%=\n\t"
  9829. "movs r6, #0x40\n\t"
  9830. "add sp, sp, r6\n\t"
  9831. : [r] "+r" (r), [a] "+r" (a)
  9832. :
  9833. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  9834. );
  9835. }
  9836. #else
  9837. /* Square a and put result in r. (r = a * a)
  9838. *
  9839. * r A single precision integer.
  9840. * a A single precision integer.
  9841. */
  9842. SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a)
  9843. {
  9844. __asm__ __volatile__ (
  9845. "sub sp, sp, #32\n\t"
  9846. "mov r8, %[r]\n\t"
  9847. "mov r9, %[a]\n\t"
  9848. "movs %[r], #0\n\t"
  9849. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  9850. "mov r10, r2\n\t"
  9851. "mov r11, r3\n\t"
  9852. "mov r12, r4\n\t"
  9853. "mov lr, r5\n\t"
  9854. "mov %[a], r9\n\t"
  9855. "# A[0] * A[0]\n\t"
  9856. "movs r4, #0\n\t"
  9857. "mov r7, r10\n\t"
  9858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9859. "lsrs r6, r7, #16\n\t"
  9860. #else
  9861. "lsr r6, r7, #16\n\t"
  9862. #endif
  9863. "uxth r5, r7\n\t"
  9864. "movs r2, r5\n\t"
  9865. "movs r3, r6\n\t"
  9866. #ifdef WOLFSSL_KEIL
  9867. "muls r2, r2, r2\n\t"
  9868. #elif defined(__clang__)
  9869. "muls r2, r2\n\t"
  9870. #else
  9871. "mul r2, r2\n\t"
  9872. #endif
  9873. #ifdef WOLFSSL_KEIL
  9874. "muls r3, r3, r3\n\t"
  9875. #elif defined(__clang__)
  9876. "muls r3, r3\n\t"
  9877. #else
  9878. "mul r3, r3\n\t"
  9879. #endif
  9880. #ifdef WOLFSSL_KEIL
  9881. "muls r5, r6, r5\n\t"
  9882. #elif defined(__clang__)
  9883. "muls r5, r6\n\t"
  9884. #else
  9885. "mul r5, r6\n\t"
  9886. #endif
  9887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9888. "lsrs r6, r5, #15\n\t"
  9889. #else
  9890. "lsr r6, r5, #15\n\t"
  9891. #endif
  9892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9893. "lsls r5, r5, #17\n\t"
  9894. #else
  9895. "lsl r5, r5, #17\n\t"
  9896. #endif
  9897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9898. "adds r2, r2, r5\n\t"
  9899. #else
  9900. "add r2, r2, r5\n\t"
  9901. #endif
  9902. #ifdef WOLFSSL_KEIL
  9903. "adcs r3, r3, r6\n\t"
  9904. #elif defined(__clang__)
  9905. "adcs r3, r6\n\t"
  9906. #else
  9907. "adc r3, r6\n\t"
  9908. #endif
  9909. "str r2, [sp]\n\t"
  9910. "# A[1] * A[0]\n\t"
  9911. "movs r2, #0\n\t"
  9912. "mov %[a], r11\n\t"
  9913. "uxth r5, %[a]\n\t"
  9914. "uxth r6, r7\n\t"
  9915. #ifdef WOLFSSL_KEIL
  9916. "muls r6, r5, r6\n\t"
  9917. #elif defined(__clang__)
  9918. "muls r6, r5\n\t"
  9919. #else
  9920. "mul r6, r5\n\t"
  9921. #endif
  9922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9923. "adds r3, r3, r6\n\t"
  9924. #else
  9925. "add r3, r3, r6\n\t"
  9926. #endif
  9927. #ifdef WOLFSSL_KEIL
  9928. "adcs r4, r4, %[r]\n\t"
  9929. #elif defined(__clang__)
  9930. "adcs r4, %[r]\n\t"
  9931. #else
  9932. "adc r4, %[r]\n\t"
  9933. #endif
  9934. #ifdef WOLFSSL_KEIL
  9935. "adcs r2, r2, %[r]\n\t"
  9936. #elif defined(__clang__)
  9937. "adcs r2, %[r]\n\t"
  9938. #else
  9939. "adc r2, %[r]\n\t"
  9940. #endif
  9941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9942. "adds r3, r3, r6\n\t"
  9943. #else
  9944. "add r3, r3, r6\n\t"
  9945. #endif
  9946. #ifdef WOLFSSL_KEIL
  9947. "adcs r4, r4, %[r]\n\t"
  9948. #elif defined(__clang__)
  9949. "adcs r4, %[r]\n\t"
  9950. #else
  9951. "adc r4, %[r]\n\t"
  9952. #endif
  9953. #ifdef WOLFSSL_KEIL
  9954. "adcs r2, r2, %[r]\n\t"
  9955. #elif defined(__clang__)
  9956. "adcs r2, %[r]\n\t"
  9957. #else
  9958. "adc r2, %[r]\n\t"
  9959. #endif
  9960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9961. "lsrs r6, r7, #16\n\t"
  9962. #else
  9963. "lsr r6, r7, #16\n\t"
  9964. #endif
  9965. #ifdef WOLFSSL_KEIL
  9966. "muls r5, r6, r5\n\t"
  9967. #elif defined(__clang__)
  9968. "muls r5, r6\n\t"
  9969. #else
  9970. "mul r5, r6\n\t"
  9971. #endif
  9972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9973. "lsrs r6, r5, #16\n\t"
  9974. #else
  9975. "lsr r6, r5, #16\n\t"
  9976. #endif
  9977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9978. "lsls r5, r5, #16\n\t"
  9979. #else
  9980. "lsl r5, r5, #16\n\t"
  9981. #endif
  9982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9983. "adds r3, r3, r5\n\t"
  9984. #else
  9985. "add r3, r3, r5\n\t"
  9986. #endif
  9987. #ifdef WOLFSSL_KEIL
  9988. "adcs r4, r4, r6\n\t"
  9989. #elif defined(__clang__)
  9990. "adcs r4, r6\n\t"
  9991. #else
  9992. "adc r4, r6\n\t"
  9993. #endif
  9994. #ifdef WOLFSSL_KEIL
  9995. "adcs r2, r2, %[r]\n\t"
  9996. #elif defined(__clang__)
  9997. "adcs r2, %[r]\n\t"
  9998. #else
  9999. "adc r2, %[r]\n\t"
  10000. #endif
  10001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10002. "adds r3, r3, r5\n\t"
  10003. #else
  10004. "add r3, r3, r5\n\t"
  10005. #endif
  10006. #ifdef WOLFSSL_KEIL
  10007. "adcs r4, r4, r6\n\t"
  10008. #elif defined(__clang__)
  10009. "adcs r4, r6\n\t"
  10010. #else
  10011. "adc r4, r6\n\t"
  10012. #endif
  10013. #ifdef WOLFSSL_KEIL
  10014. "adcs r2, r2, %[r]\n\t"
  10015. #elif defined(__clang__)
  10016. "adcs r2, %[r]\n\t"
  10017. #else
  10018. "adc r2, %[r]\n\t"
  10019. #endif
  10020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10021. "lsrs r5, %[a], #16\n\t"
  10022. #else
  10023. "lsr r5, %[a], #16\n\t"
  10024. #endif
  10025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10026. "lsrs r6, r7, #16\n\t"
  10027. #else
  10028. "lsr r6, r7, #16\n\t"
  10029. #endif
  10030. #ifdef WOLFSSL_KEIL
  10031. "muls r6, r5, r6\n\t"
  10032. #elif defined(__clang__)
  10033. "muls r6, r5\n\t"
  10034. #else
  10035. "mul r6, r5\n\t"
  10036. #endif
  10037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10038. "adds r4, r4, r6\n\t"
  10039. #else
  10040. "add r4, r4, r6\n\t"
  10041. #endif
  10042. #ifdef WOLFSSL_KEIL
  10043. "adcs r2, r2, %[r]\n\t"
  10044. #elif defined(__clang__)
  10045. "adcs r2, %[r]\n\t"
  10046. #else
  10047. "adc r2, %[r]\n\t"
  10048. #endif
  10049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10050. "adds r4, r4, r6\n\t"
  10051. #else
  10052. "add r4, r4, r6\n\t"
  10053. #endif
  10054. #ifdef WOLFSSL_KEIL
  10055. "adcs r2, r2, %[r]\n\t"
  10056. #elif defined(__clang__)
  10057. "adcs r2, %[r]\n\t"
  10058. #else
  10059. "adc r2, %[r]\n\t"
  10060. #endif
  10061. "uxth r6, r7\n\t"
  10062. #ifdef WOLFSSL_KEIL
  10063. "muls r5, r6, r5\n\t"
  10064. #elif defined(__clang__)
  10065. "muls r5, r6\n\t"
  10066. #else
  10067. "mul r5, r6\n\t"
  10068. #endif
  10069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10070. "lsrs r6, r5, #16\n\t"
  10071. #else
  10072. "lsr r6, r5, #16\n\t"
  10073. #endif
  10074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10075. "lsls r5, r5, #16\n\t"
  10076. #else
  10077. "lsl r5, r5, #16\n\t"
  10078. #endif
  10079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10080. "adds r3, r3, r5\n\t"
  10081. #else
  10082. "add r3, r3, r5\n\t"
  10083. #endif
  10084. #ifdef WOLFSSL_KEIL
  10085. "adcs r4, r4, r6\n\t"
  10086. #elif defined(__clang__)
  10087. "adcs r4, r6\n\t"
  10088. #else
  10089. "adc r4, r6\n\t"
  10090. #endif
  10091. #ifdef WOLFSSL_KEIL
  10092. "adcs r2, r2, %[r]\n\t"
  10093. #elif defined(__clang__)
  10094. "adcs r2, %[r]\n\t"
  10095. #else
  10096. "adc r2, %[r]\n\t"
  10097. #endif
  10098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10099. "adds r3, r3, r5\n\t"
  10100. #else
  10101. "add r3, r3, r5\n\t"
  10102. #endif
  10103. #ifdef WOLFSSL_KEIL
  10104. "adcs r4, r4, r6\n\t"
  10105. #elif defined(__clang__)
  10106. "adcs r4, r6\n\t"
  10107. #else
  10108. "adc r4, r6\n\t"
  10109. #endif
  10110. #ifdef WOLFSSL_KEIL
  10111. "adcs r2, r2, %[r]\n\t"
  10112. #elif defined(__clang__)
  10113. "adcs r2, %[r]\n\t"
  10114. #else
  10115. "adc r2, %[r]\n\t"
  10116. #endif
  10117. "str r3, [sp, #4]\n\t"
  10118. "# A[2] * A[0]\n\t"
  10119. "movs r3, #0\n\t"
  10120. "mov %[a], r9\n\t"
  10121. "mov %[a], r12\n\t"
  10122. "uxth r5, %[a]\n\t"
  10123. "uxth r6, r7\n\t"
  10124. #ifdef WOLFSSL_KEIL
  10125. "muls r6, r5, r6\n\t"
  10126. #elif defined(__clang__)
  10127. "muls r6, r5\n\t"
  10128. #else
  10129. "mul r6, r5\n\t"
  10130. #endif
  10131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10132. "adds r4, r4, r6\n\t"
  10133. #else
  10134. "add r4, r4, r6\n\t"
  10135. #endif
  10136. #ifdef WOLFSSL_KEIL
  10137. "adcs r2, r2, %[r]\n\t"
  10138. #elif defined(__clang__)
  10139. "adcs r2, %[r]\n\t"
  10140. #else
  10141. "adc r2, %[r]\n\t"
  10142. #endif
  10143. #ifdef WOLFSSL_KEIL
  10144. "adcs r3, r3, %[r]\n\t"
  10145. #elif defined(__clang__)
  10146. "adcs r3, %[r]\n\t"
  10147. #else
  10148. "adc r3, %[r]\n\t"
  10149. #endif
  10150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10151. "adds r4, r4, r6\n\t"
  10152. #else
  10153. "add r4, r4, r6\n\t"
  10154. #endif
  10155. #ifdef WOLFSSL_KEIL
  10156. "adcs r2, r2, %[r]\n\t"
  10157. #elif defined(__clang__)
  10158. "adcs r2, %[r]\n\t"
  10159. #else
  10160. "adc r2, %[r]\n\t"
  10161. #endif
  10162. #ifdef WOLFSSL_KEIL
  10163. "adcs r3, r3, %[r]\n\t"
  10164. #elif defined(__clang__)
  10165. "adcs r3, %[r]\n\t"
  10166. #else
  10167. "adc r3, %[r]\n\t"
  10168. #endif
  10169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10170. "lsrs r6, r7, #16\n\t"
  10171. #else
  10172. "lsr r6, r7, #16\n\t"
  10173. #endif
  10174. #ifdef WOLFSSL_KEIL
  10175. "muls r5, r6, r5\n\t"
  10176. #elif defined(__clang__)
  10177. "muls r5, r6\n\t"
  10178. #else
  10179. "mul r5, r6\n\t"
  10180. #endif
  10181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10182. "lsrs r6, r5, #16\n\t"
  10183. #else
  10184. "lsr r6, r5, #16\n\t"
  10185. #endif
  10186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10187. "lsls r5, r5, #16\n\t"
  10188. #else
  10189. "lsl r5, r5, #16\n\t"
  10190. #endif
  10191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10192. "adds r4, r4, r5\n\t"
  10193. #else
  10194. "add r4, r4, r5\n\t"
  10195. #endif
  10196. #ifdef WOLFSSL_KEIL
  10197. "adcs r2, r2, r6\n\t"
  10198. #elif defined(__clang__)
  10199. "adcs r2, r6\n\t"
  10200. #else
  10201. "adc r2, r6\n\t"
  10202. #endif
  10203. #ifdef WOLFSSL_KEIL
  10204. "adcs r3, r3, %[r]\n\t"
  10205. #elif defined(__clang__)
  10206. "adcs r3, %[r]\n\t"
  10207. #else
  10208. "adc r3, %[r]\n\t"
  10209. #endif
  10210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10211. "adds r4, r4, r5\n\t"
  10212. #else
  10213. "add r4, r4, r5\n\t"
  10214. #endif
  10215. #ifdef WOLFSSL_KEIL
  10216. "adcs r2, r2, r6\n\t"
  10217. #elif defined(__clang__)
  10218. "adcs r2, r6\n\t"
  10219. #else
  10220. "adc r2, r6\n\t"
  10221. #endif
  10222. #ifdef WOLFSSL_KEIL
  10223. "adcs r3, r3, %[r]\n\t"
  10224. #elif defined(__clang__)
  10225. "adcs r3, %[r]\n\t"
  10226. #else
  10227. "adc r3, %[r]\n\t"
  10228. #endif
  10229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10230. "lsrs r5, %[a], #16\n\t"
  10231. #else
  10232. "lsr r5, %[a], #16\n\t"
  10233. #endif
  10234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10235. "lsrs r6, r7, #16\n\t"
  10236. #else
  10237. "lsr r6, r7, #16\n\t"
  10238. #endif
  10239. #ifdef WOLFSSL_KEIL
  10240. "muls r6, r5, r6\n\t"
  10241. #elif defined(__clang__)
  10242. "muls r6, r5\n\t"
  10243. #else
  10244. "mul r6, r5\n\t"
  10245. #endif
  10246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10247. "adds r2, r2, r6\n\t"
  10248. #else
  10249. "add r2, r2, r6\n\t"
  10250. #endif
  10251. #ifdef WOLFSSL_KEIL
  10252. "adcs r3, r3, %[r]\n\t"
  10253. #elif defined(__clang__)
  10254. "adcs r3, %[r]\n\t"
  10255. #else
  10256. "adc r3, %[r]\n\t"
  10257. #endif
  10258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10259. "adds r2, r2, r6\n\t"
  10260. #else
  10261. "add r2, r2, r6\n\t"
  10262. #endif
  10263. #ifdef WOLFSSL_KEIL
  10264. "adcs r3, r3, %[r]\n\t"
  10265. #elif defined(__clang__)
  10266. "adcs r3, %[r]\n\t"
  10267. #else
  10268. "adc r3, %[r]\n\t"
  10269. #endif
  10270. "uxth r6, r7\n\t"
  10271. #ifdef WOLFSSL_KEIL
  10272. "muls r5, r6, r5\n\t"
  10273. #elif defined(__clang__)
  10274. "muls r5, r6\n\t"
  10275. #else
  10276. "mul r5, r6\n\t"
  10277. #endif
  10278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10279. "lsrs r6, r5, #16\n\t"
  10280. #else
  10281. "lsr r6, r5, #16\n\t"
  10282. #endif
  10283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10284. "lsls r5, r5, #16\n\t"
  10285. #else
  10286. "lsl r5, r5, #16\n\t"
  10287. #endif
  10288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10289. "adds r4, r4, r5\n\t"
  10290. #else
  10291. "add r4, r4, r5\n\t"
  10292. #endif
  10293. #ifdef WOLFSSL_KEIL
  10294. "adcs r2, r2, r6\n\t"
  10295. #elif defined(__clang__)
  10296. "adcs r2, r6\n\t"
  10297. #else
  10298. "adc r2, r6\n\t"
  10299. #endif
  10300. #ifdef WOLFSSL_KEIL
  10301. "adcs r3, r3, %[r]\n\t"
  10302. #elif defined(__clang__)
  10303. "adcs r3, %[r]\n\t"
  10304. #else
  10305. "adc r3, %[r]\n\t"
  10306. #endif
  10307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10308. "adds r4, r4, r5\n\t"
  10309. #else
  10310. "add r4, r4, r5\n\t"
  10311. #endif
  10312. #ifdef WOLFSSL_KEIL
  10313. "adcs r2, r2, r6\n\t"
  10314. #elif defined(__clang__)
  10315. "adcs r2, r6\n\t"
  10316. #else
  10317. "adc r2, r6\n\t"
  10318. #endif
  10319. #ifdef WOLFSSL_KEIL
  10320. "adcs r3, r3, %[r]\n\t"
  10321. #elif defined(__clang__)
  10322. "adcs r3, %[r]\n\t"
  10323. #else
  10324. "adc r3, %[r]\n\t"
  10325. #endif
  10326. "# A[1] * A[1]\n\t"
  10327. "mov r7, r11\n\t"
  10328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10329. "lsrs r6, r7, #16\n\t"
  10330. #else
  10331. "lsr r6, r7, #16\n\t"
  10332. #endif
  10333. "uxth r5, r7\n\t"
  10334. #ifdef WOLFSSL_KEIL
  10335. "muls r5, r5, r5\n\t"
  10336. #elif defined(__clang__)
  10337. "muls r5, r5\n\t"
  10338. #else
  10339. "mul r5, r5\n\t"
  10340. #endif
  10341. #ifdef WOLFSSL_KEIL
  10342. "muls r6, r6, r6\n\t"
  10343. #elif defined(__clang__)
  10344. "muls r6, r6\n\t"
  10345. #else
  10346. "mul r6, r6\n\t"
  10347. #endif
  10348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10349. "adds r4, r4, r5\n\t"
  10350. #else
  10351. "add r4, r4, r5\n\t"
  10352. #endif
  10353. #ifdef WOLFSSL_KEIL
  10354. "adcs r2, r2, r6\n\t"
  10355. #elif defined(__clang__)
  10356. "adcs r2, r6\n\t"
  10357. #else
  10358. "adc r2, r6\n\t"
  10359. #endif
  10360. #ifdef WOLFSSL_KEIL
  10361. "adcs r3, r3, %[r]\n\t"
  10362. #elif defined(__clang__)
  10363. "adcs r3, %[r]\n\t"
  10364. #else
  10365. "adc r3, %[r]\n\t"
  10366. #endif
  10367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10368. "lsrs r6, r7, #16\n\t"
  10369. #else
  10370. "lsr r6, r7, #16\n\t"
  10371. #endif
  10372. "uxth r5, r7\n\t"
  10373. #ifdef WOLFSSL_KEIL
  10374. "muls r5, r6, r5\n\t"
  10375. #elif defined(__clang__)
  10376. "muls r5, r6\n\t"
  10377. #else
  10378. "mul r5, r6\n\t"
  10379. #endif
  10380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10381. "lsrs r6, r5, #15\n\t"
  10382. #else
  10383. "lsr r6, r5, #15\n\t"
  10384. #endif
  10385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10386. "lsls r5, r5, #17\n\t"
  10387. #else
  10388. "lsl r5, r5, #17\n\t"
  10389. #endif
  10390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10391. "adds r4, r4, r5\n\t"
  10392. #else
  10393. "add r4, r4, r5\n\t"
  10394. #endif
  10395. #ifdef WOLFSSL_KEIL
  10396. "adcs r2, r2, r6\n\t"
  10397. #elif defined(__clang__)
  10398. "adcs r2, r6\n\t"
  10399. #else
  10400. "adc r2, r6\n\t"
  10401. #endif
  10402. #ifdef WOLFSSL_KEIL
  10403. "adcs r3, r3, %[r]\n\t"
  10404. #elif defined(__clang__)
  10405. "adcs r3, %[r]\n\t"
  10406. #else
  10407. "adc r3, %[r]\n\t"
  10408. #endif
  10409. "str r4, [sp, #8]\n\t"
  10410. "# A[2] * A[1]\n\t"
  10411. "movs r4, #0\n\t"
  10412. "mov %[a], r9\n\t"
  10413. "mov %[a], r12\n\t"
  10414. "uxth r5, %[a]\n\t"
  10415. "uxth r6, r7\n\t"
  10416. #ifdef WOLFSSL_KEIL
  10417. "muls r6, r5, r6\n\t"
  10418. #elif defined(__clang__)
  10419. "muls r6, r5\n\t"
  10420. #else
  10421. "mul r6, r5\n\t"
  10422. #endif
  10423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10424. "adds r2, r2, r6\n\t"
  10425. #else
  10426. "add r2, r2, r6\n\t"
  10427. #endif
  10428. #ifdef WOLFSSL_KEIL
  10429. "adcs r3, r3, %[r]\n\t"
  10430. #elif defined(__clang__)
  10431. "adcs r3, %[r]\n\t"
  10432. #else
  10433. "adc r3, %[r]\n\t"
  10434. #endif
  10435. #ifdef WOLFSSL_KEIL
  10436. "adcs r4, r4, %[r]\n\t"
  10437. #elif defined(__clang__)
  10438. "adcs r4, %[r]\n\t"
  10439. #else
  10440. "adc r4, %[r]\n\t"
  10441. #endif
  10442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10443. "adds r2, r2, r6\n\t"
  10444. #else
  10445. "add r2, r2, r6\n\t"
  10446. #endif
  10447. #ifdef WOLFSSL_KEIL
  10448. "adcs r3, r3, %[r]\n\t"
  10449. #elif defined(__clang__)
  10450. "adcs r3, %[r]\n\t"
  10451. #else
  10452. "adc r3, %[r]\n\t"
  10453. #endif
  10454. #ifdef WOLFSSL_KEIL
  10455. "adcs r4, r4, %[r]\n\t"
  10456. #elif defined(__clang__)
  10457. "adcs r4, %[r]\n\t"
  10458. #else
  10459. "adc r4, %[r]\n\t"
  10460. #endif
  10461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10462. "lsrs r6, r7, #16\n\t"
  10463. #else
  10464. "lsr r6, r7, #16\n\t"
  10465. #endif
  10466. #ifdef WOLFSSL_KEIL
  10467. "muls r5, r6, r5\n\t"
  10468. #elif defined(__clang__)
  10469. "muls r5, r6\n\t"
  10470. #else
  10471. "mul r5, r6\n\t"
  10472. #endif
  10473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10474. "lsrs r6, r5, #16\n\t"
  10475. #else
  10476. "lsr r6, r5, #16\n\t"
  10477. #endif
  10478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10479. "lsls r5, r5, #16\n\t"
  10480. #else
  10481. "lsl r5, r5, #16\n\t"
  10482. #endif
  10483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10484. "adds r2, r2, r5\n\t"
  10485. #else
  10486. "add r2, r2, r5\n\t"
  10487. #endif
  10488. #ifdef WOLFSSL_KEIL
  10489. "adcs r3, r3, r6\n\t"
  10490. #elif defined(__clang__)
  10491. "adcs r3, r6\n\t"
  10492. #else
  10493. "adc r3, r6\n\t"
  10494. #endif
  10495. #ifdef WOLFSSL_KEIL
  10496. "adcs r4, r4, %[r]\n\t"
  10497. #elif defined(__clang__)
  10498. "adcs r4, %[r]\n\t"
  10499. #else
  10500. "adc r4, %[r]\n\t"
  10501. #endif
  10502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10503. "adds r2, r2, r5\n\t"
  10504. #else
  10505. "add r2, r2, r5\n\t"
  10506. #endif
  10507. #ifdef WOLFSSL_KEIL
  10508. "adcs r3, r3, r6\n\t"
  10509. #elif defined(__clang__)
  10510. "adcs r3, r6\n\t"
  10511. #else
  10512. "adc r3, r6\n\t"
  10513. #endif
  10514. #ifdef WOLFSSL_KEIL
  10515. "adcs r4, r4, %[r]\n\t"
  10516. #elif defined(__clang__)
  10517. "adcs r4, %[r]\n\t"
  10518. #else
  10519. "adc r4, %[r]\n\t"
  10520. #endif
  10521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10522. "lsrs r5, %[a], #16\n\t"
  10523. #else
  10524. "lsr r5, %[a], #16\n\t"
  10525. #endif
  10526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10527. "lsrs r6, r7, #16\n\t"
  10528. #else
  10529. "lsr r6, r7, #16\n\t"
  10530. #endif
  10531. #ifdef WOLFSSL_KEIL
  10532. "muls r6, r5, r6\n\t"
  10533. #elif defined(__clang__)
  10534. "muls r6, r5\n\t"
  10535. #else
  10536. "mul r6, r5\n\t"
  10537. #endif
  10538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10539. "adds r3, r3, r6\n\t"
  10540. #else
  10541. "add r3, r3, r6\n\t"
  10542. #endif
  10543. #ifdef WOLFSSL_KEIL
  10544. "adcs r4, r4, %[r]\n\t"
  10545. #elif defined(__clang__)
  10546. "adcs r4, %[r]\n\t"
  10547. #else
  10548. "adc r4, %[r]\n\t"
  10549. #endif
  10550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10551. "adds r3, r3, r6\n\t"
  10552. #else
  10553. "add r3, r3, r6\n\t"
  10554. #endif
  10555. #ifdef WOLFSSL_KEIL
  10556. "adcs r4, r4, %[r]\n\t"
  10557. #elif defined(__clang__)
  10558. "adcs r4, %[r]\n\t"
  10559. #else
  10560. "adc r4, %[r]\n\t"
  10561. #endif
  10562. "uxth r6, r7\n\t"
  10563. #ifdef WOLFSSL_KEIL
  10564. "muls r5, r6, r5\n\t"
  10565. #elif defined(__clang__)
  10566. "muls r5, r6\n\t"
  10567. #else
  10568. "mul r5, r6\n\t"
  10569. #endif
  10570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10571. "lsrs r6, r5, #16\n\t"
  10572. #else
  10573. "lsr r6, r5, #16\n\t"
  10574. #endif
  10575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10576. "lsls r5, r5, #16\n\t"
  10577. #else
  10578. "lsl r5, r5, #16\n\t"
  10579. #endif
  10580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10581. "adds r2, r2, r5\n\t"
  10582. #else
  10583. "add r2, r2, r5\n\t"
  10584. #endif
  10585. #ifdef WOLFSSL_KEIL
  10586. "adcs r3, r3, r6\n\t"
  10587. #elif defined(__clang__)
  10588. "adcs r3, r6\n\t"
  10589. #else
  10590. "adc r3, r6\n\t"
  10591. #endif
  10592. #ifdef WOLFSSL_KEIL
  10593. "adcs r4, r4, %[r]\n\t"
  10594. #elif defined(__clang__)
  10595. "adcs r4, %[r]\n\t"
  10596. #else
  10597. "adc r4, %[r]\n\t"
  10598. #endif
  10599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10600. "adds r2, r2, r5\n\t"
  10601. #else
  10602. "add r2, r2, r5\n\t"
  10603. #endif
  10604. #ifdef WOLFSSL_KEIL
  10605. "adcs r3, r3, r6\n\t"
  10606. #elif defined(__clang__)
  10607. "adcs r3, r6\n\t"
  10608. #else
  10609. "adc r3, r6\n\t"
  10610. #endif
  10611. #ifdef WOLFSSL_KEIL
  10612. "adcs r4, r4, %[r]\n\t"
  10613. #elif defined(__clang__)
  10614. "adcs r4, %[r]\n\t"
  10615. #else
  10616. "adc r4, %[r]\n\t"
  10617. #endif
  10618. "# A[3] * A[0]\n\t"
  10619. "mov %[a], r9\n\t"
  10620. "mov r7, r10\n\t"
  10621. "mov %[a], lr\n\t"
  10622. "uxth r5, %[a]\n\t"
  10623. "uxth r6, r7\n\t"
  10624. #ifdef WOLFSSL_KEIL
  10625. "muls r6, r5, r6\n\t"
  10626. #elif defined(__clang__)
  10627. "muls r6, r5\n\t"
  10628. #else
  10629. "mul r6, r5\n\t"
  10630. #endif
  10631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10632. "adds r2, r2, r6\n\t"
  10633. #else
  10634. "add r2, r2, r6\n\t"
  10635. #endif
  10636. #ifdef WOLFSSL_KEIL
  10637. "adcs r3, r3, %[r]\n\t"
  10638. #elif defined(__clang__)
  10639. "adcs r3, %[r]\n\t"
  10640. #else
  10641. "adc r3, %[r]\n\t"
  10642. #endif
  10643. #ifdef WOLFSSL_KEIL
  10644. "adcs r4, r4, %[r]\n\t"
  10645. #elif defined(__clang__)
  10646. "adcs r4, %[r]\n\t"
  10647. #else
  10648. "adc r4, %[r]\n\t"
  10649. #endif
  10650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10651. "adds r2, r2, r6\n\t"
  10652. #else
  10653. "add r2, r2, r6\n\t"
  10654. #endif
  10655. #ifdef WOLFSSL_KEIL
  10656. "adcs r3, r3, %[r]\n\t"
  10657. #elif defined(__clang__)
  10658. "adcs r3, %[r]\n\t"
  10659. #else
  10660. "adc r3, %[r]\n\t"
  10661. #endif
  10662. #ifdef WOLFSSL_KEIL
  10663. "adcs r4, r4, %[r]\n\t"
  10664. #elif defined(__clang__)
  10665. "adcs r4, %[r]\n\t"
  10666. #else
  10667. "adc r4, %[r]\n\t"
  10668. #endif
  10669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10670. "lsrs r6, r7, #16\n\t"
  10671. #else
  10672. "lsr r6, r7, #16\n\t"
  10673. #endif
  10674. #ifdef WOLFSSL_KEIL
  10675. "muls r5, r6, r5\n\t"
  10676. #elif defined(__clang__)
  10677. "muls r5, r6\n\t"
  10678. #else
  10679. "mul r5, r6\n\t"
  10680. #endif
  10681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10682. "lsrs r6, r5, #16\n\t"
  10683. #else
  10684. "lsr r6, r5, #16\n\t"
  10685. #endif
  10686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10687. "lsls r5, r5, #16\n\t"
  10688. #else
  10689. "lsl r5, r5, #16\n\t"
  10690. #endif
  10691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10692. "adds r2, r2, r5\n\t"
  10693. #else
  10694. "add r2, r2, r5\n\t"
  10695. #endif
  10696. #ifdef WOLFSSL_KEIL
  10697. "adcs r3, r3, r6\n\t"
  10698. #elif defined(__clang__)
  10699. "adcs r3, r6\n\t"
  10700. #else
  10701. "adc r3, r6\n\t"
  10702. #endif
  10703. #ifdef WOLFSSL_KEIL
  10704. "adcs r4, r4, %[r]\n\t"
  10705. #elif defined(__clang__)
  10706. "adcs r4, %[r]\n\t"
  10707. #else
  10708. "adc r4, %[r]\n\t"
  10709. #endif
  10710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10711. "adds r2, r2, r5\n\t"
  10712. #else
  10713. "add r2, r2, r5\n\t"
  10714. #endif
  10715. #ifdef WOLFSSL_KEIL
  10716. "adcs r3, r3, r6\n\t"
  10717. #elif defined(__clang__)
  10718. "adcs r3, r6\n\t"
  10719. #else
  10720. "adc r3, r6\n\t"
  10721. #endif
  10722. #ifdef WOLFSSL_KEIL
  10723. "adcs r4, r4, %[r]\n\t"
  10724. #elif defined(__clang__)
  10725. "adcs r4, %[r]\n\t"
  10726. #else
  10727. "adc r4, %[r]\n\t"
  10728. #endif
  10729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10730. "lsrs r5, %[a], #16\n\t"
  10731. #else
  10732. "lsr r5, %[a], #16\n\t"
  10733. #endif
  10734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10735. "lsrs r6, r7, #16\n\t"
  10736. #else
  10737. "lsr r6, r7, #16\n\t"
  10738. #endif
  10739. #ifdef WOLFSSL_KEIL
  10740. "muls r6, r5, r6\n\t"
  10741. #elif defined(__clang__)
  10742. "muls r6, r5\n\t"
  10743. #else
  10744. "mul r6, r5\n\t"
  10745. #endif
  10746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10747. "adds r3, r3, r6\n\t"
  10748. #else
  10749. "add r3, r3, r6\n\t"
  10750. #endif
  10751. #ifdef WOLFSSL_KEIL
  10752. "adcs r4, r4, %[r]\n\t"
  10753. #elif defined(__clang__)
  10754. "adcs r4, %[r]\n\t"
  10755. #else
  10756. "adc r4, %[r]\n\t"
  10757. #endif
  10758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10759. "adds r3, r3, r6\n\t"
  10760. #else
  10761. "add r3, r3, r6\n\t"
  10762. #endif
  10763. #ifdef WOLFSSL_KEIL
  10764. "adcs r4, r4, %[r]\n\t"
  10765. #elif defined(__clang__)
  10766. "adcs r4, %[r]\n\t"
  10767. #else
  10768. "adc r4, %[r]\n\t"
  10769. #endif
  10770. "uxth r6, r7\n\t"
  10771. #ifdef WOLFSSL_KEIL
  10772. "muls r5, r6, r5\n\t"
  10773. #elif defined(__clang__)
  10774. "muls r5, r6\n\t"
  10775. #else
  10776. "mul r5, r6\n\t"
  10777. #endif
  10778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10779. "lsrs r6, r5, #16\n\t"
  10780. #else
  10781. "lsr r6, r5, #16\n\t"
  10782. #endif
  10783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10784. "lsls r5, r5, #16\n\t"
  10785. #else
  10786. "lsl r5, r5, #16\n\t"
  10787. #endif
  10788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10789. "adds r2, r2, r5\n\t"
  10790. #else
  10791. "add r2, r2, r5\n\t"
  10792. #endif
  10793. #ifdef WOLFSSL_KEIL
  10794. "adcs r3, r3, r6\n\t"
  10795. #elif defined(__clang__)
  10796. "adcs r3, r6\n\t"
  10797. #else
  10798. "adc r3, r6\n\t"
  10799. #endif
  10800. #ifdef WOLFSSL_KEIL
  10801. "adcs r4, r4, %[r]\n\t"
  10802. #elif defined(__clang__)
  10803. "adcs r4, %[r]\n\t"
  10804. #else
  10805. "adc r4, %[r]\n\t"
  10806. #endif
  10807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10808. "adds r2, r2, r5\n\t"
  10809. #else
  10810. "add r2, r2, r5\n\t"
  10811. #endif
  10812. #ifdef WOLFSSL_KEIL
  10813. "adcs r3, r3, r6\n\t"
  10814. #elif defined(__clang__)
  10815. "adcs r3, r6\n\t"
  10816. #else
  10817. "adc r3, r6\n\t"
  10818. #endif
  10819. #ifdef WOLFSSL_KEIL
  10820. "adcs r4, r4, %[r]\n\t"
  10821. #elif defined(__clang__)
  10822. "adcs r4, %[r]\n\t"
  10823. #else
  10824. "adc r4, %[r]\n\t"
  10825. #endif
  10826. "str r2, [sp, #12]\n\t"
  10827. "# A[4] * A[0]\n\t"
  10828. "movs r2, #0\n\t"
  10829. "mov %[a], r9\n\t"
  10830. "ldr %[a], [%[a], #16]\n\t"
  10831. "uxth r5, %[a]\n\t"
  10832. "uxth r6, r7\n\t"
  10833. #ifdef WOLFSSL_KEIL
  10834. "muls r6, r5, r6\n\t"
  10835. #elif defined(__clang__)
  10836. "muls r6, r5\n\t"
  10837. #else
  10838. "mul r6, r5\n\t"
  10839. #endif
  10840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10841. "adds r3, r3, r6\n\t"
  10842. #else
  10843. "add r3, r3, r6\n\t"
  10844. #endif
  10845. #ifdef WOLFSSL_KEIL
  10846. "adcs r4, r4, %[r]\n\t"
  10847. #elif defined(__clang__)
  10848. "adcs r4, %[r]\n\t"
  10849. #else
  10850. "adc r4, %[r]\n\t"
  10851. #endif
  10852. #ifdef WOLFSSL_KEIL
  10853. "adcs r2, r2, %[r]\n\t"
  10854. #elif defined(__clang__)
  10855. "adcs r2, %[r]\n\t"
  10856. #else
  10857. "adc r2, %[r]\n\t"
  10858. #endif
  10859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10860. "adds r3, r3, r6\n\t"
  10861. #else
  10862. "add r3, r3, r6\n\t"
  10863. #endif
  10864. #ifdef WOLFSSL_KEIL
  10865. "adcs r4, r4, %[r]\n\t"
  10866. #elif defined(__clang__)
  10867. "adcs r4, %[r]\n\t"
  10868. #else
  10869. "adc r4, %[r]\n\t"
  10870. #endif
  10871. #ifdef WOLFSSL_KEIL
  10872. "adcs r2, r2, %[r]\n\t"
  10873. #elif defined(__clang__)
  10874. "adcs r2, %[r]\n\t"
  10875. #else
  10876. "adc r2, %[r]\n\t"
  10877. #endif
  10878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10879. "lsrs r6, r7, #16\n\t"
  10880. #else
  10881. "lsr r6, r7, #16\n\t"
  10882. #endif
  10883. #ifdef WOLFSSL_KEIL
  10884. "muls r5, r6, r5\n\t"
  10885. #elif defined(__clang__)
  10886. "muls r5, r6\n\t"
  10887. #else
  10888. "mul r5, r6\n\t"
  10889. #endif
  10890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10891. "lsrs r6, r5, #16\n\t"
  10892. #else
  10893. "lsr r6, r5, #16\n\t"
  10894. #endif
  10895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10896. "lsls r5, r5, #16\n\t"
  10897. #else
  10898. "lsl r5, r5, #16\n\t"
  10899. #endif
  10900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10901. "adds r3, r3, r5\n\t"
  10902. #else
  10903. "add r3, r3, r5\n\t"
  10904. #endif
  10905. #ifdef WOLFSSL_KEIL
  10906. "adcs r4, r4, r6\n\t"
  10907. #elif defined(__clang__)
  10908. "adcs r4, r6\n\t"
  10909. #else
  10910. "adc r4, r6\n\t"
  10911. #endif
  10912. #ifdef WOLFSSL_KEIL
  10913. "adcs r2, r2, %[r]\n\t"
  10914. #elif defined(__clang__)
  10915. "adcs r2, %[r]\n\t"
  10916. #else
  10917. "adc r2, %[r]\n\t"
  10918. #endif
  10919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10920. "adds r3, r3, r5\n\t"
  10921. #else
  10922. "add r3, r3, r5\n\t"
  10923. #endif
  10924. #ifdef WOLFSSL_KEIL
  10925. "adcs r4, r4, r6\n\t"
  10926. #elif defined(__clang__)
  10927. "adcs r4, r6\n\t"
  10928. #else
  10929. "adc r4, r6\n\t"
  10930. #endif
  10931. #ifdef WOLFSSL_KEIL
  10932. "adcs r2, r2, %[r]\n\t"
  10933. #elif defined(__clang__)
  10934. "adcs r2, %[r]\n\t"
  10935. #else
  10936. "adc r2, %[r]\n\t"
  10937. #endif
  10938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10939. "lsrs r5, %[a], #16\n\t"
  10940. #else
  10941. "lsr r5, %[a], #16\n\t"
  10942. #endif
  10943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10944. "lsrs r6, r7, #16\n\t"
  10945. #else
  10946. "lsr r6, r7, #16\n\t"
  10947. #endif
  10948. #ifdef WOLFSSL_KEIL
  10949. "muls r6, r5, r6\n\t"
  10950. #elif defined(__clang__)
  10951. "muls r6, r5\n\t"
  10952. #else
  10953. "mul r6, r5\n\t"
  10954. #endif
  10955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10956. "adds r4, r4, r6\n\t"
  10957. #else
  10958. "add r4, r4, r6\n\t"
  10959. #endif
  10960. #ifdef WOLFSSL_KEIL
  10961. "adcs r2, r2, %[r]\n\t"
  10962. #elif defined(__clang__)
  10963. "adcs r2, %[r]\n\t"
  10964. #else
  10965. "adc r2, %[r]\n\t"
  10966. #endif
  10967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10968. "adds r4, r4, r6\n\t"
  10969. #else
  10970. "add r4, r4, r6\n\t"
  10971. #endif
  10972. #ifdef WOLFSSL_KEIL
  10973. "adcs r2, r2, %[r]\n\t"
  10974. #elif defined(__clang__)
  10975. "adcs r2, %[r]\n\t"
  10976. #else
  10977. "adc r2, %[r]\n\t"
  10978. #endif
  10979. "uxth r6, r7\n\t"
  10980. #ifdef WOLFSSL_KEIL
  10981. "muls r5, r6, r5\n\t"
  10982. #elif defined(__clang__)
  10983. "muls r5, r6\n\t"
  10984. #else
  10985. "mul r5, r6\n\t"
  10986. #endif
  10987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10988. "lsrs r6, r5, #16\n\t"
  10989. #else
  10990. "lsr r6, r5, #16\n\t"
  10991. #endif
  10992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10993. "lsls r5, r5, #16\n\t"
  10994. #else
  10995. "lsl r5, r5, #16\n\t"
  10996. #endif
  10997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10998. "adds r3, r3, r5\n\t"
  10999. #else
  11000. "add r3, r3, r5\n\t"
  11001. #endif
  11002. #ifdef WOLFSSL_KEIL
  11003. "adcs r4, r4, r6\n\t"
  11004. #elif defined(__clang__)
  11005. "adcs r4, r6\n\t"
  11006. #else
  11007. "adc r4, r6\n\t"
  11008. #endif
  11009. #ifdef WOLFSSL_KEIL
  11010. "adcs r2, r2, %[r]\n\t"
  11011. #elif defined(__clang__)
  11012. "adcs r2, %[r]\n\t"
  11013. #else
  11014. "adc r2, %[r]\n\t"
  11015. #endif
  11016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11017. "adds r3, r3, r5\n\t"
  11018. #else
  11019. "add r3, r3, r5\n\t"
  11020. #endif
  11021. #ifdef WOLFSSL_KEIL
  11022. "adcs r4, r4, r6\n\t"
  11023. #elif defined(__clang__)
  11024. "adcs r4, r6\n\t"
  11025. #else
  11026. "adc r4, r6\n\t"
  11027. #endif
  11028. #ifdef WOLFSSL_KEIL
  11029. "adcs r2, r2, %[r]\n\t"
  11030. #elif defined(__clang__)
  11031. "adcs r2, %[r]\n\t"
  11032. #else
  11033. "adc r2, %[r]\n\t"
  11034. #endif
  11035. "# A[3] * A[1]\n\t"
  11036. "mov %[a], r9\n\t"
  11037. "mov r7, r11\n\t"
  11038. "mov %[a], lr\n\t"
  11039. "uxth r5, %[a]\n\t"
  11040. "uxth r6, r7\n\t"
  11041. #ifdef WOLFSSL_KEIL
  11042. "muls r6, r5, r6\n\t"
  11043. #elif defined(__clang__)
  11044. "muls r6, r5\n\t"
  11045. #else
  11046. "mul r6, r5\n\t"
  11047. #endif
  11048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11049. "adds r3, r3, r6\n\t"
  11050. #else
  11051. "add r3, r3, r6\n\t"
  11052. #endif
  11053. #ifdef WOLFSSL_KEIL
  11054. "adcs r4, r4, %[r]\n\t"
  11055. #elif defined(__clang__)
  11056. "adcs r4, %[r]\n\t"
  11057. #else
  11058. "adc r4, %[r]\n\t"
  11059. #endif
  11060. #ifdef WOLFSSL_KEIL
  11061. "adcs r2, r2, %[r]\n\t"
  11062. #elif defined(__clang__)
  11063. "adcs r2, %[r]\n\t"
  11064. #else
  11065. "adc r2, %[r]\n\t"
  11066. #endif
  11067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11068. "adds r3, r3, r6\n\t"
  11069. #else
  11070. "add r3, r3, r6\n\t"
  11071. #endif
  11072. #ifdef WOLFSSL_KEIL
  11073. "adcs r4, r4, %[r]\n\t"
  11074. #elif defined(__clang__)
  11075. "adcs r4, %[r]\n\t"
  11076. #else
  11077. "adc r4, %[r]\n\t"
  11078. #endif
  11079. #ifdef WOLFSSL_KEIL
  11080. "adcs r2, r2, %[r]\n\t"
  11081. #elif defined(__clang__)
  11082. "adcs r2, %[r]\n\t"
  11083. #else
  11084. "adc r2, %[r]\n\t"
  11085. #endif
  11086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11087. "lsrs r6, r7, #16\n\t"
  11088. #else
  11089. "lsr r6, r7, #16\n\t"
  11090. #endif
  11091. #ifdef WOLFSSL_KEIL
  11092. "muls r5, r6, r5\n\t"
  11093. #elif defined(__clang__)
  11094. "muls r5, r6\n\t"
  11095. #else
  11096. "mul r5, r6\n\t"
  11097. #endif
  11098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11099. "lsrs r6, r5, #16\n\t"
  11100. #else
  11101. "lsr r6, r5, #16\n\t"
  11102. #endif
  11103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11104. "lsls r5, r5, #16\n\t"
  11105. #else
  11106. "lsl r5, r5, #16\n\t"
  11107. #endif
  11108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11109. "adds r3, r3, r5\n\t"
  11110. #else
  11111. "add r3, r3, r5\n\t"
  11112. #endif
  11113. #ifdef WOLFSSL_KEIL
  11114. "adcs r4, r4, r6\n\t"
  11115. #elif defined(__clang__)
  11116. "adcs r4, r6\n\t"
  11117. #else
  11118. "adc r4, r6\n\t"
  11119. #endif
  11120. #ifdef WOLFSSL_KEIL
  11121. "adcs r2, r2, %[r]\n\t"
  11122. #elif defined(__clang__)
  11123. "adcs r2, %[r]\n\t"
  11124. #else
  11125. "adc r2, %[r]\n\t"
  11126. #endif
  11127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11128. "adds r3, r3, r5\n\t"
  11129. #else
  11130. "add r3, r3, r5\n\t"
  11131. #endif
  11132. #ifdef WOLFSSL_KEIL
  11133. "adcs r4, r4, r6\n\t"
  11134. #elif defined(__clang__)
  11135. "adcs r4, r6\n\t"
  11136. #else
  11137. "adc r4, r6\n\t"
  11138. #endif
  11139. #ifdef WOLFSSL_KEIL
  11140. "adcs r2, r2, %[r]\n\t"
  11141. #elif defined(__clang__)
  11142. "adcs r2, %[r]\n\t"
  11143. #else
  11144. "adc r2, %[r]\n\t"
  11145. #endif
  11146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11147. "lsrs r5, %[a], #16\n\t"
  11148. #else
  11149. "lsr r5, %[a], #16\n\t"
  11150. #endif
  11151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11152. "lsrs r6, r7, #16\n\t"
  11153. #else
  11154. "lsr r6, r7, #16\n\t"
  11155. #endif
  11156. #ifdef WOLFSSL_KEIL
  11157. "muls r6, r5, r6\n\t"
  11158. #elif defined(__clang__)
  11159. "muls r6, r5\n\t"
  11160. #else
  11161. "mul r6, r5\n\t"
  11162. #endif
  11163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11164. "adds r4, r4, r6\n\t"
  11165. #else
  11166. "add r4, r4, r6\n\t"
  11167. #endif
  11168. #ifdef WOLFSSL_KEIL
  11169. "adcs r2, r2, %[r]\n\t"
  11170. #elif defined(__clang__)
  11171. "adcs r2, %[r]\n\t"
  11172. #else
  11173. "adc r2, %[r]\n\t"
  11174. #endif
  11175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11176. "adds r4, r4, r6\n\t"
  11177. #else
  11178. "add r4, r4, r6\n\t"
  11179. #endif
  11180. #ifdef WOLFSSL_KEIL
  11181. "adcs r2, r2, %[r]\n\t"
  11182. #elif defined(__clang__)
  11183. "adcs r2, %[r]\n\t"
  11184. #else
  11185. "adc r2, %[r]\n\t"
  11186. #endif
  11187. "uxth r6, r7\n\t"
  11188. #ifdef WOLFSSL_KEIL
  11189. "muls r5, r6, r5\n\t"
  11190. #elif defined(__clang__)
  11191. "muls r5, r6\n\t"
  11192. #else
  11193. "mul r5, r6\n\t"
  11194. #endif
  11195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11196. "lsrs r6, r5, #16\n\t"
  11197. #else
  11198. "lsr r6, r5, #16\n\t"
  11199. #endif
  11200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11201. "lsls r5, r5, #16\n\t"
  11202. #else
  11203. "lsl r5, r5, #16\n\t"
  11204. #endif
  11205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11206. "adds r3, r3, r5\n\t"
  11207. #else
  11208. "add r3, r3, r5\n\t"
  11209. #endif
  11210. #ifdef WOLFSSL_KEIL
  11211. "adcs r4, r4, r6\n\t"
  11212. #elif defined(__clang__)
  11213. "adcs r4, r6\n\t"
  11214. #else
  11215. "adc r4, r6\n\t"
  11216. #endif
  11217. #ifdef WOLFSSL_KEIL
  11218. "adcs r2, r2, %[r]\n\t"
  11219. #elif defined(__clang__)
  11220. "adcs r2, %[r]\n\t"
  11221. #else
  11222. "adc r2, %[r]\n\t"
  11223. #endif
  11224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11225. "adds r3, r3, r5\n\t"
  11226. #else
  11227. "add r3, r3, r5\n\t"
  11228. #endif
  11229. #ifdef WOLFSSL_KEIL
  11230. "adcs r4, r4, r6\n\t"
  11231. #elif defined(__clang__)
  11232. "adcs r4, r6\n\t"
  11233. #else
  11234. "adc r4, r6\n\t"
  11235. #endif
  11236. #ifdef WOLFSSL_KEIL
  11237. "adcs r2, r2, %[r]\n\t"
  11238. #elif defined(__clang__)
  11239. "adcs r2, %[r]\n\t"
  11240. #else
  11241. "adc r2, %[r]\n\t"
  11242. #endif
  11243. "# A[2] * A[2]\n\t"
  11244. "mov r7, r12\n\t"
  11245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11246. "lsrs r6, r7, #16\n\t"
  11247. #else
  11248. "lsr r6, r7, #16\n\t"
  11249. #endif
  11250. "uxth r5, r7\n\t"
  11251. #ifdef WOLFSSL_KEIL
  11252. "muls r5, r5, r5\n\t"
  11253. #elif defined(__clang__)
  11254. "muls r5, r5\n\t"
  11255. #else
  11256. "mul r5, r5\n\t"
  11257. #endif
  11258. #ifdef WOLFSSL_KEIL
  11259. "muls r6, r6, r6\n\t"
  11260. #elif defined(__clang__)
  11261. "muls r6, r6\n\t"
  11262. #else
  11263. "mul r6, r6\n\t"
  11264. #endif
  11265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11266. "adds r3, r3, r5\n\t"
  11267. #else
  11268. "add r3, r3, r5\n\t"
  11269. #endif
  11270. #ifdef WOLFSSL_KEIL
  11271. "adcs r4, r4, r6\n\t"
  11272. #elif defined(__clang__)
  11273. "adcs r4, r6\n\t"
  11274. #else
  11275. "adc r4, r6\n\t"
  11276. #endif
  11277. #ifdef WOLFSSL_KEIL
  11278. "adcs r2, r2, %[r]\n\t"
  11279. #elif defined(__clang__)
  11280. "adcs r2, %[r]\n\t"
  11281. #else
  11282. "adc r2, %[r]\n\t"
  11283. #endif
  11284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11285. "lsrs r6, r7, #16\n\t"
  11286. #else
  11287. "lsr r6, r7, #16\n\t"
  11288. #endif
  11289. "uxth r5, r7\n\t"
  11290. #ifdef WOLFSSL_KEIL
  11291. "muls r5, r6, r5\n\t"
  11292. #elif defined(__clang__)
  11293. "muls r5, r6\n\t"
  11294. #else
  11295. "mul r5, r6\n\t"
  11296. #endif
  11297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11298. "lsrs r6, r5, #15\n\t"
  11299. #else
  11300. "lsr r6, r5, #15\n\t"
  11301. #endif
  11302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11303. "lsls r5, r5, #17\n\t"
  11304. #else
  11305. "lsl r5, r5, #17\n\t"
  11306. #endif
  11307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11308. "adds r3, r3, r5\n\t"
  11309. #else
  11310. "add r3, r3, r5\n\t"
  11311. #endif
  11312. #ifdef WOLFSSL_KEIL
  11313. "adcs r4, r4, r6\n\t"
  11314. #elif defined(__clang__)
  11315. "adcs r4, r6\n\t"
  11316. #else
  11317. "adc r4, r6\n\t"
  11318. #endif
  11319. #ifdef WOLFSSL_KEIL
  11320. "adcs r2, r2, %[r]\n\t"
  11321. #elif defined(__clang__)
  11322. "adcs r2, %[r]\n\t"
  11323. #else
  11324. "adc r2, %[r]\n\t"
  11325. #endif
  11326. "str r3, [sp, #16]\n\t"
  11327. "# A[3] * A[2]\n\t"
  11328. "movs r3, #0\n\t"
  11329. "mov %[a], r9\n\t"
  11330. "mov %[a], lr\n\t"
  11331. "uxth r5, %[a]\n\t"
  11332. "uxth r6, r7\n\t"
  11333. #ifdef WOLFSSL_KEIL
  11334. "muls r6, r5, r6\n\t"
  11335. #elif defined(__clang__)
  11336. "muls r6, r5\n\t"
  11337. #else
  11338. "mul r6, r5\n\t"
  11339. #endif
  11340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11341. "adds r4, r4, r6\n\t"
  11342. #else
  11343. "add r4, r4, r6\n\t"
  11344. #endif
  11345. #ifdef WOLFSSL_KEIL
  11346. "adcs r2, r2, %[r]\n\t"
  11347. #elif defined(__clang__)
  11348. "adcs r2, %[r]\n\t"
  11349. #else
  11350. "adc r2, %[r]\n\t"
  11351. #endif
  11352. #ifdef WOLFSSL_KEIL
  11353. "adcs r3, r3, %[r]\n\t"
  11354. #elif defined(__clang__)
  11355. "adcs r3, %[r]\n\t"
  11356. #else
  11357. "adc r3, %[r]\n\t"
  11358. #endif
  11359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11360. "adds r4, r4, r6\n\t"
  11361. #else
  11362. "add r4, r4, r6\n\t"
  11363. #endif
  11364. #ifdef WOLFSSL_KEIL
  11365. "adcs r2, r2, %[r]\n\t"
  11366. #elif defined(__clang__)
  11367. "adcs r2, %[r]\n\t"
  11368. #else
  11369. "adc r2, %[r]\n\t"
  11370. #endif
  11371. #ifdef WOLFSSL_KEIL
  11372. "adcs r3, r3, %[r]\n\t"
  11373. #elif defined(__clang__)
  11374. "adcs r3, %[r]\n\t"
  11375. #else
  11376. "adc r3, %[r]\n\t"
  11377. #endif
  11378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11379. "lsrs r6, r7, #16\n\t"
  11380. #else
  11381. "lsr r6, r7, #16\n\t"
  11382. #endif
  11383. #ifdef WOLFSSL_KEIL
  11384. "muls r5, r6, r5\n\t"
  11385. #elif defined(__clang__)
  11386. "muls r5, r6\n\t"
  11387. #else
  11388. "mul r5, r6\n\t"
  11389. #endif
  11390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11391. "lsrs r6, r5, #16\n\t"
  11392. #else
  11393. "lsr r6, r5, #16\n\t"
  11394. #endif
  11395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11396. "lsls r5, r5, #16\n\t"
  11397. #else
  11398. "lsl r5, r5, #16\n\t"
  11399. #endif
  11400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11401. "adds r4, r4, r5\n\t"
  11402. #else
  11403. "add r4, r4, r5\n\t"
  11404. #endif
  11405. #ifdef WOLFSSL_KEIL
  11406. "adcs r2, r2, r6\n\t"
  11407. #elif defined(__clang__)
  11408. "adcs r2, r6\n\t"
  11409. #else
  11410. "adc r2, r6\n\t"
  11411. #endif
  11412. #ifdef WOLFSSL_KEIL
  11413. "adcs r3, r3, %[r]\n\t"
  11414. #elif defined(__clang__)
  11415. "adcs r3, %[r]\n\t"
  11416. #else
  11417. "adc r3, %[r]\n\t"
  11418. #endif
  11419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11420. "adds r4, r4, r5\n\t"
  11421. #else
  11422. "add r4, r4, r5\n\t"
  11423. #endif
  11424. #ifdef WOLFSSL_KEIL
  11425. "adcs r2, r2, r6\n\t"
  11426. #elif defined(__clang__)
  11427. "adcs r2, r6\n\t"
  11428. #else
  11429. "adc r2, r6\n\t"
  11430. #endif
  11431. #ifdef WOLFSSL_KEIL
  11432. "adcs r3, r3, %[r]\n\t"
  11433. #elif defined(__clang__)
  11434. "adcs r3, %[r]\n\t"
  11435. #else
  11436. "adc r3, %[r]\n\t"
  11437. #endif
  11438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11439. "lsrs r5, %[a], #16\n\t"
  11440. #else
  11441. "lsr r5, %[a], #16\n\t"
  11442. #endif
  11443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11444. "lsrs r6, r7, #16\n\t"
  11445. #else
  11446. "lsr r6, r7, #16\n\t"
  11447. #endif
  11448. #ifdef WOLFSSL_KEIL
  11449. "muls r6, r5, r6\n\t"
  11450. #elif defined(__clang__)
  11451. "muls r6, r5\n\t"
  11452. #else
  11453. "mul r6, r5\n\t"
  11454. #endif
  11455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11456. "adds r2, r2, r6\n\t"
  11457. #else
  11458. "add r2, r2, r6\n\t"
  11459. #endif
  11460. #ifdef WOLFSSL_KEIL
  11461. "adcs r3, r3, %[r]\n\t"
  11462. #elif defined(__clang__)
  11463. "adcs r3, %[r]\n\t"
  11464. #else
  11465. "adc r3, %[r]\n\t"
  11466. #endif
  11467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11468. "adds r2, r2, r6\n\t"
  11469. #else
  11470. "add r2, r2, r6\n\t"
  11471. #endif
  11472. #ifdef WOLFSSL_KEIL
  11473. "adcs r3, r3, %[r]\n\t"
  11474. #elif defined(__clang__)
  11475. "adcs r3, %[r]\n\t"
  11476. #else
  11477. "adc r3, %[r]\n\t"
  11478. #endif
  11479. "uxth r6, r7\n\t"
  11480. #ifdef WOLFSSL_KEIL
  11481. "muls r5, r6, r5\n\t"
  11482. #elif defined(__clang__)
  11483. "muls r5, r6\n\t"
  11484. #else
  11485. "mul r5, r6\n\t"
  11486. #endif
  11487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11488. "lsrs r6, r5, #16\n\t"
  11489. #else
  11490. "lsr r6, r5, #16\n\t"
  11491. #endif
  11492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11493. "lsls r5, r5, #16\n\t"
  11494. #else
  11495. "lsl r5, r5, #16\n\t"
  11496. #endif
  11497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11498. "adds r4, r4, r5\n\t"
  11499. #else
  11500. "add r4, r4, r5\n\t"
  11501. #endif
  11502. #ifdef WOLFSSL_KEIL
  11503. "adcs r2, r2, r6\n\t"
  11504. #elif defined(__clang__)
  11505. "adcs r2, r6\n\t"
  11506. #else
  11507. "adc r2, r6\n\t"
  11508. #endif
  11509. #ifdef WOLFSSL_KEIL
  11510. "adcs r3, r3, %[r]\n\t"
  11511. #elif defined(__clang__)
  11512. "adcs r3, %[r]\n\t"
  11513. #else
  11514. "adc r3, %[r]\n\t"
  11515. #endif
  11516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11517. "adds r4, r4, r5\n\t"
  11518. #else
  11519. "add r4, r4, r5\n\t"
  11520. #endif
  11521. #ifdef WOLFSSL_KEIL
  11522. "adcs r2, r2, r6\n\t"
  11523. #elif defined(__clang__)
  11524. "adcs r2, r6\n\t"
  11525. #else
  11526. "adc r2, r6\n\t"
  11527. #endif
  11528. #ifdef WOLFSSL_KEIL
  11529. "adcs r3, r3, %[r]\n\t"
  11530. #elif defined(__clang__)
  11531. "adcs r3, %[r]\n\t"
  11532. #else
  11533. "adc r3, %[r]\n\t"
  11534. #endif
  11535. "# A[4] * A[1]\n\t"
  11536. "mov %[a], r9\n\t"
  11537. "mov r7, r11\n\t"
  11538. "ldr %[a], [%[a], #16]\n\t"
  11539. "uxth r5, %[a]\n\t"
  11540. "uxth r6, r7\n\t"
  11541. #ifdef WOLFSSL_KEIL
  11542. "muls r6, r5, r6\n\t"
  11543. #elif defined(__clang__)
  11544. "muls r6, r5\n\t"
  11545. #else
  11546. "mul r6, r5\n\t"
  11547. #endif
  11548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11549. "adds r4, r4, r6\n\t"
  11550. #else
  11551. "add r4, r4, r6\n\t"
  11552. #endif
  11553. #ifdef WOLFSSL_KEIL
  11554. "adcs r2, r2, %[r]\n\t"
  11555. #elif defined(__clang__)
  11556. "adcs r2, %[r]\n\t"
  11557. #else
  11558. "adc r2, %[r]\n\t"
  11559. #endif
  11560. #ifdef WOLFSSL_KEIL
  11561. "adcs r3, r3, %[r]\n\t"
  11562. #elif defined(__clang__)
  11563. "adcs r3, %[r]\n\t"
  11564. #else
  11565. "adc r3, %[r]\n\t"
  11566. #endif
  11567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11568. "adds r4, r4, r6\n\t"
  11569. #else
  11570. "add r4, r4, r6\n\t"
  11571. #endif
  11572. #ifdef WOLFSSL_KEIL
  11573. "adcs r2, r2, %[r]\n\t"
  11574. #elif defined(__clang__)
  11575. "adcs r2, %[r]\n\t"
  11576. #else
  11577. "adc r2, %[r]\n\t"
  11578. #endif
  11579. #ifdef WOLFSSL_KEIL
  11580. "adcs r3, r3, %[r]\n\t"
  11581. #elif defined(__clang__)
  11582. "adcs r3, %[r]\n\t"
  11583. #else
  11584. "adc r3, %[r]\n\t"
  11585. #endif
  11586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11587. "lsrs r6, r7, #16\n\t"
  11588. #else
  11589. "lsr r6, r7, #16\n\t"
  11590. #endif
  11591. #ifdef WOLFSSL_KEIL
  11592. "muls r5, r6, r5\n\t"
  11593. #elif defined(__clang__)
  11594. "muls r5, r6\n\t"
  11595. #else
  11596. "mul r5, r6\n\t"
  11597. #endif
  11598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11599. "lsrs r6, r5, #16\n\t"
  11600. #else
  11601. "lsr r6, r5, #16\n\t"
  11602. #endif
  11603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11604. "lsls r5, r5, #16\n\t"
  11605. #else
  11606. "lsl r5, r5, #16\n\t"
  11607. #endif
  11608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11609. "adds r4, r4, r5\n\t"
  11610. #else
  11611. "add r4, r4, r5\n\t"
  11612. #endif
  11613. #ifdef WOLFSSL_KEIL
  11614. "adcs r2, r2, r6\n\t"
  11615. #elif defined(__clang__)
  11616. "adcs r2, r6\n\t"
  11617. #else
  11618. "adc r2, r6\n\t"
  11619. #endif
  11620. #ifdef WOLFSSL_KEIL
  11621. "adcs r3, r3, %[r]\n\t"
  11622. #elif defined(__clang__)
  11623. "adcs r3, %[r]\n\t"
  11624. #else
  11625. "adc r3, %[r]\n\t"
  11626. #endif
  11627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11628. "adds r4, r4, r5\n\t"
  11629. #else
  11630. "add r4, r4, r5\n\t"
  11631. #endif
  11632. #ifdef WOLFSSL_KEIL
  11633. "adcs r2, r2, r6\n\t"
  11634. #elif defined(__clang__)
  11635. "adcs r2, r6\n\t"
  11636. #else
  11637. "adc r2, r6\n\t"
  11638. #endif
  11639. #ifdef WOLFSSL_KEIL
  11640. "adcs r3, r3, %[r]\n\t"
  11641. #elif defined(__clang__)
  11642. "adcs r3, %[r]\n\t"
  11643. #else
  11644. "adc r3, %[r]\n\t"
  11645. #endif
  11646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11647. "lsrs r5, %[a], #16\n\t"
  11648. #else
  11649. "lsr r5, %[a], #16\n\t"
  11650. #endif
  11651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11652. "lsrs r6, r7, #16\n\t"
  11653. #else
  11654. "lsr r6, r7, #16\n\t"
  11655. #endif
  11656. #ifdef WOLFSSL_KEIL
  11657. "muls r6, r5, r6\n\t"
  11658. #elif defined(__clang__)
  11659. "muls r6, r5\n\t"
  11660. #else
  11661. "mul r6, r5\n\t"
  11662. #endif
  11663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11664. "adds r2, r2, r6\n\t"
  11665. #else
  11666. "add r2, r2, r6\n\t"
  11667. #endif
  11668. #ifdef WOLFSSL_KEIL
  11669. "adcs r3, r3, %[r]\n\t"
  11670. #elif defined(__clang__)
  11671. "adcs r3, %[r]\n\t"
  11672. #else
  11673. "adc r3, %[r]\n\t"
  11674. #endif
  11675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11676. "adds r2, r2, r6\n\t"
  11677. #else
  11678. "add r2, r2, r6\n\t"
  11679. #endif
  11680. #ifdef WOLFSSL_KEIL
  11681. "adcs r3, r3, %[r]\n\t"
  11682. #elif defined(__clang__)
  11683. "adcs r3, %[r]\n\t"
  11684. #else
  11685. "adc r3, %[r]\n\t"
  11686. #endif
  11687. "uxth r6, r7\n\t"
  11688. #ifdef WOLFSSL_KEIL
  11689. "muls r5, r6, r5\n\t"
  11690. #elif defined(__clang__)
  11691. "muls r5, r6\n\t"
  11692. #else
  11693. "mul r5, r6\n\t"
  11694. #endif
  11695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11696. "lsrs r6, r5, #16\n\t"
  11697. #else
  11698. "lsr r6, r5, #16\n\t"
  11699. #endif
  11700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11701. "lsls r5, r5, #16\n\t"
  11702. #else
  11703. "lsl r5, r5, #16\n\t"
  11704. #endif
  11705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11706. "adds r4, r4, r5\n\t"
  11707. #else
  11708. "add r4, r4, r5\n\t"
  11709. #endif
  11710. #ifdef WOLFSSL_KEIL
  11711. "adcs r2, r2, r6\n\t"
  11712. #elif defined(__clang__)
  11713. "adcs r2, r6\n\t"
  11714. #else
  11715. "adc r2, r6\n\t"
  11716. #endif
  11717. #ifdef WOLFSSL_KEIL
  11718. "adcs r3, r3, %[r]\n\t"
  11719. #elif defined(__clang__)
  11720. "adcs r3, %[r]\n\t"
  11721. #else
  11722. "adc r3, %[r]\n\t"
  11723. #endif
  11724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11725. "adds r4, r4, r5\n\t"
  11726. #else
  11727. "add r4, r4, r5\n\t"
  11728. #endif
  11729. #ifdef WOLFSSL_KEIL
  11730. "adcs r2, r2, r6\n\t"
  11731. #elif defined(__clang__)
  11732. "adcs r2, r6\n\t"
  11733. #else
  11734. "adc r2, r6\n\t"
  11735. #endif
  11736. #ifdef WOLFSSL_KEIL
  11737. "adcs r3, r3, %[r]\n\t"
  11738. #elif defined(__clang__)
  11739. "adcs r3, %[r]\n\t"
  11740. #else
  11741. "adc r3, %[r]\n\t"
  11742. #endif
  11743. "# A[5] * A[0]\n\t"
  11744. "mov %[a], r9\n\t"
  11745. "mov r7, r10\n\t"
  11746. "ldr %[a], [%[a], #20]\n\t"
  11747. "uxth r5, %[a]\n\t"
  11748. "uxth r6, r7\n\t"
  11749. #ifdef WOLFSSL_KEIL
  11750. "muls r6, r5, r6\n\t"
  11751. #elif defined(__clang__)
  11752. "muls r6, r5\n\t"
  11753. #else
  11754. "mul r6, r5\n\t"
  11755. #endif
  11756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11757. "adds r4, r4, r6\n\t"
  11758. #else
  11759. "add r4, r4, r6\n\t"
  11760. #endif
  11761. #ifdef WOLFSSL_KEIL
  11762. "adcs r2, r2, %[r]\n\t"
  11763. #elif defined(__clang__)
  11764. "adcs r2, %[r]\n\t"
  11765. #else
  11766. "adc r2, %[r]\n\t"
  11767. #endif
  11768. #ifdef WOLFSSL_KEIL
  11769. "adcs r3, r3, %[r]\n\t"
  11770. #elif defined(__clang__)
  11771. "adcs r3, %[r]\n\t"
  11772. #else
  11773. "adc r3, %[r]\n\t"
  11774. #endif
  11775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11776. "adds r4, r4, r6\n\t"
  11777. #else
  11778. "add r4, r4, r6\n\t"
  11779. #endif
  11780. #ifdef WOLFSSL_KEIL
  11781. "adcs r2, r2, %[r]\n\t"
  11782. #elif defined(__clang__)
  11783. "adcs r2, %[r]\n\t"
  11784. #else
  11785. "adc r2, %[r]\n\t"
  11786. #endif
  11787. #ifdef WOLFSSL_KEIL
  11788. "adcs r3, r3, %[r]\n\t"
  11789. #elif defined(__clang__)
  11790. "adcs r3, %[r]\n\t"
  11791. #else
  11792. "adc r3, %[r]\n\t"
  11793. #endif
  11794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11795. "lsrs r6, r7, #16\n\t"
  11796. #else
  11797. "lsr r6, r7, #16\n\t"
  11798. #endif
  11799. #ifdef WOLFSSL_KEIL
  11800. "muls r5, r6, r5\n\t"
  11801. #elif defined(__clang__)
  11802. "muls r5, r6\n\t"
  11803. #else
  11804. "mul r5, r6\n\t"
  11805. #endif
  11806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11807. "lsrs r6, r5, #16\n\t"
  11808. #else
  11809. "lsr r6, r5, #16\n\t"
  11810. #endif
  11811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11812. "lsls r5, r5, #16\n\t"
  11813. #else
  11814. "lsl r5, r5, #16\n\t"
  11815. #endif
  11816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11817. "adds r4, r4, r5\n\t"
  11818. #else
  11819. "add r4, r4, r5\n\t"
  11820. #endif
  11821. #ifdef WOLFSSL_KEIL
  11822. "adcs r2, r2, r6\n\t"
  11823. #elif defined(__clang__)
  11824. "adcs r2, r6\n\t"
  11825. #else
  11826. "adc r2, r6\n\t"
  11827. #endif
  11828. #ifdef WOLFSSL_KEIL
  11829. "adcs r3, r3, %[r]\n\t"
  11830. #elif defined(__clang__)
  11831. "adcs r3, %[r]\n\t"
  11832. #else
  11833. "adc r3, %[r]\n\t"
  11834. #endif
  11835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11836. "adds r4, r4, r5\n\t"
  11837. #else
  11838. "add r4, r4, r5\n\t"
  11839. #endif
  11840. #ifdef WOLFSSL_KEIL
  11841. "adcs r2, r2, r6\n\t"
  11842. #elif defined(__clang__)
  11843. "adcs r2, r6\n\t"
  11844. #else
  11845. "adc r2, r6\n\t"
  11846. #endif
  11847. #ifdef WOLFSSL_KEIL
  11848. "adcs r3, r3, %[r]\n\t"
  11849. #elif defined(__clang__)
  11850. "adcs r3, %[r]\n\t"
  11851. #else
  11852. "adc r3, %[r]\n\t"
  11853. #endif
  11854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11855. "lsrs r5, %[a], #16\n\t"
  11856. #else
  11857. "lsr r5, %[a], #16\n\t"
  11858. #endif
  11859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11860. "lsrs r6, r7, #16\n\t"
  11861. #else
  11862. "lsr r6, r7, #16\n\t"
  11863. #endif
  11864. #ifdef WOLFSSL_KEIL
  11865. "muls r6, r5, r6\n\t"
  11866. #elif defined(__clang__)
  11867. "muls r6, r5\n\t"
  11868. #else
  11869. "mul r6, r5\n\t"
  11870. #endif
  11871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11872. "adds r2, r2, r6\n\t"
  11873. #else
  11874. "add r2, r2, r6\n\t"
  11875. #endif
  11876. #ifdef WOLFSSL_KEIL
  11877. "adcs r3, r3, %[r]\n\t"
  11878. #elif defined(__clang__)
  11879. "adcs r3, %[r]\n\t"
  11880. #else
  11881. "adc r3, %[r]\n\t"
  11882. #endif
  11883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11884. "adds r2, r2, r6\n\t"
  11885. #else
  11886. "add r2, r2, r6\n\t"
  11887. #endif
  11888. #ifdef WOLFSSL_KEIL
  11889. "adcs r3, r3, %[r]\n\t"
  11890. #elif defined(__clang__)
  11891. "adcs r3, %[r]\n\t"
  11892. #else
  11893. "adc r3, %[r]\n\t"
  11894. #endif
  11895. "uxth r6, r7\n\t"
  11896. #ifdef WOLFSSL_KEIL
  11897. "muls r5, r6, r5\n\t"
  11898. #elif defined(__clang__)
  11899. "muls r5, r6\n\t"
  11900. #else
  11901. "mul r5, r6\n\t"
  11902. #endif
  11903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11904. "lsrs r6, r5, #16\n\t"
  11905. #else
  11906. "lsr r6, r5, #16\n\t"
  11907. #endif
  11908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11909. "lsls r5, r5, #16\n\t"
  11910. #else
  11911. "lsl r5, r5, #16\n\t"
  11912. #endif
  11913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11914. "adds r4, r4, r5\n\t"
  11915. #else
  11916. "add r4, r4, r5\n\t"
  11917. #endif
  11918. #ifdef WOLFSSL_KEIL
  11919. "adcs r2, r2, r6\n\t"
  11920. #elif defined(__clang__)
  11921. "adcs r2, r6\n\t"
  11922. #else
  11923. "adc r2, r6\n\t"
  11924. #endif
  11925. #ifdef WOLFSSL_KEIL
  11926. "adcs r3, r3, %[r]\n\t"
  11927. #elif defined(__clang__)
  11928. "adcs r3, %[r]\n\t"
  11929. #else
  11930. "adc r3, %[r]\n\t"
  11931. #endif
  11932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11933. "adds r4, r4, r5\n\t"
  11934. #else
  11935. "add r4, r4, r5\n\t"
  11936. #endif
  11937. #ifdef WOLFSSL_KEIL
  11938. "adcs r2, r2, r6\n\t"
  11939. #elif defined(__clang__)
  11940. "adcs r2, r6\n\t"
  11941. #else
  11942. "adc r2, r6\n\t"
  11943. #endif
  11944. #ifdef WOLFSSL_KEIL
  11945. "adcs r3, r3, %[r]\n\t"
  11946. #elif defined(__clang__)
  11947. "adcs r3, %[r]\n\t"
  11948. #else
  11949. "adc r3, %[r]\n\t"
  11950. #endif
  11951. "str r4, [sp, #20]\n\t"
  11952. "# A[6] * A[0]\n\t"
  11953. "movs r4, #0\n\t"
  11954. "mov %[a], r9\n\t"
  11955. "ldr %[a], [%[a], #24]\n\t"
  11956. "uxth r5, %[a]\n\t"
  11957. "uxth r6, r7\n\t"
  11958. #ifdef WOLFSSL_KEIL
  11959. "muls r6, r5, r6\n\t"
  11960. #elif defined(__clang__)
  11961. "muls r6, r5\n\t"
  11962. #else
  11963. "mul r6, r5\n\t"
  11964. #endif
  11965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11966. "adds r2, r2, r6\n\t"
  11967. #else
  11968. "add r2, r2, r6\n\t"
  11969. #endif
  11970. #ifdef WOLFSSL_KEIL
  11971. "adcs r3, r3, %[r]\n\t"
  11972. #elif defined(__clang__)
  11973. "adcs r3, %[r]\n\t"
  11974. #else
  11975. "adc r3, %[r]\n\t"
  11976. #endif
  11977. #ifdef WOLFSSL_KEIL
  11978. "adcs r4, r4, %[r]\n\t"
  11979. #elif defined(__clang__)
  11980. "adcs r4, %[r]\n\t"
  11981. #else
  11982. "adc r4, %[r]\n\t"
  11983. #endif
  11984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11985. "adds r2, r2, r6\n\t"
  11986. #else
  11987. "add r2, r2, r6\n\t"
  11988. #endif
  11989. #ifdef WOLFSSL_KEIL
  11990. "adcs r3, r3, %[r]\n\t"
  11991. #elif defined(__clang__)
  11992. "adcs r3, %[r]\n\t"
  11993. #else
  11994. "adc r3, %[r]\n\t"
  11995. #endif
  11996. #ifdef WOLFSSL_KEIL
  11997. "adcs r4, r4, %[r]\n\t"
  11998. #elif defined(__clang__)
  11999. "adcs r4, %[r]\n\t"
  12000. #else
  12001. "adc r4, %[r]\n\t"
  12002. #endif
  12003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12004. "lsrs r6, r7, #16\n\t"
  12005. #else
  12006. "lsr r6, r7, #16\n\t"
  12007. #endif
  12008. #ifdef WOLFSSL_KEIL
  12009. "muls r5, r6, r5\n\t"
  12010. #elif defined(__clang__)
  12011. "muls r5, r6\n\t"
  12012. #else
  12013. "mul r5, r6\n\t"
  12014. #endif
  12015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12016. "lsrs r6, r5, #16\n\t"
  12017. #else
  12018. "lsr r6, r5, #16\n\t"
  12019. #endif
  12020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12021. "lsls r5, r5, #16\n\t"
  12022. #else
  12023. "lsl r5, r5, #16\n\t"
  12024. #endif
  12025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12026. "adds r2, r2, r5\n\t"
  12027. #else
  12028. "add r2, r2, r5\n\t"
  12029. #endif
  12030. #ifdef WOLFSSL_KEIL
  12031. "adcs r3, r3, r6\n\t"
  12032. #elif defined(__clang__)
  12033. "adcs r3, r6\n\t"
  12034. #else
  12035. "adc r3, r6\n\t"
  12036. #endif
  12037. #ifdef WOLFSSL_KEIL
  12038. "adcs r4, r4, %[r]\n\t"
  12039. #elif defined(__clang__)
  12040. "adcs r4, %[r]\n\t"
  12041. #else
  12042. "adc r4, %[r]\n\t"
  12043. #endif
  12044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12045. "adds r2, r2, r5\n\t"
  12046. #else
  12047. "add r2, r2, r5\n\t"
  12048. #endif
  12049. #ifdef WOLFSSL_KEIL
  12050. "adcs r3, r3, r6\n\t"
  12051. #elif defined(__clang__)
  12052. "adcs r3, r6\n\t"
  12053. #else
  12054. "adc r3, r6\n\t"
  12055. #endif
  12056. #ifdef WOLFSSL_KEIL
  12057. "adcs r4, r4, %[r]\n\t"
  12058. #elif defined(__clang__)
  12059. "adcs r4, %[r]\n\t"
  12060. #else
  12061. "adc r4, %[r]\n\t"
  12062. #endif
  12063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12064. "lsrs r5, %[a], #16\n\t"
  12065. #else
  12066. "lsr r5, %[a], #16\n\t"
  12067. #endif
  12068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12069. "lsrs r6, r7, #16\n\t"
  12070. #else
  12071. "lsr r6, r7, #16\n\t"
  12072. #endif
  12073. #ifdef WOLFSSL_KEIL
  12074. "muls r6, r5, r6\n\t"
  12075. #elif defined(__clang__)
  12076. "muls r6, r5\n\t"
  12077. #else
  12078. "mul r6, r5\n\t"
  12079. #endif
  12080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12081. "adds r3, r3, r6\n\t"
  12082. #else
  12083. "add r3, r3, r6\n\t"
  12084. #endif
  12085. #ifdef WOLFSSL_KEIL
  12086. "adcs r4, r4, %[r]\n\t"
  12087. #elif defined(__clang__)
  12088. "adcs r4, %[r]\n\t"
  12089. #else
  12090. "adc r4, %[r]\n\t"
  12091. #endif
  12092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12093. "adds r3, r3, r6\n\t"
  12094. #else
  12095. "add r3, r3, r6\n\t"
  12096. #endif
  12097. #ifdef WOLFSSL_KEIL
  12098. "adcs r4, r4, %[r]\n\t"
  12099. #elif defined(__clang__)
  12100. "adcs r4, %[r]\n\t"
  12101. #else
  12102. "adc r4, %[r]\n\t"
  12103. #endif
  12104. "uxth r6, r7\n\t"
  12105. #ifdef WOLFSSL_KEIL
  12106. "muls r5, r6, r5\n\t"
  12107. #elif defined(__clang__)
  12108. "muls r5, r6\n\t"
  12109. #else
  12110. "mul r5, r6\n\t"
  12111. #endif
  12112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12113. "lsrs r6, r5, #16\n\t"
  12114. #else
  12115. "lsr r6, r5, #16\n\t"
  12116. #endif
  12117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12118. "lsls r5, r5, #16\n\t"
  12119. #else
  12120. "lsl r5, r5, #16\n\t"
  12121. #endif
  12122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12123. "adds r2, r2, r5\n\t"
  12124. #else
  12125. "add r2, r2, r5\n\t"
  12126. #endif
  12127. #ifdef WOLFSSL_KEIL
  12128. "adcs r3, r3, r6\n\t"
  12129. #elif defined(__clang__)
  12130. "adcs r3, r6\n\t"
  12131. #else
  12132. "adc r3, r6\n\t"
  12133. #endif
  12134. #ifdef WOLFSSL_KEIL
  12135. "adcs r4, r4, %[r]\n\t"
  12136. #elif defined(__clang__)
  12137. "adcs r4, %[r]\n\t"
  12138. #else
  12139. "adc r4, %[r]\n\t"
  12140. #endif
  12141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12142. "adds r2, r2, r5\n\t"
  12143. #else
  12144. "add r2, r2, r5\n\t"
  12145. #endif
  12146. #ifdef WOLFSSL_KEIL
  12147. "adcs r3, r3, r6\n\t"
  12148. #elif defined(__clang__)
  12149. "adcs r3, r6\n\t"
  12150. #else
  12151. "adc r3, r6\n\t"
  12152. #endif
  12153. #ifdef WOLFSSL_KEIL
  12154. "adcs r4, r4, %[r]\n\t"
  12155. #elif defined(__clang__)
  12156. "adcs r4, %[r]\n\t"
  12157. #else
  12158. "adc r4, %[r]\n\t"
  12159. #endif
  12160. "# A[5] * A[1]\n\t"
  12161. "mov %[a], r9\n\t"
  12162. "mov r7, r11\n\t"
  12163. "ldr %[a], [%[a], #20]\n\t"
  12164. "uxth r5, %[a]\n\t"
  12165. "uxth r6, r7\n\t"
  12166. #ifdef WOLFSSL_KEIL
  12167. "muls r6, r5, r6\n\t"
  12168. #elif defined(__clang__)
  12169. "muls r6, r5\n\t"
  12170. #else
  12171. "mul r6, r5\n\t"
  12172. #endif
  12173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12174. "adds r2, r2, r6\n\t"
  12175. #else
  12176. "add r2, r2, r6\n\t"
  12177. #endif
  12178. #ifdef WOLFSSL_KEIL
  12179. "adcs r3, r3, %[r]\n\t"
  12180. #elif defined(__clang__)
  12181. "adcs r3, %[r]\n\t"
  12182. #else
  12183. "adc r3, %[r]\n\t"
  12184. #endif
  12185. #ifdef WOLFSSL_KEIL
  12186. "adcs r4, r4, %[r]\n\t"
  12187. #elif defined(__clang__)
  12188. "adcs r4, %[r]\n\t"
  12189. #else
  12190. "adc r4, %[r]\n\t"
  12191. #endif
  12192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12193. "adds r2, r2, r6\n\t"
  12194. #else
  12195. "add r2, r2, r6\n\t"
  12196. #endif
  12197. #ifdef WOLFSSL_KEIL
  12198. "adcs r3, r3, %[r]\n\t"
  12199. #elif defined(__clang__)
  12200. "adcs r3, %[r]\n\t"
  12201. #else
  12202. "adc r3, %[r]\n\t"
  12203. #endif
  12204. #ifdef WOLFSSL_KEIL
  12205. "adcs r4, r4, %[r]\n\t"
  12206. #elif defined(__clang__)
  12207. "adcs r4, %[r]\n\t"
  12208. #else
  12209. "adc r4, %[r]\n\t"
  12210. #endif
  12211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12212. "lsrs r6, r7, #16\n\t"
  12213. #else
  12214. "lsr r6, r7, #16\n\t"
  12215. #endif
  12216. #ifdef WOLFSSL_KEIL
  12217. "muls r5, r6, r5\n\t"
  12218. #elif defined(__clang__)
  12219. "muls r5, r6\n\t"
  12220. #else
  12221. "mul r5, r6\n\t"
  12222. #endif
  12223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12224. "lsrs r6, r5, #16\n\t"
  12225. #else
  12226. "lsr r6, r5, #16\n\t"
  12227. #endif
  12228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12229. "lsls r5, r5, #16\n\t"
  12230. #else
  12231. "lsl r5, r5, #16\n\t"
  12232. #endif
  12233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12234. "adds r2, r2, r5\n\t"
  12235. #else
  12236. "add r2, r2, r5\n\t"
  12237. #endif
  12238. #ifdef WOLFSSL_KEIL
  12239. "adcs r3, r3, r6\n\t"
  12240. #elif defined(__clang__)
  12241. "adcs r3, r6\n\t"
  12242. #else
  12243. "adc r3, r6\n\t"
  12244. #endif
  12245. #ifdef WOLFSSL_KEIL
  12246. "adcs r4, r4, %[r]\n\t"
  12247. #elif defined(__clang__)
  12248. "adcs r4, %[r]\n\t"
  12249. #else
  12250. "adc r4, %[r]\n\t"
  12251. #endif
  12252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12253. "adds r2, r2, r5\n\t"
  12254. #else
  12255. "add r2, r2, r5\n\t"
  12256. #endif
  12257. #ifdef WOLFSSL_KEIL
  12258. "adcs r3, r3, r6\n\t"
  12259. #elif defined(__clang__)
  12260. "adcs r3, r6\n\t"
  12261. #else
  12262. "adc r3, r6\n\t"
  12263. #endif
  12264. #ifdef WOLFSSL_KEIL
  12265. "adcs r4, r4, %[r]\n\t"
  12266. #elif defined(__clang__)
  12267. "adcs r4, %[r]\n\t"
  12268. #else
  12269. "adc r4, %[r]\n\t"
  12270. #endif
  12271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12272. "lsrs r5, %[a], #16\n\t"
  12273. #else
  12274. "lsr r5, %[a], #16\n\t"
  12275. #endif
  12276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12277. "lsrs r6, r7, #16\n\t"
  12278. #else
  12279. "lsr r6, r7, #16\n\t"
  12280. #endif
  12281. #ifdef WOLFSSL_KEIL
  12282. "muls r6, r5, r6\n\t"
  12283. #elif defined(__clang__)
  12284. "muls r6, r5\n\t"
  12285. #else
  12286. "mul r6, r5\n\t"
  12287. #endif
  12288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12289. "adds r3, r3, r6\n\t"
  12290. #else
  12291. "add r3, r3, r6\n\t"
  12292. #endif
  12293. #ifdef WOLFSSL_KEIL
  12294. "adcs r4, r4, %[r]\n\t"
  12295. #elif defined(__clang__)
  12296. "adcs r4, %[r]\n\t"
  12297. #else
  12298. "adc r4, %[r]\n\t"
  12299. #endif
  12300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12301. "adds r3, r3, r6\n\t"
  12302. #else
  12303. "add r3, r3, r6\n\t"
  12304. #endif
  12305. #ifdef WOLFSSL_KEIL
  12306. "adcs r4, r4, %[r]\n\t"
  12307. #elif defined(__clang__)
  12308. "adcs r4, %[r]\n\t"
  12309. #else
  12310. "adc r4, %[r]\n\t"
  12311. #endif
  12312. "uxth r6, r7\n\t"
  12313. #ifdef WOLFSSL_KEIL
  12314. "muls r5, r6, r5\n\t"
  12315. #elif defined(__clang__)
  12316. "muls r5, r6\n\t"
  12317. #else
  12318. "mul r5, r6\n\t"
  12319. #endif
  12320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12321. "lsrs r6, r5, #16\n\t"
  12322. #else
  12323. "lsr r6, r5, #16\n\t"
  12324. #endif
  12325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12326. "lsls r5, r5, #16\n\t"
  12327. #else
  12328. "lsl r5, r5, #16\n\t"
  12329. #endif
  12330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12331. "adds r2, r2, r5\n\t"
  12332. #else
  12333. "add r2, r2, r5\n\t"
  12334. #endif
  12335. #ifdef WOLFSSL_KEIL
  12336. "adcs r3, r3, r6\n\t"
  12337. #elif defined(__clang__)
  12338. "adcs r3, r6\n\t"
  12339. #else
  12340. "adc r3, r6\n\t"
  12341. #endif
  12342. #ifdef WOLFSSL_KEIL
  12343. "adcs r4, r4, %[r]\n\t"
  12344. #elif defined(__clang__)
  12345. "adcs r4, %[r]\n\t"
  12346. #else
  12347. "adc r4, %[r]\n\t"
  12348. #endif
  12349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12350. "adds r2, r2, r5\n\t"
  12351. #else
  12352. "add r2, r2, r5\n\t"
  12353. #endif
  12354. #ifdef WOLFSSL_KEIL
  12355. "adcs r3, r3, r6\n\t"
  12356. #elif defined(__clang__)
  12357. "adcs r3, r6\n\t"
  12358. #else
  12359. "adc r3, r6\n\t"
  12360. #endif
  12361. #ifdef WOLFSSL_KEIL
  12362. "adcs r4, r4, %[r]\n\t"
  12363. #elif defined(__clang__)
  12364. "adcs r4, %[r]\n\t"
  12365. #else
  12366. "adc r4, %[r]\n\t"
  12367. #endif
  12368. "# A[4] * A[2]\n\t"
  12369. "mov %[a], r9\n\t"
  12370. "mov r7, r12\n\t"
  12371. "ldr %[a], [%[a], #16]\n\t"
  12372. "uxth r5, %[a]\n\t"
  12373. "uxth r6, r7\n\t"
  12374. #ifdef WOLFSSL_KEIL
  12375. "muls r6, r5, r6\n\t"
  12376. #elif defined(__clang__)
  12377. "muls r6, r5\n\t"
  12378. #else
  12379. "mul r6, r5\n\t"
  12380. #endif
  12381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12382. "adds r2, r2, r6\n\t"
  12383. #else
  12384. "add r2, r2, r6\n\t"
  12385. #endif
  12386. #ifdef WOLFSSL_KEIL
  12387. "adcs r3, r3, %[r]\n\t"
  12388. #elif defined(__clang__)
  12389. "adcs r3, %[r]\n\t"
  12390. #else
  12391. "adc r3, %[r]\n\t"
  12392. #endif
  12393. #ifdef WOLFSSL_KEIL
  12394. "adcs r4, r4, %[r]\n\t"
  12395. #elif defined(__clang__)
  12396. "adcs r4, %[r]\n\t"
  12397. #else
  12398. "adc r4, %[r]\n\t"
  12399. #endif
  12400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12401. "adds r2, r2, r6\n\t"
  12402. #else
  12403. "add r2, r2, r6\n\t"
  12404. #endif
  12405. #ifdef WOLFSSL_KEIL
  12406. "adcs r3, r3, %[r]\n\t"
  12407. #elif defined(__clang__)
  12408. "adcs r3, %[r]\n\t"
  12409. #else
  12410. "adc r3, %[r]\n\t"
  12411. #endif
  12412. #ifdef WOLFSSL_KEIL
  12413. "adcs r4, r4, %[r]\n\t"
  12414. #elif defined(__clang__)
  12415. "adcs r4, %[r]\n\t"
  12416. #else
  12417. "adc r4, %[r]\n\t"
  12418. #endif
  12419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12420. "lsrs r6, r7, #16\n\t"
  12421. #else
  12422. "lsr r6, r7, #16\n\t"
  12423. #endif
  12424. #ifdef WOLFSSL_KEIL
  12425. "muls r5, r6, r5\n\t"
  12426. #elif defined(__clang__)
  12427. "muls r5, r6\n\t"
  12428. #else
  12429. "mul r5, r6\n\t"
  12430. #endif
  12431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12432. "lsrs r6, r5, #16\n\t"
  12433. #else
  12434. "lsr r6, r5, #16\n\t"
  12435. #endif
  12436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12437. "lsls r5, r5, #16\n\t"
  12438. #else
  12439. "lsl r5, r5, #16\n\t"
  12440. #endif
  12441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12442. "adds r2, r2, r5\n\t"
  12443. #else
  12444. "add r2, r2, r5\n\t"
  12445. #endif
  12446. #ifdef WOLFSSL_KEIL
  12447. "adcs r3, r3, r6\n\t"
  12448. #elif defined(__clang__)
  12449. "adcs r3, r6\n\t"
  12450. #else
  12451. "adc r3, r6\n\t"
  12452. #endif
  12453. #ifdef WOLFSSL_KEIL
  12454. "adcs r4, r4, %[r]\n\t"
  12455. #elif defined(__clang__)
  12456. "adcs r4, %[r]\n\t"
  12457. #else
  12458. "adc r4, %[r]\n\t"
  12459. #endif
  12460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12461. "adds r2, r2, r5\n\t"
  12462. #else
  12463. "add r2, r2, r5\n\t"
  12464. #endif
  12465. #ifdef WOLFSSL_KEIL
  12466. "adcs r3, r3, r6\n\t"
  12467. #elif defined(__clang__)
  12468. "adcs r3, r6\n\t"
  12469. #else
  12470. "adc r3, r6\n\t"
  12471. #endif
  12472. #ifdef WOLFSSL_KEIL
  12473. "adcs r4, r4, %[r]\n\t"
  12474. #elif defined(__clang__)
  12475. "adcs r4, %[r]\n\t"
  12476. #else
  12477. "adc r4, %[r]\n\t"
  12478. #endif
  12479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12480. "lsrs r5, %[a], #16\n\t"
  12481. #else
  12482. "lsr r5, %[a], #16\n\t"
  12483. #endif
  12484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12485. "lsrs r6, r7, #16\n\t"
  12486. #else
  12487. "lsr r6, r7, #16\n\t"
  12488. #endif
  12489. #ifdef WOLFSSL_KEIL
  12490. "muls r6, r5, r6\n\t"
  12491. #elif defined(__clang__)
  12492. "muls r6, r5\n\t"
  12493. #else
  12494. "mul r6, r5\n\t"
  12495. #endif
  12496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12497. "adds r3, r3, r6\n\t"
  12498. #else
  12499. "add r3, r3, r6\n\t"
  12500. #endif
  12501. #ifdef WOLFSSL_KEIL
  12502. "adcs r4, r4, %[r]\n\t"
  12503. #elif defined(__clang__)
  12504. "adcs r4, %[r]\n\t"
  12505. #else
  12506. "adc r4, %[r]\n\t"
  12507. #endif
  12508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12509. "adds r3, r3, r6\n\t"
  12510. #else
  12511. "add r3, r3, r6\n\t"
  12512. #endif
  12513. #ifdef WOLFSSL_KEIL
  12514. "adcs r4, r4, %[r]\n\t"
  12515. #elif defined(__clang__)
  12516. "adcs r4, %[r]\n\t"
  12517. #else
  12518. "adc r4, %[r]\n\t"
  12519. #endif
  12520. "uxth r6, r7\n\t"
  12521. #ifdef WOLFSSL_KEIL
  12522. "muls r5, r6, r5\n\t"
  12523. #elif defined(__clang__)
  12524. "muls r5, r6\n\t"
  12525. #else
  12526. "mul r5, r6\n\t"
  12527. #endif
  12528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12529. "lsrs r6, r5, #16\n\t"
  12530. #else
  12531. "lsr r6, r5, #16\n\t"
  12532. #endif
  12533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12534. "lsls r5, r5, #16\n\t"
  12535. #else
  12536. "lsl r5, r5, #16\n\t"
  12537. #endif
  12538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12539. "adds r2, r2, r5\n\t"
  12540. #else
  12541. "add r2, r2, r5\n\t"
  12542. #endif
  12543. #ifdef WOLFSSL_KEIL
  12544. "adcs r3, r3, r6\n\t"
  12545. #elif defined(__clang__)
  12546. "adcs r3, r6\n\t"
  12547. #else
  12548. "adc r3, r6\n\t"
  12549. #endif
  12550. #ifdef WOLFSSL_KEIL
  12551. "adcs r4, r4, %[r]\n\t"
  12552. #elif defined(__clang__)
  12553. "adcs r4, %[r]\n\t"
  12554. #else
  12555. "adc r4, %[r]\n\t"
  12556. #endif
  12557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12558. "adds r2, r2, r5\n\t"
  12559. #else
  12560. "add r2, r2, r5\n\t"
  12561. #endif
  12562. #ifdef WOLFSSL_KEIL
  12563. "adcs r3, r3, r6\n\t"
  12564. #elif defined(__clang__)
  12565. "adcs r3, r6\n\t"
  12566. #else
  12567. "adc r3, r6\n\t"
  12568. #endif
  12569. #ifdef WOLFSSL_KEIL
  12570. "adcs r4, r4, %[r]\n\t"
  12571. #elif defined(__clang__)
  12572. "adcs r4, %[r]\n\t"
  12573. #else
  12574. "adc r4, %[r]\n\t"
  12575. #endif
  12576. "# A[3] * A[3]\n\t"
  12577. "mov r7, lr\n\t"
  12578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12579. "lsrs r6, r7, #16\n\t"
  12580. #else
  12581. "lsr r6, r7, #16\n\t"
  12582. #endif
  12583. "uxth r5, r7\n\t"
  12584. #ifdef WOLFSSL_KEIL
  12585. "muls r5, r5, r5\n\t"
  12586. #elif defined(__clang__)
  12587. "muls r5, r5\n\t"
  12588. #else
  12589. "mul r5, r5\n\t"
  12590. #endif
  12591. #ifdef WOLFSSL_KEIL
  12592. "muls r6, r6, r6\n\t"
  12593. #elif defined(__clang__)
  12594. "muls r6, r6\n\t"
  12595. #else
  12596. "mul r6, r6\n\t"
  12597. #endif
  12598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12599. "adds r2, r2, r5\n\t"
  12600. #else
  12601. "add r2, r2, r5\n\t"
  12602. #endif
  12603. #ifdef WOLFSSL_KEIL
  12604. "adcs r3, r3, r6\n\t"
  12605. #elif defined(__clang__)
  12606. "adcs r3, r6\n\t"
  12607. #else
  12608. "adc r3, r6\n\t"
  12609. #endif
  12610. #ifdef WOLFSSL_KEIL
  12611. "adcs r4, r4, %[r]\n\t"
  12612. #elif defined(__clang__)
  12613. "adcs r4, %[r]\n\t"
  12614. #else
  12615. "adc r4, %[r]\n\t"
  12616. #endif
  12617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12618. "lsrs r6, r7, #16\n\t"
  12619. #else
  12620. "lsr r6, r7, #16\n\t"
  12621. #endif
  12622. "uxth r5, r7\n\t"
  12623. #ifdef WOLFSSL_KEIL
  12624. "muls r5, r6, r5\n\t"
  12625. #elif defined(__clang__)
  12626. "muls r5, r6\n\t"
  12627. #else
  12628. "mul r5, r6\n\t"
  12629. #endif
  12630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12631. "lsrs r6, r5, #15\n\t"
  12632. #else
  12633. "lsr r6, r5, #15\n\t"
  12634. #endif
  12635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12636. "lsls r5, r5, #17\n\t"
  12637. #else
  12638. "lsl r5, r5, #17\n\t"
  12639. #endif
  12640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12641. "adds r2, r2, r5\n\t"
  12642. #else
  12643. "add r2, r2, r5\n\t"
  12644. #endif
  12645. #ifdef WOLFSSL_KEIL
  12646. "adcs r3, r3, r6\n\t"
  12647. #elif defined(__clang__)
  12648. "adcs r3, r6\n\t"
  12649. #else
  12650. "adc r3, r6\n\t"
  12651. #endif
  12652. #ifdef WOLFSSL_KEIL
  12653. "adcs r4, r4, %[r]\n\t"
  12654. #elif defined(__clang__)
  12655. "adcs r4, %[r]\n\t"
  12656. #else
  12657. "adc r4, %[r]\n\t"
  12658. #endif
  12659. "str r2, [sp, #24]\n\t"
  12660. "# A[4] * A[3]\n\t"
  12661. "movs r2, #0\n\t"
  12662. "mov %[a], r9\n\t"
  12663. "ldr %[a], [%[a], #16]\n\t"
  12664. "uxth r5, %[a]\n\t"
  12665. "uxth r6, r7\n\t"
  12666. #ifdef WOLFSSL_KEIL
  12667. "muls r6, r5, r6\n\t"
  12668. #elif defined(__clang__)
  12669. "muls r6, r5\n\t"
  12670. #else
  12671. "mul r6, r5\n\t"
  12672. #endif
  12673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12674. "adds r3, r3, r6\n\t"
  12675. #else
  12676. "add r3, r3, r6\n\t"
  12677. #endif
  12678. #ifdef WOLFSSL_KEIL
  12679. "adcs r4, r4, %[r]\n\t"
  12680. #elif defined(__clang__)
  12681. "adcs r4, %[r]\n\t"
  12682. #else
  12683. "adc r4, %[r]\n\t"
  12684. #endif
  12685. #ifdef WOLFSSL_KEIL
  12686. "adcs r2, r2, %[r]\n\t"
  12687. #elif defined(__clang__)
  12688. "adcs r2, %[r]\n\t"
  12689. #else
  12690. "adc r2, %[r]\n\t"
  12691. #endif
  12692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12693. "adds r3, r3, r6\n\t"
  12694. #else
  12695. "add r3, r3, r6\n\t"
  12696. #endif
  12697. #ifdef WOLFSSL_KEIL
  12698. "adcs r4, r4, %[r]\n\t"
  12699. #elif defined(__clang__)
  12700. "adcs r4, %[r]\n\t"
  12701. #else
  12702. "adc r4, %[r]\n\t"
  12703. #endif
  12704. #ifdef WOLFSSL_KEIL
  12705. "adcs r2, r2, %[r]\n\t"
  12706. #elif defined(__clang__)
  12707. "adcs r2, %[r]\n\t"
  12708. #else
  12709. "adc r2, %[r]\n\t"
  12710. #endif
  12711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12712. "lsrs r6, r7, #16\n\t"
  12713. #else
  12714. "lsr r6, r7, #16\n\t"
  12715. #endif
  12716. #ifdef WOLFSSL_KEIL
  12717. "muls r5, r6, r5\n\t"
  12718. #elif defined(__clang__)
  12719. "muls r5, r6\n\t"
  12720. #else
  12721. "mul r5, r6\n\t"
  12722. #endif
  12723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12724. "lsrs r6, r5, #16\n\t"
  12725. #else
  12726. "lsr r6, r5, #16\n\t"
  12727. #endif
  12728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12729. "lsls r5, r5, #16\n\t"
  12730. #else
  12731. "lsl r5, r5, #16\n\t"
  12732. #endif
  12733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12734. "adds r3, r3, r5\n\t"
  12735. #else
  12736. "add r3, r3, r5\n\t"
  12737. #endif
  12738. #ifdef WOLFSSL_KEIL
  12739. "adcs r4, r4, r6\n\t"
  12740. #elif defined(__clang__)
  12741. "adcs r4, r6\n\t"
  12742. #else
  12743. "adc r4, r6\n\t"
  12744. #endif
  12745. #ifdef WOLFSSL_KEIL
  12746. "adcs r2, r2, %[r]\n\t"
  12747. #elif defined(__clang__)
  12748. "adcs r2, %[r]\n\t"
  12749. #else
  12750. "adc r2, %[r]\n\t"
  12751. #endif
  12752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12753. "adds r3, r3, r5\n\t"
  12754. #else
  12755. "add r3, r3, r5\n\t"
  12756. #endif
  12757. #ifdef WOLFSSL_KEIL
  12758. "adcs r4, r4, r6\n\t"
  12759. #elif defined(__clang__)
  12760. "adcs r4, r6\n\t"
  12761. #else
  12762. "adc r4, r6\n\t"
  12763. #endif
  12764. #ifdef WOLFSSL_KEIL
  12765. "adcs r2, r2, %[r]\n\t"
  12766. #elif defined(__clang__)
  12767. "adcs r2, %[r]\n\t"
  12768. #else
  12769. "adc r2, %[r]\n\t"
  12770. #endif
  12771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12772. "lsrs r5, %[a], #16\n\t"
  12773. #else
  12774. "lsr r5, %[a], #16\n\t"
  12775. #endif
  12776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12777. "lsrs r6, r7, #16\n\t"
  12778. #else
  12779. "lsr r6, r7, #16\n\t"
  12780. #endif
  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 r4, r4, r6\n\t"
  12790. #else
  12791. "add r4, r4, r6\n\t"
  12792. #endif
  12793. #ifdef WOLFSSL_KEIL
  12794. "adcs r2, r2, %[r]\n\t"
  12795. #elif defined(__clang__)
  12796. "adcs r2, %[r]\n\t"
  12797. #else
  12798. "adc r2, %[r]\n\t"
  12799. #endif
  12800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12801. "adds r4, r4, r6\n\t"
  12802. #else
  12803. "add r4, r4, r6\n\t"
  12804. #endif
  12805. #ifdef WOLFSSL_KEIL
  12806. "adcs r2, r2, %[r]\n\t"
  12807. #elif defined(__clang__)
  12808. "adcs r2, %[r]\n\t"
  12809. #else
  12810. "adc r2, %[r]\n\t"
  12811. #endif
  12812. "uxth r6, r7\n\t"
  12813. #ifdef WOLFSSL_KEIL
  12814. "muls r5, r6, r5\n\t"
  12815. #elif defined(__clang__)
  12816. "muls r5, r6\n\t"
  12817. #else
  12818. "mul r5, r6\n\t"
  12819. #endif
  12820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12821. "lsrs r6, r5, #16\n\t"
  12822. #else
  12823. "lsr r6, r5, #16\n\t"
  12824. #endif
  12825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12826. "lsls r5, r5, #16\n\t"
  12827. #else
  12828. "lsl r5, r5, #16\n\t"
  12829. #endif
  12830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12831. "adds r3, r3, r5\n\t"
  12832. #else
  12833. "add r3, r3, r5\n\t"
  12834. #endif
  12835. #ifdef WOLFSSL_KEIL
  12836. "adcs r4, r4, r6\n\t"
  12837. #elif defined(__clang__)
  12838. "adcs r4, r6\n\t"
  12839. #else
  12840. "adc r4, r6\n\t"
  12841. #endif
  12842. #ifdef WOLFSSL_KEIL
  12843. "adcs r2, r2, %[r]\n\t"
  12844. #elif defined(__clang__)
  12845. "adcs r2, %[r]\n\t"
  12846. #else
  12847. "adc r2, %[r]\n\t"
  12848. #endif
  12849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12850. "adds r3, r3, r5\n\t"
  12851. #else
  12852. "add r3, r3, r5\n\t"
  12853. #endif
  12854. #ifdef WOLFSSL_KEIL
  12855. "adcs r4, r4, r6\n\t"
  12856. #elif defined(__clang__)
  12857. "adcs r4, r6\n\t"
  12858. #else
  12859. "adc r4, r6\n\t"
  12860. #endif
  12861. #ifdef WOLFSSL_KEIL
  12862. "adcs r2, r2, %[r]\n\t"
  12863. #elif defined(__clang__)
  12864. "adcs r2, %[r]\n\t"
  12865. #else
  12866. "adc r2, %[r]\n\t"
  12867. #endif
  12868. "# A[5] * A[2]\n\t"
  12869. "mov %[a], r9\n\t"
  12870. "mov r7, r12\n\t"
  12871. "ldr %[a], [%[a], #20]\n\t"
  12872. "uxth r5, %[a]\n\t"
  12873. "uxth r6, r7\n\t"
  12874. #ifdef WOLFSSL_KEIL
  12875. "muls r6, r5, r6\n\t"
  12876. #elif defined(__clang__)
  12877. "muls r6, r5\n\t"
  12878. #else
  12879. "mul r6, r5\n\t"
  12880. #endif
  12881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12882. "adds r3, r3, r6\n\t"
  12883. #else
  12884. "add r3, r3, r6\n\t"
  12885. #endif
  12886. #ifdef WOLFSSL_KEIL
  12887. "adcs r4, r4, %[r]\n\t"
  12888. #elif defined(__clang__)
  12889. "adcs r4, %[r]\n\t"
  12890. #else
  12891. "adc r4, %[r]\n\t"
  12892. #endif
  12893. #ifdef WOLFSSL_KEIL
  12894. "adcs r2, r2, %[r]\n\t"
  12895. #elif defined(__clang__)
  12896. "adcs r2, %[r]\n\t"
  12897. #else
  12898. "adc r2, %[r]\n\t"
  12899. #endif
  12900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12901. "adds r3, r3, r6\n\t"
  12902. #else
  12903. "add r3, r3, r6\n\t"
  12904. #endif
  12905. #ifdef WOLFSSL_KEIL
  12906. "adcs r4, r4, %[r]\n\t"
  12907. #elif defined(__clang__)
  12908. "adcs r4, %[r]\n\t"
  12909. #else
  12910. "adc r4, %[r]\n\t"
  12911. #endif
  12912. #ifdef WOLFSSL_KEIL
  12913. "adcs r2, r2, %[r]\n\t"
  12914. #elif defined(__clang__)
  12915. "adcs r2, %[r]\n\t"
  12916. #else
  12917. "adc r2, %[r]\n\t"
  12918. #endif
  12919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12920. "lsrs r6, r7, #16\n\t"
  12921. #else
  12922. "lsr r6, r7, #16\n\t"
  12923. #endif
  12924. #ifdef WOLFSSL_KEIL
  12925. "muls r5, r6, r5\n\t"
  12926. #elif defined(__clang__)
  12927. "muls r5, r6\n\t"
  12928. #else
  12929. "mul r5, r6\n\t"
  12930. #endif
  12931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12932. "lsrs r6, r5, #16\n\t"
  12933. #else
  12934. "lsr r6, r5, #16\n\t"
  12935. #endif
  12936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12937. "lsls r5, r5, #16\n\t"
  12938. #else
  12939. "lsl r5, r5, #16\n\t"
  12940. #endif
  12941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12942. "adds r3, r3, r5\n\t"
  12943. #else
  12944. "add r3, r3, r5\n\t"
  12945. #endif
  12946. #ifdef WOLFSSL_KEIL
  12947. "adcs r4, r4, r6\n\t"
  12948. #elif defined(__clang__)
  12949. "adcs r4, r6\n\t"
  12950. #else
  12951. "adc r4, r6\n\t"
  12952. #endif
  12953. #ifdef WOLFSSL_KEIL
  12954. "adcs r2, r2, %[r]\n\t"
  12955. #elif defined(__clang__)
  12956. "adcs r2, %[r]\n\t"
  12957. #else
  12958. "adc r2, %[r]\n\t"
  12959. #endif
  12960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12961. "adds r3, r3, r5\n\t"
  12962. #else
  12963. "add r3, r3, r5\n\t"
  12964. #endif
  12965. #ifdef WOLFSSL_KEIL
  12966. "adcs r4, r4, r6\n\t"
  12967. #elif defined(__clang__)
  12968. "adcs r4, r6\n\t"
  12969. #else
  12970. "adc r4, r6\n\t"
  12971. #endif
  12972. #ifdef WOLFSSL_KEIL
  12973. "adcs r2, r2, %[r]\n\t"
  12974. #elif defined(__clang__)
  12975. "adcs r2, %[r]\n\t"
  12976. #else
  12977. "adc r2, %[r]\n\t"
  12978. #endif
  12979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12980. "lsrs r5, %[a], #16\n\t"
  12981. #else
  12982. "lsr r5, %[a], #16\n\t"
  12983. #endif
  12984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12985. "lsrs r6, r7, #16\n\t"
  12986. #else
  12987. "lsr r6, r7, #16\n\t"
  12988. #endif
  12989. #ifdef WOLFSSL_KEIL
  12990. "muls r6, r5, r6\n\t"
  12991. #elif defined(__clang__)
  12992. "muls r6, r5\n\t"
  12993. #else
  12994. "mul r6, r5\n\t"
  12995. #endif
  12996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12997. "adds r4, r4, r6\n\t"
  12998. #else
  12999. "add r4, r4, r6\n\t"
  13000. #endif
  13001. #ifdef WOLFSSL_KEIL
  13002. "adcs r2, r2, %[r]\n\t"
  13003. #elif defined(__clang__)
  13004. "adcs r2, %[r]\n\t"
  13005. #else
  13006. "adc r2, %[r]\n\t"
  13007. #endif
  13008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13009. "adds r4, r4, r6\n\t"
  13010. #else
  13011. "add r4, r4, r6\n\t"
  13012. #endif
  13013. #ifdef WOLFSSL_KEIL
  13014. "adcs r2, r2, %[r]\n\t"
  13015. #elif defined(__clang__)
  13016. "adcs r2, %[r]\n\t"
  13017. #else
  13018. "adc r2, %[r]\n\t"
  13019. #endif
  13020. "uxth r6, r7\n\t"
  13021. #ifdef WOLFSSL_KEIL
  13022. "muls r5, r6, r5\n\t"
  13023. #elif defined(__clang__)
  13024. "muls r5, r6\n\t"
  13025. #else
  13026. "mul r5, r6\n\t"
  13027. #endif
  13028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13029. "lsrs r6, r5, #16\n\t"
  13030. #else
  13031. "lsr r6, r5, #16\n\t"
  13032. #endif
  13033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13034. "lsls r5, r5, #16\n\t"
  13035. #else
  13036. "lsl r5, r5, #16\n\t"
  13037. #endif
  13038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13039. "adds r3, r3, r5\n\t"
  13040. #else
  13041. "add r3, r3, r5\n\t"
  13042. #endif
  13043. #ifdef WOLFSSL_KEIL
  13044. "adcs r4, r4, r6\n\t"
  13045. #elif defined(__clang__)
  13046. "adcs r4, r6\n\t"
  13047. #else
  13048. "adc r4, r6\n\t"
  13049. #endif
  13050. #ifdef WOLFSSL_KEIL
  13051. "adcs r2, r2, %[r]\n\t"
  13052. #elif defined(__clang__)
  13053. "adcs r2, %[r]\n\t"
  13054. #else
  13055. "adc r2, %[r]\n\t"
  13056. #endif
  13057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13058. "adds r3, r3, r5\n\t"
  13059. #else
  13060. "add r3, r3, r5\n\t"
  13061. #endif
  13062. #ifdef WOLFSSL_KEIL
  13063. "adcs r4, r4, r6\n\t"
  13064. #elif defined(__clang__)
  13065. "adcs r4, r6\n\t"
  13066. #else
  13067. "adc r4, r6\n\t"
  13068. #endif
  13069. #ifdef WOLFSSL_KEIL
  13070. "adcs r2, r2, %[r]\n\t"
  13071. #elif defined(__clang__)
  13072. "adcs r2, %[r]\n\t"
  13073. #else
  13074. "adc r2, %[r]\n\t"
  13075. #endif
  13076. "# A[6] * A[1]\n\t"
  13077. "mov %[a], r9\n\t"
  13078. "mov r7, r11\n\t"
  13079. "ldr %[a], [%[a], #24]\n\t"
  13080. "uxth r5, %[a]\n\t"
  13081. "uxth r6, r7\n\t"
  13082. #ifdef WOLFSSL_KEIL
  13083. "muls r6, r5, r6\n\t"
  13084. #elif defined(__clang__)
  13085. "muls r6, r5\n\t"
  13086. #else
  13087. "mul r6, r5\n\t"
  13088. #endif
  13089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13090. "adds r3, r3, r6\n\t"
  13091. #else
  13092. "add r3, r3, r6\n\t"
  13093. #endif
  13094. #ifdef WOLFSSL_KEIL
  13095. "adcs r4, r4, %[r]\n\t"
  13096. #elif defined(__clang__)
  13097. "adcs r4, %[r]\n\t"
  13098. #else
  13099. "adc r4, %[r]\n\t"
  13100. #endif
  13101. #ifdef WOLFSSL_KEIL
  13102. "adcs r2, r2, %[r]\n\t"
  13103. #elif defined(__clang__)
  13104. "adcs r2, %[r]\n\t"
  13105. #else
  13106. "adc r2, %[r]\n\t"
  13107. #endif
  13108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13109. "adds r3, r3, r6\n\t"
  13110. #else
  13111. "add r3, r3, r6\n\t"
  13112. #endif
  13113. #ifdef WOLFSSL_KEIL
  13114. "adcs r4, r4, %[r]\n\t"
  13115. #elif defined(__clang__)
  13116. "adcs r4, %[r]\n\t"
  13117. #else
  13118. "adc r4, %[r]\n\t"
  13119. #endif
  13120. #ifdef WOLFSSL_KEIL
  13121. "adcs r2, r2, %[r]\n\t"
  13122. #elif defined(__clang__)
  13123. "adcs r2, %[r]\n\t"
  13124. #else
  13125. "adc r2, %[r]\n\t"
  13126. #endif
  13127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13128. "lsrs r6, r7, #16\n\t"
  13129. #else
  13130. "lsr r6, r7, #16\n\t"
  13131. #endif
  13132. #ifdef WOLFSSL_KEIL
  13133. "muls r5, r6, r5\n\t"
  13134. #elif defined(__clang__)
  13135. "muls r5, r6\n\t"
  13136. #else
  13137. "mul r5, r6\n\t"
  13138. #endif
  13139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13140. "lsrs r6, r5, #16\n\t"
  13141. #else
  13142. "lsr r6, r5, #16\n\t"
  13143. #endif
  13144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13145. "lsls r5, r5, #16\n\t"
  13146. #else
  13147. "lsl r5, r5, #16\n\t"
  13148. #endif
  13149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13150. "adds r3, r3, r5\n\t"
  13151. #else
  13152. "add r3, r3, r5\n\t"
  13153. #endif
  13154. #ifdef WOLFSSL_KEIL
  13155. "adcs r4, r4, r6\n\t"
  13156. #elif defined(__clang__)
  13157. "adcs r4, r6\n\t"
  13158. #else
  13159. "adc r4, r6\n\t"
  13160. #endif
  13161. #ifdef WOLFSSL_KEIL
  13162. "adcs r2, r2, %[r]\n\t"
  13163. #elif defined(__clang__)
  13164. "adcs r2, %[r]\n\t"
  13165. #else
  13166. "adc r2, %[r]\n\t"
  13167. #endif
  13168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13169. "adds r3, r3, r5\n\t"
  13170. #else
  13171. "add r3, r3, r5\n\t"
  13172. #endif
  13173. #ifdef WOLFSSL_KEIL
  13174. "adcs r4, r4, r6\n\t"
  13175. #elif defined(__clang__)
  13176. "adcs r4, r6\n\t"
  13177. #else
  13178. "adc r4, r6\n\t"
  13179. #endif
  13180. #ifdef WOLFSSL_KEIL
  13181. "adcs r2, r2, %[r]\n\t"
  13182. #elif defined(__clang__)
  13183. "adcs r2, %[r]\n\t"
  13184. #else
  13185. "adc r2, %[r]\n\t"
  13186. #endif
  13187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13188. "lsrs r5, %[a], #16\n\t"
  13189. #else
  13190. "lsr r5, %[a], #16\n\t"
  13191. #endif
  13192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13193. "lsrs r6, r7, #16\n\t"
  13194. #else
  13195. "lsr r6, r7, #16\n\t"
  13196. #endif
  13197. #ifdef WOLFSSL_KEIL
  13198. "muls r6, r5, r6\n\t"
  13199. #elif defined(__clang__)
  13200. "muls r6, r5\n\t"
  13201. #else
  13202. "mul r6, r5\n\t"
  13203. #endif
  13204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13205. "adds r4, r4, r6\n\t"
  13206. #else
  13207. "add r4, r4, r6\n\t"
  13208. #endif
  13209. #ifdef WOLFSSL_KEIL
  13210. "adcs r2, r2, %[r]\n\t"
  13211. #elif defined(__clang__)
  13212. "adcs r2, %[r]\n\t"
  13213. #else
  13214. "adc r2, %[r]\n\t"
  13215. #endif
  13216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13217. "adds r4, r4, r6\n\t"
  13218. #else
  13219. "add r4, r4, r6\n\t"
  13220. #endif
  13221. #ifdef WOLFSSL_KEIL
  13222. "adcs r2, r2, %[r]\n\t"
  13223. #elif defined(__clang__)
  13224. "adcs r2, %[r]\n\t"
  13225. #else
  13226. "adc r2, %[r]\n\t"
  13227. #endif
  13228. "uxth r6, r7\n\t"
  13229. #ifdef WOLFSSL_KEIL
  13230. "muls r5, r6, r5\n\t"
  13231. #elif defined(__clang__)
  13232. "muls r5, r6\n\t"
  13233. #else
  13234. "mul r5, r6\n\t"
  13235. #endif
  13236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13237. "lsrs r6, r5, #16\n\t"
  13238. #else
  13239. "lsr r6, r5, #16\n\t"
  13240. #endif
  13241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13242. "lsls r5, r5, #16\n\t"
  13243. #else
  13244. "lsl r5, r5, #16\n\t"
  13245. #endif
  13246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13247. "adds r3, r3, r5\n\t"
  13248. #else
  13249. "add r3, r3, r5\n\t"
  13250. #endif
  13251. #ifdef WOLFSSL_KEIL
  13252. "adcs r4, r4, r6\n\t"
  13253. #elif defined(__clang__)
  13254. "adcs r4, r6\n\t"
  13255. #else
  13256. "adc r4, r6\n\t"
  13257. #endif
  13258. #ifdef WOLFSSL_KEIL
  13259. "adcs r2, r2, %[r]\n\t"
  13260. #elif defined(__clang__)
  13261. "adcs r2, %[r]\n\t"
  13262. #else
  13263. "adc r2, %[r]\n\t"
  13264. #endif
  13265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13266. "adds r3, r3, r5\n\t"
  13267. #else
  13268. "add r3, r3, r5\n\t"
  13269. #endif
  13270. #ifdef WOLFSSL_KEIL
  13271. "adcs r4, r4, r6\n\t"
  13272. #elif defined(__clang__)
  13273. "adcs r4, r6\n\t"
  13274. #else
  13275. "adc r4, r6\n\t"
  13276. #endif
  13277. #ifdef WOLFSSL_KEIL
  13278. "adcs r2, r2, %[r]\n\t"
  13279. #elif defined(__clang__)
  13280. "adcs r2, %[r]\n\t"
  13281. #else
  13282. "adc r2, %[r]\n\t"
  13283. #endif
  13284. "# A[7] * A[0]\n\t"
  13285. "mov %[a], r9\n\t"
  13286. "mov r7, r10\n\t"
  13287. "ldr %[a], [%[a], #28]\n\t"
  13288. "uxth r5, %[a]\n\t"
  13289. "uxth r6, r7\n\t"
  13290. #ifdef WOLFSSL_KEIL
  13291. "muls r6, r5, r6\n\t"
  13292. #elif defined(__clang__)
  13293. "muls r6, r5\n\t"
  13294. #else
  13295. "mul r6, r5\n\t"
  13296. #endif
  13297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13298. "adds r3, r3, r6\n\t"
  13299. #else
  13300. "add r3, r3, r6\n\t"
  13301. #endif
  13302. #ifdef WOLFSSL_KEIL
  13303. "adcs r4, r4, %[r]\n\t"
  13304. #elif defined(__clang__)
  13305. "adcs r4, %[r]\n\t"
  13306. #else
  13307. "adc r4, %[r]\n\t"
  13308. #endif
  13309. #ifdef WOLFSSL_KEIL
  13310. "adcs r2, r2, %[r]\n\t"
  13311. #elif defined(__clang__)
  13312. "adcs r2, %[r]\n\t"
  13313. #else
  13314. "adc r2, %[r]\n\t"
  13315. #endif
  13316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13317. "adds r3, r3, r6\n\t"
  13318. #else
  13319. "add r3, r3, r6\n\t"
  13320. #endif
  13321. #ifdef WOLFSSL_KEIL
  13322. "adcs r4, r4, %[r]\n\t"
  13323. #elif defined(__clang__)
  13324. "adcs r4, %[r]\n\t"
  13325. #else
  13326. "adc r4, %[r]\n\t"
  13327. #endif
  13328. #ifdef WOLFSSL_KEIL
  13329. "adcs r2, r2, %[r]\n\t"
  13330. #elif defined(__clang__)
  13331. "adcs r2, %[r]\n\t"
  13332. #else
  13333. "adc r2, %[r]\n\t"
  13334. #endif
  13335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13336. "lsrs r6, r7, #16\n\t"
  13337. #else
  13338. "lsr r6, r7, #16\n\t"
  13339. #endif
  13340. #ifdef WOLFSSL_KEIL
  13341. "muls r5, r6, r5\n\t"
  13342. #elif defined(__clang__)
  13343. "muls r5, r6\n\t"
  13344. #else
  13345. "mul r5, r6\n\t"
  13346. #endif
  13347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13348. "lsrs r6, r5, #16\n\t"
  13349. #else
  13350. "lsr r6, r5, #16\n\t"
  13351. #endif
  13352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13353. "lsls r5, r5, #16\n\t"
  13354. #else
  13355. "lsl r5, r5, #16\n\t"
  13356. #endif
  13357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13358. "adds r3, r3, r5\n\t"
  13359. #else
  13360. "add r3, r3, r5\n\t"
  13361. #endif
  13362. #ifdef WOLFSSL_KEIL
  13363. "adcs r4, r4, r6\n\t"
  13364. #elif defined(__clang__)
  13365. "adcs r4, r6\n\t"
  13366. #else
  13367. "adc r4, r6\n\t"
  13368. #endif
  13369. #ifdef WOLFSSL_KEIL
  13370. "adcs r2, r2, %[r]\n\t"
  13371. #elif defined(__clang__)
  13372. "adcs r2, %[r]\n\t"
  13373. #else
  13374. "adc r2, %[r]\n\t"
  13375. #endif
  13376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13377. "adds r3, r3, r5\n\t"
  13378. #else
  13379. "add r3, r3, r5\n\t"
  13380. #endif
  13381. #ifdef WOLFSSL_KEIL
  13382. "adcs r4, r4, r6\n\t"
  13383. #elif defined(__clang__)
  13384. "adcs r4, r6\n\t"
  13385. #else
  13386. "adc r4, r6\n\t"
  13387. #endif
  13388. #ifdef WOLFSSL_KEIL
  13389. "adcs r2, r2, %[r]\n\t"
  13390. #elif defined(__clang__)
  13391. "adcs r2, %[r]\n\t"
  13392. #else
  13393. "adc r2, %[r]\n\t"
  13394. #endif
  13395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13396. "lsrs r5, %[a], #16\n\t"
  13397. #else
  13398. "lsr r5, %[a], #16\n\t"
  13399. #endif
  13400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13401. "lsrs r6, r7, #16\n\t"
  13402. #else
  13403. "lsr r6, r7, #16\n\t"
  13404. #endif
  13405. #ifdef WOLFSSL_KEIL
  13406. "muls r6, r5, r6\n\t"
  13407. #elif defined(__clang__)
  13408. "muls r6, r5\n\t"
  13409. #else
  13410. "mul r6, r5\n\t"
  13411. #endif
  13412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13413. "adds r4, r4, r6\n\t"
  13414. #else
  13415. "add r4, r4, r6\n\t"
  13416. #endif
  13417. #ifdef WOLFSSL_KEIL
  13418. "adcs r2, r2, %[r]\n\t"
  13419. #elif defined(__clang__)
  13420. "adcs r2, %[r]\n\t"
  13421. #else
  13422. "adc r2, %[r]\n\t"
  13423. #endif
  13424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13425. "adds r4, r4, r6\n\t"
  13426. #else
  13427. "add r4, r4, r6\n\t"
  13428. #endif
  13429. #ifdef WOLFSSL_KEIL
  13430. "adcs r2, r2, %[r]\n\t"
  13431. #elif defined(__clang__)
  13432. "adcs r2, %[r]\n\t"
  13433. #else
  13434. "adc r2, %[r]\n\t"
  13435. #endif
  13436. "uxth r6, r7\n\t"
  13437. #ifdef WOLFSSL_KEIL
  13438. "muls r5, r6, r5\n\t"
  13439. #elif defined(__clang__)
  13440. "muls r5, r6\n\t"
  13441. #else
  13442. "mul r5, r6\n\t"
  13443. #endif
  13444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13445. "lsrs r6, r5, #16\n\t"
  13446. #else
  13447. "lsr r6, r5, #16\n\t"
  13448. #endif
  13449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13450. "lsls r5, r5, #16\n\t"
  13451. #else
  13452. "lsl r5, r5, #16\n\t"
  13453. #endif
  13454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13455. "adds r3, r3, r5\n\t"
  13456. #else
  13457. "add r3, r3, r5\n\t"
  13458. #endif
  13459. #ifdef WOLFSSL_KEIL
  13460. "adcs r4, r4, r6\n\t"
  13461. #elif defined(__clang__)
  13462. "adcs r4, r6\n\t"
  13463. #else
  13464. "adc r4, r6\n\t"
  13465. #endif
  13466. #ifdef WOLFSSL_KEIL
  13467. "adcs r2, r2, %[r]\n\t"
  13468. #elif defined(__clang__)
  13469. "adcs r2, %[r]\n\t"
  13470. #else
  13471. "adc r2, %[r]\n\t"
  13472. #endif
  13473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13474. "adds r3, r3, r5\n\t"
  13475. #else
  13476. "add r3, r3, r5\n\t"
  13477. #endif
  13478. #ifdef WOLFSSL_KEIL
  13479. "adcs r4, r4, r6\n\t"
  13480. #elif defined(__clang__)
  13481. "adcs r4, r6\n\t"
  13482. #else
  13483. "adc r4, r6\n\t"
  13484. #endif
  13485. #ifdef WOLFSSL_KEIL
  13486. "adcs r2, r2, %[r]\n\t"
  13487. #elif defined(__clang__)
  13488. "adcs r2, %[r]\n\t"
  13489. #else
  13490. "adc r2, %[r]\n\t"
  13491. #endif
  13492. "str r3, [sp, #28]\n\t"
  13493. "# A[7] * A[1]\n\t"
  13494. "movs r3, #0\n\t"
  13495. "mov %[a], r9\n\t"
  13496. "mov r7, r11\n\t"
  13497. "ldr %[a], [%[a], #28]\n\t"
  13498. "uxth r5, %[a]\n\t"
  13499. "uxth r6, r7\n\t"
  13500. #ifdef WOLFSSL_KEIL
  13501. "muls r6, r5, r6\n\t"
  13502. #elif defined(__clang__)
  13503. "muls r6, r5\n\t"
  13504. #else
  13505. "mul r6, r5\n\t"
  13506. #endif
  13507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13508. "adds r4, r4, r6\n\t"
  13509. #else
  13510. "add r4, r4, r6\n\t"
  13511. #endif
  13512. #ifdef WOLFSSL_KEIL
  13513. "adcs r2, r2, %[r]\n\t"
  13514. #elif defined(__clang__)
  13515. "adcs r2, %[r]\n\t"
  13516. #else
  13517. "adc r2, %[r]\n\t"
  13518. #endif
  13519. #ifdef WOLFSSL_KEIL
  13520. "adcs r3, r3, %[r]\n\t"
  13521. #elif defined(__clang__)
  13522. "adcs r3, %[r]\n\t"
  13523. #else
  13524. "adc r3, %[r]\n\t"
  13525. #endif
  13526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13527. "adds r4, r4, r6\n\t"
  13528. #else
  13529. "add r4, r4, r6\n\t"
  13530. #endif
  13531. #ifdef WOLFSSL_KEIL
  13532. "adcs r2, r2, %[r]\n\t"
  13533. #elif defined(__clang__)
  13534. "adcs r2, %[r]\n\t"
  13535. #else
  13536. "adc r2, %[r]\n\t"
  13537. #endif
  13538. #ifdef WOLFSSL_KEIL
  13539. "adcs r3, r3, %[r]\n\t"
  13540. #elif defined(__clang__)
  13541. "adcs r3, %[r]\n\t"
  13542. #else
  13543. "adc r3, %[r]\n\t"
  13544. #endif
  13545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13546. "lsrs r6, r7, #16\n\t"
  13547. #else
  13548. "lsr r6, r7, #16\n\t"
  13549. #endif
  13550. #ifdef WOLFSSL_KEIL
  13551. "muls r5, r6, r5\n\t"
  13552. #elif defined(__clang__)
  13553. "muls r5, r6\n\t"
  13554. #else
  13555. "mul r5, r6\n\t"
  13556. #endif
  13557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13558. "lsrs r6, r5, #16\n\t"
  13559. #else
  13560. "lsr r6, r5, #16\n\t"
  13561. #endif
  13562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13563. "lsls r5, r5, #16\n\t"
  13564. #else
  13565. "lsl r5, r5, #16\n\t"
  13566. #endif
  13567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13568. "adds r4, r4, r5\n\t"
  13569. #else
  13570. "add r4, r4, r5\n\t"
  13571. #endif
  13572. #ifdef WOLFSSL_KEIL
  13573. "adcs r2, r2, r6\n\t"
  13574. #elif defined(__clang__)
  13575. "adcs r2, r6\n\t"
  13576. #else
  13577. "adc r2, r6\n\t"
  13578. #endif
  13579. #ifdef WOLFSSL_KEIL
  13580. "adcs r3, r3, %[r]\n\t"
  13581. #elif defined(__clang__)
  13582. "adcs r3, %[r]\n\t"
  13583. #else
  13584. "adc r3, %[r]\n\t"
  13585. #endif
  13586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13587. "adds r4, r4, r5\n\t"
  13588. #else
  13589. "add r4, r4, r5\n\t"
  13590. #endif
  13591. #ifdef WOLFSSL_KEIL
  13592. "adcs r2, r2, r6\n\t"
  13593. #elif defined(__clang__)
  13594. "adcs r2, r6\n\t"
  13595. #else
  13596. "adc r2, r6\n\t"
  13597. #endif
  13598. #ifdef WOLFSSL_KEIL
  13599. "adcs r3, r3, %[r]\n\t"
  13600. #elif defined(__clang__)
  13601. "adcs r3, %[r]\n\t"
  13602. #else
  13603. "adc r3, %[r]\n\t"
  13604. #endif
  13605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13606. "lsrs r5, %[a], #16\n\t"
  13607. #else
  13608. "lsr r5, %[a], #16\n\t"
  13609. #endif
  13610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13611. "lsrs r6, r7, #16\n\t"
  13612. #else
  13613. "lsr r6, r7, #16\n\t"
  13614. #endif
  13615. #ifdef WOLFSSL_KEIL
  13616. "muls r6, r5, r6\n\t"
  13617. #elif defined(__clang__)
  13618. "muls r6, r5\n\t"
  13619. #else
  13620. "mul r6, r5\n\t"
  13621. #endif
  13622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13623. "adds r2, r2, r6\n\t"
  13624. #else
  13625. "add r2, r2, r6\n\t"
  13626. #endif
  13627. #ifdef WOLFSSL_KEIL
  13628. "adcs r3, r3, %[r]\n\t"
  13629. #elif defined(__clang__)
  13630. "adcs r3, %[r]\n\t"
  13631. #else
  13632. "adc r3, %[r]\n\t"
  13633. #endif
  13634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13635. "adds r2, r2, r6\n\t"
  13636. #else
  13637. "add r2, r2, r6\n\t"
  13638. #endif
  13639. #ifdef WOLFSSL_KEIL
  13640. "adcs r3, r3, %[r]\n\t"
  13641. #elif defined(__clang__)
  13642. "adcs r3, %[r]\n\t"
  13643. #else
  13644. "adc r3, %[r]\n\t"
  13645. #endif
  13646. "uxth r6, r7\n\t"
  13647. #ifdef WOLFSSL_KEIL
  13648. "muls r5, r6, r5\n\t"
  13649. #elif defined(__clang__)
  13650. "muls r5, r6\n\t"
  13651. #else
  13652. "mul r5, r6\n\t"
  13653. #endif
  13654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13655. "lsrs r6, r5, #16\n\t"
  13656. #else
  13657. "lsr r6, r5, #16\n\t"
  13658. #endif
  13659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13660. "lsls r5, r5, #16\n\t"
  13661. #else
  13662. "lsl r5, r5, #16\n\t"
  13663. #endif
  13664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13665. "adds r4, r4, r5\n\t"
  13666. #else
  13667. "add r4, r4, r5\n\t"
  13668. #endif
  13669. #ifdef WOLFSSL_KEIL
  13670. "adcs r2, r2, r6\n\t"
  13671. #elif defined(__clang__)
  13672. "adcs r2, r6\n\t"
  13673. #else
  13674. "adc r2, r6\n\t"
  13675. #endif
  13676. #ifdef WOLFSSL_KEIL
  13677. "adcs r3, r3, %[r]\n\t"
  13678. #elif defined(__clang__)
  13679. "adcs r3, %[r]\n\t"
  13680. #else
  13681. "adc r3, %[r]\n\t"
  13682. #endif
  13683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13684. "adds r4, r4, r5\n\t"
  13685. #else
  13686. "add r4, r4, r5\n\t"
  13687. #endif
  13688. #ifdef WOLFSSL_KEIL
  13689. "adcs r2, r2, r6\n\t"
  13690. #elif defined(__clang__)
  13691. "adcs r2, r6\n\t"
  13692. #else
  13693. "adc r2, r6\n\t"
  13694. #endif
  13695. #ifdef WOLFSSL_KEIL
  13696. "adcs r3, r3, %[r]\n\t"
  13697. #elif defined(__clang__)
  13698. "adcs r3, %[r]\n\t"
  13699. #else
  13700. "adc r3, %[r]\n\t"
  13701. #endif
  13702. "# A[6] * A[2]\n\t"
  13703. "mov %[a], r9\n\t"
  13704. "mov r7, r12\n\t"
  13705. "ldr %[a], [%[a], #24]\n\t"
  13706. "uxth r5, %[a]\n\t"
  13707. "uxth r6, r7\n\t"
  13708. #ifdef WOLFSSL_KEIL
  13709. "muls r6, r5, r6\n\t"
  13710. #elif defined(__clang__)
  13711. "muls r6, r5\n\t"
  13712. #else
  13713. "mul r6, r5\n\t"
  13714. #endif
  13715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13716. "adds r4, r4, r6\n\t"
  13717. #else
  13718. "add r4, r4, r6\n\t"
  13719. #endif
  13720. #ifdef WOLFSSL_KEIL
  13721. "adcs r2, r2, %[r]\n\t"
  13722. #elif defined(__clang__)
  13723. "adcs r2, %[r]\n\t"
  13724. #else
  13725. "adc r2, %[r]\n\t"
  13726. #endif
  13727. #ifdef WOLFSSL_KEIL
  13728. "adcs r3, r3, %[r]\n\t"
  13729. #elif defined(__clang__)
  13730. "adcs r3, %[r]\n\t"
  13731. #else
  13732. "adc r3, %[r]\n\t"
  13733. #endif
  13734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13735. "adds r4, r4, r6\n\t"
  13736. #else
  13737. "add r4, r4, r6\n\t"
  13738. #endif
  13739. #ifdef WOLFSSL_KEIL
  13740. "adcs r2, r2, %[r]\n\t"
  13741. #elif defined(__clang__)
  13742. "adcs r2, %[r]\n\t"
  13743. #else
  13744. "adc r2, %[r]\n\t"
  13745. #endif
  13746. #ifdef WOLFSSL_KEIL
  13747. "adcs r3, r3, %[r]\n\t"
  13748. #elif defined(__clang__)
  13749. "adcs r3, %[r]\n\t"
  13750. #else
  13751. "adc r3, %[r]\n\t"
  13752. #endif
  13753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13754. "lsrs r6, r7, #16\n\t"
  13755. #else
  13756. "lsr r6, r7, #16\n\t"
  13757. #endif
  13758. #ifdef WOLFSSL_KEIL
  13759. "muls r5, r6, r5\n\t"
  13760. #elif defined(__clang__)
  13761. "muls r5, r6\n\t"
  13762. #else
  13763. "mul r5, r6\n\t"
  13764. #endif
  13765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13766. "lsrs r6, r5, #16\n\t"
  13767. #else
  13768. "lsr r6, r5, #16\n\t"
  13769. #endif
  13770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13771. "lsls r5, r5, #16\n\t"
  13772. #else
  13773. "lsl r5, r5, #16\n\t"
  13774. #endif
  13775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13776. "adds r4, r4, r5\n\t"
  13777. #else
  13778. "add r4, r4, r5\n\t"
  13779. #endif
  13780. #ifdef WOLFSSL_KEIL
  13781. "adcs r2, r2, r6\n\t"
  13782. #elif defined(__clang__)
  13783. "adcs r2, r6\n\t"
  13784. #else
  13785. "adc r2, r6\n\t"
  13786. #endif
  13787. #ifdef WOLFSSL_KEIL
  13788. "adcs r3, r3, %[r]\n\t"
  13789. #elif defined(__clang__)
  13790. "adcs r3, %[r]\n\t"
  13791. #else
  13792. "adc r3, %[r]\n\t"
  13793. #endif
  13794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13795. "adds r4, r4, r5\n\t"
  13796. #else
  13797. "add r4, r4, r5\n\t"
  13798. #endif
  13799. #ifdef WOLFSSL_KEIL
  13800. "adcs r2, r2, r6\n\t"
  13801. #elif defined(__clang__)
  13802. "adcs r2, r6\n\t"
  13803. #else
  13804. "adc r2, r6\n\t"
  13805. #endif
  13806. #ifdef WOLFSSL_KEIL
  13807. "adcs r3, r3, %[r]\n\t"
  13808. #elif defined(__clang__)
  13809. "adcs r3, %[r]\n\t"
  13810. #else
  13811. "adc r3, %[r]\n\t"
  13812. #endif
  13813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13814. "lsrs r5, %[a], #16\n\t"
  13815. #else
  13816. "lsr r5, %[a], #16\n\t"
  13817. #endif
  13818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13819. "lsrs r6, r7, #16\n\t"
  13820. #else
  13821. "lsr r6, r7, #16\n\t"
  13822. #endif
  13823. #ifdef WOLFSSL_KEIL
  13824. "muls r6, r5, r6\n\t"
  13825. #elif defined(__clang__)
  13826. "muls r6, r5\n\t"
  13827. #else
  13828. "mul r6, r5\n\t"
  13829. #endif
  13830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13831. "adds r2, r2, r6\n\t"
  13832. #else
  13833. "add r2, r2, r6\n\t"
  13834. #endif
  13835. #ifdef WOLFSSL_KEIL
  13836. "adcs r3, r3, %[r]\n\t"
  13837. #elif defined(__clang__)
  13838. "adcs r3, %[r]\n\t"
  13839. #else
  13840. "adc r3, %[r]\n\t"
  13841. #endif
  13842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13843. "adds r2, r2, r6\n\t"
  13844. #else
  13845. "add r2, r2, r6\n\t"
  13846. #endif
  13847. #ifdef WOLFSSL_KEIL
  13848. "adcs r3, r3, %[r]\n\t"
  13849. #elif defined(__clang__)
  13850. "adcs r3, %[r]\n\t"
  13851. #else
  13852. "adc r3, %[r]\n\t"
  13853. #endif
  13854. "uxth r6, r7\n\t"
  13855. #ifdef WOLFSSL_KEIL
  13856. "muls r5, r6, r5\n\t"
  13857. #elif defined(__clang__)
  13858. "muls r5, r6\n\t"
  13859. #else
  13860. "mul r5, r6\n\t"
  13861. #endif
  13862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13863. "lsrs r6, r5, #16\n\t"
  13864. #else
  13865. "lsr r6, r5, #16\n\t"
  13866. #endif
  13867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13868. "lsls r5, r5, #16\n\t"
  13869. #else
  13870. "lsl r5, r5, #16\n\t"
  13871. #endif
  13872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13873. "adds r4, r4, r5\n\t"
  13874. #else
  13875. "add r4, r4, r5\n\t"
  13876. #endif
  13877. #ifdef WOLFSSL_KEIL
  13878. "adcs r2, r2, r6\n\t"
  13879. #elif defined(__clang__)
  13880. "adcs r2, r6\n\t"
  13881. #else
  13882. "adc r2, r6\n\t"
  13883. #endif
  13884. #ifdef WOLFSSL_KEIL
  13885. "adcs r3, r3, %[r]\n\t"
  13886. #elif defined(__clang__)
  13887. "adcs r3, %[r]\n\t"
  13888. #else
  13889. "adc r3, %[r]\n\t"
  13890. #endif
  13891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13892. "adds r4, r4, r5\n\t"
  13893. #else
  13894. "add r4, r4, r5\n\t"
  13895. #endif
  13896. #ifdef WOLFSSL_KEIL
  13897. "adcs r2, r2, r6\n\t"
  13898. #elif defined(__clang__)
  13899. "adcs r2, r6\n\t"
  13900. #else
  13901. "adc r2, r6\n\t"
  13902. #endif
  13903. #ifdef WOLFSSL_KEIL
  13904. "adcs r3, r3, %[r]\n\t"
  13905. #elif defined(__clang__)
  13906. "adcs r3, %[r]\n\t"
  13907. #else
  13908. "adc r3, %[r]\n\t"
  13909. #endif
  13910. "# A[5] * A[3]\n\t"
  13911. "mov %[a], r9\n\t"
  13912. "mov r7, lr\n\t"
  13913. "ldr %[a], [%[a], #20]\n\t"
  13914. "uxth r5, %[a]\n\t"
  13915. "uxth r6, r7\n\t"
  13916. #ifdef WOLFSSL_KEIL
  13917. "muls r6, r5, r6\n\t"
  13918. #elif defined(__clang__)
  13919. "muls r6, r5\n\t"
  13920. #else
  13921. "mul r6, r5\n\t"
  13922. #endif
  13923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13924. "adds r4, r4, r6\n\t"
  13925. #else
  13926. "add r4, r4, r6\n\t"
  13927. #endif
  13928. #ifdef WOLFSSL_KEIL
  13929. "adcs r2, r2, %[r]\n\t"
  13930. #elif defined(__clang__)
  13931. "adcs r2, %[r]\n\t"
  13932. #else
  13933. "adc r2, %[r]\n\t"
  13934. #endif
  13935. #ifdef WOLFSSL_KEIL
  13936. "adcs r3, r3, %[r]\n\t"
  13937. #elif defined(__clang__)
  13938. "adcs r3, %[r]\n\t"
  13939. #else
  13940. "adc r3, %[r]\n\t"
  13941. #endif
  13942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13943. "adds r4, r4, r6\n\t"
  13944. #else
  13945. "add r4, r4, r6\n\t"
  13946. #endif
  13947. #ifdef WOLFSSL_KEIL
  13948. "adcs r2, r2, %[r]\n\t"
  13949. #elif defined(__clang__)
  13950. "adcs r2, %[r]\n\t"
  13951. #else
  13952. "adc r2, %[r]\n\t"
  13953. #endif
  13954. #ifdef WOLFSSL_KEIL
  13955. "adcs r3, r3, %[r]\n\t"
  13956. #elif defined(__clang__)
  13957. "adcs r3, %[r]\n\t"
  13958. #else
  13959. "adc r3, %[r]\n\t"
  13960. #endif
  13961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13962. "lsrs r6, r7, #16\n\t"
  13963. #else
  13964. "lsr r6, r7, #16\n\t"
  13965. #endif
  13966. #ifdef WOLFSSL_KEIL
  13967. "muls r5, r6, r5\n\t"
  13968. #elif defined(__clang__)
  13969. "muls r5, r6\n\t"
  13970. #else
  13971. "mul r5, r6\n\t"
  13972. #endif
  13973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13974. "lsrs r6, r5, #16\n\t"
  13975. #else
  13976. "lsr r6, r5, #16\n\t"
  13977. #endif
  13978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13979. "lsls r5, r5, #16\n\t"
  13980. #else
  13981. "lsl r5, r5, #16\n\t"
  13982. #endif
  13983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13984. "adds r4, r4, r5\n\t"
  13985. #else
  13986. "add r4, r4, r5\n\t"
  13987. #endif
  13988. #ifdef WOLFSSL_KEIL
  13989. "adcs r2, r2, r6\n\t"
  13990. #elif defined(__clang__)
  13991. "adcs r2, r6\n\t"
  13992. #else
  13993. "adc r2, r6\n\t"
  13994. #endif
  13995. #ifdef WOLFSSL_KEIL
  13996. "adcs r3, r3, %[r]\n\t"
  13997. #elif defined(__clang__)
  13998. "adcs r3, %[r]\n\t"
  13999. #else
  14000. "adc r3, %[r]\n\t"
  14001. #endif
  14002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14003. "adds r4, r4, r5\n\t"
  14004. #else
  14005. "add r4, r4, r5\n\t"
  14006. #endif
  14007. #ifdef WOLFSSL_KEIL
  14008. "adcs r2, r2, r6\n\t"
  14009. #elif defined(__clang__)
  14010. "adcs r2, r6\n\t"
  14011. #else
  14012. "adc r2, r6\n\t"
  14013. #endif
  14014. #ifdef WOLFSSL_KEIL
  14015. "adcs r3, r3, %[r]\n\t"
  14016. #elif defined(__clang__)
  14017. "adcs r3, %[r]\n\t"
  14018. #else
  14019. "adc r3, %[r]\n\t"
  14020. #endif
  14021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14022. "lsrs r5, %[a], #16\n\t"
  14023. #else
  14024. "lsr r5, %[a], #16\n\t"
  14025. #endif
  14026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14027. "lsrs r6, r7, #16\n\t"
  14028. #else
  14029. "lsr r6, r7, #16\n\t"
  14030. #endif
  14031. #ifdef WOLFSSL_KEIL
  14032. "muls r6, r5, r6\n\t"
  14033. #elif defined(__clang__)
  14034. "muls r6, r5\n\t"
  14035. #else
  14036. "mul r6, r5\n\t"
  14037. #endif
  14038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14039. "adds r2, r2, r6\n\t"
  14040. #else
  14041. "add r2, r2, r6\n\t"
  14042. #endif
  14043. #ifdef WOLFSSL_KEIL
  14044. "adcs r3, r3, %[r]\n\t"
  14045. #elif defined(__clang__)
  14046. "adcs r3, %[r]\n\t"
  14047. #else
  14048. "adc r3, %[r]\n\t"
  14049. #endif
  14050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14051. "adds r2, r2, r6\n\t"
  14052. #else
  14053. "add r2, r2, r6\n\t"
  14054. #endif
  14055. #ifdef WOLFSSL_KEIL
  14056. "adcs r3, r3, %[r]\n\t"
  14057. #elif defined(__clang__)
  14058. "adcs r3, %[r]\n\t"
  14059. #else
  14060. "adc r3, %[r]\n\t"
  14061. #endif
  14062. "uxth r6, r7\n\t"
  14063. #ifdef WOLFSSL_KEIL
  14064. "muls r5, r6, r5\n\t"
  14065. #elif defined(__clang__)
  14066. "muls r5, r6\n\t"
  14067. #else
  14068. "mul r5, r6\n\t"
  14069. #endif
  14070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14071. "lsrs r6, r5, #16\n\t"
  14072. #else
  14073. "lsr r6, r5, #16\n\t"
  14074. #endif
  14075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14076. "lsls r5, r5, #16\n\t"
  14077. #else
  14078. "lsl r5, r5, #16\n\t"
  14079. #endif
  14080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14081. "adds r4, r4, r5\n\t"
  14082. #else
  14083. "add r4, r4, r5\n\t"
  14084. #endif
  14085. #ifdef WOLFSSL_KEIL
  14086. "adcs r2, r2, r6\n\t"
  14087. #elif defined(__clang__)
  14088. "adcs r2, r6\n\t"
  14089. #else
  14090. "adc r2, r6\n\t"
  14091. #endif
  14092. #ifdef WOLFSSL_KEIL
  14093. "adcs r3, r3, %[r]\n\t"
  14094. #elif defined(__clang__)
  14095. "adcs r3, %[r]\n\t"
  14096. #else
  14097. "adc r3, %[r]\n\t"
  14098. #endif
  14099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14100. "adds r4, r4, r5\n\t"
  14101. #else
  14102. "add r4, r4, r5\n\t"
  14103. #endif
  14104. #ifdef WOLFSSL_KEIL
  14105. "adcs r2, r2, r6\n\t"
  14106. #elif defined(__clang__)
  14107. "adcs r2, r6\n\t"
  14108. #else
  14109. "adc r2, r6\n\t"
  14110. #endif
  14111. #ifdef WOLFSSL_KEIL
  14112. "adcs r3, r3, %[r]\n\t"
  14113. #elif defined(__clang__)
  14114. "adcs r3, %[r]\n\t"
  14115. #else
  14116. "adc r3, %[r]\n\t"
  14117. #endif
  14118. "# A[4] * A[4]\n\t"
  14119. "mov %[a], r9\n\t"
  14120. "ldr r7, [%[a], #16]\n\t"
  14121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14122. "lsrs r6, r7, #16\n\t"
  14123. #else
  14124. "lsr r6, r7, #16\n\t"
  14125. #endif
  14126. "uxth r5, r7\n\t"
  14127. #ifdef WOLFSSL_KEIL
  14128. "muls r5, r5, r5\n\t"
  14129. #elif defined(__clang__)
  14130. "muls r5, r5\n\t"
  14131. #else
  14132. "mul r5, r5\n\t"
  14133. #endif
  14134. #ifdef WOLFSSL_KEIL
  14135. "muls r6, r6, r6\n\t"
  14136. #elif defined(__clang__)
  14137. "muls r6, r6\n\t"
  14138. #else
  14139. "mul r6, r6\n\t"
  14140. #endif
  14141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14142. "adds r4, r4, r5\n\t"
  14143. #else
  14144. "add r4, r4, r5\n\t"
  14145. #endif
  14146. #ifdef WOLFSSL_KEIL
  14147. "adcs r2, r2, r6\n\t"
  14148. #elif defined(__clang__)
  14149. "adcs r2, r6\n\t"
  14150. #else
  14151. "adc r2, r6\n\t"
  14152. #endif
  14153. #ifdef WOLFSSL_KEIL
  14154. "adcs r3, r3, %[r]\n\t"
  14155. #elif defined(__clang__)
  14156. "adcs r3, %[r]\n\t"
  14157. #else
  14158. "adc r3, %[r]\n\t"
  14159. #endif
  14160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14161. "lsrs r6, r7, #16\n\t"
  14162. #else
  14163. "lsr r6, r7, #16\n\t"
  14164. #endif
  14165. "uxth r5, r7\n\t"
  14166. #ifdef WOLFSSL_KEIL
  14167. "muls r5, r6, r5\n\t"
  14168. #elif defined(__clang__)
  14169. "muls r5, r6\n\t"
  14170. #else
  14171. "mul r5, r6\n\t"
  14172. #endif
  14173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14174. "lsrs r6, r5, #15\n\t"
  14175. #else
  14176. "lsr r6, r5, #15\n\t"
  14177. #endif
  14178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14179. "lsls r5, r5, #17\n\t"
  14180. #else
  14181. "lsl r5, r5, #17\n\t"
  14182. #endif
  14183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14184. "adds r4, r4, r5\n\t"
  14185. #else
  14186. "add r4, r4, r5\n\t"
  14187. #endif
  14188. #ifdef WOLFSSL_KEIL
  14189. "adcs r2, r2, r6\n\t"
  14190. #elif defined(__clang__)
  14191. "adcs r2, r6\n\t"
  14192. #else
  14193. "adc r2, r6\n\t"
  14194. #endif
  14195. #ifdef WOLFSSL_KEIL
  14196. "adcs r3, r3, %[r]\n\t"
  14197. #elif defined(__clang__)
  14198. "adcs r3, %[r]\n\t"
  14199. #else
  14200. "adc r3, %[r]\n\t"
  14201. #endif
  14202. "mov %[r], r8\n\t"
  14203. "str r4, [%[r], #32]\n\t"
  14204. "movs %[r], #0\n\t"
  14205. "movs %[a], #16\n\t"
  14206. "add %[a], %[a], r9\n\t"
  14207. "ldm %[a]!, {r5, r6}\n\t"
  14208. "mov r10, r5\n\t"
  14209. "mov r11, r6\n\t"
  14210. "ldm %[a]!, {r5, r6}\n\t"
  14211. "mov r12, r5\n\t"
  14212. "mov lr, r6\n\t"
  14213. "mov %[a], r9\n\t"
  14214. "# A[5] * A[4]\n\t"
  14215. "movs r4, #0\n\t"
  14216. "mov %[a], r11\n\t"
  14217. "uxth r5, %[a]\n\t"
  14218. "uxth r6, r7\n\t"
  14219. #ifdef WOLFSSL_KEIL
  14220. "muls r6, r5, r6\n\t"
  14221. #elif defined(__clang__)
  14222. "muls r6, r5\n\t"
  14223. #else
  14224. "mul r6, r5\n\t"
  14225. #endif
  14226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14227. "adds r2, r2, r6\n\t"
  14228. #else
  14229. "add r2, r2, r6\n\t"
  14230. #endif
  14231. #ifdef WOLFSSL_KEIL
  14232. "adcs r3, r3, %[r]\n\t"
  14233. #elif defined(__clang__)
  14234. "adcs r3, %[r]\n\t"
  14235. #else
  14236. "adc r3, %[r]\n\t"
  14237. #endif
  14238. #ifdef WOLFSSL_KEIL
  14239. "adcs r4, r4, %[r]\n\t"
  14240. #elif defined(__clang__)
  14241. "adcs r4, %[r]\n\t"
  14242. #else
  14243. "adc r4, %[r]\n\t"
  14244. #endif
  14245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14246. "adds r2, r2, r6\n\t"
  14247. #else
  14248. "add r2, r2, r6\n\t"
  14249. #endif
  14250. #ifdef WOLFSSL_KEIL
  14251. "adcs r3, r3, %[r]\n\t"
  14252. #elif defined(__clang__)
  14253. "adcs r3, %[r]\n\t"
  14254. #else
  14255. "adc r3, %[r]\n\t"
  14256. #endif
  14257. #ifdef WOLFSSL_KEIL
  14258. "adcs r4, r4, %[r]\n\t"
  14259. #elif defined(__clang__)
  14260. "adcs r4, %[r]\n\t"
  14261. #else
  14262. "adc r4, %[r]\n\t"
  14263. #endif
  14264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14265. "lsrs r6, r7, #16\n\t"
  14266. #else
  14267. "lsr r6, r7, #16\n\t"
  14268. #endif
  14269. #ifdef WOLFSSL_KEIL
  14270. "muls r5, r6, r5\n\t"
  14271. #elif defined(__clang__)
  14272. "muls r5, r6\n\t"
  14273. #else
  14274. "mul r5, r6\n\t"
  14275. #endif
  14276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14277. "lsrs r6, r5, #16\n\t"
  14278. #else
  14279. "lsr r6, r5, #16\n\t"
  14280. #endif
  14281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14282. "lsls r5, r5, #16\n\t"
  14283. #else
  14284. "lsl r5, r5, #16\n\t"
  14285. #endif
  14286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14287. "adds r2, r2, r5\n\t"
  14288. #else
  14289. "add r2, r2, r5\n\t"
  14290. #endif
  14291. #ifdef WOLFSSL_KEIL
  14292. "adcs r3, r3, r6\n\t"
  14293. #elif defined(__clang__)
  14294. "adcs r3, r6\n\t"
  14295. #else
  14296. "adc r3, r6\n\t"
  14297. #endif
  14298. #ifdef WOLFSSL_KEIL
  14299. "adcs r4, r4, %[r]\n\t"
  14300. #elif defined(__clang__)
  14301. "adcs r4, %[r]\n\t"
  14302. #else
  14303. "adc r4, %[r]\n\t"
  14304. #endif
  14305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14306. "adds r2, r2, r5\n\t"
  14307. #else
  14308. "add r2, r2, r5\n\t"
  14309. #endif
  14310. #ifdef WOLFSSL_KEIL
  14311. "adcs r3, r3, r6\n\t"
  14312. #elif defined(__clang__)
  14313. "adcs r3, r6\n\t"
  14314. #else
  14315. "adc r3, r6\n\t"
  14316. #endif
  14317. #ifdef WOLFSSL_KEIL
  14318. "adcs r4, r4, %[r]\n\t"
  14319. #elif defined(__clang__)
  14320. "adcs r4, %[r]\n\t"
  14321. #else
  14322. "adc r4, %[r]\n\t"
  14323. #endif
  14324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14325. "lsrs r5, %[a], #16\n\t"
  14326. #else
  14327. "lsr r5, %[a], #16\n\t"
  14328. #endif
  14329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14330. "lsrs r6, r7, #16\n\t"
  14331. #else
  14332. "lsr r6, r7, #16\n\t"
  14333. #endif
  14334. #ifdef WOLFSSL_KEIL
  14335. "muls r6, r5, r6\n\t"
  14336. #elif defined(__clang__)
  14337. "muls r6, r5\n\t"
  14338. #else
  14339. "mul r6, r5\n\t"
  14340. #endif
  14341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14342. "adds r3, r3, r6\n\t"
  14343. #else
  14344. "add r3, r3, r6\n\t"
  14345. #endif
  14346. #ifdef WOLFSSL_KEIL
  14347. "adcs r4, r4, %[r]\n\t"
  14348. #elif defined(__clang__)
  14349. "adcs r4, %[r]\n\t"
  14350. #else
  14351. "adc r4, %[r]\n\t"
  14352. #endif
  14353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14354. "adds r3, r3, r6\n\t"
  14355. #else
  14356. "add r3, r3, r6\n\t"
  14357. #endif
  14358. #ifdef WOLFSSL_KEIL
  14359. "adcs r4, r4, %[r]\n\t"
  14360. #elif defined(__clang__)
  14361. "adcs r4, %[r]\n\t"
  14362. #else
  14363. "adc r4, %[r]\n\t"
  14364. #endif
  14365. "uxth r6, r7\n\t"
  14366. #ifdef WOLFSSL_KEIL
  14367. "muls r5, r6, r5\n\t"
  14368. #elif defined(__clang__)
  14369. "muls r5, r6\n\t"
  14370. #else
  14371. "mul r5, r6\n\t"
  14372. #endif
  14373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14374. "lsrs r6, r5, #16\n\t"
  14375. #else
  14376. "lsr r6, r5, #16\n\t"
  14377. #endif
  14378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14379. "lsls r5, r5, #16\n\t"
  14380. #else
  14381. "lsl r5, r5, #16\n\t"
  14382. #endif
  14383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14384. "adds r2, r2, r5\n\t"
  14385. #else
  14386. "add r2, r2, r5\n\t"
  14387. #endif
  14388. #ifdef WOLFSSL_KEIL
  14389. "adcs r3, r3, r6\n\t"
  14390. #elif defined(__clang__)
  14391. "adcs r3, r6\n\t"
  14392. #else
  14393. "adc r3, r6\n\t"
  14394. #endif
  14395. #ifdef WOLFSSL_KEIL
  14396. "adcs r4, r4, %[r]\n\t"
  14397. #elif defined(__clang__)
  14398. "adcs r4, %[r]\n\t"
  14399. #else
  14400. "adc r4, %[r]\n\t"
  14401. #endif
  14402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14403. "adds r2, r2, r5\n\t"
  14404. #else
  14405. "add r2, r2, r5\n\t"
  14406. #endif
  14407. #ifdef WOLFSSL_KEIL
  14408. "adcs r3, r3, r6\n\t"
  14409. #elif defined(__clang__)
  14410. "adcs r3, r6\n\t"
  14411. #else
  14412. "adc r3, r6\n\t"
  14413. #endif
  14414. #ifdef WOLFSSL_KEIL
  14415. "adcs r4, r4, %[r]\n\t"
  14416. #elif defined(__clang__)
  14417. "adcs r4, %[r]\n\t"
  14418. #else
  14419. "adc r4, %[r]\n\t"
  14420. #endif
  14421. "# A[6] * A[3]\n\t"
  14422. "mov %[a], r9\n\t"
  14423. "ldr r7, [%[a], #12]\n\t"
  14424. "mov %[a], r12\n\t"
  14425. "uxth r5, %[a]\n\t"
  14426. "uxth r6, r7\n\t"
  14427. #ifdef WOLFSSL_KEIL
  14428. "muls r6, r5, r6\n\t"
  14429. #elif defined(__clang__)
  14430. "muls r6, r5\n\t"
  14431. #else
  14432. "mul r6, r5\n\t"
  14433. #endif
  14434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14435. "adds r2, r2, r6\n\t"
  14436. #else
  14437. "add r2, r2, r6\n\t"
  14438. #endif
  14439. #ifdef WOLFSSL_KEIL
  14440. "adcs r3, r3, %[r]\n\t"
  14441. #elif defined(__clang__)
  14442. "adcs r3, %[r]\n\t"
  14443. #else
  14444. "adc r3, %[r]\n\t"
  14445. #endif
  14446. #ifdef WOLFSSL_KEIL
  14447. "adcs r4, r4, %[r]\n\t"
  14448. #elif defined(__clang__)
  14449. "adcs r4, %[r]\n\t"
  14450. #else
  14451. "adc r4, %[r]\n\t"
  14452. #endif
  14453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14454. "adds r2, r2, r6\n\t"
  14455. #else
  14456. "add r2, r2, r6\n\t"
  14457. #endif
  14458. #ifdef WOLFSSL_KEIL
  14459. "adcs r3, r3, %[r]\n\t"
  14460. #elif defined(__clang__)
  14461. "adcs r3, %[r]\n\t"
  14462. #else
  14463. "adc r3, %[r]\n\t"
  14464. #endif
  14465. #ifdef WOLFSSL_KEIL
  14466. "adcs r4, r4, %[r]\n\t"
  14467. #elif defined(__clang__)
  14468. "adcs r4, %[r]\n\t"
  14469. #else
  14470. "adc r4, %[r]\n\t"
  14471. #endif
  14472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14473. "lsrs r6, r7, #16\n\t"
  14474. #else
  14475. "lsr r6, r7, #16\n\t"
  14476. #endif
  14477. #ifdef WOLFSSL_KEIL
  14478. "muls r5, r6, r5\n\t"
  14479. #elif defined(__clang__)
  14480. "muls r5, r6\n\t"
  14481. #else
  14482. "mul r5, r6\n\t"
  14483. #endif
  14484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14485. "lsrs r6, r5, #16\n\t"
  14486. #else
  14487. "lsr r6, r5, #16\n\t"
  14488. #endif
  14489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14490. "lsls r5, r5, #16\n\t"
  14491. #else
  14492. "lsl r5, r5, #16\n\t"
  14493. #endif
  14494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14495. "adds r2, r2, r5\n\t"
  14496. #else
  14497. "add r2, r2, r5\n\t"
  14498. #endif
  14499. #ifdef WOLFSSL_KEIL
  14500. "adcs r3, r3, r6\n\t"
  14501. #elif defined(__clang__)
  14502. "adcs r3, r6\n\t"
  14503. #else
  14504. "adc r3, r6\n\t"
  14505. #endif
  14506. #ifdef WOLFSSL_KEIL
  14507. "adcs r4, r4, %[r]\n\t"
  14508. #elif defined(__clang__)
  14509. "adcs r4, %[r]\n\t"
  14510. #else
  14511. "adc r4, %[r]\n\t"
  14512. #endif
  14513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14514. "adds r2, r2, r5\n\t"
  14515. #else
  14516. "add r2, r2, r5\n\t"
  14517. #endif
  14518. #ifdef WOLFSSL_KEIL
  14519. "adcs r3, r3, r6\n\t"
  14520. #elif defined(__clang__)
  14521. "adcs r3, r6\n\t"
  14522. #else
  14523. "adc r3, r6\n\t"
  14524. #endif
  14525. #ifdef WOLFSSL_KEIL
  14526. "adcs r4, r4, %[r]\n\t"
  14527. #elif defined(__clang__)
  14528. "adcs r4, %[r]\n\t"
  14529. #else
  14530. "adc r4, %[r]\n\t"
  14531. #endif
  14532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14533. "lsrs r5, %[a], #16\n\t"
  14534. #else
  14535. "lsr r5, %[a], #16\n\t"
  14536. #endif
  14537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14538. "lsrs r6, r7, #16\n\t"
  14539. #else
  14540. "lsr r6, r7, #16\n\t"
  14541. #endif
  14542. #ifdef WOLFSSL_KEIL
  14543. "muls r6, r5, r6\n\t"
  14544. #elif defined(__clang__)
  14545. "muls r6, r5\n\t"
  14546. #else
  14547. "mul r6, r5\n\t"
  14548. #endif
  14549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14550. "adds r3, r3, r6\n\t"
  14551. #else
  14552. "add r3, r3, r6\n\t"
  14553. #endif
  14554. #ifdef WOLFSSL_KEIL
  14555. "adcs r4, r4, %[r]\n\t"
  14556. #elif defined(__clang__)
  14557. "adcs r4, %[r]\n\t"
  14558. #else
  14559. "adc r4, %[r]\n\t"
  14560. #endif
  14561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14562. "adds r3, r3, r6\n\t"
  14563. #else
  14564. "add r3, r3, r6\n\t"
  14565. #endif
  14566. #ifdef WOLFSSL_KEIL
  14567. "adcs r4, r4, %[r]\n\t"
  14568. #elif defined(__clang__)
  14569. "adcs r4, %[r]\n\t"
  14570. #else
  14571. "adc r4, %[r]\n\t"
  14572. #endif
  14573. "uxth r6, r7\n\t"
  14574. #ifdef WOLFSSL_KEIL
  14575. "muls r5, r6, r5\n\t"
  14576. #elif defined(__clang__)
  14577. "muls r5, r6\n\t"
  14578. #else
  14579. "mul r5, r6\n\t"
  14580. #endif
  14581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14582. "lsrs r6, r5, #16\n\t"
  14583. #else
  14584. "lsr r6, r5, #16\n\t"
  14585. #endif
  14586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14587. "lsls r5, r5, #16\n\t"
  14588. #else
  14589. "lsl r5, r5, #16\n\t"
  14590. #endif
  14591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14592. "adds r2, r2, r5\n\t"
  14593. #else
  14594. "add r2, r2, r5\n\t"
  14595. #endif
  14596. #ifdef WOLFSSL_KEIL
  14597. "adcs r3, r3, r6\n\t"
  14598. #elif defined(__clang__)
  14599. "adcs r3, r6\n\t"
  14600. #else
  14601. "adc r3, r6\n\t"
  14602. #endif
  14603. #ifdef WOLFSSL_KEIL
  14604. "adcs r4, r4, %[r]\n\t"
  14605. #elif defined(__clang__)
  14606. "adcs r4, %[r]\n\t"
  14607. #else
  14608. "adc r4, %[r]\n\t"
  14609. #endif
  14610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14611. "adds r2, r2, r5\n\t"
  14612. #else
  14613. "add r2, r2, r5\n\t"
  14614. #endif
  14615. #ifdef WOLFSSL_KEIL
  14616. "adcs r3, r3, r6\n\t"
  14617. #elif defined(__clang__)
  14618. "adcs r3, r6\n\t"
  14619. #else
  14620. "adc r3, r6\n\t"
  14621. #endif
  14622. #ifdef WOLFSSL_KEIL
  14623. "adcs r4, r4, %[r]\n\t"
  14624. #elif defined(__clang__)
  14625. "adcs r4, %[r]\n\t"
  14626. #else
  14627. "adc r4, %[r]\n\t"
  14628. #endif
  14629. "# A[7] * A[2]\n\t"
  14630. "mov %[a], r9\n\t"
  14631. "ldr r7, [%[a], #8]\n\t"
  14632. "mov %[a], lr\n\t"
  14633. "uxth r5, %[a]\n\t"
  14634. "uxth r6, r7\n\t"
  14635. #ifdef WOLFSSL_KEIL
  14636. "muls r6, r5, r6\n\t"
  14637. #elif defined(__clang__)
  14638. "muls r6, r5\n\t"
  14639. #else
  14640. "mul r6, r5\n\t"
  14641. #endif
  14642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14643. "adds r2, r2, r6\n\t"
  14644. #else
  14645. "add r2, r2, r6\n\t"
  14646. #endif
  14647. #ifdef WOLFSSL_KEIL
  14648. "adcs r3, r3, %[r]\n\t"
  14649. #elif defined(__clang__)
  14650. "adcs r3, %[r]\n\t"
  14651. #else
  14652. "adc r3, %[r]\n\t"
  14653. #endif
  14654. #ifdef WOLFSSL_KEIL
  14655. "adcs r4, r4, %[r]\n\t"
  14656. #elif defined(__clang__)
  14657. "adcs r4, %[r]\n\t"
  14658. #else
  14659. "adc r4, %[r]\n\t"
  14660. #endif
  14661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14662. "adds r2, r2, r6\n\t"
  14663. #else
  14664. "add r2, r2, r6\n\t"
  14665. #endif
  14666. #ifdef WOLFSSL_KEIL
  14667. "adcs r3, r3, %[r]\n\t"
  14668. #elif defined(__clang__)
  14669. "adcs r3, %[r]\n\t"
  14670. #else
  14671. "adc r3, %[r]\n\t"
  14672. #endif
  14673. #ifdef WOLFSSL_KEIL
  14674. "adcs r4, r4, %[r]\n\t"
  14675. #elif defined(__clang__)
  14676. "adcs r4, %[r]\n\t"
  14677. #else
  14678. "adc r4, %[r]\n\t"
  14679. #endif
  14680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14681. "lsrs r6, r7, #16\n\t"
  14682. #else
  14683. "lsr r6, r7, #16\n\t"
  14684. #endif
  14685. #ifdef WOLFSSL_KEIL
  14686. "muls r5, r6, r5\n\t"
  14687. #elif defined(__clang__)
  14688. "muls r5, r6\n\t"
  14689. #else
  14690. "mul r5, r6\n\t"
  14691. #endif
  14692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14693. "lsrs r6, r5, #16\n\t"
  14694. #else
  14695. "lsr r6, r5, #16\n\t"
  14696. #endif
  14697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14698. "lsls r5, r5, #16\n\t"
  14699. #else
  14700. "lsl r5, r5, #16\n\t"
  14701. #endif
  14702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14703. "adds r2, r2, r5\n\t"
  14704. #else
  14705. "add r2, r2, r5\n\t"
  14706. #endif
  14707. #ifdef WOLFSSL_KEIL
  14708. "adcs r3, r3, r6\n\t"
  14709. #elif defined(__clang__)
  14710. "adcs r3, r6\n\t"
  14711. #else
  14712. "adc r3, r6\n\t"
  14713. #endif
  14714. #ifdef WOLFSSL_KEIL
  14715. "adcs r4, r4, %[r]\n\t"
  14716. #elif defined(__clang__)
  14717. "adcs r4, %[r]\n\t"
  14718. #else
  14719. "adc r4, %[r]\n\t"
  14720. #endif
  14721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14722. "adds r2, r2, r5\n\t"
  14723. #else
  14724. "add r2, r2, r5\n\t"
  14725. #endif
  14726. #ifdef WOLFSSL_KEIL
  14727. "adcs r3, r3, r6\n\t"
  14728. #elif defined(__clang__)
  14729. "adcs r3, r6\n\t"
  14730. #else
  14731. "adc r3, r6\n\t"
  14732. #endif
  14733. #ifdef WOLFSSL_KEIL
  14734. "adcs r4, r4, %[r]\n\t"
  14735. #elif defined(__clang__)
  14736. "adcs r4, %[r]\n\t"
  14737. #else
  14738. "adc r4, %[r]\n\t"
  14739. #endif
  14740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14741. "lsrs r5, %[a], #16\n\t"
  14742. #else
  14743. "lsr r5, %[a], #16\n\t"
  14744. #endif
  14745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14746. "lsrs r6, r7, #16\n\t"
  14747. #else
  14748. "lsr r6, r7, #16\n\t"
  14749. #endif
  14750. #ifdef WOLFSSL_KEIL
  14751. "muls r6, r5, r6\n\t"
  14752. #elif defined(__clang__)
  14753. "muls r6, r5\n\t"
  14754. #else
  14755. "mul r6, r5\n\t"
  14756. #endif
  14757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14758. "adds r3, r3, r6\n\t"
  14759. #else
  14760. "add r3, r3, r6\n\t"
  14761. #endif
  14762. #ifdef WOLFSSL_KEIL
  14763. "adcs r4, r4, %[r]\n\t"
  14764. #elif defined(__clang__)
  14765. "adcs r4, %[r]\n\t"
  14766. #else
  14767. "adc r4, %[r]\n\t"
  14768. #endif
  14769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14770. "adds r3, r3, r6\n\t"
  14771. #else
  14772. "add r3, r3, r6\n\t"
  14773. #endif
  14774. #ifdef WOLFSSL_KEIL
  14775. "adcs r4, r4, %[r]\n\t"
  14776. #elif defined(__clang__)
  14777. "adcs r4, %[r]\n\t"
  14778. #else
  14779. "adc r4, %[r]\n\t"
  14780. #endif
  14781. "uxth r6, r7\n\t"
  14782. #ifdef WOLFSSL_KEIL
  14783. "muls r5, r6, r5\n\t"
  14784. #elif defined(__clang__)
  14785. "muls r5, r6\n\t"
  14786. #else
  14787. "mul r5, r6\n\t"
  14788. #endif
  14789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14790. "lsrs r6, r5, #16\n\t"
  14791. #else
  14792. "lsr r6, r5, #16\n\t"
  14793. #endif
  14794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14795. "lsls r5, r5, #16\n\t"
  14796. #else
  14797. "lsl r5, r5, #16\n\t"
  14798. #endif
  14799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14800. "adds r2, r2, r5\n\t"
  14801. #else
  14802. "add r2, r2, r5\n\t"
  14803. #endif
  14804. #ifdef WOLFSSL_KEIL
  14805. "adcs r3, r3, r6\n\t"
  14806. #elif defined(__clang__)
  14807. "adcs r3, r6\n\t"
  14808. #else
  14809. "adc r3, r6\n\t"
  14810. #endif
  14811. #ifdef WOLFSSL_KEIL
  14812. "adcs r4, r4, %[r]\n\t"
  14813. #elif defined(__clang__)
  14814. "adcs r4, %[r]\n\t"
  14815. #else
  14816. "adc r4, %[r]\n\t"
  14817. #endif
  14818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14819. "adds r2, r2, r5\n\t"
  14820. #else
  14821. "add r2, r2, r5\n\t"
  14822. #endif
  14823. #ifdef WOLFSSL_KEIL
  14824. "adcs r3, r3, r6\n\t"
  14825. #elif defined(__clang__)
  14826. "adcs r3, r6\n\t"
  14827. #else
  14828. "adc r3, r6\n\t"
  14829. #endif
  14830. #ifdef WOLFSSL_KEIL
  14831. "adcs r4, r4, %[r]\n\t"
  14832. #elif defined(__clang__)
  14833. "adcs r4, %[r]\n\t"
  14834. #else
  14835. "adc r4, %[r]\n\t"
  14836. #endif
  14837. "mov %[r], r8\n\t"
  14838. "str r2, [%[r], #36]\n\t"
  14839. "movs %[r], #0\n\t"
  14840. "# A[7] * A[3]\n\t"
  14841. "movs r2, #0\n\t"
  14842. "mov %[a], r9\n\t"
  14843. "ldr r7, [%[a], #12]\n\t"
  14844. "mov %[a], lr\n\t"
  14845. "uxth r5, %[a]\n\t"
  14846. "uxth r6, r7\n\t"
  14847. #ifdef WOLFSSL_KEIL
  14848. "muls r6, r5, r6\n\t"
  14849. #elif defined(__clang__)
  14850. "muls r6, r5\n\t"
  14851. #else
  14852. "mul r6, r5\n\t"
  14853. #endif
  14854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14855. "adds r3, r3, r6\n\t"
  14856. #else
  14857. "add r3, r3, r6\n\t"
  14858. #endif
  14859. #ifdef WOLFSSL_KEIL
  14860. "adcs r4, r4, %[r]\n\t"
  14861. #elif defined(__clang__)
  14862. "adcs r4, %[r]\n\t"
  14863. #else
  14864. "adc r4, %[r]\n\t"
  14865. #endif
  14866. #ifdef WOLFSSL_KEIL
  14867. "adcs r2, r2, %[r]\n\t"
  14868. #elif defined(__clang__)
  14869. "adcs r2, %[r]\n\t"
  14870. #else
  14871. "adc r2, %[r]\n\t"
  14872. #endif
  14873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14874. "adds r3, r3, r6\n\t"
  14875. #else
  14876. "add r3, r3, r6\n\t"
  14877. #endif
  14878. #ifdef WOLFSSL_KEIL
  14879. "adcs r4, r4, %[r]\n\t"
  14880. #elif defined(__clang__)
  14881. "adcs r4, %[r]\n\t"
  14882. #else
  14883. "adc r4, %[r]\n\t"
  14884. #endif
  14885. #ifdef WOLFSSL_KEIL
  14886. "adcs r2, r2, %[r]\n\t"
  14887. #elif defined(__clang__)
  14888. "adcs r2, %[r]\n\t"
  14889. #else
  14890. "adc r2, %[r]\n\t"
  14891. #endif
  14892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14893. "lsrs r6, r7, #16\n\t"
  14894. #else
  14895. "lsr r6, r7, #16\n\t"
  14896. #endif
  14897. #ifdef WOLFSSL_KEIL
  14898. "muls r5, r6, r5\n\t"
  14899. #elif defined(__clang__)
  14900. "muls r5, r6\n\t"
  14901. #else
  14902. "mul r5, r6\n\t"
  14903. #endif
  14904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14905. "lsrs r6, r5, #16\n\t"
  14906. #else
  14907. "lsr r6, r5, #16\n\t"
  14908. #endif
  14909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14910. "lsls r5, r5, #16\n\t"
  14911. #else
  14912. "lsl r5, r5, #16\n\t"
  14913. #endif
  14914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14915. "adds r3, r3, r5\n\t"
  14916. #else
  14917. "add r3, r3, r5\n\t"
  14918. #endif
  14919. #ifdef WOLFSSL_KEIL
  14920. "adcs r4, r4, r6\n\t"
  14921. #elif defined(__clang__)
  14922. "adcs r4, r6\n\t"
  14923. #else
  14924. "adc r4, r6\n\t"
  14925. #endif
  14926. #ifdef WOLFSSL_KEIL
  14927. "adcs r2, r2, %[r]\n\t"
  14928. #elif defined(__clang__)
  14929. "adcs r2, %[r]\n\t"
  14930. #else
  14931. "adc r2, %[r]\n\t"
  14932. #endif
  14933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14934. "adds r3, r3, r5\n\t"
  14935. #else
  14936. "add r3, r3, r5\n\t"
  14937. #endif
  14938. #ifdef WOLFSSL_KEIL
  14939. "adcs r4, r4, r6\n\t"
  14940. #elif defined(__clang__)
  14941. "adcs r4, r6\n\t"
  14942. #else
  14943. "adc r4, r6\n\t"
  14944. #endif
  14945. #ifdef WOLFSSL_KEIL
  14946. "adcs r2, r2, %[r]\n\t"
  14947. #elif defined(__clang__)
  14948. "adcs r2, %[r]\n\t"
  14949. #else
  14950. "adc r2, %[r]\n\t"
  14951. #endif
  14952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14953. "lsrs r5, %[a], #16\n\t"
  14954. #else
  14955. "lsr r5, %[a], #16\n\t"
  14956. #endif
  14957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14958. "lsrs r6, r7, #16\n\t"
  14959. #else
  14960. "lsr r6, r7, #16\n\t"
  14961. #endif
  14962. #ifdef WOLFSSL_KEIL
  14963. "muls r6, r5, r6\n\t"
  14964. #elif defined(__clang__)
  14965. "muls r6, r5\n\t"
  14966. #else
  14967. "mul r6, r5\n\t"
  14968. #endif
  14969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14970. "adds r4, r4, r6\n\t"
  14971. #else
  14972. "add r4, r4, r6\n\t"
  14973. #endif
  14974. #ifdef WOLFSSL_KEIL
  14975. "adcs r2, r2, %[r]\n\t"
  14976. #elif defined(__clang__)
  14977. "adcs r2, %[r]\n\t"
  14978. #else
  14979. "adc r2, %[r]\n\t"
  14980. #endif
  14981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14982. "adds r4, r4, r6\n\t"
  14983. #else
  14984. "add r4, r4, r6\n\t"
  14985. #endif
  14986. #ifdef WOLFSSL_KEIL
  14987. "adcs r2, r2, %[r]\n\t"
  14988. #elif defined(__clang__)
  14989. "adcs r2, %[r]\n\t"
  14990. #else
  14991. "adc r2, %[r]\n\t"
  14992. #endif
  14993. "uxth r6, r7\n\t"
  14994. #ifdef WOLFSSL_KEIL
  14995. "muls r5, r6, r5\n\t"
  14996. #elif defined(__clang__)
  14997. "muls r5, r6\n\t"
  14998. #else
  14999. "mul r5, r6\n\t"
  15000. #endif
  15001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15002. "lsrs r6, r5, #16\n\t"
  15003. #else
  15004. "lsr r6, r5, #16\n\t"
  15005. #endif
  15006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15007. "lsls r5, r5, #16\n\t"
  15008. #else
  15009. "lsl r5, r5, #16\n\t"
  15010. #endif
  15011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15012. "adds r3, r3, r5\n\t"
  15013. #else
  15014. "add r3, r3, r5\n\t"
  15015. #endif
  15016. #ifdef WOLFSSL_KEIL
  15017. "adcs r4, r4, r6\n\t"
  15018. #elif defined(__clang__)
  15019. "adcs r4, r6\n\t"
  15020. #else
  15021. "adc r4, r6\n\t"
  15022. #endif
  15023. #ifdef WOLFSSL_KEIL
  15024. "adcs r2, r2, %[r]\n\t"
  15025. #elif defined(__clang__)
  15026. "adcs r2, %[r]\n\t"
  15027. #else
  15028. "adc r2, %[r]\n\t"
  15029. #endif
  15030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15031. "adds r3, r3, r5\n\t"
  15032. #else
  15033. "add r3, r3, r5\n\t"
  15034. #endif
  15035. #ifdef WOLFSSL_KEIL
  15036. "adcs r4, r4, r6\n\t"
  15037. #elif defined(__clang__)
  15038. "adcs r4, r6\n\t"
  15039. #else
  15040. "adc r4, r6\n\t"
  15041. #endif
  15042. #ifdef WOLFSSL_KEIL
  15043. "adcs r2, r2, %[r]\n\t"
  15044. #elif defined(__clang__)
  15045. "adcs r2, %[r]\n\t"
  15046. #else
  15047. "adc r2, %[r]\n\t"
  15048. #endif
  15049. "# A[6] * A[4]\n\t"
  15050. "mov %[a], r9\n\t"
  15051. "mov r7, r10\n\t"
  15052. "mov %[a], r12\n\t"
  15053. "uxth r5, %[a]\n\t"
  15054. "uxth r6, r7\n\t"
  15055. #ifdef WOLFSSL_KEIL
  15056. "muls r6, r5, r6\n\t"
  15057. #elif defined(__clang__)
  15058. "muls r6, r5\n\t"
  15059. #else
  15060. "mul r6, r5\n\t"
  15061. #endif
  15062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15063. "adds r3, r3, r6\n\t"
  15064. #else
  15065. "add r3, r3, r6\n\t"
  15066. #endif
  15067. #ifdef WOLFSSL_KEIL
  15068. "adcs r4, r4, %[r]\n\t"
  15069. #elif defined(__clang__)
  15070. "adcs r4, %[r]\n\t"
  15071. #else
  15072. "adc r4, %[r]\n\t"
  15073. #endif
  15074. #ifdef WOLFSSL_KEIL
  15075. "adcs r2, r2, %[r]\n\t"
  15076. #elif defined(__clang__)
  15077. "adcs r2, %[r]\n\t"
  15078. #else
  15079. "adc r2, %[r]\n\t"
  15080. #endif
  15081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15082. "adds r3, r3, r6\n\t"
  15083. #else
  15084. "add r3, r3, r6\n\t"
  15085. #endif
  15086. #ifdef WOLFSSL_KEIL
  15087. "adcs r4, r4, %[r]\n\t"
  15088. #elif defined(__clang__)
  15089. "adcs r4, %[r]\n\t"
  15090. #else
  15091. "adc r4, %[r]\n\t"
  15092. #endif
  15093. #ifdef WOLFSSL_KEIL
  15094. "adcs r2, r2, %[r]\n\t"
  15095. #elif defined(__clang__)
  15096. "adcs r2, %[r]\n\t"
  15097. #else
  15098. "adc r2, %[r]\n\t"
  15099. #endif
  15100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15101. "lsrs r6, r7, #16\n\t"
  15102. #else
  15103. "lsr r6, r7, #16\n\t"
  15104. #endif
  15105. #ifdef WOLFSSL_KEIL
  15106. "muls r5, r6, r5\n\t"
  15107. #elif defined(__clang__)
  15108. "muls r5, r6\n\t"
  15109. #else
  15110. "mul r5, r6\n\t"
  15111. #endif
  15112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15113. "lsrs r6, r5, #16\n\t"
  15114. #else
  15115. "lsr r6, r5, #16\n\t"
  15116. #endif
  15117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15118. "lsls r5, r5, #16\n\t"
  15119. #else
  15120. "lsl r5, r5, #16\n\t"
  15121. #endif
  15122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15123. "adds r3, r3, r5\n\t"
  15124. #else
  15125. "add r3, r3, r5\n\t"
  15126. #endif
  15127. #ifdef WOLFSSL_KEIL
  15128. "adcs r4, r4, r6\n\t"
  15129. #elif defined(__clang__)
  15130. "adcs r4, r6\n\t"
  15131. #else
  15132. "adc r4, r6\n\t"
  15133. #endif
  15134. #ifdef WOLFSSL_KEIL
  15135. "adcs r2, r2, %[r]\n\t"
  15136. #elif defined(__clang__)
  15137. "adcs r2, %[r]\n\t"
  15138. #else
  15139. "adc r2, %[r]\n\t"
  15140. #endif
  15141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15142. "adds r3, r3, r5\n\t"
  15143. #else
  15144. "add r3, r3, r5\n\t"
  15145. #endif
  15146. #ifdef WOLFSSL_KEIL
  15147. "adcs r4, r4, r6\n\t"
  15148. #elif defined(__clang__)
  15149. "adcs r4, r6\n\t"
  15150. #else
  15151. "adc r4, r6\n\t"
  15152. #endif
  15153. #ifdef WOLFSSL_KEIL
  15154. "adcs r2, r2, %[r]\n\t"
  15155. #elif defined(__clang__)
  15156. "adcs r2, %[r]\n\t"
  15157. #else
  15158. "adc r2, %[r]\n\t"
  15159. #endif
  15160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15161. "lsrs r5, %[a], #16\n\t"
  15162. #else
  15163. "lsr r5, %[a], #16\n\t"
  15164. #endif
  15165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15166. "lsrs r6, r7, #16\n\t"
  15167. #else
  15168. "lsr r6, r7, #16\n\t"
  15169. #endif
  15170. #ifdef WOLFSSL_KEIL
  15171. "muls r6, r5, r6\n\t"
  15172. #elif defined(__clang__)
  15173. "muls r6, r5\n\t"
  15174. #else
  15175. "mul r6, r5\n\t"
  15176. #endif
  15177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15178. "adds r4, r4, r6\n\t"
  15179. #else
  15180. "add r4, r4, r6\n\t"
  15181. #endif
  15182. #ifdef WOLFSSL_KEIL
  15183. "adcs r2, r2, %[r]\n\t"
  15184. #elif defined(__clang__)
  15185. "adcs r2, %[r]\n\t"
  15186. #else
  15187. "adc r2, %[r]\n\t"
  15188. #endif
  15189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15190. "adds r4, r4, r6\n\t"
  15191. #else
  15192. "add r4, r4, r6\n\t"
  15193. #endif
  15194. #ifdef WOLFSSL_KEIL
  15195. "adcs r2, r2, %[r]\n\t"
  15196. #elif defined(__clang__)
  15197. "adcs r2, %[r]\n\t"
  15198. #else
  15199. "adc r2, %[r]\n\t"
  15200. #endif
  15201. "uxth r6, r7\n\t"
  15202. #ifdef WOLFSSL_KEIL
  15203. "muls r5, r6, r5\n\t"
  15204. #elif defined(__clang__)
  15205. "muls r5, r6\n\t"
  15206. #else
  15207. "mul r5, r6\n\t"
  15208. #endif
  15209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15210. "lsrs r6, r5, #16\n\t"
  15211. #else
  15212. "lsr r6, r5, #16\n\t"
  15213. #endif
  15214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15215. "lsls r5, r5, #16\n\t"
  15216. #else
  15217. "lsl r5, r5, #16\n\t"
  15218. #endif
  15219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15220. "adds r3, r3, r5\n\t"
  15221. #else
  15222. "add r3, r3, r5\n\t"
  15223. #endif
  15224. #ifdef WOLFSSL_KEIL
  15225. "adcs r4, r4, r6\n\t"
  15226. #elif defined(__clang__)
  15227. "adcs r4, r6\n\t"
  15228. #else
  15229. "adc r4, r6\n\t"
  15230. #endif
  15231. #ifdef WOLFSSL_KEIL
  15232. "adcs r2, r2, %[r]\n\t"
  15233. #elif defined(__clang__)
  15234. "adcs r2, %[r]\n\t"
  15235. #else
  15236. "adc r2, %[r]\n\t"
  15237. #endif
  15238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15239. "adds r3, r3, r5\n\t"
  15240. #else
  15241. "add r3, r3, r5\n\t"
  15242. #endif
  15243. #ifdef WOLFSSL_KEIL
  15244. "adcs r4, r4, r6\n\t"
  15245. #elif defined(__clang__)
  15246. "adcs r4, r6\n\t"
  15247. #else
  15248. "adc r4, r6\n\t"
  15249. #endif
  15250. #ifdef WOLFSSL_KEIL
  15251. "adcs r2, r2, %[r]\n\t"
  15252. #elif defined(__clang__)
  15253. "adcs r2, %[r]\n\t"
  15254. #else
  15255. "adc r2, %[r]\n\t"
  15256. #endif
  15257. "# A[5] * A[5]\n\t"
  15258. "mov r7, r11\n\t"
  15259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15260. "lsrs r6, r7, #16\n\t"
  15261. #else
  15262. "lsr r6, r7, #16\n\t"
  15263. #endif
  15264. "uxth r5, r7\n\t"
  15265. #ifdef WOLFSSL_KEIL
  15266. "muls r5, r5, r5\n\t"
  15267. #elif defined(__clang__)
  15268. "muls r5, r5\n\t"
  15269. #else
  15270. "mul r5, r5\n\t"
  15271. #endif
  15272. #ifdef WOLFSSL_KEIL
  15273. "muls r6, r6, r6\n\t"
  15274. #elif defined(__clang__)
  15275. "muls r6, r6\n\t"
  15276. #else
  15277. "mul r6, r6\n\t"
  15278. #endif
  15279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15280. "adds r3, r3, r5\n\t"
  15281. #else
  15282. "add r3, r3, r5\n\t"
  15283. #endif
  15284. #ifdef WOLFSSL_KEIL
  15285. "adcs r4, r4, r6\n\t"
  15286. #elif defined(__clang__)
  15287. "adcs r4, r6\n\t"
  15288. #else
  15289. "adc r4, r6\n\t"
  15290. #endif
  15291. #ifdef WOLFSSL_KEIL
  15292. "adcs r2, r2, %[r]\n\t"
  15293. #elif defined(__clang__)
  15294. "adcs r2, %[r]\n\t"
  15295. #else
  15296. "adc r2, %[r]\n\t"
  15297. #endif
  15298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15299. "lsrs r6, r7, #16\n\t"
  15300. #else
  15301. "lsr r6, r7, #16\n\t"
  15302. #endif
  15303. "uxth r5, r7\n\t"
  15304. #ifdef WOLFSSL_KEIL
  15305. "muls r5, r6, r5\n\t"
  15306. #elif defined(__clang__)
  15307. "muls r5, r6\n\t"
  15308. #else
  15309. "mul r5, r6\n\t"
  15310. #endif
  15311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15312. "lsrs r6, r5, #15\n\t"
  15313. #else
  15314. "lsr r6, r5, #15\n\t"
  15315. #endif
  15316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15317. "lsls r5, r5, #17\n\t"
  15318. #else
  15319. "lsl r5, r5, #17\n\t"
  15320. #endif
  15321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15322. "adds r3, r3, r5\n\t"
  15323. #else
  15324. "add r3, r3, r5\n\t"
  15325. #endif
  15326. #ifdef WOLFSSL_KEIL
  15327. "adcs r4, r4, r6\n\t"
  15328. #elif defined(__clang__)
  15329. "adcs r4, r6\n\t"
  15330. #else
  15331. "adc r4, r6\n\t"
  15332. #endif
  15333. #ifdef WOLFSSL_KEIL
  15334. "adcs r2, r2, %[r]\n\t"
  15335. #elif defined(__clang__)
  15336. "adcs r2, %[r]\n\t"
  15337. #else
  15338. "adc r2, %[r]\n\t"
  15339. #endif
  15340. "mov %[r], r8\n\t"
  15341. "str r3, [%[r], #40]\n\t"
  15342. "movs %[r], #0\n\t"
  15343. "# A[6] * A[5]\n\t"
  15344. "movs r3, #0\n\t"
  15345. "mov %[a], r9\n\t"
  15346. "mov %[a], r12\n\t"
  15347. "uxth r5, %[a]\n\t"
  15348. "uxth r6, r7\n\t"
  15349. #ifdef WOLFSSL_KEIL
  15350. "muls r6, r5, r6\n\t"
  15351. #elif defined(__clang__)
  15352. "muls r6, r5\n\t"
  15353. #else
  15354. "mul r6, r5\n\t"
  15355. #endif
  15356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15357. "adds r4, r4, r6\n\t"
  15358. #else
  15359. "add r4, r4, r6\n\t"
  15360. #endif
  15361. #ifdef WOLFSSL_KEIL
  15362. "adcs r2, r2, %[r]\n\t"
  15363. #elif defined(__clang__)
  15364. "adcs r2, %[r]\n\t"
  15365. #else
  15366. "adc r2, %[r]\n\t"
  15367. #endif
  15368. #ifdef WOLFSSL_KEIL
  15369. "adcs r3, r3, %[r]\n\t"
  15370. #elif defined(__clang__)
  15371. "adcs r3, %[r]\n\t"
  15372. #else
  15373. "adc r3, %[r]\n\t"
  15374. #endif
  15375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15376. "adds r4, r4, r6\n\t"
  15377. #else
  15378. "add r4, r4, r6\n\t"
  15379. #endif
  15380. #ifdef WOLFSSL_KEIL
  15381. "adcs r2, r2, %[r]\n\t"
  15382. #elif defined(__clang__)
  15383. "adcs r2, %[r]\n\t"
  15384. #else
  15385. "adc r2, %[r]\n\t"
  15386. #endif
  15387. #ifdef WOLFSSL_KEIL
  15388. "adcs r3, r3, %[r]\n\t"
  15389. #elif defined(__clang__)
  15390. "adcs r3, %[r]\n\t"
  15391. #else
  15392. "adc r3, %[r]\n\t"
  15393. #endif
  15394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15395. "lsrs r6, r7, #16\n\t"
  15396. #else
  15397. "lsr r6, r7, #16\n\t"
  15398. #endif
  15399. #ifdef WOLFSSL_KEIL
  15400. "muls r5, r6, r5\n\t"
  15401. #elif defined(__clang__)
  15402. "muls r5, r6\n\t"
  15403. #else
  15404. "mul r5, r6\n\t"
  15405. #endif
  15406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15407. "lsrs r6, r5, #16\n\t"
  15408. #else
  15409. "lsr r6, r5, #16\n\t"
  15410. #endif
  15411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15412. "lsls r5, r5, #16\n\t"
  15413. #else
  15414. "lsl r5, r5, #16\n\t"
  15415. #endif
  15416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15417. "adds r4, r4, r5\n\t"
  15418. #else
  15419. "add r4, r4, r5\n\t"
  15420. #endif
  15421. #ifdef WOLFSSL_KEIL
  15422. "adcs r2, r2, r6\n\t"
  15423. #elif defined(__clang__)
  15424. "adcs r2, r6\n\t"
  15425. #else
  15426. "adc r2, r6\n\t"
  15427. #endif
  15428. #ifdef WOLFSSL_KEIL
  15429. "adcs r3, r3, %[r]\n\t"
  15430. #elif defined(__clang__)
  15431. "adcs r3, %[r]\n\t"
  15432. #else
  15433. "adc r3, %[r]\n\t"
  15434. #endif
  15435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15436. "adds r4, r4, r5\n\t"
  15437. #else
  15438. "add r4, r4, r5\n\t"
  15439. #endif
  15440. #ifdef WOLFSSL_KEIL
  15441. "adcs r2, r2, r6\n\t"
  15442. #elif defined(__clang__)
  15443. "adcs r2, r6\n\t"
  15444. #else
  15445. "adc r2, r6\n\t"
  15446. #endif
  15447. #ifdef WOLFSSL_KEIL
  15448. "adcs r3, r3, %[r]\n\t"
  15449. #elif defined(__clang__)
  15450. "adcs r3, %[r]\n\t"
  15451. #else
  15452. "adc r3, %[r]\n\t"
  15453. #endif
  15454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15455. "lsrs r5, %[a], #16\n\t"
  15456. #else
  15457. "lsr r5, %[a], #16\n\t"
  15458. #endif
  15459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15460. "lsrs r6, r7, #16\n\t"
  15461. #else
  15462. "lsr r6, r7, #16\n\t"
  15463. #endif
  15464. #ifdef WOLFSSL_KEIL
  15465. "muls r6, r5, r6\n\t"
  15466. #elif defined(__clang__)
  15467. "muls r6, r5\n\t"
  15468. #else
  15469. "mul r6, r5\n\t"
  15470. #endif
  15471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15472. "adds r2, r2, r6\n\t"
  15473. #else
  15474. "add r2, r2, r6\n\t"
  15475. #endif
  15476. #ifdef WOLFSSL_KEIL
  15477. "adcs r3, r3, %[r]\n\t"
  15478. #elif defined(__clang__)
  15479. "adcs r3, %[r]\n\t"
  15480. #else
  15481. "adc r3, %[r]\n\t"
  15482. #endif
  15483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15484. "adds r2, r2, r6\n\t"
  15485. #else
  15486. "add r2, r2, r6\n\t"
  15487. #endif
  15488. #ifdef WOLFSSL_KEIL
  15489. "adcs r3, r3, %[r]\n\t"
  15490. #elif defined(__clang__)
  15491. "adcs r3, %[r]\n\t"
  15492. #else
  15493. "adc r3, %[r]\n\t"
  15494. #endif
  15495. "uxth r6, r7\n\t"
  15496. #ifdef WOLFSSL_KEIL
  15497. "muls r5, r6, r5\n\t"
  15498. #elif defined(__clang__)
  15499. "muls r5, r6\n\t"
  15500. #else
  15501. "mul r5, r6\n\t"
  15502. #endif
  15503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15504. "lsrs r6, r5, #16\n\t"
  15505. #else
  15506. "lsr r6, r5, #16\n\t"
  15507. #endif
  15508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15509. "lsls r5, r5, #16\n\t"
  15510. #else
  15511. "lsl r5, r5, #16\n\t"
  15512. #endif
  15513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15514. "adds r4, r4, r5\n\t"
  15515. #else
  15516. "add r4, r4, r5\n\t"
  15517. #endif
  15518. #ifdef WOLFSSL_KEIL
  15519. "adcs r2, r2, r6\n\t"
  15520. #elif defined(__clang__)
  15521. "adcs r2, r6\n\t"
  15522. #else
  15523. "adc r2, r6\n\t"
  15524. #endif
  15525. #ifdef WOLFSSL_KEIL
  15526. "adcs r3, r3, %[r]\n\t"
  15527. #elif defined(__clang__)
  15528. "adcs r3, %[r]\n\t"
  15529. #else
  15530. "adc r3, %[r]\n\t"
  15531. #endif
  15532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15533. "adds r4, r4, r5\n\t"
  15534. #else
  15535. "add r4, r4, r5\n\t"
  15536. #endif
  15537. #ifdef WOLFSSL_KEIL
  15538. "adcs r2, r2, r6\n\t"
  15539. #elif defined(__clang__)
  15540. "adcs r2, r6\n\t"
  15541. #else
  15542. "adc r2, r6\n\t"
  15543. #endif
  15544. #ifdef WOLFSSL_KEIL
  15545. "adcs r3, r3, %[r]\n\t"
  15546. #elif defined(__clang__)
  15547. "adcs r3, %[r]\n\t"
  15548. #else
  15549. "adc r3, %[r]\n\t"
  15550. #endif
  15551. "# A[7] * A[4]\n\t"
  15552. "mov %[a], r9\n\t"
  15553. "mov r7, r10\n\t"
  15554. "mov %[a], lr\n\t"
  15555. "uxth r5, %[a]\n\t"
  15556. "uxth r6, r7\n\t"
  15557. #ifdef WOLFSSL_KEIL
  15558. "muls r6, r5, r6\n\t"
  15559. #elif defined(__clang__)
  15560. "muls r6, r5\n\t"
  15561. #else
  15562. "mul r6, r5\n\t"
  15563. #endif
  15564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15565. "adds r4, r4, r6\n\t"
  15566. #else
  15567. "add r4, r4, r6\n\t"
  15568. #endif
  15569. #ifdef WOLFSSL_KEIL
  15570. "adcs r2, r2, %[r]\n\t"
  15571. #elif defined(__clang__)
  15572. "adcs r2, %[r]\n\t"
  15573. #else
  15574. "adc r2, %[r]\n\t"
  15575. #endif
  15576. #ifdef WOLFSSL_KEIL
  15577. "adcs r3, r3, %[r]\n\t"
  15578. #elif defined(__clang__)
  15579. "adcs r3, %[r]\n\t"
  15580. #else
  15581. "adc r3, %[r]\n\t"
  15582. #endif
  15583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15584. "adds r4, r4, r6\n\t"
  15585. #else
  15586. "add r4, r4, r6\n\t"
  15587. #endif
  15588. #ifdef WOLFSSL_KEIL
  15589. "adcs r2, r2, %[r]\n\t"
  15590. #elif defined(__clang__)
  15591. "adcs r2, %[r]\n\t"
  15592. #else
  15593. "adc r2, %[r]\n\t"
  15594. #endif
  15595. #ifdef WOLFSSL_KEIL
  15596. "adcs r3, r3, %[r]\n\t"
  15597. #elif defined(__clang__)
  15598. "adcs r3, %[r]\n\t"
  15599. #else
  15600. "adc r3, %[r]\n\t"
  15601. #endif
  15602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15603. "lsrs r6, r7, #16\n\t"
  15604. #else
  15605. "lsr r6, r7, #16\n\t"
  15606. #endif
  15607. #ifdef WOLFSSL_KEIL
  15608. "muls r5, r6, r5\n\t"
  15609. #elif defined(__clang__)
  15610. "muls r5, r6\n\t"
  15611. #else
  15612. "mul r5, r6\n\t"
  15613. #endif
  15614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15615. "lsrs r6, r5, #16\n\t"
  15616. #else
  15617. "lsr r6, r5, #16\n\t"
  15618. #endif
  15619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15620. "lsls r5, r5, #16\n\t"
  15621. #else
  15622. "lsl r5, r5, #16\n\t"
  15623. #endif
  15624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15625. "adds r4, r4, r5\n\t"
  15626. #else
  15627. "add r4, r4, r5\n\t"
  15628. #endif
  15629. #ifdef WOLFSSL_KEIL
  15630. "adcs r2, r2, r6\n\t"
  15631. #elif defined(__clang__)
  15632. "adcs r2, r6\n\t"
  15633. #else
  15634. "adc r2, r6\n\t"
  15635. #endif
  15636. #ifdef WOLFSSL_KEIL
  15637. "adcs r3, r3, %[r]\n\t"
  15638. #elif defined(__clang__)
  15639. "adcs r3, %[r]\n\t"
  15640. #else
  15641. "adc r3, %[r]\n\t"
  15642. #endif
  15643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15644. "adds r4, r4, r5\n\t"
  15645. #else
  15646. "add r4, r4, r5\n\t"
  15647. #endif
  15648. #ifdef WOLFSSL_KEIL
  15649. "adcs r2, r2, r6\n\t"
  15650. #elif defined(__clang__)
  15651. "adcs r2, r6\n\t"
  15652. #else
  15653. "adc r2, r6\n\t"
  15654. #endif
  15655. #ifdef WOLFSSL_KEIL
  15656. "adcs r3, r3, %[r]\n\t"
  15657. #elif defined(__clang__)
  15658. "adcs r3, %[r]\n\t"
  15659. #else
  15660. "adc r3, %[r]\n\t"
  15661. #endif
  15662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15663. "lsrs r5, %[a], #16\n\t"
  15664. #else
  15665. "lsr r5, %[a], #16\n\t"
  15666. #endif
  15667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15668. "lsrs r6, r7, #16\n\t"
  15669. #else
  15670. "lsr r6, r7, #16\n\t"
  15671. #endif
  15672. #ifdef WOLFSSL_KEIL
  15673. "muls r6, r5, r6\n\t"
  15674. #elif defined(__clang__)
  15675. "muls r6, r5\n\t"
  15676. #else
  15677. "mul r6, r5\n\t"
  15678. #endif
  15679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15680. "adds r2, r2, r6\n\t"
  15681. #else
  15682. "add r2, r2, r6\n\t"
  15683. #endif
  15684. #ifdef WOLFSSL_KEIL
  15685. "adcs r3, r3, %[r]\n\t"
  15686. #elif defined(__clang__)
  15687. "adcs r3, %[r]\n\t"
  15688. #else
  15689. "adc r3, %[r]\n\t"
  15690. #endif
  15691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15692. "adds r2, r2, r6\n\t"
  15693. #else
  15694. "add r2, r2, r6\n\t"
  15695. #endif
  15696. #ifdef WOLFSSL_KEIL
  15697. "adcs r3, r3, %[r]\n\t"
  15698. #elif defined(__clang__)
  15699. "adcs r3, %[r]\n\t"
  15700. #else
  15701. "adc r3, %[r]\n\t"
  15702. #endif
  15703. "uxth r6, r7\n\t"
  15704. #ifdef WOLFSSL_KEIL
  15705. "muls r5, r6, r5\n\t"
  15706. #elif defined(__clang__)
  15707. "muls r5, r6\n\t"
  15708. #else
  15709. "mul r5, r6\n\t"
  15710. #endif
  15711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15712. "lsrs r6, r5, #16\n\t"
  15713. #else
  15714. "lsr r6, r5, #16\n\t"
  15715. #endif
  15716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15717. "lsls r5, r5, #16\n\t"
  15718. #else
  15719. "lsl r5, r5, #16\n\t"
  15720. #endif
  15721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15722. "adds r4, r4, r5\n\t"
  15723. #else
  15724. "add r4, r4, r5\n\t"
  15725. #endif
  15726. #ifdef WOLFSSL_KEIL
  15727. "adcs r2, r2, r6\n\t"
  15728. #elif defined(__clang__)
  15729. "adcs r2, r6\n\t"
  15730. #else
  15731. "adc r2, r6\n\t"
  15732. #endif
  15733. #ifdef WOLFSSL_KEIL
  15734. "adcs r3, r3, %[r]\n\t"
  15735. #elif defined(__clang__)
  15736. "adcs r3, %[r]\n\t"
  15737. #else
  15738. "adc r3, %[r]\n\t"
  15739. #endif
  15740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15741. "adds r4, r4, r5\n\t"
  15742. #else
  15743. "add r4, r4, r5\n\t"
  15744. #endif
  15745. #ifdef WOLFSSL_KEIL
  15746. "adcs r2, r2, r6\n\t"
  15747. #elif defined(__clang__)
  15748. "adcs r2, r6\n\t"
  15749. #else
  15750. "adc r2, r6\n\t"
  15751. #endif
  15752. #ifdef WOLFSSL_KEIL
  15753. "adcs r3, r3, %[r]\n\t"
  15754. #elif defined(__clang__)
  15755. "adcs r3, %[r]\n\t"
  15756. #else
  15757. "adc r3, %[r]\n\t"
  15758. #endif
  15759. "mov %[r], r8\n\t"
  15760. "str r4, [%[r], #44]\n\t"
  15761. "movs %[r], #0\n\t"
  15762. "# A[7] * A[5]\n\t"
  15763. "movs r4, #0\n\t"
  15764. "mov %[a], r9\n\t"
  15765. "mov r7, r11\n\t"
  15766. "mov %[a], lr\n\t"
  15767. "uxth r5, %[a]\n\t"
  15768. "uxth r6, r7\n\t"
  15769. #ifdef WOLFSSL_KEIL
  15770. "muls r6, r5, r6\n\t"
  15771. #elif defined(__clang__)
  15772. "muls r6, r5\n\t"
  15773. #else
  15774. "mul r6, r5\n\t"
  15775. #endif
  15776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15777. "adds r2, r2, r6\n\t"
  15778. #else
  15779. "add r2, r2, r6\n\t"
  15780. #endif
  15781. #ifdef WOLFSSL_KEIL
  15782. "adcs r3, r3, %[r]\n\t"
  15783. #elif defined(__clang__)
  15784. "adcs r3, %[r]\n\t"
  15785. #else
  15786. "adc r3, %[r]\n\t"
  15787. #endif
  15788. #ifdef WOLFSSL_KEIL
  15789. "adcs r4, r4, %[r]\n\t"
  15790. #elif defined(__clang__)
  15791. "adcs r4, %[r]\n\t"
  15792. #else
  15793. "adc r4, %[r]\n\t"
  15794. #endif
  15795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15796. "adds r2, r2, r6\n\t"
  15797. #else
  15798. "add r2, r2, r6\n\t"
  15799. #endif
  15800. #ifdef WOLFSSL_KEIL
  15801. "adcs r3, r3, %[r]\n\t"
  15802. #elif defined(__clang__)
  15803. "adcs r3, %[r]\n\t"
  15804. #else
  15805. "adc r3, %[r]\n\t"
  15806. #endif
  15807. #ifdef WOLFSSL_KEIL
  15808. "adcs r4, r4, %[r]\n\t"
  15809. #elif defined(__clang__)
  15810. "adcs r4, %[r]\n\t"
  15811. #else
  15812. "adc r4, %[r]\n\t"
  15813. #endif
  15814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15815. "lsrs r6, r7, #16\n\t"
  15816. #else
  15817. "lsr r6, r7, #16\n\t"
  15818. #endif
  15819. #ifdef WOLFSSL_KEIL
  15820. "muls r5, r6, r5\n\t"
  15821. #elif defined(__clang__)
  15822. "muls r5, r6\n\t"
  15823. #else
  15824. "mul r5, r6\n\t"
  15825. #endif
  15826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15827. "lsrs r6, r5, #16\n\t"
  15828. #else
  15829. "lsr r6, r5, #16\n\t"
  15830. #endif
  15831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15832. "lsls r5, r5, #16\n\t"
  15833. #else
  15834. "lsl r5, r5, #16\n\t"
  15835. #endif
  15836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15837. "adds r2, r2, r5\n\t"
  15838. #else
  15839. "add r2, r2, r5\n\t"
  15840. #endif
  15841. #ifdef WOLFSSL_KEIL
  15842. "adcs r3, r3, r6\n\t"
  15843. #elif defined(__clang__)
  15844. "adcs r3, r6\n\t"
  15845. #else
  15846. "adc r3, r6\n\t"
  15847. #endif
  15848. #ifdef WOLFSSL_KEIL
  15849. "adcs r4, r4, %[r]\n\t"
  15850. #elif defined(__clang__)
  15851. "adcs r4, %[r]\n\t"
  15852. #else
  15853. "adc r4, %[r]\n\t"
  15854. #endif
  15855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15856. "adds r2, r2, r5\n\t"
  15857. #else
  15858. "add r2, r2, r5\n\t"
  15859. #endif
  15860. #ifdef WOLFSSL_KEIL
  15861. "adcs r3, r3, r6\n\t"
  15862. #elif defined(__clang__)
  15863. "adcs r3, r6\n\t"
  15864. #else
  15865. "adc r3, r6\n\t"
  15866. #endif
  15867. #ifdef WOLFSSL_KEIL
  15868. "adcs r4, r4, %[r]\n\t"
  15869. #elif defined(__clang__)
  15870. "adcs r4, %[r]\n\t"
  15871. #else
  15872. "adc r4, %[r]\n\t"
  15873. #endif
  15874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15875. "lsrs r5, %[a], #16\n\t"
  15876. #else
  15877. "lsr r5, %[a], #16\n\t"
  15878. #endif
  15879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15880. "lsrs r6, r7, #16\n\t"
  15881. #else
  15882. "lsr r6, r7, #16\n\t"
  15883. #endif
  15884. #ifdef WOLFSSL_KEIL
  15885. "muls r6, r5, r6\n\t"
  15886. #elif defined(__clang__)
  15887. "muls r6, r5\n\t"
  15888. #else
  15889. "mul r6, r5\n\t"
  15890. #endif
  15891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15892. "adds r3, r3, r6\n\t"
  15893. #else
  15894. "add r3, r3, r6\n\t"
  15895. #endif
  15896. #ifdef WOLFSSL_KEIL
  15897. "adcs r4, r4, %[r]\n\t"
  15898. #elif defined(__clang__)
  15899. "adcs r4, %[r]\n\t"
  15900. #else
  15901. "adc r4, %[r]\n\t"
  15902. #endif
  15903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15904. "adds r3, r3, r6\n\t"
  15905. #else
  15906. "add r3, r3, r6\n\t"
  15907. #endif
  15908. #ifdef WOLFSSL_KEIL
  15909. "adcs r4, r4, %[r]\n\t"
  15910. #elif defined(__clang__)
  15911. "adcs r4, %[r]\n\t"
  15912. #else
  15913. "adc r4, %[r]\n\t"
  15914. #endif
  15915. "uxth r6, r7\n\t"
  15916. #ifdef WOLFSSL_KEIL
  15917. "muls r5, r6, r5\n\t"
  15918. #elif defined(__clang__)
  15919. "muls r5, r6\n\t"
  15920. #else
  15921. "mul r5, r6\n\t"
  15922. #endif
  15923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15924. "lsrs r6, r5, #16\n\t"
  15925. #else
  15926. "lsr r6, r5, #16\n\t"
  15927. #endif
  15928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15929. "lsls r5, r5, #16\n\t"
  15930. #else
  15931. "lsl r5, r5, #16\n\t"
  15932. #endif
  15933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15934. "adds r2, r2, r5\n\t"
  15935. #else
  15936. "add r2, r2, r5\n\t"
  15937. #endif
  15938. #ifdef WOLFSSL_KEIL
  15939. "adcs r3, r3, r6\n\t"
  15940. #elif defined(__clang__)
  15941. "adcs r3, r6\n\t"
  15942. #else
  15943. "adc r3, r6\n\t"
  15944. #endif
  15945. #ifdef WOLFSSL_KEIL
  15946. "adcs r4, r4, %[r]\n\t"
  15947. #elif defined(__clang__)
  15948. "adcs r4, %[r]\n\t"
  15949. #else
  15950. "adc r4, %[r]\n\t"
  15951. #endif
  15952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15953. "adds r2, r2, r5\n\t"
  15954. #else
  15955. "add r2, r2, r5\n\t"
  15956. #endif
  15957. #ifdef WOLFSSL_KEIL
  15958. "adcs r3, r3, r6\n\t"
  15959. #elif defined(__clang__)
  15960. "adcs r3, r6\n\t"
  15961. #else
  15962. "adc r3, r6\n\t"
  15963. #endif
  15964. #ifdef WOLFSSL_KEIL
  15965. "adcs r4, r4, %[r]\n\t"
  15966. #elif defined(__clang__)
  15967. "adcs r4, %[r]\n\t"
  15968. #else
  15969. "adc r4, %[r]\n\t"
  15970. #endif
  15971. "# A[6] * A[6]\n\t"
  15972. "mov r7, r12\n\t"
  15973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15974. "lsrs r6, r7, #16\n\t"
  15975. #else
  15976. "lsr r6, r7, #16\n\t"
  15977. #endif
  15978. "uxth r5, r7\n\t"
  15979. #ifdef WOLFSSL_KEIL
  15980. "muls r5, r5, r5\n\t"
  15981. #elif defined(__clang__)
  15982. "muls r5, r5\n\t"
  15983. #else
  15984. "mul r5, r5\n\t"
  15985. #endif
  15986. #ifdef WOLFSSL_KEIL
  15987. "muls r6, r6, r6\n\t"
  15988. #elif defined(__clang__)
  15989. "muls r6, r6\n\t"
  15990. #else
  15991. "mul r6, r6\n\t"
  15992. #endif
  15993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15994. "adds r2, r2, r5\n\t"
  15995. #else
  15996. "add r2, r2, r5\n\t"
  15997. #endif
  15998. #ifdef WOLFSSL_KEIL
  15999. "adcs r3, r3, r6\n\t"
  16000. #elif defined(__clang__)
  16001. "adcs r3, r6\n\t"
  16002. #else
  16003. "adc r3, r6\n\t"
  16004. #endif
  16005. #ifdef WOLFSSL_KEIL
  16006. "adcs r4, r4, %[r]\n\t"
  16007. #elif defined(__clang__)
  16008. "adcs r4, %[r]\n\t"
  16009. #else
  16010. "adc r4, %[r]\n\t"
  16011. #endif
  16012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16013. "lsrs r6, r7, #16\n\t"
  16014. #else
  16015. "lsr r6, r7, #16\n\t"
  16016. #endif
  16017. "uxth r5, r7\n\t"
  16018. #ifdef WOLFSSL_KEIL
  16019. "muls r5, r6, r5\n\t"
  16020. #elif defined(__clang__)
  16021. "muls r5, r6\n\t"
  16022. #else
  16023. "mul r5, r6\n\t"
  16024. #endif
  16025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16026. "lsrs r6, r5, #15\n\t"
  16027. #else
  16028. "lsr r6, r5, #15\n\t"
  16029. #endif
  16030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16031. "lsls r5, r5, #17\n\t"
  16032. #else
  16033. "lsl r5, r5, #17\n\t"
  16034. #endif
  16035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16036. "adds r2, r2, r5\n\t"
  16037. #else
  16038. "add r2, r2, r5\n\t"
  16039. #endif
  16040. #ifdef WOLFSSL_KEIL
  16041. "adcs r3, r3, r6\n\t"
  16042. #elif defined(__clang__)
  16043. "adcs r3, r6\n\t"
  16044. #else
  16045. "adc r3, r6\n\t"
  16046. #endif
  16047. #ifdef WOLFSSL_KEIL
  16048. "adcs r4, r4, %[r]\n\t"
  16049. #elif defined(__clang__)
  16050. "adcs r4, %[r]\n\t"
  16051. #else
  16052. "adc r4, %[r]\n\t"
  16053. #endif
  16054. "mov %[r], r8\n\t"
  16055. "str r2, [%[r], #48]\n\t"
  16056. "movs %[r], #0\n\t"
  16057. "# A[7] * A[6]\n\t"
  16058. "movs r2, #0\n\t"
  16059. "mov %[a], r9\n\t"
  16060. "mov %[a], lr\n\t"
  16061. "uxth r5, %[a]\n\t"
  16062. "uxth r6, r7\n\t"
  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 r3, r3, r6\n\t"
  16072. #else
  16073. "add r3, r3, r6\n\t"
  16074. #endif
  16075. #ifdef WOLFSSL_KEIL
  16076. "adcs r4, r4, %[r]\n\t"
  16077. #elif defined(__clang__)
  16078. "adcs r4, %[r]\n\t"
  16079. #else
  16080. "adc r4, %[r]\n\t"
  16081. #endif
  16082. #ifdef WOLFSSL_KEIL
  16083. "adcs r2, r2, %[r]\n\t"
  16084. #elif defined(__clang__)
  16085. "adcs r2, %[r]\n\t"
  16086. #else
  16087. "adc r2, %[r]\n\t"
  16088. #endif
  16089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16090. "adds r3, r3, r6\n\t"
  16091. #else
  16092. "add r3, r3, r6\n\t"
  16093. #endif
  16094. #ifdef WOLFSSL_KEIL
  16095. "adcs r4, r4, %[r]\n\t"
  16096. #elif defined(__clang__)
  16097. "adcs r4, %[r]\n\t"
  16098. #else
  16099. "adc r4, %[r]\n\t"
  16100. #endif
  16101. #ifdef WOLFSSL_KEIL
  16102. "adcs r2, r2, %[r]\n\t"
  16103. #elif defined(__clang__)
  16104. "adcs r2, %[r]\n\t"
  16105. #else
  16106. "adc r2, %[r]\n\t"
  16107. #endif
  16108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16109. "lsrs r6, r7, #16\n\t"
  16110. #else
  16111. "lsr r6, r7, #16\n\t"
  16112. #endif
  16113. #ifdef WOLFSSL_KEIL
  16114. "muls r5, r6, r5\n\t"
  16115. #elif defined(__clang__)
  16116. "muls r5, r6\n\t"
  16117. #else
  16118. "mul r5, r6\n\t"
  16119. #endif
  16120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16121. "lsrs r6, r5, #16\n\t"
  16122. #else
  16123. "lsr r6, r5, #16\n\t"
  16124. #endif
  16125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16126. "lsls r5, r5, #16\n\t"
  16127. #else
  16128. "lsl r5, r5, #16\n\t"
  16129. #endif
  16130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16131. "adds r3, r3, r5\n\t"
  16132. #else
  16133. "add r3, r3, r5\n\t"
  16134. #endif
  16135. #ifdef WOLFSSL_KEIL
  16136. "adcs r4, r4, r6\n\t"
  16137. #elif defined(__clang__)
  16138. "adcs r4, r6\n\t"
  16139. #else
  16140. "adc r4, r6\n\t"
  16141. #endif
  16142. #ifdef WOLFSSL_KEIL
  16143. "adcs r2, r2, %[r]\n\t"
  16144. #elif defined(__clang__)
  16145. "adcs r2, %[r]\n\t"
  16146. #else
  16147. "adc r2, %[r]\n\t"
  16148. #endif
  16149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16150. "adds r3, r3, r5\n\t"
  16151. #else
  16152. "add r3, r3, r5\n\t"
  16153. #endif
  16154. #ifdef WOLFSSL_KEIL
  16155. "adcs r4, r4, r6\n\t"
  16156. #elif defined(__clang__)
  16157. "adcs r4, r6\n\t"
  16158. #else
  16159. "adc r4, r6\n\t"
  16160. #endif
  16161. #ifdef WOLFSSL_KEIL
  16162. "adcs r2, r2, %[r]\n\t"
  16163. #elif defined(__clang__)
  16164. "adcs r2, %[r]\n\t"
  16165. #else
  16166. "adc r2, %[r]\n\t"
  16167. #endif
  16168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16169. "lsrs r5, %[a], #16\n\t"
  16170. #else
  16171. "lsr r5, %[a], #16\n\t"
  16172. #endif
  16173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16174. "lsrs r6, r7, #16\n\t"
  16175. #else
  16176. "lsr r6, r7, #16\n\t"
  16177. #endif
  16178. #ifdef WOLFSSL_KEIL
  16179. "muls r6, r5, r6\n\t"
  16180. #elif defined(__clang__)
  16181. "muls r6, r5\n\t"
  16182. #else
  16183. "mul r6, r5\n\t"
  16184. #endif
  16185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16186. "adds r4, r4, r6\n\t"
  16187. #else
  16188. "add r4, r4, r6\n\t"
  16189. #endif
  16190. #ifdef WOLFSSL_KEIL
  16191. "adcs r2, r2, %[r]\n\t"
  16192. #elif defined(__clang__)
  16193. "adcs r2, %[r]\n\t"
  16194. #else
  16195. "adc r2, %[r]\n\t"
  16196. #endif
  16197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16198. "adds r4, r4, r6\n\t"
  16199. #else
  16200. "add r4, r4, r6\n\t"
  16201. #endif
  16202. #ifdef WOLFSSL_KEIL
  16203. "adcs r2, r2, %[r]\n\t"
  16204. #elif defined(__clang__)
  16205. "adcs r2, %[r]\n\t"
  16206. #else
  16207. "adc r2, %[r]\n\t"
  16208. #endif
  16209. "uxth r6, r7\n\t"
  16210. #ifdef WOLFSSL_KEIL
  16211. "muls r5, r6, r5\n\t"
  16212. #elif defined(__clang__)
  16213. "muls r5, r6\n\t"
  16214. #else
  16215. "mul r5, r6\n\t"
  16216. #endif
  16217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16218. "lsrs r6, r5, #16\n\t"
  16219. #else
  16220. "lsr r6, r5, #16\n\t"
  16221. #endif
  16222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16223. "lsls r5, r5, #16\n\t"
  16224. #else
  16225. "lsl r5, r5, #16\n\t"
  16226. #endif
  16227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16228. "adds r3, r3, r5\n\t"
  16229. #else
  16230. "add r3, r3, r5\n\t"
  16231. #endif
  16232. #ifdef WOLFSSL_KEIL
  16233. "adcs r4, r4, r6\n\t"
  16234. #elif defined(__clang__)
  16235. "adcs r4, r6\n\t"
  16236. #else
  16237. "adc r4, r6\n\t"
  16238. #endif
  16239. #ifdef WOLFSSL_KEIL
  16240. "adcs r2, r2, %[r]\n\t"
  16241. #elif defined(__clang__)
  16242. "adcs r2, %[r]\n\t"
  16243. #else
  16244. "adc r2, %[r]\n\t"
  16245. #endif
  16246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16247. "adds r3, r3, r5\n\t"
  16248. #else
  16249. "add r3, r3, r5\n\t"
  16250. #endif
  16251. #ifdef WOLFSSL_KEIL
  16252. "adcs r4, r4, r6\n\t"
  16253. #elif defined(__clang__)
  16254. "adcs r4, r6\n\t"
  16255. #else
  16256. "adc r4, r6\n\t"
  16257. #endif
  16258. #ifdef WOLFSSL_KEIL
  16259. "adcs r2, r2, %[r]\n\t"
  16260. #elif defined(__clang__)
  16261. "adcs r2, %[r]\n\t"
  16262. #else
  16263. "adc r2, %[r]\n\t"
  16264. #endif
  16265. "mov %[r], r8\n\t"
  16266. "str r3, [%[r], #52]\n\t"
  16267. "movs %[r], #0\n\t"
  16268. "# A[7] * A[7]\n\t"
  16269. "mov %[a], r9\n\t"
  16270. "mov r7, lr\n\t"
  16271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16272. "lsrs r6, r7, #16\n\t"
  16273. #else
  16274. "lsr r6, r7, #16\n\t"
  16275. #endif
  16276. "uxth r5, r7\n\t"
  16277. #ifdef WOLFSSL_KEIL
  16278. "muls r5, r5, r5\n\t"
  16279. #elif defined(__clang__)
  16280. "muls r5, r5\n\t"
  16281. #else
  16282. "mul r5, r5\n\t"
  16283. #endif
  16284. #ifdef WOLFSSL_KEIL
  16285. "muls r6, r6, r6\n\t"
  16286. #elif defined(__clang__)
  16287. "muls r6, r6\n\t"
  16288. #else
  16289. "mul r6, r6\n\t"
  16290. #endif
  16291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16292. "adds r4, r4, r5\n\t"
  16293. #else
  16294. "add r4, r4, r5\n\t"
  16295. #endif
  16296. #ifdef WOLFSSL_KEIL
  16297. "adcs r2, r2, r6\n\t"
  16298. #elif defined(__clang__)
  16299. "adcs r2, r6\n\t"
  16300. #else
  16301. "adc r2, r6\n\t"
  16302. #endif
  16303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16304. "lsrs r6, r7, #16\n\t"
  16305. #else
  16306. "lsr r6, r7, #16\n\t"
  16307. #endif
  16308. "uxth r5, r7\n\t"
  16309. #ifdef WOLFSSL_KEIL
  16310. "muls r5, r6, r5\n\t"
  16311. #elif defined(__clang__)
  16312. "muls r5, r6\n\t"
  16313. #else
  16314. "mul r5, r6\n\t"
  16315. #endif
  16316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16317. "lsrs r6, r5, #15\n\t"
  16318. #else
  16319. "lsr r6, r5, #15\n\t"
  16320. #endif
  16321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16322. "lsls r5, r5, #17\n\t"
  16323. #else
  16324. "lsl r5, r5, #17\n\t"
  16325. #endif
  16326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16327. "adds r4, r4, r5\n\t"
  16328. #else
  16329. "add r4, r4, r5\n\t"
  16330. #endif
  16331. #ifdef WOLFSSL_KEIL
  16332. "adcs r2, r2, r6\n\t"
  16333. #elif defined(__clang__)
  16334. "adcs r2, r6\n\t"
  16335. #else
  16336. "adc r2, r6\n\t"
  16337. #endif
  16338. "mov %[r], r8\n\t"
  16339. "str r4, [%[r], #56]\n\t"
  16340. "str r2, [%[r], #60]\n\t"
  16341. "pop {r2, r3, r4, r5}\n\t"
  16342. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  16343. "pop {r2, r3, r4, r5}\n\t"
  16344. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  16345. : [r] "+r" (r), [a] "+r" (a)
  16346. :
  16347. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  16348. );
  16349. }
  16350. #endif /* !WOLFSSL_SP_LARGE_CODE */
  16351. /* Add b to a into r. (r = a + b)
  16352. *
  16353. * r A single precision integer.
  16354. * a A single precision integer.
  16355. * b A single precision integer.
  16356. */
  16357. SP_NOINLINE static sp_digit sp_2048_add_8(sp_digit* r, const sp_digit* a,
  16358. const sp_digit* b)
  16359. {
  16360. __asm__ __volatile__ (
  16361. "ldm %[b]!, {r5, r6}\n\t"
  16362. "ldm %[a]!, {r3, r4}\n\t"
  16363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16364. "adds r3, r3, r5\n\t"
  16365. #else
  16366. "add r3, r3, r5\n\t"
  16367. #endif
  16368. #ifdef WOLFSSL_KEIL
  16369. "adcs r4, r4, r6\n\t"
  16370. #elif defined(__clang__)
  16371. "adcs r4, r6\n\t"
  16372. #else
  16373. "adc r4, r6\n\t"
  16374. #endif
  16375. "stm %[r]!, {r3, r4}\n\t"
  16376. "ldm %[b]!, {r5, r6}\n\t"
  16377. "ldm %[a]!, {r3, r4}\n\t"
  16378. #ifdef WOLFSSL_KEIL
  16379. "adcs r3, r3, r5\n\t"
  16380. #elif defined(__clang__)
  16381. "adcs r3, r5\n\t"
  16382. #else
  16383. "adc r3, r5\n\t"
  16384. #endif
  16385. #ifdef WOLFSSL_KEIL
  16386. "adcs r4, r4, r6\n\t"
  16387. #elif defined(__clang__)
  16388. "adcs r4, r6\n\t"
  16389. #else
  16390. "adc r4, r6\n\t"
  16391. #endif
  16392. "stm %[r]!, {r3, r4}\n\t"
  16393. "ldm %[b]!, {r5, r6}\n\t"
  16394. "ldm %[a]!, {r3, r4}\n\t"
  16395. #ifdef WOLFSSL_KEIL
  16396. "adcs r3, r3, r5\n\t"
  16397. #elif defined(__clang__)
  16398. "adcs r3, r5\n\t"
  16399. #else
  16400. "adc r3, r5\n\t"
  16401. #endif
  16402. #ifdef WOLFSSL_KEIL
  16403. "adcs r4, r4, r6\n\t"
  16404. #elif defined(__clang__)
  16405. "adcs r4, r6\n\t"
  16406. #else
  16407. "adc r4, r6\n\t"
  16408. #endif
  16409. "stm %[r]!, {r3, r4}\n\t"
  16410. "ldm %[b]!, {r5, r6}\n\t"
  16411. "ldm %[a]!, {r3, r4}\n\t"
  16412. #ifdef WOLFSSL_KEIL
  16413. "adcs r3, r3, r5\n\t"
  16414. #elif defined(__clang__)
  16415. "adcs r3, r5\n\t"
  16416. #else
  16417. "adc r3, r5\n\t"
  16418. #endif
  16419. #ifdef WOLFSSL_KEIL
  16420. "adcs r4, r4, r6\n\t"
  16421. #elif defined(__clang__)
  16422. "adcs r4, r6\n\t"
  16423. #else
  16424. "adc r4, r6\n\t"
  16425. #endif
  16426. "stm %[r]!, {r3, r4}\n\t"
  16427. "movs %[r], #0\n\t"
  16428. #ifdef WOLFSSL_KEIL
  16429. "adcs %[r], %[r], %[r]\n\t"
  16430. #elif defined(__clang__)
  16431. "adcs %[r], %[r]\n\t"
  16432. #else
  16433. "adc %[r], %[r]\n\t"
  16434. #endif
  16435. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  16436. :
  16437. : "memory", "r3", "r4", "r5", "r6"
  16438. );
  16439. return (uint32_t)(size_t)r;
  16440. }
  16441. /* Add b to a into r. (r = a + b)
  16442. *
  16443. * r A single precision integer.
  16444. * a A single precision integer.
  16445. * b A single precision integer.
  16446. */
  16447. SP_NOINLINE static sp_digit sp_2048_add_to_word_8(sp_digit* r, sp_digit a,
  16448. const sp_digit* b)
  16449. {
  16450. __asm__ __volatile__ (
  16451. "movs r5, #0\n\t"
  16452. "ldm %[b]!, {r3, r4}\n\t"
  16453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16454. "adds r3, r3, %[a]\n\t"
  16455. #else
  16456. "add r3, r3, %[a]\n\t"
  16457. #endif
  16458. #ifdef WOLFSSL_KEIL
  16459. "adcs r4, r4, r5\n\t"
  16460. #elif defined(__clang__)
  16461. "adcs r4, r5\n\t"
  16462. #else
  16463. "adc r4, r5\n\t"
  16464. #endif
  16465. "stm %[r]!, {r3, r4}\n\t"
  16466. "ldm %[b]!, {r3, r4}\n\t"
  16467. #ifdef WOLFSSL_KEIL
  16468. "adcs r3, r3, r5\n\t"
  16469. #elif defined(__clang__)
  16470. "adcs r3, r5\n\t"
  16471. #else
  16472. "adc r3, r5\n\t"
  16473. #endif
  16474. #ifdef WOLFSSL_KEIL
  16475. "adcs r4, r4, r5\n\t"
  16476. #elif defined(__clang__)
  16477. "adcs r4, r5\n\t"
  16478. #else
  16479. "adc r4, r5\n\t"
  16480. #endif
  16481. "stm %[r]!, {r3, r4}\n\t"
  16482. "ldm %[b]!, {r3, r4}\n\t"
  16483. #ifdef WOLFSSL_KEIL
  16484. "adcs r3, r3, r5\n\t"
  16485. #elif defined(__clang__)
  16486. "adcs r3, r5\n\t"
  16487. #else
  16488. "adc r3, r5\n\t"
  16489. #endif
  16490. #ifdef WOLFSSL_KEIL
  16491. "adcs r4, r4, r5\n\t"
  16492. #elif defined(__clang__)
  16493. "adcs r4, r5\n\t"
  16494. #else
  16495. "adc r4, r5\n\t"
  16496. #endif
  16497. "stm %[r]!, {r3, r4}\n\t"
  16498. "ldm %[b]!, {r3, r4}\n\t"
  16499. #ifdef WOLFSSL_KEIL
  16500. "adcs r3, r3, r5\n\t"
  16501. #elif defined(__clang__)
  16502. "adcs r3, r5\n\t"
  16503. #else
  16504. "adc r3, r5\n\t"
  16505. #endif
  16506. #ifdef WOLFSSL_KEIL
  16507. "adcs r4, r4, r5\n\t"
  16508. #elif defined(__clang__)
  16509. "adcs r4, r5\n\t"
  16510. #else
  16511. "adc r4, r5\n\t"
  16512. #endif
  16513. "stm %[r]!, {r3, r4}\n\t"
  16514. "movs %[r], #0\n\t"
  16515. #ifdef WOLFSSL_KEIL
  16516. "adcs %[r], %[r], %[r]\n\t"
  16517. #elif defined(__clang__)
  16518. "adcs %[r], %[r]\n\t"
  16519. #else
  16520. "adc %[r], %[r]\n\t"
  16521. #endif
  16522. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  16523. :
  16524. : "memory", "r3", "r4", "r5"
  16525. );
  16526. return (uint32_t)(size_t)r;
  16527. }
  16528. /* Sub b from a into a. (a -= b)
  16529. *
  16530. * a A single precision integer.
  16531. * b A single precision integer.
  16532. */
  16533. SP_NOINLINE static sp_digit sp_2048_sub_in_place_16(sp_digit* a,
  16534. const sp_digit* b)
  16535. {
  16536. __asm__ __volatile__ (
  16537. "ldm %[b]!, {r4, r5}\n\t"
  16538. "ldr r2, [%[a]]\n\t"
  16539. "ldr r3, [%[a], #4]\n\t"
  16540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16541. "subs r2, r2, r4\n\t"
  16542. #else
  16543. "sub r2, r2, r4\n\t"
  16544. #endif
  16545. #ifdef WOLFSSL_KEIL
  16546. "sbcs r3, r3, r5\n\t"
  16547. #elif defined(__clang__)
  16548. "sbcs r3, r5\n\t"
  16549. #else
  16550. "sbc r3, r5\n\t"
  16551. #endif
  16552. "stm %[a]!, {r2, r3}\n\t"
  16553. "ldm %[b]!, {r4, r5}\n\t"
  16554. "ldr r2, [%[a]]\n\t"
  16555. "ldr r3, [%[a], #4]\n\t"
  16556. #ifdef WOLFSSL_KEIL
  16557. "sbcs r2, r2, r4\n\t"
  16558. #elif defined(__clang__)
  16559. "sbcs r2, r4\n\t"
  16560. #else
  16561. "sbc r2, r4\n\t"
  16562. #endif
  16563. #ifdef WOLFSSL_KEIL
  16564. "sbcs r3, r3, r5\n\t"
  16565. #elif defined(__clang__)
  16566. "sbcs r3, r5\n\t"
  16567. #else
  16568. "sbc r3, r5\n\t"
  16569. #endif
  16570. "stm %[a]!, {r2, r3}\n\t"
  16571. "ldm %[b]!, {r4, r5}\n\t"
  16572. "ldr r2, [%[a]]\n\t"
  16573. "ldr r3, [%[a], #4]\n\t"
  16574. #ifdef WOLFSSL_KEIL
  16575. "sbcs r2, r2, r4\n\t"
  16576. #elif defined(__clang__)
  16577. "sbcs r2, r4\n\t"
  16578. #else
  16579. "sbc r2, r4\n\t"
  16580. #endif
  16581. #ifdef WOLFSSL_KEIL
  16582. "sbcs r3, r3, r5\n\t"
  16583. #elif defined(__clang__)
  16584. "sbcs r3, r5\n\t"
  16585. #else
  16586. "sbc r3, r5\n\t"
  16587. #endif
  16588. "stm %[a]!, {r2, r3}\n\t"
  16589. "ldm %[b]!, {r4, r5}\n\t"
  16590. "ldr r2, [%[a]]\n\t"
  16591. "ldr r3, [%[a], #4]\n\t"
  16592. #ifdef WOLFSSL_KEIL
  16593. "sbcs r2, r2, r4\n\t"
  16594. #elif defined(__clang__)
  16595. "sbcs r2, r4\n\t"
  16596. #else
  16597. "sbc r2, r4\n\t"
  16598. #endif
  16599. #ifdef WOLFSSL_KEIL
  16600. "sbcs r3, r3, r5\n\t"
  16601. #elif defined(__clang__)
  16602. "sbcs r3, r5\n\t"
  16603. #else
  16604. "sbc r3, r5\n\t"
  16605. #endif
  16606. "stm %[a]!, {r2, r3}\n\t"
  16607. "ldm %[b]!, {r4, r5}\n\t"
  16608. "ldr r2, [%[a]]\n\t"
  16609. "ldr r3, [%[a], #4]\n\t"
  16610. #ifdef WOLFSSL_KEIL
  16611. "sbcs r2, r2, r4\n\t"
  16612. #elif defined(__clang__)
  16613. "sbcs r2, r4\n\t"
  16614. #else
  16615. "sbc r2, r4\n\t"
  16616. #endif
  16617. #ifdef WOLFSSL_KEIL
  16618. "sbcs r3, r3, r5\n\t"
  16619. #elif defined(__clang__)
  16620. "sbcs r3, r5\n\t"
  16621. #else
  16622. "sbc r3, r5\n\t"
  16623. #endif
  16624. "stm %[a]!, {r2, r3}\n\t"
  16625. "ldm %[b]!, {r4, r5}\n\t"
  16626. "ldr r2, [%[a]]\n\t"
  16627. "ldr r3, [%[a], #4]\n\t"
  16628. #ifdef WOLFSSL_KEIL
  16629. "sbcs r2, r2, r4\n\t"
  16630. #elif defined(__clang__)
  16631. "sbcs r2, r4\n\t"
  16632. #else
  16633. "sbc r2, r4\n\t"
  16634. #endif
  16635. #ifdef WOLFSSL_KEIL
  16636. "sbcs r3, r3, r5\n\t"
  16637. #elif defined(__clang__)
  16638. "sbcs r3, r5\n\t"
  16639. #else
  16640. "sbc r3, r5\n\t"
  16641. #endif
  16642. "stm %[a]!, {r2, r3}\n\t"
  16643. "ldm %[b]!, {r4, r5}\n\t"
  16644. "ldr r2, [%[a]]\n\t"
  16645. "ldr r3, [%[a], #4]\n\t"
  16646. #ifdef WOLFSSL_KEIL
  16647. "sbcs r2, r2, r4\n\t"
  16648. #elif defined(__clang__)
  16649. "sbcs r2, r4\n\t"
  16650. #else
  16651. "sbc r2, r4\n\t"
  16652. #endif
  16653. #ifdef WOLFSSL_KEIL
  16654. "sbcs r3, r3, r5\n\t"
  16655. #elif defined(__clang__)
  16656. "sbcs r3, r5\n\t"
  16657. #else
  16658. "sbc r3, r5\n\t"
  16659. #endif
  16660. "stm %[a]!, {r2, r3}\n\t"
  16661. "ldm %[b]!, {r4, r5}\n\t"
  16662. "ldr r2, [%[a]]\n\t"
  16663. "ldr r3, [%[a], #4]\n\t"
  16664. #ifdef WOLFSSL_KEIL
  16665. "sbcs r2, r2, r4\n\t"
  16666. #elif defined(__clang__)
  16667. "sbcs r2, r4\n\t"
  16668. #else
  16669. "sbc r2, r4\n\t"
  16670. #endif
  16671. #ifdef WOLFSSL_KEIL
  16672. "sbcs r3, r3, r5\n\t"
  16673. #elif defined(__clang__)
  16674. "sbcs r3, r5\n\t"
  16675. #else
  16676. "sbc r3, r5\n\t"
  16677. #endif
  16678. "stm %[a]!, {r2, r3}\n\t"
  16679. #ifdef WOLFSSL_KEIL
  16680. "sbcs %[a], %[a], %[a]\n\t"
  16681. #elif defined(__clang__)
  16682. "sbcs %[a], %[a]\n\t"
  16683. #else
  16684. "sbc %[a], %[a]\n\t"
  16685. #endif
  16686. : [a] "+r" (a), [b] "+r" (b)
  16687. :
  16688. : "memory", "r2", "r3", "r4", "r5"
  16689. );
  16690. return (uint32_t)(size_t)a;
  16691. }
  16692. /* Add b to a into r. (r = a + b)
  16693. *
  16694. * r A single precision integer.
  16695. * a A single precision integer.
  16696. * b A single precision integer.
  16697. */
  16698. SP_NOINLINE static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a,
  16699. const sp_digit* b)
  16700. {
  16701. __asm__ __volatile__ (
  16702. "ldm %[b]!, {r5, r6}\n\t"
  16703. "ldm %[a]!, {r3, r4}\n\t"
  16704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16705. "adds r3, r3, r5\n\t"
  16706. #else
  16707. "add r3, r3, r5\n\t"
  16708. #endif
  16709. #ifdef WOLFSSL_KEIL
  16710. "adcs r4, r4, r6\n\t"
  16711. #elif defined(__clang__)
  16712. "adcs r4, r6\n\t"
  16713. #else
  16714. "adc r4, r6\n\t"
  16715. #endif
  16716. "stm %[r]!, {r3, r4}\n\t"
  16717. "ldm %[b]!, {r5, r6}\n\t"
  16718. "ldm %[a]!, {r3, r4}\n\t"
  16719. #ifdef WOLFSSL_KEIL
  16720. "adcs r3, r3, r5\n\t"
  16721. #elif defined(__clang__)
  16722. "adcs r3, r5\n\t"
  16723. #else
  16724. "adc r3, r5\n\t"
  16725. #endif
  16726. #ifdef WOLFSSL_KEIL
  16727. "adcs r4, r4, r6\n\t"
  16728. #elif defined(__clang__)
  16729. "adcs r4, r6\n\t"
  16730. #else
  16731. "adc r4, r6\n\t"
  16732. #endif
  16733. "stm %[r]!, {r3, r4}\n\t"
  16734. "ldm %[b]!, {r5, r6}\n\t"
  16735. "ldm %[a]!, {r3, r4}\n\t"
  16736. #ifdef WOLFSSL_KEIL
  16737. "adcs r3, r3, r5\n\t"
  16738. #elif defined(__clang__)
  16739. "adcs r3, r5\n\t"
  16740. #else
  16741. "adc r3, r5\n\t"
  16742. #endif
  16743. #ifdef WOLFSSL_KEIL
  16744. "adcs r4, r4, r6\n\t"
  16745. #elif defined(__clang__)
  16746. "adcs r4, r6\n\t"
  16747. #else
  16748. "adc r4, r6\n\t"
  16749. #endif
  16750. "stm %[r]!, {r3, r4}\n\t"
  16751. "ldm %[b]!, {r5, r6}\n\t"
  16752. "ldm %[a]!, {r3, r4}\n\t"
  16753. #ifdef WOLFSSL_KEIL
  16754. "adcs r3, r3, r5\n\t"
  16755. #elif defined(__clang__)
  16756. "adcs r3, r5\n\t"
  16757. #else
  16758. "adc r3, r5\n\t"
  16759. #endif
  16760. #ifdef WOLFSSL_KEIL
  16761. "adcs r4, r4, r6\n\t"
  16762. #elif defined(__clang__)
  16763. "adcs r4, r6\n\t"
  16764. #else
  16765. "adc r4, r6\n\t"
  16766. #endif
  16767. "stm %[r]!, {r3, r4}\n\t"
  16768. "ldm %[b]!, {r5, r6}\n\t"
  16769. "ldm %[a]!, {r3, r4}\n\t"
  16770. #ifdef WOLFSSL_KEIL
  16771. "adcs r3, r3, r5\n\t"
  16772. #elif defined(__clang__)
  16773. "adcs r3, r5\n\t"
  16774. #else
  16775. "adc r3, r5\n\t"
  16776. #endif
  16777. #ifdef WOLFSSL_KEIL
  16778. "adcs r4, r4, r6\n\t"
  16779. #elif defined(__clang__)
  16780. "adcs r4, r6\n\t"
  16781. #else
  16782. "adc r4, r6\n\t"
  16783. #endif
  16784. "stm %[r]!, {r3, r4}\n\t"
  16785. "ldm %[b]!, {r5, r6}\n\t"
  16786. "ldm %[a]!, {r3, r4}\n\t"
  16787. #ifdef WOLFSSL_KEIL
  16788. "adcs r3, r3, r5\n\t"
  16789. #elif defined(__clang__)
  16790. "adcs r3, r5\n\t"
  16791. #else
  16792. "adc r3, r5\n\t"
  16793. #endif
  16794. #ifdef WOLFSSL_KEIL
  16795. "adcs r4, r4, r6\n\t"
  16796. #elif defined(__clang__)
  16797. "adcs r4, r6\n\t"
  16798. #else
  16799. "adc r4, r6\n\t"
  16800. #endif
  16801. "stm %[r]!, {r3, r4}\n\t"
  16802. "ldm %[b]!, {r5, r6}\n\t"
  16803. "ldm %[a]!, {r3, r4}\n\t"
  16804. #ifdef WOLFSSL_KEIL
  16805. "adcs r3, r3, r5\n\t"
  16806. #elif defined(__clang__)
  16807. "adcs r3, r5\n\t"
  16808. #else
  16809. "adc r3, r5\n\t"
  16810. #endif
  16811. #ifdef WOLFSSL_KEIL
  16812. "adcs r4, r4, r6\n\t"
  16813. #elif defined(__clang__)
  16814. "adcs r4, r6\n\t"
  16815. #else
  16816. "adc r4, r6\n\t"
  16817. #endif
  16818. "stm %[r]!, {r3, r4}\n\t"
  16819. "ldm %[b]!, {r5, r6}\n\t"
  16820. "ldm %[a]!, {r3, r4}\n\t"
  16821. #ifdef WOLFSSL_KEIL
  16822. "adcs r3, r3, r5\n\t"
  16823. #elif defined(__clang__)
  16824. "adcs r3, r5\n\t"
  16825. #else
  16826. "adc r3, r5\n\t"
  16827. #endif
  16828. #ifdef WOLFSSL_KEIL
  16829. "adcs r4, r4, r6\n\t"
  16830. #elif defined(__clang__)
  16831. "adcs r4, r6\n\t"
  16832. #else
  16833. "adc r4, r6\n\t"
  16834. #endif
  16835. "stm %[r]!, {r3, r4}\n\t"
  16836. "movs %[r], #0\n\t"
  16837. #ifdef WOLFSSL_KEIL
  16838. "adcs %[r], %[r], %[r]\n\t"
  16839. #elif defined(__clang__)
  16840. "adcs %[r], %[r]\n\t"
  16841. #else
  16842. "adc %[r], %[r]\n\t"
  16843. #endif
  16844. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  16845. :
  16846. : "memory", "r3", "r4", "r5", "r6"
  16847. );
  16848. return (uint32_t)(size_t)r;
  16849. }
  16850. /* AND m into each word of a and store in r.
  16851. *
  16852. * r A single precision integer.
  16853. * a A single precision integer.
  16854. * m Mask to AND against each digit.
  16855. */
  16856. static void sp_2048_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  16857. {
  16858. #ifdef WOLFSSL_SP_SMALL
  16859. int i;
  16860. for (i=0; i<8; i++) {
  16861. r[i] = a[i] & m;
  16862. }
  16863. #else
  16864. r[0] = a[0] & m;
  16865. r[1] = a[1] & m;
  16866. r[2] = a[2] & m;
  16867. r[3] = a[3] & m;
  16868. r[4] = a[4] & m;
  16869. r[5] = a[5] & m;
  16870. r[6] = a[6] & m;
  16871. r[7] = a[7] & m;
  16872. #endif
  16873. }
  16874. /* Multiply a and b into r. (r = a * b)
  16875. *
  16876. * r A single precision integer.
  16877. * a A single precision integer.
  16878. * b A single precision integer.
  16879. */
  16880. SP_NOINLINE static void sp_2048_mul_16(sp_digit* r, const sp_digit* a,
  16881. const sp_digit* b)
  16882. {
  16883. sp_digit* z0 = r;
  16884. sp_digit z1[16];
  16885. sp_digit a1[8];
  16886. sp_digit b1[8];
  16887. sp_digit z2[16];
  16888. sp_digit u;
  16889. sp_digit ca;
  16890. sp_digit cb;
  16891. ca = sp_2048_add_8(a1, a, &a[8]);
  16892. cb = sp_2048_add_8(b1, b, &b[8]);
  16893. u = ca & cb;
  16894. sp_2048_mul_8(z1, a1, b1);
  16895. sp_2048_mul_8(z2, &a[8], &b[8]);
  16896. sp_2048_mul_8(z0, a, b);
  16897. sp_2048_mask_8(r + 16, a1, 0 - cb);
  16898. sp_2048_mask_8(b1, b1, 0 - ca);
  16899. u += sp_2048_add_8(r + 16, r + 16, b1);
  16900. u += sp_2048_sub_in_place_16(z1, z2);
  16901. u += sp_2048_sub_in_place_16(z1, z0);
  16902. u += sp_2048_add_16(r + 8, r + 8, z1);
  16903. u += sp_2048_add_8(r + 16, r + 16, z2);
  16904. (void)sp_2048_add_to_word_8(r + 24, u, z2 + 8);
  16905. }
  16906. /* Double a into r. (r = a + a)
  16907. *
  16908. * r A single precision integer.
  16909. * a A single precision integer.
  16910. */
  16911. SP_NOINLINE static sp_digit sp_2048_dbl_8(sp_digit* r, const sp_digit* a)
  16912. {
  16913. __asm__ __volatile__ (
  16914. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  16915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16916. "adds r2, r2, r2\n\t"
  16917. #else
  16918. "add r2, r2, r2\n\t"
  16919. #endif
  16920. #ifdef WOLFSSL_KEIL
  16921. "adcs r3, r3, r3\n\t"
  16922. #elif defined(__clang__)
  16923. "adcs r3, r3\n\t"
  16924. #else
  16925. "adc r3, r3\n\t"
  16926. #endif
  16927. #ifdef WOLFSSL_KEIL
  16928. "adcs r4, r4, r4\n\t"
  16929. #elif defined(__clang__)
  16930. "adcs r4, r4\n\t"
  16931. #else
  16932. "adc r4, r4\n\t"
  16933. #endif
  16934. #ifdef WOLFSSL_KEIL
  16935. "adcs r5, r5, r5\n\t"
  16936. #elif defined(__clang__)
  16937. "adcs r5, r5\n\t"
  16938. #else
  16939. "adc r5, r5\n\t"
  16940. #endif
  16941. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  16942. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  16943. #ifdef WOLFSSL_KEIL
  16944. "adcs r2, r2, r2\n\t"
  16945. #elif defined(__clang__)
  16946. "adcs r2, r2\n\t"
  16947. #else
  16948. "adc r2, r2\n\t"
  16949. #endif
  16950. #ifdef WOLFSSL_KEIL
  16951. "adcs r3, r3, r3\n\t"
  16952. #elif defined(__clang__)
  16953. "adcs r3, r3\n\t"
  16954. #else
  16955. "adc r3, r3\n\t"
  16956. #endif
  16957. #ifdef WOLFSSL_KEIL
  16958. "adcs r4, r4, r4\n\t"
  16959. #elif defined(__clang__)
  16960. "adcs r4, r4\n\t"
  16961. #else
  16962. "adc r4, r4\n\t"
  16963. #endif
  16964. #ifdef WOLFSSL_KEIL
  16965. "adcs r5, r5, r5\n\t"
  16966. #elif defined(__clang__)
  16967. "adcs r5, r5\n\t"
  16968. #else
  16969. "adc r5, r5\n\t"
  16970. #endif
  16971. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  16972. "movs %[r], #0\n\t"
  16973. #ifdef WOLFSSL_KEIL
  16974. "adcs %[r], %[r], %[r]\n\t"
  16975. #elif defined(__clang__)
  16976. "adcs %[r], %[r]\n\t"
  16977. #else
  16978. "adc %[r], %[r]\n\t"
  16979. #endif
  16980. : [r] "+r" (r), [a] "+r" (a)
  16981. :
  16982. : "memory", "r2", "r3", "r4", "r5"
  16983. );
  16984. return (uint32_t)(size_t)r;
  16985. }
  16986. /* Square a and put result in r. (r = a * a)
  16987. *
  16988. * r A single precision integer.
  16989. * a A single precision integer.
  16990. */
  16991. SP_NOINLINE static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a)
  16992. {
  16993. sp_digit* z0 = r;
  16994. sp_digit z2[16];
  16995. sp_digit z1[16];
  16996. sp_digit a1[8];
  16997. sp_digit u;
  16998. u = sp_2048_add_8(a1, a, &a[8]);
  16999. sp_2048_sqr_8(z1, a1);
  17000. sp_2048_sqr_8(z2, &a[8]);
  17001. sp_2048_sqr_8(z0, a);
  17002. sp_2048_mask_8(r + 16, a1, 0 - u);
  17003. u += sp_2048_dbl_8(r + 16, r + 16);
  17004. u += sp_2048_sub_in_place_16(z1, z2);
  17005. u += sp_2048_sub_in_place_16(z1, z0);
  17006. u += sp_2048_add_16(r + 8, r + 8, z1);
  17007. u += sp_2048_add_8(r + 16, r + 16, z2);
  17008. (void)sp_2048_add_to_word_8(r + 24, u, z2 + 8);
  17009. }
  17010. /* Add b to a into r. (r = a + b)
  17011. *
  17012. * r A single precision integer.
  17013. * a A single precision integer.
  17014. * b A single precision integer.
  17015. */
  17016. SP_NOINLINE static sp_digit sp_2048_add_to_word_16(sp_digit* r, sp_digit a,
  17017. const sp_digit* b)
  17018. {
  17019. __asm__ __volatile__ (
  17020. "movs r5, #0\n\t"
  17021. "ldm %[b]!, {r3, r4}\n\t"
  17022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17023. "adds r3, r3, %[a]\n\t"
  17024. #else
  17025. "add r3, r3, %[a]\n\t"
  17026. #endif
  17027. #ifdef WOLFSSL_KEIL
  17028. "adcs r4, r4, r5\n\t"
  17029. #elif defined(__clang__)
  17030. "adcs r4, r5\n\t"
  17031. #else
  17032. "adc r4, r5\n\t"
  17033. #endif
  17034. "stm %[r]!, {r3, r4}\n\t"
  17035. "ldm %[b]!, {r3, r4}\n\t"
  17036. #ifdef WOLFSSL_KEIL
  17037. "adcs r3, r3, r5\n\t"
  17038. #elif defined(__clang__)
  17039. "adcs r3, r5\n\t"
  17040. #else
  17041. "adc r3, r5\n\t"
  17042. #endif
  17043. #ifdef WOLFSSL_KEIL
  17044. "adcs r4, r4, r5\n\t"
  17045. #elif defined(__clang__)
  17046. "adcs r4, r5\n\t"
  17047. #else
  17048. "adc r4, r5\n\t"
  17049. #endif
  17050. "stm %[r]!, {r3, r4}\n\t"
  17051. "ldm %[b]!, {r3, r4}\n\t"
  17052. #ifdef WOLFSSL_KEIL
  17053. "adcs r3, r3, r5\n\t"
  17054. #elif defined(__clang__)
  17055. "adcs r3, r5\n\t"
  17056. #else
  17057. "adc r3, r5\n\t"
  17058. #endif
  17059. #ifdef WOLFSSL_KEIL
  17060. "adcs r4, r4, r5\n\t"
  17061. #elif defined(__clang__)
  17062. "adcs r4, r5\n\t"
  17063. #else
  17064. "adc r4, r5\n\t"
  17065. #endif
  17066. "stm %[r]!, {r3, r4}\n\t"
  17067. "ldm %[b]!, {r3, r4}\n\t"
  17068. #ifdef WOLFSSL_KEIL
  17069. "adcs r3, r3, r5\n\t"
  17070. #elif defined(__clang__)
  17071. "adcs r3, r5\n\t"
  17072. #else
  17073. "adc r3, r5\n\t"
  17074. #endif
  17075. #ifdef WOLFSSL_KEIL
  17076. "adcs r4, r4, r5\n\t"
  17077. #elif defined(__clang__)
  17078. "adcs r4, r5\n\t"
  17079. #else
  17080. "adc r4, r5\n\t"
  17081. #endif
  17082. "stm %[r]!, {r3, r4}\n\t"
  17083. "ldm %[b]!, {r3, r4}\n\t"
  17084. #ifdef WOLFSSL_KEIL
  17085. "adcs r3, r3, r5\n\t"
  17086. #elif defined(__clang__)
  17087. "adcs r3, r5\n\t"
  17088. #else
  17089. "adc r3, r5\n\t"
  17090. #endif
  17091. #ifdef WOLFSSL_KEIL
  17092. "adcs r4, r4, r5\n\t"
  17093. #elif defined(__clang__)
  17094. "adcs r4, r5\n\t"
  17095. #else
  17096. "adc r4, r5\n\t"
  17097. #endif
  17098. "stm %[r]!, {r3, r4}\n\t"
  17099. "ldm %[b]!, {r3, r4}\n\t"
  17100. #ifdef WOLFSSL_KEIL
  17101. "adcs r3, r3, r5\n\t"
  17102. #elif defined(__clang__)
  17103. "adcs r3, r5\n\t"
  17104. #else
  17105. "adc r3, r5\n\t"
  17106. #endif
  17107. #ifdef WOLFSSL_KEIL
  17108. "adcs r4, r4, r5\n\t"
  17109. #elif defined(__clang__)
  17110. "adcs r4, r5\n\t"
  17111. #else
  17112. "adc r4, r5\n\t"
  17113. #endif
  17114. "stm %[r]!, {r3, r4}\n\t"
  17115. "ldm %[b]!, {r3, r4}\n\t"
  17116. #ifdef WOLFSSL_KEIL
  17117. "adcs r3, r3, r5\n\t"
  17118. #elif defined(__clang__)
  17119. "adcs r3, r5\n\t"
  17120. #else
  17121. "adc r3, r5\n\t"
  17122. #endif
  17123. #ifdef WOLFSSL_KEIL
  17124. "adcs r4, r4, r5\n\t"
  17125. #elif defined(__clang__)
  17126. "adcs r4, r5\n\t"
  17127. #else
  17128. "adc r4, r5\n\t"
  17129. #endif
  17130. "stm %[r]!, {r3, r4}\n\t"
  17131. "ldm %[b]!, {r3, r4}\n\t"
  17132. #ifdef WOLFSSL_KEIL
  17133. "adcs r3, r3, r5\n\t"
  17134. #elif defined(__clang__)
  17135. "adcs r3, r5\n\t"
  17136. #else
  17137. "adc r3, r5\n\t"
  17138. #endif
  17139. #ifdef WOLFSSL_KEIL
  17140. "adcs r4, r4, r5\n\t"
  17141. #elif defined(__clang__)
  17142. "adcs r4, r5\n\t"
  17143. #else
  17144. "adc r4, r5\n\t"
  17145. #endif
  17146. "stm %[r]!, {r3, r4}\n\t"
  17147. "movs %[r], #0\n\t"
  17148. #ifdef WOLFSSL_KEIL
  17149. "adcs %[r], %[r], %[r]\n\t"
  17150. #elif defined(__clang__)
  17151. "adcs %[r], %[r]\n\t"
  17152. #else
  17153. "adc %[r], %[r]\n\t"
  17154. #endif
  17155. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  17156. :
  17157. : "memory", "r3", "r4", "r5"
  17158. );
  17159. return (uint32_t)(size_t)r;
  17160. }
  17161. /* Sub b from a into a. (a -= b)
  17162. *
  17163. * a A single precision integer.
  17164. * b A single precision integer.
  17165. */
  17166. SP_NOINLINE static sp_digit sp_2048_sub_in_place_32(sp_digit* a,
  17167. const sp_digit* b)
  17168. {
  17169. __asm__ __volatile__ (
  17170. "ldm %[b]!, {r4, r5}\n\t"
  17171. "ldr r2, [%[a]]\n\t"
  17172. "ldr r3, [%[a], #4]\n\t"
  17173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17174. "subs r2, r2, r4\n\t"
  17175. #else
  17176. "sub r2, r2, r4\n\t"
  17177. #endif
  17178. #ifdef WOLFSSL_KEIL
  17179. "sbcs r3, r3, r5\n\t"
  17180. #elif defined(__clang__)
  17181. "sbcs r3, r5\n\t"
  17182. #else
  17183. "sbc r3, r5\n\t"
  17184. #endif
  17185. "stm %[a]!, {r2, r3}\n\t"
  17186. "ldm %[b]!, {r4, r5}\n\t"
  17187. "ldr r2, [%[a]]\n\t"
  17188. "ldr r3, [%[a], #4]\n\t"
  17189. #ifdef WOLFSSL_KEIL
  17190. "sbcs r2, r2, r4\n\t"
  17191. #elif defined(__clang__)
  17192. "sbcs r2, r4\n\t"
  17193. #else
  17194. "sbc r2, r4\n\t"
  17195. #endif
  17196. #ifdef WOLFSSL_KEIL
  17197. "sbcs r3, r3, r5\n\t"
  17198. #elif defined(__clang__)
  17199. "sbcs r3, r5\n\t"
  17200. #else
  17201. "sbc r3, r5\n\t"
  17202. #endif
  17203. "stm %[a]!, {r2, r3}\n\t"
  17204. "ldm %[b]!, {r4, r5}\n\t"
  17205. "ldr r2, [%[a]]\n\t"
  17206. "ldr r3, [%[a], #4]\n\t"
  17207. #ifdef WOLFSSL_KEIL
  17208. "sbcs r2, r2, r4\n\t"
  17209. #elif defined(__clang__)
  17210. "sbcs r2, r4\n\t"
  17211. #else
  17212. "sbc r2, r4\n\t"
  17213. #endif
  17214. #ifdef WOLFSSL_KEIL
  17215. "sbcs r3, r3, r5\n\t"
  17216. #elif defined(__clang__)
  17217. "sbcs r3, r5\n\t"
  17218. #else
  17219. "sbc r3, r5\n\t"
  17220. #endif
  17221. "stm %[a]!, {r2, r3}\n\t"
  17222. "ldm %[b]!, {r4, r5}\n\t"
  17223. "ldr r2, [%[a]]\n\t"
  17224. "ldr r3, [%[a], #4]\n\t"
  17225. #ifdef WOLFSSL_KEIL
  17226. "sbcs r2, r2, r4\n\t"
  17227. #elif defined(__clang__)
  17228. "sbcs r2, r4\n\t"
  17229. #else
  17230. "sbc r2, r4\n\t"
  17231. #endif
  17232. #ifdef WOLFSSL_KEIL
  17233. "sbcs r3, r3, r5\n\t"
  17234. #elif defined(__clang__)
  17235. "sbcs r3, r5\n\t"
  17236. #else
  17237. "sbc r3, r5\n\t"
  17238. #endif
  17239. "stm %[a]!, {r2, r3}\n\t"
  17240. "ldm %[b]!, {r4, r5}\n\t"
  17241. "ldr r2, [%[a]]\n\t"
  17242. "ldr r3, [%[a], #4]\n\t"
  17243. #ifdef WOLFSSL_KEIL
  17244. "sbcs r2, r2, r4\n\t"
  17245. #elif defined(__clang__)
  17246. "sbcs r2, r4\n\t"
  17247. #else
  17248. "sbc r2, r4\n\t"
  17249. #endif
  17250. #ifdef WOLFSSL_KEIL
  17251. "sbcs r3, r3, r5\n\t"
  17252. #elif defined(__clang__)
  17253. "sbcs r3, r5\n\t"
  17254. #else
  17255. "sbc r3, r5\n\t"
  17256. #endif
  17257. "stm %[a]!, {r2, r3}\n\t"
  17258. "ldm %[b]!, {r4, r5}\n\t"
  17259. "ldr r2, [%[a]]\n\t"
  17260. "ldr r3, [%[a], #4]\n\t"
  17261. #ifdef WOLFSSL_KEIL
  17262. "sbcs r2, r2, r4\n\t"
  17263. #elif defined(__clang__)
  17264. "sbcs r2, r4\n\t"
  17265. #else
  17266. "sbc r2, r4\n\t"
  17267. #endif
  17268. #ifdef WOLFSSL_KEIL
  17269. "sbcs r3, r3, r5\n\t"
  17270. #elif defined(__clang__)
  17271. "sbcs r3, r5\n\t"
  17272. #else
  17273. "sbc r3, r5\n\t"
  17274. #endif
  17275. "stm %[a]!, {r2, r3}\n\t"
  17276. "ldm %[b]!, {r4, r5}\n\t"
  17277. "ldr r2, [%[a]]\n\t"
  17278. "ldr r3, [%[a], #4]\n\t"
  17279. #ifdef WOLFSSL_KEIL
  17280. "sbcs r2, r2, r4\n\t"
  17281. #elif defined(__clang__)
  17282. "sbcs r2, r4\n\t"
  17283. #else
  17284. "sbc r2, r4\n\t"
  17285. #endif
  17286. #ifdef WOLFSSL_KEIL
  17287. "sbcs r3, r3, r5\n\t"
  17288. #elif defined(__clang__)
  17289. "sbcs r3, r5\n\t"
  17290. #else
  17291. "sbc r3, r5\n\t"
  17292. #endif
  17293. "stm %[a]!, {r2, r3}\n\t"
  17294. "ldm %[b]!, {r4, r5}\n\t"
  17295. "ldr r2, [%[a]]\n\t"
  17296. "ldr r3, [%[a], #4]\n\t"
  17297. #ifdef WOLFSSL_KEIL
  17298. "sbcs r2, r2, r4\n\t"
  17299. #elif defined(__clang__)
  17300. "sbcs r2, r4\n\t"
  17301. #else
  17302. "sbc r2, r4\n\t"
  17303. #endif
  17304. #ifdef WOLFSSL_KEIL
  17305. "sbcs r3, r3, r5\n\t"
  17306. #elif defined(__clang__)
  17307. "sbcs r3, r5\n\t"
  17308. #else
  17309. "sbc r3, r5\n\t"
  17310. #endif
  17311. "stm %[a]!, {r2, r3}\n\t"
  17312. "ldm %[b]!, {r4, r5}\n\t"
  17313. "ldr r2, [%[a]]\n\t"
  17314. "ldr r3, [%[a], #4]\n\t"
  17315. #ifdef WOLFSSL_KEIL
  17316. "sbcs r2, r2, r4\n\t"
  17317. #elif defined(__clang__)
  17318. "sbcs r2, r4\n\t"
  17319. #else
  17320. "sbc r2, r4\n\t"
  17321. #endif
  17322. #ifdef WOLFSSL_KEIL
  17323. "sbcs r3, r3, r5\n\t"
  17324. #elif defined(__clang__)
  17325. "sbcs r3, r5\n\t"
  17326. #else
  17327. "sbc r3, r5\n\t"
  17328. #endif
  17329. "stm %[a]!, {r2, r3}\n\t"
  17330. "ldm %[b]!, {r4, r5}\n\t"
  17331. "ldr r2, [%[a]]\n\t"
  17332. "ldr r3, [%[a], #4]\n\t"
  17333. #ifdef WOLFSSL_KEIL
  17334. "sbcs r2, r2, r4\n\t"
  17335. #elif defined(__clang__)
  17336. "sbcs r2, r4\n\t"
  17337. #else
  17338. "sbc r2, r4\n\t"
  17339. #endif
  17340. #ifdef WOLFSSL_KEIL
  17341. "sbcs r3, r3, r5\n\t"
  17342. #elif defined(__clang__)
  17343. "sbcs r3, r5\n\t"
  17344. #else
  17345. "sbc r3, r5\n\t"
  17346. #endif
  17347. "stm %[a]!, {r2, r3}\n\t"
  17348. "ldm %[b]!, {r4, r5}\n\t"
  17349. "ldr r2, [%[a]]\n\t"
  17350. "ldr r3, [%[a], #4]\n\t"
  17351. #ifdef WOLFSSL_KEIL
  17352. "sbcs r2, r2, r4\n\t"
  17353. #elif defined(__clang__)
  17354. "sbcs r2, r4\n\t"
  17355. #else
  17356. "sbc r2, r4\n\t"
  17357. #endif
  17358. #ifdef WOLFSSL_KEIL
  17359. "sbcs r3, r3, r5\n\t"
  17360. #elif defined(__clang__)
  17361. "sbcs r3, r5\n\t"
  17362. #else
  17363. "sbc r3, r5\n\t"
  17364. #endif
  17365. "stm %[a]!, {r2, r3}\n\t"
  17366. "ldm %[b]!, {r4, r5}\n\t"
  17367. "ldr r2, [%[a]]\n\t"
  17368. "ldr r3, [%[a], #4]\n\t"
  17369. #ifdef WOLFSSL_KEIL
  17370. "sbcs r2, r2, r4\n\t"
  17371. #elif defined(__clang__)
  17372. "sbcs r2, r4\n\t"
  17373. #else
  17374. "sbc r2, r4\n\t"
  17375. #endif
  17376. #ifdef WOLFSSL_KEIL
  17377. "sbcs r3, r3, r5\n\t"
  17378. #elif defined(__clang__)
  17379. "sbcs r3, r5\n\t"
  17380. #else
  17381. "sbc r3, r5\n\t"
  17382. #endif
  17383. "stm %[a]!, {r2, r3}\n\t"
  17384. "ldm %[b]!, {r4, r5}\n\t"
  17385. "ldr r2, [%[a]]\n\t"
  17386. "ldr r3, [%[a], #4]\n\t"
  17387. #ifdef WOLFSSL_KEIL
  17388. "sbcs r2, r2, r4\n\t"
  17389. #elif defined(__clang__)
  17390. "sbcs r2, r4\n\t"
  17391. #else
  17392. "sbc r2, r4\n\t"
  17393. #endif
  17394. #ifdef WOLFSSL_KEIL
  17395. "sbcs r3, r3, r5\n\t"
  17396. #elif defined(__clang__)
  17397. "sbcs r3, r5\n\t"
  17398. #else
  17399. "sbc r3, r5\n\t"
  17400. #endif
  17401. "stm %[a]!, {r2, r3}\n\t"
  17402. "ldm %[b]!, {r4, r5}\n\t"
  17403. "ldr r2, [%[a]]\n\t"
  17404. "ldr r3, [%[a], #4]\n\t"
  17405. #ifdef WOLFSSL_KEIL
  17406. "sbcs r2, r2, r4\n\t"
  17407. #elif defined(__clang__)
  17408. "sbcs r2, r4\n\t"
  17409. #else
  17410. "sbc r2, r4\n\t"
  17411. #endif
  17412. #ifdef WOLFSSL_KEIL
  17413. "sbcs r3, r3, r5\n\t"
  17414. #elif defined(__clang__)
  17415. "sbcs r3, r5\n\t"
  17416. #else
  17417. "sbc r3, r5\n\t"
  17418. #endif
  17419. "stm %[a]!, {r2, r3}\n\t"
  17420. "ldm %[b]!, {r4, r5}\n\t"
  17421. "ldr r2, [%[a]]\n\t"
  17422. "ldr r3, [%[a], #4]\n\t"
  17423. #ifdef WOLFSSL_KEIL
  17424. "sbcs r2, r2, r4\n\t"
  17425. #elif defined(__clang__)
  17426. "sbcs r2, r4\n\t"
  17427. #else
  17428. "sbc r2, r4\n\t"
  17429. #endif
  17430. #ifdef WOLFSSL_KEIL
  17431. "sbcs r3, r3, r5\n\t"
  17432. #elif defined(__clang__)
  17433. "sbcs r3, r5\n\t"
  17434. #else
  17435. "sbc r3, r5\n\t"
  17436. #endif
  17437. "stm %[a]!, {r2, r3}\n\t"
  17438. "ldm %[b]!, {r4, r5}\n\t"
  17439. "ldr r2, [%[a]]\n\t"
  17440. "ldr r3, [%[a], #4]\n\t"
  17441. #ifdef WOLFSSL_KEIL
  17442. "sbcs r2, r2, r4\n\t"
  17443. #elif defined(__clang__)
  17444. "sbcs r2, r4\n\t"
  17445. #else
  17446. "sbc r2, r4\n\t"
  17447. #endif
  17448. #ifdef WOLFSSL_KEIL
  17449. "sbcs r3, r3, r5\n\t"
  17450. #elif defined(__clang__)
  17451. "sbcs r3, r5\n\t"
  17452. #else
  17453. "sbc r3, r5\n\t"
  17454. #endif
  17455. "stm %[a]!, {r2, r3}\n\t"
  17456. #ifdef WOLFSSL_KEIL
  17457. "sbcs %[a], %[a], %[a]\n\t"
  17458. #elif defined(__clang__)
  17459. "sbcs %[a], %[a]\n\t"
  17460. #else
  17461. "sbc %[a], %[a]\n\t"
  17462. #endif
  17463. : [a] "+r" (a), [b] "+r" (b)
  17464. :
  17465. : "memory", "r2", "r3", "r4", "r5"
  17466. );
  17467. return (uint32_t)(size_t)a;
  17468. }
  17469. /* Add b to a into r. (r = a + b)
  17470. *
  17471. * r A single precision integer.
  17472. * a A single precision integer.
  17473. * b A single precision integer.
  17474. */
  17475. SP_NOINLINE static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
  17476. const sp_digit* b)
  17477. {
  17478. __asm__ __volatile__ (
  17479. "ldm %[b]!, {r5, r6}\n\t"
  17480. "ldm %[a]!, {r3, r4}\n\t"
  17481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17482. "adds r3, r3, r5\n\t"
  17483. #else
  17484. "add r3, r3, r5\n\t"
  17485. #endif
  17486. #ifdef WOLFSSL_KEIL
  17487. "adcs r4, r4, r6\n\t"
  17488. #elif defined(__clang__)
  17489. "adcs r4, r6\n\t"
  17490. #else
  17491. "adc r4, r6\n\t"
  17492. #endif
  17493. "stm %[r]!, {r3, r4}\n\t"
  17494. "ldm %[b]!, {r5, r6}\n\t"
  17495. "ldm %[a]!, {r3, r4}\n\t"
  17496. #ifdef WOLFSSL_KEIL
  17497. "adcs r3, r3, r5\n\t"
  17498. #elif defined(__clang__)
  17499. "adcs r3, r5\n\t"
  17500. #else
  17501. "adc r3, r5\n\t"
  17502. #endif
  17503. #ifdef WOLFSSL_KEIL
  17504. "adcs r4, r4, r6\n\t"
  17505. #elif defined(__clang__)
  17506. "adcs r4, r6\n\t"
  17507. #else
  17508. "adc r4, r6\n\t"
  17509. #endif
  17510. "stm %[r]!, {r3, r4}\n\t"
  17511. "ldm %[b]!, {r5, r6}\n\t"
  17512. "ldm %[a]!, {r3, r4}\n\t"
  17513. #ifdef WOLFSSL_KEIL
  17514. "adcs r3, r3, r5\n\t"
  17515. #elif defined(__clang__)
  17516. "adcs r3, r5\n\t"
  17517. #else
  17518. "adc r3, r5\n\t"
  17519. #endif
  17520. #ifdef WOLFSSL_KEIL
  17521. "adcs r4, r4, r6\n\t"
  17522. #elif defined(__clang__)
  17523. "adcs r4, r6\n\t"
  17524. #else
  17525. "adc r4, r6\n\t"
  17526. #endif
  17527. "stm %[r]!, {r3, r4}\n\t"
  17528. "ldm %[b]!, {r5, r6}\n\t"
  17529. "ldm %[a]!, {r3, r4}\n\t"
  17530. #ifdef WOLFSSL_KEIL
  17531. "adcs r3, r3, r5\n\t"
  17532. #elif defined(__clang__)
  17533. "adcs r3, r5\n\t"
  17534. #else
  17535. "adc r3, r5\n\t"
  17536. #endif
  17537. #ifdef WOLFSSL_KEIL
  17538. "adcs r4, r4, r6\n\t"
  17539. #elif defined(__clang__)
  17540. "adcs r4, r6\n\t"
  17541. #else
  17542. "adc r4, r6\n\t"
  17543. #endif
  17544. "stm %[r]!, {r3, r4}\n\t"
  17545. "ldm %[b]!, {r5, r6}\n\t"
  17546. "ldm %[a]!, {r3, r4}\n\t"
  17547. #ifdef WOLFSSL_KEIL
  17548. "adcs r3, r3, r5\n\t"
  17549. #elif defined(__clang__)
  17550. "adcs r3, r5\n\t"
  17551. #else
  17552. "adc r3, r5\n\t"
  17553. #endif
  17554. #ifdef WOLFSSL_KEIL
  17555. "adcs r4, r4, r6\n\t"
  17556. #elif defined(__clang__)
  17557. "adcs r4, r6\n\t"
  17558. #else
  17559. "adc r4, r6\n\t"
  17560. #endif
  17561. "stm %[r]!, {r3, r4}\n\t"
  17562. "ldm %[b]!, {r5, r6}\n\t"
  17563. "ldm %[a]!, {r3, r4}\n\t"
  17564. #ifdef WOLFSSL_KEIL
  17565. "adcs r3, r3, r5\n\t"
  17566. #elif defined(__clang__)
  17567. "adcs r3, r5\n\t"
  17568. #else
  17569. "adc r3, r5\n\t"
  17570. #endif
  17571. #ifdef WOLFSSL_KEIL
  17572. "adcs r4, r4, r6\n\t"
  17573. #elif defined(__clang__)
  17574. "adcs r4, r6\n\t"
  17575. #else
  17576. "adc r4, r6\n\t"
  17577. #endif
  17578. "stm %[r]!, {r3, r4}\n\t"
  17579. "ldm %[b]!, {r5, r6}\n\t"
  17580. "ldm %[a]!, {r3, r4}\n\t"
  17581. #ifdef WOLFSSL_KEIL
  17582. "adcs r3, r3, r5\n\t"
  17583. #elif defined(__clang__)
  17584. "adcs r3, r5\n\t"
  17585. #else
  17586. "adc r3, r5\n\t"
  17587. #endif
  17588. #ifdef WOLFSSL_KEIL
  17589. "adcs r4, r4, r6\n\t"
  17590. #elif defined(__clang__)
  17591. "adcs r4, r6\n\t"
  17592. #else
  17593. "adc r4, r6\n\t"
  17594. #endif
  17595. "stm %[r]!, {r3, r4}\n\t"
  17596. "ldm %[b]!, {r5, r6}\n\t"
  17597. "ldm %[a]!, {r3, r4}\n\t"
  17598. #ifdef WOLFSSL_KEIL
  17599. "adcs r3, r3, r5\n\t"
  17600. #elif defined(__clang__)
  17601. "adcs r3, r5\n\t"
  17602. #else
  17603. "adc r3, r5\n\t"
  17604. #endif
  17605. #ifdef WOLFSSL_KEIL
  17606. "adcs r4, r4, r6\n\t"
  17607. #elif defined(__clang__)
  17608. "adcs r4, r6\n\t"
  17609. #else
  17610. "adc r4, r6\n\t"
  17611. #endif
  17612. "stm %[r]!, {r3, r4}\n\t"
  17613. "ldm %[b]!, {r5, r6}\n\t"
  17614. "ldm %[a]!, {r3, r4}\n\t"
  17615. #ifdef WOLFSSL_KEIL
  17616. "adcs r3, r3, r5\n\t"
  17617. #elif defined(__clang__)
  17618. "adcs r3, r5\n\t"
  17619. #else
  17620. "adc r3, r5\n\t"
  17621. #endif
  17622. #ifdef WOLFSSL_KEIL
  17623. "adcs r4, r4, r6\n\t"
  17624. #elif defined(__clang__)
  17625. "adcs r4, r6\n\t"
  17626. #else
  17627. "adc r4, r6\n\t"
  17628. #endif
  17629. "stm %[r]!, {r3, r4}\n\t"
  17630. "ldm %[b]!, {r5, r6}\n\t"
  17631. "ldm %[a]!, {r3, r4}\n\t"
  17632. #ifdef WOLFSSL_KEIL
  17633. "adcs r3, r3, r5\n\t"
  17634. #elif defined(__clang__)
  17635. "adcs r3, r5\n\t"
  17636. #else
  17637. "adc r3, r5\n\t"
  17638. #endif
  17639. #ifdef WOLFSSL_KEIL
  17640. "adcs r4, r4, r6\n\t"
  17641. #elif defined(__clang__)
  17642. "adcs r4, r6\n\t"
  17643. #else
  17644. "adc r4, r6\n\t"
  17645. #endif
  17646. "stm %[r]!, {r3, r4}\n\t"
  17647. "ldm %[b]!, {r5, r6}\n\t"
  17648. "ldm %[a]!, {r3, r4}\n\t"
  17649. #ifdef WOLFSSL_KEIL
  17650. "adcs r3, r3, r5\n\t"
  17651. #elif defined(__clang__)
  17652. "adcs r3, r5\n\t"
  17653. #else
  17654. "adc r3, r5\n\t"
  17655. #endif
  17656. #ifdef WOLFSSL_KEIL
  17657. "adcs r4, r4, r6\n\t"
  17658. #elif defined(__clang__)
  17659. "adcs r4, r6\n\t"
  17660. #else
  17661. "adc r4, r6\n\t"
  17662. #endif
  17663. "stm %[r]!, {r3, r4}\n\t"
  17664. "ldm %[b]!, {r5, r6}\n\t"
  17665. "ldm %[a]!, {r3, r4}\n\t"
  17666. #ifdef WOLFSSL_KEIL
  17667. "adcs r3, r3, r5\n\t"
  17668. #elif defined(__clang__)
  17669. "adcs r3, r5\n\t"
  17670. #else
  17671. "adc r3, r5\n\t"
  17672. #endif
  17673. #ifdef WOLFSSL_KEIL
  17674. "adcs r4, r4, r6\n\t"
  17675. #elif defined(__clang__)
  17676. "adcs r4, r6\n\t"
  17677. #else
  17678. "adc r4, r6\n\t"
  17679. #endif
  17680. "stm %[r]!, {r3, r4}\n\t"
  17681. "ldm %[b]!, {r5, r6}\n\t"
  17682. "ldm %[a]!, {r3, r4}\n\t"
  17683. #ifdef WOLFSSL_KEIL
  17684. "adcs r3, r3, r5\n\t"
  17685. #elif defined(__clang__)
  17686. "adcs r3, r5\n\t"
  17687. #else
  17688. "adc r3, r5\n\t"
  17689. #endif
  17690. #ifdef WOLFSSL_KEIL
  17691. "adcs r4, r4, r6\n\t"
  17692. #elif defined(__clang__)
  17693. "adcs r4, r6\n\t"
  17694. #else
  17695. "adc r4, r6\n\t"
  17696. #endif
  17697. "stm %[r]!, {r3, r4}\n\t"
  17698. "ldm %[b]!, {r5, r6}\n\t"
  17699. "ldm %[a]!, {r3, r4}\n\t"
  17700. #ifdef WOLFSSL_KEIL
  17701. "adcs r3, r3, r5\n\t"
  17702. #elif defined(__clang__)
  17703. "adcs r3, r5\n\t"
  17704. #else
  17705. "adc r3, r5\n\t"
  17706. #endif
  17707. #ifdef WOLFSSL_KEIL
  17708. "adcs r4, r4, r6\n\t"
  17709. #elif defined(__clang__)
  17710. "adcs r4, r6\n\t"
  17711. #else
  17712. "adc r4, r6\n\t"
  17713. #endif
  17714. "stm %[r]!, {r3, r4}\n\t"
  17715. "ldm %[b]!, {r5, r6}\n\t"
  17716. "ldm %[a]!, {r3, r4}\n\t"
  17717. #ifdef WOLFSSL_KEIL
  17718. "adcs r3, r3, r5\n\t"
  17719. #elif defined(__clang__)
  17720. "adcs r3, r5\n\t"
  17721. #else
  17722. "adc r3, r5\n\t"
  17723. #endif
  17724. #ifdef WOLFSSL_KEIL
  17725. "adcs r4, r4, r6\n\t"
  17726. #elif defined(__clang__)
  17727. "adcs r4, r6\n\t"
  17728. #else
  17729. "adc r4, r6\n\t"
  17730. #endif
  17731. "stm %[r]!, {r3, r4}\n\t"
  17732. "ldm %[b]!, {r5, r6}\n\t"
  17733. "ldm %[a]!, {r3, r4}\n\t"
  17734. #ifdef WOLFSSL_KEIL
  17735. "adcs r3, r3, r5\n\t"
  17736. #elif defined(__clang__)
  17737. "adcs r3, r5\n\t"
  17738. #else
  17739. "adc r3, r5\n\t"
  17740. #endif
  17741. #ifdef WOLFSSL_KEIL
  17742. "adcs r4, r4, r6\n\t"
  17743. #elif defined(__clang__)
  17744. "adcs r4, r6\n\t"
  17745. #else
  17746. "adc r4, r6\n\t"
  17747. #endif
  17748. "stm %[r]!, {r3, r4}\n\t"
  17749. "movs %[r], #0\n\t"
  17750. #ifdef WOLFSSL_KEIL
  17751. "adcs %[r], %[r], %[r]\n\t"
  17752. #elif defined(__clang__)
  17753. "adcs %[r], %[r]\n\t"
  17754. #else
  17755. "adc %[r], %[r]\n\t"
  17756. #endif
  17757. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  17758. :
  17759. : "memory", "r3", "r4", "r5", "r6"
  17760. );
  17761. return (uint32_t)(size_t)r;
  17762. }
  17763. /* AND m into each word of a and store in r.
  17764. *
  17765. * r A single precision integer.
  17766. * a A single precision integer.
  17767. * m Mask to AND against each digit.
  17768. */
  17769. static void sp_2048_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  17770. {
  17771. #ifdef WOLFSSL_SP_SMALL
  17772. int i;
  17773. for (i=0; i<16; i++) {
  17774. r[i] = a[i] & m;
  17775. }
  17776. #else
  17777. int i;
  17778. for (i = 0; i < 16; i += 8) {
  17779. r[i+0] = a[i+0] & m;
  17780. r[i+1] = a[i+1] & m;
  17781. r[i+2] = a[i+2] & m;
  17782. r[i+3] = a[i+3] & m;
  17783. r[i+4] = a[i+4] & m;
  17784. r[i+5] = a[i+5] & m;
  17785. r[i+6] = a[i+6] & m;
  17786. r[i+7] = a[i+7] & m;
  17787. }
  17788. #endif
  17789. }
  17790. /* Multiply a and b into r. (r = a * b)
  17791. *
  17792. * r A single precision integer.
  17793. * a A single precision integer.
  17794. * b A single precision integer.
  17795. */
  17796. SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
  17797. const sp_digit* b)
  17798. {
  17799. sp_digit* z0 = r;
  17800. sp_digit z1[32];
  17801. sp_digit a1[16];
  17802. sp_digit b1[16];
  17803. sp_digit z2[32];
  17804. sp_digit u;
  17805. sp_digit ca;
  17806. sp_digit cb;
  17807. ca = sp_2048_add_16(a1, a, &a[16]);
  17808. cb = sp_2048_add_16(b1, b, &b[16]);
  17809. u = ca & cb;
  17810. sp_2048_mul_16(z1, a1, b1);
  17811. sp_2048_mul_16(z2, &a[16], &b[16]);
  17812. sp_2048_mul_16(z0, a, b);
  17813. sp_2048_mask_16(r + 32, a1, 0 - cb);
  17814. sp_2048_mask_16(b1, b1, 0 - ca);
  17815. u += sp_2048_add_16(r + 32, r + 32, b1);
  17816. u += sp_2048_sub_in_place_32(z1, z2);
  17817. u += sp_2048_sub_in_place_32(z1, z0);
  17818. u += sp_2048_add_32(r + 16, r + 16, z1);
  17819. u += sp_2048_add_16(r + 32, r + 32, z2);
  17820. (void)sp_2048_add_to_word_16(r + 48, u, z2 + 16);
  17821. }
  17822. /* Double a into r. (r = a + a)
  17823. *
  17824. * r A single precision integer.
  17825. * a A single precision integer.
  17826. */
  17827. SP_NOINLINE static sp_digit sp_2048_dbl_16(sp_digit* r, const sp_digit* a)
  17828. {
  17829. __asm__ __volatile__ (
  17830. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  17831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17832. "adds r2, r2, r2\n\t"
  17833. #else
  17834. "add r2, r2, r2\n\t"
  17835. #endif
  17836. #ifdef WOLFSSL_KEIL
  17837. "adcs r3, r3, r3\n\t"
  17838. #elif defined(__clang__)
  17839. "adcs r3, r3\n\t"
  17840. #else
  17841. "adc r3, r3\n\t"
  17842. #endif
  17843. #ifdef WOLFSSL_KEIL
  17844. "adcs r4, r4, r4\n\t"
  17845. #elif defined(__clang__)
  17846. "adcs r4, r4\n\t"
  17847. #else
  17848. "adc r4, r4\n\t"
  17849. #endif
  17850. #ifdef WOLFSSL_KEIL
  17851. "adcs r5, r5, r5\n\t"
  17852. #elif defined(__clang__)
  17853. "adcs r5, r5\n\t"
  17854. #else
  17855. "adc r5, r5\n\t"
  17856. #endif
  17857. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  17858. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  17859. #ifdef WOLFSSL_KEIL
  17860. "adcs r2, r2, r2\n\t"
  17861. #elif defined(__clang__)
  17862. "adcs r2, r2\n\t"
  17863. #else
  17864. "adc r2, r2\n\t"
  17865. #endif
  17866. #ifdef WOLFSSL_KEIL
  17867. "adcs r3, r3, r3\n\t"
  17868. #elif defined(__clang__)
  17869. "adcs r3, r3\n\t"
  17870. #else
  17871. "adc r3, r3\n\t"
  17872. #endif
  17873. #ifdef WOLFSSL_KEIL
  17874. "adcs r4, r4, r4\n\t"
  17875. #elif defined(__clang__)
  17876. "adcs r4, r4\n\t"
  17877. #else
  17878. "adc r4, r4\n\t"
  17879. #endif
  17880. #ifdef WOLFSSL_KEIL
  17881. "adcs r5, r5, r5\n\t"
  17882. #elif defined(__clang__)
  17883. "adcs r5, r5\n\t"
  17884. #else
  17885. "adc r5, r5\n\t"
  17886. #endif
  17887. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  17888. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  17889. #ifdef WOLFSSL_KEIL
  17890. "adcs r2, r2, r2\n\t"
  17891. #elif defined(__clang__)
  17892. "adcs r2, r2\n\t"
  17893. #else
  17894. "adc r2, r2\n\t"
  17895. #endif
  17896. #ifdef WOLFSSL_KEIL
  17897. "adcs r3, r3, r3\n\t"
  17898. #elif defined(__clang__)
  17899. "adcs r3, r3\n\t"
  17900. #else
  17901. "adc r3, r3\n\t"
  17902. #endif
  17903. #ifdef WOLFSSL_KEIL
  17904. "adcs r4, r4, r4\n\t"
  17905. #elif defined(__clang__)
  17906. "adcs r4, r4\n\t"
  17907. #else
  17908. "adc r4, r4\n\t"
  17909. #endif
  17910. #ifdef WOLFSSL_KEIL
  17911. "adcs r5, r5, r5\n\t"
  17912. #elif defined(__clang__)
  17913. "adcs r5, r5\n\t"
  17914. #else
  17915. "adc r5, r5\n\t"
  17916. #endif
  17917. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  17918. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  17919. #ifdef WOLFSSL_KEIL
  17920. "adcs r2, r2, r2\n\t"
  17921. #elif defined(__clang__)
  17922. "adcs r2, r2\n\t"
  17923. #else
  17924. "adc r2, r2\n\t"
  17925. #endif
  17926. #ifdef WOLFSSL_KEIL
  17927. "adcs r3, r3, r3\n\t"
  17928. #elif defined(__clang__)
  17929. "adcs r3, r3\n\t"
  17930. #else
  17931. "adc r3, r3\n\t"
  17932. #endif
  17933. #ifdef WOLFSSL_KEIL
  17934. "adcs r4, r4, r4\n\t"
  17935. #elif defined(__clang__)
  17936. "adcs r4, r4\n\t"
  17937. #else
  17938. "adc r4, r4\n\t"
  17939. #endif
  17940. #ifdef WOLFSSL_KEIL
  17941. "adcs r5, r5, r5\n\t"
  17942. #elif defined(__clang__)
  17943. "adcs r5, r5\n\t"
  17944. #else
  17945. "adc r5, r5\n\t"
  17946. #endif
  17947. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  17948. "movs %[r], #0\n\t"
  17949. #ifdef WOLFSSL_KEIL
  17950. "adcs %[r], %[r], %[r]\n\t"
  17951. #elif defined(__clang__)
  17952. "adcs %[r], %[r]\n\t"
  17953. #else
  17954. "adc %[r], %[r]\n\t"
  17955. #endif
  17956. : [r] "+r" (r), [a] "+r" (a)
  17957. :
  17958. : "memory", "r2", "r3", "r4", "r5"
  17959. );
  17960. return (uint32_t)(size_t)r;
  17961. }
  17962. /* Square a and put result in r. (r = a * a)
  17963. *
  17964. * r A single precision integer.
  17965. * a A single precision integer.
  17966. */
  17967. SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
  17968. {
  17969. sp_digit* z0 = r;
  17970. sp_digit z2[32];
  17971. sp_digit z1[32];
  17972. sp_digit a1[16];
  17973. sp_digit u;
  17974. u = sp_2048_add_16(a1, a, &a[16]);
  17975. sp_2048_sqr_16(z1, a1);
  17976. sp_2048_sqr_16(z2, &a[16]);
  17977. sp_2048_sqr_16(z0, a);
  17978. sp_2048_mask_16(r + 32, a1, 0 - u);
  17979. u += sp_2048_dbl_16(r + 32, r + 32);
  17980. u += sp_2048_sub_in_place_32(z1, z2);
  17981. u += sp_2048_sub_in_place_32(z1, z0);
  17982. u += sp_2048_add_32(r + 16, r + 16, z1);
  17983. u += sp_2048_add_16(r + 32, r + 32, z2);
  17984. (void)sp_2048_add_to_word_16(r + 48, u, z2 + 16);
  17985. }
  17986. /* Add b to a into r. (r = a + b)
  17987. *
  17988. * r A single precision integer.
  17989. * a A single precision integer.
  17990. * b A single precision integer.
  17991. */
  17992. SP_NOINLINE static sp_digit sp_2048_add_to_word_32(sp_digit* r, sp_digit a,
  17993. const sp_digit* b)
  17994. {
  17995. __asm__ __volatile__ (
  17996. "movs r5, #0\n\t"
  17997. "ldm %[b]!, {r3, r4}\n\t"
  17998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17999. "adds r3, r3, %[a]\n\t"
  18000. #else
  18001. "add r3, r3, %[a]\n\t"
  18002. #endif
  18003. #ifdef WOLFSSL_KEIL
  18004. "adcs r4, r4, r5\n\t"
  18005. #elif defined(__clang__)
  18006. "adcs r4, r5\n\t"
  18007. #else
  18008. "adc r4, r5\n\t"
  18009. #endif
  18010. "stm %[r]!, {r3, r4}\n\t"
  18011. "ldm %[b]!, {r3, r4}\n\t"
  18012. #ifdef WOLFSSL_KEIL
  18013. "adcs r3, r3, r5\n\t"
  18014. #elif defined(__clang__)
  18015. "adcs r3, r5\n\t"
  18016. #else
  18017. "adc r3, r5\n\t"
  18018. #endif
  18019. #ifdef WOLFSSL_KEIL
  18020. "adcs r4, r4, r5\n\t"
  18021. #elif defined(__clang__)
  18022. "adcs r4, r5\n\t"
  18023. #else
  18024. "adc r4, r5\n\t"
  18025. #endif
  18026. "stm %[r]!, {r3, r4}\n\t"
  18027. "ldm %[b]!, {r3, r4}\n\t"
  18028. #ifdef WOLFSSL_KEIL
  18029. "adcs r3, r3, r5\n\t"
  18030. #elif defined(__clang__)
  18031. "adcs r3, r5\n\t"
  18032. #else
  18033. "adc r3, r5\n\t"
  18034. #endif
  18035. #ifdef WOLFSSL_KEIL
  18036. "adcs r4, r4, r5\n\t"
  18037. #elif defined(__clang__)
  18038. "adcs r4, r5\n\t"
  18039. #else
  18040. "adc r4, r5\n\t"
  18041. #endif
  18042. "stm %[r]!, {r3, r4}\n\t"
  18043. "ldm %[b]!, {r3, r4}\n\t"
  18044. #ifdef WOLFSSL_KEIL
  18045. "adcs r3, r3, r5\n\t"
  18046. #elif defined(__clang__)
  18047. "adcs r3, r5\n\t"
  18048. #else
  18049. "adc r3, r5\n\t"
  18050. #endif
  18051. #ifdef WOLFSSL_KEIL
  18052. "adcs r4, r4, r5\n\t"
  18053. #elif defined(__clang__)
  18054. "adcs r4, r5\n\t"
  18055. #else
  18056. "adc r4, r5\n\t"
  18057. #endif
  18058. "stm %[r]!, {r3, r4}\n\t"
  18059. "ldm %[b]!, {r3, r4}\n\t"
  18060. #ifdef WOLFSSL_KEIL
  18061. "adcs r3, r3, r5\n\t"
  18062. #elif defined(__clang__)
  18063. "adcs r3, r5\n\t"
  18064. #else
  18065. "adc r3, r5\n\t"
  18066. #endif
  18067. #ifdef WOLFSSL_KEIL
  18068. "adcs r4, r4, r5\n\t"
  18069. #elif defined(__clang__)
  18070. "adcs r4, r5\n\t"
  18071. #else
  18072. "adc r4, r5\n\t"
  18073. #endif
  18074. "stm %[r]!, {r3, r4}\n\t"
  18075. "ldm %[b]!, {r3, r4}\n\t"
  18076. #ifdef WOLFSSL_KEIL
  18077. "adcs r3, r3, r5\n\t"
  18078. #elif defined(__clang__)
  18079. "adcs r3, r5\n\t"
  18080. #else
  18081. "adc r3, r5\n\t"
  18082. #endif
  18083. #ifdef WOLFSSL_KEIL
  18084. "adcs r4, r4, r5\n\t"
  18085. #elif defined(__clang__)
  18086. "adcs r4, r5\n\t"
  18087. #else
  18088. "adc r4, r5\n\t"
  18089. #endif
  18090. "stm %[r]!, {r3, r4}\n\t"
  18091. "ldm %[b]!, {r3, r4}\n\t"
  18092. #ifdef WOLFSSL_KEIL
  18093. "adcs r3, r3, r5\n\t"
  18094. #elif defined(__clang__)
  18095. "adcs r3, r5\n\t"
  18096. #else
  18097. "adc r3, r5\n\t"
  18098. #endif
  18099. #ifdef WOLFSSL_KEIL
  18100. "adcs r4, r4, r5\n\t"
  18101. #elif defined(__clang__)
  18102. "adcs r4, r5\n\t"
  18103. #else
  18104. "adc r4, r5\n\t"
  18105. #endif
  18106. "stm %[r]!, {r3, r4}\n\t"
  18107. "ldm %[b]!, {r3, r4}\n\t"
  18108. #ifdef WOLFSSL_KEIL
  18109. "adcs r3, r3, r5\n\t"
  18110. #elif defined(__clang__)
  18111. "adcs r3, r5\n\t"
  18112. #else
  18113. "adc r3, r5\n\t"
  18114. #endif
  18115. #ifdef WOLFSSL_KEIL
  18116. "adcs r4, r4, r5\n\t"
  18117. #elif defined(__clang__)
  18118. "adcs r4, r5\n\t"
  18119. #else
  18120. "adc r4, r5\n\t"
  18121. #endif
  18122. "stm %[r]!, {r3, r4}\n\t"
  18123. "ldm %[b]!, {r3, r4}\n\t"
  18124. #ifdef WOLFSSL_KEIL
  18125. "adcs r3, r3, r5\n\t"
  18126. #elif defined(__clang__)
  18127. "adcs r3, r5\n\t"
  18128. #else
  18129. "adc r3, r5\n\t"
  18130. #endif
  18131. #ifdef WOLFSSL_KEIL
  18132. "adcs r4, r4, r5\n\t"
  18133. #elif defined(__clang__)
  18134. "adcs r4, r5\n\t"
  18135. #else
  18136. "adc r4, r5\n\t"
  18137. #endif
  18138. "stm %[r]!, {r3, r4}\n\t"
  18139. "ldm %[b]!, {r3, r4}\n\t"
  18140. #ifdef WOLFSSL_KEIL
  18141. "adcs r3, r3, r5\n\t"
  18142. #elif defined(__clang__)
  18143. "adcs r3, r5\n\t"
  18144. #else
  18145. "adc r3, r5\n\t"
  18146. #endif
  18147. #ifdef WOLFSSL_KEIL
  18148. "adcs r4, r4, r5\n\t"
  18149. #elif defined(__clang__)
  18150. "adcs r4, r5\n\t"
  18151. #else
  18152. "adc r4, r5\n\t"
  18153. #endif
  18154. "stm %[r]!, {r3, r4}\n\t"
  18155. "ldm %[b]!, {r3, r4}\n\t"
  18156. #ifdef WOLFSSL_KEIL
  18157. "adcs r3, r3, r5\n\t"
  18158. #elif defined(__clang__)
  18159. "adcs r3, r5\n\t"
  18160. #else
  18161. "adc r3, r5\n\t"
  18162. #endif
  18163. #ifdef WOLFSSL_KEIL
  18164. "adcs r4, r4, r5\n\t"
  18165. #elif defined(__clang__)
  18166. "adcs r4, r5\n\t"
  18167. #else
  18168. "adc r4, r5\n\t"
  18169. #endif
  18170. "stm %[r]!, {r3, r4}\n\t"
  18171. "ldm %[b]!, {r3, r4}\n\t"
  18172. #ifdef WOLFSSL_KEIL
  18173. "adcs r3, r3, r5\n\t"
  18174. #elif defined(__clang__)
  18175. "adcs r3, r5\n\t"
  18176. #else
  18177. "adc r3, r5\n\t"
  18178. #endif
  18179. #ifdef WOLFSSL_KEIL
  18180. "adcs r4, r4, r5\n\t"
  18181. #elif defined(__clang__)
  18182. "adcs r4, r5\n\t"
  18183. #else
  18184. "adc r4, r5\n\t"
  18185. #endif
  18186. "stm %[r]!, {r3, r4}\n\t"
  18187. "ldm %[b]!, {r3, r4}\n\t"
  18188. #ifdef WOLFSSL_KEIL
  18189. "adcs r3, r3, r5\n\t"
  18190. #elif defined(__clang__)
  18191. "adcs r3, r5\n\t"
  18192. #else
  18193. "adc r3, r5\n\t"
  18194. #endif
  18195. #ifdef WOLFSSL_KEIL
  18196. "adcs r4, r4, r5\n\t"
  18197. #elif defined(__clang__)
  18198. "adcs r4, r5\n\t"
  18199. #else
  18200. "adc r4, r5\n\t"
  18201. #endif
  18202. "stm %[r]!, {r3, r4}\n\t"
  18203. "ldm %[b]!, {r3, r4}\n\t"
  18204. #ifdef WOLFSSL_KEIL
  18205. "adcs r3, r3, r5\n\t"
  18206. #elif defined(__clang__)
  18207. "adcs r3, r5\n\t"
  18208. #else
  18209. "adc r3, r5\n\t"
  18210. #endif
  18211. #ifdef WOLFSSL_KEIL
  18212. "adcs r4, r4, r5\n\t"
  18213. #elif defined(__clang__)
  18214. "adcs r4, r5\n\t"
  18215. #else
  18216. "adc r4, r5\n\t"
  18217. #endif
  18218. "stm %[r]!, {r3, r4}\n\t"
  18219. "ldm %[b]!, {r3, r4}\n\t"
  18220. #ifdef WOLFSSL_KEIL
  18221. "adcs r3, r3, r5\n\t"
  18222. #elif defined(__clang__)
  18223. "adcs r3, r5\n\t"
  18224. #else
  18225. "adc r3, r5\n\t"
  18226. #endif
  18227. #ifdef WOLFSSL_KEIL
  18228. "adcs r4, r4, r5\n\t"
  18229. #elif defined(__clang__)
  18230. "adcs r4, r5\n\t"
  18231. #else
  18232. "adc r4, r5\n\t"
  18233. #endif
  18234. "stm %[r]!, {r3, r4}\n\t"
  18235. "ldm %[b]!, {r3, r4}\n\t"
  18236. #ifdef WOLFSSL_KEIL
  18237. "adcs r3, r3, r5\n\t"
  18238. #elif defined(__clang__)
  18239. "adcs r3, r5\n\t"
  18240. #else
  18241. "adc r3, r5\n\t"
  18242. #endif
  18243. #ifdef WOLFSSL_KEIL
  18244. "adcs r4, r4, r5\n\t"
  18245. #elif defined(__clang__)
  18246. "adcs r4, r5\n\t"
  18247. #else
  18248. "adc r4, r5\n\t"
  18249. #endif
  18250. "stm %[r]!, {r3, r4}\n\t"
  18251. "movs %[r], #0\n\t"
  18252. #ifdef WOLFSSL_KEIL
  18253. "adcs %[r], %[r], %[r]\n\t"
  18254. #elif defined(__clang__)
  18255. "adcs %[r], %[r]\n\t"
  18256. #else
  18257. "adc %[r], %[r]\n\t"
  18258. #endif
  18259. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  18260. :
  18261. : "memory", "r3", "r4", "r5"
  18262. );
  18263. return (uint32_t)(size_t)r;
  18264. }
  18265. /* Sub b from a into a. (a -= b)
  18266. *
  18267. * a A single precision integer.
  18268. * b A single precision integer.
  18269. */
  18270. SP_NOINLINE static sp_digit sp_2048_sub_in_place_64(sp_digit* a,
  18271. const sp_digit* b)
  18272. {
  18273. __asm__ __volatile__ (
  18274. "ldm %[b]!, {r4, r5}\n\t"
  18275. "ldr r2, [%[a]]\n\t"
  18276. "ldr r3, [%[a], #4]\n\t"
  18277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18278. "subs r2, r2, r4\n\t"
  18279. #else
  18280. "sub r2, r2, r4\n\t"
  18281. #endif
  18282. #ifdef WOLFSSL_KEIL
  18283. "sbcs r3, r3, r5\n\t"
  18284. #elif defined(__clang__)
  18285. "sbcs r3, r5\n\t"
  18286. #else
  18287. "sbc r3, r5\n\t"
  18288. #endif
  18289. "stm %[a]!, {r2, r3}\n\t"
  18290. "ldm %[b]!, {r4, r5}\n\t"
  18291. "ldr r2, [%[a]]\n\t"
  18292. "ldr r3, [%[a], #4]\n\t"
  18293. #ifdef WOLFSSL_KEIL
  18294. "sbcs r2, r2, r4\n\t"
  18295. #elif defined(__clang__)
  18296. "sbcs r2, r4\n\t"
  18297. #else
  18298. "sbc r2, r4\n\t"
  18299. #endif
  18300. #ifdef WOLFSSL_KEIL
  18301. "sbcs r3, r3, r5\n\t"
  18302. #elif defined(__clang__)
  18303. "sbcs r3, r5\n\t"
  18304. #else
  18305. "sbc r3, r5\n\t"
  18306. #endif
  18307. "stm %[a]!, {r2, r3}\n\t"
  18308. "ldm %[b]!, {r4, r5}\n\t"
  18309. "ldr r2, [%[a]]\n\t"
  18310. "ldr r3, [%[a], #4]\n\t"
  18311. #ifdef WOLFSSL_KEIL
  18312. "sbcs r2, r2, r4\n\t"
  18313. #elif defined(__clang__)
  18314. "sbcs r2, r4\n\t"
  18315. #else
  18316. "sbc r2, r4\n\t"
  18317. #endif
  18318. #ifdef WOLFSSL_KEIL
  18319. "sbcs r3, r3, r5\n\t"
  18320. #elif defined(__clang__)
  18321. "sbcs r3, r5\n\t"
  18322. #else
  18323. "sbc r3, r5\n\t"
  18324. #endif
  18325. "stm %[a]!, {r2, r3}\n\t"
  18326. "ldm %[b]!, {r4, r5}\n\t"
  18327. "ldr r2, [%[a]]\n\t"
  18328. "ldr r3, [%[a], #4]\n\t"
  18329. #ifdef WOLFSSL_KEIL
  18330. "sbcs r2, r2, r4\n\t"
  18331. #elif defined(__clang__)
  18332. "sbcs r2, r4\n\t"
  18333. #else
  18334. "sbc r2, r4\n\t"
  18335. #endif
  18336. #ifdef WOLFSSL_KEIL
  18337. "sbcs r3, r3, r5\n\t"
  18338. #elif defined(__clang__)
  18339. "sbcs r3, r5\n\t"
  18340. #else
  18341. "sbc r3, r5\n\t"
  18342. #endif
  18343. "stm %[a]!, {r2, r3}\n\t"
  18344. "ldm %[b]!, {r4, r5}\n\t"
  18345. "ldr r2, [%[a]]\n\t"
  18346. "ldr r3, [%[a], #4]\n\t"
  18347. #ifdef WOLFSSL_KEIL
  18348. "sbcs r2, r2, r4\n\t"
  18349. #elif defined(__clang__)
  18350. "sbcs r2, r4\n\t"
  18351. #else
  18352. "sbc r2, r4\n\t"
  18353. #endif
  18354. #ifdef WOLFSSL_KEIL
  18355. "sbcs r3, r3, r5\n\t"
  18356. #elif defined(__clang__)
  18357. "sbcs r3, r5\n\t"
  18358. #else
  18359. "sbc r3, r5\n\t"
  18360. #endif
  18361. "stm %[a]!, {r2, r3}\n\t"
  18362. "ldm %[b]!, {r4, r5}\n\t"
  18363. "ldr r2, [%[a]]\n\t"
  18364. "ldr r3, [%[a], #4]\n\t"
  18365. #ifdef WOLFSSL_KEIL
  18366. "sbcs r2, r2, r4\n\t"
  18367. #elif defined(__clang__)
  18368. "sbcs r2, r4\n\t"
  18369. #else
  18370. "sbc r2, r4\n\t"
  18371. #endif
  18372. #ifdef WOLFSSL_KEIL
  18373. "sbcs r3, r3, r5\n\t"
  18374. #elif defined(__clang__)
  18375. "sbcs r3, r5\n\t"
  18376. #else
  18377. "sbc r3, r5\n\t"
  18378. #endif
  18379. "stm %[a]!, {r2, r3}\n\t"
  18380. "ldm %[b]!, {r4, r5}\n\t"
  18381. "ldr r2, [%[a]]\n\t"
  18382. "ldr r3, [%[a], #4]\n\t"
  18383. #ifdef WOLFSSL_KEIL
  18384. "sbcs r2, r2, r4\n\t"
  18385. #elif defined(__clang__)
  18386. "sbcs r2, r4\n\t"
  18387. #else
  18388. "sbc r2, r4\n\t"
  18389. #endif
  18390. #ifdef WOLFSSL_KEIL
  18391. "sbcs r3, r3, r5\n\t"
  18392. #elif defined(__clang__)
  18393. "sbcs r3, r5\n\t"
  18394. #else
  18395. "sbc r3, r5\n\t"
  18396. #endif
  18397. "stm %[a]!, {r2, r3}\n\t"
  18398. "ldm %[b]!, {r4, r5}\n\t"
  18399. "ldr r2, [%[a]]\n\t"
  18400. "ldr r3, [%[a], #4]\n\t"
  18401. #ifdef WOLFSSL_KEIL
  18402. "sbcs r2, r2, r4\n\t"
  18403. #elif defined(__clang__)
  18404. "sbcs r2, r4\n\t"
  18405. #else
  18406. "sbc r2, r4\n\t"
  18407. #endif
  18408. #ifdef WOLFSSL_KEIL
  18409. "sbcs r3, r3, r5\n\t"
  18410. #elif defined(__clang__)
  18411. "sbcs r3, r5\n\t"
  18412. #else
  18413. "sbc r3, r5\n\t"
  18414. #endif
  18415. "stm %[a]!, {r2, r3}\n\t"
  18416. "ldm %[b]!, {r4, r5}\n\t"
  18417. "ldr r2, [%[a]]\n\t"
  18418. "ldr r3, [%[a], #4]\n\t"
  18419. #ifdef WOLFSSL_KEIL
  18420. "sbcs r2, r2, r4\n\t"
  18421. #elif defined(__clang__)
  18422. "sbcs r2, r4\n\t"
  18423. #else
  18424. "sbc r2, r4\n\t"
  18425. #endif
  18426. #ifdef WOLFSSL_KEIL
  18427. "sbcs r3, r3, r5\n\t"
  18428. #elif defined(__clang__)
  18429. "sbcs r3, r5\n\t"
  18430. #else
  18431. "sbc r3, r5\n\t"
  18432. #endif
  18433. "stm %[a]!, {r2, r3}\n\t"
  18434. "ldm %[b]!, {r4, r5}\n\t"
  18435. "ldr r2, [%[a]]\n\t"
  18436. "ldr r3, [%[a], #4]\n\t"
  18437. #ifdef WOLFSSL_KEIL
  18438. "sbcs r2, r2, r4\n\t"
  18439. #elif defined(__clang__)
  18440. "sbcs r2, r4\n\t"
  18441. #else
  18442. "sbc r2, r4\n\t"
  18443. #endif
  18444. #ifdef WOLFSSL_KEIL
  18445. "sbcs r3, r3, r5\n\t"
  18446. #elif defined(__clang__)
  18447. "sbcs r3, r5\n\t"
  18448. #else
  18449. "sbc r3, r5\n\t"
  18450. #endif
  18451. "stm %[a]!, {r2, r3}\n\t"
  18452. "ldm %[b]!, {r4, r5}\n\t"
  18453. "ldr r2, [%[a]]\n\t"
  18454. "ldr r3, [%[a], #4]\n\t"
  18455. #ifdef WOLFSSL_KEIL
  18456. "sbcs r2, r2, r4\n\t"
  18457. #elif defined(__clang__)
  18458. "sbcs r2, r4\n\t"
  18459. #else
  18460. "sbc r2, r4\n\t"
  18461. #endif
  18462. #ifdef WOLFSSL_KEIL
  18463. "sbcs r3, r3, r5\n\t"
  18464. #elif defined(__clang__)
  18465. "sbcs r3, r5\n\t"
  18466. #else
  18467. "sbc r3, r5\n\t"
  18468. #endif
  18469. "stm %[a]!, {r2, r3}\n\t"
  18470. "ldm %[b]!, {r4, r5}\n\t"
  18471. "ldr r2, [%[a]]\n\t"
  18472. "ldr r3, [%[a], #4]\n\t"
  18473. #ifdef WOLFSSL_KEIL
  18474. "sbcs r2, r2, r4\n\t"
  18475. #elif defined(__clang__)
  18476. "sbcs r2, r4\n\t"
  18477. #else
  18478. "sbc r2, r4\n\t"
  18479. #endif
  18480. #ifdef WOLFSSL_KEIL
  18481. "sbcs r3, r3, r5\n\t"
  18482. #elif defined(__clang__)
  18483. "sbcs r3, r5\n\t"
  18484. #else
  18485. "sbc r3, r5\n\t"
  18486. #endif
  18487. "stm %[a]!, {r2, r3}\n\t"
  18488. "ldm %[b]!, {r4, r5}\n\t"
  18489. "ldr r2, [%[a]]\n\t"
  18490. "ldr r3, [%[a], #4]\n\t"
  18491. #ifdef WOLFSSL_KEIL
  18492. "sbcs r2, r2, r4\n\t"
  18493. #elif defined(__clang__)
  18494. "sbcs r2, r4\n\t"
  18495. #else
  18496. "sbc r2, r4\n\t"
  18497. #endif
  18498. #ifdef WOLFSSL_KEIL
  18499. "sbcs r3, r3, r5\n\t"
  18500. #elif defined(__clang__)
  18501. "sbcs r3, r5\n\t"
  18502. #else
  18503. "sbc r3, r5\n\t"
  18504. #endif
  18505. "stm %[a]!, {r2, r3}\n\t"
  18506. "ldm %[b]!, {r4, r5}\n\t"
  18507. "ldr r2, [%[a]]\n\t"
  18508. "ldr r3, [%[a], #4]\n\t"
  18509. #ifdef WOLFSSL_KEIL
  18510. "sbcs r2, r2, r4\n\t"
  18511. #elif defined(__clang__)
  18512. "sbcs r2, r4\n\t"
  18513. #else
  18514. "sbc r2, r4\n\t"
  18515. #endif
  18516. #ifdef WOLFSSL_KEIL
  18517. "sbcs r3, r3, r5\n\t"
  18518. #elif defined(__clang__)
  18519. "sbcs r3, r5\n\t"
  18520. #else
  18521. "sbc r3, r5\n\t"
  18522. #endif
  18523. "stm %[a]!, {r2, r3}\n\t"
  18524. "ldm %[b]!, {r4, r5}\n\t"
  18525. "ldr r2, [%[a]]\n\t"
  18526. "ldr r3, [%[a], #4]\n\t"
  18527. #ifdef WOLFSSL_KEIL
  18528. "sbcs r2, r2, r4\n\t"
  18529. #elif defined(__clang__)
  18530. "sbcs r2, r4\n\t"
  18531. #else
  18532. "sbc r2, r4\n\t"
  18533. #endif
  18534. #ifdef WOLFSSL_KEIL
  18535. "sbcs r3, r3, r5\n\t"
  18536. #elif defined(__clang__)
  18537. "sbcs r3, r5\n\t"
  18538. #else
  18539. "sbc r3, r5\n\t"
  18540. #endif
  18541. "stm %[a]!, {r2, r3}\n\t"
  18542. "ldm %[b]!, {r4, r5}\n\t"
  18543. "ldr r2, [%[a]]\n\t"
  18544. "ldr r3, [%[a], #4]\n\t"
  18545. #ifdef WOLFSSL_KEIL
  18546. "sbcs r2, r2, r4\n\t"
  18547. #elif defined(__clang__)
  18548. "sbcs r2, r4\n\t"
  18549. #else
  18550. "sbc r2, r4\n\t"
  18551. #endif
  18552. #ifdef WOLFSSL_KEIL
  18553. "sbcs r3, r3, r5\n\t"
  18554. #elif defined(__clang__)
  18555. "sbcs r3, r5\n\t"
  18556. #else
  18557. "sbc r3, r5\n\t"
  18558. #endif
  18559. "stm %[a]!, {r2, r3}\n\t"
  18560. "ldm %[b]!, {r4, r5}\n\t"
  18561. "ldr r2, [%[a]]\n\t"
  18562. "ldr r3, [%[a], #4]\n\t"
  18563. #ifdef WOLFSSL_KEIL
  18564. "sbcs r2, r2, r4\n\t"
  18565. #elif defined(__clang__)
  18566. "sbcs r2, r4\n\t"
  18567. #else
  18568. "sbc r2, r4\n\t"
  18569. #endif
  18570. #ifdef WOLFSSL_KEIL
  18571. "sbcs r3, r3, r5\n\t"
  18572. #elif defined(__clang__)
  18573. "sbcs r3, r5\n\t"
  18574. #else
  18575. "sbc r3, r5\n\t"
  18576. #endif
  18577. "stm %[a]!, {r2, r3}\n\t"
  18578. "ldm %[b]!, {r4, r5}\n\t"
  18579. "ldr r2, [%[a]]\n\t"
  18580. "ldr r3, [%[a], #4]\n\t"
  18581. #ifdef WOLFSSL_KEIL
  18582. "sbcs r2, r2, r4\n\t"
  18583. #elif defined(__clang__)
  18584. "sbcs r2, r4\n\t"
  18585. #else
  18586. "sbc r2, r4\n\t"
  18587. #endif
  18588. #ifdef WOLFSSL_KEIL
  18589. "sbcs r3, r3, r5\n\t"
  18590. #elif defined(__clang__)
  18591. "sbcs r3, r5\n\t"
  18592. #else
  18593. "sbc r3, r5\n\t"
  18594. #endif
  18595. "stm %[a]!, {r2, r3}\n\t"
  18596. "ldm %[b]!, {r4, r5}\n\t"
  18597. "ldr r2, [%[a]]\n\t"
  18598. "ldr r3, [%[a], #4]\n\t"
  18599. #ifdef WOLFSSL_KEIL
  18600. "sbcs r2, r2, r4\n\t"
  18601. #elif defined(__clang__)
  18602. "sbcs r2, r4\n\t"
  18603. #else
  18604. "sbc r2, r4\n\t"
  18605. #endif
  18606. #ifdef WOLFSSL_KEIL
  18607. "sbcs r3, r3, r5\n\t"
  18608. #elif defined(__clang__)
  18609. "sbcs r3, r5\n\t"
  18610. #else
  18611. "sbc r3, r5\n\t"
  18612. #endif
  18613. "stm %[a]!, {r2, r3}\n\t"
  18614. "ldm %[b]!, {r4, r5}\n\t"
  18615. "ldr r2, [%[a]]\n\t"
  18616. "ldr r3, [%[a], #4]\n\t"
  18617. #ifdef WOLFSSL_KEIL
  18618. "sbcs r2, r2, r4\n\t"
  18619. #elif defined(__clang__)
  18620. "sbcs r2, r4\n\t"
  18621. #else
  18622. "sbc r2, r4\n\t"
  18623. #endif
  18624. #ifdef WOLFSSL_KEIL
  18625. "sbcs r3, r3, r5\n\t"
  18626. #elif defined(__clang__)
  18627. "sbcs r3, r5\n\t"
  18628. #else
  18629. "sbc r3, r5\n\t"
  18630. #endif
  18631. "stm %[a]!, {r2, r3}\n\t"
  18632. "ldm %[b]!, {r4, r5}\n\t"
  18633. "ldr r2, [%[a]]\n\t"
  18634. "ldr r3, [%[a], #4]\n\t"
  18635. #ifdef WOLFSSL_KEIL
  18636. "sbcs r2, r2, r4\n\t"
  18637. #elif defined(__clang__)
  18638. "sbcs r2, r4\n\t"
  18639. #else
  18640. "sbc r2, r4\n\t"
  18641. #endif
  18642. #ifdef WOLFSSL_KEIL
  18643. "sbcs r3, r3, r5\n\t"
  18644. #elif defined(__clang__)
  18645. "sbcs r3, r5\n\t"
  18646. #else
  18647. "sbc r3, r5\n\t"
  18648. #endif
  18649. "stm %[a]!, {r2, r3}\n\t"
  18650. "ldm %[b]!, {r4, r5}\n\t"
  18651. "ldr r2, [%[a]]\n\t"
  18652. "ldr r3, [%[a], #4]\n\t"
  18653. #ifdef WOLFSSL_KEIL
  18654. "sbcs r2, r2, r4\n\t"
  18655. #elif defined(__clang__)
  18656. "sbcs r2, r4\n\t"
  18657. #else
  18658. "sbc r2, r4\n\t"
  18659. #endif
  18660. #ifdef WOLFSSL_KEIL
  18661. "sbcs r3, r3, r5\n\t"
  18662. #elif defined(__clang__)
  18663. "sbcs r3, r5\n\t"
  18664. #else
  18665. "sbc r3, r5\n\t"
  18666. #endif
  18667. "stm %[a]!, {r2, r3}\n\t"
  18668. "ldm %[b]!, {r4, r5}\n\t"
  18669. "ldr r2, [%[a]]\n\t"
  18670. "ldr r3, [%[a], #4]\n\t"
  18671. #ifdef WOLFSSL_KEIL
  18672. "sbcs r2, r2, r4\n\t"
  18673. #elif defined(__clang__)
  18674. "sbcs r2, r4\n\t"
  18675. #else
  18676. "sbc r2, r4\n\t"
  18677. #endif
  18678. #ifdef WOLFSSL_KEIL
  18679. "sbcs r3, r3, r5\n\t"
  18680. #elif defined(__clang__)
  18681. "sbcs r3, r5\n\t"
  18682. #else
  18683. "sbc r3, r5\n\t"
  18684. #endif
  18685. "stm %[a]!, {r2, r3}\n\t"
  18686. "ldm %[b]!, {r4, r5}\n\t"
  18687. "ldr r2, [%[a]]\n\t"
  18688. "ldr r3, [%[a], #4]\n\t"
  18689. #ifdef WOLFSSL_KEIL
  18690. "sbcs r2, r2, r4\n\t"
  18691. #elif defined(__clang__)
  18692. "sbcs r2, r4\n\t"
  18693. #else
  18694. "sbc r2, r4\n\t"
  18695. #endif
  18696. #ifdef WOLFSSL_KEIL
  18697. "sbcs r3, r3, r5\n\t"
  18698. #elif defined(__clang__)
  18699. "sbcs r3, r5\n\t"
  18700. #else
  18701. "sbc r3, r5\n\t"
  18702. #endif
  18703. "stm %[a]!, {r2, r3}\n\t"
  18704. "ldm %[b]!, {r4, r5}\n\t"
  18705. "ldr r2, [%[a]]\n\t"
  18706. "ldr r3, [%[a], #4]\n\t"
  18707. #ifdef WOLFSSL_KEIL
  18708. "sbcs r2, r2, r4\n\t"
  18709. #elif defined(__clang__)
  18710. "sbcs r2, r4\n\t"
  18711. #else
  18712. "sbc r2, r4\n\t"
  18713. #endif
  18714. #ifdef WOLFSSL_KEIL
  18715. "sbcs r3, r3, r5\n\t"
  18716. #elif defined(__clang__)
  18717. "sbcs r3, r5\n\t"
  18718. #else
  18719. "sbc r3, r5\n\t"
  18720. #endif
  18721. "stm %[a]!, {r2, r3}\n\t"
  18722. "ldm %[b]!, {r4, r5}\n\t"
  18723. "ldr r2, [%[a]]\n\t"
  18724. "ldr r3, [%[a], #4]\n\t"
  18725. #ifdef WOLFSSL_KEIL
  18726. "sbcs r2, r2, r4\n\t"
  18727. #elif defined(__clang__)
  18728. "sbcs r2, r4\n\t"
  18729. #else
  18730. "sbc r2, r4\n\t"
  18731. #endif
  18732. #ifdef WOLFSSL_KEIL
  18733. "sbcs r3, r3, r5\n\t"
  18734. #elif defined(__clang__)
  18735. "sbcs r3, r5\n\t"
  18736. #else
  18737. "sbc r3, r5\n\t"
  18738. #endif
  18739. "stm %[a]!, {r2, r3}\n\t"
  18740. "ldm %[b]!, {r4, r5}\n\t"
  18741. "ldr r2, [%[a]]\n\t"
  18742. "ldr r3, [%[a], #4]\n\t"
  18743. #ifdef WOLFSSL_KEIL
  18744. "sbcs r2, r2, r4\n\t"
  18745. #elif defined(__clang__)
  18746. "sbcs r2, r4\n\t"
  18747. #else
  18748. "sbc r2, r4\n\t"
  18749. #endif
  18750. #ifdef WOLFSSL_KEIL
  18751. "sbcs r3, r3, r5\n\t"
  18752. #elif defined(__clang__)
  18753. "sbcs r3, r5\n\t"
  18754. #else
  18755. "sbc r3, r5\n\t"
  18756. #endif
  18757. "stm %[a]!, {r2, r3}\n\t"
  18758. "ldm %[b]!, {r4, r5}\n\t"
  18759. "ldr r2, [%[a]]\n\t"
  18760. "ldr r3, [%[a], #4]\n\t"
  18761. #ifdef WOLFSSL_KEIL
  18762. "sbcs r2, r2, r4\n\t"
  18763. #elif defined(__clang__)
  18764. "sbcs r2, r4\n\t"
  18765. #else
  18766. "sbc r2, r4\n\t"
  18767. #endif
  18768. #ifdef WOLFSSL_KEIL
  18769. "sbcs r3, r3, r5\n\t"
  18770. #elif defined(__clang__)
  18771. "sbcs r3, r5\n\t"
  18772. #else
  18773. "sbc r3, r5\n\t"
  18774. #endif
  18775. "stm %[a]!, {r2, r3}\n\t"
  18776. "ldm %[b]!, {r4, r5}\n\t"
  18777. "ldr r2, [%[a]]\n\t"
  18778. "ldr r3, [%[a], #4]\n\t"
  18779. #ifdef WOLFSSL_KEIL
  18780. "sbcs r2, r2, r4\n\t"
  18781. #elif defined(__clang__)
  18782. "sbcs r2, r4\n\t"
  18783. #else
  18784. "sbc r2, r4\n\t"
  18785. #endif
  18786. #ifdef WOLFSSL_KEIL
  18787. "sbcs r3, r3, r5\n\t"
  18788. #elif defined(__clang__)
  18789. "sbcs r3, r5\n\t"
  18790. #else
  18791. "sbc r3, r5\n\t"
  18792. #endif
  18793. "stm %[a]!, {r2, r3}\n\t"
  18794. "ldm %[b]!, {r4, r5}\n\t"
  18795. "ldr r2, [%[a]]\n\t"
  18796. "ldr r3, [%[a], #4]\n\t"
  18797. #ifdef WOLFSSL_KEIL
  18798. "sbcs r2, r2, r4\n\t"
  18799. #elif defined(__clang__)
  18800. "sbcs r2, r4\n\t"
  18801. #else
  18802. "sbc r2, r4\n\t"
  18803. #endif
  18804. #ifdef WOLFSSL_KEIL
  18805. "sbcs r3, r3, r5\n\t"
  18806. #elif defined(__clang__)
  18807. "sbcs r3, r5\n\t"
  18808. #else
  18809. "sbc r3, r5\n\t"
  18810. #endif
  18811. "stm %[a]!, {r2, r3}\n\t"
  18812. "ldm %[b]!, {r4, r5}\n\t"
  18813. "ldr r2, [%[a]]\n\t"
  18814. "ldr r3, [%[a], #4]\n\t"
  18815. #ifdef WOLFSSL_KEIL
  18816. "sbcs r2, r2, r4\n\t"
  18817. #elif defined(__clang__)
  18818. "sbcs r2, r4\n\t"
  18819. #else
  18820. "sbc r2, r4\n\t"
  18821. #endif
  18822. #ifdef WOLFSSL_KEIL
  18823. "sbcs r3, r3, r5\n\t"
  18824. #elif defined(__clang__)
  18825. "sbcs r3, r5\n\t"
  18826. #else
  18827. "sbc r3, r5\n\t"
  18828. #endif
  18829. "stm %[a]!, {r2, r3}\n\t"
  18830. "ldm %[b]!, {r4, r5}\n\t"
  18831. "ldr r2, [%[a]]\n\t"
  18832. "ldr r3, [%[a], #4]\n\t"
  18833. #ifdef WOLFSSL_KEIL
  18834. "sbcs r2, r2, r4\n\t"
  18835. #elif defined(__clang__)
  18836. "sbcs r2, r4\n\t"
  18837. #else
  18838. "sbc r2, r4\n\t"
  18839. #endif
  18840. #ifdef WOLFSSL_KEIL
  18841. "sbcs r3, r3, r5\n\t"
  18842. #elif defined(__clang__)
  18843. "sbcs r3, r5\n\t"
  18844. #else
  18845. "sbc r3, r5\n\t"
  18846. #endif
  18847. "stm %[a]!, {r2, r3}\n\t"
  18848. #ifdef WOLFSSL_KEIL
  18849. "sbcs %[a], %[a], %[a]\n\t"
  18850. #elif defined(__clang__)
  18851. "sbcs %[a], %[a]\n\t"
  18852. #else
  18853. "sbc %[a], %[a]\n\t"
  18854. #endif
  18855. : [a] "+r" (a), [b] "+r" (b)
  18856. :
  18857. : "memory", "r2", "r3", "r4", "r5"
  18858. );
  18859. return (uint32_t)(size_t)a;
  18860. }
  18861. /* Add b to a into r. (r = a + b)
  18862. *
  18863. * r A single precision integer.
  18864. * a A single precision integer.
  18865. * b A single precision integer.
  18866. */
  18867. SP_NOINLINE static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a,
  18868. const sp_digit* b)
  18869. {
  18870. __asm__ __volatile__ (
  18871. "ldm %[b]!, {r5, r6}\n\t"
  18872. "ldm %[a]!, {r3, r4}\n\t"
  18873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18874. "adds r3, r3, r5\n\t"
  18875. #else
  18876. "add r3, r3, r5\n\t"
  18877. #endif
  18878. #ifdef WOLFSSL_KEIL
  18879. "adcs r4, r4, r6\n\t"
  18880. #elif defined(__clang__)
  18881. "adcs r4, r6\n\t"
  18882. #else
  18883. "adc r4, r6\n\t"
  18884. #endif
  18885. "stm %[r]!, {r3, r4}\n\t"
  18886. "ldm %[b]!, {r5, r6}\n\t"
  18887. "ldm %[a]!, {r3, r4}\n\t"
  18888. #ifdef WOLFSSL_KEIL
  18889. "adcs r3, r3, r5\n\t"
  18890. #elif defined(__clang__)
  18891. "adcs r3, r5\n\t"
  18892. #else
  18893. "adc r3, r5\n\t"
  18894. #endif
  18895. #ifdef WOLFSSL_KEIL
  18896. "adcs r4, r4, r6\n\t"
  18897. #elif defined(__clang__)
  18898. "adcs r4, r6\n\t"
  18899. #else
  18900. "adc r4, r6\n\t"
  18901. #endif
  18902. "stm %[r]!, {r3, r4}\n\t"
  18903. "ldm %[b]!, {r5, r6}\n\t"
  18904. "ldm %[a]!, {r3, r4}\n\t"
  18905. #ifdef WOLFSSL_KEIL
  18906. "adcs r3, r3, r5\n\t"
  18907. #elif defined(__clang__)
  18908. "adcs r3, r5\n\t"
  18909. #else
  18910. "adc r3, r5\n\t"
  18911. #endif
  18912. #ifdef WOLFSSL_KEIL
  18913. "adcs r4, r4, r6\n\t"
  18914. #elif defined(__clang__)
  18915. "adcs r4, r6\n\t"
  18916. #else
  18917. "adc r4, r6\n\t"
  18918. #endif
  18919. "stm %[r]!, {r3, r4}\n\t"
  18920. "ldm %[b]!, {r5, r6}\n\t"
  18921. "ldm %[a]!, {r3, r4}\n\t"
  18922. #ifdef WOLFSSL_KEIL
  18923. "adcs r3, r3, r5\n\t"
  18924. #elif defined(__clang__)
  18925. "adcs r3, r5\n\t"
  18926. #else
  18927. "adc r3, r5\n\t"
  18928. #endif
  18929. #ifdef WOLFSSL_KEIL
  18930. "adcs r4, r4, r6\n\t"
  18931. #elif defined(__clang__)
  18932. "adcs r4, r6\n\t"
  18933. #else
  18934. "adc r4, r6\n\t"
  18935. #endif
  18936. "stm %[r]!, {r3, r4}\n\t"
  18937. "ldm %[b]!, {r5, r6}\n\t"
  18938. "ldm %[a]!, {r3, r4}\n\t"
  18939. #ifdef WOLFSSL_KEIL
  18940. "adcs r3, r3, r5\n\t"
  18941. #elif defined(__clang__)
  18942. "adcs r3, r5\n\t"
  18943. #else
  18944. "adc r3, r5\n\t"
  18945. #endif
  18946. #ifdef WOLFSSL_KEIL
  18947. "adcs r4, r4, r6\n\t"
  18948. #elif defined(__clang__)
  18949. "adcs r4, r6\n\t"
  18950. #else
  18951. "adc r4, r6\n\t"
  18952. #endif
  18953. "stm %[r]!, {r3, r4}\n\t"
  18954. "ldm %[b]!, {r5, r6}\n\t"
  18955. "ldm %[a]!, {r3, r4}\n\t"
  18956. #ifdef WOLFSSL_KEIL
  18957. "adcs r3, r3, r5\n\t"
  18958. #elif defined(__clang__)
  18959. "adcs r3, r5\n\t"
  18960. #else
  18961. "adc r3, r5\n\t"
  18962. #endif
  18963. #ifdef WOLFSSL_KEIL
  18964. "adcs r4, r4, r6\n\t"
  18965. #elif defined(__clang__)
  18966. "adcs r4, r6\n\t"
  18967. #else
  18968. "adc r4, r6\n\t"
  18969. #endif
  18970. "stm %[r]!, {r3, r4}\n\t"
  18971. "ldm %[b]!, {r5, r6}\n\t"
  18972. "ldm %[a]!, {r3, r4}\n\t"
  18973. #ifdef WOLFSSL_KEIL
  18974. "adcs r3, r3, r5\n\t"
  18975. #elif defined(__clang__)
  18976. "adcs r3, r5\n\t"
  18977. #else
  18978. "adc r3, r5\n\t"
  18979. #endif
  18980. #ifdef WOLFSSL_KEIL
  18981. "adcs r4, r4, r6\n\t"
  18982. #elif defined(__clang__)
  18983. "adcs r4, r6\n\t"
  18984. #else
  18985. "adc r4, r6\n\t"
  18986. #endif
  18987. "stm %[r]!, {r3, r4}\n\t"
  18988. "ldm %[b]!, {r5, r6}\n\t"
  18989. "ldm %[a]!, {r3, r4}\n\t"
  18990. #ifdef WOLFSSL_KEIL
  18991. "adcs r3, r3, r5\n\t"
  18992. #elif defined(__clang__)
  18993. "adcs r3, r5\n\t"
  18994. #else
  18995. "adc r3, r5\n\t"
  18996. #endif
  18997. #ifdef WOLFSSL_KEIL
  18998. "adcs r4, r4, r6\n\t"
  18999. #elif defined(__clang__)
  19000. "adcs r4, r6\n\t"
  19001. #else
  19002. "adc r4, r6\n\t"
  19003. #endif
  19004. "stm %[r]!, {r3, r4}\n\t"
  19005. "ldm %[b]!, {r5, r6}\n\t"
  19006. "ldm %[a]!, {r3, r4}\n\t"
  19007. #ifdef WOLFSSL_KEIL
  19008. "adcs r3, r3, r5\n\t"
  19009. #elif defined(__clang__)
  19010. "adcs r3, r5\n\t"
  19011. #else
  19012. "adc r3, r5\n\t"
  19013. #endif
  19014. #ifdef WOLFSSL_KEIL
  19015. "adcs r4, r4, r6\n\t"
  19016. #elif defined(__clang__)
  19017. "adcs r4, r6\n\t"
  19018. #else
  19019. "adc r4, r6\n\t"
  19020. #endif
  19021. "stm %[r]!, {r3, r4}\n\t"
  19022. "ldm %[b]!, {r5, r6}\n\t"
  19023. "ldm %[a]!, {r3, r4}\n\t"
  19024. #ifdef WOLFSSL_KEIL
  19025. "adcs r3, r3, r5\n\t"
  19026. #elif defined(__clang__)
  19027. "adcs r3, r5\n\t"
  19028. #else
  19029. "adc r3, r5\n\t"
  19030. #endif
  19031. #ifdef WOLFSSL_KEIL
  19032. "adcs r4, r4, r6\n\t"
  19033. #elif defined(__clang__)
  19034. "adcs r4, r6\n\t"
  19035. #else
  19036. "adc r4, r6\n\t"
  19037. #endif
  19038. "stm %[r]!, {r3, r4}\n\t"
  19039. "ldm %[b]!, {r5, r6}\n\t"
  19040. "ldm %[a]!, {r3, r4}\n\t"
  19041. #ifdef WOLFSSL_KEIL
  19042. "adcs r3, r3, r5\n\t"
  19043. #elif defined(__clang__)
  19044. "adcs r3, r5\n\t"
  19045. #else
  19046. "adc r3, r5\n\t"
  19047. #endif
  19048. #ifdef WOLFSSL_KEIL
  19049. "adcs r4, r4, r6\n\t"
  19050. #elif defined(__clang__)
  19051. "adcs r4, r6\n\t"
  19052. #else
  19053. "adc r4, r6\n\t"
  19054. #endif
  19055. "stm %[r]!, {r3, r4}\n\t"
  19056. "ldm %[b]!, {r5, r6}\n\t"
  19057. "ldm %[a]!, {r3, r4}\n\t"
  19058. #ifdef WOLFSSL_KEIL
  19059. "adcs r3, r3, r5\n\t"
  19060. #elif defined(__clang__)
  19061. "adcs r3, r5\n\t"
  19062. #else
  19063. "adc r3, r5\n\t"
  19064. #endif
  19065. #ifdef WOLFSSL_KEIL
  19066. "adcs r4, r4, r6\n\t"
  19067. #elif defined(__clang__)
  19068. "adcs r4, r6\n\t"
  19069. #else
  19070. "adc r4, r6\n\t"
  19071. #endif
  19072. "stm %[r]!, {r3, r4}\n\t"
  19073. "ldm %[b]!, {r5, r6}\n\t"
  19074. "ldm %[a]!, {r3, r4}\n\t"
  19075. #ifdef WOLFSSL_KEIL
  19076. "adcs r3, r3, r5\n\t"
  19077. #elif defined(__clang__)
  19078. "adcs r3, r5\n\t"
  19079. #else
  19080. "adc r3, r5\n\t"
  19081. #endif
  19082. #ifdef WOLFSSL_KEIL
  19083. "adcs r4, r4, r6\n\t"
  19084. #elif defined(__clang__)
  19085. "adcs r4, r6\n\t"
  19086. #else
  19087. "adc r4, r6\n\t"
  19088. #endif
  19089. "stm %[r]!, {r3, r4}\n\t"
  19090. "ldm %[b]!, {r5, r6}\n\t"
  19091. "ldm %[a]!, {r3, r4}\n\t"
  19092. #ifdef WOLFSSL_KEIL
  19093. "adcs r3, r3, r5\n\t"
  19094. #elif defined(__clang__)
  19095. "adcs r3, r5\n\t"
  19096. #else
  19097. "adc r3, r5\n\t"
  19098. #endif
  19099. #ifdef WOLFSSL_KEIL
  19100. "adcs r4, r4, r6\n\t"
  19101. #elif defined(__clang__)
  19102. "adcs r4, r6\n\t"
  19103. #else
  19104. "adc r4, r6\n\t"
  19105. #endif
  19106. "stm %[r]!, {r3, r4}\n\t"
  19107. "ldm %[b]!, {r5, r6}\n\t"
  19108. "ldm %[a]!, {r3, r4}\n\t"
  19109. #ifdef WOLFSSL_KEIL
  19110. "adcs r3, r3, r5\n\t"
  19111. #elif defined(__clang__)
  19112. "adcs r3, r5\n\t"
  19113. #else
  19114. "adc r3, r5\n\t"
  19115. #endif
  19116. #ifdef WOLFSSL_KEIL
  19117. "adcs r4, r4, r6\n\t"
  19118. #elif defined(__clang__)
  19119. "adcs r4, r6\n\t"
  19120. #else
  19121. "adc r4, r6\n\t"
  19122. #endif
  19123. "stm %[r]!, {r3, r4}\n\t"
  19124. "ldm %[b]!, {r5, r6}\n\t"
  19125. "ldm %[a]!, {r3, r4}\n\t"
  19126. #ifdef WOLFSSL_KEIL
  19127. "adcs r3, r3, r5\n\t"
  19128. #elif defined(__clang__)
  19129. "adcs r3, r5\n\t"
  19130. #else
  19131. "adc r3, r5\n\t"
  19132. #endif
  19133. #ifdef WOLFSSL_KEIL
  19134. "adcs r4, r4, r6\n\t"
  19135. #elif defined(__clang__)
  19136. "adcs r4, r6\n\t"
  19137. #else
  19138. "adc r4, r6\n\t"
  19139. #endif
  19140. "stm %[r]!, {r3, r4}\n\t"
  19141. "ldm %[b]!, {r5, r6}\n\t"
  19142. "ldm %[a]!, {r3, r4}\n\t"
  19143. #ifdef WOLFSSL_KEIL
  19144. "adcs r3, r3, r5\n\t"
  19145. #elif defined(__clang__)
  19146. "adcs r3, r5\n\t"
  19147. #else
  19148. "adc r3, r5\n\t"
  19149. #endif
  19150. #ifdef WOLFSSL_KEIL
  19151. "adcs r4, r4, r6\n\t"
  19152. #elif defined(__clang__)
  19153. "adcs r4, r6\n\t"
  19154. #else
  19155. "adc r4, r6\n\t"
  19156. #endif
  19157. "stm %[r]!, {r3, r4}\n\t"
  19158. "ldm %[b]!, {r5, r6}\n\t"
  19159. "ldm %[a]!, {r3, r4}\n\t"
  19160. #ifdef WOLFSSL_KEIL
  19161. "adcs r3, r3, r5\n\t"
  19162. #elif defined(__clang__)
  19163. "adcs r3, r5\n\t"
  19164. #else
  19165. "adc r3, r5\n\t"
  19166. #endif
  19167. #ifdef WOLFSSL_KEIL
  19168. "adcs r4, r4, r6\n\t"
  19169. #elif defined(__clang__)
  19170. "adcs r4, r6\n\t"
  19171. #else
  19172. "adc r4, r6\n\t"
  19173. #endif
  19174. "stm %[r]!, {r3, r4}\n\t"
  19175. "ldm %[b]!, {r5, r6}\n\t"
  19176. "ldm %[a]!, {r3, r4}\n\t"
  19177. #ifdef WOLFSSL_KEIL
  19178. "adcs r3, r3, r5\n\t"
  19179. #elif defined(__clang__)
  19180. "adcs r3, r5\n\t"
  19181. #else
  19182. "adc r3, r5\n\t"
  19183. #endif
  19184. #ifdef WOLFSSL_KEIL
  19185. "adcs r4, r4, r6\n\t"
  19186. #elif defined(__clang__)
  19187. "adcs r4, r6\n\t"
  19188. #else
  19189. "adc r4, r6\n\t"
  19190. #endif
  19191. "stm %[r]!, {r3, r4}\n\t"
  19192. "ldm %[b]!, {r5, r6}\n\t"
  19193. "ldm %[a]!, {r3, r4}\n\t"
  19194. #ifdef WOLFSSL_KEIL
  19195. "adcs r3, r3, r5\n\t"
  19196. #elif defined(__clang__)
  19197. "adcs r3, r5\n\t"
  19198. #else
  19199. "adc r3, r5\n\t"
  19200. #endif
  19201. #ifdef WOLFSSL_KEIL
  19202. "adcs r4, r4, r6\n\t"
  19203. #elif defined(__clang__)
  19204. "adcs r4, r6\n\t"
  19205. #else
  19206. "adc r4, r6\n\t"
  19207. #endif
  19208. "stm %[r]!, {r3, r4}\n\t"
  19209. "ldm %[b]!, {r5, r6}\n\t"
  19210. "ldm %[a]!, {r3, r4}\n\t"
  19211. #ifdef WOLFSSL_KEIL
  19212. "adcs r3, r3, r5\n\t"
  19213. #elif defined(__clang__)
  19214. "adcs r3, r5\n\t"
  19215. #else
  19216. "adc r3, r5\n\t"
  19217. #endif
  19218. #ifdef WOLFSSL_KEIL
  19219. "adcs r4, r4, r6\n\t"
  19220. #elif defined(__clang__)
  19221. "adcs r4, r6\n\t"
  19222. #else
  19223. "adc r4, r6\n\t"
  19224. #endif
  19225. "stm %[r]!, {r3, r4}\n\t"
  19226. "ldm %[b]!, {r5, r6}\n\t"
  19227. "ldm %[a]!, {r3, r4}\n\t"
  19228. #ifdef WOLFSSL_KEIL
  19229. "adcs r3, r3, r5\n\t"
  19230. #elif defined(__clang__)
  19231. "adcs r3, r5\n\t"
  19232. #else
  19233. "adc r3, r5\n\t"
  19234. #endif
  19235. #ifdef WOLFSSL_KEIL
  19236. "adcs r4, r4, r6\n\t"
  19237. #elif defined(__clang__)
  19238. "adcs r4, r6\n\t"
  19239. #else
  19240. "adc r4, r6\n\t"
  19241. #endif
  19242. "stm %[r]!, {r3, r4}\n\t"
  19243. "ldm %[b]!, {r5, r6}\n\t"
  19244. "ldm %[a]!, {r3, r4}\n\t"
  19245. #ifdef WOLFSSL_KEIL
  19246. "adcs r3, r3, r5\n\t"
  19247. #elif defined(__clang__)
  19248. "adcs r3, r5\n\t"
  19249. #else
  19250. "adc r3, r5\n\t"
  19251. #endif
  19252. #ifdef WOLFSSL_KEIL
  19253. "adcs r4, r4, r6\n\t"
  19254. #elif defined(__clang__)
  19255. "adcs r4, r6\n\t"
  19256. #else
  19257. "adc r4, r6\n\t"
  19258. #endif
  19259. "stm %[r]!, {r3, r4}\n\t"
  19260. "ldm %[b]!, {r5, r6}\n\t"
  19261. "ldm %[a]!, {r3, r4}\n\t"
  19262. #ifdef WOLFSSL_KEIL
  19263. "adcs r3, r3, r5\n\t"
  19264. #elif defined(__clang__)
  19265. "adcs r3, r5\n\t"
  19266. #else
  19267. "adc r3, r5\n\t"
  19268. #endif
  19269. #ifdef WOLFSSL_KEIL
  19270. "adcs r4, r4, r6\n\t"
  19271. #elif defined(__clang__)
  19272. "adcs r4, r6\n\t"
  19273. #else
  19274. "adc r4, r6\n\t"
  19275. #endif
  19276. "stm %[r]!, {r3, r4}\n\t"
  19277. "ldm %[b]!, {r5, r6}\n\t"
  19278. "ldm %[a]!, {r3, r4}\n\t"
  19279. #ifdef WOLFSSL_KEIL
  19280. "adcs r3, r3, r5\n\t"
  19281. #elif defined(__clang__)
  19282. "adcs r3, r5\n\t"
  19283. #else
  19284. "adc r3, r5\n\t"
  19285. #endif
  19286. #ifdef WOLFSSL_KEIL
  19287. "adcs r4, r4, r6\n\t"
  19288. #elif defined(__clang__)
  19289. "adcs r4, r6\n\t"
  19290. #else
  19291. "adc r4, r6\n\t"
  19292. #endif
  19293. "stm %[r]!, {r3, r4}\n\t"
  19294. "ldm %[b]!, {r5, r6}\n\t"
  19295. "ldm %[a]!, {r3, r4}\n\t"
  19296. #ifdef WOLFSSL_KEIL
  19297. "adcs r3, r3, r5\n\t"
  19298. #elif defined(__clang__)
  19299. "adcs r3, r5\n\t"
  19300. #else
  19301. "adc r3, r5\n\t"
  19302. #endif
  19303. #ifdef WOLFSSL_KEIL
  19304. "adcs r4, r4, r6\n\t"
  19305. #elif defined(__clang__)
  19306. "adcs r4, r6\n\t"
  19307. #else
  19308. "adc r4, r6\n\t"
  19309. #endif
  19310. "stm %[r]!, {r3, r4}\n\t"
  19311. "ldm %[b]!, {r5, r6}\n\t"
  19312. "ldm %[a]!, {r3, r4}\n\t"
  19313. #ifdef WOLFSSL_KEIL
  19314. "adcs r3, r3, r5\n\t"
  19315. #elif defined(__clang__)
  19316. "adcs r3, r5\n\t"
  19317. #else
  19318. "adc r3, r5\n\t"
  19319. #endif
  19320. #ifdef WOLFSSL_KEIL
  19321. "adcs r4, r4, r6\n\t"
  19322. #elif defined(__clang__)
  19323. "adcs r4, r6\n\t"
  19324. #else
  19325. "adc r4, r6\n\t"
  19326. #endif
  19327. "stm %[r]!, {r3, r4}\n\t"
  19328. "ldm %[b]!, {r5, r6}\n\t"
  19329. "ldm %[a]!, {r3, r4}\n\t"
  19330. #ifdef WOLFSSL_KEIL
  19331. "adcs r3, r3, r5\n\t"
  19332. #elif defined(__clang__)
  19333. "adcs r3, r5\n\t"
  19334. #else
  19335. "adc r3, r5\n\t"
  19336. #endif
  19337. #ifdef WOLFSSL_KEIL
  19338. "adcs r4, r4, r6\n\t"
  19339. #elif defined(__clang__)
  19340. "adcs r4, r6\n\t"
  19341. #else
  19342. "adc r4, r6\n\t"
  19343. #endif
  19344. "stm %[r]!, {r3, r4}\n\t"
  19345. "ldm %[b]!, {r5, r6}\n\t"
  19346. "ldm %[a]!, {r3, r4}\n\t"
  19347. #ifdef WOLFSSL_KEIL
  19348. "adcs r3, r3, r5\n\t"
  19349. #elif defined(__clang__)
  19350. "adcs r3, r5\n\t"
  19351. #else
  19352. "adc r3, r5\n\t"
  19353. #endif
  19354. #ifdef WOLFSSL_KEIL
  19355. "adcs r4, r4, r6\n\t"
  19356. #elif defined(__clang__)
  19357. "adcs r4, r6\n\t"
  19358. #else
  19359. "adc r4, r6\n\t"
  19360. #endif
  19361. "stm %[r]!, {r3, r4}\n\t"
  19362. "ldm %[b]!, {r5, r6}\n\t"
  19363. "ldm %[a]!, {r3, r4}\n\t"
  19364. #ifdef WOLFSSL_KEIL
  19365. "adcs r3, r3, r5\n\t"
  19366. #elif defined(__clang__)
  19367. "adcs r3, r5\n\t"
  19368. #else
  19369. "adc r3, r5\n\t"
  19370. #endif
  19371. #ifdef WOLFSSL_KEIL
  19372. "adcs r4, r4, r6\n\t"
  19373. #elif defined(__clang__)
  19374. "adcs r4, r6\n\t"
  19375. #else
  19376. "adc r4, r6\n\t"
  19377. #endif
  19378. "stm %[r]!, {r3, r4}\n\t"
  19379. "ldm %[b]!, {r5, r6}\n\t"
  19380. "ldm %[a]!, {r3, r4}\n\t"
  19381. #ifdef WOLFSSL_KEIL
  19382. "adcs r3, r3, r5\n\t"
  19383. #elif defined(__clang__)
  19384. "adcs r3, r5\n\t"
  19385. #else
  19386. "adc r3, r5\n\t"
  19387. #endif
  19388. #ifdef WOLFSSL_KEIL
  19389. "adcs r4, r4, r6\n\t"
  19390. #elif defined(__clang__)
  19391. "adcs r4, r6\n\t"
  19392. #else
  19393. "adc r4, r6\n\t"
  19394. #endif
  19395. "stm %[r]!, {r3, r4}\n\t"
  19396. "ldm %[b]!, {r5, r6}\n\t"
  19397. "ldm %[a]!, {r3, r4}\n\t"
  19398. #ifdef WOLFSSL_KEIL
  19399. "adcs r3, r3, r5\n\t"
  19400. #elif defined(__clang__)
  19401. "adcs r3, r5\n\t"
  19402. #else
  19403. "adc r3, r5\n\t"
  19404. #endif
  19405. #ifdef WOLFSSL_KEIL
  19406. "adcs r4, r4, r6\n\t"
  19407. #elif defined(__clang__)
  19408. "adcs r4, r6\n\t"
  19409. #else
  19410. "adc r4, r6\n\t"
  19411. #endif
  19412. "stm %[r]!, {r3, r4}\n\t"
  19413. "movs %[r], #0\n\t"
  19414. #ifdef WOLFSSL_KEIL
  19415. "adcs %[r], %[r], %[r]\n\t"
  19416. #elif defined(__clang__)
  19417. "adcs %[r], %[r]\n\t"
  19418. #else
  19419. "adc %[r], %[r]\n\t"
  19420. #endif
  19421. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  19422. :
  19423. : "memory", "r3", "r4", "r5", "r6"
  19424. );
  19425. return (uint32_t)(size_t)r;
  19426. }
  19427. /* AND m into each word of a and store in r.
  19428. *
  19429. * r A single precision integer.
  19430. * a A single precision integer.
  19431. * m Mask to AND against each digit.
  19432. */
  19433. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  19434. {
  19435. #ifdef WOLFSSL_SP_SMALL
  19436. int i;
  19437. for (i=0; i<32; i++) {
  19438. r[i] = a[i] & m;
  19439. }
  19440. #else
  19441. int i;
  19442. for (i = 0; i < 32; i += 8) {
  19443. r[i+0] = a[i+0] & m;
  19444. r[i+1] = a[i+1] & m;
  19445. r[i+2] = a[i+2] & m;
  19446. r[i+3] = a[i+3] & m;
  19447. r[i+4] = a[i+4] & m;
  19448. r[i+5] = a[i+5] & m;
  19449. r[i+6] = a[i+6] & m;
  19450. r[i+7] = a[i+7] & m;
  19451. }
  19452. #endif
  19453. }
  19454. /* Multiply a and b into r. (r = a * b)
  19455. *
  19456. * r A single precision integer.
  19457. * a A single precision integer.
  19458. * b A single precision integer.
  19459. */
  19460. SP_NOINLINE static void sp_2048_mul_64(sp_digit* r, const sp_digit* a,
  19461. const sp_digit* b)
  19462. {
  19463. sp_digit* z0 = r;
  19464. sp_digit z1[64];
  19465. sp_digit a1[32];
  19466. sp_digit b1[32];
  19467. sp_digit z2[64];
  19468. sp_digit u;
  19469. sp_digit ca;
  19470. sp_digit cb;
  19471. ca = sp_2048_add_32(a1, a, &a[32]);
  19472. cb = sp_2048_add_32(b1, b, &b[32]);
  19473. u = ca & cb;
  19474. sp_2048_mul_32(z1, a1, b1);
  19475. sp_2048_mul_32(z2, &a[32], &b[32]);
  19476. sp_2048_mul_32(z0, a, b);
  19477. sp_2048_mask_32(r + 64, a1, 0 - cb);
  19478. sp_2048_mask_32(b1, b1, 0 - ca);
  19479. u += sp_2048_add_32(r + 64, r + 64, b1);
  19480. u += sp_2048_sub_in_place_64(z1, z2);
  19481. u += sp_2048_sub_in_place_64(z1, z0);
  19482. u += sp_2048_add_64(r + 32, r + 32, z1);
  19483. u += sp_2048_add_32(r + 64, r + 64, z2);
  19484. (void)sp_2048_add_to_word_32(r + 96, u, z2 + 32);
  19485. }
  19486. /* Double a into r. (r = a + a)
  19487. *
  19488. * r A single precision integer.
  19489. * a A single precision integer.
  19490. */
  19491. SP_NOINLINE static sp_digit sp_2048_dbl_32(sp_digit* r, const sp_digit* a)
  19492. {
  19493. __asm__ __volatile__ (
  19494. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  19495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19496. "adds r2, r2, r2\n\t"
  19497. #else
  19498. "add r2, r2, r2\n\t"
  19499. #endif
  19500. #ifdef WOLFSSL_KEIL
  19501. "adcs r3, r3, r3\n\t"
  19502. #elif defined(__clang__)
  19503. "adcs r3, r3\n\t"
  19504. #else
  19505. "adc r3, r3\n\t"
  19506. #endif
  19507. #ifdef WOLFSSL_KEIL
  19508. "adcs r4, r4, r4\n\t"
  19509. #elif defined(__clang__)
  19510. "adcs r4, r4\n\t"
  19511. #else
  19512. "adc r4, r4\n\t"
  19513. #endif
  19514. #ifdef WOLFSSL_KEIL
  19515. "adcs r5, r5, r5\n\t"
  19516. #elif defined(__clang__)
  19517. "adcs r5, r5\n\t"
  19518. #else
  19519. "adc r5, r5\n\t"
  19520. #endif
  19521. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19522. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  19523. #ifdef WOLFSSL_KEIL
  19524. "adcs r2, r2, r2\n\t"
  19525. #elif defined(__clang__)
  19526. "adcs r2, r2\n\t"
  19527. #else
  19528. "adc r2, r2\n\t"
  19529. #endif
  19530. #ifdef WOLFSSL_KEIL
  19531. "adcs r3, r3, r3\n\t"
  19532. #elif defined(__clang__)
  19533. "adcs r3, r3\n\t"
  19534. #else
  19535. "adc r3, r3\n\t"
  19536. #endif
  19537. #ifdef WOLFSSL_KEIL
  19538. "adcs r4, r4, r4\n\t"
  19539. #elif defined(__clang__)
  19540. "adcs r4, r4\n\t"
  19541. #else
  19542. "adc r4, r4\n\t"
  19543. #endif
  19544. #ifdef WOLFSSL_KEIL
  19545. "adcs r5, r5, r5\n\t"
  19546. #elif defined(__clang__)
  19547. "adcs r5, r5\n\t"
  19548. #else
  19549. "adc r5, r5\n\t"
  19550. #endif
  19551. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19552. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  19553. #ifdef WOLFSSL_KEIL
  19554. "adcs r2, r2, r2\n\t"
  19555. #elif defined(__clang__)
  19556. "adcs r2, r2\n\t"
  19557. #else
  19558. "adc r2, r2\n\t"
  19559. #endif
  19560. #ifdef WOLFSSL_KEIL
  19561. "adcs r3, r3, r3\n\t"
  19562. #elif defined(__clang__)
  19563. "adcs r3, r3\n\t"
  19564. #else
  19565. "adc r3, r3\n\t"
  19566. #endif
  19567. #ifdef WOLFSSL_KEIL
  19568. "adcs r4, r4, r4\n\t"
  19569. #elif defined(__clang__)
  19570. "adcs r4, r4\n\t"
  19571. #else
  19572. "adc r4, r4\n\t"
  19573. #endif
  19574. #ifdef WOLFSSL_KEIL
  19575. "adcs r5, r5, r5\n\t"
  19576. #elif defined(__clang__)
  19577. "adcs r5, r5\n\t"
  19578. #else
  19579. "adc r5, r5\n\t"
  19580. #endif
  19581. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19582. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  19583. #ifdef WOLFSSL_KEIL
  19584. "adcs r2, r2, r2\n\t"
  19585. #elif defined(__clang__)
  19586. "adcs r2, r2\n\t"
  19587. #else
  19588. "adc r2, r2\n\t"
  19589. #endif
  19590. #ifdef WOLFSSL_KEIL
  19591. "adcs r3, r3, r3\n\t"
  19592. #elif defined(__clang__)
  19593. "adcs r3, r3\n\t"
  19594. #else
  19595. "adc r3, r3\n\t"
  19596. #endif
  19597. #ifdef WOLFSSL_KEIL
  19598. "adcs r4, r4, r4\n\t"
  19599. #elif defined(__clang__)
  19600. "adcs r4, r4\n\t"
  19601. #else
  19602. "adc r4, r4\n\t"
  19603. #endif
  19604. #ifdef WOLFSSL_KEIL
  19605. "adcs r5, r5, r5\n\t"
  19606. #elif defined(__clang__)
  19607. "adcs r5, r5\n\t"
  19608. #else
  19609. "adc r5, r5\n\t"
  19610. #endif
  19611. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19612. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  19613. #ifdef WOLFSSL_KEIL
  19614. "adcs r2, r2, r2\n\t"
  19615. #elif defined(__clang__)
  19616. "adcs r2, r2\n\t"
  19617. #else
  19618. "adc r2, r2\n\t"
  19619. #endif
  19620. #ifdef WOLFSSL_KEIL
  19621. "adcs r3, r3, r3\n\t"
  19622. #elif defined(__clang__)
  19623. "adcs r3, r3\n\t"
  19624. #else
  19625. "adc r3, r3\n\t"
  19626. #endif
  19627. #ifdef WOLFSSL_KEIL
  19628. "adcs r4, r4, r4\n\t"
  19629. #elif defined(__clang__)
  19630. "adcs r4, r4\n\t"
  19631. #else
  19632. "adc r4, r4\n\t"
  19633. #endif
  19634. #ifdef WOLFSSL_KEIL
  19635. "adcs r5, r5, r5\n\t"
  19636. #elif defined(__clang__)
  19637. "adcs r5, r5\n\t"
  19638. #else
  19639. "adc r5, r5\n\t"
  19640. #endif
  19641. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19642. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  19643. #ifdef WOLFSSL_KEIL
  19644. "adcs r2, r2, r2\n\t"
  19645. #elif defined(__clang__)
  19646. "adcs r2, r2\n\t"
  19647. #else
  19648. "adc r2, r2\n\t"
  19649. #endif
  19650. #ifdef WOLFSSL_KEIL
  19651. "adcs r3, r3, r3\n\t"
  19652. #elif defined(__clang__)
  19653. "adcs r3, r3\n\t"
  19654. #else
  19655. "adc r3, r3\n\t"
  19656. #endif
  19657. #ifdef WOLFSSL_KEIL
  19658. "adcs r4, r4, r4\n\t"
  19659. #elif defined(__clang__)
  19660. "adcs r4, r4\n\t"
  19661. #else
  19662. "adc r4, r4\n\t"
  19663. #endif
  19664. #ifdef WOLFSSL_KEIL
  19665. "adcs r5, r5, r5\n\t"
  19666. #elif defined(__clang__)
  19667. "adcs r5, r5\n\t"
  19668. #else
  19669. "adc r5, r5\n\t"
  19670. #endif
  19671. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19672. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  19673. #ifdef WOLFSSL_KEIL
  19674. "adcs r2, r2, r2\n\t"
  19675. #elif defined(__clang__)
  19676. "adcs r2, r2\n\t"
  19677. #else
  19678. "adc r2, r2\n\t"
  19679. #endif
  19680. #ifdef WOLFSSL_KEIL
  19681. "adcs r3, r3, r3\n\t"
  19682. #elif defined(__clang__)
  19683. "adcs r3, r3\n\t"
  19684. #else
  19685. "adc r3, r3\n\t"
  19686. #endif
  19687. #ifdef WOLFSSL_KEIL
  19688. "adcs r4, r4, r4\n\t"
  19689. #elif defined(__clang__)
  19690. "adcs r4, r4\n\t"
  19691. #else
  19692. "adc r4, r4\n\t"
  19693. #endif
  19694. #ifdef WOLFSSL_KEIL
  19695. "adcs r5, r5, r5\n\t"
  19696. #elif defined(__clang__)
  19697. "adcs r5, r5\n\t"
  19698. #else
  19699. "adc r5, r5\n\t"
  19700. #endif
  19701. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19702. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  19703. #ifdef WOLFSSL_KEIL
  19704. "adcs r2, r2, r2\n\t"
  19705. #elif defined(__clang__)
  19706. "adcs r2, r2\n\t"
  19707. #else
  19708. "adc r2, r2\n\t"
  19709. #endif
  19710. #ifdef WOLFSSL_KEIL
  19711. "adcs r3, r3, r3\n\t"
  19712. #elif defined(__clang__)
  19713. "adcs r3, r3\n\t"
  19714. #else
  19715. "adc r3, r3\n\t"
  19716. #endif
  19717. #ifdef WOLFSSL_KEIL
  19718. "adcs r4, r4, r4\n\t"
  19719. #elif defined(__clang__)
  19720. "adcs r4, r4\n\t"
  19721. #else
  19722. "adc r4, r4\n\t"
  19723. #endif
  19724. #ifdef WOLFSSL_KEIL
  19725. "adcs r5, r5, r5\n\t"
  19726. #elif defined(__clang__)
  19727. "adcs r5, r5\n\t"
  19728. #else
  19729. "adc r5, r5\n\t"
  19730. #endif
  19731. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19732. "movs %[r], #0\n\t"
  19733. #ifdef WOLFSSL_KEIL
  19734. "adcs %[r], %[r], %[r]\n\t"
  19735. #elif defined(__clang__)
  19736. "adcs %[r], %[r]\n\t"
  19737. #else
  19738. "adc %[r], %[r]\n\t"
  19739. #endif
  19740. : [r] "+r" (r), [a] "+r" (a)
  19741. :
  19742. : "memory", "r2", "r3", "r4", "r5"
  19743. );
  19744. return (uint32_t)(size_t)r;
  19745. }
  19746. /* Square a and put result in r. (r = a * a)
  19747. *
  19748. * r A single precision integer.
  19749. * a A single precision integer.
  19750. */
  19751. SP_NOINLINE static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a)
  19752. {
  19753. sp_digit* z0 = r;
  19754. sp_digit z2[64];
  19755. sp_digit z1[64];
  19756. sp_digit a1[32];
  19757. sp_digit u;
  19758. u = sp_2048_add_32(a1, a, &a[32]);
  19759. sp_2048_sqr_32(z1, a1);
  19760. sp_2048_sqr_32(z2, &a[32]);
  19761. sp_2048_sqr_32(z0, a);
  19762. sp_2048_mask_32(r + 64, a1, 0 - u);
  19763. u += sp_2048_dbl_32(r + 64, r + 64);
  19764. u += sp_2048_sub_in_place_64(z1, z2);
  19765. u += sp_2048_sub_in_place_64(z1, z0);
  19766. u += sp_2048_add_64(r + 32, r + 32, z1);
  19767. u += sp_2048_add_32(r + 64, r + 64, z2);
  19768. (void)sp_2048_add_to_word_32(r + 96, u, z2 + 32);
  19769. }
  19770. #endif /* !WOLFSSL_SP_SMALL */
  19771. #ifdef WOLFSSL_SP_SMALL
  19772. /* Add b to a into r. (r = a + b)
  19773. *
  19774. * r A single precision integer.
  19775. * a A single precision integer.
  19776. * b A single precision integer.
  19777. */
  19778. SP_NOINLINE static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a,
  19779. const sp_digit* b)
  19780. {
  19781. __asm__ __volatile__ (
  19782. "movs r6, %[a]\n\t"
  19783. "movs r7, #0\n\t"
  19784. "movs r3, #0\n\t"
  19785. "movs r4, #0xff\n\t"
  19786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19787. "adds r4, r4, #1\n\t"
  19788. #else
  19789. "add r4, r4, #1\n\t"
  19790. #endif
  19791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19792. "subs r7, r7, #1\n\t"
  19793. #else
  19794. "sub r7, r7, #1\n\t"
  19795. #endif
  19796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19797. "adds r6, r6, r4\n\t"
  19798. #else
  19799. "add r6, r6, r4\n\t"
  19800. #endif
  19801. "\n"
  19802. "L_sp_2048_add_64_word_%=:\n\t"
  19803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19804. "adds r3, r3, r7\n\t"
  19805. #else
  19806. "add r3, r3, r7\n\t"
  19807. #endif
  19808. "ldr r4, [%[a]]\n\t"
  19809. "ldr r5, [%[b]]\n\t"
  19810. #ifdef WOLFSSL_KEIL
  19811. "adcs r4, r4, r5\n\t"
  19812. #elif defined(__clang__)
  19813. "adcs r4, r5\n\t"
  19814. #else
  19815. "adc r4, r5\n\t"
  19816. #endif
  19817. "str r4, [%[r]]\n\t"
  19818. "movs r3, #0\n\t"
  19819. #ifdef WOLFSSL_KEIL
  19820. "adcs r3, r3, r3\n\t"
  19821. #elif defined(__clang__)
  19822. "adcs r3, r3\n\t"
  19823. #else
  19824. "adc r3, r3\n\t"
  19825. #endif
  19826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19827. "adds %[a], %[a], #4\n\t"
  19828. #else
  19829. "add %[a], %[a], #4\n\t"
  19830. #endif
  19831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19832. "adds %[b], %[b], #4\n\t"
  19833. #else
  19834. "add %[b], %[b], #4\n\t"
  19835. #endif
  19836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19837. "adds %[r], %[r], #4\n\t"
  19838. #else
  19839. "add %[r], %[r], #4\n\t"
  19840. #endif
  19841. "cmp %[a], r6\n\t"
  19842. "bne L_sp_2048_add_64_word_%=\n\t"
  19843. "movs %[r], r3\n\t"
  19844. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  19845. :
  19846. : "memory", "r3", "r4", "r5", "r6", "r7"
  19847. );
  19848. return (uint32_t)(size_t)r;
  19849. }
  19850. #endif /* WOLFSSL_SP_SMALL */
  19851. #ifdef WOLFSSL_SP_SMALL
  19852. /* Sub b from a into a. (a -= b)
  19853. *
  19854. * a A single precision integer.
  19855. * b A single precision integer.
  19856. */
  19857. SP_NOINLINE static sp_digit sp_2048_sub_in_place_64(sp_digit* a,
  19858. const sp_digit* b)
  19859. {
  19860. __asm__ __volatile__ (
  19861. "movs r7, %[a]\n\t"
  19862. "movs r2, #0\n\t"
  19863. "movs r5, #0xff\n\t"
  19864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19865. "adds r5, r5, #1\n\t"
  19866. #else
  19867. "add r5, r5, #1\n\t"
  19868. #endif
  19869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19870. "adds r7, r7, r5\n\t"
  19871. #else
  19872. "add r7, r7, r5\n\t"
  19873. #endif
  19874. "\n"
  19875. "L_sp_2048_sub_in_place_64_words_%=:\n\t"
  19876. "movs r5, #0\n\t"
  19877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19878. "subs r5, r5, r2\n\t"
  19879. #else
  19880. "sub r5, r5, r2\n\t"
  19881. #endif
  19882. "ldr r3, [%[a]]\n\t"
  19883. "ldr r4, [%[a], #4]\n\t"
  19884. "ldr r5, [%[b]]\n\t"
  19885. "ldr r6, [%[b], #4]\n\t"
  19886. #ifdef WOLFSSL_KEIL
  19887. "sbcs r3, r3, r5\n\t"
  19888. #elif defined(__clang__)
  19889. "sbcs r3, r5\n\t"
  19890. #else
  19891. "sbc r3, r5\n\t"
  19892. #endif
  19893. #ifdef WOLFSSL_KEIL
  19894. "sbcs r4, r4, r6\n\t"
  19895. #elif defined(__clang__)
  19896. "sbcs r4, r6\n\t"
  19897. #else
  19898. "sbc r4, r6\n\t"
  19899. #endif
  19900. "str r3, [%[a]]\n\t"
  19901. "str r4, [%[a], #4]\n\t"
  19902. #ifdef WOLFSSL_KEIL
  19903. "sbcs r2, r2, r2\n\t"
  19904. #elif defined(__clang__)
  19905. "sbcs r2, r2\n\t"
  19906. #else
  19907. "sbc r2, r2\n\t"
  19908. #endif
  19909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19910. "adds %[a], %[a], #8\n\t"
  19911. #else
  19912. "add %[a], %[a], #8\n\t"
  19913. #endif
  19914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19915. "adds %[b], %[b], #8\n\t"
  19916. #else
  19917. "add %[b], %[b], #8\n\t"
  19918. #endif
  19919. "cmp %[a], r7\n\t"
  19920. "bne L_sp_2048_sub_in_place_64_words_%=\n\t"
  19921. "movs %[a], r2\n\t"
  19922. : [a] "+r" (a), [b] "+r" (b)
  19923. :
  19924. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  19925. );
  19926. return (uint32_t)(size_t)a;
  19927. }
  19928. #endif /* WOLFSSL_SP_SMALL */
  19929. #ifdef WOLFSSL_SP_SMALL
  19930. /* Multiply a and b into r. (r = a * b)
  19931. *
  19932. * r A single precision integer.
  19933. * a A single precision integer.
  19934. * b A single precision integer.
  19935. */
  19936. SP_NOINLINE static void sp_2048_mul_64(sp_digit* r, const sp_digit* a,
  19937. const sp_digit* b)
  19938. {
  19939. sp_digit t[64 * 2];
  19940. sp_digit* tmp = t;
  19941. __asm__ __volatile__ (
  19942. "movs r3, #0\n\t"
  19943. "movs r4, #0\n\t"
  19944. "mov r8, r3\n\t"
  19945. "mov r11, %[tmp]\n\t"
  19946. "mov r9, %[a]\n\t"
  19947. "mov r10, %[b]\n\t"
  19948. "movs r6, #0xff\n\t"
  19949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19950. "adds r6, r6, #1\n\t"
  19951. #else
  19952. "add r6, r6, #1\n\t"
  19953. #endif
  19954. "add r6, r6, r9\n\t"
  19955. "mov r12, r6\n\t"
  19956. "\n"
  19957. "L_sp_2048_mul_64_words_%=:\n\t"
  19958. "movs %[tmp], #0\n\t"
  19959. "movs r5, #0\n\t"
  19960. "movs r6, #0xfc\n\t"
  19961. "mov %[a], r8\n\t"
  19962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19963. "subs %[a], %[a], r6\n\t"
  19964. #else
  19965. "sub %[a], %[a], r6\n\t"
  19966. #endif
  19967. #ifdef WOLFSSL_KEIL
  19968. "sbcs r6, r6, r6\n\t"
  19969. #elif defined(__clang__)
  19970. "sbcs r6, r6\n\t"
  19971. #else
  19972. "sbc r6, r6\n\t"
  19973. #endif
  19974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19975. "mvns r6, r6\n\t"
  19976. #else
  19977. "mvn r6, r6\n\t"
  19978. #endif
  19979. #ifdef WOLFSSL_KEIL
  19980. "ands %[a], %[a], r6\n\t"
  19981. #elif defined(__clang__)
  19982. "ands %[a], r6\n\t"
  19983. #else
  19984. "and %[a], r6\n\t"
  19985. #endif
  19986. "mov %[b], r8\n\t"
  19987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19988. "subs %[b], %[b], %[a]\n\t"
  19989. #else
  19990. "sub %[b], %[b], %[a]\n\t"
  19991. #endif
  19992. "add %[a], %[a], r9\n\t"
  19993. "add %[b], %[b], r10\n\t"
  19994. "\n"
  19995. "L_sp_2048_mul_64_mul_%=:\n\t"
  19996. "# Multiply Start\n\t"
  19997. "ldrh r6, [%[a]]\n\t"
  19998. "ldrh r7, [%[b]]\n\t"
  19999. #ifdef WOLFSSL_KEIL
  20000. "muls r7, r6, r7\n\t"
  20001. #elif defined(__clang__)
  20002. "muls r7, r6\n\t"
  20003. #else
  20004. "mul r7, r6\n\t"
  20005. #endif
  20006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20007. "adds r3, r3, r7\n\t"
  20008. #else
  20009. "add r3, r3, r7\n\t"
  20010. #endif
  20011. #ifdef WOLFSSL_KEIL
  20012. "adcs r4, r4, %[tmp]\n\t"
  20013. #elif defined(__clang__)
  20014. "adcs r4, %[tmp]\n\t"
  20015. #else
  20016. "adc r4, %[tmp]\n\t"
  20017. #endif
  20018. #ifdef WOLFSSL_KEIL
  20019. "adcs r5, r5, %[tmp]\n\t"
  20020. #elif defined(__clang__)
  20021. "adcs r5, %[tmp]\n\t"
  20022. #else
  20023. "adc r5, %[tmp]\n\t"
  20024. #endif
  20025. "ldr r7, [%[b]]\n\t"
  20026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20027. "lsrs r7, r7, #16\n\t"
  20028. #else
  20029. "lsr r7, r7, #16\n\t"
  20030. #endif
  20031. #ifdef WOLFSSL_KEIL
  20032. "muls r6, r7, r6\n\t"
  20033. #elif defined(__clang__)
  20034. "muls r6, r7\n\t"
  20035. #else
  20036. "mul r6, r7\n\t"
  20037. #endif
  20038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20039. "lsrs r7, r6, #16\n\t"
  20040. #else
  20041. "lsr r7, r6, #16\n\t"
  20042. #endif
  20043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20044. "lsls r6, r6, #16\n\t"
  20045. #else
  20046. "lsl r6, r6, #16\n\t"
  20047. #endif
  20048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20049. "adds r3, r3, r6\n\t"
  20050. #else
  20051. "add r3, r3, r6\n\t"
  20052. #endif
  20053. #ifdef WOLFSSL_KEIL
  20054. "adcs r4, r4, r7\n\t"
  20055. #elif defined(__clang__)
  20056. "adcs r4, r7\n\t"
  20057. #else
  20058. "adc r4, r7\n\t"
  20059. #endif
  20060. #ifdef WOLFSSL_KEIL
  20061. "adcs r5, r5, %[tmp]\n\t"
  20062. #elif defined(__clang__)
  20063. "adcs r5, %[tmp]\n\t"
  20064. #else
  20065. "adc r5, %[tmp]\n\t"
  20066. #endif
  20067. "ldr r6, [%[a]]\n\t"
  20068. "ldr r7, [%[b]]\n\t"
  20069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20070. "lsrs r6, r6, #16\n\t"
  20071. #else
  20072. "lsr r6, r6, #16\n\t"
  20073. #endif
  20074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20075. "lsrs r7, r7, #16\n\t"
  20076. #else
  20077. "lsr r7, r7, #16\n\t"
  20078. #endif
  20079. #ifdef WOLFSSL_KEIL
  20080. "muls r7, r6, r7\n\t"
  20081. #elif defined(__clang__)
  20082. "muls r7, r6\n\t"
  20083. #else
  20084. "mul r7, r6\n\t"
  20085. #endif
  20086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20087. "adds r4, r4, r7\n\t"
  20088. #else
  20089. "add r4, r4, r7\n\t"
  20090. #endif
  20091. #ifdef WOLFSSL_KEIL
  20092. "adcs r5, r5, %[tmp]\n\t"
  20093. #elif defined(__clang__)
  20094. "adcs r5, %[tmp]\n\t"
  20095. #else
  20096. "adc r5, %[tmp]\n\t"
  20097. #endif
  20098. "ldrh r7, [%[b]]\n\t"
  20099. #ifdef WOLFSSL_KEIL
  20100. "muls r6, r7, r6\n\t"
  20101. #elif defined(__clang__)
  20102. "muls r6, r7\n\t"
  20103. #else
  20104. "mul r6, r7\n\t"
  20105. #endif
  20106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20107. "lsrs r7, r6, #16\n\t"
  20108. #else
  20109. "lsr r7, r6, #16\n\t"
  20110. #endif
  20111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20112. "lsls r6, r6, #16\n\t"
  20113. #else
  20114. "lsl r6, r6, #16\n\t"
  20115. #endif
  20116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20117. "adds r3, r3, r6\n\t"
  20118. #else
  20119. "add r3, r3, r6\n\t"
  20120. #endif
  20121. #ifdef WOLFSSL_KEIL
  20122. "adcs r4, r4, r7\n\t"
  20123. #elif defined(__clang__)
  20124. "adcs r4, r7\n\t"
  20125. #else
  20126. "adc r4, r7\n\t"
  20127. #endif
  20128. #ifdef WOLFSSL_KEIL
  20129. "adcs r5, r5, %[tmp]\n\t"
  20130. #elif defined(__clang__)
  20131. "adcs r5, %[tmp]\n\t"
  20132. #else
  20133. "adc r5, %[tmp]\n\t"
  20134. #endif
  20135. "# Multiply Done\n\t"
  20136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20137. "adds %[a], %[a], #4\n\t"
  20138. #else
  20139. "add %[a], %[a], #4\n\t"
  20140. #endif
  20141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20142. "subs %[b], %[b], #4\n\t"
  20143. #else
  20144. "sub %[b], %[b], #4\n\t"
  20145. #endif
  20146. "cmp %[a], r12\n\t"
  20147. "beq L_sp_2048_mul_64_done_mul_%=\n\t"
  20148. "mov r6, r8\n\t"
  20149. "add r6, r6, r9\n\t"
  20150. "cmp %[a], r6\n\t"
  20151. "ble L_sp_2048_mul_64_mul_%=\n\t"
  20152. "\n"
  20153. "L_sp_2048_mul_64_done_mul_%=:\n\t"
  20154. "mov %[tmp], r11\n\t"
  20155. "mov r7, r8\n\t"
  20156. "str r3, [%[tmp], r7]\n\t"
  20157. "movs r3, r4\n\t"
  20158. "movs r4, r5\n\t"
  20159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20160. "adds r7, r7, #4\n\t"
  20161. #else
  20162. "add r7, r7, #4\n\t"
  20163. #endif
  20164. "mov r8, r7\n\t"
  20165. "movs r6, #0xff\n\t"
  20166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20167. "adds r6, r6, #0xf9\n\t"
  20168. #else
  20169. "add r6, r6, #0xf9\n\t"
  20170. #endif
  20171. "cmp r7, r6\n\t"
  20172. "ble L_sp_2048_mul_64_words_%=\n\t"
  20173. "str r3, [%[tmp], r7]\n\t"
  20174. "mov %[a], r9\n\t"
  20175. "mov %[b], r10\n\t"
  20176. : [a] "+r" (a), [b] "+r" (b), [tmp] "+r" (tmp)
  20177. :
  20178. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  20179. );
  20180. XMEMCPY(r, t, sizeof(t));
  20181. }
  20182. /* Square a and put result in r. (r = a * a)
  20183. *
  20184. * r A single precision integer.
  20185. * a A single precision integer.
  20186. */
  20187. SP_NOINLINE static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a)
  20188. {
  20189. __asm__ __volatile__ (
  20190. "movs r3, #0\n\t"
  20191. "movs r4, #0\n\t"
  20192. "movs r5, #0\n\t"
  20193. "mov r8, r3\n\t"
  20194. "mov r11, %[r]\n\t"
  20195. "movs r6, #2\n\t"
  20196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20197. "lsls r6, r6, #8\n\t"
  20198. #else
  20199. "lsl r6, r6, #8\n\t"
  20200. #endif
  20201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20202. "negs r6, r6\n\t"
  20203. #else
  20204. "neg r6, r6\n\t"
  20205. #endif
  20206. "add sp, sp, r6\n\t"
  20207. "mov r10, sp\n\t"
  20208. "mov r9, %[a]\n\t"
  20209. "\n"
  20210. "L_sp_2048_sqr_64_words_%=:\n\t"
  20211. "movs %[r], #0\n\t"
  20212. "movs r6, #0xfc\n\t"
  20213. "mov %[a], r8\n\t"
  20214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20215. "subs %[a], %[a], r6\n\t"
  20216. #else
  20217. "sub %[a], %[a], r6\n\t"
  20218. #endif
  20219. #ifdef WOLFSSL_KEIL
  20220. "sbcs r6, r6, r6\n\t"
  20221. #elif defined(__clang__)
  20222. "sbcs r6, r6\n\t"
  20223. #else
  20224. "sbc r6, r6\n\t"
  20225. #endif
  20226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20227. "mvns r6, r6\n\t"
  20228. #else
  20229. "mvn r6, r6\n\t"
  20230. #endif
  20231. #ifdef WOLFSSL_KEIL
  20232. "ands %[a], %[a], r6\n\t"
  20233. #elif defined(__clang__)
  20234. "ands %[a], r6\n\t"
  20235. #else
  20236. "and %[a], r6\n\t"
  20237. #endif
  20238. "mov r2, r8\n\t"
  20239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20240. "subs r2, r2, %[a]\n\t"
  20241. #else
  20242. "sub r2, r2, %[a]\n\t"
  20243. #endif
  20244. "add %[a], %[a], r9\n\t"
  20245. "add r2, r2, r9\n\t"
  20246. "\n"
  20247. "L_sp_2048_sqr_64_mul_%=:\n\t"
  20248. "cmp r2, %[a]\n\t"
  20249. "beq L_sp_2048_sqr_64_sqr_%=\n\t"
  20250. "# Multiply * 2: Start\n\t"
  20251. "ldrh r6, [%[a]]\n\t"
  20252. "ldrh r7, [r2]\n\t"
  20253. #ifdef WOLFSSL_KEIL
  20254. "muls r7, r6, r7\n\t"
  20255. #elif defined(__clang__)
  20256. "muls r7, r6\n\t"
  20257. #else
  20258. "mul r7, r6\n\t"
  20259. #endif
  20260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20261. "adds r3, r3, r7\n\t"
  20262. #else
  20263. "add r3, r3, r7\n\t"
  20264. #endif
  20265. #ifdef WOLFSSL_KEIL
  20266. "adcs r4, r4, %[r]\n\t"
  20267. #elif defined(__clang__)
  20268. "adcs r4, %[r]\n\t"
  20269. #else
  20270. "adc r4, %[r]\n\t"
  20271. #endif
  20272. #ifdef WOLFSSL_KEIL
  20273. "adcs r5, r5, %[r]\n\t"
  20274. #elif defined(__clang__)
  20275. "adcs r5, %[r]\n\t"
  20276. #else
  20277. "adc r5, %[r]\n\t"
  20278. #endif
  20279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20280. "adds r3, r3, r7\n\t"
  20281. #else
  20282. "add r3, r3, r7\n\t"
  20283. #endif
  20284. #ifdef WOLFSSL_KEIL
  20285. "adcs r4, r4, %[r]\n\t"
  20286. #elif defined(__clang__)
  20287. "adcs r4, %[r]\n\t"
  20288. #else
  20289. "adc r4, %[r]\n\t"
  20290. #endif
  20291. #ifdef WOLFSSL_KEIL
  20292. "adcs r5, r5, %[r]\n\t"
  20293. #elif defined(__clang__)
  20294. "adcs r5, %[r]\n\t"
  20295. #else
  20296. "adc r5, %[r]\n\t"
  20297. #endif
  20298. "ldr r7, [r2]\n\t"
  20299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20300. "lsrs r7, r7, #16\n\t"
  20301. #else
  20302. "lsr r7, r7, #16\n\t"
  20303. #endif
  20304. #ifdef WOLFSSL_KEIL
  20305. "muls r6, r7, r6\n\t"
  20306. #elif defined(__clang__)
  20307. "muls r6, r7\n\t"
  20308. #else
  20309. "mul r6, r7\n\t"
  20310. #endif
  20311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20312. "lsrs r7, r6, #16\n\t"
  20313. #else
  20314. "lsr r7, r6, #16\n\t"
  20315. #endif
  20316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20317. "lsls r6, r6, #16\n\t"
  20318. #else
  20319. "lsl r6, r6, #16\n\t"
  20320. #endif
  20321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20322. "adds r3, r3, r6\n\t"
  20323. #else
  20324. "add r3, r3, r6\n\t"
  20325. #endif
  20326. #ifdef WOLFSSL_KEIL
  20327. "adcs r4, r4, r7\n\t"
  20328. #elif defined(__clang__)
  20329. "adcs r4, r7\n\t"
  20330. #else
  20331. "adc r4, r7\n\t"
  20332. #endif
  20333. #ifdef WOLFSSL_KEIL
  20334. "adcs r5, r5, %[r]\n\t"
  20335. #elif defined(__clang__)
  20336. "adcs r5, %[r]\n\t"
  20337. #else
  20338. "adc r5, %[r]\n\t"
  20339. #endif
  20340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20341. "adds r3, r3, r6\n\t"
  20342. #else
  20343. "add r3, r3, r6\n\t"
  20344. #endif
  20345. #ifdef WOLFSSL_KEIL
  20346. "adcs r4, r4, r7\n\t"
  20347. #elif defined(__clang__)
  20348. "adcs r4, r7\n\t"
  20349. #else
  20350. "adc r4, r7\n\t"
  20351. #endif
  20352. #ifdef WOLFSSL_KEIL
  20353. "adcs r5, r5, %[r]\n\t"
  20354. #elif defined(__clang__)
  20355. "adcs r5, %[r]\n\t"
  20356. #else
  20357. "adc r5, %[r]\n\t"
  20358. #endif
  20359. "ldr r6, [%[a]]\n\t"
  20360. "ldr r7, [r2]\n\t"
  20361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20362. "lsrs r6, r6, #16\n\t"
  20363. #else
  20364. "lsr r6, r6, #16\n\t"
  20365. #endif
  20366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20367. "lsrs r7, r7, #16\n\t"
  20368. #else
  20369. "lsr r7, r7, #16\n\t"
  20370. #endif
  20371. #ifdef WOLFSSL_KEIL
  20372. "muls r7, r6, r7\n\t"
  20373. #elif defined(__clang__)
  20374. "muls r7, r6\n\t"
  20375. #else
  20376. "mul r7, r6\n\t"
  20377. #endif
  20378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20379. "adds r4, r4, r7\n\t"
  20380. #else
  20381. "add r4, r4, r7\n\t"
  20382. #endif
  20383. #ifdef WOLFSSL_KEIL
  20384. "adcs r5, r5, %[r]\n\t"
  20385. #elif defined(__clang__)
  20386. "adcs r5, %[r]\n\t"
  20387. #else
  20388. "adc r5, %[r]\n\t"
  20389. #endif
  20390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20391. "adds r4, r4, r7\n\t"
  20392. #else
  20393. "add r4, r4, r7\n\t"
  20394. #endif
  20395. #ifdef WOLFSSL_KEIL
  20396. "adcs r5, r5, %[r]\n\t"
  20397. #elif defined(__clang__)
  20398. "adcs r5, %[r]\n\t"
  20399. #else
  20400. "adc r5, %[r]\n\t"
  20401. #endif
  20402. "ldrh r7, [r2]\n\t"
  20403. #ifdef WOLFSSL_KEIL
  20404. "muls r6, r7, r6\n\t"
  20405. #elif defined(__clang__)
  20406. "muls r6, r7\n\t"
  20407. #else
  20408. "mul r6, r7\n\t"
  20409. #endif
  20410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20411. "lsrs r7, r6, #16\n\t"
  20412. #else
  20413. "lsr r7, r6, #16\n\t"
  20414. #endif
  20415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20416. "lsls r6, r6, #16\n\t"
  20417. #else
  20418. "lsl r6, r6, #16\n\t"
  20419. #endif
  20420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20421. "adds r3, r3, r6\n\t"
  20422. #else
  20423. "add r3, r3, r6\n\t"
  20424. #endif
  20425. #ifdef WOLFSSL_KEIL
  20426. "adcs r4, r4, r7\n\t"
  20427. #elif defined(__clang__)
  20428. "adcs r4, r7\n\t"
  20429. #else
  20430. "adc r4, r7\n\t"
  20431. #endif
  20432. #ifdef WOLFSSL_KEIL
  20433. "adcs r5, r5, %[r]\n\t"
  20434. #elif defined(__clang__)
  20435. "adcs r5, %[r]\n\t"
  20436. #else
  20437. "adc r5, %[r]\n\t"
  20438. #endif
  20439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20440. "adds r3, r3, r6\n\t"
  20441. #else
  20442. "add r3, r3, r6\n\t"
  20443. #endif
  20444. #ifdef WOLFSSL_KEIL
  20445. "adcs r4, r4, r7\n\t"
  20446. #elif defined(__clang__)
  20447. "adcs r4, r7\n\t"
  20448. #else
  20449. "adc r4, r7\n\t"
  20450. #endif
  20451. #ifdef WOLFSSL_KEIL
  20452. "adcs r5, r5, %[r]\n\t"
  20453. #elif defined(__clang__)
  20454. "adcs r5, %[r]\n\t"
  20455. #else
  20456. "adc r5, %[r]\n\t"
  20457. #endif
  20458. "# Multiply * 2: Done\n\t"
  20459. "bal L_sp_2048_sqr_64_done_sqr_%=\n\t"
  20460. "\n"
  20461. "L_sp_2048_sqr_64_sqr_%=:\n\t"
  20462. "mov r12, r2\n\t"
  20463. "ldr r2, [%[a]]\n\t"
  20464. "# Square: Start\n\t"
  20465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20466. "lsrs r7, r2, #16\n\t"
  20467. #else
  20468. "lsr r7, r2, #16\n\t"
  20469. #endif
  20470. "uxth r6, r2\n\t"
  20471. #ifdef WOLFSSL_KEIL
  20472. "muls r6, r6, r6\n\t"
  20473. #elif defined(__clang__)
  20474. "muls r6, r6\n\t"
  20475. #else
  20476. "mul r6, r6\n\t"
  20477. #endif
  20478. #ifdef WOLFSSL_KEIL
  20479. "muls r7, r7, r7\n\t"
  20480. #elif defined(__clang__)
  20481. "muls r7, r7\n\t"
  20482. #else
  20483. "mul r7, r7\n\t"
  20484. #endif
  20485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20486. "adds r3, r3, r6\n\t"
  20487. #else
  20488. "add r3, r3, r6\n\t"
  20489. #endif
  20490. #ifdef WOLFSSL_KEIL
  20491. "adcs r4, r4, r7\n\t"
  20492. #elif defined(__clang__)
  20493. "adcs r4, r7\n\t"
  20494. #else
  20495. "adc r4, r7\n\t"
  20496. #endif
  20497. #ifdef WOLFSSL_KEIL
  20498. "adcs r5, r5, %[r]\n\t"
  20499. #elif defined(__clang__)
  20500. "adcs r5, %[r]\n\t"
  20501. #else
  20502. "adc r5, %[r]\n\t"
  20503. #endif
  20504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20505. "lsrs r7, r2, #16\n\t"
  20506. #else
  20507. "lsr r7, r2, #16\n\t"
  20508. #endif
  20509. "uxth r6, r2\n\t"
  20510. #ifdef WOLFSSL_KEIL
  20511. "muls r6, r7, r6\n\t"
  20512. #elif defined(__clang__)
  20513. "muls r6, r7\n\t"
  20514. #else
  20515. "mul r6, r7\n\t"
  20516. #endif
  20517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20518. "lsrs r7, r6, #15\n\t"
  20519. #else
  20520. "lsr r7, r6, #15\n\t"
  20521. #endif
  20522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20523. "lsls r6, r6, #17\n\t"
  20524. #else
  20525. "lsl r6, r6, #17\n\t"
  20526. #endif
  20527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20528. "adds r3, r3, r6\n\t"
  20529. #else
  20530. "add r3, r3, r6\n\t"
  20531. #endif
  20532. #ifdef WOLFSSL_KEIL
  20533. "adcs r4, r4, r7\n\t"
  20534. #elif defined(__clang__)
  20535. "adcs r4, r7\n\t"
  20536. #else
  20537. "adc r4, r7\n\t"
  20538. #endif
  20539. #ifdef WOLFSSL_KEIL
  20540. "adcs r5, r5, %[r]\n\t"
  20541. #elif defined(__clang__)
  20542. "adcs r5, %[r]\n\t"
  20543. #else
  20544. "adc r5, %[r]\n\t"
  20545. #endif
  20546. "# Square: Done\n\t"
  20547. "mov r2, r12\n\t"
  20548. "\n"
  20549. "L_sp_2048_sqr_64_done_sqr_%=:\n\t"
  20550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20551. "adds %[a], %[a], #4\n\t"
  20552. #else
  20553. "add %[a], %[a], #4\n\t"
  20554. #endif
  20555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20556. "subs r2, r2, #4\n\t"
  20557. #else
  20558. "sub r2, r2, #4\n\t"
  20559. #endif
  20560. "movs r6, #0xff\n\t"
  20561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20562. "adds r6, r6, #1\n\t"
  20563. #else
  20564. "add r6, r6, #1\n\t"
  20565. #endif
  20566. "add r6, r6, r9\n\t"
  20567. "cmp %[a], r6\n\t"
  20568. "beq L_sp_2048_sqr_64_done_mul_%=\n\t"
  20569. "cmp %[a], r2\n\t"
  20570. "bgt L_sp_2048_sqr_64_done_mul_%=\n\t"
  20571. "mov r7, r8\n\t"
  20572. "add r7, r7, r9\n\t"
  20573. "cmp %[a], r7\n\t"
  20574. "ble L_sp_2048_sqr_64_mul_%=\n\t"
  20575. "\n"
  20576. "L_sp_2048_sqr_64_done_mul_%=:\n\t"
  20577. "mov %[r], r10\n\t"
  20578. "mov r7, r8\n\t"
  20579. "str r3, [%[r], r7]\n\t"
  20580. "movs r3, r4\n\t"
  20581. "movs r4, r5\n\t"
  20582. "movs r5, #0\n\t"
  20583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20584. "adds r7, r7, #4\n\t"
  20585. #else
  20586. "add r7, r7, #4\n\t"
  20587. #endif
  20588. "mov r8, r7\n\t"
  20589. "movs r6, #0xff\n\t"
  20590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20591. "adds r6, r6, #0xf9\n\t"
  20592. #else
  20593. "add r6, r6, #0xf9\n\t"
  20594. #endif
  20595. "cmp r7, r6\n\t"
  20596. "ble L_sp_2048_sqr_64_words_%=\n\t"
  20597. "mov %[a], r9\n\t"
  20598. "str r3, [%[r], r7]\n\t"
  20599. "mov %[r], r11\n\t"
  20600. "mov %[a], r10\n\t"
  20601. "movs r3, #0xff\n\t"
  20602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20603. "adds r3, r3, #0xfd\n\t"
  20604. #else
  20605. "add r3, r3, #0xfd\n\t"
  20606. #endif
  20607. "\n"
  20608. "L_sp_2048_sqr_64_store_%=:\n\t"
  20609. "ldr r6, [%[a], r3]\n\t"
  20610. "str r6, [%[r], r3]\n\t"
  20611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20612. "subs r3, r3, #4\n\t"
  20613. #else
  20614. "sub r3, r3, #4\n\t"
  20615. #endif
  20616. "bge L_sp_2048_sqr_64_store_%=\n\t"
  20617. "movs r6, #2\n\t"
  20618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20619. "lsls r6, r6, #8\n\t"
  20620. #else
  20621. "lsl r6, r6, #8\n\t"
  20622. #endif
  20623. "add sp, sp, r6\n\t"
  20624. : [r] "+r" (r), [a] "+r" (a)
  20625. :
  20626. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  20627. );
  20628. }
  20629. #endif /* WOLFSSL_SP_SMALL */
  20630. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  20631. #ifdef WOLFSSL_SP_SMALL
  20632. /* AND m into each word of a and store in r.
  20633. *
  20634. * r A single precision integer.
  20635. * a A single precision integer.
  20636. * m Mask to AND against each digit.
  20637. */
  20638. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  20639. {
  20640. int i;
  20641. for (i=0; i<32; i++) {
  20642. r[i] = a[i] & m;
  20643. }
  20644. }
  20645. #endif /* WOLFSSL_SP_SMALL */
  20646. #ifdef WOLFSSL_SP_SMALL
  20647. /* Add b to a into r. (r = a + b)
  20648. *
  20649. * r A single precision integer.
  20650. * a A single precision integer.
  20651. * b A single precision integer.
  20652. */
  20653. SP_NOINLINE static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
  20654. const sp_digit* b)
  20655. {
  20656. __asm__ __volatile__ (
  20657. "movs r6, %[a]\n\t"
  20658. "movs r7, #0\n\t"
  20659. "movs r3, #0\n\t"
  20660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20661. "adds r6, r6, #0x80\n\t"
  20662. #else
  20663. "add r6, r6, #0x80\n\t"
  20664. #endif
  20665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20666. "subs r7, r7, #1\n\t"
  20667. #else
  20668. "sub r7, r7, #1\n\t"
  20669. #endif
  20670. "\n"
  20671. "L_sp_2048_add_32_word_%=:\n\t"
  20672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20673. "adds r3, r3, r7\n\t"
  20674. #else
  20675. "add r3, r3, r7\n\t"
  20676. #endif
  20677. "ldr r4, [%[a]]\n\t"
  20678. "ldr r5, [%[b]]\n\t"
  20679. #ifdef WOLFSSL_KEIL
  20680. "adcs r4, r4, r5\n\t"
  20681. #elif defined(__clang__)
  20682. "adcs r4, r5\n\t"
  20683. #else
  20684. "adc r4, r5\n\t"
  20685. #endif
  20686. "str r4, [%[r]]\n\t"
  20687. "movs r3, #0\n\t"
  20688. #ifdef WOLFSSL_KEIL
  20689. "adcs r3, r3, r3\n\t"
  20690. #elif defined(__clang__)
  20691. "adcs r3, r3\n\t"
  20692. #else
  20693. "adc r3, r3\n\t"
  20694. #endif
  20695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20696. "adds %[a], %[a], #4\n\t"
  20697. #else
  20698. "add %[a], %[a], #4\n\t"
  20699. #endif
  20700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20701. "adds %[b], %[b], #4\n\t"
  20702. #else
  20703. "add %[b], %[b], #4\n\t"
  20704. #endif
  20705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20706. "adds %[r], %[r], #4\n\t"
  20707. #else
  20708. "add %[r], %[r], #4\n\t"
  20709. #endif
  20710. "cmp %[a], r6\n\t"
  20711. "bne L_sp_2048_add_32_word_%=\n\t"
  20712. "movs %[r], r3\n\t"
  20713. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  20714. :
  20715. : "memory", "r3", "r4", "r5", "r6", "r7"
  20716. );
  20717. return (uint32_t)(size_t)r;
  20718. }
  20719. #endif /* WOLFSSL_SP_SMALL */
  20720. #ifdef WOLFSSL_SP_SMALL
  20721. /* Sub b from a into a. (a -= b)
  20722. *
  20723. * a A single precision integer.
  20724. * b A single precision integer.
  20725. */
  20726. SP_NOINLINE static sp_digit sp_2048_sub_in_place_32(sp_digit* a,
  20727. const sp_digit* b)
  20728. {
  20729. __asm__ __volatile__ (
  20730. "movs r7, %[a]\n\t"
  20731. "movs r2, #0\n\t"
  20732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20733. "adds r7, r7, #0x80\n\t"
  20734. #else
  20735. "add r7, r7, #0x80\n\t"
  20736. #endif
  20737. "\n"
  20738. "L_sp_2048_sub_in_place_32_words_%=:\n\t"
  20739. "movs r5, #0\n\t"
  20740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20741. "subs r5, r5, r2\n\t"
  20742. #else
  20743. "sub r5, r5, r2\n\t"
  20744. #endif
  20745. "ldr r3, [%[a]]\n\t"
  20746. "ldr r4, [%[a], #4]\n\t"
  20747. "ldr r5, [%[b]]\n\t"
  20748. "ldr r6, [%[b], #4]\n\t"
  20749. #ifdef WOLFSSL_KEIL
  20750. "sbcs r3, r3, r5\n\t"
  20751. #elif defined(__clang__)
  20752. "sbcs r3, r5\n\t"
  20753. #else
  20754. "sbc r3, r5\n\t"
  20755. #endif
  20756. #ifdef WOLFSSL_KEIL
  20757. "sbcs r4, r4, r6\n\t"
  20758. #elif defined(__clang__)
  20759. "sbcs r4, r6\n\t"
  20760. #else
  20761. "sbc r4, r6\n\t"
  20762. #endif
  20763. "str r3, [%[a]]\n\t"
  20764. "str r4, [%[a], #4]\n\t"
  20765. #ifdef WOLFSSL_KEIL
  20766. "sbcs r2, r2, r2\n\t"
  20767. #elif defined(__clang__)
  20768. "sbcs r2, r2\n\t"
  20769. #else
  20770. "sbc r2, r2\n\t"
  20771. #endif
  20772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20773. "adds %[a], %[a], #8\n\t"
  20774. #else
  20775. "add %[a], %[a], #8\n\t"
  20776. #endif
  20777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20778. "adds %[b], %[b], #8\n\t"
  20779. #else
  20780. "add %[b], %[b], #8\n\t"
  20781. #endif
  20782. "cmp %[a], r7\n\t"
  20783. "bne L_sp_2048_sub_in_place_32_words_%=\n\t"
  20784. "movs %[a], r2\n\t"
  20785. : [a] "+r" (a), [b] "+r" (b)
  20786. :
  20787. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  20788. );
  20789. return (uint32_t)(size_t)a;
  20790. }
  20791. #endif /* WOLFSSL_SP_SMALL */
  20792. #ifdef WOLFSSL_SP_SMALL
  20793. /* Multiply a and b into r. (r = a * b)
  20794. *
  20795. * r A single precision integer.
  20796. * a A single precision integer.
  20797. * b A single precision integer.
  20798. */
  20799. SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
  20800. const sp_digit* b)
  20801. {
  20802. sp_digit t[32 * 2];
  20803. sp_digit* tmp = t;
  20804. __asm__ __volatile__ (
  20805. "movs r3, #0\n\t"
  20806. "movs r4, #0\n\t"
  20807. "mov r8, r3\n\t"
  20808. "mov r11, %[tmp]\n\t"
  20809. "mov r9, %[a]\n\t"
  20810. "mov r10, %[b]\n\t"
  20811. "movs r6, #0x80\n\t"
  20812. "add r6, r6, r9\n\t"
  20813. "mov r12, r6\n\t"
  20814. "\n"
  20815. "L_sp_2048_mul_32_words_%=:\n\t"
  20816. "movs %[tmp], #0\n\t"
  20817. "movs r5, #0\n\t"
  20818. "movs r6, #0x7c\n\t"
  20819. "mov %[a], r8\n\t"
  20820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20821. "subs %[a], %[a], r6\n\t"
  20822. #else
  20823. "sub %[a], %[a], r6\n\t"
  20824. #endif
  20825. #ifdef WOLFSSL_KEIL
  20826. "sbcs r6, r6, r6\n\t"
  20827. #elif defined(__clang__)
  20828. "sbcs r6, r6\n\t"
  20829. #else
  20830. "sbc r6, r6\n\t"
  20831. #endif
  20832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20833. "mvns r6, r6\n\t"
  20834. #else
  20835. "mvn r6, r6\n\t"
  20836. #endif
  20837. #ifdef WOLFSSL_KEIL
  20838. "ands %[a], %[a], r6\n\t"
  20839. #elif defined(__clang__)
  20840. "ands %[a], r6\n\t"
  20841. #else
  20842. "and %[a], r6\n\t"
  20843. #endif
  20844. "mov %[b], r8\n\t"
  20845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20846. "subs %[b], %[b], %[a]\n\t"
  20847. #else
  20848. "sub %[b], %[b], %[a]\n\t"
  20849. #endif
  20850. "add %[a], %[a], r9\n\t"
  20851. "add %[b], %[b], r10\n\t"
  20852. "\n"
  20853. "L_sp_2048_mul_32_mul_%=:\n\t"
  20854. "# Multiply Start\n\t"
  20855. "ldrh r6, [%[a]]\n\t"
  20856. "ldrh r7, [%[b]]\n\t"
  20857. #ifdef WOLFSSL_KEIL
  20858. "muls r7, r6, r7\n\t"
  20859. #elif defined(__clang__)
  20860. "muls r7, r6\n\t"
  20861. #else
  20862. "mul r7, r6\n\t"
  20863. #endif
  20864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20865. "adds r3, r3, r7\n\t"
  20866. #else
  20867. "add r3, r3, r7\n\t"
  20868. #endif
  20869. #ifdef WOLFSSL_KEIL
  20870. "adcs r4, r4, %[tmp]\n\t"
  20871. #elif defined(__clang__)
  20872. "adcs r4, %[tmp]\n\t"
  20873. #else
  20874. "adc r4, %[tmp]\n\t"
  20875. #endif
  20876. #ifdef WOLFSSL_KEIL
  20877. "adcs r5, r5, %[tmp]\n\t"
  20878. #elif defined(__clang__)
  20879. "adcs r5, %[tmp]\n\t"
  20880. #else
  20881. "adc r5, %[tmp]\n\t"
  20882. #endif
  20883. "ldr r7, [%[b]]\n\t"
  20884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20885. "lsrs r7, r7, #16\n\t"
  20886. #else
  20887. "lsr r7, r7, #16\n\t"
  20888. #endif
  20889. #ifdef WOLFSSL_KEIL
  20890. "muls r6, r7, r6\n\t"
  20891. #elif defined(__clang__)
  20892. "muls r6, r7\n\t"
  20893. #else
  20894. "mul r6, r7\n\t"
  20895. #endif
  20896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20897. "lsrs r7, r6, #16\n\t"
  20898. #else
  20899. "lsr r7, r6, #16\n\t"
  20900. #endif
  20901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20902. "lsls r6, r6, #16\n\t"
  20903. #else
  20904. "lsl r6, r6, #16\n\t"
  20905. #endif
  20906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20907. "adds r3, r3, r6\n\t"
  20908. #else
  20909. "add r3, r3, r6\n\t"
  20910. #endif
  20911. #ifdef WOLFSSL_KEIL
  20912. "adcs r4, r4, r7\n\t"
  20913. #elif defined(__clang__)
  20914. "adcs r4, r7\n\t"
  20915. #else
  20916. "adc r4, r7\n\t"
  20917. #endif
  20918. #ifdef WOLFSSL_KEIL
  20919. "adcs r5, r5, %[tmp]\n\t"
  20920. #elif defined(__clang__)
  20921. "adcs r5, %[tmp]\n\t"
  20922. #else
  20923. "adc r5, %[tmp]\n\t"
  20924. #endif
  20925. "ldr r6, [%[a]]\n\t"
  20926. "ldr r7, [%[b]]\n\t"
  20927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20928. "lsrs r6, r6, #16\n\t"
  20929. #else
  20930. "lsr r6, r6, #16\n\t"
  20931. #endif
  20932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20933. "lsrs r7, r7, #16\n\t"
  20934. #else
  20935. "lsr r7, r7, #16\n\t"
  20936. #endif
  20937. #ifdef WOLFSSL_KEIL
  20938. "muls r7, r6, r7\n\t"
  20939. #elif defined(__clang__)
  20940. "muls r7, r6\n\t"
  20941. #else
  20942. "mul r7, r6\n\t"
  20943. #endif
  20944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20945. "adds r4, r4, r7\n\t"
  20946. #else
  20947. "add r4, r4, r7\n\t"
  20948. #endif
  20949. #ifdef WOLFSSL_KEIL
  20950. "adcs r5, r5, %[tmp]\n\t"
  20951. #elif defined(__clang__)
  20952. "adcs r5, %[tmp]\n\t"
  20953. #else
  20954. "adc r5, %[tmp]\n\t"
  20955. #endif
  20956. "ldrh r7, [%[b]]\n\t"
  20957. #ifdef WOLFSSL_KEIL
  20958. "muls r6, r7, r6\n\t"
  20959. #elif defined(__clang__)
  20960. "muls r6, r7\n\t"
  20961. #else
  20962. "mul r6, r7\n\t"
  20963. #endif
  20964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20965. "lsrs r7, r6, #16\n\t"
  20966. #else
  20967. "lsr r7, r6, #16\n\t"
  20968. #endif
  20969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20970. "lsls r6, r6, #16\n\t"
  20971. #else
  20972. "lsl r6, r6, #16\n\t"
  20973. #endif
  20974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20975. "adds r3, r3, r6\n\t"
  20976. #else
  20977. "add r3, r3, r6\n\t"
  20978. #endif
  20979. #ifdef WOLFSSL_KEIL
  20980. "adcs r4, r4, r7\n\t"
  20981. #elif defined(__clang__)
  20982. "adcs r4, r7\n\t"
  20983. #else
  20984. "adc r4, r7\n\t"
  20985. #endif
  20986. #ifdef WOLFSSL_KEIL
  20987. "adcs r5, r5, %[tmp]\n\t"
  20988. #elif defined(__clang__)
  20989. "adcs r5, %[tmp]\n\t"
  20990. #else
  20991. "adc r5, %[tmp]\n\t"
  20992. #endif
  20993. "# Multiply Done\n\t"
  20994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20995. "adds %[a], %[a], #4\n\t"
  20996. #else
  20997. "add %[a], %[a], #4\n\t"
  20998. #endif
  20999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21000. "subs %[b], %[b], #4\n\t"
  21001. #else
  21002. "sub %[b], %[b], #4\n\t"
  21003. #endif
  21004. "cmp %[a], r12\n\t"
  21005. "beq L_sp_2048_mul_32_done_mul_%=\n\t"
  21006. "mov r6, r8\n\t"
  21007. "add r6, r6, r9\n\t"
  21008. "cmp %[a], r6\n\t"
  21009. "ble L_sp_2048_mul_32_mul_%=\n\t"
  21010. "\n"
  21011. "L_sp_2048_mul_32_done_mul_%=:\n\t"
  21012. "mov %[tmp], r11\n\t"
  21013. "mov r7, r8\n\t"
  21014. "str r3, [%[tmp], r7]\n\t"
  21015. "movs r3, r4\n\t"
  21016. "movs r4, r5\n\t"
  21017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21018. "adds r7, r7, #4\n\t"
  21019. #else
  21020. "add r7, r7, #4\n\t"
  21021. #endif
  21022. "mov r8, r7\n\t"
  21023. "movs r6, #0xf8\n\t"
  21024. "cmp r7, r6\n\t"
  21025. "ble L_sp_2048_mul_32_words_%=\n\t"
  21026. "str r3, [%[tmp], r7]\n\t"
  21027. "mov %[a], r9\n\t"
  21028. "mov %[b], r10\n\t"
  21029. : [a] "+r" (a), [b] "+r" (b), [tmp] "+r" (tmp)
  21030. :
  21031. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  21032. );
  21033. XMEMCPY(r, t, sizeof(t));
  21034. }
  21035. /* Square a and put result in r. (r = a * a)
  21036. *
  21037. * r A single precision integer.
  21038. * a A single precision integer.
  21039. */
  21040. SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
  21041. {
  21042. __asm__ __volatile__ (
  21043. "movs r3, #0\n\t"
  21044. "movs r4, #0\n\t"
  21045. "movs r5, #0\n\t"
  21046. "mov r8, r3\n\t"
  21047. "mov r11, %[r]\n\t"
  21048. "movs r6, #0xff\n\t"
  21049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21050. "adds r6, r6, #1\n\t"
  21051. #else
  21052. "add r6, r6, #1\n\t"
  21053. #endif
  21054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21055. "negs r6, r6\n\t"
  21056. #else
  21057. "neg r6, r6\n\t"
  21058. #endif
  21059. "add sp, sp, r6\n\t"
  21060. "mov r10, sp\n\t"
  21061. "mov r9, %[a]\n\t"
  21062. "\n"
  21063. "L_sp_2048_sqr_32_words_%=:\n\t"
  21064. "movs %[r], #0\n\t"
  21065. "movs r6, #0x7c\n\t"
  21066. "mov %[a], r8\n\t"
  21067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21068. "subs %[a], %[a], r6\n\t"
  21069. #else
  21070. "sub %[a], %[a], r6\n\t"
  21071. #endif
  21072. #ifdef WOLFSSL_KEIL
  21073. "sbcs r6, r6, r6\n\t"
  21074. #elif defined(__clang__)
  21075. "sbcs r6, r6\n\t"
  21076. #else
  21077. "sbc r6, r6\n\t"
  21078. #endif
  21079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21080. "mvns r6, r6\n\t"
  21081. #else
  21082. "mvn r6, r6\n\t"
  21083. #endif
  21084. #ifdef WOLFSSL_KEIL
  21085. "ands %[a], %[a], r6\n\t"
  21086. #elif defined(__clang__)
  21087. "ands %[a], r6\n\t"
  21088. #else
  21089. "and %[a], r6\n\t"
  21090. #endif
  21091. "mov r2, r8\n\t"
  21092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21093. "subs r2, r2, %[a]\n\t"
  21094. #else
  21095. "sub r2, r2, %[a]\n\t"
  21096. #endif
  21097. "add %[a], %[a], r9\n\t"
  21098. "add r2, r2, r9\n\t"
  21099. "\n"
  21100. "L_sp_2048_sqr_32_mul_%=:\n\t"
  21101. "cmp r2, %[a]\n\t"
  21102. "beq L_sp_2048_sqr_32_sqr_%=\n\t"
  21103. "# Multiply * 2: Start\n\t"
  21104. "ldrh r6, [%[a]]\n\t"
  21105. "ldrh r7, [r2]\n\t"
  21106. #ifdef WOLFSSL_KEIL
  21107. "muls r7, r6, r7\n\t"
  21108. #elif defined(__clang__)
  21109. "muls r7, r6\n\t"
  21110. #else
  21111. "mul r7, r6\n\t"
  21112. #endif
  21113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21114. "adds r3, r3, r7\n\t"
  21115. #else
  21116. "add r3, r3, r7\n\t"
  21117. #endif
  21118. #ifdef WOLFSSL_KEIL
  21119. "adcs r4, r4, %[r]\n\t"
  21120. #elif defined(__clang__)
  21121. "adcs r4, %[r]\n\t"
  21122. #else
  21123. "adc r4, %[r]\n\t"
  21124. #endif
  21125. #ifdef WOLFSSL_KEIL
  21126. "adcs r5, r5, %[r]\n\t"
  21127. #elif defined(__clang__)
  21128. "adcs r5, %[r]\n\t"
  21129. #else
  21130. "adc r5, %[r]\n\t"
  21131. #endif
  21132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21133. "adds r3, r3, r7\n\t"
  21134. #else
  21135. "add r3, r3, r7\n\t"
  21136. #endif
  21137. #ifdef WOLFSSL_KEIL
  21138. "adcs r4, r4, %[r]\n\t"
  21139. #elif defined(__clang__)
  21140. "adcs r4, %[r]\n\t"
  21141. #else
  21142. "adc r4, %[r]\n\t"
  21143. #endif
  21144. #ifdef WOLFSSL_KEIL
  21145. "adcs r5, r5, %[r]\n\t"
  21146. #elif defined(__clang__)
  21147. "adcs r5, %[r]\n\t"
  21148. #else
  21149. "adc r5, %[r]\n\t"
  21150. #endif
  21151. "ldr r7, [r2]\n\t"
  21152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21153. "lsrs r7, r7, #16\n\t"
  21154. #else
  21155. "lsr r7, r7, #16\n\t"
  21156. #endif
  21157. #ifdef WOLFSSL_KEIL
  21158. "muls r6, r7, r6\n\t"
  21159. #elif defined(__clang__)
  21160. "muls r6, r7\n\t"
  21161. #else
  21162. "mul r6, r7\n\t"
  21163. #endif
  21164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21165. "lsrs r7, r6, #16\n\t"
  21166. #else
  21167. "lsr r7, r6, #16\n\t"
  21168. #endif
  21169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21170. "lsls r6, r6, #16\n\t"
  21171. #else
  21172. "lsl r6, r6, #16\n\t"
  21173. #endif
  21174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21175. "adds r3, r3, r6\n\t"
  21176. #else
  21177. "add r3, r3, r6\n\t"
  21178. #endif
  21179. #ifdef WOLFSSL_KEIL
  21180. "adcs r4, r4, r7\n\t"
  21181. #elif defined(__clang__)
  21182. "adcs r4, r7\n\t"
  21183. #else
  21184. "adc r4, r7\n\t"
  21185. #endif
  21186. #ifdef WOLFSSL_KEIL
  21187. "adcs r5, r5, %[r]\n\t"
  21188. #elif defined(__clang__)
  21189. "adcs r5, %[r]\n\t"
  21190. #else
  21191. "adc r5, %[r]\n\t"
  21192. #endif
  21193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21194. "adds r3, r3, r6\n\t"
  21195. #else
  21196. "add r3, r3, r6\n\t"
  21197. #endif
  21198. #ifdef WOLFSSL_KEIL
  21199. "adcs r4, r4, r7\n\t"
  21200. #elif defined(__clang__)
  21201. "adcs r4, r7\n\t"
  21202. #else
  21203. "adc r4, r7\n\t"
  21204. #endif
  21205. #ifdef WOLFSSL_KEIL
  21206. "adcs r5, r5, %[r]\n\t"
  21207. #elif defined(__clang__)
  21208. "adcs r5, %[r]\n\t"
  21209. #else
  21210. "adc r5, %[r]\n\t"
  21211. #endif
  21212. "ldr r6, [%[a]]\n\t"
  21213. "ldr r7, [r2]\n\t"
  21214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21215. "lsrs r6, r6, #16\n\t"
  21216. #else
  21217. "lsr r6, r6, #16\n\t"
  21218. #endif
  21219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21220. "lsrs r7, r7, #16\n\t"
  21221. #else
  21222. "lsr r7, r7, #16\n\t"
  21223. #endif
  21224. #ifdef WOLFSSL_KEIL
  21225. "muls r7, r6, r7\n\t"
  21226. #elif defined(__clang__)
  21227. "muls r7, r6\n\t"
  21228. #else
  21229. "mul r7, r6\n\t"
  21230. #endif
  21231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21232. "adds r4, r4, r7\n\t"
  21233. #else
  21234. "add r4, r4, r7\n\t"
  21235. #endif
  21236. #ifdef WOLFSSL_KEIL
  21237. "adcs r5, r5, %[r]\n\t"
  21238. #elif defined(__clang__)
  21239. "adcs r5, %[r]\n\t"
  21240. #else
  21241. "adc r5, %[r]\n\t"
  21242. #endif
  21243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21244. "adds r4, r4, r7\n\t"
  21245. #else
  21246. "add r4, r4, r7\n\t"
  21247. #endif
  21248. #ifdef WOLFSSL_KEIL
  21249. "adcs r5, r5, %[r]\n\t"
  21250. #elif defined(__clang__)
  21251. "adcs r5, %[r]\n\t"
  21252. #else
  21253. "adc r5, %[r]\n\t"
  21254. #endif
  21255. "ldrh r7, [r2]\n\t"
  21256. #ifdef WOLFSSL_KEIL
  21257. "muls r6, r7, r6\n\t"
  21258. #elif defined(__clang__)
  21259. "muls r6, r7\n\t"
  21260. #else
  21261. "mul r6, r7\n\t"
  21262. #endif
  21263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21264. "lsrs r7, r6, #16\n\t"
  21265. #else
  21266. "lsr r7, r6, #16\n\t"
  21267. #endif
  21268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21269. "lsls r6, r6, #16\n\t"
  21270. #else
  21271. "lsl r6, r6, #16\n\t"
  21272. #endif
  21273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21274. "adds r3, r3, r6\n\t"
  21275. #else
  21276. "add r3, r3, r6\n\t"
  21277. #endif
  21278. #ifdef WOLFSSL_KEIL
  21279. "adcs r4, r4, r7\n\t"
  21280. #elif defined(__clang__)
  21281. "adcs r4, r7\n\t"
  21282. #else
  21283. "adc r4, r7\n\t"
  21284. #endif
  21285. #ifdef WOLFSSL_KEIL
  21286. "adcs r5, r5, %[r]\n\t"
  21287. #elif defined(__clang__)
  21288. "adcs r5, %[r]\n\t"
  21289. #else
  21290. "adc r5, %[r]\n\t"
  21291. #endif
  21292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21293. "adds r3, r3, r6\n\t"
  21294. #else
  21295. "add r3, r3, r6\n\t"
  21296. #endif
  21297. #ifdef WOLFSSL_KEIL
  21298. "adcs r4, r4, r7\n\t"
  21299. #elif defined(__clang__)
  21300. "adcs r4, r7\n\t"
  21301. #else
  21302. "adc r4, r7\n\t"
  21303. #endif
  21304. #ifdef WOLFSSL_KEIL
  21305. "adcs r5, r5, %[r]\n\t"
  21306. #elif defined(__clang__)
  21307. "adcs r5, %[r]\n\t"
  21308. #else
  21309. "adc r5, %[r]\n\t"
  21310. #endif
  21311. "# Multiply * 2: Done\n\t"
  21312. "bal L_sp_2048_sqr_32_done_sqr_%=\n\t"
  21313. "\n"
  21314. "L_sp_2048_sqr_32_sqr_%=:\n\t"
  21315. "mov r12, r2\n\t"
  21316. "ldr r2, [%[a]]\n\t"
  21317. "# Square: Start\n\t"
  21318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21319. "lsrs r7, r2, #16\n\t"
  21320. #else
  21321. "lsr r7, r2, #16\n\t"
  21322. #endif
  21323. "uxth r6, r2\n\t"
  21324. #ifdef WOLFSSL_KEIL
  21325. "muls r6, r6, r6\n\t"
  21326. #elif defined(__clang__)
  21327. "muls r6, r6\n\t"
  21328. #else
  21329. "mul r6, r6\n\t"
  21330. #endif
  21331. #ifdef WOLFSSL_KEIL
  21332. "muls r7, r7, r7\n\t"
  21333. #elif defined(__clang__)
  21334. "muls r7, r7\n\t"
  21335. #else
  21336. "mul r7, r7\n\t"
  21337. #endif
  21338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21339. "adds r3, r3, r6\n\t"
  21340. #else
  21341. "add r3, r3, r6\n\t"
  21342. #endif
  21343. #ifdef WOLFSSL_KEIL
  21344. "adcs r4, r4, r7\n\t"
  21345. #elif defined(__clang__)
  21346. "adcs r4, r7\n\t"
  21347. #else
  21348. "adc r4, r7\n\t"
  21349. #endif
  21350. #ifdef WOLFSSL_KEIL
  21351. "adcs r5, r5, %[r]\n\t"
  21352. #elif defined(__clang__)
  21353. "adcs r5, %[r]\n\t"
  21354. #else
  21355. "adc r5, %[r]\n\t"
  21356. #endif
  21357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21358. "lsrs r7, r2, #16\n\t"
  21359. #else
  21360. "lsr r7, r2, #16\n\t"
  21361. #endif
  21362. "uxth r6, r2\n\t"
  21363. #ifdef WOLFSSL_KEIL
  21364. "muls r6, r7, r6\n\t"
  21365. #elif defined(__clang__)
  21366. "muls r6, r7\n\t"
  21367. #else
  21368. "mul r6, r7\n\t"
  21369. #endif
  21370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21371. "lsrs r7, r6, #15\n\t"
  21372. #else
  21373. "lsr r7, r6, #15\n\t"
  21374. #endif
  21375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21376. "lsls r6, r6, #17\n\t"
  21377. #else
  21378. "lsl r6, r6, #17\n\t"
  21379. #endif
  21380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21381. "adds r3, r3, r6\n\t"
  21382. #else
  21383. "add r3, r3, r6\n\t"
  21384. #endif
  21385. #ifdef WOLFSSL_KEIL
  21386. "adcs r4, r4, r7\n\t"
  21387. #elif defined(__clang__)
  21388. "adcs r4, r7\n\t"
  21389. #else
  21390. "adc r4, r7\n\t"
  21391. #endif
  21392. #ifdef WOLFSSL_KEIL
  21393. "adcs r5, r5, %[r]\n\t"
  21394. #elif defined(__clang__)
  21395. "adcs r5, %[r]\n\t"
  21396. #else
  21397. "adc r5, %[r]\n\t"
  21398. #endif
  21399. "# Square: Done\n\t"
  21400. "mov r2, r12\n\t"
  21401. "\n"
  21402. "L_sp_2048_sqr_32_done_sqr_%=:\n\t"
  21403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21404. "adds %[a], %[a], #4\n\t"
  21405. #else
  21406. "add %[a], %[a], #4\n\t"
  21407. #endif
  21408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21409. "subs r2, r2, #4\n\t"
  21410. #else
  21411. "sub r2, r2, #4\n\t"
  21412. #endif
  21413. "movs r6, #0x80\n\t"
  21414. "add r6, r6, r9\n\t"
  21415. "cmp %[a], r6\n\t"
  21416. "beq L_sp_2048_sqr_32_done_mul_%=\n\t"
  21417. "cmp %[a], r2\n\t"
  21418. "bgt L_sp_2048_sqr_32_done_mul_%=\n\t"
  21419. "mov r7, r8\n\t"
  21420. "add r7, r7, r9\n\t"
  21421. "cmp %[a], r7\n\t"
  21422. "ble L_sp_2048_sqr_32_mul_%=\n\t"
  21423. "\n"
  21424. "L_sp_2048_sqr_32_done_mul_%=:\n\t"
  21425. "mov %[r], r10\n\t"
  21426. "mov r7, r8\n\t"
  21427. "str r3, [%[r], r7]\n\t"
  21428. "movs r3, r4\n\t"
  21429. "movs r4, r5\n\t"
  21430. "movs r5, #0\n\t"
  21431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21432. "adds r7, r7, #4\n\t"
  21433. #else
  21434. "add r7, r7, #4\n\t"
  21435. #endif
  21436. "mov r8, r7\n\t"
  21437. "movs r6, #0xf8\n\t"
  21438. "cmp r7, r6\n\t"
  21439. "ble L_sp_2048_sqr_32_words_%=\n\t"
  21440. "mov %[a], r9\n\t"
  21441. "str r3, [%[r], r7]\n\t"
  21442. "mov %[r], r11\n\t"
  21443. "mov %[a], r10\n\t"
  21444. "movs r3, #0xfc\n\t"
  21445. "\n"
  21446. "L_sp_2048_sqr_32_store_%=:\n\t"
  21447. "ldr r6, [%[a], r3]\n\t"
  21448. "str r6, [%[r], r3]\n\t"
  21449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21450. "subs r3, r3, #4\n\t"
  21451. #else
  21452. "sub r3, r3, #4\n\t"
  21453. #endif
  21454. "bge L_sp_2048_sqr_32_store_%=\n\t"
  21455. "movs r6, #0xff\n\t"
  21456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21457. "adds r6, r6, #1\n\t"
  21458. #else
  21459. "add r6, r6, #1\n\t"
  21460. #endif
  21461. "add sp, sp, r6\n\t"
  21462. : [r] "+r" (r), [a] "+r" (a)
  21463. :
  21464. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  21465. );
  21466. }
  21467. #endif /* WOLFSSL_SP_SMALL */
  21468. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  21469. /* Caclulate the bottom digit of -1/a mod 2^n.
  21470. *
  21471. * a A single precision number.
  21472. * rho Bottom word of inverse.
  21473. */
  21474. static void sp_2048_mont_setup(const sp_digit* a, sp_digit* rho)
  21475. {
  21476. sp_digit x;
  21477. sp_digit b;
  21478. b = a[0];
  21479. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  21480. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  21481. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  21482. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  21483. /* rho = -1/m mod b */
  21484. *rho = (sp_digit)0 - x;
  21485. }
  21486. /* Mul a by digit b into r. (r = a * b)
  21487. *
  21488. * r A single precision integer.
  21489. * a A single precision integer.
  21490. * b A single precision digit.
  21491. */
  21492. SP_NOINLINE static void sp_2048_mul_d_64(sp_digit* r, const sp_digit* a,
  21493. sp_digit b)
  21494. {
  21495. __asm__ __volatile__ (
  21496. "movs r6, #0xff\n\t"
  21497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21498. "adds r6, r6, #1\n\t"
  21499. #else
  21500. "add r6, r6, #1\n\t"
  21501. #endif
  21502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21503. "adds r6, r6, %[a]\n\t"
  21504. #else
  21505. "add r6, r6, %[a]\n\t"
  21506. #endif
  21507. "mov r8, %[r]\n\t"
  21508. "mov r9, r6\n\t"
  21509. "movs r3, #0\n\t"
  21510. "movs r4, #0\n\t"
  21511. "\n"
  21512. "L_sp_2048_mul_d_64_%=:\n\t"
  21513. "movs %[r], #0\n\t"
  21514. "movs r5, #0\n\t"
  21515. "# A[] * B\n\t"
  21516. "ldrh r6, [%[a]]\n\t"
  21517. "uxth r7, %[b]\n\t"
  21518. #ifdef WOLFSSL_KEIL
  21519. "muls r7, r6, r7\n\t"
  21520. #elif defined(__clang__)
  21521. "muls r7, r6\n\t"
  21522. #else
  21523. "mul r7, r6\n\t"
  21524. #endif
  21525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21526. "adds r3, r3, r7\n\t"
  21527. #else
  21528. "add r3, r3, r7\n\t"
  21529. #endif
  21530. #ifdef WOLFSSL_KEIL
  21531. "adcs r4, r4, %[r]\n\t"
  21532. #elif defined(__clang__)
  21533. "adcs r4, %[r]\n\t"
  21534. #else
  21535. "adc r4, %[r]\n\t"
  21536. #endif
  21537. #ifdef WOLFSSL_KEIL
  21538. "adcs r5, r5, %[r]\n\t"
  21539. #elif defined(__clang__)
  21540. "adcs r5, %[r]\n\t"
  21541. #else
  21542. "adc r5, %[r]\n\t"
  21543. #endif
  21544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21545. "lsrs r7, %[b], #16\n\t"
  21546. #else
  21547. "lsr r7, %[b], #16\n\t"
  21548. #endif
  21549. #ifdef WOLFSSL_KEIL
  21550. "muls r6, r7, r6\n\t"
  21551. #elif defined(__clang__)
  21552. "muls r6, r7\n\t"
  21553. #else
  21554. "mul r6, r7\n\t"
  21555. #endif
  21556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21557. "lsrs r7, r6, #16\n\t"
  21558. #else
  21559. "lsr r7, r6, #16\n\t"
  21560. #endif
  21561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21562. "lsls r6, r6, #16\n\t"
  21563. #else
  21564. "lsl r6, r6, #16\n\t"
  21565. #endif
  21566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21567. "adds r3, r3, r6\n\t"
  21568. #else
  21569. "add r3, r3, r6\n\t"
  21570. #endif
  21571. #ifdef WOLFSSL_KEIL
  21572. "adcs r4, r4, r7\n\t"
  21573. #elif defined(__clang__)
  21574. "adcs r4, r7\n\t"
  21575. #else
  21576. "adc r4, r7\n\t"
  21577. #endif
  21578. #ifdef WOLFSSL_KEIL
  21579. "adcs r5, r5, %[r]\n\t"
  21580. #elif defined(__clang__)
  21581. "adcs r5, %[r]\n\t"
  21582. #else
  21583. "adc r5, %[r]\n\t"
  21584. #endif
  21585. "ldr r6, [%[a]]\n\t"
  21586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21587. "lsrs r6, r6, #16\n\t"
  21588. #else
  21589. "lsr r6, r6, #16\n\t"
  21590. #endif
  21591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21592. "lsrs r7, %[b], #16\n\t"
  21593. #else
  21594. "lsr r7, %[b], #16\n\t"
  21595. #endif
  21596. #ifdef WOLFSSL_KEIL
  21597. "muls r7, r6, r7\n\t"
  21598. #elif defined(__clang__)
  21599. "muls r7, r6\n\t"
  21600. #else
  21601. "mul r7, r6\n\t"
  21602. #endif
  21603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21604. "adds r4, r4, r7\n\t"
  21605. #else
  21606. "add r4, r4, r7\n\t"
  21607. #endif
  21608. #ifdef WOLFSSL_KEIL
  21609. "adcs r5, r5, %[r]\n\t"
  21610. #elif defined(__clang__)
  21611. "adcs r5, %[r]\n\t"
  21612. #else
  21613. "adc r5, %[r]\n\t"
  21614. #endif
  21615. "uxth r7, %[b]\n\t"
  21616. #ifdef WOLFSSL_KEIL
  21617. "muls r6, r7, r6\n\t"
  21618. #elif defined(__clang__)
  21619. "muls r6, r7\n\t"
  21620. #else
  21621. "mul r6, r7\n\t"
  21622. #endif
  21623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21624. "lsrs r7, r6, #16\n\t"
  21625. #else
  21626. "lsr r7, r6, #16\n\t"
  21627. #endif
  21628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21629. "lsls r6, r6, #16\n\t"
  21630. #else
  21631. "lsl r6, r6, #16\n\t"
  21632. #endif
  21633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21634. "adds r3, r3, r6\n\t"
  21635. #else
  21636. "add r3, r3, r6\n\t"
  21637. #endif
  21638. #ifdef WOLFSSL_KEIL
  21639. "adcs r4, r4, r7\n\t"
  21640. #elif defined(__clang__)
  21641. "adcs r4, r7\n\t"
  21642. #else
  21643. "adc r4, r7\n\t"
  21644. #endif
  21645. #ifdef WOLFSSL_KEIL
  21646. "adcs r5, r5, %[r]\n\t"
  21647. #elif defined(__clang__)
  21648. "adcs r5, %[r]\n\t"
  21649. #else
  21650. "adc r5, %[r]\n\t"
  21651. #endif
  21652. "# A[] * B - Done\n\t"
  21653. "mov %[r], r8\n\t"
  21654. "str r3, [%[r]]\n\t"
  21655. "movs r3, r4\n\t"
  21656. "movs r4, r5\n\t"
  21657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21658. "adds %[r], %[r], #4\n\t"
  21659. #else
  21660. "add %[r], %[r], #4\n\t"
  21661. #endif
  21662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21663. "adds %[a], %[a], #4\n\t"
  21664. #else
  21665. "add %[a], %[a], #4\n\t"
  21666. #endif
  21667. "mov r8, %[r]\n\t"
  21668. "cmp %[a], r9\n\t"
  21669. "blt L_sp_2048_mul_d_64_%=\n\t"
  21670. "str r3, [%[r]]\n\t"
  21671. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  21672. :
  21673. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  21674. );
  21675. }
  21676. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  21677. /* r = 2^n mod m where n is the number of bits to reduce by.
  21678. * Given m must be 2048 bits, just need to subtract.
  21679. *
  21680. * r A single precision number.
  21681. * m A single precision number.
  21682. */
  21683. static void sp_2048_mont_norm_32(sp_digit* r, const sp_digit* m)
  21684. {
  21685. XMEMSET(r, 0, sizeof(sp_digit) * 32);
  21686. /* r = 2^n mod m */
  21687. sp_2048_sub_in_place_32(r, m);
  21688. }
  21689. /* Conditionally subtract b from a using the mask m.
  21690. * m is -1 to subtract and 0 when not copying.
  21691. *
  21692. * r A single precision number representing condition subtract result.
  21693. * a A single precision number to subtract from.
  21694. * b A single precision number to subtract.
  21695. * m Mask value to apply.
  21696. */
  21697. SP_NOINLINE static sp_digit sp_2048_cond_sub_32(sp_digit* r, const sp_digit* a,
  21698. const sp_digit* b, sp_digit m)
  21699. {
  21700. __asm__ __volatile__ (
  21701. "movs r4, #0\n\t"
  21702. "movs r5, #0x80\n\t"
  21703. "mov r8, r5\n\t"
  21704. "movs r7, #0\n\t"
  21705. "\n"
  21706. "L_sp_2048_cond_sub_32_words_%=:\n\t"
  21707. "ldr r6, [%[b], r7]\n\t"
  21708. #ifdef WOLFSSL_KEIL
  21709. "ands r6, r6, %[m]\n\t"
  21710. #elif defined(__clang__)
  21711. "ands r6, %[m]\n\t"
  21712. #else
  21713. "and r6, %[m]\n\t"
  21714. #endif
  21715. "movs r5, #0\n\t"
  21716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21717. "subs r5, r5, r4\n\t"
  21718. #else
  21719. "sub r5, r5, r4\n\t"
  21720. #endif
  21721. "ldr r5, [%[a], r7]\n\t"
  21722. #ifdef WOLFSSL_KEIL
  21723. "sbcs r5, r5, r6\n\t"
  21724. #elif defined(__clang__)
  21725. "sbcs r5, r6\n\t"
  21726. #else
  21727. "sbc r5, r6\n\t"
  21728. #endif
  21729. #ifdef WOLFSSL_KEIL
  21730. "sbcs r4, r4, r4\n\t"
  21731. #elif defined(__clang__)
  21732. "sbcs r4, r4\n\t"
  21733. #else
  21734. "sbc r4, r4\n\t"
  21735. #endif
  21736. "str r5, [%[r], r7]\n\t"
  21737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21738. "adds r7, r7, #4\n\t"
  21739. #else
  21740. "add r7, r7, #4\n\t"
  21741. #endif
  21742. "cmp r7, r8\n\t"
  21743. "blt L_sp_2048_cond_sub_32_words_%=\n\t"
  21744. "movs %[r], r4\n\t"
  21745. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  21746. :
  21747. : "memory", "r4", "r5", "r6", "r7", "r8"
  21748. );
  21749. return (uint32_t)(size_t)r;
  21750. }
  21751. /* Reduce the number back to 2048 bits using Montgomery reduction.
  21752. *
  21753. * a A single precision number to reduce in place.
  21754. * m The single precision number representing the modulus.
  21755. * mp The digit representing the negative inverse of m mod 2^n.
  21756. */
  21757. SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, const sp_digit* m,
  21758. sp_digit mp)
  21759. {
  21760. __asm__ __volatile__ (
  21761. "movs r7, #0\n\t"
  21762. "mov r8, %[mp]\n\t"
  21763. "mov r12, r7\n\t"
  21764. "mov lr, %[m]\n\t"
  21765. "mov r9, %[a]\n\t"
  21766. "mov r11, %[a]\n\t"
  21767. "movs r5, #0x7c\n\t"
  21768. "movs r6, #0x80\n\t"
  21769. "add r9, r9, r5\n\t"
  21770. "add r11, r11, r6\n\t"
  21771. "\n"
  21772. "L_sp_2048_mont_reduce_32_mod_%=:\n\t"
  21773. "movs r7, #0\n\t"
  21774. "movs r4, #0\n\t"
  21775. "# a[i] += m[0] * mu\n\t"
  21776. "ldm %[m]!, {%[mp]}\n\t"
  21777. "ldm %[a]!, {r3}\n\t"
  21778. "# mu = a[i] * mp\n\t"
  21779. "mov r5, r8\n\t"
  21780. #ifdef WOLFSSL_KEIL
  21781. "muls r5, r3, r5\n\t"
  21782. #elif defined(__clang__)
  21783. "muls r5, r3\n\t"
  21784. #else
  21785. "mul r5, r3\n\t"
  21786. #endif
  21787. "mov r10, r5\n\t"
  21788. "# Multiply m[0] and mu - Start\n\t"
  21789. "mov r5, r10\n\t"
  21790. "uxth r6, %[mp]\n\t"
  21791. "uxth r5, r5\n\t"
  21792. #ifdef WOLFSSL_KEIL
  21793. "muls r6, r5, r6\n\t"
  21794. #elif defined(__clang__)
  21795. "muls r6, r5\n\t"
  21796. #else
  21797. "mul r6, r5\n\t"
  21798. #endif
  21799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21800. "adds r3, r3, r6\n\t"
  21801. #else
  21802. "add r3, r3, r6\n\t"
  21803. #endif
  21804. #ifdef WOLFSSL_KEIL
  21805. "adcs r4, r4, r7\n\t"
  21806. #elif defined(__clang__)
  21807. "adcs r4, r7\n\t"
  21808. #else
  21809. "adc r4, r7\n\t"
  21810. #endif
  21811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21812. "lsrs r6, %[mp], #16\n\t"
  21813. #else
  21814. "lsr r6, %[mp], #16\n\t"
  21815. #endif
  21816. #ifdef WOLFSSL_KEIL
  21817. "muls r5, r6, r5\n\t"
  21818. #elif defined(__clang__)
  21819. "muls r5, r6\n\t"
  21820. #else
  21821. "mul r5, r6\n\t"
  21822. #endif
  21823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21824. "lsrs r6, r5, #16\n\t"
  21825. #else
  21826. "lsr r6, r5, #16\n\t"
  21827. #endif
  21828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21829. "lsls r5, r5, #16\n\t"
  21830. #else
  21831. "lsl r5, r5, #16\n\t"
  21832. #endif
  21833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21834. "adds r3, r3, r5\n\t"
  21835. #else
  21836. "add r3, r3, r5\n\t"
  21837. #endif
  21838. #ifdef WOLFSSL_KEIL
  21839. "adcs r4, r4, r6\n\t"
  21840. #elif defined(__clang__)
  21841. "adcs r4, r6\n\t"
  21842. #else
  21843. "adc r4, r6\n\t"
  21844. #endif
  21845. "mov r5, r10\n\t"
  21846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21847. "lsrs r6, %[mp], #16\n\t"
  21848. #else
  21849. "lsr r6, %[mp], #16\n\t"
  21850. #endif
  21851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21852. "lsrs r5, r5, #16\n\t"
  21853. #else
  21854. "lsr r5, r5, #16\n\t"
  21855. #endif
  21856. #ifdef WOLFSSL_KEIL
  21857. "muls r6, r5, r6\n\t"
  21858. #elif defined(__clang__)
  21859. "muls r6, r5\n\t"
  21860. #else
  21861. "mul r6, r5\n\t"
  21862. #endif
  21863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21864. "adds r4, r4, r6\n\t"
  21865. #else
  21866. "add r4, r4, r6\n\t"
  21867. #endif
  21868. "uxth r6, %[mp]\n\t"
  21869. #ifdef WOLFSSL_KEIL
  21870. "muls r5, r6, r5\n\t"
  21871. #elif defined(__clang__)
  21872. "muls r5, r6\n\t"
  21873. #else
  21874. "mul r5, r6\n\t"
  21875. #endif
  21876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21877. "lsrs r6, r5, #16\n\t"
  21878. #else
  21879. "lsr r6, r5, #16\n\t"
  21880. #endif
  21881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21882. "lsls r5, r5, #16\n\t"
  21883. #else
  21884. "lsl r5, r5, #16\n\t"
  21885. #endif
  21886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21887. "adds r3, r3, r5\n\t"
  21888. #else
  21889. "add r3, r3, r5\n\t"
  21890. #endif
  21891. #ifdef WOLFSSL_KEIL
  21892. "adcs r4, r4, r6\n\t"
  21893. #elif defined(__clang__)
  21894. "adcs r4, r6\n\t"
  21895. #else
  21896. "adc r4, r6\n\t"
  21897. #endif
  21898. "# Multiply m[0] and mu - Done\n\t"
  21899. "\n"
  21900. "L_sp_2048_mont_reduce_32_word_%=:\n\t"
  21901. "# a[i+j] += m[j] * mu\n\t"
  21902. "ldr r3, [%[a]]\n\t"
  21903. "ldm %[m]!, {%[mp]}\n\t"
  21904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21905. "adds r3, r3, r4\n\t"
  21906. #else
  21907. "add r3, r3, r4\n\t"
  21908. #endif
  21909. "movs r4, #0\n\t"
  21910. #ifdef WOLFSSL_KEIL
  21911. "adcs r4, r4, r7\n\t"
  21912. #elif defined(__clang__)
  21913. "adcs r4, r7\n\t"
  21914. #else
  21915. "adc r4, r7\n\t"
  21916. #endif
  21917. "# Multiply m[j] and mu - Start\n\t"
  21918. "mov r5, r10\n\t"
  21919. "uxth r6, %[mp]\n\t"
  21920. "uxth r5, r5\n\t"
  21921. #ifdef WOLFSSL_KEIL
  21922. "muls r6, r5, r6\n\t"
  21923. #elif defined(__clang__)
  21924. "muls r6, r5\n\t"
  21925. #else
  21926. "mul r6, r5\n\t"
  21927. #endif
  21928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21929. "adds r3, r3, r6\n\t"
  21930. #else
  21931. "add r3, r3, r6\n\t"
  21932. #endif
  21933. #ifdef WOLFSSL_KEIL
  21934. "adcs r4, r4, r7\n\t"
  21935. #elif defined(__clang__)
  21936. "adcs r4, r7\n\t"
  21937. #else
  21938. "adc r4, r7\n\t"
  21939. #endif
  21940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21941. "lsrs r6, %[mp], #16\n\t"
  21942. #else
  21943. "lsr r6, %[mp], #16\n\t"
  21944. #endif
  21945. #ifdef WOLFSSL_KEIL
  21946. "muls r5, r6, r5\n\t"
  21947. #elif defined(__clang__)
  21948. "muls r5, r6\n\t"
  21949. #else
  21950. "mul r5, r6\n\t"
  21951. #endif
  21952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21953. "lsrs r6, r5, #16\n\t"
  21954. #else
  21955. "lsr r6, r5, #16\n\t"
  21956. #endif
  21957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21958. "lsls r5, r5, #16\n\t"
  21959. #else
  21960. "lsl r5, r5, #16\n\t"
  21961. #endif
  21962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21963. "adds r3, r3, r5\n\t"
  21964. #else
  21965. "add r3, r3, r5\n\t"
  21966. #endif
  21967. #ifdef WOLFSSL_KEIL
  21968. "adcs r4, r4, r6\n\t"
  21969. #elif defined(__clang__)
  21970. "adcs r4, r6\n\t"
  21971. #else
  21972. "adc r4, r6\n\t"
  21973. #endif
  21974. "mov r5, r10\n\t"
  21975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21976. "lsrs r6, %[mp], #16\n\t"
  21977. #else
  21978. "lsr r6, %[mp], #16\n\t"
  21979. #endif
  21980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21981. "lsrs r5, r5, #16\n\t"
  21982. #else
  21983. "lsr r5, r5, #16\n\t"
  21984. #endif
  21985. #ifdef WOLFSSL_KEIL
  21986. "muls r6, r5, r6\n\t"
  21987. #elif defined(__clang__)
  21988. "muls r6, r5\n\t"
  21989. #else
  21990. "mul r6, r5\n\t"
  21991. #endif
  21992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21993. "adds r4, r4, r6\n\t"
  21994. #else
  21995. "add r4, r4, r6\n\t"
  21996. #endif
  21997. "uxth r6, %[mp]\n\t"
  21998. #ifdef WOLFSSL_KEIL
  21999. "muls r5, r6, r5\n\t"
  22000. #elif defined(__clang__)
  22001. "muls r5, r6\n\t"
  22002. #else
  22003. "mul r5, r6\n\t"
  22004. #endif
  22005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22006. "lsrs r6, r5, #16\n\t"
  22007. #else
  22008. "lsr r6, r5, #16\n\t"
  22009. #endif
  22010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22011. "lsls r5, r5, #16\n\t"
  22012. #else
  22013. "lsl r5, r5, #16\n\t"
  22014. #endif
  22015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22016. "adds r3, r3, r5\n\t"
  22017. #else
  22018. "add r3, r3, r5\n\t"
  22019. #endif
  22020. #ifdef WOLFSSL_KEIL
  22021. "adcs r4, r4, r6\n\t"
  22022. #elif defined(__clang__)
  22023. "adcs r4, r6\n\t"
  22024. #else
  22025. "adc r4, r6\n\t"
  22026. #endif
  22027. "# Multiply m[j] and mu - Done\n\t"
  22028. "stm %[a]!, {r3}\n\t"
  22029. "cmp %[a], r9\n\t"
  22030. "blt L_sp_2048_mont_reduce_32_word_%=\n\t"
  22031. "# a[i+31] += m[31] * mu\n\t"
  22032. "ldr %[mp], [%[m]]\n\t"
  22033. "mov r3, r12\n\t"
  22034. "# Multiply m[31] and mu - Start\n\t"
  22035. "mov r5, r10\n\t"
  22036. "uxth r6, %[mp]\n\t"
  22037. "uxth r5, r5\n\t"
  22038. #ifdef WOLFSSL_KEIL
  22039. "muls r6, r5, r6\n\t"
  22040. #elif defined(__clang__)
  22041. "muls r6, r5\n\t"
  22042. #else
  22043. "mul r6, r5\n\t"
  22044. #endif
  22045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22046. "adds r4, r4, r6\n\t"
  22047. #else
  22048. "add r4, r4, r6\n\t"
  22049. #endif
  22050. #ifdef WOLFSSL_KEIL
  22051. "adcs r3, r3, r7\n\t"
  22052. #elif defined(__clang__)
  22053. "adcs r3, r7\n\t"
  22054. #else
  22055. "adc r3, r7\n\t"
  22056. #endif
  22057. #ifdef WOLFSSL_KEIL
  22058. "adcs r7, r7, r7\n\t"
  22059. #elif defined(__clang__)
  22060. "adcs r7, r7\n\t"
  22061. #else
  22062. "adc r7, r7\n\t"
  22063. #endif
  22064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22065. "lsrs r6, %[mp], #16\n\t"
  22066. #else
  22067. "lsr r6, %[mp], #16\n\t"
  22068. #endif
  22069. #ifdef WOLFSSL_KEIL
  22070. "muls r5, r6, r5\n\t"
  22071. #elif defined(__clang__)
  22072. "muls r5, r6\n\t"
  22073. #else
  22074. "mul r5, r6\n\t"
  22075. #endif
  22076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22077. "lsrs r6, r5, #16\n\t"
  22078. #else
  22079. "lsr r6, r5, #16\n\t"
  22080. #endif
  22081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22082. "lsls r5, r5, #16\n\t"
  22083. #else
  22084. "lsl r5, r5, #16\n\t"
  22085. #endif
  22086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22087. "adds r4, r4, r5\n\t"
  22088. #else
  22089. "add r4, r4, r5\n\t"
  22090. #endif
  22091. #ifdef WOLFSSL_KEIL
  22092. "adcs r3, r3, r6\n\t"
  22093. #elif defined(__clang__)
  22094. "adcs r3, r6\n\t"
  22095. #else
  22096. "adc r3, r6\n\t"
  22097. #endif
  22098. #ifdef WOLFSSL_KEIL
  22099. "adcs r7, r7, r7\n\t"
  22100. #elif defined(__clang__)
  22101. "adcs r7, r7\n\t"
  22102. #else
  22103. "adc r7, r7\n\t"
  22104. #endif
  22105. "mov r5, r10\n\t"
  22106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22107. "lsrs r6, %[mp], #16\n\t"
  22108. #else
  22109. "lsr r6, %[mp], #16\n\t"
  22110. #endif
  22111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22112. "lsrs r5, r5, #16\n\t"
  22113. #else
  22114. "lsr r5, r5, #16\n\t"
  22115. #endif
  22116. #ifdef WOLFSSL_KEIL
  22117. "muls r6, r5, r6\n\t"
  22118. #elif defined(__clang__)
  22119. "muls r6, r5\n\t"
  22120. #else
  22121. "mul r6, r5\n\t"
  22122. #endif
  22123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22124. "adds r3, r3, r6\n\t"
  22125. #else
  22126. "add r3, r3, r6\n\t"
  22127. #endif
  22128. #ifdef WOLFSSL_KEIL
  22129. "adcs r7, r7, r7\n\t"
  22130. #elif defined(__clang__)
  22131. "adcs r7, r7\n\t"
  22132. #else
  22133. "adc r7, r7\n\t"
  22134. #endif
  22135. "uxth r6, %[mp]\n\t"
  22136. #ifdef WOLFSSL_KEIL
  22137. "muls r5, r6, r5\n\t"
  22138. #elif defined(__clang__)
  22139. "muls r5, r6\n\t"
  22140. #else
  22141. "mul r5, r6\n\t"
  22142. #endif
  22143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22144. "lsrs r6, r5, #16\n\t"
  22145. #else
  22146. "lsr r6, r5, #16\n\t"
  22147. #endif
  22148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22149. "lsls r5, r5, #16\n\t"
  22150. #else
  22151. "lsl r5, r5, #16\n\t"
  22152. #endif
  22153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22154. "adds r4, r4, r5\n\t"
  22155. #else
  22156. "add r4, r4, r5\n\t"
  22157. #endif
  22158. #ifdef WOLFSSL_KEIL
  22159. "adcs r3, r3, r6\n\t"
  22160. #elif defined(__clang__)
  22161. "adcs r3, r6\n\t"
  22162. #else
  22163. "adc r3, r6\n\t"
  22164. #endif
  22165. #ifdef WOLFSSL_KEIL
  22166. "adcs r7, r7, r7\n\t"
  22167. #elif defined(__clang__)
  22168. "adcs r7, r7\n\t"
  22169. #else
  22170. "adc r7, r7\n\t"
  22171. #endif
  22172. "# Multiply m[31] and mu - Done\n\t"
  22173. "ldr r5, [%[a]]\n\t"
  22174. "ldr r6, [%[a], #4]\n\t"
  22175. "movs %[mp], #0\n\t"
  22176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22177. "adds r5, r5, r4\n\t"
  22178. #else
  22179. "add r5, r5, r4\n\t"
  22180. #endif
  22181. #ifdef WOLFSSL_KEIL
  22182. "adcs r6, r6, r3\n\t"
  22183. #elif defined(__clang__)
  22184. "adcs r6, r3\n\t"
  22185. #else
  22186. "adc r6, r3\n\t"
  22187. #endif
  22188. #ifdef WOLFSSL_KEIL
  22189. "adcs r7, r7, %[mp]\n\t"
  22190. #elif defined(__clang__)
  22191. "adcs r7, %[mp]\n\t"
  22192. #else
  22193. "adc r7, %[mp]\n\t"
  22194. #endif
  22195. "stm %[a]!, {r5, r6}\n\t"
  22196. "# i += 1\n\t"
  22197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22198. "subs %[a], %[a], #4\n\t"
  22199. #else
  22200. "sub %[a], %[a], #4\n\t"
  22201. #endif
  22202. "movs r3, #0x7c\n\t"
  22203. "mov r9, %[a]\n\t"
  22204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22205. "subs %[a], %[a], r3\n\t"
  22206. #else
  22207. "sub %[a], %[a], r3\n\t"
  22208. #endif
  22209. "mov r12, r7\n\t"
  22210. "mov %[m], lr\n\t"
  22211. "cmp r11, %[a]\n\t"
  22212. "bgt L_sp_2048_mont_reduce_32_mod_%=\n\t"
  22213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22214. "negs r7, r7\n\t"
  22215. #else
  22216. "neg r7, r7\n\t"
  22217. #endif
  22218. "# Subtract masked modulus\n\t"
  22219. "movs r4, #0x80\n\t"
  22220. "movs %[mp], #0\n\t"
  22221. "movs r3, #0\n\t"
  22222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22223. "subs %[a], %[a], r4\n\t"
  22224. #else
  22225. "sub %[a], %[a], r4\n\t"
  22226. #endif
  22227. #ifndef WOLFSSL_SP_LARGE_CODE
  22228. "\n"
  22229. "L_sp_2048_mont_reduce_32_sub_mask_%=:\n\t"
  22230. "ldm %[m]!, {r6}\n\t"
  22231. "movs r5, #0\n\t"
  22232. #ifdef WOLFSSL_KEIL
  22233. "ands r6, r6, r7\n\t"
  22234. #elif defined(__clang__)
  22235. "ands r6, r7\n\t"
  22236. #else
  22237. "and r6, r7\n\t"
  22238. #endif
  22239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22240. "subs r5, r5, %[mp]\n\t"
  22241. #else
  22242. "sub r5, r5, %[mp]\n\t"
  22243. #endif
  22244. "ldr r5, [%[a], r4]\n\t"
  22245. #ifdef WOLFSSL_KEIL
  22246. "sbcs r5, r5, r6\n\t"
  22247. #elif defined(__clang__)
  22248. "sbcs r5, r6\n\t"
  22249. #else
  22250. "sbc r5, r6\n\t"
  22251. #endif
  22252. #ifdef WOLFSSL_KEIL
  22253. "sbcs %[mp], %[mp], %[mp]\n\t"
  22254. #elif defined(__clang__)
  22255. "sbcs %[mp], %[mp]\n\t"
  22256. #else
  22257. "sbc %[mp], %[mp]\n\t"
  22258. #endif
  22259. "stm %[a]!, {r5}\n\t"
  22260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22261. "adds r3, r3, #4\n\t"
  22262. #else
  22263. "add r3, r3, #4\n\t"
  22264. #endif
  22265. "cmp r3, r4\n\t"
  22266. "blt L_sp_2048_mont_reduce_32_sub_mask_%=\n\t"
  22267. #else /* WOLFSSL_SP_LARGE_CODE */
  22268. "ldm %[m]!, {r6}\n\t"
  22269. #ifdef WOLFSSL_KEIL
  22270. "ands r6, r6, r7\n\t"
  22271. #elif defined(__clang__)
  22272. "ands r6, r7\n\t"
  22273. #else
  22274. "and r6, r7\n\t"
  22275. #endif
  22276. "ldr r5, [%[a], r4]\n\t"
  22277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22278. "subs r5, r5, r6\n\t"
  22279. #else
  22280. "sub r5, r5, r6\n\t"
  22281. #endif
  22282. "stm %[a]!, {r5}\n\t"
  22283. "ldm %[m]!, {r6}\n\t"
  22284. #ifdef WOLFSSL_KEIL
  22285. "ands r6, r6, r7\n\t"
  22286. #elif defined(__clang__)
  22287. "ands r6, r7\n\t"
  22288. #else
  22289. "and r6, r7\n\t"
  22290. #endif
  22291. "ldr r5, [%[a], r4]\n\t"
  22292. #ifdef WOLFSSL_KEIL
  22293. "sbcs r5, r5, r6\n\t"
  22294. #elif defined(__clang__)
  22295. "sbcs r5, r6\n\t"
  22296. #else
  22297. "sbc r5, r6\n\t"
  22298. #endif
  22299. "stm %[a]!, {r5}\n\t"
  22300. "ldm %[m]!, {r6}\n\t"
  22301. #ifdef WOLFSSL_KEIL
  22302. "ands r6, r6, r7\n\t"
  22303. #elif defined(__clang__)
  22304. "ands r6, r7\n\t"
  22305. #else
  22306. "and r6, r7\n\t"
  22307. #endif
  22308. "ldr r5, [%[a], r4]\n\t"
  22309. #ifdef WOLFSSL_KEIL
  22310. "sbcs r5, r5, r6\n\t"
  22311. #elif defined(__clang__)
  22312. "sbcs r5, r6\n\t"
  22313. #else
  22314. "sbc r5, r6\n\t"
  22315. #endif
  22316. "stm %[a]!, {r5}\n\t"
  22317. "ldm %[m]!, {r6}\n\t"
  22318. #ifdef WOLFSSL_KEIL
  22319. "ands r6, r6, r7\n\t"
  22320. #elif defined(__clang__)
  22321. "ands r6, r7\n\t"
  22322. #else
  22323. "and r6, r7\n\t"
  22324. #endif
  22325. "ldr r5, [%[a], r4]\n\t"
  22326. #ifdef WOLFSSL_KEIL
  22327. "sbcs r5, r5, r6\n\t"
  22328. #elif defined(__clang__)
  22329. "sbcs r5, r6\n\t"
  22330. #else
  22331. "sbc r5, r6\n\t"
  22332. #endif
  22333. "stm %[a]!, {r5}\n\t"
  22334. "ldm %[m]!, {r6}\n\t"
  22335. #ifdef WOLFSSL_KEIL
  22336. "ands r6, r6, r7\n\t"
  22337. #elif defined(__clang__)
  22338. "ands r6, r7\n\t"
  22339. #else
  22340. "and r6, r7\n\t"
  22341. #endif
  22342. "ldr r5, [%[a], r4]\n\t"
  22343. #ifdef WOLFSSL_KEIL
  22344. "sbcs r5, r5, r6\n\t"
  22345. #elif defined(__clang__)
  22346. "sbcs r5, r6\n\t"
  22347. #else
  22348. "sbc r5, r6\n\t"
  22349. #endif
  22350. "stm %[a]!, {r5}\n\t"
  22351. "ldm %[m]!, {r6}\n\t"
  22352. #ifdef WOLFSSL_KEIL
  22353. "ands r6, r6, r7\n\t"
  22354. #elif defined(__clang__)
  22355. "ands r6, r7\n\t"
  22356. #else
  22357. "and r6, r7\n\t"
  22358. #endif
  22359. "ldr r5, [%[a], r4]\n\t"
  22360. #ifdef WOLFSSL_KEIL
  22361. "sbcs r5, r5, r6\n\t"
  22362. #elif defined(__clang__)
  22363. "sbcs r5, r6\n\t"
  22364. #else
  22365. "sbc r5, r6\n\t"
  22366. #endif
  22367. "stm %[a]!, {r5}\n\t"
  22368. "ldm %[m]!, {r6}\n\t"
  22369. #ifdef WOLFSSL_KEIL
  22370. "ands r6, r6, r7\n\t"
  22371. #elif defined(__clang__)
  22372. "ands r6, r7\n\t"
  22373. #else
  22374. "and r6, r7\n\t"
  22375. #endif
  22376. "ldr r5, [%[a], r4]\n\t"
  22377. #ifdef WOLFSSL_KEIL
  22378. "sbcs r5, r5, r6\n\t"
  22379. #elif defined(__clang__)
  22380. "sbcs r5, r6\n\t"
  22381. #else
  22382. "sbc r5, r6\n\t"
  22383. #endif
  22384. "stm %[a]!, {r5}\n\t"
  22385. "ldm %[m]!, {r6}\n\t"
  22386. #ifdef WOLFSSL_KEIL
  22387. "ands r6, r6, r7\n\t"
  22388. #elif defined(__clang__)
  22389. "ands r6, r7\n\t"
  22390. #else
  22391. "and r6, r7\n\t"
  22392. #endif
  22393. "ldr r5, [%[a], r4]\n\t"
  22394. #ifdef WOLFSSL_KEIL
  22395. "sbcs r5, r5, r6\n\t"
  22396. #elif defined(__clang__)
  22397. "sbcs r5, r6\n\t"
  22398. #else
  22399. "sbc r5, r6\n\t"
  22400. #endif
  22401. "stm %[a]!, {r5}\n\t"
  22402. "ldm %[m]!, {r6}\n\t"
  22403. #ifdef WOLFSSL_KEIL
  22404. "ands r6, r6, r7\n\t"
  22405. #elif defined(__clang__)
  22406. "ands r6, r7\n\t"
  22407. #else
  22408. "and r6, r7\n\t"
  22409. #endif
  22410. "ldr r5, [%[a], r4]\n\t"
  22411. #ifdef WOLFSSL_KEIL
  22412. "sbcs r5, r5, r6\n\t"
  22413. #elif defined(__clang__)
  22414. "sbcs r5, r6\n\t"
  22415. #else
  22416. "sbc r5, r6\n\t"
  22417. #endif
  22418. "stm %[a]!, {r5}\n\t"
  22419. "ldm %[m]!, {r6}\n\t"
  22420. #ifdef WOLFSSL_KEIL
  22421. "ands r6, r6, r7\n\t"
  22422. #elif defined(__clang__)
  22423. "ands r6, r7\n\t"
  22424. #else
  22425. "and r6, r7\n\t"
  22426. #endif
  22427. "ldr r5, [%[a], r4]\n\t"
  22428. #ifdef WOLFSSL_KEIL
  22429. "sbcs r5, r5, r6\n\t"
  22430. #elif defined(__clang__)
  22431. "sbcs r5, r6\n\t"
  22432. #else
  22433. "sbc r5, r6\n\t"
  22434. #endif
  22435. "stm %[a]!, {r5}\n\t"
  22436. "ldm %[m]!, {r6}\n\t"
  22437. #ifdef WOLFSSL_KEIL
  22438. "ands r6, r6, r7\n\t"
  22439. #elif defined(__clang__)
  22440. "ands r6, r7\n\t"
  22441. #else
  22442. "and r6, r7\n\t"
  22443. #endif
  22444. "ldr r5, [%[a], r4]\n\t"
  22445. #ifdef WOLFSSL_KEIL
  22446. "sbcs r5, r5, r6\n\t"
  22447. #elif defined(__clang__)
  22448. "sbcs r5, r6\n\t"
  22449. #else
  22450. "sbc r5, r6\n\t"
  22451. #endif
  22452. "stm %[a]!, {r5}\n\t"
  22453. "ldm %[m]!, {r6}\n\t"
  22454. #ifdef WOLFSSL_KEIL
  22455. "ands r6, r6, r7\n\t"
  22456. #elif defined(__clang__)
  22457. "ands r6, r7\n\t"
  22458. #else
  22459. "and r6, r7\n\t"
  22460. #endif
  22461. "ldr r5, [%[a], r4]\n\t"
  22462. #ifdef WOLFSSL_KEIL
  22463. "sbcs r5, r5, r6\n\t"
  22464. #elif defined(__clang__)
  22465. "sbcs r5, r6\n\t"
  22466. #else
  22467. "sbc r5, r6\n\t"
  22468. #endif
  22469. "stm %[a]!, {r5}\n\t"
  22470. "ldm %[m]!, {r6}\n\t"
  22471. #ifdef WOLFSSL_KEIL
  22472. "ands r6, r6, r7\n\t"
  22473. #elif defined(__clang__)
  22474. "ands r6, r7\n\t"
  22475. #else
  22476. "and r6, r7\n\t"
  22477. #endif
  22478. "ldr r5, [%[a], r4]\n\t"
  22479. #ifdef WOLFSSL_KEIL
  22480. "sbcs r5, r5, r6\n\t"
  22481. #elif defined(__clang__)
  22482. "sbcs r5, r6\n\t"
  22483. #else
  22484. "sbc r5, r6\n\t"
  22485. #endif
  22486. "stm %[a]!, {r5}\n\t"
  22487. "ldm %[m]!, {r6}\n\t"
  22488. #ifdef WOLFSSL_KEIL
  22489. "ands r6, r6, r7\n\t"
  22490. #elif defined(__clang__)
  22491. "ands r6, r7\n\t"
  22492. #else
  22493. "and r6, r7\n\t"
  22494. #endif
  22495. "ldr r5, [%[a], r4]\n\t"
  22496. #ifdef WOLFSSL_KEIL
  22497. "sbcs r5, r5, r6\n\t"
  22498. #elif defined(__clang__)
  22499. "sbcs r5, r6\n\t"
  22500. #else
  22501. "sbc r5, r6\n\t"
  22502. #endif
  22503. "stm %[a]!, {r5}\n\t"
  22504. "ldm %[m]!, {r6}\n\t"
  22505. #ifdef WOLFSSL_KEIL
  22506. "ands r6, r6, r7\n\t"
  22507. #elif defined(__clang__)
  22508. "ands r6, r7\n\t"
  22509. #else
  22510. "and r6, r7\n\t"
  22511. #endif
  22512. "ldr r5, [%[a], r4]\n\t"
  22513. #ifdef WOLFSSL_KEIL
  22514. "sbcs r5, r5, r6\n\t"
  22515. #elif defined(__clang__)
  22516. "sbcs r5, r6\n\t"
  22517. #else
  22518. "sbc r5, r6\n\t"
  22519. #endif
  22520. "stm %[a]!, {r5}\n\t"
  22521. "ldm %[m]!, {r6}\n\t"
  22522. #ifdef WOLFSSL_KEIL
  22523. "ands r6, r6, r7\n\t"
  22524. #elif defined(__clang__)
  22525. "ands r6, r7\n\t"
  22526. #else
  22527. "and r6, r7\n\t"
  22528. #endif
  22529. "ldr r5, [%[a], r4]\n\t"
  22530. #ifdef WOLFSSL_KEIL
  22531. "sbcs r5, r5, r6\n\t"
  22532. #elif defined(__clang__)
  22533. "sbcs r5, r6\n\t"
  22534. #else
  22535. "sbc r5, r6\n\t"
  22536. #endif
  22537. "stm %[a]!, {r5}\n\t"
  22538. "ldm %[m]!, {r6}\n\t"
  22539. #ifdef WOLFSSL_KEIL
  22540. "ands r6, r6, r7\n\t"
  22541. #elif defined(__clang__)
  22542. "ands r6, r7\n\t"
  22543. #else
  22544. "and r6, r7\n\t"
  22545. #endif
  22546. "ldr r5, [%[a], r4]\n\t"
  22547. #ifdef WOLFSSL_KEIL
  22548. "sbcs r5, r5, r6\n\t"
  22549. #elif defined(__clang__)
  22550. "sbcs r5, r6\n\t"
  22551. #else
  22552. "sbc r5, r6\n\t"
  22553. #endif
  22554. "stm %[a]!, {r5}\n\t"
  22555. "ldm %[m]!, {r6}\n\t"
  22556. #ifdef WOLFSSL_KEIL
  22557. "ands r6, r6, r7\n\t"
  22558. #elif defined(__clang__)
  22559. "ands r6, r7\n\t"
  22560. #else
  22561. "and r6, r7\n\t"
  22562. #endif
  22563. "ldr r5, [%[a], r4]\n\t"
  22564. #ifdef WOLFSSL_KEIL
  22565. "sbcs r5, r5, r6\n\t"
  22566. #elif defined(__clang__)
  22567. "sbcs r5, r6\n\t"
  22568. #else
  22569. "sbc r5, r6\n\t"
  22570. #endif
  22571. "stm %[a]!, {r5}\n\t"
  22572. "ldm %[m]!, {r6}\n\t"
  22573. #ifdef WOLFSSL_KEIL
  22574. "ands r6, r6, r7\n\t"
  22575. #elif defined(__clang__)
  22576. "ands r6, r7\n\t"
  22577. #else
  22578. "and r6, r7\n\t"
  22579. #endif
  22580. "ldr r5, [%[a], r4]\n\t"
  22581. #ifdef WOLFSSL_KEIL
  22582. "sbcs r5, r5, r6\n\t"
  22583. #elif defined(__clang__)
  22584. "sbcs r5, r6\n\t"
  22585. #else
  22586. "sbc r5, r6\n\t"
  22587. #endif
  22588. "stm %[a]!, {r5}\n\t"
  22589. "ldm %[m]!, {r6}\n\t"
  22590. #ifdef WOLFSSL_KEIL
  22591. "ands r6, r6, r7\n\t"
  22592. #elif defined(__clang__)
  22593. "ands r6, r7\n\t"
  22594. #else
  22595. "and r6, r7\n\t"
  22596. #endif
  22597. "ldr r5, [%[a], r4]\n\t"
  22598. #ifdef WOLFSSL_KEIL
  22599. "sbcs r5, r5, r6\n\t"
  22600. #elif defined(__clang__)
  22601. "sbcs r5, r6\n\t"
  22602. #else
  22603. "sbc r5, r6\n\t"
  22604. #endif
  22605. "stm %[a]!, {r5}\n\t"
  22606. "ldm %[m]!, {r6}\n\t"
  22607. #ifdef WOLFSSL_KEIL
  22608. "ands r6, r6, r7\n\t"
  22609. #elif defined(__clang__)
  22610. "ands r6, r7\n\t"
  22611. #else
  22612. "and r6, r7\n\t"
  22613. #endif
  22614. "ldr r5, [%[a], r4]\n\t"
  22615. #ifdef WOLFSSL_KEIL
  22616. "sbcs r5, r5, r6\n\t"
  22617. #elif defined(__clang__)
  22618. "sbcs r5, r6\n\t"
  22619. #else
  22620. "sbc r5, r6\n\t"
  22621. #endif
  22622. "stm %[a]!, {r5}\n\t"
  22623. "ldm %[m]!, {r6}\n\t"
  22624. #ifdef WOLFSSL_KEIL
  22625. "ands r6, r6, r7\n\t"
  22626. #elif defined(__clang__)
  22627. "ands r6, r7\n\t"
  22628. #else
  22629. "and r6, r7\n\t"
  22630. #endif
  22631. "ldr r5, [%[a], r4]\n\t"
  22632. #ifdef WOLFSSL_KEIL
  22633. "sbcs r5, r5, r6\n\t"
  22634. #elif defined(__clang__)
  22635. "sbcs r5, r6\n\t"
  22636. #else
  22637. "sbc r5, r6\n\t"
  22638. #endif
  22639. "stm %[a]!, {r5}\n\t"
  22640. "ldm %[m]!, {r6}\n\t"
  22641. #ifdef WOLFSSL_KEIL
  22642. "ands r6, r6, r7\n\t"
  22643. #elif defined(__clang__)
  22644. "ands r6, r7\n\t"
  22645. #else
  22646. "and r6, r7\n\t"
  22647. #endif
  22648. "ldr r5, [%[a], r4]\n\t"
  22649. #ifdef WOLFSSL_KEIL
  22650. "sbcs r5, r5, r6\n\t"
  22651. #elif defined(__clang__)
  22652. "sbcs r5, r6\n\t"
  22653. #else
  22654. "sbc r5, r6\n\t"
  22655. #endif
  22656. "stm %[a]!, {r5}\n\t"
  22657. "ldm %[m]!, {r6}\n\t"
  22658. #ifdef WOLFSSL_KEIL
  22659. "ands r6, r6, r7\n\t"
  22660. #elif defined(__clang__)
  22661. "ands r6, r7\n\t"
  22662. #else
  22663. "and r6, r7\n\t"
  22664. #endif
  22665. "ldr r5, [%[a], r4]\n\t"
  22666. #ifdef WOLFSSL_KEIL
  22667. "sbcs r5, r5, r6\n\t"
  22668. #elif defined(__clang__)
  22669. "sbcs r5, r6\n\t"
  22670. #else
  22671. "sbc r5, r6\n\t"
  22672. #endif
  22673. "stm %[a]!, {r5}\n\t"
  22674. "ldm %[m]!, {r6}\n\t"
  22675. #ifdef WOLFSSL_KEIL
  22676. "ands r6, r6, r7\n\t"
  22677. #elif defined(__clang__)
  22678. "ands r6, r7\n\t"
  22679. #else
  22680. "and r6, r7\n\t"
  22681. #endif
  22682. "ldr r5, [%[a], r4]\n\t"
  22683. #ifdef WOLFSSL_KEIL
  22684. "sbcs r5, r5, r6\n\t"
  22685. #elif defined(__clang__)
  22686. "sbcs r5, r6\n\t"
  22687. #else
  22688. "sbc r5, r6\n\t"
  22689. #endif
  22690. "stm %[a]!, {r5}\n\t"
  22691. "ldm %[m]!, {r6}\n\t"
  22692. #ifdef WOLFSSL_KEIL
  22693. "ands r6, r6, r7\n\t"
  22694. #elif defined(__clang__)
  22695. "ands r6, r7\n\t"
  22696. #else
  22697. "and r6, r7\n\t"
  22698. #endif
  22699. "ldr r5, [%[a], r4]\n\t"
  22700. #ifdef WOLFSSL_KEIL
  22701. "sbcs r5, r5, r6\n\t"
  22702. #elif defined(__clang__)
  22703. "sbcs r5, r6\n\t"
  22704. #else
  22705. "sbc r5, r6\n\t"
  22706. #endif
  22707. "stm %[a]!, {r5}\n\t"
  22708. "ldm %[m]!, {r6}\n\t"
  22709. #ifdef WOLFSSL_KEIL
  22710. "ands r6, r6, r7\n\t"
  22711. #elif defined(__clang__)
  22712. "ands r6, r7\n\t"
  22713. #else
  22714. "and r6, r7\n\t"
  22715. #endif
  22716. "ldr r5, [%[a], r4]\n\t"
  22717. #ifdef WOLFSSL_KEIL
  22718. "sbcs r5, r5, r6\n\t"
  22719. #elif defined(__clang__)
  22720. "sbcs r5, r6\n\t"
  22721. #else
  22722. "sbc r5, r6\n\t"
  22723. #endif
  22724. "stm %[a]!, {r5}\n\t"
  22725. "ldm %[m]!, {r6}\n\t"
  22726. #ifdef WOLFSSL_KEIL
  22727. "ands r6, r6, r7\n\t"
  22728. #elif defined(__clang__)
  22729. "ands r6, r7\n\t"
  22730. #else
  22731. "and r6, r7\n\t"
  22732. #endif
  22733. "ldr r5, [%[a], r4]\n\t"
  22734. #ifdef WOLFSSL_KEIL
  22735. "sbcs r5, r5, r6\n\t"
  22736. #elif defined(__clang__)
  22737. "sbcs r5, r6\n\t"
  22738. #else
  22739. "sbc r5, r6\n\t"
  22740. #endif
  22741. "stm %[a]!, {r5}\n\t"
  22742. "ldm %[m]!, {r6}\n\t"
  22743. #ifdef WOLFSSL_KEIL
  22744. "ands r6, r6, r7\n\t"
  22745. #elif defined(__clang__)
  22746. "ands r6, r7\n\t"
  22747. #else
  22748. "and r6, r7\n\t"
  22749. #endif
  22750. "ldr r5, [%[a], r4]\n\t"
  22751. #ifdef WOLFSSL_KEIL
  22752. "sbcs r5, r5, r6\n\t"
  22753. #elif defined(__clang__)
  22754. "sbcs r5, r6\n\t"
  22755. #else
  22756. "sbc r5, r6\n\t"
  22757. #endif
  22758. "stm %[a]!, {r5}\n\t"
  22759. "ldm %[m]!, {r6}\n\t"
  22760. #ifdef WOLFSSL_KEIL
  22761. "ands r6, r6, r7\n\t"
  22762. #elif defined(__clang__)
  22763. "ands r6, r7\n\t"
  22764. #else
  22765. "and r6, r7\n\t"
  22766. #endif
  22767. "ldr r5, [%[a], r4]\n\t"
  22768. #ifdef WOLFSSL_KEIL
  22769. "sbcs r5, r5, r6\n\t"
  22770. #elif defined(__clang__)
  22771. "sbcs r5, r6\n\t"
  22772. #else
  22773. "sbc r5, r6\n\t"
  22774. #endif
  22775. "stm %[a]!, {r5}\n\t"
  22776. "ldm %[m]!, {r6}\n\t"
  22777. #ifdef WOLFSSL_KEIL
  22778. "ands r6, r6, r7\n\t"
  22779. #elif defined(__clang__)
  22780. "ands r6, r7\n\t"
  22781. #else
  22782. "and r6, r7\n\t"
  22783. #endif
  22784. "ldr r5, [%[a], r4]\n\t"
  22785. #ifdef WOLFSSL_KEIL
  22786. "sbcs r5, r5, r6\n\t"
  22787. #elif defined(__clang__)
  22788. "sbcs r5, r6\n\t"
  22789. #else
  22790. "sbc r5, r6\n\t"
  22791. #endif
  22792. "stm %[a]!, {r5}\n\t"
  22793. "ldm %[m]!, {r6}\n\t"
  22794. #ifdef WOLFSSL_KEIL
  22795. "ands r6, r6, r7\n\t"
  22796. #elif defined(__clang__)
  22797. "ands r6, r7\n\t"
  22798. #else
  22799. "and r6, r7\n\t"
  22800. #endif
  22801. "ldr r5, [%[a], r4]\n\t"
  22802. #ifdef WOLFSSL_KEIL
  22803. "sbcs r5, r5, r6\n\t"
  22804. #elif defined(__clang__)
  22805. "sbcs r5, r6\n\t"
  22806. #else
  22807. "sbc r5, r6\n\t"
  22808. #endif
  22809. "stm %[a]!, {r5}\n\t"
  22810. #endif /* WOLFSSL_SP_LARGE_CODE */
  22811. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  22812. :
  22813. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  22814. );
  22815. }
  22816. /* Multiply two Montgomery form numbers mod the modulus (prime).
  22817. * (r = a * b mod m)
  22818. *
  22819. * r Result of multiplication.
  22820. * a First number to multiply in Montgomery form.
  22821. * b Second number to multiply in Montgomery form.
  22822. * m Modulus (prime).
  22823. * mp Montgomery mulitplier.
  22824. */
  22825. static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a,
  22826. const sp_digit* b, const sp_digit* m, sp_digit mp)
  22827. {
  22828. sp_2048_mul_32(r, a, b);
  22829. sp_2048_mont_reduce_32(r, m, mp);
  22830. }
  22831. /* Square the Montgomery form number. (r = a * a mod m)
  22832. *
  22833. * r Result of squaring.
  22834. * a Number to square in Montgomery form.
  22835. * m Modulus (prime).
  22836. * mp Montgomery mulitplier.
  22837. */
  22838. static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a,
  22839. const sp_digit* m, sp_digit mp)
  22840. {
  22841. sp_2048_sqr_32(r, a);
  22842. sp_2048_mont_reduce_32(r, m, mp);
  22843. }
  22844. /* Mul a by digit b into r. (r = a * b)
  22845. *
  22846. * r A single precision integer.
  22847. * a A single precision integer.
  22848. * b A single precision digit.
  22849. */
  22850. SP_NOINLINE static void sp_2048_mul_d_32(sp_digit* r, const sp_digit* a,
  22851. sp_digit b)
  22852. {
  22853. __asm__ __volatile__ (
  22854. "movs r6, #0x80\n\t"
  22855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22856. "adds r6, r6, %[a]\n\t"
  22857. #else
  22858. "add r6, r6, %[a]\n\t"
  22859. #endif
  22860. "mov r8, %[r]\n\t"
  22861. "mov r9, r6\n\t"
  22862. "movs r3, #0\n\t"
  22863. "movs r4, #0\n\t"
  22864. "\n"
  22865. "L_sp_2048_mul_d_32_%=:\n\t"
  22866. "movs %[r], #0\n\t"
  22867. "movs r5, #0\n\t"
  22868. "# A[] * B\n\t"
  22869. "ldrh r6, [%[a]]\n\t"
  22870. "uxth r7, %[b]\n\t"
  22871. #ifdef WOLFSSL_KEIL
  22872. "muls r7, r6, r7\n\t"
  22873. #elif defined(__clang__)
  22874. "muls r7, r6\n\t"
  22875. #else
  22876. "mul r7, r6\n\t"
  22877. #endif
  22878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22879. "adds r3, r3, r7\n\t"
  22880. #else
  22881. "add r3, r3, r7\n\t"
  22882. #endif
  22883. #ifdef WOLFSSL_KEIL
  22884. "adcs r4, r4, %[r]\n\t"
  22885. #elif defined(__clang__)
  22886. "adcs r4, %[r]\n\t"
  22887. #else
  22888. "adc r4, %[r]\n\t"
  22889. #endif
  22890. #ifdef WOLFSSL_KEIL
  22891. "adcs r5, r5, %[r]\n\t"
  22892. #elif defined(__clang__)
  22893. "adcs r5, %[r]\n\t"
  22894. #else
  22895. "adc r5, %[r]\n\t"
  22896. #endif
  22897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22898. "lsrs r7, %[b], #16\n\t"
  22899. #else
  22900. "lsr r7, %[b], #16\n\t"
  22901. #endif
  22902. #ifdef WOLFSSL_KEIL
  22903. "muls r6, r7, r6\n\t"
  22904. #elif defined(__clang__)
  22905. "muls r6, r7\n\t"
  22906. #else
  22907. "mul r6, r7\n\t"
  22908. #endif
  22909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22910. "lsrs r7, r6, #16\n\t"
  22911. #else
  22912. "lsr r7, r6, #16\n\t"
  22913. #endif
  22914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22915. "lsls r6, r6, #16\n\t"
  22916. #else
  22917. "lsl r6, r6, #16\n\t"
  22918. #endif
  22919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22920. "adds r3, r3, r6\n\t"
  22921. #else
  22922. "add r3, r3, r6\n\t"
  22923. #endif
  22924. #ifdef WOLFSSL_KEIL
  22925. "adcs r4, r4, r7\n\t"
  22926. #elif defined(__clang__)
  22927. "adcs r4, r7\n\t"
  22928. #else
  22929. "adc r4, r7\n\t"
  22930. #endif
  22931. #ifdef WOLFSSL_KEIL
  22932. "adcs r5, r5, %[r]\n\t"
  22933. #elif defined(__clang__)
  22934. "adcs r5, %[r]\n\t"
  22935. #else
  22936. "adc r5, %[r]\n\t"
  22937. #endif
  22938. "ldr r6, [%[a]]\n\t"
  22939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22940. "lsrs r6, r6, #16\n\t"
  22941. #else
  22942. "lsr r6, r6, #16\n\t"
  22943. #endif
  22944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22945. "lsrs r7, %[b], #16\n\t"
  22946. #else
  22947. "lsr r7, %[b], #16\n\t"
  22948. #endif
  22949. #ifdef WOLFSSL_KEIL
  22950. "muls r7, r6, r7\n\t"
  22951. #elif defined(__clang__)
  22952. "muls r7, r6\n\t"
  22953. #else
  22954. "mul r7, r6\n\t"
  22955. #endif
  22956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22957. "adds r4, r4, r7\n\t"
  22958. #else
  22959. "add r4, r4, r7\n\t"
  22960. #endif
  22961. #ifdef WOLFSSL_KEIL
  22962. "adcs r5, r5, %[r]\n\t"
  22963. #elif defined(__clang__)
  22964. "adcs r5, %[r]\n\t"
  22965. #else
  22966. "adc r5, %[r]\n\t"
  22967. #endif
  22968. "uxth r7, %[b]\n\t"
  22969. #ifdef WOLFSSL_KEIL
  22970. "muls r6, r7, r6\n\t"
  22971. #elif defined(__clang__)
  22972. "muls r6, r7\n\t"
  22973. #else
  22974. "mul r6, r7\n\t"
  22975. #endif
  22976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22977. "lsrs r7, r6, #16\n\t"
  22978. #else
  22979. "lsr r7, r6, #16\n\t"
  22980. #endif
  22981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22982. "lsls r6, r6, #16\n\t"
  22983. #else
  22984. "lsl r6, r6, #16\n\t"
  22985. #endif
  22986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22987. "adds r3, r3, r6\n\t"
  22988. #else
  22989. "add r3, r3, r6\n\t"
  22990. #endif
  22991. #ifdef WOLFSSL_KEIL
  22992. "adcs r4, r4, r7\n\t"
  22993. #elif defined(__clang__)
  22994. "adcs r4, r7\n\t"
  22995. #else
  22996. "adc r4, r7\n\t"
  22997. #endif
  22998. #ifdef WOLFSSL_KEIL
  22999. "adcs r5, r5, %[r]\n\t"
  23000. #elif defined(__clang__)
  23001. "adcs r5, %[r]\n\t"
  23002. #else
  23003. "adc r5, %[r]\n\t"
  23004. #endif
  23005. "# A[] * B - Done\n\t"
  23006. "mov %[r], r8\n\t"
  23007. "str r3, [%[r]]\n\t"
  23008. "movs r3, r4\n\t"
  23009. "movs r4, r5\n\t"
  23010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23011. "adds %[r], %[r], #4\n\t"
  23012. #else
  23013. "add %[r], %[r], #4\n\t"
  23014. #endif
  23015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23016. "adds %[a], %[a], #4\n\t"
  23017. #else
  23018. "add %[a], %[a], #4\n\t"
  23019. #endif
  23020. "mov r8, %[r]\n\t"
  23021. "cmp %[a], r9\n\t"
  23022. "blt L_sp_2048_mul_d_32_%=\n\t"
  23023. "str r3, [%[r]]\n\t"
  23024. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23025. :
  23026. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  23027. );
  23028. }
  23029. /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
  23030. *
  23031. * d1 The high order half of the number to divide.
  23032. * d0 The low order half of the number to divide.
  23033. * div The dividend.
  23034. * returns the result of the division.
  23035. *
  23036. * Note that this is an approximate div. It may give an answer 1 larger.
  23037. */
  23038. SP_NOINLINE static sp_digit div_2048_word_32(sp_digit d1, sp_digit d0,
  23039. sp_digit div)
  23040. {
  23041. __asm__ __volatile__ (
  23042. "movs r3, #0\n\t"
  23043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23044. "lsrs r5, %[div], #1\n\t"
  23045. #else
  23046. "lsr r5, %[div], #1\n\t"
  23047. #endif
  23048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23049. "adds r5, r5, #1\n\t"
  23050. #else
  23051. "add r5, r5, #1\n\t"
  23052. #endif
  23053. "mov r8, %[d0]\n\t"
  23054. "mov r9, %[d1]\n\t"
  23055. "# Do top 32\n\t"
  23056. "movs r6, r5\n\t"
  23057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23058. "subs r6, r6, %[d1]\n\t"
  23059. #else
  23060. "sub r6, r6, %[d1]\n\t"
  23061. #endif
  23062. #ifdef WOLFSSL_KEIL
  23063. "sbcs r6, r6, r6\n\t"
  23064. #elif defined(__clang__)
  23065. "sbcs r6, r6\n\t"
  23066. #else
  23067. "sbc r6, r6\n\t"
  23068. #endif
  23069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23070. "adds r3, r3, r3\n\t"
  23071. #else
  23072. "add r3, r3, r3\n\t"
  23073. #endif
  23074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23075. "subs r3, r3, r6\n\t"
  23076. #else
  23077. "sub r3, r3, r6\n\t"
  23078. #endif
  23079. #ifdef WOLFSSL_KEIL
  23080. "ands r6, r6, r5\n\t"
  23081. #elif defined(__clang__)
  23082. "ands r6, r5\n\t"
  23083. #else
  23084. "and r6, r5\n\t"
  23085. #endif
  23086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23087. "subs %[d1], %[d1], r6\n\t"
  23088. #else
  23089. "sub %[d1], %[d1], r6\n\t"
  23090. #endif
  23091. "movs r4, #29\n\t"
  23092. "\n"
  23093. "L_div_2048_word_32_loop_%=:\n\t"
  23094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23095. "lsls %[d0], %[d0], #1\n\t"
  23096. #else
  23097. "lsl %[d0], %[d0], #1\n\t"
  23098. #endif
  23099. #ifdef WOLFSSL_KEIL
  23100. "adcs %[d1], %[d1], %[d1]\n\t"
  23101. #elif defined(__clang__)
  23102. "adcs %[d1], %[d1]\n\t"
  23103. #else
  23104. "adc %[d1], %[d1]\n\t"
  23105. #endif
  23106. "movs r6, r5\n\t"
  23107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23108. "subs r6, r6, %[d1]\n\t"
  23109. #else
  23110. "sub r6, r6, %[d1]\n\t"
  23111. #endif
  23112. #ifdef WOLFSSL_KEIL
  23113. "sbcs r6, r6, r6\n\t"
  23114. #elif defined(__clang__)
  23115. "sbcs r6, r6\n\t"
  23116. #else
  23117. "sbc r6, r6\n\t"
  23118. #endif
  23119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23120. "adds r3, r3, r3\n\t"
  23121. #else
  23122. "add r3, r3, r3\n\t"
  23123. #endif
  23124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23125. "subs r3, r3, r6\n\t"
  23126. #else
  23127. "sub r3, r3, r6\n\t"
  23128. #endif
  23129. #ifdef WOLFSSL_KEIL
  23130. "ands r6, r6, r5\n\t"
  23131. #elif defined(__clang__)
  23132. "ands r6, r5\n\t"
  23133. #else
  23134. "and r6, r5\n\t"
  23135. #endif
  23136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23137. "subs %[d1], %[d1], r6\n\t"
  23138. #else
  23139. "sub %[d1], %[d1], r6\n\t"
  23140. #endif
  23141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23142. "subs r4, r4, #1\n\t"
  23143. #else
  23144. "sub r4, r4, #1\n\t"
  23145. #endif
  23146. "bpl L_div_2048_word_32_loop_%=\n\t"
  23147. "movs r7, #0\n\t"
  23148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23149. "adds r3, r3, r3\n\t"
  23150. #else
  23151. "add r3, r3, r3\n\t"
  23152. #endif
  23153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23154. "adds r3, r3, #1\n\t"
  23155. #else
  23156. "add r3, r3, #1\n\t"
  23157. #endif
  23158. "# r * div - Start\n\t"
  23159. "uxth %[d1], r3\n\t"
  23160. "uxth r4, %[div]\n\t"
  23161. #ifdef WOLFSSL_KEIL
  23162. "muls r4, %[d1], r4\n\t"
  23163. #elif defined(__clang__)
  23164. "muls r4, %[d1]\n\t"
  23165. #else
  23166. "mul r4, %[d1]\n\t"
  23167. #endif
  23168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23169. "lsrs r6, %[div], #16\n\t"
  23170. #else
  23171. "lsr r6, %[div], #16\n\t"
  23172. #endif
  23173. #ifdef WOLFSSL_KEIL
  23174. "muls %[d1], r6, %[d1]\n\t"
  23175. #elif defined(__clang__)
  23176. "muls %[d1], r6\n\t"
  23177. #else
  23178. "mul %[d1], r6\n\t"
  23179. #endif
  23180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23181. "lsrs r5, %[d1], #16\n\t"
  23182. #else
  23183. "lsr r5, %[d1], #16\n\t"
  23184. #endif
  23185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23186. "lsls %[d1], %[d1], #16\n\t"
  23187. #else
  23188. "lsl %[d1], %[d1], #16\n\t"
  23189. #endif
  23190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23191. "adds r4, r4, %[d1]\n\t"
  23192. #else
  23193. "add r4, r4, %[d1]\n\t"
  23194. #endif
  23195. #ifdef WOLFSSL_KEIL
  23196. "adcs r5, r5, r7\n\t"
  23197. #elif defined(__clang__)
  23198. "adcs r5, r7\n\t"
  23199. #else
  23200. "adc r5, r7\n\t"
  23201. #endif
  23202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23203. "lsrs %[d1], r3, #16\n\t"
  23204. #else
  23205. "lsr %[d1], r3, #16\n\t"
  23206. #endif
  23207. #ifdef WOLFSSL_KEIL
  23208. "muls r6, %[d1], r6\n\t"
  23209. #elif defined(__clang__)
  23210. "muls r6, %[d1]\n\t"
  23211. #else
  23212. "mul r6, %[d1]\n\t"
  23213. #endif
  23214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23215. "adds r5, r5, r6\n\t"
  23216. #else
  23217. "add r5, r5, r6\n\t"
  23218. #endif
  23219. "uxth r6, %[div]\n\t"
  23220. #ifdef WOLFSSL_KEIL
  23221. "muls %[d1], r6, %[d1]\n\t"
  23222. #elif defined(__clang__)
  23223. "muls %[d1], r6\n\t"
  23224. #else
  23225. "mul %[d1], r6\n\t"
  23226. #endif
  23227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23228. "lsrs r6, %[d1], #16\n\t"
  23229. #else
  23230. "lsr r6, %[d1], #16\n\t"
  23231. #endif
  23232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23233. "lsls %[d1], %[d1], #16\n\t"
  23234. #else
  23235. "lsl %[d1], %[d1], #16\n\t"
  23236. #endif
  23237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23238. "adds r4, r4, %[d1]\n\t"
  23239. #else
  23240. "add r4, r4, %[d1]\n\t"
  23241. #endif
  23242. #ifdef WOLFSSL_KEIL
  23243. "adcs r5, r5, r6\n\t"
  23244. #elif defined(__clang__)
  23245. "adcs r5, r6\n\t"
  23246. #else
  23247. "adc r5, r6\n\t"
  23248. #endif
  23249. "# r * div - Done\n\t"
  23250. "mov %[d1], r8\n\t"
  23251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23252. "subs %[d1], %[d1], r4\n\t"
  23253. #else
  23254. "sub %[d1], %[d1], r4\n\t"
  23255. #endif
  23256. "movs r4, %[d1]\n\t"
  23257. "mov %[d1], r9\n\t"
  23258. #ifdef WOLFSSL_KEIL
  23259. "sbcs %[d1], %[d1], r5\n\t"
  23260. #elif defined(__clang__)
  23261. "sbcs %[d1], r5\n\t"
  23262. #else
  23263. "sbc %[d1], r5\n\t"
  23264. #endif
  23265. "movs r5, %[d1]\n\t"
  23266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23267. "adds r3, r3, r5\n\t"
  23268. #else
  23269. "add r3, r3, r5\n\t"
  23270. #endif
  23271. "# r * div - Start\n\t"
  23272. "uxth %[d1], r3\n\t"
  23273. "uxth r4, %[div]\n\t"
  23274. #ifdef WOLFSSL_KEIL
  23275. "muls r4, %[d1], r4\n\t"
  23276. #elif defined(__clang__)
  23277. "muls r4, %[d1]\n\t"
  23278. #else
  23279. "mul r4, %[d1]\n\t"
  23280. #endif
  23281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23282. "lsrs r6, %[div], #16\n\t"
  23283. #else
  23284. "lsr r6, %[div], #16\n\t"
  23285. #endif
  23286. #ifdef WOLFSSL_KEIL
  23287. "muls %[d1], r6, %[d1]\n\t"
  23288. #elif defined(__clang__)
  23289. "muls %[d1], r6\n\t"
  23290. #else
  23291. "mul %[d1], r6\n\t"
  23292. #endif
  23293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23294. "lsrs r5, %[d1], #16\n\t"
  23295. #else
  23296. "lsr r5, %[d1], #16\n\t"
  23297. #endif
  23298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23299. "lsls %[d1], %[d1], #16\n\t"
  23300. #else
  23301. "lsl %[d1], %[d1], #16\n\t"
  23302. #endif
  23303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23304. "adds r4, r4, %[d1]\n\t"
  23305. #else
  23306. "add r4, r4, %[d1]\n\t"
  23307. #endif
  23308. #ifdef WOLFSSL_KEIL
  23309. "adcs r5, r5, r7\n\t"
  23310. #elif defined(__clang__)
  23311. "adcs r5, r7\n\t"
  23312. #else
  23313. "adc r5, r7\n\t"
  23314. #endif
  23315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23316. "lsrs %[d1], r3, #16\n\t"
  23317. #else
  23318. "lsr %[d1], r3, #16\n\t"
  23319. #endif
  23320. #ifdef WOLFSSL_KEIL
  23321. "muls r6, %[d1], r6\n\t"
  23322. #elif defined(__clang__)
  23323. "muls r6, %[d1]\n\t"
  23324. #else
  23325. "mul r6, %[d1]\n\t"
  23326. #endif
  23327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23328. "adds r5, r5, r6\n\t"
  23329. #else
  23330. "add r5, r5, r6\n\t"
  23331. #endif
  23332. "uxth r6, %[div]\n\t"
  23333. #ifdef WOLFSSL_KEIL
  23334. "muls %[d1], r6, %[d1]\n\t"
  23335. #elif defined(__clang__)
  23336. "muls %[d1], r6\n\t"
  23337. #else
  23338. "mul %[d1], r6\n\t"
  23339. #endif
  23340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23341. "lsrs r6, %[d1], #16\n\t"
  23342. #else
  23343. "lsr r6, %[d1], #16\n\t"
  23344. #endif
  23345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23346. "lsls %[d1], %[d1], #16\n\t"
  23347. #else
  23348. "lsl %[d1], %[d1], #16\n\t"
  23349. #endif
  23350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23351. "adds r4, r4, %[d1]\n\t"
  23352. #else
  23353. "add r4, r4, %[d1]\n\t"
  23354. #endif
  23355. #ifdef WOLFSSL_KEIL
  23356. "adcs r5, r5, r6\n\t"
  23357. #elif defined(__clang__)
  23358. "adcs r5, r6\n\t"
  23359. #else
  23360. "adc r5, r6\n\t"
  23361. #endif
  23362. "# r * div - Done\n\t"
  23363. "mov %[d1], r8\n\t"
  23364. "mov r6, r9\n\t"
  23365. #ifdef WOLFSSL_KEIL
  23366. "subs r4, %[d1], r4\n\t"
  23367. #else
  23368. #ifdef __clang__
  23369. "subs r4, %[d1], r4\n\t"
  23370. #else
  23371. "sub r4, %[d1], r4\n\t"
  23372. #endif
  23373. #endif
  23374. #ifdef WOLFSSL_KEIL
  23375. "sbcs r6, r6, r5\n\t"
  23376. #elif defined(__clang__)
  23377. "sbcs r6, r5\n\t"
  23378. #else
  23379. "sbc r6, r5\n\t"
  23380. #endif
  23381. "movs r5, r6\n\t"
  23382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23383. "adds r3, r3, r5\n\t"
  23384. #else
  23385. "add r3, r3, r5\n\t"
  23386. #endif
  23387. "# r * div - Start\n\t"
  23388. "uxth %[d1], r3\n\t"
  23389. "uxth r4, %[div]\n\t"
  23390. #ifdef WOLFSSL_KEIL
  23391. "muls r4, %[d1], r4\n\t"
  23392. #elif defined(__clang__)
  23393. "muls r4, %[d1]\n\t"
  23394. #else
  23395. "mul r4, %[d1]\n\t"
  23396. #endif
  23397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23398. "lsrs r6, %[div], #16\n\t"
  23399. #else
  23400. "lsr r6, %[div], #16\n\t"
  23401. #endif
  23402. #ifdef WOLFSSL_KEIL
  23403. "muls %[d1], r6, %[d1]\n\t"
  23404. #elif defined(__clang__)
  23405. "muls %[d1], r6\n\t"
  23406. #else
  23407. "mul %[d1], r6\n\t"
  23408. #endif
  23409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23410. "lsrs r5, %[d1], #16\n\t"
  23411. #else
  23412. "lsr r5, %[d1], #16\n\t"
  23413. #endif
  23414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23415. "lsls %[d1], %[d1], #16\n\t"
  23416. #else
  23417. "lsl %[d1], %[d1], #16\n\t"
  23418. #endif
  23419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23420. "adds r4, r4, %[d1]\n\t"
  23421. #else
  23422. "add r4, r4, %[d1]\n\t"
  23423. #endif
  23424. #ifdef WOLFSSL_KEIL
  23425. "adcs r5, r5, r7\n\t"
  23426. #elif defined(__clang__)
  23427. "adcs r5, r7\n\t"
  23428. #else
  23429. "adc r5, r7\n\t"
  23430. #endif
  23431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23432. "lsrs %[d1], r3, #16\n\t"
  23433. #else
  23434. "lsr %[d1], r3, #16\n\t"
  23435. #endif
  23436. #ifdef WOLFSSL_KEIL
  23437. "muls r6, %[d1], r6\n\t"
  23438. #elif defined(__clang__)
  23439. "muls r6, %[d1]\n\t"
  23440. #else
  23441. "mul r6, %[d1]\n\t"
  23442. #endif
  23443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23444. "adds r5, r5, r6\n\t"
  23445. #else
  23446. "add r5, r5, r6\n\t"
  23447. #endif
  23448. "uxth r6, %[div]\n\t"
  23449. #ifdef WOLFSSL_KEIL
  23450. "muls %[d1], r6, %[d1]\n\t"
  23451. #elif defined(__clang__)
  23452. "muls %[d1], r6\n\t"
  23453. #else
  23454. "mul %[d1], r6\n\t"
  23455. #endif
  23456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23457. "lsrs r6, %[d1], #16\n\t"
  23458. #else
  23459. "lsr r6, %[d1], #16\n\t"
  23460. #endif
  23461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23462. "lsls %[d1], %[d1], #16\n\t"
  23463. #else
  23464. "lsl %[d1], %[d1], #16\n\t"
  23465. #endif
  23466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23467. "adds r4, r4, %[d1]\n\t"
  23468. #else
  23469. "add r4, r4, %[d1]\n\t"
  23470. #endif
  23471. #ifdef WOLFSSL_KEIL
  23472. "adcs r5, r5, r6\n\t"
  23473. #elif defined(__clang__)
  23474. "adcs r5, r6\n\t"
  23475. #else
  23476. "adc r5, r6\n\t"
  23477. #endif
  23478. "# r * div - Done\n\t"
  23479. "mov %[d1], r8\n\t"
  23480. "mov r6, r9\n\t"
  23481. #ifdef WOLFSSL_KEIL
  23482. "subs r4, %[d1], r4\n\t"
  23483. #else
  23484. #ifdef __clang__
  23485. "subs r4, %[d1], r4\n\t"
  23486. #else
  23487. "sub r4, %[d1], r4\n\t"
  23488. #endif
  23489. #endif
  23490. #ifdef WOLFSSL_KEIL
  23491. "sbcs r6, r6, r5\n\t"
  23492. #elif defined(__clang__)
  23493. "sbcs r6, r5\n\t"
  23494. #else
  23495. "sbc r6, r5\n\t"
  23496. #endif
  23497. "movs r5, r6\n\t"
  23498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23499. "adds r3, r3, r5\n\t"
  23500. #else
  23501. "add r3, r3, r5\n\t"
  23502. #endif
  23503. "movs r6, %[div]\n\t"
  23504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23505. "subs r6, r6, r4\n\t"
  23506. #else
  23507. "sub r6, r6, r4\n\t"
  23508. #endif
  23509. #ifdef WOLFSSL_KEIL
  23510. "sbcs r6, r6, r6\n\t"
  23511. #elif defined(__clang__)
  23512. "sbcs r6, r6\n\t"
  23513. #else
  23514. "sbc r6, r6\n\t"
  23515. #endif
  23516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23517. "subs r3, r3, r6\n\t"
  23518. #else
  23519. "sub r3, r3, r6\n\t"
  23520. #endif
  23521. "movs %[d1], r3\n\t"
  23522. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  23523. :
  23524. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  23525. );
  23526. return (uint32_t)(size_t)d1;
  23527. }
  23528. /* Compare a with b in constant time.
  23529. *
  23530. * a A single precision integer.
  23531. * b A single precision integer.
  23532. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  23533. * respectively.
  23534. */
  23535. SP_NOINLINE static sp_int32 sp_2048_cmp_32(const sp_digit* a, const sp_digit* b)
  23536. {
  23537. __asm__ __volatile__ (
  23538. "movs r2, #0\n\t"
  23539. "movs r3, #0\n\t"
  23540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23541. "mvns r3, r3\n\t"
  23542. #else
  23543. "mvn r3, r3\n\t"
  23544. #endif
  23545. "movs r6, #0x7c\n\t"
  23546. "\n"
  23547. "L_sp_2048_cmp_32_words_%=:\n\t"
  23548. "ldr r7, [%[a], r6]\n\t"
  23549. "ldr r5, [%[b], r6]\n\t"
  23550. #ifdef WOLFSSL_KEIL
  23551. "ands r7, r7, r3\n\t"
  23552. #elif defined(__clang__)
  23553. "ands r7, r3\n\t"
  23554. #else
  23555. "and r7, r3\n\t"
  23556. #endif
  23557. #ifdef WOLFSSL_KEIL
  23558. "ands r5, r5, r3\n\t"
  23559. #elif defined(__clang__)
  23560. "ands r5, r3\n\t"
  23561. #else
  23562. "and r5, r3\n\t"
  23563. #endif
  23564. "movs r4, r7\n\t"
  23565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23566. "subs r7, r7, r5\n\t"
  23567. #else
  23568. "sub r7, r7, r5\n\t"
  23569. #endif
  23570. #ifdef WOLFSSL_KEIL
  23571. "sbcs r7, r7, r7\n\t"
  23572. #elif defined(__clang__)
  23573. "sbcs r7, r7\n\t"
  23574. #else
  23575. "sbc r7, r7\n\t"
  23576. #endif
  23577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23578. "adds r2, r2, r7\n\t"
  23579. #else
  23580. "add r2, r2, r7\n\t"
  23581. #endif
  23582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23583. "mvns r7, r7\n\t"
  23584. #else
  23585. "mvn r7, r7\n\t"
  23586. #endif
  23587. #ifdef WOLFSSL_KEIL
  23588. "ands r3, r3, r7\n\t"
  23589. #elif defined(__clang__)
  23590. "ands r3, r7\n\t"
  23591. #else
  23592. "and r3, r7\n\t"
  23593. #endif
  23594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23595. "subs r5, r5, r4\n\t"
  23596. #else
  23597. "sub r5, r5, r4\n\t"
  23598. #endif
  23599. #ifdef WOLFSSL_KEIL
  23600. "sbcs r7, r7, r7\n\t"
  23601. #elif defined(__clang__)
  23602. "sbcs r7, r7\n\t"
  23603. #else
  23604. "sbc r7, r7\n\t"
  23605. #endif
  23606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23607. "subs r2, r2, r7\n\t"
  23608. #else
  23609. "sub r2, r2, r7\n\t"
  23610. #endif
  23611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23612. "mvns r7, r7\n\t"
  23613. #else
  23614. "mvn r7, r7\n\t"
  23615. #endif
  23616. #ifdef WOLFSSL_KEIL
  23617. "ands r3, r3, r7\n\t"
  23618. #elif defined(__clang__)
  23619. "ands r3, r7\n\t"
  23620. #else
  23621. "and r3, r7\n\t"
  23622. #endif
  23623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23624. "subs r6, r6, #4\n\t"
  23625. #else
  23626. "sub r6, r6, #4\n\t"
  23627. #endif
  23628. "cmp r6, #0\n\t"
  23629. "bge L_sp_2048_cmp_32_words_%=\n\t"
  23630. "movs %[a], r2\n\t"
  23631. : [a] "+r" (a), [b] "+r" (b)
  23632. :
  23633. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  23634. );
  23635. return (uint32_t)(size_t)a;
  23636. }
  23637. /* Divide d in a and put remainder into r (m*d + r = a)
  23638. * m is not calculated as it is not needed at this time.
  23639. *
  23640. * a Number to be divided.
  23641. * d Number to divide with.
  23642. * m Multiplier result.
  23643. * r Remainder from the division.
  23644. * returns MP_OKAY indicating success.
  23645. */
  23646. static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m,
  23647. sp_digit* r)
  23648. {
  23649. sp_digit t1[64], t2[33];
  23650. sp_digit div, r1;
  23651. int i;
  23652. (void)m;
  23653. div = d[31];
  23654. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  23655. for (i=31; i>=0; i--) {
  23656. sp_digit hi = t1[32 + i] - (t1[32 + i] == div);
  23657. r1 = div_2048_word_32(hi, t1[32 + i - 1], div);
  23658. sp_2048_mul_d_32(t2, d, r1);
  23659. t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2);
  23660. t1[32 + i] -= t2[32];
  23661. sp_2048_mask_32(t2, d, t1[32 + i]);
  23662. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  23663. sp_2048_mask_32(t2, d, t1[32 + i]);
  23664. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  23665. }
  23666. r1 = sp_2048_cmp_32(t1, d) >= 0;
  23667. sp_2048_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  23668. return MP_OKAY;
  23669. }
  23670. /* Reduce a modulo m into r. (r = a mod m)
  23671. *
  23672. * r A single precision number that is the reduced result.
  23673. * a A single precision number that is to be reduced.
  23674. * m A single precision number that is the modulus to reduce with.
  23675. * returns MP_OKAY indicating success.
  23676. */
  23677. static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  23678. {
  23679. return sp_2048_div_32(a, m, NULL, r);
  23680. }
  23681. #ifdef WOLFSSL_SP_SMALL
  23682. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  23683. *
  23684. * r A single precision number that is the result of the operation.
  23685. * a A single precision number being exponentiated.
  23686. * e A single precision number that is the exponent.
  23687. * bits The number of bits in the exponent.
  23688. * m A single precision number that is the modulus.
  23689. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  23690. */
  23691. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  23692. int bits, const sp_digit* m, int reduceA)
  23693. {
  23694. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23695. sp_digit* td = NULL;
  23696. #else
  23697. sp_digit td[16 * 64];
  23698. #endif
  23699. sp_digit* t[16];
  23700. sp_digit* norm = NULL;
  23701. sp_digit mp = 1;
  23702. sp_digit n;
  23703. sp_digit mask;
  23704. int i;
  23705. int c;
  23706. byte y;
  23707. int err = MP_OKAY;
  23708. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23709. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 64), NULL,
  23710. DYNAMIC_TYPE_TMP_BUFFER);
  23711. if (td == NULL)
  23712. err = MEMORY_E;
  23713. #endif
  23714. if (err == MP_OKAY) {
  23715. norm = td;
  23716. for (i=0; i<16; i++) {
  23717. t[i] = td + i * 64;
  23718. }
  23719. sp_2048_mont_setup(m, &mp);
  23720. sp_2048_mont_norm_32(norm, m);
  23721. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  23722. if (reduceA != 0) {
  23723. err = sp_2048_mod_32(t[1] + 32, a, m);
  23724. if (err == MP_OKAY) {
  23725. err = sp_2048_mod_32(t[1], t[1], m);
  23726. }
  23727. }
  23728. else {
  23729. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  23730. err = sp_2048_mod_32(t[1], t[1], m);
  23731. }
  23732. }
  23733. if (err == MP_OKAY) {
  23734. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  23735. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  23736. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  23737. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  23738. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  23739. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  23740. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  23741. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  23742. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  23743. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  23744. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  23745. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  23746. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  23747. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  23748. i = (bits - 1) / 32;
  23749. n = e[i--];
  23750. c = bits & 31;
  23751. if (c == 0) {
  23752. c = 32;
  23753. }
  23754. c -= bits % 4;
  23755. if (c == 32) {
  23756. c = 28;
  23757. }
  23758. if (c < 0) {
  23759. /* Number of bits in top word is less than number needed. */
  23760. c = -c;
  23761. y = (byte)(n << c);
  23762. n = e[i--];
  23763. y |= (byte)(n >> (64 - c));
  23764. n <<= c;
  23765. c = 64 - c;
  23766. }
  23767. else {
  23768. y = (byte)(n >> c);
  23769. n <<= 32 - c;
  23770. }
  23771. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  23772. for (; i>=0 || c>=4; ) {
  23773. if (c == 0) {
  23774. n = e[i--];
  23775. y = (byte)(n >> 28);
  23776. n <<= 4;
  23777. c = 28;
  23778. }
  23779. else if (c < 4) {
  23780. y = (byte)(n >> 28);
  23781. n = e[i--];
  23782. c = 4 - c;
  23783. y |= (byte)(n >> (32 - c));
  23784. n <<= c;
  23785. c = 32 - c;
  23786. }
  23787. else {
  23788. y = (byte)((n >> 28) & 0xf);
  23789. n <<= 4;
  23790. c -= 4;
  23791. }
  23792. sp_2048_mont_sqr_32(r, r, m, mp);
  23793. sp_2048_mont_sqr_32(r, r, m, mp);
  23794. sp_2048_mont_sqr_32(r, r, m, mp);
  23795. sp_2048_mont_sqr_32(r, r, m, mp);
  23796. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  23797. }
  23798. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  23799. sp_2048_mont_reduce_32(r, m, mp);
  23800. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  23801. sp_2048_cond_sub_32(r, r, m, mask);
  23802. }
  23803. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23804. if (td != NULL)
  23805. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23806. #endif
  23807. return err;
  23808. }
  23809. #else
  23810. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  23811. *
  23812. * r A single precision number that is the result of the operation.
  23813. * a A single precision number being exponentiated.
  23814. * e A single precision number that is the exponent.
  23815. * bits The number of bits in the exponent.
  23816. * m A single precision number that is the modulus.
  23817. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  23818. */
  23819. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  23820. int bits, const sp_digit* m, int reduceA)
  23821. {
  23822. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23823. sp_digit* td = NULL;
  23824. #else
  23825. sp_digit td[32 * 64];
  23826. #endif
  23827. sp_digit* t[32];
  23828. sp_digit* norm = NULL;
  23829. sp_digit mp = 1;
  23830. sp_digit n;
  23831. sp_digit mask;
  23832. int i;
  23833. int c;
  23834. byte y;
  23835. int err = MP_OKAY;
  23836. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23837. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 64), NULL,
  23838. DYNAMIC_TYPE_TMP_BUFFER);
  23839. if (td == NULL)
  23840. err = MEMORY_E;
  23841. #endif
  23842. if (err == MP_OKAY) {
  23843. norm = td;
  23844. for (i=0; i<32; i++) {
  23845. t[i] = td + i * 64;
  23846. }
  23847. sp_2048_mont_setup(m, &mp);
  23848. sp_2048_mont_norm_32(norm, m);
  23849. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  23850. if (reduceA != 0) {
  23851. err = sp_2048_mod_32(t[1] + 32, a, m);
  23852. if (err == MP_OKAY) {
  23853. err = sp_2048_mod_32(t[1], t[1], m);
  23854. }
  23855. }
  23856. else {
  23857. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  23858. err = sp_2048_mod_32(t[1], t[1], m);
  23859. }
  23860. }
  23861. if (err == MP_OKAY) {
  23862. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  23863. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  23864. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  23865. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  23866. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  23867. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  23868. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  23869. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  23870. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  23871. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  23872. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  23873. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  23874. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  23875. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  23876. sp_2048_mont_sqr_32(t[16], t[ 8], m, mp);
  23877. sp_2048_mont_mul_32(t[17], t[ 9], t[ 8], m, mp);
  23878. sp_2048_mont_sqr_32(t[18], t[ 9], m, mp);
  23879. sp_2048_mont_mul_32(t[19], t[10], t[ 9], m, mp);
  23880. sp_2048_mont_sqr_32(t[20], t[10], m, mp);
  23881. sp_2048_mont_mul_32(t[21], t[11], t[10], m, mp);
  23882. sp_2048_mont_sqr_32(t[22], t[11], m, mp);
  23883. sp_2048_mont_mul_32(t[23], t[12], t[11], m, mp);
  23884. sp_2048_mont_sqr_32(t[24], t[12], m, mp);
  23885. sp_2048_mont_mul_32(t[25], t[13], t[12], m, mp);
  23886. sp_2048_mont_sqr_32(t[26], t[13], m, mp);
  23887. sp_2048_mont_mul_32(t[27], t[14], t[13], m, mp);
  23888. sp_2048_mont_sqr_32(t[28], t[14], m, mp);
  23889. sp_2048_mont_mul_32(t[29], t[15], t[14], m, mp);
  23890. sp_2048_mont_sqr_32(t[30], t[15], m, mp);
  23891. sp_2048_mont_mul_32(t[31], t[16], t[15], m, mp);
  23892. i = (bits - 1) / 32;
  23893. n = e[i--];
  23894. c = bits & 31;
  23895. if (c == 0) {
  23896. c = 32;
  23897. }
  23898. c -= bits % 5;
  23899. if (c == 32) {
  23900. c = 27;
  23901. }
  23902. if (c < 0) {
  23903. /* Number of bits in top word is less than number needed. */
  23904. c = -c;
  23905. y = (byte)(n << c);
  23906. n = e[i--];
  23907. y |= (byte)(n >> (64 - c));
  23908. n <<= c;
  23909. c = 64 - c;
  23910. }
  23911. else {
  23912. y = (byte)(n >> c);
  23913. n <<= 32 - c;
  23914. }
  23915. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  23916. for (; i>=0 || c>=5; ) {
  23917. if (c == 0) {
  23918. n = e[i--];
  23919. y = (byte)(n >> 27);
  23920. n <<= 5;
  23921. c = 27;
  23922. }
  23923. else if (c < 5) {
  23924. y = (byte)(n >> 27);
  23925. n = e[i--];
  23926. c = 5 - c;
  23927. y |= (byte)(n >> (32 - c));
  23928. n <<= c;
  23929. c = 32 - c;
  23930. }
  23931. else {
  23932. y = (byte)((n >> 27) & 0x1f);
  23933. n <<= 5;
  23934. c -= 5;
  23935. }
  23936. sp_2048_mont_sqr_32(r, r, m, mp);
  23937. sp_2048_mont_sqr_32(r, r, m, mp);
  23938. sp_2048_mont_sqr_32(r, r, m, mp);
  23939. sp_2048_mont_sqr_32(r, r, m, mp);
  23940. sp_2048_mont_sqr_32(r, r, m, mp);
  23941. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  23942. }
  23943. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  23944. sp_2048_mont_reduce_32(r, m, mp);
  23945. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  23946. sp_2048_cond_sub_32(r, r, m, mask);
  23947. }
  23948. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23949. if (td != NULL)
  23950. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23951. #endif
  23952. return err;
  23953. }
  23954. #endif /* WOLFSSL_SP_SMALL */
  23955. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  23956. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  23957. /* r = 2^n mod m where n is the number of bits to reduce by.
  23958. * Given m must be 2048 bits, just need to subtract.
  23959. *
  23960. * r A single precision number.
  23961. * m A single precision number.
  23962. */
  23963. static void sp_2048_mont_norm_64(sp_digit* r, const sp_digit* m)
  23964. {
  23965. XMEMSET(r, 0, sizeof(sp_digit) * 64);
  23966. /* r = 2^n mod m */
  23967. sp_2048_sub_in_place_64(r, m);
  23968. }
  23969. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  23970. /* Conditionally subtract b from a using the mask m.
  23971. * m is -1 to subtract and 0 when not copying.
  23972. *
  23973. * r A single precision number representing condition subtract result.
  23974. * a A single precision number to subtract from.
  23975. * b A single precision number to subtract.
  23976. * m Mask value to apply.
  23977. */
  23978. SP_NOINLINE static sp_digit sp_2048_cond_sub_64(sp_digit* r, const sp_digit* a,
  23979. const sp_digit* b, sp_digit m)
  23980. {
  23981. __asm__ __volatile__ (
  23982. "movs r4, #0\n\t"
  23983. "movs r5, #0xff\n\t"
  23984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23985. "adds r5, r5, #1\n\t"
  23986. #else
  23987. "add r5, r5, #1\n\t"
  23988. #endif
  23989. "mov r8, r5\n\t"
  23990. "movs r7, #0\n\t"
  23991. "\n"
  23992. "L_sp_2048_cond_sub_64_words_%=:\n\t"
  23993. "ldr r6, [%[b], r7]\n\t"
  23994. #ifdef WOLFSSL_KEIL
  23995. "ands r6, r6, %[m]\n\t"
  23996. #elif defined(__clang__)
  23997. "ands r6, %[m]\n\t"
  23998. #else
  23999. "and r6, %[m]\n\t"
  24000. #endif
  24001. "movs r5, #0\n\t"
  24002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24003. "subs r5, r5, r4\n\t"
  24004. #else
  24005. "sub r5, r5, r4\n\t"
  24006. #endif
  24007. "ldr r5, [%[a], r7]\n\t"
  24008. #ifdef WOLFSSL_KEIL
  24009. "sbcs r5, r5, r6\n\t"
  24010. #elif defined(__clang__)
  24011. "sbcs r5, r6\n\t"
  24012. #else
  24013. "sbc r5, r6\n\t"
  24014. #endif
  24015. #ifdef WOLFSSL_KEIL
  24016. "sbcs r4, r4, r4\n\t"
  24017. #elif defined(__clang__)
  24018. "sbcs r4, r4\n\t"
  24019. #else
  24020. "sbc r4, r4\n\t"
  24021. #endif
  24022. "str r5, [%[r], r7]\n\t"
  24023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24024. "adds r7, r7, #4\n\t"
  24025. #else
  24026. "add r7, r7, #4\n\t"
  24027. #endif
  24028. "cmp r7, r8\n\t"
  24029. "blt L_sp_2048_cond_sub_64_words_%=\n\t"
  24030. "movs %[r], r4\n\t"
  24031. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  24032. :
  24033. : "memory", "r4", "r5", "r6", "r7", "r8"
  24034. );
  24035. return (uint32_t)(size_t)r;
  24036. }
  24037. /* Reduce the number back to 2048 bits using Montgomery reduction.
  24038. *
  24039. * a A single precision number to reduce in place.
  24040. * m The single precision number representing the modulus.
  24041. * mp The digit representing the negative inverse of m mod 2^n.
  24042. */
  24043. SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a, const sp_digit* m,
  24044. sp_digit mp)
  24045. {
  24046. __asm__ __volatile__ (
  24047. "movs r7, #0\n\t"
  24048. "mov r8, %[mp]\n\t"
  24049. "mov r12, r7\n\t"
  24050. "mov lr, %[m]\n\t"
  24051. "mov r9, %[a]\n\t"
  24052. "mov r11, %[a]\n\t"
  24053. "movs r5, #0xfc\n\t"
  24054. "movs r6, #0xff\n\t"
  24055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24056. "adds r6, r6, #1\n\t"
  24057. #else
  24058. "add r6, r6, #1\n\t"
  24059. #endif
  24060. "add r9, r9, r5\n\t"
  24061. "add r11, r11, r6\n\t"
  24062. "\n"
  24063. "L_sp_2048_mont_reduce_64_mod_%=:\n\t"
  24064. "movs r7, #0\n\t"
  24065. "movs r4, #0\n\t"
  24066. "# a[i] += m[0] * mu\n\t"
  24067. "ldm %[m]!, {%[mp]}\n\t"
  24068. "ldm %[a]!, {r3}\n\t"
  24069. "# mu = a[i] * mp\n\t"
  24070. "mov r5, r8\n\t"
  24071. #ifdef WOLFSSL_KEIL
  24072. "muls r5, r3, r5\n\t"
  24073. #elif defined(__clang__)
  24074. "muls r5, r3\n\t"
  24075. #else
  24076. "mul r5, r3\n\t"
  24077. #endif
  24078. "mov r10, r5\n\t"
  24079. "# Multiply m[0] and mu - Start\n\t"
  24080. "mov r5, r10\n\t"
  24081. "uxth r6, %[mp]\n\t"
  24082. "uxth r5, r5\n\t"
  24083. #ifdef WOLFSSL_KEIL
  24084. "muls r6, r5, r6\n\t"
  24085. #elif defined(__clang__)
  24086. "muls r6, r5\n\t"
  24087. #else
  24088. "mul r6, r5\n\t"
  24089. #endif
  24090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24091. "adds r3, r3, r6\n\t"
  24092. #else
  24093. "add r3, r3, r6\n\t"
  24094. #endif
  24095. #ifdef WOLFSSL_KEIL
  24096. "adcs r4, r4, r7\n\t"
  24097. #elif defined(__clang__)
  24098. "adcs r4, r7\n\t"
  24099. #else
  24100. "adc r4, r7\n\t"
  24101. #endif
  24102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24103. "lsrs r6, %[mp], #16\n\t"
  24104. #else
  24105. "lsr r6, %[mp], #16\n\t"
  24106. #endif
  24107. #ifdef WOLFSSL_KEIL
  24108. "muls r5, r6, r5\n\t"
  24109. #elif defined(__clang__)
  24110. "muls r5, r6\n\t"
  24111. #else
  24112. "mul r5, r6\n\t"
  24113. #endif
  24114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24115. "lsrs r6, r5, #16\n\t"
  24116. #else
  24117. "lsr r6, r5, #16\n\t"
  24118. #endif
  24119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24120. "lsls r5, r5, #16\n\t"
  24121. #else
  24122. "lsl r5, r5, #16\n\t"
  24123. #endif
  24124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24125. "adds r3, r3, r5\n\t"
  24126. #else
  24127. "add r3, r3, r5\n\t"
  24128. #endif
  24129. #ifdef WOLFSSL_KEIL
  24130. "adcs r4, r4, r6\n\t"
  24131. #elif defined(__clang__)
  24132. "adcs r4, r6\n\t"
  24133. #else
  24134. "adc r4, r6\n\t"
  24135. #endif
  24136. "mov r5, r10\n\t"
  24137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24138. "lsrs r6, %[mp], #16\n\t"
  24139. #else
  24140. "lsr r6, %[mp], #16\n\t"
  24141. #endif
  24142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24143. "lsrs r5, r5, #16\n\t"
  24144. #else
  24145. "lsr r5, r5, #16\n\t"
  24146. #endif
  24147. #ifdef WOLFSSL_KEIL
  24148. "muls r6, r5, r6\n\t"
  24149. #elif defined(__clang__)
  24150. "muls r6, r5\n\t"
  24151. #else
  24152. "mul r6, r5\n\t"
  24153. #endif
  24154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24155. "adds r4, r4, r6\n\t"
  24156. #else
  24157. "add r4, r4, r6\n\t"
  24158. #endif
  24159. "uxth r6, %[mp]\n\t"
  24160. #ifdef WOLFSSL_KEIL
  24161. "muls r5, r6, r5\n\t"
  24162. #elif defined(__clang__)
  24163. "muls r5, r6\n\t"
  24164. #else
  24165. "mul r5, r6\n\t"
  24166. #endif
  24167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24168. "lsrs r6, r5, #16\n\t"
  24169. #else
  24170. "lsr r6, r5, #16\n\t"
  24171. #endif
  24172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24173. "lsls r5, r5, #16\n\t"
  24174. #else
  24175. "lsl r5, r5, #16\n\t"
  24176. #endif
  24177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24178. "adds r3, r3, r5\n\t"
  24179. #else
  24180. "add r3, r3, r5\n\t"
  24181. #endif
  24182. #ifdef WOLFSSL_KEIL
  24183. "adcs r4, r4, r6\n\t"
  24184. #elif defined(__clang__)
  24185. "adcs r4, r6\n\t"
  24186. #else
  24187. "adc r4, r6\n\t"
  24188. #endif
  24189. "# Multiply m[0] and mu - Done\n\t"
  24190. "\n"
  24191. "L_sp_2048_mont_reduce_64_word_%=:\n\t"
  24192. "# a[i+j] += m[j] * mu\n\t"
  24193. "ldr r3, [%[a]]\n\t"
  24194. "ldm %[m]!, {%[mp]}\n\t"
  24195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24196. "adds r3, r3, r4\n\t"
  24197. #else
  24198. "add r3, r3, r4\n\t"
  24199. #endif
  24200. "movs r4, #0\n\t"
  24201. #ifdef WOLFSSL_KEIL
  24202. "adcs r4, r4, r7\n\t"
  24203. #elif defined(__clang__)
  24204. "adcs r4, r7\n\t"
  24205. #else
  24206. "adc r4, r7\n\t"
  24207. #endif
  24208. "# Multiply m[j] and mu - Start\n\t"
  24209. "mov r5, r10\n\t"
  24210. "uxth r6, %[mp]\n\t"
  24211. "uxth r5, r5\n\t"
  24212. #ifdef WOLFSSL_KEIL
  24213. "muls r6, r5, r6\n\t"
  24214. #elif defined(__clang__)
  24215. "muls r6, r5\n\t"
  24216. #else
  24217. "mul r6, r5\n\t"
  24218. #endif
  24219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24220. "adds r3, r3, r6\n\t"
  24221. #else
  24222. "add r3, r3, r6\n\t"
  24223. #endif
  24224. #ifdef WOLFSSL_KEIL
  24225. "adcs r4, r4, r7\n\t"
  24226. #elif defined(__clang__)
  24227. "adcs r4, r7\n\t"
  24228. #else
  24229. "adc r4, r7\n\t"
  24230. #endif
  24231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24232. "lsrs r6, %[mp], #16\n\t"
  24233. #else
  24234. "lsr r6, %[mp], #16\n\t"
  24235. #endif
  24236. #ifdef WOLFSSL_KEIL
  24237. "muls r5, r6, r5\n\t"
  24238. #elif defined(__clang__)
  24239. "muls r5, r6\n\t"
  24240. #else
  24241. "mul r5, r6\n\t"
  24242. #endif
  24243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24244. "lsrs r6, r5, #16\n\t"
  24245. #else
  24246. "lsr r6, r5, #16\n\t"
  24247. #endif
  24248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24249. "lsls r5, r5, #16\n\t"
  24250. #else
  24251. "lsl r5, r5, #16\n\t"
  24252. #endif
  24253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24254. "adds r3, r3, r5\n\t"
  24255. #else
  24256. "add r3, r3, r5\n\t"
  24257. #endif
  24258. #ifdef WOLFSSL_KEIL
  24259. "adcs r4, r4, r6\n\t"
  24260. #elif defined(__clang__)
  24261. "adcs r4, r6\n\t"
  24262. #else
  24263. "adc r4, r6\n\t"
  24264. #endif
  24265. "mov r5, r10\n\t"
  24266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24267. "lsrs r6, %[mp], #16\n\t"
  24268. #else
  24269. "lsr r6, %[mp], #16\n\t"
  24270. #endif
  24271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24272. "lsrs r5, r5, #16\n\t"
  24273. #else
  24274. "lsr r5, r5, #16\n\t"
  24275. #endif
  24276. #ifdef WOLFSSL_KEIL
  24277. "muls r6, r5, r6\n\t"
  24278. #elif defined(__clang__)
  24279. "muls r6, r5\n\t"
  24280. #else
  24281. "mul r6, r5\n\t"
  24282. #endif
  24283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24284. "adds r4, r4, r6\n\t"
  24285. #else
  24286. "add r4, r4, r6\n\t"
  24287. #endif
  24288. "uxth r6, %[mp]\n\t"
  24289. #ifdef WOLFSSL_KEIL
  24290. "muls r5, r6, r5\n\t"
  24291. #elif defined(__clang__)
  24292. "muls r5, r6\n\t"
  24293. #else
  24294. "mul r5, r6\n\t"
  24295. #endif
  24296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24297. "lsrs r6, r5, #16\n\t"
  24298. #else
  24299. "lsr r6, r5, #16\n\t"
  24300. #endif
  24301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24302. "lsls r5, r5, #16\n\t"
  24303. #else
  24304. "lsl r5, r5, #16\n\t"
  24305. #endif
  24306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24307. "adds r3, r3, r5\n\t"
  24308. #else
  24309. "add r3, r3, r5\n\t"
  24310. #endif
  24311. #ifdef WOLFSSL_KEIL
  24312. "adcs r4, r4, r6\n\t"
  24313. #elif defined(__clang__)
  24314. "adcs r4, r6\n\t"
  24315. #else
  24316. "adc r4, r6\n\t"
  24317. #endif
  24318. "# Multiply m[j] and mu - Done\n\t"
  24319. "stm %[a]!, {r3}\n\t"
  24320. "cmp %[a], r9\n\t"
  24321. "blt L_sp_2048_mont_reduce_64_word_%=\n\t"
  24322. "# a[i+63] += m[63] * mu\n\t"
  24323. "ldr %[mp], [%[m]]\n\t"
  24324. "mov r3, r12\n\t"
  24325. "# Multiply m[63] and mu - Start\n\t"
  24326. "mov r5, r10\n\t"
  24327. "uxth r6, %[mp]\n\t"
  24328. "uxth r5, r5\n\t"
  24329. #ifdef WOLFSSL_KEIL
  24330. "muls r6, r5, r6\n\t"
  24331. #elif defined(__clang__)
  24332. "muls r6, r5\n\t"
  24333. #else
  24334. "mul r6, r5\n\t"
  24335. #endif
  24336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24337. "adds r4, r4, r6\n\t"
  24338. #else
  24339. "add r4, r4, r6\n\t"
  24340. #endif
  24341. #ifdef WOLFSSL_KEIL
  24342. "adcs r3, r3, r7\n\t"
  24343. #elif defined(__clang__)
  24344. "adcs r3, r7\n\t"
  24345. #else
  24346. "adc r3, r7\n\t"
  24347. #endif
  24348. #ifdef WOLFSSL_KEIL
  24349. "adcs r7, r7, r7\n\t"
  24350. #elif defined(__clang__)
  24351. "adcs r7, r7\n\t"
  24352. #else
  24353. "adc r7, r7\n\t"
  24354. #endif
  24355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24356. "lsrs r6, %[mp], #16\n\t"
  24357. #else
  24358. "lsr r6, %[mp], #16\n\t"
  24359. #endif
  24360. #ifdef WOLFSSL_KEIL
  24361. "muls r5, r6, r5\n\t"
  24362. #elif defined(__clang__)
  24363. "muls r5, r6\n\t"
  24364. #else
  24365. "mul r5, r6\n\t"
  24366. #endif
  24367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24368. "lsrs r6, r5, #16\n\t"
  24369. #else
  24370. "lsr r6, r5, #16\n\t"
  24371. #endif
  24372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24373. "lsls r5, r5, #16\n\t"
  24374. #else
  24375. "lsl r5, r5, #16\n\t"
  24376. #endif
  24377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24378. "adds r4, r4, r5\n\t"
  24379. #else
  24380. "add r4, r4, r5\n\t"
  24381. #endif
  24382. #ifdef WOLFSSL_KEIL
  24383. "adcs r3, r3, r6\n\t"
  24384. #elif defined(__clang__)
  24385. "adcs r3, r6\n\t"
  24386. #else
  24387. "adc r3, r6\n\t"
  24388. #endif
  24389. #ifdef WOLFSSL_KEIL
  24390. "adcs r7, r7, r7\n\t"
  24391. #elif defined(__clang__)
  24392. "adcs r7, r7\n\t"
  24393. #else
  24394. "adc r7, r7\n\t"
  24395. #endif
  24396. "mov r5, r10\n\t"
  24397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24398. "lsrs r6, %[mp], #16\n\t"
  24399. #else
  24400. "lsr r6, %[mp], #16\n\t"
  24401. #endif
  24402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24403. "lsrs r5, r5, #16\n\t"
  24404. #else
  24405. "lsr r5, r5, #16\n\t"
  24406. #endif
  24407. #ifdef WOLFSSL_KEIL
  24408. "muls r6, r5, r6\n\t"
  24409. #elif defined(__clang__)
  24410. "muls r6, r5\n\t"
  24411. #else
  24412. "mul r6, r5\n\t"
  24413. #endif
  24414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24415. "adds r3, r3, r6\n\t"
  24416. #else
  24417. "add r3, r3, r6\n\t"
  24418. #endif
  24419. #ifdef WOLFSSL_KEIL
  24420. "adcs r7, r7, r7\n\t"
  24421. #elif defined(__clang__)
  24422. "adcs r7, r7\n\t"
  24423. #else
  24424. "adc r7, r7\n\t"
  24425. #endif
  24426. "uxth r6, %[mp]\n\t"
  24427. #ifdef WOLFSSL_KEIL
  24428. "muls r5, r6, r5\n\t"
  24429. #elif defined(__clang__)
  24430. "muls r5, r6\n\t"
  24431. #else
  24432. "mul r5, r6\n\t"
  24433. #endif
  24434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24435. "lsrs r6, r5, #16\n\t"
  24436. #else
  24437. "lsr r6, r5, #16\n\t"
  24438. #endif
  24439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24440. "lsls r5, r5, #16\n\t"
  24441. #else
  24442. "lsl r5, r5, #16\n\t"
  24443. #endif
  24444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24445. "adds r4, r4, r5\n\t"
  24446. #else
  24447. "add r4, r4, r5\n\t"
  24448. #endif
  24449. #ifdef WOLFSSL_KEIL
  24450. "adcs r3, r3, r6\n\t"
  24451. #elif defined(__clang__)
  24452. "adcs r3, r6\n\t"
  24453. #else
  24454. "adc r3, r6\n\t"
  24455. #endif
  24456. #ifdef WOLFSSL_KEIL
  24457. "adcs r7, r7, r7\n\t"
  24458. #elif defined(__clang__)
  24459. "adcs r7, r7\n\t"
  24460. #else
  24461. "adc r7, r7\n\t"
  24462. #endif
  24463. "# Multiply m[63] and mu - Done\n\t"
  24464. "ldr r5, [%[a]]\n\t"
  24465. "ldr r6, [%[a], #4]\n\t"
  24466. "movs %[mp], #0\n\t"
  24467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24468. "adds r5, r5, r4\n\t"
  24469. #else
  24470. "add r5, r5, r4\n\t"
  24471. #endif
  24472. #ifdef WOLFSSL_KEIL
  24473. "adcs r6, r6, r3\n\t"
  24474. #elif defined(__clang__)
  24475. "adcs r6, r3\n\t"
  24476. #else
  24477. "adc r6, r3\n\t"
  24478. #endif
  24479. #ifdef WOLFSSL_KEIL
  24480. "adcs r7, r7, %[mp]\n\t"
  24481. #elif defined(__clang__)
  24482. "adcs r7, %[mp]\n\t"
  24483. #else
  24484. "adc r7, %[mp]\n\t"
  24485. #endif
  24486. "stm %[a]!, {r5, r6}\n\t"
  24487. "# i += 1\n\t"
  24488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24489. "subs %[a], %[a], #4\n\t"
  24490. #else
  24491. "sub %[a], %[a], #4\n\t"
  24492. #endif
  24493. "movs r3, #0xfc\n\t"
  24494. "mov r9, %[a]\n\t"
  24495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24496. "subs %[a], %[a], r3\n\t"
  24497. #else
  24498. "sub %[a], %[a], r3\n\t"
  24499. #endif
  24500. "mov r12, r7\n\t"
  24501. "mov %[m], lr\n\t"
  24502. "cmp r11, %[a]\n\t"
  24503. "bgt L_sp_2048_mont_reduce_64_mod_%=\n\t"
  24504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24505. "negs r7, r7\n\t"
  24506. #else
  24507. "neg r7, r7\n\t"
  24508. #endif
  24509. "# Subtract masked modulus\n\t"
  24510. "movs r4, #0xff\n\t"
  24511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24512. "adds r4, r4, #1\n\t"
  24513. #else
  24514. "add r4, r4, #1\n\t"
  24515. #endif
  24516. "movs %[mp], #0\n\t"
  24517. "movs r3, #0\n\t"
  24518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24519. "subs %[a], %[a], r4\n\t"
  24520. #else
  24521. "sub %[a], %[a], r4\n\t"
  24522. #endif
  24523. #ifndef WOLFSSL_SP_LARGE_CODE
  24524. "\n"
  24525. "L_sp_2048_mont_reduce_64_sub_mask_%=:\n\t"
  24526. "ldm %[m]!, {r6}\n\t"
  24527. "movs r5, #0\n\t"
  24528. #ifdef WOLFSSL_KEIL
  24529. "ands r6, r6, r7\n\t"
  24530. #elif defined(__clang__)
  24531. "ands r6, r7\n\t"
  24532. #else
  24533. "and r6, r7\n\t"
  24534. #endif
  24535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24536. "subs r5, r5, %[mp]\n\t"
  24537. #else
  24538. "sub r5, r5, %[mp]\n\t"
  24539. #endif
  24540. "ldr r5, [%[a], r4]\n\t"
  24541. #ifdef WOLFSSL_KEIL
  24542. "sbcs r5, r5, r6\n\t"
  24543. #elif defined(__clang__)
  24544. "sbcs r5, r6\n\t"
  24545. #else
  24546. "sbc r5, r6\n\t"
  24547. #endif
  24548. #ifdef WOLFSSL_KEIL
  24549. "sbcs %[mp], %[mp], %[mp]\n\t"
  24550. #elif defined(__clang__)
  24551. "sbcs %[mp], %[mp]\n\t"
  24552. #else
  24553. "sbc %[mp], %[mp]\n\t"
  24554. #endif
  24555. "stm %[a]!, {r5}\n\t"
  24556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24557. "adds r3, r3, #4\n\t"
  24558. #else
  24559. "add r3, r3, #4\n\t"
  24560. #endif
  24561. "cmp r3, r4\n\t"
  24562. "blt L_sp_2048_mont_reduce_64_sub_mask_%=\n\t"
  24563. #else /* WOLFSSL_SP_LARGE_CODE */
  24564. "ldm %[m]!, {r6}\n\t"
  24565. #ifdef WOLFSSL_KEIL
  24566. "ands r6, r6, r7\n\t"
  24567. #elif defined(__clang__)
  24568. "ands r6, r7\n\t"
  24569. #else
  24570. "and r6, r7\n\t"
  24571. #endif
  24572. "ldr r5, [%[a], r4]\n\t"
  24573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24574. "subs r5, r5, r6\n\t"
  24575. #else
  24576. "sub r5, r5, r6\n\t"
  24577. #endif
  24578. "stm %[a]!, {r5}\n\t"
  24579. "ldm %[m]!, {r6}\n\t"
  24580. #ifdef WOLFSSL_KEIL
  24581. "ands r6, r6, r7\n\t"
  24582. #elif defined(__clang__)
  24583. "ands r6, r7\n\t"
  24584. #else
  24585. "and r6, r7\n\t"
  24586. #endif
  24587. "ldr r5, [%[a], r4]\n\t"
  24588. #ifdef WOLFSSL_KEIL
  24589. "sbcs r5, r5, r6\n\t"
  24590. #elif defined(__clang__)
  24591. "sbcs r5, r6\n\t"
  24592. #else
  24593. "sbc r5, r6\n\t"
  24594. #endif
  24595. "stm %[a]!, {r5}\n\t"
  24596. "ldm %[m]!, {r6}\n\t"
  24597. #ifdef WOLFSSL_KEIL
  24598. "ands r6, r6, r7\n\t"
  24599. #elif defined(__clang__)
  24600. "ands r6, r7\n\t"
  24601. #else
  24602. "and r6, r7\n\t"
  24603. #endif
  24604. "ldr r5, [%[a], r4]\n\t"
  24605. #ifdef WOLFSSL_KEIL
  24606. "sbcs r5, r5, r6\n\t"
  24607. #elif defined(__clang__)
  24608. "sbcs r5, r6\n\t"
  24609. #else
  24610. "sbc r5, r6\n\t"
  24611. #endif
  24612. "stm %[a]!, {r5}\n\t"
  24613. "ldm %[m]!, {r6}\n\t"
  24614. #ifdef WOLFSSL_KEIL
  24615. "ands r6, r6, r7\n\t"
  24616. #elif defined(__clang__)
  24617. "ands r6, r7\n\t"
  24618. #else
  24619. "and r6, r7\n\t"
  24620. #endif
  24621. "ldr r5, [%[a], r4]\n\t"
  24622. #ifdef WOLFSSL_KEIL
  24623. "sbcs r5, r5, r6\n\t"
  24624. #elif defined(__clang__)
  24625. "sbcs r5, r6\n\t"
  24626. #else
  24627. "sbc r5, r6\n\t"
  24628. #endif
  24629. "stm %[a]!, {r5}\n\t"
  24630. "ldm %[m]!, {r6}\n\t"
  24631. #ifdef WOLFSSL_KEIL
  24632. "ands r6, r6, r7\n\t"
  24633. #elif defined(__clang__)
  24634. "ands r6, r7\n\t"
  24635. #else
  24636. "and r6, r7\n\t"
  24637. #endif
  24638. "ldr r5, [%[a], r4]\n\t"
  24639. #ifdef WOLFSSL_KEIL
  24640. "sbcs r5, r5, r6\n\t"
  24641. #elif defined(__clang__)
  24642. "sbcs r5, r6\n\t"
  24643. #else
  24644. "sbc r5, r6\n\t"
  24645. #endif
  24646. "stm %[a]!, {r5}\n\t"
  24647. "ldm %[m]!, {r6}\n\t"
  24648. #ifdef WOLFSSL_KEIL
  24649. "ands r6, r6, r7\n\t"
  24650. #elif defined(__clang__)
  24651. "ands r6, r7\n\t"
  24652. #else
  24653. "and r6, r7\n\t"
  24654. #endif
  24655. "ldr r5, [%[a], r4]\n\t"
  24656. #ifdef WOLFSSL_KEIL
  24657. "sbcs r5, r5, r6\n\t"
  24658. #elif defined(__clang__)
  24659. "sbcs r5, r6\n\t"
  24660. #else
  24661. "sbc r5, r6\n\t"
  24662. #endif
  24663. "stm %[a]!, {r5}\n\t"
  24664. "ldm %[m]!, {r6}\n\t"
  24665. #ifdef WOLFSSL_KEIL
  24666. "ands r6, r6, r7\n\t"
  24667. #elif defined(__clang__)
  24668. "ands r6, r7\n\t"
  24669. #else
  24670. "and r6, r7\n\t"
  24671. #endif
  24672. "ldr r5, [%[a], r4]\n\t"
  24673. #ifdef WOLFSSL_KEIL
  24674. "sbcs r5, r5, r6\n\t"
  24675. #elif defined(__clang__)
  24676. "sbcs r5, r6\n\t"
  24677. #else
  24678. "sbc r5, r6\n\t"
  24679. #endif
  24680. "stm %[a]!, {r5}\n\t"
  24681. "ldm %[m]!, {r6}\n\t"
  24682. #ifdef WOLFSSL_KEIL
  24683. "ands r6, r6, r7\n\t"
  24684. #elif defined(__clang__)
  24685. "ands r6, r7\n\t"
  24686. #else
  24687. "and r6, r7\n\t"
  24688. #endif
  24689. "ldr r5, [%[a], r4]\n\t"
  24690. #ifdef WOLFSSL_KEIL
  24691. "sbcs r5, r5, r6\n\t"
  24692. #elif defined(__clang__)
  24693. "sbcs r5, r6\n\t"
  24694. #else
  24695. "sbc r5, r6\n\t"
  24696. #endif
  24697. "stm %[a]!, {r5}\n\t"
  24698. "ldm %[m]!, {r6}\n\t"
  24699. #ifdef WOLFSSL_KEIL
  24700. "ands r6, r6, r7\n\t"
  24701. #elif defined(__clang__)
  24702. "ands r6, r7\n\t"
  24703. #else
  24704. "and r6, r7\n\t"
  24705. #endif
  24706. "ldr r5, [%[a], r4]\n\t"
  24707. #ifdef WOLFSSL_KEIL
  24708. "sbcs r5, r5, r6\n\t"
  24709. #elif defined(__clang__)
  24710. "sbcs r5, r6\n\t"
  24711. #else
  24712. "sbc r5, r6\n\t"
  24713. #endif
  24714. "stm %[a]!, {r5}\n\t"
  24715. "ldm %[m]!, {r6}\n\t"
  24716. #ifdef WOLFSSL_KEIL
  24717. "ands r6, r6, r7\n\t"
  24718. #elif defined(__clang__)
  24719. "ands r6, r7\n\t"
  24720. #else
  24721. "and r6, r7\n\t"
  24722. #endif
  24723. "ldr r5, [%[a], r4]\n\t"
  24724. #ifdef WOLFSSL_KEIL
  24725. "sbcs r5, r5, r6\n\t"
  24726. #elif defined(__clang__)
  24727. "sbcs r5, r6\n\t"
  24728. #else
  24729. "sbc r5, r6\n\t"
  24730. #endif
  24731. "stm %[a]!, {r5}\n\t"
  24732. "ldm %[m]!, {r6}\n\t"
  24733. #ifdef WOLFSSL_KEIL
  24734. "ands r6, r6, r7\n\t"
  24735. #elif defined(__clang__)
  24736. "ands r6, r7\n\t"
  24737. #else
  24738. "and r6, r7\n\t"
  24739. #endif
  24740. "ldr r5, [%[a], r4]\n\t"
  24741. #ifdef WOLFSSL_KEIL
  24742. "sbcs r5, r5, r6\n\t"
  24743. #elif defined(__clang__)
  24744. "sbcs r5, r6\n\t"
  24745. #else
  24746. "sbc r5, r6\n\t"
  24747. #endif
  24748. "stm %[a]!, {r5}\n\t"
  24749. "ldm %[m]!, {r6}\n\t"
  24750. #ifdef WOLFSSL_KEIL
  24751. "ands r6, r6, r7\n\t"
  24752. #elif defined(__clang__)
  24753. "ands r6, r7\n\t"
  24754. #else
  24755. "and r6, r7\n\t"
  24756. #endif
  24757. "ldr r5, [%[a], r4]\n\t"
  24758. #ifdef WOLFSSL_KEIL
  24759. "sbcs r5, r5, r6\n\t"
  24760. #elif defined(__clang__)
  24761. "sbcs r5, r6\n\t"
  24762. #else
  24763. "sbc r5, r6\n\t"
  24764. #endif
  24765. "stm %[a]!, {r5}\n\t"
  24766. "ldm %[m]!, {r6}\n\t"
  24767. #ifdef WOLFSSL_KEIL
  24768. "ands r6, r6, r7\n\t"
  24769. #elif defined(__clang__)
  24770. "ands r6, r7\n\t"
  24771. #else
  24772. "and r6, r7\n\t"
  24773. #endif
  24774. "ldr r5, [%[a], r4]\n\t"
  24775. #ifdef WOLFSSL_KEIL
  24776. "sbcs r5, r5, r6\n\t"
  24777. #elif defined(__clang__)
  24778. "sbcs r5, r6\n\t"
  24779. #else
  24780. "sbc r5, r6\n\t"
  24781. #endif
  24782. "stm %[a]!, {r5}\n\t"
  24783. "ldm %[m]!, {r6}\n\t"
  24784. #ifdef WOLFSSL_KEIL
  24785. "ands r6, r6, r7\n\t"
  24786. #elif defined(__clang__)
  24787. "ands r6, r7\n\t"
  24788. #else
  24789. "and r6, r7\n\t"
  24790. #endif
  24791. "ldr r5, [%[a], r4]\n\t"
  24792. #ifdef WOLFSSL_KEIL
  24793. "sbcs r5, r5, r6\n\t"
  24794. #elif defined(__clang__)
  24795. "sbcs r5, r6\n\t"
  24796. #else
  24797. "sbc 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. #endif /* WOLFSSL_SP_LARGE_CODE */
  25651. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  25652. :
  25653. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  25654. );
  25655. }
  25656. /* Multiply two Montgomery form numbers mod the modulus (prime).
  25657. * (r = a * b mod m)
  25658. *
  25659. * r Result of multiplication.
  25660. * a First number to multiply in Montgomery form.
  25661. * b Second number to multiply in Montgomery form.
  25662. * m Modulus (prime).
  25663. * mp Montgomery mulitplier.
  25664. */
  25665. static void sp_2048_mont_mul_64(sp_digit* r, const sp_digit* a,
  25666. const sp_digit* b, const sp_digit* m, sp_digit mp)
  25667. {
  25668. sp_2048_mul_64(r, a, b);
  25669. sp_2048_mont_reduce_64(r, m, mp);
  25670. }
  25671. /* Square the Montgomery form number. (r = a * a mod m)
  25672. *
  25673. * r Result of squaring.
  25674. * a Number to square in Montgomery form.
  25675. * m Modulus (prime).
  25676. * mp Montgomery mulitplier.
  25677. */
  25678. static void sp_2048_mont_sqr_64(sp_digit* r, const sp_digit* a,
  25679. const sp_digit* m, sp_digit mp)
  25680. {
  25681. sp_2048_sqr_64(r, a);
  25682. sp_2048_mont_reduce_64(r, m, mp);
  25683. }
  25684. #ifdef WOLFSSL_SP_SMALL
  25685. /* Sub b from a into r. (r = a - b)
  25686. *
  25687. * r A single precision integer.
  25688. * a A single precision integer.
  25689. * b A single precision integer.
  25690. */
  25691. SP_NOINLINE static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a,
  25692. const sp_digit* b)
  25693. {
  25694. __asm__ __volatile__ (
  25695. "movs r6, %[a]\n\t"
  25696. "movs r3, #0\n\t"
  25697. "movs r5, #0xff\n\t"
  25698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25699. "adds r5, r5, #1\n\t"
  25700. #else
  25701. "add r5, r5, #1\n\t"
  25702. #endif
  25703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25704. "adds r6, r6, r5\n\t"
  25705. #else
  25706. "add r6, r6, r5\n\t"
  25707. #endif
  25708. "\n"
  25709. "L_sp_2048_sub_64_word_%=:\n\t"
  25710. "movs r5, #0\n\t"
  25711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25712. "subs r5, r5, r3\n\t"
  25713. #else
  25714. "sub r5, r5, r3\n\t"
  25715. #endif
  25716. "ldr r4, [%[a]]\n\t"
  25717. "ldr r5, [%[b]]\n\t"
  25718. #ifdef WOLFSSL_KEIL
  25719. "sbcs r4, r4, r5\n\t"
  25720. #elif defined(__clang__)
  25721. "sbcs r4, r5\n\t"
  25722. #else
  25723. "sbc r4, r5\n\t"
  25724. #endif
  25725. "str r4, [%[r]]\n\t"
  25726. #ifdef WOLFSSL_KEIL
  25727. "sbcs r3, r3, r3\n\t"
  25728. #elif defined(__clang__)
  25729. "sbcs r3, r3\n\t"
  25730. #else
  25731. "sbc r3, r3\n\t"
  25732. #endif
  25733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25734. "adds %[a], %[a], #4\n\t"
  25735. #else
  25736. "add %[a], %[a], #4\n\t"
  25737. #endif
  25738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25739. "adds %[b], %[b], #4\n\t"
  25740. #else
  25741. "add %[b], %[b], #4\n\t"
  25742. #endif
  25743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25744. "adds %[r], %[r], #4\n\t"
  25745. #else
  25746. "add %[r], %[r], #4\n\t"
  25747. #endif
  25748. "cmp %[a], r6\n\t"
  25749. "bne L_sp_2048_sub_64_word_%=\n\t"
  25750. "movs %[r], r3\n\t"
  25751. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  25752. :
  25753. : "memory", "r3", "r4", "r5", "r6"
  25754. );
  25755. return (uint32_t)(size_t)r;
  25756. }
  25757. #else
  25758. /* Sub b from a into r. (r = a - b)
  25759. *
  25760. * r A single precision integer.
  25761. * a A single precision integer.
  25762. * b A single precision integer.
  25763. */
  25764. SP_NOINLINE static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a,
  25765. const sp_digit* b)
  25766. {
  25767. __asm__ __volatile__ (
  25768. "ldm %[b]!, {r5, r6}\n\t"
  25769. "ldm %[a]!, {r3, r4}\n\t"
  25770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25771. "subs r3, r3, r5\n\t"
  25772. #else
  25773. "sub r3, r3, r5\n\t"
  25774. #endif
  25775. #ifdef WOLFSSL_KEIL
  25776. "sbcs r4, r4, r6\n\t"
  25777. #elif defined(__clang__)
  25778. "sbcs r4, r6\n\t"
  25779. #else
  25780. "sbc r4, r6\n\t"
  25781. #endif
  25782. "stm %[r]!, {r3, r4}\n\t"
  25783. "ldm %[b]!, {r5, r6}\n\t"
  25784. "ldm %[a]!, {r3, r4}\n\t"
  25785. #ifdef WOLFSSL_KEIL
  25786. "sbcs r3, r3, r5\n\t"
  25787. #elif defined(__clang__)
  25788. "sbcs r3, r5\n\t"
  25789. #else
  25790. "sbc r3, r5\n\t"
  25791. #endif
  25792. #ifdef WOLFSSL_KEIL
  25793. "sbcs r4, r4, r6\n\t"
  25794. #elif defined(__clang__)
  25795. "sbcs r4, r6\n\t"
  25796. #else
  25797. "sbc r4, r6\n\t"
  25798. #endif
  25799. "stm %[r]!, {r3, r4}\n\t"
  25800. "ldm %[b]!, {r5, r6}\n\t"
  25801. "ldm %[a]!, {r3, r4}\n\t"
  25802. #ifdef WOLFSSL_KEIL
  25803. "sbcs r3, r3, r5\n\t"
  25804. #elif defined(__clang__)
  25805. "sbcs r3, r5\n\t"
  25806. #else
  25807. "sbc r3, r5\n\t"
  25808. #endif
  25809. #ifdef WOLFSSL_KEIL
  25810. "sbcs r4, r4, r6\n\t"
  25811. #elif defined(__clang__)
  25812. "sbcs r4, r6\n\t"
  25813. #else
  25814. "sbc r4, r6\n\t"
  25815. #endif
  25816. "stm %[r]!, {r3, r4}\n\t"
  25817. "ldm %[b]!, {r5, r6}\n\t"
  25818. "ldm %[a]!, {r3, r4}\n\t"
  25819. #ifdef WOLFSSL_KEIL
  25820. "sbcs r3, r3, r5\n\t"
  25821. #elif defined(__clang__)
  25822. "sbcs r3, r5\n\t"
  25823. #else
  25824. "sbc r3, r5\n\t"
  25825. #endif
  25826. #ifdef WOLFSSL_KEIL
  25827. "sbcs r4, r4, r6\n\t"
  25828. #elif defined(__clang__)
  25829. "sbcs r4, r6\n\t"
  25830. #else
  25831. "sbc r4, r6\n\t"
  25832. #endif
  25833. "stm %[r]!, {r3, r4}\n\t"
  25834. "ldm %[b]!, {r5, r6}\n\t"
  25835. "ldm %[a]!, {r3, r4}\n\t"
  25836. #ifdef WOLFSSL_KEIL
  25837. "sbcs r3, r3, r5\n\t"
  25838. #elif defined(__clang__)
  25839. "sbcs r3, r5\n\t"
  25840. #else
  25841. "sbc r3, r5\n\t"
  25842. #endif
  25843. #ifdef WOLFSSL_KEIL
  25844. "sbcs r4, r4, r6\n\t"
  25845. #elif defined(__clang__)
  25846. "sbcs r4, r6\n\t"
  25847. #else
  25848. "sbc r4, r6\n\t"
  25849. #endif
  25850. "stm %[r]!, {r3, r4}\n\t"
  25851. "ldm %[b]!, {r5, r6}\n\t"
  25852. "ldm %[a]!, {r3, r4}\n\t"
  25853. #ifdef WOLFSSL_KEIL
  25854. "sbcs r3, r3, r5\n\t"
  25855. #elif defined(__clang__)
  25856. "sbcs r3, r5\n\t"
  25857. #else
  25858. "sbc r3, r5\n\t"
  25859. #endif
  25860. #ifdef WOLFSSL_KEIL
  25861. "sbcs r4, r4, r6\n\t"
  25862. #elif defined(__clang__)
  25863. "sbcs r4, r6\n\t"
  25864. #else
  25865. "sbc r4, r6\n\t"
  25866. #endif
  25867. "stm %[r]!, {r3, r4}\n\t"
  25868. "ldm %[b]!, {r5, r6}\n\t"
  25869. "ldm %[a]!, {r3, r4}\n\t"
  25870. #ifdef WOLFSSL_KEIL
  25871. "sbcs r3, r3, r5\n\t"
  25872. #elif defined(__clang__)
  25873. "sbcs r3, r5\n\t"
  25874. #else
  25875. "sbc r3, r5\n\t"
  25876. #endif
  25877. #ifdef WOLFSSL_KEIL
  25878. "sbcs r4, r4, r6\n\t"
  25879. #elif defined(__clang__)
  25880. "sbcs r4, r6\n\t"
  25881. #else
  25882. "sbc r4, r6\n\t"
  25883. #endif
  25884. "stm %[r]!, {r3, r4}\n\t"
  25885. "ldm %[b]!, {r5, r6}\n\t"
  25886. "ldm %[a]!, {r3, r4}\n\t"
  25887. #ifdef WOLFSSL_KEIL
  25888. "sbcs r3, r3, r5\n\t"
  25889. #elif defined(__clang__)
  25890. "sbcs r3, r5\n\t"
  25891. #else
  25892. "sbc r3, r5\n\t"
  25893. #endif
  25894. #ifdef WOLFSSL_KEIL
  25895. "sbcs r4, r4, r6\n\t"
  25896. #elif defined(__clang__)
  25897. "sbcs r4, r6\n\t"
  25898. #else
  25899. "sbc r4, r6\n\t"
  25900. #endif
  25901. "stm %[r]!, {r3, r4}\n\t"
  25902. "ldm %[b]!, {r5, r6}\n\t"
  25903. "ldm %[a]!, {r3, r4}\n\t"
  25904. #ifdef WOLFSSL_KEIL
  25905. "sbcs r3, r3, r5\n\t"
  25906. #elif defined(__clang__)
  25907. "sbcs r3, r5\n\t"
  25908. #else
  25909. "sbc r3, r5\n\t"
  25910. #endif
  25911. #ifdef WOLFSSL_KEIL
  25912. "sbcs r4, r4, r6\n\t"
  25913. #elif defined(__clang__)
  25914. "sbcs r4, r6\n\t"
  25915. #else
  25916. "sbc r4, r6\n\t"
  25917. #endif
  25918. "stm %[r]!, {r3, r4}\n\t"
  25919. "ldm %[b]!, {r5, r6}\n\t"
  25920. "ldm %[a]!, {r3, r4}\n\t"
  25921. #ifdef WOLFSSL_KEIL
  25922. "sbcs r3, r3, r5\n\t"
  25923. #elif defined(__clang__)
  25924. "sbcs r3, r5\n\t"
  25925. #else
  25926. "sbc r3, r5\n\t"
  25927. #endif
  25928. #ifdef WOLFSSL_KEIL
  25929. "sbcs r4, r4, r6\n\t"
  25930. #elif defined(__clang__)
  25931. "sbcs r4, r6\n\t"
  25932. #else
  25933. "sbc r4, r6\n\t"
  25934. #endif
  25935. "stm %[r]!, {r3, r4}\n\t"
  25936. "ldm %[b]!, {r5, r6}\n\t"
  25937. "ldm %[a]!, {r3, r4}\n\t"
  25938. #ifdef WOLFSSL_KEIL
  25939. "sbcs r3, r3, r5\n\t"
  25940. #elif defined(__clang__)
  25941. "sbcs r3, r5\n\t"
  25942. #else
  25943. "sbc r3, r5\n\t"
  25944. #endif
  25945. #ifdef WOLFSSL_KEIL
  25946. "sbcs r4, r4, r6\n\t"
  25947. #elif defined(__clang__)
  25948. "sbcs r4, r6\n\t"
  25949. #else
  25950. "sbc r4, r6\n\t"
  25951. #endif
  25952. "stm %[r]!, {r3, r4}\n\t"
  25953. "ldm %[b]!, {r5, r6}\n\t"
  25954. "ldm %[a]!, {r3, r4}\n\t"
  25955. #ifdef WOLFSSL_KEIL
  25956. "sbcs r3, r3, r5\n\t"
  25957. #elif defined(__clang__)
  25958. "sbcs r3, r5\n\t"
  25959. #else
  25960. "sbc r3, r5\n\t"
  25961. #endif
  25962. #ifdef WOLFSSL_KEIL
  25963. "sbcs r4, r4, r6\n\t"
  25964. #elif defined(__clang__)
  25965. "sbcs r4, r6\n\t"
  25966. #else
  25967. "sbc r4, r6\n\t"
  25968. #endif
  25969. "stm %[r]!, {r3, r4}\n\t"
  25970. "ldm %[b]!, {r5, r6}\n\t"
  25971. "ldm %[a]!, {r3, r4}\n\t"
  25972. #ifdef WOLFSSL_KEIL
  25973. "sbcs r3, r3, r5\n\t"
  25974. #elif defined(__clang__)
  25975. "sbcs r3, r5\n\t"
  25976. #else
  25977. "sbc r3, r5\n\t"
  25978. #endif
  25979. #ifdef WOLFSSL_KEIL
  25980. "sbcs r4, r4, r6\n\t"
  25981. #elif defined(__clang__)
  25982. "sbcs r4, r6\n\t"
  25983. #else
  25984. "sbc r4, r6\n\t"
  25985. #endif
  25986. "stm %[r]!, {r3, r4}\n\t"
  25987. "ldm %[b]!, {r5, r6}\n\t"
  25988. "ldm %[a]!, {r3, r4}\n\t"
  25989. #ifdef WOLFSSL_KEIL
  25990. "sbcs r3, r3, r5\n\t"
  25991. #elif defined(__clang__)
  25992. "sbcs r3, r5\n\t"
  25993. #else
  25994. "sbc 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. #ifdef WOLFSSL_KEIL
  26311. "sbcs %[r], %[r], %[r]\n\t"
  26312. #elif defined(__clang__)
  26313. "sbcs %[r], %[r]\n\t"
  26314. #else
  26315. "sbc %[r], %[r]\n\t"
  26316. #endif
  26317. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  26318. :
  26319. : "memory", "r3", "r4", "r5", "r6"
  26320. );
  26321. return (uint32_t)(size_t)r;
  26322. }
  26323. #endif /* WOLFSSL_SP_SMALL */
  26324. /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
  26325. *
  26326. * d1 The high order half of the number to divide.
  26327. * d0 The low order half of the number to divide.
  26328. * div The dividend.
  26329. * returns the result of the division.
  26330. *
  26331. * Note that this is an approximate div. It may give an answer 1 larger.
  26332. */
  26333. SP_NOINLINE static sp_digit div_2048_word_64(sp_digit d1, sp_digit d0,
  26334. sp_digit div)
  26335. {
  26336. __asm__ __volatile__ (
  26337. "movs r3, #0\n\t"
  26338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26339. "lsrs r5, %[div], #1\n\t"
  26340. #else
  26341. "lsr r5, %[div], #1\n\t"
  26342. #endif
  26343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26344. "adds r5, r5, #1\n\t"
  26345. #else
  26346. "add r5, r5, #1\n\t"
  26347. #endif
  26348. "mov r8, %[d0]\n\t"
  26349. "mov r9, %[d1]\n\t"
  26350. "# Do top 32\n\t"
  26351. "movs r6, r5\n\t"
  26352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26353. "subs r6, r6, %[d1]\n\t"
  26354. #else
  26355. "sub r6, r6, %[d1]\n\t"
  26356. #endif
  26357. #ifdef WOLFSSL_KEIL
  26358. "sbcs r6, r6, r6\n\t"
  26359. #elif defined(__clang__)
  26360. "sbcs r6, r6\n\t"
  26361. #else
  26362. "sbc r6, r6\n\t"
  26363. #endif
  26364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26365. "adds r3, r3, r3\n\t"
  26366. #else
  26367. "add r3, r3, r3\n\t"
  26368. #endif
  26369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26370. "subs r3, r3, r6\n\t"
  26371. #else
  26372. "sub r3, r3, r6\n\t"
  26373. #endif
  26374. #ifdef WOLFSSL_KEIL
  26375. "ands r6, r6, r5\n\t"
  26376. #elif defined(__clang__)
  26377. "ands r6, r5\n\t"
  26378. #else
  26379. "and r6, r5\n\t"
  26380. #endif
  26381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26382. "subs %[d1], %[d1], r6\n\t"
  26383. #else
  26384. "sub %[d1], %[d1], r6\n\t"
  26385. #endif
  26386. "movs r4, #29\n\t"
  26387. "\n"
  26388. "L_div_2048_word_64_loop_%=:\n\t"
  26389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26390. "lsls %[d0], %[d0], #1\n\t"
  26391. #else
  26392. "lsl %[d0], %[d0], #1\n\t"
  26393. #endif
  26394. #ifdef WOLFSSL_KEIL
  26395. "adcs %[d1], %[d1], %[d1]\n\t"
  26396. #elif defined(__clang__)
  26397. "adcs %[d1], %[d1]\n\t"
  26398. #else
  26399. "adc %[d1], %[d1]\n\t"
  26400. #endif
  26401. "movs r6, r5\n\t"
  26402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26403. "subs r6, r6, %[d1]\n\t"
  26404. #else
  26405. "sub r6, r6, %[d1]\n\t"
  26406. #endif
  26407. #ifdef WOLFSSL_KEIL
  26408. "sbcs r6, r6, r6\n\t"
  26409. #elif defined(__clang__)
  26410. "sbcs r6, r6\n\t"
  26411. #else
  26412. "sbc r6, r6\n\t"
  26413. #endif
  26414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26415. "adds r3, r3, r3\n\t"
  26416. #else
  26417. "add r3, r3, r3\n\t"
  26418. #endif
  26419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26420. "subs r3, r3, r6\n\t"
  26421. #else
  26422. "sub r3, r3, r6\n\t"
  26423. #endif
  26424. #ifdef WOLFSSL_KEIL
  26425. "ands r6, r6, r5\n\t"
  26426. #elif defined(__clang__)
  26427. "ands r6, r5\n\t"
  26428. #else
  26429. "and r6, r5\n\t"
  26430. #endif
  26431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26432. "subs %[d1], %[d1], r6\n\t"
  26433. #else
  26434. "sub %[d1], %[d1], r6\n\t"
  26435. #endif
  26436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26437. "subs r4, r4, #1\n\t"
  26438. #else
  26439. "sub r4, r4, #1\n\t"
  26440. #endif
  26441. "bpl L_div_2048_word_64_loop_%=\n\t"
  26442. "movs r7, #0\n\t"
  26443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26444. "adds r3, r3, r3\n\t"
  26445. #else
  26446. "add r3, r3, r3\n\t"
  26447. #endif
  26448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26449. "adds r3, r3, #1\n\t"
  26450. #else
  26451. "add r3, r3, #1\n\t"
  26452. #endif
  26453. "# r * div - Start\n\t"
  26454. "uxth %[d1], r3\n\t"
  26455. "uxth r4, %[div]\n\t"
  26456. #ifdef WOLFSSL_KEIL
  26457. "muls r4, %[d1], r4\n\t"
  26458. #elif defined(__clang__)
  26459. "muls r4, %[d1]\n\t"
  26460. #else
  26461. "mul r4, %[d1]\n\t"
  26462. #endif
  26463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26464. "lsrs r6, %[div], #16\n\t"
  26465. #else
  26466. "lsr r6, %[div], #16\n\t"
  26467. #endif
  26468. #ifdef WOLFSSL_KEIL
  26469. "muls %[d1], r6, %[d1]\n\t"
  26470. #elif defined(__clang__)
  26471. "muls %[d1], r6\n\t"
  26472. #else
  26473. "mul %[d1], r6\n\t"
  26474. #endif
  26475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26476. "lsrs r5, %[d1], #16\n\t"
  26477. #else
  26478. "lsr r5, %[d1], #16\n\t"
  26479. #endif
  26480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26481. "lsls %[d1], %[d1], #16\n\t"
  26482. #else
  26483. "lsl %[d1], %[d1], #16\n\t"
  26484. #endif
  26485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26486. "adds r4, r4, %[d1]\n\t"
  26487. #else
  26488. "add r4, r4, %[d1]\n\t"
  26489. #endif
  26490. #ifdef WOLFSSL_KEIL
  26491. "adcs r5, r5, r7\n\t"
  26492. #elif defined(__clang__)
  26493. "adcs r5, r7\n\t"
  26494. #else
  26495. "adc r5, r7\n\t"
  26496. #endif
  26497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26498. "lsrs %[d1], r3, #16\n\t"
  26499. #else
  26500. "lsr %[d1], r3, #16\n\t"
  26501. #endif
  26502. #ifdef WOLFSSL_KEIL
  26503. "muls r6, %[d1], r6\n\t"
  26504. #elif defined(__clang__)
  26505. "muls r6, %[d1]\n\t"
  26506. #else
  26507. "mul r6, %[d1]\n\t"
  26508. #endif
  26509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26510. "adds r5, r5, r6\n\t"
  26511. #else
  26512. "add r5, r5, r6\n\t"
  26513. #endif
  26514. "uxth r6, %[div]\n\t"
  26515. #ifdef WOLFSSL_KEIL
  26516. "muls %[d1], r6, %[d1]\n\t"
  26517. #elif defined(__clang__)
  26518. "muls %[d1], r6\n\t"
  26519. #else
  26520. "mul %[d1], r6\n\t"
  26521. #endif
  26522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26523. "lsrs r6, %[d1], #16\n\t"
  26524. #else
  26525. "lsr r6, %[d1], #16\n\t"
  26526. #endif
  26527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26528. "lsls %[d1], %[d1], #16\n\t"
  26529. #else
  26530. "lsl %[d1], %[d1], #16\n\t"
  26531. #endif
  26532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26533. "adds r4, r4, %[d1]\n\t"
  26534. #else
  26535. "add r4, r4, %[d1]\n\t"
  26536. #endif
  26537. #ifdef WOLFSSL_KEIL
  26538. "adcs r5, r5, r6\n\t"
  26539. #elif defined(__clang__)
  26540. "adcs r5, r6\n\t"
  26541. #else
  26542. "adc r5, r6\n\t"
  26543. #endif
  26544. "# r * div - Done\n\t"
  26545. "mov %[d1], r8\n\t"
  26546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26547. "subs %[d1], %[d1], r4\n\t"
  26548. #else
  26549. "sub %[d1], %[d1], r4\n\t"
  26550. #endif
  26551. "movs r4, %[d1]\n\t"
  26552. "mov %[d1], r9\n\t"
  26553. #ifdef WOLFSSL_KEIL
  26554. "sbcs %[d1], %[d1], r5\n\t"
  26555. #elif defined(__clang__)
  26556. "sbcs %[d1], r5\n\t"
  26557. #else
  26558. "sbc %[d1], r5\n\t"
  26559. #endif
  26560. "movs r5, %[d1]\n\t"
  26561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26562. "adds r3, r3, r5\n\t"
  26563. #else
  26564. "add r3, r3, r5\n\t"
  26565. #endif
  26566. "# r * div - Start\n\t"
  26567. "uxth %[d1], r3\n\t"
  26568. "uxth r4, %[div]\n\t"
  26569. #ifdef WOLFSSL_KEIL
  26570. "muls r4, %[d1], r4\n\t"
  26571. #elif defined(__clang__)
  26572. "muls r4, %[d1]\n\t"
  26573. #else
  26574. "mul r4, %[d1]\n\t"
  26575. #endif
  26576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26577. "lsrs r6, %[div], #16\n\t"
  26578. #else
  26579. "lsr r6, %[div], #16\n\t"
  26580. #endif
  26581. #ifdef WOLFSSL_KEIL
  26582. "muls %[d1], r6, %[d1]\n\t"
  26583. #elif defined(__clang__)
  26584. "muls %[d1], r6\n\t"
  26585. #else
  26586. "mul %[d1], r6\n\t"
  26587. #endif
  26588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26589. "lsrs r5, %[d1], #16\n\t"
  26590. #else
  26591. "lsr r5, %[d1], #16\n\t"
  26592. #endif
  26593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26594. "lsls %[d1], %[d1], #16\n\t"
  26595. #else
  26596. "lsl %[d1], %[d1], #16\n\t"
  26597. #endif
  26598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26599. "adds r4, r4, %[d1]\n\t"
  26600. #else
  26601. "add r4, r4, %[d1]\n\t"
  26602. #endif
  26603. #ifdef WOLFSSL_KEIL
  26604. "adcs r5, r5, r7\n\t"
  26605. #elif defined(__clang__)
  26606. "adcs r5, r7\n\t"
  26607. #else
  26608. "adc r5, r7\n\t"
  26609. #endif
  26610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26611. "lsrs %[d1], r3, #16\n\t"
  26612. #else
  26613. "lsr %[d1], r3, #16\n\t"
  26614. #endif
  26615. #ifdef WOLFSSL_KEIL
  26616. "muls r6, %[d1], r6\n\t"
  26617. #elif defined(__clang__)
  26618. "muls r6, %[d1]\n\t"
  26619. #else
  26620. "mul r6, %[d1]\n\t"
  26621. #endif
  26622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26623. "adds r5, r5, r6\n\t"
  26624. #else
  26625. "add r5, r5, r6\n\t"
  26626. #endif
  26627. "uxth r6, %[div]\n\t"
  26628. #ifdef WOLFSSL_KEIL
  26629. "muls %[d1], r6, %[d1]\n\t"
  26630. #elif defined(__clang__)
  26631. "muls %[d1], r6\n\t"
  26632. #else
  26633. "mul %[d1], r6\n\t"
  26634. #endif
  26635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26636. "lsrs r6, %[d1], #16\n\t"
  26637. #else
  26638. "lsr r6, %[d1], #16\n\t"
  26639. #endif
  26640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26641. "lsls %[d1], %[d1], #16\n\t"
  26642. #else
  26643. "lsl %[d1], %[d1], #16\n\t"
  26644. #endif
  26645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26646. "adds r4, r4, %[d1]\n\t"
  26647. #else
  26648. "add r4, r4, %[d1]\n\t"
  26649. #endif
  26650. #ifdef WOLFSSL_KEIL
  26651. "adcs r5, r5, r6\n\t"
  26652. #elif defined(__clang__)
  26653. "adcs r5, r6\n\t"
  26654. #else
  26655. "adc r5, r6\n\t"
  26656. #endif
  26657. "# r * div - Done\n\t"
  26658. "mov %[d1], r8\n\t"
  26659. "mov r6, r9\n\t"
  26660. #ifdef WOLFSSL_KEIL
  26661. "subs r4, %[d1], r4\n\t"
  26662. #else
  26663. #ifdef __clang__
  26664. "subs r4, %[d1], r4\n\t"
  26665. #else
  26666. "sub r4, %[d1], r4\n\t"
  26667. #endif
  26668. #endif
  26669. #ifdef WOLFSSL_KEIL
  26670. "sbcs r6, r6, r5\n\t"
  26671. #elif defined(__clang__)
  26672. "sbcs r6, r5\n\t"
  26673. #else
  26674. "sbc r6, r5\n\t"
  26675. #endif
  26676. "movs r5, r6\n\t"
  26677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26678. "adds r3, r3, r5\n\t"
  26679. #else
  26680. "add r3, r3, r5\n\t"
  26681. #endif
  26682. "# r * div - Start\n\t"
  26683. "uxth %[d1], r3\n\t"
  26684. "uxth r4, %[div]\n\t"
  26685. #ifdef WOLFSSL_KEIL
  26686. "muls r4, %[d1], r4\n\t"
  26687. #elif defined(__clang__)
  26688. "muls r4, %[d1]\n\t"
  26689. #else
  26690. "mul r4, %[d1]\n\t"
  26691. #endif
  26692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26693. "lsrs r6, %[div], #16\n\t"
  26694. #else
  26695. "lsr r6, %[div], #16\n\t"
  26696. #endif
  26697. #ifdef WOLFSSL_KEIL
  26698. "muls %[d1], r6, %[d1]\n\t"
  26699. #elif defined(__clang__)
  26700. "muls %[d1], r6\n\t"
  26701. #else
  26702. "mul %[d1], r6\n\t"
  26703. #endif
  26704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26705. "lsrs r5, %[d1], #16\n\t"
  26706. #else
  26707. "lsr r5, %[d1], #16\n\t"
  26708. #endif
  26709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26710. "lsls %[d1], %[d1], #16\n\t"
  26711. #else
  26712. "lsl %[d1], %[d1], #16\n\t"
  26713. #endif
  26714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26715. "adds r4, r4, %[d1]\n\t"
  26716. #else
  26717. "add r4, r4, %[d1]\n\t"
  26718. #endif
  26719. #ifdef WOLFSSL_KEIL
  26720. "adcs r5, r5, r7\n\t"
  26721. #elif defined(__clang__)
  26722. "adcs r5, r7\n\t"
  26723. #else
  26724. "adc r5, r7\n\t"
  26725. #endif
  26726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26727. "lsrs %[d1], r3, #16\n\t"
  26728. #else
  26729. "lsr %[d1], r3, #16\n\t"
  26730. #endif
  26731. #ifdef WOLFSSL_KEIL
  26732. "muls r6, %[d1], r6\n\t"
  26733. #elif defined(__clang__)
  26734. "muls r6, %[d1]\n\t"
  26735. #else
  26736. "mul r6, %[d1]\n\t"
  26737. #endif
  26738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26739. "adds r5, r5, r6\n\t"
  26740. #else
  26741. "add r5, r5, r6\n\t"
  26742. #endif
  26743. "uxth r6, %[div]\n\t"
  26744. #ifdef WOLFSSL_KEIL
  26745. "muls %[d1], r6, %[d1]\n\t"
  26746. #elif defined(__clang__)
  26747. "muls %[d1], r6\n\t"
  26748. #else
  26749. "mul %[d1], r6\n\t"
  26750. #endif
  26751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26752. "lsrs r6, %[d1], #16\n\t"
  26753. #else
  26754. "lsr r6, %[d1], #16\n\t"
  26755. #endif
  26756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26757. "lsls %[d1], %[d1], #16\n\t"
  26758. #else
  26759. "lsl %[d1], %[d1], #16\n\t"
  26760. #endif
  26761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26762. "adds r4, r4, %[d1]\n\t"
  26763. #else
  26764. "add r4, r4, %[d1]\n\t"
  26765. #endif
  26766. #ifdef WOLFSSL_KEIL
  26767. "adcs r5, r5, r6\n\t"
  26768. #elif defined(__clang__)
  26769. "adcs r5, r6\n\t"
  26770. #else
  26771. "adc r5, r6\n\t"
  26772. #endif
  26773. "# r * div - Done\n\t"
  26774. "mov %[d1], r8\n\t"
  26775. "mov r6, r9\n\t"
  26776. #ifdef WOLFSSL_KEIL
  26777. "subs r4, %[d1], r4\n\t"
  26778. #else
  26779. #ifdef __clang__
  26780. "subs r4, %[d1], r4\n\t"
  26781. #else
  26782. "sub r4, %[d1], r4\n\t"
  26783. #endif
  26784. #endif
  26785. #ifdef WOLFSSL_KEIL
  26786. "sbcs r6, r6, r5\n\t"
  26787. #elif defined(__clang__)
  26788. "sbcs r6, r5\n\t"
  26789. #else
  26790. "sbc r6, r5\n\t"
  26791. #endif
  26792. "movs r5, r6\n\t"
  26793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26794. "adds r3, r3, r5\n\t"
  26795. #else
  26796. "add r3, r3, r5\n\t"
  26797. #endif
  26798. "movs r6, %[div]\n\t"
  26799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26800. "subs r6, r6, r4\n\t"
  26801. #else
  26802. "sub r6, r6, r4\n\t"
  26803. #endif
  26804. #ifdef WOLFSSL_KEIL
  26805. "sbcs r6, r6, r6\n\t"
  26806. #elif defined(__clang__)
  26807. "sbcs r6, r6\n\t"
  26808. #else
  26809. "sbc r6, r6\n\t"
  26810. #endif
  26811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26812. "subs r3, r3, r6\n\t"
  26813. #else
  26814. "sub r3, r3, r6\n\t"
  26815. #endif
  26816. "movs %[d1], r3\n\t"
  26817. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  26818. :
  26819. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  26820. );
  26821. return (uint32_t)(size_t)d1;
  26822. }
  26823. /* Divide d in a and put remainder into r (m*d + r = a)
  26824. * m is not calculated as it is not needed at this time.
  26825. *
  26826. * a Number to be divided.
  26827. * d Number to divide with.
  26828. * m Multiplier result.
  26829. * r Remainder from the division.
  26830. * returns MP_OKAY indicating success.
  26831. */
  26832. static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  26833. sp_digit* r)
  26834. {
  26835. sp_digit t1[128], t2[65];
  26836. sp_digit div, r1;
  26837. int i;
  26838. (void)m;
  26839. div = d[63];
  26840. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  26841. for (i=63; i>=0; i--) {
  26842. sp_digit hi = t1[64 + i] - (t1[64 + i] == div);
  26843. r1 = div_2048_word_64(hi, t1[64 + i - 1], div);
  26844. sp_2048_mul_d_64(t2, d, r1);
  26845. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  26846. t1[64 + i] -= t2[64];
  26847. if (t1[64 + i] != 0) {
  26848. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  26849. if (t1[64 + i] != 0)
  26850. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  26851. }
  26852. }
  26853. for (i = 63; i > 0; i--) {
  26854. if (t1[i] != d[i])
  26855. break;
  26856. }
  26857. if (t1[i] >= d[i]) {
  26858. sp_2048_sub_64(r, t1, d);
  26859. }
  26860. else {
  26861. XMEMCPY(r, t1, sizeof(*t1) * 64);
  26862. }
  26863. return MP_OKAY;
  26864. }
  26865. /* Reduce a modulo m into r. (r = a mod m)
  26866. *
  26867. * r A single precision number that is the reduced result.
  26868. * a A single precision number that is to be reduced.
  26869. * m A single precision number that is the modulus to reduce with.
  26870. * returns MP_OKAY indicating success.
  26871. */
  26872. static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  26873. {
  26874. return sp_2048_div_64_cond(a, m, NULL, r);
  26875. }
  26876. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  26877. /* AND m into each word of a and store in r.
  26878. *
  26879. * r A single precision integer.
  26880. * a A single precision integer.
  26881. * m Mask to AND against each digit.
  26882. */
  26883. static void sp_2048_mask_64(sp_digit* r, const sp_digit* a, sp_digit m)
  26884. {
  26885. #ifdef WOLFSSL_SP_SMALL
  26886. int i;
  26887. for (i=0; i<64; i++) {
  26888. r[i] = a[i] & m;
  26889. }
  26890. #else
  26891. int i;
  26892. for (i = 0; i < 64; i += 8) {
  26893. r[i+0] = a[i+0] & m;
  26894. r[i+1] = a[i+1] & m;
  26895. r[i+2] = a[i+2] & m;
  26896. r[i+3] = a[i+3] & m;
  26897. r[i+4] = a[i+4] & m;
  26898. r[i+5] = a[i+5] & m;
  26899. r[i+6] = a[i+6] & m;
  26900. r[i+7] = a[i+7] & m;
  26901. }
  26902. #endif
  26903. }
  26904. /* Compare a with b in constant time.
  26905. *
  26906. * a A single precision integer.
  26907. * b A single precision integer.
  26908. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  26909. * respectively.
  26910. */
  26911. SP_NOINLINE static sp_int32 sp_2048_cmp_64(const sp_digit* a, const sp_digit* b)
  26912. {
  26913. __asm__ __volatile__ (
  26914. "movs r2, #0\n\t"
  26915. "movs r3, #0\n\t"
  26916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26917. "mvns r3, r3\n\t"
  26918. #else
  26919. "mvn r3, r3\n\t"
  26920. #endif
  26921. "movs r6, #0xfc\n\t"
  26922. "\n"
  26923. "L_sp_2048_cmp_64_words_%=:\n\t"
  26924. "ldr r7, [%[a], r6]\n\t"
  26925. "ldr r5, [%[b], r6]\n\t"
  26926. #ifdef WOLFSSL_KEIL
  26927. "ands r7, r7, r3\n\t"
  26928. #elif defined(__clang__)
  26929. "ands r7, r3\n\t"
  26930. #else
  26931. "and r7, r3\n\t"
  26932. #endif
  26933. #ifdef WOLFSSL_KEIL
  26934. "ands r5, r5, r3\n\t"
  26935. #elif defined(__clang__)
  26936. "ands r5, r3\n\t"
  26937. #else
  26938. "and r5, r3\n\t"
  26939. #endif
  26940. "movs r4, r7\n\t"
  26941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26942. "subs r7, r7, r5\n\t"
  26943. #else
  26944. "sub r7, r7, r5\n\t"
  26945. #endif
  26946. #ifdef WOLFSSL_KEIL
  26947. "sbcs r7, r7, r7\n\t"
  26948. #elif defined(__clang__)
  26949. "sbcs r7, r7\n\t"
  26950. #else
  26951. "sbc r7, r7\n\t"
  26952. #endif
  26953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26954. "adds r2, r2, r7\n\t"
  26955. #else
  26956. "add r2, r2, r7\n\t"
  26957. #endif
  26958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26959. "mvns r7, r7\n\t"
  26960. #else
  26961. "mvn r7, r7\n\t"
  26962. #endif
  26963. #ifdef WOLFSSL_KEIL
  26964. "ands r3, r3, r7\n\t"
  26965. #elif defined(__clang__)
  26966. "ands r3, r7\n\t"
  26967. #else
  26968. "and r3, r7\n\t"
  26969. #endif
  26970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26971. "subs r5, r5, r4\n\t"
  26972. #else
  26973. "sub r5, r5, r4\n\t"
  26974. #endif
  26975. #ifdef WOLFSSL_KEIL
  26976. "sbcs r7, r7, r7\n\t"
  26977. #elif defined(__clang__)
  26978. "sbcs r7, r7\n\t"
  26979. #else
  26980. "sbc r7, r7\n\t"
  26981. #endif
  26982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26983. "subs r2, r2, r7\n\t"
  26984. #else
  26985. "sub r2, r2, r7\n\t"
  26986. #endif
  26987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26988. "mvns r7, r7\n\t"
  26989. #else
  26990. "mvn r7, r7\n\t"
  26991. #endif
  26992. #ifdef WOLFSSL_KEIL
  26993. "ands r3, r3, r7\n\t"
  26994. #elif defined(__clang__)
  26995. "ands r3, r7\n\t"
  26996. #else
  26997. "and r3, r7\n\t"
  26998. #endif
  26999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27000. "subs r6, r6, #4\n\t"
  27001. #else
  27002. "sub r6, r6, #4\n\t"
  27003. #endif
  27004. "cmp r6, #0\n\t"
  27005. "bge L_sp_2048_cmp_64_words_%=\n\t"
  27006. "movs %[a], r2\n\t"
  27007. : [a] "+r" (a), [b] "+r" (b)
  27008. :
  27009. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  27010. );
  27011. return (uint32_t)(size_t)a;
  27012. }
  27013. /* Divide d in a and put remainder into r (m*d + r = a)
  27014. * m is not calculated as it is not needed at this time.
  27015. *
  27016. * a Number to be divided.
  27017. * d Number to divide with.
  27018. * m Multiplier result.
  27019. * r Remainder from the division.
  27020. * returns MP_OKAY indicating success.
  27021. */
  27022. static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d, sp_digit* m,
  27023. sp_digit* r)
  27024. {
  27025. sp_digit t1[128], t2[65];
  27026. sp_digit div, r1;
  27027. int i;
  27028. (void)m;
  27029. div = d[63];
  27030. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  27031. for (i=63; i>=0; i--) {
  27032. sp_digit hi = t1[64 + i] - (t1[64 + i] == div);
  27033. r1 = div_2048_word_64(hi, t1[64 + i - 1], div);
  27034. sp_2048_mul_d_64(t2, d, r1);
  27035. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  27036. t1[64 + i] -= t2[64];
  27037. sp_2048_mask_64(t2, d, t1[64 + i]);
  27038. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  27039. sp_2048_mask_64(t2, d, t1[64 + i]);
  27040. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  27041. }
  27042. r1 = sp_2048_cmp_64(t1, d) >= 0;
  27043. sp_2048_cond_sub_64(r, t1, d, (sp_digit)0 - r1);
  27044. return MP_OKAY;
  27045. }
  27046. /* Reduce a modulo m into r. (r = a mod m)
  27047. *
  27048. * r A single precision number that is the reduced result.
  27049. * a A single precision number that is to be reduced.
  27050. * m A single precision number that is the modulus to reduce with.
  27051. * returns MP_OKAY indicating success.
  27052. */
  27053. static WC_INLINE int sp_2048_mod_64(sp_digit* r, const sp_digit* a, const sp_digit* m)
  27054. {
  27055. return sp_2048_div_64(a, m, NULL, r);
  27056. }
  27057. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  27058. defined(WOLFSSL_HAVE_SP_DH)
  27059. #ifdef WOLFSSL_SP_SMALL
  27060. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  27061. *
  27062. * r A single precision number that is the result of the operation.
  27063. * a A single precision number being exponentiated.
  27064. * e A single precision number that is the exponent.
  27065. * bits The number of bits in the exponent.
  27066. * m A single precision number that is the modulus.
  27067. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  27068. */
  27069. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  27070. int bits, const sp_digit* m, int reduceA)
  27071. {
  27072. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27073. sp_digit* td = NULL;
  27074. #else
  27075. sp_digit td[8 * 128];
  27076. #endif
  27077. sp_digit* t[8];
  27078. sp_digit* norm = NULL;
  27079. sp_digit mp = 1;
  27080. sp_digit n;
  27081. sp_digit mask;
  27082. int i;
  27083. int c;
  27084. byte y;
  27085. int err = MP_OKAY;
  27086. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27087. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 128), NULL,
  27088. DYNAMIC_TYPE_TMP_BUFFER);
  27089. if (td == NULL)
  27090. err = MEMORY_E;
  27091. #endif
  27092. if (err == MP_OKAY) {
  27093. norm = td;
  27094. for (i=0; i<8; i++) {
  27095. t[i] = td + i * 128;
  27096. }
  27097. sp_2048_mont_setup(m, &mp);
  27098. sp_2048_mont_norm_64(norm, m);
  27099. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  27100. if (reduceA != 0) {
  27101. err = sp_2048_mod_64(t[1] + 64, a, m);
  27102. if (err == MP_OKAY) {
  27103. err = sp_2048_mod_64(t[1], t[1], m);
  27104. }
  27105. }
  27106. else {
  27107. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  27108. err = sp_2048_mod_64(t[1], t[1], m);
  27109. }
  27110. }
  27111. if (err == MP_OKAY) {
  27112. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  27113. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  27114. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  27115. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  27116. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  27117. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  27118. i = (bits - 1) / 32;
  27119. n = e[i--];
  27120. c = bits & 31;
  27121. if (c == 0) {
  27122. c = 32;
  27123. }
  27124. c -= bits % 3;
  27125. if (c == 32) {
  27126. c = 29;
  27127. }
  27128. if (c < 0) {
  27129. /* Number of bits in top word is less than number needed. */
  27130. c = -c;
  27131. y = (byte)(n << c);
  27132. n = e[i--];
  27133. y |= (byte)(n >> (64 - c));
  27134. n <<= c;
  27135. c = 64 - c;
  27136. }
  27137. else {
  27138. y = (byte)(n >> c);
  27139. n <<= 32 - c;
  27140. }
  27141. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  27142. for (; i>=0 || c>=3; ) {
  27143. if (c == 0) {
  27144. n = e[i--];
  27145. y = (byte)(n >> 29);
  27146. n <<= 3;
  27147. c = 29;
  27148. }
  27149. else if (c < 3) {
  27150. y = (byte)(n >> 29);
  27151. n = e[i--];
  27152. c = 3 - c;
  27153. y |= (byte)(n >> (32 - c));
  27154. n <<= c;
  27155. c = 32 - c;
  27156. }
  27157. else {
  27158. y = (byte)((n >> 29) & 0x7);
  27159. n <<= 3;
  27160. c -= 3;
  27161. }
  27162. sp_2048_mont_sqr_64(r, r, m, mp);
  27163. sp_2048_mont_sqr_64(r, r, m, mp);
  27164. sp_2048_mont_sqr_64(r, r, m, mp);
  27165. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  27166. }
  27167. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  27168. sp_2048_mont_reduce_64(r, m, mp);
  27169. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  27170. sp_2048_cond_sub_64(r, r, m, mask);
  27171. }
  27172. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27173. if (td != NULL)
  27174. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27175. #endif
  27176. return err;
  27177. }
  27178. #else
  27179. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  27180. *
  27181. * r A single precision number that is the result of the operation.
  27182. * a A single precision number being exponentiated.
  27183. * e A single precision number that is the exponent.
  27184. * bits The number of bits in the exponent.
  27185. * m A single precision number that is the modulus.
  27186. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  27187. */
  27188. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  27189. int bits, const sp_digit* m, int reduceA)
  27190. {
  27191. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27192. sp_digit* td = NULL;
  27193. #else
  27194. sp_digit td[16 * 128];
  27195. #endif
  27196. sp_digit* t[16];
  27197. sp_digit* norm = NULL;
  27198. sp_digit mp = 1;
  27199. sp_digit n;
  27200. sp_digit mask;
  27201. int i;
  27202. int c;
  27203. byte y;
  27204. int err = MP_OKAY;
  27205. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27206. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL,
  27207. DYNAMIC_TYPE_TMP_BUFFER);
  27208. if (td == NULL)
  27209. err = MEMORY_E;
  27210. #endif
  27211. if (err == MP_OKAY) {
  27212. norm = td;
  27213. for (i=0; i<16; i++) {
  27214. t[i] = td + i * 128;
  27215. }
  27216. sp_2048_mont_setup(m, &mp);
  27217. sp_2048_mont_norm_64(norm, m);
  27218. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  27219. if (reduceA != 0) {
  27220. err = sp_2048_mod_64(t[1] + 64, a, m);
  27221. if (err == MP_OKAY) {
  27222. err = sp_2048_mod_64(t[1], t[1], m);
  27223. }
  27224. }
  27225. else {
  27226. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  27227. err = sp_2048_mod_64(t[1], t[1], m);
  27228. }
  27229. }
  27230. if (err == MP_OKAY) {
  27231. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  27232. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  27233. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  27234. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  27235. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  27236. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  27237. sp_2048_mont_sqr_64(t[ 8], t[ 4], m, mp);
  27238. sp_2048_mont_mul_64(t[ 9], t[ 5], t[ 4], m, mp);
  27239. sp_2048_mont_sqr_64(t[10], t[ 5], m, mp);
  27240. sp_2048_mont_mul_64(t[11], t[ 6], t[ 5], m, mp);
  27241. sp_2048_mont_sqr_64(t[12], t[ 6], m, mp);
  27242. sp_2048_mont_mul_64(t[13], t[ 7], t[ 6], m, mp);
  27243. sp_2048_mont_sqr_64(t[14], t[ 7], m, mp);
  27244. sp_2048_mont_mul_64(t[15], t[ 8], t[ 7], m, mp);
  27245. i = (bits - 1) / 32;
  27246. n = e[i--];
  27247. c = bits & 31;
  27248. if (c == 0) {
  27249. c = 32;
  27250. }
  27251. c -= bits % 4;
  27252. if (c == 32) {
  27253. c = 28;
  27254. }
  27255. if (c < 0) {
  27256. /* Number of bits in top word is less than number needed. */
  27257. c = -c;
  27258. y = (byte)(n << c);
  27259. n = e[i--];
  27260. y |= (byte)(n >> (64 - c));
  27261. n <<= c;
  27262. c = 64 - c;
  27263. }
  27264. else {
  27265. y = (byte)(n >> c);
  27266. n <<= 32 - c;
  27267. }
  27268. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  27269. for (; i>=0 || c>=4; ) {
  27270. if (c == 0) {
  27271. n = e[i--];
  27272. y = (byte)(n >> 28);
  27273. n <<= 4;
  27274. c = 28;
  27275. }
  27276. else if (c < 4) {
  27277. y = (byte)(n >> 28);
  27278. n = e[i--];
  27279. c = 4 - c;
  27280. y |= (byte)(n >> (32 - c));
  27281. n <<= c;
  27282. c = 32 - c;
  27283. }
  27284. else {
  27285. y = (byte)((n >> 28) & 0xf);
  27286. n <<= 4;
  27287. c -= 4;
  27288. }
  27289. sp_2048_mont_sqr_64(r, r, m, mp);
  27290. sp_2048_mont_sqr_64(r, r, m, mp);
  27291. sp_2048_mont_sqr_64(r, r, m, mp);
  27292. sp_2048_mont_sqr_64(r, r, m, mp);
  27293. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  27294. }
  27295. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  27296. sp_2048_mont_reduce_64(r, m, mp);
  27297. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  27298. sp_2048_cond_sub_64(r, r, m, mask);
  27299. }
  27300. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27301. if (td != NULL)
  27302. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27303. #endif
  27304. return err;
  27305. }
  27306. #endif /* WOLFSSL_SP_SMALL */
  27307. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  27308. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  27309. #ifdef WOLFSSL_HAVE_SP_RSA
  27310. /* RSA public key operation.
  27311. *
  27312. * in Array of bytes representing the number to exponentiate, base.
  27313. * inLen Number of bytes in base.
  27314. * em Public exponent.
  27315. * mm Modulus.
  27316. * out Buffer to hold big-endian bytes of exponentiation result.
  27317. * Must be at least 256 bytes long.
  27318. * outLen Number of bytes in result.
  27319. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  27320. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  27321. */
  27322. int sp_RsaPublic_2048(const byte* in, word32 inLen, const mp_int* em,
  27323. const mp_int* mm, byte* out, word32* outLen)
  27324. {
  27325. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27326. sp_digit* a = NULL;
  27327. #else
  27328. sp_digit a[64 * 5];
  27329. #endif
  27330. sp_digit* m = NULL;
  27331. sp_digit* r = NULL;
  27332. sp_digit *ah = NULL;
  27333. sp_digit e[1] = {0};
  27334. int err = MP_OKAY;
  27335. if (*outLen < 256) {
  27336. err = MP_TO_E;
  27337. }
  27338. else if (mp_count_bits(em) > 32 || inLen > 256 ||
  27339. mp_count_bits(mm) != 2048) {
  27340. err = MP_READ_E;
  27341. }
  27342. else if (mp_iseven(mm)) {
  27343. err = MP_VAL;
  27344. }
  27345. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27346. if (err == MP_OKAY) {
  27347. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 5, NULL,
  27348. DYNAMIC_TYPE_RSA);
  27349. if (a == NULL)
  27350. err = MEMORY_E;
  27351. }
  27352. #endif
  27353. if (err == MP_OKAY) {
  27354. r = a + 64 * 2;
  27355. m = r + 64 * 2;
  27356. ah = a + 64;
  27357. sp_2048_from_bin(ah, 64, in, inLen);
  27358. #if DIGIT_BIT >= 32
  27359. e[0] = em->dp[0];
  27360. #else
  27361. e[0] = em->dp[0];
  27362. if (em->used > 1) {
  27363. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  27364. }
  27365. #endif
  27366. if (e[0] == 0) {
  27367. err = MP_EXPTMOD_E;
  27368. }
  27369. }
  27370. if (err == MP_OKAY) {
  27371. sp_2048_from_mp(m, 64, mm);
  27372. if (e[0] == 0x3) {
  27373. if (err == MP_OKAY) {
  27374. sp_2048_sqr_64(r, ah);
  27375. err = sp_2048_mod_64_cond(r, r, m);
  27376. }
  27377. if (err == MP_OKAY) {
  27378. sp_2048_mul_64(r, ah, r);
  27379. err = sp_2048_mod_64_cond(r, r, m);
  27380. }
  27381. }
  27382. else {
  27383. int i;
  27384. sp_digit mp;
  27385. sp_2048_mont_setup(m, &mp);
  27386. /* Convert to Montgomery form. */
  27387. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  27388. err = sp_2048_mod_64_cond(a, a, m);
  27389. if (err == MP_OKAY) {
  27390. for (i = 31; i >= 0; i--) {
  27391. if (e[0] >> i) {
  27392. break;
  27393. }
  27394. }
  27395. XMEMCPY(r, a, sizeof(sp_digit) * 64);
  27396. for (i--; i>=0; i--) {
  27397. sp_2048_mont_sqr_64(r, r, m, mp);
  27398. if (((e[0] >> i) & 1) == 1) {
  27399. sp_2048_mont_mul_64(r, r, a, m, mp);
  27400. }
  27401. }
  27402. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64);
  27403. sp_2048_mont_reduce_64(r, m, mp);
  27404. for (i = 63; i > 0; i--) {
  27405. if (r[i] != m[i]) {
  27406. break;
  27407. }
  27408. }
  27409. if (r[i] >= m[i]) {
  27410. sp_2048_sub_in_place_64(r, m);
  27411. }
  27412. }
  27413. }
  27414. }
  27415. if (err == MP_OKAY) {
  27416. sp_2048_to_bin_64(r, out);
  27417. *outLen = 256;
  27418. }
  27419. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27420. if (a != NULL)
  27421. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  27422. #endif
  27423. return err;
  27424. }
  27425. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  27426. /* Conditionally add a and b using the mask m.
  27427. * m is -1 to add and 0 when not.
  27428. *
  27429. * r A single precision number representing conditional add result.
  27430. * a A single precision number to add with.
  27431. * b A single precision number to add.
  27432. * m Mask value to apply.
  27433. */
  27434. SP_NOINLINE static sp_digit sp_2048_cond_add_32(sp_digit* r, const sp_digit* a,
  27435. const sp_digit* b, sp_digit m)
  27436. {
  27437. __asm__ __volatile__ (
  27438. "movs r4, #0\n\t"
  27439. "movs r5, #0x80\n\t"
  27440. "mov r8, r5\n\t"
  27441. "movs r7, #0\n\t"
  27442. "\n"
  27443. "L_sp_2048_cond_add_32_words_%=:\n\t"
  27444. "ldr r6, [%[b], r7]\n\t"
  27445. #ifdef WOLFSSL_KEIL
  27446. "ands r6, r6, %[m]\n\t"
  27447. #elif defined(__clang__)
  27448. "ands r6, %[m]\n\t"
  27449. #else
  27450. "and r6, %[m]\n\t"
  27451. #endif
  27452. "movs r5, #0\n\t"
  27453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27454. "subs r5, r5, #1\n\t"
  27455. #else
  27456. "sub r5, r5, #1\n\t"
  27457. #endif
  27458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27459. "adds r5, r5, r4\n\t"
  27460. #else
  27461. "add r5, r5, r4\n\t"
  27462. #endif
  27463. "ldr r5, [%[a], r7]\n\t"
  27464. #ifdef WOLFSSL_KEIL
  27465. "adcs r5, r5, r6\n\t"
  27466. #elif defined(__clang__)
  27467. "adcs r5, r6\n\t"
  27468. #else
  27469. "adc r5, r6\n\t"
  27470. #endif
  27471. "movs r4, #0\n\t"
  27472. #ifdef WOLFSSL_KEIL
  27473. "adcs r4, r4, r4\n\t"
  27474. #elif defined(__clang__)
  27475. "adcs r4, r4\n\t"
  27476. #else
  27477. "adc r4, r4\n\t"
  27478. #endif
  27479. "str r5, [%[r], r7]\n\t"
  27480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27481. "adds r7, r7, #4\n\t"
  27482. #else
  27483. "add r7, r7, #4\n\t"
  27484. #endif
  27485. "cmp r7, r8\n\t"
  27486. "blt L_sp_2048_cond_add_32_words_%=\n\t"
  27487. "movs %[r], r4\n\t"
  27488. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  27489. :
  27490. : "memory", "r4", "r5", "r6", "r7", "r8"
  27491. );
  27492. return (uint32_t)(size_t)r;
  27493. }
  27494. /* RSA private key operation.
  27495. *
  27496. * in Array of bytes representing the number to exponentiate, base.
  27497. * inLen Number of bytes in base.
  27498. * dm Private exponent.
  27499. * pm First prime.
  27500. * qm Second prime.
  27501. * dpm First prime's CRT exponent.
  27502. * dqm Second prime's CRT exponent.
  27503. * qim Inverse of second prime mod p.
  27504. * mm Modulus.
  27505. * out Buffer to hold big-endian bytes of exponentiation result.
  27506. * Must be at least 256 bytes long.
  27507. * outLen Number of bytes in result.
  27508. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  27509. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  27510. */
  27511. int sp_RsaPrivate_2048(const byte* in, word32 inLen, const mp_int* dm,
  27512. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  27513. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  27514. {
  27515. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  27516. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27517. sp_digit* d = NULL;
  27518. #else
  27519. sp_digit d[64 * 4];
  27520. #endif
  27521. sp_digit* a = NULL;
  27522. sp_digit* m = NULL;
  27523. sp_digit* r = NULL;
  27524. int err = MP_OKAY;
  27525. (void)pm;
  27526. (void)qm;
  27527. (void)dpm;
  27528. (void)dqm;
  27529. (void)qim;
  27530. if (*outLen < 256U) {
  27531. err = MP_TO_E;
  27532. }
  27533. if (err == MP_OKAY) {
  27534. if (mp_count_bits(dm) > 2048) {
  27535. err = MP_READ_E;
  27536. }
  27537. else if (inLen > 256) {
  27538. err = MP_READ_E;
  27539. }
  27540. else if (mp_count_bits(mm) != 2048) {
  27541. err = MP_READ_E;
  27542. }
  27543. else if (mp_iseven(mm)) {
  27544. err = MP_VAL;
  27545. }
  27546. }
  27547. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27548. if (err == MP_OKAY) {
  27549. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL,
  27550. DYNAMIC_TYPE_RSA);
  27551. if (d == NULL)
  27552. err = MEMORY_E;
  27553. }
  27554. #endif
  27555. if (err == MP_OKAY) {
  27556. a = d + 64;
  27557. m = a + 128;
  27558. r = a;
  27559. sp_2048_from_bin(a, 64, in, inLen);
  27560. sp_2048_from_mp(d, 64, dm);
  27561. sp_2048_from_mp(m, 64, mm);
  27562. err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0);
  27563. }
  27564. if (err == MP_OKAY) {
  27565. sp_2048_to_bin_64(r, out);
  27566. *outLen = 256;
  27567. }
  27568. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27569. if (d != NULL)
  27570. #endif
  27571. {
  27572. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  27573. if (a != NULL)
  27574. ForceZero(a, sizeof(sp_digit) * 64);
  27575. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27576. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  27577. #endif
  27578. }
  27579. return err;
  27580. #else
  27581. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27582. sp_digit* a = NULL;
  27583. #else
  27584. sp_digit a[32 * 11];
  27585. #endif
  27586. sp_digit* p = NULL;
  27587. sp_digit* q = NULL;
  27588. sp_digit* dp = NULL;
  27589. sp_digit* tmpa = NULL;
  27590. sp_digit* tmpb = NULL;
  27591. sp_digit* r = NULL;
  27592. sp_digit* qi = NULL;
  27593. sp_digit* dq = NULL;
  27594. sp_digit c;
  27595. int err = MP_OKAY;
  27596. (void)dm;
  27597. (void)mm;
  27598. if (*outLen < 256) {
  27599. err = MP_TO_E;
  27600. }
  27601. else if (inLen > 256 || mp_count_bits(mm) != 2048) {
  27602. err = MP_READ_E;
  27603. }
  27604. else if (mp_iseven(mm)) {
  27605. err = MP_VAL;
  27606. }
  27607. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27608. if (err == MP_OKAY) {
  27609. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 11, NULL,
  27610. DYNAMIC_TYPE_RSA);
  27611. if (a == NULL)
  27612. err = MEMORY_E;
  27613. }
  27614. #endif
  27615. if (err == MP_OKAY) {
  27616. p = a + 64 * 2;
  27617. q = p + 32;
  27618. qi = dq = dp = q + 32;
  27619. tmpa = qi + 32;
  27620. tmpb = tmpa + 64;
  27621. r = a;
  27622. sp_2048_from_bin(a, 64, in, inLen);
  27623. sp_2048_from_mp(p, 32, pm);
  27624. sp_2048_from_mp(q, 32, qm);
  27625. sp_2048_from_mp(dp, 32, dpm);
  27626. err = sp_2048_mod_exp_32(tmpa, a, dp, 1024, p, 1);
  27627. }
  27628. if (err == MP_OKAY) {
  27629. sp_2048_from_mp(dq, 32, dqm);
  27630. err = sp_2048_mod_exp_32(tmpb, a, dq, 1024, q, 1);
  27631. }
  27632. if (err == MP_OKAY) {
  27633. c = sp_2048_sub_in_place_32(tmpa, tmpb);
  27634. c += sp_2048_cond_add_32(tmpa, tmpa, p, c);
  27635. sp_2048_cond_add_32(tmpa, tmpa, p, c);
  27636. sp_2048_from_mp(qi, 32, qim);
  27637. sp_2048_mul_32(tmpa, tmpa, qi);
  27638. err = sp_2048_mod_32(tmpa, tmpa, p);
  27639. }
  27640. if (err == MP_OKAY) {
  27641. sp_2048_mul_32(tmpa, q, tmpa);
  27642. XMEMSET(&tmpb[32], 0, sizeof(sp_digit) * 32);
  27643. sp_2048_add_64(r, tmpb, tmpa);
  27644. sp_2048_to_bin_64(r, out);
  27645. *outLen = 256;
  27646. }
  27647. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27648. if (a != NULL)
  27649. #endif
  27650. {
  27651. ForceZero(a, sizeof(sp_digit) * 32 * 11);
  27652. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27653. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  27654. #endif
  27655. }
  27656. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  27657. return err;
  27658. }
  27659. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  27660. #endif /* WOLFSSL_HAVE_SP_RSA */
  27661. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  27662. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  27663. /* Convert an array of sp_digit to an mp_int.
  27664. *
  27665. * a A single precision integer.
  27666. * r A multi-precision integer.
  27667. */
  27668. static int sp_2048_to_mp(const sp_digit* a, mp_int* r)
  27669. {
  27670. int err;
  27671. err = mp_grow(r, (2048 + DIGIT_BIT - 1) / DIGIT_BIT);
  27672. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  27673. #if DIGIT_BIT == 32
  27674. XMEMCPY(r->dp, a, sizeof(sp_digit) * 64);
  27675. r->used = 64;
  27676. mp_clamp(r);
  27677. #elif DIGIT_BIT < 32
  27678. int i;
  27679. int j = 0;
  27680. int s = 0;
  27681. r->dp[0] = 0;
  27682. for (i = 0; i < 64; i++) {
  27683. r->dp[j] |= (mp_digit)(a[i] << s);
  27684. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  27685. s = DIGIT_BIT - s;
  27686. r->dp[++j] = (mp_digit)(a[i] >> s);
  27687. while (s + DIGIT_BIT <= 32) {
  27688. s += DIGIT_BIT;
  27689. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  27690. if (s == SP_WORD_SIZE) {
  27691. r->dp[j] = 0;
  27692. }
  27693. else {
  27694. r->dp[j] = (mp_digit)(a[i] >> s);
  27695. }
  27696. }
  27697. s = 32 - s;
  27698. }
  27699. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  27700. mp_clamp(r);
  27701. #else
  27702. int i;
  27703. int j = 0;
  27704. int s = 0;
  27705. r->dp[0] = 0;
  27706. for (i = 0; i < 64; i++) {
  27707. r->dp[j] |= ((mp_digit)a[i]) << s;
  27708. if (s + 32 >= DIGIT_BIT) {
  27709. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  27710. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  27711. #endif
  27712. s = DIGIT_BIT - s;
  27713. r->dp[++j] = a[i] >> s;
  27714. s = 32 - s;
  27715. }
  27716. else {
  27717. s += 32;
  27718. }
  27719. }
  27720. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  27721. mp_clamp(r);
  27722. #endif
  27723. }
  27724. return err;
  27725. }
  27726. /* Perform the modular exponentiation for Diffie-Hellman.
  27727. *
  27728. * base Base. MP integer.
  27729. * exp Exponent. MP integer.
  27730. * mod Modulus. MP integer.
  27731. * res Result. MP integer.
  27732. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  27733. * and MEMORY_E if memory allocation fails.
  27734. */
  27735. int sp_ModExp_2048(const mp_int* base, const mp_int* exp, const mp_int* mod,
  27736. mp_int* res)
  27737. {
  27738. int err = MP_OKAY;
  27739. sp_digit b[128];
  27740. sp_digit e[64];
  27741. sp_digit m[64];
  27742. sp_digit* r = b;
  27743. int expBits = mp_count_bits(exp);
  27744. if (mp_count_bits(base) > 2048) {
  27745. err = MP_READ_E;
  27746. }
  27747. else if (expBits > 2048) {
  27748. err = MP_READ_E;
  27749. }
  27750. else if (mp_count_bits(mod) != 2048) {
  27751. err = MP_READ_E;
  27752. }
  27753. else if (mp_iseven(mod)) {
  27754. err = MP_VAL;
  27755. }
  27756. if (err == MP_OKAY) {
  27757. sp_2048_from_mp(b, 64, base);
  27758. sp_2048_from_mp(e, 64, exp);
  27759. sp_2048_from_mp(m, 64, mod);
  27760. err = sp_2048_mod_exp_64(r, b, e, expBits, m, 0);
  27761. }
  27762. if (err == MP_OKAY) {
  27763. err = sp_2048_to_mp(r, res);
  27764. }
  27765. XMEMSET(e, 0, sizeof(e));
  27766. return err;
  27767. }
  27768. #ifdef WOLFSSL_HAVE_SP_DH
  27769. #ifdef HAVE_FFDHE_2048
  27770. /* Lefy shift a by n bits into r. (r = a << n)
  27771. *
  27772. * r A single precision integer.
  27773. * a A single precision integer.
  27774. * n Integer representing number of bits to shift.
  27775. */
  27776. static void sp_2048_lshift_64(sp_digit* r, const sp_digit* a, byte n)
  27777. {
  27778. __asm__ __volatile__ (
  27779. "movs r7, #31\n\t"
  27780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27781. "subs r7, r7, %[n]\n\t"
  27782. #else
  27783. "sub r7, r7, %[n]\n\t"
  27784. #endif
  27785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27786. "adds %[a], %[a], #0xc0\n\t"
  27787. #else
  27788. "add %[a], %[a], #0xc0\n\t"
  27789. #endif
  27790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27791. "adds %[r], %[r], #0xc0\n\t"
  27792. #else
  27793. "add %[r], %[r], #0xc0\n\t"
  27794. #endif
  27795. "ldr r4, [%[a], #60]\n\t"
  27796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27797. "lsrs r5, r4, #1\n\t"
  27798. #else
  27799. "lsr r5, r4, #1\n\t"
  27800. #endif
  27801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27802. "lsls r4, r4, %[n]\n\t"
  27803. #else
  27804. "lsl r4, r4, %[n]\n\t"
  27805. #endif
  27806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27807. "lsrs r5, r5, r7\n\t"
  27808. #else
  27809. "lsr r5, r5, r7\n\t"
  27810. #endif
  27811. "ldr r3, [%[a], #56]\n\t"
  27812. "str r5, [%[r], #64]\n\t"
  27813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27814. "lsrs r6, r3, #1\n\t"
  27815. #else
  27816. "lsr r6, r3, #1\n\t"
  27817. #endif
  27818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27819. "lsls r3, r3, %[n]\n\t"
  27820. #else
  27821. "lsl r3, r3, %[n]\n\t"
  27822. #endif
  27823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27824. "lsrs r6, r6, r7\n\t"
  27825. #else
  27826. "lsr r6, r6, r7\n\t"
  27827. #endif
  27828. #ifdef WOLFSSL_KEIL
  27829. "orrs r4, r4, r6\n\t"
  27830. #elif defined(__clang__)
  27831. "orrs r4, r6\n\t"
  27832. #else
  27833. "orr r4, r6\n\t"
  27834. #endif
  27835. "ldr r5, [%[a], #52]\n\t"
  27836. "str r4, [%[r], #60]\n\t"
  27837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27838. "lsrs r6, r5, #1\n\t"
  27839. #else
  27840. "lsr r6, r5, #1\n\t"
  27841. #endif
  27842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27843. "lsls r5, r5, %[n]\n\t"
  27844. #else
  27845. "lsl r5, r5, %[n]\n\t"
  27846. #endif
  27847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27848. "lsrs r6, r6, r7\n\t"
  27849. #else
  27850. "lsr r6, r6, r7\n\t"
  27851. #endif
  27852. #ifdef WOLFSSL_KEIL
  27853. "orrs r3, r3, r6\n\t"
  27854. #elif defined(__clang__)
  27855. "orrs r3, r6\n\t"
  27856. #else
  27857. "orr r3, r6\n\t"
  27858. #endif
  27859. "ldr r4, [%[a], #48]\n\t"
  27860. "str r3, [%[r], #56]\n\t"
  27861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27862. "lsrs r6, r4, #1\n\t"
  27863. #else
  27864. "lsr r6, r4, #1\n\t"
  27865. #endif
  27866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27867. "lsls r4, r4, %[n]\n\t"
  27868. #else
  27869. "lsl r4, r4, %[n]\n\t"
  27870. #endif
  27871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27872. "lsrs r6, r6, r7\n\t"
  27873. #else
  27874. "lsr r6, r6, r7\n\t"
  27875. #endif
  27876. #ifdef WOLFSSL_KEIL
  27877. "orrs r5, r5, r6\n\t"
  27878. #elif defined(__clang__)
  27879. "orrs r5, r6\n\t"
  27880. #else
  27881. "orr r5, r6\n\t"
  27882. #endif
  27883. "ldr r3, [%[a], #44]\n\t"
  27884. "str r5, [%[r], #52]\n\t"
  27885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27886. "lsrs r6, r3, #1\n\t"
  27887. #else
  27888. "lsr r6, r3, #1\n\t"
  27889. #endif
  27890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27891. "lsls r3, r3, %[n]\n\t"
  27892. #else
  27893. "lsl r3, r3, %[n]\n\t"
  27894. #endif
  27895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27896. "lsrs r6, r6, r7\n\t"
  27897. #else
  27898. "lsr r6, r6, r7\n\t"
  27899. #endif
  27900. #ifdef WOLFSSL_KEIL
  27901. "orrs r4, r4, r6\n\t"
  27902. #elif defined(__clang__)
  27903. "orrs r4, r6\n\t"
  27904. #else
  27905. "orr r4, r6\n\t"
  27906. #endif
  27907. "ldr r5, [%[a], #40]\n\t"
  27908. "str r4, [%[r], #48]\n\t"
  27909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27910. "lsrs r6, r5, #1\n\t"
  27911. #else
  27912. "lsr r6, r5, #1\n\t"
  27913. #endif
  27914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27915. "lsls r5, r5, %[n]\n\t"
  27916. #else
  27917. "lsl r5, r5, %[n]\n\t"
  27918. #endif
  27919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27920. "lsrs r6, r6, r7\n\t"
  27921. #else
  27922. "lsr r6, r6, r7\n\t"
  27923. #endif
  27924. #ifdef WOLFSSL_KEIL
  27925. "orrs r3, r3, r6\n\t"
  27926. #elif defined(__clang__)
  27927. "orrs r3, r6\n\t"
  27928. #else
  27929. "orr r3, r6\n\t"
  27930. #endif
  27931. "ldr r4, [%[a], #36]\n\t"
  27932. "str r3, [%[r], #44]\n\t"
  27933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27934. "lsrs r6, r4, #1\n\t"
  27935. #else
  27936. "lsr r6, r4, #1\n\t"
  27937. #endif
  27938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27939. "lsls r4, r4, %[n]\n\t"
  27940. #else
  27941. "lsl r4, r4, %[n]\n\t"
  27942. #endif
  27943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27944. "lsrs r6, r6, r7\n\t"
  27945. #else
  27946. "lsr r6, r6, r7\n\t"
  27947. #endif
  27948. #ifdef WOLFSSL_KEIL
  27949. "orrs r5, r5, r6\n\t"
  27950. #elif defined(__clang__)
  27951. "orrs r5, r6\n\t"
  27952. #else
  27953. "orr r5, r6\n\t"
  27954. #endif
  27955. "ldr r3, [%[a], #32]\n\t"
  27956. "str r5, [%[r], #40]\n\t"
  27957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27958. "lsrs r6, r3, #1\n\t"
  27959. #else
  27960. "lsr r6, r3, #1\n\t"
  27961. #endif
  27962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27963. "lsls r3, r3, %[n]\n\t"
  27964. #else
  27965. "lsl r3, r3, %[n]\n\t"
  27966. #endif
  27967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27968. "lsrs r6, r6, r7\n\t"
  27969. #else
  27970. "lsr r6, r6, r7\n\t"
  27971. #endif
  27972. #ifdef WOLFSSL_KEIL
  27973. "orrs r4, r4, r6\n\t"
  27974. #elif defined(__clang__)
  27975. "orrs r4, r6\n\t"
  27976. #else
  27977. "orr r4, r6\n\t"
  27978. #endif
  27979. "ldr r5, [%[a], #28]\n\t"
  27980. "str r4, [%[r], #36]\n\t"
  27981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27982. "lsrs r6, r5, #1\n\t"
  27983. #else
  27984. "lsr r6, r5, #1\n\t"
  27985. #endif
  27986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27987. "lsls r5, r5, %[n]\n\t"
  27988. #else
  27989. "lsl r5, r5, %[n]\n\t"
  27990. #endif
  27991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27992. "lsrs r6, r6, r7\n\t"
  27993. #else
  27994. "lsr r6, r6, r7\n\t"
  27995. #endif
  27996. #ifdef WOLFSSL_KEIL
  27997. "orrs r3, r3, r6\n\t"
  27998. #elif defined(__clang__)
  27999. "orrs r3, r6\n\t"
  28000. #else
  28001. "orr r3, r6\n\t"
  28002. #endif
  28003. "ldr r4, [%[a], #24]\n\t"
  28004. "str r3, [%[r], #32]\n\t"
  28005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28006. "lsrs r6, r4, #1\n\t"
  28007. #else
  28008. "lsr r6, r4, #1\n\t"
  28009. #endif
  28010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28011. "lsls r4, r4, %[n]\n\t"
  28012. #else
  28013. "lsl r4, r4, %[n]\n\t"
  28014. #endif
  28015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28016. "lsrs r6, r6, r7\n\t"
  28017. #else
  28018. "lsr r6, r6, r7\n\t"
  28019. #endif
  28020. #ifdef WOLFSSL_KEIL
  28021. "orrs r5, r5, r6\n\t"
  28022. #elif defined(__clang__)
  28023. "orrs r5, r6\n\t"
  28024. #else
  28025. "orr r5, r6\n\t"
  28026. #endif
  28027. "ldr r3, [%[a], #20]\n\t"
  28028. "str r5, [%[r], #28]\n\t"
  28029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28030. "lsrs r6, r3, #1\n\t"
  28031. #else
  28032. "lsr r6, r3, #1\n\t"
  28033. #endif
  28034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28035. "lsls r3, r3, %[n]\n\t"
  28036. #else
  28037. "lsl r3, r3, %[n]\n\t"
  28038. #endif
  28039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28040. "lsrs r6, r6, r7\n\t"
  28041. #else
  28042. "lsr r6, r6, r7\n\t"
  28043. #endif
  28044. #ifdef WOLFSSL_KEIL
  28045. "orrs r4, r4, r6\n\t"
  28046. #elif defined(__clang__)
  28047. "orrs r4, r6\n\t"
  28048. #else
  28049. "orr r4, r6\n\t"
  28050. #endif
  28051. "ldr r5, [%[a], #16]\n\t"
  28052. "str r4, [%[r], #24]\n\t"
  28053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28054. "lsrs r6, r5, #1\n\t"
  28055. #else
  28056. "lsr r6, r5, #1\n\t"
  28057. #endif
  28058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28059. "lsls r5, r5, %[n]\n\t"
  28060. #else
  28061. "lsl r5, r5, %[n]\n\t"
  28062. #endif
  28063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28064. "lsrs r6, r6, r7\n\t"
  28065. #else
  28066. "lsr r6, r6, r7\n\t"
  28067. #endif
  28068. #ifdef WOLFSSL_KEIL
  28069. "orrs r3, r3, r6\n\t"
  28070. #elif defined(__clang__)
  28071. "orrs r3, r6\n\t"
  28072. #else
  28073. "orr r3, r6\n\t"
  28074. #endif
  28075. "ldr r4, [%[a], #12]\n\t"
  28076. "str r3, [%[r], #20]\n\t"
  28077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28078. "lsrs r6, r4, #1\n\t"
  28079. #else
  28080. "lsr r6, r4, #1\n\t"
  28081. #endif
  28082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28083. "lsls r4, r4, %[n]\n\t"
  28084. #else
  28085. "lsl r4, r4, %[n]\n\t"
  28086. #endif
  28087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28088. "lsrs r6, r6, r7\n\t"
  28089. #else
  28090. "lsr r6, r6, r7\n\t"
  28091. #endif
  28092. #ifdef WOLFSSL_KEIL
  28093. "orrs r5, r5, r6\n\t"
  28094. #elif defined(__clang__)
  28095. "orrs r5, r6\n\t"
  28096. #else
  28097. "orr r5, r6\n\t"
  28098. #endif
  28099. "ldr r3, [%[a], #8]\n\t"
  28100. "str r5, [%[r], #16]\n\t"
  28101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28102. "lsrs r6, r3, #1\n\t"
  28103. #else
  28104. "lsr r6, r3, #1\n\t"
  28105. #endif
  28106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28107. "lsls r3, r3, %[n]\n\t"
  28108. #else
  28109. "lsl r3, r3, %[n]\n\t"
  28110. #endif
  28111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28112. "lsrs r6, r6, r7\n\t"
  28113. #else
  28114. "lsr r6, r6, r7\n\t"
  28115. #endif
  28116. #ifdef WOLFSSL_KEIL
  28117. "orrs r4, r4, r6\n\t"
  28118. #elif defined(__clang__)
  28119. "orrs r4, r6\n\t"
  28120. #else
  28121. "orr r4, r6\n\t"
  28122. #endif
  28123. "ldr r5, [%[a], #4]\n\t"
  28124. "str r4, [%[r], #12]\n\t"
  28125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28126. "lsrs r6, r5, #1\n\t"
  28127. #else
  28128. "lsr r6, r5, #1\n\t"
  28129. #endif
  28130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28131. "lsls r5, r5, %[n]\n\t"
  28132. #else
  28133. "lsl r5, r5, %[n]\n\t"
  28134. #endif
  28135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28136. "lsrs r6, r6, r7\n\t"
  28137. #else
  28138. "lsr r6, r6, r7\n\t"
  28139. #endif
  28140. #ifdef WOLFSSL_KEIL
  28141. "orrs r3, r3, r6\n\t"
  28142. #elif defined(__clang__)
  28143. "orrs r3, r6\n\t"
  28144. #else
  28145. "orr r3, r6\n\t"
  28146. #endif
  28147. "ldr r4, [%[a]]\n\t"
  28148. "str r3, [%[r], #8]\n\t"
  28149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28150. "lsrs r6, r4, #1\n\t"
  28151. #else
  28152. "lsr r6, r4, #1\n\t"
  28153. #endif
  28154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28155. "lsls r4, r4, %[n]\n\t"
  28156. #else
  28157. "lsl r4, r4, %[n]\n\t"
  28158. #endif
  28159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28160. "lsrs r6, r6, r7\n\t"
  28161. #else
  28162. "lsr r6, r6, r7\n\t"
  28163. #endif
  28164. #ifdef WOLFSSL_KEIL
  28165. "orrs r5, r5, r6\n\t"
  28166. #elif defined(__clang__)
  28167. "orrs r5, r6\n\t"
  28168. #else
  28169. "orr r5, r6\n\t"
  28170. #endif
  28171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28172. "subs %[a], %[a], #0x40\n\t"
  28173. #else
  28174. "sub %[a], %[a], #0x40\n\t"
  28175. #endif
  28176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28177. "subs %[r], %[r], #0x40\n\t"
  28178. #else
  28179. "sub %[r], %[r], #0x40\n\t"
  28180. #endif
  28181. "ldr r3, [%[a], #60]\n\t"
  28182. "str r5, [%[r], #68]\n\t"
  28183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28184. "lsrs r6, r3, #1\n\t"
  28185. #else
  28186. "lsr r6, r3, #1\n\t"
  28187. #endif
  28188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28189. "lsls r3, r3, %[n]\n\t"
  28190. #else
  28191. "lsl r3, r3, %[n]\n\t"
  28192. #endif
  28193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28194. "lsrs r6, r6, r7\n\t"
  28195. #else
  28196. "lsr r6, r6, r7\n\t"
  28197. #endif
  28198. #ifdef WOLFSSL_KEIL
  28199. "orrs r4, r4, r6\n\t"
  28200. #elif defined(__clang__)
  28201. "orrs r4, r6\n\t"
  28202. #else
  28203. "orr r4, r6\n\t"
  28204. #endif
  28205. "ldr r5, [%[a], #56]\n\t"
  28206. "str r4, [%[r], #64]\n\t"
  28207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28208. "lsrs r6, r5, #1\n\t"
  28209. #else
  28210. "lsr r6, r5, #1\n\t"
  28211. #endif
  28212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28213. "lsls r5, r5, %[n]\n\t"
  28214. #else
  28215. "lsl r5, r5, %[n]\n\t"
  28216. #endif
  28217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28218. "lsrs r6, r6, r7\n\t"
  28219. #else
  28220. "lsr r6, r6, r7\n\t"
  28221. #endif
  28222. #ifdef WOLFSSL_KEIL
  28223. "orrs r3, r3, r6\n\t"
  28224. #elif defined(__clang__)
  28225. "orrs r3, r6\n\t"
  28226. #else
  28227. "orr r3, r6\n\t"
  28228. #endif
  28229. "ldr r4, [%[a], #52]\n\t"
  28230. "str r3, [%[r], #60]\n\t"
  28231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28232. "lsrs r6, r4, #1\n\t"
  28233. #else
  28234. "lsr r6, r4, #1\n\t"
  28235. #endif
  28236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28237. "lsls r4, r4, %[n]\n\t"
  28238. #else
  28239. "lsl r4, r4, %[n]\n\t"
  28240. #endif
  28241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28242. "lsrs r6, r6, r7\n\t"
  28243. #else
  28244. "lsr r6, r6, r7\n\t"
  28245. #endif
  28246. #ifdef WOLFSSL_KEIL
  28247. "orrs r5, r5, r6\n\t"
  28248. #elif defined(__clang__)
  28249. "orrs r5, r6\n\t"
  28250. #else
  28251. "orr r5, r6\n\t"
  28252. #endif
  28253. "ldr r3, [%[a], #48]\n\t"
  28254. "str r5, [%[r], #56]\n\t"
  28255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28256. "lsrs r6, r3, #1\n\t"
  28257. #else
  28258. "lsr r6, r3, #1\n\t"
  28259. #endif
  28260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28261. "lsls r3, r3, %[n]\n\t"
  28262. #else
  28263. "lsl r3, r3, %[n]\n\t"
  28264. #endif
  28265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28266. "lsrs r6, r6, r7\n\t"
  28267. #else
  28268. "lsr r6, r6, r7\n\t"
  28269. #endif
  28270. #ifdef WOLFSSL_KEIL
  28271. "orrs r4, r4, r6\n\t"
  28272. #elif defined(__clang__)
  28273. "orrs r4, r6\n\t"
  28274. #else
  28275. "orr r4, r6\n\t"
  28276. #endif
  28277. "ldr r5, [%[a], #44]\n\t"
  28278. "str r4, [%[r], #52]\n\t"
  28279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28280. "lsrs r6, r5, #1\n\t"
  28281. #else
  28282. "lsr r6, r5, #1\n\t"
  28283. #endif
  28284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28285. "lsls r5, r5, %[n]\n\t"
  28286. #else
  28287. "lsl r5, r5, %[n]\n\t"
  28288. #endif
  28289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28290. "lsrs r6, r6, r7\n\t"
  28291. #else
  28292. "lsr r6, r6, r7\n\t"
  28293. #endif
  28294. #ifdef WOLFSSL_KEIL
  28295. "orrs r3, r3, r6\n\t"
  28296. #elif defined(__clang__)
  28297. "orrs r3, r6\n\t"
  28298. #else
  28299. "orr r3, r6\n\t"
  28300. #endif
  28301. "ldr r4, [%[a], #40]\n\t"
  28302. "str r3, [%[r], #48]\n\t"
  28303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28304. "lsrs r6, r4, #1\n\t"
  28305. #else
  28306. "lsr r6, r4, #1\n\t"
  28307. #endif
  28308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28309. "lsls r4, r4, %[n]\n\t"
  28310. #else
  28311. "lsl r4, r4, %[n]\n\t"
  28312. #endif
  28313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28314. "lsrs r6, r6, r7\n\t"
  28315. #else
  28316. "lsr r6, r6, r7\n\t"
  28317. #endif
  28318. #ifdef WOLFSSL_KEIL
  28319. "orrs r5, r5, r6\n\t"
  28320. #elif defined(__clang__)
  28321. "orrs r5, r6\n\t"
  28322. #else
  28323. "orr r5, r6\n\t"
  28324. #endif
  28325. "ldr r3, [%[a], #36]\n\t"
  28326. "str r5, [%[r], #44]\n\t"
  28327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28328. "lsrs r6, r3, #1\n\t"
  28329. #else
  28330. "lsr r6, r3, #1\n\t"
  28331. #endif
  28332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28333. "lsls r3, r3, %[n]\n\t"
  28334. #else
  28335. "lsl r3, r3, %[n]\n\t"
  28336. #endif
  28337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28338. "lsrs r6, r6, r7\n\t"
  28339. #else
  28340. "lsr r6, r6, r7\n\t"
  28341. #endif
  28342. #ifdef WOLFSSL_KEIL
  28343. "orrs r4, r4, r6\n\t"
  28344. #elif defined(__clang__)
  28345. "orrs r4, r6\n\t"
  28346. #else
  28347. "orr r4, r6\n\t"
  28348. #endif
  28349. "ldr r5, [%[a], #32]\n\t"
  28350. "str r4, [%[r], #40]\n\t"
  28351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28352. "lsrs r6, r5, #1\n\t"
  28353. #else
  28354. "lsr r6, r5, #1\n\t"
  28355. #endif
  28356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28357. "lsls r5, r5, %[n]\n\t"
  28358. #else
  28359. "lsl r5, r5, %[n]\n\t"
  28360. #endif
  28361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28362. "lsrs r6, r6, r7\n\t"
  28363. #else
  28364. "lsr r6, r6, r7\n\t"
  28365. #endif
  28366. #ifdef WOLFSSL_KEIL
  28367. "orrs r3, r3, r6\n\t"
  28368. #elif defined(__clang__)
  28369. "orrs r3, r6\n\t"
  28370. #else
  28371. "orr r3, r6\n\t"
  28372. #endif
  28373. "ldr r4, [%[a], #28]\n\t"
  28374. "str r3, [%[r], #36]\n\t"
  28375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28376. "lsrs r6, r4, #1\n\t"
  28377. #else
  28378. "lsr r6, r4, #1\n\t"
  28379. #endif
  28380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28381. "lsls r4, r4, %[n]\n\t"
  28382. #else
  28383. "lsl r4, r4, %[n]\n\t"
  28384. #endif
  28385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28386. "lsrs r6, r6, r7\n\t"
  28387. #else
  28388. "lsr r6, r6, r7\n\t"
  28389. #endif
  28390. #ifdef WOLFSSL_KEIL
  28391. "orrs r5, r5, r6\n\t"
  28392. #elif defined(__clang__)
  28393. "orrs r5, r6\n\t"
  28394. #else
  28395. "orr r5, r6\n\t"
  28396. #endif
  28397. "ldr r3, [%[a], #24]\n\t"
  28398. "str r5, [%[r], #32]\n\t"
  28399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28400. "lsrs r6, r3, #1\n\t"
  28401. #else
  28402. "lsr r6, r3, #1\n\t"
  28403. #endif
  28404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28405. "lsls r3, r3, %[n]\n\t"
  28406. #else
  28407. "lsl r3, r3, %[n]\n\t"
  28408. #endif
  28409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28410. "lsrs r6, r6, r7\n\t"
  28411. #else
  28412. "lsr r6, r6, r7\n\t"
  28413. #endif
  28414. #ifdef WOLFSSL_KEIL
  28415. "orrs r4, r4, r6\n\t"
  28416. #elif defined(__clang__)
  28417. "orrs r4, r6\n\t"
  28418. #else
  28419. "orr r4, r6\n\t"
  28420. #endif
  28421. "ldr r5, [%[a], #20]\n\t"
  28422. "str r4, [%[r], #28]\n\t"
  28423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28424. "lsrs r6, r5, #1\n\t"
  28425. #else
  28426. "lsr r6, r5, #1\n\t"
  28427. #endif
  28428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28429. "lsls r5, r5, %[n]\n\t"
  28430. #else
  28431. "lsl r5, r5, %[n]\n\t"
  28432. #endif
  28433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28434. "lsrs r6, r6, r7\n\t"
  28435. #else
  28436. "lsr r6, r6, r7\n\t"
  28437. #endif
  28438. #ifdef WOLFSSL_KEIL
  28439. "orrs r3, r3, r6\n\t"
  28440. #elif defined(__clang__)
  28441. "orrs r3, r6\n\t"
  28442. #else
  28443. "orr r3, r6\n\t"
  28444. #endif
  28445. "ldr r4, [%[a], #16]\n\t"
  28446. "str r3, [%[r], #24]\n\t"
  28447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28448. "lsrs r6, r4, #1\n\t"
  28449. #else
  28450. "lsr r6, r4, #1\n\t"
  28451. #endif
  28452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28453. "lsls r4, r4, %[n]\n\t"
  28454. #else
  28455. "lsl r4, r4, %[n]\n\t"
  28456. #endif
  28457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28458. "lsrs r6, r6, r7\n\t"
  28459. #else
  28460. "lsr r6, r6, r7\n\t"
  28461. #endif
  28462. #ifdef WOLFSSL_KEIL
  28463. "orrs r5, r5, r6\n\t"
  28464. #elif defined(__clang__)
  28465. "orrs r5, r6\n\t"
  28466. #else
  28467. "orr r5, r6\n\t"
  28468. #endif
  28469. "ldr r3, [%[a], #12]\n\t"
  28470. "str r5, [%[r], #20]\n\t"
  28471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28472. "lsrs r6, r3, #1\n\t"
  28473. #else
  28474. "lsr r6, r3, #1\n\t"
  28475. #endif
  28476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28477. "lsls r3, r3, %[n]\n\t"
  28478. #else
  28479. "lsl r3, r3, %[n]\n\t"
  28480. #endif
  28481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28482. "lsrs r6, r6, r7\n\t"
  28483. #else
  28484. "lsr r6, r6, r7\n\t"
  28485. #endif
  28486. #ifdef WOLFSSL_KEIL
  28487. "orrs r4, r4, r6\n\t"
  28488. #elif defined(__clang__)
  28489. "orrs r4, r6\n\t"
  28490. #else
  28491. "orr r4, r6\n\t"
  28492. #endif
  28493. "ldr r5, [%[a], #8]\n\t"
  28494. "str r4, [%[r], #16]\n\t"
  28495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28496. "lsrs r6, r5, #1\n\t"
  28497. #else
  28498. "lsr r6, r5, #1\n\t"
  28499. #endif
  28500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28501. "lsls r5, r5, %[n]\n\t"
  28502. #else
  28503. "lsl r5, r5, %[n]\n\t"
  28504. #endif
  28505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28506. "lsrs r6, r6, r7\n\t"
  28507. #else
  28508. "lsr r6, r6, r7\n\t"
  28509. #endif
  28510. #ifdef WOLFSSL_KEIL
  28511. "orrs r3, r3, r6\n\t"
  28512. #elif defined(__clang__)
  28513. "orrs r3, r6\n\t"
  28514. #else
  28515. "orr r3, r6\n\t"
  28516. #endif
  28517. "ldr r4, [%[a], #4]\n\t"
  28518. "str r3, [%[r], #12]\n\t"
  28519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28520. "lsrs r6, r4, #1\n\t"
  28521. #else
  28522. "lsr r6, r4, #1\n\t"
  28523. #endif
  28524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28525. "lsls r4, r4, %[n]\n\t"
  28526. #else
  28527. "lsl r4, r4, %[n]\n\t"
  28528. #endif
  28529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28530. "lsrs r6, r6, r7\n\t"
  28531. #else
  28532. "lsr r6, r6, r7\n\t"
  28533. #endif
  28534. #ifdef WOLFSSL_KEIL
  28535. "orrs r5, r5, r6\n\t"
  28536. #elif defined(__clang__)
  28537. "orrs r5, r6\n\t"
  28538. #else
  28539. "orr r5, r6\n\t"
  28540. #endif
  28541. "ldr r3, [%[a]]\n\t"
  28542. "str r5, [%[r], #8]\n\t"
  28543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28544. "lsrs r6, r3, #1\n\t"
  28545. #else
  28546. "lsr r6, r3, #1\n\t"
  28547. #endif
  28548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28549. "lsls r3, r3, %[n]\n\t"
  28550. #else
  28551. "lsl r3, r3, %[n]\n\t"
  28552. #endif
  28553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28554. "lsrs r6, r6, r7\n\t"
  28555. #else
  28556. "lsr r6, r6, r7\n\t"
  28557. #endif
  28558. #ifdef WOLFSSL_KEIL
  28559. "orrs r4, r4, r6\n\t"
  28560. #elif defined(__clang__)
  28561. "orrs r4, r6\n\t"
  28562. #else
  28563. "orr r4, r6\n\t"
  28564. #endif
  28565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28566. "subs %[a], %[a], #0x40\n\t"
  28567. #else
  28568. "sub %[a], %[a], #0x40\n\t"
  28569. #endif
  28570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28571. "subs %[r], %[r], #0x40\n\t"
  28572. #else
  28573. "sub %[r], %[r], #0x40\n\t"
  28574. #endif
  28575. "ldr r5, [%[a], #60]\n\t"
  28576. "str r4, [%[r], #68]\n\t"
  28577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28578. "lsrs r6, r5, #1\n\t"
  28579. #else
  28580. "lsr r6, r5, #1\n\t"
  28581. #endif
  28582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28583. "lsls r5, r5, %[n]\n\t"
  28584. #else
  28585. "lsl r5, r5, %[n]\n\t"
  28586. #endif
  28587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28588. "lsrs r6, r6, r7\n\t"
  28589. #else
  28590. "lsr r6, r6, r7\n\t"
  28591. #endif
  28592. #ifdef WOLFSSL_KEIL
  28593. "orrs r3, r3, r6\n\t"
  28594. #elif defined(__clang__)
  28595. "orrs r3, r6\n\t"
  28596. #else
  28597. "orr r3, r6\n\t"
  28598. #endif
  28599. "ldr r4, [%[a], #56]\n\t"
  28600. "str r3, [%[r], #64]\n\t"
  28601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28602. "lsrs r6, r4, #1\n\t"
  28603. #else
  28604. "lsr r6, r4, #1\n\t"
  28605. #endif
  28606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28607. "lsls r4, r4, %[n]\n\t"
  28608. #else
  28609. "lsl r4, r4, %[n]\n\t"
  28610. #endif
  28611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28612. "lsrs r6, r6, r7\n\t"
  28613. #else
  28614. "lsr r6, r6, r7\n\t"
  28615. #endif
  28616. #ifdef WOLFSSL_KEIL
  28617. "orrs r5, r5, r6\n\t"
  28618. #elif defined(__clang__)
  28619. "orrs r5, r6\n\t"
  28620. #else
  28621. "orr r5, r6\n\t"
  28622. #endif
  28623. "ldr r3, [%[a], #52]\n\t"
  28624. "str r5, [%[r], #60]\n\t"
  28625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28626. "lsrs r6, r3, #1\n\t"
  28627. #else
  28628. "lsr r6, r3, #1\n\t"
  28629. #endif
  28630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28631. "lsls r3, r3, %[n]\n\t"
  28632. #else
  28633. "lsl r3, r3, %[n]\n\t"
  28634. #endif
  28635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28636. "lsrs r6, r6, r7\n\t"
  28637. #else
  28638. "lsr r6, r6, r7\n\t"
  28639. #endif
  28640. #ifdef WOLFSSL_KEIL
  28641. "orrs r4, r4, r6\n\t"
  28642. #elif defined(__clang__)
  28643. "orrs r4, r6\n\t"
  28644. #else
  28645. "orr r4, r6\n\t"
  28646. #endif
  28647. "ldr r5, [%[a], #48]\n\t"
  28648. "str r4, [%[r], #56]\n\t"
  28649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28650. "lsrs r6, r5, #1\n\t"
  28651. #else
  28652. "lsr r6, r5, #1\n\t"
  28653. #endif
  28654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28655. "lsls r5, r5, %[n]\n\t"
  28656. #else
  28657. "lsl r5, r5, %[n]\n\t"
  28658. #endif
  28659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28660. "lsrs r6, r6, r7\n\t"
  28661. #else
  28662. "lsr r6, r6, r7\n\t"
  28663. #endif
  28664. #ifdef WOLFSSL_KEIL
  28665. "orrs r3, r3, r6\n\t"
  28666. #elif defined(__clang__)
  28667. "orrs r3, r6\n\t"
  28668. #else
  28669. "orr r3, r6\n\t"
  28670. #endif
  28671. "ldr r4, [%[a], #44]\n\t"
  28672. "str r3, [%[r], #52]\n\t"
  28673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28674. "lsrs r6, r4, #1\n\t"
  28675. #else
  28676. "lsr r6, r4, #1\n\t"
  28677. #endif
  28678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28679. "lsls r4, r4, %[n]\n\t"
  28680. #else
  28681. "lsl r4, r4, %[n]\n\t"
  28682. #endif
  28683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28684. "lsrs r6, r6, r7\n\t"
  28685. #else
  28686. "lsr r6, r6, r7\n\t"
  28687. #endif
  28688. #ifdef WOLFSSL_KEIL
  28689. "orrs r5, r5, r6\n\t"
  28690. #elif defined(__clang__)
  28691. "orrs r5, r6\n\t"
  28692. #else
  28693. "orr r5, r6\n\t"
  28694. #endif
  28695. "ldr r3, [%[a], #40]\n\t"
  28696. "str r5, [%[r], #48]\n\t"
  28697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28698. "lsrs r6, r3, #1\n\t"
  28699. #else
  28700. "lsr r6, r3, #1\n\t"
  28701. #endif
  28702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28703. "lsls r3, r3, %[n]\n\t"
  28704. #else
  28705. "lsl r3, r3, %[n]\n\t"
  28706. #endif
  28707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28708. "lsrs r6, r6, r7\n\t"
  28709. #else
  28710. "lsr r6, r6, r7\n\t"
  28711. #endif
  28712. #ifdef WOLFSSL_KEIL
  28713. "orrs r4, r4, r6\n\t"
  28714. #elif defined(__clang__)
  28715. "orrs r4, r6\n\t"
  28716. #else
  28717. "orr r4, r6\n\t"
  28718. #endif
  28719. "ldr r5, [%[a], #36]\n\t"
  28720. "str r4, [%[r], #44]\n\t"
  28721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28722. "lsrs r6, r5, #1\n\t"
  28723. #else
  28724. "lsr r6, r5, #1\n\t"
  28725. #endif
  28726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28727. "lsls r5, r5, %[n]\n\t"
  28728. #else
  28729. "lsl r5, r5, %[n]\n\t"
  28730. #endif
  28731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28732. "lsrs r6, r6, r7\n\t"
  28733. #else
  28734. "lsr r6, r6, r7\n\t"
  28735. #endif
  28736. #ifdef WOLFSSL_KEIL
  28737. "orrs r3, r3, r6\n\t"
  28738. #elif defined(__clang__)
  28739. "orrs r3, r6\n\t"
  28740. #else
  28741. "orr r3, r6\n\t"
  28742. #endif
  28743. "ldr r4, [%[a], #32]\n\t"
  28744. "str r3, [%[r], #40]\n\t"
  28745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28746. "lsrs r6, r4, #1\n\t"
  28747. #else
  28748. "lsr r6, r4, #1\n\t"
  28749. #endif
  28750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28751. "lsls r4, r4, %[n]\n\t"
  28752. #else
  28753. "lsl r4, r4, %[n]\n\t"
  28754. #endif
  28755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28756. "lsrs r6, r6, r7\n\t"
  28757. #else
  28758. "lsr r6, r6, r7\n\t"
  28759. #endif
  28760. #ifdef WOLFSSL_KEIL
  28761. "orrs r5, r5, r6\n\t"
  28762. #elif defined(__clang__)
  28763. "orrs r5, r6\n\t"
  28764. #else
  28765. "orr r5, r6\n\t"
  28766. #endif
  28767. "ldr r3, [%[a], #28]\n\t"
  28768. "str r5, [%[r], #36]\n\t"
  28769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28770. "lsrs r6, r3, #1\n\t"
  28771. #else
  28772. "lsr r6, r3, #1\n\t"
  28773. #endif
  28774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28775. "lsls r3, r3, %[n]\n\t"
  28776. #else
  28777. "lsl r3, r3, %[n]\n\t"
  28778. #endif
  28779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28780. "lsrs r6, r6, r7\n\t"
  28781. #else
  28782. "lsr r6, r6, r7\n\t"
  28783. #endif
  28784. #ifdef WOLFSSL_KEIL
  28785. "orrs r4, r4, r6\n\t"
  28786. #elif defined(__clang__)
  28787. "orrs r4, r6\n\t"
  28788. #else
  28789. "orr r4, r6\n\t"
  28790. #endif
  28791. "ldr r5, [%[a], #24]\n\t"
  28792. "str r4, [%[r], #32]\n\t"
  28793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28794. "lsrs r6, r5, #1\n\t"
  28795. #else
  28796. "lsr r6, r5, #1\n\t"
  28797. #endif
  28798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28799. "lsls r5, r5, %[n]\n\t"
  28800. #else
  28801. "lsl r5, r5, %[n]\n\t"
  28802. #endif
  28803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28804. "lsrs r6, r6, r7\n\t"
  28805. #else
  28806. "lsr r6, r6, r7\n\t"
  28807. #endif
  28808. #ifdef WOLFSSL_KEIL
  28809. "orrs r3, r3, r6\n\t"
  28810. #elif defined(__clang__)
  28811. "orrs r3, r6\n\t"
  28812. #else
  28813. "orr r3, r6\n\t"
  28814. #endif
  28815. "ldr r4, [%[a], #20]\n\t"
  28816. "str r3, [%[r], #28]\n\t"
  28817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28818. "lsrs r6, r4, #1\n\t"
  28819. #else
  28820. "lsr r6, r4, #1\n\t"
  28821. #endif
  28822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28823. "lsls r4, r4, %[n]\n\t"
  28824. #else
  28825. "lsl r4, r4, %[n]\n\t"
  28826. #endif
  28827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28828. "lsrs r6, r6, r7\n\t"
  28829. #else
  28830. "lsr r6, r6, r7\n\t"
  28831. #endif
  28832. #ifdef WOLFSSL_KEIL
  28833. "orrs r5, r5, r6\n\t"
  28834. #elif defined(__clang__)
  28835. "orrs r5, r6\n\t"
  28836. #else
  28837. "orr r5, r6\n\t"
  28838. #endif
  28839. "ldr r3, [%[a], #16]\n\t"
  28840. "str r5, [%[r], #24]\n\t"
  28841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28842. "lsrs r6, r3, #1\n\t"
  28843. #else
  28844. "lsr r6, r3, #1\n\t"
  28845. #endif
  28846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28847. "lsls r3, r3, %[n]\n\t"
  28848. #else
  28849. "lsl r3, r3, %[n]\n\t"
  28850. #endif
  28851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28852. "lsrs r6, r6, r7\n\t"
  28853. #else
  28854. "lsr r6, r6, r7\n\t"
  28855. #endif
  28856. #ifdef WOLFSSL_KEIL
  28857. "orrs r4, r4, r6\n\t"
  28858. #elif defined(__clang__)
  28859. "orrs r4, r6\n\t"
  28860. #else
  28861. "orr r4, r6\n\t"
  28862. #endif
  28863. "ldr r5, [%[a], #12]\n\t"
  28864. "str r4, [%[r], #20]\n\t"
  28865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28866. "lsrs r6, r5, #1\n\t"
  28867. #else
  28868. "lsr r6, r5, #1\n\t"
  28869. #endif
  28870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28871. "lsls r5, r5, %[n]\n\t"
  28872. #else
  28873. "lsl r5, r5, %[n]\n\t"
  28874. #endif
  28875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28876. "lsrs r6, r6, r7\n\t"
  28877. #else
  28878. "lsr r6, r6, r7\n\t"
  28879. #endif
  28880. #ifdef WOLFSSL_KEIL
  28881. "orrs r3, r3, r6\n\t"
  28882. #elif defined(__clang__)
  28883. "orrs r3, r6\n\t"
  28884. #else
  28885. "orr r3, r6\n\t"
  28886. #endif
  28887. "ldr r4, [%[a], #8]\n\t"
  28888. "str r3, [%[r], #16]\n\t"
  28889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28890. "lsrs r6, r4, #1\n\t"
  28891. #else
  28892. "lsr r6, r4, #1\n\t"
  28893. #endif
  28894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28895. "lsls r4, r4, %[n]\n\t"
  28896. #else
  28897. "lsl r4, r4, %[n]\n\t"
  28898. #endif
  28899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28900. "lsrs r6, r6, r7\n\t"
  28901. #else
  28902. "lsr r6, r6, r7\n\t"
  28903. #endif
  28904. #ifdef WOLFSSL_KEIL
  28905. "orrs r5, r5, r6\n\t"
  28906. #elif defined(__clang__)
  28907. "orrs r5, r6\n\t"
  28908. #else
  28909. "orr r5, r6\n\t"
  28910. #endif
  28911. "ldr r3, [%[a], #4]\n\t"
  28912. "str r5, [%[r], #12]\n\t"
  28913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28914. "lsrs r6, r3, #1\n\t"
  28915. #else
  28916. "lsr r6, r3, #1\n\t"
  28917. #endif
  28918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28919. "lsls r3, r3, %[n]\n\t"
  28920. #else
  28921. "lsl r3, r3, %[n]\n\t"
  28922. #endif
  28923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28924. "lsrs r6, r6, r7\n\t"
  28925. #else
  28926. "lsr r6, r6, r7\n\t"
  28927. #endif
  28928. #ifdef WOLFSSL_KEIL
  28929. "orrs r4, r4, r6\n\t"
  28930. #elif defined(__clang__)
  28931. "orrs r4, r6\n\t"
  28932. #else
  28933. "orr r4, r6\n\t"
  28934. #endif
  28935. "ldr r5, [%[a]]\n\t"
  28936. "str r4, [%[r], #8]\n\t"
  28937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28938. "lsrs r6, r5, #1\n\t"
  28939. #else
  28940. "lsr r6, r5, #1\n\t"
  28941. #endif
  28942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28943. "lsls r5, r5, %[n]\n\t"
  28944. #else
  28945. "lsl r5, r5, %[n]\n\t"
  28946. #endif
  28947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28948. "lsrs r6, r6, r7\n\t"
  28949. #else
  28950. "lsr r6, r6, r7\n\t"
  28951. #endif
  28952. #ifdef WOLFSSL_KEIL
  28953. "orrs r3, r3, r6\n\t"
  28954. #elif defined(__clang__)
  28955. "orrs r3, r6\n\t"
  28956. #else
  28957. "orr r3, r6\n\t"
  28958. #endif
  28959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28960. "subs %[a], %[a], #0x40\n\t"
  28961. #else
  28962. "sub %[a], %[a], #0x40\n\t"
  28963. #endif
  28964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28965. "subs %[r], %[r], #0x40\n\t"
  28966. #else
  28967. "sub %[r], %[r], #0x40\n\t"
  28968. #endif
  28969. "ldr r4, [%[a], #60]\n\t"
  28970. "str r3, [%[r], #68]\n\t"
  28971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28972. "lsrs r6, r4, #1\n\t"
  28973. #else
  28974. "lsr r6, r4, #1\n\t"
  28975. #endif
  28976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28977. "lsls r4, r4, %[n]\n\t"
  28978. #else
  28979. "lsl r4, r4, %[n]\n\t"
  28980. #endif
  28981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28982. "lsrs r6, r6, r7\n\t"
  28983. #else
  28984. "lsr r6, r6, r7\n\t"
  28985. #endif
  28986. #ifdef WOLFSSL_KEIL
  28987. "orrs r5, r5, r6\n\t"
  28988. #elif defined(__clang__)
  28989. "orrs r5, r6\n\t"
  28990. #else
  28991. "orr r5, r6\n\t"
  28992. #endif
  28993. "ldr r3, [%[a], #56]\n\t"
  28994. "str r5, [%[r], #64]\n\t"
  28995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28996. "lsrs r6, r3, #1\n\t"
  28997. #else
  28998. "lsr r6, r3, #1\n\t"
  28999. #endif
  29000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29001. "lsls r3, r3, %[n]\n\t"
  29002. #else
  29003. "lsl r3, r3, %[n]\n\t"
  29004. #endif
  29005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29006. "lsrs r6, r6, r7\n\t"
  29007. #else
  29008. "lsr r6, r6, r7\n\t"
  29009. #endif
  29010. #ifdef WOLFSSL_KEIL
  29011. "orrs r4, r4, r6\n\t"
  29012. #elif defined(__clang__)
  29013. "orrs r4, r6\n\t"
  29014. #else
  29015. "orr r4, r6\n\t"
  29016. #endif
  29017. "ldr r5, [%[a], #52]\n\t"
  29018. "str r4, [%[r], #60]\n\t"
  29019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29020. "lsrs r6, r5, #1\n\t"
  29021. #else
  29022. "lsr r6, r5, #1\n\t"
  29023. #endif
  29024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29025. "lsls r5, r5, %[n]\n\t"
  29026. #else
  29027. "lsl r5, r5, %[n]\n\t"
  29028. #endif
  29029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29030. "lsrs r6, r6, r7\n\t"
  29031. #else
  29032. "lsr r6, r6, r7\n\t"
  29033. #endif
  29034. #ifdef WOLFSSL_KEIL
  29035. "orrs r3, r3, r6\n\t"
  29036. #elif defined(__clang__)
  29037. "orrs r3, r6\n\t"
  29038. #else
  29039. "orr r3, r6\n\t"
  29040. #endif
  29041. "ldr r4, [%[a], #48]\n\t"
  29042. "str r3, [%[r], #56]\n\t"
  29043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29044. "lsrs r6, r4, #1\n\t"
  29045. #else
  29046. "lsr r6, r4, #1\n\t"
  29047. #endif
  29048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29049. "lsls r4, r4, %[n]\n\t"
  29050. #else
  29051. "lsl r4, r4, %[n]\n\t"
  29052. #endif
  29053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29054. "lsrs r6, r6, r7\n\t"
  29055. #else
  29056. "lsr r6, r6, r7\n\t"
  29057. #endif
  29058. #ifdef WOLFSSL_KEIL
  29059. "orrs r5, r5, r6\n\t"
  29060. #elif defined(__clang__)
  29061. "orrs r5, r6\n\t"
  29062. #else
  29063. "orr r5, r6\n\t"
  29064. #endif
  29065. "ldr r3, [%[a], #44]\n\t"
  29066. "str r5, [%[r], #52]\n\t"
  29067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29068. "lsrs r6, r3, #1\n\t"
  29069. #else
  29070. "lsr r6, r3, #1\n\t"
  29071. #endif
  29072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29073. "lsls r3, r3, %[n]\n\t"
  29074. #else
  29075. "lsl r3, r3, %[n]\n\t"
  29076. #endif
  29077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29078. "lsrs r6, r6, r7\n\t"
  29079. #else
  29080. "lsr r6, r6, r7\n\t"
  29081. #endif
  29082. #ifdef WOLFSSL_KEIL
  29083. "orrs r4, r4, r6\n\t"
  29084. #elif defined(__clang__)
  29085. "orrs r4, r6\n\t"
  29086. #else
  29087. "orr r4, r6\n\t"
  29088. #endif
  29089. "ldr r5, [%[a], #40]\n\t"
  29090. "str r4, [%[r], #48]\n\t"
  29091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29092. "lsrs r6, r5, #1\n\t"
  29093. #else
  29094. "lsr r6, r5, #1\n\t"
  29095. #endif
  29096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29097. "lsls r5, r5, %[n]\n\t"
  29098. #else
  29099. "lsl r5, r5, %[n]\n\t"
  29100. #endif
  29101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29102. "lsrs r6, r6, r7\n\t"
  29103. #else
  29104. "lsr r6, r6, r7\n\t"
  29105. #endif
  29106. #ifdef WOLFSSL_KEIL
  29107. "orrs r3, r3, r6\n\t"
  29108. #elif defined(__clang__)
  29109. "orrs r3, r6\n\t"
  29110. #else
  29111. "orr r3, r6\n\t"
  29112. #endif
  29113. "ldr r4, [%[a], #36]\n\t"
  29114. "str r3, [%[r], #44]\n\t"
  29115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29116. "lsrs r6, r4, #1\n\t"
  29117. #else
  29118. "lsr r6, r4, #1\n\t"
  29119. #endif
  29120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29121. "lsls r4, r4, %[n]\n\t"
  29122. #else
  29123. "lsl r4, r4, %[n]\n\t"
  29124. #endif
  29125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29126. "lsrs r6, r6, r7\n\t"
  29127. #else
  29128. "lsr r6, r6, r7\n\t"
  29129. #endif
  29130. #ifdef WOLFSSL_KEIL
  29131. "orrs r5, r5, r6\n\t"
  29132. #elif defined(__clang__)
  29133. "orrs r5, r6\n\t"
  29134. #else
  29135. "orr r5, r6\n\t"
  29136. #endif
  29137. "ldr r3, [%[a], #32]\n\t"
  29138. "str r5, [%[r], #40]\n\t"
  29139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29140. "lsrs r6, r3, #1\n\t"
  29141. #else
  29142. "lsr r6, r3, #1\n\t"
  29143. #endif
  29144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29145. "lsls r3, r3, %[n]\n\t"
  29146. #else
  29147. "lsl r3, r3, %[n]\n\t"
  29148. #endif
  29149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29150. "lsrs r6, r6, r7\n\t"
  29151. #else
  29152. "lsr r6, r6, r7\n\t"
  29153. #endif
  29154. #ifdef WOLFSSL_KEIL
  29155. "orrs r4, r4, r6\n\t"
  29156. #elif defined(__clang__)
  29157. "orrs r4, r6\n\t"
  29158. #else
  29159. "orr r4, r6\n\t"
  29160. #endif
  29161. "ldr r5, [%[a], #28]\n\t"
  29162. "str r4, [%[r], #36]\n\t"
  29163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29164. "lsrs r6, r5, #1\n\t"
  29165. #else
  29166. "lsr r6, r5, #1\n\t"
  29167. #endif
  29168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29169. "lsls r5, r5, %[n]\n\t"
  29170. #else
  29171. "lsl r5, r5, %[n]\n\t"
  29172. #endif
  29173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29174. "lsrs r6, r6, r7\n\t"
  29175. #else
  29176. "lsr r6, r6, r7\n\t"
  29177. #endif
  29178. #ifdef WOLFSSL_KEIL
  29179. "orrs r3, r3, r6\n\t"
  29180. #elif defined(__clang__)
  29181. "orrs r3, r6\n\t"
  29182. #else
  29183. "orr r3, r6\n\t"
  29184. #endif
  29185. "ldr r4, [%[a], #24]\n\t"
  29186. "str r3, [%[r], #32]\n\t"
  29187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29188. "lsrs r6, r4, #1\n\t"
  29189. #else
  29190. "lsr r6, r4, #1\n\t"
  29191. #endif
  29192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29193. "lsls r4, r4, %[n]\n\t"
  29194. #else
  29195. "lsl r4, r4, %[n]\n\t"
  29196. #endif
  29197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29198. "lsrs r6, r6, r7\n\t"
  29199. #else
  29200. "lsr r6, r6, r7\n\t"
  29201. #endif
  29202. #ifdef WOLFSSL_KEIL
  29203. "orrs r5, r5, r6\n\t"
  29204. #elif defined(__clang__)
  29205. "orrs r5, r6\n\t"
  29206. #else
  29207. "orr r5, r6\n\t"
  29208. #endif
  29209. "ldr r3, [%[a], #20]\n\t"
  29210. "str r5, [%[r], #28]\n\t"
  29211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29212. "lsrs r6, r3, #1\n\t"
  29213. #else
  29214. "lsr r6, r3, #1\n\t"
  29215. #endif
  29216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29217. "lsls r3, r3, %[n]\n\t"
  29218. #else
  29219. "lsl r3, r3, %[n]\n\t"
  29220. #endif
  29221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29222. "lsrs r6, r6, r7\n\t"
  29223. #else
  29224. "lsr r6, r6, r7\n\t"
  29225. #endif
  29226. #ifdef WOLFSSL_KEIL
  29227. "orrs r4, r4, r6\n\t"
  29228. #elif defined(__clang__)
  29229. "orrs r4, r6\n\t"
  29230. #else
  29231. "orr r4, r6\n\t"
  29232. #endif
  29233. "ldr r5, [%[a], #16]\n\t"
  29234. "str r4, [%[r], #24]\n\t"
  29235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29236. "lsrs r6, r5, #1\n\t"
  29237. #else
  29238. "lsr r6, r5, #1\n\t"
  29239. #endif
  29240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29241. "lsls r5, r5, %[n]\n\t"
  29242. #else
  29243. "lsl r5, r5, %[n]\n\t"
  29244. #endif
  29245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29246. "lsrs r6, r6, r7\n\t"
  29247. #else
  29248. "lsr r6, r6, r7\n\t"
  29249. #endif
  29250. #ifdef WOLFSSL_KEIL
  29251. "orrs r3, r3, r6\n\t"
  29252. #elif defined(__clang__)
  29253. "orrs r3, r6\n\t"
  29254. #else
  29255. "orr r3, r6\n\t"
  29256. #endif
  29257. "ldr r4, [%[a], #12]\n\t"
  29258. "str r3, [%[r], #20]\n\t"
  29259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29260. "lsrs r6, r4, #1\n\t"
  29261. #else
  29262. "lsr r6, r4, #1\n\t"
  29263. #endif
  29264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29265. "lsls r4, r4, %[n]\n\t"
  29266. #else
  29267. "lsl r4, r4, %[n]\n\t"
  29268. #endif
  29269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29270. "lsrs r6, r6, r7\n\t"
  29271. #else
  29272. "lsr r6, r6, r7\n\t"
  29273. #endif
  29274. #ifdef WOLFSSL_KEIL
  29275. "orrs r5, r5, r6\n\t"
  29276. #elif defined(__clang__)
  29277. "orrs r5, r6\n\t"
  29278. #else
  29279. "orr r5, r6\n\t"
  29280. #endif
  29281. "ldr r3, [%[a], #8]\n\t"
  29282. "str r5, [%[r], #16]\n\t"
  29283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29284. "lsrs r6, r3, #1\n\t"
  29285. #else
  29286. "lsr r6, r3, #1\n\t"
  29287. #endif
  29288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29289. "lsls r3, r3, %[n]\n\t"
  29290. #else
  29291. "lsl r3, r3, %[n]\n\t"
  29292. #endif
  29293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29294. "lsrs r6, r6, r7\n\t"
  29295. #else
  29296. "lsr r6, r6, r7\n\t"
  29297. #endif
  29298. #ifdef WOLFSSL_KEIL
  29299. "orrs r4, r4, r6\n\t"
  29300. #elif defined(__clang__)
  29301. "orrs r4, r6\n\t"
  29302. #else
  29303. "orr r4, r6\n\t"
  29304. #endif
  29305. "ldr r5, [%[a], #4]\n\t"
  29306. "str r4, [%[r], #12]\n\t"
  29307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29308. "lsrs r6, r5, #1\n\t"
  29309. #else
  29310. "lsr r6, r5, #1\n\t"
  29311. #endif
  29312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29313. "lsls r5, r5, %[n]\n\t"
  29314. #else
  29315. "lsl r5, r5, %[n]\n\t"
  29316. #endif
  29317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29318. "lsrs r6, r6, r7\n\t"
  29319. #else
  29320. "lsr r6, r6, r7\n\t"
  29321. #endif
  29322. #ifdef WOLFSSL_KEIL
  29323. "orrs r3, r3, r6\n\t"
  29324. #elif defined(__clang__)
  29325. "orrs r3, r6\n\t"
  29326. #else
  29327. "orr r3, r6\n\t"
  29328. #endif
  29329. "ldr r4, [%[a]]\n\t"
  29330. "str r3, [%[r], #8]\n\t"
  29331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29332. "lsrs r6, r4, #1\n\t"
  29333. #else
  29334. "lsr r6, r4, #1\n\t"
  29335. #endif
  29336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29337. "lsls r4, r4, %[n]\n\t"
  29338. #else
  29339. "lsl r4, r4, %[n]\n\t"
  29340. #endif
  29341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29342. "lsrs r6, r6, r7\n\t"
  29343. #else
  29344. "lsr r6, r6, r7\n\t"
  29345. #endif
  29346. #ifdef WOLFSSL_KEIL
  29347. "orrs r5, r5, r6\n\t"
  29348. #elif defined(__clang__)
  29349. "orrs r5, r6\n\t"
  29350. #else
  29351. "orr r5, r6\n\t"
  29352. #endif
  29353. "str r4, [%[r]]\n\t"
  29354. "str r5, [%[r], #4]\n\t"
  29355. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  29356. :
  29357. : "memory", "r3", "r4", "r5", "r6", "r7"
  29358. );
  29359. }
  29360. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  29361. *
  29362. * r A single precision number that is the result of the operation.
  29363. * e A single precision number that is the exponent.
  29364. * bits The number of bits in the exponent.
  29365. * m A single precision number that is the modulus.
  29366. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  29367. */
  29368. static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits,
  29369. const sp_digit* m)
  29370. {
  29371. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  29372. sp_digit* td = NULL;
  29373. #else
  29374. sp_digit td[193];
  29375. #endif
  29376. sp_digit* norm = NULL;
  29377. sp_digit* tmp = NULL;
  29378. sp_digit mp = 1;
  29379. sp_digit n;
  29380. sp_digit o;
  29381. sp_digit mask;
  29382. int i;
  29383. int c;
  29384. byte y;
  29385. int err = MP_OKAY;
  29386. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  29387. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL,
  29388. DYNAMIC_TYPE_TMP_BUFFER);
  29389. if (td == NULL)
  29390. err = MEMORY_E;
  29391. #endif
  29392. if (err == MP_OKAY) {
  29393. norm = td;
  29394. tmp = td + 128;
  29395. sp_2048_mont_setup(m, &mp);
  29396. sp_2048_mont_norm_64(norm, m);
  29397. i = (bits - 1) / 32;
  29398. n = e[i--];
  29399. c = bits & 31;
  29400. if (c == 0) {
  29401. c = 32;
  29402. }
  29403. c -= bits % 5;
  29404. if (c == 32) {
  29405. c = 27;
  29406. }
  29407. if (c < 0) {
  29408. /* Number of bits in top word is less than number needed. */
  29409. c = -c;
  29410. y = (byte)(n << c);
  29411. n = e[i--];
  29412. y |= (byte)(n >> (64 - c));
  29413. n <<= c;
  29414. c = 64 - c;
  29415. }
  29416. else {
  29417. y = (byte)(n >> c);
  29418. n <<= 32 - c;
  29419. }
  29420. sp_2048_lshift_64(r, norm, y);
  29421. for (; i>=0 || c>=5; ) {
  29422. if (c == 0) {
  29423. n = e[i--];
  29424. y = (byte)(n >> 27);
  29425. n <<= 5;
  29426. c = 27;
  29427. }
  29428. else if (c < 5) {
  29429. y = (byte)(n >> 27);
  29430. n = e[i--];
  29431. c = 5 - c;
  29432. y |= (byte)(n >> (32 - c));
  29433. n <<= c;
  29434. c = 32 - c;
  29435. }
  29436. else {
  29437. y = (byte)((n >> 27) & 0x1f);
  29438. n <<= 5;
  29439. c -= 5;
  29440. }
  29441. sp_2048_mont_sqr_64(r, r, m, mp);
  29442. sp_2048_mont_sqr_64(r, r, m, mp);
  29443. sp_2048_mont_sqr_64(r, r, m, mp);
  29444. sp_2048_mont_sqr_64(r, r, m, mp);
  29445. sp_2048_mont_sqr_64(r, r, m, mp);
  29446. sp_2048_lshift_64(r, r, y);
  29447. sp_2048_mul_d_64(tmp, norm, r[64]);
  29448. r[64] = 0;
  29449. o = sp_2048_add_64(r, r, tmp);
  29450. sp_2048_cond_sub_64(r, r, m, (sp_digit)0 - o);
  29451. }
  29452. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  29453. sp_2048_mont_reduce_64(r, m, mp);
  29454. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  29455. sp_2048_cond_sub_64(r, r, m, mask);
  29456. }
  29457. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  29458. if (td != NULL)
  29459. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29460. #endif
  29461. return err;
  29462. }
  29463. #endif /* HAVE_FFDHE_2048 */
  29464. /* Perform the modular exponentiation for Diffie-Hellman.
  29465. *
  29466. * base Base.
  29467. * exp Array of bytes that is the exponent.
  29468. * expLen Length of data, in bytes, in exponent.
  29469. * mod Modulus.
  29470. * out Buffer to hold big-endian bytes of exponentiation result.
  29471. * Must be at least 256 bytes long.
  29472. * outLen Length, in bytes, of exponentiation result.
  29473. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  29474. * and MEMORY_E if memory allocation fails.
  29475. */
  29476. int sp_DhExp_2048(const mp_int* base, const byte* exp, word32 expLen,
  29477. const mp_int* mod, byte* out, word32* outLen)
  29478. {
  29479. int err = MP_OKAY;
  29480. sp_digit b[128];
  29481. sp_digit e[64];
  29482. sp_digit m[64];
  29483. sp_digit* r = b;
  29484. word32 i;
  29485. if (mp_count_bits(base) > 2048) {
  29486. err = MP_READ_E;
  29487. }
  29488. else if (expLen > 256) {
  29489. err = MP_READ_E;
  29490. }
  29491. else if (mp_count_bits(mod) != 2048) {
  29492. err = MP_READ_E;
  29493. }
  29494. else if (mp_iseven(mod)) {
  29495. err = MP_VAL;
  29496. }
  29497. if (err == MP_OKAY) {
  29498. sp_2048_from_mp(b, 64, base);
  29499. sp_2048_from_bin(e, 64, exp, expLen);
  29500. sp_2048_from_mp(m, 64, mod);
  29501. #ifdef HAVE_FFDHE_2048
  29502. if (base->used == 1 && base->dp[0] == 2 && m[63] == (sp_digit)-1)
  29503. err = sp_2048_mod_exp_2_64(r, e, expLen * 8, m);
  29504. else
  29505. #endif
  29506. err = sp_2048_mod_exp_64(r, b, e, expLen * 8, m, 0);
  29507. }
  29508. if (err == MP_OKAY) {
  29509. sp_2048_to_bin_64(r, out);
  29510. *outLen = 256;
  29511. for (i=0; i<256 && out[i] == 0; i++) {
  29512. /* Search for first non-zero. */
  29513. }
  29514. *outLen -= i;
  29515. XMEMMOVE(out, out + i, *outLen);
  29516. }
  29517. XMEMSET(e, 0, sizeof(e));
  29518. return err;
  29519. }
  29520. #endif /* WOLFSSL_HAVE_SP_DH */
  29521. /* Perform the modular exponentiation for Diffie-Hellman.
  29522. *
  29523. * base Base. MP integer.
  29524. * exp Exponent. MP integer.
  29525. * mod Modulus. MP integer.
  29526. * res Result. MP integer.
  29527. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  29528. * and MEMORY_E if memory allocation fails.
  29529. */
  29530. int sp_ModExp_1024(const mp_int* base, const mp_int* exp, const mp_int* mod,
  29531. mp_int* res)
  29532. {
  29533. int err = MP_OKAY;
  29534. sp_digit b[64];
  29535. sp_digit e[32];
  29536. sp_digit m[32];
  29537. sp_digit* r = b;
  29538. int expBits = mp_count_bits(exp);
  29539. if (mp_count_bits(base) > 1024) {
  29540. err = MP_READ_E;
  29541. }
  29542. else if (expBits > 1024) {
  29543. err = MP_READ_E;
  29544. }
  29545. else if (mp_count_bits(mod) != 1024) {
  29546. err = MP_READ_E;
  29547. }
  29548. else if (mp_iseven(mod)) {
  29549. err = MP_VAL;
  29550. }
  29551. if (err == MP_OKAY) {
  29552. sp_2048_from_mp(b, 32, base);
  29553. sp_2048_from_mp(e, 32, exp);
  29554. sp_2048_from_mp(m, 32, mod);
  29555. err = sp_2048_mod_exp_32(r, b, e, expBits, m, 0);
  29556. }
  29557. if (err == MP_OKAY) {
  29558. XMEMSET(r + 32, 0, sizeof(*r) * 32U);
  29559. err = sp_2048_to_mp(r, res);
  29560. res->used = mod->used;
  29561. mp_clamp(res);
  29562. }
  29563. XMEMSET(e, 0, sizeof(e));
  29564. return err;
  29565. }
  29566. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  29567. #endif /* !WOLFSSL_SP_NO_2048 */
  29568. #ifndef WOLFSSL_SP_NO_3072
  29569. /* Read big endian unsigned byte array into r.
  29570. *
  29571. * r A single precision integer.
  29572. * size Maximum number of bytes to convert
  29573. * a Byte array.
  29574. * n Number of bytes in array to read.
  29575. */
  29576. static void sp_3072_from_bin(sp_digit* r, int size, const byte* a, int n)
  29577. {
  29578. int i;
  29579. int j = 0;
  29580. word32 s = 0;
  29581. r[0] = 0;
  29582. for (i = n-1; i >= 0; i--) {
  29583. r[j] |= (((sp_digit)a[i]) << s);
  29584. if (s >= 24U) {
  29585. r[j] &= 0xffffffff;
  29586. s = 32U - s;
  29587. if (j + 1 >= size) {
  29588. break;
  29589. }
  29590. r[++j] = (sp_digit)a[i] >> s;
  29591. s = 8U - s;
  29592. }
  29593. else {
  29594. s += 8U;
  29595. }
  29596. }
  29597. for (j++; j < size; j++) {
  29598. r[j] = 0;
  29599. }
  29600. }
  29601. /* Convert an mp_int to an array of sp_digit.
  29602. *
  29603. * r A single precision integer.
  29604. * size Maximum number of bytes to convert
  29605. * a A multi-precision integer.
  29606. */
  29607. static void sp_3072_from_mp(sp_digit* r, int size, const mp_int* a)
  29608. {
  29609. #if DIGIT_BIT == 32
  29610. int j;
  29611. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  29612. for (j = a->used; j < size; j++) {
  29613. r[j] = 0;
  29614. }
  29615. #elif DIGIT_BIT > 32
  29616. int i;
  29617. int j = 0;
  29618. word32 s = 0;
  29619. r[0] = 0;
  29620. for (i = 0; i < a->used && j < size; i++) {
  29621. r[j] |= ((sp_digit)a->dp[i] << s);
  29622. r[j] &= 0xffffffff;
  29623. s = 32U - s;
  29624. if (j + 1 >= size) {
  29625. break;
  29626. }
  29627. /* lint allow cast of mismatch word32 and mp_digit */
  29628. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  29629. while ((s + 32U) <= (word32)DIGIT_BIT) {
  29630. s += 32U;
  29631. r[j] &= 0xffffffff;
  29632. if (j + 1 >= size) {
  29633. break;
  29634. }
  29635. if (s < (word32)DIGIT_BIT) {
  29636. /* lint allow cast of mismatch word32 and mp_digit */
  29637. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  29638. }
  29639. else {
  29640. r[++j] = (sp_digit)0;
  29641. }
  29642. }
  29643. s = (word32)DIGIT_BIT - s;
  29644. }
  29645. for (j++; j < size; j++) {
  29646. r[j] = 0;
  29647. }
  29648. #else
  29649. int i;
  29650. int j = 0;
  29651. int s = 0;
  29652. r[0] = 0;
  29653. for (i = 0; i < a->used && j < size; i++) {
  29654. r[j] |= ((sp_digit)a->dp[i]) << s;
  29655. if (s + DIGIT_BIT >= 32) {
  29656. r[j] &= 0xffffffff;
  29657. if (j + 1 >= size) {
  29658. break;
  29659. }
  29660. s = 32 - s;
  29661. if (s == DIGIT_BIT) {
  29662. r[++j] = 0;
  29663. s = 0;
  29664. }
  29665. else {
  29666. r[++j] = a->dp[i] >> s;
  29667. s = DIGIT_BIT - s;
  29668. }
  29669. }
  29670. else {
  29671. s += DIGIT_BIT;
  29672. }
  29673. }
  29674. for (j++; j < size; j++) {
  29675. r[j] = 0;
  29676. }
  29677. #endif
  29678. }
  29679. /* Write r as big endian to byte array.
  29680. * Fixed length number of bytes written: 384
  29681. *
  29682. * r A single precision integer.
  29683. * a Byte array.
  29684. */
  29685. static void sp_3072_to_bin_96(sp_digit* r, byte* a)
  29686. {
  29687. int i;
  29688. int j;
  29689. int s = 0;
  29690. int b;
  29691. j = 3072 / 8 - 1;
  29692. a[j] = 0;
  29693. for (i=0; i<96 && j>=0; i++) {
  29694. b = 0;
  29695. /* lint allow cast of mismatch sp_digit and int */
  29696. a[j--] |= (byte)(r[i] << s); /*lint !e9033*/
  29697. b += 8 - s;
  29698. if (j < 0) {
  29699. break;
  29700. }
  29701. while (b < 32) {
  29702. a[j--] = (byte)(r[i] >> b);
  29703. b += 8;
  29704. if (j < 0) {
  29705. break;
  29706. }
  29707. }
  29708. s = 8 - (b - 32);
  29709. if (j >= 0) {
  29710. a[j] = 0;
  29711. }
  29712. if (s != 0) {
  29713. j++;
  29714. }
  29715. }
  29716. }
  29717. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  29718. /* Normalize the values in each word to 32.
  29719. *
  29720. * a Array of sp_digit to normalize.
  29721. */
  29722. #define sp_3072_norm_96(a)
  29723. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  29724. /* Normalize the values in each word to 32.
  29725. *
  29726. * a Array of sp_digit to normalize.
  29727. */
  29728. #define sp_3072_norm_96(a)
  29729. #ifndef WOLFSSL_SP_SMALL
  29730. #ifndef WOLFSSL_SP_LARGE_CODE
  29731. /* Multiply a and b into r. (r = a * b)
  29732. *
  29733. * r A single precision integer.
  29734. * a A single precision integer.
  29735. * b A single precision integer.
  29736. */
  29737. SP_NOINLINE static void sp_3072_mul_12(sp_digit* r, const sp_digit* a,
  29738. const sp_digit* b)
  29739. {
  29740. sp_digit t[12 * 2];
  29741. sp_digit* tmp = t;
  29742. __asm__ __volatile__ (
  29743. "movs r3, #0\n\t"
  29744. "movs r4, #0\n\t"
  29745. "mov r8, r3\n\t"
  29746. "mov r11, %[tmp]\n\t"
  29747. "mov r9, %[a]\n\t"
  29748. "mov r10, %[b]\n\t"
  29749. "movs r6, #48\n\t"
  29750. "add r6, r6, r9\n\t"
  29751. "mov r12, r6\n\t"
  29752. "\n"
  29753. "L_sp_3072_mul_12_words_%=:\n\t"
  29754. "movs %[tmp], #0\n\t"
  29755. "movs r5, #0\n\t"
  29756. "movs r6, #44\n\t"
  29757. "mov %[a], r8\n\t"
  29758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29759. "subs %[a], %[a], r6\n\t"
  29760. #else
  29761. "sub %[a], %[a], r6\n\t"
  29762. #endif
  29763. #ifdef WOLFSSL_KEIL
  29764. "sbcs r6, r6, r6\n\t"
  29765. #elif defined(__clang__)
  29766. "sbcs r6, r6\n\t"
  29767. #else
  29768. "sbc r6, r6\n\t"
  29769. #endif
  29770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29771. "mvns r6, r6\n\t"
  29772. #else
  29773. "mvn r6, r6\n\t"
  29774. #endif
  29775. #ifdef WOLFSSL_KEIL
  29776. "ands %[a], %[a], r6\n\t"
  29777. #elif defined(__clang__)
  29778. "ands %[a], r6\n\t"
  29779. #else
  29780. "and %[a], r6\n\t"
  29781. #endif
  29782. "mov %[b], r8\n\t"
  29783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29784. "subs %[b], %[b], %[a]\n\t"
  29785. #else
  29786. "sub %[b], %[b], %[a]\n\t"
  29787. #endif
  29788. "add %[a], %[a], r9\n\t"
  29789. "add %[b], %[b], r10\n\t"
  29790. "\n"
  29791. "L_sp_3072_mul_12_mul_%=:\n\t"
  29792. "# Multiply Start\n\t"
  29793. "ldrh r6, [%[a]]\n\t"
  29794. "ldrh r7, [%[b]]\n\t"
  29795. #ifdef WOLFSSL_KEIL
  29796. "muls r7, r6, r7\n\t"
  29797. #elif defined(__clang__)
  29798. "muls r7, r6\n\t"
  29799. #else
  29800. "mul r7, r6\n\t"
  29801. #endif
  29802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29803. "adds r3, r3, r7\n\t"
  29804. #else
  29805. "add r3, r3, r7\n\t"
  29806. #endif
  29807. #ifdef WOLFSSL_KEIL
  29808. "adcs r4, r4, %[tmp]\n\t"
  29809. #elif defined(__clang__)
  29810. "adcs r4, %[tmp]\n\t"
  29811. #else
  29812. "adc r4, %[tmp]\n\t"
  29813. #endif
  29814. #ifdef WOLFSSL_KEIL
  29815. "adcs r5, r5, %[tmp]\n\t"
  29816. #elif defined(__clang__)
  29817. "adcs r5, %[tmp]\n\t"
  29818. #else
  29819. "adc r5, %[tmp]\n\t"
  29820. #endif
  29821. "ldr r7, [%[b]]\n\t"
  29822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29823. "lsrs r7, r7, #16\n\t"
  29824. #else
  29825. "lsr r7, r7, #16\n\t"
  29826. #endif
  29827. #ifdef WOLFSSL_KEIL
  29828. "muls r6, r7, r6\n\t"
  29829. #elif defined(__clang__)
  29830. "muls r6, r7\n\t"
  29831. #else
  29832. "mul r6, r7\n\t"
  29833. #endif
  29834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29835. "lsrs r7, r6, #16\n\t"
  29836. #else
  29837. "lsr r7, r6, #16\n\t"
  29838. #endif
  29839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29840. "lsls r6, r6, #16\n\t"
  29841. #else
  29842. "lsl r6, r6, #16\n\t"
  29843. #endif
  29844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29845. "adds r3, r3, r6\n\t"
  29846. #else
  29847. "add r3, r3, r6\n\t"
  29848. #endif
  29849. #ifdef WOLFSSL_KEIL
  29850. "adcs r4, r4, r7\n\t"
  29851. #elif defined(__clang__)
  29852. "adcs r4, r7\n\t"
  29853. #else
  29854. "adc r4, r7\n\t"
  29855. #endif
  29856. #ifdef WOLFSSL_KEIL
  29857. "adcs r5, r5, %[tmp]\n\t"
  29858. #elif defined(__clang__)
  29859. "adcs r5, %[tmp]\n\t"
  29860. #else
  29861. "adc r5, %[tmp]\n\t"
  29862. #endif
  29863. "ldr r6, [%[a]]\n\t"
  29864. "ldr r7, [%[b]]\n\t"
  29865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29866. "lsrs r6, r6, #16\n\t"
  29867. #else
  29868. "lsr r6, r6, #16\n\t"
  29869. #endif
  29870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29871. "lsrs r7, r7, #16\n\t"
  29872. #else
  29873. "lsr r7, r7, #16\n\t"
  29874. #endif
  29875. #ifdef WOLFSSL_KEIL
  29876. "muls r7, r6, r7\n\t"
  29877. #elif defined(__clang__)
  29878. "muls r7, r6\n\t"
  29879. #else
  29880. "mul r7, r6\n\t"
  29881. #endif
  29882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29883. "adds r4, r4, r7\n\t"
  29884. #else
  29885. "add r4, r4, r7\n\t"
  29886. #endif
  29887. #ifdef WOLFSSL_KEIL
  29888. "adcs r5, r5, %[tmp]\n\t"
  29889. #elif defined(__clang__)
  29890. "adcs r5, %[tmp]\n\t"
  29891. #else
  29892. "adc r5, %[tmp]\n\t"
  29893. #endif
  29894. "ldrh r7, [%[b]]\n\t"
  29895. #ifdef WOLFSSL_KEIL
  29896. "muls r6, r7, r6\n\t"
  29897. #elif defined(__clang__)
  29898. "muls r6, r7\n\t"
  29899. #else
  29900. "mul r6, r7\n\t"
  29901. #endif
  29902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29903. "lsrs r7, r6, #16\n\t"
  29904. #else
  29905. "lsr r7, r6, #16\n\t"
  29906. #endif
  29907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29908. "lsls r6, r6, #16\n\t"
  29909. #else
  29910. "lsl r6, r6, #16\n\t"
  29911. #endif
  29912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29913. "adds r3, r3, r6\n\t"
  29914. #else
  29915. "add r3, r3, r6\n\t"
  29916. #endif
  29917. #ifdef WOLFSSL_KEIL
  29918. "adcs r4, r4, r7\n\t"
  29919. #elif defined(__clang__)
  29920. "adcs r4, r7\n\t"
  29921. #else
  29922. "adc r4, r7\n\t"
  29923. #endif
  29924. #ifdef WOLFSSL_KEIL
  29925. "adcs r5, r5, %[tmp]\n\t"
  29926. #elif defined(__clang__)
  29927. "adcs r5, %[tmp]\n\t"
  29928. #else
  29929. "adc r5, %[tmp]\n\t"
  29930. #endif
  29931. "# Multiply Done\n\t"
  29932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29933. "adds %[a], %[a], #4\n\t"
  29934. #else
  29935. "add %[a], %[a], #4\n\t"
  29936. #endif
  29937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29938. "subs %[b], %[b], #4\n\t"
  29939. #else
  29940. "sub %[b], %[b], #4\n\t"
  29941. #endif
  29942. "cmp %[a], r12\n\t"
  29943. "beq L_sp_3072_mul_12_done_mul_%=\n\t"
  29944. "mov r6, r8\n\t"
  29945. "add r6, r6, r9\n\t"
  29946. "cmp %[a], r6\n\t"
  29947. "ble L_sp_3072_mul_12_mul_%=\n\t"
  29948. "\n"
  29949. "L_sp_3072_mul_12_done_mul_%=:\n\t"
  29950. "mov %[tmp], r11\n\t"
  29951. "mov r7, r8\n\t"
  29952. "str r3, [%[tmp], r7]\n\t"
  29953. "movs r3, r4\n\t"
  29954. "movs r4, r5\n\t"
  29955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29956. "adds r7, r7, #4\n\t"
  29957. #else
  29958. "add r7, r7, #4\n\t"
  29959. #endif
  29960. "mov r8, r7\n\t"
  29961. "movs r6, #0x58\n\t"
  29962. "cmp r7, r6\n\t"
  29963. "ble L_sp_3072_mul_12_words_%=\n\t"
  29964. "str r3, [%[tmp], r7]\n\t"
  29965. "mov %[a], r9\n\t"
  29966. "mov %[b], r10\n\t"
  29967. : [a] "+r" (a), [b] "+r" (b), [tmp] "+r" (tmp)
  29968. :
  29969. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  29970. );
  29971. XMEMCPY(r, t, sizeof(t));
  29972. }
  29973. #else
  29974. /* Multiply a and b into r. (r = a * b)
  29975. *
  29976. * r A single precision integer.
  29977. * a A single precision integer.
  29978. * b A single precision integer.
  29979. */
  29980. SP_NOINLINE static void sp_3072_mul_12(sp_digit* r, const sp_digit* a,
  29981. const sp_digit* b)
  29982. {
  29983. __asm__ __volatile__ (
  29984. "sub sp, sp, #48\n\t"
  29985. "mov r8, %[r]\n\t"
  29986. "mov r9, %[a]\n\t"
  29987. "mov r10, %[b]\n\t"
  29988. "movs %[r], #0\n\t"
  29989. "# A[0] * B[0]\n\t"
  29990. "ldr %[a], [%[a]]\n\t"
  29991. "ldr %[b], [%[b]]\n\t"
  29992. "uxth r6, %[a]\n\t"
  29993. "uxth r3, %[b]\n\t"
  29994. #ifdef WOLFSSL_KEIL
  29995. "muls r3, r6, r3\n\t"
  29996. #elif defined(__clang__)
  29997. "muls r3, r6\n\t"
  29998. #else
  29999. "mul r3, r6\n\t"
  30000. #endif
  30001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30002. "lsrs r7, %[b], #16\n\t"
  30003. #else
  30004. "lsr r7, %[b], #16\n\t"
  30005. #endif
  30006. #ifdef WOLFSSL_KEIL
  30007. "muls r6, r7, r6\n\t"
  30008. #elif defined(__clang__)
  30009. "muls r6, r7\n\t"
  30010. #else
  30011. "mul r6, r7\n\t"
  30012. #endif
  30013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30014. "lsrs r4, r6, #16\n\t"
  30015. #else
  30016. "lsr r4, r6, #16\n\t"
  30017. #endif
  30018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30019. "lsls r6, r6, #16\n\t"
  30020. #else
  30021. "lsl r6, r6, #16\n\t"
  30022. #endif
  30023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30024. "adds r3, r3, r6\n\t"
  30025. #else
  30026. "add r3, r3, r6\n\t"
  30027. #endif
  30028. #ifdef WOLFSSL_KEIL
  30029. "adcs r4, r4, %[r]\n\t"
  30030. #elif defined(__clang__)
  30031. "adcs r4, %[r]\n\t"
  30032. #else
  30033. "adc r4, %[r]\n\t"
  30034. #endif
  30035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30036. "lsrs r6, %[a], #16\n\t"
  30037. #else
  30038. "lsr r6, %[a], #16\n\t"
  30039. #endif
  30040. #ifdef WOLFSSL_KEIL
  30041. "muls r7, r6, r7\n\t"
  30042. #elif defined(__clang__)
  30043. "muls r7, r6\n\t"
  30044. #else
  30045. "mul r7, r6\n\t"
  30046. #endif
  30047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30048. "adds r4, r4, r7\n\t"
  30049. #else
  30050. "add r4, r4, r7\n\t"
  30051. #endif
  30052. "uxth r7, %[b]\n\t"
  30053. #ifdef WOLFSSL_KEIL
  30054. "muls r6, r7, r6\n\t"
  30055. #elif defined(__clang__)
  30056. "muls r6, r7\n\t"
  30057. #else
  30058. "mul r6, r7\n\t"
  30059. #endif
  30060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30061. "lsrs r7, r6, #16\n\t"
  30062. #else
  30063. "lsr r7, r6, #16\n\t"
  30064. #endif
  30065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30066. "lsls r6, r6, #16\n\t"
  30067. #else
  30068. "lsl r6, r6, #16\n\t"
  30069. #endif
  30070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30071. "adds r3, r3, r6\n\t"
  30072. #else
  30073. "add r3, r3, r6\n\t"
  30074. #endif
  30075. #ifdef WOLFSSL_KEIL
  30076. "adcs r4, r4, r7\n\t"
  30077. #elif defined(__clang__)
  30078. "adcs r4, r7\n\t"
  30079. #else
  30080. "adc r4, r7\n\t"
  30081. #endif
  30082. "movs r5, #0\n\t"
  30083. "str r3, [sp]\n\t"
  30084. "# A[0] * B[1]\n\t"
  30085. "movs r3, #0\n\t"
  30086. "mov %[a], r9\n\t"
  30087. "mov %[b], r10\n\t"
  30088. "ldr %[a], [%[a]]\n\t"
  30089. "ldr %[b], [%[b], #4]\n\t"
  30090. "uxth r6, %[a]\n\t"
  30091. "uxth r7, %[b]\n\t"
  30092. #ifdef WOLFSSL_KEIL
  30093. "muls r7, r6, r7\n\t"
  30094. #elif defined(__clang__)
  30095. "muls r7, r6\n\t"
  30096. #else
  30097. "mul r7, r6\n\t"
  30098. #endif
  30099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30100. "adds r4, r4, r7\n\t"
  30101. #else
  30102. "add r4, r4, r7\n\t"
  30103. #endif
  30104. #ifdef WOLFSSL_KEIL
  30105. "adcs r5, r5, %[r]\n\t"
  30106. #elif defined(__clang__)
  30107. "adcs r5, %[r]\n\t"
  30108. #else
  30109. "adc r5, %[r]\n\t"
  30110. #endif
  30111. #ifdef WOLFSSL_KEIL
  30112. "adcs r3, r3, %[r]\n\t"
  30113. #elif defined(__clang__)
  30114. "adcs r3, %[r]\n\t"
  30115. #else
  30116. "adc r3, %[r]\n\t"
  30117. #endif
  30118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30119. "lsrs r7, %[b], #16\n\t"
  30120. #else
  30121. "lsr r7, %[b], #16\n\t"
  30122. #endif
  30123. #ifdef WOLFSSL_KEIL
  30124. "muls r6, r7, r6\n\t"
  30125. #elif defined(__clang__)
  30126. "muls r6, r7\n\t"
  30127. #else
  30128. "mul r6, r7\n\t"
  30129. #endif
  30130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30131. "lsrs r7, r6, #16\n\t"
  30132. #else
  30133. "lsr r7, r6, #16\n\t"
  30134. #endif
  30135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30136. "lsls r6, r6, #16\n\t"
  30137. #else
  30138. "lsl r6, r6, #16\n\t"
  30139. #endif
  30140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30141. "adds r4, r4, r6\n\t"
  30142. #else
  30143. "add r4, r4, r6\n\t"
  30144. #endif
  30145. #ifdef WOLFSSL_KEIL
  30146. "adcs r5, r5, r7\n\t"
  30147. #elif defined(__clang__)
  30148. "adcs r5, r7\n\t"
  30149. #else
  30150. "adc r5, r7\n\t"
  30151. #endif
  30152. #ifdef WOLFSSL_KEIL
  30153. "adcs r3, r3, %[r]\n\t"
  30154. #elif defined(__clang__)
  30155. "adcs r3, %[r]\n\t"
  30156. #else
  30157. "adc r3, %[r]\n\t"
  30158. #endif
  30159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30160. "lsrs r6, %[a], #16\n\t"
  30161. #else
  30162. "lsr r6, %[a], #16\n\t"
  30163. #endif
  30164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30165. "lsrs r7, %[b], #16\n\t"
  30166. #else
  30167. "lsr r7, %[b], #16\n\t"
  30168. #endif
  30169. #ifdef WOLFSSL_KEIL
  30170. "muls r7, r6, r7\n\t"
  30171. #elif defined(__clang__)
  30172. "muls r7, r6\n\t"
  30173. #else
  30174. "mul r7, r6\n\t"
  30175. #endif
  30176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30177. "adds r5, r5, r7\n\t"
  30178. #else
  30179. "add r5, r5, r7\n\t"
  30180. #endif
  30181. #ifdef WOLFSSL_KEIL
  30182. "adcs r3, r3, %[r]\n\t"
  30183. #elif defined(__clang__)
  30184. "adcs r3, %[r]\n\t"
  30185. #else
  30186. "adc r3, %[r]\n\t"
  30187. #endif
  30188. "uxth r7, %[b]\n\t"
  30189. #ifdef WOLFSSL_KEIL
  30190. "muls r6, r7, r6\n\t"
  30191. #elif defined(__clang__)
  30192. "muls r6, r7\n\t"
  30193. #else
  30194. "mul r6, r7\n\t"
  30195. #endif
  30196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30197. "lsrs r7, r6, #16\n\t"
  30198. #else
  30199. "lsr r7, r6, #16\n\t"
  30200. #endif
  30201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30202. "lsls r6, r6, #16\n\t"
  30203. #else
  30204. "lsl r6, r6, #16\n\t"
  30205. #endif
  30206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30207. "adds r4, r4, r6\n\t"
  30208. #else
  30209. "add r4, r4, r6\n\t"
  30210. #endif
  30211. #ifdef WOLFSSL_KEIL
  30212. "adcs r5, r5, r7\n\t"
  30213. #elif defined(__clang__)
  30214. "adcs r5, r7\n\t"
  30215. #else
  30216. "adc r5, r7\n\t"
  30217. #endif
  30218. #ifdef WOLFSSL_KEIL
  30219. "adcs r3, r3, %[r]\n\t"
  30220. #elif defined(__clang__)
  30221. "adcs r3, %[r]\n\t"
  30222. #else
  30223. "adc r3, %[r]\n\t"
  30224. #endif
  30225. "# A[1] * B[0]\n\t"
  30226. "mov %[a], r9\n\t"
  30227. "mov %[b], r10\n\t"
  30228. "ldr %[a], [%[a], #4]\n\t"
  30229. "ldr %[b], [%[b]]\n\t"
  30230. "uxth r6, %[a]\n\t"
  30231. "uxth r7, %[b]\n\t"
  30232. #ifdef WOLFSSL_KEIL
  30233. "muls r7, r6, r7\n\t"
  30234. #elif defined(__clang__)
  30235. "muls r7, r6\n\t"
  30236. #else
  30237. "mul r7, r6\n\t"
  30238. #endif
  30239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30240. "adds r4, r4, r7\n\t"
  30241. #else
  30242. "add r4, r4, r7\n\t"
  30243. #endif
  30244. #ifdef WOLFSSL_KEIL
  30245. "adcs r5, r5, %[r]\n\t"
  30246. #elif defined(__clang__)
  30247. "adcs r5, %[r]\n\t"
  30248. #else
  30249. "adc r5, %[r]\n\t"
  30250. #endif
  30251. #ifdef WOLFSSL_KEIL
  30252. "adcs r3, r3, %[r]\n\t"
  30253. #elif defined(__clang__)
  30254. "adcs r3, %[r]\n\t"
  30255. #else
  30256. "adc r3, %[r]\n\t"
  30257. #endif
  30258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30259. "lsrs r7, %[b], #16\n\t"
  30260. #else
  30261. "lsr r7, %[b], #16\n\t"
  30262. #endif
  30263. #ifdef WOLFSSL_KEIL
  30264. "muls r6, r7, r6\n\t"
  30265. #elif defined(__clang__)
  30266. "muls r6, r7\n\t"
  30267. #else
  30268. "mul r6, r7\n\t"
  30269. #endif
  30270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30271. "lsrs r7, r6, #16\n\t"
  30272. #else
  30273. "lsr r7, r6, #16\n\t"
  30274. #endif
  30275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30276. "lsls r6, r6, #16\n\t"
  30277. #else
  30278. "lsl r6, r6, #16\n\t"
  30279. #endif
  30280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30281. "adds r4, r4, r6\n\t"
  30282. #else
  30283. "add r4, r4, r6\n\t"
  30284. #endif
  30285. #ifdef WOLFSSL_KEIL
  30286. "adcs r5, r5, r7\n\t"
  30287. #elif defined(__clang__)
  30288. "adcs r5, r7\n\t"
  30289. #else
  30290. "adc r5, r7\n\t"
  30291. #endif
  30292. #ifdef WOLFSSL_KEIL
  30293. "adcs r3, r3, %[r]\n\t"
  30294. #elif defined(__clang__)
  30295. "adcs r3, %[r]\n\t"
  30296. #else
  30297. "adc r3, %[r]\n\t"
  30298. #endif
  30299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30300. "lsrs r6, %[a], #16\n\t"
  30301. #else
  30302. "lsr r6, %[a], #16\n\t"
  30303. #endif
  30304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30305. "lsrs r7, %[b], #16\n\t"
  30306. #else
  30307. "lsr r7, %[b], #16\n\t"
  30308. #endif
  30309. #ifdef WOLFSSL_KEIL
  30310. "muls r7, r6, r7\n\t"
  30311. #elif defined(__clang__)
  30312. "muls r7, r6\n\t"
  30313. #else
  30314. "mul r7, r6\n\t"
  30315. #endif
  30316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30317. "adds r5, r5, r7\n\t"
  30318. #else
  30319. "add r5, r5, r7\n\t"
  30320. #endif
  30321. #ifdef WOLFSSL_KEIL
  30322. "adcs r3, r3, %[r]\n\t"
  30323. #elif defined(__clang__)
  30324. "adcs r3, %[r]\n\t"
  30325. #else
  30326. "adc r3, %[r]\n\t"
  30327. #endif
  30328. "uxth r7, %[b]\n\t"
  30329. #ifdef WOLFSSL_KEIL
  30330. "muls r6, r7, r6\n\t"
  30331. #elif defined(__clang__)
  30332. "muls r6, r7\n\t"
  30333. #else
  30334. "mul r6, r7\n\t"
  30335. #endif
  30336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30337. "lsrs r7, r6, #16\n\t"
  30338. #else
  30339. "lsr r7, r6, #16\n\t"
  30340. #endif
  30341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30342. "lsls r6, r6, #16\n\t"
  30343. #else
  30344. "lsl r6, r6, #16\n\t"
  30345. #endif
  30346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30347. "adds r4, r4, r6\n\t"
  30348. #else
  30349. "add r4, r4, r6\n\t"
  30350. #endif
  30351. #ifdef WOLFSSL_KEIL
  30352. "adcs r5, r5, r7\n\t"
  30353. #elif defined(__clang__)
  30354. "adcs r5, r7\n\t"
  30355. #else
  30356. "adc r5, r7\n\t"
  30357. #endif
  30358. #ifdef WOLFSSL_KEIL
  30359. "adcs r3, r3, %[r]\n\t"
  30360. #elif defined(__clang__)
  30361. "adcs r3, %[r]\n\t"
  30362. #else
  30363. "adc r3, %[r]\n\t"
  30364. #endif
  30365. "str r4, [sp, #4]\n\t"
  30366. "# A[2] * B[0]\n\t"
  30367. "movs r4, #0\n\t"
  30368. "mov %[a], r9\n\t"
  30369. "mov %[b], r10\n\t"
  30370. "ldr %[a], [%[a], #8]\n\t"
  30371. "ldr %[b], [%[b]]\n\t"
  30372. "uxth r6, %[a]\n\t"
  30373. "uxth r7, %[b]\n\t"
  30374. #ifdef WOLFSSL_KEIL
  30375. "muls r7, r6, r7\n\t"
  30376. #elif defined(__clang__)
  30377. "muls r7, r6\n\t"
  30378. #else
  30379. "mul r7, r6\n\t"
  30380. #endif
  30381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30382. "adds r5, r5, r7\n\t"
  30383. #else
  30384. "add r5, r5, r7\n\t"
  30385. #endif
  30386. #ifdef WOLFSSL_KEIL
  30387. "adcs r3, r3, %[r]\n\t"
  30388. #elif defined(__clang__)
  30389. "adcs r3, %[r]\n\t"
  30390. #else
  30391. "adc r3, %[r]\n\t"
  30392. #endif
  30393. #ifdef WOLFSSL_KEIL
  30394. "adcs r4, r4, %[r]\n\t"
  30395. #elif defined(__clang__)
  30396. "adcs r4, %[r]\n\t"
  30397. #else
  30398. "adc r4, %[r]\n\t"
  30399. #endif
  30400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30401. "lsrs r7, %[b], #16\n\t"
  30402. #else
  30403. "lsr r7, %[b], #16\n\t"
  30404. #endif
  30405. #ifdef WOLFSSL_KEIL
  30406. "muls r6, r7, r6\n\t"
  30407. #elif defined(__clang__)
  30408. "muls r6, r7\n\t"
  30409. #else
  30410. "mul r6, r7\n\t"
  30411. #endif
  30412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30413. "lsrs r7, r6, #16\n\t"
  30414. #else
  30415. "lsr r7, r6, #16\n\t"
  30416. #endif
  30417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30418. "lsls r6, r6, #16\n\t"
  30419. #else
  30420. "lsl r6, r6, #16\n\t"
  30421. #endif
  30422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30423. "adds r5, r5, r6\n\t"
  30424. #else
  30425. "add r5, r5, r6\n\t"
  30426. #endif
  30427. #ifdef WOLFSSL_KEIL
  30428. "adcs r3, r3, r7\n\t"
  30429. #elif defined(__clang__)
  30430. "adcs r3, r7\n\t"
  30431. #else
  30432. "adc r3, r7\n\t"
  30433. #endif
  30434. #ifdef WOLFSSL_KEIL
  30435. "adcs r4, r4, %[r]\n\t"
  30436. #elif defined(__clang__)
  30437. "adcs r4, %[r]\n\t"
  30438. #else
  30439. "adc r4, %[r]\n\t"
  30440. #endif
  30441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30442. "lsrs r6, %[a], #16\n\t"
  30443. #else
  30444. "lsr r6, %[a], #16\n\t"
  30445. #endif
  30446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30447. "lsrs r7, %[b], #16\n\t"
  30448. #else
  30449. "lsr r7, %[b], #16\n\t"
  30450. #endif
  30451. #ifdef WOLFSSL_KEIL
  30452. "muls r7, r6, r7\n\t"
  30453. #elif defined(__clang__)
  30454. "muls r7, r6\n\t"
  30455. #else
  30456. "mul r7, r6\n\t"
  30457. #endif
  30458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30459. "adds r3, r3, r7\n\t"
  30460. #else
  30461. "add r3, r3, r7\n\t"
  30462. #endif
  30463. #ifdef WOLFSSL_KEIL
  30464. "adcs r4, r4, %[r]\n\t"
  30465. #elif defined(__clang__)
  30466. "adcs r4, %[r]\n\t"
  30467. #else
  30468. "adc r4, %[r]\n\t"
  30469. #endif
  30470. "uxth r7, %[b]\n\t"
  30471. #ifdef WOLFSSL_KEIL
  30472. "muls r6, r7, r6\n\t"
  30473. #elif defined(__clang__)
  30474. "muls r6, r7\n\t"
  30475. #else
  30476. "mul r6, r7\n\t"
  30477. #endif
  30478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30479. "lsrs r7, r6, #16\n\t"
  30480. #else
  30481. "lsr r7, r6, #16\n\t"
  30482. #endif
  30483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30484. "lsls r6, r6, #16\n\t"
  30485. #else
  30486. "lsl r6, r6, #16\n\t"
  30487. #endif
  30488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30489. "adds r5, r5, r6\n\t"
  30490. #else
  30491. "add r5, r5, r6\n\t"
  30492. #endif
  30493. #ifdef WOLFSSL_KEIL
  30494. "adcs r3, r3, r7\n\t"
  30495. #elif defined(__clang__)
  30496. "adcs r3, r7\n\t"
  30497. #else
  30498. "adc r3, r7\n\t"
  30499. #endif
  30500. #ifdef WOLFSSL_KEIL
  30501. "adcs r4, r4, %[r]\n\t"
  30502. #elif defined(__clang__)
  30503. "adcs r4, %[r]\n\t"
  30504. #else
  30505. "adc r4, %[r]\n\t"
  30506. #endif
  30507. "# A[1] * B[1]\n\t"
  30508. "mov %[a], r9\n\t"
  30509. "mov %[b], r10\n\t"
  30510. "ldr %[a], [%[a], #4]\n\t"
  30511. "ldr %[b], [%[b], #4]\n\t"
  30512. "uxth r6, %[a]\n\t"
  30513. "uxth r7, %[b]\n\t"
  30514. #ifdef WOLFSSL_KEIL
  30515. "muls r7, r6, r7\n\t"
  30516. #elif defined(__clang__)
  30517. "muls r7, r6\n\t"
  30518. #else
  30519. "mul r7, r6\n\t"
  30520. #endif
  30521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30522. "adds r5, r5, r7\n\t"
  30523. #else
  30524. "add r5, r5, r7\n\t"
  30525. #endif
  30526. #ifdef WOLFSSL_KEIL
  30527. "adcs r3, r3, %[r]\n\t"
  30528. #elif defined(__clang__)
  30529. "adcs r3, %[r]\n\t"
  30530. #else
  30531. "adc r3, %[r]\n\t"
  30532. #endif
  30533. #ifdef WOLFSSL_KEIL
  30534. "adcs r4, r4, %[r]\n\t"
  30535. #elif defined(__clang__)
  30536. "adcs r4, %[r]\n\t"
  30537. #else
  30538. "adc r4, %[r]\n\t"
  30539. #endif
  30540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30541. "lsrs r7, %[b], #16\n\t"
  30542. #else
  30543. "lsr r7, %[b], #16\n\t"
  30544. #endif
  30545. #ifdef WOLFSSL_KEIL
  30546. "muls r6, r7, r6\n\t"
  30547. #elif defined(__clang__)
  30548. "muls r6, r7\n\t"
  30549. #else
  30550. "mul r6, r7\n\t"
  30551. #endif
  30552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30553. "lsrs r7, r6, #16\n\t"
  30554. #else
  30555. "lsr r7, r6, #16\n\t"
  30556. #endif
  30557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30558. "lsls r6, r6, #16\n\t"
  30559. #else
  30560. "lsl r6, r6, #16\n\t"
  30561. #endif
  30562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30563. "adds r5, r5, r6\n\t"
  30564. #else
  30565. "add r5, r5, r6\n\t"
  30566. #endif
  30567. #ifdef WOLFSSL_KEIL
  30568. "adcs r3, r3, r7\n\t"
  30569. #elif defined(__clang__)
  30570. "adcs r3, r7\n\t"
  30571. #else
  30572. "adc r3, r7\n\t"
  30573. #endif
  30574. #ifdef WOLFSSL_KEIL
  30575. "adcs r4, r4, %[r]\n\t"
  30576. #elif defined(__clang__)
  30577. "adcs r4, %[r]\n\t"
  30578. #else
  30579. "adc r4, %[r]\n\t"
  30580. #endif
  30581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30582. "lsrs r6, %[a], #16\n\t"
  30583. #else
  30584. "lsr r6, %[a], #16\n\t"
  30585. #endif
  30586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30587. "lsrs r7, %[b], #16\n\t"
  30588. #else
  30589. "lsr r7, %[b], #16\n\t"
  30590. #endif
  30591. #ifdef WOLFSSL_KEIL
  30592. "muls r7, r6, r7\n\t"
  30593. #elif defined(__clang__)
  30594. "muls r7, r6\n\t"
  30595. #else
  30596. "mul r7, r6\n\t"
  30597. #endif
  30598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30599. "adds r3, r3, r7\n\t"
  30600. #else
  30601. "add r3, r3, r7\n\t"
  30602. #endif
  30603. #ifdef WOLFSSL_KEIL
  30604. "adcs r4, r4, %[r]\n\t"
  30605. #elif defined(__clang__)
  30606. "adcs r4, %[r]\n\t"
  30607. #else
  30608. "adc r4, %[r]\n\t"
  30609. #endif
  30610. "uxth r7, %[b]\n\t"
  30611. #ifdef WOLFSSL_KEIL
  30612. "muls r6, r7, r6\n\t"
  30613. #elif defined(__clang__)
  30614. "muls r6, r7\n\t"
  30615. #else
  30616. "mul r6, r7\n\t"
  30617. #endif
  30618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30619. "lsrs r7, r6, #16\n\t"
  30620. #else
  30621. "lsr r7, r6, #16\n\t"
  30622. #endif
  30623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30624. "lsls r6, r6, #16\n\t"
  30625. #else
  30626. "lsl r6, r6, #16\n\t"
  30627. #endif
  30628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30629. "adds r5, r5, r6\n\t"
  30630. #else
  30631. "add r5, r5, r6\n\t"
  30632. #endif
  30633. #ifdef WOLFSSL_KEIL
  30634. "adcs r3, r3, r7\n\t"
  30635. #elif defined(__clang__)
  30636. "adcs r3, r7\n\t"
  30637. #else
  30638. "adc r3, r7\n\t"
  30639. #endif
  30640. #ifdef WOLFSSL_KEIL
  30641. "adcs r4, r4, %[r]\n\t"
  30642. #elif defined(__clang__)
  30643. "adcs r4, %[r]\n\t"
  30644. #else
  30645. "adc r4, %[r]\n\t"
  30646. #endif
  30647. "# A[0] * B[2]\n\t"
  30648. "mov %[a], r9\n\t"
  30649. "mov %[b], r10\n\t"
  30650. "ldr %[a], [%[a]]\n\t"
  30651. "ldr %[b], [%[b], #8]\n\t"
  30652. "uxth r6, %[a]\n\t"
  30653. "uxth r7, %[b]\n\t"
  30654. #ifdef WOLFSSL_KEIL
  30655. "muls r7, r6, r7\n\t"
  30656. #elif defined(__clang__)
  30657. "muls r7, r6\n\t"
  30658. #else
  30659. "mul r7, r6\n\t"
  30660. #endif
  30661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30662. "adds r5, r5, r7\n\t"
  30663. #else
  30664. "add r5, r5, r7\n\t"
  30665. #endif
  30666. #ifdef WOLFSSL_KEIL
  30667. "adcs r3, r3, %[r]\n\t"
  30668. #elif defined(__clang__)
  30669. "adcs r3, %[r]\n\t"
  30670. #else
  30671. "adc r3, %[r]\n\t"
  30672. #endif
  30673. #ifdef WOLFSSL_KEIL
  30674. "adcs r4, r4, %[r]\n\t"
  30675. #elif defined(__clang__)
  30676. "adcs r4, %[r]\n\t"
  30677. #else
  30678. "adc r4, %[r]\n\t"
  30679. #endif
  30680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30681. "lsrs r7, %[b], #16\n\t"
  30682. #else
  30683. "lsr r7, %[b], #16\n\t"
  30684. #endif
  30685. #ifdef WOLFSSL_KEIL
  30686. "muls r6, r7, r6\n\t"
  30687. #elif defined(__clang__)
  30688. "muls r6, r7\n\t"
  30689. #else
  30690. "mul r6, r7\n\t"
  30691. #endif
  30692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30693. "lsrs r7, r6, #16\n\t"
  30694. #else
  30695. "lsr r7, r6, #16\n\t"
  30696. #endif
  30697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30698. "lsls r6, r6, #16\n\t"
  30699. #else
  30700. "lsl r6, r6, #16\n\t"
  30701. #endif
  30702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30703. "adds r5, r5, r6\n\t"
  30704. #else
  30705. "add r5, r5, r6\n\t"
  30706. #endif
  30707. #ifdef WOLFSSL_KEIL
  30708. "adcs r3, r3, r7\n\t"
  30709. #elif defined(__clang__)
  30710. "adcs r3, r7\n\t"
  30711. #else
  30712. "adc r3, r7\n\t"
  30713. #endif
  30714. #ifdef WOLFSSL_KEIL
  30715. "adcs r4, r4, %[r]\n\t"
  30716. #elif defined(__clang__)
  30717. "adcs r4, %[r]\n\t"
  30718. #else
  30719. "adc r4, %[r]\n\t"
  30720. #endif
  30721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30722. "lsrs r6, %[a], #16\n\t"
  30723. #else
  30724. "lsr r6, %[a], #16\n\t"
  30725. #endif
  30726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30727. "lsrs r7, %[b], #16\n\t"
  30728. #else
  30729. "lsr r7, %[b], #16\n\t"
  30730. #endif
  30731. #ifdef WOLFSSL_KEIL
  30732. "muls r7, r6, r7\n\t"
  30733. #elif defined(__clang__)
  30734. "muls r7, r6\n\t"
  30735. #else
  30736. "mul r7, r6\n\t"
  30737. #endif
  30738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30739. "adds r3, r3, r7\n\t"
  30740. #else
  30741. "add r3, r3, r7\n\t"
  30742. #endif
  30743. #ifdef WOLFSSL_KEIL
  30744. "adcs r4, r4, %[r]\n\t"
  30745. #elif defined(__clang__)
  30746. "adcs r4, %[r]\n\t"
  30747. #else
  30748. "adc r4, %[r]\n\t"
  30749. #endif
  30750. "uxth r7, %[b]\n\t"
  30751. #ifdef WOLFSSL_KEIL
  30752. "muls r6, r7, r6\n\t"
  30753. #elif defined(__clang__)
  30754. "muls r6, r7\n\t"
  30755. #else
  30756. "mul r6, r7\n\t"
  30757. #endif
  30758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30759. "lsrs r7, r6, #16\n\t"
  30760. #else
  30761. "lsr r7, r6, #16\n\t"
  30762. #endif
  30763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30764. "lsls r6, r6, #16\n\t"
  30765. #else
  30766. "lsl r6, r6, #16\n\t"
  30767. #endif
  30768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30769. "adds r5, r5, r6\n\t"
  30770. #else
  30771. "add r5, r5, r6\n\t"
  30772. #endif
  30773. #ifdef WOLFSSL_KEIL
  30774. "adcs r3, r3, r7\n\t"
  30775. #elif defined(__clang__)
  30776. "adcs r3, r7\n\t"
  30777. #else
  30778. "adc r3, r7\n\t"
  30779. #endif
  30780. #ifdef WOLFSSL_KEIL
  30781. "adcs r4, r4, %[r]\n\t"
  30782. #elif defined(__clang__)
  30783. "adcs r4, %[r]\n\t"
  30784. #else
  30785. "adc r4, %[r]\n\t"
  30786. #endif
  30787. "str r5, [sp, #8]\n\t"
  30788. "# A[0] * B[3]\n\t"
  30789. "movs r5, #0\n\t"
  30790. "mov %[a], r9\n\t"
  30791. "mov %[b], r10\n\t"
  30792. "ldr %[a], [%[a]]\n\t"
  30793. "ldr %[b], [%[b], #12]\n\t"
  30794. "uxth r6, %[a]\n\t"
  30795. "uxth r7, %[b]\n\t"
  30796. #ifdef WOLFSSL_KEIL
  30797. "muls r7, r6, r7\n\t"
  30798. #elif defined(__clang__)
  30799. "muls r7, r6\n\t"
  30800. #else
  30801. "mul r7, r6\n\t"
  30802. #endif
  30803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30804. "adds r3, r3, r7\n\t"
  30805. #else
  30806. "add r3, r3, r7\n\t"
  30807. #endif
  30808. #ifdef WOLFSSL_KEIL
  30809. "adcs r4, r4, %[r]\n\t"
  30810. #elif defined(__clang__)
  30811. "adcs r4, %[r]\n\t"
  30812. #else
  30813. "adc r4, %[r]\n\t"
  30814. #endif
  30815. #ifdef WOLFSSL_KEIL
  30816. "adcs r5, r5, %[r]\n\t"
  30817. #elif defined(__clang__)
  30818. "adcs r5, %[r]\n\t"
  30819. #else
  30820. "adc r5, %[r]\n\t"
  30821. #endif
  30822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30823. "lsrs r7, %[b], #16\n\t"
  30824. #else
  30825. "lsr r7, %[b], #16\n\t"
  30826. #endif
  30827. #ifdef WOLFSSL_KEIL
  30828. "muls r6, r7, r6\n\t"
  30829. #elif defined(__clang__)
  30830. "muls r6, r7\n\t"
  30831. #else
  30832. "mul r6, r7\n\t"
  30833. #endif
  30834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30835. "lsrs r7, r6, #16\n\t"
  30836. #else
  30837. "lsr r7, r6, #16\n\t"
  30838. #endif
  30839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30840. "lsls r6, r6, #16\n\t"
  30841. #else
  30842. "lsl r6, r6, #16\n\t"
  30843. #endif
  30844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30845. "adds r3, r3, r6\n\t"
  30846. #else
  30847. "add r3, r3, r6\n\t"
  30848. #endif
  30849. #ifdef WOLFSSL_KEIL
  30850. "adcs r4, r4, r7\n\t"
  30851. #elif defined(__clang__)
  30852. "adcs r4, r7\n\t"
  30853. #else
  30854. "adc r4, r7\n\t"
  30855. #endif
  30856. #ifdef WOLFSSL_KEIL
  30857. "adcs r5, r5, %[r]\n\t"
  30858. #elif defined(__clang__)
  30859. "adcs r5, %[r]\n\t"
  30860. #else
  30861. "adc r5, %[r]\n\t"
  30862. #endif
  30863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30864. "lsrs r6, %[a], #16\n\t"
  30865. #else
  30866. "lsr r6, %[a], #16\n\t"
  30867. #endif
  30868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30869. "lsrs r7, %[b], #16\n\t"
  30870. #else
  30871. "lsr r7, %[b], #16\n\t"
  30872. #endif
  30873. #ifdef WOLFSSL_KEIL
  30874. "muls r7, r6, r7\n\t"
  30875. #elif defined(__clang__)
  30876. "muls r7, r6\n\t"
  30877. #else
  30878. "mul r7, r6\n\t"
  30879. #endif
  30880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30881. "adds r4, r4, r7\n\t"
  30882. #else
  30883. "add r4, r4, r7\n\t"
  30884. #endif
  30885. #ifdef WOLFSSL_KEIL
  30886. "adcs r5, r5, %[r]\n\t"
  30887. #elif defined(__clang__)
  30888. "adcs r5, %[r]\n\t"
  30889. #else
  30890. "adc r5, %[r]\n\t"
  30891. #endif
  30892. "uxth r7, %[b]\n\t"
  30893. #ifdef WOLFSSL_KEIL
  30894. "muls r6, r7, r6\n\t"
  30895. #elif defined(__clang__)
  30896. "muls r6, r7\n\t"
  30897. #else
  30898. "mul r6, r7\n\t"
  30899. #endif
  30900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30901. "lsrs r7, r6, #16\n\t"
  30902. #else
  30903. "lsr r7, r6, #16\n\t"
  30904. #endif
  30905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30906. "lsls r6, r6, #16\n\t"
  30907. #else
  30908. "lsl r6, r6, #16\n\t"
  30909. #endif
  30910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30911. "adds r3, r3, r6\n\t"
  30912. #else
  30913. "add r3, r3, r6\n\t"
  30914. #endif
  30915. #ifdef WOLFSSL_KEIL
  30916. "adcs r4, r4, r7\n\t"
  30917. #elif defined(__clang__)
  30918. "adcs r4, r7\n\t"
  30919. #else
  30920. "adc r4, r7\n\t"
  30921. #endif
  30922. #ifdef WOLFSSL_KEIL
  30923. "adcs r5, r5, %[r]\n\t"
  30924. #elif defined(__clang__)
  30925. "adcs r5, %[r]\n\t"
  30926. #else
  30927. "adc r5, %[r]\n\t"
  30928. #endif
  30929. "# A[1] * B[2]\n\t"
  30930. "mov %[a], r9\n\t"
  30931. "mov %[b], r10\n\t"
  30932. "ldr %[a], [%[a], #4]\n\t"
  30933. "ldr %[b], [%[b], #8]\n\t"
  30934. "uxth r6, %[a]\n\t"
  30935. "uxth r7, %[b]\n\t"
  30936. #ifdef WOLFSSL_KEIL
  30937. "muls r7, r6, r7\n\t"
  30938. #elif defined(__clang__)
  30939. "muls r7, r6\n\t"
  30940. #else
  30941. "mul r7, r6\n\t"
  30942. #endif
  30943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30944. "adds r3, r3, r7\n\t"
  30945. #else
  30946. "add r3, r3, r7\n\t"
  30947. #endif
  30948. #ifdef WOLFSSL_KEIL
  30949. "adcs r4, r4, %[r]\n\t"
  30950. #elif defined(__clang__)
  30951. "adcs r4, %[r]\n\t"
  30952. #else
  30953. "adc r4, %[r]\n\t"
  30954. #endif
  30955. #ifdef WOLFSSL_KEIL
  30956. "adcs r5, r5, %[r]\n\t"
  30957. #elif defined(__clang__)
  30958. "adcs r5, %[r]\n\t"
  30959. #else
  30960. "adc r5, %[r]\n\t"
  30961. #endif
  30962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30963. "lsrs r7, %[b], #16\n\t"
  30964. #else
  30965. "lsr r7, %[b], #16\n\t"
  30966. #endif
  30967. #ifdef WOLFSSL_KEIL
  30968. "muls r6, r7, r6\n\t"
  30969. #elif defined(__clang__)
  30970. "muls r6, r7\n\t"
  30971. #else
  30972. "mul r6, r7\n\t"
  30973. #endif
  30974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30975. "lsrs r7, r6, #16\n\t"
  30976. #else
  30977. "lsr r7, r6, #16\n\t"
  30978. #endif
  30979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30980. "lsls r6, r6, #16\n\t"
  30981. #else
  30982. "lsl r6, r6, #16\n\t"
  30983. #endif
  30984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30985. "adds r3, r3, r6\n\t"
  30986. #else
  30987. "add r3, r3, r6\n\t"
  30988. #endif
  30989. #ifdef WOLFSSL_KEIL
  30990. "adcs r4, r4, r7\n\t"
  30991. #elif defined(__clang__)
  30992. "adcs r4, r7\n\t"
  30993. #else
  30994. "adc r4, r7\n\t"
  30995. #endif
  30996. #ifdef WOLFSSL_KEIL
  30997. "adcs r5, r5, %[r]\n\t"
  30998. #elif defined(__clang__)
  30999. "adcs r5, %[r]\n\t"
  31000. #else
  31001. "adc r5, %[r]\n\t"
  31002. #endif
  31003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31004. "lsrs r6, %[a], #16\n\t"
  31005. #else
  31006. "lsr r6, %[a], #16\n\t"
  31007. #endif
  31008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31009. "lsrs r7, %[b], #16\n\t"
  31010. #else
  31011. "lsr r7, %[b], #16\n\t"
  31012. #endif
  31013. #ifdef WOLFSSL_KEIL
  31014. "muls r7, r6, r7\n\t"
  31015. #elif defined(__clang__)
  31016. "muls r7, r6\n\t"
  31017. #else
  31018. "mul r7, r6\n\t"
  31019. #endif
  31020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31021. "adds r4, r4, r7\n\t"
  31022. #else
  31023. "add r4, r4, r7\n\t"
  31024. #endif
  31025. #ifdef WOLFSSL_KEIL
  31026. "adcs r5, r5, %[r]\n\t"
  31027. #elif defined(__clang__)
  31028. "adcs r5, %[r]\n\t"
  31029. #else
  31030. "adc r5, %[r]\n\t"
  31031. #endif
  31032. "uxth r7, %[b]\n\t"
  31033. #ifdef WOLFSSL_KEIL
  31034. "muls r6, r7, r6\n\t"
  31035. #elif defined(__clang__)
  31036. "muls r6, r7\n\t"
  31037. #else
  31038. "mul r6, r7\n\t"
  31039. #endif
  31040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31041. "lsrs r7, r6, #16\n\t"
  31042. #else
  31043. "lsr r7, r6, #16\n\t"
  31044. #endif
  31045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31046. "lsls r6, r6, #16\n\t"
  31047. #else
  31048. "lsl r6, r6, #16\n\t"
  31049. #endif
  31050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31051. "adds r3, r3, r6\n\t"
  31052. #else
  31053. "add r3, r3, r6\n\t"
  31054. #endif
  31055. #ifdef WOLFSSL_KEIL
  31056. "adcs r4, r4, r7\n\t"
  31057. #elif defined(__clang__)
  31058. "adcs r4, r7\n\t"
  31059. #else
  31060. "adc r4, r7\n\t"
  31061. #endif
  31062. #ifdef WOLFSSL_KEIL
  31063. "adcs r5, r5, %[r]\n\t"
  31064. #elif defined(__clang__)
  31065. "adcs r5, %[r]\n\t"
  31066. #else
  31067. "adc r5, %[r]\n\t"
  31068. #endif
  31069. "# A[2] * B[1]\n\t"
  31070. "mov %[a], r9\n\t"
  31071. "mov %[b], r10\n\t"
  31072. "ldr %[a], [%[a], #8]\n\t"
  31073. "ldr %[b], [%[b], #4]\n\t"
  31074. "uxth r6, %[a]\n\t"
  31075. "uxth r7, %[b]\n\t"
  31076. #ifdef WOLFSSL_KEIL
  31077. "muls r7, r6, r7\n\t"
  31078. #elif defined(__clang__)
  31079. "muls r7, r6\n\t"
  31080. #else
  31081. "mul r7, r6\n\t"
  31082. #endif
  31083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31084. "adds r3, r3, r7\n\t"
  31085. #else
  31086. "add r3, r3, r7\n\t"
  31087. #endif
  31088. #ifdef WOLFSSL_KEIL
  31089. "adcs r4, r4, %[r]\n\t"
  31090. #elif defined(__clang__)
  31091. "adcs r4, %[r]\n\t"
  31092. #else
  31093. "adc r4, %[r]\n\t"
  31094. #endif
  31095. #ifdef WOLFSSL_KEIL
  31096. "adcs r5, r5, %[r]\n\t"
  31097. #elif defined(__clang__)
  31098. "adcs r5, %[r]\n\t"
  31099. #else
  31100. "adc r5, %[r]\n\t"
  31101. #endif
  31102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31103. "lsrs r7, %[b], #16\n\t"
  31104. #else
  31105. "lsr r7, %[b], #16\n\t"
  31106. #endif
  31107. #ifdef WOLFSSL_KEIL
  31108. "muls r6, r7, r6\n\t"
  31109. #elif defined(__clang__)
  31110. "muls r6, r7\n\t"
  31111. #else
  31112. "mul r6, r7\n\t"
  31113. #endif
  31114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31115. "lsrs r7, r6, #16\n\t"
  31116. #else
  31117. "lsr r7, r6, #16\n\t"
  31118. #endif
  31119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31120. "lsls r6, r6, #16\n\t"
  31121. #else
  31122. "lsl r6, r6, #16\n\t"
  31123. #endif
  31124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31125. "adds r3, r3, r6\n\t"
  31126. #else
  31127. "add r3, r3, r6\n\t"
  31128. #endif
  31129. #ifdef WOLFSSL_KEIL
  31130. "adcs r4, r4, r7\n\t"
  31131. #elif defined(__clang__)
  31132. "adcs r4, r7\n\t"
  31133. #else
  31134. "adc r4, r7\n\t"
  31135. #endif
  31136. #ifdef WOLFSSL_KEIL
  31137. "adcs r5, r5, %[r]\n\t"
  31138. #elif defined(__clang__)
  31139. "adcs r5, %[r]\n\t"
  31140. #else
  31141. "adc r5, %[r]\n\t"
  31142. #endif
  31143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31144. "lsrs r6, %[a], #16\n\t"
  31145. #else
  31146. "lsr r6, %[a], #16\n\t"
  31147. #endif
  31148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31149. "lsrs r7, %[b], #16\n\t"
  31150. #else
  31151. "lsr r7, %[b], #16\n\t"
  31152. #endif
  31153. #ifdef WOLFSSL_KEIL
  31154. "muls r7, r6, r7\n\t"
  31155. #elif defined(__clang__)
  31156. "muls r7, r6\n\t"
  31157. #else
  31158. "mul r7, r6\n\t"
  31159. #endif
  31160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31161. "adds r4, r4, r7\n\t"
  31162. #else
  31163. "add r4, r4, r7\n\t"
  31164. #endif
  31165. #ifdef WOLFSSL_KEIL
  31166. "adcs r5, r5, %[r]\n\t"
  31167. #elif defined(__clang__)
  31168. "adcs r5, %[r]\n\t"
  31169. #else
  31170. "adc r5, %[r]\n\t"
  31171. #endif
  31172. "uxth r7, %[b]\n\t"
  31173. #ifdef WOLFSSL_KEIL
  31174. "muls r6, r7, r6\n\t"
  31175. #elif defined(__clang__)
  31176. "muls r6, r7\n\t"
  31177. #else
  31178. "mul r6, r7\n\t"
  31179. #endif
  31180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31181. "lsrs r7, r6, #16\n\t"
  31182. #else
  31183. "lsr r7, r6, #16\n\t"
  31184. #endif
  31185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31186. "lsls r6, r6, #16\n\t"
  31187. #else
  31188. "lsl r6, r6, #16\n\t"
  31189. #endif
  31190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31191. "adds r3, r3, r6\n\t"
  31192. #else
  31193. "add r3, r3, r6\n\t"
  31194. #endif
  31195. #ifdef WOLFSSL_KEIL
  31196. "adcs r4, r4, r7\n\t"
  31197. #elif defined(__clang__)
  31198. "adcs r4, r7\n\t"
  31199. #else
  31200. "adc r4, r7\n\t"
  31201. #endif
  31202. #ifdef WOLFSSL_KEIL
  31203. "adcs r5, r5, %[r]\n\t"
  31204. #elif defined(__clang__)
  31205. "adcs r5, %[r]\n\t"
  31206. #else
  31207. "adc r5, %[r]\n\t"
  31208. #endif
  31209. "# A[3] * B[0]\n\t"
  31210. "mov %[a], r9\n\t"
  31211. "mov %[b], r10\n\t"
  31212. "ldr %[a], [%[a], #12]\n\t"
  31213. "ldr %[b], [%[b]]\n\t"
  31214. "uxth r6, %[a]\n\t"
  31215. "uxth r7, %[b]\n\t"
  31216. #ifdef WOLFSSL_KEIL
  31217. "muls r7, r6, r7\n\t"
  31218. #elif defined(__clang__)
  31219. "muls r7, r6\n\t"
  31220. #else
  31221. "mul r7, r6\n\t"
  31222. #endif
  31223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31224. "adds r3, r3, r7\n\t"
  31225. #else
  31226. "add r3, r3, r7\n\t"
  31227. #endif
  31228. #ifdef WOLFSSL_KEIL
  31229. "adcs r4, r4, %[r]\n\t"
  31230. #elif defined(__clang__)
  31231. "adcs r4, %[r]\n\t"
  31232. #else
  31233. "adc r4, %[r]\n\t"
  31234. #endif
  31235. #ifdef WOLFSSL_KEIL
  31236. "adcs r5, r5, %[r]\n\t"
  31237. #elif defined(__clang__)
  31238. "adcs r5, %[r]\n\t"
  31239. #else
  31240. "adc r5, %[r]\n\t"
  31241. #endif
  31242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31243. "lsrs r7, %[b], #16\n\t"
  31244. #else
  31245. "lsr r7, %[b], #16\n\t"
  31246. #endif
  31247. #ifdef WOLFSSL_KEIL
  31248. "muls r6, r7, r6\n\t"
  31249. #elif defined(__clang__)
  31250. "muls r6, r7\n\t"
  31251. #else
  31252. "mul r6, r7\n\t"
  31253. #endif
  31254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31255. "lsrs r7, r6, #16\n\t"
  31256. #else
  31257. "lsr r7, r6, #16\n\t"
  31258. #endif
  31259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31260. "lsls r6, r6, #16\n\t"
  31261. #else
  31262. "lsl r6, r6, #16\n\t"
  31263. #endif
  31264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31265. "adds r3, r3, r6\n\t"
  31266. #else
  31267. "add r3, r3, r6\n\t"
  31268. #endif
  31269. #ifdef WOLFSSL_KEIL
  31270. "adcs r4, r4, r7\n\t"
  31271. #elif defined(__clang__)
  31272. "adcs r4, r7\n\t"
  31273. #else
  31274. "adc r4, r7\n\t"
  31275. #endif
  31276. #ifdef WOLFSSL_KEIL
  31277. "adcs r5, r5, %[r]\n\t"
  31278. #elif defined(__clang__)
  31279. "adcs r5, %[r]\n\t"
  31280. #else
  31281. "adc r5, %[r]\n\t"
  31282. #endif
  31283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31284. "lsrs r6, %[a], #16\n\t"
  31285. #else
  31286. "lsr r6, %[a], #16\n\t"
  31287. #endif
  31288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31289. "lsrs r7, %[b], #16\n\t"
  31290. #else
  31291. "lsr r7, %[b], #16\n\t"
  31292. #endif
  31293. #ifdef WOLFSSL_KEIL
  31294. "muls r7, r6, r7\n\t"
  31295. #elif defined(__clang__)
  31296. "muls r7, r6\n\t"
  31297. #else
  31298. "mul r7, r6\n\t"
  31299. #endif
  31300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31301. "adds r4, r4, r7\n\t"
  31302. #else
  31303. "add r4, r4, r7\n\t"
  31304. #endif
  31305. #ifdef WOLFSSL_KEIL
  31306. "adcs r5, r5, %[r]\n\t"
  31307. #elif defined(__clang__)
  31308. "adcs r5, %[r]\n\t"
  31309. #else
  31310. "adc r5, %[r]\n\t"
  31311. #endif
  31312. "uxth r7, %[b]\n\t"
  31313. #ifdef WOLFSSL_KEIL
  31314. "muls r6, r7, r6\n\t"
  31315. #elif defined(__clang__)
  31316. "muls r6, r7\n\t"
  31317. #else
  31318. "mul r6, r7\n\t"
  31319. #endif
  31320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31321. "lsrs r7, r6, #16\n\t"
  31322. #else
  31323. "lsr r7, r6, #16\n\t"
  31324. #endif
  31325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31326. "lsls r6, r6, #16\n\t"
  31327. #else
  31328. "lsl r6, r6, #16\n\t"
  31329. #endif
  31330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31331. "adds r3, r3, r6\n\t"
  31332. #else
  31333. "add r3, r3, r6\n\t"
  31334. #endif
  31335. #ifdef WOLFSSL_KEIL
  31336. "adcs r4, r4, r7\n\t"
  31337. #elif defined(__clang__)
  31338. "adcs r4, r7\n\t"
  31339. #else
  31340. "adc r4, r7\n\t"
  31341. #endif
  31342. #ifdef WOLFSSL_KEIL
  31343. "adcs r5, r5, %[r]\n\t"
  31344. #elif defined(__clang__)
  31345. "adcs r5, %[r]\n\t"
  31346. #else
  31347. "adc r5, %[r]\n\t"
  31348. #endif
  31349. "str r3, [sp, #12]\n\t"
  31350. "# A[4] * B[0]\n\t"
  31351. "movs r3, #0\n\t"
  31352. "mov %[a], r9\n\t"
  31353. "mov %[b], r10\n\t"
  31354. "ldr %[a], [%[a], #16]\n\t"
  31355. "ldr %[b], [%[b]]\n\t"
  31356. "uxth r6, %[a]\n\t"
  31357. "uxth r7, %[b]\n\t"
  31358. #ifdef WOLFSSL_KEIL
  31359. "muls r7, r6, r7\n\t"
  31360. #elif defined(__clang__)
  31361. "muls r7, r6\n\t"
  31362. #else
  31363. "mul r7, r6\n\t"
  31364. #endif
  31365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31366. "adds r4, r4, r7\n\t"
  31367. #else
  31368. "add r4, r4, r7\n\t"
  31369. #endif
  31370. #ifdef WOLFSSL_KEIL
  31371. "adcs r5, r5, %[r]\n\t"
  31372. #elif defined(__clang__)
  31373. "adcs r5, %[r]\n\t"
  31374. #else
  31375. "adc r5, %[r]\n\t"
  31376. #endif
  31377. #ifdef WOLFSSL_KEIL
  31378. "adcs r3, r3, %[r]\n\t"
  31379. #elif defined(__clang__)
  31380. "adcs r3, %[r]\n\t"
  31381. #else
  31382. "adc r3, %[r]\n\t"
  31383. #endif
  31384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31385. "lsrs r7, %[b], #16\n\t"
  31386. #else
  31387. "lsr r7, %[b], #16\n\t"
  31388. #endif
  31389. #ifdef WOLFSSL_KEIL
  31390. "muls r6, r7, r6\n\t"
  31391. #elif defined(__clang__)
  31392. "muls r6, r7\n\t"
  31393. #else
  31394. "mul r6, r7\n\t"
  31395. #endif
  31396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31397. "lsrs r7, r6, #16\n\t"
  31398. #else
  31399. "lsr r7, r6, #16\n\t"
  31400. #endif
  31401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31402. "lsls r6, r6, #16\n\t"
  31403. #else
  31404. "lsl r6, r6, #16\n\t"
  31405. #endif
  31406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31407. "adds r4, r4, r6\n\t"
  31408. #else
  31409. "add r4, r4, r6\n\t"
  31410. #endif
  31411. #ifdef WOLFSSL_KEIL
  31412. "adcs r5, r5, r7\n\t"
  31413. #elif defined(__clang__)
  31414. "adcs r5, r7\n\t"
  31415. #else
  31416. "adc r5, r7\n\t"
  31417. #endif
  31418. #ifdef WOLFSSL_KEIL
  31419. "adcs r3, r3, %[r]\n\t"
  31420. #elif defined(__clang__)
  31421. "adcs r3, %[r]\n\t"
  31422. #else
  31423. "adc r3, %[r]\n\t"
  31424. #endif
  31425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31426. "lsrs r6, %[a], #16\n\t"
  31427. #else
  31428. "lsr r6, %[a], #16\n\t"
  31429. #endif
  31430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31431. "lsrs r7, %[b], #16\n\t"
  31432. #else
  31433. "lsr r7, %[b], #16\n\t"
  31434. #endif
  31435. #ifdef WOLFSSL_KEIL
  31436. "muls r7, r6, r7\n\t"
  31437. #elif defined(__clang__)
  31438. "muls r7, r6\n\t"
  31439. #else
  31440. "mul r7, r6\n\t"
  31441. #endif
  31442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31443. "adds r5, r5, r7\n\t"
  31444. #else
  31445. "add r5, r5, r7\n\t"
  31446. #endif
  31447. #ifdef WOLFSSL_KEIL
  31448. "adcs r3, r3, %[r]\n\t"
  31449. #elif defined(__clang__)
  31450. "adcs r3, %[r]\n\t"
  31451. #else
  31452. "adc r3, %[r]\n\t"
  31453. #endif
  31454. "uxth r7, %[b]\n\t"
  31455. #ifdef WOLFSSL_KEIL
  31456. "muls r6, r7, r6\n\t"
  31457. #elif defined(__clang__)
  31458. "muls r6, r7\n\t"
  31459. #else
  31460. "mul r6, r7\n\t"
  31461. #endif
  31462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31463. "lsrs r7, r6, #16\n\t"
  31464. #else
  31465. "lsr r7, r6, #16\n\t"
  31466. #endif
  31467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31468. "lsls r6, r6, #16\n\t"
  31469. #else
  31470. "lsl r6, r6, #16\n\t"
  31471. #endif
  31472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31473. "adds r4, r4, r6\n\t"
  31474. #else
  31475. "add r4, r4, r6\n\t"
  31476. #endif
  31477. #ifdef WOLFSSL_KEIL
  31478. "adcs r5, r5, r7\n\t"
  31479. #elif defined(__clang__)
  31480. "adcs r5, r7\n\t"
  31481. #else
  31482. "adc r5, r7\n\t"
  31483. #endif
  31484. #ifdef WOLFSSL_KEIL
  31485. "adcs r3, r3, %[r]\n\t"
  31486. #elif defined(__clang__)
  31487. "adcs r3, %[r]\n\t"
  31488. #else
  31489. "adc r3, %[r]\n\t"
  31490. #endif
  31491. "# A[3] * B[1]\n\t"
  31492. "mov %[a], r9\n\t"
  31493. "mov %[b], r10\n\t"
  31494. "ldr %[a], [%[a], #12]\n\t"
  31495. "ldr %[b], [%[b], #4]\n\t"
  31496. "uxth r6, %[a]\n\t"
  31497. "uxth r7, %[b]\n\t"
  31498. #ifdef WOLFSSL_KEIL
  31499. "muls r7, r6, r7\n\t"
  31500. #elif defined(__clang__)
  31501. "muls r7, r6\n\t"
  31502. #else
  31503. "mul r7, r6\n\t"
  31504. #endif
  31505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31506. "adds r4, r4, r7\n\t"
  31507. #else
  31508. "add r4, r4, r7\n\t"
  31509. #endif
  31510. #ifdef WOLFSSL_KEIL
  31511. "adcs r5, r5, %[r]\n\t"
  31512. #elif defined(__clang__)
  31513. "adcs r5, %[r]\n\t"
  31514. #else
  31515. "adc r5, %[r]\n\t"
  31516. #endif
  31517. #ifdef WOLFSSL_KEIL
  31518. "adcs r3, r3, %[r]\n\t"
  31519. #elif defined(__clang__)
  31520. "adcs r3, %[r]\n\t"
  31521. #else
  31522. "adc r3, %[r]\n\t"
  31523. #endif
  31524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31525. "lsrs r7, %[b], #16\n\t"
  31526. #else
  31527. "lsr r7, %[b], #16\n\t"
  31528. #endif
  31529. #ifdef WOLFSSL_KEIL
  31530. "muls r6, r7, r6\n\t"
  31531. #elif defined(__clang__)
  31532. "muls r6, r7\n\t"
  31533. #else
  31534. "mul r6, r7\n\t"
  31535. #endif
  31536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31537. "lsrs r7, r6, #16\n\t"
  31538. #else
  31539. "lsr r7, r6, #16\n\t"
  31540. #endif
  31541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31542. "lsls r6, r6, #16\n\t"
  31543. #else
  31544. "lsl r6, r6, #16\n\t"
  31545. #endif
  31546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31547. "adds r4, r4, r6\n\t"
  31548. #else
  31549. "add r4, r4, r6\n\t"
  31550. #endif
  31551. #ifdef WOLFSSL_KEIL
  31552. "adcs r5, r5, r7\n\t"
  31553. #elif defined(__clang__)
  31554. "adcs r5, r7\n\t"
  31555. #else
  31556. "adc r5, r7\n\t"
  31557. #endif
  31558. #ifdef WOLFSSL_KEIL
  31559. "adcs r3, r3, %[r]\n\t"
  31560. #elif defined(__clang__)
  31561. "adcs r3, %[r]\n\t"
  31562. #else
  31563. "adc r3, %[r]\n\t"
  31564. #endif
  31565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31566. "lsrs r6, %[a], #16\n\t"
  31567. #else
  31568. "lsr r6, %[a], #16\n\t"
  31569. #endif
  31570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31571. "lsrs r7, %[b], #16\n\t"
  31572. #else
  31573. "lsr r7, %[b], #16\n\t"
  31574. #endif
  31575. #ifdef WOLFSSL_KEIL
  31576. "muls r7, r6, r7\n\t"
  31577. #elif defined(__clang__)
  31578. "muls r7, r6\n\t"
  31579. #else
  31580. "mul r7, r6\n\t"
  31581. #endif
  31582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31583. "adds r5, r5, r7\n\t"
  31584. #else
  31585. "add r5, r5, r7\n\t"
  31586. #endif
  31587. #ifdef WOLFSSL_KEIL
  31588. "adcs r3, r3, %[r]\n\t"
  31589. #elif defined(__clang__)
  31590. "adcs r3, %[r]\n\t"
  31591. #else
  31592. "adc r3, %[r]\n\t"
  31593. #endif
  31594. "uxth r7, %[b]\n\t"
  31595. #ifdef WOLFSSL_KEIL
  31596. "muls r6, r7, r6\n\t"
  31597. #elif defined(__clang__)
  31598. "muls r6, r7\n\t"
  31599. #else
  31600. "mul r6, r7\n\t"
  31601. #endif
  31602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31603. "lsrs r7, r6, #16\n\t"
  31604. #else
  31605. "lsr r7, r6, #16\n\t"
  31606. #endif
  31607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31608. "lsls r6, r6, #16\n\t"
  31609. #else
  31610. "lsl r6, r6, #16\n\t"
  31611. #endif
  31612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31613. "adds r4, r4, r6\n\t"
  31614. #else
  31615. "add r4, r4, r6\n\t"
  31616. #endif
  31617. #ifdef WOLFSSL_KEIL
  31618. "adcs r5, r5, r7\n\t"
  31619. #elif defined(__clang__)
  31620. "adcs r5, r7\n\t"
  31621. #else
  31622. "adc r5, r7\n\t"
  31623. #endif
  31624. #ifdef WOLFSSL_KEIL
  31625. "adcs r3, r3, %[r]\n\t"
  31626. #elif defined(__clang__)
  31627. "adcs r3, %[r]\n\t"
  31628. #else
  31629. "adc r3, %[r]\n\t"
  31630. #endif
  31631. "# A[2] * B[2]\n\t"
  31632. "mov %[a], r9\n\t"
  31633. "mov %[b], r10\n\t"
  31634. "ldr %[a], [%[a], #8]\n\t"
  31635. "ldr %[b], [%[b], #8]\n\t"
  31636. "uxth r6, %[a]\n\t"
  31637. "uxth r7, %[b]\n\t"
  31638. #ifdef WOLFSSL_KEIL
  31639. "muls r7, r6, r7\n\t"
  31640. #elif defined(__clang__)
  31641. "muls r7, r6\n\t"
  31642. #else
  31643. "mul r7, r6\n\t"
  31644. #endif
  31645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31646. "adds r4, r4, r7\n\t"
  31647. #else
  31648. "add r4, r4, r7\n\t"
  31649. #endif
  31650. #ifdef WOLFSSL_KEIL
  31651. "adcs r5, r5, %[r]\n\t"
  31652. #elif defined(__clang__)
  31653. "adcs r5, %[r]\n\t"
  31654. #else
  31655. "adc r5, %[r]\n\t"
  31656. #endif
  31657. #ifdef WOLFSSL_KEIL
  31658. "adcs r3, r3, %[r]\n\t"
  31659. #elif defined(__clang__)
  31660. "adcs r3, %[r]\n\t"
  31661. #else
  31662. "adc r3, %[r]\n\t"
  31663. #endif
  31664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31665. "lsrs r7, %[b], #16\n\t"
  31666. #else
  31667. "lsr r7, %[b], #16\n\t"
  31668. #endif
  31669. #ifdef WOLFSSL_KEIL
  31670. "muls r6, r7, r6\n\t"
  31671. #elif defined(__clang__)
  31672. "muls r6, r7\n\t"
  31673. #else
  31674. "mul r6, r7\n\t"
  31675. #endif
  31676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31677. "lsrs r7, r6, #16\n\t"
  31678. #else
  31679. "lsr r7, r6, #16\n\t"
  31680. #endif
  31681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31682. "lsls r6, r6, #16\n\t"
  31683. #else
  31684. "lsl r6, r6, #16\n\t"
  31685. #endif
  31686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31687. "adds r4, r4, r6\n\t"
  31688. #else
  31689. "add r4, r4, r6\n\t"
  31690. #endif
  31691. #ifdef WOLFSSL_KEIL
  31692. "adcs r5, r5, r7\n\t"
  31693. #elif defined(__clang__)
  31694. "adcs r5, r7\n\t"
  31695. #else
  31696. "adc r5, r7\n\t"
  31697. #endif
  31698. #ifdef WOLFSSL_KEIL
  31699. "adcs r3, r3, %[r]\n\t"
  31700. #elif defined(__clang__)
  31701. "adcs r3, %[r]\n\t"
  31702. #else
  31703. "adc r3, %[r]\n\t"
  31704. #endif
  31705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31706. "lsrs r6, %[a], #16\n\t"
  31707. #else
  31708. "lsr r6, %[a], #16\n\t"
  31709. #endif
  31710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31711. "lsrs r7, %[b], #16\n\t"
  31712. #else
  31713. "lsr r7, %[b], #16\n\t"
  31714. #endif
  31715. #ifdef WOLFSSL_KEIL
  31716. "muls r7, r6, r7\n\t"
  31717. #elif defined(__clang__)
  31718. "muls r7, r6\n\t"
  31719. #else
  31720. "mul r7, r6\n\t"
  31721. #endif
  31722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31723. "adds r5, r5, r7\n\t"
  31724. #else
  31725. "add r5, r5, r7\n\t"
  31726. #endif
  31727. #ifdef WOLFSSL_KEIL
  31728. "adcs r3, r3, %[r]\n\t"
  31729. #elif defined(__clang__)
  31730. "adcs r3, %[r]\n\t"
  31731. #else
  31732. "adc r3, %[r]\n\t"
  31733. #endif
  31734. "uxth r7, %[b]\n\t"
  31735. #ifdef WOLFSSL_KEIL
  31736. "muls r6, r7, r6\n\t"
  31737. #elif defined(__clang__)
  31738. "muls r6, r7\n\t"
  31739. #else
  31740. "mul r6, r7\n\t"
  31741. #endif
  31742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31743. "lsrs r7, r6, #16\n\t"
  31744. #else
  31745. "lsr r7, r6, #16\n\t"
  31746. #endif
  31747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31748. "lsls r6, r6, #16\n\t"
  31749. #else
  31750. "lsl r6, r6, #16\n\t"
  31751. #endif
  31752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31753. "adds r4, r4, r6\n\t"
  31754. #else
  31755. "add r4, r4, r6\n\t"
  31756. #endif
  31757. #ifdef WOLFSSL_KEIL
  31758. "adcs r5, r5, r7\n\t"
  31759. #elif defined(__clang__)
  31760. "adcs r5, r7\n\t"
  31761. #else
  31762. "adc r5, r7\n\t"
  31763. #endif
  31764. #ifdef WOLFSSL_KEIL
  31765. "adcs r3, r3, %[r]\n\t"
  31766. #elif defined(__clang__)
  31767. "adcs r3, %[r]\n\t"
  31768. #else
  31769. "adc r3, %[r]\n\t"
  31770. #endif
  31771. "# A[1] * B[3]\n\t"
  31772. "mov %[a], r9\n\t"
  31773. "mov %[b], r10\n\t"
  31774. "ldr %[a], [%[a], #4]\n\t"
  31775. "ldr %[b], [%[b], #12]\n\t"
  31776. "uxth r6, %[a]\n\t"
  31777. "uxth r7, %[b]\n\t"
  31778. #ifdef WOLFSSL_KEIL
  31779. "muls r7, r6, r7\n\t"
  31780. #elif defined(__clang__)
  31781. "muls r7, r6\n\t"
  31782. #else
  31783. "mul r7, r6\n\t"
  31784. #endif
  31785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31786. "adds r4, r4, r7\n\t"
  31787. #else
  31788. "add r4, r4, r7\n\t"
  31789. #endif
  31790. #ifdef WOLFSSL_KEIL
  31791. "adcs r5, r5, %[r]\n\t"
  31792. #elif defined(__clang__)
  31793. "adcs r5, %[r]\n\t"
  31794. #else
  31795. "adc r5, %[r]\n\t"
  31796. #endif
  31797. #ifdef WOLFSSL_KEIL
  31798. "adcs r3, r3, %[r]\n\t"
  31799. #elif defined(__clang__)
  31800. "adcs r3, %[r]\n\t"
  31801. #else
  31802. "adc r3, %[r]\n\t"
  31803. #endif
  31804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31805. "lsrs r7, %[b], #16\n\t"
  31806. #else
  31807. "lsr r7, %[b], #16\n\t"
  31808. #endif
  31809. #ifdef WOLFSSL_KEIL
  31810. "muls r6, r7, r6\n\t"
  31811. #elif defined(__clang__)
  31812. "muls r6, r7\n\t"
  31813. #else
  31814. "mul r6, r7\n\t"
  31815. #endif
  31816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31817. "lsrs r7, r6, #16\n\t"
  31818. #else
  31819. "lsr r7, r6, #16\n\t"
  31820. #endif
  31821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31822. "lsls r6, r6, #16\n\t"
  31823. #else
  31824. "lsl r6, r6, #16\n\t"
  31825. #endif
  31826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31827. "adds r4, r4, r6\n\t"
  31828. #else
  31829. "add r4, r4, r6\n\t"
  31830. #endif
  31831. #ifdef WOLFSSL_KEIL
  31832. "adcs r5, r5, r7\n\t"
  31833. #elif defined(__clang__)
  31834. "adcs r5, r7\n\t"
  31835. #else
  31836. "adc r5, r7\n\t"
  31837. #endif
  31838. #ifdef WOLFSSL_KEIL
  31839. "adcs r3, r3, %[r]\n\t"
  31840. #elif defined(__clang__)
  31841. "adcs r3, %[r]\n\t"
  31842. #else
  31843. "adc r3, %[r]\n\t"
  31844. #endif
  31845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31846. "lsrs r6, %[a], #16\n\t"
  31847. #else
  31848. "lsr r6, %[a], #16\n\t"
  31849. #endif
  31850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31851. "lsrs r7, %[b], #16\n\t"
  31852. #else
  31853. "lsr r7, %[b], #16\n\t"
  31854. #endif
  31855. #ifdef WOLFSSL_KEIL
  31856. "muls r7, r6, r7\n\t"
  31857. #elif defined(__clang__)
  31858. "muls r7, r6\n\t"
  31859. #else
  31860. "mul r7, r6\n\t"
  31861. #endif
  31862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31863. "adds r5, r5, r7\n\t"
  31864. #else
  31865. "add r5, r5, r7\n\t"
  31866. #endif
  31867. #ifdef WOLFSSL_KEIL
  31868. "adcs r3, r3, %[r]\n\t"
  31869. #elif defined(__clang__)
  31870. "adcs r3, %[r]\n\t"
  31871. #else
  31872. "adc r3, %[r]\n\t"
  31873. #endif
  31874. "uxth r7, %[b]\n\t"
  31875. #ifdef WOLFSSL_KEIL
  31876. "muls r6, r7, r6\n\t"
  31877. #elif defined(__clang__)
  31878. "muls r6, r7\n\t"
  31879. #else
  31880. "mul r6, r7\n\t"
  31881. #endif
  31882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31883. "lsrs r7, r6, #16\n\t"
  31884. #else
  31885. "lsr r7, r6, #16\n\t"
  31886. #endif
  31887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31888. "lsls r6, r6, #16\n\t"
  31889. #else
  31890. "lsl r6, r6, #16\n\t"
  31891. #endif
  31892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31893. "adds r4, r4, r6\n\t"
  31894. #else
  31895. "add r4, r4, r6\n\t"
  31896. #endif
  31897. #ifdef WOLFSSL_KEIL
  31898. "adcs r5, r5, r7\n\t"
  31899. #elif defined(__clang__)
  31900. "adcs r5, r7\n\t"
  31901. #else
  31902. "adc r5, r7\n\t"
  31903. #endif
  31904. #ifdef WOLFSSL_KEIL
  31905. "adcs r3, r3, %[r]\n\t"
  31906. #elif defined(__clang__)
  31907. "adcs r3, %[r]\n\t"
  31908. #else
  31909. "adc r3, %[r]\n\t"
  31910. #endif
  31911. "# A[0] * B[4]\n\t"
  31912. "mov %[a], r9\n\t"
  31913. "mov %[b], r10\n\t"
  31914. "ldr %[a], [%[a]]\n\t"
  31915. "ldr %[b], [%[b], #16]\n\t"
  31916. "uxth r6, %[a]\n\t"
  31917. "uxth r7, %[b]\n\t"
  31918. #ifdef WOLFSSL_KEIL
  31919. "muls r7, r6, r7\n\t"
  31920. #elif defined(__clang__)
  31921. "muls r7, r6\n\t"
  31922. #else
  31923. "mul r7, r6\n\t"
  31924. #endif
  31925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31926. "adds r4, r4, r7\n\t"
  31927. #else
  31928. "add r4, r4, r7\n\t"
  31929. #endif
  31930. #ifdef WOLFSSL_KEIL
  31931. "adcs r5, r5, %[r]\n\t"
  31932. #elif defined(__clang__)
  31933. "adcs r5, %[r]\n\t"
  31934. #else
  31935. "adc r5, %[r]\n\t"
  31936. #endif
  31937. #ifdef WOLFSSL_KEIL
  31938. "adcs r3, r3, %[r]\n\t"
  31939. #elif defined(__clang__)
  31940. "adcs r3, %[r]\n\t"
  31941. #else
  31942. "adc r3, %[r]\n\t"
  31943. #endif
  31944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31945. "lsrs r7, %[b], #16\n\t"
  31946. #else
  31947. "lsr r7, %[b], #16\n\t"
  31948. #endif
  31949. #ifdef WOLFSSL_KEIL
  31950. "muls r6, r7, r6\n\t"
  31951. #elif defined(__clang__)
  31952. "muls r6, r7\n\t"
  31953. #else
  31954. "mul r6, r7\n\t"
  31955. #endif
  31956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31957. "lsrs r7, r6, #16\n\t"
  31958. #else
  31959. "lsr r7, r6, #16\n\t"
  31960. #endif
  31961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31962. "lsls r6, r6, #16\n\t"
  31963. #else
  31964. "lsl r6, r6, #16\n\t"
  31965. #endif
  31966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31967. "adds r4, r4, r6\n\t"
  31968. #else
  31969. "add r4, r4, r6\n\t"
  31970. #endif
  31971. #ifdef WOLFSSL_KEIL
  31972. "adcs r5, r5, r7\n\t"
  31973. #elif defined(__clang__)
  31974. "adcs r5, r7\n\t"
  31975. #else
  31976. "adc r5, r7\n\t"
  31977. #endif
  31978. #ifdef WOLFSSL_KEIL
  31979. "adcs r3, r3, %[r]\n\t"
  31980. #elif defined(__clang__)
  31981. "adcs r3, %[r]\n\t"
  31982. #else
  31983. "adc r3, %[r]\n\t"
  31984. #endif
  31985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31986. "lsrs r6, %[a], #16\n\t"
  31987. #else
  31988. "lsr r6, %[a], #16\n\t"
  31989. #endif
  31990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31991. "lsrs r7, %[b], #16\n\t"
  31992. #else
  31993. "lsr r7, %[b], #16\n\t"
  31994. #endif
  31995. #ifdef WOLFSSL_KEIL
  31996. "muls r7, r6, r7\n\t"
  31997. #elif defined(__clang__)
  31998. "muls r7, r6\n\t"
  31999. #else
  32000. "mul r7, r6\n\t"
  32001. #endif
  32002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32003. "adds r5, r5, r7\n\t"
  32004. #else
  32005. "add r5, r5, r7\n\t"
  32006. #endif
  32007. #ifdef WOLFSSL_KEIL
  32008. "adcs r3, r3, %[r]\n\t"
  32009. #elif defined(__clang__)
  32010. "adcs r3, %[r]\n\t"
  32011. #else
  32012. "adc r3, %[r]\n\t"
  32013. #endif
  32014. "uxth r7, %[b]\n\t"
  32015. #ifdef WOLFSSL_KEIL
  32016. "muls r6, r7, r6\n\t"
  32017. #elif defined(__clang__)
  32018. "muls r6, r7\n\t"
  32019. #else
  32020. "mul r6, r7\n\t"
  32021. #endif
  32022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32023. "lsrs r7, r6, #16\n\t"
  32024. #else
  32025. "lsr r7, r6, #16\n\t"
  32026. #endif
  32027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32028. "lsls r6, r6, #16\n\t"
  32029. #else
  32030. "lsl r6, r6, #16\n\t"
  32031. #endif
  32032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32033. "adds r4, r4, r6\n\t"
  32034. #else
  32035. "add r4, r4, r6\n\t"
  32036. #endif
  32037. #ifdef WOLFSSL_KEIL
  32038. "adcs r5, r5, r7\n\t"
  32039. #elif defined(__clang__)
  32040. "adcs r5, r7\n\t"
  32041. #else
  32042. "adc r5, r7\n\t"
  32043. #endif
  32044. #ifdef WOLFSSL_KEIL
  32045. "adcs r3, r3, %[r]\n\t"
  32046. #elif defined(__clang__)
  32047. "adcs r3, %[r]\n\t"
  32048. #else
  32049. "adc r3, %[r]\n\t"
  32050. #endif
  32051. "str r4, [sp, #16]\n\t"
  32052. "# A[0] * B[5]\n\t"
  32053. "movs r4, #0\n\t"
  32054. "mov %[a], r9\n\t"
  32055. "mov %[b], r10\n\t"
  32056. "ldr %[a], [%[a]]\n\t"
  32057. "ldr %[b], [%[b], #20]\n\t"
  32058. "uxth r6, %[a]\n\t"
  32059. "uxth r7, %[b]\n\t"
  32060. #ifdef WOLFSSL_KEIL
  32061. "muls r7, r6, r7\n\t"
  32062. #elif defined(__clang__)
  32063. "muls r7, r6\n\t"
  32064. #else
  32065. "mul r7, r6\n\t"
  32066. #endif
  32067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32068. "adds r5, r5, r7\n\t"
  32069. #else
  32070. "add r5, r5, r7\n\t"
  32071. #endif
  32072. #ifdef WOLFSSL_KEIL
  32073. "adcs r3, r3, %[r]\n\t"
  32074. #elif defined(__clang__)
  32075. "adcs r3, %[r]\n\t"
  32076. #else
  32077. "adc r3, %[r]\n\t"
  32078. #endif
  32079. #ifdef WOLFSSL_KEIL
  32080. "adcs r4, r4, %[r]\n\t"
  32081. #elif defined(__clang__)
  32082. "adcs r4, %[r]\n\t"
  32083. #else
  32084. "adc r4, %[r]\n\t"
  32085. #endif
  32086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32087. "lsrs r7, %[b], #16\n\t"
  32088. #else
  32089. "lsr r7, %[b], #16\n\t"
  32090. #endif
  32091. #ifdef WOLFSSL_KEIL
  32092. "muls r6, r7, r6\n\t"
  32093. #elif defined(__clang__)
  32094. "muls r6, r7\n\t"
  32095. #else
  32096. "mul r6, r7\n\t"
  32097. #endif
  32098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32099. "lsrs r7, r6, #16\n\t"
  32100. #else
  32101. "lsr r7, r6, #16\n\t"
  32102. #endif
  32103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32104. "lsls r6, r6, #16\n\t"
  32105. #else
  32106. "lsl r6, r6, #16\n\t"
  32107. #endif
  32108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32109. "adds r5, r5, r6\n\t"
  32110. #else
  32111. "add r5, r5, r6\n\t"
  32112. #endif
  32113. #ifdef WOLFSSL_KEIL
  32114. "adcs r3, r3, r7\n\t"
  32115. #elif defined(__clang__)
  32116. "adcs r3, r7\n\t"
  32117. #else
  32118. "adc r3, r7\n\t"
  32119. #endif
  32120. #ifdef WOLFSSL_KEIL
  32121. "adcs r4, r4, %[r]\n\t"
  32122. #elif defined(__clang__)
  32123. "adcs r4, %[r]\n\t"
  32124. #else
  32125. "adc r4, %[r]\n\t"
  32126. #endif
  32127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32128. "lsrs r6, %[a], #16\n\t"
  32129. #else
  32130. "lsr r6, %[a], #16\n\t"
  32131. #endif
  32132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32133. "lsrs r7, %[b], #16\n\t"
  32134. #else
  32135. "lsr r7, %[b], #16\n\t"
  32136. #endif
  32137. #ifdef WOLFSSL_KEIL
  32138. "muls r7, r6, r7\n\t"
  32139. #elif defined(__clang__)
  32140. "muls r7, r6\n\t"
  32141. #else
  32142. "mul r7, r6\n\t"
  32143. #endif
  32144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32145. "adds r3, r3, r7\n\t"
  32146. #else
  32147. "add r3, r3, r7\n\t"
  32148. #endif
  32149. #ifdef WOLFSSL_KEIL
  32150. "adcs r4, r4, %[r]\n\t"
  32151. #elif defined(__clang__)
  32152. "adcs r4, %[r]\n\t"
  32153. #else
  32154. "adc r4, %[r]\n\t"
  32155. #endif
  32156. "uxth r7, %[b]\n\t"
  32157. #ifdef WOLFSSL_KEIL
  32158. "muls r6, r7, r6\n\t"
  32159. #elif defined(__clang__)
  32160. "muls r6, r7\n\t"
  32161. #else
  32162. "mul r6, r7\n\t"
  32163. #endif
  32164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32165. "lsrs r7, r6, #16\n\t"
  32166. #else
  32167. "lsr r7, r6, #16\n\t"
  32168. #endif
  32169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32170. "lsls r6, r6, #16\n\t"
  32171. #else
  32172. "lsl r6, r6, #16\n\t"
  32173. #endif
  32174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32175. "adds r5, r5, r6\n\t"
  32176. #else
  32177. "add r5, r5, r6\n\t"
  32178. #endif
  32179. #ifdef WOLFSSL_KEIL
  32180. "adcs r3, r3, r7\n\t"
  32181. #elif defined(__clang__)
  32182. "adcs r3, r7\n\t"
  32183. #else
  32184. "adc r3, r7\n\t"
  32185. #endif
  32186. #ifdef WOLFSSL_KEIL
  32187. "adcs r4, r4, %[r]\n\t"
  32188. #elif defined(__clang__)
  32189. "adcs r4, %[r]\n\t"
  32190. #else
  32191. "adc r4, %[r]\n\t"
  32192. #endif
  32193. "# A[1] * B[4]\n\t"
  32194. "mov %[a], r9\n\t"
  32195. "mov %[b], r10\n\t"
  32196. "ldr %[a], [%[a], #4]\n\t"
  32197. "ldr %[b], [%[b], #16]\n\t"
  32198. "uxth r6, %[a]\n\t"
  32199. "uxth r7, %[b]\n\t"
  32200. #ifdef WOLFSSL_KEIL
  32201. "muls r7, r6, r7\n\t"
  32202. #elif defined(__clang__)
  32203. "muls r7, r6\n\t"
  32204. #else
  32205. "mul r7, r6\n\t"
  32206. #endif
  32207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32208. "adds r5, r5, r7\n\t"
  32209. #else
  32210. "add r5, r5, r7\n\t"
  32211. #endif
  32212. #ifdef WOLFSSL_KEIL
  32213. "adcs r3, r3, %[r]\n\t"
  32214. #elif defined(__clang__)
  32215. "adcs r3, %[r]\n\t"
  32216. #else
  32217. "adc r3, %[r]\n\t"
  32218. #endif
  32219. #ifdef WOLFSSL_KEIL
  32220. "adcs r4, r4, %[r]\n\t"
  32221. #elif defined(__clang__)
  32222. "adcs r4, %[r]\n\t"
  32223. #else
  32224. "adc r4, %[r]\n\t"
  32225. #endif
  32226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32227. "lsrs r7, %[b], #16\n\t"
  32228. #else
  32229. "lsr r7, %[b], #16\n\t"
  32230. #endif
  32231. #ifdef WOLFSSL_KEIL
  32232. "muls r6, r7, r6\n\t"
  32233. #elif defined(__clang__)
  32234. "muls r6, r7\n\t"
  32235. #else
  32236. "mul r6, r7\n\t"
  32237. #endif
  32238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32239. "lsrs r7, r6, #16\n\t"
  32240. #else
  32241. "lsr r7, r6, #16\n\t"
  32242. #endif
  32243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32244. "lsls r6, r6, #16\n\t"
  32245. #else
  32246. "lsl r6, r6, #16\n\t"
  32247. #endif
  32248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32249. "adds r5, r5, r6\n\t"
  32250. #else
  32251. "add r5, r5, r6\n\t"
  32252. #endif
  32253. #ifdef WOLFSSL_KEIL
  32254. "adcs r3, r3, r7\n\t"
  32255. #elif defined(__clang__)
  32256. "adcs r3, r7\n\t"
  32257. #else
  32258. "adc r3, r7\n\t"
  32259. #endif
  32260. #ifdef WOLFSSL_KEIL
  32261. "adcs r4, r4, %[r]\n\t"
  32262. #elif defined(__clang__)
  32263. "adcs r4, %[r]\n\t"
  32264. #else
  32265. "adc r4, %[r]\n\t"
  32266. #endif
  32267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32268. "lsrs r6, %[a], #16\n\t"
  32269. #else
  32270. "lsr r6, %[a], #16\n\t"
  32271. #endif
  32272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32273. "lsrs r7, %[b], #16\n\t"
  32274. #else
  32275. "lsr r7, %[b], #16\n\t"
  32276. #endif
  32277. #ifdef WOLFSSL_KEIL
  32278. "muls r7, r6, r7\n\t"
  32279. #elif defined(__clang__)
  32280. "muls r7, r6\n\t"
  32281. #else
  32282. "mul r7, r6\n\t"
  32283. #endif
  32284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32285. "adds r3, r3, r7\n\t"
  32286. #else
  32287. "add r3, r3, r7\n\t"
  32288. #endif
  32289. #ifdef WOLFSSL_KEIL
  32290. "adcs r4, r4, %[r]\n\t"
  32291. #elif defined(__clang__)
  32292. "adcs r4, %[r]\n\t"
  32293. #else
  32294. "adc r4, %[r]\n\t"
  32295. #endif
  32296. "uxth r7, %[b]\n\t"
  32297. #ifdef WOLFSSL_KEIL
  32298. "muls r6, r7, r6\n\t"
  32299. #elif defined(__clang__)
  32300. "muls r6, r7\n\t"
  32301. #else
  32302. "mul r6, r7\n\t"
  32303. #endif
  32304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32305. "lsrs r7, r6, #16\n\t"
  32306. #else
  32307. "lsr r7, r6, #16\n\t"
  32308. #endif
  32309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32310. "lsls r6, r6, #16\n\t"
  32311. #else
  32312. "lsl r6, r6, #16\n\t"
  32313. #endif
  32314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32315. "adds r5, r5, r6\n\t"
  32316. #else
  32317. "add r5, r5, r6\n\t"
  32318. #endif
  32319. #ifdef WOLFSSL_KEIL
  32320. "adcs r3, r3, r7\n\t"
  32321. #elif defined(__clang__)
  32322. "adcs r3, r7\n\t"
  32323. #else
  32324. "adc r3, r7\n\t"
  32325. #endif
  32326. #ifdef WOLFSSL_KEIL
  32327. "adcs r4, r4, %[r]\n\t"
  32328. #elif defined(__clang__)
  32329. "adcs r4, %[r]\n\t"
  32330. #else
  32331. "adc r4, %[r]\n\t"
  32332. #endif
  32333. "# A[2] * B[3]\n\t"
  32334. "mov %[a], r9\n\t"
  32335. "mov %[b], r10\n\t"
  32336. "ldr %[a], [%[a], #8]\n\t"
  32337. "ldr %[b], [%[b], #12]\n\t"
  32338. "uxth r6, %[a]\n\t"
  32339. "uxth r7, %[b]\n\t"
  32340. #ifdef WOLFSSL_KEIL
  32341. "muls r7, r6, r7\n\t"
  32342. #elif defined(__clang__)
  32343. "muls r7, r6\n\t"
  32344. #else
  32345. "mul r7, r6\n\t"
  32346. #endif
  32347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32348. "adds r5, r5, r7\n\t"
  32349. #else
  32350. "add r5, r5, r7\n\t"
  32351. #endif
  32352. #ifdef WOLFSSL_KEIL
  32353. "adcs r3, r3, %[r]\n\t"
  32354. #elif defined(__clang__)
  32355. "adcs r3, %[r]\n\t"
  32356. #else
  32357. "adc r3, %[r]\n\t"
  32358. #endif
  32359. #ifdef WOLFSSL_KEIL
  32360. "adcs r4, r4, %[r]\n\t"
  32361. #elif defined(__clang__)
  32362. "adcs r4, %[r]\n\t"
  32363. #else
  32364. "adc r4, %[r]\n\t"
  32365. #endif
  32366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32367. "lsrs r7, %[b], #16\n\t"
  32368. #else
  32369. "lsr r7, %[b], #16\n\t"
  32370. #endif
  32371. #ifdef WOLFSSL_KEIL
  32372. "muls r6, r7, r6\n\t"
  32373. #elif defined(__clang__)
  32374. "muls r6, r7\n\t"
  32375. #else
  32376. "mul r6, r7\n\t"
  32377. #endif
  32378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32379. "lsrs r7, r6, #16\n\t"
  32380. #else
  32381. "lsr r7, r6, #16\n\t"
  32382. #endif
  32383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32384. "lsls r6, r6, #16\n\t"
  32385. #else
  32386. "lsl r6, r6, #16\n\t"
  32387. #endif
  32388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32389. "adds r5, r5, r6\n\t"
  32390. #else
  32391. "add r5, r5, r6\n\t"
  32392. #endif
  32393. #ifdef WOLFSSL_KEIL
  32394. "adcs r3, r3, r7\n\t"
  32395. #elif defined(__clang__)
  32396. "adcs r3, r7\n\t"
  32397. #else
  32398. "adc r3, r7\n\t"
  32399. #endif
  32400. #ifdef WOLFSSL_KEIL
  32401. "adcs r4, r4, %[r]\n\t"
  32402. #elif defined(__clang__)
  32403. "adcs r4, %[r]\n\t"
  32404. #else
  32405. "adc r4, %[r]\n\t"
  32406. #endif
  32407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32408. "lsrs r6, %[a], #16\n\t"
  32409. #else
  32410. "lsr r6, %[a], #16\n\t"
  32411. #endif
  32412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32413. "lsrs r7, %[b], #16\n\t"
  32414. #else
  32415. "lsr r7, %[b], #16\n\t"
  32416. #endif
  32417. #ifdef WOLFSSL_KEIL
  32418. "muls r7, r6, r7\n\t"
  32419. #elif defined(__clang__)
  32420. "muls r7, r6\n\t"
  32421. #else
  32422. "mul r7, r6\n\t"
  32423. #endif
  32424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32425. "adds r3, r3, r7\n\t"
  32426. #else
  32427. "add r3, r3, r7\n\t"
  32428. #endif
  32429. #ifdef WOLFSSL_KEIL
  32430. "adcs r4, r4, %[r]\n\t"
  32431. #elif defined(__clang__)
  32432. "adcs r4, %[r]\n\t"
  32433. #else
  32434. "adc r4, %[r]\n\t"
  32435. #endif
  32436. "uxth r7, %[b]\n\t"
  32437. #ifdef WOLFSSL_KEIL
  32438. "muls r6, r7, r6\n\t"
  32439. #elif defined(__clang__)
  32440. "muls r6, r7\n\t"
  32441. #else
  32442. "mul r6, r7\n\t"
  32443. #endif
  32444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32445. "lsrs r7, r6, #16\n\t"
  32446. #else
  32447. "lsr r7, r6, #16\n\t"
  32448. #endif
  32449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32450. "lsls r6, r6, #16\n\t"
  32451. #else
  32452. "lsl r6, r6, #16\n\t"
  32453. #endif
  32454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32455. "adds r5, r5, r6\n\t"
  32456. #else
  32457. "add r5, r5, r6\n\t"
  32458. #endif
  32459. #ifdef WOLFSSL_KEIL
  32460. "adcs r3, r3, r7\n\t"
  32461. #elif defined(__clang__)
  32462. "adcs r3, r7\n\t"
  32463. #else
  32464. "adc r3, r7\n\t"
  32465. #endif
  32466. #ifdef WOLFSSL_KEIL
  32467. "adcs r4, r4, %[r]\n\t"
  32468. #elif defined(__clang__)
  32469. "adcs r4, %[r]\n\t"
  32470. #else
  32471. "adc r4, %[r]\n\t"
  32472. #endif
  32473. "# A[3] * B[2]\n\t"
  32474. "mov %[a], r9\n\t"
  32475. "mov %[b], r10\n\t"
  32476. "ldr %[a], [%[a], #12]\n\t"
  32477. "ldr %[b], [%[b], #8]\n\t"
  32478. "uxth r6, %[a]\n\t"
  32479. "uxth r7, %[b]\n\t"
  32480. #ifdef WOLFSSL_KEIL
  32481. "muls r7, r6, r7\n\t"
  32482. #elif defined(__clang__)
  32483. "muls r7, r6\n\t"
  32484. #else
  32485. "mul r7, r6\n\t"
  32486. #endif
  32487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32488. "adds r5, r5, r7\n\t"
  32489. #else
  32490. "add r5, r5, r7\n\t"
  32491. #endif
  32492. #ifdef WOLFSSL_KEIL
  32493. "adcs r3, r3, %[r]\n\t"
  32494. #elif defined(__clang__)
  32495. "adcs r3, %[r]\n\t"
  32496. #else
  32497. "adc r3, %[r]\n\t"
  32498. #endif
  32499. #ifdef WOLFSSL_KEIL
  32500. "adcs r4, r4, %[r]\n\t"
  32501. #elif defined(__clang__)
  32502. "adcs r4, %[r]\n\t"
  32503. #else
  32504. "adc r4, %[r]\n\t"
  32505. #endif
  32506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32507. "lsrs r7, %[b], #16\n\t"
  32508. #else
  32509. "lsr r7, %[b], #16\n\t"
  32510. #endif
  32511. #ifdef WOLFSSL_KEIL
  32512. "muls r6, r7, r6\n\t"
  32513. #elif defined(__clang__)
  32514. "muls r6, r7\n\t"
  32515. #else
  32516. "mul r6, r7\n\t"
  32517. #endif
  32518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32519. "lsrs r7, r6, #16\n\t"
  32520. #else
  32521. "lsr r7, r6, #16\n\t"
  32522. #endif
  32523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32524. "lsls r6, r6, #16\n\t"
  32525. #else
  32526. "lsl r6, r6, #16\n\t"
  32527. #endif
  32528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32529. "adds r5, r5, r6\n\t"
  32530. #else
  32531. "add r5, r5, r6\n\t"
  32532. #endif
  32533. #ifdef WOLFSSL_KEIL
  32534. "adcs r3, r3, r7\n\t"
  32535. #elif defined(__clang__)
  32536. "adcs r3, r7\n\t"
  32537. #else
  32538. "adc r3, r7\n\t"
  32539. #endif
  32540. #ifdef WOLFSSL_KEIL
  32541. "adcs r4, r4, %[r]\n\t"
  32542. #elif defined(__clang__)
  32543. "adcs r4, %[r]\n\t"
  32544. #else
  32545. "adc r4, %[r]\n\t"
  32546. #endif
  32547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32548. "lsrs r6, %[a], #16\n\t"
  32549. #else
  32550. "lsr r6, %[a], #16\n\t"
  32551. #endif
  32552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32553. "lsrs r7, %[b], #16\n\t"
  32554. #else
  32555. "lsr r7, %[b], #16\n\t"
  32556. #endif
  32557. #ifdef WOLFSSL_KEIL
  32558. "muls r7, r6, r7\n\t"
  32559. #elif defined(__clang__)
  32560. "muls r7, r6\n\t"
  32561. #else
  32562. "mul r7, r6\n\t"
  32563. #endif
  32564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32565. "adds r3, r3, r7\n\t"
  32566. #else
  32567. "add r3, r3, r7\n\t"
  32568. #endif
  32569. #ifdef WOLFSSL_KEIL
  32570. "adcs r4, r4, %[r]\n\t"
  32571. #elif defined(__clang__)
  32572. "adcs r4, %[r]\n\t"
  32573. #else
  32574. "adc r4, %[r]\n\t"
  32575. #endif
  32576. "uxth r7, %[b]\n\t"
  32577. #ifdef WOLFSSL_KEIL
  32578. "muls r6, r7, r6\n\t"
  32579. #elif defined(__clang__)
  32580. "muls r6, r7\n\t"
  32581. #else
  32582. "mul r6, r7\n\t"
  32583. #endif
  32584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32585. "lsrs r7, r6, #16\n\t"
  32586. #else
  32587. "lsr r7, r6, #16\n\t"
  32588. #endif
  32589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32590. "lsls r6, r6, #16\n\t"
  32591. #else
  32592. "lsl r6, r6, #16\n\t"
  32593. #endif
  32594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32595. "adds r5, r5, r6\n\t"
  32596. #else
  32597. "add r5, r5, r6\n\t"
  32598. #endif
  32599. #ifdef WOLFSSL_KEIL
  32600. "adcs r3, r3, r7\n\t"
  32601. #elif defined(__clang__)
  32602. "adcs r3, r7\n\t"
  32603. #else
  32604. "adc r3, r7\n\t"
  32605. #endif
  32606. #ifdef WOLFSSL_KEIL
  32607. "adcs r4, r4, %[r]\n\t"
  32608. #elif defined(__clang__)
  32609. "adcs r4, %[r]\n\t"
  32610. #else
  32611. "adc r4, %[r]\n\t"
  32612. #endif
  32613. "# A[4] * B[1]\n\t"
  32614. "mov %[a], r9\n\t"
  32615. "mov %[b], r10\n\t"
  32616. "ldr %[a], [%[a], #16]\n\t"
  32617. "ldr %[b], [%[b], #4]\n\t"
  32618. "uxth r6, %[a]\n\t"
  32619. "uxth r7, %[b]\n\t"
  32620. #ifdef WOLFSSL_KEIL
  32621. "muls r7, r6, r7\n\t"
  32622. #elif defined(__clang__)
  32623. "muls r7, r6\n\t"
  32624. #else
  32625. "mul r7, r6\n\t"
  32626. #endif
  32627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32628. "adds r5, r5, r7\n\t"
  32629. #else
  32630. "add r5, r5, r7\n\t"
  32631. #endif
  32632. #ifdef WOLFSSL_KEIL
  32633. "adcs r3, r3, %[r]\n\t"
  32634. #elif defined(__clang__)
  32635. "adcs r3, %[r]\n\t"
  32636. #else
  32637. "adc r3, %[r]\n\t"
  32638. #endif
  32639. #ifdef WOLFSSL_KEIL
  32640. "adcs r4, r4, %[r]\n\t"
  32641. #elif defined(__clang__)
  32642. "adcs r4, %[r]\n\t"
  32643. #else
  32644. "adc r4, %[r]\n\t"
  32645. #endif
  32646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32647. "lsrs r7, %[b], #16\n\t"
  32648. #else
  32649. "lsr r7, %[b], #16\n\t"
  32650. #endif
  32651. #ifdef WOLFSSL_KEIL
  32652. "muls r6, r7, r6\n\t"
  32653. #elif defined(__clang__)
  32654. "muls r6, r7\n\t"
  32655. #else
  32656. "mul r6, r7\n\t"
  32657. #endif
  32658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32659. "lsrs r7, r6, #16\n\t"
  32660. #else
  32661. "lsr r7, r6, #16\n\t"
  32662. #endif
  32663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32664. "lsls r6, r6, #16\n\t"
  32665. #else
  32666. "lsl r6, r6, #16\n\t"
  32667. #endif
  32668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32669. "adds r5, r5, r6\n\t"
  32670. #else
  32671. "add r5, r5, r6\n\t"
  32672. #endif
  32673. #ifdef WOLFSSL_KEIL
  32674. "adcs r3, r3, r7\n\t"
  32675. #elif defined(__clang__)
  32676. "adcs r3, r7\n\t"
  32677. #else
  32678. "adc r3, r7\n\t"
  32679. #endif
  32680. #ifdef WOLFSSL_KEIL
  32681. "adcs r4, r4, %[r]\n\t"
  32682. #elif defined(__clang__)
  32683. "adcs r4, %[r]\n\t"
  32684. #else
  32685. "adc r4, %[r]\n\t"
  32686. #endif
  32687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32688. "lsrs r6, %[a], #16\n\t"
  32689. #else
  32690. "lsr r6, %[a], #16\n\t"
  32691. #endif
  32692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32693. "lsrs r7, %[b], #16\n\t"
  32694. #else
  32695. "lsr r7, %[b], #16\n\t"
  32696. #endif
  32697. #ifdef WOLFSSL_KEIL
  32698. "muls r7, r6, r7\n\t"
  32699. #elif defined(__clang__)
  32700. "muls r7, r6\n\t"
  32701. #else
  32702. "mul r7, r6\n\t"
  32703. #endif
  32704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32705. "adds r3, r3, r7\n\t"
  32706. #else
  32707. "add r3, r3, r7\n\t"
  32708. #endif
  32709. #ifdef WOLFSSL_KEIL
  32710. "adcs r4, r4, %[r]\n\t"
  32711. #elif defined(__clang__)
  32712. "adcs r4, %[r]\n\t"
  32713. #else
  32714. "adc r4, %[r]\n\t"
  32715. #endif
  32716. "uxth r7, %[b]\n\t"
  32717. #ifdef WOLFSSL_KEIL
  32718. "muls r6, r7, r6\n\t"
  32719. #elif defined(__clang__)
  32720. "muls r6, r7\n\t"
  32721. #else
  32722. "mul r6, r7\n\t"
  32723. #endif
  32724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32725. "lsrs r7, r6, #16\n\t"
  32726. #else
  32727. "lsr r7, r6, #16\n\t"
  32728. #endif
  32729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32730. "lsls r6, r6, #16\n\t"
  32731. #else
  32732. "lsl r6, r6, #16\n\t"
  32733. #endif
  32734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32735. "adds r5, r5, r6\n\t"
  32736. #else
  32737. "add r5, r5, r6\n\t"
  32738. #endif
  32739. #ifdef WOLFSSL_KEIL
  32740. "adcs r3, r3, r7\n\t"
  32741. #elif defined(__clang__)
  32742. "adcs r3, r7\n\t"
  32743. #else
  32744. "adc r3, r7\n\t"
  32745. #endif
  32746. #ifdef WOLFSSL_KEIL
  32747. "adcs r4, r4, %[r]\n\t"
  32748. #elif defined(__clang__)
  32749. "adcs r4, %[r]\n\t"
  32750. #else
  32751. "adc r4, %[r]\n\t"
  32752. #endif
  32753. "# A[5] * B[0]\n\t"
  32754. "mov %[a], r9\n\t"
  32755. "mov %[b], r10\n\t"
  32756. "ldr %[a], [%[a], #20]\n\t"
  32757. "ldr %[b], [%[b]]\n\t"
  32758. "uxth r6, %[a]\n\t"
  32759. "uxth r7, %[b]\n\t"
  32760. #ifdef WOLFSSL_KEIL
  32761. "muls r7, r6, r7\n\t"
  32762. #elif defined(__clang__)
  32763. "muls r7, r6\n\t"
  32764. #else
  32765. "mul r7, r6\n\t"
  32766. #endif
  32767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32768. "adds r5, r5, r7\n\t"
  32769. #else
  32770. "add r5, r5, r7\n\t"
  32771. #endif
  32772. #ifdef WOLFSSL_KEIL
  32773. "adcs r3, r3, %[r]\n\t"
  32774. #elif defined(__clang__)
  32775. "adcs r3, %[r]\n\t"
  32776. #else
  32777. "adc r3, %[r]\n\t"
  32778. #endif
  32779. #ifdef WOLFSSL_KEIL
  32780. "adcs r4, r4, %[r]\n\t"
  32781. #elif defined(__clang__)
  32782. "adcs r4, %[r]\n\t"
  32783. #else
  32784. "adc r4, %[r]\n\t"
  32785. #endif
  32786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32787. "lsrs r7, %[b], #16\n\t"
  32788. #else
  32789. "lsr r7, %[b], #16\n\t"
  32790. #endif
  32791. #ifdef WOLFSSL_KEIL
  32792. "muls r6, r7, r6\n\t"
  32793. #elif defined(__clang__)
  32794. "muls r6, r7\n\t"
  32795. #else
  32796. "mul r6, r7\n\t"
  32797. #endif
  32798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32799. "lsrs r7, r6, #16\n\t"
  32800. #else
  32801. "lsr r7, r6, #16\n\t"
  32802. #endif
  32803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32804. "lsls r6, r6, #16\n\t"
  32805. #else
  32806. "lsl r6, r6, #16\n\t"
  32807. #endif
  32808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32809. "adds r5, r5, r6\n\t"
  32810. #else
  32811. "add r5, r5, r6\n\t"
  32812. #endif
  32813. #ifdef WOLFSSL_KEIL
  32814. "adcs r3, r3, r7\n\t"
  32815. #elif defined(__clang__)
  32816. "adcs r3, r7\n\t"
  32817. #else
  32818. "adc r3, r7\n\t"
  32819. #endif
  32820. #ifdef WOLFSSL_KEIL
  32821. "adcs r4, r4, %[r]\n\t"
  32822. #elif defined(__clang__)
  32823. "adcs r4, %[r]\n\t"
  32824. #else
  32825. "adc r4, %[r]\n\t"
  32826. #endif
  32827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32828. "lsrs r6, %[a], #16\n\t"
  32829. #else
  32830. "lsr r6, %[a], #16\n\t"
  32831. #endif
  32832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32833. "lsrs r7, %[b], #16\n\t"
  32834. #else
  32835. "lsr r7, %[b], #16\n\t"
  32836. #endif
  32837. #ifdef WOLFSSL_KEIL
  32838. "muls r7, r6, r7\n\t"
  32839. #elif defined(__clang__)
  32840. "muls r7, r6\n\t"
  32841. #else
  32842. "mul r7, r6\n\t"
  32843. #endif
  32844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32845. "adds r3, r3, r7\n\t"
  32846. #else
  32847. "add r3, r3, r7\n\t"
  32848. #endif
  32849. #ifdef WOLFSSL_KEIL
  32850. "adcs r4, r4, %[r]\n\t"
  32851. #elif defined(__clang__)
  32852. "adcs r4, %[r]\n\t"
  32853. #else
  32854. "adc r4, %[r]\n\t"
  32855. #endif
  32856. "uxth r7, %[b]\n\t"
  32857. #ifdef WOLFSSL_KEIL
  32858. "muls r6, r7, r6\n\t"
  32859. #elif defined(__clang__)
  32860. "muls r6, r7\n\t"
  32861. #else
  32862. "mul r6, r7\n\t"
  32863. #endif
  32864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32865. "lsrs r7, r6, #16\n\t"
  32866. #else
  32867. "lsr r7, r6, #16\n\t"
  32868. #endif
  32869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32870. "lsls r6, r6, #16\n\t"
  32871. #else
  32872. "lsl r6, r6, #16\n\t"
  32873. #endif
  32874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32875. "adds r5, r5, r6\n\t"
  32876. #else
  32877. "add r5, r5, r6\n\t"
  32878. #endif
  32879. #ifdef WOLFSSL_KEIL
  32880. "adcs r3, r3, r7\n\t"
  32881. #elif defined(__clang__)
  32882. "adcs r3, r7\n\t"
  32883. #else
  32884. "adc r3, r7\n\t"
  32885. #endif
  32886. #ifdef WOLFSSL_KEIL
  32887. "adcs r4, r4, %[r]\n\t"
  32888. #elif defined(__clang__)
  32889. "adcs r4, %[r]\n\t"
  32890. #else
  32891. "adc r4, %[r]\n\t"
  32892. #endif
  32893. "str r5, [sp, #20]\n\t"
  32894. "# A[6] * B[0]\n\t"
  32895. "movs r5, #0\n\t"
  32896. "mov %[a], r9\n\t"
  32897. "mov %[b], r10\n\t"
  32898. "ldr %[a], [%[a], #24]\n\t"
  32899. "ldr %[b], [%[b]]\n\t"
  32900. "uxth r6, %[a]\n\t"
  32901. "uxth r7, %[b]\n\t"
  32902. #ifdef WOLFSSL_KEIL
  32903. "muls r7, r6, r7\n\t"
  32904. #elif defined(__clang__)
  32905. "muls r7, r6\n\t"
  32906. #else
  32907. "mul r7, r6\n\t"
  32908. #endif
  32909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32910. "adds r3, r3, r7\n\t"
  32911. #else
  32912. "add r3, r3, r7\n\t"
  32913. #endif
  32914. #ifdef WOLFSSL_KEIL
  32915. "adcs r4, r4, %[r]\n\t"
  32916. #elif defined(__clang__)
  32917. "adcs r4, %[r]\n\t"
  32918. #else
  32919. "adc r4, %[r]\n\t"
  32920. #endif
  32921. #ifdef WOLFSSL_KEIL
  32922. "adcs r5, r5, %[r]\n\t"
  32923. #elif defined(__clang__)
  32924. "adcs r5, %[r]\n\t"
  32925. #else
  32926. "adc r5, %[r]\n\t"
  32927. #endif
  32928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32929. "lsrs r7, %[b], #16\n\t"
  32930. #else
  32931. "lsr r7, %[b], #16\n\t"
  32932. #endif
  32933. #ifdef WOLFSSL_KEIL
  32934. "muls r6, r7, r6\n\t"
  32935. #elif defined(__clang__)
  32936. "muls r6, r7\n\t"
  32937. #else
  32938. "mul r6, r7\n\t"
  32939. #endif
  32940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32941. "lsrs r7, r6, #16\n\t"
  32942. #else
  32943. "lsr r7, r6, #16\n\t"
  32944. #endif
  32945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32946. "lsls r6, r6, #16\n\t"
  32947. #else
  32948. "lsl r6, r6, #16\n\t"
  32949. #endif
  32950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32951. "adds r3, r3, r6\n\t"
  32952. #else
  32953. "add r3, r3, r6\n\t"
  32954. #endif
  32955. #ifdef WOLFSSL_KEIL
  32956. "adcs r4, r4, r7\n\t"
  32957. #elif defined(__clang__)
  32958. "adcs r4, r7\n\t"
  32959. #else
  32960. "adc r4, r7\n\t"
  32961. #endif
  32962. #ifdef WOLFSSL_KEIL
  32963. "adcs r5, r5, %[r]\n\t"
  32964. #elif defined(__clang__)
  32965. "adcs r5, %[r]\n\t"
  32966. #else
  32967. "adc r5, %[r]\n\t"
  32968. #endif
  32969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32970. "lsrs r6, %[a], #16\n\t"
  32971. #else
  32972. "lsr r6, %[a], #16\n\t"
  32973. #endif
  32974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32975. "lsrs r7, %[b], #16\n\t"
  32976. #else
  32977. "lsr r7, %[b], #16\n\t"
  32978. #endif
  32979. #ifdef WOLFSSL_KEIL
  32980. "muls r7, r6, r7\n\t"
  32981. #elif defined(__clang__)
  32982. "muls r7, r6\n\t"
  32983. #else
  32984. "mul r7, r6\n\t"
  32985. #endif
  32986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32987. "adds r4, r4, r7\n\t"
  32988. #else
  32989. "add r4, r4, r7\n\t"
  32990. #endif
  32991. #ifdef WOLFSSL_KEIL
  32992. "adcs r5, r5, %[r]\n\t"
  32993. #elif defined(__clang__)
  32994. "adcs r5, %[r]\n\t"
  32995. #else
  32996. "adc r5, %[r]\n\t"
  32997. #endif
  32998. "uxth r7, %[b]\n\t"
  32999. #ifdef WOLFSSL_KEIL
  33000. "muls r6, r7, r6\n\t"
  33001. #elif defined(__clang__)
  33002. "muls r6, r7\n\t"
  33003. #else
  33004. "mul r6, r7\n\t"
  33005. #endif
  33006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33007. "lsrs r7, r6, #16\n\t"
  33008. #else
  33009. "lsr r7, r6, #16\n\t"
  33010. #endif
  33011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33012. "lsls r6, r6, #16\n\t"
  33013. #else
  33014. "lsl r6, r6, #16\n\t"
  33015. #endif
  33016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33017. "adds r3, r3, r6\n\t"
  33018. #else
  33019. "add r3, r3, r6\n\t"
  33020. #endif
  33021. #ifdef WOLFSSL_KEIL
  33022. "adcs r4, r4, r7\n\t"
  33023. #elif defined(__clang__)
  33024. "adcs r4, r7\n\t"
  33025. #else
  33026. "adc r4, r7\n\t"
  33027. #endif
  33028. #ifdef WOLFSSL_KEIL
  33029. "adcs r5, r5, %[r]\n\t"
  33030. #elif defined(__clang__)
  33031. "adcs r5, %[r]\n\t"
  33032. #else
  33033. "adc r5, %[r]\n\t"
  33034. #endif
  33035. "# A[5] * B[1]\n\t"
  33036. "mov %[a], r9\n\t"
  33037. "mov %[b], r10\n\t"
  33038. "ldr %[a], [%[a], #20]\n\t"
  33039. "ldr %[b], [%[b], #4]\n\t"
  33040. "uxth r6, %[a]\n\t"
  33041. "uxth r7, %[b]\n\t"
  33042. #ifdef WOLFSSL_KEIL
  33043. "muls r7, r6, r7\n\t"
  33044. #elif defined(__clang__)
  33045. "muls r7, r6\n\t"
  33046. #else
  33047. "mul r7, r6\n\t"
  33048. #endif
  33049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33050. "adds r3, r3, r7\n\t"
  33051. #else
  33052. "add r3, r3, r7\n\t"
  33053. #endif
  33054. #ifdef WOLFSSL_KEIL
  33055. "adcs r4, r4, %[r]\n\t"
  33056. #elif defined(__clang__)
  33057. "adcs r4, %[r]\n\t"
  33058. #else
  33059. "adc r4, %[r]\n\t"
  33060. #endif
  33061. #ifdef WOLFSSL_KEIL
  33062. "adcs r5, r5, %[r]\n\t"
  33063. #elif defined(__clang__)
  33064. "adcs r5, %[r]\n\t"
  33065. #else
  33066. "adc r5, %[r]\n\t"
  33067. #endif
  33068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33069. "lsrs r7, %[b], #16\n\t"
  33070. #else
  33071. "lsr r7, %[b], #16\n\t"
  33072. #endif
  33073. #ifdef WOLFSSL_KEIL
  33074. "muls r6, r7, r6\n\t"
  33075. #elif defined(__clang__)
  33076. "muls r6, r7\n\t"
  33077. #else
  33078. "mul r6, r7\n\t"
  33079. #endif
  33080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33081. "lsrs r7, r6, #16\n\t"
  33082. #else
  33083. "lsr r7, r6, #16\n\t"
  33084. #endif
  33085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33086. "lsls r6, r6, #16\n\t"
  33087. #else
  33088. "lsl r6, r6, #16\n\t"
  33089. #endif
  33090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33091. "adds r3, r3, r6\n\t"
  33092. #else
  33093. "add r3, r3, r6\n\t"
  33094. #endif
  33095. #ifdef WOLFSSL_KEIL
  33096. "adcs r4, r4, r7\n\t"
  33097. #elif defined(__clang__)
  33098. "adcs r4, r7\n\t"
  33099. #else
  33100. "adc r4, r7\n\t"
  33101. #endif
  33102. #ifdef WOLFSSL_KEIL
  33103. "adcs r5, r5, %[r]\n\t"
  33104. #elif defined(__clang__)
  33105. "adcs r5, %[r]\n\t"
  33106. #else
  33107. "adc r5, %[r]\n\t"
  33108. #endif
  33109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33110. "lsrs r6, %[a], #16\n\t"
  33111. #else
  33112. "lsr r6, %[a], #16\n\t"
  33113. #endif
  33114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33115. "lsrs r7, %[b], #16\n\t"
  33116. #else
  33117. "lsr r7, %[b], #16\n\t"
  33118. #endif
  33119. #ifdef WOLFSSL_KEIL
  33120. "muls r7, r6, r7\n\t"
  33121. #elif defined(__clang__)
  33122. "muls r7, r6\n\t"
  33123. #else
  33124. "mul r7, r6\n\t"
  33125. #endif
  33126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33127. "adds r4, r4, r7\n\t"
  33128. #else
  33129. "add r4, r4, r7\n\t"
  33130. #endif
  33131. #ifdef WOLFSSL_KEIL
  33132. "adcs r5, r5, %[r]\n\t"
  33133. #elif defined(__clang__)
  33134. "adcs r5, %[r]\n\t"
  33135. #else
  33136. "adc r5, %[r]\n\t"
  33137. #endif
  33138. "uxth r7, %[b]\n\t"
  33139. #ifdef WOLFSSL_KEIL
  33140. "muls r6, r7, r6\n\t"
  33141. #elif defined(__clang__)
  33142. "muls r6, r7\n\t"
  33143. #else
  33144. "mul r6, r7\n\t"
  33145. #endif
  33146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33147. "lsrs r7, r6, #16\n\t"
  33148. #else
  33149. "lsr r7, r6, #16\n\t"
  33150. #endif
  33151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33152. "lsls r6, r6, #16\n\t"
  33153. #else
  33154. "lsl r6, r6, #16\n\t"
  33155. #endif
  33156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33157. "adds r3, r3, r6\n\t"
  33158. #else
  33159. "add r3, r3, r6\n\t"
  33160. #endif
  33161. #ifdef WOLFSSL_KEIL
  33162. "adcs r4, r4, r7\n\t"
  33163. #elif defined(__clang__)
  33164. "adcs r4, r7\n\t"
  33165. #else
  33166. "adc r4, r7\n\t"
  33167. #endif
  33168. #ifdef WOLFSSL_KEIL
  33169. "adcs r5, r5, %[r]\n\t"
  33170. #elif defined(__clang__)
  33171. "adcs r5, %[r]\n\t"
  33172. #else
  33173. "adc r5, %[r]\n\t"
  33174. #endif
  33175. "# A[4] * B[2]\n\t"
  33176. "mov %[a], r9\n\t"
  33177. "mov %[b], r10\n\t"
  33178. "ldr %[a], [%[a], #16]\n\t"
  33179. "ldr %[b], [%[b], #8]\n\t"
  33180. "uxth r6, %[a]\n\t"
  33181. "uxth r7, %[b]\n\t"
  33182. #ifdef WOLFSSL_KEIL
  33183. "muls r7, r6, r7\n\t"
  33184. #elif defined(__clang__)
  33185. "muls r7, r6\n\t"
  33186. #else
  33187. "mul r7, r6\n\t"
  33188. #endif
  33189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33190. "adds r3, r3, r7\n\t"
  33191. #else
  33192. "add r3, r3, r7\n\t"
  33193. #endif
  33194. #ifdef WOLFSSL_KEIL
  33195. "adcs r4, r4, %[r]\n\t"
  33196. #elif defined(__clang__)
  33197. "adcs r4, %[r]\n\t"
  33198. #else
  33199. "adc r4, %[r]\n\t"
  33200. #endif
  33201. #ifdef WOLFSSL_KEIL
  33202. "adcs r5, r5, %[r]\n\t"
  33203. #elif defined(__clang__)
  33204. "adcs r5, %[r]\n\t"
  33205. #else
  33206. "adc r5, %[r]\n\t"
  33207. #endif
  33208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33209. "lsrs r7, %[b], #16\n\t"
  33210. #else
  33211. "lsr r7, %[b], #16\n\t"
  33212. #endif
  33213. #ifdef WOLFSSL_KEIL
  33214. "muls r6, r7, r6\n\t"
  33215. #elif defined(__clang__)
  33216. "muls r6, r7\n\t"
  33217. #else
  33218. "mul r6, r7\n\t"
  33219. #endif
  33220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33221. "lsrs r7, r6, #16\n\t"
  33222. #else
  33223. "lsr r7, r6, #16\n\t"
  33224. #endif
  33225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33226. "lsls r6, r6, #16\n\t"
  33227. #else
  33228. "lsl r6, r6, #16\n\t"
  33229. #endif
  33230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33231. "adds r3, r3, r6\n\t"
  33232. #else
  33233. "add r3, r3, r6\n\t"
  33234. #endif
  33235. #ifdef WOLFSSL_KEIL
  33236. "adcs r4, r4, r7\n\t"
  33237. #elif defined(__clang__)
  33238. "adcs r4, r7\n\t"
  33239. #else
  33240. "adc r4, r7\n\t"
  33241. #endif
  33242. #ifdef WOLFSSL_KEIL
  33243. "adcs r5, r5, %[r]\n\t"
  33244. #elif defined(__clang__)
  33245. "adcs r5, %[r]\n\t"
  33246. #else
  33247. "adc r5, %[r]\n\t"
  33248. #endif
  33249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33250. "lsrs r6, %[a], #16\n\t"
  33251. #else
  33252. "lsr r6, %[a], #16\n\t"
  33253. #endif
  33254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33255. "lsrs r7, %[b], #16\n\t"
  33256. #else
  33257. "lsr r7, %[b], #16\n\t"
  33258. #endif
  33259. #ifdef WOLFSSL_KEIL
  33260. "muls r7, r6, r7\n\t"
  33261. #elif defined(__clang__)
  33262. "muls r7, r6\n\t"
  33263. #else
  33264. "mul r7, r6\n\t"
  33265. #endif
  33266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33267. "adds r4, r4, r7\n\t"
  33268. #else
  33269. "add r4, r4, r7\n\t"
  33270. #endif
  33271. #ifdef WOLFSSL_KEIL
  33272. "adcs r5, r5, %[r]\n\t"
  33273. #elif defined(__clang__)
  33274. "adcs r5, %[r]\n\t"
  33275. #else
  33276. "adc r5, %[r]\n\t"
  33277. #endif
  33278. "uxth r7, %[b]\n\t"
  33279. #ifdef WOLFSSL_KEIL
  33280. "muls r6, r7, r6\n\t"
  33281. #elif defined(__clang__)
  33282. "muls r6, r7\n\t"
  33283. #else
  33284. "mul r6, r7\n\t"
  33285. #endif
  33286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33287. "lsrs r7, r6, #16\n\t"
  33288. #else
  33289. "lsr r7, r6, #16\n\t"
  33290. #endif
  33291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33292. "lsls r6, r6, #16\n\t"
  33293. #else
  33294. "lsl r6, r6, #16\n\t"
  33295. #endif
  33296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33297. "adds r3, r3, r6\n\t"
  33298. #else
  33299. "add r3, r3, r6\n\t"
  33300. #endif
  33301. #ifdef WOLFSSL_KEIL
  33302. "adcs r4, r4, r7\n\t"
  33303. #elif defined(__clang__)
  33304. "adcs r4, r7\n\t"
  33305. #else
  33306. "adc r4, r7\n\t"
  33307. #endif
  33308. #ifdef WOLFSSL_KEIL
  33309. "adcs r5, r5, %[r]\n\t"
  33310. #elif defined(__clang__)
  33311. "adcs r5, %[r]\n\t"
  33312. #else
  33313. "adc r5, %[r]\n\t"
  33314. #endif
  33315. "# A[3] * B[3]\n\t"
  33316. "mov %[a], r9\n\t"
  33317. "mov %[b], r10\n\t"
  33318. "ldr %[a], [%[a], #12]\n\t"
  33319. "ldr %[b], [%[b], #12]\n\t"
  33320. "uxth r6, %[a]\n\t"
  33321. "uxth r7, %[b]\n\t"
  33322. #ifdef WOLFSSL_KEIL
  33323. "muls r7, r6, r7\n\t"
  33324. #elif defined(__clang__)
  33325. "muls r7, r6\n\t"
  33326. #else
  33327. "mul r7, r6\n\t"
  33328. #endif
  33329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33330. "adds r3, r3, r7\n\t"
  33331. #else
  33332. "add r3, r3, r7\n\t"
  33333. #endif
  33334. #ifdef WOLFSSL_KEIL
  33335. "adcs r4, r4, %[r]\n\t"
  33336. #elif defined(__clang__)
  33337. "adcs r4, %[r]\n\t"
  33338. #else
  33339. "adc r4, %[r]\n\t"
  33340. #endif
  33341. #ifdef WOLFSSL_KEIL
  33342. "adcs r5, r5, %[r]\n\t"
  33343. #elif defined(__clang__)
  33344. "adcs r5, %[r]\n\t"
  33345. #else
  33346. "adc r5, %[r]\n\t"
  33347. #endif
  33348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33349. "lsrs r7, %[b], #16\n\t"
  33350. #else
  33351. "lsr r7, %[b], #16\n\t"
  33352. #endif
  33353. #ifdef WOLFSSL_KEIL
  33354. "muls r6, r7, r6\n\t"
  33355. #elif defined(__clang__)
  33356. "muls r6, r7\n\t"
  33357. #else
  33358. "mul r6, r7\n\t"
  33359. #endif
  33360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33361. "lsrs r7, r6, #16\n\t"
  33362. #else
  33363. "lsr r7, r6, #16\n\t"
  33364. #endif
  33365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33366. "lsls r6, r6, #16\n\t"
  33367. #else
  33368. "lsl r6, r6, #16\n\t"
  33369. #endif
  33370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33371. "adds r3, r3, r6\n\t"
  33372. #else
  33373. "add r3, r3, r6\n\t"
  33374. #endif
  33375. #ifdef WOLFSSL_KEIL
  33376. "adcs r4, r4, r7\n\t"
  33377. #elif defined(__clang__)
  33378. "adcs r4, r7\n\t"
  33379. #else
  33380. "adc r4, r7\n\t"
  33381. #endif
  33382. #ifdef WOLFSSL_KEIL
  33383. "adcs r5, r5, %[r]\n\t"
  33384. #elif defined(__clang__)
  33385. "adcs r5, %[r]\n\t"
  33386. #else
  33387. "adc r5, %[r]\n\t"
  33388. #endif
  33389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33390. "lsrs r6, %[a], #16\n\t"
  33391. #else
  33392. "lsr r6, %[a], #16\n\t"
  33393. #endif
  33394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33395. "lsrs r7, %[b], #16\n\t"
  33396. #else
  33397. "lsr r7, %[b], #16\n\t"
  33398. #endif
  33399. #ifdef WOLFSSL_KEIL
  33400. "muls r7, r6, r7\n\t"
  33401. #elif defined(__clang__)
  33402. "muls r7, r6\n\t"
  33403. #else
  33404. "mul r7, r6\n\t"
  33405. #endif
  33406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33407. "adds r4, r4, r7\n\t"
  33408. #else
  33409. "add r4, r4, r7\n\t"
  33410. #endif
  33411. #ifdef WOLFSSL_KEIL
  33412. "adcs r5, r5, %[r]\n\t"
  33413. #elif defined(__clang__)
  33414. "adcs r5, %[r]\n\t"
  33415. #else
  33416. "adc r5, %[r]\n\t"
  33417. #endif
  33418. "uxth r7, %[b]\n\t"
  33419. #ifdef WOLFSSL_KEIL
  33420. "muls r6, r7, r6\n\t"
  33421. #elif defined(__clang__)
  33422. "muls r6, r7\n\t"
  33423. #else
  33424. "mul r6, r7\n\t"
  33425. #endif
  33426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33427. "lsrs r7, r6, #16\n\t"
  33428. #else
  33429. "lsr r7, r6, #16\n\t"
  33430. #endif
  33431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33432. "lsls r6, r6, #16\n\t"
  33433. #else
  33434. "lsl r6, r6, #16\n\t"
  33435. #endif
  33436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33437. "adds r3, r3, r6\n\t"
  33438. #else
  33439. "add r3, r3, r6\n\t"
  33440. #endif
  33441. #ifdef WOLFSSL_KEIL
  33442. "adcs r4, r4, r7\n\t"
  33443. #elif defined(__clang__)
  33444. "adcs r4, r7\n\t"
  33445. #else
  33446. "adc r4, r7\n\t"
  33447. #endif
  33448. #ifdef WOLFSSL_KEIL
  33449. "adcs r5, r5, %[r]\n\t"
  33450. #elif defined(__clang__)
  33451. "adcs r5, %[r]\n\t"
  33452. #else
  33453. "adc r5, %[r]\n\t"
  33454. #endif
  33455. "# A[2] * B[4]\n\t"
  33456. "mov %[a], r9\n\t"
  33457. "mov %[b], r10\n\t"
  33458. "ldr %[a], [%[a], #8]\n\t"
  33459. "ldr %[b], [%[b], #16]\n\t"
  33460. "uxth r6, %[a]\n\t"
  33461. "uxth r7, %[b]\n\t"
  33462. #ifdef WOLFSSL_KEIL
  33463. "muls r7, r6, r7\n\t"
  33464. #elif defined(__clang__)
  33465. "muls r7, r6\n\t"
  33466. #else
  33467. "mul r7, r6\n\t"
  33468. #endif
  33469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33470. "adds r3, r3, r7\n\t"
  33471. #else
  33472. "add r3, r3, r7\n\t"
  33473. #endif
  33474. #ifdef WOLFSSL_KEIL
  33475. "adcs r4, r4, %[r]\n\t"
  33476. #elif defined(__clang__)
  33477. "adcs r4, %[r]\n\t"
  33478. #else
  33479. "adc r4, %[r]\n\t"
  33480. #endif
  33481. #ifdef WOLFSSL_KEIL
  33482. "adcs r5, r5, %[r]\n\t"
  33483. #elif defined(__clang__)
  33484. "adcs r5, %[r]\n\t"
  33485. #else
  33486. "adc r5, %[r]\n\t"
  33487. #endif
  33488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33489. "lsrs r7, %[b], #16\n\t"
  33490. #else
  33491. "lsr r7, %[b], #16\n\t"
  33492. #endif
  33493. #ifdef WOLFSSL_KEIL
  33494. "muls r6, r7, r6\n\t"
  33495. #elif defined(__clang__)
  33496. "muls r6, r7\n\t"
  33497. #else
  33498. "mul r6, r7\n\t"
  33499. #endif
  33500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33501. "lsrs r7, r6, #16\n\t"
  33502. #else
  33503. "lsr r7, r6, #16\n\t"
  33504. #endif
  33505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33506. "lsls r6, r6, #16\n\t"
  33507. #else
  33508. "lsl r6, r6, #16\n\t"
  33509. #endif
  33510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33511. "adds r3, r3, r6\n\t"
  33512. #else
  33513. "add r3, r3, r6\n\t"
  33514. #endif
  33515. #ifdef WOLFSSL_KEIL
  33516. "adcs r4, r4, r7\n\t"
  33517. #elif defined(__clang__)
  33518. "adcs r4, r7\n\t"
  33519. #else
  33520. "adc r4, r7\n\t"
  33521. #endif
  33522. #ifdef WOLFSSL_KEIL
  33523. "adcs r5, r5, %[r]\n\t"
  33524. #elif defined(__clang__)
  33525. "adcs r5, %[r]\n\t"
  33526. #else
  33527. "adc r5, %[r]\n\t"
  33528. #endif
  33529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33530. "lsrs r6, %[a], #16\n\t"
  33531. #else
  33532. "lsr r6, %[a], #16\n\t"
  33533. #endif
  33534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33535. "lsrs r7, %[b], #16\n\t"
  33536. #else
  33537. "lsr r7, %[b], #16\n\t"
  33538. #endif
  33539. #ifdef WOLFSSL_KEIL
  33540. "muls r7, r6, r7\n\t"
  33541. #elif defined(__clang__)
  33542. "muls r7, r6\n\t"
  33543. #else
  33544. "mul r7, r6\n\t"
  33545. #endif
  33546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33547. "adds r4, r4, r7\n\t"
  33548. #else
  33549. "add r4, r4, r7\n\t"
  33550. #endif
  33551. #ifdef WOLFSSL_KEIL
  33552. "adcs r5, r5, %[r]\n\t"
  33553. #elif defined(__clang__)
  33554. "adcs r5, %[r]\n\t"
  33555. #else
  33556. "adc r5, %[r]\n\t"
  33557. #endif
  33558. "uxth r7, %[b]\n\t"
  33559. #ifdef WOLFSSL_KEIL
  33560. "muls r6, r7, r6\n\t"
  33561. #elif defined(__clang__)
  33562. "muls r6, r7\n\t"
  33563. #else
  33564. "mul r6, r7\n\t"
  33565. #endif
  33566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33567. "lsrs r7, r6, #16\n\t"
  33568. #else
  33569. "lsr r7, r6, #16\n\t"
  33570. #endif
  33571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33572. "lsls r6, r6, #16\n\t"
  33573. #else
  33574. "lsl r6, r6, #16\n\t"
  33575. #endif
  33576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33577. "adds r3, r3, r6\n\t"
  33578. #else
  33579. "add r3, r3, r6\n\t"
  33580. #endif
  33581. #ifdef WOLFSSL_KEIL
  33582. "adcs r4, r4, r7\n\t"
  33583. #elif defined(__clang__)
  33584. "adcs r4, r7\n\t"
  33585. #else
  33586. "adc r4, r7\n\t"
  33587. #endif
  33588. #ifdef WOLFSSL_KEIL
  33589. "adcs r5, r5, %[r]\n\t"
  33590. #elif defined(__clang__)
  33591. "adcs r5, %[r]\n\t"
  33592. #else
  33593. "adc r5, %[r]\n\t"
  33594. #endif
  33595. "# A[1] * B[5]\n\t"
  33596. "mov %[a], r9\n\t"
  33597. "mov %[b], r10\n\t"
  33598. "ldr %[a], [%[a], #4]\n\t"
  33599. "ldr %[b], [%[b], #20]\n\t"
  33600. "uxth r6, %[a]\n\t"
  33601. "uxth r7, %[b]\n\t"
  33602. #ifdef WOLFSSL_KEIL
  33603. "muls r7, r6, r7\n\t"
  33604. #elif defined(__clang__)
  33605. "muls r7, r6\n\t"
  33606. #else
  33607. "mul r7, r6\n\t"
  33608. #endif
  33609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33610. "adds r3, r3, r7\n\t"
  33611. #else
  33612. "add r3, r3, r7\n\t"
  33613. #endif
  33614. #ifdef WOLFSSL_KEIL
  33615. "adcs r4, r4, %[r]\n\t"
  33616. #elif defined(__clang__)
  33617. "adcs r4, %[r]\n\t"
  33618. #else
  33619. "adc r4, %[r]\n\t"
  33620. #endif
  33621. #ifdef WOLFSSL_KEIL
  33622. "adcs r5, r5, %[r]\n\t"
  33623. #elif defined(__clang__)
  33624. "adcs r5, %[r]\n\t"
  33625. #else
  33626. "adc r5, %[r]\n\t"
  33627. #endif
  33628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33629. "lsrs r7, %[b], #16\n\t"
  33630. #else
  33631. "lsr r7, %[b], #16\n\t"
  33632. #endif
  33633. #ifdef WOLFSSL_KEIL
  33634. "muls r6, r7, r6\n\t"
  33635. #elif defined(__clang__)
  33636. "muls r6, r7\n\t"
  33637. #else
  33638. "mul r6, r7\n\t"
  33639. #endif
  33640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33641. "lsrs r7, r6, #16\n\t"
  33642. #else
  33643. "lsr r7, r6, #16\n\t"
  33644. #endif
  33645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33646. "lsls r6, r6, #16\n\t"
  33647. #else
  33648. "lsl r6, r6, #16\n\t"
  33649. #endif
  33650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33651. "adds r3, r3, r6\n\t"
  33652. #else
  33653. "add r3, r3, r6\n\t"
  33654. #endif
  33655. #ifdef WOLFSSL_KEIL
  33656. "adcs r4, r4, r7\n\t"
  33657. #elif defined(__clang__)
  33658. "adcs r4, r7\n\t"
  33659. #else
  33660. "adc r4, r7\n\t"
  33661. #endif
  33662. #ifdef WOLFSSL_KEIL
  33663. "adcs r5, r5, %[r]\n\t"
  33664. #elif defined(__clang__)
  33665. "adcs r5, %[r]\n\t"
  33666. #else
  33667. "adc r5, %[r]\n\t"
  33668. #endif
  33669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33670. "lsrs r6, %[a], #16\n\t"
  33671. #else
  33672. "lsr r6, %[a], #16\n\t"
  33673. #endif
  33674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33675. "lsrs r7, %[b], #16\n\t"
  33676. #else
  33677. "lsr r7, %[b], #16\n\t"
  33678. #endif
  33679. #ifdef WOLFSSL_KEIL
  33680. "muls r7, r6, r7\n\t"
  33681. #elif defined(__clang__)
  33682. "muls r7, r6\n\t"
  33683. #else
  33684. "mul r7, r6\n\t"
  33685. #endif
  33686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33687. "adds r4, r4, r7\n\t"
  33688. #else
  33689. "add r4, r4, r7\n\t"
  33690. #endif
  33691. #ifdef WOLFSSL_KEIL
  33692. "adcs r5, r5, %[r]\n\t"
  33693. #elif defined(__clang__)
  33694. "adcs r5, %[r]\n\t"
  33695. #else
  33696. "adc r5, %[r]\n\t"
  33697. #endif
  33698. "uxth r7, %[b]\n\t"
  33699. #ifdef WOLFSSL_KEIL
  33700. "muls r6, r7, r6\n\t"
  33701. #elif defined(__clang__)
  33702. "muls r6, r7\n\t"
  33703. #else
  33704. "mul r6, r7\n\t"
  33705. #endif
  33706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33707. "lsrs r7, r6, #16\n\t"
  33708. #else
  33709. "lsr r7, r6, #16\n\t"
  33710. #endif
  33711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33712. "lsls r6, r6, #16\n\t"
  33713. #else
  33714. "lsl r6, r6, #16\n\t"
  33715. #endif
  33716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33717. "adds r3, r3, r6\n\t"
  33718. #else
  33719. "add r3, r3, r6\n\t"
  33720. #endif
  33721. #ifdef WOLFSSL_KEIL
  33722. "adcs r4, r4, r7\n\t"
  33723. #elif defined(__clang__)
  33724. "adcs r4, r7\n\t"
  33725. #else
  33726. "adc r4, r7\n\t"
  33727. #endif
  33728. #ifdef WOLFSSL_KEIL
  33729. "adcs r5, r5, %[r]\n\t"
  33730. #elif defined(__clang__)
  33731. "adcs r5, %[r]\n\t"
  33732. #else
  33733. "adc r5, %[r]\n\t"
  33734. #endif
  33735. "# A[0] * B[6]\n\t"
  33736. "mov %[a], r9\n\t"
  33737. "mov %[b], r10\n\t"
  33738. "ldr %[a], [%[a]]\n\t"
  33739. "ldr %[b], [%[b], #24]\n\t"
  33740. "uxth r6, %[a]\n\t"
  33741. "uxth r7, %[b]\n\t"
  33742. #ifdef WOLFSSL_KEIL
  33743. "muls r7, r6, r7\n\t"
  33744. #elif defined(__clang__)
  33745. "muls r7, r6\n\t"
  33746. #else
  33747. "mul r7, r6\n\t"
  33748. #endif
  33749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33750. "adds r3, r3, r7\n\t"
  33751. #else
  33752. "add r3, r3, r7\n\t"
  33753. #endif
  33754. #ifdef WOLFSSL_KEIL
  33755. "adcs r4, r4, %[r]\n\t"
  33756. #elif defined(__clang__)
  33757. "adcs r4, %[r]\n\t"
  33758. #else
  33759. "adc r4, %[r]\n\t"
  33760. #endif
  33761. #ifdef WOLFSSL_KEIL
  33762. "adcs r5, r5, %[r]\n\t"
  33763. #elif defined(__clang__)
  33764. "adcs r5, %[r]\n\t"
  33765. #else
  33766. "adc r5, %[r]\n\t"
  33767. #endif
  33768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33769. "lsrs r7, %[b], #16\n\t"
  33770. #else
  33771. "lsr r7, %[b], #16\n\t"
  33772. #endif
  33773. #ifdef WOLFSSL_KEIL
  33774. "muls r6, r7, r6\n\t"
  33775. #elif defined(__clang__)
  33776. "muls r6, r7\n\t"
  33777. #else
  33778. "mul r6, r7\n\t"
  33779. #endif
  33780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33781. "lsrs r7, r6, #16\n\t"
  33782. #else
  33783. "lsr r7, r6, #16\n\t"
  33784. #endif
  33785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33786. "lsls r6, r6, #16\n\t"
  33787. #else
  33788. "lsl r6, r6, #16\n\t"
  33789. #endif
  33790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33791. "adds r3, r3, r6\n\t"
  33792. #else
  33793. "add r3, r3, r6\n\t"
  33794. #endif
  33795. #ifdef WOLFSSL_KEIL
  33796. "adcs r4, r4, r7\n\t"
  33797. #elif defined(__clang__)
  33798. "adcs r4, r7\n\t"
  33799. #else
  33800. "adc r4, r7\n\t"
  33801. #endif
  33802. #ifdef WOLFSSL_KEIL
  33803. "adcs r5, r5, %[r]\n\t"
  33804. #elif defined(__clang__)
  33805. "adcs r5, %[r]\n\t"
  33806. #else
  33807. "adc r5, %[r]\n\t"
  33808. #endif
  33809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33810. "lsrs r6, %[a], #16\n\t"
  33811. #else
  33812. "lsr r6, %[a], #16\n\t"
  33813. #endif
  33814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33815. "lsrs r7, %[b], #16\n\t"
  33816. #else
  33817. "lsr r7, %[b], #16\n\t"
  33818. #endif
  33819. #ifdef WOLFSSL_KEIL
  33820. "muls r7, r6, r7\n\t"
  33821. #elif defined(__clang__)
  33822. "muls r7, r6\n\t"
  33823. #else
  33824. "mul r7, r6\n\t"
  33825. #endif
  33826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33827. "adds r4, r4, r7\n\t"
  33828. #else
  33829. "add r4, r4, r7\n\t"
  33830. #endif
  33831. #ifdef WOLFSSL_KEIL
  33832. "adcs r5, r5, %[r]\n\t"
  33833. #elif defined(__clang__)
  33834. "adcs r5, %[r]\n\t"
  33835. #else
  33836. "adc r5, %[r]\n\t"
  33837. #endif
  33838. "uxth r7, %[b]\n\t"
  33839. #ifdef WOLFSSL_KEIL
  33840. "muls r6, r7, r6\n\t"
  33841. #elif defined(__clang__)
  33842. "muls r6, r7\n\t"
  33843. #else
  33844. "mul r6, r7\n\t"
  33845. #endif
  33846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33847. "lsrs r7, r6, #16\n\t"
  33848. #else
  33849. "lsr r7, r6, #16\n\t"
  33850. #endif
  33851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33852. "lsls r6, r6, #16\n\t"
  33853. #else
  33854. "lsl r6, r6, #16\n\t"
  33855. #endif
  33856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33857. "adds r3, r3, r6\n\t"
  33858. #else
  33859. "add r3, r3, r6\n\t"
  33860. #endif
  33861. #ifdef WOLFSSL_KEIL
  33862. "adcs r4, r4, r7\n\t"
  33863. #elif defined(__clang__)
  33864. "adcs r4, r7\n\t"
  33865. #else
  33866. "adc r4, r7\n\t"
  33867. #endif
  33868. #ifdef WOLFSSL_KEIL
  33869. "adcs r5, r5, %[r]\n\t"
  33870. #elif defined(__clang__)
  33871. "adcs r5, %[r]\n\t"
  33872. #else
  33873. "adc r5, %[r]\n\t"
  33874. #endif
  33875. "str r3, [sp, #24]\n\t"
  33876. "# A[0] * B[7]\n\t"
  33877. "movs r3, #0\n\t"
  33878. "mov %[a], r9\n\t"
  33879. "mov %[b], r10\n\t"
  33880. "ldr %[a], [%[a]]\n\t"
  33881. "ldr %[b], [%[b], #28]\n\t"
  33882. "uxth r6, %[a]\n\t"
  33883. "uxth r7, %[b]\n\t"
  33884. #ifdef WOLFSSL_KEIL
  33885. "muls r7, r6, r7\n\t"
  33886. #elif defined(__clang__)
  33887. "muls r7, r6\n\t"
  33888. #else
  33889. "mul r7, r6\n\t"
  33890. #endif
  33891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33892. "adds r4, r4, r7\n\t"
  33893. #else
  33894. "add r4, r4, r7\n\t"
  33895. #endif
  33896. #ifdef WOLFSSL_KEIL
  33897. "adcs r5, r5, %[r]\n\t"
  33898. #elif defined(__clang__)
  33899. "adcs r5, %[r]\n\t"
  33900. #else
  33901. "adc r5, %[r]\n\t"
  33902. #endif
  33903. #ifdef WOLFSSL_KEIL
  33904. "adcs r3, r3, %[r]\n\t"
  33905. #elif defined(__clang__)
  33906. "adcs r3, %[r]\n\t"
  33907. #else
  33908. "adc r3, %[r]\n\t"
  33909. #endif
  33910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33911. "lsrs r7, %[b], #16\n\t"
  33912. #else
  33913. "lsr r7, %[b], #16\n\t"
  33914. #endif
  33915. #ifdef WOLFSSL_KEIL
  33916. "muls r6, r7, r6\n\t"
  33917. #elif defined(__clang__)
  33918. "muls r6, r7\n\t"
  33919. #else
  33920. "mul r6, r7\n\t"
  33921. #endif
  33922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33923. "lsrs r7, r6, #16\n\t"
  33924. #else
  33925. "lsr r7, r6, #16\n\t"
  33926. #endif
  33927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33928. "lsls r6, r6, #16\n\t"
  33929. #else
  33930. "lsl r6, r6, #16\n\t"
  33931. #endif
  33932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33933. "adds r4, r4, r6\n\t"
  33934. #else
  33935. "add r4, r4, r6\n\t"
  33936. #endif
  33937. #ifdef WOLFSSL_KEIL
  33938. "adcs r5, r5, r7\n\t"
  33939. #elif defined(__clang__)
  33940. "adcs r5, r7\n\t"
  33941. #else
  33942. "adc r5, r7\n\t"
  33943. #endif
  33944. #ifdef WOLFSSL_KEIL
  33945. "adcs r3, r3, %[r]\n\t"
  33946. #elif defined(__clang__)
  33947. "adcs r3, %[r]\n\t"
  33948. #else
  33949. "adc r3, %[r]\n\t"
  33950. #endif
  33951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33952. "lsrs r6, %[a], #16\n\t"
  33953. #else
  33954. "lsr r6, %[a], #16\n\t"
  33955. #endif
  33956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33957. "lsrs r7, %[b], #16\n\t"
  33958. #else
  33959. "lsr r7, %[b], #16\n\t"
  33960. #endif
  33961. #ifdef WOLFSSL_KEIL
  33962. "muls r7, r6, r7\n\t"
  33963. #elif defined(__clang__)
  33964. "muls r7, r6\n\t"
  33965. #else
  33966. "mul r7, r6\n\t"
  33967. #endif
  33968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33969. "adds r5, r5, r7\n\t"
  33970. #else
  33971. "add r5, r5, r7\n\t"
  33972. #endif
  33973. #ifdef WOLFSSL_KEIL
  33974. "adcs r3, r3, %[r]\n\t"
  33975. #elif defined(__clang__)
  33976. "adcs r3, %[r]\n\t"
  33977. #else
  33978. "adc r3, %[r]\n\t"
  33979. #endif
  33980. "uxth r7, %[b]\n\t"
  33981. #ifdef WOLFSSL_KEIL
  33982. "muls r6, r7, r6\n\t"
  33983. #elif defined(__clang__)
  33984. "muls r6, r7\n\t"
  33985. #else
  33986. "mul r6, r7\n\t"
  33987. #endif
  33988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33989. "lsrs r7, r6, #16\n\t"
  33990. #else
  33991. "lsr r7, r6, #16\n\t"
  33992. #endif
  33993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33994. "lsls r6, r6, #16\n\t"
  33995. #else
  33996. "lsl r6, r6, #16\n\t"
  33997. #endif
  33998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33999. "adds r4, r4, r6\n\t"
  34000. #else
  34001. "add r4, r4, r6\n\t"
  34002. #endif
  34003. #ifdef WOLFSSL_KEIL
  34004. "adcs r5, r5, r7\n\t"
  34005. #elif defined(__clang__)
  34006. "adcs r5, r7\n\t"
  34007. #else
  34008. "adc r5, r7\n\t"
  34009. #endif
  34010. #ifdef WOLFSSL_KEIL
  34011. "adcs r3, r3, %[r]\n\t"
  34012. #elif defined(__clang__)
  34013. "adcs r3, %[r]\n\t"
  34014. #else
  34015. "adc r3, %[r]\n\t"
  34016. #endif
  34017. "# A[1] * B[6]\n\t"
  34018. "mov %[a], r9\n\t"
  34019. "mov %[b], r10\n\t"
  34020. "ldr %[a], [%[a], #4]\n\t"
  34021. "ldr %[b], [%[b], #24]\n\t"
  34022. "uxth r6, %[a]\n\t"
  34023. "uxth r7, %[b]\n\t"
  34024. #ifdef WOLFSSL_KEIL
  34025. "muls r7, r6, r7\n\t"
  34026. #elif defined(__clang__)
  34027. "muls r7, r6\n\t"
  34028. #else
  34029. "mul r7, r6\n\t"
  34030. #endif
  34031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34032. "adds r4, r4, r7\n\t"
  34033. #else
  34034. "add r4, r4, r7\n\t"
  34035. #endif
  34036. #ifdef WOLFSSL_KEIL
  34037. "adcs r5, r5, %[r]\n\t"
  34038. #elif defined(__clang__)
  34039. "adcs r5, %[r]\n\t"
  34040. #else
  34041. "adc r5, %[r]\n\t"
  34042. #endif
  34043. #ifdef WOLFSSL_KEIL
  34044. "adcs r3, r3, %[r]\n\t"
  34045. #elif defined(__clang__)
  34046. "adcs r3, %[r]\n\t"
  34047. #else
  34048. "adc r3, %[r]\n\t"
  34049. #endif
  34050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34051. "lsrs r7, %[b], #16\n\t"
  34052. #else
  34053. "lsr r7, %[b], #16\n\t"
  34054. #endif
  34055. #ifdef WOLFSSL_KEIL
  34056. "muls r6, r7, r6\n\t"
  34057. #elif defined(__clang__)
  34058. "muls r6, r7\n\t"
  34059. #else
  34060. "mul r6, r7\n\t"
  34061. #endif
  34062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34063. "lsrs r7, r6, #16\n\t"
  34064. #else
  34065. "lsr r7, r6, #16\n\t"
  34066. #endif
  34067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34068. "lsls r6, r6, #16\n\t"
  34069. #else
  34070. "lsl r6, r6, #16\n\t"
  34071. #endif
  34072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34073. "adds r4, r4, r6\n\t"
  34074. #else
  34075. "add r4, r4, r6\n\t"
  34076. #endif
  34077. #ifdef WOLFSSL_KEIL
  34078. "adcs r5, r5, r7\n\t"
  34079. #elif defined(__clang__)
  34080. "adcs r5, r7\n\t"
  34081. #else
  34082. "adc r5, r7\n\t"
  34083. #endif
  34084. #ifdef WOLFSSL_KEIL
  34085. "adcs r3, r3, %[r]\n\t"
  34086. #elif defined(__clang__)
  34087. "adcs r3, %[r]\n\t"
  34088. #else
  34089. "adc r3, %[r]\n\t"
  34090. #endif
  34091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34092. "lsrs r6, %[a], #16\n\t"
  34093. #else
  34094. "lsr r6, %[a], #16\n\t"
  34095. #endif
  34096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34097. "lsrs r7, %[b], #16\n\t"
  34098. #else
  34099. "lsr r7, %[b], #16\n\t"
  34100. #endif
  34101. #ifdef WOLFSSL_KEIL
  34102. "muls r7, r6, r7\n\t"
  34103. #elif defined(__clang__)
  34104. "muls r7, r6\n\t"
  34105. #else
  34106. "mul r7, r6\n\t"
  34107. #endif
  34108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34109. "adds r5, r5, r7\n\t"
  34110. #else
  34111. "add r5, r5, r7\n\t"
  34112. #endif
  34113. #ifdef WOLFSSL_KEIL
  34114. "adcs r3, r3, %[r]\n\t"
  34115. #elif defined(__clang__)
  34116. "adcs r3, %[r]\n\t"
  34117. #else
  34118. "adc r3, %[r]\n\t"
  34119. #endif
  34120. "uxth r7, %[b]\n\t"
  34121. #ifdef WOLFSSL_KEIL
  34122. "muls r6, r7, r6\n\t"
  34123. #elif defined(__clang__)
  34124. "muls r6, r7\n\t"
  34125. #else
  34126. "mul r6, r7\n\t"
  34127. #endif
  34128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34129. "lsrs r7, r6, #16\n\t"
  34130. #else
  34131. "lsr r7, r6, #16\n\t"
  34132. #endif
  34133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34134. "lsls r6, r6, #16\n\t"
  34135. #else
  34136. "lsl r6, r6, #16\n\t"
  34137. #endif
  34138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34139. "adds r4, r4, r6\n\t"
  34140. #else
  34141. "add r4, r4, r6\n\t"
  34142. #endif
  34143. #ifdef WOLFSSL_KEIL
  34144. "adcs r5, r5, r7\n\t"
  34145. #elif defined(__clang__)
  34146. "adcs r5, r7\n\t"
  34147. #else
  34148. "adc r5, r7\n\t"
  34149. #endif
  34150. #ifdef WOLFSSL_KEIL
  34151. "adcs r3, r3, %[r]\n\t"
  34152. #elif defined(__clang__)
  34153. "adcs r3, %[r]\n\t"
  34154. #else
  34155. "adc r3, %[r]\n\t"
  34156. #endif
  34157. "# A[2] * B[5]\n\t"
  34158. "mov %[a], r9\n\t"
  34159. "mov %[b], r10\n\t"
  34160. "ldr %[a], [%[a], #8]\n\t"
  34161. "ldr %[b], [%[b], #20]\n\t"
  34162. "uxth r6, %[a]\n\t"
  34163. "uxth r7, %[b]\n\t"
  34164. #ifdef WOLFSSL_KEIL
  34165. "muls r7, r6, r7\n\t"
  34166. #elif defined(__clang__)
  34167. "muls r7, r6\n\t"
  34168. #else
  34169. "mul r7, r6\n\t"
  34170. #endif
  34171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34172. "adds r4, r4, r7\n\t"
  34173. #else
  34174. "add r4, r4, r7\n\t"
  34175. #endif
  34176. #ifdef WOLFSSL_KEIL
  34177. "adcs r5, r5, %[r]\n\t"
  34178. #elif defined(__clang__)
  34179. "adcs r5, %[r]\n\t"
  34180. #else
  34181. "adc r5, %[r]\n\t"
  34182. #endif
  34183. #ifdef WOLFSSL_KEIL
  34184. "adcs r3, r3, %[r]\n\t"
  34185. #elif defined(__clang__)
  34186. "adcs r3, %[r]\n\t"
  34187. #else
  34188. "adc r3, %[r]\n\t"
  34189. #endif
  34190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34191. "lsrs r7, %[b], #16\n\t"
  34192. #else
  34193. "lsr r7, %[b], #16\n\t"
  34194. #endif
  34195. #ifdef WOLFSSL_KEIL
  34196. "muls r6, r7, r6\n\t"
  34197. #elif defined(__clang__)
  34198. "muls r6, r7\n\t"
  34199. #else
  34200. "mul r6, r7\n\t"
  34201. #endif
  34202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34203. "lsrs r7, r6, #16\n\t"
  34204. #else
  34205. "lsr r7, r6, #16\n\t"
  34206. #endif
  34207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34208. "lsls r6, r6, #16\n\t"
  34209. #else
  34210. "lsl r6, r6, #16\n\t"
  34211. #endif
  34212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34213. "adds r4, r4, r6\n\t"
  34214. #else
  34215. "add r4, r4, r6\n\t"
  34216. #endif
  34217. #ifdef WOLFSSL_KEIL
  34218. "adcs r5, r5, r7\n\t"
  34219. #elif defined(__clang__)
  34220. "adcs r5, r7\n\t"
  34221. #else
  34222. "adc r5, r7\n\t"
  34223. #endif
  34224. #ifdef WOLFSSL_KEIL
  34225. "adcs r3, r3, %[r]\n\t"
  34226. #elif defined(__clang__)
  34227. "adcs r3, %[r]\n\t"
  34228. #else
  34229. "adc r3, %[r]\n\t"
  34230. #endif
  34231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34232. "lsrs r6, %[a], #16\n\t"
  34233. #else
  34234. "lsr r6, %[a], #16\n\t"
  34235. #endif
  34236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34237. "lsrs r7, %[b], #16\n\t"
  34238. #else
  34239. "lsr r7, %[b], #16\n\t"
  34240. #endif
  34241. #ifdef WOLFSSL_KEIL
  34242. "muls r7, r6, r7\n\t"
  34243. #elif defined(__clang__)
  34244. "muls r7, r6\n\t"
  34245. #else
  34246. "mul r7, r6\n\t"
  34247. #endif
  34248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34249. "adds r5, r5, r7\n\t"
  34250. #else
  34251. "add r5, r5, r7\n\t"
  34252. #endif
  34253. #ifdef WOLFSSL_KEIL
  34254. "adcs r3, r3, %[r]\n\t"
  34255. #elif defined(__clang__)
  34256. "adcs r3, %[r]\n\t"
  34257. #else
  34258. "adc r3, %[r]\n\t"
  34259. #endif
  34260. "uxth r7, %[b]\n\t"
  34261. #ifdef WOLFSSL_KEIL
  34262. "muls r6, r7, r6\n\t"
  34263. #elif defined(__clang__)
  34264. "muls r6, r7\n\t"
  34265. #else
  34266. "mul r6, r7\n\t"
  34267. #endif
  34268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34269. "lsrs r7, r6, #16\n\t"
  34270. #else
  34271. "lsr r7, r6, #16\n\t"
  34272. #endif
  34273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34274. "lsls r6, r6, #16\n\t"
  34275. #else
  34276. "lsl r6, r6, #16\n\t"
  34277. #endif
  34278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34279. "adds r4, r4, r6\n\t"
  34280. #else
  34281. "add r4, r4, r6\n\t"
  34282. #endif
  34283. #ifdef WOLFSSL_KEIL
  34284. "adcs r5, r5, r7\n\t"
  34285. #elif defined(__clang__)
  34286. "adcs r5, r7\n\t"
  34287. #else
  34288. "adc r5, r7\n\t"
  34289. #endif
  34290. #ifdef WOLFSSL_KEIL
  34291. "adcs r3, r3, %[r]\n\t"
  34292. #elif defined(__clang__)
  34293. "adcs r3, %[r]\n\t"
  34294. #else
  34295. "adc r3, %[r]\n\t"
  34296. #endif
  34297. "# A[3] * B[4]\n\t"
  34298. "mov %[a], r9\n\t"
  34299. "mov %[b], r10\n\t"
  34300. "ldr %[a], [%[a], #12]\n\t"
  34301. "ldr %[b], [%[b], #16]\n\t"
  34302. "uxth r6, %[a]\n\t"
  34303. "uxth r7, %[b]\n\t"
  34304. #ifdef WOLFSSL_KEIL
  34305. "muls r7, r6, r7\n\t"
  34306. #elif defined(__clang__)
  34307. "muls r7, r6\n\t"
  34308. #else
  34309. "mul r7, r6\n\t"
  34310. #endif
  34311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34312. "adds r4, r4, r7\n\t"
  34313. #else
  34314. "add r4, r4, r7\n\t"
  34315. #endif
  34316. #ifdef WOLFSSL_KEIL
  34317. "adcs r5, r5, %[r]\n\t"
  34318. #elif defined(__clang__)
  34319. "adcs r5, %[r]\n\t"
  34320. #else
  34321. "adc r5, %[r]\n\t"
  34322. #endif
  34323. #ifdef WOLFSSL_KEIL
  34324. "adcs r3, r3, %[r]\n\t"
  34325. #elif defined(__clang__)
  34326. "adcs r3, %[r]\n\t"
  34327. #else
  34328. "adc r3, %[r]\n\t"
  34329. #endif
  34330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34331. "lsrs r7, %[b], #16\n\t"
  34332. #else
  34333. "lsr r7, %[b], #16\n\t"
  34334. #endif
  34335. #ifdef WOLFSSL_KEIL
  34336. "muls r6, r7, r6\n\t"
  34337. #elif defined(__clang__)
  34338. "muls r6, r7\n\t"
  34339. #else
  34340. "mul r6, r7\n\t"
  34341. #endif
  34342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34343. "lsrs r7, r6, #16\n\t"
  34344. #else
  34345. "lsr r7, r6, #16\n\t"
  34346. #endif
  34347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34348. "lsls r6, r6, #16\n\t"
  34349. #else
  34350. "lsl r6, r6, #16\n\t"
  34351. #endif
  34352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34353. "adds r4, r4, r6\n\t"
  34354. #else
  34355. "add r4, r4, r6\n\t"
  34356. #endif
  34357. #ifdef WOLFSSL_KEIL
  34358. "adcs r5, r5, r7\n\t"
  34359. #elif defined(__clang__)
  34360. "adcs r5, r7\n\t"
  34361. #else
  34362. "adc r5, r7\n\t"
  34363. #endif
  34364. #ifdef WOLFSSL_KEIL
  34365. "adcs r3, r3, %[r]\n\t"
  34366. #elif defined(__clang__)
  34367. "adcs r3, %[r]\n\t"
  34368. #else
  34369. "adc r3, %[r]\n\t"
  34370. #endif
  34371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34372. "lsrs r6, %[a], #16\n\t"
  34373. #else
  34374. "lsr r6, %[a], #16\n\t"
  34375. #endif
  34376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34377. "lsrs r7, %[b], #16\n\t"
  34378. #else
  34379. "lsr r7, %[b], #16\n\t"
  34380. #endif
  34381. #ifdef WOLFSSL_KEIL
  34382. "muls r7, r6, r7\n\t"
  34383. #elif defined(__clang__)
  34384. "muls r7, r6\n\t"
  34385. #else
  34386. "mul r7, r6\n\t"
  34387. #endif
  34388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34389. "adds r5, r5, r7\n\t"
  34390. #else
  34391. "add r5, r5, r7\n\t"
  34392. #endif
  34393. #ifdef WOLFSSL_KEIL
  34394. "adcs r3, r3, %[r]\n\t"
  34395. #elif defined(__clang__)
  34396. "adcs r3, %[r]\n\t"
  34397. #else
  34398. "adc r3, %[r]\n\t"
  34399. #endif
  34400. "uxth r7, %[b]\n\t"
  34401. #ifdef WOLFSSL_KEIL
  34402. "muls r6, r7, r6\n\t"
  34403. #elif defined(__clang__)
  34404. "muls r6, r7\n\t"
  34405. #else
  34406. "mul r6, r7\n\t"
  34407. #endif
  34408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34409. "lsrs r7, r6, #16\n\t"
  34410. #else
  34411. "lsr r7, r6, #16\n\t"
  34412. #endif
  34413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34414. "lsls r6, r6, #16\n\t"
  34415. #else
  34416. "lsl r6, r6, #16\n\t"
  34417. #endif
  34418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34419. "adds r4, r4, r6\n\t"
  34420. #else
  34421. "add r4, r4, r6\n\t"
  34422. #endif
  34423. #ifdef WOLFSSL_KEIL
  34424. "adcs r5, r5, r7\n\t"
  34425. #elif defined(__clang__)
  34426. "adcs r5, r7\n\t"
  34427. #else
  34428. "adc r5, r7\n\t"
  34429. #endif
  34430. #ifdef WOLFSSL_KEIL
  34431. "adcs r3, r3, %[r]\n\t"
  34432. #elif defined(__clang__)
  34433. "adcs r3, %[r]\n\t"
  34434. #else
  34435. "adc r3, %[r]\n\t"
  34436. #endif
  34437. "# A[4] * B[3]\n\t"
  34438. "mov %[a], r9\n\t"
  34439. "mov %[b], r10\n\t"
  34440. "ldr %[a], [%[a], #16]\n\t"
  34441. "ldr %[b], [%[b], #12]\n\t"
  34442. "uxth r6, %[a]\n\t"
  34443. "uxth r7, %[b]\n\t"
  34444. #ifdef WOLFSSL_KEIL
  34445. "muls r7, r6, r7\n\t"
  34446. #elif defined(__clang__)
  34447. "muls r7, r6\n\t"
  34448. #else
  34449. "mul r7, r6\n\t"
  34450. #endif
  34451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34452. "adds r4, r4, r7\n\t"
  34453. #else
  34454. "add r4, r4, r7\n\t"
  34455. #endif
  34456. #ifdef WOLFSSL_KEIL
  34457. "adcs r5, r5, %[r]\n\t"
  34458. #elif defined(__clang__)
  34459. "adcs r5, %[r]\n\t"
  34460. #else
  34461. "adc r5, %[r]\n\t"
  34462. #endif
  34463. #ifdef WOLFSSL_KEIL
  34464. "adcs r3, r3, %[r]\n\t"
  34465. #elif defined(__clang__)
  34466. "adcs r3, %[r]\n\t"
  34467. #else
  34468. "adc r3, %[r]\n\t"
  34469. #endif
  34470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34471. "lsrs r7, %[b], #16\n\t"
  34472. #else
  34473. "lsr r7, %[b], #16\n\t"
  34474. #endif
  34475. #ifdef WOLFSSL_KEIL
  34476. "muls r6, r7, r6\n\t"
  34477. #elif defined(__clang__)
  34478. "muls r6, r7\n\t"
  34479. #else
  34480. "mul r6, r7\n\t"
  34481. #endif
  34482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34483. "lsrs r7, r6, #16\n\t"
  34484. #else
  34485. "lsr r7, r6, #16\n\t"
  34486. #endif
  34487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34488. "lsls r6, r6, #16\n\t"
  34489. #else
  34490. "lsl r6, r6, #16\n\t"
  34491. #endif
  34492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34493. "adds r4, r4, r6\n\t"
  34494. #else
  34495. "add r4, r4, r6\n\t"
  34496. #endif
  34497. #ifdef WOLFSSL_KEIL
  34498. "adcs r5, r5, r7\n\t"
  34499. #elif defined(__clang__)
  34500. "adcs r5, r7\n\t"
  34501. #else
  34502. "adc r5, r7\n\t"
  34503. #endif
  34504. #ifdef WOLFSSL_KEIL
  34505. "adcs r3, r3, %[r]\n\t"
  34506. #elif defined(__clang__)
  34507. "adcs r3, %[r]\n\t"
  34508. #else
  34509. "adc r3, %[r]\n\t"
  34510. #endif
  34511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34512. "lsrs r6, %[a], #16\n\t"
  34513. #else
  34514. "lsr r6, %[a], #16\n\t"
  34515. #endif
  34516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34517. "lsrs r7, %[b], #16\n\t"
  34518. #else
  34519. "lsr r7, %[b], #16\n\t"
  34520. #endif
  34521. #ifdef WOLFSSL_KEIL
  34522. "muls r7, r6, r7\n\t"
  34523. #elif defined(__clang__)
  34524. "muls r7, r6\n\t"
  34525. #else
  34526. "mul r7, r6\n\t"
  34527. #endif
  34528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34529. "adds r5, r5, r7\n\t"
  34530. #else
  34531. "add r5, r5, r7\n\t"
  34532. #endif
  34533. #ifdef WOLFSSL_KEIL
  34534. "adcs r3, r3, %[r]\n\t"
  34535. #elif defined(__clang__)
  34536. "adcs r3, %[r]\n\t"
  34537. #else
  34538. "adc r3, %[r]\n\t"
  34539. #endif
  34540. "uxth r7, %[b]\n\t"
  34541. #ifdef WOLFSSL_KEIL
  34542. "muls r6, r7, r6\n\t"
  34543. #elif defined(__clang__)
  34544. "muls r6, r7\n\t"
  34545. #else
  34546. "mul r6, r7\n\t"
  34547. #endif
  34548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34549. "lsrs r7, r6, #16\n\t"
  34550. #else
  34551. "lsr r7, r6, #16\n\t"
  34552. #endif
  34553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34554. "lsls r6, r6, #16\n\t"
  34555. #else
  34556. "lsl r6, r6, #16\n\t"
  34557. #endif
  34558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34559. "adds r4, r4, r6\n\t"
  34560. #else
  34561. "add r4, r4, r6\n\t"
  34562. #endif
  34563. #ifdef WOLFSSL_KEIL
  34564. "adcs r5, r5, r7\n\t"
  34565. #elif defined(__clang__)
  34566. "adcs r5, r7\n\t"
  34567. #else
  34568. "adc r5, r7\n\t"
  34569. #endif
  34570. #ifdef WOLFSSL_KEIL
  34571. "adcs r3, r3, %[r]\n\t"
  34572. #elif defined(__clang__)
  34573. "adcs r3, %[r]\n\t"
  34574. #else
  34575. "adc r3, %[r]\n\t"
  34576. #endif
  34577. "# A[5] * B[2]\n\t"
  34578. "mov %[a], r9\n\t"
  34579. "mov %[b], r10\n\t"
  34580. "ldr %[a], [%[a], #20]\n\t"
  34581. "ldr %[b], [%[b], #8]\n\t"
  34582. "uxth r6, %[a]\n\t"
  34583. "uxth r7, %[b]\n\t"
  34584. #ifdef WOLFSSL_KEIL
  34585. "muls r7, r6, r7\n\t"
  34586. #elif defined(__clang__)
  34587. "muls r7, r6\n\t"
  34588. #else
  34589. "mul r7, r6\n\t"
  34590. #endif
  34591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34592. "adds r4, r4, r7\n\t"
  34593. #else
  34594. "add r4, r4, r7\n\t"
  34595. #endif
  34596. #ifdef WOLFSSL_KEIL
  34597. "adcs r5, r5, %[r]\n\t"
  34598. #elif defined(__clang__)
  34599. "adcs r5, %[r]\n\t"
  34600. #else
  34601. "adc r5, %[r]\n\t"
  34602. #endif
  34603. #ifdef WOLFSSL_KEIL
  34604. "adcs r3, r3, %[r]\n\t"
  34605. #elif defined(__clang__)
  34606. "adcs r3, %[r]\n\t"
  34607. #else
  34608. "adc r3, %[r]\n\t"
  34609. #endif
  34610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34611. "lsrs r7, %[b], #16\n\t"
  34612. #else
  34613. "lsr r7, %[b], #16\n\t"
  34614. #endif
  34615. #ifdef WOLFSSL_KEIL
  34616. "muls r6, r7, r6\n\t"
  34617. #elif defined(__clang__)
  34618. "muls r6, r7\n\t"
  34619. #else
  34620. "mul r6, r7\n\t"
  34621. #endif
  34622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34623. "lsrs r7, r6, #16\n\t"
  34624. #else
  34625. "lsr r7, r6, #16\n\t"
  34626. #endif
  34627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34628. "lsls r6, r6, #16\n\t"
  34629. #else
  34630. "lsl r6, r6, #16\n\t"
  34631. #endif
  34632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34633. "adds r4, r4, r6\n\t"
  34634. #else
  34635. "add r4, r4, r6\n\t"
  34636. #endif
  34637. #ifdef WOLFSSL_KEIL
  34638. "adcs r5, r5, r7\n\t"
  34639. #elif defined(__clang__)
  34640. "adcs r5, r7\n\t"
  34641. #else
  34642. "adc r5, r7\n\t"
  34643. #endif
  34644. #ifdef WOLFSSL_KEIL
  34645. "adcs r3, r3, %[r]\n\t"
  34646. #elif defined(__clang__)
  34647. "adcs r3, %[r]\n\t"
  34648. #else
  34649. "adc r3, %[r]\n\t"
  34650. #endif
  34651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34652. "lsrs r6, %[a], #16\n\t"
  34653. #else
  34654. "lsr r6, %[a], #16\n\t"
  34655. #endif
  34656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34657. "lsrs r7, %[b], #16\n\t"
  34658. #else
  34659. "lsr r7, %[b], #16\n\t"
  34660. #endif
  34661. #ifdef WOLFSSL_KEIL
  34662. "muls r7, r6, r7\n\t"
  34663. #elif defined(__clang__)
  34664. "muls r7, r6\n\t"
  34665. #else
  34666. "mul r7, r6\n\t"
  34667. #endif
  34668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34669. "adds r5, r5, r7\n\t"
  34670. #else
  34671. "add r5, r5, r7\n\t"
  34672. #endif
  34673. #ifdef WOLFSSL_KEIL
  34674. "adcs r3, r3, %[r]\n\t"
  34675. #elif defined(__clang__)
  34676. "adcs r3, %[r]\n\t"
  34677. #else
  34678. "adc r3, %[r]\n\t"
  34679. #endif
  34680. "uxth r7, %[b]\n\t"
  34681. #ifdef WOLFSSL_KEIL
  34682. "muls r6, r7, r6\n\t"
  34683. #elif defined(__clang__)
  34684. "muls r6, r7\n\t"
  34685. #else
  34686. "mul r6, r7\n\t"
  34687. #endif
  34688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34689. "lsrs r7, r6, #16\n\t"
  34690. #else
  34691. "lsr r7, r6, #16\n\t"
  34692. #endif
  34693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34694. "lsls r6, r6, #16\n\t"
  34695. #else
  34696. "lsl r6, r6, #16\n\t"
  34697. #endif
  34698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34699. "adds r4, r4, r6\n\t"
  34700. #else
  34701. "add r4, r4, r6\n\t"
  34702. #endif
  34703. #ifdef WOLFSSL_KEIL
  34704. "adcs r5, r5, r7\n\t"
  34705. #elif defined(__clang__)
  34706. "adcs r5, r7\n\t"
  34707. #else
  34708. "adc r5, r7\n\t"
  34709. #endif
  34710. #ifdef WOLFSSL_KEIL
  34711. "adcs r3, r3, %[r]\n\t"
  34712. #elif defined(__clang__)
  34713. "adcs r3, %[r]\n\t"
  34714. #else
  34715. "adc r3, %[r]\n\t"
  34716. #endif
  34717. "# A[6] * B[1]\n\t"
  34718. "mov %[a], r9\n\t"
  34719. "mov %[b], r10\n\t"
  34720. "ldr %[a], [%[a], #24]\n\t"
  34721. "ldr %[b], [%[b], #4]\n\t"
  34722. "uxth r6, %[a]\n\t"
  34723. "uxth r7, %[b]\n\t"
  34724. #ifdef WOLFSSL_KEIL
  34725. "muls r7, r6, r7\n\t"
  34726. #elif defined(__clang__)
  34727. "muls r7, r6\n\t"
  34728. #else
  34729. "mul r7, r6\n\t"
  34730. #endif
  34731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34732. "adds r4, r4, r7\n\t"
  34733. #else
  34734. "add r4, r4, r7\n\t"
  34735. #endif
  34736. #ifdef WOLFSSL_KEIL
  34737. "adcs r5, r5, %[r]\n\t"
  34738. #elif defined(__clang__)
  34739. "adcs r5, %[r]\n\t"
  34740. #else
  34741. "adc r5, %[r]\n\t"
  34742. #endif
  34743. #ifdef WOLFSSL_KEIL
  34744. "adcs r3, r3, %[r]\n\t"
  34745. #elif defined(__clang__)
  34746. "adcs r3, %[r]\n\t"
  34747. #else
  34748. "adc r3, %[r]\n\t"
  34749. #endif
  34750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34751. "lsrs r7, %[b], #16\n\t"
  34752. #else
  34753. "lsr r7, %[b], #16\n\t"
  34754. #endif
  34755. #ifdef WOLFSSL_KEIL
  34756. "muls r6, r7, r6\n\t"
  34757. #elif defined(__clang__)
  34758. "muls r6, r7\n\t"
  34759. #else
  34760. "mul r6, r7\n\t"
  34761. #endif
  34762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34763. "lsrs r7, r6, #16\n\t"
  34764. #else
  34765. "lsr r7, r6, #16\n\t"
  34766. #endif
  34767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34768. "lsls r6, r6, #16\n\t"
  34769. #else
  34770. "lsl r6, r6, #16\n\t"
  34771. #endif
  34772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34773. "adds r4, r4, r6\n\t"
  34774. #else
  34775. "add r4, r4, r6\n\t"
  34776. #endif
  34777. #ifdef WOLFSSL_KEIL
  34778. "adcs r5, r5, r7\n\t"
  34779. #elif defined(__clang__)
  34780. "adcs r5, r7\n\t"
  34781. #else
  34782. "adc r5, r7\n\t"
  34783. #endif
  34784. #ifdef WOLFSSL_KEIL
  34785. "adcs r3, r3, %[r]\n\t"
  34786. #elif defined(__clang__)
  34787. "adcs r3, %[r]\n\t"
  34788. #else
  34789. "adc r3, %[r]\n\t"
  34790. #endif
  34791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34792. "lsrs r6, %[a], #16\n\t"
  34793. #else
  34794. "lsr r6, %[a], #16\n\t"
  34795. #endif
  34796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34797. "lsrs r7, %[b], #16\n\t"
  34798. #else
  34799. "lsr r7, %[b], #16\n\t"
  34800. #endif
  34801. #ifdef WOLFSSL_KEIL
  34802. "muls r7, r6, r7\n\t"
  34803. #elif defined(__clang__)
  34804. "muls r7, r6\n\t"
  34805. #else
  34806. "mul r7, r6\n\t"
  34807. #endif
  34808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34809. "adds r5, r5, r7\n\t"
  34810. #else
  34811. "add r5, r5, r7\n\t"
  34812. #endif
  34813. #ifdef WOLFSSL_KEIL
  34814. "adcs r3, r3, %[r]\n\t"
  34815. #elif defined(__clang__)
  34816. "adcs r3, %[r]\n\t"
  34817. #else
  34818. "adc r3, %[r]\n\t"
  34819. #endif
  34820. "uxth r7, %[b]\n\t"
  34821. #ifdef WOLFSSL_KEIL
  34822. "muls r6, r7, r6\n\t"
  34823. #elif defined(__clang__)
  34824. "muls r6, r7\n\t"
  34825. #else
  34826. "mul r6, r7\n\t"
  34827. #endif
  34828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34829. "lsrs r7, r6, #16\n\t"
  34830. #else
  34831. "lsr r7, r6, #16\n\t"
  34832. #endif
  34833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34834. "lsls r6, r6, #16\n\t"
  34835. #else
  34836. "lsl r6, r6, #16\n\t"
  34837. #endif
  34838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34839. "adds r4, r4, r6\n\t"
  34840. #else
  34841. "add r4, r4, r6\n\t"
  34842. #endif
  34843. #ifdef WOLFSSL_KEIL
  34844. "adcs r5, r5, r7\n\t"
  34845. #elif defined(__clang__)
  34846. "adcs r5, r7\n\t"
  34847. #else
  34848. "adc r5, r7\n\t"
  34849. #endif
  34850. #ifdef WOLFSSL_KEIL
  34851. "adcs r3, r3, %[r]\n\t"
  34852. #elif defined(__clang__)
  34853. "adcs r3, %[r]\n\t"
  34854. #else
  34855. "adc r3, %[r]\n\t"
  34856. #endif
  34857. "# A[7] * B[0]\n\t"
  34858. "mov %[a], r9\n\t"
  34859. "mov %[b], r10\n\t"
  34860. "ldr %[a], [%[a], #28]\n\t"
  34861. "ldr %[b], [%[b]]\n\t"
  34862. "uxth r6, %[a]\n\t"
  34863. "uxth r7, %[b]\n\t"
  34864. #ifdef WOLFSSL_KEIL
  34865. "muls r7, r6, r7\n\t"
  34866. #elif defined(__clang__)
  34867. "muls r7, r6\n\t"
  34868. #else
  34869. "mul r7, r6\n\t"
  34870. #endif
  34871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34872. "adds r4, r4, r7\n\t"
  34873. #else
  34874. "add r4, r4, r7\n\t"
  34875. #endif
  34876. #ifdef WOLFSSL_KEIL
  34877. "adcs r5, r5, %[r]\n\t"
  34878. #elif defined(__clang__)
  34879. "adcs r5, %[r]\n\t"
  34880. #else
  34881. "adc r5, %[r]\n\t"
  34882. #endif
  34883. #ifdef WOLFSSL_KEIL
  34884. "adcs r3, r3, %[r]\n\t"
  34885. #elif defined(__clang__)
  34886. "adcs r3, %[r]\n\t"
  34887. #else
  34888. "adc r3, %[r]\n\t"
  34889. #endif
  34890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34891. "lsrs r7, %[b], #16\n\t"
  34892. #else
  34893. "lsr r7, %[b], #16\n\t"
  34894. #endif
  34895. #ifdef WOLFSSL_KEIL
  34896. "muls r6, r7, r6\n\t"
  34897. #elif defined(__clang__)
  34898. "muls r6, r7\n\t"
  34899. #else
  34900. "mul r6, r7\n\t"
  34901. #endif
  34902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34903. "lsrs r7, r6, #16\n\t"
  34904. #else
  34905. "lsr r7, r6, #16\n\t"
  34906. #endif
  34907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34908. "lsls r6, r6, #16\n\t"
  34909. #else
  34910. "lsl r6, r6, #16\n\t"
  34911. #endif
  34912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34913. "adds r4, r4, r6\n\t"
  34914. #else
  34915. "add r4, r4, r6\n\t"
  34916. #endif
  34917. #ifdef WOLFSSL_KEIL
  34918. "adcs r5, r5, r7\n\t"
  34919. #elif defined(__clang__)
  34920. "adcs r5, r7\n\t"
  34921. #else
  34922. "adc r5, r7\n\t"
  34923. #endif
  34924. #ifdef WOLFSSL_KEIL
  34925. "adcs r3, r3, %[r]\n\t"
  34926. #elif defined(__clang__)
  34927. "adcs r3, %[r]\n\t"
  34928. #else
  34929. "adc r3, %[r]\n\t"
  34930. #endif
  34931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34932. "lsrs r6, %[a], #16\n\t"
  34933. #else
  34934. "lsr r6, %[a], #16\n\t"
  34935. #endif
  34936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34937. "lsrs r7, %[b], #16\n\t"
  34938. #else
  34939. "lsr r7, %[b], #16\n\t"
  34940. #endif
  34941. #ifdef WOLFSSL_KEIL
  34942. "muls r7, r6, r7\n\t"
  34943. #elif defined(__clang__)
  34944. "muls r7, r6\n\t"
  34945. #else
  34946. "mul r7, r6\n\t"
  34947. #endif
  34948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34949. "adds r5, r5, r7\n\t"
  34950. #else
  34951. "add r5, r5, r7\n\t"
  34952. #endif
  34953. #ifdef WOLFSSL_KEIL
  34954. "adcs r3, r3, %[r]\n\t"
  34955. #elif defined(__clang__)
  34956. "adcs r3, %[r]\n\t"
  34957. #else
  34958. "adc r3, %[r]\n\t"
  34959. #endif
  34960. "uxth r7, %[b]\n\t"
  34961. #ifdef WOLFSSL_KEIL
  34962. "muls r6, r7, r6\n\t"
  34963. #elif defined(__clang__)
  34964. "muls r6, r7\n\t"
  34965. #else
  34966. "mul r6, r7\n\t"
  34967. #endif
  34968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34969. "lsrs r7, r6, #16\n\t"
  34970. #else
  34971. "lsr r7, r6, #16\n\t"
  34972. #endif
  34973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34974. "lsls r6, r6, #16\n\t"
  34975. #else
  34976. "lsl r6, r6, #16\n\t"
  34977. #endif
  34978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34979. "adds r4, r4, r6\n\t"
  34980. #else
  34981. "add r4, r4, r6\n\t"
  34982. #endif
  34983. #ifdef WOLFSSL_KEIL
  34984. "adcs r5, r5, r7\n\t"
  34985. #elif defined(__clang__)
  34986. "adcs r5, r7\n\t"
  34987. #else
  34988. "adc r5, r7\n\t"
  34989. #endif
  34990. #ifdef WOLFSSL_KEIL
  34991. "adcs r3, r3, %[r]\n\t"
  34992. #elif defined(__clang__)
  34993. "adcs r3, %[r]\n\t"
  34994. #else
  34995. "adc r3, %[r]\n\t"
  34996. #endif
  34997. "str r4, [sp, #28]\n\t"
  34998. "# A[8] * B[0]\n\t"
  34999. "movs r4, #0\n\t"
  35000. "mov %[a], r9\n\t"
  35001. "mov %[b], r10\n\t"
  35002. "ldr %[a], [%[a], #32]\n\t"
  35003. "ldr %[b], [%[b]]\n\t"
  35004. "uxth r6, %[a]\n\t"
  35005. "uxth r7, %[b]\n\t"
  35006. #ifdef WOLFSSL_KEIL
  35007. "muls r7, r6, r7\n\t"
  35008. #elif defined(__clang__)
  35009. "muls r7, r6\n\t"
  35010. #else
  35011. "mul r7, r6\n\t"
  35012. #endif
  35013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35014. "adds r5, r5, r7\n\t"
  35015. #else
  35016. "add r5, r5, r7\n\t"
  35017. #endif
  35018. #ifdef WOLFSSL_KEIL
  35019. "adcs r3, r3, %[r]\n\t"
  35020. #elif defined(__clang__)
  35021. "adcs r3, %[r]\n\t"
  35022. #else
  35023. "adc r3, %[r]\n\t"
  35024. #endif
  35025. #ifdef WOLFSSL_KEIL
  35026. "adcs r4, r4, %[r]\n\t"
  35027. #elif defined(__clang__)
  35028. "adcs r4, %[r]\n\t"
  35029. #else
  35030. "adc r4, %[r]\n\t"
  35031. #endif
  35032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35033. "lsrs r7, %[b], #16\n\t"
  35034. #else
  35035. "lsr r7, %[b], #16\n\t"
  35036. #endif
  35037. #ifdef WOLFSSL_KEIL
  35038. "muls r6, r7, r6\n\t"
  35039. #elif defined(__clang__)
  35040. "muls r6, r7\n\t"
  35041. #else
  35042. "mul r6, r7\n\t"
  35043. #endif
  35044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35045. "lsrs r7, r6, #16\n\t"
  35046. #else
  35047. "lsr r7, r6, #16\n\t"
  35048. #endif
  35049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35050. "lsls r6, r6, #16\n\t"
  35051. #else
  35052. "lsl r6, r6, #16\n\t"
  35053. #endif
  35054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35055. "adds r5, r5, r6\n\t"
  35056. #else
  35057. "add r5, r5, r6\n\t"
  35058. #endif
  35059. #ifdef WOLFSSL_KEIL
  35060. "adcs r3, r3, r7\n\t"
  35061. #elif defined(__clang__)
  35062. "adcs r3, r7\n\t"
  35063. #else
  35064. "adc r3, r7\n\t"
  35065. #endif
  35066. #ifdef WOLFSSL_KEIL
  35067. "adcs r4, r4, %[r]\n\t"
  35068. #elif defined(__clang__)
  35069. "adcs r4, %[r]\n\t"
  35070. #else
  35071. "adc r4, %[r]\n\t"
  35072. #endif
  35073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35074. "lsrs r6, %[a], #16\n\t"
  35075. #else
  35076. "lsr r6, %[a], #16\n\t"
  35077. #endif
  35078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35079. "lsrs r7, %[b], #16\n\t"
  35080. #else
  35081. "lsr r7, %[b], #16\n\t"
  35082. #endif
  35083. #ifdef WOLFSSL_KEIL
  35084. "muls r7, r6, r7\n\t"
  35085. #elif defined(__clang__)
  35086. "muls r7, r6\n\t"
  35087. #else
  35088. "mul r7, r6\n\t"
  35089. #endif
  35090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35091. "adds r3, r3, r7\n\t"
  35092. #else
  35093. "add r3, r3, r7\n\t"
  35094. #endif
  35095. #ifdef WOLFSSL_KEIL
  35096. "adcs r4, r4, %[r]\n\t"
  35097. #elif defined(__clang__)
  35098. "adcs r4, %[r]\n\t"
  35099. #else
  35100. "adc r4, %[r]\n\t"
  35101. #endif
  35102. "uxth r7, %[b]\n\t"
  35103. #ifdef WOLFSSL_KEIL
  35104. "muls r6, r7, r6\n\t"
  35105. #elif defined(__clang__)
  35106. "muls r6, r7\n\t"
  35107. #else
  35108. "mul r6, r7\n\t"
  35109. #endif
  35110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35111. "lsrs r7, r6, #16\n\t"
  35112. #else
  35113. "lsr r7, r6, #16\n\t"
  35114. #endif
  35115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35116. "lsls r6, r6, #16\n\t"
  35117. #else
  35118. "lsl r6, r6, #16\n\t"
  35119. #endif
  35120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35121. "adds r5, r5, r6\n\t"
  35122. #else
  35123. "add r5, r5, r6\n\t"
  35124. #endif
  35125. #ifdef WOLFSSL_KEIL
  35126. "adcs r3, r3, r7\n\t"
  35127. #elif defined(__clang__)
  35128. "adcs r3, r7\n\t"
  35129. #else
  35130. "adc r3, r7\n\t"
  35131. #endif
  35132. #ifdef WOLFSSL_KEIL
  35133. "adcs r4, r4, %[r]\n\t"
  35134. #elif defined(__clang__)
  35135. "adcs r4, %[r]\n\t"
  35136. #else
  35137. "adc r4, %[r]\n\t"
  35138. #endif
  35139. "# A[7] * B[1]\n\t"
  35140. "mov %[a], r9\n\t"
  35141. "mov %[b], r10\n\t"
  35142. "ldr %[a], [%[a], #28]\n\t"
  35143. "ldr %[b], [%[b], #4]\n\t"
  35144. "uxth r6, %[a]\n\t"
  35145. "uxth r7, %[b]\n\t"
  35146. #ifdef WOLFSSL_KEIL
  35147. "muls r7, r6, r7\n\t"
  35148. #elif defined(__clang__)
  35149. "muls r7, r6\n\t"
  35150. #else
  35151. "mul r7, r6\n\t"
  35152. #endif
  35153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35154. "adds r5, r5, r7\n\t"
  35155. #else
  35156. "add r5, r5, r7\n\t"
  35157. #endif
  35158. #ifdef WOLFSSL_KEIL
  35159. "adcs r3, r3, %[r]\n\t"
  35160. #elif defined(__clang__)
  35161. "adcs r3, %[r]\n\t"
  35162. #else
  35163. "adc r3, %[r]\n\t"
  35164. #endif
  35165. #ifdef WOLFSSL_KEIL
  35166. "adcs r4, r4, %[r]\n\t"
  35167. #elif defined(__clang__)
  35168. "adcs r4, %[r]\n\t"
  35169. #else
  35170. "adc r4, %[r]\n\t"
  35171. #endif
  35172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35173. "lsrs r7, %[b], #16\n\t"
  35174. #else
  35175. "lsr r7, %[b], #16\n\t"
  35176. #endif
  35177. #ifdef WOLFSSL_KEIL
  35178. "muls r6, r7, r6\n\t"
  35179. #elif defined(__clang__)
  35180. "muls r6, r7\n\t"
  35181. #else
  35182. "mul r6, r7\n\t"
  35183. #endif
  35184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35185. "lsrs r7, r6, #16\n\t"
  35186. #else
  35187. "lsr r7, r6, #16\n\t"
  35188. #endif
  35189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35190. "lsls r6, r6, #16\n\t"
  35191. #else
  35192. "lsl r6, r6, #16\n\t"
  35193. #endif
  35194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35195. "adds r5, r5, r6\n\t"
  35196. #else
  35197. "add r5, r5, r6\n\t"
  35198. #endif
  35199. #ifdef WOLFSSL_KEIL
  35200. "adcs r3, r3, r7\n\t"
  35201. #elif defined(__clang__)
  35202. "adcs r3, r7\n\t"
  35203. #else
  35204. "adc r3, r7\n\t"
  35205. #endif
  35206. #ifdef WOLFSSL_KEIL
  35207. "adcs r4, r4, %[r]\n\t"
  35208. #elif defined(__clang__)
  35209. "adcs r4, %[r]\n\t"
  35210. #else
  35211. "adc r4, %[r]\n\t"
  35212. #endif
  35213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35214. "lsrs r6, %[a], #16\n\t"
  35215. #else
  35216. "lsr r6, %[a], #16\n\t"
  35217. #endif
  35218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35219. "lsrs r7, %[b], #16\n\t"
  35220. #else
  35221. "lsr r7, %[b], #16\n\t"
  35222. #endif
  35223. #ifdef WOLFSSL_KEIL
  35224. "muls r7, r6, r7\n\t"
  35225. #elif defined(__clang__)
  35226. "muls r7, r6\n\t"
  35227. #else
  35228. "mul r7, r6\n\t"
  35229. #endif
  35230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35231. "adds r3, r3, r7\n\t"
  35232. #else
  35233. "add r3, r3, r7\n\t"
  35234. #endif
  35235. #ifdef WOLFSSL_KEIL
  35236. "adcs r4, r4, %[r]\n\t"
  35237. #elif defined(__clang__)
  35238. "adcs r4, %[r]\n\t"
  35239. #else
  35240. "adc r4, %[r]\n\t"
  35241. #endif
  35242. "uxth r7, %[b]\n\t"
  35243. #ifdef WOLFSSL_KEIL
  35244. "muls r6, r7, r6\n\t"
  35245. #elif defined(__clang__)
  35246. "muls r6, r7\n\t"
  35247. #else
  35248. "mul r6, r7\n\t"
  35249. #endif
  35250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35251. "lsrs r7, r6, #16\n\t"
  35252. #else
  35253. "lsr r7, r6, #16\n\t"
  35254. #endif
  35255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35256. "lsls r6, r6, #16\n\t"
  35257. #else
  35258. "lsl r6, r6, #16\n\t"
  35259. #endif
  35260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35261. "adds r5, r5, r6\n\t"
  35262. #else
  35263. "add r5, r5, r6\n\t"
  35264. #endif
  35265. #ifdef WOLFSSL_KEIL
  35266. "adcs r3, r3, r7\n\t"
  35267. #elif defined(__clang__)
  35268. "adcs r3, r7\n\t"
  35269. #else
  35270. "adc r3, r7\n\t"
  35271. #endif
  35272. #ifdef WOLFSSL_KEIL
  35273. "adcs r4, r4, %[r]\n\t"
  35274. #elif defined(__clang__)
  35275. "adcs r4, %[r]\n\t"
  35276. #else
  35277. "adc r4, %[r]\n\t"
  35278. #endif
  35279. "# A[6] * B[2]\n\t"
  35280. "mov %[a], r9\n\t"
  35281. "mov %[b], r10\n\t"
  35282. "ldr %[a], [%[a], #24]\n\t"
  35283. "ldr %[b], [%[b], #8]\n\t"
  35284. "uxth r6, %[a]\n\t"
  35285. "uxth r7, %[b]\n\t"
  35286. #ifdef WOLFSSL_KEIL
  35287. "muls r7, r6, r7\n\t"
  35288. #elif defined(__clang__)
  35289. "muls r7, r6\n\t"
  35290. #else
  35291. "mul r7, r6\n\t"
  35292. #endif
  35293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35294. "adds r5, r5, r7\n\t"
  35295. #else
  35296. "add r5, r5, r7\n\t"
  35297. #endif
  35298. #ifdef WOLFSSL_KEIL
  35299. "adcs r3, r3, %[r]\n\t"
  35300. #elif defined(__clang__)
  35301. "adcs r3, %[r]\n\t"
  35302. #else
  35303. "adc r3, %[r]\n\t"
  35304. #endif
  35305. #ifdef WOLFSSL_KEIL
  35306. "adcs r4, r4, %[r]\n\t"
  35307. #elif defined(__clang__)
  35308. "adcs r4, %[r]\n\t"
  35309. #else
  35310. "adc r4, %[r]\n\t"
  35311. #endif
  35312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35313. "lsrs r7, %[b], #16\n\t"
  35314. #else
  35315. "lsr r7, %[b], #16\n\t"
  35316. #endif
  35317. #ifdef WOLFSSL_KEIL
  35318. "muls r6, r7, r6\n\t"
  35319. #elif defined(__clang__)
  35320. "muls r6, r7\n\t"
  35321. #else
  35322. "mul r6, r7\n\t"
  35323. #endif
  35324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35325. "lsrs r7, r6, #16\n\t"
  35326. #else
  35327. "lsr r7, r6, #16\n\t"
  35328. #endif
  35329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35330. "lsls r6, r6, #16\n\t"
  35331. #else
  35332. "lsl r6, r6, #16\n\t"
  35333. #endif
  35334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35335. "adds r5, r5, r6\n\t"
  35336. #else
  35337. "add r5, r5, r6\n\t"
  35338. #endif
  35339. #ifdef WOLFSSL_KEIL
  35340. "adcs r3, r3, r7\n\t"
  35341. #elif defined(__clang__)
  35342. "adcs r3, r7\n\t"
  35343. #else
  35344. "adc r3, r7\n\t"
  35345. #endif
  35346. #ifdef WOLFSSL_KEIL
  35347. "adcs r4, r4, %[r]\n\t"
  35348. #elif defined(__clang__)
  35349. "adcs r4, %[r]\n\t"
  35350. #else
  35351. "adc r4, %[r]\n\t"
  35352. #endif
  35353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35354. "lsrs r6, %[a], #16\n\t"
  35355. #else
  35356. "lsr r6, %[a], #16\n\t"
  35357. #endif
  35358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35359. "lsrs r7, %[b], #16\n\t"
  35360. #else
  35361. "lsr r7, %[b], #16\n\t"
  35362. #endif
  35363. #ifdef WOLFSSL_KEIL
  35364. "muls r7, r6, r7\n\t"
  35365. #elif defined(__clang__)
  35366. "muls r7, r6\n\t"
  35367. #else
  35368. "mul r7, r6\n\t"
  35369. #endif
  35370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35371. "adds r3, r3, r7\n\t"
  35372. #else
  35373. "add r3, r3, r7\n\t"
  35374. #endif
  35375. #ifdef WOLFSSL_KEIL
  35376. "adcs r4, r4, %[r]\n\t"
  35377. #elif defined(__clang__)
  35378. "adcs r4, %[r]\n\t"
  35379. #else
  35380. "adc r4, %[r]\n\t"
  35381. #endif
  35382. "uxth r7, %[b]\n\t"
  35383. #ifdef WOLFSSL_KEIL
  35384. "muls r6, r7, r6\n\t"
  35385. #elif defined(__clang__)
  35386. "muls r6, r7\n\t"
  35387. #else
  35388. "mul r6, r7\n\t"
  35389. #endif
  35390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35391. "lsrs r7, r6, #16\n\t"
  35392. #else
  35393. "lsr r7, r6, #16\n\t"
  35394. #endif
  35395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35396. "lsls r6, r6, #16\n\t"
  35397. #else
  35398. "lsl r6, r6, #16\n\t"
  35399. #endif
  35400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35401. "adds r5, r5, r6\n\t"
  35402. #else
  35403. "add r5, r5, r6\n\t"
  35404. #endif
  35405. #ifdef WOLFSSL_KEIL
  35406. "adcs r3, r3, r7\n\t"
  35407. #elif defined(__clang__)
  35408. "adcs r3, r7\n\t"
  35409. #else
  35410. "adc r3, r7\n\t"
  35411. #endif
  35412. #ifdef WOLFSSL_KEIL
  35413. "adcs r4, r4, %[r]\n\t"
  35414. #elif defined(__clang__)
  35415. "adcs r4, %[r]\n\t"
  35416. #else
  35417. "adc r4, %[r]\n\t"
  35418. #endif
  35419. "# A[5] * B[3]\n\t"
  35420. "mov %[a], r9\n\t"
  35421. "mov %[b], r10\n\t"
  35422. "ldr %[a], [%[a], #20]\n\t"
  35423. "ldr %[b], [%[b], #12]\n\t"
  35424. "uxth r6, %[a]\n\t"
  35425. "uxth r7, %[b]\n\t"
  35426. #ifdef WOLFSSL_KEIL
  35427. "muls r7, r6, r7\n\t"
  35428. #elif defined(__clang__)
  35429. "muls r7, r6\n\t"
  35430. #else
  35431. "mul r7, r6\n\t"
  35432. #endif
  35433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35434. "adds r5, r5, r7\n\t"
  35435. #else
  35436. "add r5, r5, r7\n\t"
  35437. #endif
  35438. #ifdef WOLFSSL_KEIL
  35439. "adcs r3, r3, %[r]\n\t"
  35440. #elif defined(__clang__)
  35441. "adcs r3, %[r]\n\t"
  35442. #else
  35443. "adc r3, %[r]\n\t"
  35444. #endif
  35445. #ifdef WOLFSSL_KEIL
  35446. "adcs r4, r4, %[r]\n\t"
  35447. #elif defined(__clang__)
  35448. "adcs r4, %[r]\n\t"
  35449. #else
  35450. "adc r4, %[r]\n\t"
  35451. #endif
  35452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35453. "lsrs r7, %[b], #16\n\t"
  35454. #else
  35455. "lsr r7, %[b], #16\n\t"
  35456. #endif
  35457. #ifdef WOLFSSL_KEIL
  35458. "muls r6, r7, r6\n\t"
  35459. #elif defined(__clang__)
  35460. "muls r6, r7\n\t"
  35461. #else
  35462. "mul r6, r7\n\t"
  35463. #endif
  35464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35465. "lsrs r7, r6, #16\n\t"
  35466. #else
  35467. "lsr r7, r6, #16\n\t"
  35468. #endif
  35469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35470. "lsls r6, r6, #16\n\t"
  35471. #else
  35472. "lsl r6, r6, #16\n\t"
  35473. #endif
  35474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35475. "adds r5, r5, r6\n\t"
  35476. #else
  35477. "add r5, r5, r6\n\t"
  35478. #endif
  35479. #ifdef WOLFSSL_KEIL
  35480. "adcs r3, r3, r7\n\t"
  35481. #elif defined(__clang__)
  35482. "adcs r3, r7\n\t"
  35483. #else
  35484. "adc r3, r7\n\t"
  35485. #endif
  35486. #ifdef WOLFSSL_KEIL
  35487. "adcs r4, r4, %[r]\n\t"
  35488. #elif defined(__clang__)
  35489. "adcs r4, %[r]\n\t"
  35490. #else
  35491. "adc r4, %[r]\n\t"
  35492. #endif
  35493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35494. "lsrs r6, %[a], #16\n\t"
  35495. #else
  35496. "lsr r6, %[a], #16\n\t"
  35497. #endif
  35498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35499. "lsrs r7, %[b], #16\n\t"
  35500. #else
  35501. "lsr r7, %[b], #16\n\t"
  35502. #endif
  35503. #ifdef WOLFSSL_KEIL
  35504. "muls r7, r6, r7\n\t"
  35505. #elif defined(__clang__)
  35506. "muls r7, r6\n\t"
  35507. #else
  35508. "mul r7, r6\n\t"
  35509. #endif
  35510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35511. "adds r3, r3, r7\n\t"
  35512. #else
  35513. "add r3, r3, r7\n\t"
  35514. #endif
  35515. #ifdef WOLFSSL_KEIL
  35516. "adcs r4, r4, %[r]\n\t"
  35517. #elif defined(__clang__)
  35518. "adcs r4, %[r]\n\t"
  35519. #else
  35520. "adc r4, %[r]\n\t"
  35521. #endif
  35522. "uxth r7, %[b]\n\t"
  35523. #ifdef WOLFSSL_KEIL
  35524. "muls r6, r7, r6\n\t"
  35525. #elif defined(__clang__)
  35526. "muls r6, r7\n\t"
  35527. #else
  35528. "mul r6, r7\n\t"
  35529. #endif
  35530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35531. "lsrs r7, r6, #16\n\t"
  35532. #else
  35533. "lsr r7, r6, #16\n\t"
  35534. #endif
  35535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35536. "lsls r6, r6, #16\n\t"
  35537. #else
  35538. "lsl r6, r6, #16\n\t"
  35539. #endif
  35540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35541. "adds r5, r5, r6\n\t"
  35542. #else
  35543. "add r5, r5, r6\n\t"
  35544. #endif
  35545. #ifdef WOLFSSL_KEIL
  35546. "adcs r3, r3, r7\n\t"
  35547. #elif defined(__clang__)
  35548. "adcs r3, r7\n\t"
  35549. #else
  35550. "adc r3, r7\n\t"
  35551. #endif
  35552. #ifdef WOLFSSL_KEIL
  35553. "adcs r4, r4, %[r]\n\t"
  35554. #elif defined(__clang__)
  35555. "adcs r4, %[r]\n\t"
  35556. #else
  35557. "adc r4, %[r]\n\t"
  35558. #endif
  35559. "# A[4] * B[4]\n\t"
  35560. "mov %[a], r9\n\t"
  35561. "mov %[b], r10\n\t"
  35562. "ldr %[a], [%[a], #16]\n\t"
  35563. "ldr %[b], [%[b], #16]\n\t"
  35564. "uxth r6, %[a]\n\t"
  35565. "uxth r7, %[b]\n\t"
  35566. #ifdef WOLFSSL_KEIL
  35567. "muls r7, r6, r7\n\t"
  35568. #elif defined(__clang__)
  35569. "muls r7, r6\n\t"
  35570. #else
  35571. "mul r7, r6\n\t"
  35572. #endif
  35573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35574. "adds r5, r5, r7\n\t"
  35575. #else
  35576. "add r5, r5, r7\n\t"
  35577. #endif
  35578. #ifdef WOLFSSL_KEIL
  35579. "adcs r3, r3, %[r]\n\t"
  35580. #elif defined(__clang__)
  35581. "adcs r3, %[r]\n\t"
  35582. #else
  35583. "adc r3, %[r]\n\t"
  35584. #endif
  35585. #ifdef WOLFSSL_KEIL
  35586. "adcs r4, r4, %[r]\n\t"
  35587. #elif defined(__clang__)
  35588. "adcs r4, %[r]\n\t"
  35589. #else
  35590. "adc r4, %[r]\n\t"
  35591. #endif
  35592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35593. "lsrs r7, %[b], #16\n\t"
  35594. #else
  35595. "lsr r7, %[b], #16\n\t"
  35596. #endif
  35597. #ifdef WOLFSSL_KEIL
  35598. "muls r6, r7, r6\n\t"
  35599. #elif defined(__clang__)
  35600. "muls r6, r7\n\t"
  35601. #else
  35602. "mul r6, r7\n\t"
  35603. #endif
  35604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35605. "lsrs r7, r6, #16\n\t"
  35606. #else
  35607. "lsr r7, r6, #16\n\t"
  35608. #endif
  35609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35610. "lsls r6, r6, #16\n\t"
  35611. #else
  35612. "lsl r6, r6, #16\n\t"
  35613. #endif
  35614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35615. "adds r5, r5, r6\n\t"
  35616. #else
  35617. "add r5, r5, r6\n\t"
  35618. #endif
  35619. #ifdef WOLFSSL_KEIL
  35620. "adcs r3, r3, r7\n\t"
  35621. #elif defined(__clang__)
  35622. "adcs r3, r7\n\t"
  35623. #else
  35624. "adc r3, r7\n\t"
  35625. #endif
  35626. #ifdef WOLFSSL_KEIL
  35627. "adcs r4, r4, %[r]\n\t"
  35628. #elif defined(__clang__)
  35629. "adcs r4, %[r]\n\t"
  35630. #else
  35631. "adc r4, %[r]\n\t"
  35632. #endif
  35633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35634. "lsrs r6, %[a], #16\n\t"
  35635. #else
  35636. "lsr r6, %[a], #16\n\t"
  35637. #endif
  35638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35639. "lsrs r7, %[b], #16\n\t"
  35640. #else
  35641. "lsr r7, %[b], #16\n\t"
  35642. #endif
  35643. #ifdef WOLFSSL_KEIL
  35644. "muls r7, r6, r7\n\t"
  35645. #elif defined(__clang__)
  35646. "muls r7, r6\n\t"
  35647. #else
  35648. "mul r7, r6\n\t"
  35649. #endif
  35650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35651. "adds r3, r3, r7\n\t"
  35652. #else
  35653. "add r3, r3, r7\n\t"
  35654. #endif
  35655. #ifdef WOLFSSL_KEIL
  35656. "adcs r4, r4, %[r]\n\t"
  35657. #elif defined(__clang__)
  35658. "adcs r4, %[r]\n\t"
  35659. #else
  35660. "adc r4, %[r]\n\t"
  35661. #endif
  35662. "uxth r7, %[b]\n\t"
  35663. #ifdef WOLFSSL_KEIL
  35664. "muls r6, r7, r6\n\t"
  35665. #elif defined(__clang__)
  35666. "muls r6, r7\n\t"
  35667. #else
  35668. "mul r6, r7\n\t"
  35669. #endif
  35670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35671. "lsrs r7, r6, #16\n\t"
  35672. #else
  35673. "lsr r7, r6, #16\n\t"
  35674. #endif
  35675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35676. "lsls r6, r6, #16\n\t"
  35677. #else
  35678. "lsl r6, r6, #16\n\t"
  35679. #endif
  35680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35681. "adds r5, r5, r6\n\t"
  35682. #else
  35683. "add r5, r5, r6\n\t"
  35684. #endif
  35685. #ifdef WOLFSSL_KEIL
  35686. "adcs r3, r3, r7\n\t"
  35687. #elif defined(__clang__)
  35688. "adcs r3, r7\n\t"
  35689. #else
  35690. "adc r3, r7\n\t"
  35691. #endif
  35692. #ifdef WOLFSSL_KEIL
  35693. "adcs r4, r4, %[r]\n\t"
  35694. #elif defined(__clang__)
  35695. "adcs r4, %[r]\n\t"
  35696. #else
  35697. "adc r4, %[r]\n\t"
  35698. #endif
  35699. "# A[3] * B[5]\n\t"
  35700. "mov %[a], r9\n\t"
  35701. "mov %[b], r10\n\t"
  35702. "ldr %[a], [%[a], #12]\n\t"
  35703. "ldr %[b], [%[b], #20]\n\t"
  35704. "uxth r6, %[a]\n\t"
  35705. "uxth r7, %[b]\n\t"
  35706. #ifdef WOLFSSL_KEIL
  35707. "muls r7, r6, r7\n\t"
  35708. #elif defined(__clang__)
  35709. "muls r7, r6\n\t"
  35710. #else
  35711. "mul r7, r6\n\t"
  35712. #endif
  35713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35714. "adds r5, r5, r7\n\t"
  35715. #else
  35716. "add r5, r5, r7\n\t"
  35717. #endif
  35718. #ifdef WOLFSSL_KEIL
  35719. "adcs r3, r3, %[r]\n\t"
  35720. #elif defined(__clang__)
  35721. "adcs r3, %[r]\n\t"
  35722. #else
  35723. "adc r3, %[r]\n\t"
  35724. #endif
  35725. #ifdef WOLFSSL_KEIL
  35726. "adcs r4, r4, %[r]\n\t"
  35727. #elif defined(__clang__)
  35728. "adcs r4, %[r]\n\t"
  35729. #else
  35730. "adc r4, %[r]\n\t"
  35731. #endif
  35732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35733. "lsrs r7, %[b], #16\n\t"
  35734. #else
  35735. "lsr r7, %[b], #16\n\t"
  35736. #endif
  35737. #ifdef WOLFSSL_KEIL
  35738. "muls r6, r7, r6\n\t"
  35739. #elif defined(__clang__)
  35740. "muls r6, r7\n\t"
  35741. #else
  35742. "mul r6, r7\n\t"
  35743. #endif
  35744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35745. "lsrs r7, r6, #16\n\t"
  35746. #else
  35747. "lsr r7, r6, #16\n\t"
  35748. #endif
  35749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35750. "lsls r6, r6, #16\n\t"
  35751. #else
  35752. "lsl r6, r6, #16\n\t"
  35753. #endif
  35754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35755. "adds r5, r5, r6\n\t"
  35756. #else
  35757. "add r5, r5, r6\n\t"
  35758. #endif
  35759. #ifdef WOLFSSL_KEIL
  35760. "adcs r3, r3, r7\n\t"
  35761. #elif defined(__clang__)
  35762. "adcs r3, r7\n\t"
  35763. #else
  35764. "adc r3, r7\n\t"
  35765. #endif
  35766. #ifdef WOLFSSL_KEIL
  35767. "adcs r4, r4, %[r]\n\t"
  35768. #elif defined(__clang__)
  35769. "adcs r4, %[r]\n\t"
  35770. #else
  35771. "adc r4, %[r]\n\t"
  35772. #endif
  35773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35774. "lsrs r6, %[a], #16\n\t"
  35775. #else
  35776. "lsr r6, %[a], #16\n\t"
  35777. #endif
  35778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35779. "lsrs r7, %[b], #16\n\t"
  35780. #else
  35781. "lsr r7, %[b], #16\n\t"
  35782. #endif
  35783. #ifdef WOLFSSL_KEIL
  35784. "muls r7, r6, r7\n\t"
  35785. #elif defined(__clang__)
  35786. "muls r7, r6\n\t"
  35787. #else
  35788. "mul r7, r6\n\t"
  35789. #endif
  35790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35791. "adds r3, r3, r7\n\t"
  35792. #else
  35793. "add r3, r3, r7\n\t"
  35794. #endif
  35795. #ifdef WOLFSSL_KEIL
  35796. "adcs r4, r4, %[r]\n\t"
  35797. #elif defined(__clang__)
  35798. "adcs r4, %[r]\n\t"
  35799. #else
  35800. "adc r4, %[r]\n\t"
  35801. #endif
  35802. "uxth r7, %[b]\n\t"
  35803. #ifdef WOLFSSL_KEIL
  35804. "muls r6, r7, r6\n\t"
  35805. #elif defined(__clang__)
  35806. "muls r6, r7\n\t"
  35807. #else
  35808. "mul r6, r7\n\t"
  35809. #endif
  35810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35811. "lsrs r7, r6, #16\n\t"
  35812. #else
  35813. "lsr r7, r6, #16\n\t"
  35814. #endif
  35815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35816. "lsls r6, r6, #16\n\t"
  35817. #else
  35818. "lsl r6, r6, #16\n\t"
  35819. #endif
  35820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35821. "adds r5, r5, r6\n\t"
  35822. #else
  35823. "add r5, r5, r6\n\t"
  35824. #endif
  35825. #ifdef WOLFSSL_KEIL
  35826. "adcs r3, r3, r7\n\t"
  35827. #elif defined(__clang__)
  35828. "adcs r3, r7\n\t"
  35829. #else
  35830. "adc r3, r7\n\t"
  35831. #endif
  35832. #ifdef WOLFSSL_KEIL
  35833. "adcs r4, r4, %[r]\n\t"
  35834. #elif defined(__clang__)
  35835. "adcs r4, %[r]\n\t"
  35836. #else
  35837. "adc r4, %[r]\n\t"
  35838. #endif
  35839. "# A[2] * B[6]\n\t"
  35840. "mov %[a], r9\n\t"
  35841. "mov %[b], r10\n\t"
  35842. "ldr %[a], [%[a], #8]\n\t"
  35843. "ldr %[b], [%[b], #24]\n\t"
  35844. "uxth r6, %[a]\n\t"
  35845. "uxth r7, %[b]\n\t"
  35846. #ifdef WOLFSSL_KEIL
  35847. "muls r7, r6, r7\n\t"
  35848. #elif defined(__clang__)
  35849. "muls r7, r6\n\t"
  35850. #else
  35851. "mul r7, r6\n\t"
  35852. #endif
  35853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35854. "adds r5, r5, r7\n\t"
  35855. #else
  35856. "add r5, r5, r7\n\t"
  35857. #endif
  35858. #ifdef WOLFSSL_KEIL
  35859. "adcs r3, r3, %[r]\n\t"
  35860. #elif defined(__clang__)
  35861. "adcs r3, %[r]\n\t"
  35862. #else
  35863. "adc r3, %[r]\n\t"
  35864. #endif
  35865. #ifdef WOLFSSL_KEIL
  35866. "adcs r4, r4, %[r]\n\t"
  35867. #elif defined(__clang__)
  35868. "adcs r4, %[r]\n\t"
  35869. #else
  35870. "adc r4, %[r]\n\t"
  35871. #endif
  35872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35873. "lsrs r7, %[b], #16\n\t"
  35874. #else
  35875. "lsr r7, %[b], #16\n\t"
  35876. #endif
  35877. #ifdef WOLFSSL_KEIL
  35878. "muls r6, r7, r6\n\t"
  35879. #elif defined(__clang__)
  35880. "muls r6, r7\n\t"
  35881. #else
  35882. "mul r6, r7\n\t"
  35883. #endif
  35884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35885. "lsrs r7, r6, #16\n\t"
  35886. #else
  35887. "lsr r7, r6, #16\n\t"
  35888. #endif
  35889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35890. "lsls r6, r6, #16\n\t"
  35891. #else
  35892. "lsl r6, r6, #16\n\t"
  35893. #endif
  35894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35895. "adds r5, r5, r6\n\t"
  35896. #else
  35897. "add r5, r5, r6\n\t"
  35898. #endif
  35899. #ifdef WOLFSSL_KEIL
  35900. "adcs r3, r3, r7\n\t"
  35901. #elif defined(__clang__)
  35902. "adcs r3, r7\n\t"
  35903. #else
  35904. "adc r3, r7\n\t"
  35905. #endif
  35906. #ifdef WOLFSSL_KEIL
  35907. "adcs r4, r4, %[r]\n\t"
  35908. #elif defined(__clang__)
  35909. "adcs r4, %[r]\n\t"
  35910. #else
  35911. "adc r4, %[r]\n\t"
  35912. #endif
  35913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35914. "lsrs r6, %[a], #16\n\t"
  35915. #else
  35916. "lsr r6, %[a], #16\n\t"
  35917. #endif
  35918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35919. "lsrs r7, %[b], #16\n\t"
  35920. #else
  35921. "lsr r7, %[b], #16\n\t"
  35922. #endif
  35923. #ifdef WOLFSSL_KEIL
  35924. "muls r7, r6, r7\n\t"
  35925. #elif defined(__clang__)
  35926. "muls r7, r6\n\t"
  35927. #else
  35928. "mul r7, r6\n\t"
  35929. #endif
  35930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35931. "adds r3, r3, r7\n\t"
  35932. #else
  35933. "add r3, r3, r7\n\t"
  35934. #endif
  35935. #ifdef WOLFSSL_KEIL
  35936. "adcs r4, r4, %[r]\n\t"
  35937. #elif defined(__clang__)
  35938. "adcs r4, %[r]\n\t"
  35939. #else
  35940. "adc r4, %[r]\n\t"
  35941. #endif
  35942. "uxth r7, %[b]\n\t"
  35943. #ifdef WOLFSSL_KEIL
  35944. "muls r6, r7, r6\n\t"
  35945. #elif defined(__clang__)
  35946. "muls r6, r7\n\t"
  35947. #else
  35948. "mul r6, r7\n\t"
  35949. #endif
  35950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35951. "lsrs r7, r6, #16\n\t"
  35952. #else
  35953. "lsr r7, r6, #16\n\t"
  35954. #endif
  35955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35956. "lsls r6, r6, #16\n\t"
  35957. #else
  35958. "lsl r6, r6, #16\n\t"
  35959. #endif
  35960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35961. "adds r5, r5, r6\n\t"
  35962. #else
  35963. "add r5, r5, r6\n\t"
  35964. #endif
  35965. #ifdef WOLFSSL_KEIL
  35966. "adcs r3, r3, r7\n\t"
  35967. #elif defined(__clang__)
  35968. "adcs r3, r7\n\t"
  35969. #else
  35970. "adc r3, r7\n\t"
  35971. #endif
  35972. #ifdef WOLFSSL_KEIL
  35973. "adcs r4, r4, %[r]\n\t"
  35974. #elif defined(__clang__)
  35975. "adcs r4, %[r]\n\t"
  35976. #else
  35977. "adc r4, %[r]\n\t"
  35978. #endif
  35979. "# A[1] * B[7]\n\t"
  35980. "mov %[a], r9\n\t"
  35981. "mov %[b], r10\n\t"
  35982. "ldr %[a], [%[a], #4]\n\t"
  35983. "ldr %[b], [%[b], #28]\n\t"
  35984. "uxth r6, %[a]\n\t"
  35985. "uxth r7, %[b]\n\t"
  35986. #ifdef WOLFSSL_KEIL
  35987. "muls r7, r6, r7\n\t"
  35988. #elif defined(__clang__)
  35989. "muls r7, r6\n\t"
  35990. #else
  35991. "mul r7, r6\n\t"
  35992. #endif
  35993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35994. "adds r5, r5, r7\n\t"
  35995. #else
  35996. "add r5, r5, r7\n\t"
  35997. #endif
  35998. #ifdef WOLFSSL_KEIL
  35999. "adcs r3, r3, %[r]\n\t"
  36000. #elif defined(__clang__)
  36001. "adcs r3, %[r]\n\t"
  36002. #else
  36003. "adc r3, %[r]\n\t"
  36004. #endif
  36005. #ifdef WOLFSSL_KEIL
  36006. "adcs r4, r4, %[r]\n\t"
  36007. #elif defined(__clang__)
  36008. "adcs r4, %[r]\n\t"
  36009. #else
  36010. "adc r4, %[r]\n\t"
  36011. #endif
  36012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36013. "lsrs r7, %[b], #16\n\t"
  36014. #else
  36015. "lsr r7, %[b], #16\n\t"
  36016. #endif
  36017. #ifdef WOLFSSL_KEIL
  36018. "muls r6, r7, r6\n\t"
  36019. #elif defined(__clang__)
  36020. "muls r6, r7\n\t"
  36021. #else
  36022. "mul r6, r7\n\t"
  36023. #endif
  36024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36025. "lsrs r7, r6, #16\n\t"
  36026. #else
  36027. "lsr r7, r6, #16\n\t"
  36028. #endif
  36029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36030. "lsls r6, r6, #16\n\t"
  36031. #else
  36032. "lsl r6, r6, #16\n\t"
  36033. #endif
  36034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36035. "adds r5, r5, r6\n\t"
  36036. #else
  36037. "add r5, r5, r6\n\t"
  36038. #endif
  36039. #ifdef WOLFSSL_KEIL
  36040. "adcs r3, r3, r7\n\t"
  36041. #elif defined(__clang__)
  36042. "adcs r3, r7\n\t"
  36043. #else
  36044. "adc r3, r7\n\t"
  36045. #endif
  36046. #ifdef WOLFSSL_KEIL
  36047. "adcs r4, r4, %[r]\n\t"
  36048. #elif defined(__clang__)
  36049. "adcs r4, %[r]\n\t"
  36050. #else
  36051. "adc r4, %[r]\n\t"
  36052. #endif
  36053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36054. "lsrs r6, %[a], #16\n\t"
  36055. #else
  36056. "lsr r6, %[a], #16\n\t"
  36057. #endif
  36058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36059. "lsrs r7, %[b], #16\n\t"
  36060. #else
  36061. "lsr r7, %[b], #16\n\t"
  36062. #endif
  36063. #ifdef WOLFSSL_KEIL
  36064. "muls r7, r6, r7\n\t"
  36065. #elif defined(__clang__)
  36066. "muls r7, r6\n\t"
  36067. #else
  36068. "mul r7, r6\n\t"
  36069. #endif
  36070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36071. "adds r3, r3, r7\n\t"
  36072. #else
  36073. "add r3, r3, r7\n\t"
  36074. #endif
  36075. #ifdef WOLFSSL_KEIL
  36076. "adcs r4, r4, %[r]\n\t"
  36077. #elif defined(__clang__)
  36078. "adcs r4, %[r]\n\t"
  36079. #else
  36080. "adc r4, %[r]\n\t"
  36081. #endif
  36082. "uxth r7, %[b]\n\t"
  36083. #ifdef WOLFSSL_KEIL
  36084. "muls r6, r7, r6\n\t"
  36085. #elif defined(__clang__)
  36086. "muls r6, r7\n\t"
  36087. #else
  36088. "mul r6, r7\n\t"
  36089. #endif
  36090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36091. "lsrs r7, r6, #16\n\t"
  36092. #else
  36093. "lsr r7, r6, #16\n\t"
  36094. #endif
  36095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36096. "lsls r6, r6, #16\n\t"
  36097. #else
  36098. "lsl r6, r6, #16\n\t"
  36099. #endif
  36100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36101. "adds r5, r5, r6\n\t"
  36102. #else
  36103. "add r5, r5, r6\n\t"
  36104. #endif
  36105. #ifdef WOLFSSL_KEIL
  36106. "adcs r3, r3, r7\n\t"
  36107. #elif defined(__clang__)
  36108. "adcs r3, r7\n\t"
  36109. #else
  36110. "adc r3, r7\n\t"
  36111. #endif
  36112. #ifdef WOLFSSL_KEIL
  36113. "adcs r4, r4, %[r]\n\t"
  36114. #elif defined(__clang__)
  36115. "adcs r4, %[r]\n\t"
  36116. #else
  36117. "adc r4, %[r]\n\t"
  36118. #endif
  36119. "# A[0] * B[8]\n\t"
  36120. "mov %[a], r9\n\t"
  36121. "mov %[b], r10\n\t"
  36122. "ldr %[a], [%[a]]\n\t"
  36123. "ldr %[b], [%[b], #32]\n\t"
  36124. "uxth r6, %[a]\n\t"
  36125. "uxth r7, %[b]\n\t"
  36126. #ifdef WOLFSSL_KEIL
  36127. "muls r7, r6, r7\n\t"
  36128. #elif defined(__clang__)
  36129. "muls r7, r6\n\t"
  36130. #else
  36131. "mul r7, r6\n\t"
  36132. #endif
  36133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36134. "adds r5, r5, r7\n\t"
  36135. #else
  36136. "add r5, r5, r7\n\t"
  36137. #endif
  36138. #ifdef WOLFSSL_KEIL
  36139. "adcs r3, r3, %[r]\n\t"
  36140. #elif defined(__clang__)
  36141. "adcs r3, %[r]\n\t"
  36142. #else
  36143. "adc r3, %[r]\n\t"
  36144. #endif
  36145. #ifdef WOLFSSL_KEIL
  36146. "adcs r4, r4, %[r]\n\t"
  36147. #elif defined(__clang__)
  36148. "adcs r4, %[r]\n\t"
  36149. #else
  36150. "adc r4, %[r]\n\t"
  36151. #endif
  36152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36153. "lsrs r7, %[b], #16\n\t"
  36154. #else
  36155. "lsr r7, %[b], #16\n\t"
  36156. #endif
  36157. #ifdef WOLFSSL_KEIL
  36158. "muls r6, r7, r6\n\t"
  36159. #elif defined(__clang__)
  36160. "muls r6, r7\n\t"
  36161. #else
  36162. "mul r6, r7\n\t"
  36163. #endif
  36164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36165. "lsrs r7, r6, #16\n\t"
  36166. #else
  36167. "lsr r7, r6, #16\n\t"
  36168. #endif
  36169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36170. "lsls r6, r6, #16\n\t"
  36171. #else
  36172. "lsl r6, r6, #16\n\t"
  36173. #endif
  36174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36175. "adds r5, r5, r6\n\t"
  36176. #else
  36177. "add r5, r5, r6\n\t"
  36178. #endif
  36179. #ifdef WOLFSSL_KEIL
  36180. "adcs r3, r3, r7\n\t"
  36181. #elif defined(__clang__)
  36182. "adcs r3, r7\n\t"
  36183. #else
  36184. "adc r3, r7\n\t"
  36185. #endif
  36186. #ifdef WOLFSSL_KEIL
  36187. "adcs r4, r4, %[r]\n\t"
  36188. #elif defined(__clang__)
  36189. "adcs r4, %[r]\n\t"
  36190. #else
  36191. "adc r4, %[r]\n\t"
  36192. #endif
  36193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36194. "lsrs r6, %[a], #16\n\t"
  36195. #else
  36196. "lsr r6, %[a], #16\n\t"
  36197. #endif
  36198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36199. "lsrs r7, %[b], #16\n\t"
  36200. #else
  36201. "lsr r7, %[b], #16\n\t"
  36202. #endif
  36203. #ifdef WOLFSSL_KEIL
  36204. "muls r7, r6, r7\n\t"
  36205. #elif defined(__clang__)
  36206. "muls r7, r6\n\t"
  36207. #else
  36208. "mul r7, r6\n\t"
  36209. #endif
  36210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36211. "adds r3, r3, r7\n\t"
  36212. #else
  36213. "add r3, r3, r7\n\t"
  36214. #endif
  36215. #ifdef WOLFSSL_KEIL
  36216. "adcs r4, r4, %[r]\n\t"
  36217. #elif defined(__clang__)
  36218. "adcs r4, %[r]\n\t"
  36219. #else
  36220. "adc r4, %[r]\n\t"
  36221. #endif
  36222. "uxth r7, %[b]\n\t"
  36223. #ifdef WOLFSSL_KEIL
  36224. "muls r6, r7, r6\n\t"
  36225. #elif defined(__clang__)
  36226. "muls r6, r7\n\t"
  36227. #else
  36228. "mul r6, r7\n\t"
  36229. #endif
  36230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36231. "lsrs r7, r6, #16\n\t"
  36232. #else
  36233. "lsr r7, r6, #16\n\t"
  36234. #endif
  36235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36236. "lsls r6, r6, #16\n\t"
  36237. #else
  36238. "lsl r6, r6, #16\n\t"
  36239. #endif
  36240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36241. "adds r5, r5, r6\n\t"
  36242. #else
  36243. "add r5, r5, r6\n\t"
  36244. #endif
  36245. #ifdef WOLFSSL_KEIL
  36246. "adcs r3, r3, r7\n\t"
  36247. #elif defined(__clang__)
  36248. "adcs r3, r7\n\t"
  36249. #else
  36250. "adc r3, r7\n\t"
  36251. #endif
  36252. #ifdef WOLFSSL_KEIL
  36253. "adcs r4, r4, %[r]\n\t"
  36254. #elif defined(__clang__)
  36255. "adcs r4, %[r]\n\t"
  36256. #else
  36257. "adc r4, %[r]\n\t"
  36258. #endif
  36259. "str r5, [sp, #32]\n\t"
  36260. "# A[0] * B[9]\n\t"
  36261. "movs r5, #0\n\t"
  36262. "mov %[a], r9\n\t"
  36263. "mov %[b], r10\n\t"
  36264. "ldr %[a], [%[a]]\n\t"
  36265. "ldr %[b], [%[b], #36]\n\t"
  36266. "uxth r6, %[a]\n\t"
  36267. "uxth r7, %[b]\n\t"
  36268. #ifdef WOLFSSL_KEIL
  36269. "muls r7, r6, r7\n\t"
  36270. #elif defined(__clang__)
  36271. "muls r7, r6\n\t"
  36272. #else
  36273. "mul r7, r6\n\t"
  36274. #endif
  36275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36276. "adds r3, r3, r7\n\t"
  36277. #else
  36278. "add r3, r3, r7\n\t"
  36279. #endif
  36280. #ifdef WOLFSSL_KEIL
  36281. "adcs r4, r4, %[r]\n\t"
  36282. #elif defined(__clang__)
  36283. "adcs r4, %[r]\n\t"
  36284. #else
  36285. "adc r4, %[r]\n\t"
  36286. #endif
  36287. #ifdef WOLFSSL_KEIL
  36288. "adcs r5, r5, %[r]\n\t"
  36289. #elif defined(__clang__)
  36290. "adcs r5, %[r]\n\t"
  36291. #else
  36292. "adc r5, %[r]\n\t"
  36293. #endif
  36294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36295. "lsrs r7, %[b], #16\n\t"
  36296. #else
  36297. "lsr r7, %[b], #16\n\t"
  36298. #endif
  36299. #ifdef WOLFSSL_KEIL
  36300. "muls r6, r7, r6\n\t"
  36301. #elif defined(__clang__)
  36302. "muls r6, r7\n\t"
  36303. #else
  36304. "mul r6, r7\n\t"
  36305. #endif
  36306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36307. "lsrs r7, r6, #16\n\t"
  36308. #else
  36309. "lsr r7, r6, #16\n\t"
  36310. #endif
  36311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36312. "lsls r6, r6, #16\n\t"
  36313. #else
  36314. "lsl r6, r6, #16\n\t"
  36315. #endif
  36316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36317. "adds r3, r3, r6\n\t"
  36318. #else
  36319. "add r3, r3, r6\n\t"
  36320. #endif
  36321. #ifdef WOLFSSL_KEIL
  36322. "adcs r4, r4, r7\n\t"
  36323. #elif defined(__clang__)
  36324. "adcs r4, r7\n\t"
  36325. #else
  36326. "adc r4, r7\n\t"
  36327. #endif
  36328. #ifdef WOLFSSL_KEIL
  36329. "adcs r5, r5, %[r]\n\t"
  36330. #elif defined(__clang__)
  36331. "adcs r5, %[r]\n\t"
  36332. #else
  36333. "adc r5, %[r]\n\t"
  36334. #endif
  36335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36336. "lsrs r6, %[a], #16\n\t"
  36337. #else
  36338. "lsr r6, %[a], #16\n\t"
  36339. #endif
  36340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36341. "lsrs r7, %[b], #16\n\t"
  36342. #else
  36343. "lsr r7, %[b], #16\n\t"
  36344. #endif
  36345. #ifdef WOLFSSL_KEIL
  36346. "muls r7, r6, r7\n\t"
  36347. #elif defined(__clang__)
  36348. "muls r7, r6\n\t"
  36349. #else
  36350. "mul r7, r6\n\t"
  36351. #endif
  36352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36353. "adds r4, r4, r7\n\t"
  36354. #else
  36355. "add r4, r4, r7\n\t"
  36356. #endif
  36357. #ifdef WOLFSSL_KEIL
  36358. "adcs r5, r5, %[r]\n\t"
  36359. #elif defined(__clang__)
  36360. "adcs r5, %[r]\n\t"
  36361. #else
  36362. "adc r5, %[r]\n\t"
  36363. #endif
  36364. "uxth r7, %[b]\n\t"
  36365. #ifdef WOLFSSL_KEIL
  36366. "muls r6, r7, r6\n\t"
  36367. #elif defined(__clang__)
  36368. "muls r6, r7\n\t"
  36369. #else
  36370. "mul r6, r7\n\t"
  36371. #endif
  36372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36373. "lsrs r7, r6, #16\n\t"
  36374. #else
  36375. "lsr r7, r6, #16\n\t"
  36376. #endif
  36377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36378. "lsls r6, r6, #16\n\t"
  36379. #else
  36380. "lsl r6, r6, #16\n\t"
  36381. #endif
  36382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36383. "adds r3, r3, r6\n\t"
  36384. #else
  36385. "add r3, r3, r6\n\t"
  36386. #endif
  36387. #ifdef WOLFSSL_KEIL
  36388. "adcs r4, r4, r7\n\t"
  36389. #elif defined(__clang__)
  36390. "adcs r4, r7\n\t"
  36391. #else
  36392. "adc r4, r7\n\t"
  36393. #endif
  36394. #ifdef WOLFSSL_KEIL
  36395. "adcs r5, r5, %[r]\n\t"
  36396. #elif defined(__clang__)
  36397. "adcs r5, %[r]\n\t"
  36398. #else
  36399. "adc r5, %[r]\n\t"
  36400. #endif
  36401. "# A[1] * B[8]\n\t"
  36402. "mov %[a], r9\n\t"
  36403. "mov %[b], r10\n\t"
  36404. "ldr %[a], [%[a], #4]\n\t"
  36405. "ldr %[b], [%[b], #32]\n\t"
  36406. "uxth r6, %[a]\n\t"
  36407. "uxth r7, %[b]\n\t"
  36408. #ifdef WOLFSSL_KEIL
  36409. "muls r7, r6, r7\n\t"
  36410. #elif defined(__clang__)
  36411. "muls r7, r6\n\t"
  36412. #else
  36413. "mul r7, r6\n\t"
  36414. #endif
  36415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36416. "adds r3, r3, r7\n\t"
  36417. #else
  36418. "add r3, r3, r7\n\t"
  36419. #endif
  36420. #ifdef WOLFSSL_KEIL
  36421. "adcs r4, r4, %[r]\n\t"
  36422. #elif defined(__clang__)
  36423. "adcs r4, %[r]\n\t"
  36424. #else
  36425. "adc r4, %[r]\n\t"
  36426. #endif
  36427. #ifdef WOLFSSL_KEIL
  36428. "adcs r5, r5, %[r]\n\t"
  36429. #elif defined(__clang__)
  36430. "adcs r5, %[r]\n\t"
  36431. #else
  36432. "adc r5, %[r]\n\t"
  36433. #endif
  36434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36435. "lsrs r7, %[b], #16\n\t"
  36436. #else
  36437. "lsr r7, %[b], #16\n\t"
  36438. #endif
  36439. #ifdef WOLFSSL_KEIL
  36440. "muls r6, r7, r6\n\t"
  36441. #elif defined(__clang__)
  36442. "muls r6, r7\n\t"
  36443. #else
  36444. "mul r6, r7\n\t"
  36445. #endif
  36446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36447. "lsrs r7, r6, #16\n\t"
  36448. #else
  36449. "lsr r7, r6, #16\n\t"
  36450. #endif
  36451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36452. "lsls r6, r6, #16\n\t"
  36453. #else
  36454. "lsl r6, r6, #16\n\t"
  36455. #endif
  36456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36457. "adds r3, r3, r6\n\t"
  36458. #else
  36459. "add r3, r3, r6\n\t"
  36460. #endif
  36461. #ifdef WOLFSSL_KEIL
  36462. "adcs r4, r4, r7\n\t"
  36463. #elif defined(__clang__)
  36464. "adcs r4, r7\n\t"
  36465. #else
  36466. "adc r4, r7\n\t"
  36467. #endif
  36468. #ifdef WOLFSSL_KEIL
  36469. "adcs r5, r5, %[r]\n\t"
  36470. #elif defined(__clang__)
  36471. "adcs r5, %[r]\n\t"
  36472. #else
  36473. "adc r5, %[r]\n\t"
  36474. #endif
  36475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36476. "lsrs r6, %[a], #16\n\t"
  36477. #else
  36478. "lsr r6, %[a], #16\n\t"
  36479. #endif
  36480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36481. "lsrs r7, %[b], #16\n\t"
  36482. #else
  36483. "lsr r7, %[b], #16\n\t"
  36484. #endif
  36485. #ifdef WOLFSSL_KEIL
  36486. "muls r7, r6, r7\n\t"
  36487. #elif defined(__clang__)
  36488. "muls r7, r6\n\t"
  36489. #else
  36490. "mul r7, r6\n\t"
  36491. #endif
  36492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36493. "adds r4, r4, r7\n\t"
  36494. #else
  36495. "add r4, r4, r7\n\t"
  36496. #endif
  36497. #ifdef WOLFSSL_KEIL
  36498. "adcs r5, r5, %[r]\n\t"
  36499. #elif defined(__clang__)
  36500. "adcs r5, %[r]\n\t"
  36501. #else
  36502. "adc r5, %[r]\n\t"
  36503. #endif
  36504. "uxth r7, %[b]\n\t"
  36505. #ifdef WOLFSSL_KEIL
  36506. "muls r6, r7, r6\n\t"
  36507. #elif defined(__clang__)
  36508. "muls r6, r7\n\t"
  36509. #else
  36510. "mul r6, r7\n\t"
  36511. #endif
  36512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36513. "lsrs r7, r6, #16\n\t"
  36514. #else
  36515. "lsr r7, r6, #16\n\t"
  36516. #endif
  36517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36518. "lsls r6, r6, #16\n\t"
  36519. #else
  36520. "lsl r6, r6, #16\n\t"
  36521. #endif
  36522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36523. "adds r3, r3, r6\n\t"
  36524. #else
  36525. "add r3, r3, r6\n\t"
  36526. #endif
  36527. #ifdef WOLFSSL_KEIL
  36528. "adcs r4, r4, r7\n\t"
  36529. #elif defined(__clang__)
  36530. "adcs r4, r7\n\t"
  36531. #else
  36532. "adc r4, r7\n\t"
  36533. #endif
  36534. #ifdef WOLFSSL_KEIL
  36535. "adcs r5, r5, %[r]\n\t"
  36536. #elif defined(__clang__)
  36537. "adcs r5, %[r]\n\t"
  36538. #else
  36539. "adc r5, %[r]\n\t"
  36540. #endif
  36541. "# A[2] * B[7]\n\t"
  36542. "mov %[a], r9\n\t"
  36543. "mov %[b], r10\n\t"
  36544. "ldr %[a], [%[a], #8]\n\t"
  36545. "ldr %[b], [%[b], #28]\n\t"
  36546. "uxth r6, %[a]\n\t"
  36547. "uxth r7, %[b]\n\t"
  36548. #ifdef WOLFSSL_KEIL
  36549. "muls r7, r6, r7\n\t"
  36550. #elif defined(__clang__)
  36551. "muls r7, r6\n\t"
  36552. #else
  36553. "mul r7, r6\n\t"
  36554. #endif
  36555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36556. "adds r3, r3, r7\n\t"
  36557. #else
  36558. "add r3, r3, r7\n\t"
  36559. #endif
  36560. #ifdef WOLFSSL_KEIL
  36561. "adcs r4, r4, %[r]\n\t"
  36562. #elif defined(__clang__)
  36563. "adcs r4, %[r]\n\t"
  36564. #else
  36565. "adc r4, %[r]\n\t"
  36566. #endif
  36567. #ifdef WOLFSSL_KEIL
  36568. "adcs r5, r5, %[r]\n\t"
  36569. #elif defined(__clang__)
  36570. "adcs r5, %[r]\n\t"
  36571. #else
  36572. "adc r5, %[r]\n\t"
  36573. #endif
  36574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36575. "lsrs r7, %[b], #16\n\t"
  36576. #else
  36577. "lsr r7, %[b], #16\n\t"
  36578. #endif
  36579. #ifdef WOLFSSL_KEIL
  36580. "muls r6, r7, r6\n\t"
  36581. #elif defined(__clang__)
  36582. "muls r6, r7\n\t"
  36583. #else
  36584. "mul r6, r7\n\t"
  36585. #endif
  36586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36587. "lsrs r7, r6, #16\n\t"
  36588. #else
  36589. "lsr r7, r6, #16\n\t"
  36590. #endif
  36591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36592. "lsls r6, r6, #16\n\t"
  36593. #else
  36594. "lsl r6, r6, #16\n\t"
  36595. #endif
  36596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36597. "adds r3, r3, r6\n\t"
  36598. #else
  36599. "add r3, r3, r6\n\t"
  36600. #endif
  36601. #ifdef WOLFSSL_KEIL
  36602. "adcs r4, r4, r7\n\t"
  36603. #elif defined(__clang__)
  36604. "adcs r4, r7\n\t"
  36605. #else
  36606. "adc r4, r7\n\t"
  36607. #endif
  36608. #ifdef WOLFSSL_KEIL
  36609. "adcs r5, r5, %[r]\n\t"
  36610. #elif defined(__clang__)
  36611. "adcs r5, %[r]\n\t"
  36612. #else
  36613. "adc r5, %[r]\n\t"
  36614. #endif
  36615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36616. "lsrs r6, %[a], #16\n\t"
  36617. #else
  36618. "lsr r6, %[a], #16\n\t"
  36619. #endif
  36620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36621. "lsrs r7, %[b], #16\n\t"
  36622. #else
  36623. "lsr r7, %[b], #16\n\t"
  36624. #endif
  36625. #ifdef WOLFSSL_KEIL
  36626. "muls r7, r6, r7\n\t"
  36627. #elif defined(__clang__)
  36628. "muls r7, r6\n\t"
  36629. #else
  36630. "mul r7, r6\n\t"
  36631. #endif
  36632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36633. "adds r4, r4, r7\n\t"
  36634. #else
  36635. "add r4, r4, r7\n\t"
  36636. #endif
  36637. #ifdef WOLFSSL_KEIL
  36638. "adcs r5, r5, %[r]\n\t"
  36639. #elif defined(__clang__)
  36640. "adcs r5, %[r]\n\t"
  36641. #else
  36642. "adc r5, %[r]\n\t"
  36643. #endif
  36644. "uxth r7, %[b]\n\t"
  36645. #ifdef WOLFSSL_KEIL
  36646. "muls r6, r7, r6\n\t"
  36647. #elif defined(__clang__)
  36648. "muls r6, r7\n\t"
  36649. #else
  36650. "mul r6, r7\n\t"
  36651. #endif
  36652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36653. "lsrs r7, r6, #16\n\t"
  36654. #else
  36655. "lsr r7, r6, #16\n\t"
  36656. #endif
  36657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36658. "lsls r6, r6, #16\n\t"
  36659. #else
  36660. "lsl r6, r6, #16\n\t"
  36661. #endif
  36662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36663. "adds r3, r3, r6\n\t"
  36664. #else
  36665. "add r3, r3, r6\n\t"
  36666. #endif
  36667. #ifdef WOLFSSL_KEIL
  36668. "adcs r4, r4, r7\n\t"
  36669. #elif defined(__clang__)
  36670. "adcs r4, r7\n\t"
  36671. #else
  36672. "adc r4, r7\n\t"
  36673. #endif
  36674. #ifdef WOLFSSL_KEIL
  36675. "adcs r5, r5, %[r]\n\t"
  36676. #elif defined(__clang__)
  36677. "adcs r5, %[r]\n\t"
  36678. #else
  36679. "adc r5, %[r]\n\t"
  36680. #endif
  36681. "# A[3] * B[6]\n\t"
  36682. "mov %[a], r9\n\t"
  36683. "mov %[b], r10\n\t"
  36684. "ldr %[a], [%[a], #12]\n\t"
  36685. "ldr %[b], [%[b], #24]\n\t"
  36686. "uxth r6, %[a]\n\t"
  36687. "uxth r7, %[b]\n\t"
  36688. #ifdef WOLFSSL_KEIL
  36689. "muls r7, r6, r7\n\t"
  36690. #elif defined(__clang__)
  36691. "muls r7, r6\n\t"
  36692. #else
  36693. "mul r7, r6\n\t"
  36694. #endif
  36695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36696. "adds r3, r3, r7\n\t"
  36697. #else
  36698. "add r3, r3, r7\n\t"
  36699. #endif
  36700. #ifdef WOLFSSL_KEIL
  36701. "adcs r4, r4, %[r]\n\t"
  36702. #elif defined(__clang__)
  36703. "adcs r4, %[r]\n\t"
  36704. #else
  36705. "adc r4, %[r]\n\t"
  36706. #endif
  36707. #ifdef WOLFSSL_KEIL
  36708. "adcs r5, r5, %[r]\n\t"
  36709. #elif defined(__clang__)
  36710. "adcs r5, %[r]\n\t"
  36711. #else
  36712. "adc r5, %[r]\n\t"
  36713. #endif
  36714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36715. "lsrs r7, %[b], #16\n\t"
  36716. #else
  36717. "lsr r7, %[b], #16\n\t"
  36718. #endif
  36719. #ifdef WOLFSSL_KEIL
  36720. "muls r6, r7, r6\n\t"
  36721. #elif defined(__clang__)
  36722. "muls r6, r7\n\t"
  36723. #else
  36724. "mul r6, r7\n\t"
  36725. #endif
  36726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36727. "lsrs r7, r6, #16\n\t"
  36728. #else
  36729. "lsr r7, r6, #16\n\t"
  36730. #endif
  36731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36732. "lsls r6, r6, #16\n\t"
  36733. #else
  36734. "lsl r6, r6, #16\n\t"
  36735. #endif
  36736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36737. "adds r3, r3, r6\n\t"
  36738. #else
  36739. "add r3, r3, r6\n\t"
  36740. #endif
  36741. #ifdef WOLFSSL_KEIL
  36742. "adcs r4, r4, r7\n\t"
  36743. #elif defined(__clang__)
  36744. "adcs r4, r7\n\t"
  36745. #else
  36746. "adc r4, r7\n\t"
  36747. #endif
  36748. #ifdef WOLFSSL_KEIL
  36749. "adcs r5, r5, %[r]\n\t"
  36750. #elif defined(__clang__)
  36751. "adcs r5, %[r]\n\t"
  36752. #else
  36753. "adc r5, %[r]\n\t"
  36754. #endif
  36755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36756. "lsrs r6, %[a], #16\n\t"
  36757. #else
  36758. "lsr r6, %[a], #16\n\t"
  36759. #endif
  36760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36761. "lsrs r7, %[b], #16\n\t"
  36762. #else
  36763. "lsr r7, %[b], #16\n\t"
  36764. #endif
  36765. #ifdef WOLFSSL_KEIL
  36766. "muls r7, r6, r7\n\t"
  36767. #elif defined(__clang__)
  36768. "muls r7, r6\n\t"
  36769. #else
  36770. "mul r7, r6\n\t"
  36771. #endif
  36772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36773. "adds r4, r4, r7\n\t"
  36774. #else
  36775. "add r4, r4, r7\n\t"
  36776. #endif
  36777. #ifdef WOLFSSL_KEIL
  36778. "adcs r5, r5, %[r]\n\t"
  36779. #elif defined(__clang__)
  36780. "adcs r5, %[r]\n\t"
  36781. #else
  36782. "adc r5, %[r]\n\t"
  36783. #endif
  36784. "uxth r7, %[b]\n\t"
  36785. #ifdef WOLFSSL_KEIL
  36786. "muls r6, r7, r6\n\t"
  36787. #elif defined(__clang__)
  36788. "muls r6, r7\n\t"
  36789. #else
  36790. "mul r6, r7\n\t"
  36791. #endif
  36792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36793. "lsrs r7, r6, #16\n\t"
  36794. #else
  36795. "lsr r7, r6, #16\n\t"
  36796. #endif
  36797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36798. "lsls r6, r6, #16\n\t"
  36799. #else
  36800. "lsl r6, r6, #16\n\t"
  36801. #endif
  36802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36803. "adds r3, r3, r6\n\t"
  36804. #else
  36805. "add r3, r3, r6\n\t"
  36806. #endif
  36807. #ifdef WOLFSSL_KEIL
  36808. "adcs r4, r4, r7\n\t"
  36809. #elif defined(__clang__)
  36810. "adcs r4, r7\n\t"
  36811. #else
  36812. "adc r4, r7\n\t"
  36813. #endif
  36814. #ifdef WOLFSSL_KEIL
  36815. "adcs r5, r5, %[r]\n\t"
  36816. #elif defined(__clang__)
  36817. "adcs r5, %[r]\n\t"
  36818. #else
  36819. "adc r5, %[r]\n\t"
  36820. #endif
  36821. "# A[4] * B[5]\n\t"
  36822. "mov %[a], r9\n\t"
  36823. "mov %[b], r10\n\t"
  36824. "ldr %[a], [%[a], #16]\n\t"
  36825. "ldr %[b], [%[b], #20]\n\t"
  36826. "uxth r6, %[a]\n\t"
  36827. "uxth r7, %[b]\n\t"
  36828. #ifdef WOLFSSL_KEIL
  36829. "muls r7, r6, r7\n\t"
  36830. #elif defined(__clang__)
  36831. "muls r7, r6\n\t"
  36832. #else
  36833. "mul r7, r6\n\t"
  36834. #endif
  36835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36836. "adds r3, r3, r7\n\t"
  36837. #else
  36838. "add r3, r3, r7\n\t"
  36839. #endif
  36840. #ifdef WOLFSSL_KEIL
  36841. "adcs r4, r4, %[r]\n\t"
  36842. #elif defined(__clang__)
  36843. "adcs r4, %[r]\n\t"
  36844. #else
  36845. "adc r4, %[r]\n\t"
  36846. #endif
  36847. #ifdef WOLFSSL_KEIL
  36848. "adcs r5, r5, %[r]\n\t"
  36849. #elif defined(__clang__)
  36850. "adcs r5, %[r]\n\t"
  36851. #else
  36852. "adc r5, %[r]\n\t"
  36853. #endif
  36854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36855. "lsrs r7, %[b], #16\n\t"
  36856. #else
  36857. "lsr r7, %[b], #16\n\t"
  36858. #endif
  36859. #ifdef WOLFSSL_KEIL
  36860. "muls r6, r7, r6\n\t"
  36861. #elif defined(__clang__)
  36862. "muls r6, r7\n\t"
  36863. #else
  36864. "mul r6, r7\n\t"
  36865. #endif
  36866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36867. "lsrs r7, r6, #16\n\t"
  36868. #else
  36869. "lsr r7, r6, #16\n\t"
  36870. #endif
  36871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36872. "lsls r6, r6, #16\n\t"
  36873. #else
  36874. "lsl r6, r6, #16\n\t"
  36875. #endif
  36876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36877. "adds r3, r3, r6\n\t"
  36878. #else
  36879. "add r3, r3, r6\n\t"
  36880. #endif
  36881. #ifdef WOLFSSL_KEIL
  36882. "adcs r4, r4, r7\n\t"
  36883. #elif defined(__clang__)
  36884. "adcs r4, r7\n\t"
  36885. #else
  36886. "adc r4, r7\n\t"
  36887. #endif
  36888. #ifdef WOLFSSL_KEIL
  36889. "adcs r5, r5, %[r]\n\t"
  36890. #elif defined(__clang__)
  36891. "adcs r5, %[r]\n\t"
  36892. #else
  36893. "adc r5, %[r]\n\t"
  36894. #endif
  36895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36896. "lsrs r6, %[a], #16\n\t"
  36897. #else
  36898. "lsr r6, %[a], #16\n\t"
  36899. #endif
  36900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36901. "lsrs r7, %[b], #16\n\t"
  36902. #else
  36903. "lsr r7, %[b], #16\n\t"
  36904. #endif
  36905. #ifdef WOLFSSL_KEIL
  36906. "muls r7, r6, r7\n\t"
  36907. #elif defined(__clang__)
  36908. "muls r7, r6\n\t"
  36909. #else
  36910. "mul r7, r6\n\t"
  36911. #endif
  36912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36913. "adds r4, r4, r7\n\t"
  36914. #else
  36915. "add r4, r4, r7\n\t"
  36916. #endif
  36917. #ifdef WOLFSSL_KEIL
  36918. "adcs r5, r5, %[r]\n\t"
  36919. #elif defined(__clang__)
  36920. "adcs r5, %[r]\n\t"
  36921. #else
  36922. "adc r5, %[r]\n\t"
  36923. #endif
  36924. "uxth r7, %[b]\n\t"
  36925. #ifdef WOLFSSL_KEIL
  36926. "muls r6, r7, r6\n\t"
  36927. #elif defined(__clang__)
  36928. "muls r6, r7\n\t"
  36929. #else
  36930. "mul r6, r7\n\t"
  36931. #endif
  36932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36933. "lsrs r7, r6, #16\n\t"
  36934. #else
  36935. "lsr r7, r6, #16\n\t"
  36936. #endif
  36937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36938. "lsls r6, r6, #16\n\t"
  36939. #else
  36940. "lsl r6, r6, #16\n\t"
  36941. #endif
  36942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36943. "adds r3, r3, r6\n\t"
  36944. #else
  36945. "add r3, r3, r6\n\t"
  36946. #endif
  36947. #ifdef WOLFSSL_KEIL
  36948. "adcs r4, r4, r7\n\t"
  36949. #elif defined(__clang__)
  36950. "adcs r4, r7\n\t"
  36951. #else
  36952. "adc r4, r7\n\t"
  36953. #endif
  36954. #ifdef WOLFSSL_KEIL
  36955. "adcs r5, r5, %[r]\n\t"
  36956. #elif defined(__clang__)
  36957. "adcs r5, %[r]\n\t"
  36958. #else
  36959. "adc r5, %[r]\n\t"
  36960. #endif
  36961. "# A[5] * B[4]\n\t"
  36962. "mov %[a], r9\n\t"
  36963. "mov %[b], r10\n\t"
  36964. "ldr %[a], [%[a], #20]\n\t"
  36965. "ldr %[b], [%[b], #16]\n\t"
  36966. "uxth r6, %[a]\n\t"
  36967. "uxth r7, %[b]\n\t"
  36968. #ifdef WOLFSSL_KEIL
  36969. "muls r7, r6, r7\n\t"
  36970. #elif defined(__clang__)
  36971. "muls r7, r6\n\t"
  36972. #else
  36973. "mul r7, r6\n\t"
  36974. #endif
  36975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36976. "adds r3, r3, r7\n\t"
  36977. #else
  36978. "add r3, r3, r7\n\t"
  36979. #endif
  36980. #ifdef WOLFSSL_KEIL
  36981. "adcs r4, r4, %[r]\n\t"
  36982. #elif defined(__clang__)
  36983. "adcs r4, %[r]\n\t"
  36984. #else
  36985. "adc r4, %[r]\n\t"
  36986. #endif
  36987. #ifdef WOLFSSL_KEIL
  36988. "adcs r5, r5, %[r]\n\t"
  36989. #elif defined(__clang__)
  36990. "adcs r5, %[r]\n\t"
  36991. #else
  36992. "adc r5, %[r]\n\t"
  36993. #endif
  36994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36995. "lsrs r7, %[b], #16\n\t"
  36996. #else
  36997. "lsr r7, %[b], #16\n\t"
  36998. #endif
  36999. #ifdef WOLFSSL_KEIL
  37000. "muls r6, r7, r6\n\t"
  37001. #elif defined(__clang__)
  37002. "muls r6, r7\n\t"
  37003. #else
  37004. "mul r6, r7\n\t"
  37005. #endif
  37006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37007. "lsrs r7, r6, #16\n\t"
  37008. #else
  37009. "lsr r7, r6, #16\n\t"
  37010. #endif
  37011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37012. "lsls r6, r6, #16\n\t"
  37013. #else
  37014. "lsl r6, r6, #16\n\t"
  37015. #endif
  37016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37017. "adds r3, r3, r6\n\t"
  37018. #else
  37019. "add r3, r3, r6\n\t"
  37020. #endif
  37021. #ifdef WOLFSSL_KEIL
  37022. "adcs r4, r4, r7\n\t"
  37023. #elif defined(__clang__)
  37024. "adcs r4, r7\n\t"
  37025. #else
  37026. "adc r4, r7\n\t"
  37027. #endif
  37028. #ifdef WOLFSSL_KEIL
  37029. "adcs r5, r5, %[r]\n\t"
  37030. #elif defined(__clang__)
  37031. "adcs r5, %[r]\n\t"
  37032. #else
  37033. "adc r5, %[r]\n\t"
  37034. #endif
  37035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37036. "lsrs r6, %[a], #16\n\t"
  37037. #else
  37038. "lsr r6, %[a], #16\n\t"
  37039. #endif
  37040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37041. "lsrs r7, %[b], #16\n\t"
  37042. #else
  37043. "lsr r7, %[b], #16\n\t"
  37044. #endif
  37045. #ifdef WOLFSSL_KEIL
  37046. "muls r7, r6, r7\n\t"
  37047. #elif defined(__clang__)
  37048. "muls r7, r6\n\t"
  37049. #else
  37050. "mul r7, r6\n\t"
  37051. #endif
  37052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37053. "adds r4, r4, r7\n\t"
  37054. #else
  37055. "add r4, r4, r7\n\t"
  37056. #endif
  37057. #ifdef WOLFSSL_KEIL
  37058. "adcs r5, r5, %[r]\n\t"
  37059. #elif defined(__clang__)
  37060. "adcs r5, %[r]\n\t"
  37061. #else
  37062. "adc r5, %[r]\n\t"
  37063. #endif
  37064. "uxth r7, %[b]\n\t"
  37065. #ifdef WOLFSSL_KEIL
  37066. "muls r6, r7, r6\n\t"
  37067. #elif defined(__clang__)
  37068. "muls r6, r7\n\t"
  37069. #else
  37070. "mul r6, r7\n\t"
  37071. #endif
  37072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37073. "lsrs r7, r6, #16\n\t"
  37074. #else
  37075. "lsr r7, r6, #16\n\t"
  37076. #endif
  37077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37078. "lsls r6, r6, #16\n\t"
  37079. #else
  37080. "lsl r6, r6, #16\n\t"
  37081. #endif
  37082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37083. "adds r3, r3, r6\n\t"
  37084. #else
  37085. "add r3, r3, r6\n\t"
  37086. #endif
  37087. #ifdef WOLFSSL_KEIL
  37088. "adcs r4, r4, r7\n\t"
  37089. #elif defined(__clang__)
  37090. "adcs r4, r7\n\t"
  37091. #else
  37092. "adc r4, r7\n\t"
  37093. #endif
  37094. #ifdef WOLFSSL_KEIL
  37095. "adcs r5, r5, %[r]\n\t"
  37096. #elif defined(__clang__)
  37097. "adcs r5, %[r]\n\t"
  37098. #else
  37099. "adc r5, %[r]\n\t"
  37100. #endif
  37101. "# A[6] * B[3]\n\t"
  37102. "mov %[a], r9\n\t"
  37103. "mov %[b], r10\n\t"
  37104. "ldr %[a], [%[a], #24]\n\t"
  37105. "ldr %[b], [%[b], #12]\n\t"
  37106. "uxth r6, %[a]\n\t"
  37107. "uxth r7, %[b]\n\t"
  37108. #ifdef WOLFSSL_KEIL
  37109. "muls r7, r6, r7\n\t"
  37110. #elif defined(__clang__)
  37111. "muls r7, r6\n\t"
  37112. #else
  37113. "mul r7, r6\n\t"
  37114. #endif
  37115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37116. "adds r3, r3, r7\n\t"
  37117. #else
  37118. "add r3, r3, r7\n\t"
  37119. #endif
  37120. #ifdef WOLFSSL_KEIL
  37121. "adcs r4, r4, %[r]\n\t"
  37122. #elif defined(__clang__)
  37123. "adcs r4, %[r]\n\t"
  37124. #else
  37125. "adc r4, %[r]\n\t"
  37126. #endif
  37127. #ifdef WOLFSSL_KEIL
  37128. "adcs r5, r5, %[r]\n\t"
  37129. #elif defined(__clang__)
  37130. "adcs r5, %[r]\n\t"
  37131. #else
  37132. "adc r5, %[r]\n\t"
  37133. #endif
  37134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37135. "lsrs r7, %[b], #16\n\t"
  37136. #else
  37137. "lsr r7, %[b], #16\n\t"
  37138. #endif
  37139. #ifdef WOLFSSL_KEIL
  37140. "muls r6, r7, r6\n\t"
  37141. #elif defined(__clang__)
  37142. "muls r6, r7\n\t"
  37143. #else
  37144. "mul r6, r7\n\t"
  37145. #endif
  37146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37147. "lsrs r7, r6, #16\n\t"
  37148. #else
  37149. "lsr r7, r6, #16\n\t"
  37150. #endif
  37151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37152. "lsls r6, r6, #16\n\t"
  37153. #else
  37154. "lsl r6, r6, #16\n\t"
  37155. #endif
  37156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37157. "adds r3, r3, r6\n\t"
  37158. #else
  37159. "add r3, r3, r6\n\t"
  37160. #endif
  37161. #ifdef WOLFSSL_KEIL
  37162. "adcs r4, r4, r7\n\t"
  37163. #elif defined(__clang__)
  37164. "adcs r4, r7\n\t"
  37165. #else
  37166. "adc r4, r7\n\t"
  37167. #endif
  37168. #ifdef WOLFSSL_KEIL
  37169. "adcs r5, r5, %[r]\n\t"
  37170. #elif defined(__clang__)
  37171. "adcs r5, %[r]\n\t"
  37172. #else
  37173. "adc r5, %[r]\n\t"
  37174. #endif
  37175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37176. "lsrs r6, %[a], #16\n\t"
  37177. #else
  37178. "lsr r6, %[a], #16\n\t"
  37179. #endif
  37180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37181. "lsrs r7, %[b], #16\n\t"
  37182. #else
  37183. "lsr r7, %[b], #16\n\t"
  37184. #endif
  37185. #ifdef WOLFSSL_KEIL
  37186. "muls r7, r6, r7\n\t"
  37187. #elif defined(__clang__)
  37188. "muls r7, r6\n\t"
  37189. #else
  37190. "mul r7, r6\n\t"
  37191. #endif
  37192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37193. "adds r4, r4, r7\n\t"
  37194. #else
  37195. "add r4, r4, r7\n\t"
  37196. #endif
  37197. #ifdef WOLFSSL_KEIL
  37198. "adcs r5, r5, %[r]\n\t"
  37199. #elif defined(__clang__)
  37200. "adcs r5, %[r]\n\t"
  37201. #else
  37202. "adc r5, %[r]\n\t"
  37203. #endif
  37204. "uxth r7, %[b]\n\t"
  37205. #ifdef WOLFSSL_KEIL
  37206. "muls r6, r7, r6\n\t"
  37207. #elif defined(__clang__)
  37208. "muls r6, r7\n\t"
  37209. #else
  37210. "mul r6, r7\n\t"
  37211. #endif
  37212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37213. "lsrs r7, r6, #16\n\t"
  37214. #else
  37215. "lsr r7, r6, #16\n\t"
  37216. #endif
  37217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37218. "lsls r6, r6, #16\n\t"
  37219. #else
  37220. "lsl r6, r6, #16\n\t"
  37221. #endif
  37222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37223. "adds r3, r3, r6\n\t"
  37224. #else
  37225. "add r3, r3, r6\n\t"
  37226. #endif
  37227. #ifdef WOLFSSL_KEIL
  37228. "adcs r4, r4, r7\n\t"
  37229. #elif defined(__clang__)
  37230. "adcs r4, r7\n\t"
  37231. #else
  37232. "adc r4, r7\n\t"
  37233. #endif
  37234. #ifdef WOLFSSL_KEIL
  37235. "adcs r5, r5, %[r]\n\t"
  37236. #elif defined(__clang__)
  37237. "adcs r5, %[r]\n\t"
  37238. #else
  37239. "adc r5, %[r]\n\t"
  37240. #endif
  37241. "# A[7] * B[2]\n\t"
  37242. "mov %[a], r9\n\t"
  37243. "mov %[b], r10\n\t"
  37244. "ldr %[a], [%[a], #28]\n\t"
  37245. "ldr %[b], [%[b], #8]\n\t"
  37246. "uxth r6, %[a]\n\t"
  37247. "uxth r7, %[b]\n\t"
  37248. #ifdef WOLFSSL_KEIL
  37249. "muls r7, r6, r7\n\t"
  37250. #elif defined(__clang__)
  37251. "muls r7, r6\n\t"
  37252. #else
  37253. "mul r7, r6\n\t"
  37254. #endif
  37255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37256. "adds r3, r3, r7\n\t"
  37257. #else
  37258. "add r3, r3, r7\n\t"
  37259. #endif
  37260. #ifdef WOLFSSL_KEIL
  37261. "adcs r4, r4, %[r]\n\t"
  37262. #elif defined(__clang__)
  37263. "adcs r4, %[r]\n\t"
  37264. #else
  37265. "adc r4, %[r]\n\t"
  37266. #endif
  37267. #ifdef WOLFSSL_KEIL
  37268. "adcs r5, r5, %[r]\n\t"
  37269. #elif defined(__clang__)
  37270. "adcs r5, %[r]\n\t"
  37271. #else
  37272. "adc r5, %[r]\n\t"
  37273. #endif
  37274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37275. "lsrs r7, %[b], #16\n\t"
  37276. #else
  37277. "lsr r7, %[b], #16\n\t"
  37278. #endif
  37279. #ifdef WOLFSSL_KEIL
  37280. "muls r6, r7, r6\n\t"
  37281. #elif defined(__clang__)
  37282. "muls r6, r7\n\t"
  37283. #else
  37284. "mul r6, r7\n\t"
  37285. #endif
  37286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37287. "lsrs r7, r6, #16\n\t"
  37288. #else
  37289. "lsr r7, r6, #16\n\t"
  37290. #endif
  37291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37292. "lsls r6, r6, #16\n\t"
  37293. #else
  37294. "lsl r6, r6, #16\n\t"
  37295. #endif
  37296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37297. "adds r3, r3, r6\n\t"
  37298. #else
  37299. "add r3, r3, r6\n\t"
  37300. #endif
  37301. #ifdef WOLFSSL_KEIL
  37302. "adcs r4, r4, r7\n\t"
  37303. #elif defined(__clang__)
  37304. "adcs r4, r7\n\t"
  37305. #else
  37306. "adc r4, r7\n\t"
  37307. #endif
  37308. #ifdef WOLFSSL_KEIL
  37309. "adcs r5, r5, %[r]\n\t"
  37310. #elif defined(__clang__)
  37311. "adcs r5, %[r]\n\t"
  37312. #else
  37313. "adc r5, %[r]\n\t"
  37314. #endif
  37315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37316. "lsrs r6, %[a], #16\n\t"
  37317. #else
  37318. "lsr r6, %[a], #16\n\t"
  37319. #endif
  37320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37321. "lsrs r7, %[b], #16\n\t"
  37322. #else
  37323. "lsr r7, %[b], #16\n\t"
  37324. #endif
  37325. #ifdef WOLFSSL_KEIL
  37326. "muls r7, r6, r7\n\t"
  37327. #elif defined(__clang__)
  37328. "muls r7, r6\n\t"
  37329. #else
  37330. "mul r7, r6\n\t"
  37331. #endif
  37332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37333. "adds r4, r4, r7\n\t"
  37334. #else
  37335. "add r4, r4, r7\n\t"
  37336. #endif
  37337. #ifdef WOLFSSL_KEIL
  37338. "adcs r5, r5, %[r]\n\t"
  37339. #elif defined(__clang__)
  37340. "adcs r5, %[r]\n\t"
  37341. #else
  37342. "adc r5, %[r]\n\t"
  37343. #endif
  37344. "uxth r7, %[b]\n\t"
  37345. #ifdef WOLFSSL_KEIL
  37346. "muls r6, r7, r6\n\t"
  37347. #elif defined(__clang__)
  37348. "muls r6, r7\n\t"
  37349. #else
  37350. "mul r6, r7\n\t"
  37351. #endif
  37352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37353. "lsrs r7, r6, #16\n\t"
  37354. #else
  37355. "lsr r7, r6, #16\n\t"
  37356. #endif
  37357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37358. "lsls r6, r6, #16\n\t"
  37359. #else
  37360. "lsl r6, r6, #16\n\t"
  37361. #endif
  37362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37363. "adds r3, r3, r6\n\t"
  37364. #else
  37365. "add r3, r3, r6\n\t"
  37366. #endif
  37367. #ifdef WOLFSSL_KEIL
  37368. "adcs r4, r4, r7\n\t"
  37369. #elif defined(__clang__)
  37370. "adcs r4, r7\n\t"
  37371. #else
  37372. "adc r4, r7\n\t"
  37373. #endif
  37374. #ifdef WOLFSSL_KEIL
  37375. "adcs r5, r5, %[r]\n\t"
  37376. #elif defined(__clang__)
  37377. "adcs r5, %[r]\n\t"
  37378. #else
  37379. "adc r5, %[r]\n\t"
  37380. #endif
  37381. "# A[8] * B[1]\n\t"
  37382. "mov %[a], r9\n\t"
  37383. "mov %[b], r10\n\t"
  37384. "ldr %[a], [%[a], #32]\n\t"
  37385. "ldr %[b], [%[b], #4]\n\t"
  37386. "uxth r6, %[a]\n\t"
  37387. "uxth r7, %[b]\n\t"
  37388. #ifdef WOLFSSL_KEIL
  37389. "muls r7, r6, r7\n\t"
  37390. #elif defined(__clang__)
  37391. "muls r7, r6\n\t"
  37392. #else
  37393. "mul r7, r6\n\t"
  37394. #endif
  37395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37396. "adds r3, r3, r7\n\t"
  37397. #else
  37398. "add r3, r3, r7\n\t"
  37399. #endif
  37400. #ifdef WOLFSSL_KEIL
  37401. "adcs r4, r4, %[r]\n\t"
  37402. #elif defined(__clang__)
  37403. "adcs r4, %[r]\n\t"
  37404. #else
  37405. "adc r4, %[r]\n\t"
  37406. #endif
  37407. #ifdef WOLFSSL_KEIL
  37408. "adcs r5, r5, %[r]\n\t"
  37409. #elif defined(__clang__)
  37410. "adcs r5, %[r]\n\t"
  37411. #else
  37412. "adc r5, %[r]\n\t"
  37413. #endif
  37414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37415. "lsrs r7, %[b], #16\n\t"
  37416. #else
  37417. "lsr r7, %[b], #16\n\t"
  37418. #endif
  37419. #ifdef WOLFSSL_KEIL
  37420. "muls r6, r7, r6\n\t"
  37421. #elif defined(__clang__)
  37422. "muls r6, r7\n\t"
  37423. #else
  37424. "mul r6, r7\n\t"
  37425. #endif
  37426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37427. "lsrs r7, r6, #16\n\t"
  37428. #else
  37429. "lsr r7, r6, #16\n\t"
  37430. #endif
  37431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37432. "lsls r6, r6, #16\n\t"
  37433. #else
  37434. "lsl r6, r6, #16\n\t"
  37435. #endif
  37436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37437. "adds r3, r3, r6\n\t"
  37438. #else
  37439. "add r3, r3, r6\n\t"
  37440. #endif
  37441. #ifdef WOLFSSL_KEIL
  37442. "adcs r4, r4, r7\n\t"
  37443. #elif defined(__clang__)
  37444. "adcs r4, r7\n\t"
  37445. #else
  37446. "adc r4, r7\n\t"
  37447. #endif
  37448. #ifdef WOLFSSL_KEIL
  37449. "adcs r5, r5, %[r]\n\t"
  37450. #elif defined(__clang__)
  37451. "adcs r5, %[r]\n\t"
  37452. #else
  37453. "adc r5, %[r]\n\t"
  37454. #endif
  37455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37456. "lsrs r6, %[a], #16\n\t"
  37457. #else
  37458. "lsr r6, %[a], #16\n\t"
  37459. #endif
  37460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37461. "lsrs r7, %[b], #16\n\t"
  37462. #else
  37463. "lsr r7, %[b], #16\n\t"
  37464. #endif
  37465. #ifdef WOLFSSL_KEIL
  37466. "muls r7, r6, r7\n\t"
  37467. #elif defined(__clang__)
  37468. "muls r7, r6\n\t"
  37469. #else
  37470. "mul r7, r6\n\t"
  37471. #endif
  37472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37473. "adds r4, r4, r7\n\t"
  37474. #else
  37475. "add r4, r4, r7\n\t"
  37476. #endif
  37477. #ifdef WOLFSSL_KEIL
  37478. "adcs r5, r5, %[r]\n\t"
  37479. #elif defined(__clang__)
  37480. "adcs r5, %[r]\n\t"
  37481. #else
  37482. "adc r5, %[r]\n\t"
  37483. #endif
  37484. "uxth r7, %[b]\n\t"
  37485. #ifdef WOLFSSL_KEIL
  37486. "muls r6, r7, r6\n\t"
  37487. #elif defined(__clang__)
  37488. "muls r6, r7\n\t"
  37489. #else
  37490. "mul r6, r7\n\t"
  37491. #endif
  37492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37493. "lsrs r7, r6, #16\n\t"
  37494. #else
  37495. "lsr r7, r6, #16\n\t"
  37496. #endif
  37497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37498. "lsls r6, r6, #16\n\t"
  37499. #else
  37500. "lsl r6, r6, #16\n\t"
  37501. #endif
  37502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37503. "adds r3, r3, r6\n\t"
  37504. #else
  37505. "add r3, r3, r6\n\t"
  37506. #endif
  37507. #ifdef WOLFSSL_KEIL
  37508. "adcs r4, r4, r7\n\t"
  37509. #elif defined(__clang__)
  37510. "adcs r4, r7\n\t"
  37511. #else
  37512. "adc r4, r7\n\t"
  37513. #endif
  37514. #ifdef WOLFSSL_KEIL
  37515. "adcs r5, r5, %[r]\n\t"
  37516. #elif defined(__clang__)
  37517. "adcs r5, %[r]\n\t"
  37518. #else
  37519. "adc r5, %[r]\n\t"
  37520. #endif
  37521. "# A[9] * B[0]\n\t"
  37522. "mov %[a], r9\n\t"
  37523. "mov %[b], r10\n\t"
  37524. "ldr %[a], [%[a], #36]\n\t"
  37525. "ldr %[b], [%[b]]\n\t"
  37526. "uxth r6, %[a]\n\t"
  37527. "uxth r7, %[b]\n\t"
  37528. #ifdef WOLFSSL_KEIL
  37529. "muls r7, r6, r7\n\t"
  37530. #elif defined(__clang__)
  37531. "muls r7, r6\n\t"
  37532. #else
  37533. "mul r7, r6\n\t"
  37534. #endif
  37535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37536. "adds r3, r3, r7\n\t"
  37537. #else
  37538. "add r3, r3, r7\n\t"
  37539. #endif
  37540. #ifdef WOLFSSL_KEIL
  37541. "adcs r4, r4, %[r]\n\t"
  37542. #elif defined(__clang__)
  37543. "adcs r4, %[r]\n\t"
  37544. #else
  37545. "adc r4, %[r]\n\t"
  37546. #endif
  37547. #ifdef WOLFSSL_KEIL
  37548. "adcs r5, r5, %[r]\n\t"
  37549. #elif defined(__clang__)
  37550. "adcs r5, %[r]\n\t"
  37551. #else
  37552. "adc r5, %[r]\n\t"
  37553. #endif
  37554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37555. "lsrs r7, %[b], #16\n\t"
  37556. #else
  37557. "lsr r7, %[b], #16\n\t"
  37558. #endif
  37559. #ifdef WOLFSSL_KEIL
  37560. "muls r6, r7, r6\n\t"
  37561. #elif defined(__clang__)
  37562. "muls r6, r7\n\t"
  37563. #else
  37564. "mul r6, r7\n\t"
  37565. #endif
  37566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37567. "lsrs r7, r6, #16\n\t"
  37568. #else
  37569. "lsr r7, r6, #16\n\t"
  37570. #endif
  37571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37572. "lsls r6, r6, #16\n\t"
  37573. #else
  37574. "lsl r6, r6, #16\n\t"
  37575. #endif
  37576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37577. "adds r3, r3, r6\n\t"
  37578. #else
  37579. "add r3, r3, r6\n\t"
  37580. #endif
  37581. #ifdef WOLFSSL_KEIL
  37582. "adcs r4, r4, r7\n\t"
  37583. #elif defined(__clang__)
  37584. "adcs r4, r7\n\t"
  37585. #else
  37586. "adc r4, r7\n\t"
  37587. #endif
  37588. #ifdef WOLFSSL_KEIL
  37589. "adcs r5, r5, %[r]\n\t"
  37590. #elif defined(__clang__)
  37591. "adcs r5, %[r]\n\t"
  37592. #else
  37593. "adc r5, %[r]\n\t"
  37594. #endif
  37595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37596. "lsrs r6, %[a], #16\n\t"
  37597. #else
  37598. "lsr r6, %[a], #16\n\t"
  37599. #endif
  37600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37601. "lsrs r7, %[b], #16\n\t"
  37602. #else
  37603. "lsr r7, %[b], #16\n\t"
  37604. #endif
  37605. #ifdef WOLFSSL_KEIL
  37606. "muls r7, r6, r7\n\t"
  37607. #elif defined(__clang__)
  37608. "muls r7, r6\n\t"
  37609. #else
  37610. "mul r7, r6\n\t"
  37611. #endif
  37612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37613. "adds r4, r4, r7\n\t"
  37614. #else
  37615. "add r4, r4, r7\n\t"
  37616. #endif
  37617. #ifdef WOLFSSL_KEIL
  37618. "adcs r5, r5, %[r]\n\t"
  37619. #elif defined(__clang__)
  37620. "adcs r5, %[r]\n\t"
  37621. #else
  37622. "adc r5, %[r]\n\t"
  37623. #endif
  37624. "uxth r7, %[b]\n\t"
  37625. #ifdef WOLFSSL_KEIL
  37626. "muls r6, r7, r6\n\t"
  37627. #elif defined(__clang__)
  37628. "muls r6, r7\n\t"
  37629. #else
  37630. "mul r6, r7\n\t"
  37631. #endif
  37632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37633. "lsrs r7, r6, #16\n\t"
  37634. #else
  37635. "lsr r7, r6, #16\n\t"
  37636. #endif
  37637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37638. "lsls r6, r6, #16\n\t"
  37639. #else
  37640. "lsl r6, r6, #16\n\t"
  37641. #endif
  37642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37643. "adds r3, r3, r6\n\t"
  37644. #else
  37645. "add r3, r3, r6\n\t"
  37646. #endif
  37647. #ifdef WOLFSSL_KEIL
  37648. "adcs r4, r4, r7\n\t"
  37649. #elif defined(__clang__)
  37650. "adcs r4, r7\n\t"
  37651. #else
  37652. "adc r4, r7\n\t"
  37653. #endif
  37654. #ifdef WOLFSSL_KEIL
  37655. "adcs r5, r5, %[r]\n\t"
  37656. #elif defined(__clang__)
  37657. "adcs r5, %[r]\n\t"
  37658. #else
  37659. "adc r5, %[r]\n\t"
  37660. #endif
  37661. "str r3, [sp, #36]\n\t"
  37662. "# A[10] * B[0]\n\t"
  37663. "movs r3, #0\n\t"
  37664. "mov %[a], r9\n\t"
  37665. "mov %[b], r10\n\t"
  37666. "ldr %[a], [%[a], #40]\n\t"
  37667. "ldr %[b], [%[b]]\n\t"
  37668. "uxth r6, %[a]\n\t"
  37669. "uxth r7, %[b]\n\t"
  37670. #ifdef WOLFSSL_KEIL
  37671. "muls r7, r6, r7\n\t"
  37672. #elif defined(__clang__)
  37673. "muls r7, r6\n\t"
  37674. #else
  37675. "mul r7, r6\n\t"
  37676. #endif
  37677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37678. "adds r4, r4, r7\n\t"
  37679. #else
  37680. "add r4, r4, r7\n\t"
  37681. #endif
  37682. #ifdef WOLFSSL_KEIL
  37683. "adcs r5, r5, %[r]\n\t"
  37684. #elif defined(__clang__)
  37685. "adcs r5, %[r]\n\t"
  37686. #else
  37687. "adc r5, %[r]\n\t"
  37688. #endif
  37689. #ifdef WOLFSSL_KEIL
  37690. "adcs r3, r3, %[r]\n\t"
  37691. #elif defined(__clang__)
  37692. "adcs r3, %[r]\n\t"
  37693. #else
  37694. "adc r3, %[r]\n\t"
  37695. #endif
  37696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37697. "lsrs r7, %[b], #16\n\t"
  37698. #else
  37699. "lsr r7, %[b], #16\n\t"
  37700. #endif
  37701. #ifdef WOLFSSL_KEIL
  37702. "muls r6, r7, r6\n\t"
  37703. #elif defined(__clang__)
  37704. "muls r6, r7\n\t"
  37705. #else
  37706. "mul r6, r7\n\t"
  37707. #endif
  37708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37709. "lsrs r7, r6, #16\n\t"
  37710. #else
  37711. "lsr r7, r6, #16\n\t"
  37712. #endif
  37713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37714. "lsls r6, r6, #16\n\t"
  37715. #else
  37716. "lsl r6, r6, #16\n\t"
  37717. #endif
  37718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37719. "adds r4, r4, r6\n\t"
  37720. #else
  37721. "add r4, r4, r6\n\t"
  37722. #endif
  37723. #ifdef WOLFSSL_KEIL
  37724. "adcs r5, r5, r7\n\t"
  37725. #elif defined(__clang__)
  37726. "adcs r5, r7\n\t"
  37727. #else
  37728. "adc r5, r7\n\t"
  37729. #endif
  37730. #ifdef WOLFSSL_KEIL
  37731. "adcs r3, r3, %[r]\n\t"
  37732. #elif defined(__clang__)
  37733. "adcs r3, %[r]\n\t"
  37734. #else
  37735. "adc r3, %[r]\n\t"
  37736. #endif
  37737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37738. "lsrs r6, %[a], #16\n\t"
  37739. #else
  37740. "lsr r6, %[a], #16\n\t"
  37741. #endif
  37742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37743. "lsrs r7, %[b], #16\n\t"
  37744. #else
  37745. "lsr r7, %[b], #16\n\t"
  37746. #endif
  37747. #ifdef WOLFSSL_KEIL
  37748. "muls r7, r6, r7\n\t"
  37749. #elif defined(__clang__)
  37750. "muls r7, r6\n\t"
  37751. #else
  37752. "mul r7, r6\n\t"
  37753. #endif
  37754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37755. "adds r5, r5, r7\n\t"
  37756. #else
  37757. "add r5, r5, r7\n\t"
  37758. #endif
  37759. #ifdef WOLFSSL_KEIL
  37760. "adcs r3, r3, %[r]\n\t"
  37761. #elif defined(__clang__)
  37762. "adcs r3, %[r]\n\t"
  37763. #else
  37764. "adc r3, %[r]\n\t"
  37765. #endif
  37766. "uxth r7, %[b]\n\t"
  37767. #ifdef WOLFSSL_KEIL
  37768. "muls r6, r7, r6\n\t"
  37769. #elif defined(__clang__)
  37770. "muls r6, r7\n\t"
  37771. #else
  37772. "mul r6, r7\n\t"
  37773. #endif
  37774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37775. "lsrs r7, r6, #16\n\t"
  37776. #else
  37777. "lsr r7, r6, #16\n\t"
  37778. #endif
  37779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37780. "lsls r6, r6, #16\n\t"
  37781. #else
  37782. "lsl r6, r6, #16\n\t"
  37783. #endif
  37784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37785. "adds r4, r4, r6\n\t"
  37786. #else
  37787. "add r4, r4, r6\n\t"
  37788. #endif
  37789. #ifdef WOLFSSL_KEIL
  37790. "adcs r5, r5, r7\n\t"
  37791. #elif defined(__clang__)
  37792. "adcs r5, r7\n\t"
  37793. #else
  37794. "adc r5, r7\n\t"
  37795. #endif
  37796. #ifdef WOLFSSL_KEIL
  37797. "adcs r3, r3, %[r]\n\t"
  37798. #elif defined(__clang__)
  37799. "adcs r3, %[r]\n\t"
  37800. #else
  37801. "adc r3, %[r]\n\t"
  37802. #endif
  37803. "# A[9] * B[1]\n\t"
  37804. "mov %[a], r9\n\t"
  37805. "mov %[b], r10\n\t"
  37806. "ldr %[a], [%[a], #36]\n\t"
  37807. "ldr %[b], [%[b], #4]\n\t"
  37808. "uxth r6, %[a]\n\t"
  37809. "uxth r7, %[b]\n\t"
  37810. #ifdef WOLFSSL_KEIL
  37811. "muls r7, r6, r7\n\t"
  37812. #elif defined(__clang__)
  37813. "muls r7, r6\n\t"
  37814. #else
  37815. "mul r7, r6\n\t"
  37816. #endif
  37817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37818. "adds r4, r4, r7\n\t"
  37819. #else
  37820. "add r4, r4, r7\n\t"
  37821. #endif
  37822. #ifdef WOLFSSL_KEIL
  37823. "adcs r5, r5, %[r]\n\t"
  37824. #elif defined(__clang__)
  37825. "adcs r5, %[r]\n\t"
  37826. #else
  37827. "adc r5, %[r]\n\t"
  37828. #endif
  37829. #ifdef WOLFSSL_KEIL
  37830. "adcs r3, r3, %[r]\n\t"
  37831. #elif defined(__clang__)
  37832. "adcs r3, %[r]\n\t"
  37833. #else
  37834. "adc r3, %[r]\n\t"
  37835. #endif
  37836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37837. "lsrs r7, %[b], #16\n\t"
  37838. #else
  37839. "lsr r7, %[b], #16\n\t"
  37840. #endif
  37841. #ifdef WOLFSSL_KEIL
  37842. "muls r6, r7, r6\n\t"
  37843. #elif defined(__clang__)
  37844. "muls r6, r7\n\t"
  37845. #else
  37846. "mul r6, r7\n\t"
  37847. #endif
  37848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37849. "lsrs r7, r6, #16\n\t"
  37850. #else
  37851. "lsr r7, r6, #16\n\t"
  37852. #endif
  37853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37854. "lsls r6, r6, #16\n\t"
  37855. #else
  37856. "lsl r6, r6, #16\n\t"
  37857. #endif
  37858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37859. "adds r4, r4, r6\n\t"
  37860. #else
  37861. "add r4, r4, r6\n\t"
  37862. #endif
  37863. #ifdef WOLFSSL_KEIL
  37864. "adcs r5, r5, r7\n\t"
  37865. #elif defined(__clang__)
  37866. "adcs r5, r7\n\t"
  37867. #else
  37868. "adc r5, r7\n\t"
  37869. #endif
  37870. #ifdef WOLFSSL_KEIL
  37871. "adcs r3, r3, %[r]\n\t"
  37872. #elif defined(__clang__)
  37873. "adcs r3, %[r]\n\t"
  37874. #else
  37875. "adc r3, %[r]\n\t"
  37876. #endif
  37877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37878. "lsrs r6, %[a], #16\n\t"
  37879. #else
  37880. "lsr r6, %[a], #16\n\t"
  37881. #endif
  37882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37883. "lsrs r7, %[b], #16\n\t"
  37884. #else
  37885. "lsr r7, %[b], #16\n\t"
  37886. #endif
  37887. #ifdef WOLFSSL_KEIL
  37888. "muls r7, r6, r7\n\t"
  37889. #elif defined(__clang__)
  37890. "muls r7, r6\n\t"
  37891. #else
  37892. "mul r7, r6\n\t"
  37893. #endif
  37894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37895. "adds r5, r5, r7\n\t"
  37896. #else
  37897. "add r5, r5, r7\n\t"
  37898. #endif
  37899. #ifdef WOLFSSL_KEIL
  37900. "adcs r3, r3, %[r]\n\t"
  37901. #elif defined(__clang__)
  37902. "adcs r3, %[r]\n\t"
  37903. #else
  37904. "adc r3, %[r]\n\t"
  37905. #endif
  37906. "uxth r7, %[b]\n\t"
  37907. #ifdef WOLFSSL_KEIL
  37908. "muls r6, r7, r6\n\t"
  37909. #elif defined(__clang__)
  37910. "muls r6, r7\n\t"
  37911. #else
  37912. "mul r6, r7\n\t"
  37913. #endif
  37914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37915. "lsrs r7, r6, #16\n\t"
  37916. #else
  37917. "lsr r7, r6, #16\n\t"
  37918. #endif
  37919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37920. "lsls r6, r6, #16\n\t"
  37921. #else
  37922. "lsl r6, r6, #16\n\t"
  37923. #endif
  37924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37925. "adds r4, r4, r6\n\t"
  37926. #else
  37927. "add r4, r4, r6\n\t"
  37928. #endif
  37929. #ifdef WOLFSSL_KEIL
  37930. "adcs r5, r5, r7\n\t"
  37931. #elif defined(__clang__)
  37932. "adcs r5, r7\n\t"
  37933. #else
  37934. "adc r5, r7\n\t"
  37935. #endif
  37936. #ifdef WOLFSSL_KEIL
  37937. "adcs r3, r3, %[r]\n\t"
  37938. #elif defined(__clang__)
  37939. "adcs r3, %[r]\n\t"
  37940. #else
  37941. "adc r3, %[r]\n\t"
  37942. #endif
  37943. "# A[8] * B[2]\n\t"
  37944. "mov %[a], r9\n\t"
  37945. "mov %[b], r10\n\t"
  37946. "ldr %[a], [%[a], #32]\n\t"
  37947. "ldr %[b], [%[b], #8]\n\t"
  37948. "uxth r6, %[a]\n\t"
  37949. "uxth r7, %[b]\n\t"
  37950. #ifdef WOLFSSL_KEIL
  37951. "muls r7, r6, r7\n\t"
  37952. #elif defined(__clang__)
  37953. "muls r7, r6\n\t"
  37954. #else
  37955. "mul r7, r6\n\t"
  37956. #endif
  37957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37958. "adds r4, r4, r7\n\t"
  37959. #else
  37960. "add r4, r4, r7\n\t"
  37961. #endif
  37962. #ifdef WOLFSSL_KEIL
  37963. "adcs r5, r5, %[r]\n\t"
  37964. #elif defined(__clang__)
  37965. "adcs r5, %[r]\n\t"
  37966. #else
  37967. "adc r5, %[r]\n\t"
  37968. #endif
  37969. #ifdef WOLFSSL_KEIL
  37970. "adcs r3, r3, %[r]\n\t"
  37971. #elif defined(__clang__)
  37972. "adcs r3, %[r]\n\t"
  37973. #else
  37974. "adc r3, %[r]\n\t"
  37975. #endif
  37976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37977. "lsrs r7, %[b], #16\n\t"
  37978. #else
  37979. "lsr r7, %[b], #16\n\t"
  37980. #endif
  37981. #ifdef WOLFSSL_KEIL
  37982. "muls r6, r7, r6\n\t"
  37983. #elif defined(__clang__)
  37984. "muls r6, r7\n\t"
  37985. #else
  37986. "mul r6, r7\n\t"
  37987. #endif
  37988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37989. "lsrs r7, r6, #16\n\t"
  37990. #else
  37991. "lsr r7, r6, #16\n\t"
  37992. #endif
  37993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37994. "lsls r6, r6, #16\n\t"
  37995. #else
  37996. "lsl r6, r6, #16\n\t"
  37997. #endif
  37998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37999. "adds r4, r4, r6\n\t"
  38000. #else
  38001. "add r4, r4, r6\n\t"
  38002. #endif
  38003. #ifdef WOLFSSL_KEIL
  38004. "adcs r5, r5, r7\n\t"
  38005. #elif defined(__clang__)
  38006. "adcs r5, r7\n\t"
  38007. #else
  38008. "adc r5, r7\n\t"
  38009. #endif
  38010. #ifdef WOLFSSL_KEIL
  38011. "adcs r3, r3, %[r]\n\t"
  38012. #elif defined(__clang__)
  38013. "adcs r3, %[r]\n\t"
  38014. #else
  38015. "adc r3, %[r]\n\t"
  38016. #endif
  38017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38018. "lsrs r6, %[a], #16\n\t"
  38019. #else
  38020. "lsr r6, %[a], #16\n\t"
  38021. #endif
  38022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38023. "lsrs r7, %[b], #16\n\t"
  38024. #else
  38025. "lsr r7, %[b], #16\n\t"
  38026. #endif
  38027. #ifdef WOLFSSL_KEIL
  38028. "muls r7, r6, r7\n\t"
  38029. #elif defined(__clang__)
  38030. "muls r7, r6\n\t"
  38031. #else
  38032. "mul r7, r6\n\t"
  38033. #endif
  38034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38035. "adds r5, r5, r7\n\t"
  38036. #else
  38037. "add r5, r5, r7\n\t"
  38038. #endif
  38039. #ifdef WOLFSSL_KEIL
  38040. "adcs r3, r3, %[r]\n\t"
  38041. #elif defined(__clang__)
  38042. "adcs r3, %[r]\n\t"
  38043. #else
  38044. "adc r3, %[r]\n\t"
  38045. #endif
  38046. "uxth r7, %[b]\n\t"
  38047. #ifdef WOLFSSL_KEIL
  38048. "muls r6, r7, r6\n\t"
  38049. #elif defined(__clang__)
  38050. "muls r6, r7\n\t"
  38051. #else
  38052. "mul r6, r7\n\t"
  38053. #endif
  38054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38055. "lsrs r7, r6, #16\n\t"
  38056. #else
  38057. "lsr r7, r6, #16\n\t"
  38058. #endif
  38059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38060. "lsls r6, r6, #16\n\t"
  38061. #else
  38062. "lsl r6, r6, #16\n\t"
  38063. #endif
  38064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38065. "adds r4, r4, r6\n\t"
  38066. #else
  38067. "add r4, r4, r6\n\t"
  38068. #endif
  38069. #ifdef WOLFSSL_KEIL
  38070. "adcs r5, r5, r7\n\t"
  38071. #elif defined(__clang__)
  38072. "adcs r5, r7\n\t"
  38073. #else
  38074. "adc r5, r7\n\t"
  38075. #endif
  38076. #ifdef WOLFSSL_KEIL
  38077. "adcs r3, r3, %[r]\n\t"
  38078. #elif defined(__clang__)
  38079. "adcs r3, %[r]\n\t"
  38080. #else
  38081. "adc r3, %[r]\n\t"
  38082. #endif
  38083. "# A[7] * B[3]\n\t"
  38084. "mov %[a], r9\n\t"
  38085. "mov %[b], r10\n\t"
  38086. "ldr %[a], [%[a], #28]\n\t"
  38087. "ldr %[b], [%[b], #12]\n\t"
  38088. "uxth r6, %[a]\n\t"
  38089. "uxth r7, %[b]\n\t"
  38090. #ifdef WOLFSSL_KEIL
  38091. "muls r7, r6, r7\n\t"
  38092. #elif defined(__clang__)
  38093. "muls r7, r6\n\t"
  38094. #else
  38095. "mul r7, r6\n\t"
  38096. #endif
  38097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38098. "adds r4, r4, r7\n\t"
  38099. #else
  38100. "add r4, r4, r7\n\t"
  38101. #endif
  38102. #ifdef WOLFSSL_KEIL
  38103. "adcs r5, r5, %[r]\n\t"
  38104. #elif defined(__clang__)
  38105. "adcs r5, %[r]\n\t"
  38106. #else
  38107. "adc r5, %[r]\n\t"
  38108. #endif
  38109. #ifdef WOLFSSL_KEIL
  38110. "adcs r3, r3, %[r]\n\t"
  38111. #elif defined(__clang__)
  38112. "adcs r3, %[r]\n\t"
  38113. #else
  38114. "adc r3, %[r]\n\t"
  38115. #endif
  38116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38117. "lsrs r7, %[b], #16\n\t"
  38118. #else
  38119. "lsr r7, %[b], #16\n\t"
  38120. #endif
  38121. #ifdef WOLFSSL_KEIL
  38122. "muls r6, r7, r6\n\t"
  38123. #elif defined(__clang__)
  38124. "muls r6, r7\n\t"
  38125. #else
  38126. "mul r6, r7\n\t"
  38127. #endif
  38128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38129. "lsrs r7, r6, #16\n\t"
  38130. #else
  38131. "lsr r7, r6, #16\n\t"
  38132. #endif
  38133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38134. "lsls r6, r6, #16\n\t"
  38135. #else
  38136. "lsl r6, r6, #16\n\t"
  38137. #endif
  38138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38139. "adds r4, r4, r6\n\t"
  38140. #else
  38141. "add r4, r4, r6\n\t"
  38142. #endif
  38143. #ifdef WOLFSSL_KEIL
  38144. "adcs r5, r5, r7\n\t"
  38145. #elif defined(__clang__)
  38146. "adcs r5, r7\n\t"
  38147. #else
  38148. "adc r5, r7\n\t"
  38149. #endif
  38150. #ifdef WOLFSSL_KEIL
  38151. "adcs r3, r3, %[r]\n\t"
  38152. #elif defined(__clang__)
  38153. "adcs r3, %[r]\n\t"
  38154. #else
  38155. "adc r3, %[r]\n\t"
  38156. #endif
  38157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38158. "lsrs r6, %[a], #16\n\t"
  38159. #else
  38160. "lsr r6, %[a], #16\n\t"
  38161. #endif
  38162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38163. "lsrs r7, %[b], #16\n\t"
  38164. #else
  38165. "lsr r7, %[b], #16\n\t"
  38166. #endif
  38167. #ifdef WOLFSSL_KEIL
  38168. "muls r7, r6, r7\n\t"
  38169. #elif defined(__clang__)
  38170. "muls r7, r6\n\t"
  38171. #else
  38172. "mul r7, r6\n\t"
  38173. #endif
  38174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38175. "adds r5, r5, r7\n\t"
  38176. #else
  38177. "add r5, r5, r7\n\t"
  38178. #endif
  38179. #ifdef WOLFSSL_KEIL
  38180. "adcs r3, r3, %[r]\n\t"
  38181. #elif defined(__clang__)
  38182. "adcs r3, %[r]\n\t"
  38183. #else
  38184. "adc r3, %[r]\n\t"
  38185. #endif
  38186. "uxth r7, %[b]\n\t"
  38187. #ifdef WOLFSSL_KEIL
  38188. "muls r6, r7, r6\n\t"
  38189. #elif defined(__clang__)
  38190. "muls r6, r7\n\t"
  38191. #else
  38192. "mul r6, r7\n\t"
  38193. #endif
  38194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38195. "lsrs r7, r6, #16\n\t"
  38196. #else
  38197. "lsr r7, r6, #16\n\t"
  38198. #endif
  38199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38200. "lsls r6, r6, #16\n\t"
  38201. #else
  38202. "lsl r6, r6, #16\n\t"
  38203. #endif
  38204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38205. "adds r4, r4, r6\n\t"
  38206. #else
  38207. "add r4, r4, r6\n\t"
  38208. #endif
  38209. #ifdef WOLFSSL_KEIL
  38210. "adcs r5, r5, r7\n\t"
  38211. #elif defined(__clang__)
  38212. "adcs r5, r7\n\t"
  38213. #else
  38214. "adc r5, r7\n\t"
  38215. #endif
  38216. #ifdef WOLFSSL_KEIL
  38217. "adcs r3, r3, %[r]\n\t"
  38218. #elif defined(__clang__)
  38219. "adcs r3, %[r]\n\t"
  38220. #else
  38221. "adc r3, %[r]\n\t"
  38222. #endif
  38223. "# A[6] * B[4]\n\t"
  38224. "mov %[a], r9\n\t"
  38225. "mov %[b], r10\n\t"
  38226. "ldr %[a], [%[a], #24]\n\t"
  38227. "ldr %[b], [%[b], #16]\n\t"
  38228. "uxth r6, %[a]\n\t"
  38229. "uxth r7, %[b]\n\t"
  38230. #ifdef WOLFSSL_KEIL
  38231. "muls r7, r6, r7\n\t"
  38232. #elif defined(__clang__)
  38233. "muls r7, r6\n\t"
  38234. #else
  38235. "mul r7, r6\n\t"
  38236. #endif
  38237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38238. "adds r4, r4, r7\n\t"
  38239. #else
  38240. "add r4, r4, r7\n\t"
  38241. #endif
  38242. #ifdef WOLFSSL_KEIL
  38243. "adcs r5, r5, %[r]\n\t"
  38244. #elif defined(__clang__)
  38245. "adcs r5, %[r]\n\t"
  38246. #else
  38247. "adc r5, %[r]\n\t"
  38248. #endif
  38249. #ifdef WOLFSSL_KEIL
  38250. "adcs r3, r3, %[r]\n\t"
  38251. #elif defined(__clang__)
  38252. "adcs r3, %[r]\n\t"
  38253. #else
  38254. "adc r3, %[r]\n\t"
  38255. #endif
  38256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38257. "lsrs r7, %[b], #16\n\t"
  38258. #else
  38259. "lsr r7, %[b], #16\n\t"
  38260. #endif
  38261. #ifdef WOLFSSL_KEIL
  38262. "muls r6, r7, r6\n\t"
  38263. #elif defined(__clang__)
  38264. "muls r6, r7\n\t"
  38265. #else
  38266. "mul r6, r7\n\t"
  38267. #endif
  38268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38269. "lsrs r7, r6, #16\n\t"
  38270. #else
  38271. "lsr r7, r6, #16\n\t"
  38272. #endif
  38273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38274. "lsls r6, r6, #16\n\t"
  38275. #else
  38276. "lsl r6, r6, #16\n\t"
  38277. #endif
  38278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38279. "adds r4, r4, r6\n\t"
  38280. #else
  38281. "add r4, r4, r6\n\t"
  38282. #endif
  38283. #ifdef WOLFSSL_KEIL
  38284. "adcs r5, r5, r7\n\t"
  38285. #elif defined(__clang__)
  38286. "adcs r5, r7\n\t"
  38287. #else
  38288. "adc r5, r7\n\t"
  38289. #endif
  38290. #ifdef WOLFSSL_KEIL
  38291. "adcs r3, r3, %[r]\n\t"
  38292. #elif defined(__clang__)
  38293. "adcs r3, %[r]\n\t"
  38294. #else
  38295. "adc r3, %[r]\n\t"
  38296. #endif
  38297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38298. "lsrs r6, %[a], #16\n\t"
  38299. #else
  38300. "lsr r6, %[a], #16\n\t"
  38301. #endif
  38302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38303. "lsrs r7, %[b], #16\n\t"
  38304. #else
  38305. "lsr r7, %[b], #16\n\t"
  38306. #endif
  38307. #ifdef WOLFSSL_KEIL
  38308. "muls r7, r6, r7\n\t"
  38309. #elif defined(__clang__)
  38310. "muls r7, r6\n\t"
  38311. #else
  38312. "mul r7, r6\n\t"
  38313. #endif
  38314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38315. "adds r5, r5, r7\n\t"
  38316. #else
  38317. "add r5, r5, r7\n\t"
  38318. #endif
  38319. #ifdef WOLFSSL_KEIL
  38320. "adcs r3, r3, %[r]\n\t"
  38321. #elif defined(__clang__)
  38322. "adcs r3, %[r]\n\t"
  38323. #else
  38324. "adc r3, %[r]\n\t"
  38325. #endif
  38326. "uxth r7, %[b]\n\t"
  38327. #ifdef WOLFSSL_KEIL
  38328. "muls r6, r7, r6\n\t"
  38329. #elif defined(__clang__)
  38330. "muls r6, r7\n\t"
  38331. #else
  38332. "mul r6, r7\n\t"
  38333. #endif
  38334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38335. "lsrs r7, r6, #16\n\t"
  38336. #else
  38337. "lsr r7, r6, #16\n\t"
  38338. #endif
  38339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38340. "lsls r6, r6, #16\n\t"
  38341. #else
  38342. "lsl r6, r6, #16\n\t"
  38343. #endif
  38344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38345. "adds r4, r4, r6\n\t"
  38346. #else
  38347. "add r4, r4, r6\n\t"
  38348. #endif
  38349. #ifdef WOLFSSL_KEIL
  38350. "adcs r5, r5, r7\n\t"
  38351. #elif defined(__clang__)
  38352. "adcs r5, r7\n\t"
  38353. #else
  38354. "adc r5, r7\n\t"
  38355. #endif
  38356. #ifdef WOLFSSL_KEIL
  38357. "adcs r3, r3, %[r]\n\t"
  38358. #elif defined(__clang__)
  38359. "adcs r3, %[r]\n\t"
  38360. #else
  38361. "adc r3, %[r]\n\t"
  38362. #endif
  38363. "# A[5] * B[5]\n\t"
  38364. "mov %[a], r9\n\t"
  38365. "mov %[b], r10\n\t"
  38366. "ldr %[a], [%[a], #20]\n\t"
  38367. "ldr %[b], [%[b], #20]\n\t"
  38368. "uxth r6, %[a]\n\t"
  38369. "uxth r7, %[b]\n\t"
  38370. #ifdef WOLFSSL_KEIL
  38371. "muls r7, r6, r7\n\t"
  38372. #elif defined(__clang__)
  38373. "muls r7, r6\n\t"
  38374. #else
  38375. "mul r7, r6\n\t"
  38376. #endif
  38377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38378. "adds r4, r4, r7\n\t"
  38379. #else
  38380. "add r4, r4, r7\n\t"
  38381. #endif
  38382. #ifdef WOLFSSL_KEIL
  38383. "adcs r5, r5, %[r]\n\t"
  38384. #elif defined(__clang__)
  38385. "adcs r5, %[r]\n\t"
  38386. #else
  38387. "adc r5, %[r]\n\t"
  38388. #endif
  38389. #ifdef WOLFSSL_KEIL
  38390. "adcs r3, r3, %[r]\n\t"
  38391. #elif defined(__clang__)
  38392. "adcs r3, %[r]\n\t"
  38393. #else
  38394. "adc r3, %[r]\n\t"
  38395. #endif
  38396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38397. "lsrs r7, %[b], #16\n\t"
  38398. #else
  38399. "lsr r7, %[b], #16\n\t"
  38400. #endif
  38401. #ifdef WOLFSSL_KEIL
  38402. "muls r6, r7, r6\n\t"
  38403. #elif defined(__clang__)
  38404. "muls r6, r7\n\t"
  38405. #else
  38406. "mul r6, r7\n\t"
  38407. #endif
  38408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38409. "lsrs r7, r6, #16\n\t"
  38410. #else
  38411. "lsr r7, r6, #16\n\t"
  38412. #endif
  38413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38414. "lsls r6, r6, #16\n\t"
  38415. #else
  38416. "lsl r6, r6, #16\n\t"
  38417. #endif
  38418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38419. "adds r4, r4, r6\n\t"
  38420. #else
  38421. "add r4, r4, r6\n\t"
  38422. #endif
  38423. #ifdef WOLFSSL_KEIL
  38424. "adcs r5, r5, r7\n\t"
  38425. #elif defined(__clang__)
  38426. "adcs r5, r7\n\t"
  38427. #else
  38428. "adc r5, r7\n\t"
  38429. #endif
  38430. #ifdef WOLFSSL_KEIL
  38431. "adcs r3, r3, %[r]\n\t"
  38432. #elif defined(__clang__)
  38433. "adcs r3, %[r]\n\t"
  38434. #else
  38435. "adc r3, %[r]\n\t"
  38436. #endif
  38437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38438. "lsrs r6, %[a], #16\n\t"
  38439. #else
  38440. "lsr r6, %[a], #16\n\t"
  38441. #endif
  38442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38443. "lsrs r7, %[b], #16\n\t"
  38444. #else
  38445. "lsr r7, %[b], #16\n\t"
  38446. #endif
  38447. #ifdef WOLFSSL_KEIL
  38448. "muls r7, r6, r7\n\t"
  38449. #elif defined(__clang__)
  38450. "muls r7, r6\n\t"
  38451. #else
  38452. "mul r7, r6\n\t"
  38453. #endif
  38454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38455. "adds r5, r5, r7\n\t"
  38456. #else
  38457. "add r5, r5, r7\n\t"
  38458. #endif
  38459. #ifdef WOLFSSL_KEIL
  38460. "adcs r3, r3, %[r]\n\t"
  38461. #elif defined(__clang__)
  38462. "adcs r3, %[r]\n\t"
  38463. #else
  38464. "adc r3, %[r]\n\t"
  38465. #endif
  38466. "uxth r7, %[b]\n\t"
  38467. #ifdef WOLFSSL_KEIL
  38468. "muls r6, r7, r6\n\t"
  38469. #elif defined(__clang__)
  38470. "muls r6, r7\n\t"
  38471. #else
  38472. "mul r6, r7\n\t"
  38473. #endif
  38474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38475. "lsrs r7, r6, #16\n\t"
  38476. #else
  38477. "lsr r7, r6, #16\n\t"
  38478. #endif
  38479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38480. "lsls r6, r6, #16\n\t"
  38481. #else
  38482. "lsl r6, r6, #16\n\t"
  38483. #endif
  38484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38485. "adds r4, r4, r6\n\t"
  38486. #else
  38487. "add r4, r4, r6\n\t"
  38488. #endif
  38489. #ifdef WOLFSSL_KEIL
  38490. "adcs r5, r5, r7\n\t"
  38491. #elif defined(__clang__)
  38492. "adcs r5, r7\n\t"
  38493. #else
  38494. "adc r5, r7\n\t"
  38495. #endif
  38496. #ifdef WOLFSSL_KEIL
  38497. "adcs r3, r3, %[r]\n\t"
  38498. #elif defined(__clang__)
  38499. "adcs r3, %[r]\n\t"
  38500. #else
  38501. "adc r3, %[r]\n\t"
  38502. #endif
  38503. "# A[4] * B[6]\n\t"
  38504. "mov %[a], r9\n\t"
  38505. "mov %[b], r10\n\t"
  38506. "ldr %[a], [%[a], #16]\n\t"
  38507. "ldr %[b], [%[b], #24]\n\t"
  38508. "uxth r6, %[a]\n\t"
  38509. "uxth r7, %[b]\n\t"
  38510. #ifdef WOLFSSL_KEIL
  38511. "muls r7, r6, r7\n\t"
  38512. #elif defined(__clang__)
  38513. "muls r7, r6\n\t"
  38514. #else
  38515. "mul r7, r6\n\t"
  38516. #endif
  38517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38518. "adds r4, r4, r7\n\t"
  38519. #else
  38520. "add r4, r4, r7\n\t"
  38521. #endif
  38522. #ifdef WOLFSSL_KEIL
  38523. "adcs r5, r5, %[r]\n\t"
  38524. #elif defined(__clang__)
  38525. "adcs r5, %[r]\n\t"
  38526. #else
  38527. "adc r5, %[r]\n\t"
  38528. #endif
  38529. #ifdef WOLFSSL_KEIL
  38530. "adcs r3, r3, %[r]\n\t"
  38531. #elif defined(__clang__)
  38532. "adcs r3, %[r]\n\t"
  38533. #else
  38534. "adc r3, %[r]\n\t"
  38535. #endif
  38536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38537. "lsrs r7, %[b], #16\n\t"
  38538. #else
  38539. "lsr r7, %[b], #16\n\t"
  38540. #endif
  38541. #ifdef WOLFSSL_KEIL
  38542. "muls r6, r7, r6\n\t"
  38543. #elif defined(__clang__)
  38544. "muls r6, r7\n\t"
  38545. #else
  38546. "mul r6, r7\n\t"
  38547. #endif
  38548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38549. "lsrs r7, r6, #16\n\t"
  38550. #else
  38551. "lsr r7, r6, #16\n\t"
  38552. #endif
  38553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38554. "lsls r6, r6, #16\n\t"
  38555. #else
  38556. "lsl r6, r6, #16\n\t"
  38557. #endif
  38558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38559. "adds r4, r4, r6\n\t"
  38560. #else
  38561. "add r4, r4, r6\n\t"
  38562. #endif
  38563. #ifdef WOLFSSL_KEIL
  38564. "adcs r5, r5, r7\n\t"
  38565. #elif defined(__clang__)
  38566. "adcs r5, r7\n\t"
  38567. #else
  38568. "adc r5, r7\n\t"
  38569. #endif
  38570. #ifdef WOLFSSL_KEIL
  38571. "adcs r3, r3, %[r]\n\t"
  38572. #elif defined(__clang__)
  38573. "adcs r3, %[r]\n\t"
  38574. #else
  38575. "adc r3, %[r]\n\t"
  38576. #endif
  38577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38578. "lsrs r6, %[a], #16\n\t"
  38579. #else
  38580. "lsr r6, %[a], #16\n\t"
  38581. #endif
  38582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38583. "lsrs r7, %[b], #16\n\t"
  38584. #else
  38585. "lsr r7, %[b], #16\n\t"
  38586. #endif
  38587. #ifdef WOLFSSL_KEIL
  38588. "muls r7, r6, r7\n\t"
  38589. #elif defined(__clang__)
  38590. "muls r7, r6\n\t"
  38591. #else
  38592. "mul r7, r6\n\t"
  38593. #endif
  38594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38595. "adds r5, r5, r7\n\t"
  38596. #else
  38597. "add r5, r5, r7\n\t"
  38598. #endif
  38599. #ifdef WOLFSSL_KEIL
  38600. "adcs r3, r3, %[r]\n\t"
  38601. #elif defined(__clang__)
  38602. "adcs r3, %[r]\n\t"
  38603. #else
  38604. "adc r3, %[r]\n\t"
  38605. #endif
  38606. "uxth r7, %[b]\n\t"
  38607. #ifdef WOLFSSL_KEIL
  38608. "muls r6, r7, r6\n\t"
  38609. #elif defined(__clang__)
  38610. "muls r6, r7\n\t"
  38611. #else
  38612. "mul r6, r7\n\t"
  38613. #endif
  38614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38615. "lsrs r7, r6, #16\n\t"
  38616. #else
  38617. "lsr r7, r6, #16\n\t"
  38618. #endif
  38619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38620. "lsls r6, r6, #16\n\t"
  38621. #else
  38622. "lsl r6, r6, #16\n\t"
  38623. #endif
  38624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38625. "adds r4, r4, r6\n\t"
  38626. #else
  38627. "add r4, r4, r6\n\t"
  38628. #endif
  38629. #ifdef WOLFSSL_KEIL
  38630. "adcs r5, r5, r7\n\t"
  38631. #elif defined(__clang__)
  38632. "adcs r5, r7\n\t"
  38633. #else
  38634. "adc r5, r7\n\t"
  38635. #endif
  38636. #ifdef WOLFSSL_KEIL
  38637. "adcs r3, r3, %[r]\n\t"
  38638. #elif defined(__clang__)
  38639. "adcs r3, %[r]\n\t"
  38640. #else
  38641. "adc r3, %[r]\n\t"
  38642. #endif
  38643. "# A[3] * B[7]\n\t"
  38644. "mov %[a], r9\n\t"
  38645. "mov %[b], r10\n\t"
  38646. "ldr %[a], [%[a], #12]\n\t"
  38647. "ldr %[b], [%[b], #28]\n\t"
  38648. "uxth r6, %[a]\n\t"
  38649. "uxth r7, %[b]\n\t"
  38650. #ifdef WOLFSSL_KEIL
  38651. "muls r7, r6, r7\n\t"
  38652. #elif defined(__clang__)
  38653. "muls r7, r6\n\t"
  38654. #else
  38655. "mul r7, r6\n\t"
  38656. #endif
  38657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38658. "adds r4, r4, r7\n\t"
  38659. #else
  38660. "add r4, r4, r7\n\t"
  38661. #endif
  38662. #ifdef WOLFSSL_KEIL
  38663. "adcs r5, r5, %[r]\n\t"
  38664. #elif defined(__clang__)
  38665. "adcs r5, %[r]\n\t"
  38666. #else
  38667. "adc r5, %[r]\n\t"
  38668. #endif
  38669. #ifdef WOLFSSL_KEIL
  38670. "adcs r3, r3, %[r]\n\t"
  38671. #elif defined(__clang__)
  38672. "adcs r3, %[r]\n\t"
  38673. #else
  38674. "adc r3, %[r]\n\t"
  38675. #endif
  38676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38677. "lsrs r7, %[b], #16\n\t"
  38678. #else
  38679. "lsr r7, %[b], #16\n\t"
  38680. #endif
  38681. #ifdef WOLFSSL_KEIL
  38682. "muls r6, r7, r6\n\t"
  38683. #elif defined(__clang__)
  38684. "muls r6, r7\n\t"
  38685. #else
  38686. "mul r6, r7\n\t"
  38687. #endif
  38688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38689. "lsrs r7, r6, #16\n\t"
  38690. #else
  38691. "lsr r7, r6, #16\n\t"
  38692. #endif
  38693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38694. "lsls r6, r6, #16\n\t"
  38695. #else
  38696. "lsl r6, r6, #16\n\t"
  38697. #endif
  38698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38699. "adds r4, r4, r6\n\t"
  38700. #else
  38701. "add r4, r4, r6\n\t"
  38702. #endif
  38703. #ifdef WOLFSSL_KEIL
  38704. "adcs r5, r5, r7\n\t"
  38705. #elif defined(__clang__)
  38706. "adcs r5, r7\n\t"
  38707. #else
  38708. "adc r5, r7\n\t"
  38709. #endif
  38710. #ifdef WOLFSSL_KEIL
  38711. "adcs r3, r3, %[r]\n\t"
  38712. #elif defined(__clang__)
  38713. "adcs r3, %[r]\n\t"
  38714. #else
  38715. "adc r3, %[r]\n\t"
  38716. #endif
  38717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38718. "lsrs r6, %[a], #16\n\t"
  38719. #else
  38720. "lsr r6, %[a], #16\n\t"
  38721. #endif
  38722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38723. "lsrs r7, %[b], #16\n\t"
  38724. #else
  38725. "lsr r7, %[b], #16\n\t"
  38726. #endif
  38727. #ifdef WOLFSSL_KEIL
  38728. "muls r7, r6, r7\n\t"
  38729. #elif defined(__clang__)
  38730. "muls r7, r6\n\t"
  38731. #else
  38732. "mul r7, r6\n\t"
  38733. #endif
  38734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38735. "adds r5, r5, r7\n\t"
  38736. #else
  38737. "add r5, r5, r7\n\t"
  38738. #endif
  38739. #ifdef WOLFSSL_KEIL
  38740. "adcs r3, r3, %[r]\n\t"
  38741. #elif defined(__clang__)
  38742. "adcs r3, %[r]\n\t"
  38743. #else
  38744. "adc r3, %[r]\n\t"
  38745. #endif
  38746. "uxth r7, %[b]\n\t"
  38747. #ifdef WOLFSSL_KEIL
  38748. "muls r6, r7, r6\n\t"
  38749. #elif defined(__clang__)
  38750. "muls r6, r7\n\t"
  38751. #else
  38752. "mul r6, r7\n\t"
  38753. #endif
  38754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38755. "lsrs r7, r6, #16\n\t"
  38756. #else
  38757. "lsr r7, r6, #16\n\t"
  38758. #endif
  38759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38760. "lsls r6, r6, #16\n\t"
  38761. #else
  38762. "lsl r6, r6, #16\n\t"
  38763. #endif
  38764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38765. "adds r4, r4, r6\n\t"
  38766. #else
  38767. "add r4, r4, r6\n\t"
  38768. #endif
  38769. #ifdef WOLFSSL_KEIL
  38770. "adcs r5, r5, r7\n\t"
  38771. #elif defined(__clang__)
  38772. "adcs r5, r7\n\t"
  38773. #else
  38774. "adc r5, r7\n\t"
  38775. #endif
  38776. #ifdef WOLFSSL_KEIL
  38777. "adcs r3, r3, %[r]\n\t"
  38778. #elif defined(__clang__)
  38779. "adcs r3, %[r]\n\t"
  38780. #else
  38781. "adc r3, %[r]\n\t"
  38782. #endif
  38783. "# A[2] * B[8]\n\t"
  38784. "mov %[a], r9\n\t"
  38785. "mov %[b], r10\n\t"
  38786. "ldr %[a], [%[a], #8]\n\t"
  38787. "ldr %[b], [%[b], #32]\n\t"
  38788. "uxth r6, %[a]\n\t"
  38789. "uxth r7, %[b]\n\t"
  38790. #ifdef WOLFSSL_KEIL
  38791. "muls r7, r6, r7\n\t"
  38792. #elif defined(__clang__)
  38793. "muls r7, r6\n\t"
  38794. #else
  38795. "mul r7, r6\n\t"
  38796. #endif
  38797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38798. "adds r4, r4, r7\n\t"
  38799. #else
  38800. "add r4, r4, r7\n\t"
  38801. #endif
  38802. #ifdef WOLFSSL_KEIL
  38803. "adcs r5, r5, %[r]\n\t"
  38804. #elif defined(__clang__)
  38805. "adcs r5, %[r]\n\t"
  38806. #else
  38807. "adc r5, %[r]\n\t"
  38808. #endif
  38809. #ifdef WOLFSSL_KEIL
  38810. "adcs r3, r3, %[r]\n\t"
  38811. #elif defined(__clang__)
  38812. "adcs r3, %[r]\n\t"
  38813. #else
  38814. "adc r3, %[r]\n\t"
  38815. #endif
  38816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38817. "lsrs r7, %[b], #16\n\t"
  38818. #else
  38819. "lsr r7, %[b], #16\n\t"
  38820. #endif
  38821. #ifdef WOLFSSL_KEIL
  38822. "muls r6, r7, r6\n\t"
  38823. #elif defined(__clang__)
  38824. "muls r6, r7\n\t"
  38825. #else
  38826. "mul r6, r7\n\t"
  38827. #endif
  38828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38829. "lsrs r7, r6, #16\n\t"
  38830. #else
  38831. "lsr r7, r6, #16\n\t"
  38832. #endif
  38833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38834. "lsls r6, r6, #16\n\t"
  38835. #else
  38836. "lsl r6, r6, #16\n\t"
  38837. #endif
  38838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38839. "adds r4, r4, r6\n\t"
  38840. #else
  38841. "add r4, r4, r6\n\t"
  38842. #endif
  38843. #ifdef WOLFSSL_KEIL
  38844. "adcs r5, r5, r7\n\t"
  38845. #elif defined(__clang__)
  38846. "adcs r5, r7\n\t"
  38847. #else
  38848. "adc r5, r7\n\t"
  38849. #endif
  38850. #ifdef WOLFSSL_KEIL
  38851. "adcs r3, r3, %[r]\n\t"
  38852. #elif defined(__clang__)
  38853. "adcs r3, %[r]\n\t"
  38854. #else
  38855. "adc r3, %[r]\n\t"
  38856. #endif
  38857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38858. "lsrs r6, %[a], #16\n\t"
  38859. #else
  38860. "lsr r6, %[a], #16\n\t"
  38861. #endif
  38862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38863. "lsrs r7, %[b], #16\n\t"
  38864. #else
  38865. "lsr r7, %[b], #16\n\t"
  38866. #endif
  38867. #ifdef WOLFSSL_KEIL
  38868. "muls r7, r6, r7\n\t"
  38869. #elif defined(__clang__)
  38870. "muls r7, r6\n\t"
  38871. #else
  38872. "mul r7, r6\n\t"
  38873. #endif
  38874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38875. "adds r5, r5, r7\n\t"
  38876. #else
  38877. "add r5, r5, r7\n\t"
  38878. #endif
  38879. #ifdef WOLFSSL_KEIL
  38880. "adcs r3, r3, %[r]\n\t"
  38881. #elif defined(__clang__)
  38882. "adcs r3, %[r]\n\t"
  38883. #else
  38884. "adc r3, %[r]\n\t"
  38885. #endif
  38886. "uxth r7, %[b]\n\t"
  38887. #ifdef WOLFSSL_KEIL
  38888. "muls r6, r7, r6\n\t"
  38889. #elif defined(__clang__)
  38890. "muls r6, r7\n\t"
  38891. #else
  38892. "mul r6, r7\n\t"
  38893. #endif
  38894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38895. "lsrs r7, r6, #16\n\t"
  38896. #else
  38897. "lsr r7, r6, #16\n\t"
  38898. #endif
  38899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38900. "lsls r6, r6, #16\n\t"
  38901. #else
  38902. "lsl r6, r6, #16\n\t"
  38903. #endif
  38904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38905. "adds r4, r4, r6\n\t"
  38906. #else
  38907. "add r4, r4, r6\n\t"
  38908. #endif
  38909. #ifdef WOLFSSL_KEIL
  38910. "adcs r5, r5, r7\n\t"
  38911. #elif defined(__clang__)
  38912. "adcs r5, r7\n\t"
  38913. #else
  38914. "adc r5, r7\n\t"
  38915. #endif
  38916. #ifdef WOLFSSL_KEIL
  38917. "adcs r3, r3, %[r]\n\t"
  38918. #elif defined(__clang__)
  38919. "adcs r3, %[r]\n\t"
  38920. #else
  38921. "adc r3, %[r]\n\t"
  38922. #endif
  38923. "# A[1] * B[9]\n\t"
  38924. "mov %[a], r9\n\t"
  38925. "mov %[b], r10\n\t"
  38926. "ldr %[a], [%[a], #4]\n\t"
  38927. "ldr %[b], [%[b], #36]\n\t"
  38928. "uxth r6, %[a]\n\t"
  38929. "uxth r7, %[b]\n\t"
  38930. #ifdef WOLFSSL_KEIL
  38931. "muls r7, r6, r7\n\t"
  38932. #elif defined(__clang__)
  38933. "muls r7, r6\n\t"
  38934. #else
  38935. "mul r7, r6\n\t"
  38936. #endif
  38937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38938. "adds r4, r4, r7\n\t"
  38939. #else
  38940. "add r4, r4, r7\n\t"
  38941. #endif
  38942. #ifdef WOLFSSL_KEIL
  38943. "adcs r5, r5, %[r]\n\t"
  38944. #elif defined(__clang__)
  38945. "adcs r5, %[r]\n\t"
  38946. #else
  38947. "adc r5, %[r]\n\t"
  38948. #endif
  38949. #ifdef WOLFSSL_KEIL
  38950. "adcs r3, r3, %[r]\n\t"
  38951. #elif defined(__clang__)
  38952. "adcs r3, %[r]\n\t"
  38953. #else
  38954. "adc r3, %[r]\n\t"
  38955. #endif
  38956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38957. "lsrs r7, %[b], #16\n\t"
  38958. #else
  38959. "lsr r7, %[b], #16\n\t"
  38960. #endif
  38961. #ifdef WOLFSSL_KEIL
  38962. "muls r6, r7, r6\n\t"
  38963. #elif defined(__clang__)
  38964. "muls r6, r7\n\t"
  38965. #else
  38966. "mul r6, r7\n\t"
  38967. #endif
  38968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38969. "lsrs r7, r6, #16\n\t"
  38970. #else
  38971. "lsr r7, r6, #16\n\t"
  38972. #endif
  38973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38974. "lsls r6, r6, #16\n\t"
  38975. #else
  38976. "lsl r6, r6, #16\n\t"
  38977. #endif
  38978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38979. "adds r4, r4, r6\n\t"
  38980. #else
  38981. "add r4, r4, r6\n\t"
  38982. #endif
  38983. #ifdef WOLFSSL_KEIL
  38984. "adcs r5, r5, r7\n\t"
  38985. #elif defined(__clang__)
  38986. "adcs r5, r7\n\t"
  38987. #else
  38988. "adc r5, r7\n\t"
  38989. #endif
  38990. #ifdef WOLFSSL_KEIL
  38991. "adcs r3, r3, %[r]\n\t"
  38992. #elif defined(__clang__)
  38993. "adcs r3, %[r]\n\t"
  38994. #else
  38995. "adc r3, %[r]\n\t"
  38996. #endif
  38997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38998. "lsrs r6, %[a], #16\n\t"
  38999. #else
  39000. "lsr r6, %[a], #16\n\t"
  39001. #endif
  39002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39003. "lsrs r7, %[b], #16\n\t"
  39004. #else
  39005. "lsr r7, %[b], #16\n\t"
  39006. #endif
  39007. #ifdef WOLFSSL_KEIL
  39008. "muls r7, r6, r7\n\t"
  39009. #elif defined(__clang__)
  39010. "muls r7, r6\n\t"
  39011. #else
  39012. "mul r7, r6\n\t"
  39013. #endif
  39014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39015. "adds r5, r5, r7\n\t"
  39016. #else
  39017. "add r5, r5, r7\n\t"
  39018. #endif
  39019. #ifdef WOLFSSL_KEIL
  39020. "adcs r3, r3, %[r]\n\t"
  39021. #elif defined(__clang__)
  39022. "adcs r3, %[r]\n\t"
  39023. #else
  39024. "adc r3, %[r]\n\t"
  39025. #endif
  39026. "uxth r7, %[b]\n\t"
  39027. #ifdef WOLFSSL_KEIL
  39028. "muls r6, r7, r6\n\t"
  39029. #elif defined(__clang__)
  39030. "muls r6, r7\n\t"
  39031. #else
  39032. "mul r6, r7\n\t"
  39033. #endif
  39034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39035. "lsrs r7, r6, #16\n\t"
  39036. #else
  39037. "lsr r7, r6, #16\n\t"
  39038. #endif
  39039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39040. "lsls r6, r6, #16\n\t"
  39041. #else
  39042. "lsl r6, r6, #16\n\t"
  39043. #endif
  39044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39045. "adds r4, r4, r6\n\t"
  39046. #else
  39047. "add r4, r4, r6\n\t"
  39048. #endif
  39049. #ifdef WOLFSSL_KEIL
  39050. "adcs r5, r5, r7\n\t"
  39051. #elif defined(__clang__)
  39052. "adcs r5, r7\n\t"
  39053. #else
  39054. "adc r5, r7\n\t"
  39055. #endif
  39056. #ifdef WOLFSSL_KEIL
  39057. "adcs r3, r3, %[r]\n\t"
  39058. #elif defined(__clang__)
  39059. "adcs r3, %[r]\n\t"
  39060. #else
  39061. "adc r3, %[r]\n\t"
  39062. #endif
  39063. "# A[0] * B[10]\n\t"
  39064. "mov %[a], r9\n\t"
  39065. "mov %[b], r10\n\t"
  39066. "ldr %[a], [%[a]]\n\t"
  39067. "ldr %[b], [%[b], #40]\n\t"
  39068. "uxth r6, %[a]\n\t"
  39069. "uxth r7, %[b]\n\t"
  39070. #ifdef WOLFSSL_KEIL
  39071. "muls r7, r6, r7\n\t"
  39072. #elif defined(__clang__)
  39073. "muls r7, r6\n\t"
  39074. #else
  39075. "mul r7, r6\n\t"
  39076. #endif
  39077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39078. "adds r4, r4, r7\n\t"
  39079. #else
  39080. "add r4, r4, r7\n\t"
  39081. #endif
  39082. #ifdef WOLFSSL_KEIL
  39083. "adcs r5, r5, %[r]\n\t"
  39084. #elif defined(__clang__)
  39085. "adcs r5, %[r]\n\t"
  39086. #else
  39087. "adc r5, %[r]\n\t"
  39088. #endif
  39089. #ifdef WOLFSSL_KEIL
  39090. "adcs r3, r3, %[r]\n\t"
  39091. #elif defined(__clang__)
  39092. "adcs r3, %[r]\n\t"
  39093. #else
  39094. "adc r3, %[r]\n\t"
  39095. #endif
  39096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39097. "lsrs r7, %[b], #16\n\t"
  39098. #else
  39099. "lsr r7, %[b], #16\n\t"
  39100. #endif
  39101. #ifdef WOLFSSL_KEIL
  39102. "muls r6, r7, r6\n\t"
  39103. #elif defined(__clang__)
  39104. "muls r6, r7\n\t"
  39105. #else
  39106. "mul r6, r7\n\t"
  39107. #endif
  39108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39109. "lsrs r7, r6, #16\n\t"
  39110. #else
  39111. "lsr r7, r6, #16\n\t"
  39112. #endif
  39113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39114. "lsls r6, r6, #16\n\t"
  39115. #else
  39116. "lsl r6, r6, #16\n\t"
  39117. #endif
  39118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39119. "adds r4, r4, r6\n\t"
  39120. #else
  39121. "add r4, r4, r6\n\t"
  39122. #endif
  39123. #ifdef WOLFSSL_KEIL
  39124. "adcs r5, r5, r7\n\t"
  39125. #elif defined(__clang__)
  39126. "adcs r5, r7\n\t"
  39127. #else
  39128. "adc r5, r7\n\t"
  39129. #endif
  39130. #ifdef WOLFSSL_KEIL
  39131. "adcs r3, r3, %[r]\n\t"
  39132. #elif defined(__clang__)
  39133. "adcs r3, %[r]\n\t"
  39134. #else
  39135. "adc r3, %[r]\n\t"
  39136. #endif
  39137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39138. "lsrs r6, %[a], #16\n\t"
  39139. #else
  39140. "lsr r6, %[a], #16\n\t"
  39141. #endif
  39142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39143. "lsrs r7, %[b], #16\n\t"
  39144. #else
  39145. "lsr r7, %[b], #16\n\t"
  39146. #endif
  39147. #ifdef WOLFSSL_KEIL
  39148. "muls r7, r6, r7\n\t"
  39149. #elif defined(__clang__)
  39150. "muls r7, r6\n\t"
  39151. #else
  39152. "mul r7, r6\n\t"
  39153. #endif
  39154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39155. "adds r5, r5, r7\n\t"
  39156. #else
  39157. "add r5, r5, r7\n\t"
  39158. #endif
  39159. #ifdef WOLFSSL_KEIL
  39160. "adcs r3, r3, %[r]\n\t"
  39161. #elif defined(__clang__)
  39162. "adcs r3, %[r]\n\t"
  39163. #else
  39164. "adc r3, %[r]\n\t"
  39165. #endif
  39166. "uxth r7, %[b]\n\t"
  39167. #ifdef WOLFSSL_KEIL
  39168. "muls r6, r7, r6\n\t"
  39169. #elif defined(__clang__)
  39170. "muls r6, r7\n\t"
  39171. #else
  39172. "mul r6, r7\n\t"
  39173. #endif
  39174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39175. "lsrs r7, r6, #16\n\t"
  39176. #else
  39177. "lsr r7, r6, #16\n\t"
  39178. #endif
  39179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39180. "lsls r6, r6, #16\n\t"
  39181. #else
  39182. "lsl r6, r6, #16\n\t"
  39183. #endif
  39184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39185. "adds r4, r4, r6\n\t"
  39186. #else
  39187. "add r4, r4, r6\n\t"
  39188. #endif
  39189. #ifdef WOLFSSL_KEIL
  39190. "adcs r5, r5, r7\n\t"
  39191. #elif defined(__clang__)
  39192. "adcs r5, r7\n\t"
  39193. #else
  39194. "adc r5, r7\n\t"
  39195. #endif
  39196. #ifdef WOLFSSL_KEIL
  39197. "adcs r3, r3, %[r]\n\t"
  39198. #elif defined(__clang__)
  39199. "adcs r3, %[r]\n\t"
  39200. #else
  39201. "adc r3, %[r]\n\t"
  39202. #endif
  39203. "str r4, [sp, #40]\n\t"
  39204. "# A[0] * B[11]\n\t"
  39205. "movs r4, #0\n\t"
  39206. "mov %[a], r9\n\t"
  39207. "mov %[b], r10\n\t"
  39208. "ldr %[a], [%[a]]\n\t"
  39209. "ldr %[b], [%[b], #44]\n\t"
  39210. "uxth r6, %[a]\n\t"
  39211. "uxth r7, %[b]\n\t"
  39212. #ifdef WOLFSSL_KEIL
  39213. "muls r7, r6, r7\n\t"
  39214. #elif defined(__clang__)
  39215. "muls r7, r6\n\t"
  39216. #else
  39217. "mul r7, r6\n\t"
  39218. #endif
  39219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39220. "adds r5, r5, r7\n\t"
  39221. #else
  39222. "add r5, r5, r7\n\t"
  39223. #endif
  39224. #ifdef WOLFSSL_KEIL
  39225. "adcs r3, r3, %[r]\n\t"
  39226. #elif defined(__clang__)
  39227. "adcs r3, %[r]\n\t"
  39228. #else
  39229. "adc r3, %[r]\n\t"
  39230. #endif
  39231. #ifdef WOLFSSL_KEIL
  39232. "adcs r4, r4, %[r]\n\t"
  39233. #elif defined(__clang__)
  39234. "adcs r4, %[r]\n\t"
  39235. #else
  39236. "adc r4, %[r]\n\t"
  39237. #endif
  39238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39239. "lsrs r7, %[b], #16\n\t"
  39240. #else
  39241. "lsr r7, %[b], #16\n\t"
  39242. #endif
  39243. #ifdef WOLFSSL_KEIL
  39244. "muls r6, r7, r6\n\t"
  39245. #elif defined(__clang__)
  39246. "muls r6, r7\n\t"
  39247. #else
  39248. "mul r6, r7\n\t"
  39249. #endif
  39250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39251. "lsrs r7, r6, #16\n\t"
  39252. #else
  39253. "lsr r7, r6, #16\n\t"
  39254. #endif
  39255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39256. "lsls r6, r6, #16\n\t"
  39257. #else
  39258. "lsl r6, r6, #16\n\t"
  39259. #endif
  39260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39261. "adds r5, r5, r6\n\t"
  39262. #else
  39263. "add r5, r5, r6\n\t"
  39264. #endif
  39265. #ifdef WOLFSSL_KEIL
  39266. "adcs r3, r3, r7\n\t"
  39267. #elif defined(__clang__)
  39268. "adcs r3, r7\n\t"
  39269. #else
  39270. "adc r3, r7\n\t"
  39271. #endif
  39272. #ifdef WOLFSSL_KEIL
  39273. "adcs r4, r4, %[r]\n\t"
  39274. #elif defined(__clang__)
  39275. "adcs r4, %[r]\n\t"
  39276. #else
  39277. "adc r4, %[r]\n\t"
  39278. #endif
  39279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39280. "lsrs r6, %[a], #16\n\t"
  39281. #else
  39282. "lsr r6, %[a], #16\n\t"
  39283. #endif
  39284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39285. "lsrs r7, %[b], #16\n\t"
  39286. #else
  39287. "lsr r7, %[b], #16\n\t"
  39288. #endif
  39289. #ifdef WOLFSSL_KEIL
  39290. "muls r7, r6, r7\n\t"
  39291. #elif defined(__clang__)
  39292. "muls r7, r6\n\t"
  39293. #else
  39294. "mul r7, r6\n\t"
  39295. #endif
  39296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39297. "adds r3, r3, r7\n\t"
  39298. #else
  39299. "add r3, r3, r7\n\t"
  39300. #endif
  39301. #ifdef WOLFSSL_KEIL
  39302. "adcs r4, r4, %[r]\n\t"
  39303. #elif defined(__clang__)
  39304. "adcs r4, %[r]\n\t"
  39305. #else
  39306. "adc r4, %[r]\n\t"
  39307. #endif
  39308. "uxth r7, %[b]\n\t"
  39309. #ifdef WOLFSSL_KEIL
  39310. "muls r6, r7, r6\n\t"
  39311. #elif defined(__clang__)
  39312. "muls r6, r7\n\t"
  39313. #else
  39314. "mul r6, r7\n\t"
  39315. #endif
  39316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39317. "lsrs r7, r6, #16\n\t"
  39318. #else
  39319. "lsr r7, r6, #16\n\t"
  39320. #endif
  39321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39322. "lsls r6, r6, #16\n\t"
  39323. #else
  39324. "lsl r6, r6, #16\n\t"
  39325. #endif
  39326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39327. "adds r5, r5, r6\n\t"
  39328. #else
  39329. "add r5, r5, r6\n\t"
  39330. #endif
  39331. #ifdef WOLFSSL_KEIL
  39332. "adcs r3, r3, r7\n\t"
  39333. #elif defined(__clang__)
  39334. "adcs r3, r7\n\t"
  39335. #else
  39336. "adc r3, r7\n\t"
  39337. #endif
  39338. #ifdef WOLFSSL_KEIL
  39339. "adcs r4, r4, %[r]\n\t"
  39340. #elif defined(__clang__)
  39341. "adcs r4, %[r]\n\t"
  39342. #else
  39343. "adc r4, %[r]\n\t"
  39344. #endif
  39345. "# A[1] * B[10]\n\t"
  39346. "mov %[a], r9\n\t"
  39347. "mov %[b], r10\n\t"
  39348. "ldr %[a], [%[a], #4]\n\t"
  39349. "ldr %[b], [%[b], #40]\n\t"
  39350. "uxth r6, %[a]\n\t"
  39351. "uxth r7, %[b]\n\t"
  39352. #ifdef WOLFSSL_KEIL
  39353. "muls r7, r6, r7\n\t"
  39354. #elif defined(__clang__)
  39355. "muls r7, r6\n\t"
  39356. #else
  39357. "mul r7, r6\n\t"
  39358. #endif
  39359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39360. "adds r5, r5, r7\n\t"
  39361. #else
  39362. "add r5, r5, r7\n\t"
  39363. #endif
  39364. #ifdef WOLFSSL_KEIL
  39365. "adcs r3, r3, %[r]\n\t"
  39366. #elif defined(__clang__)
  39367. "adcs r3, %[r]\n\t"
  39368. #else
  39369. "adc r3, %[r]\n\t"
  39370. #endif
  39371. #ifdef WOLFSSL_KEIL
  39372. "adcs r4, r4, %[r]\n\t"
  39373. #elif defined(__clang__)
  39374. "adcs r4, %[r]\n\t"
  39375. #else
  39376. "adc r4, %[r]\n\t"
  39377. #endif
  39378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39379. "lsrs r7, %[b], #16\n\t"
  39380. #else
  39381. "lsr r7, %[b], #16\n\t"
  39382. #endif
  39383. #ifdef WOLFSSL_KEIL
  39384. "muls r6, r7, r6\n\t"
  39385. #elif defined(__clang__)
  39386. "muls r6, r7\n\t"
  39387. #else
  39388. "mul r6, r7\n\t"
  39389. #endif
  39390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39391. "lsrs r7, r6, #16\n\t"
  39392. #else
  39393. "lsr r7, r6, #16\n\t"
  39394. #endif
  39395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39396. "lsls r6, r6, #16\n\t"
  39397. #else
  39398. "lsl r6, r6, #16\n\t"
  39399. #endif
  39400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39401. "adds r5, r5, r6\n\t"
  39402. #else
  39403. "add r5, r5, r6\n\t"
  39404. #endif
  39405. #ifdef WOLFSSL_KEIL
  39406. "adcs r3, r3, r7\n\t"
  39407. #elif defined(__clang__)
  39408. "adcs r3, r7\n\t"
  39409. #else
  39410. "adc r3, r7\n\t"
  39411. #endif
  39412. #ifdef WOLFSSL_KEIL
  39413. "adcs r4, r4, %[r]\n\t"
  39414. #elif defined(__clang__)
  39415. "adcs r4, %[r]\n\t"
  39416. #else
  39417. "adc r4, %[r]\n\t"
  39418. #endif
  39419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39420. "lsrs r6, %[a], #16\n\t"
  39421. #else
  39422. "lsr r6, %[a], #16\n\t"
  39423. #endif
  39424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39425. "lsrs r7, %[b], #16\n\t"
  39426. #else
  39427. "lsr r7, %[b], #16\n\t"
  39428. #endif
  39429. #ifdef WOLFSSL_KEIL
  39430. "muls r7, r6, r7\n\t"
  39431. #elif defined(__clang__)
  39432. "muls r7, r6\n\t"
  39433. #else
  39434. "mul r7, r6\n\t"
  39435. #endif
  39436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39437. "adds r3, r3, r7\n\t"
  39438. #else
  39439. "add r3, r3, r7\n\t"
  39440. #endif
  39441. #ifdef WOLFSSL_KEIL
  39442. "adcs r4, r4, %[r]\n\t"
  39443. #elif defined(__clang__)
  39444. "adcs r4, %[r]\n\t"
  39445. #else
  39446. "adc r4, %[r]\n\t"
  39447. #endif
  39448. "uxth r7, %[b]\n\t"
  39449. #ifdef WOLFSSL_KEIL
  39450. "muls r6, r7, r6\n\t"
  39451. #elif defined(__clang__)
  39452. "muls r6, r7\n\t"
  39453. #else
  39454. "mul r6, r7\n\t"
  39455. #endif
  39456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39457. "lsrs r7, r6, #16\n\t"
  39458. #else
  39459. "lsr r7, r6, #16\n\t"
  39460. #endif
  39461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39462. "lsls r6, r6, #16\n\t"
  39463. #else
  39464. "lsl r6, r6, #16\n\t"
  39465. #endif
  39466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39467. "adds r5, r5, r6\n\t"
  39468. #else
  39469. "add r5, r5, r6\n\t"
  39470. #endif
  39471. #ifdef WOLFSSL_KEIL
  39472. "adcs r3, r3, r7\n\t"
  39473. #elif defined(__clang__)
  39474. "adcs r3, r7\n\t"
  39475. #else
  39476. "adc r3, r7\n\t"
  39477. #endif
  39478. #ifdef WOLFSSL_KEIL
  39479. "adcs r4, r4, %[r]\n\t"
  39480. #elif defined(__clang__)
  39481. "adcs r4, %[r]\n\t"
  39482. #else
  39483. "adc r4, %[r]\n\t"
  39484. #endif
  39485. "# A[2] * B[9]\n\t"
  39486. "mov %[a], r9\n\t"
  39487. "mov %[b], r10\n\t"
  39488. "ldr %[a], [%[a], #8]\n\t"
  39489. "ldr %[b], [%[b], #36]\n\t"
  39490. "uxth r6, %[a]\n\t"
  39491. "uxth r7, %[b]\n\t"
  39492. #ifdef WOLFSSL_KEIL
  39493. "muls r7, r6, r7\n\t"
  39494. #elif defined(__clang__)
  39495. "muls r7, r6\n\t"
  39496. #else
  39497. "mul r7, r6\n\t"
  39498. #endif
  39499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39500. "adds r5, r5, r7\n\t"
  39501. #else
  39502. "add r5, r5, r7\n\t"
  39503. #endif
  39504. #ifdef WOLFSSL_KEIL
  39505. "adcs r3, r3, %[r]\n\t"
  39506. #elif defined(__clang__)
  39507. "adcs r3, %[r]\n\t"
  39508. #else
  39509. "adc r3, %[r]\n\t"
  39510. #endif
  39511. #ifdef WOLFSSL_KEIL
  39512. "adcs r4, r4, %[r]\n\t"
  39513. #elif defined(__clang__)
  39514. "adcs r4, %[r]\n\t"
  39515. #else
  39516. "adc r4, %[r]\n\t"
  39517. #endif
  39518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39519. "lsrs r7, %[b], #16\n\t"
  39520. #else
  39521. "lsr r7, %[b], #16\n\t"
  39522. #endif
  39523. #ifdef WOLFSSL_KEIL
  39524. "muls r6, r7, r6\n\t"
  39525. #elif defined(__clang__)
  39526. "muls r6, r7\n\t"
  39527. #else
  39528. "mul r6, r7\n\t"
  39529. #endif
  39530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39531. "lsrs r7, r6, #16\n\t"
  39532. #else
  39533. "lsr r7, r6, #16\n\t"
  39534. #endif
  39535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39536. "lsls r6, r6, #16\n\t"
  39537. #else
  39538. "lsl r6, r6, #16\n\t"
  39539. #endif
  39540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39541. "adds r5, r5, r6\n\t"
  39542. #else
  39543. "add r5, r5, r6\n\t"
  39544. #endif
  39545. #ifdef WOLFSSL_KEIL
  39546. "adcs r3, r3, r7\n\t"
  39547. #elif defined(__clang__)
  39548. "adcs r3, r7\n\t"
  39549. #else
  39550. "adc r3, r7\n\t"
  39551. #endif
  39552. #ifdef WOLFSSL_KEIL
  39553. "adcs r4, r4, %[r]\n\t"
  39554. #elif defined(__clang__)
  39555. "adcs r4, %[r]\n\t"
  39556. #else
  39557. "adc r4, %[r]\n\t"
  39558. #endif
  39559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39560. "lsrs r6, %[a], #16\n\t"
  39561. #else
  39562. "lsr r6, %[a], #16\n\t"
  39563. #endif
  39564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39565. "lsrs r7, %[b], #16\n\t"
  39566. #else
  39567. "lsr r7, %[b], #16\n\t"
  39568. #endif
  39569. #ifdef WOLFSSL_KEIL
  39570. "muls r7, r6, r7\n\t"
  39571. #elif defined(__clang__)
  39572. "muls r7, r6\n\t"
  39573. #else
  39574. "mul r7, r6\n\t"
  39575. #endif
  39576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39577. "adds r3, r3, r7\n\t"
  39578. #else
  39579. "add r3, r3, r7\n\t"
  39580. #endif
  39581. #ifdef WOLFSSL_KEIL
  39582. "adcs r4, r4, %[r]\n\t"
  39583. #elif defined(__clang__)
  39584. "adcs r4, %[r]\n\t"
  39585. #else
  39586. "adc r4, %[r]\n\t"
  39587. #endif
  39588. "uxth r7, %[b]\n\t"
  39589. #ifdef WOLFSSL_KEIL
  39590. "muls r6, r7, r6\n\t"
  39591. #elif defined(__clang__)
  39592. "muls r6, r7\n\t"
  39593. #else
  39594. "mul r6, r7\n\t"
  39595. #endif
  39596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39597. "lsrs r7, r6, #16\n\t"
  39598. #else
  39599. "lsr r7, r6, #16\n\t"
  39600. #endif
  39601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39602. "lsls r6, r6, #16\n\t"
  39603. #else
  39604. "lsl r6, r6, #16\n\t"
  39605. #endif
  39606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39607. "adds r5, r5, r6\n\t"
  39608. #else
  39609. "add r5, r5, r6\n\t"
  39610. #endif
  39611. #ifdef WOLFSSL_KEIL
  39612. "adcs r3, r3, r7\n\t"
  39613. #elif defined(__clang__)
  39614. "adcs r3, r7\n\t"
  39615. #else
  39616. "adc r3, r7\n\t"
  39617. #endif
  39618. #ifdef WOLFSSL_KEIL
  39619. "adcs r4, r4, %[r]\n\t"
  39620. #elif defined(__clang__)
  39621. "adcs r4, %[r]\n\t"
  39622. #else
  39623. "adc r4, %[r]\n\t"
  39624. #endif
  39625. "# A[3] * B[8]\n\t"
  39626. "mov %[a], r9\n\t"
  39627. "mov %[b], r10\n\t"
  39628. "ldr %[a], [%[a], #12]\n\t"
  39629. "ldr %[b], [%[b], #32]\n\t"
  39630. "uxth r6, %[a]\n\t"
  39631. "uxth r7, %[b]\n\t"
  39632. #ifdef WOLFSSL_KEIL
  39633. "muls r7, r6, r7\n\t"
  39634. #elif defined(__clang__)
  39635. "muls r7, r6\n\t"
  39636. #else
  39637. "mul r7, r6\n\t"
  39638. #endif
  39639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39640. "adds r5, r5, r7\n\t"
  39641. #else
  39642. "add r5, r5, r7\n\t"
  39643. #endif
  39644. #ifdef WOLFSSL_KEIL
  39645. "adcs r3, r3, %[r]\n\t"
  39646. #elif defined(__clang__)
  39647. "adcs r3, %[r]\n\t"
  39648. #else
  39649. "adc r3, %[r]\n\t"
  39650. #endif
  39651. #ifdef WOLFSSL_KEIL
  39652. "adcs r4, r4, %[r]\n\t"
  39653. #elif defined(__clang__)
  39654. "adcs r4, %[r]\n\t"
  39655. #else
  39656. "adc r4, %[r]\n\t"
  39657. #endif
  39658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39659. "lsrs r7, %[b], #16\n\t"
  39660. #else
  39661. "lsr r7, %[b], #16\n\t"
  39662. #endif
  39663. #ifdef WOLFSSL_KEIL
  39664. "muls r6, r7, r6\n\t"
  39665. #elif defined(__clang__)
  39666. "muls r6, r7\n\t"
  39667. #else
  39668. "mul r6, r7\n\t"
  39669. #endif
  39670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39671. "lsrs r7, r6, #16\n\t"
  39672. #else
  39673. "lsr r7, r6, #16\n\t"
  39674. #endif
  39675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39676. "lsls r6, r6, #16\n\t"
  39677. #else
  39678. "lsl r6, r6, #16\n\t"
  39679. #endif
  39680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39681. "adds r5, r5, r6\n\t"
  39682. #else
  39683. "add r5, r5, r6\n\t"
  39684. #endif
  39685. #ifdef WOLFSSL_KEIL
  39686. "adcs r3, r3, r7\n\t"
  39687. #elif defined(__clang__)
  39688. "adcs r3, r7\n\t"
  39689. #else
  39690. "adc r3, r7\n\t"
  39691. #endif
  39692. #ifdef WOLFSSL_KEIL
  39693. "adcs r4, r4, %[r]\n\t"
  39694. #elif defined(__clang__)
  39695. "adcs r4, %[r]\n\t"
  39696. #else
  39697. "adc r4, %[r]\n\t"
  39698. #endif
  39699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39700. "lsrs r6, %[a], #16\n\t"
  39701. #else
  39702. "lsr r6, %[a], #16\n\t"
  39703. #endif
  39704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39705. "lsrs r7, %[b], #16\n\t"
  39706. #else
  39707. "lsr r7, %[b], #16\n\t"
  39708. #endif
  39709. #ifdef WOLFSSL_KEIL
  39710. "muls r7, r6, r7\n\t"
  39711. #elif defined(__clang__)
  39712. "muls r7, r6\n\t"
  39713. #else
  39714. "mul r7, r6\n\t"
  39715. #endif
  39716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39717. "adds r3, r3, r7\n\t"
  39718. #else
  39719. "add r3, r3, r7\n\t"
  39720. #endif
  39721. #ifdef WOLFSSL_KEIL
  39722. "adcs r4, r4, %[r]\n\t"
  39723. #elif defined(__clang__)
  39724. "adcs r4, %[r]\n\t"
  39725. #else
  39726. "adc r4, %[r]\n\t"
  39727. #endif
  39728. "uxth r7, %[b]\n\t"
  39729. #ifdef WOLFSSL_KEIL
  39730. "muls r6, r7, r6\n\t"
  39731. #elif defined(__clang__)
  39732. "muls r6, r7\n\t"
  39733. #else
  39734. "mul r6, r7\n\t"
  39735. #endif
  39736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39737. "lsrs r7, r6, #16\n\t"
  39738. #else
  39739. "lsr r7, r6, #16\n\t"
  39740. #endif
  39741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39742. "lsls r6, r6, #16\n\t"
  39743. #else
  39744. "lsl r6, r6, #16\n\t"
  39745. #endif
  39746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39747. "adds r5, r5, r6\n\t"
  39748. #else
  39749. "add r5, r5, r6\n\t"
  39750. #endif
  39751. #ifdef WOLFSSL_KEIL
  39752. "adcs r3, r3, r7\n\t"
  39753. #elif defined(__clang__)
  39754. "adcs r3, r7\n\t"
  39755. #else
  39756. "adc r3, r7\n\t"
  39757. #endif
  39758. #ifdef WOLFSSL_KEIL
  39759. "adcs r4, r4, %[r]\n\t"
  39760. #elif defined(__clang__)
  39761. "adcs r4, %[r]\n\t"
  39762. #else
  39763. "adc r4, %[r]\n\t"
  39764. #endif
  39765. "# A[4] * B[7]\n\t"
  39766. "mov %[a], r9\n\t"
  39767. "mov %[b], r10\n\t"
  39768. "ldr %[a], [%[a], #16]\n\t"
  39769. "ldr %[b], [%[b], #28]\n\t"
  39770. "uxth r6, %[a]\n\t"
  39771. "uxth r7, %[b]\n\t"
  39772. #ifdef WOLFSSL_KEIL
  39773. "muls r7, r6, r7\n\t"
  39774. #elif defined(__clang__)
  39775. "muls r7, r6\n\t"
  39776. #else
  39777. "mul r7, r6\n\t"
  39778. #endif
  39779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39780. "adds r5, r5, r7\n\t"
  39781. #else
  39782. "add r5, r5, r7\n\t"
  39783. #endif
  39784. #ifdef WOLFSSL_KEIL
  39785. "adcs r3, r3, %[r]\n\t"
  39786. #elif defined(__clang__)
  39787. "adcs r3, %[r]\n\t"
  39788. #else
  39789. "adc r3, %[r]\n\t"
  39790. #endif
  39791. #ifdef WOLFSSL_KEIL
  39792. "adcs r4, r4, %[r]\n\t"
  39793. #elif defined(__clang__)
  39794. "adcs r4, %[r]\n\t"
  39795. #else
  39796. "adc r4, %[r]\n\t"
  39797. #endif
  39798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39799. "lsrs r7, %[b], #16\n\t"
  39800. #else
  39801. "lsr r7, %[b], #16\n\t"
  39802. #endif
  39803. #ifdef WOLFSSL_KEIL
  39804. "muls r6, r7, r6\n\t"
  39805. #elif defined(__clang__)
  39806. "muls r6, r7\n\t"
  39807. #else
  39808. "mul r6, r7\n\t"
  39809. #endif
  39810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39811. "lsrs r7, r6, #16\n\t"
  39812. #else
  39813. "lsr r7, r6, #16\n\t"
  39814. #endif
  39815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39816. "lsls r6, r6, #16\n\t"
  39817. #else
  39818. "lsl r6, r6, #16\n\t"
  39819. #endif
  39820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39821. "adds r5, r5, r6\n\t"
  39822. #else
  39823. "add r5, r5, r6\n\t"
  39824. #endif
  39825. #ifdef WOLFSSL_KEIL
  39826. "adcs r3, r3, r7\n\t"
  39827. #elif defined(__clang__)
  39828. "adcs r3, r7\n\t"
  39829. #else
  39830. "adc r3, r7\n\t"
  39831. #endif
  39832. #ifdef WOLFSSL_KEIL
  39833. "adcs r4, r4, %[r]\n\t"
  39834. #elif defined(__clang__)
  39835. "adcs r4, %[r]\n\t"
  39836. #else
  39837. "adc r4, %[r]\n\t"
  39838. #endif
  39839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39840. "lsrs r6, %[a], #16\n\t"
  39841. #else
  39842. "lsr r6, %[a], #16\n\t"
  39843. #endif
  39844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39845. "lsrs r7, %[b], #16\n\t"
  39846. #else
  39847. "lsr r7, %[b], #16\n\t"
  39848. #endif
  39849. #ifdef WOLFSSL_KEIL
  39850. "muls r7, r6, r7\n\t"
  39851. #elif defined(__clang__)
  39852. "muls r7, r6\n\t"
  39853. #else
  39854. "mul r7, r6\n\t"
  39855. #endif
  39856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39857. "adds r3, r3, r7\n\t"
  39858. #else
  39859. "add r3, r3, r7\n\t"
  39860. #endif
  39861. #ifdef WOLFSSL_KEIL
  39862. "adcs r4, r4, %[r]\n\t"
  39863. #elif defined(__clang__)
  39864. "adcs r4, %[r]\n\t"
  39865. #else
  39866. "adc r4, %[r]\n\t"
  39867. #endif
  39868. "uxth r7, %[b]\n\t"
  39869. #ifdef WOLFSSL_KEIL
  39870. "muls r6, r7, r6\n\t"
  39871. #elif defined(__clang__)
  39872. "muls r6, r7\n\t"
  39873. #else
  39874. "mul r6, r7\n\t"
  39875. #endif
  39876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39877. "lsrs r7, r6, #16\n\t"
  39878. #else
  39879. "lsr r7, r6, #16\n\t"
  39880. #endif
  39881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39882. "lsls r6, r6, #16\n\t"
  39883. #else
  39884. "lsl r6, r6, #16\n\t"
  39885. #endif
  39886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39887. "adds r5, r5, r6\n\t"
  39888. #else
  39889. "add r5, r5, r6\n\t"
  39890. #endif
  39891. #ifdef WOLFSSL_KEIL
  39892. "adcs r3, r3, r7\n\t"
  39893. #elif defined(__clang__)
  39894. "adcs r3, r7\n\t"
  39895. #else
  39896. "adc r3, r7\n\t"
  39897. #endif
  39898. #ifdef WOLFSSL_KEIL
  39899. "adcs r4, r4, %[r]\n\t"
  39900. #elif defined(__clang__)
  39901. "adcs r4, %[r]\n\t"
  39902. #else
  39903. "adc r4, %[r]\n\t"
  39904. #endif
  39905. "# A[5] * B[6]\n\t"
  39906. "mov %[a], r9\n\t"
  39907. "mov %[b], r10\n\t"
  39908. "ldr %[a], [%[a], #20]\n\t"
  39909. "ldr %[b], [%[b], #24]\n\t"
  39910. "uxth r6, %[a]\n\t"
  39911. "uxth r7, %[b]\n\t"
  39912. #ifdef WOLFSSL_KEIL
  39913. "muls r7, r6, r7\n\t"
  39914. #elif defined(__clang__)
  39915. "muls r7, r6\n\t"
  39916. #else
  39917. "mul r7, r6\n\t"
  39918. #endif
  39919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39920. "adds r5, r5, r7\n\t"
  39921. #else
  39922. "add r5, r5, r7\n\t"
  39923. #endif
  39924. #ifdef WOLFSSL_KEIL
  39925. "adcs r3, r3, %[r]\n\t"
  39926. #elif defined(__clang__)
  39927. "adcs r3, %[r]\n\t"
  39928. #else
  39929. "adc r3, %[r]\n\t"
  39930. #endif
  39931. #ifdef WOLFSSL_KEIL
  39932. "adcs r4, r4, %[r]\n\t"
  39933. #elif defined(__clang__)
  39934. "adcs r4, %[r]\n\t"
  39935. #else
  39936. "adc r4, %[r]\n\t"
  39937. #endif
  39938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39939. "lsrs r7, %[b], #16\n\t"
  39940. #else
  39941. "lsr r7, %[b], #16\n\t"
  39942. #endif
  39943. #ifdef WOLFSSL_KEIL
  39944. "muls r6, r7, r6\n\t"
  39945. #elif defined(__clang__)
  39946. "muls r6, r7\n\t"
  39947. #else
  39948. "mul r6, r7\n\t"
  39949. #endif
  39950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39951. "lsrs r7, r6, #16\n\t"
  39952. #else
  39953. "lsr r7, r6, #16\n\t"
  39954. #endif
  39955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39956. "lsls r6, r6, #16\n\t"
  39957. #else
  39958. "lsl r6, r6, #16\n\t"
  39959. #endif
  39960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39961. "adds r5, r5, r6\n\t"
  39962. #else
  39963. "add r5, r5, r6\n\t"
  39964. #endif
  39965. #ifdef WOLFSSL_KEIL
  39966. "adcs r3, r3, r7\n\t"
  39967. #elif defined(__clang__)
  39968. "adcs r3, r7\n\t"
  39969. #else
  39970. "adc r3, r7\n\t"
  39971. #endif
  39972. #ifdef WOLFSSL_KEIL
  39973. "adcs r4, r4, %[r]\n\t"
  39974. #elif defined(__clang__)
  39975. "adcs r4, %[r]\n\t"
  39976. #else
  39977. "adc r4, %[r]\n\t"
  39978. #endif
  39979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39980. "lsrs r6, %[a], #16\n\t"
  39981. #else
  39982. "lsr r6, %[a], #16\n\t"
  39983. #endif
  39984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39985. "lsrs r7, %[b], #16\n\t"
  39986. #else
  39987. "lsr r7, %[b], #16\n\t"
  39988. #endif
  39989. #ifdef WOLFSSL_KEIL
  39990. "muls r7, r6, r7\n\t"
  39991. #elif defined(__clang__)
  39992. "muls r7, r6\n\t"
  39993. #else
  39994. "mul r7, r6\n\t"
  39995. #endif
  39996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39997. "adds r3, r3, r7\n\t"
  39998. #else
  39999. "add r3, r3, r7\n\t"
  40000. #endif
  40001. #ifdef WOLFSSL_KEIL
  40002. "adcs r4, r4, %[r]\n\t"
  40003. #elif defined(__clang__)
  40004. "adcs r4, %[r]\n\t"
  40005. #else
  40006. "adc r4, %[r]\n\t"
  40007. #endif
  40008. "uxth r7, %[b]\n\t"
  40009. #ifdef WOLFSSL_KEIL
  40010. "muls r6, r7, r6\n\t"
  40011. #elif defined(__clang__)
  40012. "muls r6, r7\n\t"
  40013. #else
  40014. "mul r6, r7\n\t"
  40015. #endif
  40016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40017. "lsrs r7, r6, #16\n\t"
  40018. #else
  40019. "lsr r7, r6, #16\n\t"
  40020. #endif
  40021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40022. "lsls r6, r6, #16\n\t"
  40023. #else
  40024. "lsl r6, r6, #16\n\t"
  40025. #endif
  40026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40027. "adds r5, r5, r6\n\t"
  40028. #else
  40029. "add r5, r5, r6\n\t"
  40030. #endif
  40031. #ifdef WOLFSSL_KEIL
  40032. "adcs r3, r3, r7\n\t"
  40033. #elif defined(__clang__)
  40034. "adcs r3, r7\n\t"
  40035. #else
  40036. "adc r3, r7\n\t"
  40037. #endif
  40038. #ifdef WOLFSSL_KEIL
  40039. "adcs r4, r4, %[r]\n\t"
  40040. #elif defined(__clang__)
  40041. "adcs r4, %[r]\n\t"
  40042. #else
  40043. "adc r4, %[r]\n\t"
  40044. #endif
  40045. "# A[6] * B[5]\n\t"
  40046. "mov %[a], r9\n\t"
  40047. "mov %[b], r10\n\t"
  40048. "ldr %[a], [%[a], #24]\n\t"
  40049. "ldr %[b], [%[b], #20]\n\t"
  40050. "uxth r6, %[a]\n\t"
  40051. "uxth r7, %[b]\n\t"
  40052. #ifdef WOLFSSL_KEIL
  40053. "muls r7, r6, r7\n\t"
  40054. #elif defined(__clang__)
  40055. "muls r7, r6\n\t"
  40056. #else
  40057. "mul r7, r6\n\t"
  40058. #endif
  40059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40060. "adds r5, r5, r7\n\t"
  40061. #else
  40062. "add r5, r5, r7\n\t"
  40063. #endif
  40064. #ifdef WOLFSSL_KEIL
  40065. "adcs r3, r3, %[r]\n\t"
  40066. #elif defined(__clang__)
  40067. "adcs r3, %[r]\n\t"
  40068. #else
  40069. "adc r3, %[r]\n\t"
  40070. #endif
  40071. #ifdef WOLFSSL_KEIL
  40072. "adcs r4, r4, %[r]\n\t"
  40073. #elif defined(__clang__)
  40074. "adcs r4, %[r]\n\t"
  40075. #else
  40076. "adc r4, %[r]\n\t"
  40077. #endif
  40078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40079. "lsrs r7, %[b], #16\n\t"
  40080. #else
  40081. "lsr r7, %[b], #16\n\t"
  40082. #endif
  40083. #ifdef WOLFSSL_KEIL
  40084. "muls r6, r7, r6\n\t"
  40085. #elif defined(__clang__)
  40086. "muls r6, r7\n\t"
  40087. #else
  40088. "mul r6, r7\n\t"
  40089. #endif
  40090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40091. "lsrs r7, r6, #16\n\t"
  40092. #else
  40093. "lsr r7, r6, #16\n\t"
  40094. #endif
  40095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40096. "lsls r6, r6, #16\n\t"
  40097. #else
  40098. "lsl r6, r6, #16\n\t"
  40099. #endif
  40100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40101. "adds r5, r5, r6\n\t"
  40102. #else
  40103. "add r5, r5, r6\n\t"
  40104. #endif
  40105. #ifdef WOLFSSL_KEIL
  40106. "adcs r3, r3, r7\n\t"
  40107. #elif defined(__clang__)
  40108. "adcs r3, r7\n\t"
  40109. #else
  40110. "adc r3, r7\n\t"
  40111. #endif
  40112. #ifdef WOLFSSL_KEIL
  40113. "adcs r4, r4, %[r]\n\t"
  40114. #elif defined(__clang__)
  40115. "adcs r4, %[r]\n\t"
  40116. #else
  40117. "adc r4, %[r]\n\t"
  40118. #endif
  40119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40120. "lsrs r6, %[a], #16\n\t"
  40121. #else
  40122. "lsr r6, %[a], #16\n\t"
  40123. #endif
  40124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40125. "lsrs r7, %[b], #16\n\t"
  40126. #else
  40127. "lsr r7, %[b], #16\n\t"
  40128. #endif
  40129. #ifdef WOLFSSL_KEIL
  40130. "muls r7, r6, r7\n\t"
  40131. #elif defined(__clang__)
  40132. "muls r7, r6\n\t"
  40133. #else
  40134. "mul r7, r6\n\t"
  40135. #endif
  40136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40137. "adds r3, r3, r7\n\t"
  40138. #else
  40139. "add r3, r3, r7\n\t"
  40140. #endif
  40141. #ifdef WOLFSSL_KEIL
  40142. "adcs r4, r4, %[r]\n\t"
  40143. #elif defined(__clang__)
  40144. "adcs r4, %[r]\n\t"
  40145. #else
  40146. "adc r4, %[r]\n\t"
  40147. #endif
  40148. "uxth r7, %[b]\n\t"
  40149. #ifdef WOLFSSL_KEIL
  40150. "muls r6, r7, r6\n\t"
  40151. #elif defined(__clang__)
  40152. "muls r6, r7\n\t"
  40153. #else
  40154. "mul r6, r7\n\t"
  40155. #endif
  40156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40157. "lsrs r7, r6, #16\n\t"
  40158. #else
  40159. "lsr r7, r6, #16\n\t"
  40160. #endif
  40161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40162. "lsls r6, r6, #16\n\t"
  40163. #else
  40164. "lsl r6, r6, #16\n\t"
  40165. #endif
  40166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40167. "adds r5, r5, r6\n\t"
  40168. #else
  40169. "add r5, r5, r6\n\t"
  40170. #endif
  40171. #ifdef WOLFSSL_KEIL
  40172. "adcs r3, r3, r7\n\t"
  40173. #elif defined(__clang__)
  40174. "adcs r3, r7\n\t"
  40175. #else
  40176. "adc r3, r7\n\t"
  40177. #endif
  40178. #ifdef WOLFSSL_KEIL
  40179. "adcs r4, r4, %[r]\n\t"
  40180. #elif defined(__clang__)
  40181. "adcs r4, %[r]\n\t"
  40182. #else
  40183. "adc r4, %[r]\n\t"
  40184. #endif
  40185. "# A[7] * B[4]\n\t"
  40186. "mov %[a], r9\n\t"
  40187. "mov %[b], r10\n\t"
  40188. "ldr %[a], [%[a], #28]\n\t"
  40189. "ldr %[b], [%[b], #16]\n\t"
  40190. "uxth r6, %[a]\n\t"
  40191. "uxth r7, %[b]\n\t"
  40192. #ifdef WOLFSSL_KEIL
  40193. "muls r7, r6, r7\n\t"
  40194. #elif defined(__clang__)
  40195. "muls r7, r6\n\t"
  40196. #else
  40197. "mul r7, r6\n\t"
  40198. #endif
  40199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40200. "adds r5, r5, r7\n\t"
  40201. #else
  40202. "add r5, r5, r7\n\t"
  40203. #endif
  40204. #ifdef WOLFSSL_KEIL
  40205. "adcs r3, r3, %[r]\n\t"
  40206. #elif defined(__clang__)
  40207. "adcs r3, %[r]\n\t"
  40208. #else
  40209. "adc r3, %[r]\n\t"
  40210. #endif
  40211. #ifdef WOLFSSL_KEIL
  40212. "adcs r4, r4, %[r]\n\t"
  40213. #elif defined(__clang__)
  40214. "adcs r4, %[r]\n\t"
  40215. #else
  40216. "adc r4, %[r]\n\t"
  40217. #endif
  40218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40219. "lsrs r7, %[b], #16\n\t"
  40220. #else
  40221. "lsr r7, %[b], #16\n\t"
  40222. #endif
  40223. #ifdef WOLFSSL_KEIL
  40224. "muls r6, r7, r6\n\t"
  40225. #elif defined(__clang__)
  40226. "muls r6, r7\n\t"
  40227. #else
  40228. "mul r6, r7\n\t"
  40229. #endif
  40230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40231. "lsrs r7, r6, #16\n\t"
  40232. #else
  40233. "lsr r7, r6, #16\n\t"
  40234. #endif
  40235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40236. "lsls r6, r6, #16\n\t"
  40237. #else
  40238. "lsl r6, r6, #16\n\t"
  40239. #endif
  40240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40241. "adds r5, r5, r6\n\t"
  40242. #else
  40243. "add r5, r5, r6\n\t"
  40244. #endif
  40245. #ifdef WOLFSSL_KEIL
  40246. "adcs r3, r3, r7\n\t"
  40247. #elif defined(__clang__)
  40248. "adcs r3, r7\n\t"
  40249. #else
  40250. "adc r3, r7\n\t"
  40251. #endif
  40252. #ifdef WOLFSSL_KEIL
  40253. "adcs r4, r4, %[r]\n\t"
  40254. #elif defined(__clang__)
  40255. "adcs r4, %[r]\n\t"
  40256. #else
  40257. "adc r4, %[r]\n\t"
  40258. #endif
  40259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40260. "lsrs r6, %[a], #16\n\t"
  40261. #else
  40262. "lsr r6, %[a], #16\n\t"
  40263. #endif
  40264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40265. "lsrs r7, %[b], #16\n\t"
  40266. #else
  40267. "lsr r7, %[b], #16\n\t"
  40268. #endif
  40269. #ifdef WOLFSSL_KEIL
  40270. "muls r7, r6, r7\n\t"
  40271. #elif defined(__clang__)
  40272. "muls r7, r6\n\t"
  40273. #else
  40274. "mul r7, r6\n\t"
  40275. #endif
  40276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40277. "adds r3, r3, r7\n\t"
  40278. #else
  40279. "add r3, r3, r7\n\t"
  40280. #endif
  40281. #ifdef WOLFSSL_KEIL
  40282. "adcs r4, r4, %[r]\n\t"
  40283. #elif defined(__clang__)
  40284. "adcs r4, %[r]\n\t"
  40285. #else
  40286. "adc r4, %[r]\n\t"
  40287. #endif
  40288. "uxth r7, %[b]\n\t"
  40289. #ifdef WOLFSSL_KEIL
  40290. "muls r6, r7, r6\n\t"
  40291. #elif defined(__clang__)
  40292. "muls r6, r7\n\t"
  40293. #else
  40294. "mul r6, r7\n\t"
  40295. #endif
  40296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40297. "lsrs r7, r6, #16\n\t"
  40298. #else
  40299. "lsr r7, r6, #16\n\t"
  40300. #endif
  40301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40302. "lsls r6, r6, #16\n\t"
  40303. #else
  40304. "lsl r6, r6, #16\n\t"
  40305. #endif
  40306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40307. "adds r5, r5, r6\n\t"
  40308. #else
  40309. "add r5, r5, r6\n\t"
  40310. #endif
  40311. #ifdef WOLFSSL_KEIL
  40312. "adcs r3, r3, r7\n\t"
  40313. #elif defined(__clang__)
  40314. "adcs r3, r7\n\t"
  40315. #else
  40316. "adc r3, r7\n\t"
  40317. #endif
  40318. #ifdef WOLFSSL_KEIL
  40319. "adcs r4, r4, %[r]\n\t"
  40320. #elif defined(__clang__)
  40321. "adcs r4, %[r]\n\t"
  40322. #else
  40323. "adc r4, %[r]\n\t"
  40324. #endif
  40325. "# A[8] * B[3]\n\t"
  40326. "mov %[a], r9\n\t"
  40327. "mov %[b], r10\n\t"
  40328. "ldr %[a], [%[a], #32]\n\t"
  40329. "ldr %[b], [%[b], #12]\n\t"
  40330. "uxth r6, %[a]\n\t"
  40331. "uxth r7, %[b]\n\t"
  40332. #ifdef WOLFSSL_KEIL
  40333. "muls r7, r6, r7\n\t"
  40334. #elif defined(__clang__)
  40335. "muls r7, r6\n\t"
  40336. #else
  40337. "mul r7, r6\n\t"
  40338. #endif
  40339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40340. "adds r5, r5, r7\n\t"
  40341. #else
  40342. "add r5, r5, r7\n\t"
  40343. #endif
  40344. #ifdef WOLFSSL_KEIL
  40345. "adcs r3, r3, %[r]\n\t"
  40346. #elif defined(__clang__)
  40347. "adcs r3, %[r]\n\t"
  40348. #else
  40349. "adc r3, %[r]\n\t"
  40350. #endif
  40351. #ifdef WOLFSSL_KEIL
  40352. "adcs r4, r4, %[r]\n\t"
  40353. #elif defined(__clang__)
  40354. "adcs r4, %[r]\n\t"
  40355. #else
  40356. "adc r4, %[r]\n\t"
  40357. #endif
  40358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40359. "lsrs r7, %[b], #16\n\t"
  40360. #else
  40361. "lsr r7, %[b], #16\n\t"
  40362. #endif
  40363. #ifdef WOLFSSL_KEIL
  40364. "muls r6, r7, r6\n\t"
  40365. #elif defined(__clang__)
  40366. "muls r6, r7\n\t"
  40367. #else
  40368. "mul r6, r7\n\t"
  40369. #endif
  40370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40371. "lsrs r7, r6, #16\n\t"
  40372. #else
  40373. "lsr r7, r6, #16\n\t"
  40374. #endif
  40375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40376. "lsls r6, r6, #16\n\t"
  40377. #else
  40378. "lsl r6, r6, #16\n\t"
  40379. #endif
  40380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40381. "adds r5, r5, r6\n\t"
  40382. #else
  40383. "add r5, r5, r6\n\t"
  40384. #endif
  40385. #ifdef WOLFSSL_KEIL
  40386. "adcs r3, r3, r7\n\t"
  40387. #elif defined(__clang__)
  40388. "adcs r3, r7\n\t"
  40389. #else
  40390. "adc r3, r7\n\t"
  40391. #endif
  40392. #ifdef WOLFSSL_KEIL
  40393. "adcs r4, r4, %[r]\n\t"
  40394. #elif defined(__clang__)
  40395. "adcs r4, %[r]\n\t"
  40396. #else
  40397. "adc r4, %[r]\n\t"
  40398. #endif
  40399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40400. "lsrs r6, %[a], #16\n\t"
  40401. #else
  40402. "lsr r6, %[a], #16\n\t"
  40403. #endif
  40404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40405. "lsrs r7, %[b], #16\n\t"
  40406. #else
  40407. "lsr r7, %[b], #16\n\t"
  40408. #endif
  40409. #ifdef WOLFSSL_KEIL
  40410. "muls r7, r6, r7\n\t"
  40411. #elif defined(__clang__)
  40412. "muls r7, r6\n\t"
  40413. #else
  40414. "mul r7, r6\n\t"
  40415. #endif
  40416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40417. "adds r3, r3, r7\n\t"
  40418. #else
  40419. "add r3, r3, r7\n\t"
  40420. #endif
  40421. #ifdef WOLFSSL_KEIL
  40422. "adcs r4, r4, %[r]\n\t"
  40423. #elif defined(__clang__)
  40424. "adcs r4, %[r]\n\t"
  40425. #else
  40426. "adc r4, %[r]\n\t"
  40427. #endif
  40428. "uxth r7, %[b]\n\t"
  40429. #ifdef WOLFSSL_KEIL
  40430. "muls r6, r7, r6\n\t"
  40431. #elif defined(__clang__)
  40432. "muls r6, r7\n\t"
  40433. #else
  40434. "mul r6, r7\n\t"
  40435. #endif
  40436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40437. "lsrs r7, r6, #16\n\t"
  40438. #else
  40439. "lsr r7, r6, #16\n\t"
  40440. #endif
  40441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40442. "lsls r6, r6, #16\n\t"
  40443. #else
  40444. "lsl r6, r6, #16\n\t"
  40445. #endif
  40446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40447. "adds r5, r5, r6\n\t"
  40448. #else
  40449. "add r5, r5, r6\n\t"
  40450. #endif
  40451. #ifdef WOLFSSL_KEIL
  40452. "adcs r3, r3, r7\n\t"
  40453. #elif defined(__clang__)
  40454. "adcs r3, r7\n\t"
  40455. #else
  40456. "adc r3, r7\n\t"
  40457. #endif
  40458. #ifdef WOLFSSL_KEIL
  40459. "adcs r4, r4, %[r]\n\t"
  40460. #elif defined(__clang__)
  40461. "adcs r4, %[r]\n\t"
  40462. #else
  40463. "adc r4, %[r]\n\t"
  40464. #endif
  40465. "# A[9] * B[2]\n\t"
  40466. "mov %[a], r9\n\t"
  40467. "mov %[b], r10\n\t"
  40468. "ldr %[a], [%[a], #36]\n\t"
  40469. "ldr %[b], [%[b], #8]\n\t"
  40470. "uxth r6, %[a]\n\t"
  40471. "uxth r7, %[b]\n\t"
  40472. #ifdef WOLFSSL_KEIL
  40473. "muls r7, r6, r7\n\t"
  40474. #elif defined(__clang__)
  40475. "muls r7, r6\n\t"
  40476. #else
  40477. "mul r7, r6\n\t"
  40478. #endif
  40479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40480. "adds r5, r5, r7\n\t"
  40481. #else
  40482. "add r5, r5, r7\n\t"
  40483. #endif
  40484. #ifdef WOLFSSL_KEIL
  40485. "adcs r3, r3, %[r]\n\t"
  40486. #elif defined(__clang__)
  40487. "adcs r3, %[r]\n\t"
  40488. #else
  40489. "adc r3, %[r]\n\t"
  40490. #endif
  40491. #ifdef WOLFSSL_KEIL
  40492. "adcs r4, r4, %[r]\n\t"
  40493. #elif defined(__clang__)
  40494. "adcs r4, %[r]\n\t"
  40495. #else
  40496. "adc r4, %[r]\n\t"
  40497. #endif
  40498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40499. "lsrs r7, %[b], #16\n\t"
  40500. #else
  40501. "lsr r7, %[b], #16\n\t"
  40502. #endif
  40503. #ifdef WOLFSSL_KEIL
  40504. "muls r6, r7, r6\n\t"
  40505. #elif defined(__clang__)
  40506. "muls r6, r7\n\t"
  40507. #else
  40508. "mul r6, r7\n\t"
  40509. #endif
  40510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40511. "lsrs r7, r6, #16\n\t"
  40512. #else
  40513. "lsr r7, r6, #16\n\t"
  40514. #endif
  40515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40516. "lsls r6, r6, #16\n\t"
  40517. #else
  40518. "lsl r6, r6, #16\n\t"
  40519. #endif
  40520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40521. "adds r5, r5, r6\n\t"
  40522. #else
  40523. "add r5, r5, r6\n\t"
  40524. #endif
  40525. #ifdef WOLFSSL_KEIL
  40526. "adcs r3, r3, r7\n\t"
  40527. #elif defined(__clang__)
  40528. "adcs r3, r7\n\t"
  40529. #else
  40530. "adc r3, r7\n\t"
  40531. #endif
  40532. #ifdef WOLFSSL_KEIL
  40533. "adcs r4, r4, %[r]\n\t"
  40534. #elif defined(__clang__)
  40535. "adcs r4, %[r]\n\t"
  40536. #else
  40537. "adc r4, %[r]\n\t"
  40538. #endif
  40539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40540. "lsrs r6, %[a], #16\n\t"
  40541. #else
  40542. "lsr r6, %[a], #16\n\t"
  40543. #endif
  40544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40545. "lsrs r7, %[b], #16\n\t"
  40546. #else
  40547. "lsr r7, %[b], #16\n\t"
  40548. #endif
  40549. #ifdef WOLFSSL_KEIL
  40550. "muls r7, r6, r7\n\t"
  40551. #elif defined(__clang__)
  40552. "muls r7, r6\n\t"
  40553. #else
  40554. "mul r7, r6\n\t"
  40555. #endif
  40556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40557. "adds r3, r3, r7\n\t"
  40558. #else
  40559. "add r3, r3, r7\n\t"
  40560. #endif
  40561. #ifdef WOLFSSL_KEIL
  40562. "adcs r4, r4, %[r]\n\t"
  40563. #elif defined(__clang__)
  40564. "adcs r4, %[r]\n\t"
  40565. #else
  40566. "adc r4, %[r]\n\t"
  40567. #endif
  40568. "uxth r7, %[b]\n\t"
  40569. #ifdef WOLFSSL_KEIL
  40570. "muls r6, r7, r6\n\t"
  40571. #elif defined(__clang__)
  40572. "muls r6, r7\n\t"
  40573. #else
  40574. "mul r6, r7\n\t"
  40575. #endif
  40576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40577. "lsrs r7, r6, #16\n\t"
  40578. #else
  40579. "lsr r7, r6, #16\n\t"
  40580. #endif
  40581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40582. "lsls r6, r6, #16\n\t"
  40583. #else
  40584. "lsl r6, r6, #16\n\t"
  40585. #endif
  40586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40587. "adds r5, r5, r6\n\t"
  40588. #else
  40589. "add r5, r5, r6\n\t"
  40590. #endif
  40591. #ifdef WOLFSSL_KEIL
  40592. "adcs r3, r3, r7\n\t"
  40593. #elif defined(__clang__)
  40594. "adcs r3, r7\n\t"
  40595. #else
  40596. "adc r3, r7\n\t"
  40597. #endif
  40598. #ifdef WOLFSSL_KEIL
  40599. "adcs r4, r4, %[r]\n\t"
  40600. #elif defined(__clang__)
  40601. "adcs r4, %[r]\n\t"
  40602. #else
  40603. "adc r4, %[r]\n\t"
  40604. #endif
  40605. "# A[10] * B[1]\n\t"
  40606. "mov %[a], r9\n\t"
  40607. "mov %[b], r10\n\t"
  40608. "ldr %[a], [%[a], #40]\n\t"
  40609. "ldr %[b], [%[b], #4]\n\t"
  40610. "uxth r6, %[a]\n\t"
  40611. "uxth r7, %[b]\n\t"
  40612. #ifdef WOLFSSL_KEIL
  40613. "muls r7, r6, r7\n\t"
  40614. #elif defined(__clang__)
  40615. "muls r7, r6\n\t"
  40616. #else
  40617. "mul r7, r6\n\t"
  40618. #endif
  40619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40620. "adds r5, r5, r7\n\t"
  40621. #else
  40622. "add r5, r5, r7\n\t"
  40623. #endif
  40624. #ifdef WOLFSSL_KEIL
  40625. "adcs r3, r3, %[r]\n\t"
  40626. #elif defined(__clang__)
  40627. "adcs r3, %[r]\n\t"
  40628. #else
  40629. "adc r3, %[r]\n\t"
  40630. #endif
  40631. #ifdef WOLFSSL_KEIL
  40632. "adcs r4, r4, %[r]\n\t"
  40633. #elif defined(__clang__)
  40634. "adcs r4, %[r]\n\t"
  40635. #else
  40636. "adc r4, %[r]\n\t"
  40637. #endif
  40638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40639. "lsrs r7, %[b], #16\n\t"
  40640. #else
  40641. "lsr r7, %[b], #16\n\t"
  40642. #endif
  40643. #ifdef WOLFSSL_KEIL
  40644. "muls r6, r7, r6\n\t"
  40645. #elif defined(__clang__)
  40646. "muls r6, r7\n\t"
  40647. #else
  40648. "mul r6, r7\n\t"
  40649. #endif
  40650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40651. "lsrs r7, r6, #16\n\t"
  40652. #else
  40653. "lsr r7, r6, #16\n\t"
  40654. #endif
  40655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40656. "lsls r6, r6, #16\n\t"
  40657. #else
  40658. "lsl r6, r6, #16\n\t"
  40659. #endif
  40660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40661. "adds r5, r5, r6\n\t"
  40662. #else
  40663. "add r5, r5, r6\n\t"
  40664. #endif
  40665. #ifdef WOLFSSL_KEIL
  40666. "adcs r3, r3, r7\n\t"
  40667. #elif defined(__clang__)
  40668. "adcs r3, r7\n\t"
  40669. #else
  40670. "adc r3, r7\n\t"
  40671. #endif
  40672. #ifdef WOLFSSL_KEIL
  40673. "adcs r4, r4, %[r]\n\t"
  40674. #elif defined(__clang__)
  40675. "adcs r4, %[r]\n\t"
  40676. #else
  40677. "adc r4, %[r]\n\t"
  40678. #endif
  40679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40680. "lsrs r6, %[a], #16\n\t"
  40681. #else
  40682. "lsr r6, %[a], #16\n\t"
  40683. #endif
  40684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40685. "lsrs r7, %[b], #16\n\t"
  40686. #else
  40687. "lsr r7, %[b], #16\n\t"
  40688. #endif
  40689. #ifdef WOLFSSL_KEIL
  40690. "muls r7, r6, r7\n\t"
  40691. #elif defined(__clang__)
  40692. "muls r7, r6\n\t"
  40693. #else
  40694. "mul r7, r6\n\t"
  40695. #endif
  40696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40697. "adds r3, r3, r7\n\t"
  40698. #else
  40699. "add r3, r3, r7\n\t"
  40700. #endif
  40701. #ifdef WOLFSSL_KEIL
  40702. "adcs r4, r4, %[r]\n\t"
  40703. #elif defined(__clang__)
  40704. "adcs r4, %[r]\n\t"
  40705. #else
  40706. "adc r4, %[r]\n\t"
  40707. #endif
  40708. "uxth r7, %[b]\n\t"
  40709. #ifdef WOLFSSL_KEIL
  40710. "muls r6, r7, r6\n\t"
  40711. #elif defined(__clang__)
  40712. "muls r6, r7\n\t"
  40713. #else
  40714. "mul r6, r7\n\t"
  40715. #endif
  40716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40717. "lsrs r7, r6, #16\n\t"
  40718. #else
  40719. "lsr r7, r6, #16\n\t"
  40720. #endif
  40721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40722. "lsls r6, r6, #16\n\t"
  40723. #else
  40724. "lsl r6, r6, #16\n\t"
  40725. #endif
  40726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40727. "adds r5, r5, r6\n\t"
  40728. #else
  40729. "add r5, r5, r6\n\t"
  40730. #endif
  40731. #ifdef WOLFSSL_KEIL
  40732. "adcs r3, r3, r7\n\t"
  40733. #elif defined(__clang__)
  40734. "adcs r3, r7\n\t"
  40735. #else
  40736. "adc r3, r7\n\t"
  40737. #endif
  40738. #ifdef WOLFSSL_KEIL
  40739. "adcs r4, r4, %[r]\n\t"
  40740. #elif defined(__clang__)
  40741. "adcs r4, %[r]\n\t"
  40742. #else
  40743. "adc r4, %[r]\n\t"
  40744. #endif
  40745. "# A[11] * B[0]\n\t"
  40746. "mov %[a], r9\n\t"
  40747. "mov %[b], r10\n\t"
  40748. "ldr %[a], [%[a], #44]\n\t"
  40749. "ldr %[b], [%[b]]\n\t"
  40750. "uxth r6, %[a]\n\t"
  40751. "uxth r7, %[b]\n\t"
  40752. #ifdef WOLFSSL_KEIL
  40753. "muls r7, r6, r7\n\t"
  40754. #elif defined(__clang__)
  40755. "muls r7, r6\n\t"
  40756. #else
  40757. "mul r7, r6\n\t"
  40758. #endif
  40759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40760. "adds r5, r5, r7\n\t"
  40761. #else
  40762. "add r5, r5, r7\n\t"
  40763. #endif
  40764. #ifdef WOLFSSL_KEIL
  40765. "adcs r3, r3, %[r]\n\t"
  40766. #elif defined(__clang__)
  40767. "adcs r3, %[r]\n\t"
  40768. #else
  40769. "adc r3, %[r]\n\t"
  40770. #endif
  40771. #ifdef WOLFSSL_KEIL
  40772. "adcs r4, r4, %[r]\n\t"
  40773. #elif defined(__clang__)
  40774. "adcs r4, %[r]\n\t"
  40775. #else
  40776. "adc r4, %[r]\n\t"
  40777. #endif
  40778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40779. "lsrs r7, %[b], #16\n\t"
  40780. #else
  40781. "lsr r7, %[b], #16\n\t"
  40782. #endif
  40783. #ifdef WOLFSSL_KEIL
  40784. "muls r6, r7, r6\n\t"
  40785. #elif defined(__clang__)
  40786. "muls r6, r7\n\t"
  40787. #else
  40788. "mul r6, r7\n\t"
  40789. #endif
  40790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40791. "lsrs r7, r6, #16\n\t"
  40792. #else
  40793. "lsr r7, r6, #16\n\t"
  40794. #endif
  40795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40796. "lsls r6, r6, #16\n\t"
  40797. #else
  40798. "lsl r6, r6, #16\n\t"
  40799. #endif
  40800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40801. "adds r5, r5, r6\n\t"
  40802. #else
  40803. "add r5, r5, r6\n\t"
  40804. #endif
  40805. #ifdef WOLFSSL_KEIL
  40806. "adcs r3, r3, r7\n\t"
  40807. #elif defined(__clang__)
  40808. "adcs r3, r7\n\t"
  40809. #else
  40810. "adc r3, r7\n\t"
  40811. #endif
  40812. #ifdef WOLFSSL_KEIL
  40813. "adcs r4, r4, %[r]\n\t"
  40814. #elif defined(__clang__)
  40815. "adcs r4, %[r]\n\t"
  40816. #else
  40817. "adc r4, %[r]\n\t"
  40818. #endif
  40819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40820. "lsrs r6, %[a], #16\n\t"
  40821. #else
  40822. "lsr r6, %[a], #16\n\t"
  40823. #endif
  40824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40825. "lsrs r7, %[b], #16\n\t"
  40826. #else
  40827. "lsr r7, %[b], #16\n\t"
  40828. #endif
  40829. #ifdef WOLFSSL_KEIL
  40830. "muls r7, r6, r7\n\t"
  40831. #elif defined(__clang__)
  40832. "muls r7, r6\n\t"
  40833. #else
  40834. "mul r7, r6\n\t"
  40835. #endif
  40836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40837. "adds r3, r3, r7\n\t"
  40838. #else
  40839. "add r3, r3, r7\n\t"
  40840. #endif
  40841. #ifdef WOLFSSL_KEIL
  40842. "adcs r4, r4, %[r]\n\t"
  40843. #elif defined(__clang__)
  40844. "adcs r4, %[r]\n\t"
  40845. #else
  40846. "adc r4, %[r]\n\t"
  40847. #endif
  40848. "uxth r7, %[b]\n\t"
  40849. #ifdef WOLFSSL_KEIL
  40850. "muls r6, r7, r6\n\t"
  40851. #elif defined(__clang__)
  40852. "muls r6, r7\n\t"
  40853. #else
  40854. "mul r6, r7\n\t"
  40855. #endif
  40856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40857. "lsrs r7, r6, #16\n\t"
  40858. #else
  40859. "lsr r7, r6, #16\n\t"
  40860. #endif
  40861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40862. "lsls r6, r6, #16\n\t"
  40863. #else
  40864. "lsl r6, r6, #16\n\t"
  40865. #endif
  40866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40867. "adds r5, r5, r6\n\t"
  40868. #else
  40869. "add r5, r5, r6\n\t"
  40870. #endif
  40871. #ifdef WOLFSSL_KEIL
  40872. "adcs r3, r3, r7\n\t"
  40873. #elif defined(__clang__)
  40874. "adcs r3, r7\n\t"
  40875. #else
  40876. "adc r3, r7\n\t"
  40877. #endif
  40878. #ifdef WOLFSSL_KEIL
  40879. "adcs r4, r4, %[r]\n\t"
  40880. #elif defined(__clang__)
  40881. "adcs r4, %[r]\n\t"
  40882. #else
  40883. "adc r4, %[r]\n\t"
  40884. #endif
  40885. "str r5, [sp, #44]\n\t"
  40886. "# A[11] * B[1]\n\t"
  40887. "movs r5, #0\n\t"
  40888. "mov %[a], r9\n\t"
  40889. "mov %[b], r10\n\t"
  40890. "ldr %[a], [%[a], #44]\n\t"
  40891. "ldr %[b], [%[b], #4]\n\t"
  40892. "uxth r6, %[a]\n\t"
  40893. "uxth r7, %[b]\n\t"
  40894. #ifdef WOLFSSL_KEIL
  40895. "muls r7, r6, r7\n\t"
  40896. #elif defined(__clang__)
  40897. "muls r7, r6\n\t"
  40898. #else
  40899. "mul r7, r6\n\t"
  40900. #endif
  40901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40902. "adds r3, r3, r7\n\t"
  40903. #else
  40904. "add r3, r3, r7\n\t"
  40905. #endif
  40906. #ifdef WOLFSSL_KEIL
  40907. "adcs r4, r4, %[r]\n\t"
  40908. #elif defined(__clang__)
  40909. "adcs r4, %[r]\n\t"
  40910. #else
  40911. "adc r4, %[r]\n\t"
  40912. #endif
  40913. #ifdef WOLFSSL_KEIL
  40914. "adcs r5, r5, %[r]\n\t"
  40915. #elif defined(__clang__)
  40916. "adcs r5, %[r]\n\t"
  40917. #else
  40918. "adc r5, %[r]\n\t"
  40919. #endif
  40920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40921. "lsrs r7, %[b], #16\n\t"
  40922. #else
  40923. "lsr r7, %[b], #16\n\t"
  40924. #endif
  40925. #ifdef WOLFSSL_KEIL
  40926. "muls r6, r7, r6\n\t"
  40927. #elif defined(__clang__)
  40928. "muls r6, r7\n\t"
  40929. #else
  40930. "mul r6, r7\n\t"
  40931. #endif
  40932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40933. "lsrs r7, r6, #16\n\t"
  40934. #else
  40935. "lsr r7, r6, #16\n\t"
  40936. #endif
  40937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40938. "lsls r6, r6, #16\n\t"
  40939. #else
  40940. "lsl r6, r6, #16\n\t"
  40941. #endif
  40942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40943. "adds r3, r3, r6\n\t"
  40944. #else
  40945. "add r3, r3, r6\n\t"
  40946. #endif
  40947. #ifdef WOLFSSL_KEIL
  40948. "adcs r4, r4, r7\n\t"
  40949. #elif defined(__clang__)
  40950. "adcs r4, r7\n\t"
  40951. #else
  40952. "adc r4, r7\n\t"
  40953. #endif
  40954. #ifdef WOLFSSL_KEIL
  40955. "adcs r5, r5, %[r]\n\t"
  40956. #elif defined(__clang__)
  40957. "adcs r5, %[r]\n\t"
  40958. #else
  40959. "adc r5, %[r]\n\t"
  40960. #endif
  40961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40962. "lsrs r6, %[a], #16\n\t"
  40963. #else
  40964. "lsr r6, %[a], #16\n\t"
  40965. #endif
  40966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40967. "lsrs r7, %[b], #16\n\t"
  40968. #else
  40969. "lsr r7, %[b], #16\n\t"
  40970. #endif
  40971. #ifdef WOLFSSL_KEIL
  40972. "muls r7, r6, r7\n\t"
  40973. #elif defined(__clang__)
  40974. "muls r7, r6\n\t"
  40975. #else
  40976. "mul r7, r6\n\t"
  40977. #endif
  40978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40979. "adds r4, r4, r7\n\t"
  40980. #else
  40981. "add r4, r4, r7\n\t"
  40982. #endif
  40983. #ifdef WOLFSSL_KEIL
  40984. "adcs r5, r5, %[r]\n\t"
  40985. #elif defined(__clang__)
  40986. "adcs r5, %[r]\n\t"
  40987. #else
  40988. "adc r5, %[r]\n\t"
  40989. #endif
  40990. "uxth r7, %[b]\n\t"
  40991. #ifdef WOLFSSL_KEIL
  40992. "muls r6, r7, r6\n\t"
  40993. #elif defined(__clang__)
  40994. "muls r6, r7\n\t"
  40995. #else
  40996. "mul r6, r7\n\t"
  40997. #endif
  40998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40999. "lsrs r7, r6, #16\n\t"
  41000. #else
  41001. "lsr r7, r6, #16\n\t"
  41002. #endif
  41003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41004. "lsls r6, r6, #16\n\t"
  41005. #else
  41006. "lsl r6, r6, #16\n\t"
  41007. #endif
  41008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41009. "adds r3, r3, r6\n\t"
  41010. #else
  41011. "add r3, r3, r6\n\t"
  41012. #endif
  41013. #ifdef WOLFSSL_KEIL
  41014. "adcs r4, r4, r7\n\t"
  41015. #elif defined(__clang__)
  41016. "adcs r4, r7\n\t"
  41017. #else
  41018. "adc r4, r7\n\t"
  41019. #endif
  41020. #ifdef WOLFSSL_KEIL
  41021. "adcs r5, r5, %[r]\n\t"
  41022. #elif defined(__clang__)
  41023. "adcs r5, %[r]\n\t"
  41024. #else
  41025. "adc r5, %[r]\n\t"
  41026. #endif
  41027. "# A[10] * B[2]\n\t"
  41028. "mov %[a], r9\n\t"
  41029. "mov %[b], r10\n\t"
  41030. "ldr %[a], [%[a], #40]\n\t"
  41031. "ldr %[b], [%[b], #8]\n\t"
  41032. "uxth r6, %[a]\n\t"
  41033. "uxth r7, %[b]\n\t"
  41034. #ifdef WOLFSSL_KEIL
  41035. "muls r7, r6, r7\n\t"
  41036. #elif defined(__clang__)
  41037. "muls r7, r6\n\t"
  41038. #else
  41039. "mul r7, r6\n\t"
  41040. #endif
  41041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41042. "adds r3, r3, r7\n\t"
  41043. #else
  41044. "add r3, r3, r7\n\t"
  41045. #endif
  41046. #ifdef WOLFSSL_KEIL
  41047. "adcs r4, r4, %[r]\n\t"
  41048. #elif defined(__clang__)
  41049. "adcs r4, %[r]\n\t"
  41050. #else
  41051. "adc r4, %[r]\n\t"
  41052. #endif
  41053. #ifdef WOLFSSL_KEIL
  41054. "adcs r5, r5, %[r]\n\t"
  41055. #elif defined(__clang__)
  41056. "adcs r5, %[r]\n\t"
  41057. #else
  41058. "adc r5, %[r]\n\t"
  41059. #endif
  41060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41061. "lsrs r7, %[b], #16\n\t"
  41062. #else
  41063. "lsr r7, %[b], #16\n\t"
  41064. #endif
  41065. #ifdef WOLFSSL_KEIL
  41066. "muls r6, r7, r6\n\t"
  41067. #elif defined(__clang__)
  41068. "muls r6, r7\n\t"
  41069. #else
  41070. "mul r6, r7\n\t"
  41071. #endif
  41072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41073. "lsrs r7, r6, #16\n\t"
  41074. #else
  41075. "lsr r7, r6, #16\n\t"
  41076. #endif
  41077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41078. "lsls r6, r6, #16\n\t"
  41079. #else
  41080. "lsl r6, r6, #16\n\t"
  41081. #endif
  41082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41083. "adds r3, r3, r6\n\t"
  41084. #else
  41085. "add r3, r3, r6\n\t"
  41086. #endif
  41087. #ifdef WOLFSSL_KEIL
  41088. "adcs r4, r4, r7\n\t"
  41089. #elif defined(__clang__)
  41090. "adcs r4, r7\n\t"
  41091. #else
  41092. "adc r4, r7\n\t"
  41093. #endif
  41094. #ifdef WOLFSSL_KEIL
  41095. "adcs r5, r5, %[r]\n\t"
  41096. #elif defined(__clang__)
  41097. "adcs r5, %[r]\n\t"
  41098. #else
  41099. "adc r5, %[r]\n\t"
  41100. #endif
  41101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41102. "lsrs r6, %[a], #16\n\t"
  41103. #else
  41104. "lsr r6, %[a], #16\n\t"
  41105. #endif
  41106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41107. "lsrs r7, %[b], #16\n\t"
  41108. #else
  41109. "lsr r7, %[b], #16\n\t"
  41110. #endif
  41111. #ifdef WOLFSSL_KEIL
  41112. "muls r7, r6, r7\n\t"
  41113. #elif defined(__clang__)
  41114. "muls r7, r6\n\t"
  41115. #else
  41116. "mul r7, r6\n\t"
  41117. #endif
  41118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41119. "adds r4, r4, r7\n\t"
  41120. #else
  41121. "add r4, r4, r7\n\t"
  41122. #endif
  41123. #ifdef WOLFSSL_KEIL
  41124. "adcs r5, r5, %[r]\n\t"
  41125. #elif defined(__clang__)
  41126. "adcs r5, %[r]\n\t"
  41127. #else
  41128. "adc r5, %[r]\n\t"
  41129. #endif
  41130. "uxth r7, %[b]\n\t"
  41131. #ifdef WOLFSSL_KEIL
  41132. "muls r6, r7, r6\n\t"
  41133. #elif defined(__clang__)
  41134. "muls r6, r7\n\t"
  41135. #else
  41136. "mul r6, r7\n\t"
  41137. #endif
  41138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41139. "lsrs r7, r6, #16\n\t"
  41140. #else
  41141. "lsr r7, r6, #16\n\t"
  41142. #endif
  41143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41144. "lsls r6, r6, #16\n\t"
  41145. #else
  41146. "lsl r6, r6, #16\n\t"
  41147. #endif
  41148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41149. "adds r3, r3, r6\n\t"
  41150. #else
  41151. "add r3, r3, r6\n\t"
  41152. #endif
  41153. #ifdef WOLFSSL_KEIL
  41154. "adcs r4, r4, r7\n\t"
  41155. #elif defined(__clang__)
  41156. "adcs r4, r7\n\t"
  41157. #else
  41158. "adc r4, r7\n\t"
  41159. #endif
  41160. #ifdef WOLFSSL_KEIL
  41161. "adcs r5, r5, %[r]\n\t"
  41162. #elif defined(__clang__)
  41163. "adcs r5, %[r]\n\t"
  41164. #else
  41165. "adc r5, %[r]\n\t"
  41166. #endif
  41167. "# A[9] * B[3]\n\t"
  41168. "mov %[a], r9\n\t"
  41169. "mov %[b], r10\n\t"
  41170. "ldr %[a], [%[a], #36]\n\t"
  41171. "ldr %[b], [%[b], #12]\n\t"
  41172. "uxth r6, %[a]\n\t"
  41173. "uxth r7, %[b]\n\t"
  41174. #ifdef WOLFSSL_KEIL
  41175. "muls r7, r6, r7\n\t"
  41176. #elif defined(__clang__)
  41177. "muls r7, r6\n\t"
  41178. #else
  41179. "mul r7, r6\n\t"
  41180. #endif
  41181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41182. "adds r3, r3, r7\n\t"
  41183. #else
  41184. "add r3, r3, r7\n\t"
  41185. #endif
  41186. #ifdef WOLFSSL_KEIL
  41187. "adcs r4, r4, %[r]\n\t"
  41188. #elif defined(__clang__)
  41189. "adcs r4, %[r]\n\t"
  41190. #else
  41191. "adc r4, %[r]\n\t"
  41192. #endif
  41193. #ifdef WOLFSSL_KEIL
  41194. "adcs r5, r5, %[r]\n\t"
  41195. #elif defined(__clang__)
  41196. "adcs r5, %[r]\n\t"
  41197. #else
  41198. "adc r5, %[r]\n\t"
  41199. #endif
  41200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41201. "lsrs r7, %[b], #16\n\t"
  41202. #else
  41203. "lsr r7, %[b], #16\n\t"
  41204. #endif
  41205. #ifdef WOLFSSL_KEIL
  41206. "muls r6, r7, r6\n\t"
  41207. #elif defined(__clang__)
  41208. "muls r6, r7\n\t"
  41209. #else
  41210. "mul r6, r7\n\t"
  41211. #endif
  41212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41213. "lsrs r7, r6, #16\n\t"
  41214. #else
  41215. "lsr r7, r6, #16\n\t"
  41216. #endif
  41217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41218. "lsls r6, r6, #16\n\t"
  41219. #else
  41220. "lsl r6, r6, #16\n\t"
  41221. #endif
  41222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41223. "adds r3, r3, r6\n\t"
  41224. #else
  41225. "add r3, r3, r6\n\t"
  41226. #endif
  41227. #ifdef WOLFSSL_KEIL
  41228. "adcs r4, r4, r7\n\t"
  41229. #elif defined(__clang__)
  41230. "adcs r4, r7\n\t"
  41231. #else
  41232. "adc r4, r7\n\t"
  41233. #endif
  41234. #ifdef WOLFSSL_KEIL
  41235. "adcs r5, r5, %[r]\n\t"
  41236. #elif defined(__clang__)
  41237. "adcs r5, %[r]\n\t"
  41238. #else
  41239. "adc r5, %[r]\n\t"
  41240. #endif
  41241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41242. "lsrs r6, %[a], #16\n\t"
  41243. #else
  41244. "lsr r6, %[a], #16\n\t"
  41245. #endif
  41246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41247. "lsrs r7, %[b], #16\n\t"
  41248. #else
  41249. "lsr r7, %[b], #16\n\t"
  41250. #endif
  41251. #ifdef WOLFSSL_KEIL
  41252. "muls r7, r6, r7\n\t"
  41253. #elif defined(__clang__)
  41254. "muls r7, r6\n\t"
  41255. #else
  41256. "mul r7, r6\n\t"
  41257. #endif
  41258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41259. "adds r4, r4, r7\n\t"
  41260. #else
  41261. "add r4, r4, r7\n\t"
  41262. #endif
  41263. #ifdef WOLFSSL_KEIL
  41264. "adcs r5, r5, %[r]\n\t"
  41265. #elif defined(__clang__)
  41266. "adcs r5, %[r]\n\t"
  41267. #else
  41268. "adc r5, %[r]\n\t"
  41269. #endif
  41270. "uxth r7, %[b]\n\t"
  41271. #ifdef WOLFSSL_KEIL
  41272. "muls r6, r7, r6\n\t"
  41273. #elif defined(__clang__)
  41274. "muls r6, r7\n\t"
  41275. #else
  41276. "mul r6, r7\n\t"
  41277. #endif
  41278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41279. "lsrs r7, r6, #16\n\t"
  41280. #else
  41281. "lsr r7, r6, #16\n\t"
  41282. #endif
  41283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41284. "lsls r6, r6, #16\n\t"
  41285. #else
  41286. "lsl r6, r6, #16\n\t"
  41287. #endif
  41288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41289. "adds r3, r3, r6\n\t"
  41290. #else
  41291. "add r3, r3, r6\n\t"
  41292. #endif
  41293. #ifdef WOLFSSL_KEIL
  41294. "adcs r4, r4, r7\n\t"
  41295. #elif defined(__clang__)
  41296. "adcs r4, r7\n\t"
  41297. #else
  41298. "adc r4, r7\n\t"
  41299. #endif
  41300. #ifdef WOLFSSL_KEIL
  41301. "adcs r5, r5, %[r]\n\t"
  41302. #elif defined(__clang__)
  41303. "adcs r5, %[r]\n\t"
  41304. #else
  41305. "adc r5, %[r]\n\t"
  41306. #endif
  41307. "# A[8] * B[4]\n\t"
  41308. "mov %[a], r9\n\t"
  41309. "mov %[b], r10\n\t"
  41310. "ldr %[a], [%[a], #32]\n\t"
  41311. "ldr %[b], [%[b], #16]\n\t"
  41312. "uxth r6, %[a]\n\t"
  41313. "uxth r7, %[b]\n\t"
  41314. #ifdef WOLFSSL_KEIL
  41315. "muls r7, r6, r7\n\t"
  41316. #elif defined(__clang__)
  41317. "muls r7, r6\n\t"
  41318. #else
  41319. "mul r7, r6\n\t"
  41320. #endif
  41321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41322. "adds r3, r3, r7\n\t"
  41323. #else
  41324. "add r3, r3, r7\n\t"
  41325. #endif
  41326. #ifdef WOLFSSL_KEIL
  41327. "adcs r4, r4, %[r]\n\t"
  41328. #elif defined(__clang__)
  41329. "adcs r4, %[r]\n\t"
  41330. #else
  41331. "adc r4, %[r]\n\t"
  41332. #endif
  41333. #ifdef WOLFSSL_KEIL
  41334. "adcs r5, r5, %[r]\n\t"
  41335. #elif defined(__clang__)
  41336. "adcs r5, %[r]\n\t"
  41337. #else
  41338. "adc r5, %[r]\n\t"
  41339. #endif
  41340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41341. "lsrs r7, %[b], #16\n\t"
  41342. #else
  41343. "lsr r7, %[b], #16\n\t"
  41344. #endif
  41345. #ifdef WOLFSSL_KEIL
  41346. "muls r6, r7, r6\n\t"
  41347. #elif defined(__clang__)
  41348. "muls r6, r7\n\t"
  41349. #else
  41350. "mul r6, r7\n\t"
  41351. #endif
  41352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41353. "lsrs r7, r6, #16\n\t"
  41354. #else
  41355. "lsr r7, r6, #16\n\t"
  41356. #endif
  41357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41358. "lsls r6, r6, #16\n\t"
  41359. #else
  41360. "lsl r6, r6, #16\n\t"
  41361. #endif
  41362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41363. "adds r3, r3, r6\n\t"
  41364. #else
  41365. "add r3, r3, r6\n\t"
  41366. #endif
  41367. #ifdef WOLFSSL_KEIL
  41368. "adcs r4, r4, r7\n\t"
  41369. #elif defined(__clang__)
  41370. "adcs r4, r7\n\t"
  41371. #else
  41372. "adc r4, r7\n\t"
  41373. #endif
  41374. #ifdef WOLFSSL_KEIL
  41375. "adcs r5, r5, %[r]\n\t"
  41376. #elif defined(__clang__)
  41377. "adcs r5, %[r]\n\t"
  41378. #else
  41379. "adc r5, %[r]\n\t"
  41380. #endif
  41381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41382. "lsrs r6, %[a], #16\n\t"
  41383. #else
  41384. "lsr r6, %[a], #16\n\t"
  41385. #endif
  41386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41387. "lsrs r7, %[b], #16\n\t"
  41388. #else
  41389. "lsr r7, %[b], #16\n\t"
  41390. #endif
  41391. #ifdef WOLFSSL_KEIL
  41392. "muls r7, r6, r7\n\t"
  41393. #elif defined(__clang__)
  41394. "muls r7, r6\n\t"
  41395. #else
  41396. "mul r7, r6\n\t"
  41397. #endif
  41398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41399. "adds r4, r4, r7\n\t"
  41400. #else
  41401. "add r4, r4, r7\n\t"
  41402. #endif
  41403. #ifdef WOLFSSL_KEIL
  41404. "adcs r5, r5, %[r]\n\t"
  41405. #elif defined(__clang__)
  41406. "adcs r5, %[r]\n\t"
  41407. #else
  41408. "adc r5, %[r]\n\t"
  41409. #endif
  41410. "uxth r7, %[b]\n\t"
  41411. #ifdef WOLFSSL_KEIL
  41412. "muls r6, r7, r6\n\t"
  41413. #elif defined(__clang__)
  41414. "muls r6, r7\n\t"
  41415. #else
  41416. "mul r6, r7\n\t"
  41417. #endif
  41418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41419. "lsrs r7, r6, #16\n\t"
  41420. #else
  41421. "lsr r7, r6, #16\n\t"
  41422. #endif
  41423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41424. "lsls r6, r6, #16\n\t"
  41425. #else
  41426. "lsl r6, r6, #16\n\t"
  41427. #endif
  41428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41429. "adds r3, r3, r6\n\t"
  41430. #else
  41431. "add r3, r3, r6\n\t"
  41432. #endif
  41433. #ifdef WOLFSSL_KEIL
  41434. "adcs r4, r4, r7\n\t"
  41435. #elif defined(__clang__)
  41436. "adcs r4, r7\n\t"
  41437. #else
  41438. "adc r4, r7\n\t"
  41439. #endif
  41440. #ifdef WOLFSSL_KEIL
  41441. "adcs r5, r5, %[r]\n\t"
  41442. #elif defined(__clang__)
  41443. "adcs r5, %[r]\n\t"
  41444. #else
  41445. "adc r5, %[r]\n\t"
  41446. #endif
  41447. "# A[7] * B[5]\n\t"
  41448. "mov %[a], r9\n\t"
  41449. "mov %[b], r10\n\t"
  41450. "ldr %[a], [%[a], #28]\n\t"
  41451. "ldr %[b], [%[b], #20]\n\t"
  41452. "uxth r6, %[a]\n\t"
  41453. "uxth r7, %[b]\n\t"
  41454. #ifdef WOLFSSL_KEIL
  41455. "muls r7, r6, r7\n\t"
  41456. #elif defined(__clang__)
  41457. "muls r7, r6\n\t"
  41458. #else
  41459. "mul r7, r6\n\t"
  41460. #endif
  41461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41462. "adds r3, r3, r7\n\t"
  41463. #else
  41464. "add r3, r3, r7\n\t"
  41465. #endif
  41466. #ifdef WOLFSSL_KEIL
  41467. "adcs r4, r4, %[r]\n\t"
  41468. #elif defined(__clang__)
  41469. "adcs r4, %[r]\n\t"
  41470. #else
  41471. "adc r4, %[r]\n\t"
  41472. #endif
  41473. #ifdef WOLFSSL_KEIL
  41474. "adcs r5, r5, %[r]\n\t"
  41475. #elif defined(__clang__)
  41476. "adcs r5, %[r]\n\t"
  41477. #else
  41478. "adc r5, %[r]\n\t"
  41479. #endif
  41480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41481. "lsrs r7, %[b], #16\n\t"
  41482. #else
  41483. "lsr r7, %[b], #16\n\t"
  41484. #endif
  41485. #ifdef WOLFSSL_KEIL
  41486. "muls r6, r7, r6\n\t"
  41487. #elif defined(__clang__)
  41488. "muls r6, r7\n\t"
  41489. #else
  41490. "mul r6, r7\n\t"
  41491. #endif
  41492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41493. "lsrs r7, r6, #16\n\t"
  41494. #else
  41495. "lsr r7, r6, #16\n\t"
  41496. #endif
  41497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41498. "lsls r6, r6, #16\n\t"
  41499. #else
  41500. "lsl r6, r6, #16\n\t"
  41501. #endif
  41502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41503. "adds r3, r3, r6\n\t"
  41504. #else
  41505. "add r3, r3, r6\n\t"
  41506. #endif
  41507. #ifdef WOLFSSL_KEIL
  41508. "adcs r4, r4, r7\n\t"
  41509. #elif defined(__clang__)
  41510. "adcs r4, r7\n\t"
  41511. #else
  41512. "adc r4, r7\n\t"
  41513. #endif
  41514. #ifdef WOLFSSL_KEIL
  41515. "adcs r5, r5, %[r]\n\t"
  41516. #elif defined(__clang__)
  41517. "adcs r5, %[r]\n\t"
  41518. #else
  41519. "adc r5, %[r]\n\t"
  41520. #endif
  41521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41522. "lsrs r6, %[a], #16\n\t"
  41523. #else
  41524. "lsr r6, %[a], #16\n\t"
  41525. #endif
  41526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41527. "lsrs r7, %[b], #16\n\t"
  41528. #else
  41529. "lsr r7, %[b], #16\n\t"
  41530. #endif
  41531. #ifdef WOLFSSL_KEIL
  41532. "muls r7, r6, r7\n\t"
  41533. #elif defined(__clang__)
  41534. "muls r7, r6\n\t"
  41535. #else
  41536. "mul r7, r6\n\t"
  41537. #endif
  41538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41539. "adds r4, r4, r7\n\t"
  41540. #else
  41541. "add r4, r4, r7\n\t"
  41542. #endif
  41543. #ifdef WOLFSSL_KEIL
  41544. "adcs r5, r5, %[r]\n\t"
  41545. #elif defined(__clang__)
  41546. "adcs r5, %[r]\n\t"
  41547. #else
  41548. "adc r5, %[r]\n\t"
  41549. #endif
  41550. "uxth r7, %[b]\n\t"
  41551. #ifdef WOLFSSL_KEIL
  41552. "muls r6, r7, r6\n\t"
  41553. #elif defined(__clang__)
  41554. "muls r6, r7\n\t"
  41555. #else
  41556. "mul r6, r7\n\t"
  41557. #endif
  41558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41559. "lsrs r7, r6, #16\n\t"
  41560. #else
  41561. "lsr r7, r6, #16\n\t"
  41562. #endif
  41563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41564. "lsls r6, r6, #16\n\t"
  41565. #else
  41566. "lsl r6, r6, #16\n\t"
  41567. #endif
  41568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41569. "adds r3, r3, r6\n\t"
  41570. #else
  41571. "add r3, r3, r6\n\t"
  41572. #endif
  41573. #ifdef WOLFSSL_KEIL
  41574. "adcs r4, r4, r7\n\t"
  41575. #elif defined(__clang__)
  41576. "adcs r4, r7\n\t"
  41577. #else
  41578. "adc r4, r7\n\t"
  41579. #endif
  41580. #ifdef WOLFSSL_KEIL
  41581. "adcs r5, r5, %[r]\n\t"
  41582. #elif defined(__clang__)
  41583. "adcs r5, %[r]\n\t"
  41584. #else
  41585. "adc r5, %[r]\n\t"
  41586. #endif
  41587. "# A[6] * B[6]\n\t"
  41588. "mov %[a], r9\n\t"
  41589. "mov %[b], r10\n\t"
  41590. "ldr %[a], [%[a], #24]\n\t"
  41591. "ldr %[b], [%[b], #24]\n\t"
  41592. "uxth r6, %[a]\n\t"
  41593. "uxth r7, %[b]\n\t"
  41594. #ifdef WOLFSSL_KEIL
  41595. "muls r7, r6, r7\n\t"
  41596. #elif defined(__clang__)
  41597. "muls r7, r6\n\t"
  41598. #else
  41599. "mul r7, r6\n\t"
  41600. #endif
  41601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41602. "adds r3, r3, r7\n\t"
  41603. #else
  41604. "add r3, r3, r7\n\t"
  41605. #endif
  41606. #ifdef WOLFSSL_KEIL
  41607. "adcs r4, r4, %[r]\n\t"
  41608. #elif defined(__clang__)
  41609. "adcs r4, %[r]\n\t"
  41610. #else
  41611. "adc r4, %[r]\n\t"
  41612. #endif
  41613. #ifdef WOLFSSL_KEIL
  41614. "adcs r5, r5, %[r]\n\t"
  41615. #elif defined(__clang__)
  41616. "adcs r5, %[r]\n\t"
  41617. #else
  41618. "adc r5, %[r]\n\t"
  41619. #endif
  41620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41621. "lsrs r7, %[b], #16\n\t"
  41622. #else
  41623. "lsr r7, %[b], #16\n\t"
  41624. #endif
  41625. #ifdef WOLFSSL_KEIL
  41626. "muls r6, r7, r6\n\t"
  41627. #elif defined(__clang__)
  41628. "muls r6, r7\n\t"
  41629. #else
  41630. "mul r6, r7\n\t"
  41631. #endif
  41632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41633. "lsrs r7, r6, #16\n\t"
  41634. #else
  41635. "lsr r7, r6, #16\n\t"
  41636. #endif
  41637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41638. "lsls r6, r6, #16\n\t"
  41639. #else
  41640. "lsl r6, r6, #16\n\t"
  41641. #endif
  41642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41643. "adds r3, r3, r6\n\t"
  41644. #else
  41645. "add r3, r3, r6\n\t"
  41646. #endif
  41647. #ifdef WOLFSSL_KEIL
  41648. "adcs r4, r4, r7\n\t"
  41649. #elif defined(__clang__)
  41650. "adcs r4, r7\n\t"
  41651. #else
  41652. "adc r4, r7\n\t"
  41653. #endif
  41654. #ifdef WOLFSSL_KEIL
  41655. "adcs r5, r5, %[r]\n\t"
  41656. #elif defined(__clang__)
  41657. "adcs r5, %[r]\n\t"
  41658. #else
  41659. "adc r5, %[r]\n\t"
  41660. #endif
  41661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41662. "lsrs r6, %[a], #16\n\t"
  41663. #else
  41664. "lsr r6, %[a], #16\n\t"
  41665. #endif
  41666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41667. "lsrs r7, %[b], #16\n\t"
  41668. #else
  41669. "lsr r7, %[b], #16\n\t"
  41670. #endif
  41671. #ifdef WOLFSSL_KEIL
  41672. "muls r7, r6, r7\n\t"
  41673. #elif defined(__clang__)
  41674. "muls r7, r6\n\t"
  41675. #else
  41676. "mul r7, r6\n\t"
  41677. #endif
  41678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41679. "adds r4, r4, r7\n\t"
  41680. #else
  41681. "add r4, r4, r7\n\t"
  41682. #endif
  41683. #ifdef WOLFSSL_KEIL
  41684. "adcs r5, r5, %[r]\n\t"
  41685. #elif defined(__clang__)
  41686. "adcs r5, %[r]\n\t"
  41687. #else
  41688. "adc r5, %[r]\n\t"
  41689. #endif
  41690. "uxth r7, %[b]\n\t"
  41691. #ifdef WOLFSSL_KEIL
  41692. "muls r6, r7, r6\n\t"
  41693. #elif defined(__clang__)
  41694. "muls r6, r7\n\t"
  41695. #else
  41696. "mul r6, r7\n\t"
  41697. #endif
  41698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41699. "lsrs r7, r6, #16\n\t"
  41700. #else
  41701. "lsr r7, r6, #16\n\t"
  41702. #endif
  41703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41704. "lsls r6, r6, #16\n\t"
  41705. #else
  41706. "lsl r6, r6, #16\n\t"
  41707. #endif
  41708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41709. "adds r3, r3, r6\n\t"
  41710. #else
  41711. "add r3, r3, r6\n\t"
  41712. #endif
  41713. #ifdef WOLFSSL_KEIL
  41714. "adcs r4, r4, r7\n\t"
  41715. #elif defined(__clang__)
  41716. "adcs r4, r7\n\t"
  41717. #else
  41718. "adc r4, r7\n\t"
  41719. #endif
  41720. #ifdef WOLFSSL_KEIL
  41721. "adcs r5, r5, %[r]\n\t"
  41722. #elif defined(__clang__)
  41723. "adcs r5, %[r]\n\t"
  41724. #else
  41725. "adc r5, %[r]\n\t"
  41726. #endif
  41727. "# A[5] * B[7]\n\t"
  41728. "mov %[a], r9\n\t"
  41729. "mov %[b], r10\n\t"
  41730. "ldr %[a], [%[a], #20]\n\t"
  41731. "ldr %[b], [%[b], #28]\n\t"
  41732. "uxth r6, %[a]\n\t"
  41733. "uxth r7, %[b]\n\t"
  41734. #ifdef WOLFSSL_KEIL
  41735. "muls r7, r6, r7\n\t"
  41736. #elif defined(__clang__)
  41737. "muls r7, r6\n\t"
  41738. #else
  41739. "mul r7, r6\n\t"
  41740. #endif
  41741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41742. "adds r3, r3, r7\n\t"
  41743. #else
  41744. "add r3, r3, r7\n\t"
  41745. #endif
  41746. #ifdef WOLFSSL_KEIL
  41747. "adcs r4, r4, %[r]\n\t"
  41748. #elif defined(__clang__)
  41749. "adcs r4, %[r]\n\t"
  41750. #else
  41751. "adc r4, %[r]\n\t"
  41752. #endif
  41753. #ifdef WOLFSSL_KEIL
  41754. "adcs r5, r5, %[r]\n\t"
  41755. #elif defined(__clang__)
  41756. "adcs r5, %[r]\n\t"
  41757. #else
  41758. "adc r5, %[r]\n\t"
  41759. #endif
  41760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41761. "lsrs r7, %[b], #16\n\t"
  41762. #else
  41763. "lsr r7, %[b], #16\n\t"
  41764. #endif
  41765. #ifdef WOLFSSL_KEIL
  41766. "muls r6, r7, r6\n\t"
  41767. #elif defined(__clang__)
  41768. "muls r6, r7\n\t"
  41769. #else
  41770. "mul r6, r7\n\t"
  41771. #endif
  41772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41773. "lsrs r7, r6, #16\n\t"
  41774. #else
  41775. "lsr r7, r6, #16\n\t"
  41776. #endif
  41777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41778. "lsls r6, r6, #16\n\t"
  41779. #else
  41780. "lsl r6, r6, #16\n\t"
  41781. #endif
  41782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41783. "adds r3, r3, r6\n\t"
  41784. #else
  41785. "add r3, r3, r6\n\t"
  41786. #endif
  41787. #ifdef WOLFSSL_KEIL
  41788. "adcs r4, r4, r7\n\t"
  41789. #elif defined(__clang__)
  41790. "adcs r4, r7\n\t"
  41791. #else
  41792. "adc r4, r7\n\t"
  41793. #endif
  41794. #ifdef WOLFSSL_KEIL
  41795. "adcs r5, r5, %[r]\n\t"
  41796. #elif defined(__clang__)
  41797. "adcs r5, %[r]\n\t"
  41798. #else
  41799. "adc r5, %[r]\n\t"
  41800. #endif
  41801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41802. "lsrs r6, %[a], #16\n\t"
  41803. #else
  41804. "lsr r6, %[a], #16\n\t"
  41805. #endif
  41806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41807. "lsrs r7, %[b], #16\n\t"
  41808. #else
  41809. "lsr r7, %[b], #16\n\t"
  41810. #endif
  41811. #ifdef WOLFSSL_KEIL
  41812. "muls r7, r6, r7\n\t"
  41813. #elif defined(__clang__)
  41814. "muls r7, r6\n\t"
  41815. #else
  41816. "mul r7, r6\n\t"
  41817. #endif
  41818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41819. "adds r4, r4, r7\n\t"
  41820. #else
  41821. "add r4, r4, r7\n\t"
  41822. #endif
  41823. #ifdef WOLFSSL_KEIL
  41824. "adcs r5, r5, %[r]\n\t"
  41825. #elif defined(__clang__)
  41826. "adcs r5, %[r]\n\t"
  41827. #else
  41828. "adc r5, %[r]\n\t"
  41829. #endif
  41830. "uxth r7, %[b]\n\t"
  41831. #ifdef WOLFSSL_KEIL
  41832. "muls r6, r7, r6\n\t"
  41833. #elif defined(__clang__)
  41834. "muls r6, r7\n\t"
  41835. #else
  41836. "mul r6, r7\n\t"
  41837. #endif
  41838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41839. "lsrs r7, r6, #16\n\t"
  41840. #else
  41841. "lsr r7, r6, #16\n\t"
  41842. #endif
  41843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41844. "lsls r6, r6, #16\n\t"
  41845. #else
  41846. "lsl r6, r6, #16\n\t"
  41847. #endif
  41848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41849. "adds r3, r3, r6\n\t"
  41850. #else
  41851. "add r3, r3, r6\n\t"
  41852. #endif
  41853. #ifdef WOLFSSL_KEIL
  41854. "adcs r4, r4, r7\n\t"
  41855. #elif defined(__clang__)
  41856. "adcs r4, r7\n\t"
  41857. #else
  41858. "adc r4, r7\n\t"
  41859. #endif
  41860. #ifdef WOLFSSL_KEIL
  41861. "adcs r5, r5, %[r]\n\t"
  41862. #elif defined(__clang__)
  41863. "adcs r5, %[r]\n\t"
  41864. #else
  41865. "adc r5, %[r]\n\t"
  41866. #endif
  41867. "# A[4] * B[8]\n\t"
  41868. "mov %[a], r9\n\t"
  41869. "mov %[b], r10\n\t"
  41870. "ldr %[a], [%[a], #16]\n\t"
  41871. "ldr %[b], [%[b], #32]\n\t"
  41872. "uxth r6, %[a]\n\t"
  41873. "uxth r7, %[b]\n\t"
  41874. #ifdef WOLFSSL_KEIL
  41875. "muls r7, r6, r7\n\t"
  41876. #elif defined(__clang__)
  41877. "muls r7, r6\n\t"
  41878. #else
  41879. "mul r7, r6\n\t"
  41880. #endif
  41881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41882. "adds r3, r3, r7\n\t"
  41883. #else
  41884. "add r3, r3, r7\n\t"
  41885. #endif
  41886. #ifdef WOLFSSL_KEIL
  41887. "adcs r4, r4, %[r]\n\t"
  41888. #elif defined(__clang__)
  41889. "adcs r4, %[r]\n\t"
  41890. #else
  41891. "adc r4, %[r]\n\t"
  41892. #endif
  41893. #ifdef WOLFSSL_KEIL
  41894. "adcs r5, r5, %[r]\n\t"
  41895. #elif defined(__clang__)
  41896. "adcs r5, %[r]\n\t"
  41897. #else
  41898. "adc r5, %[r]\n\t"
  41899. #endif
  41900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41901. "lsrs r7, %[b], #16\n\t"
  41902. #else
  41903. "lsr r7, %[b], #16\n\t"
  41904. #endif
  41905. #ifdef WOLFSSL_KEIL
  41906. "muls r6, r7, r6\n\t"
  41907. #elif defined(__clang__)
  41908. "muls r6, r7\n\t"
  41909. #else
  41910. "mul r6, r7\n\t"
  41911. #endif
  41912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41913. "lsrs r7, r6, #16\n\t"
  41914. #else
  41915. "lsr r7, r6, #16\n\t"
  41916. #endif
  41917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41918. "lsls r6, r6, #16\n\t"
  41919. #else
  41920. "lsl r6, r6, #16\n\t"
  41921. #endif
  41922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41923. "adds r3, r3, r6\n\t"
  41924. #else
  41925. "add r3, r3, r6\n\t"
  41926. #endif
  41927. #ifdef WOLFSSL_KEIL
  41928. "adcs r4, r4, r7\n\t"
  41929. #elif defined(__clang__)
  41930. "adcs r4, r7\n\t"
  41931. #else
  41932. "adc r4, r7\n\t"
  41933. #endif
  41934. #ifdef WOLFSSL_KEIL
  41935. "adcs r5, r5, %[r]\n\t"
  41936. #elif defined(__clang__)
  41937. "adcs r5, %[r]\n\t"
  41938. #else
  41939. "adc r5, %[r]\n\t"
  41940. #endif
  41941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41942. "lsrs r6, %[a], #16\n\t"
  41943. #else
  41944. "lsr r6, %[a], #16\n\t"
  41945. #endif
  41946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41947. "lsrs r7, %[b], #16\n\t"
  41948. #else
  41949. "lsr r7, %[b], #16\n\t"
  41950. #endif
  41951. #ifdef WOLFSSL_KEIL
  41952. "muls r7, r6, r7\n\t"
  41953. #elif defined(__clang__)
  41954. "muls r7, r6\n\t"
  41955. #else
  41956. "mul r7, r6\n\t"
  41957. #endif
  41958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41959. "adds r4, r4, r7\n\t"
  41960. #else
  41961. "add r4, r4, r7\n\t"
  41962. #endif
  41963. #ifdef WOLFSSL_KEIL
  41964. "adcs r5, r5, %[r]\n\t"
  41965. #elif defined(__clang__)
  41966. "adcs r5, %[r]\n\t"
  41967. #else
  41968. "adc r5, %[r]\n\t"
  41969. #endif
  41970. "uxth r7, %[b]\n\t"
  41971. #ifdef WOLFSSL_KEIL
  41972. "muls r6, r7, r6\n\t"
  41973. #elif defined(__clang__)
  41974. "muls r6, r7\n\t"
  41975. #else
  41976. "mul r6, r7\n\t"
  41977. #endif
  41978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41979. "lsrs r7, r6, #16\n\t"
  41980. #else
  41981. "lsr r7, r6, #16\n\t"
  41982. #endif
  41983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41984. "lsls r6, r6, #16\n\t"
  41985. #else
  41986. "lsl r6, r6, #16\n\t"
  41987. #endif
  41988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41989. "adds r3, r3, r6\n\t"
  41990. #else
  41991. "add r3, r3, r6\n\t"
  41992. #endif
  41993. #ifdef WOLFSSL_KEIL
  41994. "adcs r4, r4, r7\n\t"
  41995. #elif defined(__clang__)
  41996. "adcs r4, r7\n\t"
  41997. #else
  41998. "adc r4, r7\n\t"
  41999. #endif
  42000. #ifdef WOLFSSL_KEIL
  42001. "adcs r5, r5, %[r]\n\t"
  42002. #elif defined(__clang__)
  42003. "adcs r5, %[r]\n\t"
  42004. #else
  42005. "adc r5, %[r]\n\t"
  42006. #endif
  42007. "# A[3] * B[9]\n\t"
  42008. "mov %[a], r9\n\t"
  42009. "mov %[b], r10\n\t"
  42010. "ldr %[a], [%[a], #12]\n\t"
  42011. "ldr %[b], [%[b], #36]\n\t"
  42012. "uxth r6, %[a]\n\t"
  42013. "uxth r7, %[b]\n\t"
  42014. #ifdef WOLFSSL_KEIL
  42015. "muls r7, r6, r7\n\t"
  42016. #elif defined(__clang__)
  42017. "muls r7, r6\n\t"
  42018. #else
  42019. "mul r7, r6\n\t"
  42020. #endif
  42021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42022. "adds r3, r3, r7\n\t"
  42023. #else
  42024. "add r3, r3, r7\n\t"
  42025. #endif
  42026. #ifdef WOLFSSL_KEIL
  42027. "adcs r4, r4, %[r]\n\t"
  42028. #elif defined(__clang__)
  42029. "adcs r4, %[r]\n\t"
  42030. #else
  42031. "adc r4, %[r]\n\t"
  42032. #endif
  42033. #ifdef WOLFSSL_KEIL
  42034. "adcs r5, r5, %[r]\n\t"
  42035. #elif defined(__clang__)
  42036. "adcs r5, %[r]\n\t"
  42037. #else
  42038. "adc r5, %[r]\n\t"
  42039. #endif
  42040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42041. "lsrs r7, %[b], #16\n\t"
  42042. #else
  42043. "lsr r7, %[b], #16\n\t"
  42044. #endif
  42045. #ifdef WOLFSSL_KEIL
  42046. "muls r6, r7, r6\n\t"
  42047. #elif defined(__clang__)
  42048. "muls r6, r7\n\t"
  42049. #else
  42050. "mul r6, r7\n\t"
  42051. #endif
  42052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42053. "lsrs r7, r6, #16\n\t"
  42054. #else
  42055. "lsr r7, r6, #16\n\t"
  42056. #endif
  42057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42058. "lsls r6, r6, #16\n\t"
  42059. #else
  42060. "lsl r6, r6, #16\n\t"
  42061. #endif
  42062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42063. "adds r3, r3, r6\n\t"
  42064. #else
  42065. "add r3, r3, r6\n\t"
  42066. #endif
  42067. #ifdef WOLFSSL_KEIL
  42068. "adcs r4, r4, r7\n\t"
  42069. #elif defined(__clang__)
  42070. "adcs r4, r7\n\t"
  42071. #else
  42072. "adc r4, r7\n\t"
  42073. #endif
  42074. #ifdef WOLFSSL_KEIL
  42075. "adcs r5, r5, %[r]\n\t"
  42076. #elif defined(__clang__)
  42077. "adcs r5, %[r]\n\t"
  42078. #else
  42079. "adc r5, %[r]\n\t"
  42080. #endif
  42081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42082. "lsrs r6, %[a], #16\n\t"
  42083. #else
  42084. "lsr r6, %[a], #16\n\t"
  42085. #endif
  42086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42087. "lsrs r7, %[b], #16\n\t"
  42088. #else
  42089. "lsr r7, %[b], #16\n\t"
  42090. #endif
  42091. #ifdef WOLFSSL_KEIL
  42092. "muls r7, r6, r7\n\t"
  42093. #elif defined(__clang__)
  42094. "muls r7, r6\n\t"
  42095. #else
  42096. "mul r7, r6\n\t"
  42097. #endif
  42098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42099. "adds r4, r4, r7\n\t"
  42100. #else
  42101. "add r4, r4, r7\n\t"
  42102. #endif
  42103. #ifdef WOLFSSL_KEIL
  42104. "adcs r5, r5, %[r]\n\t"
  42105. #elif defined(__clang__)
  42106. "adcs r5, %[r]\n\t"
  42107. #else
  42108. "adc r5, %[r]\n\t"
  42109. #endif
  42110. "uxth r7, %[b]\n\t"
  42111. #ifdef WOLFSSL_KEIL
  42112. "muls r6, r7, r6\n\t"
  42113. #elif defined(__clang__)
  42114. "muls r6, r7\n\t"
  42115. #else
  42116. "mul r6, r7\n\t"
  42117. #endif
  42118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42119. "lsrs r7, r6, #16\n\t"
  42120. #else
  42121. "lsr r7, r6, #16\n\t"
  42122. #endif
  42123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42124. "lsls r6, r6, #16\n\t"
  42125. #else
  42126. "lsl r6, r6, #16\n\t"
  42127. #endif
  42128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42129. "adds r3, r3, r6\n\t"
  42130. #else
  42131. "add r3, r3, r6\n\t"
  42132. #endif
  42133. #ifdef WOLFSSL_KEIL
  42134. "adcs r4, r4, r7\n\t"
  42135. #elif defined(__clang__)
  42136. "adcs r4, r7\n\t"
  42137. #else
  42138. "adc r4, r7\n\t"
  42139. #endif
  42140. #ifdef WOLFSSL_KEIL
  42141. "adcs r5, r5, %[r]\n\t"
  42142. #elif defined(__clang__)
  42143. "adcs r5, %[r]\n\t"
  42144. #else
  42145. "adc r5, %[r]\n\t"
  42146. #endif
  42147. "# A[2] * B[10]\n\t"
  42148. "mov %[a], r9\n\t"
  42149. "mov %[b], r10\n\t"
  42150. "ldr %[a], [%[a], #8]\n\t"
  42151. "ldr %[b], [%[b], #40]\n\t"
  42152. "uxth r6, %[a]\n\t"
  42153. "uxth r7, %[b]\n\t"
  42154. #ifdef WOLFSSL_KEIL
  42155. "muls r7, r6, r7\n\t"
  42156. #elif defined(__clang__)
  42157. "muls r7, r6\n\t"
  42158. #else
  42159. "mul r7, r6\n\t"
  42160. #endif
  42161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42162. "adds r3, r3, r7\n\t"
  42163. #else
  42164. "add r3, r3, r7\n\t"
  42165. #endif
  42166. #ifdef WOLFSSL_KEIL
  42167. "adcs r4, r4, %[r]\n\t"
  42168. #elif defined(__clang__)
  42169. "adcs r4, %[r]\n\t"
  42170. #else
  42171. "adc r4, %[r]\n\t"
  42172. #endif
  42173. #ifdef WOLFSSL_KEIL
  42174. "adcs r5, r5, %[r]\n\t"
  42175. #elif defined(__clang__)
  42176. "adcs r5, %[r]\n\t"
  42177. #else
  42178. "adc r5, %[r]\n\t"
  42179. #endif
  42180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42181. "lsrs r7, %[b], #16\n\t"
  42182. #else
  42183. "lsr r7, %[b], #16\n\t"
  42184. #endif
  42185. #ifdef WOLFSSL_KEIL
  42186. "muls r6, r7, r6\n\t"
  42187. #elif defined(__clang__)
  42188. "muls r6, r7\n\t"
  42189. #else
  42190. "mul r6, r7\n\t"
  42191. #endif
  42192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42193. "lsrs r7, r6, #16\n\t"
  42194. #else
  42195. "lsr r7, r6, #16\n\t"
  42196. #endif
  42197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42198. "lsls r6, r6, #16\n\t"
  42199. #else
  42200. "lsl r6, r6, #16\n\t"
  42201. #endif
  42202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42203. "adds r3, r3, r6\n\t"
  42204. #else
  42205. "add r3, r3, r6\n\t"
  42206. #endif
  42207. #ifdef WOLFSSL_KEIL
  42208. "adcs r4, r4, r7\n\t"
  42209. #elif defined(__clang__)
  42210. "adcs r4, r7\n\t"
  42211. #else
  42212. "adc r4, r7\n\t"
  42213. #endif
  42214. #ifdef WOLFSSL_KEIL
  42215. "adcs r5, r5, %[r]\n\t"
  42216. #elif defined(__clang__)
  42217. "adcs r5, %[r]\n\t"
  42218. #else
  42219. "adc r5, %[r]\n\t"
  42220. #endif
  42221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42222. "lsrs r6, %[a], #16\n\t"
  42223. #else
  42224. "lsr r6, %[a], #16\n\t"
  42225. #endif
  42226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42227. "lsrs r7, %[b], #16\n\t"
  42228. #else
  42229. "lsr r7, %[b], #16\n\t"
  42230. #endif
  42231. #ifdef WOLFSSL_KEIL
  42232. "muls r7, r6, r7\n\t"
  42233. #elif defined(__clang__)
  42234. "muls r7, r6\n\t"
  42235. #else
  42236. "mul r7, r6\n\t"
  42237. #endif
  42238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42239. "adds r4, r4, r7\n\t"
  42240. #else
  42241. "add r4, r4, r7\n\t"
  42242. #endif
  42243. #ifdef WOLFSSL_KEIL
  42244. "adcs r5, r5, %[r]\n\t"
  42245. #elif defined(__clang__)
  42246. "adcs r5, %[r]\n\t"
  42247. #else
  42248. "adc r5, %[r]\n\t"
  42249. #endif
  42250. "uxth r7, %[b]\n\t"
  42251. #ifdef WOLFSSL_KEIL
  42252. "muls r6, r7, r6\n\t"
  42253. #elif defined(__clang__)
  42254. "muls r6, r7\n\t"
  42255. #else
  42256. "mul r6, r7\n\t"
  42257. #endif
  42258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42259. "lsrs r7, r6, #16\n\t"
  42260. #else
  42261. "lsr r7, r6, #16\n\t"
  42262. #endif
  42263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42264. "lsls r6, r6, #16\n\t"
  42265. #else
  42266. "lsl r6, r6, #16\n\t"
  42267. #endif
  42268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42269. "adds r3, r3, r6\n\t"
  42270. #else
  42271. "add r3, r3, r6\n\t"
  42272. #endif
  42273. #ifdef WOLFSSL_KEIL
  42274. "adcs r4, r4, r7\n\t"
  42275. #elif defined(__clang__)
  42276. "adcs r4, r7\n\t"
  42277. #else
  42278. "adc r4, r7\n\t"
  42279. #endif
  42280. #ifdef WOLFSSL_KEIL
  42281. "adcs r5, r5, %[r]\n\t"
  42282. #elif defined(__clang__)
  42283. "adcs r5, %[r]\n\t"
  42284. #else
  42285. "adc r5, %[r]\n\t"
  42286. #endif
  42287. "# A[1] * B[11]\n\t"
  42288. "mov %[a], r9\n\t"
  42289. "mov %[b], r10\n\t"
  42290. "ldr %[a], [%[a], #4]\n\t"
  42291. "ldr %[b], [%[b], #44]\n\t"
  42292. "uxth r6, %[a]\n\t"
  42293. "uxth r7, %[b]\n\t"
  42294. #ifdef WOLFSSL_KEIL
  42295. "muls r7, r6, r7\n\t"
  42296. #elif defined(__clang__)
  42297. "muls r7, r6\n\t"
  42298. #else
  42299. "mul r7, r6\n\t"
  42300. #endif
  42301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42302. "adds r3, r3, r7\n\t"
  42303. #else
  42304. "add r3, r3, r7\n\t"
  42305. #endif
  42306. #ifdef WOLFSSL_KEIL
  42307. "adcs r4, r4, %[r]\n\t"
  42308. #elif defined(__clang__)
  42309. "adcs r4, %[r]\n\t"
  42310. #else
  42311. "adc r4, %[r]\n\t"
  42312. #endif
  42313. #ifdef WOLFSSL_KEIL
  42314. "adcs r5, r5, %[r]\n\t"
  42315. #elif defined(__clang__)
  42316. "adcs r5, %[r]\n\t"
  42317. #else
  42318. "adc r5, %[r]\n\t"
  42319. #endif
  42320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42321. "lsrs r7, %[b], #16\n\t"
  42322. #else
  42323. "lsr r7, %[b], #16\n\t"
  42324. #endif
  42325. #ifdef WOLFSSL_KEIL
  42326. "muls r6, r7, r6\n\t"
  42327. #elif defined(__clang__)
  42328. "muls r6, r7\n\t"
  42329. #else
  42330. "mul r6, r7\n\t"
  42331. #endif
  42332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42333. "lsrs r7, r6, #16\n\t"
  42334. #else
  42335. "lsr r7, r6, #16\n\t"
  42336. #endif
  42337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42338. "lsls r6, r6, #16\n\t"
  42339. #else
  42340. "lsl r6, r6, #16\n\t"
  42341. #endif
  42342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42343. "adds r3, r3, r6\n\t"
  42344. #else
  42345. "add r3, r3, r6\n\t"
  42346. #endif
  42347. #ifdef WOLFSSL_KEIL
  42348. "adcs r4, r4, r7\n\t"
  42349. #elif defined(__clang__)
  42350. "adcs r4, r7\n\t"
  42351. #else
  42352. "adc r4, r7\n\t"
  42353. #endif
  42354. #ifdef WOLFSSL_KEIL
  42355. "adcs r5, r5, %[r]\n\t"
  42356. #elif defined(__clang__)
  42357. "adcs r5, %[r]\n\t"
  42358. #else
  42359. "adc r5, %[r]\n\t"
  42360. #endif
  42361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42362. "lsrs r6, %[a], #16\n\t"
  42363. #else
  42364. "lsr r6, %[a], #16\n\t"
  42365. #endif
  42366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42367. "lsrs r7, %[b], #16\n\t"
  42368. #else
  42369. "lsr r7, %[b], #16\n\t"
  42370. #endif
  42371. #ifdef WOLFSSL_KEIL
  42372. "muls r7, r6, r7\n\t"
  42373. #elif defined(__clang__)
  42374. "muls r7, r6\n\t"
  42375. #else
  42376. "mul r7, r6\n\t"
  42377. #endif
  42378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42379. "adds r4, r4, r7\n\t"
  42380. #else
  42381. "add r4, r4, r7\n\t"
  42382. #endif
  42383. #ifdef WOLFSSL_KEIL
  42384. "adcs r5, r5, %[r]\n\t"
  42385. #elif defined(__clang__)
  42386. "adcs r5, %[r]\n\t"
  42387. #else
  42388. "adc r5, %[r]\n\t"
  42389. #endif
  42390. "uxth r7, %[b]\n\t"
  42391. #ifdef WOLFSSL_KEIL
  42392. "muls r6, r7, r6\n\t"
  42393. #elif defined(__clang__)
  42394. "muls r6, r7\n\t"
  42395. #else
  42396. "mul r6, r7\n\t"
  42397. #endif
  42398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42399. "lsrs r7, r6, #16\n\t"
  42400. #else
  42401. "lsr r7, r6, #16\n\t"
  42402. #endif
  42403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42404. "lsls r6, r6, #16\n\t"
  42405. #else
  42406. "lsl r6, r6, #16\n\t"
  42407. #endif
  42408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42409. "adds r3, r3, r6\n\t"
  42410. #else
  42411. "add r3, r3, r6\n\t"
  42412. #endif
  42413. #ifdef WOLFSSL_KEIL
  42414. "adcs r4, r4, r7\n\t"
  42415. #elif defined(__clang__)
  42416. "adcs r4, r7\n\t"
  42417. #else
  42418. "adc r4, r7\n\t"
  42419. #endif
  42420. #ifdef WOLFSSL_KEIL
  42421. "adcs r5, r5, %[r]\n\t"
  42422. #elif defined(__clang__)
  42423. "adcs r5, %[r]\n\t"
  42424. #else
  42425. "adc r5, %[r]\n\t"
  42426. #endif
  42427. "mov %[r], r8\n\t"
  42428. "str r3, [%[r], #48]\n\t"
  42429. "movs %[r], #0\n\t"
  42430. "# A[2] * B[11]\n\t"
  42431. "movs r3, #0\n\t"
  42432. "mov %[a], r9\n\t"
  42433. "mov %[b], r10\n\t"
  42434. "ldr %[a], [%[a], #8]\n\t"
  42435. "ldr %[b], [%[b], #44]\n\t"
  42436. "uxth r6, %[a]\n\t"
  42437. "uxth r7, %[b]\n\t"
  42438. #ifdef WOLFSSL_KEIL
  42439. "muls r7, r6, r7\n\t"
  42440. #elif defined(__clang__)
  42441. "muls r7, r6\n\t"
  42442. #else
  42443. "mul r7, r6\n\t"
  42444. #endif
  42445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42446. "adds r4, r4, r7\n\t"
  42447. #else
  42448. "add r4, r4, r7\n\t"
  42449. #endif
  42450. #ifdef WOLFSSL_KEIL
  42451. "adcs r5, r5, %[r]\n\t"
  42452. #elif defined(__clang__)
  42453. "adcs r5, %[r]\n\t"
  42454. #else
  42455. "adc r5, %[r]\n\t"
  42456. #endif
  42457. #ifdef WOLFSSL_KEIL
  42458. "adcs r3, r3, %[r]\n\t"
  42459. #elif defined(__clang__)
  42460. "adcs r3, %[r]\n\t"
  42461. #else
  42462. "adc r3, %[r]\n\t"
  42463. #endif
  42464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42465. "lsrs r7, %[b], #16\n\t"
  42466. #else
  42467. "lsr r7, %[b], #16\n\t"
  42468. #endif
  42469. #ifdef WOLFSSL_KEIL
  42470. "muls r6, r7, r6\n\t"
  42471. #elif defined(__clang__)
  42472. "muls r6, r7\n\t"
  42473. #else
  42474. "mul r6, r7\n\t"
  42475. #endif
  42476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42477. "lsrs r7, r6, #16\n\t"
  42478. #else
  42479. "lsr r7, r6, #16\n\t"
  42480. #endif
  42481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42482. "lsls r6, r6, #16\n\t"
  42483. #else
  42484. "lsl r6, r6, #16\n\t"
  42485. #endif
  42486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42487. "adds r4, r4, r6\n\t"
  42488. #else
  42489. "add r4, r4, r6\n\t"
  42490. #endif
  42491. #ifdef WOLFSSL_KEIL
  42492. "adcs r5, r5, r7\n\t"
  42493. #elif defined(__clang__)
  42494. "adcs r5, r7\n\t"
  42495. #else
  42496. "adc r5, r7\n\t"
  42497. #endif
  42498. #ifdef WOLFSSL_KEIL
  42499. "adcs r3, r3, %[r]\n\t"
  42500. #elif defined(__clang__)
  42501. "adcs r3, %[r]\n\t"
  42502. #else
  42503. "adc r3, %[r]\n\t"
  42504. #endif
  42505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42506. "lsrs r6, %[a], #16\n\t"
  42507. #else
  42508. "lsr r6, %[a], #16\n\t"
  42509. #endif
  42510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42511. "lsrs r7, %[b], #16\n\t"
  42512. #else
  42513. "lsr r7, %[b], #16\n\t"
  42514. #endif
  42515. #ifdef WOLFSSL_KEIL
  42516. "muls r7, r6, r7\n\t"
  42517. #elif defined(__clang__)
  42518. "muls r7, r6\n\t"
  42519. #else
  42520. "mul r7, r6\n\t"
  42521. #endif
  42522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42523. "adds r5, r5, r7\n\t"
  42524. #else
  42525. "add r5, r5, r7\n\t"
  42526. #endif
  42527. #ifdef WOLFSSL_KEIL
  42528. "adcs r3, r3, %[r]\n\t"
  42529. #elif defined(__clang__)
  42530. "adcs r3, %[r]\n\t"
  42531. #else
  42532. "adc r3, %[r]\n\t"
  42533. #endif
  42534. "uxth r7, %[b]\n\t"
  42535. #ifdef WOLFSSL_KEIL
  42536. "muls r6, r7, r6\n\t"
  42537. #elif defined(__clang__)
  42538. "muls r6, r7\n\t"
  42539. #else
  42540. "mul r6, r7\n\t"
  42541. #endif
  42542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42543. "lsrs r7, r6, #16\n\t"
  42544. #else
  42545. "lsr r7, r6, #16\n\t"
  42546. #endif
  42547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42548. "lsls r6, r6, #16\n\t"
  42549. #else
  42550. "lsl r6, r6, #16\n\t"
  42551. #endif
  42552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42553. "adds r4, r4, r6\n\t"
  42554. #else
  42555. "add r4, r4, r6\n\t"
  42556. #endif
  42557. #ifdef WOLFSSL_KEIL
  42558. "adcs r5, r5, r7\n\t"
  42559. #elif defined(__clang__)
  42560. "adcs r5, r7\n\t"
  42561. #else
  42562. "adc r5, r7\n\t"
  42563. #endif
  42564. #ifdef WOLFSSL_KEIL
  42565. "adcs r3, r3, %[r]\n\t"
  42566. #elif defined(__clang__)
  42567. "adcs r3, %[r]\n\t"
  42568. #else
  42569. "adc r3, %[r]\n\t"
  42570. #endif
  42571. "# A[3] * B[10]\n\t"
  42572. "mov %[a], r9\n\t"
  42573. "mov %[b], r10\n\t"
  42574. "ldr %[a], [%[a], #12]\n\t"
  42575. "ldr %[b], [%[b], #40]\n\t"
  42576. "uxth r6, %[a]\n\t"
  42577. "uxth r7, %[b]\n\t"
  42578. #ifdef WOLFSSL_KEIL
  42579. "muls r7, r6, r7\n\t"
  42580. #elif defined(__clang__)
  42581. "muls r7, r6\n\t"
  42582. #else
  42583. "mul r7, r6\n\t"
  42584. #endif
  42585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42586. "adds r4, r4, r7\n\t"
  42587. #else
  42588. "add r4, r4, r7\n\t"
  42589. #endif
  42590. #ifdef WOLFSSL_KEIL
  42591. "adcs r5, r5, %[r]\n\t"
  42592. #elif defined(__clang__)
  42593. "adcs r5, %[r]\n\t"
  42594. #else
  42595. "adc r5, %[r]\n\t"
  42596. #endif
  42597. #ifdef WOLFSSL_KEIL
  42598. "adcs r3, r3, %[r]\n\t"
  42599. #elif defined(__clang__)
  42600. "adcs r3, %[r]\n\t"
  42601. #else
  42602. "adc r3, %[r]\n\t"
  42603. #endif
  42604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42605. "lsrs r7, %[b], #16\n\t"
  42606. #else
  42607. "lsr r7, %[b], #16\n\t"
  42608. #endif
  42609. #ifdef WOLFSSL_KEIL
  42610. "muls r6, r7, r6\n\t"
  42611. #elif defined(__clang__)
  42612. "muls r6, r7\n\t"
  42613. #else
  42614. "mul r6, r7\n\t"
  42615. #endif
  42616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42617. "lsrs r7, r6, #16\n\t"
  42618. #else
  42619. "lsr r7, r6, #16\n\t"
  42620. #endif
  42621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42622. "lsls r6, r6, #16\n\t"
  42623. #else
  42624. "lsl r6, r6, #16\n\t"
  42625. #endif
  42626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42627. "adds r4, r4, r6\n\t"
  42628. #else
  42629. "add r4, r4, r6\n\t"
  42630. #endif
  42631. #ifdef WOLFSSL_KEIL
  42632. "adcs r5, r5, r7\n\t"
  42633. #elif defined(__clang__)
  42634. "adcs r5, r7\n\t"
  42635. #else
  42636. "adc r5, r7\n\t"
  42637. #endif
  42638. #ifdef WOLFSSL_KEIL
  42639. "adcs r3, r3, %[r]\n\t"
  42640. #elif defined(__clang__)
  42641. "adcs r3, %[r]\n\t"
  42642. #else
  42643. "adc r3, %[r]\n\t"
  42644. #endif
  42645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42646. "lsrs r6, %[a], #16\n\t"
  42647. #else
  42648. "lsr r6, %[a], #16\n\t"
  42649. #endif
  42650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42651. "lsrs r7, %[b], #16\n\t"
  42652. #else
  42653. "lsr r7, %[b], #16\n\t"
  42654. #endif
  42655. #ifdef WOLFSSL_KEIL
  42656. "muls r7, r6, r7\n\t"
  42657. #elif defined(__clang__)
  42658. "muls r7, r6\n\t"
  42659. #else
  42660. "mul r7, r6\n\t"
  42661. #endif
  42662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42663. "adds r5, r5, r7\n\t"
  42664. #else
  42665. "add r5, r5, r7\n\t"
  42666. #endif
  42667. #ifdef WOLFSSL_KEIL
  42668. "adcs r3, r3, %[r]\n\t"
  42669. #elif defined(__clang__)
  42670. "adcs r3, %[r]\n\t"
  42671. #else
  42672. "adc r3, %[r]\n\t"
  42673. #endif
  42674. "uxth r7, %[b]\n\t"
  42675. #ifdef WOLFSSL_KEIL
  42676. "muls r6, r7, r6\n\t"
  42677. #elif defined(__clang__)
  42678. "muls r6, r7\n\t"
  42679. #else
  42680. "mul r6, r7\n\t"
  42681. #endif
  42682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42683. "lsrs r7, r6, #16\n\t"
  42684. #else
  42685. "lsr r7, r6, #16\n\t"
  42686. #endif
  42687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42688. "lsls r6, r6, #16\n\t"
  42689. #else
  42690. "lsl r6, r6, #16\n\t"
  42691. #endif
  42692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42693. "adds r4, r4, r6\n\t"
  42694. #else
  42695. "add r4, r4, r6\n\t"
  42696. #endif
  42697. #ifdef WOLFSSL_KEIL
  42698. "adcs r5, r5, r7\n\t"
  42699. #elif defined(__clang__)
  42700. "adcs r5, r7\n\t"
  42701. #else
  42702. "adc r5, r7\n\t"
  42703. #endif
  42704. #ifdef WOLFSSL_KEIL
  42705. "adcs r3, r3, %[r]\n\t"
  42706. #elif defined(__clang__)
  42707. "adcs r3, %[r]\n\t"
  42708. #else
  42709. "adc r3, %[r]\n\t"
  42710. #endif
  42711. "# A[4] * B[9]\n\t"
  42712. "mov %[a], r9\n\t"
  42713. "mov %[b], r10\n\t"
  42714. "ldr %[a], [%[a], #16]\n\t"
  42715. "ldr %[b], [%[b], #36]\n\t"
  42716. "uxth r6, %[a]\n\t"
  42717. "uxth r7, %[b]\n\t"
  42718. #ifdef WOLFSSL_KEIL
  42719. "muls r7, r6, r7\n\t"
  42720. #elif defined(__clang__)
  42721. "muls r7, r6\n\t"
  42722. #else
  42723. "mul r7, r6\n\t"
  42724. #endif
  42725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42726. "adds r4, r4, r7\n\t"
  42727. #else
  42728. "add r4, r4, r7\n\t"
  42729. #endif
  42730. #ifdef WOLFSSL_KEIL
  42731. "adcs r5, r5, %[r]\n\t"
  42732. #elif defined(__clang__)
  42733. "adcs r5, %[r]\n\t"
  42734. #else
  42735. "adc r5, %[r]\n\t"
  42736. #endif
  42737. #ifdef WOLFSSL_KEIL
  42738. "adcs r3, r3, %[r]\n\t"
  42739. #elif defined(__clang__)
  42740. "adcs r3, %[r]\n\t"
  42741. #else
  42742. "adc r3, %[r]\n\t"
  42743. #endif
  42744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42745. "lsrs r7, %[b], #16\n\t"
  42746. #else
  42747. "lsr r7, %[b], #16\n\t"
  42748. #endif
  42749. #ifdef WOLFSSL_KEIL
  42750. "muls r6, r7, r6\n\t"
  42751. #elif defined(__clang__)
  42752. "muls r6, r7\n\t"
  42753. #else
  42754. "mul r6, r7\n\t"
  42755. #endif
  42756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42757. "lsrs r7, r6, #16\n\t"
  42758. #else
  42759. "lsr r7, r6, #16\n\t"
  42760. #endif
  42761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42762. "lsls r6, r6, #16\n\t"
  42763. #else
  42764. "lsl r6, r6, #16\n\t"
  42765. #endif
  42766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42767. "adds r4, r4, r6\n\t"
  42768. #else
  42769. "add r4, r4, r6\n\t"
  42770. #endif
  42771. #ifdef WOLFSSL_KEIL
  42772. "adcs r5, r5, r7\n\t"
  42773. #elif defined(__clang__)
  42774. "adcs r5, r7\n\t"
  42775. #else
  42776. "adc r5, r7\n\t"
  42777. #endif
  42778. #ifdef WOLFSSL_KEIL
  42779. "adcs r3, r3, %[r]\n\t"
  42780. #elif defined(__clang__)
  42781. "adcs r3, %[r]\n\t"
  42782. #else
  42783. "adc r3, %[r]\n\t"
  42784. #endif
  42785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42786. "lsrs r6, %[a], #16\n\t"
  42787. #else
  42788. "lsr r6, %[a], #16\n\t"
  42789. #endif
  42790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42791. "lsrs r7, %[b], #16\n\t"
  42792. #else
  42793. "lsr r7, %[b], #16\n\t"
  42794. #endif
  42795. #ifdef WOLFSSL_KEIL
  42796. "muls r7, r6, r7\n\t"
  42797. #elif defined(__clang__)
  42798. "muls r7, r6\n\t"
  42799. #else
  42800. "mul r7, r6\n\t"
  42801. #endif
  42802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42803. "adds r5, r5, r7\n\t"
  42804. #else
  42805. "add r5, r5, r7\n\t"
  42806. #endif
  42807. #ifdef WOLFSSL_KEIL
  42808. "adcs r3, r3, %[r]\n\t"
  42809. #elif defined(__clang__)
  42810. "adcs r3, %[r]\n\t"
  42811. #else
  42812. "adc r3, %[r]\n\t"
  42813. #endif
  42814. "uxth r7, %[b]\n\t"
  42815. #ifdef WOLFSSL_KEIL
  42816. "muls r6, r7, r6\n\t"
  42817. #elif defined(__clang__)
  42818. "muls r6, r7\n\t"
  42819. #else
  42820. "mul r6, r7\n\t"
  42821. #endif
  42822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42823. "lsrs r7, r6, #16\n\t"
  42824. #else
  42825. "lsr r7, r6, #16\n\t"
  42826. #endif
  42827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42828. "lsls r6, r6, #16\n\t"
  42829. #else
  42830. "lsl r6, r6, #16\n\t"
  42831. #endif
  42832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42833. "adds r4, r4, r6\n\t"
  42834. #else
  42835. "add r4, r4, r6\n\t"
  42836. #endif
  42837. #ifdef WOLFSSL_KEIL
  42838. "adcs r5, r5, r7\n\t"
  42839. #elif defined(__clang__)
  42840. "adcs r5, r7\n\t"
  42841. #else
  42842. "adc r5, r7\n\t"
  42843. #endif
  42844. #ifdef WOLFSSL_KEIL
  42845. "adcs r3, r3, %[r]\n\t"
  42846. #elif defined(__clang__)
  42847. "adcs r3, %[r]\n\t"
  42848. #else
  42849. "adc r3, %[r]\n\t"
  42850. #endif
  42851. "# A[5] * B[8]\n\t"
  42852. "mov %[a], r9\n\t"
  42853. "mov %[b], r10\n\t"
  42854. "ldr %[a], [%[a], #20]\n\t"
  42855. "ldr %[b], [%[b], #32]\n\t"
  42856. "uxth r6, %[a]\n\t"
  42857. "uxth r7, %[b]\n\t"
  42858. #ifdef WOLFSSL_KEIL
  42859. "muls r7, r6, r7\n\t"
  42860. #elif defined(__clang__)
  42861. "muls r7, r6\n\t"
  42862. #else
  42863. "mul r7, r6\n\t"
  42864. #endif
  42865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42866. "adds r4, r4, r7\n\t"
  42867. #else
  42868. "add r4, r4, r7\n\t"
  42869. #endif
  42870. #ifdef WOLFSSL_KEIL
  42871. "adcs r5, r5, %[r]\n\t"
  42872. #elif defined(__clang__)
  42873. "adcs r5, %[r]\n\t"
  42874. #else
  42875. "adc r5, %[r]\n\t"
  42876. #endif
  42877. #ifdef WOLFSSL_KEIL
  42878. "adcs r3, r3, %[r]\n\t"
  42879. #elif defined(__clang__)
  42880. "adcs r3, %[r]\n\t"
  42881. #else
  42882. "adc r3, %[r]\n\t"
  42883. #endif
  42884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42885. "lsrs r7, %[b], #16\n\t"
  42886. #else
  42887. "lsr r7, %[b], #16\n\t"
  42888. #endif
  42889. #ifdef WOLFSSL_KEIL
  42890. "muls r6, r7, r6\n\t"
  42891. #elif defined(__clang__)
  42892. "muls r6, r7\n\t"
  42893. #else
  42894. "mul r6, r7\n\t"
  42895. #endif
  42896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42897. "lsrs r7, r6, #16\n\t"
  42898. #else
  42899. "lsr r7, r6, #16\n\t"
  42900. #endif
  42901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42902. "lsls r6, r6, #16\n\t"
  42903. #else
  42904. "lsl r6, r6, #16\n\t"
  42905. #endif
  42906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42907. "adds r4, r4, r6\n\t"
  42908. #else
  42909. "add r4, r4, r6\n\t"
  42910. #endif
  42911. #ifdef WOLFSSL_KEIL
  42912. "adcs r5, r5, r7\n\t"
  42913. #elif defined(__clang__)
  42914. "adcs r5, r7\n\t"
  42915. #else
  42916. "adc r5, r7\n\t"
  42917. #endif
  42918. #ifdef WOLFSSL_KEIL
  42919. "adcs r3, r3, %[r]\n\t"
  42920. #elif defined(__clang__)
  42921. "adcs r3, %[r]\n\t"
  42922. #else
  42923. "adc r3, %[r]\n\t"
  42924. #endif
  42925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42926. "lsrs r6, %[a], #16\n\t"
  42927. #else
  42928. "lsr r6, %[a], #16\n\t"
  42929. #endif
  42930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42931. "lsrs r7, %[b], #16\n\t"
  42932. #else
  42933. "lsr r7, %[b], #16\n\t"
  42934. #endif
  42935. #ifdef WOLFSSL_KEIL
  42936. "muls r7, r6, r7\n\t"
  42937. #elif defined(__clang__)
  42938. "muls r7, r6\n\t"
  42939. #else
  42940. "mul r7, r6\n\t"
  42941. #endif
  42942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42943. "adds r5, r5, r7\n\t"
  42944. #else
  42945. "add r5, r5, r7\n\t"
  42946. #endif
  42947. #ifdef WOLFSSL_KEIL
  42948. "adcs r3, r3, %[r]\n\t"
  42949. #elif defined(__clang__)
  42950. "adcs r3, %[r]\n\t"
  42951. #else
  42952. "adc r3, %[r]\n\t"
  42953. #endif
  42954. "uxth r7, %[b]\n\t"
  42955. #ifdef WOLFSSL_KEIL
  42956. "muls r6, r7, r6\n\t"
  42957. #elif defined(__clang__)
  42958. "muls r6, r7\n\t"
  42959. #else
  42960. "mul r6, r7\n\t"
  42961. #endif
  42962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42963. "lsrs r7, r6, #16\n\t"
  42964. #else
  42965. "lsr r7, r6, #16\n\t"
  42966. #endif
  42967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42968. "lsls r6, r6, #16\n\t"
  42969. #else
  42970. "lsl r6, r6, #16\n\t"
  42971. #endif
  42972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42973. "adds r4, r4, r6\n\t"
  42974. #else
  42975. "add r4, r4, r6\n\t"
  42976. #endif
  42977. #ifdef WOLFSSL_KEIL
  42978. "adcs r5, r5, r7\n\t"
  42979. #elif defined(__clang__)
  42980. "adcs r5, r7\n\t"
  42981. #else
  42982. "adc r5, r7\n\t"
  42983. #endif
  42984. #ifdef WOLFSSL_KEIL
  42985. "adcs r3, r3, %[r]\n\t"
  42986. #elif defined(__clang__)
  42987. "adcs r3, %[r]\n\t"
  42988. #else
  42989. "adc r3, %[r]\n\t"
  42990. #endif
  42991. "# A[6] * B[7]\n\t"
  42992. "mov %[a], r9\n\t"
  42993. "mov %[b], r10\n\t"
  42994. "ldr %[a], [%[a], #24]\n\t"
  42995. "ldr %[b], [%[b], #28]\n\t"
  42996. "uxth r6, %[a]\n\t"
  42997. "uxth r7, %[b]\n\t"
  42998. #ifdef WOLFSSL_KEIL
  42999. "muls r7, r6, r7\n\t"
  43000. #elif defined(__clang__)
  43001. "muls r7, r6\n\t"
  43002. #else
  43003. "mul r7, r6\n\t"
  43004. #endif
  43005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43006. "adds r4, r4, r7\n\t"
  43007. #else
  43008. "add r4, r4, r7\n\t"
  43009. #endif
  43010. #ifdef WOLFSSL_KEIL
  43011. "adcs r5, r5, %[r]\n\t"
  43012. #elif defined(__clang__)
  43013. "adcs r5, %[r]\n\t"
  43014. #else
  43015. "adc r5, %[r]\n\t"
  43016. #endif
  43017. #ifdef WOLFSSL_KEIL
  43018. "adcs r3, r3, %[r]\n\t"
  43019. #elif defined(__clang__)
  43020. "adcs r3, %[r]\n\t"
  43021. #else
  43022. "adc r3, %[r]\n\t"
  43023. #endif
  43024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43025. "lsrs r7, %[b], #16\n\t"
  43026. #else
  43027. "lsr r7, %[b], #16\n\t"
  43028. #endif
  43029. #ifdef WOLFSSL_KEIL
  43030. "muls r6, r7, r6\n\t"
  43031. #elif defined(__clang__)
  43032. "muls r6, r7\n\t"
  43033. #else
  43034. "mul r6, r7\n\t"
  43035. #endif
  43036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43037. "lsrs r7, r6, #16\n\t"
  43038. #else
  43039. "lsr r7, r6, #16\n\t"
  43040. #endif
  43041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43042. "lsls r6, r6, #16\n\t"
  43043. #else
  43044. "lsl r6, r6, #16\n\t"
  43045. #endif
  43046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43047. "adds r4, r4, r6\n\t"
  43048. #else
  43049. "add r4, r4, r6\n\t"
  43050. #endif
  43051. #ifdef WOLFSSL_KEIL
  43052. "adcs r5, r5, r7\n\t"
  43053. #elif defined(__clang__)
  43054. "adcs r5, r7\n\t"
  43055. #else
  43056. "adc r5, r7\n\t"
  43057. #endif
  43058. #ifdef WOLFSSL_KEIL
  43059. "adcs r3, r3, %[r]\n\t"
  43060. #elif defined(__clang__)
  43061. "adcs r3, %[r]\n\t"
  43062. #else
  43063. "adc r3, %[r]\n\t"
  43064. #endif
  43065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43066. "lsrs r6, %[a], #16\n\t"
  43067. #else
  43068. "lsr r6, %[a], #16\n\t"
  43069. #endif
  43070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43071. "lsrs r7, %[b], #16\n\t"
  43072. #else
  43073. "lsr r7, %[b], #16\n\t"
  43074. #endif
  43075. #ifdef WOLFSSL_KEIL
  43076. "muls r7, r6, r7\n\t"
  43077. #elif defined(__clang__)
  43078. "muls r7, r6\n\t"
  43079. #else
  43080. "mul r7, r6\n\t"
  43081. #endif
  43082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43083. "adds r5, r5, r7\n\t"
  43084. #else
  43085. "add r5, r5, r7\n\t"
  43086. #endif
  43087. #ifdef WOLFSSL_KEIL
  43088. "adcs r3, r3, %[r]\n\t"
  43089. #elif defined(__clang__)
  43090. "adcs r3, %[r]\n\t"
  43091. #else
  43092. "adc r3, %[r]\n\t"
  43093. #endif
  43094. "uxth r7, %[b]\n\t"
  43095. #ifdef WOLFSSL_KEIL
  43096. "muls r6, r7, r6\n\t"
  43097. #elif defined(__clang__)
  43098. "muls r6, r7\n\t"
  43099. #else
  43100. "mul r6, r7\n\t"
  43101. #endif
  43102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43103. "lsrs r7, r6, #16\n\t"
  43104. #else
  43105. "lsr r7, r6, #16\n\t"
  43106. #endif
  43107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43108. "lsls r6, r6, #16\n\t"
  43109. #else
  43110. "lsl r6, r6, #16\n\t"
  43111. #endif
  43112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43113. "adds r4, r4, r6\n\t"
  43114. #else
  43115. "add r4, r4, r6\n\t"
  43116. #endif
  43117. #ifdef WOLFSSL_KEIL
  43118. "adcs r5, r5, r7\n\t"
  43119. #elif defined(__clang__)
  43120. "adcs r5, r7\n\t"
  43121. #else
  43122. "adc r5, r7\n\t"
  43123. #endif
  43124. #ifdef WOLFSSL_KEIL
  43125. "adcs r3, r3, %[r]\n\t"
  43126. #elif defined(__clang__)
  43127. "adcs r3, %[r]\n\t"
  43128. #else
  43129. "adc r3, %[r]\n\t"
  43130. #endif
  43131. "# A[7] * B[6]\n\t"
  43132. "mov %[a], r9\n\t"
  43133. "mov %[b], r10\n\t"
  43134. "ldr %[a], [%[a], #28]\n\t"
  43135. "ldr %[b], [%[b], #24]\n\t"
  43136. "uxth r6, %[a]\n\t"
  43137. "uxth r7, %[b]\n\t"
  43138. #ifdef WOLFSSL_KEIL
  43139. "muls r7, r6, r7\n\t"
  43140. #elif defined(__clang__)
  43141. "muls r7, r6\n\t"
  43142. #else
  43143. "mul r7, r6\n\t"
  43144. #endif
  43145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43146. "adds r4, r4, r7\n\t"
  43147. #else
  43148. "add r4, r4, r7\n\t"
  43149. #endif
  43150. #ifdef WOLFSSL_KEIL
  43151. "adcs r5, r5, %[r]\n\t"
  43152. #elif defined(__clang__)
  43153. "adcs r5, %[r]\n\t"
  43154. #else
  43155. "adc r5, %[r]\n\t"
  43156. #endif
  43157. #ifdef WOLFSSL_KEIL
  43158. "adcs r3, r3, %[r]\n\t"
  43159. #elif defined(__clang__)
  43160. "adcs r3, %[r]\n\t"
  43161. #else
  43162. "adc r3, %[r]\n\t"
  43163. #endif
  43164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43165. "lsrs r7, %[b], #16\n\t"
  43166. #else
  43167. "lsr r7, %[b], #16\n\t"
  43168. #endif
  43169. #ifdef WOLFSSL_KEIL
  43170. "muls r6, r7, r6\n\t"
  43171. #elif defined(__clang__)
  43172. "muls r6, r7\n\t"
  43173. #else
  43174. "mul r6, r7\n\t"
  43175. #endif
  43176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43177. "lsrs r7, r6, #16\n\t"
  43178. #else
  43179. "lsr r7, r6, #16\n\t"
  43180. #endif
  43181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43182. "lsls r6, r6, #16\n\t"
  43183. #else
  43184. "lsl r6, r6, #16\n\t"
  43185. #endif
  43186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43187. "adds r4, r4, r6\n\t"
  43188. #else
  43189. "add r4, r4, r6\n\t"
  43190. #endif
  43191. #ifdef WOLFSSL_KEIL
  43192. "adcs r5, r5, r7\n\t"
  43193. #elif defined(__clang__)
  43194. "adcs r5, r7\n\t"
  43195. #else
  43196. "adc r5, r7\n\t"
  43197. #endif
  43198. #ifdef WOLFSSL_KEIL
  43199. "adcs r3, r3, %[r]\n\t"
  43200. #elif defined(__clang__)
  43201. "adcs r3, %[r]\n\t"
  43202. #else
  43203. "adc r3, %[r]\n\t"
  43204. #endif
  43205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43206. "lsrs r6, %[a], #16\n\t"
  43207. #else
  43208. "lsr r6, %[a], #16\n\t"
  43209. #endif
  43210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43211. "lsrs r7, %[b], #16\n\t"
  43212. #else
  43213. "lsr r7, %[b], #16\n\t"
  43214. #endif
  43215. #ifdef WOLFSSL_KEIL
  43216. "muls r7, r6, r7\n\t"
  43217. #elif defined(__clang__)
  43218. "muls r7, r6\n\t"
  43219. #else
  43220. "mul r7, r6\n\t"
  43221. #endif
  43222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43223. "adds r5, r5, r7\n\t"
  43224. #else
  43225. "add r5, r5, r7\n\t"
  43226. #endif
  43227. #ifdef WOLFSSL_KEIL
  43228. "adcs r3, r3, %[r]\n\t"
  43229. #elif defined(__clang__)
  43230. "adcs r3, %[r]\n\t"
  43231. #else
  43232. "adc r3, %[r]\n\t"
  43233. #endif
  43234. "uxth r7, %[b]\n\t"
  43235. #ifdef WOLFSSL_KEIL
  43236. "muls r6, r7, r6\n\t"
  43237. #elif defined(__clang__)
  43238. "muls r6, r7\n\t"
  43239. #else
  43240. "mul r6, r7\n\t"
  43241. #endif
  43242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43243. "lsrs r7, r6, #16\n\t"
  43244. #else
  43245. "lsr r7, r6, #16\n\t"
  43246. #endif
  43247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43248. "lsls r6, r6, #16\n\t"
  43249. #else
  43250. "lsl r6, r6, #16\n\t"
  43251. #endif
  43252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43253. "adds r4, r4, r6\n\t"
  43254. #else
  43255. "add r4, r4, r6\n\t"
  43256. #endif
  43257. #ifdef WOLFSSL_KEIL
  43258. "adcs r5, r5, r7\n\t"
  43259. #elif defined(__clang__)
  43260. "adcs r5, r7\n\t"
  43261. #else
  43262. "adc r5, r7\n\t"
  43263. #endif
  43264. #ifdef WOLFSSL_KEIL
  43265. "adcs r3, r3, %[r]\n\t"
  43266. #elif defined(__clang__)
  43267. "adcs r3, %[r]\n\t"
  43268. #else
  43269. "adc r3, %[r]\n\t"
  43270. #endif
  43271. "# A[8] * B[5]\n\t"
  43272. "mov %[a], r9\n\t"
  43273. "mov %[b], r10\n\t"
  43274. "ldr %[a], [%[a], #32]\n\t"
  43275. "ldr %[b], [%[b], #20]\n\t"
  43276. "uxth r6, %[a]\n\t"
  43277. "uxth r7, %[b]\n\t"
  43278. #ifdef WOLFSSL_KEIL
  43279. "muls r7, r6, r7\n\t"
  43280. #elif defined(__clang__)
  43281. "muls r7, r6\n\t"
  43282. #else
  43283. "mul r7, r6\n\t"
  43284. #endif
  43285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43286. "adds r4, r4, r7\n\t"
  43287. #else
  43288. "add r4, r4, r7\n\t"
  43289. #endif
  43290. #ifdef WOLFSSL_KEIL
  43291. "adcs r5, r5, %[r]\n\t"
  43292. #elif defined(__clang__)
  43293. "adcs r5, %[r]\n\t"
  43294. #else
  43295. "adc r5, %[r]\n\t"
  43296. #endif
  43297. #ifdef WOLFSSL_KEIL
  43298. "adcs r3, r3, %[r]\n\t"
  43299. #elif defined(__clang__)
  43300. "adcs r3, %[r]\n\t"
  43301. #else
  43302. "adc r3, %[r]\n\t"
  43303. #endif
  43304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43305. "lsrs r7, %[b], #16\n\t"
  43306. #else
  43307. "lsr r7, %[b], #16\n\t"
  43308. #endif
  43309. #ifdef WOLFSSL_KEIL
  43310. "muls r6, r7, r6\n\t"
  43311. #elif defined(__clang__)
  43312. "muls r6, r7\n\t"
  43313. #else
  43314. "mul r6, r7\n\t"
  43315. #endif
  43316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43317. "lsrs r7, r6, #16\n\t"
  43318. #else
  43319. "lsr r7, r6, #16\n\t"
  43320. #endif
  43321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43322. "lsls r6, r6, #16\n\t"
  43323. #else
  43324. "lsl r6, r6, #16\n\t"
  43325. #endif
  43326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43327. "adds r4, r4, r6\n\t"
  43328. #else
  43329. "add r4, r4, r6\n\t"
  43330. #endif
  43331. #ifdef WOLFSSL_KEIL
  43332. "adcs r5, r5, r7\n\t"
  43333. #elif defined(__clang__)
  43334. "adcs r5, r7\n\t"
  43335. #else
  43336. "adc r5, r7\n\t"
  43337. #endif
  43338. #ifdef WOLFSSL_KEIL
  43339. "adcs r3, r3, %[r]\n\t"
  43340. #elif defined(__clang__)
  43341. "adcs r3, %[r]\n\t"
  43342. #else
  43343. "adc r3, %[r]\n\t"
  43344. #endif
  43345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43346. "lsrs r6, %[a], #16\n\t"
  43347. #else
  43348. "lsr r6, %[a], #16\n\t"
  43349. #endif
  43350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43351. "lsrs r7, %[b], #16\n\t"
  43352. #else
  43353. "lsr r7, %[b], #16\n\t"
  43354. #endif
  43355. #ifdef WOLFSSL_KEIL
  43356. "muls r7, r6, r7\n\t"
  43357. #elif defined(__clang__)
  43358. "muls r7, r6\n\t"
  43359. #else
  43360. "mul r7, r6\n\t"
  43361. #endif
  43362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43363. "adds r5, r5, r7\n\t"
  43364. #else
  43365. "add r5, r5, r7\n\t"
  43366. #endif
  43367. #ifdef WOLFSSL_KEIL
  43368. "adcs r3, r3, %[r]\n\t"
  43369. #elif defined(__clang__)
  43370. "adcs r3, %[r]\n\t"
  43371. #else
  43372. "adc r3, %[r]\n\t"
  43373. #endif
  43374. "uxth r7, %[b]\n\t"
  43375. #ifdef WOLFSSL_KEIL
  43376. "muls r6, r7, r6\n\t"
  43377. #elif defined(__clang__)
  43378. "muls r6, r7\n\t"
  43379. #else
  43380. "mul r6, r7\n\t"
  43381. #endif
  43382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43383. "lsrs r7, r6, #16\n\t"
  43384. #else
  43385. "lsr r7, r6, #16\n\t"
  43386. #endif
  43387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43388. "lsls r6, r6, #16\n\t"
  43389. #else
  43390. "lsl r6, r6, #16\n\t"
  43391. #endif
  43392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43393. "adds r4, r4, r6\n\t"
  43394. #else
  43395. "add r4, r4, r6\n\t"
  43396. #endif
  43397. #ifdef WOLFSSL_KEIL
  43398. "adcs r5, r5, r7\n\t"
  43399. #elif defined(__clang__)
  43400. "adcs r5, r7\n\t"
  43401. #else
  43402. "adc r5, r7\n\t"
  43403. #endif
  43404. #ifdef WOLFSSL_KEIL
  43405. "adcs r3, r3, %[r]\n\t"
  43406. #elif defined(__clang__)
  43407. "adcs r3, %[r]\n\t"
  43408. #else
  43409. "adc r3, %[r]\n\t"
  43410. #endif
  43411. "# A[9] * B[4]\n\t"
  43412. "mov %[a], r9\n\t"
  43413. "mov %[b], r10\n\t"
  43414. "ldr %[a], [%[a], #36]\n\t"
  43415. "ldr %[b], [%[b], #16]\n\t"
  43416. "uxth r6, %[a]\n\t"
  43417. "uxth r7, %[b]\n\t"
  43418. #ifdef WOLFSSL_KEIL
  43419. "muls r7, r6, r7\n\t"
  43420. #elif defined(__clang__)
  43421. "muls r7, r6\n\t"
  43422. #else
  43423. "mul r7, r6\n\t"
  43424. #endif
  43425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43426. "adds r4, r4, r7\n\t"
  43427. #else
  43428. "add r4, r4, r7\n\t"
  43429. #endif
  43430. #ifdef WOLFSSL_KEIL
  43431. "adcs r5, r5, %[r]\n\t"
  43432. #elif defined(__clang__)
  43433. "adcs r5, %[r]\n\t"
  43434. #else
  43435. "adc r5, %[r]\n\t"
  43436. #endif
  43437. #ifdef WOLFSSL_KEIL
  43438. "adcs r3, r3, %[r]\n\t"
  43439. #elif defined(__clang__)
  43440. "adcs r3, %[r]\n\t"
  43441. #else
  43442. "adc r3, %[r]\n\t"
  43443. #endif
  43444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43445. "lsrs r7, %[b], #16\n\t"
  43446. #else
  43447. "lsr r7, %[b], #16\n\t"
  43448. #endif
  43449. #ifdef WOLFSSL_KEIL
  43450. "muls r6, r7, r6\n\t"
  43451. #elif defined(__clang__)
  43452. "muls r6, r7\n\t"
  43453. #else
  43454. "mul r6, r7\n\t"
  43455. #endif
  43456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43457. "lsrs r7, r6, #16\n\t"
  43458. #else
  43459. "lsr r7, r6, #16\n\t"
  43460. #endif
  43461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43462. "lsls r6, r6, #16\n\t"
  43463. #else
  43464. "lsl r6, r6, #16\n\t"
  43465. #endif
  43466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43467. "adds r4, r4, r6\n\t"
  43468. #else
  43469. "add r4, r4, r6\n\t"
  43470. #endif
  43471. #ifdef WOLFSSL_KEIL
  43472. "adcs r5, r5, r7\n\t"
  43473. #elif defined(__clang__)
  43474. "adcs r5, r7\n\t"
  43475. #else
  43476. "adc r5, r7\n\t"
  43477. #endif
  43478. #ifdef WOLFSSL_KEIL
  43479. "adcs r3, r3, %[r]\n\t"
  43480. #elif defined(__clang__)
  43481. "adcs r3, %[r]\n\t"
  43482. #else
  43483. "adc r3, %[r]\n\t"
  43484. #endif
  43485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43486. "lsrs r6, %[a], #16\n\t"
  43487. #else
  43488. "lsr r6, %[a], #16\n\t"
  43489. #endif
  43490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43491. "lsrs r7, %[b], #16\n\t"
  43492. #else
  43493. "lsr r7, %[b], #16\n\t"
  43494. #endif
  43495. #ifdef WOLFSSL_KEIL
  43496. "muls r7, r6, r7\n\t"
  43497. #elif defined(__clang__)
  43498. "muls r7, r6\n\t"
  43499. #else
  43500. "mul r7, r6\n\t"
  43501. #endif
  43502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43503. "adds r5, r5, r7\n\t"
  43504. #else
  43505. "add r5, r5, r7\n\t"
  43506. #endif
  43507. #ifdef WOLFSSL_KEIL
  43508. "adcs r3, r3, %[r]\n\t"
  43509. #elif defined(__clang__)
  43510. "adcs r3, %[r]\n\t"
  43511. #else
  43512. "adc r3, %[r]\n\t"
  43513. #endif
  43514. "uxth r7, %[b]\n\t"
  43515. #ifdef WOLFSSL_KEIL
  43516. "muls r6, r7, r6\n\t"
  43517. #elif defined(__clang__)
  43518. "muls r6, r7\n\t"
  43519. #else
  43520. "mul r6, r7\n\t"
  43521. #endif
  43522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43523. "lsrs r7, r6, #16\n\t"
  43524. #else
  43525. "lsr r7, r6, #16\n\t"
  43526. #endif
  43527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43528. "lsls r6, r6, #16\n\t"
  43529. #else
  43530. "lsl r6, r6, #16\n\t"
  43531. #endif
  43532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43533. "adds r4, r4, r6\n\t"
  43534. #else
  43535. "add r4, r4, r6\n\t"
  43536. #endif
  43537. #ifdef WOLFSSL_KEIL
  43538. "adcs r5, r5, r7\n\t"
  43539. #elif defined(__clang__)
  43540. "adcs r5, r7\n\t"
  43541. #else
  43542. "adc r5, r7\n\t"
  43543. #endif
  43544. #ifdef WOLFSSL_KEIL
  43545. "adcs r3, r3, %[r]\n\t"
  43546. #elif defined(__clang__)
  43547. "adcs r3, %[r]\n\t"
  43548. #else
  43549. "adc r3, %[r]\n\t"
  43550. #endif
  43551. "# A[10] * B[3]\n\t"
  43552. "mov %[a], r9\n\t"
  43553. "mov %[b], r10\n\t"
  43554. "ldr %[a], [%[a], #40]\n\t"
  43555. "ldr %[b], [%[b], #12]\n\t"
  43556. "uxth r6, %[a]\n\t"
  43557. "uxth r7, %[b]\n\t"
  43558. #ifdef WOLFSSL_KEIL
  43559. "muls r7, r6, r7\n\t"
  43560. #elif defined(__clang__)
  43561. "muls r7, r6\n\t"
  43562. #else
  43563. "mul r7, r6\n\t"
  43564. #endif
  43565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43566. "adds r4, r4, r7\n\t"
  43567. #else
  43568. "add r4, r4, r7\n\t"
  43569. #endif
  43570. #ifdef WOLFSSL_KEIL
  43571. "adcs r5, r5, %[r]\n\t"
  43572. #elif defined(__clang__)
  43573. "adcs r5, %[r]\n\t"
  43574. #else
  43575. "adc r5, %[r]\n\t"
  43576. #endif
  43577. #ifdef WOLFSSL_KEIL
  43578. "adcs r3, r3, %[r]\n\t"
  43579. #elif defined(__clang__)
  43580. "adcs r3, %[r]\n\t"
  43581. #else
  43582. "adc r3, %[r]\n\t"
  43583. #endif
  43584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43585. "lsrs r7, %[b], #16\n\t"
  43586. #else
  43587. "lsr r7, %[b], #16\n\t"
  43588. #endif
  43589. #ifdef WOLFSSL_KEIL
  43590. "muls r6, r7, r6\n\t"
  43591. #elif defined(__clang__)
  43592. "muls r6, r7\n\t"
  43593. #else
  43594. "mul r6, r7\n\t"
  43595. #endif
  43596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43597. "lsrs r7, r6, #16\n\t"
  43598. #else
  43599. "lsr r7, r6, #16\n\t"
  43600. #endif
  43601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43602. "lsls r6, r6, #16\n\t"
  43603. #else
  43604. "lsl r6, r6, #16\n\t"
  43605. #endif
  43606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43607. "adds r4, r4, r6\n\t"
  43608. #else
  43609. "add r4, r4, r6\n\t"
  43610. #endif
  43611. #ifdef WOLFSSL_KEIL
  43612. "adcs r5, r5, r7\n\t"
  43613. #elif defined(__clang__)
  43614. "adcs r5, r7\n\t"
  43615. #else
  43616. "adc r5, r7\n\t"
  43617. #endif
  43618. #ifdef WOLFSSL_KEIL
  43619. "adcs r3, r3, %[r]\n\t"
  43620. #elif defined(__clang__)
  43621. "adcs r3, %[r]\n\t"
  43622. #else
  43623. "adc r3, %[r]\n\t"
  43624. #endif
  43625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43626. "lsrs r6, %[a], #16\n\t"
  43627. #else
  43628. "lsr r6, %[a], #16\n\t"
  43629. #endif
  43630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43631. "lsrs r7, %[b], #16\n\t"
  43632. #else
  43633. "lsr r7, %[b], #16\n\t"
  43634. #endif
  43635. #ifdef WOLFSSL_KEIL
  43636. "muls r7, r6, r7\n\t"
  43637. #elif defined(__clang__)
  43638. "muls r7, r6\n\t"
  43639. #else
  43640. "mul r7, r6\n\t"
  43641. #endif
  43642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43643. "adds r5, r5, r7\n\t"
  43644. #else
  43645. "add r5, r5, r7\n\t"
  43646. #endif
  43647. #ifdef WOLFSSL_KEIL
  43648. "adcs r3, r3, %[r]\n\t"
  43649. #elif defined(__clang__)
  43650. "adcs r3, %[r]\n\t"
  43651. #else
  43652. "adc r3, %[r]\n\t"
  43653. #endif
  43654. "uxth r7, %[b]\n\t"
  43655. #ifdef WOLFSSL_KEIL
  43656. "muls r6, r7, r6\n\t"
  43657. #elif defined(__clang__)
  43658. "muls r6, r7\n\t"
  43659. #else
  43660. "mul r6, r7\n\t"
  43661. #endif
  43662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43663. "lsrs r7, r6, #16\n\t"
  43664. #else
  43665. "lsr r7, r6, #16\n\t"
  43666. #endif
  43667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43668. "lsls r6, r6, #16\n\t"
  43669. #else
  43670. "lsl r6, r6, #16\n\t"
  43671. #endif
  43672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43673. "adds r4, r4, r6\n\t"
  43674. #else
  43675. "add r4, r4, r6\n\t"
  43676. #endif
  43677. #ifdef WOLFSSL_KEIL
  43678. "adcs r5, r5, r7\n\t"
  43679. #elif defined(__clang__)
  43680. "adcs r5, r7\n\t"
  43681. #else
  43682. "adc r5, r7\n\t"
  43683. #endif
  43684. #ifdef WOLFSSL_KEIL
  43685. "adcs r3, r3, %[r]\n\t"
  43686. #elif defined(__clang__)
  43687. "adcs r3, %[r]\n\t"
  43688. #else
  43689. "adc r3, %[r]\n\t"
  43690. #endif
  43691. "# A[11] * B[2]\n\t"
  43692. "mov %[a], r9\n\t"
  43693. "mov %[b], r10\n\t"
  43694. "ldr %[a], [%[a], #44]\n\t"
  43695. "ldr %[b], [%[b], #8]\n\t"
  43696. "uxth r6, %[a]\n\t"
  43697. "uxth r7, %[b]\n\t"
  43698. #ifdef WOLFSSL_KEIL
  43699. "muls r7, r6, r7\n\t"
  43700. #elif defined(__clang__)
  43701. "muls r7, r6\n\t"
  43702. #else
  43703. "mul r7, r6\n\t"
  43704. #endif
  43705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43706. "adds r4, r4, r7\n\t"
  43707. #else
  43708. "add r4, r4, r7\n\t"
  43709. #endif
  43710. #ifdef WOLFSSL_KEIL
  43711. "adcs r5, r5, %[r]\n\t"
  43712. #elif defined(__clang__)
  43713. "adcs r5, %[r]\n\t"
  43714. #else
  43715. "adc r5, %[r]\n\t"
  43716. #endif
  43717. #ifdef WOLFSSL_KEIL
  43718. "adcs r3, r3, %[r]\n\t"
  43719. #elif defined(__clang__)
  43720. "adcs r3, %[r]\n\t"
  43721. #else
  43722. "adc r3, %[r]\n\t"
  43723. #endif
  43724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43725. "lsrs r7, %[b], #16\n\t"
  43726. #else
  43727. "lsr r7, %[b], #16\n\t"
  43728. #endif
  43729. #ifdef WOLFSSL_KEIL
  43730. "muls r6, r7, r6\n\t"
  43731. #elif defined(__clang__)
  43732. "muls r6, r7\n\t"
  43733. #else
  43734. "mul r6, r7\n\t"
  43735. #endif
  43736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43737. "lsrs r7, r6, #16\n\t"
  43738. #else
  43739. "lsr r7, r6, #16\n\t"
  43740. #endif
  43741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43742. "lsls r6, r6, #16\n\t"
  43743. #else
  43744. "lsl r6, r6, #16\n\t"
  43745. #endif
  43746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43747. "adds r4, r4, r6\n\t"
  43748. #else
  43749. "add r4, r4, r6\n\t"
  43750. #endif
  43751. #ifdef WOLFSSL_KEIL
  43752. "adcs r5, r5, r7\n\t"
  43753. #elif defined(__clang__)
  43754. "adcs r5, r7\n\t"
  43755. #else
  43756. "adc r5, r7\n\t"
  43757. #endif
  43758. #ifdef WOLFSSL_KEIL
  43759. "adcs r3, r3, %[r]\n\t"
  43760. #elif defined(__clang__)
  43761. "adcs r3, %[r]\n\t"
  43762. #else
  43763. "adc r3, %[r]\n\t"
  43764. #endif
  43765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43766. "lsrs r6, %[a], #16\n\t"
  43767. #else
  43768. "lsr r6, %[a], #16\n\t"
  43769. #endif
  43770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43771. "lsrs r7, %[b], #16\n\t"
  43772. #else
  43773. "lsr r7, %[b], #16\n\t"
  43774. #endif
  43775. #ifdef WOLFSSL_KEIL
  43776. "muls r7, r6, r7\n\t"
  43777. #elif defined(__clang__)
  43778. "muls r7, r6\n\t"
  43779. #else
  43780. "mul r7, r6\n\t"
  43781. #endif
  43782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43783. "adds r5, r5, r7\n\t"
  43784. #else
  43785. "add r5, r5, r7\n\t"
  43786. #endif
  43787. #ifdef WOLFSSL_KEIL
  43788. "adcs r3, r3, %[r]\n\t"
  43789. #elif defined(__clang__)
  43790. "adcs r3, %[r]\n\t"
  43791. #else
  43792. "adc r3, %[r]\n\t"
  43793. #endif
  43794. "uxth r7, %[b]\n\t"
  43795. #ifdef WOLFSSL_KEIL
  43796. "muls r6, r7, r6\n\t"
  43797. #elif defined(__clang__)
  43798. "muls r6, r7\n\t"
  43799. #else
  43800. "mul r6, r7\n\t"
  43801. #endif
  43802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43803. "lsrs r7, r6, #16\n\t"
  43804. #else
  43805. "lsr r7, r6, #16\n\t"
  43806. #endif
  43807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43808. "lsls r6, r6, #16\n\t"
  43809. #else
  43810. "lsl r6, r6, #16\n\t"
  43811. #endif
  43812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43813. "adds r4, r4, r6\n\t"
  43814. #else
  43815. "add r4, r4, r6\n\t"
  43816. #endif
  43817. #ifdef WOLFSSL_KEIL
  43818. "adcs r5, r5, r7\n\t"
  43819. #elif defined(__clang__)
  43820. "adcs r5, r7\n\t"
  43821. #else
  43822. "adc r5, r7\n\t"
  43823. #endif
  43824. #ifdef WOLFSSL_KEIL
  43825. "adcs r3, r3, %[r]\n\t"
  43826. #elif defined(__clang__)
  43827. "adcs r3, %[r]\n\t"
  43828. #else
  43829. "adc r3, %[r]\n\t"
  43830. #endif
  43831. "mov %[r], r8\n\t"
  43832. "str r4, [%[r], #52]\n\t"
  43833. "movs %[r], #0\n\t"
  43834. "# A[11] * B[3]\n\t"
  43835. "movs r4, #0\n\t"
  43836. "mov %[a], r9\n\t"
  43837. "mov %[b], r10\n\t"
  43838. "ldr %[a], [%[a], #44]\n\t"
  43839. "ldr %[b], [%[b], #12]\n\t"
  43840. "uxth r6, %[a]\n\t"
  43841. "uxth r7, %[b]\n\t"
  43842. #ifdef WOLFSSL_KEIL
  43843. "muls r7, r6, r7\n\t"
  43844. #elif defined(__clang__)
  43845. "muls r7, r6\n\t"
  43846. #else
  43847. "mul r7, r6\n\t"
  43848. #endif
  43849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43850. "adds r5, r5, r7\n\t"
  43851. #else
  43852. "add r5, r5, r7\n\t"
  43853. #endif
  43854. #ifdef WOLFSSL_KEIL
  43855. "adcs r3, r3, %[r]\n\t"
  43856. #elif defined(__clang__)
  43857. "adcs r3, %[r]\n\t"
  43858. #else
  43859. "adc r3, %[r]\n\t"
  43860. #endif
  43861. #ifdef WOLFSSL_KEIL
  43862. "adcs r4, r4, %[r]\n\t"
  43863. #elif defined(__clang__)
  43864. "adcs r4, %[r]\n\t"
  43865. #else
  43866. "adc r4, %[r]\n\t"
  43867. #endif
  43868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43869. "lsrs r7, %[b], #16\n\t"
  43870. #else
  43871. "lsr r7, %[b], #16\n\t"
  43872. #endif
  43873. #ifdef WOLFSSL_KEIL
  43874. "muls r6, r7, r6\n\t"
  43875. #elif defined(__clang__)
  43876. "muls r6, r7\n\t"
  43877. #else
  43878. "mul r6, r7\n\t"
  43879. #endif
  43880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43881. "lsrs r7, r6, #16\n\t"
  43882. #else
  43883. "lsr r7, r6, #16\n\t"
  43884. #endif
  43885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43886. "lsls r6, r6, #16\n\t"
  43887. #else
  43888. "lsl r6, r6, #16\n\t"
  43889. #endif
  43890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43891. "adds r5, r5, r6\n\t"
  43892. #else
  43893. "add r5, r5, r6\n\t"
  43894. #endif
  43895. #ifdef WOLFSSL_KEIL
  43896. "adcs r3, r3, r7\n\t"
  43897. #elif defined(__clang__)
  43898. "adcs r3, r7\n\t"
  43899. #else
  43900. "adc r3, r7\n\t"
  43901. #endif
  43902. #ifdef WOLFSSL_KEIL
  43903. "adcs r4, r4, %[r]\n\t"
  43904. #elif defined(__clang__)
  43905. "adcs r4, %[r]\n\t"
  43906. #else
  43907. "adc r4, %[r]\n\t"
  43908. #endif
  43909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43910. "lsrs r6, %[a], #16\n\t"
  43911. #else
  43912. "lsr r6, %[a], #16\n\t"
  43913. #endif
  43914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43915. "lsrs r7, %[b], #16\n\t"
  43916. #else
  43917. "lsr r7, %[b], #16\n\t"
  43918. #endif
  43919. #ifdef WOLFSSL_KEIL
  43920. "muls r7, r6, r7\n\t"
  43921. #elif defined(__clang__)
  43922. "muls r7, r6\n\t"
  43923. #else
  43924. "mul r7, r6\n\t"
  43925. #endif
  43926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43927. "adds r3, r3, r7\n\t"
  43928. #else
  43929. "add r3, r3, r7\n\t"
  43930. #endif
  43931. #ifdef WOLFSSL_KEIL
  43932. "adcs r4, r4, %[r]\n\t"
  43933. #elif defined(__clang__)
  43934. "adcs r4, %[r]\n\t"
  43935. #else
  43936. "adc r4, %[r]\n\t"
  43937. #endif
  43938. "uxth r7, %[b]\n\t"
  43939. #ifdef WOLFSSL_KEIL
  43940. "muls r6, r7, r6\n\t"
  43941. #elif defined(__clang__)
  43942. "muls r6, r7\n\t"
  43943. #else
  43944. "mul r6, r7\n\t"
  43945. #endif
  43946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43947. "lsrs r7, r6, #16\n\t"
  43948. #else
  43949. "lsr r7, r6, #16\n\t"
  43950. #endif
  43951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43952. "lsls r6, r6, #16\n\t"
  43953. #else
  43954. "lsl r6, r6, #16\n\t"
  43955. #endif
  43956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43957. "adds r5, r5, r6\n\t"
  43958. #else
  43959. "add r5, r5, r6\n\t"
  43960. #endif
  43961. #ifdef WOLFSSL_KEIL
  43962. "adcs r3, r3, r7\n\t"
  43963. #elif defined(__clang__)
  43964. "adcs r3, r7\n\t"
  43965. #else
  43966. "adc r3, r7\n\t"
  43967. #endif
  43968. #ifdef WOLFSSL_KEIL
  43969. "adcs r4, r4, %[r]\n\t"
  43970. #elif defined(__clang__)
  43971. "adcs r4, %[r]\n\t"
  43972. #else
  43973. "adc r4, %[r]\n\t"
  43974. #endif
  43975. "# A[10] * B[4]\n\t"
  43976. "mov %[a], r9\n\t"
  43977. "mov %[b], r10\n\t"
  43978. "ldr %[a], [%[a], #40]\n\t"
  43979. "ldr %[b], [%[b], #16]\n\t"
  43980. "uxth r6, %[a]\n\t"
  43981. "uxth r7, %[b]\n\t"
  43982. #ifdef WOLFSSL_KEIL
  43983. "muls r7, r6, r7\n\t"
  43984. #elif defined(__clang__)
  43985. "muls r7, r6\n\t"
  43986. #else
  43987. "mul r7, r6\n\t"
  43988. #endif
  43989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43990. "adds r5, r5, r7\n\t"
  43991. #else
  43992. "add r5, r5, r7\n\t"
  43993. #endif
  43994. #ifdef WOLFSSL_KEIL
  43995. "adcs r3, r3, %[r]\n\t"
  43996. #elif defined(__clang__)
  43997. "adcs r3, %[r]\n\t"
  43998. #else
  43999. "adc r3, %[r]\n\t"
  44000. #endif
  44001. #ifdef WOLFSSL_KEIL
  44002. "adcs r4, r4, %[r]\n\t"
  44003. #elif defined(__clang__)
  44004. "adcs r4, %[r]\n\t"
  44005. #else
  44006. "adc r4, %[r]\n\t"
  44007. #endif
  44008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44009. "lsrs r7, %[b], #16\n\t"
  44010. #else
  44011. "lsr r7, %[b], #16\n\t"
  44012. #endif
  44013. #ifdef WOLFSSL_KEIL
  44014. "muls r6, r7, r6\n\t"
  44015. #elif defined(__clang__)
  44016. "muls r6, r7\n\t"
  44017. #else
  44018. "mul r6, r7\n\t"
  44019. #endif
  44020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44021. "lsrs r7, r6, #16\n\t"
  44022. #else
  44023. "lsr r7, r6, #16\n\t"
  44024. #endif
  44025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44026. "lsls r6, r6, #16\n\t"
  44027. #else
  44028. "lsl r6, r6, #16\n\t"
  44029. #endif
  44030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44031. "adds r5, r5, r6\n\t"
  44032. #else
  44033. "add r5, r5, r6\n\t"
  44034. #endif
  44035. #ifdef WOLFSSL_KEIL
  44036. "adcs r3, r3, r7\n\t"
  44037. #elif defined(__clang__)
  44038. "adcs r3, r7\n\t"
  44039. #else
  44040. "adc r3, r7\n\t"
  44041. #endif
  44042. #ifdef WOLFSSL_KEIL
  44043. "adcs r4, r4, %[r]\n\t"
  44044. #elif defined(__clang__)
  44045. "adcs r4, %[r]\n\t"
  44046. #else
  44047. "adc r4, %[r]\n\t"
  44048. #endif
  44049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44050. "lsrs r6, %[a], #16\n\t"
  44051. #else
  44052. "lsr r6, %[a], #16\n\t"
  44053. #endif
  44054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44055. "lsrs r7, %[b], #16\n\t"
  44056. #else
  44057. "lsr r7, %[b], #16\n\t"
  44058. #endif
  44059. #ifdef WOLFSSL_KEIL
  44060. "muls r7, r6, r7\n\t"
  44061. #elif defined(__clang__)
  44062. "muls r7, r6\n\t"
  44063. #else
  44064. "mul r7, r6\n\t"
  44065. #endif
  44066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44067. "adds r3, r3, r7\n\t"
  44068. #else
  44069. "add r3, r3, r7\n\t"
  44070. #endif
  44071. #ifdef WOLFSSL_KEIL
  44072. "adcs r4, r4, %[r]\n\t"
  44073. #elif defined(__clang__)
  44074. "adcs r4, %[r]\n\t"
  44075. #else
  44076. "adc r4, %[r]\n\t"
  44077. #endif
  44078. "uxth r7, %[b]\n\t"
  44079. #ifdef WOLFSSL_KEIL
  44080. "muls r6, r7, r6\n\t"
  44081. #elif defined(__clang__)
  44082. "muls r6, r7\n\t"
  44083. #else
  44084. "mul r6, r7\n\t"
  44085. #endif
  44086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44087. "lsrs r7, r6, #16\n\t"
  44088. #else
  44089. "lsr r7, r6, #16\n\t"
  44090. #endif
  44091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44092. "lsls r6, r6, #16\n\t"
  44093. #else
  44094. "lsl r6, r6, #16\n\t"
  44095. #endif
  44096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44097. "adds r5, r5, r6\n\t"
  44098. #else
  44099. "add r5, r5, r6\n\t"
  44100. #endif
  44101. #ifdef WOLFSSL_KEIL
  44102. "adcs r3, r3, r7\n\t"
  44103. #elif defined(__clang__)
  44104. "adcs r3, r7\n\t"
  44105. #else
  44106. "adc r3, r7\n\t"
  44107. #endif
  44108. #ifdef WOLFSSL_KEIL
  44109. "adcs r4, r4, %[r]\n\t"
  44110. #elif defined(__clang__)
  44111. "adcs r4, %[r]\n\t"
  44112. #else
  44113. "adc r4, %[r]\n\t"
  44114. #endif
  44115. "# A[9] * B[5]\n\t"
  44116. "mov %[a], r9\n\t"
  44117. "mov %[b], r10\n\t"
  44118. "ldr %[a], [%[a], #36]\n\t"
  44119. "ldr %[b], [%[b], #20]\n\t"
  44120. "uxth r6, %[a]\n\t"
  44121. "uxth r7, %[b]\n\t"
  44122. #ifdef WOLFSSL_KEIL
  44123. "muls r7, r6, r7\n\t"
  44124. #elif defined(__clang__)
  44125. "muls r7, r6\n\t"
  44126. #else
  44127. "mul r7, r6\n\t"
  44128. #endif
  44129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44130. "adds r5, r5, r7\n\t"
  44131. #else
  44132. "add r5, r5, r7\n\t"
  44133. #endif
  44134. #ifdef WOLFSSL_KEIL
  44135. "adcs r3, r3, %[r]\n\t"
  44136. #elif defined(__clang__)
  44137. "adcs r3, %[r]\n\t"
  44138. #else
  44139. "adc r3, %[r]\n\t"
  44140. #endif
  44141. #ifdef WOLFSSL_KEIL
  44142. "adcs r4, r4, %[r]\n\t"
  44143. #elif defined(__clang__)
  44144. "adcs r4, %[r]\n\t"
  44145. #else
  44146. "adc r4, %[r]\n\t"
  44147. #endif
  44148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44149. "lsrs r7, %[b], #16\n\t"
  44150. #else
  44151. "lsr r7, %[b], #16\n\t"
  44152. #endif
  44153. #ifdef WOLFSSL_KEIL
  44154. "muls r6, r7, r6\n\t"
  44155. #elif defined(__clang__)
  44156. "muls r6, r7\n\t"
  44157. #else
  44158. "mul r6, r7\n\t"
  44159. #endif
  44160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44161. "lsrs r7, r6, #16\n\t"
  44162. #else
  44163. "lsr r7, r6, #16\n\t"
  44164. #endif
  44165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44166. "lsls r6, r6, #16\n\t"
  44167. #else
  44168. "lsl r6, r6, #16\n\t"
  44169. #endif
  44170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44171. "adds r5, r5, r6\n\t"
  44172. #else
  44173. "add r5, r5, r6\n\t"
  44174. #endif
  44175. #ifdef WOLFSSL_KEIL
  44176. "adcs r3, r3, r7\n\t"
  44177. #elif defined(__clang__)
  44178. "adcs r3, r7\n\t"
  44179. #else
  44180. "adc r3, r7\n\t"
  44181. #endif
  44182. #ifdef WOLFSSL_KEIL
  44183. "adcs r4, r4, %[r]\n\t"
  44184. #elif defined(__clang__)
  44185. "adcs r4, %[r]\n\t"
  44186. #else
  44187. "adc r4, %[r]\n\t"
  44188. #endif
  44189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44190. "lsrs r6, %[a], #16\n\t"
  44191. #else
  44192. "lsr r6, %[a], #16\n\t"
  44193. #endif
  44194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44195. "lsrs r7, %[b], #16\n\t"
  44196. #else
  44197. "lsr r7, %[b], #16\n\t"
  44198. #endif
  44199. #ifdef WOLFSSL_KEIL
  44200. "muls r7, r6, r7\n\t"
  44201. #elif defined(__clang__)
  44202. "muls r7, r6\n\t"
  44203. #else
  44204. "mul r7, r6\n\t"
  44205. #endif
  44206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44207. "adds r3, r3, r7\n\t"
  44208. #else
  44209. "add r3, r3, r7\n\t"
  44210. #endif
  44211. #ifdef WOLFSSL_KEIL
  44212. "adcs r4, r4, %[r]\n\t"
  44213. #elif defined(__clang__)
  44214. "adcs r4, %[r]\n\t"
  44215. #else
  44216. "adc r4, %[r]\n\t"
  44217. #endif
  44218. "uxth r7, %[b]\n\t"
  44219. #ifdef WOLFSSL_KEIL
  44220. "muls r6, r7, r6\n\t"
  44221. #elif defined(__clang__)
  44222. "muls r6, r7\n\t"
  44223. #else
  44224. "mul r6, r7\n\t"
  44225. #endif
  44226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44227. "lsrs r7, r6, #16\n\t"
  44228. #else
  44229. "lsr r7, r6, #16\n\t"
  44230. #endif
  44231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44232. "lsls r6, r6, #16\n\t"
  44233. #else
  44234. "lsl r6, r6, #16\n\t"
  44235. #endif
  44236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44237. "adds r5, r5, r6\n\t"
  44238. #else
  44239. "add r5, r5, r6\n\t"
  44240. #endif
  44241. #ifdef WOLFSSL_KEIL
  44242. "adcs r3, r3, r7\n\t"
  44243. #elif defined(__clang__)
  44244. "adcs r3, r7\n\t"
  44245. #else
  44246. "adc r3, r7\n\t"
  44247. #endif
  44248. #ifdef WOLFSSL_KEIL
  44249. "adcs r4, r4, %[r]\n\t"
  44250. #elif defined(__clang__)
  44251. "adcs r4, %[r]\n\t"
  44252. #else
  44253. "adc r4, %[r]\n\t"
  44254. #endif
  44255. "# A[8] * B[6]\n\t"
  44256. "mov %[a], r9\n\t"
  44257. "mov %[b], r10\n\t"
  44258. "ldr %[a], [%[a], #32]\n\t"
  44259. "ldr %[b], [%[b], #24]\n\t"
  44260. "uxth r6, %[a]\n\t"
  44261. "uxth r7, %[b]\n\t"
  44262. #ifdef WOLFSSL_KEIL
  44263. "muls r7, r6, r7\n\t"
  44264. #elif defined(__clang__)
  44265. "muls r7, r6\n\t"
  44266. #else
  44267. "mul r7, r6\n\t"
  44268. #endif
  44269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44270. "adds r5, r5, r7\n\t"
  44271. #else
  44272. "add r5, r5, r7\n\t"
  44273. #endif
  44274. #ifdef WOLFSSL_KEIL
  44275. "adcs r3, r3, %[r]\n\t"
  44276. #elif defined(__clang__)
  44277. "adcs r3, %[r]\n\t"
  44278. #else
  44279. "adc r3, %[r]\n\t"
  44280. #endif
  44281. #ifdef WOLFSSL_KEIL
  44282. "adcs r4, r4, %[r]\n\t"
  44283. #elif defined(__clang__)
  44284. "adcs r4, %[r]\n\t"
  44285. #else
  44286. "adc r4, %[r]\n\t"
  44287. #endif
  44288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44289. "lsrs r7, %[b], #16\n\t"
  44290. #else
  44291. "lsr r7, %[b], #16\n\t"
  44292. #endif
  44293. #ifdef WOLFSSL_KEIL
  44294. "muls r6, r7, r6\n\t"
  44295. #elif defined(__clang__)
  44296. "muls r6, r7\n\t"
  44297. #else
  44298. "mul r6, r7\n\t"
  44299. #endif
  44300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44301. "lsrs r7, r6, #16\n\t"
  44302. #else
  44303. "lsr r7, r6, #16\n\t"
  44304. #endif
  44305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44306. "lsls r6, r6, #16\n\t"
  44307. #else
  44308. "lsl r6, r6, #16\n\t"
  44309. #endif
  44310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44311. "adds r5, r5, r6\n\t"
  44312. #else
  44313. "add r5, r5, r6\n\t"
  44314. #endif
  44315. #ifdef WOLFSSL_KEIL
  44316. "adcs r3, r3, r7\n\t"
  44317. #elif defined(__clang__)
  44318. "adcs r3, r7\n\t"
  44319. #else
  44320. "adc r3, r7\n\t"
  44321. #endif
  44322. #ifdef WOLFSSL_KEIL
  44323. "adcs r4, r4, %[r]\n\t"
  44324. #elif defined(__clang__)
  44325. "adcs r4, %[r]\n\t"
  44326. #else
  44327. "adc r4, %[r]\n\t"
  44328. #endif
  44329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44330. "lsrs r6, %[a], #16\n\t"
  44331. #else
  44332. "lsr r6, %[a], #16\n\t"
  44333. #endif
  44334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44335. "lsrs r7, %[b], #16\n\t"
  44336. #else
  44337. "lsr r7, %[b], #16\n\t"
  44338. #endif
  44339. #ifdef WOLFSSL_KEIL
  44340. "muls r7, r6, r7\n\t"
  44341. #elif defined(__clang__)
  44342. "muls r7, r6\n\t"
  44343. #else
  44344. "mul r7, r6\n\t"
  44345. #endif
  44346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44347. "adds r3, r3, r7\n\t"
  44348. #else
  44349. "add r3, r3, r7\n\t"
  44350. #endif
  44351. #ifdef WOLFSSL_KEIL
  44352. "adcs r4, r4, %[r]\n\t"
  44353. #elif defined(__clang__)
  44354. "adcs r4, %[r]\n\t"
  44355. #else
  44356. "adc r4, %[r]\n\t"
  44357. #endif
  44358. "uxth r7, %[b]\n\t"
  44359. #ifdef WOLFSSL_KEIL
  44360. "muls r6, r7, r6\n\t"
  44361. #elif defined(__clang__)
  44362. "muls r6, r7\n\t"
  44363. #else
  44364. "mul r6, r7\n\t"
  44365. #endif
  44366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44367. "lsrs r7, r6, #16\n\t"
  44368. #else
  44369. "lsr r7, r6, #16\n\t"
  44370. #endif
  44371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44372. "lsls r6, r6, #16\n\t"
  44373. #else
  44374. "lsl r6, r6, #16\n\t"
  44375. #endif
  44376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44377. "adds r5, r5, r6\n\t"
  44378. #else
  44379. "add r5, r5, r6\n\t"
  44380. #endif
  44381. #ifdef WOLFSSL_KEIL
  44382. "adcs r3, r3, r7\n\t"
  44383. #elif defined(__clang__)
  44384. "adcs r3, r7\n\t"
  44385. #else
  44386. "adc r3, r7\n\t"
  44387. #endif
  44388. #ifdef WOLFSSL_KEIL
  44389. "adcs r4, r4, %[r]\n\t"
  44390. #elif defined(__clang__)
  44391. "adcs r4, %[r]\n\t"
  44392. #else
  44393. "adc r4, %[r]\n\t"
  44394. #endif
  44395. "# A[7] * B[7]\n\t"
  44396. "mov %[a], r9\n\t"
  44397. "mov %[b], r10\n\t"
  44398. "ldr %[a], [%[a], #28]\n\t"
  44399. "ldr %[b], [%[b], #28]\n\t"
  44400. "uxth r6, %[a]\n\t"
  44401. "uxth r7, %[b]\n\t"
  44402. #ifdef WOLFSSL_KEIL
  44403. "muls r7, r6, r7\n\t"
  44404. #elif defined(__clang__)
  44405. "muls r7, r6\n\t"
  44406. #else
  44407. "mul r7, r6\n\t"
  44408. #endif
  44409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44410. "adds r5, r5, r7\n\t"
  44411. #else
  44412. "add r5, r5, r7\n\t"
  44413. #endif
  44414. #ifdef WOLFSSL_KEIL
  44415. "adcs r3, r3, %[r]\n\t"
  44416. #elif defined(__clang__)
  44417. "adcs r3, %[r]\n\t"
  44418. #else
  44419. "adc r3, %[r]\n\t"
  44420. #endif
  44421. #ifdef WOLFSSL_KEIL
  44422. "adcs r4, r4, %[r]\n\t"
  44423. #elif defined(__clang__)
  44424. "adcs r4, %[r]\n\t"
  44425. #else
  44426. "adc r4, %[r]\n\t"
  44427. #endif
  44428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44429. "lsrs r7, %[b], #16\n\t"
  44430. #else
  44431. "lsr r7, %[b], #16\n\t"
  44432. #endif
  44433. #ifdef WOLFSSL_KEIL
  44434. "muls r6, r7, r6\n\t"
  44435. #elif defined(__clang__)
  44436. "muls r6, r7\n\t"
  44437. #else
  44438. "mul r6, r7\n\t"
  44439. #endif
  44440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44441. "lsrs r7, r6, #16\n\t"
  44442. #else
  44443. "lsr r7, r6, #16\n\t"
  44444. #endif
  44445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44446. "lsls r6, r6, #16\n\t"
  44447. #else
  44448. "lsl r6, r6, #16\n\t"
  44449. #endif
  44450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44451. "adds r5, r5, r6\n\t"
  44452. #else
  44453. "add r5, r5, r6\n\t"
  44454. #endif
  44455. #ifdef WOLFSSL_KEIL
  44456. "adcs r3, r3, r7\n\t"
  44457. #elif defined(__clang__)
  44458. "adcs r3, r7\n\t"
  44459. #else
  44460. "adc r3, r7\n\t"
  44461. #endif
  44462. #ifdef WOLFSSL_KEIL
  44463. "adcs r4, r4, %[r]\n\t"
  44464. #elif defined(__clang__)
  44465. "adcs r4, %[r]\n\t"
  44466. #else
  44467. "adc r4, %[r]\n\t"
  44468. #endif
  44469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44470. "lsrs r6, %[a], #16\n\t"
  44471. #else
  44472. "lsr r6, %[a], #16\n\t"
  44473. #endif
  44474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44475. "lsrs r7, %[b], #16\n\t"
  44476. #else
  44477. "lsr r7, %[b], #16\n\t"
  44478. #endif
  44479. #ifdef WOLFSSL_KEIL
  44480. "muls r7, r6, r7\n\t"
  44481. #elif defined(__clang__)
  44482. "muls r7, r6\n\t"
  44483. #else
  44484. "mul r7, r6\n\t"
  44485. #endif
  44486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44487. "adds r3, r3, r7\n\t"
  44488. #else
  44489. "add r3, r3, r7\n\t"
  44490. #endif
  44491. #ifdef WOLFSSL_KEIL
  44492. "adcs r4, r4, %[r]\n\t"
  44493. #elif defined(__clang__)
  44494. "adcs r4, %[r]\n\t"
  44495. #else
  44496. "adc r4, %[r]\n\t"
  44497. #endif
  44498. "uxth r7, %[b]\n\t"
  44499. #ifdef WOLFSSL_KEIL
  44500. "muls r6, r7, r6\n\t"
  44501. #elif defined(__clang__)
  44502. "muls r6, r7\n\t"
  44503. #else
  44504. "mul r6, r7\n\t"
  44505. #endif
  44506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44507. "lsrs r7, r6, #16\n\t"
  44508. #else
  44509. "lsr r7, r6, #16\n\t"
  44510. #endif
  44511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44512. "lsls r6, r6, #16\n\t"
  44513. #else
  44514. "lsl r6, r6, #16\n\t"
  44515. #endif
  44516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44517. "adds r5, r5, r6\n\t"
  44518. #else
  44519. "add r5, r5, r6\n\t"
  44520. #endif
  44521. #ifdef WOLFSSL_KEIL
  44522. "adcs r3, r3, r7\n\t"
  44523. #elif defined(__clang__)
  44524. "adcs r3, r7\n\t"
  44525. #else
  44526. "adc r3, r7\n\t"
  44527. #endif
  44528. #ifdef WOLFSSL_KEIL
  44529. "adcs r4, r4, %[r]\n\t"
  44530. #elif defined(__clang__)
  44531. "adcs r4, %[r]\n\t"
  44532. #else
  44533. "adc r4, %[r]\n\t"
  44534. #endif
  44535. "# A[6] * B[8]\n\t"
  44536. "mov %[a], r9\n\t"
  44537. "mov %[b], r10\n\t"
  44538. "ldr %[a], [%[a], #24]\n\t"
  44539. "ldr %[b], [%[b], #32]\n\t"
  44540. "uxth r6, %[a]\n\t"
  44541. "uxth r7, %[b]\n\t"
  44542. #ifdef WOLFSSL_KEIL
  44543. "muls r7, r6, r7\n\t"
  44544. #elif defined(__clang__)
  44545. "muls r7, r6\n\t"
  44546. #else
  44547. "mul r7, r6\n\t"
  44548. #endif
  44549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44550. "adds r5, r5, r7\n\t"
  44551. #else
  44552. "add r5, r5, r7\n\t"
  44553. #endif
  44554. #ifdef WOLFSSL_KEIL
  44555. "adcs r3, r3, %[r]\n\t"
  44556. #elif defined(__clang__)
  44557. "adcs r3, %[r]\n\t"
  44558. #else
  44559. "adc r3, %[r]\n\t"
  44560. #endif
  44561. #ifdef WOLFSSL_KEIL
  44562. "adcs r4, r4, %[r]\n\t"
  44563. #elif defined(__clang__)
  44564. "adcs r4, %[r]\n\t"
  44565. #else
  44566. "adc r4, %[r]\n\t"
  44567. #endif
  44568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44569. "lsrs r7, %[b], #16\n\t"
  44570. #else
  44571. "lsr r7, %[b], #16\n\t"
  44572. #endif
  44573. #ifdef WOLFSSL_KEIL
  44574. "muls r6, r7, r6\n\t"
  44575. #elif defined(__clang__)
  44576. "muls r6, r7\n\t"
  44577. #else
  44578. "mul r6, r7\n\t"
  44579. #endif
  44580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44581. "lsrs r7, r6, #16\n\t"
  44582. #else
  44583. "lsr r7, r6, #16\n\t"
  44584. #endif
  44585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44586. "lsls r6, r6, #16\n\t"
  44587. #else
  44588. "lsl r6, r6, #16\n\t"
  44589. #endif
  44590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44591. "adds r5, r5, r6\n\t"
  44592. #else
  44593. "add r5, r5, r6\n\t"
  44594. #endif
  44595. #ifdef WOLFSSL_KEIL
  44596. "adcs r3, r3, r7\n\t"
  44597. #elif defined(__clang__)
  44598. "adcs r3, r7\n\t"
  44599. #else
  44600. "adc r3, r7\n\t"
  44601. #endif
  44602. #ifdef WOLFSSL_KEIL
  44603. "adcs r4, r4, %[r]\n\t"
  44604. #elif defined(__clang__)
  44605. "adcs r4, %[r]\n\t"
  44606. #else
  44607. "adc r4, %[r]\n\t"
  44608. #endif
  44609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44610. "lsrs r6, %[a], #16\n\t"
  44611. #else
  44612. "lsr r6, %[a], #16\n\t"
  44613. #endif
  44614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44615. "lsrs r7, %[b], #16\n\t"
  44616. #else
  44617. "lsr r7, %[b], #16\n\t"
  44618. #endif
  44619. #ifdef WOLFSSL_KEIL
  44620. "muls r7, r6, r7\n\t"
  44621. #elif defined(__clang__)
  44622. "muls r7, r6\n\t"
  44623. #else
  44624. "mul r7, r6\n\t"
  44625. #endif
  44626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44627. "adds r3, r3, r7\n\t"
  44628. #else
  44629. "add r3, r3, r7\n\t"
  44630. #endif
  44631. #ifdef WOLFSSL_KEIL
  44632. "adcs r4, r4, %[r]\n\t"
  44633. #elif defined(__clang__)
  44634. "adcs r4, %[r]\n\t"
  44635. #else
  44636. "adc r4, %[r]\n\t"
  44637. #endif
  44638. "uxth r7, %[b]\n\t"
  44639. #ifdef WOLFSSL_KEIL
  44640. "muls r6, r7, r6\n\t"
  44641. #elif defined(__clang__)
  44642. "muls r6, r7\n\t"
  44643. #else
  44644. "mul r6, r7\n\t"
  44645. #endif
  44646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44647. "lsrs r7, r6, #16\n\t"
  44648. #else
  44649. "lsr r7, r6, #16\n\t"
  44650. #endif
  44651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44652. "lsls r6, r6, #16\n\t"
  44653. #else
  44654. "lsl r6, r6, #16\n\t"
  44655. #endif
  44656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44657. "adds r5, r5, r6\n\t"
  44658. #else
  44659. "add r5, r5, r6\n\t"
  44660. #endif
  44661. #ifdef WOLFSSL_KEIL
  44662. "adcs r3, r3, r7\n\t"
  44663. #elif defined(__clang__)
  44664. "adcs r3, r7\n\t"
  44665. #else
  44666. "adc r3, r7\n\t"
  44667. #endif
  44668. #ifdef WOLFSSL_KEIL
  44669. "adcs r4, r4, %[r]\n\t"
  44670. #elif defined(__clang__)
  44671. "adcs r4, %[r]\n\t"
  44672. #else
  44673. "adc r4, %[r]\n\t"
  44674. #endif
  44675. "# A[5] * B[9]\n\t"
  44676. "mov %[a], r9\n\t"
  44677. "mov %[b], r10\n\t"
  44678. "ldr %[a], [%[a], #20]\n\t"
  44679. "ldr %[b], [%[b], #36]\n\t"
  44680. "uxth r6, %[a]\n\t"
  44681. "uxth r7, %[b]\n\t"
  44682. #ifdef WOLFSSL_KEIL
  44683. "muls r7, r6, r7\n\t"
  44684. #elif defined(__clang__)
  44685. "muls r7, r6\n\t"
  44686. #else
  44687. "mul r7, r6\n\t"
  44688. #endif
  44689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44690. "adds r5, r5, r7\n\t"
  44691. #else
  44692. "add r5, r5, r7\n\t"
  44693. #endif
  44694. #ifdef WOLFSSL_KEIL
  44695. "adcs r3, r3, %[r]\n\t"
  44696. #elif defined(__clang__)
  44697. "adcs r3, %[r]\n\t"
  44698. #else
  44699. "adc r3, %[r]\n\t"
  44700. #endif
  44701. #ifdef WOLFSSL_KEIL
  44702. "adcs r4, r4, %[r]\n\t"
  44703. #elif defined(__clang__)
  44704. "adcs r4, %[r]\n\t"
  44705. #else
  44706. "adc r4, %[r]\n\t"
  44707. #endif
  44708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44709. "lsrs r7, %[b], #16\n\t"
  44710. #else
  44711. "lsr r7, %[b], #16\n\t"
  44712. #endif
  44713. #ifdef WOLFSSL_KEIL
  44714. "muls r6, r7, r6\n\t"
  44715. #elif defined(__clang__)
  44716. "muls r6, r7\n\t"
  44717. #else
  44718. "mul r6, r7\n\t"
  44719. #endif
  44720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44721. "lsrs r7, r6, #16\n\t"
  44722. #else
  44723. "lsr r7, r6, #16\n\t"
  44724. #endif
  44725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44726. "lsls r6, r6, #16\n\t"
  44727. #else
  44728. "lsl r6, r6, #16\n\t"
  44729. #endif
  44730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44731. "adds r5, r5, r6\n\t"
  44732. #else
  44733. "add r5, r5, r6\n\t"
  44734. #endif
  44735. #ifdef WOLFSSL_KEIL
  44736. "adcs r3, r3, r7\n\t"
  44737. #elif defined(__clang__)
  44738. "adcs r3, r7\n\t"
  44739. #else
  44740. "adc r3, r7\n\t"
  44741. #endif
  44742. #ifdef WOLFSSL_KEIL
  44743. "adcs r4, r4, %[r]\n\t"
  44744. #elif defined(__clang__)
  44745. "adcs r4, %[r]\n\t"
  44746. #else
  44747. "adc r4, %[r]\n\t"
  44748. #endif
  44749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44750. "lsrs r6, %[a], #16\n\t"
  44751. #else
  44752. "lsr r6, %[a], #16\n\t"
  44753. #endif
  44754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44755. "lsrs r7, %[b], #16\n\t"
  44756. #else
  44757. "lsr r7, %[b], #16\n\t"
  44758. #endif
  44759. #ifdef WOLFSSL_KEIL
  44760. "muls r7, r6, r7\n\t"
  44761. #elif defined(__clang__)
  44762. "muls r7, r6\n\t"
  44763. #else
  44764. "mul r7, r6\n\t"
  44765. #endif
  44766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44767. "adds r3, r3, r7\n\t"
  44768. #else
  44769. "add r3, r3, r7\n\t"
  44770. #endif
  44771. #ifdef WOLFSSL_KEIL
  44772. "adcs r4, r4, %[r]\n\t"
  44773. #elif defined(__clang__)
  44774. "adcs r4, %[r]\n\t"
  44775. #else
  44776. "adc r4, %[r]\n\t"
  44777. #endif
  44778. "uxth r7, %[b]\n\t"
  44779. #ifdef WOLFSSL_KEIL
  44780. "muls r6, r7, r6\n\t"
  44781. #elif defined(__clang__)
  44782. "muls r6, r7\n\t"
  44783. #else
  44784. "mul r6, r7\n\t"
  44785. #endif
  44786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44787. "lsrs r7, r6, #16\n\t"
  44788. #else
  44789. "lsr r7, r6, #16\n\t"
  44790. #endif
  44791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44792. "lsls r6, r6, #16\n\t"
  44793. #else
  44794. "lsl r6, r6, #16\n\t"
  44795. #endif
  44796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44797. "adds r5, r5, r6\n\t"
  44798. #else
  44799. "add r5, r5, r6\n\t"
  44800. #endif
  44801. #ifdef WOLFSSL_KEIL
  44802. "adcs r3, r3, r7\n\t"
  44803. #elif defined(__clang__)
  44804. "adcs r3, r7\n\t"
  44805. #else
  44806. "adc r3, r7\n\t"
  44807. #endif
  44808. #ifdef WOLFSSL_KEIL
  44809. "adcs r4, r4, %[r]\n\t"
  44810. #elif defined(__clang__)
  44811. "adcs r4, %[r]\n\t"
  44812. #else
  44813. "adc r4, %[r]\n\t"
  44814. #endif
  44815. "# A[4] * B[10]\n\t"
  44816. "mov %[a], r9\n\t"
  44817. "mov %[b], r10\n\t"
  44818. "ldr %[a], [%[a], #16]\n\t"
  44819. "ldr %[b], [%[b], #40]\n\t"
  44820. "uxth r6, %[a]\n\t"
  44821. "uxth r7, %[b]\n\t"
  44822. #ifdef WOLFSSL_KEIL
  44823. "muls r7, r6, r7\n\t"
  44824. #elif defined(__clang__)
  44825. "muls r7, r6\n\t"
  44826. #else
  44827. "mul r7, r6\n\t"
  44828. #endif
  44829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44830. "adds r5, r5, r7\n\t"
  44831. #else
  44832. "add r5, r5, r7\n\t"
  44833. #endif
  44834. #ifdef WOLFSSL_KEIL
  44835. "adcs r3, r3, %[r]\n\t"
  44836. #elif defined(__clang__)
  44837. "adcs r3, %[r]\n\t"
  44838. #else
  44839. "adc r3, %[r]\n\t"
  44840. #endif
  44841. #ifdef WOLFSSL_KEIL
  44842. "adcs r4, r4, %[r]\n\t"
  44843. #elif defined(__clang__)
  44844. "adcs r4, %[r]\n\t"
  44845. #else
  44846. "adc r4, %[r]\n\t"
  44847. #endif
  44848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44849. "lsrs r7, %[b], #16\n\t"
  44850. #else
  44851. "lsr r7, %[b], #16\n\t"
  44852. #endif
  44853. #ifdef WOLFSSL_KEIL
  44854. "muls r6, r7, r6\n\t"
  44855. #elif defined(__clang__)
  44856. "muls r6, r7\n\t"
  44857. #else
  44858. "mul r6, r7\n\t"
  44859. #endif
  44860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44861. "lsrs r7, r6, #16\n\t"
  44862. #else
  44863. "lsr r7, r6, #16\n\t"
  44864. #endif
  44865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44866. "lsls r6, r6, #16\n\t"
  44867. #else
  44868. "lsl r6, r6, #16\n\t"
  44869. #endif
  44870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44871. "adds r5, r5, r6\n\t"
  44872. #else
  44873. "add r5, r5, r6\n\t"
  44874. #endif
  44875. #ifdef WOLFSSL_KEIL
  44876. "adcs r3, r3, r7\n\t"
  44877. #elif defined(__clang__)
  44878. "adcs r3, r7\n\t"
  44879. #else
  44880. "adc r3, r7\n\t"
  44881. #endif
  44882. #ifdef WOLFSSL_KEIL
  44883. "adcs r4, r4, %[r]\n\t"
  44884. #elif defined(__clang__)
  44885. "adcs r4, %[r]\n\t"
  44886. #else
  44887. "adc r4, %[r]\n\t"
  44888. #endif
  44889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44890. "lsrs r6, %[a], #16\n\t"
  44891. #else
  44892. "lsr r6, %[a], #16\n\t"
  44893. #endif
  44894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44895. "lsrs r7, %[b], #16\n\t"
  44896. #else
  44897. "lsr r7, %[b], #16\n\t"
  44898. #endif
  44899. #ifdef WOLFSSL_KEIL
  44900. "muls r7, r6, r7\n\t"
  44901. #elif defined(__clang__)
  44902. "muls r7, r6\n\t"
  44903. #else
  44904. "mul r7, r6\n\t"
  44905. #endif
  44906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44907. "adds r3, r3, r7\n\t"
  44908. #else
  44909. "add r3, r3, r7\n\t"
  44910. #endif
  44911. #ifdef WOLFSSL_KEIL
  44912. "adcs r4, r4, %[r]\n\t"
  44913. #elif defined(__clang__)
  44914. "adcs r4, %[r]\n\t"
  44915. #else
  44916. "adc r4, %[r]\n\t"
  44917. #endif
  44918. "uxth r7, %[b]\n\t"
  44919. #ifdef WOLFSSL_KEIL
  44920. "muls r6, r7, r6\n\t"
  44921. #elif defined(__clang__)
  44922. "muls r6, r7\n\t"
  44923. #else
  44924. "mul r6, r7\n\t"
  44925. #endif
  44926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44927. "lsrs r7, r6, #16\n\t"
  44928. #else
  44929. "lsr r7, r6, #16\n\t"
  44930. #endif
  44931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44932. "lsls r6, r6, #16\n\t"
  44933. #else
  44934. "lsl r6, r6, #16\n\t"
  44935. #endif
  44936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44937. "adds r5, r5, r6\n\t"
  44938. #else
  44939. "add r5, r5, r6\n\t"
  44940. #endif
  44941. #ifdef WOLFSSL_KEIL
  44942. "adcs r3, r3, r7\n\t"
  44943. #elif defined(__clang__)
  44944. "adcs r3, r7\n\t"
  44945. #else
  44946. "adc r3, r7\n\t"
  44947. #endif
  44948. #ifdef WOLFSSL_KEIL
  44949. "adcs r4, r4, %[r]\n\t"
  44950. #elif defined(__clang__)
  44951. "adcs r4, %[r]\n\t"
  44952. #else
  44953. "adc r4, %[r]\n\t"
  44954. #endif
  44955. "# A[3] * B[11]\n\t"
  44956. "mov %[a], r9\n\t"
  44957. "mov %[b], r10\n\t"
  44958. "ldr %[a], [%[a], #12]\n\t"
  44959. "ldr %[b], [%[b], #44]\n\t"
  44960. "uxth r6, %[a]\n\t"
  44961. "uxth r7, %[b]\n\t"
  44962. #ifdef WOLFSSL_KEIL
  44963. "muls r7, r6, r7\n\t"
  44964. #elif defined(__clang__)
  44965. "muls r7, r6\n\t"
  44966. #else
  44967. "mul r7, r6\n\t"
  44968. #endif
  44969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44970. "adds r5, r5, r7\n\t"
  44971. #else
  44972. "add r5, r5, r7\n\t"
  44973. #endif
  44974. #ifdef WOLFSSL_KEIL
  44975. "adcs r3, r3, %[r]\n\t"
  44976. #elif defined(__clang__)
  44977. "adcs r3, %[r]\n\t"
  44978. #else
  44979. "adc r3, %[r]\n\t"
  44980. #endif
  44981. #ifdef WOLFSSL_KEIL
  44982. "adcs r4, r4, %[r]\n\t"
  44983. #elif defined(__clang__)
  44984. "adcs r4, %[r]\n\t"
  44985. #else
  44986. "adc r4, %[r]\n\t"
  44987. #endif
  44988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44989. "lsrs r7, %[b], #16\n\t"
  44990. #else
  44991. "lsr r7, %[b], #16\n\t"
  44992. #endif
  44993. #ifdef WOLFSSL_KEIL
  44994. "muls r6, r7, r6\n\t"
  44995. #elif defined(__clang__)
  44996. "muls r6, r7\n\t"
  44997. #else
  44998. "mul r6, r7\n\t"
  44999. #endif
  45000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45001. "lsrs r7, r6, #16\n\t"
  45002. #else
  45003. "lsr r7, r6, #16\n\t"
  45004. #endif
  45005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45006. "lsls r6, r6, #16\n\t"
  45007. #else
  45008. "lsl r6, r6, #16\n\t"
  45009. #endif
  45010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45011. "adds r5, r5, r6\n\t"
  45012. #else
  45013. "add r5, r5, r6\n\t"
  45014. #endif
  45015. #ifdef WOLFSSL_KEIL
  45016. "adcs r3, r3, r7\n\t"
  45017. #elif defined(__clang__)
  45018. "adcs r3, r7\n\t"
  45019. #else
  45020. "adc r3, r7\n\t"
  45021. #endif
  45022. #ifdef WOLFSSL_KEIL
  45023. "adcs r4, r4, %[r]\n\t"
  45024. #elif defined(__clang__)
  45025. "adcs r4, %[r]\n\t"
  45026. #else
  45027. "adc r4, %[r]\n\t"
  45028. #endif
  45029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45030. "lsrs r6, %[a], #16\n\t"
  45031. #else
  45032. "lsr r6, %[a], #16\n\t"
  45033. #endif
  45034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45035. "lsrs r7, %[b], #16\n\t"
  45036. #else
  45037. "lsr r7, %[b], #16\n\t"
  45038. #endif
  45039. #ifdef WOLFSSL_KEIL
  45040. "muls r7, r6, r7\n\t"
  45041. #elif defined(__clang__)
  45042. "muls r7, r6\n\t"
  45043. #else
  45044. "mul r7, r6\n\t"
  45045. #endif
  45046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45047. "adds r3, r3, r7\n\t"
  45048. #else
  45049. "add r3, r3, r7\n\t"
  45050. #endif
  45051. #ifdef WOLFSSL_KEIL
  45052. "adcs r4, r4, %[r]\n\t"
  45053. #elif defined(__clang__)
  45054. "adcs r4, %[r]\n\t"
  45055. #else
  45056. "adc r4, %[r]\n\t"
  45057. #endif
  45058. "uxth r7, %[b]\n\t"
  45059. #ifdef WOLFSSL_KEIL
  45060. "muls r6, r7, r6\n\t"
  45061. #elif defined(__clang__)
  45062. "muls r6, r7\n\t"
  45063. #else
  45064. "mul r6, r7\n\t"
  45065. #endif
  45066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45067. "lsrs r7, r6, #16\n\t"
  45068. #else
  45069. "lsr r7, r6, #16\n\t"
  45070. #endif
  45071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45072. "lsls r6, r6, #16\n\t"
  45073. #else
  45074. "lsl r6, r6, #16\n\t"
  45075. #endif
  45076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45077. "adds r5, r5, r6\n\t"
  45078. #else
  45079. "add r5, r5, r6\n\t"
  45080. #endif
  45081. #ifdef WOLFSSL_KEIL
  45082. "adcs r3, r3, r7\n\t"
  45083. #elif defined(__clang__)
  45084. "adcs r3, r7\n\t"
  45085. #else
  45086. "adc r3, r7\n\t"
  45087. #endif
  45088. #ifdef WOLFSSL_KEIL
  45089. "adcs r4, r4, %[r]\n\t"
  45090. #elif defined(__clang__)
  45091. "adcs r4, %[r]\n\t"
  45092. #else
  45093. "adc r4, %[r]\n\t"
  45094. #endif
  45095. "mov %[r], r8\n\t"
  45096. "str r5, [%[r], #56]\n\t"
  45097. "movs %[r], #0\n\t"
  45098. "# A[4] * B[11]\n\t"
  45099. "movs r5, #0\n\t"
  45100. "mov %[a], r9\n\t"
  45101. "mov %[b], r10\n\t"
  45102. "ldr %[a], [%[a], #16]\n\t"
  45103. "ldr %[b], [%[b], #44]\n\t"
  45104. "uxth r6, %[a]\n\t"
  45105. "uxth r7, %[b]\n\t"
  45106. #ifdef WOLFSSL_KEIL
  45107. "muls r7, r6, r7\n\t"
  45108. #elif defined(__clang__)
  45109. "muls r7, r6\n\t"
  45110. #else
  45111. "mul r7, r6\n\t"
  45112. #endif
  45113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45114. "adds r3, r3, r7\n\t"
  45115. #else
  45116. "add r3, r3, r7\n\t"
  45117. #endif
  45118. #ifdef WOLFSSL_KEIL
  45119. "adcs r4, r4, %[r]\n\t"
  45120. #elif defined(__clang__)
  45121. "adcs r4, %[r]\n\t"
  45122. #else
  45123. "adc r4, %[r]\n\t"
  45124. #endif
  45125. #ifdef WOLFSSL_KEIL
  45126. "adcs r5, r5, %[r]\n\t"
  45127. #elif defined(__clang__)
  45128. "adcs r5, %[r]\n\t"
  45129. #else
  45130. "adc r5, %[r]\n\t"
  45131. #endif
  45132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45133. "lsrs r7, %[b], #16\n\t"
  45134. #else
  45135. "lsr r7, %[b], #16\n\t"
  45136. #endif
  45137. #ifdef WOLFSSL_KEIL
  45138. "muls r6, r7, r6\n\t"
  45139. #elif defined(__clang__)
  45140. "muls r6, r7\n\t"
  45141. #else
  45142. "mul r6, r7\n\t"
  45143. #endif
  45144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45145. "lsrs r7, r6, #16\n\t"
  45146. #else
  45147. "lsr r7, r6, #16\n\t"
  45148. #endif
  45149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45150. "lsls r6, r6, #16\n\t"
  45151. #else
  45152. "lsl r6, r6, #16\n\t"
  45153. #endif
  45154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45155. "adds r3, r3, r6\n\t"
  45156. #else
  45157. "add r3, r3, r6\n\t"
  45158. #endif
  45159. #ifdef WOLFSSL_KEIL
  45160. "adcs r4, r4, r7\n\t"
  45161. #elif defined(__clang__)
  45162. "adcs r4, r7\n\t"
  45163. #else
  45164. "adc r4, r7\n\t"
  45165. #endif
  45166. #ifdef WOLFSSL_KEIL
  45167. "adcs r5, r5, %[r]\n\t"
  45168. #elif defined(__clang__)
  45169. "adcs r5, %[r]\n\t"
  45170. #else
  45171. "adc r5, %[r]\n\t"
  45172. #endif
  45173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45174. "lsrs r6, %[a], #16\n\t"
  45175. #else
  45176. "lsr r6, %[a], #16\n\t"
  45177. #endif
  45178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45179. "lsrs r7, %[b], #16\n\t"
  45180. #else
  45181. "lsr r7, %[b], #16\n\t"
  45182. #endif
  45183. #ifdef WOLFSSL_KEIL
  45184. "muls r7, r6, r7\n\t"
  45185. #elif defined(__clang__)
  45186. "muls r7, r6\n\t"
  45187. #else
  45188. "mul r7, r6\n\t"
  45189. #endif
  45190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45191. "adds r4, r4, r7\n\t"
  45192. #else
  45193. "add r4, r4, r7\n\t"
  45194. #endif
  45195. #ifdef WOLFSSL_KEIL
  45196. "adcs r5, r5, %[r]\n\t"
  45197. #elif defined(__clang__)
  45198. "adcs r5, %[r]\n\t"
  45199. #else
  45200. "adc r5, %[r]\n\t"
  45201. #endif
  45202. "uxth r7, %[b]\n\t"
  45203. #ifdef WOLFSSL_KEIL
  45204. "muls r6, r7, r6\n\t"
  45205. #elif defined(__clang__)
  45206. "muls r6, r7\n\t"
  45207. #else
  45208. "mul r6, r7\n\t"
  45209. #endif
  45210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45211. "lsrs r7, r6, #16\n\t"
  45212. #else
  45213. "lsr r7, r6, #16\n\t"
  45214. #endif
  45215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45216. "lsls r6, r6, #16\n\t"
  45217. #else
  45218. "lsl r6, r6, #16\n\t"
  45219. #endif
  45220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45221. "adds r3, r3, r6\n\t"
  45222. #else
  45223. "add r3, r3, r6\n\t"
  45224. #endif
  45225. #ifdef WOLFSSL_KEIL
  45226. "adcs r4, r4, r7\n\t"
  45227. #elif defined(__clang__)
  45228. "adcs r4, r7\n\t"
  45229. #else
  45230. "adc r4, r7\n\t"
  45231. #endif
  45232. #ifdef WOLFSSL_KEIL
  45233. "adcs r5, r5, %[r]\n\t"
  45234. #elif defined(__clang__)
  45235. "adcs r5, %[r]\n\t"
  45236. #else
  45237. "adc r5, %[r]\n\t"
  45238. #endif
  45239. "# A[5] * B[10]\n\t"
  45240. "mov %[a], r9\n\t"
  45241. "mov %[b], r10\n\t"
  45242. "ldr %[a], [%[a], #20]\n\t"
  45243. "ldr %[b], [%[b], #40]\n\t"
  45244. "uxth r6, %[a]\n\t"
  45245. "uxth r7, %[b]\n\t"
  45246. #ifdef WOLFSSL_KEIL
  45247. "muls r7, r6, r7\n\t"
  45248. #elif defined(__clang__)
  45249. "muls r7, r6\n\t"
  45250. #else
  45251. "mul r7, r6\n\t"
  45252. #endif
  45253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45254. "adds r3, r3, r7\n\t"
  45255. #else
  45256. "add r3, r3, r7\n\t"
  45257. #endif
  45258. #ifdef WOLFSSL_KEIL
  45259. "adcs r4, r4, %[r]\n\t"
  45260. #elif defined(__clang__)
  45261. "adcs r4, %[r]\n\t"
  45262. #else
  45263. "adc r4, %[r]\n\t"
  45264. #endif
  45265. #ifdef WOLFSSL_KEIL
  45266. "adcs r5, r5, %[r]\n\t"
  45267. #elif defined(__clang__)
  45268. "adcs r5, %[r]\n\t"
  45269. #else
  45270. "adc r5, %[r]\n\t"
  45271. #endif
  45272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45273. "lsrs r7, %[b], #16\n\t"
  45274. #else
  45275. "lsr r7, %[b], #16\n\t"
  45276. #endif
  45277. #ifdef WOLFSSL_KEIL
  45278. "muls r6, r7, r6\n\t"
  45279. #elif defined(__clang__)
  45280. "muls r6, r7\n\t"
  45281. #else
  45282. "mul r6, r7\n\t"
  45283. #endif
  45284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45285. "lsrs r7, r6, #16\n\t"
  45286. #else
  45287. "lsr r7, r6, #16\n\t"
  45288. #endif
  45289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45290. "lsls r6, r6, #16\n\t"
  45291. #else
  45292. "lsl r6, r6, #16\n\t"
  45293. #endif
  45294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45295. "adds r3, r3, r6\n\t"
  45296. #else
  45297. "add r3, r3, r6\n\t"
  45298. #endif
  45299. #ifdef WOLFSSL_KEIL
  45300. "adcs r4, r4, r7\n\t"
  45301. #elif defined(__clang__)
  45302. "adcs r4, r7\n\t"
  45303. #else
  45304. "adc r4, r7\n\t"
  45305. #endif
  45306. #ifdef WOLFSSL_KEIL
  45307. "adcs r5, r5, %[r]\n\t"
  45308. #elif defined(__clang__)
  45309. "adcs r5, %[r]\n\t"
  45310. #else
  45311. "adc r5, %[r]\n\t"
  45312. #endif
  45313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45314. "lsrs r6, %[a], #16\n\t"
  45315. #else
  45316. "lsr r6, %[a], #16\n\t"
  45317. #endif
  45318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45319. "lsrs r7, %[b], #16\n\t"
  45320. #else
  45321. "lsr r7, %[b], #16\n\t"
  45322. #endif
  45323. #ifdef WOLFSSL_KEIL
  45324. "muls r7, r6, r7\n\t"
  45325. #elif defined(__clang__)
  45326. "muls r7, r6\n\t"
  45327. #else
  45328. "mul r7, r6\n\t"
  45329. #endif
  45330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45331. "adds r4, r4, r7\n\t"
  45332. #else
  45333. "add r4, r4, r7\n\t"
  45334. #endif
  45335. #ifdef WOLFSSL_KEIL
  45336. "adcs r5, r5, %[r]\n\t"
  45337. #elif defined(__clang__)
  45338. "adcs r5, %[r]\n\t"
  45339. #else
  45340. "adc r5, %[r]\n\t"
  45341. #endif
  45342. "uxth r7, %[b]\n\t"
  45343. #ifdef WOLFSSL_KEIL
  45344. "muls r6, r7, r6\n\t"
  45345. #elif defined(__clang__)
  45346. "muls r6, r7\n\t"
  45347. #else
  45348. "mul r6, r7\n\t"
  45349. #endif
  45350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45351. "lsrs r7, r6, #16\n\t"
  45352. #else
  45353. "lsr r7, r6, #16\n\t"
  45354. #endif
  45355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45356. "lsls r6, r6, #16\n\t"
  45357. #else
  45358. "lsl r6, r6, #16\n\t"
  45359. #endif
  45360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45361. "adds r3, r3, r6\n\t"
  45362. #else
  45363. "add r3, r3, r6\n\t"
  45364. #endif
  45365. #ifdef WOLFSSL_KEIL
  45366. "adcs r4, r4, r7\n\t"
  45367. #elif defined(__clang__)
  45368. "adcs r4, r7\n\t"
  45369. #else
  45370. "adc r4, r7\n\t"
  45371. #endif
  45372. #ifdef WOLFSSL_KEIL
  45373. "adcs r5, r5, %[r]\n\t"
  45374. #elif defined(__clang__)
  45375. "adcs r5, %[r]\n\t"
  45376. #else
  45377. "adc r5, %[r]\n\t"
  45378. #endif
  45379. "# A[6] * B[9]\n\t"
  45380. "mov %[a], r9\n\t"
  45381. "mov %[b], r10\n\t"
  45382. "ldr %[a], [%[a], #24]\n\t"
  45383. "ldr %[b], [%[b], #36]\n\t"
  45384. "uxth r6, %[a]\n\t"
  45385. "uxth r7, %[b]\n\t"
  45386. #ifdef WOLFSSL_KEIL
  45387. "muls r7, r6, r7\n\t"
  45388. #elif defined(__clang__)
  45389. "muls r7, r6\n\t"
  45390. #else
  45391. "mul r7, r6\n\t"
  45392. #endif
  45393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45394. "adds r3, r3, r7\n\t"
  45395. #else
  45396. "add r3, r3, r7\n\t"
  45397. #endif
  45398. #ifdef WOLFSSL_KEIL
  45399. "adcs r4, r4, %[r]\n\t"
  45400. #elif defined(__clang__)
  45401. "adcs r4, %[r]\n\t"
  45402. #else
  45403. "adc r4, %[r]\n\t"
  45404. #endif
  45405. #ifdef WOLFSSL_KEIL
  45406. "adcs r5, r5, %[r]\n\t"
  45407. #elif defined(__clang__)
  45408. "adcs r5, %[r]\n\t"
  45409. #else
  45410. "adc r5, %[r]\n\t"
  45411. #endif
  45412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45413. "lsrs r7, %[b], #16\n\t"
  45414. #else
  45415. "lsr r7, %[b], #16\n\t"
  45416. #endif
  45417. #ifdef WOLFSSL_KEIL
  45418. "muls r6, r7, r6\n\t"
  45419. #elif defined(__clang__)
  45420. "muls r6, r7\n\t"
  45421. #else
  45422. "mul r6, r7\n\t"
  45423. #endif
  45424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45425. "lsrs r7, r6, #16\n\t"
  45426. #else
  45427. "lsr r7, r6, #16\n\t"
  45428. #endif
  45429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45430. "lsls r6, r6, #16\n\t"
  45431. #else
  45432. "lsl r6, r6, #16\n\t"
  45433. #endif
  45434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45435. "adds r3, r3, r6\n\t"
  45436. #else
  45437. "add r3, r3, r6\n\t"
  45438. #endif
  45439. #ifdef WOLFSSL_KEIL
  45440. "adcs r4, r4, r7\n\t"
  45441. #elif defined(__clang__)
  45442. "adcs r4, r7\n\t"
  45443. #else
  45444. "adc r4, r7\n\t"
  45445. #endif
  45446. #ifdef WOLFSSL_KEIL
  45447. "adcs r5, r5, %[r]\n\t"
  45448. #elif defined(__clang__)
  45449. "adcs r5, %[r]\n\t"
  45450. #else
  45451. "adc r5, %[r]\n\t"
  45452. #endif
  45453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45454. "lsrs r6, %[a], #16\n\t"
  45455. #else
  45456. "lsr r6, %[a], #16\n\t"
  45457. #endif
  45458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45459. "lsrs r7, %[b], #16\n\t"
  45460. #else
  45461. "lsr r7, %[b], #16\n\t"
  45462. #endif
  45463. #ifdef WOLFSSL_KEIL
  45464. "muls r7, r6, r7\n\t"
  45465. #elif defined(__clang__)
  45466. "muls r7, r6\n\t"
  45467. #else
  45468. "mul r7, r6\n\t"
  45469. #endif
  45470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45471. "adds r4, r4, r7\n\t"
  45472. #else
  45473. "add r4, r4, r7\n\t"
  45474. #endif
  45475. #ifdef WOLFSSL_KEIL
  45476. "adcs r5, r5, %[r]\n\t"
  45477. #elif defined(__clang__)
  45478. "adcs r5, %[r]\n\t"
  45479. #else
  45480. "adc r5, %[r]\n\t"
  45481. #endif
  45482. "uxth r7, %[b]\n\t"
  45483. #ifdef WOLFSSL_KEIL
  45484. "muls r6, r7, r6\n\t"
  45485. #elif defined(__clang__)
  45486. "muls r6, r7\n\t"
  45487. #else
  45488. "mul r6, r7\n\t"
  45489. #endif
  45490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45491. "lsrs r7, r6, #16\n\t"
  45492. #else
  45493. "lsr r7, r6, #16\n\t"
  45494. #endif
  45495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45496. "lsls r6, r6, #16\n\t"
  45497. #else
  45498. "lsl r6, r6, #16\n\t"
  45499. #endif
  45500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45501. "adds r3, r3, r6\n\t"
  45502. #else
  45503. "add r3, r3, r6\n\t"
  45504. #endif
  45505. #ifdef WOLFSSL_KEIL
  45506. "adcs r4, r4, r7\n\t"
  45507. #elif defined(__clang__)
  45508. "adcs r4, r7\n\t"
  45509. #else
  45510. "adc r4, r7\n\t"
  45511. #endif
  45512. #ifdef WOLFSSL_KEIL
  45513. "adcs r5, r5, %[r]\n\t"
  45514. #elif defined(__clang__)
  45515. "adcs r5, %[r]\n\t"
  45516. #else
  45517. "adc r5, %[r]\n\t"
  45518. #endif
  45519. "# A[7] * B[8]\n\t"
  45520. "mov %[a], r9\n\t"
  45521. "mov %[b], r10\n\t"
  45522. "ldr %[a], [%[a], #28]\n\t"
  45523. "ldr %[b], [%[b], #32]\n\t"
  45524. "uxth r6, %[a]\n\t"
  45525. "uxth r7, %[b]\n\t"
  45526. #ifdef WOLFSSL_KEIL
  45527. "muls r7, r6, r7\n\t"
  45528. #elif defined(__clang__)
  45529. "muls r7, r6\n\t"
  45530. #else
  45531. "mul r7, r6\n\t"
  45532. #endif
  45533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45534. "adds r3, r3, r7\n\t"
  45535. #else
  45536. "add r3, r3, r7\n\t"
  45537. #endif
  45538. #ifdef WOLFSSL_KEIL
  45539. "adcs r4, r4, %[r]\n\t"
  45540. #elif defined(__clang__)
  45541. "adcs r4, %[r]\n\t"
  45542. #else
  45543. "adc r4, %[r]\n\t"
  45544. #endif
  45545. #ifdef WOLFSSL_KEIL
  45546. "adcs r5, r5, %[r]\n\t"
  45547. #elif defined(__clang__)
  45548. "adcs r5, %[r]\n\t"
  45549. #else
  45550. "adc r5, %[r]\n\t"
  45551. #endif
  45552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45553. "lsrs r7, %[b], #16\n\t"
  45554. #else
  45555. "lsr r7, %[b], #16\n\t"
  45556. #endif
  45557. #ifdef WOLFSSL_KEIL
  45558. "muls r6, r7, r6\n\t"
  45559. #elif defined(__clang__)
  45560. "muls r6, r7\n\t"
  45561. #else
  45562. "mul r6, r7\n\t"
  45563. #endif
  45564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45565. "lsrs r7, r6, #16\n\t"
  45566. #else
  45567. "lsr r7, r6, #16\n\t"
  45568. #endif
  45569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45570. "lsls r6, r6, #16\n\t"
  45571. #else
  45572. "lsl r6, r6, #16\n\t"
  45573. #endif
  45574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45575. "adds r3, r3, r6\n\t"
  45576. #else
  45577. "add r3, r3, r6\n\t"
  45578. #endif
  45579. #ifdef WOLFSSL_KEIL
  45580. "adcs r4, r4, r7\n\t"
  45581. #elif defined(__clang__)
  45582. "adcs r4, r7\n\t"
  45583. #else
  45584. "adc r4, r7\n\t"
  45585. #endif
  45586. #ifdef WOLFSSL_KEIL
  45587. "adcs r5, r5, %[r]\n\t"
  45588. #elif defined(__clang__)
  45589. "adcs r5, %[r]\n\t"
  45590. #else
  45591. "adc r5, %[r]\n\t"
  45592. #endif
  45593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45594. "lsrs r6, %[a], #16\n\t"
  45595. #else
  45596. "lsr r6, %[a], #16\n\t"
  45597. #endif
  45598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45599. "lsrs r7, %[b], #16\n\t"
  45600. #else
  45601. "lsr r7, %[b], #16\n\t"
  45602. #endif
  45603. #ifdef WOLFSSL_KEIL
  45604. "muls r7, r6, r7\n\t"
  45605. #elif defined(__clang__)
  45606. "muls r7, r6\n\t"
  45607. #else
  45608. "mul r7, r6\n\t"
  45609. #endif
  45610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45611. "adds r4, r4, r7\n\t"
  45612. #else
  45613. "add r4, r4, r7\n\t"
  45614. #endif
  45615. #ifdef WOLFSSL_KEIL
  45616. "adcs r5, r5, %[r]\n\t"
  45617. #elif defined(__clang__)
  45618. "adcs r5, %[r]\n\t"
  45619. #else
  45620. "adc r5, %[r]\n\t"
  45621. #endif
  45622. "uxth r7, %[b]\n\t"
  45623. #ifdef WOLFSSL_KEIL
  45624. "muls r6, r7, r6\n\t"
  45625. #elif defined(__clang__)
  45626. "muls r6, r7\n\t"
  45627. #else
  45628. "mul r6, r7\n\t"
  45629. #endif
  45630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45631. "lsrs r7, r6, #16\n\t"
  45632. #else
  45633. "lsr r7, r6, #16\n\t"
  45634. #endif
  45635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45636. "lsls r6, r6, #16\n\t"
  45637. #else
  45638. "lsl r6, r6, #16\n\t"
  45639. #endif
  45640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45641. "adds r3, r3, r6\n\t"
  45642. #else
  45643. "add r3, r3, r6\n\t"
  45644. #endif
  45645. #ifdef WOLFSSL_KEIL
  45646. "adcs r4, r4, r7\n\t"
  45647. #elif defined(__clang__)
  45648. "adcs r4, r7\n\t"
  45649. #else
  45650. "adc r4, r7\n\t"
  45651. #endif
  45652. #ifdef WOLFSSL_KEIL
  45653. "adcs r5, r5, %[r]\n\t"
  45654. #elif defined(__clang__)
  45655. "adcs r5, %[r]\n\t"
  45656. #else
  45657. "adc r5, %[r]\n\t"
  45658. #endif
  45659. "# A[8] * B[7]\n\t"
  45660. "mov %[a], r9\n\t"
  45661. "mov %[b], r10\n\t"
  45662. "ldr %[a], [%[a], #32]\n\t"
  45663. "ldr %[b], [%[b], #28]\n\t"
  45664. "uxth r6, %[a]\n\t"
  45665. "uxth r7, %[b]\n\t"
  45666. #ifdef WOLFSSL_KEIL
  45667. "muls r7, r6, r7\n\t"
  45668. #elif defined(__clang__)
  45669. "muls r7, r6\n\t"
  45670. #else
  45671. "mul r7, r6\n\t"
  45672. #endif
  45673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45674. "adds r3, r3, r7\n\t"
  45675. #else
  45676. "add r3, r3, r7\n\t"
  45677. #endif
  45678. #ifdef WOLFSSL_KEIL
  45679. "adcs r4, r4, %[r]\n\t"
  45680. #elif defined(__clang__)
  45681. "adcs r4, %[r]\n\t"
  45682. #else
  45683. "adc r4, %[r]\n\t"
  45684. #endif
  45685. #ifdef WOLFSSL_KEIL
  45686. "adcs r5, r5, %[r]\n\t"
  45687. #elif defined(__clang__)
  45688. "adcs r5, %[r]\n\t"
  45689. #else
  45690. "adc r5, %[r]\n\t"
  45691. #endif
  45692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45693. "lsrs r7, %[b], #16\n\t"
  45694. #else
  45695. "lsr r7, %[b], #16\n\t"
  45696. #endif
  45697. #ifdef WOLFSSL_KEIL
  45698. "muls r6, r7, r6\n\t"
  45699. #elif defined(__clang__)
  45700. "muls r6, r7\n\t"
  45701. #else
  45702. "mul r6, r7\n\t"
  45703. #endif
  45704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45705. "lsrs r7, r6, #16\n\t"
  45706. #else
  45707. "lsr r7, r6, #16\n\t"
  45708. #endif
  45709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45710. "lsls r6, r6, #16\n\t"
  45711. #else
  45712. "lsl r6, r6, #16\n\t"
  45713. #endif
  45714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45715. "adds r3, r3, r6\n\t"
  45716. #else
  45717. "add r3, r3, r6\n\t"
  45718. #endif
  45719. #ifdef WOLFSSL_KEIL
  45720. "adcs r4, r4, r7\n\t"
  45721. #elif defined(__clang__)
  45722. "adcs r4, r7\n\t"
  45723. #else
  45724. "adc r4, r7\n\t"
  45725. #endif
  45726. #ifdef WOLFSSL_KEIL
  45727. "adcs r5, r5, %[r]\n\t"
  45728. #elif defined(__clang__)
  45729. "adcs r5, %[r]\n\t"
  45730. #else
  45731. "adc r5, %[r]\n\t"
  45732. #endif
  45733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45734. "lsrs r6, %[a], #16\n\t"
  45735. #else
  45736. "lsr r6, %[a], #16\n\t"
  45737. #endif
  45738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45739. "lsrs r7, %[b], #16\n\t"
  45740. #else
  45741. "lsr r7, %[b], #16\n\t"
  45742. #endif
  45743. #ifdef WOLFSSL_KEIL
  45744. "muls r7, r6, r7\n\t"
  45745. #elif defined(__clang__)
  45746. "muls r7, r6\n\t"
  45747. #else
  45748. "mul r7, r6\n\t"
  45749. #endif
  45750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45751. "adds r4, r4, r7\n\t"
  45752. #else
  45753. "add r4, r4, r7\n\t"
  45754. #endif
  45755. #ifdef WOLFSSL_KEIL
  45756. "adcs r5, r5, %[r]\n\t"
  45757. #elif defined(__clang__)
  45758. "adcs r5, %[r]\n\t"
  45759. #else
  45760. "adc r5, %[r]\n\t"
  45761. #endif
  45762. "uxth r7, %[b]\n\t"
  45763. #ifdef WOLFSSL_KEIL
  45764. "muls r6, r7, r6\n\t"
  45765. #elif defined(__clang__)
  45766. "muls r6, r7\n\t"
  45767. #else
  45768. "mul r6, r7\n\t"
  45769. #endif
  45770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45771. "lsrs r7, r6, #16\n\t"
  45772. #else
  45773. "lsr r7, r6, #16\n\t"
  45774. #endif
  45775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45776. "lsls r6, r6, #16\n\t"
  45777. #else
  45778. "lsl r6, r6, #16\n\t"
  45779. #endif
  45780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45781. "adds r3, r3, r6\n\t"
  45782. #else
  45783. "add r3, r3, r6\n\t"
  45784. #endif
  45785. #ifdef WOLFSSL_KEIL
  45786. "adcs r4, r4, r7\n\t"
  45787. #elif defined(__clang__)
  45788. "adcs r4, r7\n\t"
  45789. #else
  45790. "adc r4, r7\n\t"
  45791. #endif
  45792. #ifdef WOLFSSL_KEIL
  45793. "adcs r5, r5, %[r]\n\t"
  45794. #elif defined(__clang__)
  45795. "adcs r5, %[r]\n\t"
  45796. #else
  45797. "adc r5, %[r]\n\t"
  45798. #endif
  45799. "# A[9] * B[6]\n\t"
  45800. "mov %[a], r9\n\t"
  45801. "mov %[b], r10\n\t"
  45802. "ldr %[a], [%[a], #36]\n\t"
  45803. "ldr %[b], [%[b], #24]\n\t"
  45804. "uxth r6, %[a]\n\t"
  45805. "uxth r7, %[b]\n\t"
  45806. #ifdef WOLFSSL_KEIL
  45807. "muls r7, r6, r7\n\t"
  45808. #elif defined(__clang__)
  45809. "muls r7, r6\n\t"
  45810. #else
  45811. "mul r7, r6\n\t"
  45812. #endif
  45813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45814. "adds r3, r3, r7\n\t"
  45815. #else
  45816. "add r3, r3, r7\n\t"
  45817. #endif
  45818. #ifdef WOLFSSL_KEIL
  45819. "adcs r4, r4, %[r]\n\t"
  45820. #elif defined(__clang__)
  45821. "adcs r4, %[r]\n\t"
  45822. #else
  45823. "adc r4, %[r]\n\t"
  45824. #endif
  45825. #ifdef WOLFSSL_KEIL
  45826. "adcs r5, r5, %[r]\n\t"
  45827. #elif defined(__clang__)
  45828. "adcs r5, %[r]\n\t"
  45829. #else
  45830. "adc r5, %[r]\n\t"
  45831. #endif
  45832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45833. "lsrs r7, %[b], #16\n\t"
  45834. #else
  45835. "lsr r7, %[b], #16\n\t"
  45836. #endif
  45837. #ifdef WOLFSSL_KEIL
  45838. "muls r6, r7, r6\n\t"
  45839. #elif defined(__clang__)
  45840. "muls r6, r7\n\t"
  45841. #else
  45842. "mul r6, r7\n\t"
  45843. #endif
  45844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45845. "lsrs r7, r6, #16\n\t"
  45846. #else
  45847. "lsr r7, r6, #16\n\t"
  45848. #endif
  45849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45850. "lsls r6, r6, #16\n\t"
  45851. #else
  45852. "lsl r6, r6, #16\n\t"
  45853. #endif
  45854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45855. "adds r3, r3, r6\n\t"
  45856. #else
  45857. "add r3, r3, r6\n\t"
  45858. #endif
  45859. #ifdef WOLFSSL_KEIL
  45860. "adcs r4, r4, r7\n\t"
  45861. #elif defined(__clang__)
  45862. "adcs r4, r7\n\t"
  45863. #else
  45864. "adc r4, r7\n\t"
  45865. #endif
  45866. #ifdef WOLFSSL_KEIL
  45867. "adcs r5, r5, %[r]\n\t"
  45868. #elif defined(__clang__)
  45869. "adcs r5, %[r]\n\t"
  45870. #else
  45871. "adc r5, %[r]\n\t"
  45872. #endif
  45873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45874. "lsrs r6, %[a], #16\n\t"
  45875. #else
  45876. "lsr r6, %[a], #16\n\t"
  45877. #endif
  45878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45879. "lsrs r7, %[b], #16\n\t"
  45880. #else
  45881. "lsr r7, %[b], #16\n\t"
  45882. #endif
  45883. #ifdef WOLFSSL_KEIL
  45884. "muls r7, r6, r7\n\t"
  45885. #elif defined(__clang__)
  45886. "muls r7, r6\n\t"
  45887. #else
  45888. "mul r7, r6\n\t"
  45889. #endif
  45890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45891. "adds r4, r4, r7\n\t"
  45892. #else
  45893. "add r4, r4, r7\n\t"
  45894. #endif
  45895. #ifdef WOLFSSL_KEIL
  45896. "adcs r5, r5, %[r]\n\t"
  45897. #elif defined(__clang__)
  45898. "adcs r5, %[r]\n\t"
  45899. #else
  45900. "adc r5, %[r]\n\t"
  45901. #endif
  45902. "uxth r7, %[b]\n\t"
  45903. #ifdef WOLFSSL_KEIL
  45904. "muls r6, r7, r6\n\t"
  45905. #elif defined(__clang__)
  45906. "muls r6, r7\n\t"
  45907. #else
  45908. "mul r6, r7\n\t"
  45909. #endif
  45910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45911. "lsrs r7, r6, #16\n\t"
  45912. #else
  45913. "lsr r7, r6, #16\n\t"
  45914. #endif
  45915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45916. "lsls r6, r6, #16\n\t"
  45917. #else
  45918. "lsl r6, r6, #16\n\t"
  45919. #endif
  45920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45921. "adds r3, r3, r6\n\t"
  45922. #else
  45923. "add r3, r3, r6\n\t"
  45924. #endif
  45925. #ifdef WOLFSSL_KEIL
  45926. "adcs r4, r4, r7\n\t"
  45927. #elif defined(__clang__)
  45928. "adcs r4, r7\n\t"
  45929. #else
  45930. "adc r4, r7\n\t"
  45931. #endif
  45932. #ifdef WOLFSSL_KEIL
  45933. "adcs r5, r5, %[r]\n\t"
  45934. #elif defined(__clang__)
  45935. "adcs r5, %[r]\n\t"
  45936. #else
  45937. "adc r5, %[r]\n\t"
  45938. #endif
  45939. "# A[10] * B[5]\n\t"
  45940. "mov %[a], r9\n\t"
  45941. "mov %[b], r10\n\t"
  45942. "ldr %[a], [%[a], #40]\n\t"
  45943. "ldr %[b], [%[b], #20]\n\t"
  45944. "uxth r6, %[a]\n\t"
  45945. "uxth r7, %[b]\n\t"
  45946. #ifdef WOLFSSL_KEIL
  45947. "muls r7, r6, r7\n\t"
  45948. #elif defined(__clang__)
  45949. "muls r7, r6\n\t"
  45950. #else
  45951. "mul r7, r6\n\t"
  45952. #endif
  45953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45954. "adds r3, r3, r7\n\t"
  45955. #else
  45956. "add r3, r3, r7\n\t"
  45957. #endif
  45958. #ifdef WOLFSSL_KEIL
  45959. "adcs r4, r4, %[r]\n\t"
  45960. #elif defined(__clang__)
  45961. "adcs r4, %[r]\n\t"
  45962. #else
  45963. "adc r4, %[r]\n\t"
  45964. #endif
  45965. #ifdef WOLFSSL_KEIL
  45966. "adcs r5, r5, %[r]\n\t"
  45967. #elif defined(__clang__)
  45968. "adcs r5, %[r]\n\t"
  45969. #else
  45970. "adc r5, %[r]\n\t"
  45971. #endif
  45972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45973. "lsrs r7, %[b], #16\n\t"
  45974. #else
  45975. "lsr r7, %[b], #16\n\t"
  45976. #endif
  45977. #ifdef WOLFSSL_KEIL
  45978. "muls r6, r7, r6\n\t"
  45979. #elif defined(__clang__)
  45980. "muls r6, r7\n\t"
  45981. #else
  45982. "mul r6, r7\n\t"
  45983. #endif
  45984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45985. "lsrs r7, r6, #16\n\t"
  45986. #else
  45987. "lsr r7, r6, #16\n\t"
  45988. #endif
  45989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45990. "lsls r6, r6, #16\n\t"
  45991. #else
  45992. "lsl r6, r6, #16\n\t"
  45993. #endif
  45994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45995. "adds r3, r3, r6\n\t"
  45996. #else
  45997. "add r3, r3, r6\n\t"
  45998. #endif
  45999. #ifdef WOLFSSL_KEIL
  46000. "adcs r4, r4, r7\n\t"
  46001. #elif defined(__clang__)
  46002. "adcs r4, r7\n\t"
  46003. #else
  46004. "adc r4, r7\n\t"
  46005. #endif
  46006. #ifdef WOLFSSL_KEIL
  46007. "adcs r5, r5, %[r]\n\t"
  46008. #elif defined(__clang__)
  46009. "adcs r5, %[r]\n\t"
  46010. #else
  46011. "adc r5, %[r]\n\t"
  46012. #endif
  46013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46014. "lsrs r6, %[a], #16\n\t"
  46015. #else
  46016. "lsr r6, %[a], #16\n\t"
  46017. #endif
  46018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46019. "lsrs r7, %[b], #16\n\t"
  46020. #else
  46021. "lsr r7, %[b], #16\n\t"
  46022. #endif
  46023. #ifdef WOLFSSL_KEIL
  46024. "muls r7, r6, r7\n\t"
  46025. #elif defined(__clang__)
  46026. "muls r7, r6\n\t"
  46027. #else
  46028. "mul r7, r6\n\t"
  46029. #endif
  46030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46031. "adds r4, r4, r7\n\t"
  46032. #else
  46033. "add r4, r4, r7\n\t"
  46034. #endif
  46035. #ifdef WOLFSSL_KEIL
  46036. "adcs r5, r5, %[r]\n\t"
  46037. #elif defined(__clang__)
  46038. "adcs r5, %[r]\n\t"
  46039. #else
  46040. "adc r5, %[r]\n\t"
  46041. #endif
  46042. "uxth r7, %[b]\n\t"
  46043. #ifdef WOLFSSL_KEIL
  46044. "muls r6, r7, r6\n\t"
  46045. #elif defined(__clang__)
  46046. "muls r6, r7\n\t"
  46047. #else
  46048. "mul r6, r7\n\t"
  46049. #endif
  46050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46051. "lsrs r7, r6, #16\n\t"
  46052. #else
  46053. "lsr r7, r6, #16\n\t"
  46054. #endif
  46055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46056. "lsls r6, r6, #16\n\t"
  46057. #else
  46058. "lsl r6, r6, #16\n\t"
  46059. #endif
  46060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46061. "adds r3, r3, r6\n\t"
  46062. #else
  46063. "add r3, r3, r6\n\t"
  46064. #endif
  46065. #ifdef WOLFSSL_KEIL
  46066. "adcs r4, r4, r7\n\t"
  46067. #elif defined(__clang__)
  46068. "adcs r4, r7\n\t"
  46069. #else
  46070. "adc r4, r7\n\t"
  46071. #endif
  46072. #ifdef WOLFSSL_KEIL
  46073. "adcs r5, r5, %[r]\n\t"
  46074. #elif defined(__clang__)
  46075. "adcs r5, %[r]\n\t"
  46076. #else
  46077. "adc r5, %[r]\n\t"
  46078. #endif
  46079. "# A[11] * B[4]\n\t"
  46080. "mov %[a], r9\n\t"
  46081. "mov %[b], r10\n\t"
  46082. "ldr %[a], [%[a], #44]\n\t"
  46083. "ldr %[b], [%[b], #16]\n\t"
  46084. "uxth r6, %[a]\n\t"
  46085. "uxth r7, %[b]\n\t"
  46086. #ifdef WOLFSSL_KEIL
  46087. "muls r7, r6, r7\n\t"
  46088. #elif defined(__clang__)
  46089. "muls r7, r6\n\t"
  46090. #else
  46091. "mul r7, r6\n\t"
  46092. #endif
  46093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46094. "adds r3, r3, r7\n\t"
  46095. #else
  46096. "add r3, r3, r7\n\t"
  46097. #endif
  46098. #ifdef WOLFSSL_KEIL
  46099. "adcs r4, r4, %[r]\n\t"
  46100. #elif defined(__clang__)
  46101. "adcs r4, %[r]\n\t"
  46102. #else
  46103. "adc r4, %[r]\n\t"
  46104. #endif
  46105. #ifdef WOLFSSL_KEIL
  46106. "adcs r5, r5, %[r]\n\t"
  46107. #elif defined(__clang__)
  46108. "adcs r5, %[r]\n\t"
  46109. #else
  46110. "adc r5, %[r]\n\t"
  46111. #endif
  46112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46113. "lsrs r7, %[b], #16\n\t"
  46114. #else
  46115. "lsr r7, %[b], #16\n\t"
  46116. #endif
  46117. #ifdef WOLFSSL_KEIL
  46118. "muls r6, r7, r6\n\t"
  46119. #elif defined(__clang__)
  46120. "muls r6, r7\n\t"
  46121. #else
  46122. "mul r6, r7\n\t"
  46123. #endif
  46124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46125. "lsrs r7, r6, #16\n\t"
  46126. #else
  46127. "lsr r7, r6, #16\n\t"
  46128. #endif
  46129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46130. "lsls r6, r6, #16\n\t"
  46131. #else
  46132. "lsl r6, r6, #16\n\t"
  46133. #endif
  46134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46135. "adds r3, r3, r6\n\t"
  46136. #else
  46137. "add r3, r3, r6\n\t"
  46138. #endif
  46139. #ifdef WOLFSSL_KEIL
  46140. "adcs r4, r4, r7\n\t"
  46141. #elif defined(__clang__)
  46142. "adcs r4, r7\n\t"
  46143. #else
  46144. "adc r4, r7\n\t"
  46145. #endif
  46146. #ifdef WOLFSSL_KEIL
  46147. "adcs r5, r5, %[r]\n\t"
  46148. #elif defined(__clang__)
  46149. "adcs r5, %[r]\n\t"
  46150. #else
  46151. "adc r5, %[r]\n\t"
  46152. #endif
  46153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46154. "lsrs r6, %[a], #16\n\t"
  46155. #else
  46156. "lsr r6, %[a], #16\n\t"
  46157. #endif
  46158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46159. "lsrs r7, %[b], #16\n\t"
  46160. #else
  46161. "lsr r7, %[b], #16\n\t"
  46162. #endif
  46163. #ifdef WOLFSSL_KEIL
  46164. "muls r7, r6, r7\n\t"
  46165. #elif defined(__clang__)
  46166. "muls r7, r6\n\t"
  46167. #else
  46168. "mul r7, r6\n\t"
  46169. #endif
  46170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46171. "adds r4, r4, r7\n\t"
  46172. #else
  46173. "add r4, r4, r7\n\t"
  46174. #endif
  46175. #ifdef WOLFSSL_KEIL
  46176. "adcs r5, r5, %[r]\n\t"
  46177. #elif defined(__clang__)
  46178. "adcs r5, %[r]\n\t"
  46179. #else
  46180. "adc r5, %[r]\n\t"
  46181. #endif
  46182. "uxth r7, %[b]\n\t"
  46183. #ifdef WOLFSSL_KEIL
  46184. "muls r6, r7, r6\n\t"
  46185. #elif defined(__clang__)
  46186. "muls r6, r7\n\t"
  46187. #else
  46188. "mul r6, r7\n\t"
  46189. #endif
  46190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46191. "lsrs r7, r6, #16\n\t"
  46192. #else
  46193. "lsr r7, r6, #16\n\t"
  46194. #endif
  46195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46196. "lsls r6, r6, #16\n\t"
  46197. #else
  46198. "lsl r6, r6, #16\n\t"
  46199. #endif
  46200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46201. "adds r3, r3, r6\n\t"
  46202. #else
  46203. "add r3, r3, r6\n\t"
  46204. #endif
  46205. #ifdef WOLFSSL_KEIL
  46206. "adcs r4, r4, r7\n\t"
  46207. #elif defined(__clang__)
  46208. "adcs r4, r7\n\t"
  46209. #else
  46210. "adc r4, r7\n\t"
  46211. #endif
  46212. #ifdef WOLFSSL_KEIL
  46213. "adcs r5, r5, %[r]\n\t"
  46214. #elif defined(__clang__)
  46215. "adcs r5, %[r]\n\t"
  46216. #else
  46217. "adc r5, %[r]\n\t"
  46218. #endif
  46219. "mov %[r], r8\n\t"
  46220. "str r3, [%[r], #60]\n\t"
  46221. "movs %[r], #0\n\t"
  46222. "# A[11] * B[5]\n\t"
  46223. "movs r3, #0\n\t"
  46224. "mov %[a], r9\n\t"
  46225. "mov %[b], r10\n\t"
  46226. "ldr %[a], [%[a], #44]\n\t"
  46227. "ldr %[b], [%[b], #20]\n\t"
  46228. "uxth r6, %[a]\n\t"
  46229. "uxth r7, %[b]\n\t"
  46230. #ifdef WOLFSSL_KEIL
  46231. "muls r7, r6, r7\n\t"
  46232. #elif defined(__clang__)
  46233. "muls r7, r6\n\t"
  46234. #else
  46235. "mul r7, r6\n\t"
  46236. #endif
  46237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46238. "adds r4, r4, r7\n\t"
  46239. #else
  46240. "add r4, r4, r7\n\t"
  46241. #endif
  46242. #ifdef WOLFSSL_KEIL
  46243. "adcs r5, r5, %[r]\n\t"
  46244. #elif defined(__clang__)
  46245. "adcs r5, %[r]\n\t"
  46246. #else
  46247. "adc r5, %[r]\n\t"
  46248. #endif
  46249. #ifdef WOLFSSL_KEIL
  46250. "adcs r3, r3, %[r]\n\t"
  46251. #elif defined(__clang__)
  46252. "adcs r3, %[r]\n\t"
  46253. #else
  46254. "adc r3, %[r]\n\t"
  46255. #endif
  46256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46257. "lsrs r7, %[b], #16\n\t"
  46258. #else
  46259. "lsr r7, %[b], #16\n\t"
  46260. #endif
  46261. #ifdef WOLFSSL_KEIL
  46262. "muls r6, r7, r6\n\t"
  46263. #elif defined(__clang__)
  46264. "muls r6, r7\n\t"
  46265. #else
  46266. "mul r6, r7\n\t"
  46267. #endif
  46268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46269. "lsrs r7, r6, #16\n\t"
  46270. #else
  46271. "lsr r7, r6, #16\n\t"
  46272. #endif
  46273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46274. "lsls r6, r6, #16\n\t"
  46275. #else
  46276. "lsl r6, r6, #16\n\t"
  46277. #endif
  46278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46279. "adds r4, r4, r6\n\t"
  46280. #else
  46281. "add r4, r4, r6\n\t"
  46282. #endif
  46283. #ifdef WOLFSSL_KEIL
  46284. "adcs r5, r5, r7\n\t"
  46285. #elif defined(__clang__)
  46286. "adcs r5, r7\n\t"
  46287. #else
  46288. "adc r5, r7\n\t"
  46289. #endif
  46290. #ifdef WOLFSSL_KEIL
  46291. "adcs r3, r3, %[r]\n\t"
  46292. #elif defined(__clang__)
  46293. "adcs r3, %[r]\n\t"
  46294. #else
  46295. "adc r3, %[r]\n\t"
  46296. #endif
  46297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46298. "lsrs r6, %[a], #16\n\t"
  46299. #else
  46300. "lsr r6, %[a], #16\n\t"
  46301. #endif
  46302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46303. "lsrs r7, %[b], #16\n\t"
  46304. #else
  46305. "lsr r7, %[b], #16\n\t"
  46306. #endif
  46307. #ifdef WOLFSSL_KEIL
  46308. "muls r7, r6, r7\n\t"
  46309. #elif defined(__clang__)
  46310. "muls r7, r6\n\t"
  46311. #else
  46312. "mul r7, r6\n\t"
  46313. #endif
  46314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46315. "adds r5, r5, r7\n\t"
  46316. #else
  46317. "add r5, r5, r7\n\t"
  46318. #endif
  46319. #ifdef WOLFSSL_KEIL
  46320. "adcs r3, r3, %[r]\n\t"
  46321. #elif defined(__clang__)
  46322. "adcs r3, %[r]\n\t"
  46323. #else
  46324. "adc r3, %[r]\n\t"
  46325. #endif
  46326. "uxth r7, %[b]\n\t"
  46327. #ifdef WOLFSSL_KEIL
  46328. "muls r6, r7, r6\n\t"
  46329. #elif defined(__clang__)
  46330. "muls r6, r7\n\t"
  46331. #else
  46332. "mul r6, r7\n\t"
  46333. #endif
  46334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46335. "lsrs r7, r6, #16\n\t"
  46336. #else
  46337. "lsr r7, r6, #16\n\t"
  46338. #endif
  46339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46340. "lsls r6, r6, #16\n\t"
  46341. #else
  46342. "lsl r6, r6, #16\n\t"
  46343. #endif
  46344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46345. "adds r4, r4, r6\n\t"
  46346. #else
  46347. "add r4, r4, r6\n\t"
  46348. #endif
  46349. #ifdef WOLFSSL_KEIL
  46350. "adcs r5, r5, r7\n\t"
  46351. #elif defined(__clang__)
  46352. "adcs r5, r7\n\t"
  46353. #else
  46354. "adc r5, r7\n\t"
  46355. #endif
  46356. #ifdef WOLFSSL_KEIL
  46357. "adcs r3, r3, %[r]\n\t"
  46358. #elif defined(__clang__)
  46359. "adcs r3, %[r]\n\t"
  46360. #else
  46361. "adc r3, %[r]\n\t"
  46362. #endif
  46363. "# A[10] * B[6]\n\t"
  46364. "mov %[a], r9\n\t"
  46365. "mov %[b], r10\n\t"
  46366. "ldr %[a], [%[a], #40]\n\t"
  46367. "ldr %[b], [%[b], #24]\n\t"
  46368. "uxth r6, %[a]\n\t"
  46369. "uxth r7, %[b]\n\t"
  46370. #ifdef WOLFSSL_KEIL
  46371. "muls r7, r6, r7\n\t"
  46372. #elif defined(__clang__)
  46373. "muls r7, r6\n\t"
  46374. #else
  46375. "mul r7, r6\n\t"
  46376. #endif
  46377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46378. "adds r4, r4, r7\n\t"
  46379. #else
  46380. "add r4, r4, r7\n\t"
  46381. #endif
  46382. #ifdef WOLFSSL_KEIL
  46383. "adcs r5, r5, %[r]\n\t"
  46384. #elif defined(__clang__)
  46385. "adcs r5, %[r]\n\t"
  46386. #else
  46387. "adc r5, %[r]\n\t"
  46388. #endif
  46389. #ifdef WOLFSSL_KEIL
  46390. "adcs r3, r3, %[r]\n\t"
  46391. #elif defined(__clang__)
  46392. "adcs r3, %[r]\n\t"
  46393. #else
  46394. "adc r3, %[r]\n\t"
  46395. #endif
  46396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46397. "lsrs r7, %[b], #16\n\t"
  46398. #else
  46399. "lsr r7, %[b], #16\n\t"
  46400. #endif
  46401. #ifdef WOLFSSL_KEIL
  46402. "muls r6, r7, r6\n\t"
  46403. #elif defined(__clang__)
  46404. "muls r6, r7\n\t"
  46405. #else
  46406. "mul r6, r7\n\t"
  46407. #endif
  46408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46409. "lsrs r7, r6, #16\n\t"
  46410. #else
  46411. "lsr r7, r6, #16\n\t"
  46412. #endif
  46413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46414. "lsls r6, r6, #16\n\t"
  46415. #else
  46416. "lsl r6, r6, #16\n\t"
  46417. #endif
  46418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46419. "adds r4, r4, r6\n\t"
  46420. #else
  46421. "add r4, r4, r6\n\t"
  46422. #endif
  46423. #ifdef WOLFSSL_KEIL
  46424. "adcs r5, r5, r7\n\t"
  46425. #elif defined(__clang__)
  46426. "adcs r5, r7\n\t"
  46427. #else
  46428. "adc r5, r7\n\t"
  46429. #endif
  46430. #ifdef WOLFSSL_KEIL
  46431. "adcs r3, r3, %[r]\n\t"
  46432. #elif defined(__clang__)
  46433. "adcs r3, %[r]\n\t"
  46434. #else
  46435. "adc r3, %[r]\n\t"
  46436. #endif
  46437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46438. "lsrs r6, %[a], #16\n\t"
  46439. #else
  46440. "lsr r6, %[a], #16\n\t"
  46441. #endif
  46442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46443. "lsrs r7, %[b], #16\n\t"
  46444. #else
  46445. "lsr r7, %[b], #16\n\t"
  46446. #endif
  46447. #ifdef WOLFSSL_KEIL
  46448. "muls r7, r6, r7\n\t"
  46449. #elif defined(__clang__)
  46450. "muls r7, r6\n\t"
  46451. #else
  46452. "mul r7, r6\n\t"
  46453. #endif
  46454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46455. "adds r5, r5, r7\n\t"
  46456. #else
  46457. "add r5, r5, r7\n\t"
  46458. #endif
  46459. #ifdef WOLFSSL_KEIL
  46460. "adcs r3, r3, %[r]\n\t"
  46461. #elif defined(__clang__)
  46462. "adcs r3, %[r]\n\t"
  46463. #else
  46464. "adc r3, %[r]\n\t"
  46465. #endif
  46466. "uxth r7, %[b]\n\t"
  46467. #ifdef WOLFSSL_KEIL
  46468. "muls r6, r7, r6\n\t"
  46469. #elif defined(__clang__)
  46470. "muls r6, r7\n\t"
  46471. #else
  46472. "mul r6, r7\n\t"
  46473. #endif
  46474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46475. "lsrs r7, r6, #16\n\t"
  46476. #else
  46477. "lsr r7, r6, #16\n\t"
  46478. #endif
  46479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46480. "lsls r6, r6, #16\n\t"
  46481. #else
  46482. "lsl r6, r6, #16\n\t"
  46483. #endif
  46484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46485. "adds r4, r4, r6\n\t"
  46486. #else
  46487. "add r4, r4, r6\n\t"
  46488. #endif
  46489. #ifdef WOLFSSL_KEIL
  46490. "adcs r5, r5, r7\n\t"
  46491. #elif defined(__clang__)
  46492. "adcs r5, r7\n\t"
  46493. #else
  46494. "adc r5, r7\n\t"
  46495. #endif
  46496. #ifdef WOLFSSL_KEIL
  46497. "adcs r3, r3, %[r]\n\t"
  46498. #elif defined(__clang__)
  46499. "adcs r3, %[r]\n\t"
  46500. #else
  46501. "adc r3, %[r]\n\t"
  46502. #endif
  46503. "# A[9] * B[7]\n\t"
  46504. "mov %[a], r9\n\t"
  46505. "mov %[b], r10\n\t"
  46506. "ldr %[a], [%[a], #36]\n\t"
  46507. "ldr %[b], [%[b], #28]\n\t"
  46508. "uxth r6, %[a]\n\t"
  46509. "uxth r7, %[b]\n\t"
  46510. #ifdef WOLFSSL_KEIL
  46511. "muls r7, r6, r7\n\t"
  46512. #elif defined(__clang__)
  46513. "muls r7, r6\n\t"
  46514. #else
  46515. "mul r7, r6\n\t"
  46516. #endif
  46517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46518. "adds r4, r4, r7\n\t"
  46519. #else
  46520. "add r4, r4, r7\n\t"
  46521. #endif
  46522. #ifdef WOLFSSL_KEIL
  46523. "adcs r5, r5, %[r]\n\t"
  46524. #elif defined(__clang__)
  46525. "adcs r5, %[r]\n\t"
  46526. #else
  46527. "adc r5, %[r]\n\t"
  46528. #endif
  46529. #ifdef WOLFSSL_KEIL
  46530. "adcs r3, r3, %[r]\n\t"
  46531. #elif defined(__clang__)
  46532. "adcs r3, %[r]\n\t"
  46533. #else
  46534. "adc r3, %[r]\n\t"
  46535. #endif
  46536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46537. "lsrs r7, %[b], #16\n\t"
  46538. #else
  46539. "lsr r7, %[b], #16\n\t"
  46540. #endif
  46541. #ifdef WOLFSSL_KEIL
  46542. "muls r6, r7, r6\n\t"
  46543. #elif defined(__clang__)
  46544. "muls r6, r7\n\t"
  46545. #else
  46546. "mul r6, r7\n\t"
  46547. #endif
  46548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46549. "lsrs r7, r6, #16\n\t"
  46550. #else
  46551. "lsr r7, r6, #16\n\t"
  46552. #endif
  46553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46554. "lsls r6, r6, #16\n\t"
  46555. #else
  46556. "lsl r6, r6, #16\n\t"
  46557. #endif
  46558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46559. "adds r4, r4, r6\n\t"
  46560. #else
  46561. "add r4, r4, r6\n\t"
  46562. #endif
  46563. #ifdef WOLFSSL_KEIL
  46564. "adcs r5, r5, r7\n\t"
  46565. #elif defined(__clang__)
  46566. "adcs r5, r7\n\t"
  46567. #else
  46568. "adc r5, r7\n\t"
  46569. #endif
  46570. #ifdef WOLFSSL_KEIL
  46571. "adcs r3, r3, %[r]\n\t"
  46572. #elif defined(__clang__)
  46573. "adcs r3, %[r]\n\t"
  46574. #else
  46575. "adc r3, %[r]\n\t"
  46576. #endif
  46577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46578. "lsrs r6, %[a], #16\n\t"
  46579. #else
  46580. "lsr r6, %[a], #16\n\t"
  46581. #endif
  46582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46583. "lsrs r7, %[b], #16\n\t"
  46584. #else
  46585. "lsr r7, %[b], #16\n\t"
  46586. #endif
  46587. #ifdef WOLFSSL_KEIL
  46588. "muls r7, r6, r7\n\t"
  46589. #elif defined(__clang__)
  46590. "muls r7, r6\n\t"
  46591. #else
  46592. "mul r7, r6\n\t"
  46593. #endif
  46594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46595. "adds r5, r5, r7\n\t"
  46596. #else
  46597. "add r5, r5, r7\n\t"
  46598. #endif
  46599. #ifdef WOLFSSL_KEIL
  46600. "adcs r3, r3, %[r]\n\t"
  46601. #elif defined(__clang__)
  46602. "adcs r3, %[r]\n\t"
  46603. #else
  46604. "adc r3, %[r]\n\t"
  46605. #endif
  46606. "uxth r7, %[b]\n\t"
  46607. #ifdef WOLFSSL_KEIL
  46608. "muls r6, r7, r6\n\t"
  46609. #elif defined(__clang__)
  46610. "muls r6, r7\n\t"
  46611. #else
  46612. "mul r6, r7\n\t"
  46613. #endif
  46614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46615. "lsrs r7, r6, #16\n\t"
  46616. #else
  46617. "lsr r7, r6, #16\n\t"
  46618. #endif
  46619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46620. "lsls r6, r6, #16\n\t"
  46621. #else
  46622. "lsl r6, r6, #16\n\t"
  46623. #endif
  46624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46625. "adds r4, r4, r6\n\t"
  46626. #else
  46627. "add r4, r4, r6\n\t"
  46628. #endif
  46629. #ifdef WOLFSSL_KEIL
  46630. "adcs r5, r5, r7\n\t"
  46631. #elif defined(__clang__)
  46632. "adcs r5, r7\n\t"
  46633. #else
  46634. "adc r5, r7\n\t"
  46635. #endif
  46636. #ifdef WOLFSSL_KEIL
  46637. "adcs r3, r3, %[r]\n\t"
  46638. #elif defined(__clang__)
  46639. "adcs r3, %[r]\n\t"
  46640. #else
  46641. "adc r3, %[r]\n\t"
  46642. #endif
  46643. "# A[8] * B[8]\n\t"
  46644. "mov %[a], r9\n\t"
  46645. "mov %[b], r10\n\t"
  46646. "ldr %[a], [%[a], #32]\n\t"
  46647. "ldr %[b], [%[b], #32]\n\t"
  46648. "uxth r6, %[a]\n\t"
  46649. "uxth r7, %[b]\n\t"
  46650. #ifdef WOLFSSL_KEIL
  46651. "muls r7, r6, r7\n\t"
  46652. #elif defined(__clang__)
  46653. "muls r7, r6\n\t"
  46654. #else
  46655. "mul r7, r6\n\t"
  46656. #endif
  46657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46658. "adds r4, r4, r7\n\t"
  46659. #else
  46660. "add r4, r4, r7\n\t"
  46661. #endif
  46662. #ifdef WOLFSSL_KEIL
  46663. "adcs r5, r5, %[r]\n\t"
  46664. #elif defined(__clang__)
  46665. "adcs r5, %[r]\n\t"
  46666. #else
  46667. "adc r5, %[r]\n\t"
  46668. #endif
  46669. #ifdef WOLFSSL_KEIL
  46670. "adcs r3, r3, %[r]\n\t"
  46671. #elif defined(__clang__)
  46672. "adcs r3, %[r]\n\t"
  46673. #else
  46674. "adc r3, %[r]\n\t"
  46675. #endif
  46676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46677. "lsrs r7, %[b], #16\n\t"
  46678. #else
  46679. "lsr r7, %[b], #16\n\t"
  46680. #endif
  46681. #ifdef WOLFSSL_KEIL
  46682. "muls r6, r7, r6\n\t"
  46683. #elif defined(__clang__)
  46684. "muls r6, r7\n\t"
  46685. #else
  46686. "mul r6, r7\n\t"
  46687. #endif
  46688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46689. "lsrs r7, r6, #16\n\t"
  46690. #else
  46691. "lsr r7, r6, #16\n\t"
  46692. #endif
  46693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46694. "lsls r6, r6, #16\n\t"
  46695. #else
  46696. "lsl r6, r6, #16\n\t"
  46697. #endif
  46698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46699. "adds r4, r4, r6\n\t"
  46700. #else
  46701. "add r4, r4, r6\n\t"
  46702. #endif
  46703. #ifdef WOLFSSL_KEIL
  46704. "adcs r5, r5, r7\n\t"
  46705. #elif defined(__clang__)
  46706. "adcs r5, r7\n\t"
  46707. #else
  46708. "adc r5, r7\n\t"
  46709. #endif
  46710. #ifdef WOLFSSL_KEIL
  46711. "adcs r3, r3, %[r]\n\t"
  46712. #elif defined(__clang__)
  46713. "adcs r3, %[r]\n\t"
  46714. #else
  46715. "adc r3, %[r]\n\t"
  46716. #endif
  46717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46718. "lsrs r6, %[a], #16\n\t"
  46719. #else
  46720. "lsr r6, %[a], #16\n\t"
  46721. #endif
  46722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46723. "lsrs r7, %[b], #16\n\t"
  46724. #else
  46725. "lsr r7, %[b], #16\n\t"
  46726. #endif
  46727. #ifdef WOLFSSL_KEIL
  46728. "muls r7, r6, r7\n\t"
  46729. #elif defined(__clang__)
  46730. "muls r7, r6\n\t"
  46731. #else
  46732. "mul r7, r6\n\t"
  46733. #endif
  46734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46735. "adds r5, r5, r7\n\t"
  46736. #else
  46737. "add r5, r5, r7\n\t"
  46738. #endif
  46739. #ifdef WOLFSSL_KEIL
  46740. "adcs r3, r3, %[r]\n\t"
  46741. #elif defined(__clang__)
  46742. "adcs r3, %[r]\n\t"
  46743. #else
  46744. "adc r3, %[r]\n\t"
  46745. #endif
  46746. "uxth r7, %[b]\n\t"
  46747. #ifdef WOLFSSL_KEIL
  46748. "muls r6, r7, r6\n\t"
  46749. #elif defined(__clang__)
  46750. "muls r6, r7\n\t"
  46751. #else
  46752. "mul r6, r7\n\t"
  46753. #endif
  46754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46755. "lsrs r7, r6, #16\n\t"
  46756. #else
  46757. "lsr r7, r6, #16\n\t"
  46758. #endif
  46759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46760. "lsls r6, r6, #16\n\t"
  46761. #else
  46762. "lsl r6, r6, #16\n\t"
  46763. #endif
  46764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46765. "adds r4, r4, r6\n\t"
  46766. #else
  46767. "add r4, r4, r6\n\t"
  46768. #endif
  46769. #ifdef WOLFSSL_KEIL
  46770. "adcs r5, r5, r7\n\t"
  46771. #elif defined(__clang__)
  46772. "adcs r5, r7\n\t"
  46773. #else
  46774. "adc r5, r7\n\t"
  46775. #endif
  46776. #ifdef WOLFSSL_KEIL
  46777. "adcs r3, r3, %[r]\n\t"
  46778. #elif defined(__clang__)
  46779. "adcs r3, %[r]\n\t"
  46780. #else
  46781. "adc r3, %[r]\n\t"
  46782. #endif
  46783. "# A[7] * B[9]\n\t"
  46784. "mov %[a], r9\n\t"
  46785. "mov %[b], r10\n\t"
  46786. "ldr %[a], [%[a], #28]\n\t"
  46787. "ldr %[b], [%[b], #36]\n\t"
  46788. "uxth r6, %[a]\n\t"
  46789. "uxth r7, %[b]\n\t"
  46790. #ifdef WOLFSSL_KEIL
  46791. "muls r7, r6, r7\n\t"
  46792. #elif defined(__clang__)
  46793. "muls r7, r6\n\t"
  46794. #else
  46795. "mul r7, r6\n\t"
  46796. #endif
  46797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46798. "adds r4, r4, r7\n\t"
  46799. #else
  46800. "add r4, r4, r7\n\t"
  46801. #endif
  46802. #ifdef WOLFSSL_KEIL
  46803. "adcs r5, r5, %[r]\n\t"
  46804. #elif defined(__clang__)
  46805. "adcs r5, %[r]\n\t"
  46806. #else
  46807. "adc r5, %[r]\n\t"
  46808. #endif
  46809. #ifdef WOLFSSL_KEIL
  46810. "adcs r3, r3, %[r]\n\t"
  46811. #elif defined(__clang__)
  46812. "adcs r3, %[r]\n\t"
  46813. #else
  46814. "adc r3, %[r]\n\t"
  46815. #endif
  46816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46817. "lsrs r7, %[b], #16\n\t"
  46818. #else
  46819. "lsr r7, %[b], #16\n\t"
  46820. #endif
  46821. #ifdef WOLFSSL_KEIL
  46822. "muls r6, r7, r6\n\t"
  46823. #elif defined(__clang__)
  46824. "muls r6, r7\n\t"
  46825. #else
  46826. "mul r6, r7\n\t"
  46827. #endif
  46828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46829. "lsrs r7, r6, #16\n\t"
  46830. #else
  46831. "lsr r7, r6, #16\n\t"
  46832. #endif
  46833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46834. "lsls r6, r6, #16\n\t"
  46835. #else
  46836. "lsl r6, r6, #16\n\t"
  46837. #endif
  46838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46839. "adds r4, r4, r6\n\t"
  46840. #else
  46841. "add r4, r4, r6\n\t"
  46842. #endif
  46843. #ifdef WOLFSSL_KEIL
  46844. "adcs r5, r5, r7\n\t"
  46845. #elif defined(__clang__)
  46846. "adcs r5, r7\n\t"
  46847. #else
  46848. "adc r5, r7\n\t"
  46849. #endif
  46850. #ifdef WOLFSSL_KEIL
  46851. "adcs r3, r3, %[r]\n\t"
  46852. #elif defined(__clang__)
  46853. "adcs r3, %[r]\n\t"
  46854. #else
  46855. "adc r3, %[r]\n\t"
  46856. #endif
  46857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46858. "lsrs r6, %[a], #16\n\t"
  46859. #else
  46860. "lsr r6, %[a], #16\n\t"
  46861. #endif
  46862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46863. "lsrs r7, %[b], #16\n\t"
  46864. #else
  46865. "lsr r7, %[b], #16\n\t"
  46866. #endif
  46867. #ifdef WOLFSSL_KEIL
  46868. "muls r7, r6, r7\n\t"
  46869. #elif defined(__clang__)
  46870. "muls r7, r6\n\t"
  46871. #else
  46872. "mul r7, r6\n\t"
  46873. #endif
  46874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46875. "adds r5, r5, r7\n\t"
  46876. #else
  46877. "add r5, r5, r7\n\t"
  46878. #endif
  46879. #ifdef WOLFSSL_KEIL
  46880. "adcs r3, r3, %[r]\n\t"
  46881. #elif defined(__clang__)
  46882. "adcs r3, %[r]\n\t"
  46883. #else
  46884. "adc r3, %[r]\n\t"
  46885. #endif
  46886. "uxth r7, %[b]\n\t"
  46887. #ifdef WOLFSSL_KEIL
  46888. "muls r6, r7, r6\n\t"
  46889. #elif defined(__clang__)
  46890. "muls r6, r7\n\t"
  46891. #else
  46892. "mul r6, r7\n\t"
  46893. #endif
  46894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46895. "lsrs r7, r6, #16\n\t"
  46896. #else
  46897. "lsr r7, r6, #16\n\t"
  46898. #endif
  46899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46900. "lsls r6, r6, #16\n\t"
  46901. #else
  46902. "lsl r6, r6, #16\n\t"
  46903. #endif
  46904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46905. "adds r4, r4, r6\n\t"
  46906. #else
  46907. "add r4, r4, r6\n\t"
  46908. #endif
  46909. #ifdef WOLFSSL_KEIL
  46910. "adcs r5, r5, r7\n\t"
  46911. #elif defined(__clang__)
  46912. "adcs r5, r7\n\t"
  46913. #else
  46914. "adc r5, r7\n\t"
  46915. #endif
  46916. #ifdef WOLFSSL_KEIL
  46917. "adcs r3, r3, %[r]\n\t"
  46918. #elif defined(__clang__)
  46919. "adcs r3, %[r]\n\t"
  46920. #else
  46921. "adc r3, %[r]\n\t"
  46922. #endif
  46923. "# A[6] * B[10]\n\t"
  46924. "mov %[a], r9\n\t"
  46925. "mov %[b], r10\n\t"
  46926. "ldr %[a], [%[a], #24]\n\t"
  46927. "ldr %[b], [%[b], #40]\n\t"
  46928. "uxth r6, %[a]\n\t"
  46929. "uxth r7, %[b]\n\t"
  46930. #ifdef WOLFSSL_KEIL
  46931. "muls r7, r6, r7\n\t"
  46932. #elif defined(__clang__)
  46933. "muls r7, r6\n\t"
  46934. #else
  46935. "mul r7, r6\n\t"
  46936. #endif
  46937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46938. "adds r4, r4, r7\n\t"
  46939. #else
  46940. "add r4, r4, r7\n\t"
  46941. #endif
  46942. #ifdef WOLFSSL_KEIL
  46943. "adcs r5, r5, %[r]\n\t"
  46944. #elif defined(__clang__)
  46945. "adcs r5, %[r]\n\t"
  46946. #else
  46947. "adc r5, %[r]\n\t"
  46948. #endif
  46949. #ifdef WOLFSSL_KEIL
  46950. "adcs r3, r3, %[r]\n\t"
  46951. #elif defined(__clang__)
  46952. "adcs r3, %[r]\n\t"
  46953. #else
  46954. "adc r3, %[r]\n\t"
  46955. #endif
  46956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46957. "lsrs r7, %[b], #16\n\t"
  46958. #else
  46959. "lsr r7, %[b], #16\n\t"
  46960. #endif
  46961. #ifdef WOLFSSL_KEIL
  46962. "muls r6, r7, r6\n\t"
  46963. #elif defined(__clang__)
  46964. "muls r6, r7\n\t"
  46965. #else
  46966. "mul r6, r7\n\t"
  46967. #endif
  46968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46969. "lsrs r7, r6, #16\n\t"
  46970. #else
  46971. "lsr r7, r6, #16\n\t"
  46972. #endif
  46973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46974. "lsls r6, r6, #16\n\t"
  46975. #else
  46976. "lsl r6, r6, #16\n\t"
  46977. #endif
  46978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46979. "adds r4, r4, r6\n\t"
  46980. #else
  46981. "add r4, r4, r6\n\t"
  46982. #endif
  46983. #ifdef WOLFSSL_KEIL
  46984. "adcs r5, r5, r7\n\t"
  46985. #elif defined(__clang__)
  46986. "adcs r5, r7\n\t"
  46987. #else
  46988. "adc r5, r7\n\t"
  46989. #endif
  46990. #ifdef WOLFSSL_KEIL
  46991. "adcs r3, r3, %[r]\n\t"
  46992. #elif defined(__clang__)
  46993. "adcs r3, %[r]\n\t"
  46994. #else
  46995. "adc r3, %[r]\n\t"
  46996. #endif
  46997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46998. "lsrs r6, %[a], #16\n\t"
  46999. #else
  47000. "lsr r6, %[a], #16\n\t"
  47001. #endif
  47002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47003. "lsrs r7, %[b], #16\n\t"
  47004. #else
  47005. "lsr r7, %[b], #16\n\t"
  47006. #endif
  47007. #ifdef WOLFSSL_KEIL
  47008. "muls r7, r6, r7\n\t"
  47009. #elif defined(__clang__)
  47010. "muls r7, r6\n\t"
  47011. #else
  47012. "mul r7, r6\n\t"
  47013. #endif
  47014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47015. "adds r5, r5, r7\n\t"
  47016. #else
  47017. "add r5, r5, r7\n\t"
  47018. #endif
  47019. #ifdef WOLFSSL_KEIL
  47020. "adcs r3, r3, %[r]\n\t"
  47021. #elif defined(__clang__)
  47022. "adcs r3, %[r]\n\t"
  47023. #else
  47024. "adc r3, %[r]\n\t"
  47025. #endif
  47026. "uxth r7, %[b]\n\t"
  47027. #ifdef WOLFSSL_KEIL
  47028. "muls r6, r7, r6\n\t"
  47029. #elif defined(__clang__)
  47030. "muls r6, r7\n\t"
  47031. #else
  47032. "mul r6, r7\n\t"
  47033. #endif
  47034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47035. "lsrs r7, r6, #16\n\t"
  47036. #else
  47037. "lsr r7, r6, #16\n\t"
  47038. #endif
  47039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47040. "lsls r6, r6, #16\n\t"
  47041. #else
  47042. "lsl r6, r6, #16\n\t"
  47043. #endif
  47044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47045. "adds r4, r4, r6\n\t"
  47046. #else
  47047. "add r4, r4, r6\n\t"
  47048. #endif
  47049. #ifdef WOLFSSL_KEIL
  47050. "adcs r5, r5, r7\n\t"
  47051. #elif defined(__clang__)
  47052. "adcs r5, r7\n\t"
  47053. #else
  47054. "adc r5, r7\n\t"
  47055. #endif
  47056. #ifdef WOLFSSL_KEIL
  47057. "adcs r3, r3, %[r]\n\t"
  47058. #elif defined(__clang__)
  47059. "adcs r3, %[r]\n\t"
  47060. #else
  47061. "adc r3, %[r]\n\t"
  47062. #endif
  47063. "# A[5] * B[11]\n\t"
  47064. "mov %[a], r9\n\t"
  47065. "mov %[b], r10\n\t"
  47066. "ldr %[a], [%[a], #20]\n\t"
  47067. "ldr %[b], [%[b], #44]\n\t"
  47068. "uxth r6, %[a]\n\t"
  47069. "uxth r7, %[b]\n\t"
  47070. #ifdef WOLFSSL_KEIL
  47071. "muls r7, r6, r7\n\t"
  47072. #elif defined(__clang__)
  47073. "muls r7, r6\n\t"
  47074. #else
  47075. "mul r7, r6\n\t"
  47076. #endif
  47077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47078. "adds r4, r4, r7\n\t"
  47079. #else
  47080. "add r4, r4, r7\n\t"
  47081. #endif
  47082. #ifdef WOLFSSL_KEIL
  47083. "adcs r5, r5, %[r]\n\t"
  47084. #elif defined(__clang__)
  47085. "adcs r5, %[r]\n\t"
  47086. #else
  47087. "adc r5, %[r]\n\t"
  47088. #endif
  47089. #ifdef WOLFSSL_KEIL
  47090. "adcs r3, r3, %[r]\n\t"
  47091. #elif defined(__clang__)
  47092. "adcs r3, %[r]\n\t"
  47093. #else
  47094. "adc r3, %[r]\n\t"
  47095. #endif
  47096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47097. "lsrs r7, %[b], #16\n\t"
  47098. #else
  47099. "lsr r7, %[b], #16\n\t"
  47100. #endif
  47101. #ifdef WOLFSSL_KEIL
  47102. "muls r6, r7, r6\n\t"
  47103. #elif defined(__clang__)
  47104. "muls r6, r7\n\t"
  47105. #else
  47106. "mul r6, r7\n\t"
  47107. #endif
  47108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47109. "lsrs r7, r6, #16\n\t"
  47110. #else
  47111. "lsr r7, r6, #16\n\t"
  47112. #endif
  47113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47114. "lsls r6, r6, #16\n\t"
  47115. #else
  47116. "lsl r6, r6, #16\n\t"
  47117. #endif
  47118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47119. "adds r4, r4, r6\n\t"
  47120. #else
  47121. "add r4, r4, r6\n\t"
  47122. #endif
  47123. #ifdef WOLFSSL_KEIL
  47124. "adcs r5, r5, r7\n\t"
  47125. #elif defined(__clang__)
  47126. "adcs r5, r7\n\t"
  47127. #else
  47128. "adc r5, r7\n\t"
  47129. #endif
  47130. #ifdef WOLFSSL_KEIL
  47131. "adcs r3, r3, %[r]\n\t"
  47132. #elif defined(__clang__)
  47133. "adcs r3, %[r]\n\t"
  47134. #else
  47135. "adc r3, %[r]\n\t"
  47136. #endif
  47137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47138. "lsrs r6, %[a], #16\n\t"
  47139. #else
  47140. "lsr r6, %[a], #16\n\t"
  47141. #endif
  47142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47143. "lsrs r7, %[b], #16\n\t"
  47144. #else
  47145. "lsr r7, %[b], #16\n\t"
  47146. #endif
  47147. #ifdef WOLFSSL_KEIL
  47148. "muls r7, r6, r7\n\t"
  47149. #elif defined(__clang__)
  47150. "muls r7, r6\n\t"
  47151. #else
  47152. "mul r7, r6\n\t"
  47153. #endif
  47154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47155. "adds r5, r5, r7\n\t"
  47156. #else
  47157. "add r5, r5, r7\n\t"
  47158. #endif
  47159. #ifdef WOLFSSL_KEIL
  47160. "adcs r3, r3, %[r]\n\t"
  47161. #elif defined(__clang__)
  47162. "adcs r3, %[r]\n\t"
  47163. #else
  47164. "adc r3, %[r]\n\t"
  47165. #endif
  47166. "uxth r7, %[b]\n\t"
  47167. #ifdef WOLFSSL_KEIL
  47168. "muls r6, r7, r6\n\t"
  47169. #elif defined(__clang__)
  47170. "muls r6, r7\n\t"
  47171. #else
  47172. "mul r6, r7\n\t"
  47173. #endif
  47174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47175. "lsrs r7, r6, #16\n\t"
  47176. #else
  47177. "lsr r7, r6, #16\n\t"
  47178. #endif
  47179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47180. "lsls r6, r6, #16\n\t"
  47181. #else
  47182. "lsl r6, r6, #16\n\t"
  47183. #endif
  47184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47185. "adds r4, r4, r6\n\t"
  47186. #else
  47187. "add r4, r4, r6\n\t"
  47188. #endif
  47189. #ifdef WOLFSSL_KEIL
  47190. "adcs r5, r5, r7\n\t"
  47191. #elif defined(__clang__)
  47192. "adcs r5, r7\n\t"
  47193. #else
  47194. "adc r5, r7\n\t"
  47195. #endif
  47196. #ifdef WOLFSSL_KEIL
  47197. "adcs r3, r3, %[r]\n\t"
  47198. #elif defined(__clang__)
  47199. "adcs r3, %[r]\n\t"
  47200. #else
  47201. "adc r3, %[r]\n\t"
  47202. #endif
  47203. "mov %[r], r8\n\t"
  47204. "str r4, [%[r], #64]\n\t"
  47205. "movs %[r], #0\n\t"
  47206. "# A[6] * B[11]\n\t"
  47207. "movs r4, #0\n\t"
  47208. "mov %[a], r9\n\t"
  47209. "mov %[b], r10\n\t"
  47210. "ldr %[a], [%[a], #24]\n\t"
  47211. "ldr %[b], [%[b], #44]\n\t"
  47212. "uxth r6, %[a]\n\t"
  47213. "uxth r7, %[b]\n\t"
  47214. #ifdef WOLFSSL_KEIL
  47215. "muls r7, r6, r7\n\t"
  47216. #elif defined(__clang__)
  47217. "muls r7, r6\n\t"
  47218. #else
  47219. "mul r7, r6\n\t"
  47220. #endif
  47221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47222. "adds r5, r5, r7\n\t"
  47223. #else
  47224. "add r5, r5, r7\n\t"
  47225. #endif
  47226. #ifdef WOLFSSL_KEIL
  47227. "adcs r3, r3, %[r]\n\t"
  47228. #elif defined(__clang__)
  47229. "adcs r3, %[r]\n\t"
  47230. #else
  47231. "adc r3, %[r]\n\t"
  47232. #endif
  47233. #ifdef WOLFSSL_KEIL
  47234. "adcs r4, r4, %[r]\n\t"
  47235. #elif defined(__clang__)
  47236. "adcs r4, %[r]\n\t"
  47237. #else
  47238. "adc r4, %[r]\n\t"
  47239. #endif
  47240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47241. "lsrs r7, %[b], #16\n\t"
  47242. #else
  47243. "lsr r7, %[b], #16\n\t"
  47244. #endif
  47245. #ifdef WOLFSSL_KEIL
  47246. "muls r6, r7, r6\n\t"
  47247. #elif defined(__clang__)
  47248. "muls r6, r7\n\t"
  47249. #else
  47250. "mul r6, r7\n\t"
  47251. #endif
  47252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47253. "lsrs r7, r6, #16\n\t"
  47254. #else
  47255. "lsr r7, r6, #16\n\t"
  47256. #endif
  47257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47258. "lsls r6, r6, #16\n\t"
  47259. #else
  47260. "lsl r6, r6, #16\n\t"
  47261. #endif
  47262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47263. "adds r5, r5, r6\n\t"
  47264. #else
  47265. "add r5, r5, r6\n\t"
  47266. #endif
  47267. #ifdef WOLFSSL_KEIL
  47268. "adcs r3, r3, r7\n\t"
  47269. #elif defined(__clang__)
  47270. "adcs r3, r7\n\t"
  47271. #else
  47272. "adc r3, r7\n\t"
  47273. #endif
  47274. #ifdef WOLFSSL_KEIL
  47275. "adcs r4, r4, %[r]\n\t"
  47276. #elif defined(__clang__)
  47277. "adcs r4, %[r]\n\t"
  47278. #else
  47279. "adc r4, %[r]\n\t"
  47280. #endif
  47281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47282. "lsrs r6, %[a], #16\n\t"
  47283. #else
  47284. "lsr r6, %[a], #16\n\t"
  47285. #endif
  47286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47287. "lsrs r7, %[b], #16\n\t"
  47288. #else
  47289. "lsr r7, %[b], #16\n\t"
  47290. #endif
  47291. #ifdef WOLFSSL_KEIL
  47292. "muls r7, r6, r7\n\t"
  47293. #elif defined(__clang__)
  47294. "muls r7, r6\n\t"
  47295. #else
  47296. "mul r7, r6\n\t"
  47297. #endif
  47298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47299. "adds r3, r3, r7\n\t"
  47300. #else
  47301. "add r3, r3, r7\n\t"
  47302. #endif
  47303. #ifdef WOLFSSL_KEIL
  47304. "adcs r4, r4, %[r]\n\t"
  47305. #elif defined(__clang__)
  47306. "adcs r4, %[r]\n\t"
  47307. #else
  47308. "adc r4, %[r]\n\t"
  47309. #endif
  47310. "uxth r7, %[b]\n\t"
  47311. #ifdef WOLFSSL_KEIL
  47312. "muls r6, r7, r6\n\t"
  47313. #elif defined(__clang__)
  47314. "muls r6, r7\n\t"
  47315. #else
  47316. "mul r6, r7\n\t"
  47317. #endif
  47318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47319. "lsrs r7, r6, #16\n\t"
  47320. #else
  47321. "lsr r7, r6, #16\n\t"
  47322. #endif
  47323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47324. "lsls r6, r6, #16\n\t"
  47325. #else
  47326. "lsl r6, r6, #16\n\t"
  47327. #endif
  47328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47329. "adds r5, r5, r6\n\t"
  47330. #else
  47331. "add r5, r5, r6\n\t"
  47332. #endif
  47333. #ifdef WOLFSSL_KEIL
  47334. "adcs r3, r3, r7\n\t"
  47335. #elif defined(__clang__)
  47336. "adcs r3, r7\n\t"
  47337. #else
  47338. "adc r3, r7\n\t"
  47339. #endif
  47340. #ifdef WOLFSSL_KEIL
  47341. "adcs r4, r4, %[r]\n\t"
  47342. #elif defined(__clang__)
  47343. "adcs r4, %[r]\n\t"
  47344. #else
  47345. "adc r4, %[r]\n\t"
  47346. #endif
  47347. "# A[7] * B[10]\n\t"
  47348. "mov %[a], r9\n\t"
  47349. "mov %[b], r10\n\t"
  47350. "ldr %[a], [%[a], #28]\n\t"
  47351. "ldr %[b], [%[b], #40]\n\t"
  47352. "uxth r6, %[a]\n\t"
  47353. "uxth r7, %[b]\n\t"
  47354. #ifdef WOLFSSL_KEIL
  47355. "muls r7, r6, r7\n\t"
  47356. #elif defined(__clang__)
  47357. "muls r7, r6\n\t"
  47358. #else
  47359. "mul r7, r6\n\t"
  47360. #endif
  47361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47362. "adds r5, r5, r7\n\t"
  47363. #else
  47364. "add r5, r5, r7\n\t"
  47365. #endif
  47366. #ifdef WOLFSSL_KEIL
  47367. "adcs r3, r3, %[r]\n\t"
  47368. #elif defined(__clang__)
  47369. "adcs r3, %[r]\n\t"
  47370. #else
  47371. "adc r3, %[r]\n\t"
  47372. #endif
  47373. #ifdef WOLFSSL_KEIL
  47374. "adcs r4, r4, %[r]\n\t"
  47375. #elif defined(__clang__)
  47376. "adcs r4, %[r]\n\t"
  47377. #else
  47378. "adc r4, %[r]\n\t"
  47379. #endif
  47380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47381. "lsrs r7, %[b], #16\n\t"
  47382. #else
  47383. "lsr r7, %[b], #16\n\t"
  47384. #endif
  47385. #ifdef WOLFSSL_KEIL
  47386. "muls r6, r7, r6\n\t"
  47387. #elif defined(__clang__)
  47388. "muls r6, r7\n\t"
  47389. #else
  47390. "mul r6, r7\n\t"
  47391. #endif
  47392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47393. "lsrs r7, r6, #16\n\t"
  47394. #else
  47395. "lsr r7, r6, #16\n\t"
  47396. #endif
  47397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47398. "lsls r6, r6, #16\n\t"
  47399. #else
  47400. "lsl r6, r6, #16\n\t"
  47401. #endif
  47402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47403. "adds r5, r5, r6\n\t"
  47404. #else
  47405. "add r5, r5, r6\n\t"
  47406. #endif
  47407. #ifdef WOLFSSL_KEIL
  47408. "adcs r3, r3, r7\n\t"
  47409. #elif defined(__clang__)
  47410. "adcs r3, r7\n\t"
  47411. #else
  47412. "adc r3, r7\n\t"
  47413. #endif
  47414. #ifdef WOLFSSL_KEIL
  47415. "adcs r4, r4, %[r]\n\t"
  47416. #elif defined(__clang__)
  47417. "adcs r4, %[r]\n\t"
  47418. #else
  47419. "adc r4, %[r]\n\t"
  47420. #endif
  47421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47422. "lsrs r6, %[a], #16\n\t"
  47423. #else
  47424. "lsr r6, %[a], #16\n\t"
  47425. #endif
  47426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47427. "lsrs r7, %[b], #16\n\t"
  47428. #else
  47429. "lsr r7, %[b], #16\n\t"
  47430. #endif
  47431. #ifdef WOLFSSL_KEIL
  47432. "muls r7, r6, r7\n\t"
  47433. #elif defined(__clang__)
  47434. "muls r7, r6\n\t"
  47435. #else
  47436. "mul r7, r6\n\t"
  47437. #endif
  47438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47439. "adds r3, r3, r7\n\t"
  47440. #else
  47441. "add r3, r3, r7\n\t"
  47442. #endif
  47443. #ifdef WOLFSSL_KEIL
  47444. "adcs r4, r4, %[r]\n\t"
  47445. #elif defined(__clang__)
  47446. "adcs r4, %[r]\n\t"
  47447. #else
  47448. "adc r4, %[r]\n\t"
  47449. #endif
  47450. "uxth r7, %[b]\n\t"
  47451. #ifdef WOLFSSL_KEIL
  47452. "muls r6, r7, r6\n\t"
  47453. #elif defined(__clang__)
  47454. "muls r6, r7\n\t"
  47455. #else
  47456. "mul r6, r7\n\t"
  47457. #endif
  47458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47459. "lsrs r7, r6, #16\n\t"
  47460. #else
  47461. "lsr r7, r6, #16\n\t"
  47462. #endif
  47463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47464. "lsls r6, r6, #16\n\t"
  47465. #else
  47466. "lsl r6, r6, #16\n\t"
  47467. #endif
  47468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47469. "adds r5, r5, r6\n\t"
  47470. #else
  47471. "add r5, r5, r6\n\t"
  47472. #endif
  47473. #ifdef WOLFSSL_KEIL
  47474. "adcs r3, r3, r7\n\t"
  47475. #elif defined(__clang__)
  47476. "adcs r3, r7\n\t"
  47477. #else
  47478. "adc r3, r7\n\t"
  47479. #endif
  47480. #ifdef WOLFSSL_KEIL
  47481. "adcs r4, r4, %[r]\n\t"
  47482. #elif defined(__clang__)
  47483. "adcs r4, %[r]\n\t"
  47484. #else
  47485. "adc r4, %[r]\n\t"
  47486. #endif
  47487. "# A[8] * B[9]\n\t"
  47488. "mov %[a], r9\n\t"
  47489. "mov %[b], r10\n\t"
  47490. "ldr %[a], [%[a], #32]\n\t"
  47491. "ldr %[b], [%[b], #36]\n\t"
  47492. "uxth r6, %[a]\n\t"
  47493. "uxth r7, %[b]\n\t"
  47494. #ifdef WOLFSSL_KEIL
  47495. "muls r7, r6, r7\n\t"
  47496. #elif defined(__clang__)
  47497. "muls r7, r6\n\t"
  47498. #else
  47499. "mul r7, r6\n\t"
  47500. #endif
  47501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47502. "adds r5, r5, r7\n\t"
  47503. #else
  47504. "add r5, r5, r7\n\t"
  47505. #endif
  47506. #ifdef WOLFSSL_KEIL
  47507. "adcs r3, r3, %[r]\n\t"
  47508. #elif defined(__clang__)
  47509. "adcs r3, %[r]\n\t"
  47510. #else
  47511. "adc r3, %[r]\n\t"
  47512. #endif
  47513. #ifdef WOLFSSL_KEIL
  47514. "adcs r4, r4, %[r]\n\t"
  47515. #elif defined(__clang__)
  47516. "adcs r4, %[r]\n\t"
  47517. #else
  47518. "adc r4, %[r]\n\t"
  47519. #endif
  47520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47521. "lsrs r7, %[b], #16\n\t"
  47522. #else
  47523. "lsr r7, %[b], #16\n\t"
  47524. #endif
  47525. #ifdef WOLFSSL_KEIL
  47526. "muls r6, r7, r6\n\t"
  47527. #elif defined(__clang__)
  47528. "muls r6, r7\n\t"
  47529. #else
  47530. "mul r6, r7\n\t"
  47531. #endif
  47532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47533. "lsrs r7, r6, #16\n\t"
  47534. #else
  47535. "lsr r7, r6, #16\n\t"
  47536. #endif
  47537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47538. "lsls r6, r6, #16\n\t"
  47539. #else
  47540. "lsl r6, r6, #16\n\t"
  47541. #endif
  47542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47543. "adds r5, r5, r6\n\t"
  47544. #else
  47545. "add r5, r5, r6\n\t"
  47546. #endif
  47547. #ifdef WOLFSSL_KEIL
  47548. "adcs r3, r3, r7\n\t"
  47549. #elif defined(__clang__)
  47550. "adcs r3, r7\n\t"
  47551. #else
  47552. "adc r3, r7\n\t"
  47553. #endif
  47554. #ifdef WOLFSSL_KEIL
  47555. "adcs r4, r4, %[r]\n\t"
  47556. #elif defined(__clang__)
  47557. "adcs r4, %[r]\n\t"
  47558. #else
  47559. "adc r4, %[r]\n\t"
  47560. #endif
  47561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47562. "lsrs r6, %[a], #16\n\t"
  47563. #else
  47564. "lsr r6, %[a], #16\n\t"
  47565. #endif
  47566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47567. "lsrs r7, %[b], #16\n\t"
  47568. #else
  47569. "lsr r7, %[b], #16\n\t"
  47570. #endif
  47571. #ifdef WOLFSSL_KEIL
  47572. "muls r7, r6, r7\n\t"
  47573. #elif defined(__clang__)
  47574. "muls r7, r6\n\t"
  47575. #else
  47576. "mul r7, r6\n\t"
  47577. #endif
  47578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47579. "adds r3, r3, r7\n\t"
  47580. #else
  47581. "add r3, r3, r7\n\t"
  47582. #endif
  47583. #ifdef WOLFSSL_KEIL
  47584. "adcs r4, r4, %[r]\n\t"
  47585. #elif defined(__clang__)
  47586. "adcs r4, %[r]\n\t"
  47587. #else
  47588. "adc r4, %[r]\n\t"
  47589. #endif
  47590. "uxth r7, %[b]\n\t"
  47591. #ifdef WOLFSSL_KEIL
  47592. "muls r6, r7, r6\n\t"
  47593. #elif defined(__clang__)
  47594. "muls r6, r7\n\t"
  47595. #else
  47596. "mul r6, r7\n\t"
  47597. #endif
  47598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47599. "lsrs r7, r6, #16\n\t"
  47600. #else
  47601. "lsr r7, r6, #16\n\t"
  47602. #endif
  47603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47604. "lsls r6, r6, #16\n\t"
  47605. #else
  47606. "lsl r6, r6, #16\n\t"
  47607. #endif
  47608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47609. "adds r5, r5, r6\n\t"
  47610. #else
  47611. "add r5, r5, r6\n\t"
  47612. #endif
  47613. #ifdef WOLFSSL_KEIL
  47614. "adcs r3, r3, r7\n\t"
  47615. #elif defined(__clang__)
  47616. "adcs r3, r7\n\t"
  47617. #else
  47618. "adc r3, r7\n\t"
  47619. #endif
  47620. #ifdef WOLFSSL_KEIL
  47621. "adcs r4, r4, %[r]\n\t"
  47622. #elif defined(__clang__)
  47623. "adcs r4, %[r]\n\t"
  47624. #else
  47625. "adc r4, %[r]\n\t"
  47626. #endif
  47627. "# A[9] * B[8]\n\t"
  47628. "mov %[a], r9\n\t"
  47629. "mov %[b], r10\n\t"
  47630. "ldr %[a], [%[a], #36]\n\t"
  47631. "ldr %[b], [%[b], #32]\n\t"
  47632. "uxth r6, %[a]\n\t"
  47633. "uxth r7, %[b]\n\t"
  47634. #ifdef WOLFSSL_KEIL
  47635. "muls r7, r6, r7\n\t"
  47636. #elif defined(__clang__)
  47637. "muls r7, r6\n\t"
  47638. #else
  47639. "mul r7, r6\n\t"
  47640. #endif
  47641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47642. "adds r5, r5, r7\n\t"
  47643. #else
  47644. "add r5, r5, r7\n\t"
  47645. #endif
  47646. #ifdef WOLFSSL_KEIL
  47647. "adcs r3, r3, %[r]\n\t"
  47648. #elif defined(__clang__)
  47649. "adcs r3, %[r]\n\t"
  47650. #else
  47651. "adc r3, %[r]\n\t"
  47652. #endif
  47653. #ifdef WOLFSSL_KEIL
  47654. "adcs r4, r4, %[r]\n\t"
  47655. #elif defined(__clang__)
  47656. "adcs r4, %[r]\n\t"
  47657. #else
  47658. "adc r4, %[r]\n\t"
  47659. #endif
  47660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47661. "lsrs r7, %[b], #16\n\t"
  47662. #else
  47663. "lsr r7, %[b], #16\n\t"
  47664. #endif
  47665. #ifdef WOLFSSL_KEIL
  47666. "muls r6, r7, r6\n\t"
  47667. #elif defined(__clang__)
  47668. "muls r6, r7\n\t"
  47669. #else
  47670. "mul r6, r7\n\t"
  47671. #endif
  47672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47673. "lsrs r7, r6, #16\n\t"
  47674. #else
  47675. "lsr r7, r6, #16\n\t"
  47676. #endif
  47677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47678. "lsls r6, r6, #16\n\t"
  47679. #else
  47680. "lsl r6, r6, #16\n\t"
  47681. #endif
  47682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47683. "adds r5, r5, r6\n\t"
  47684. #else
  47685. "add r5, r5, r6\n\t"
  47686. #endif
  47687. #ifdef WOLFSSL_KEIL
  47688. "adcs r3, r3, r7\n\t"
  47689. #elif defined(__clang__)
  47690. "adcs r3, r7\n\t"
  47691. #else
  47692. "adc r3, r7\n\t"
  47693. #endif
  47694. #ifdef WOLFSSL_KEIL
  47695. "adcs r4, r4, %[r]\n\t"
  47696. #elif defined(__clang__)
  47697. "adcs r4, %[r]\n\t"
  47698. #else
  47699. "adc r4, %[r]\n\t"
  47700. #endif
  47701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47702. "lsrs r6, %[a], #16\n\t"
  47703. #else
  47704. "lsr r6, %[a], #16\n\t"
  47705. #endif
  47706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47707. "lsrs r7, %[b], #16\n\t"
  47708. #else
  47709. "lsr r7, %[b], #16\n\t"
  47710. #endif
  47711. #ifdef WOLFSSL_KEIL
  47712. "muls r7, r6, r7\n\t"
  47713. #elif defined(__clang__)
  47714. "muls r7, r6\n\t"
  47715. #else
  47716. "mul r7, r6\n\t"
  47717. #endif
  47718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47719. "adds r3, r3, r7\n\t"
  47720. #else
  47721. "add r3, r3, r7\n\t"
  47722. #endif
  47723. #ifdef WOLFSSL_KEIL
  47724. "adcs r4, r4, %[r]\n\t"
  47725. #elif defined(__clang__)
  47726. "adcs r4, %[r]\n\t"
  47727. #else
  47728. "adc r4, %[r]\n\t"
  47729. #endif
  47730. "uxth r7, %[b]\n\t"
  47731. #ifdef WOLFSSL_KEIL
  47732. "muls r6, r7, r6\n\t"
  47733. #elif defined(__clang__)
  47734. "muls r6, r7\n\t"
  47735. #else
  47736. "mul r6, r7\n\t"
  47737. #endif
  47738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47739. "lsrs r7, r6, #16\n\t"
  47740. #else
  47741. "lsr r7, r6, #16\n\t"
  47742. #endif
  47743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47744. "lsls r6, r6, #16\n\t"
  47745. #else
  47746. "lsl r6, r6, #16\n\t"
  47747. #endif
  47748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47749. "adds r5, r5, r6\n\t"
  47750. #else
  47751. "add r5, r5, r6\n\t"
  47752. #endif
  47753. #ifdef WOLFSSL_KEIL
  47754. "adcs r3, r3, r7\n\t"
  47755. #elif defined(__clang__)
  47756. "adcs r3, r7\n\t"
  47757. #else
  47758. "adc r3, r7\n\t"
  47759. #endif
  47760. #ifdef WOLFSSL_KEIL
  47761. "adcs r4, r4, %[r]\n\t"
  47762. #elif defined(__clang__)
  47763. "adcs r4, %[r]\n\t"
  47764. #else
  47765. "adc r4, %[r]\n\t"
  47766. #endif
  47767. "# A[10] * B[7]\n\t"
  47768. "mov %[a], r9\n\t"
  47769. "mov %[b], r10\n\t"
  47770. "ldr %[a], [%[a], #40]\n\t"
  47771. "ldr %[b], [%[b], #28]\n\t"
  47772. "uxth r6, %[a]\n\t"
  47773. "uxth r7, %[b]\n\t"
  47774. #ifdef WOLFSSL_KEIL
  47775. "muls r7, r6, r7\n\t"
  47776. #elif defined(__clang__)
  47777. "muls r7, r6\n\t"
  47778. #else
  47779. "mul r7, r6\n\t"
  47780. #endif
  47781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47782. "adds r5, r5, r7\n\t"
  47783. #else
  47784. "add r5, r5, r7\n\t"
  47785. #endif
  47786. #ifdef WOLFSSL_KEIL
  47787. "adcs r3, r3, %[r]\n\t"
  47788. #elif defined(__clang__)
  47789. "adcs r3, %[r]\n\t"
  47790. #else
  47791. "adc r3, %[r]\n\t"
  47792. #endif
  47793. #ifdef WOLFSSL_KEIL
  47794. "adcs r4, r4, %[r]\n\t"
  47795. #elif defined(__clang__)
  47796. "adcs r4, %[r]\n\t"
  47797. #else
  47798. "adc r4, %[r]\n\t"
  47799. #endif
  47800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47801. "lsrs r7, %[b], #16\n\t"
  47802. #else
  47803. "lsr r7, %[b], #16\n\t"
  47804. #endif
  47805. #ifdef WOLFSSL_KEIL
  47806. "muls r6, r7, r6\n\t"
  47807. #elif defined(__clang__)
  47808. "muls r6, r7\n\t"
  47809. #else
  47810. "mul r6, r7\n\t"
  47811. #endif
  47812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47813. "lsrs r7, r6, #16\n\t"
  47814. #else
  47815. "lsr r7, r6, #16\n\t"
  47816. #endif
  47817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47818. "lsls r6, r6, #16\n\t"
  47819. #else
  47820. "lsl r6, r6, #16\n\t"
  47821. #endif
  47822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47823. "adds r5, r5, r6\n\t"
  47824. #else
  47825. "add r5, r5, r6\n\t"
  47826. #endif
  47827. #ifdef WOLFSSL_KEIL
  47828. "adcs r3, r3, r7\n\t"
  47829. #elif defined(__clang__)
  47830. "adcs r3, r7\n\t"
  47831. #else
  47832. "adc r3, r7\n\t"
  47833. #endif
  47834. #ifdef WOLFSSL_KEIL
  47835. "adcs r4, r4, %[r]\n\t"
  47836. #elif defined(__clang__)
  47837. "adcs r4, %[r]\n\t"
  47838. #else
  47839. "adc r4, %[r]\n\t"
  47840. #endif
  47841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47842. "lsrs r6, %[a], #16\n\t"
  47843. #else
  47844. "lsr r6, %[a], #16\n\t"
  47845. #endif
  47846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47847. "lsrs r7, %[b], #16\n\t"
  47848. #else
  47849. "lsr r7, %[b], #16\n\t"
  47850. #endif
  47851. #ifdef WOLFSSL_KEIL
  47852. "muls r7, r6, r7\n\t"
  47853. #elif defined(__clang__)
  47854. "muls r7, r6\n\t"
  47855. #else
  47856. "mul r7, r6\n\t"
  47857. #endif
  47858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47859. "adds r3, r3, r7\n\t"
  47860. #else
  47861. "add r3, r3, r7\n\t"
  47862. #endif
  47863. #ifdef WOLFSSL_KEIL
  47864. "adcs r4, r4, %[r]\n\t"
  47865. #elif defined(__clang__)
  47866. "adcs r4, %[r]\n\t"
  47867. #else
  47868. "adc r4, %[r]\n\t"
  47869. #endif
  47870. "uxth r7, %[b]\n\t"
  47871. #ifdef WOLFSSL_KEIL
  47872. "muls r6, r7, r6\n\t"
  47873. #elif defined(__clang__)
  47874. "muls r6, r7\n\t"
  47875. #else
  47876. "mul r6, r7\n\t"
  47877. #endif
  47878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47879. "lsrs r7, r6, #16\n\t"
  47880. #else
  47881. "lsr r7, r6, #16\n\t"
  47882. #endif
  47883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47884. "lsls r6, r6, #16\n\t"
  47885. #else
  47886. "lsl r6, r6, #16\n\t"
  47887. #endif
  47888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47889. "adds r5, r5, r6\n\t"
  47890. #else
  47891. "add r5, r5, r6\n\t"
  47892. #endif
  47893. #ifdef WOLFSSL_KEIL
  47894. "adcs r3, r3, r7\n\t"
  47895. #elif defined(__clang__)
  47896. "adcs r3, r7\n\t"
  47897. #else
  47898. "adc r3, r7\n\t"
  47899. #endif
  47900. #ifdef WOLFSSL_KEIL
  47901. "adcs r4, r4, %[r]\n\t"
  47902. #elif defined(__clang__)
  47903. "adcs r4, %[r]\n\t"
  47904. #else
  47905. "adc r4, %[r]\n\t"
  47906. #endif
  47907. "# A[11] * B[6]\n\t"
  47908. "mov %[a], r9\n\t"
  47909. "mov %[b], r10\n\t"
  47910. "ldr %[a], [%[a], #44]\n\t"
  47911. "ldr %[b], [%[b], #24]\n\t"
  47912. "uxth r6, %[a]\n\t"
  47913. "uxth r7, %[b]\n\t"
  47914. #ifdef WOLFSSL_KEIL
  47915. "muls r7, r6, r7\n\t"
  47916. #elif defined(__clang__)
  47917. "muls r7, r6\n\t"
  47918. #else
  47919. "mul r7, r6\n\t"
  47920. #endif
  47921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47922. "adds r5, r5, r7\n\t"
  47923. #else
  47924. "add r5, r5, r7\n\t"
  47925. #endif
  47926. #ifdef WOLFSSL_KEIL
  47927. "adcs r3, r3, %[r]\n\t"
  47928. #elif defined(__clang__)
  47929. "adcs r3, %[r]\n\t"
  47930. #else
  47931. "adc r3, %[r]\n\t"
  47932. #endif
  47933. #ifdef WOLFSSL_KEIL
  47934. "adcs r4, r4, %[r]\n\t"
  47935. #elif defined(__clang__)
  47936. "adcs r4, %[r]\n\t"
  47937. #else
  47938. "adc r4, %[r]\n\t"
  47939. #endif
  47940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47941. "lsrs r7, %[b], #16\n\t"
  47942. #else
  47943. "lsr r7, %[b], #16\n\t"
  47944. #endif
  47945. #ifdef WOLFSSL_KEIL
  47946. "muls r6, r7, r6\n\t"
  47947. #elif defined(__clang__)
  47948. "muls r6, r7\n\t"
  47949. #else
  47950. "mul r6, r7\n\t"
  47951. #endif
  47952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47953. "lsrs r7, r6, #16\n\t"
  47954. #else
  47955. "lsr r7, r6, #16\n\t"
  47956. #endif
  47957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47958. "lsls r6, r6, #16\n\t"
  47959. #else
  47960. "lsl r6, r6, #16\n\t"
  47961. #endif
  47962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47963. "adds r5, r5, r6\n\t"
  47964. #else
  47965. "add r5, r5, r6\n\t"
  47966. #endif
  47967. #ifdef WOLFSSL_KEIL
  47968. "adcs r3, r3, r7\n\t"
  47969. #elif defined(__clang__)
  47970. "adcs r3, r7\n\t"
  47971. #else
  47972. "adc r3, r7\n\t"
  47973. #endif
  47974. #ifdef WOLFSSL_KEIL
  47975. "adcs r4, r4, %[r]\n\t"
  47976. #elif defined(__clang__)
  47977. "adcs r4, %[r]\n\t"
  47978. #else
  47979. "adc r4, %[r]\n\t"
  47980. #endif
  47981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47982. "lsrs r6, %[a], #16\n\t"
  47983. #else
  47984. "lsr r6, %[a], #16\n\t"
  47985. #endif
  47986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47987. "lsrs r7, %[b], #16\n\t"
  47988. #else
  47989. "lsr r7, %[b], #16\n\t"
  47990. #endif
  47991. #ifdef WOLFSSL_KEIL
  47992. "muls r7, r6, r7\n\t"
  47993. #elif defined(__clang__)
  47994. "muls r7, r6\n\t"
  47995. #else
  47996. "mul r7, r6\n\t"
  47997. #endif
  47998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47999. "adds r3, r3, r7\n\t"
  48000. #else
  48001. "add r3, r3, r7\n\t"
  48002. #endif
  48003. #ifdef WOLFSSL_KEIL
  48004. "adcs r4, r4, %[r]\n\t"
  48005. #elif defined(__clang__)
  48006. "adcs r4, %[r]\n\t"
  48007. #else
  48008. "adc r4, %[r]\n\t"
  48009. #endif
  48010. "uxth r7, %[b]\n\t"
  48011. #ifdef WOLFSSL_KEIL
  48012. "muls r6, r7, r6\n\t"
  48013. #elif defined(__clang__)
  48014. "muls r6, r7\n\t"
  48015. #else
  48016. "mul r6, r7\n\t"
  48017. #endif
  48018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48019. "lsrs r7, r6, #16\n\t"
  48020. #else
  48021. "lsr r7, r6, #16\n\t"
  48022. #endif
  48023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48024. "lsls r6, r6, #16\n\t"
  48025. #else
  48026. "lsl r6, r6, #16\n\t"
  48027. #endif
  48028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48029. "adds r5, r5, r6\n\t"
  48030. #else
  48031. "add r5, r5, r6\n\t"
  48032. #endif
  48033. #ifdef WOLFSSL_KEIL
  48034. "adcs r3, r3, r7\n\t"
  48035. #elif defined(__clang__)
  48036. "adcs r3, r7\n\t"
  48037. #else
  48038. "adc r3, r7\n\t"
  48039. #endif
  48040. #ifdef WOLFSSL_KEIL
  48041. "adcs r4, r4, %[r]\n\t"
  48042. #elif defined(__clang__)
  48043. "adcs r4, %[r]\n\t"
  48044. #else
  48045. "adc r4, %[r]\n\t"
  48046. #endif
  48047. "mov %[r], r8\n\t"
  48048. "str r5, [%[r], #68]\n\t"
  48049. "movs %[r], #0\n\t"
  48050. "# A[11] * B[7]\n\t"
  48051. "movs r5, #0\n\t"
  48052. "mov %[a], r9\n\t"
  48053. "mov %[b], r10\n\t"
  48054. "ldr %[a], [%[a], #44]\n\t"
  48055. "ldr %[b], [%[b], #28]\n\t"
  48056. "uxth r6, %[a]\n\t"
  48057. "uxth r7, %[b]\n\t"
  48058. #ifdef WOLFSSL_KEIL
  48059. "muls r7, r6, r7\n\t"
  48060. #elif defined(__clang__)
  48061. "muls r7, r6\n\t"
  48062. #else
  48063. "mul r7, r6\n\t"
  48064. #endif
  48065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48066. "adds r3, r3, r7\n\t"
  48067. #else
  48068. "add r3, r3, r7\n\t"
  48069. #endif
  48070. #ifdef WOLFSSL_KEIL
  48071. "adcs r4, r4, %[r]\n\t"
  48072. #elif defined(__clang__)
  48073. "adcs r4, %[r]\n\t"
  48074. #else
  48075. "adc r4, %[r]\n\t"
  48076. #endif
  48077. #ifdef WOLFSSL_KEIL
  48078. "adcs r5, r5, %[r]\n\t"
  48079. #elif defined(__clang__)
  48080. "adcs r5, %[r]\n\t"
  48081. #else
  48082. "adc r5, %[r]\n\t"
  48083. #endif
  48084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48085. "lsrs r7, %[b], #16\n\t"
  48086. #else
  48087. "lsr r7, %[b], #16\n\t"
  48088. #endif
  48089. #ifdef WOLFSSL_KEIL
  48090. "muls r6, r7, r6\n\t"
  48091. #elif defined(__clang__)
  48092. "muls r6, r7\n\t"
  48093. #else
  48094. "mul r6, r7\n\t"
  48095. #endif
  48096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48097. "lsrs r7, r6, #16\n\t"
  48098. #else
  48099. "lsr r7, r6, #16\n\t"
  48100. #endif
  48101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48102. "lsls r6, r6, #16\n\t"
  48103. #else
  48104. "lsl r6, r6, #16\n\t"
  48105. #endif
  48106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48107. "adds r3, r3, r6\n\t"
  48108. #else
  48109. "add r3, r3, r6\n\t"
  48110. #endif
  48111. #ifdef WOLFSSL_KEIL
  48112. "adcs r4, r4, r7\n\t"
  48113. #elif defined(__clang__)
  48114. "adcs r4, r7\n\t"
  48115. #else
  48116. "adc r4, r7\n\t"
  48117. #endif
  48118. #ifdef WOLFSSL_KEIL
  48119. "adcs r5, r5, %[r]\n\t"
  48120. #elif defined(__clang__)
  48121. "adcs r5, %[r]\n\t"
  48122. #else
  48123. "adc r5, %[r]\n\t"
  48124. #endif
  48125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48126. "lsrs r6, %[a], #16\n\t"
  48127. #else
  48128. "lsr r6, %[a], #16\n\t"
  48129. #endif
  48130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48131. "lsrs r7, %[b], #16\n\t"
  48132. #else
  48133. "lsr r7, %[b], #16\n\t"
  48134. #endif
  48135. #ifdef WOLFSSL_KEIL
  48136. "muls r7, r6, r7\n\t"
  48137. #elif defined(__clang__)
  48138. "muls r7, r6\n\t"
  48139. #else
  48140. "mul r7, r6\n\t"
  48141. #endif
  48142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48143. "adds r4, r4, r7\n\t"
  48144. #else
  48145. "add r4, r4, r7\n\t"
  48146. #endif
  48147. #ifdef WOLFSSL_KEIL
  48148. "adcs r5, r5, %[r]\n\t"
  48149. #elif defined(__clang__)
  48150. "adcs r5, %[r]\n\t"
  48151. #else
  48152. "adc r5, %[r]\n\t"
  48153. #endif
  48154. "uxth r7, %[b]\n\t"
  48155. #ifdef WOLFSSL_KEIL
  48156. "muls r6, r7, r6\n\t"
  48157. #elif defined(__clang__)
  48158. "muls r6, r7\n\t"
  48159. #else
  48160. "mul r6, r7\n\t"
  48161. #endif
  48162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48163. "lsrs r7, r6, #16\n\t"
  48164. #else
  48165. "lsr r7, r6, #16\n\t"
  48166. #endif
  48167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48168. "lsls r6, r6, #16\n\t"
  48169. #else
  48170. "lsl r6, r6, #16\n\t"
  48171. #endif
  48172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48173. "adds r3, r3, r6\n\t"
  48174. #else
  48175. "add r3, r3, r6\n\t"
  48176. #endif
  48177. #ifdef WOLFSSL_KEIL
  48178. "adcs r4, r4, r7\n\t"
  48179. #elif defined(__clang__)
  48180. "adcs r4, r7\n\t"
  48181. #else
  48182. "adc r4, r7\n\t"
  48183. #endif
  48184. #ifdef WOLFSSL_KEIL
  48185. "adcs r5, r5, %[r]\n\t"
  48186. #elif defined(__clang__)
  48187. "adcs r5, %[r]\n\t"
  48188. #else
  48189. "adc r5, %[r]\n\t"
  48190. #endif
  48191. "# A[10] * B[8]\n\t"
  48192. "mov %[a], r9\n\t"
  48193. "mov %[b], r10\n\t"
  48194. "ldr %[a], [%[a], #40]\n\t"
  48195. "ldr %[b], [%[b], #32]\n\t"
  48196. "uxth r6, %[a]\n\t"
  48197. "uxth r7, %[b]\n\t"
  48198. #ifdef WOLFSSL_KEIL
  48199. "muls r7, r6, r7\n\t"
  48200. #elif defined(__clang__)
  48201. "muls r7, r6\n\t"
  48202. #else
  48203. "mul r7, r6\n\t"
  48204. #endif
  48205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48206. "adds r3, r3, r7\n\t"
  48207. #else
  48208. "add r3, r3, r7\n\t"
  48209. #endif
  48210. #ifdef WOLFSSL_KEIL
  48211. "adcs r4, r4, %[r]\n\t"
  48212. #elif defined(__clang__)
  48213. "adcs r4, %[r]\n\t"
  48214. #else
  48215. "adc r4, %[r]\n\t"
  48216. #endif
  48217. #ifdef WOLFSSL_KEIL
  48218. "adcs r5, r5, %[r]\n\t"
  48219. #elif defined(__clang__)
  48220. "adcs r5, %[r]\n\t"
  48221. #else
  48222. "adc r5, %[r]\n\t"
  48223. #endif
  48224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48225. "lsrs r7, %[b], #16\n\t"
  48226. #else
  48227. "lsr r7, %[b], #16\n\t"
  48228. #endif
  48229. #ifdef WOLFSSL_KEIL
  48230. "muls r6, r7, r6\n\t"
  48231. #elif defined(__clang__)
  48232. "muls r6, r7\n\t"
  48233. #else
  48234. "mul r6, r7\n\t"
  48235. #endif
  48236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48237. "lsrs r7, r6, #16\n\t"
  48238. #else
  48239. "lsr r7, r6, #16\n\t"
  48240. #endif
  48241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48242. "lsls r6, r6, #16\n\t"
  48243. #else
  48244. "lsl r6, r6, #16\n\t"
  48245. #endif
  48246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48247. "adds r3, r3, r6\n\t"
  48248. #else
  48249. "add r3, r3, r6\n\t"
  48250. #endif
  48251. #ifdef WOLFSSL_KEIL
  48252. "adcs r4, r4, r7\n\t"
  48253. #elif defined(__clang__)
  48254. "adcs r4, r7\n\t"
  48255. #else
  48256. "adc r4, r7\n\t"
  48257. #endif
  48258. #ifdef WOLFSSL_KEIL
  48259. "adcs r5, r5, %[r]\n\t"
  48260. #elif defined(__clang__)
  48261. "adcs r5, %[r]\n\t"
  48262. #else
  48263. "adc r5, %[r]\n\t"
  48264. #endif
  48265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48266. "lsrs r6, %[a], #16\n\t"
  48267. #else
  48268. "lsr r6, %[a], #16\n\t"
  48269. #endif
  48270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48271. "lsrs r7, %[b], #16\n\t"
  48272. #else
  48273. "lsr r7, %[b], #16\n\t"
  48274. #endif
  48275. #ifdef WOLFSSL_KEIL
  48276. "muls r7, r6, r7\n\t"
  48277. #elif defined(__clang__)
  48278. "muls r7, r6\n\t"
  48279. #else
  48280. "mul r7, r6\n\t"
  48281. #endif
  48282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48283. "adds r4, r4, r7\n\t"
  48284. #else
  48285. "add r4, r4, r7\n\t"
  48286. #endif
  48287. #ifdef WOLFSSL_KEIL
  48288. "adcs r5, r5, %[r]\n\t"
  48289. #elif defined(__clang__)
  48290. "adcs r5, %[r]\n\t"
  48291. #else
  48292. "adc r5, %[r]\n\t"
  48293. #endif
  48294. "uxth r7, %[b]\n\t"
  48295. #ifdef WOLFSSL_KEIL
  48296. "muls r6, r7, r6\n\t"
  48297. #elif defined(__clang__)
  48298. "muls r6, r7\n\t"
  48299. #else
  48300. "mul r6, r7\n\t"
  48301. #endif
  48302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48303. "lsrs r7, r6, #16\n\t"
  48304. #else
  48305. "lsr r7, r6, #16\n\t"
  48306. #endif
  48307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48308. "lsls r6, r6, #16\n\t"
  48309. #else
  48310. "lsl r6, r6, #16\n\t"
  48311. #endif
  48312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48313. "adds r3, r3, r6\n\t"
  48314. #else
  48315. "add r3, r3, r6\n\t"
  48316. #endif
  48317. #ifdef WOLFSSL_KEIL
  48318. "adcs r4, r4, r7\n\t"
  48319. #elif defined(__clang__)
  48320. "adcs r4, r7\n\t"
  48321. #else
  48322. "adc r4, r7\n\t"
  48323. #endif
  48324. #ifdef WOLFSSL_KEIL
  48325. "adcs r5, r5, %[r]\n\t"
  48326. #elif defined(__clang__)
  48327. "adcs r5, %[r]\n\t"
  48328. #else
  48329. "adc r5, %[r]\n\t"
  48330. #endif
  48331. "# A[9] * B[9]\n\t"
  48332. "mov %[a], r9\n\t"
  48333. "mov %[b], r10\n\t"
  48334. "ldr %[a], [%[a], #36]\n\t"
  48335. "ldr %[b], [%[b], #36]\n\t"
  48336. "uxth r6, %[a]\n\t"
  48337. "uxth r7, %[b]\n\t"
  48338. #ifdef WOLFSSL_KEIL
  48339. "muls r7, r6, r7\n\t"
  48340. #elif defined(__clang__)
  48341. "muls r7, r6\n\t"
  48342. #else
  48343. "mul r7, r6\n\t"
  48344. #endif
  48345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48346. "adds r3, r3, r7\n\t"
  48347. #else
  48348. "add r3, r3, r7\n\t"
  48349. #endif
  48350. #ifdef WOLFSSL_KEIL
  48351. "adcs r4, r4, %[r]\n\t"
  48352. #elif defined(__clang__)
  48353. "adcs r4, %[r]\n\t"
  48354. #else
  48355. "adc r4, %[r]\n\t"
  48356. #endif
  48357. #ifdef WOLFSSL_KEIL
  48358. "adcs r5, r5, %[r]\n\t"
  48359. #elif defined(__clang__)
  48360. "adcs r5, %[r]\n\t"
  48361. #else
  48362. "adc r5, %[r]\n\t"
  48363. #endif
  48364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48365. "lsrs r7, %[b], #16\n\t"
  48366. #else
  48367. "lsr r7, %[b], #16\n\t"
  48368. #endif
  48369. #ifdef WOLFSSL_KEIL
  48370. "muls r6, r7, r6\n\t"
  48371. #elif defined(__clang__)
  48372. "muls r6, r7\n\t"
  48373. #else
  48374. "mul r6, r7\n\t"
  48375. #endif
  48376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48377. "lsrs r7, r6, #16\n\t"
  48378. #else
  48379. "lsr r7, r6, #16\n\t"
  48380. #endif
  48381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48382. "lsls r6, r6, #16\n\t"
  48383. #else
  48384. "lsl r6, r6, #16\n\t"
  48385. #endif
  48386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48387. "adds r3, r3, r6\n\t"
  48388. #else
  48389. "add r3, r3, r6\n\t"
  48390. #endif
  48391. #ifdef WOLFSSL_KEIL
  48392. "adcs r4, r4, r7\n\t"
  48393. #elif defined(__clang__)
  48394. "adcs r4, r7\n\t"
  48395. #else
  48396. "adc r4, r7\n\t"
  48397. #endif
  48398. #ifdef WOLFSSL_KEIL
  48399. "adcs r5, r5, %[r]\n\t"
  48400. #elif defined(__clang__)
  48401. "adcs r5, %[r]\n\t"
  48402. #else
  48403. "adc r5, %[r]\n\t"
  48404. #endif
  48405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48406. "lsrs r6, %[a], #16\n\t"
  48407. #else
  48408. "lsr r6, %[a], #16\n\t"
  48409. #endif
  48410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48411. "lsrs r7, %[b], #16\n\t"
  48412. #else
  48413. "lsr r7, %[b], #16\n\t"
  48414. #endif
  48415. #ifdef WOLFSSL_KEIL
  48416. "muls r7, r6, r7\n\t"
  48417. #elif defined(__clang__)
  48418. "muls r7, r6\n\t"
  48419. #else
  48420. "mul r7, r6\n\t"
  48421. #endif
  48422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48423. "adds r4, r4, r7\n\t"
  48424. #else
  48425. "add r4, r4, r7\n\t"
  48426. #endif
  48427. #ifdef WOLFSSL_KEIL
  48428. "adcs r5, r5, %[r]\n\t"
  48429. #elif defined(__clang__)
  48430. "adcs r5, %[r]\n\t"
  48431. #else
  48432. "adc r5, %[r]\n\t"
  48433. #endif
  48434. "uxth r7, %[b]\n\t"
  48435. #ifdef WOLFSSL_KEIL
  48436. "muls r6, r7, r6\n\t"
  48437. #elif defined(__clang__)
  48438. "muls r6, r7\n\t"
  48439. #else
  48440. "mul r6, r7\n\t"
  48441. #endif
  48442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48443. "lsrs r7, r6, #16\n\t"
  48444. #else
  48445. "lsr r7, r6, #16\n\t"
  48446. #endif
  48447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48448. "lsls r6, r6, #16\n\t"
  48449. #else
  48450. "lsl r6, r6, #16\n\t"
  48451. #endif
  48452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48453. "adds r3, r3, r6\n\t"
  48454. #else
  48455. "add r3, r3, r6\n\t"
  48456. #endif
  48457. #ifdef WOLFSSL_KEIL
  48458. "adcs r4, r4, r7\n\t"
  48459. #elif defined(__clang__)
  48460. "adcs r4, r7\n\t"
  48461. #else
  48462. "adc r4, r7\n\t"
  48463. #endif
  48464. #ifdef WOLFSSL_KEIL
  48465. "adcs r5, r5, %[r]\n\t"
  48466. #elif defined(__clang__)
  48467. "adcs r5, %[r]\n\t"
  48468. #else
  48469. "adc r5, %[r]\n\t"
  48470. #endif
  48471. "# A[8] * B[10]\n\t"
  48472. "mov %[a], r9\n\t"
  48473. "mov %[b], r10\n\t"
  48474. "ldr %[a], [%[a], #32]\n\t"
  48475. "ldr %[b], [%[b], #40]\n\t"
  48476. "uxth r6, %[a]\n\t"
  48477. "uxth r7, %[b]\n\t"
  48478. #ifdef WOLFSSL_KEIL
  48479. "muls r7, r6, r7\n\t"
  48480. #elif defined(__clang__)
  48481. "muls r7, r6\n\t"
  48482. #else
  48483. "mul r7, r6\n\t"
  48484. #endif
  48485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48486. "adds r3, r3, r7\n\t"
  48487. #else
  48488. "add r3, r3, r7\n\t"
  48489. #endif
  48490. #ifdef WOLFSSL_KEIL
  48491. "adcs r4, r4, %[r]\n\t"
  48492. #elif defined(__clang__)
  48493. "adcs r4, %[r]\n\t"
  48494. #else
  48495. "adc r4, %[r]\n\t"
  48496. #endif
  48497. #ifdef WOLFSSL_KEIL
  48498. "adcs r5, r5, %[r]\n\t"
  48499. #elif defined(__clang__)
  48500. "adcs r5, %[r]\n\t"
  48501. #else
  48502. "adc r5, %[r]\n\t"
  48503. #endif
  48504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48505. "lsrs r7, %[b], #16\n\t"
  48506. #else
  48507. "lsr r7, %[b], #16\n\t"
  48508. #endif
  48509. #ifdef WOLFSSL_KEIL
  48510. "muls r6, r7, r6\n\t"
  48511. #elif defined(__clang__)
  48512. "muls r6, r7\n\t"
  48513. #else
  48514. "mul r6, r7\n\t"
  48515. #endif
  48516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48517. "lsrs r7, r6, #16\n\t"
  48518. #else
  48519. "lsr r7, r6, #16\n\t"
  48520. #endif
  48521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48522. "lsls r6, r6, #16\n\t"
  48523. #else
  48524. "lsl r6, r6, #16\n\t"
  48525. #endif
  48526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48527. "adds r3, r3, r6\n\t"
  48528. #else
  48529. "add r3, r3, r6\n\t"
  48530. #endif
  48531. #ifdef WOLFSSL_KEIL
  48532. "adcs r4, r4, r7\n\t"
  48533. #elif defined(__clang__)
  48534. "adcs r4, r7\n\t"
  48535. #else
  48536. "adc r4, r7\n\t"
  48537. #endif
  48538. #ifdef WOLFSSL_KEIL
  48539. "adcs r5, r5, %[r]\n\t"
  48540. #elif defined(__clang__)
  48541. "adcs r5, %[r]\n\t"
  48542. #else
  48543. "adc r5, %[r]\n\t"
  48544. #endif
  48545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48546. "lsrs r6, %[a], #16\n\t"
  48547. #else
  48548. "lsr r6, %[a], #16\n\t"
  48549. #endif
  48550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48551. "lsrs r7, %[b], #16\n\t"
  48552. #else
  48553. "lsr r7, %[b], #16\n\t"
  48554. #endif
  48555. #ifdef WOLFSSL_KEIL
  48556. "muls r7, r6, r7\n\t"
  48557. #elif defined(__clang__)
  48558. "muls r7, r6\n\t"
  48559. #else
  48560. "mul r7, r6\n\t"
  48561. #endif
  48562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48563. "adds r4, r4, r7\n\t"
  48564. #else
  48565. "add r4, r4, r7\n\t"
  48566. #endif
  48567. #ifdef WOLFSSL_KEIL
  48568. "adcs r5, r5, %[r]\n\t"
  48569. #elif defined(__clang__)
  48570. "adcs r5, %[r]\n\t"
  48571. #else
  48572. "adc r5, %[r]\n\t"
  48573. #endif
  48574. "uxth r7, %[b]\n\t"
  48575. #ifdef WOLFSSL_KEIL
  48576. "muls r6, r7, r6\n\t"
  48577. #elif defined(__clang__)
  48578. "muls r6, r7\n\t"
  48579. #else
  48580. "mul r6, r7\n\t"
  48581. #endif
  48582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48583. "lsrs r7, r6, #16\n\t"
  48584. #else
  48585. "lsr r7, r6, #16\n\t"
  48586. #endif
  48587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48588. "lsls r6, r6, #16\n\t"
  48589. #else
  48590. "lsl r6, r6, #16\n\t"
  48591. #endif
  48592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48593. "adds r3, r3, r6\n\t"
  48594. #else
  48595. "add r3, r3, r6\n\t"
  48596. #endif
  48597. #ifdef WOLFSSL_KEIL
  48598. "adcs r4, r4, r7\n\t"
  48599. #elif defined(__clang__)
  48600. "adcs r4, r7\n\t"
  48601. #else
  48602. "adc r4, r7\n\t"
  48603. #endif
  48604. #ifdef WOLFSSL_KEIL
  48605. "adcs r5, r5, %[r]\n\t"
  48606. #elif defined(__clang__)
  48607. "adcs r5, %[r]\n\t"
  48608. #else
  48609. "adc r5, %[r]\n\t"
  48610. #endif
  48611. "# A[7] * B[11]\n\t"
  48612. "mov %[a], r9\n\t"
  48613. "mov %[b], r10\n\t"
  48614. "ldr %[a], [%[a], #28]\n\t"
  48615. "ldr %[b], [%[b], #44]\n\t"
  48616. "uxth r6, %[a]\n\t"
  48617. "uxth r7, %[b]\n\t"
  48618. #ifdef WOLFSSL_KEIL
  48619. "muls r7, r6, r7\n\t"
  48620. #elif defined(__clang__)
  48621. "muls r7, r6\n\t"
  48622. #else
  48623. "mul r7, r6\n\t"
  48624. #endif
  48625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48626. "adds r3, r3, r7\n\t"
  48627. #else
  48628. "add r3, r3, r7\n\t"
  48629. #endif
  48630. #ifdef WOLFSSL_KEIL
  48631. "adcs r4, r4, %[r]\n\t"
  48632. #elif defined(__clang__)
  48633. "adcs r4, %[r]\n\t"
  48634. #else
  48635. "adc r4, %[r]\n\t"
  48636. #endif
  48637. #ifdef WOLFSSL_KEIL
  48638. "adcs r5, r5, %[r]\n\t"
  48639. #elif defined(__clang__)
  48640. "adcs r5, %[r]\n\t"
  48641. #else
  48642. "adc r5, %[r]\n\t"
  48643. #endif
  48644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48645. "lsrs r7, %[b], #16\n\t"
  48646. #else
  48647. "lsr r7, %[b], #16\n\t"
  48648. #endif
  48649. #ifdef WOLFSSL_KEIL
  48650. "muls r6, r7, r6\n\t"
  48651. #elif defined(__clang__)
  48652. "muls r6, r7\n\t"
  48653. #else
  48654. "mul r6, r7\n\t"
  48655. #endif
  48656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48657. "lsrs r7, r6, #16\n\t"
  48658. #else
  48659. "lsr r7, r6, #16\n\t"
  48660. #endif
  48661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48662. "lsls r6, r6, #16\n\t"
  48663. #else
  48664. "lsl r6, r6, #16\n\t"
  48665. #endif
  48666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48667. "adds r3, r3, r6\n\t"
  48668. #else
  48669. "add r3, r3, r6\n\t"
  48670. #endif
  48671. #ifdef WOLFSSL_KEIL
  48672. "adcs r4, r4, r7\n\t"
  48673. #elif defined(__clang__)
  48674. "adcs r4, r7\n\t"
  48675. #else
  48676. "adc r4, r7\n\t"
  48677. #endif
  48678. #ifdef WOLFSSL_KEIL
  48679. "adcs r5, r5, %[r]\n\t"
  48680. #elif defined(__clang__)
  48681. "adcs r5, %[r]\n\t"
  48682. #else
  48683. "adc r5, %[r]\n\t"
  48684. #endif
  48685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48686. "lsrs r6, %[a], #16\n\t"
  48687. #else
  48688. "lsr r6, %[a], #16\n\t"
  48689. #endif
  48690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48691. "lsrs r7, %[b], #16\n\t"
  48692. #else
  48693. "lsr r7, %[b], #16\n\t"
  48694. #endif
  48695. #ifdef WOLFSSL_KEIL
  48696. "muls r7, r6, r7\n\t"
  48697. #elif defined(__clang__)
  48698. "muls r7, r6\n\t"
  48699. #else
  48700. "mul r7, r6\n\t"
  48701. #endif
  48702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48703. "adds r4, r4, r7\n\t"
  48704. #else
  48705. "add r4, r4, r7\n\t"
  48706. #endif
  48707. #ifdef WOLFSSL_KEIL
  48708. "adcs r5, r5, %[r]\n\t"
  48709. #elif defined(__clang__)
  48710. "adcs r5, %[r]\n\t"
  48711. #else
  48712. "adc r5, %[r]\n\t"
  48713. #endif
  48714. "uxth r7, %[b]\n\t"
  48715. #ifdef WOLFSSL_KEIL
  48716. "muls r6, r7, r6\n\t"
  48717. #elif defined(__clang__)
  48718. "muls r6, r7\n\t"
  48719. #else
  48720. "mul r6, r7\n\t"
  48721. #endif
  48722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48723. "lsrs r7, r6, #16\n\t"
  48724. #else
  48725. "lsr r7, r6, #16\n\t"
  48726. #endif
  48727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48728. "lsls r6, r6, #16\n\t"
  48729. #else
  48730. "lsl r6, r6, #16\n\t"
  48731. #endif
  48732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48733. "adds r3, r3, r6\n\t"
  48734. #else
  48735. "add r3, r3, r6\n\t"
  48736. #endif
  48737. #ifdef WOLFSSL_KEIL
  48738. "adcs r4, r4, r7\n\t"
  48739. #elif defined(__clang__)
  48740. "adcs r4, r7\n\t"
  48741. #else
  48742. "adc r4, r7\n\t"
  48743. #endif
  48744. #ifdef WOLFSSL_KEIL
  48745. "adcs r5, r5, %[r]\n\t"
  48746. #elif defined(__clang__)
  48747. "adcs r5, %[r]\n\t"
  48748. #else
  48749. "adc r5, %[r]\n\t"
  48750. #endif
  48751. "mov %[r], r8\n\t"
  48752. "str r3, [%[r], #72]\n\t"
  48753. "movs %[r], #0\n\t"
  48754. "# A[8] * B[11]\n\t"
  48755. "movs r3, #0\n\t"
  48756. "mov %[a], r9\n\t"
  48757. "mov %[b], r10\n\t"
  48758. "ldr %[a], [%[a], #32]\n\t"
  48759. "ldr %[b], [%[b], #44]\n\t"
  48760. "uxth r6, %[a]\n\t"
  48761. "uxth r7, %[b]\n\t"
  48762. #ifdef WOLFSSL_KEIL
  48763. "muls r7, r6, r7\n\t"
  48764. #elif defined(__clang__)
  48765. "muls r7, r6\n\t"
  48766. #else
  48767. "mul r7, r6\n\t"
  48768. #endif
  48769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48770. "adds r4, r4, r7\n\t"
  48771. #else
  48772. "add r4, r4, r7\n\t"
  48773. #endif
  48774. #ifdef WOLFSSL_KEIL
  48775. "adcs r5, r5, %[r]\n\t"
  48776. #elif defined(__clang__)
  48777. "adcs r5, %[r]\n\t"
  48778. #else
  48779. "adc r5, %[r]\n\t"
  48780. #endif
  48781. #ifdef WOLFSSL_KEIL
  48782. "adcs r3, r3, %[r]\n\t"
  48783. #elif defined(__clang__)
  48784. "adcs r3, %[r]\n\t"
  48785. #else
  48786. "adc r3, %[r]\n\t"
  48787. #endif
  48788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48789. "lsrs r7, %[b], #16\n\t"
  48790. #else
  48791. "lsr r7, %[b], #16\n\t"
  48792. #endif
  48793. #ifdef WOLFSSL_KEIL
  48794. "muls r6, r7, r6\n\t"
  48795. #elif defined(__clang__)
  48796. "muls r6, r7\n\t"
  48797. #else
  48798. "mul r6, r7\n\t"
  48799. #endif
  48800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48801. "lsrs r7, r6, #16\n\t"
  48802. #else
  48803. "lsr r7, r6, #16\n\t"
  48804. #endif
  48805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48806. "lsls r6, r6, #16\n\t"
  48807. #else
  48808. "lsl r6, r6, #16\n\t"
  48809. #endif
  48810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48811. "adds r4, r4, r6\n\t"
  48812. #else
  48813. "add r4, r4, r6\n\t"
  48814. #endif
  48815. #ifdef WOLFSSL_KEIL
  48816. "adcs r5, r5, r7\n\t"
  48817. #elif defined(__clang__)
  48818. "adcs r5, r7\n\t"
  48819. #else
  48820. "adc r5, r7\n\t"
  48821. #endif
  48822. #ifdef WOLFSSL_KEIL
  48823. "adcs r3, r3, %[r]\n\t"
  48824. #elif defined(__clang__)
  48825. "adcs r3, %[r]\n\t"
  48826. #else
  48827. "adc r3, %[r]\n\t"
  48828. #endif
  48829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48830. "lsrs r6, %[a], #16\n\t"
  48831. #else
  48832. "lsr r6, %[a], #16\n\t"
  48833. #endif
  48834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48835. "lsrs r7, %[b], #16\n\t"
  48836. #else
  48837. "lsr r7, %[b], #16\n\t"
  48838. #endif
  48839. #ifdef WOLFSSL_KEIL
  48840. "muls r7, r6, r7\n\t"
  48841. #elif defined(__clang__)
  48842. "muls r7, r6\n\t"
  48843. #else
  48844. "mul r7, r6\n\t"
  48845. #endif
  48846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48847. "adds r5, r5, r7\n\t"
  48848. #else
  48849. "add r5, r5, r7\n\t"
  48850. #endif
  48851. #ifdef WOLFSSL_KEIL
  48852. "adcs r3, r3, %[r]\n\t"
  48853. #elif defined(__clang__)
  48854. "adcs r3, %[r]\n\t"
  48855. #else
  48856. "adc r3, %[r]\n\t"
  48857. #endif
  48858. "uxth r7, %[b]\n\t"
  48859. #ifdef WOLFSSL_KEIL
  48860. "muls r6, r7, r6\n\t"
  48861. #elif defined(__clang__)
  48862. "muls r6, r7\n\t"
  48863. #else
  48864. "mul r6, r7\n\t"
  48865. #endif
  48866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48867. "lsrs r7, r6, #16\n\t"
  48868. #else
  48869. "lsr r7, r6, #16\n\t"
  48870. #endif
  48871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48872. "lsls r6, r6, #16\n\t"
  48873. #else
  48874. "lsl r6, r6, #16\n\t"
  48875. #endif
  48876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48877. "adds r4, r4, r6\n\t"
  48878. #else
  48879. "add r4, r4, r6\n\t"
  48880. #endif
  48881. #ifdef WOLFSSL_KEIL
  48882. "adcs r5, r5, r7\n\t"
  48883. #elif defined(__clang__)
  48884. "adcs r5, r7\n\t"
  48885. #else
  48886. "adc r5, r7\n\t"
  48887. #endif
  48888. #ifdef WOLFSSL_KEIL
  48889. "adcs r3, r3, %[r]\n\t"
  48890. #elif defined(__clang__)
  48891. "adcs r3, %[r]\n\t"
  48892. #else
  48893. "adc r3, %[r]\n\t"
  48894. #endif
  48895. "# A[9] * B[10]\n\t"
  48896. "mov %[a], r9\n\t"
  48897. "mov %[b], r10\n\t"
  48898. "ldr %[a], [%[a], #36]\n\t"
  48899. "ldr %[b], [%[b], #40]\n\t"
  48900. "uxth r6, %[a]\n\t"
  48901. "uxth r7, %[b]\n\t"
  48902. #ifdef WOLFSSL_KEIL
  48903. "muls r7, r6, r7\n\t"
  48904. #elif defined(__clang__)
  48905. "muls r7, r6\n\t"
  48906. #else
  48907. "mul r7, r6\n\t"
  48908. #endif
  48909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48910. "adds r4, r4, r7\n\t"
  48911. #else
  48912. "add r4, r4, r7\n\t"
  48913. #endif
  48914. #ifdef WOLFSSL_KEIL
  48915. "adcs r5, r5, %[r]\n\t"
  48916. #elif defined(__clang__)
  48917. "adcs r5, %[r]\n\t"
  48918. #else
  48919. "adc r5, %[r]\n\t"
  48920. #endif
  48921. #ifdef WOLFSSL_KEIL
  48922. "adcs r3, r3, %[r]\n\t"
  48923. #elif defined(__clang__)
  48924. "adcs r3, %[r]\n\t"
  48925. #else
  48926. "adc r3, %[r]\n\t"
  48927. #endif
  48928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48929. "lsrs r7, %[b], #16\n\t"
  48930. #else
  48931. "lsr r7, %[b], #16\n\t"
  48932. #endif
  48933. #ifdef WOLFSSL_KEIL
  48934. "muls r6, r7, r6\n\t"
  48935. #elif defined(__clang__)
  48936. "muls r6, r7\n\t"
  48937. #else
  48938. "mul r6, r7\n\t"
  48939. #endif
  48940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48941. "lsrs r7, r6, #16\n\t"
  48942. #else
  48943. "lsr r7, r6, #16\n\t"
  48944. #endif
  48945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48946. "lsls r6, r6, #16\n\t"
  48947. #else
  48948. "lsl r6, r6, #16\n\t"
  48949. #endif
  48950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48951. "adds r4, r4, r6\n\t"
  48952. #else
  48953. "add r4, r4, r6\n\t"
  48954. #endif
  48955. #ifdef WOLFSSL_KEIL
  48956. "adcs r5, r5, r7\n\t"
  48957. #elif defined(__clang__)
  48958. "adcs r5, r7\n\t"
  48959. #else
  48960. "adc r5, r7\n\t"
  48961. #endif
  48962. #ifdef WOLFSSL_KEIL
  48963. "adcs r3, r3, %[r]\n\t"
  48964. #elif defined(__clang__)
  48965. "adcs r3, %[r]\n\t"
  48966. #else
  48967. "adc r3, %[r]\n\t"
  48968. #endif
  48969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48970. "lsrs r6, %[a], #16\n\t"
  48971. #else
  48972. "lsr r6, %[a], #16\n\t"
  48973. #endif
  48974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48975. "lsrs r7, %[b], #16\n\t"
  48976. #else
  48977. "lsr r7, %[b], #16\n\t"
  48978. #endif
  48979. #ifdef WOLFSSL_KEIL
  48980. "muls r7, r6, r7\n\t"
  48981. #elif defined(__clang__)
  48982. "muls r7, r6\n\t"
  48983. #else
  48984. "mul r7, r6\n\t"
  48985. #endif
  48986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48987. "adds r5, r5, r7\n\t"
  48988. #else
  48989. "add r5, r5, r7\n\t"
  48990. #endif
  48991. #ifdef WOLFSSL_KEIL
  48992. "adcs r3, r3, %[r]\n\t"
  48993. #elif defined(__clang__)
  48994. "adcs r3, %[r]\n\t"
  48995. #else
  48996. "adc r3, %[r]\n\t"
  48997. #endif
  48998. "uxth r7, %[b]\n\t"
  48999. #ifdef WOLFSSL_KEIL
  49000. "muls r6, r7, r6\n\t"
  49001. #elif defined(__clang__)
  49002. "muls r6, r7\n\t"
  49003. #else
  49004. "mul r6, r7\n\t"
  49005. #endif
  49006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49007. "lsrs r7, r6, #16\n\t"
  49008. #else
  49009. "lsr r7, r6, #16\n\t"
  49010. #endif
  49011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49012. "lsls r6, r6, #16\n\t"
  49013. #else
  49014. "lsl r6, r6, #16\n\t"
  49015. #endif
  49016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49017. "adds r4, r4, r6\n\t"
  49018. #else
  49019. "add r4, r4, r6\n\t"
  49020. #endif
  49021. #ifdef WOLFSSL_KEIL
  49022. "adcs r5, r5, r7\n\t"
  49023. #elif defined(__clang__)
  49024. "adcs r5, r7\n\t"
  49025. #else
  49026. "adc r5, r7\n\t"
  49027. #endif
  49028. #ifdef WOLFSSL_KEIL
  49029. "adcs r3, r3, %[r]\n\t"
  49030. #elif defined(__clang__)
  49031. "adcs r3, %[r]\n\t"
  49032. #else
  49033. "adc r3, %[r]\n\t"
  49034. #endif
  49035. "# A[10] * B[9]\n\t"
  49036. "mov %[a], r9\n\t"
  49037. "mov %[b], r10\n\t"
  49038. "ldr %[a], [%[a], #40]\n\t"
  49039. "ldr %[b], [%[b], #36]\n\t"
  49040. "uxth r6, %[a]\n\t"
  49041. "uxth r7, %[b]\n\t"
  49042. #ifdef WOLFSSL_KEIL
  49043. "muls r7, r6, r7\n\t"
  49044. #elif defined(__clang__)
  49045. "muls r7, r6\n\t"
  49046. #else
  49047. "mul r7, r6\n\t"
  49048. #endif
  49049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49050. "adds r4, r4, r7\n\t"
  49051. #else
  49052. "add r4, r4, r7\n\t"
  49053. #endif
  49054. #ifdef WOLFSSL_KEIL
  49055. "adcs r5, r5, %[r]\n\t"
  49056. #elif defined(__clang__)
  49057. "adcs r5, %[r]\n\t"
  49058. #else
  49059. "adc r5, %[r]\n\t"
  49060. #endif
  49061. #ifdef WOLFSSL_KEIL
  49062. "adcs r3, r3, %[r]\n\t"
  49063. #elif defined(__clang__)
  49064. "adcs r3, %[r]\n\t"
  49065. #else
  49066. "adc r3, %[r]\n\t"
  49067. #endif
  49068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49069. "lsrs r7, %[b], #16\n\t"
  49070. #else
  49071. "lsr r7, %[b], #16\n\t"
  49072. #endif
  49073. #ifdef WOLFSSL_KEIL
  49074. "muls r6, r7, r6\n\t"
  49075. #elif defined(__clang__)
  49076. "muls r6, r7\n\t"
  49077. #else
  49078. "mul r6, r7\n\t"
  49079. #endif
  49080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49081. "lsrs r7, r6, #16\n\t"
  49082. #else
  49083. "lsr r7, r6, #16\n\t"
  49084. #endif
  49085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49086. "lsls r6, r6, #16\n\t"
  49087. #else
  49088. "lsl r6, r6, #16\n\t"
  49089. #endif
  49090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49091. "adds r4, r4, r6\n\t"
  49092. #else
  49093. "add r4, r4, r6\n\t"
  49094. #endif
  49095. #ifdef WOLFSSL_KEIL
  49096. "adcs r5, r5, r7\n\t"
  49097. #elif defined(__clang__)
  49098. "adcs r5, r7\n\t"
  49099. #else
  49100. "adc r5, r7\n\t"
  49101. #endif
  49102. #ifdef WOLFSSL_KEIL
  49103. "adcs r3, r3, %[r]\n\t"
  49104. #elif defined(__clang__)
  49105. "adcs r3, %[r]\n\t"
  49106. #else
  49107. "adc r3, %[r]\n\t"
  49108. #endif
  49109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49110. "lsrs r6, %[a], #16\n\t"
  49111. #else
  49112. "lsr r6, %[a], #16\n\t"
  49113. #endif
  49114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49115. "lsrs r7, %[b], #16\n\t"
  49116. #else
  49117. "lsr r7, %[b], #16\n\t"
  49118. #endif
  49119. #ifdef WOLFSSL_KEIL
  49120. "muls r7, r6, r7\n\t"
  49121. #elif defined(__clang__)
  49122. "muls r7, r6\n\t"
  49123. #else
  49124. "mul r7, r6\n\t"
  49125. #endif
  49126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49127. "adds r5, r5, r7\n\t"
  49128. #else
  49129. "add r5, r5, r7\n\t"
  49130. #endif
  49131. #ifdef WOLFSSL_KEIL
  49132. "adcs r3, r3, %[r]\n\t"
  49133. #elif defined(__clang__)
  49134. "adcs r3, %[r]\n\t"
  49135. #else
  49136. "adc r3, %[r]\n\t"
  49137. #endif
  49138. "uxth r7, %[b]\n\t"
  49139. #ifdef WOLFSSL_KEIL
  49140. "muls r6, r7, r6\n\t"
  49141. #elif defined(__clang__)
  49142. "muls r6, r7\n\t"
  49143. #else
  49144. "mul r6, r7\n\t"
  49145. #endif
  49146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49147. "lsrs r7, r6, #16\n\t"
  49148. #else
  49149. "lsr r7, r6, #16\n\t"
  49150. #endif
  49151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49152. "lsls r6, r6, #16\n\t"
  49153. #else
  49154. "lsl r6, r6, #16\n\t"
  49155. #endif
  49156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49157. "adds r4, r4, r6\n\t"
  49158. #else
  49159. "add r4, r4, r6\n\t"
  49160. #endif
  49161. #ifdef WOLFSSL_KEIL
  49162. "adcs r5, r5, r7\n\t"
  49163. #elif defined(__clang__)
  49164. "adcs r5, r7\n\t"
  49165. #else
  49166. "adc r5, r7\n\t"
  49167. #endif
  49168. #ifdef WOLFSSL_KEIL
  49169. "adcs r3, r3, %[r]\n\t"
  49170. #elif defined(__clang__)
  49171. "adcs r3, %[r]\n\t"
  49172. #else
  49173. "adc r3, %[r]\n\t"
  49174. #endif
  49175. "# A[11] * B[8]\n\t"
  49176. "mov %[a], r9\n\t"
  49177. "mov %[b], r10\n\t"
  49178. "ldr %[a], [%[a], #44]\n\t"
  49179. "ldr %[b], [%[b], #32]\n\t"
  49180. "uxth r6, %[a]\n\t"
  49181. "uxth r7, %[b]\n\t"
  49182. #ifdef WOLFSSL_KEIL
  49183. "muls r7, r6, r7\n\t"
  49184. #elif defined(__clang__)
  49185. "muls r7, r6\n\t"
  49186. #else
  49187. "mul r7, r6\n\t"
  49188. #endif
  49189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49190. "adds r4, r4, r7\n\t"
  49191. #else
  49192. "add r4, r4, r7\n\t"
  49193. #endif
  49194. #ifdef WOLFSSL_KEIL
  49195. "adcs r5, r5, %[r]\n\t"
  49196. #elif defined(__clang__)
  49197. "adcs r5, %[r]\n\t"
  49198. #else
  49199. "adc r5, %[r]\n\t"
  49200. #endif
  49201. #ifdef WOLFSSL_KEIL
  49202. "adcs r3, r3, %[r]\n\t"
  49203. #elif defined(__clang__)
  49204. "adcs r3, %[r]\n\t"
  49205. #else
  49206. "adc r3, %[r]\n\t"
  49207. #endif
  49208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49209. "lsrs r7, %[b], #16\n\t"
  49210. #else
  49211. "lsr r7, %[b], #16\n\t"
  49212. #endif
  49213. #ifdef WOLFSSL_KEIL
  49214. "muls r6, r7, r6\n\t"
  49215. #elif defined(__clang__)
  49216. "muls r6, r7\n\t"
  49217. #else
  49218. "mul r6, r7\n\t"
  49219. #endif
  49220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49221. "lsrs r7, r6, #16\n\t"
  49222. #else
  49223. "lsr r7, r6, #16\n\t"
  49224. #endif
  49225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49226. "lsls r6, r6, #16\n\t"
  49227. #else
  49228. "lsl r6, r6, #16\n\t"
  49229. #endif
  49230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49231. "adds r4, r4, r6\n\t"
  49232. #else
  49233. "add r4, r4, r6\n\t"
  49234. #endif
  49235. #ifdef WOLFSSL_KEIL
  49236. "adcs r5, r5, r7\n\t"
  49237. #elif defined(__clang__)
  49238. "adcs r5, r7\n\t"
  49239. #else
  49240. "adc r5, r7\n\t"
  49241. #endif
  49242. #ifdef WOLFSSL_KEIL
  49243. "adcs r3, r3, %[r]\n\t"
  49244. #elif defined(__clang__)
  49245. "adcs r3, %[r]\n\t"
  49246. #else
  49247. "adc r3, %[r]\n\t"
  49248. #endif
  49249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49250. "lsrs r6, %[a], #16\n\t"
  49251. #else
  49252. "lsr r6, %[a], #16\n\t"
  49253. #endif
  49254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49255. "lsrs r7, %[b], #16\n\t"
  49256. #else
  49257. "lsr r7, %[b], #16\n\t"
  49258. #endif
  49259. #ifdef WOLFSSL_KEIL
  49260. "muls r7, r6, r7\n\t"
  49261. #elif defined(__clang__)
  49262. "muls r7, r6\n\t"
  49263. #else
  49264. "mul r7, r6\n\t"
  49265. #endif
  49266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49267. "adds r5, r5, r7\n\t"
  49268. #else
  49269. "add r5, r5, r7\n\t"
  49270. #endif
  49271. #ifdef WOLFSSL_KEIL
  49272. "adcs r3, r3, %[r]\n\t"
  49273. #elif defined(__clang__)
  49274. "adcs r3, %[r]\n\t"
  49275. #else
  49276. "adc r3, %[r]\n\t"
  49277. #endif
  49278. "uxth r7, %[b]\n\t"
  49279. #ifdef WOLFSSL_KEIL
  49280. "muls r6, r7, r6\n\t"
  49281. #elif defined(__clang__)
  49282. "muls r6, r7\n\t"
  49283. #else
  49284. "mul r6, r7\n\t"
  49285. #endif
  49286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49287. "lsrs r7, r6, #16\n\t"
  49288. #else
  49289. "lsr r7, r6, #16\n\t"
  49290. #endif
  49291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49292. "lsls r6, r6, #16\n\t"
  49293. #else
  49294. "lsl r6, r6, #16\n\t"
  49295. #endif
  49296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49297. "adds r4, r4, r6\n\t"
  49298. #else
  49299. "add r4, r4, r6\n\t"
  49300. #endif
  49301. #ifdef WOLFSSL_KEIL
  49302. "adcs r5, r5, r7\n\t"
  49303. #elif defined(__clang__)
  49304. "adcs r5, r7\n\t"
  49305. #else
  49306. "adc r5, r7\n\t"
  49307. #endif
  49308. #ifdef WOLFSSL_KEIL
  49309. "adcs r3, r3, %[r]\n\t"
  49310. #elif defined(__clang__)
  49311. "adcs r3, %[r]\n\t"
  49312. #else
  49313. "adc r3, %[r]\n\t"
  49314. #endif
  49315. "mov %[r], r8\n\t"
  49316. "str r4, [%[r], #76]\n\t"
  49317. "movs %[r], #0\n\t"
  49318. "# A[11] * B[9]\n\t"
  49319. "movs r4, #0\n\t"
  49320. "mov %[a], r9\n\t"
  49321. "mov %[b], r10\n\t"
  49322. "ldr %[a], [%[a], #44]\n\t"
  49323. "ldr %[b], [%[b], #36]\n\t"
  49324. "uxth r6, %[a]\n\t"
  49325. "uxth r7, %[b]\n\t"
  49326. #ifdef WOLFSSL_KEIL
  49327. "muls r7, r6, r7\n\t"
  49328. #elif defined(__clang__)
  49329. "muls r7, r6\n\t"
  49330. #else
  49331. "mul r7, r6\n\t"
  49332. #endif
  49333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49334. "adds r5, r5, r7\n\t"
  49335. #else
  49336. "add r5, r5, r7\n\t"
  49337. #endif
  49338. #ifdef WOLFSSL_KEIL
  49339. "adcs r3, r3, %[r]\n\t"
  49340. #elif defined(__clang__)
  49341. "adcs r3, %[r]\n\t"
  49342. #else
  49343. "adc r3, %[r]\n\t"
  49344. #endif
  49345. #ifdef WOLFSSL_KEIL
  49346. "adcs r4, r4, %[r]\n\t"
  49347. #elif defined(__clang__)
  49348. "adcs r4, %[r]\n\t"
  49349. #else
  49350. "adc r4, %[r]\n\t"
  49351. #endif
  49352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49353. "lsrs r7, %[b], #16\n\t"
  49354. #else
  49355. "lsr r7, %[b], #16\n\t"
  49356. #endif
  49357. #ifdef WOLFSSL_KEIL
  49358. "muls r6, r7, r6\n\t"
  49359. #elif defined(__clang__)
  49360. "muls r6, r7\n\t"
  49361. #else
  49362. "mul r6, r7\n\t"
  49363. #endif
  49364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49365. "lsrs r7, r6, #16\n\t"
  49366. #else
  49367. "lsr r7, r6, #16\n\t"
  49368. #endif
  49369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49370. "lsls r6, r6, #16\n\t"
  49371. #else
  49372. "lsl r6, r6, #16\n\t"
  49373. #endif
  49374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49375. "adds r5, r5, r6\n\t"
  49376. #else
  49377. "add r5, r5, r6\n\t"
  49378. #endif
  49379. #ifdef WOLFSSL_KEIL
  49380. "adcs r3, r3, r7\n\t"
  49381. #elif defined(__clang__)
  49382. "adcs r3, r7\n\t"
  49383. #else
  49384. "adc r3, r7\n\t"
  49385. #endif
  49386. #ifdef WOLFSSL_KEIL
  49387. "adcs r4, r4, %[r]\n\t"
  49388. #elif defined(__clang__)
  49389. "adcs r4, %[r]\n\t"
  49390. #else
  49391. "adc r4, %[r]\n\t"
  49392. #endif
  49393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49394. "lsrs r6, %[a], #16\n\t"
  49395. #else
  49396. "lsr r6, %[a], #16\n\t"
  49397. #endif
  49398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49399. "lsrs r7, %[b], #16\n\t"
  49400. #else
  49401. "lsr r7, %[b], #16\n\t"
  49402. #endif
  49403. #ifdef WOLFSSL_KEIL
  49404. "muls r7, r6, r7\n\t"
  49405. #elif defined(__clang__)
  49406. "muls r7, r6\n\t"
  49407. #else
  49408. "mul r7, r6\n\t"
  49409. #endif
  49410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49411. "adds r3, r3, r7\n\t"
  49412. #else
  49413. "add r3, r3, r7\n\t"
  49414. #endif
  49415. #ifdef WOLFSSL_KEIL
  49416. "adcs r4, r4, %[r]\n\t"
  49417. #elif defined(__clang__)
  49418. "adcs r4, %[r]\n\t"
  49419. #else
  49420. "adc r4, %[r]\n\t"
  49421. #endif
  49422. "uxth r7, %[b]\n\t"
  49423. #ifdef WOLFSSL_KEIL
  49424. "muls r6, r7, r6\n\t"
  49425. #elif defined(__clang__)
  49426. "muls r6, r7\n\t"
  49427. #else
  49428. "mul r6, r7\n\t"
  49429. #endif
  49430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49431. "lsrs r7, r6, #16\n\t"
  49432. #else
  49433. "lsr r7, r6, #16\n\t"
  49434. #endif
  49435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49436. "lsls r6, r6, #16\n\t"
  49437. #else
  49438. "lsl r6, r6, #16\n\t"
  49439. #endif
  49440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49441. "adds r5, r5, r6\n\t"
  49442. #else
  49443. "add r5, r5, r6\n\t"
  49444. #endif
  49445. #ifdef WOLFSSL_KEIL
  49446. "adcs r3, r3, r7\n\t"
  49447. #elif defined(__clang__)
  49448. "adcs r3, r7\n\t"
  49449. #else
  49450. "adc r3, r7\n\t"
  49451. #endif
  49452. #ifdef WOLFSSL_KEIL
  49453. "adcs r4, r4, %[r]\n\t"
  49454. #elif defined(__clang__)
  49455. "adcs r4, %[r]\n\t"
  49456. #else
  49457. "adc r4, %[r]\n\t"
  49458. #endif
  49459. "# A[10] * B[10]\n\t"
  49460. "mov %[a], r9\n\t"
  49461. "mov %[b], r10\n\t"
  49462. "ldr %[a], [%[a], #40]\n\t"
  49463. "ldr %[b], [%[b], #40]\n\t"
  49464. "uxth r6, %[a]\n\t"
  49465. "uxth r7, %[b]\n\t"
  49466. #ifdef WOLFSSL_KEIL
  49467. "muls r7, r6, r7\n\t"
  49468. #elif defined(__clang__)
  49469. "muls r7, r6\n\t"
  49470. #else
  49471. "mul r7, r6\n\t"
  49472. #endif
  49473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49474. "adds r5, r5, r7\n\t"
  49475. #else
  49476. "add r5, r5, r7\n\t"
  49477. #endif
  49478. #ifdef WOLFSSL_KEIL
  49479. "adcs r3, r3, %[r]\n\t"
  49480. #elif defined(__clang__)
  49481. "adcs r3, %[r]\n\t"
  49482. #else
  49483. "adc r3, %[r]\n\t"
  49484. #endif
  49485. #ifdef WOLFSSL_KEIL
  49486. "adcs r4, r4, %[r]\n\t"
  49487. #elif defined(__clang__)
  49488. "adcs r4, %[r]\n\t"
  49489. #else
  49490. "adc r4, %[r]\n\t"
  49491. #endif
  49492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49493. "lsrs r7, %[b], #16\n\t"
  49494. #else
  49495. "lsr r7, %[b], #16\n\t"
  49496. #endif
  49497. #ifdef WOLFSSL_KEIL
  49498. "muls r6, r7, r6\n\t"
  49499. #elif defined(__clang__)
  49500. "muls r6, r7\n\t"
  49501. #else
  49502. "mul r6, r7\n\t"
  49503. #endif
  49504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49505. "lsrs r7, r6, #16\n\t"
  49506. #else
  49507. "lsr r7, r6, #16\n\t"
  49508. #endif
  49509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49510. "lsls r6, r6, #16\n\t"
  49511. #else
  49512. "lsl r6, r6, #16\n\t"
  49513. #endif
  49514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49515. "adds r5, r5, r6\n\t"
  49516. #else
  49517. "add r5, r5, r6\n\t"
  49518. #endif
  49519. #ifdef WOLFSSL_KEIL
  49520. "adcs r3, r3, r7\n\t"
  49521. #elif defined(__clang__)
  49522. "adcs r3, r7\n\t"
  49523. #else
  49524. "adc r3, r7\n\t"
  49525. #endif
  49526. #ifdef WOLFSSL_KEIL
  49527. "adcs r4, r4, %[r]\n\t"
  49528. #elif defined(__clang__)
  49529. "adcs r4, %[r]\n\t"
  49530. #else
  49531. "adc r4, %[r]\n\t"
  49532. #endif
  49533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49534. "lsrs r6, %[a], #16\n\t"
  49535. #else
  49536. "lsr r6, %[a], #16\n\t"
  49537. #endif
  49538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49539. "lsrs r7, %[b], #16\n\t"
  49540. #else
  49541. "lsr r7, %[b], #16\n\t"
  49542. #endif
  49543. #ifdef WOLFSSL_KEIL
  49544. "muls r7, r6, r7\n\t"
  49545. #elif defined(__clang__)
  49546. "muls r7, r6\n\t"
  49547. #else
  49548. "mul r7, r6\n\t"
  49549. #endif
  49550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49551. "adds r3, r3, r7\n\t"
  49552. #else
  49553. "add r3, r3, r7\n\t"
  49554. #endif
  49555. #ifdef WOLFSSL_KEIL
  49556. "adcs r4, r4, %[r]\n\t"
  49557. #elif defined(__clang__)
  49558. "adcs r4, %[r]\n\t"
  49559. #else
  49560. "adc r4, %[r]\n\t"
  49561. #endif
  49562. "uxth r7, %[b]\n\t"
  49563. #ifdef WOLFSSL_KEIL
  49564. "muls r6, r7, r6\n\t"
  49565. #elif defined(__clang__)
  49566. "muls r6, r7\n\t"
  49567. #else
  49568. "mul r6, r7\n\t"
  49569. #endif
  49570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49571. "lsrs r7, r6, #16\n\t"
  49572. #else
  49573. "lsr r7, r6, #16\n\t"
  49574. #endif
  49575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49576. "lsls r6, r6, #16\n\t"
  49577. #else
  49578. "lsl r6, r6, #16\n\t"
  49579. #endif
  49580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49581. "adds r5, r5, r6\n\t"
  49582. #else
  49583. "add r5, r5, r6\n\t"
  49584. #endif
  49585. #ifdef WOLFSSL_KEIL
  49586. "adcs r3, r3, r7\n\t"
  49587. #elif defined(__clang__)
  49588. "adcs r3, r7\n\t"
  49589. #else
  49590. "adc r3, r7\n\t"
  49591. #endif
  49592. #ifdef WOLFSSL_KEIL
  49593. "adcs r4, r4, %[r]\n\t"
  49594. #elif defined(__clang__)
  49595. "adcs r4, %[r]\n\t"
  49596. #else
  49597. "adc r4, %[r]\n\t"
  49598. #endif
  49599. "# A[9] * B[11]\n\t"
  49600. "mov %[a], r9\n\t"
  49601. "mov %[b], r10\n\t"
  49602. "ldr %[a], [%[a], #36]\n\t"
  49603. "ldr %[b], [%[b], #44]\n\t"
  49604. "uxth r6, %[a]\n\t"
  49605. "uxth r7, %[b]\n\t"
  49606. #ifdef WOLFSSL_KEIL
  49607. "muls r7, r6, r7\n\t"
  49608. #elif defined(__clang__)
  49609. "muls r7, r6\n\t"
  49610. #else
  49611. "mul r7, r6\n\t"
  49612. #endif
  49613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49614. "adds r5, r5, r7\n\t"
  49615. #else
  49616. "add r5, r5, r7\n\t"
  49617. #endif
  49618. #ifdef WOLFSSL_KEIL
  49619. "adcs r3, r3, %[r]\n\t"
  49620. #elif defined(__clang__)
  49621. "adcs r3, %[r]\n\t"
  49622. #else
  49623. "adc r3, %[r]\n\t"
  49624. #endif
  49625. #ifdef WOLFSSL_KEIL
  49626. "adcs r4, r4, %[r]\n\t"
  49627. #elif defined(__clang__)
  49628. "adcs r4, %[r]\n\t"
  49629. #else
  49630. "adc r4, %[r]\n\t"
  49631. #endif
  49632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49633. "lsrs r7, %[b], #16\n\t"
  49634. #else
  49635. "lsr r7, %[b], #16\n\t"
  49636. #endif
  49637. #ifdef WOLFSSL_KEIL
  49638. "muls r6, r7, r6\n\t"
  49639. #elif defined(__clang__)
  49640. "muls r6, r7\n\t"
  49641. #else
  49642. "mul r6, r7\n\t"
  49643. #endif
  49644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49645. "lsrs r7, r6, #16\n\t"
  49646. #else
  49647. "lsr r7, r6, #16\n\t"
  49648. #endif
  49649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49650. "lsls r6, r6, #16\n\t"
  49651. #else
  49652. "lsl r6, r6, #16\n\t"
  49653. #endif
  49654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49655. "adds r5, r5, r6\n\t"
  49656. #else
  49657. "add r5, r5, r6\n\t"
  49658. #endif
  49659. #ifdef WOLFSSL_KEIL
  49660. "adcs r3, r3, r7\n\t"
  49661. #elif defined(__clang__)
  49662. "adcs r3, r7\n\t"
  49663. #else
  49664. "adc r3, r7\n\t"
  49665. #endif
  49666. #ifdef WOLFSSL_KEIL
  49667. "adcs r4, r4, %[r]\n\t"
  49668. #elif defined(__clang__)
  49669. "adcs r4, %[r]\n\t"
  49670. #else
  49671. "adc r4, %[r]\n\t"
  49672. #endif
  49673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49674. "lsrs r6, %[a], #16\n\t"
  49675. #else
  49676. "lsr r6, %[a], #16\n\t"
  49677. #endif
  49678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49679. "lsrs r7, %[b], #16\n\t"
  49680. #else
  49681. "lsr r7, %[b], #16\n\t"
  49682. #endif
  49683. #ifdef WOLFSSL_KEIL
  49684. "muls r7, r6, r7\n\t"
  49685. #elif defined(__clang__)
  49686. "muls r7, r6\n\t"
  49687. #else
  49688. "mul r7, r6\n\t"
  49689. #endif
  49690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49691. "adds r3, r3, r7\n\t"
  49692. #else
  49693. "add r3, r3, r7\n\t"
  49694. #endif
  49695. #ifdef WOLFSSL_KEIL
  49696. "adcs r4, r4, %[r]\n\t"
  49697. #elif defined(__clang__)
  49698. "adcs r4, %[r]\n\t"
  49699. #else
  49700. "adc r4, %[r]\n\t"
  49701. #endif
  49702. "uxth r7, %[b]\n\t"
  49703. #ifdef WOLFSSL_KEIL
  49704. "muls r6, r7, r6\n\t"
  49705. #elif defined(__clang__)
  49706. "muls r6, r7\n\t"
  49707. #else
  49708. "mul r6, r7\n\t"
  49709. #endif
  49710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49711. "lsrs r7, r6, #16\n\t"
  49712. #else
  49713. "lsr r7, r6, #16\n\t"
  49714. #endif
  49715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49716. "lsls r6, r6, #16\n\t"
  49717. #else
  49718. "lsl r6, r6, #16\n\t"
  49719. #endif
  49720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49721. "adds r5, r5, r6\n\t"
  49722. #else
  49723. "add r5, r5, r6\n\t"
  49724. #endif
  49725. #ifdef WOLFSSL_KEIL
  49726. "adcs r3, r3, r7\n\t"
  49727. #elif defined(__clang__)
  49728. "adcs r3, r7\n\t"
  49729. #else
  49730. "adc r3, r7\n\t"
  49731. #endif
  49732. #ifdef WOLFSSL_KEIL
  49733. "adcs r4, r4, %[r]\n\t"
  49734. #elif defined(__clang__)
  49735. "adcs r4, %[r]\n\t"
  49736. #else
  49737. "adc r4, %[r]\n\t"
  49738. #endif
  49739. "mov %[r], r8\n\t"
  49740. "str r5, [%[r], #80]\n\t"
  49741. "movs %[r], #0\n\t"
  49742. "# A[10] * B[11]\n\t"
  49743. "movs r5, #0\n\t"
  49744. "mov %[a], r9\n\t"
  49745. "mov %[b], r10\n\t"
  49746. "ldr %[a], [%[a], #40]\n\t"
  49747. "ldr %[b], [%[b], #44]\n\t"
  49748. "uxth r6, %[a]\n\t"
  49749. "uxth r7, %[b]\n\t"
  49750. #ifdef WOLFSSL_KEIL
  49751. "muls r7, r6, r7\n\t"
  49752. #elif defined(__clang__)
  49753. "muls r7, r6\n\t"
  49754. #else
  49755. "mul r7, r6\n\t"
  49756. #endif
  49757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49758. "adds r3, r3, r7\n\t"
  49759. #else
  49760. "add r3, r3, r7\n\t"
  49761. #endif
  49762. #ifdef WOLFSSL_KEIL
  49763. "adcs r4, r4, %[r]\n\t"
  49764. #elif defined(__clang__)
  49765. "adcs r4, %[r]\n\t"
  49766. #else
  49767. "adc r4, %[r]\n\t"
  49768. #endif
  49769. #ifdef WOLFSSL_KEIL
  49770. "adcs r5, r5, %[r]\n\t"
  49771. #elif defined(__clang__)
  49772. "adcs r5, %[r]\n\t"
  49773. #else
  49774. "adc r5, %[r]\n\t"
  49775. #endif
  49776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49777. "lsrs r7, %[b], #16\n\t"
  49778. #else
  49779. "lsr r7, %[b], #16\n\t"
  49780. #endif
  49781. #ifdef WOLFSSL_KEIL
  49782. "muls r6, r7, r6\n\t"
  49783. #elif defined(__clang__)
  49784. "muls r6, r7\n\t"
  49785. #else
  49786. "mul r6, r7\n\t"
  49787. #endif
  49788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49789. "lsrs r7, r6, #16\n\t"
  49790. #else
  49791. "lsr r7, r6, #16\n\t"
  49792. #endif
  49793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49794. "lsls r6, r6, #16\n\t"
  49795. #else
  49796. "lsl r6, r6, #16\n\t"
  49797. #endif
  49798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49799. "adds r3, r3, r6\n\t"
  49800. #else
  49801. "add r3, r3, r6\n\t"
  49802. #endif
  49803. #ifdef WOLFSSL_KEIL
  49804. "adcs r4, r4, r7\n\t"
  49805. #elif defined(__clang__)
  49806. "adcs r4, r7\n\t"
  49807. #else
  49808. "adc r4, r7\n\t"
  49809. #endif
  49810. #ifdef WOLFSSL_KEIL
  49811. "adcs r5, r5, %[r]\n\t"
  49812. #elif defined(__clang__)
  49813. "adcs r5, %[r]\n\t"
  49814. #else
  49815. "adc r5, %[r]\n\t"
  49816. #endif
  49817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49818. "lsrs r6, %[a], #16\n\t"
  49819. #else
  49820. "lsr r6, %[a], #16\n\t"
  49821. #endif
  49822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49823. "lsrs r7, %[b], #16\n\t"
  49824. #else
  49825. "lsr r7, %[b], #16\n\t"
  49826. #endif
  49827. #ifdef WOLFSSL_KEIL
  49828. "muls r7, r6, r7\n\t"
  49829. #elif defined(__clang__)
  49830. "muls r7, r6\n\t"
  49831. #else
  49832. "mul r7, r6\n\t"
  49833. #endif
  49834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49835. "adds r4, r4, r7\n\t"
  49836. #else
  49837. "add r4, r4, r7\n\t"
  49838. #endif
  49839. #ifdef WOLFSSL_KEIL
  49840. "adcs r5, r5, %[r]\n\t"
  49841. #elif defined(__clang__)
  49842. "adcs r5, %[r]\n\t"
  49843. #else
  49844. "adc r5, %[r]\n\t"
  49845. #endif
  49846. "uxth r7, %[b]\n\t"
  49847. #ifdef WOLFSSL_KEIL
  49848. "muls r6, r7, r6\n\t"
  49849. #elif defined(__clang__)
  49850. "muls r6, r7\n\t"
  49851. #else
  49852. "mul r6, r7\n\t"
  49853. #endif
  49854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49855. "lsrs r7, r6, #16\n\t"
  49856. #else
  49857. "lsr r7, r6, #16\n\t"
  49858. #endif
  49859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49860. "lsls r6, r6, #16\n\t"
  49861. #else
  49862. "lsl r6, r6, #16\n\t"
  49863. #endif
  49864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49865. "adds r3, r3, r6\n\t"
  49866. #else
  49867. "add r3, r3, r6\n\t"
  49868. #endif
  49869. #ifdef WOLFSSL_KEIL
  49870. "adcs r4, r4, r7\n\t"
  49871. #elif defined(__clang__)
  49872. "adcs r4, r7\n\t"
  49873. #else
  49874. "adc r4, r7\n\t"
  49875. #endif
  49876. #ifdef WOLFSSL_KEIL
  49877. "adcs r5, r5, %[r]\n\t"
  49878. #elif defined(__clang__)
  49879. "adcs r5, %[r]\n\t"
  49880. #else
  49881. "adc r5, %[r]\n\t"
  49882. #endif
  49883. "# A[11] * B[10]\n\t"
  49884. "mov %[a], r9\n\t"
  49885. "mov %[b], r10\n\t"
  49886. "ldr %[a], [%[a], #44]\n\t"
  49887. "ldr %[b], [%[b], #40]\n\t"
  49888. "uxth r6, %[a]\n\t"
  49889. "uxth r7, %[b]\n\t"
  49890. #ifdef WOLFSSL_KEIL
  49891. "muls r7, r6, r7\n\t"
  49892. #elif defined(__clang__)
  49893. "muls r7, r6\n\t"
  49894. #else
  49895. "mul r7, r6\n\t"
  49896. #endif
  49897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49898. "adds r3, r3, r7\n\t"
  49899. #else
  49900. "add r3, r3, r7\n\t"
  49901. #endif
  49902. #ifdef WOLFSSL_KEIL
  49903. "adcs r4, r4, %[r]\n\t"
  49904. #elif defined(__clang__)
  49905. "adcs r4, %[r]\n\t"
  49906. #else
  49907. "adc r4, %[r]\n\t"
  49908. #endif
  49909. #ifdef WOLFSSL_KEIL
  49910. "adcs r5, r5, %[r]\n\t"
  49911. #elif defined(__clang__)
  49912. "adcs r5, %[r]\n\t"
  49913. #else
  49914. "adc r5, %[r]\n\t"
  49915. #endif
  49916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49917. "lsrs r7, %[b], #16\n\t"
  49918. #else
  49919. "lsr r7, %[b], #16\n\t"
  49920. #endif
  49921. #ifdef WOLFSSL_KEIL
  49922. "muls r6, r7, r6\n\t"
  49923. #elif defined(__clang__)
  49924. "muls r6, r7\n\t"
  49925. #else
  49926. "mul r6, r7\n\t"
  49927. #endif
  49928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49929. "lsrs r7, r6, #16\n\t"
  49930. #else
  49931. "lsr r7, r6, #16\n\t"
  49932. #endif
  49933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49934. "lsls r6, r6, #16\n\t"
  49935. #else
  49936. "lsl r6, r6, #16\n\t"
  49937. #endif
  49938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49939. "adds r3, r3, r6\n\t"
  49940. #else
  49941. "add r3, r3, r6\n\t"
  49942. #endif
  49943. #ifdef WOLFSSL_KEIL
  49944. "adcs r4, r4, r7\n\t"
  49945. #elif defined(__clang__)
  49946. "adcs r4, r7\n\t"
  49947. #else
  49948. "adc r4, r7\n\t"
  49949. #endif
  49950. #ifdef WOLFSSL_KEIL
  49951. "adcs r5, r5, %[r]\n\t"
  49952. #elif defined(__clang__)
  49953. "adcs r5, %[r]\n\t"
  49954. #else
  49955. "adc r5, %[r]\n\t"
  49956. #endif
  49957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49958. "lsrs r6, %[a], #16\n\t"
  49959. #else
  49960. "lsr r6, %[a], #16\n\t"
  49961. #endif
  49962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49963. "lsrs r7, %[b], #16\n\t"
  49964. #else
  49965. "lsr r7, %[b], #16\n\t"
  49966. #endif
  49967. #ifdef WOLFSSL_KEIL
  49968. "muls r7, r6, r7\n\t"
  49969. #elif defined(__clang__)
  49970. "muls r7, r6\n\t"
  49971. #else
  49972. "mul r7, r6\n\t"
  49973. #endif
  49974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49975. "adds r4, r4, r7\n\t"
  49976. #else
  49977. "add r4, r4, r7\n\t"
  49978. #endif
  49979. #ifdef WOLFSSL_KEIL
  49980. "adcs r5, r5, %[r]\n\t"
  49981. #elif defined(__clang__)
  49982. "adcs r5, %[r]\n\t"
  49983. #else
  49984. "adc r5, %[r]\n\t"
  49985. #endif
  49986. "uxth r7, %[b]\n\t"
  49987. #ifdef WOLFSSL_KEIL
  49988. "muls r6, r7, r6\n\t"
  49989. #elif defined(__clang__)
  49990. "muls r6, r7\n\t"
  49991. #else
  49992. "mul r6, r7\n\t"
  49993. #endif
  49994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49995. "lsrs r7, r6, #16\n\t"
  49996. #else
  49997. "lsr r7, r6, #16\n\t"
  49998. #endif
  49999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50000. "lsls r6, r6, #16\n\t"
  50001. #else
  50002. "lsl r6, r6, #16\n\t"
  50003. #endif
  50004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50005. "adds r3, r3, r6\n\t"
  50006. #else
  50007. "add r3, r3, r6\n\t"
  50008. #endif
  50009. #ifdef WOLFSSL_KEIL
  50010. "adcs r4, r4, r7\n\t"
  50011. #elif defined(__clang__)
  50012. "adcs r4, r7\n\t"
  50013. #else
  50014. "adc r4, r7\n\t"
  50015. #endif
  50016. #ifdef WOLFSSL_KEIL
  50017. "adcs r5, r5, %[r]\n\t"
  50018. #elif defined(__clang__)
  50019. "adcs r5, %[r]\n\t"
  50020. #else
  50021. "adc r5, %[r]\n\t"
  50022. #endif
  50023. "mov %[r], r8\n\t"
  50024. "str r3, [%[r], #84]\n\t"
  50025. "movs %[r], #0\n\t"
  50026. "# A[11] * B[11]\n\t"
  50027. "mov %[a], r9\n\t"
  50028. "mov %[b], r10\n\t"
  50029. "ldr %[a], [%[a], #44]\n\t"
  50030. "ldr %[b], [%[b], #44]\n\t"
  50031. "uxth r6, %[a]\n\t"
  50032. "uxth r7, %[b]\n\t"
  50033. #ifdef WOLFSSL_KEIL
  50034. "muls r7, r6, r7\n\t"
  50035. #elif defined(__clang__)
  50036. "muls r7, r6\n\t"
  50037. #else
  50038. "mul r7, r6\n\t"
  50039. #endif
  50040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50041. "adds r4, r4, r7\n\t"
  50042. #else
  50043. "add r4, r4, r7\n\t"
  50044. #endif
  50045. #ifdef WOLFSSL_KEIL
  50046. "adcs r5, r5, %[r]\n\t"
  50047. #elif defined(__clang__)
  50048. "adcs r5, %[r]\n\t"
  50049. #else
  50050. "adc r5, %[r]\n\t"
  50051. #endif
  50052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50053. "lsrs r7, %[b], #16\n\t"
  50054. #else
  50055. "lsr r7, %[b], #16\n\t"
  50056. #endif
  50057. #ifdef WOLFSSL_KEIL
  50058. "muls r6, r7, r6\n\t"
  50059. #elif defined(__clang__)
  50060. "muls r6, r7\n\t"
  50061. #else
  50062. "mul r6, r7\n\t"
  50063. #endif
  50064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50065. "lsrs r7, r6, #16\n\t"
  50066. #else
  50067. "lsr r7, r6, #16\n\t"
  50068. #endif
  50069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50070. "lsls r6, r6, #16\n\t"
  50071. #else
  50072. "lsl r6, r6, #16\n\t"
  50073. #endif
  50074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50075. "adds r4, r4, r6\n\t"
  50076. #else
  50077. "add r4, r4, r6\n\t"
  50078. #endif
  50079. #ifdef WOLFSSL_KEIL
  50080. "adcs r5, r5, r7\n\t"
  50081. #elif defined(__clang__)
  50082. "adcs r5, r7\n\t"
  50083. #else
  50084. "adc r5, r7\n\t"
  50085. #endif
  50086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50087. "lsrs r6, %[a], #16\n\t"
  50088. #else
  50089. "lsr r6, %[a], #16\n\t"
  50090. #endif
  50091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50092. "lsrs r7, %[b], #16\n\t"
  50093. #else
  50094. "lsr r7, %[b], #16\n\t"
  50095. #endif
  50096. #ifdef WOLFSSL_KEIL
  50097. "muls r7, r6, r7\n\t"
  50098. #elif defined(__clang__)
  50099. "muls r7, r6\n\t"
  50100. #else
  50101. "mul r7, r6\n\t"
  50102. #endif
  50103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50104. "adds r5, r5, r7\n\t"
  50105. #else
  50106. "add r5, r5, r7\n\t"
  50107. #endif
  50108. "uxth r7, %[b]\n\t"
  50109. #ifdef WOLFSSL_KEIL
  50110. "muls r6, r7, r6\n\t"
  50111. #elif defined(__clang__)
  50112. "muls r6, r7\n\t"
  50113. #else
  50114. "mul r6, r7\n\t"
  50115. #endif
  50116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50117. "lsrs r7, r6, #16\n\t"
  50118. #else
  50119. "lsr r7, r6, #16\n\t"
  50120. #endif
  50121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50122. "lsls r6, r6, #16\n\t"
  50123. #else
  50124. "lsl r6, r6, #16\n\t"
  50125. #endif
  50126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50127. "adds r4, r4, r6\n\t"
  50128. #else
  50129. "add r4, r4, r6\n\t"
  50130. #endif
  50131. #ifdef WOLFSSL_KEIL
  50132. "adcs r5, r5, r7\n\t"
  50133. #elif defined(__clang__)
  50134. "adcs r5, r7\n\t"
  50135. #else
  50136. "adc r5, r7\n\t"
  50137. #endif
  50138. "mov %[r], r8\n\t"
  50139. "str r4, [%[r], #88]\n\t"
  50140. "str r5, [%[r], #92]\n\t"
  50141. "pop {r3, r4, r5, r6}\n\t"
  50142. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50143. "pop {r3, r4, r5, r6}\n\t"
  50144. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50145. "pop {r3, r4, r5, r6}\n\t"
  50146. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50147. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  50148. :
  50149. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  50150. );
  50151. }
  50152. #endif /* !WOLFSSL_SP_LARGE_CODE */
  50153. #ifndef WOLFSSL_SP_LARGE_CODE
  50154. /* Square a and put result in r. (r = a * a)
  50155. *
  50156. * r A single precision integer.
  50157. * a A single precision integer.
  50158. */
  50159. SP_NOINLINE static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a)
  50160. {
  50161. __asm__ __volatile__ (
  50162. "movs r3, #0\n\t"
  50163. "movs r4, #0\n\t"
  50164. "movs r5, #0\n\t"
  50165. "mov r8, r3\n\t"
  50166. "mov r11, %[r]\n\t"
  50167. "movs r6, #0x60\n\t"
  50168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50169. "negs r6, r6\n\t"
  50170. #else
  50171. "neg r6, r6\n\t"
  50172. #endif
  50173. "add sp, sp, r6\n\t"
  50174. "mov r10, sp\n\t"
  50175. "mov r9, %[a]\n\t"
  50176. "\n"
  50177. "L_sp_3072_sqr_12_words_%=:\n\t"
  50178. "movs %[r], #0\n\t"
  50179. "movs r6, #44\n\t"
  50180. "mov %[a], r8\n\t"
  50181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50182. "subs %[a], %[a], r6\n\t"
  50183. #else
  50184. "sub %[a], %[a], r6\n\t"
  50185. #endif
  50186. #ifdef WOLFSSL_KEIL
  50187. "sbcs r6, r6, r6\n\t"
  50188. #elif defined(__clang__)
  50189. "sbcs r6, r6\n\t"
  50190. #else
  50191. "sbc r6, r6\n\t"
  50192. #endif
  50193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50194. "mvns r6, r6\n\t"
  50195. #else
  50196. "mvn r6, r6\n\t"
  50197. #endif
  50198. #ifdef WOLFSSL_KEIL
  50199. "ands %[a], %[a], r6\n\t"
  50200. #elif defined(__clang__)
  50201. "ands %[a], r6\n\t"
  50202. #else
  50203. "and %[a], r6\n\t"
  50204. #endif
  50205. "mov r2, r8\n\t"
  50206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50207. "subs r2, r2, %[a]\n\t"
  50208. #else
  50209. "sub r2, r2, %[a]\n\t"
  50210. #endif
  50211. "add %[a], %[a], r9\n\t"
  50212. "add r2, r2, r9\n\t"
  50213. "\n"
  50214. "L_sp_3072_sqr_12_mul_%=:\n\t"
  50215. "cmp r2, %[a]\n\t"
  50216. "beq L_sp_3072_sqr_12_sqr_%=\n\t"
  50217. "# Multiply * 2: Start\n\t"
  50218. "ldrh r6, [%[a]]\n\t"
  50219. "ldrh r7, [r2]\n\t"
  50220. #ifdef WOLFSSL_KEIL
  50221. "muls r7, r6, r7\n\t"
  50222. #elif defined(__clang__)
  50223. "muls r7, r6\n\t"
  50224. #else
  50225. "mul r7, r6\n\t"
  50226. #endif
  50227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50228. "adds r3, r3, r7\n\t"
  50229. #else
  50230. "add r3, r3, r7\n\t"
  50231. #endif
  50232. #ifdef WOLFSSL_KEIL
  50233. "adcs r4, r4, %[r]\n\t"
  50234. #elif defined(__clang__)
  50235. "adcs r4, %[r]\n\t"
  50236. #else
  50237. "adc r4, %[r]\n\t"
  50238. #endif
  50239. #ifdef WOLFSSL_KEIL
  50240. "adcs r5, r5, %[r]\n\t"
  50241. #elif defined(__clang__)
  50242. "adcs r5, %[r]\n\t"
  50243. #else
  50244. "adc r5, %[r]\n\t"
  50245. #endif
  50246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50247. "adds r3, r3, r7\n\t"
  50248. #else
  50249. "add r3, r3, r7\n\t"
  50250. #endif
  50251. #ifdef WOLFSSL_KEIL
  50252. "adcs r4, r4, %[r]\n\t"
  50253. #elif defined(__clang__)
  50254. "adcs r4, %[r]\n\t"
  50255. #else
  50256. "adc r4, %[r]\n\t"
  50257. #endif
  50258. #ifdef WOLFSSL_KEIL
  50259. "adcs r5, r5, %[r]\n\t"
  50260. #elif defined(__clang__)
  50261. "adcs r5, %[r]\n\t"
  50262. #else
  50263. "adc r5, %[r]\n\t"
  50264. #endif
  50265. "ldr r7, [r2]\n\t"
  50266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50267. "lsrs r7, r7, #16\n\t"
  50268. #else
  50269. "lsr r7, r7, #16\n\t"
  50270. #endif
  50271. #ifdef WOLFSSL_KEIL
  50272. "muls r6, r7, r6\n\t"
  50273. #elif defined(__clang__)
  50274. "muls r6, r7\n\t"
  50275. #else
  50276. "mul r6, r7\n\t"
  50277. #endif
  50278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50279. "lsrs r7, r6, #16\n\t"
  50280. #else
  50281. "lsr r7, r6, #16\n\t"
  50282. #endif
  50283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50284. "lsls r6, r6, #16\n\t"
  50285. #else
  50286. "lsl r6, r6, #16\n\t"
  50287. #endif
  50288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50289. "adds r3, r3, r6\n\t"
  50290. #else
  50291. "add r3, r3, r6\n\t"
  50292. #endif
  50293. #ifdef WOLFSSL_KEIL
  50294. "adcs r4, r4, r7\n\t"
  50295. #elif defined(__clang__)
  50296. "adcs r4, r7\n\t"
  50297. #else
  50298. "adc r4, r7\n\t"
  50299. #endif
  50300. #ifdef WOLFSSL_KEIL
  50301. "adcs r5, r5, %[r]\n\t"
  50302. #elif defined(__clang__)
  50303. "adcs r5, %[r]\n\t"
  50304. #else
  50305. "adc r5, %[r]\n\t"
  50306. #endif
  50307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50308. "adds r3, r3, r6\n\t"
  50309. #else
  50310. "add r3, r3, r6\n\t"
  50311. #endif
  50312. #ifdef WOLFSSL_KEIL
  50313. "adcs r4, r4, r7\n\t"
  50314. #elif defined(__clang__)
  50315. "adcs r4, r7\n\t"
  50316. #else
  50317. "adc r4, r7\n\t"
  50318. #endif
  50319. #ifdef WOLFSSL_KEIL
  50320. "adcs r5, r5, %[r]\n\t"
  50321. #elif defined(__clang__)
  50322. "adcs r5, %[r]\n\t"
  50323. #else
  50324. "adc r5, %[r]\n\t"
  50325. #endif
  50326. "ldr r6, [%[a]]\n\t"
  50327. "ldr r7, [r2]\n\t"
  50328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50329. "lsrs r6, r6, #16\n\t"
  50330. #else
  50331. "lsr r6, r6, #16\n\t"
  50332. #endif
  50333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50334. "lsrs r7, r7, #16\n\t"
  50335. #else
  50336. "lsr r7, r7, #16\n\t"
  50337. #endif
  50338. #ifdef WOLFSSL_KEIL
  50339. "muls r7, r6, r7\n\t"
  50340. #elif defined(__clang__)
  50341. "muls r7, r6\n\t"
  50342. #else
  50343. "mul r7, r6\n\t"
  50344. #endif
  50345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50346. "adds r4, r4, r7\n\t"
  50347. #else
  50348. "add r4, r4, r7\n\t"
  50349. #endif
  50350. #ifdef WOLFSSL_KEIL
  50351. "adcs r5, r5, %[r]\n\t"
  50352. #elif defined(__clang__)
  50353. "adcs r5, %[r]\n\t"
  50354. #else
  50355. "adc r5, %[r]\n\t"
  50356. #endif
  50357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50358. "adds r4, r4, r7\n\t"
  50359. #else
  50360. "add r4, r4, r7\n\t"
  50361. #endif
  50362. #ifdef WOLFSSL_KEIL
  50363. "adcs r5, r5, %[r]\n\t"
  50364. #elif defined(__clang__)
  50365. "adcs r5, %[r]\n\t"
  50366. #else
  50367. "adc r5, %[r]\n\t"
  50368. #endif
  50369. "ldrh r7, [r2]\n\t"
  50370. #ifdef WOLFSSL_KEIL
  50371. "muls r6, r7, r6\n\t"
  50372. #elif defined(__clang__)
  50373. "muls r6, r7\n\t"
  50374. #else
  50375. "mul r6, r7\n\t"
  50376. #endif
  50377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50378. "lsrs r7, r6, #16\n\t"
  50379. #else
  50380. "lsr r7, r6, #16\n\t"
  50381. #endif
  50382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50383. "lsls r6, r6, #16\n\t"
  50384. #else
  50385. "lsl r6, r6, #16\n\t"
  50386. #endif
  50387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50388. "adds r3, r3, r6\n\t"
  50389. #else
  50390. "add r3, r3, r6\n\t"
  50391. #endif
  50392. #ifdef WOLFSSL_KEIL
  50393. "adcs r4, r4, r7\n\t"
  50394. #elif defined(__clang__)
  50395. "adcs r4, r7\n\t"
  50396. #else
  50397. "adc r4, r7\n\t"
  50398. #endif
  50399. #ifdef WOLFSSL_KEIL
  50400. "adcs r5, r5, %[r]\n\t"
  50401. #elif defined(__clang__)
  50402. "adcs r5, %[r]\n\t"
  50403. #else
  50404. "adc r5, %[r]\n\t"
  50405. #endif
  50406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50407. "adds r3, r3, r6\n\t"
  50408. #else
  50409. "add r3, r3, r6\n\t"
  50410. #endif
  50411. #ifdef WOLFSSL_KEIL
  50412. "adcs r4, r4, r7\n\t"
  50413. #elif defined(__clang__)
  50414. "adcs r4, r7\n\t"
  50415. #else
  50416. "adc r4, r7\n\t"
  50417. #endif
  50418. #ifdef WOLFSSL_KEIL
  50419. "adcs r5, r5, %[r]\n\t"
  50420. #elif defined(__clang__)
  50421. "adcs r5, %[r]\n\t"
  50422. #else
  50423. "adc r5, %[r]\n\t"
  50424. #endif
  50425. "# Multiply * 2: Done\n\t"
  50426. "bal L_sp_3072_sqr_12_done_sqr_%=\n\t"
  50427. "\n"
  50428. "L_sp_3072_sqr_12_sqr_%=:\n\t"
  50429. "mov r12, r2\n\t"
  50430. "ldr r2, [%[a]]\n\t"
  50431. "# Square: Start\n\t"
  50432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50433. "lsrs r7, r2, #16\n\t"
  50434. #else
  50435. "lsr r7, r2, #16\n\t"
  50436. #endif
  50437. "uxth r6, r2\n\t"
  50438. #ifdef WOLFSSL_KEIL
  50439. "muls r6, r6, r6\n\t"
  50440. #elif defined(__clang__)
  50441. "muls r6, r6\n\t"
  50442. #else
  50443. "mul r6, r6\n\t"
  50444. #endif
  50445. #ifdef WOLFSSL_KEIL
  50446. "muls r7, r7, r7\n\t"
  50447. #elif defined(__clang__)
  50448. "muls r7, r7\n\t"
  50449. #else
  50450. "mul r7, r7\n\t"
  50451. #endif
  50452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50453. "adds r3, r3, r6\n\t"
  50454. #else
  50455. "add r3, r3, r6\n\t"
  50456. #endif
  50457. #ifdef WOLFSSL_KEIL
  50458. "adcs r4, r4, r7\n\t"
  50459. #elif defined(__clang__)
  50460. "adcs r4, r7\n\t"
  50461. #else
  50462. "adc r4, r7\n\t"
  50463. #endif
  50464. #ifdef WOLFSSL_KEIL
  50465. "adcs r5, r5, %[r]\n\t"
  50466. #elif defined(__clang__)
  50467. "adcs r5, %[r]\n\t"
  50468. #else
  50469. "adc r5, %[r]\n\t"
  50470. #endif
  50471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50472. "lsrs r7, r2, #16\n\t"
  50473. #else
  50474. "lsr r7, r2, #16\n\t"
  50475. #endif
  50476. "uxth r6, r2\n\t"
  50477. #ifdef WOLFSSL_KEIL
  50478. "muls r6, r7, r6\n\t"
  50479. #elif defined(__clang__)
  50480. "muls r6, r7\n\t"
  50481. #else
  50482. "mul r6, r7\n\t"
  50483. #endif
  50484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50485. "lsrs r7, r6, #15\n\t"
  50486. #else
  50487. "lsr r7, r6, #15\n\t"
  50488. #endif
  50489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50490. "lsls r6, r6, #17\n\t"
  50491. #else
  50492. "lsl r6, r6, #17\n\t"
  50493. #endif
  50494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50495. "adds r3, r3, r6\n\t"
  50496. #else
  50497. "add r3, r3, r6\n\t"
  50498. #endif
  50499. #ifdef WOLFSSL_KEIL
  50500. "adcs r4, r4, r7\n\t"
  50501. #elif defined(__clang__)
  50502. "adcs r4, r7\n\t"
  50503. #else
  50504. "adc r4, r7\n\t"
  50505. #endif
  50506. #ifdef WOLFSSL_KEIL
  50507. "adcs r5, r5, %[r]\n\t"
  50508. #elif defined(__clang__)
  50509. "adcs r5, %[r]\n\t"
  50510. #else
  50511. "adc r5, %[r]\n\t"
  50512. #endif
  50513. "# Square: Done\n\t"
  50514. "mov r2, r12\n\t"
  50515. "\n"
  50516. "L_sp_3072_sqr_12_done_sqr_%=:\n\t"
  50517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50518. "adds %[a], %[a], #4\n\t"
  50519. #else
  50520. "add %[a], %[a], #4\n\t"
  50521. #endif
  50522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50523. "subs r2, r2, #4\n\t"
  50524. #else
  50525. "sub r2, r2, #4\n\t"
  50526. #endif
  50527. "movs r6, #48\n\t"
  50528. "add r6, r6, r9\n\t"
  50529. "cmp %[a], r6\n\t"
  50530. "beq L_sp_3072_sqr_12_done_mul_%=\n\t"
  50531. "cmp %[a], r2\n\t"
  50532. "bgt L_sp_3072_sqr_12_done_mul_%=\n\t"
  50533. "mov r7, r8\n\t"
  50534. "add r7, r7, r9\n\t"
  50535. "cmp %[a], r7\n\t"
  50536. "ble L_sp_3072_sqr_12_mul_%=\n\t"
  50537. "\n"
  50538. "L_sp_3072_sqr_12_done_mul_%=:\n\t"
  50539. "mov %[r], r10\n\t"
  50540. "mov r7, r8\n\t"
  50541. "str r3, [%[r], r7]\n\t"
  50542. "movs r3, r4\n\t"
  50543. "movs r4, r5\n\t"
  50544. "movs r5, #0\n\t"
  50545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50546. "adds r7, r7, #4\n\t"
  50547. #else
  50548. "add r7, r7, #4\n\t"
  50549. #endif
  50550. "mov r8, r7\n\t"
  50551. "movs r6, #0x58\n\t"
  50552. "cmp r7, r6\n\t"
  50553. "ble L_sp_3072_sqr_12_words_%=\n\t"
  50554. "mov %[a], r9\n\t"
  50555. "str r3, [%[r], r7]\n\t"
  50556. "mov %[r], r11\n\t"
  50557. "mov %[a], r10\n\t"
  50558. "movs r3, #0x5c\n\t"
  50559. "\n"
  50560. "L_sp_3072_sqr_12_store_%=:\n\t"
  50561. "ldr r6, [%[a], r3]\n\t"
  50562. "str r6, [%[r], r3]\n\t"
  50563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50564. "subs r3, r3, #4\n\t"
  50565. #else
  50566. "sub r3, r3, #4\n\t"
  50567. #endif
  50568. "bge L_sp_3072_sqr_12_store_%=\n\t"
  50569. "movs r6, #0x60\n\t"
  50570. "add sp, sp, r6\n\t"
  50571. : [r] "+r" (r), [a] "+r" (a)
  50572. :
  50573. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  50574. );
  50575. }
  50576. #else
  50577. /* Square a and put result in r. (r = a * a)
  50578. *
  50579. * r A single precision integer.
  50580. * a A single precision integer.
  50581. */
  50582. SP_NOINLINE static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a)
  50583. {
  50584. __asm__ __volatile__ (
  50585. "sub sp, sp, #48\n\t"
  50586. "mov r8, %[r]\n\t"
  50587. "mov r9, %[a]\n\t"
  50588. "movs %[r], #0\n\t"
  50589. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  50590. "mov r10, r2\n\t"
  50591. "mov r11, r3\n\t"
  50592. "mov r12, r4\n\t"
  50593. "mov lr, r5\n\t"
  50594. "mov %[a], r9\n\t"
  50595. "# A[0] * A[0]\n\t"
  50596. "movs r4, #0\n\t"
  50597. "mov r7, r10\n\t"
  50598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50599. "lsrs r6, r7, #16\n\t"
  50600. #else
  50601. "lsr r6, r7, #16\n\t"
  50602. #endif
  50603. "uxth r5, r7\n\t"
  50604. "movs r2, r5\n\t"
  50605. "movs r3, r6\n\t"
  50606. #ifdef WOLFSSL_KEIL
  50607. "muls r2, r2, r2\n\t"
  50608. #elif defined(__clang__)
  50609. "muls r2, r2\n\t"
  50610. #else
  50611. "mul r2, r2\n\t"
  50612. #endif
  50613. #ifdef WOLFSSL_KEIL
  50614. "muls r3, r3, r3\n\t"
  50615. #elif defined(__clang__)
  50616. "muls r3, r3\n\t"
  50617. #else
  50618. "mul r3, r3\n\t"
  50619. #endif
  50620. #ifdef WOLFSSL_KEIL
  50621. "muls r5, r6, r5\n\t"
  50622. #elif defined(__clang__)
  50623. "muls r5, r6\n\t"
  50624. #else
  50625. "mul r5, r6\n\t"
  50626. #endif
  50627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50628. "lsrs r6, r5, #15\n\t"
  50629. #else
  50630. "lsr r6, r5, #15\n\t"
  50631. #endif
  50632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50633. "lsls r5, r5, #17\n\t"
  50634. #else
  50635. "lsl r5, r5, #17\n\t"
  50636. #endif
  50637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50638. "adds r2, r2, r5\n\t"
  50639. #else
  50640. "add r2, r2, r5\n\t"
  50641. #endif
  50642. #ifdef WOLFSSL_KEIL
  50643. "adcs r3, r3, r6\n\t"
  50644. #elif defined(__clang__)
  50645. "adcs r3, r6\n\t"
  50646. #else
  50647. "adc r3, r6\n\t"
  50648. #endif
  50649. "str r2, [sp]\n\t"
  50650. "# A[1] * A[0]\n\t"
  50651. "movs r2, #0\n\t"
  50652. "mov %[a], r11\n\t"
  50653. "uxth r5, %[a]\n\t"
  50654. "uxth r6, r7\n\t"
  50655. #ifdef WOLFSSL_KEIL
  50656. "muls r6, r5, r6\n\t"
  50657. #elif defined(__clang__)
  50658. "muls r6, r5\n\t"
  50659. #else
  50660. "mul r6, r5\n\t"
  50661. #endif
  50662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50663. "adds r3, r3, r6\n\t"
  50664. #else
  50665. "add r3, r3, r6\n\t"
  50666. #endif
  50667. #ifdef WOLFSSL_KEIL
  50668. "adcs r4, r4, %[r]\n\t"
  50669. #elif defined(__clang__)
  50670. "adcs r4, %[r]\n\t"
  50671. #else
  50672. "adc r4, %[r]\n\t"
  50673. #endif
  50674. #ifdef WOLFSSL_KEIL
  50675. "adcs r2, r2, %[r]\n\t"
  50676. #elif defined(__clang__)
  50677. "adcs r2, %[r]\n\t"
  50678. #else
  50679. "adc r2, %[r]\n\t"
  50680. #endif
  50681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50682. "adds r3, r3, r6\n\t"
  50683. #else
  50684. "add r3, r3, r6\n\t"
  50685. #endif
  50686. #ifdef WOLFSSL_KEIL
  50687. "adcs r4, r4, %[r]\n\t"
  50688. #elif defined(__clang__)
  50689. "adcs r4, %[r]\n\t"
  50690. #else
  50691. "adc r4, %[r]\n\t"
  50692. #endif
  50693. #ifdef WOLFSSL_KEIL
  50694. "adcs r2, r2, %[r]\n\t"
  50695. #elif defined(__clang__)
  50696. "adcs r2, %[r]\n\t"
  50697. #else
  50698. "adc r2, %[r]\n\t"
  50699. #endif
  50700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50701. "lsrs r6, r7, #16\n\t"
  50702. #else
  50703. "lsr r6, r7, #16\n\t"
  50704. #endif
  50705. #ifdef WOLFSSL_KEIL
  50706. "muls r5, r6, r5\n\t"
  50707. #elif defined(__clang__)
  50708. "muls r5, r6\n\t"
  50709. #else
  50710. "mul r5, r6\n\t"
  50711. #endif
  50712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50713. "lsrs r6, r5, #16\n\t"
  50714. #else
  50715. "lsr r6, r5, #16\n\t"
  50716. #endif
  50717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50718. "lsls r5, r5, #16\n\t"
  50719. #else
  50720. "lsl r5, r5, #16\n\t"
  50721. #endif
  50722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50723. "adds r3, r3, r5\n\t"
  50724. #else
  50725. "add r3, r3, r5\n\t"
  50726. #endif
  50727. #ifdef WOLFSSL_KEIL
  50728. "adcs r4, r4, r6\n\t"
  50729. #elif defined(__clang__)
  50730. "adcs r4, r6\n\t"
  50731. #else
  50732. "adc r4, r6\n\t"
  50733. #endif
  50734. #ifdef WOLFSSL_KEIL
  50735. "adcs r2, r2, %[r]\n\t"
  50736. #elif defined(__clang__)
  50737. "adcs r2, %[r]\n\t"
  50738. #else
  50739. "adc r2, %[r]\n\t"
  50740. #endif
  50741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50742. "adds r3, r3, r5\n\t"
  50743. #else
  50744. "add r3, r3, r5\n\t"
  50745. #endif
  50746. #ifdef WOLFSSL_KEIL
  50747. "adcs r4, r4, r6\n\t"
  50748. #elif defined(__clang__)
  50749. "adcs r4, r6\n\t"
  50750. #else
  50751. "adc r4, r6\n\t"
  50752. #endif
  50753. #ifdef WOLFSSL_KEIL
  50754. "adcs r2, r2, %[r]\n\t"
  50755. #elif defined(__clang__)
  50756. "adcs r2, %[r]\n\t"
  50757. #else
  50758. "adc r2, %[r]\n\t"
  50759. #endif
  50760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50761. "lsrs r5, %[a], #16\n\t"
  50762. #else
  50763. "lsr r5, %[a], #16\n\t"
  50764. #endif
  50765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50766. "lsrs r6, r7, #16\n\t"
  50767. #else
  50768. "lsr r6, r7, #16\n\t"
  50769. #endif
  50770. #ifdef WOLFSSL_KEIL
  50771. "muls r6, r5, r6\n\t"
  50772. #elif defined(__clang__)
  50773. "muls r6, r5\n\t"
  50774. #else
  50775. "mul r6, r5\n\t"
  50776. #endif
  50777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50778. "adds r4, r4, r6\n\t"
  50779. #else
  50780. "add r4, r4, r6\n\t"
  50781. #endif
  50782. #ifdef WOLFSSL_KEIL
  50783. "adcs r2, r2, %[r]\n\t"
  50784. #elif defined(__clang__)
  50785. "adcs r2, %[r]\n\t"
  50786. #else
  50787. "adc r2, %[r]\n\t"
  50788. #endif
  50789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50790. "adds r4, r4, r6\n\t"
  50791. #else
  50792. "add r4, r4, r6\n\t"
  50793. #endif
  50794. #ifdef WOLFSSL_KEIL
  50795. "adcs r2, r2, %[r]\n\t"
  50796. #elif defined(__clang__)
  50797. "adcs r2, %[r]\n\t"
  50798. #else
  50799. "adc r2, %[r]\n\t"
  50800. #endif
  50801. "uxth r6, r7\n\t"
  50802. #ifdef WOLFSSL_KEIL
  50803. "muls r5, r6, r5\n\t"
  50804. #elif defined(__clang__)
  50805. "muls r5, r6\n\t"
  50806. #else
  50807. "mul r5, r6\n\t"
  50808. #endif
  50809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50810. "lsrs r6, r5, #16\n\t"
  50811. #else
  50812. "lsr r6, r5, #16\n\t"
  50813. #endif
  50814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50815. "lsls r5, r5, #16\n\t"
  50816. #else
  50817. "lsl r5, r5, #16\n\t"
  50818. #endif
  50819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50820. "adds r3, r3, r5\n\t"
  50821. #else
  50822. "add r3, r3, r5\n\t"
  50823. #endif
  50824. #ifdef WOLFSSL_KEIL
  50825. "adcs r4, r4, r6\n\t"
  50826. #elif defined(__clang__)
  50827. "adcs r4, r6\n\t"
  50828. #else
  50829. "adc r4, r6\n\t"
  50830. #endif
  50831. #ifdef WOLFSSL_KEIL
  50832. "adcs r2, r2, %[r]\n\t"
  50833. #elif defined(__clang__)
  50834. "adcs r2, %[r]\n\t"
  50835. #else
  50836. "adc r2, %[r]\n\t"
  50837. #endif
  50838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50839. "adds r3, r3, r5\n\t"
  50840. #else
  50841. "add r3, r3, r5\n\t"
  50842. #endif
  50843. #ifdef WOLFSSL_KEIL
  50844. "adcs r4, r4, r6\n\t"
  50845. #elif defined(__clang__)
  50846. "adcs r4, r6\n\t"
  50847. #else
  50848. "adc r4, r6\n\t"
  50849. #endif
  50850. #ifdef WOLFSSL_KEIL
  50851. "adcs r2, r2, %[r]\n\t"
  50852. #elif defined(__clang__)
  50853. "adcs r2, %[r]\n\t"
  50854. #else
  50855. "adc r2, %[r]\n\t"
  50856. #endif
  50857. "str r3, [sp, #4]\n\t"
  50858. "# A[2] * A[0]\n\t"
  50859. "movs r3, #0\n\t"
  50860. "mov %[a], r9\n\t"
  50861. "mov %[a], r12\n\t"
  50862. "uxth r5, %[a]\n\t"
  50863. "uxth r6, r7\n\t"
  50864. #ifdef WOLFSSL_KEIL
  50865. "muls r6, r5, r6\n\t"
  50866. #elif defined(__clang__)
  50867. "muls r6, r5\n\t"
  50868. #else
  50869. "mul r6, r5\n\t"
  50870. #endif
  50871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50872. "adds r4, r4, r6\n\t"
  50873. #else
  50874. "add r4, r4, r6\n\t"
  50875. #endif
  50876. #ifdef WOLFSSL_KEIL
  50877. "adcs r2, r2, %[r]\n\t"
  50878. #elif defined(__clang__)
  50879. "adcs r2, %[r]\n\t"
  50880. #else
  50881. "adc r2, %[r]\n\t"
  50882. #endif
  50883. #ifdef WOLFSSL_KEIL
  50884. "adcs r3, r3, %[r]\n\t"
  50885. #elif defined(__clang__)
  50886. "adcs r3, %[r]\n\t"
  50887. #else
  50888. "adc r3, %[r]\n\t"
  50889. #endif
  50890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50891. "adds r4, r4, r6\n\t"
  50892. #else
  50893. "add r4, r4, r6\n\t"
  50894. #endif
  50895. #ifdef WOLFSSL_KEIL
  50896. "adcs r2, r2, %[r]\n\t"
  50897. #elif defined(__clang__)
  50898. "adcs r2, %[r]\n\t"
  50899. #else
  50900. "adc r2, %[r]\n\t"
  50901. #endif
  50902. #ifdef WOLFSSL_KEIL
  50903. "adcs r3, r3, %[r]\n\t"
  50904. #elif defined(__clang__)
  50905. "adcs r3, %[r]\n\t"
  50906. #else
  50907. "adc r3, %[r]\n\t"
  50908. #endif
  50909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50910. "lsrs r6, r7, #16\n\t"
  50911. #else
  50912. "lsr r6, r7, #16\n\t"
  50913. #endif
  50914. #ifdef WOLFSSL_KEIL
  50915. "muls r5, r6, r5\n\t"
  50916. #elif defined(__clang__)
  50917. "muls r5, r6\n\t"
  50918. #else
  50919. "mul r5, r6\n\t"
  50920. #endif
  50921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50922. "lsrs r6, r5, #16\n\t"
  50923. #else
  50924. "lsr r6, r5, #16\n\t"
  50925. #endif
  50926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50927. "lsls r5, r5, #16\n\t"
  50928. #else
  50929. "lsl r5, r5, #16\n\t"
  50930. #endif
  50931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50932. "adds r4, r4, r5\n\t"
  50933. #else
  50934. "add r4, r4, r5\n\t"
  50935. #endif
  50936. #ifdef WOLFSSL_KEIL
  50937. "adcs r2, r2, r6\n\t"
  50938. #elif defined(__clang__)
  50939. "adcs r2, r6\n\t"
  50940. #else
  50941. "adc r2, r6\n\t"
  50942. #endif
  50943. #ifdef WOLFSSL_KEIL
  50944. "adcs r3, r3, %[r]\n\t"
  50945. #elif defined(__clang__)
  50946. "adcs r3, %[r]\n\t"
  50947. #else
  50948. "adc r3, %[r]\n\t"
  50949. #endif
  50950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50951. "adds r4, r4, r5\n\t"
  50952. #else
  50953. "add r4, r4, r5\n\t"
  50954. #endif
  50955. #ifdef WOLFSSL_KEIL
  50956. "adcs r2, r2, r6\n\t"
  50957. #elif defined(__clang__)
  50958. "adcs r2, r6\n\t"
  50959. #else
  50960. "adc r2, r6\n\t"
  50961. #endif
  50962. #ifdef WOLFSSL_KEIL
  50963. "adcs r3, r3, %[r]\n\t"
  50964. #elif defined(__clang__)
  50965. "adcs r3, %[r]\n\t"
  50966. #else
  50967. "adc r3, %[r]\n\t"
  50968. #endif
  50969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50970. "lsrs r5, %[a], #16\n\t"
  50971. #else
  50972. "lsr r5, %[a], #16\n\t"
  50973. #endif
  50974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50975. "lsrs r6, r7, #16\n\t"
  50976. #else
  50977. "lsr r6, r7, #16\n\t"
  50978. #endif
  50979. #ifdef WOLFSSL_KEIL
  50980. "muls r6, r5, r6\n\t"
  50981. #elif defined(__clang__)
  50982. "muls r6, r5\n\t"
  50983. #else
  50984. "mul r6, r5\n\t"
  50985. #endif
  50986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50987. "adds r2, r2, r6\n\t"
  50988. #else
  50989. "add r2, r2, r6\n\t"
  50990. #endif
  50991. #ifdef WOLFSSL_KEIL
  50992. "adcs r3, r3, %[r]\n\t"
  50993. #elif defined(__clang__)
  50994. "adcs r3, %[r]\n\t"
  50995. #else
  50996. "adc r3, %[r]\n\t"
  50997. #endif
  50998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50999. "adds r2, r2, r6\n\t"
  51000. #else
  51001. "add r2, r2, r6\n\t"
  51002. #endif
  51003. #ifdef WOLFSSL_KEIL
  51004. "adcs r3, r3, %[r]\n\t"
  51005. #elif defined(__clang__)
  51006. "adcs r3, %[r]\n\t"
  51007. #else
  51008. "adc r3, %[r]\n\t"
  51009. #endif
  51010. "uxth r6, r7\n\t"
  51011. #ifdef WOLFSSL_KEIL
  51012. "muls r5, r6, r5\n\t"
  51013. #elif defined(__clang__)
  51014. "muls r5, r6\n\t"
  51015. #else
  51016. "mul r5, r6\n\t"
  51017. #endif
  51018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51019. "lsrs r6, r5, #16\n\t"
  51020. #else
  51021. "lsr r6, r5, #16\n\t"
  51022. #endif
  51023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51024. "lsls r5, r5, #16\n\t"
  51025. #else
  51026. "lsl r5, r5, #16\n\t"
  51027. #endif
  51028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51029. "adds r4, r4, r5\n\t"
  51030. #else
  51031. "add r4, r4, r5\n\t"
  51032. #endif
  51033. #ifdef WOLFSSL_KEIL
  51034. "adcs r2, r2, r6\n\t"
  51035. #elif defined(__clang__)
  51036. "adcs r2, r6\n\t"
  51037. #else
  51038. "adc r2, r6\n\t"
  51039. #endif
  51040. #ifdef WOLFSSL_KEIL
  51041. "adcs r3, r3, %[r]\n\t"
  51042. #elif defined(__clang__)
  51043. "adcs r3, %[r]\n\t"
  51044. #else
  51045. "adc r3, %[r]\n\t"
  51046. #endif
  51047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51048. "adds r4, r4, r5\n\t"
  51049. #else
  51050. "add r4, r4, r5\n\t"
  51051. #endif
  51052. #ifdef WOLFSSL_KEIL
  51053. "adcs r2, r2, r6\n\t"
  51054. #elif defined(__clang__)
  51055. "adcs r2, r6\n\t"
  51056. #else
  51057. "adc r2, r6\n\t"
  51058. #endif
  51059. #ifdef WOLFSSL_KEIL
  51060. "adcs r3, r3, %[r]\n\t"
  51061. #elif defined(__clang__)
  51062. "adcs r3, %[r]\n\t"
  51063. #else
  51064. "adc r3, %[r]\n\t"
  51065. #endif
  51066. "# A[1] * A[1]\n\t"
  51067. "mov r7, r11\n\t"
  51068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51069. "lsrs r6, r7, #16\n\t"
  51070. #else
  51071. "lsr r6, r7, #16\n\t"
  51072. #endif
  51073. "uxth r5, r7\n\t"
  51074. #ifdef WOLFSSL_KEIL
  51075. "muls r5, r5, r5\n\t"
  51076. #elif defined(__clang__)
  51077. "muls r5, r5\n\t"
  51078. #else
  51079. "mul r5, r5\n\t"
  51080. #endif
  51081. #ifdef WOLFSSL_KEIL
  51082. "muls r6, r6, r6\n\t"
  51083. #elif defined(__clang__)
  51084. "muls r6, r6\n\t"
  51085. #else
  51086. "mul r6, r6\n\t"
  51087. #endif
  51088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51089. "adds r4, r4, r5\n\t"
  51090. #else
  51091. "add r4, r4, r5\n\t"
  51092. #endif
  51093. #ifdef WOLFSSL_KEIL
  51094. "adcs r2, r2, r6\n\t"
  51095. #elif defined(__clang__)
  51096. "adcs r2, r6\n\t"
  51097. #else
  51098. "adc r2, r6\n\t"
  51099. #endif
  51100. #ifdef WOLFSSL_KEIL
  51101. "adcs r3, r3, %[r]\n\t"
  51102. #elif defined(__clang__)
  51103. "adcs r3, %[r]\n\t"
  51104. #else
  51105. "adc r3, %[r]\n\t"
  51106. #endif
  51107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51108. "lsrs r6, r7, #16\n\t"
  51109. #else
  51110. "lsr r6, r7, #16\n\t"
  51111. #endif
  51112. "uxth r5, r7\n\t"
  51113. #ifdef WOLFSSL_KEIL
  51114. "muls r5, r6, r5\n\t"
  51115. #elif defined(__clang__)
  51116. "muls r5, r6\n\t"
  51117. #else
  51118. "mul r5, r6\n\t"
  51119. #endif
  51120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51121. "lsrs r6, r5, #15\n\t"
  51122. #else
  51123. "lsr r6, r5, #15\n\t"
  51124. #endif
  51125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51126. "lsls r5, r5, #17\n\t"
  51127. #else
  51128. "lsl r5, r5, #17\n\t"
  51129. #endif
  51130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51131. "adds r4, r4, r5\n\t"
  51132. #else
  51133. "add r4, r4, r5\n\t"
  51134. #endif
  51135. #ifdef WOLFSSL_KEIL
  51136. "adcs r2, r2, r6\n\t"
  51137. #elif defined(__clang__)
  51138. "adcs r2, r6\n\t"
  51139. #else
  51140. "adc r2, r6\n\t"
  51141. #endif
  51142. #ifdef WOLFSSL_KEIL
  51143. "adcs r3, r3, %[r]\n\t"
  51144. #elif defined(__clang__)
  51145. "adcs r3, %[r]\n\t"
  51146. #else
  51147. "adc r3, %[r]\n\t"
  51148. #endif
  51149. "str r4, [sp, #8]\n\t"
  51150. "# A[2] * A[1]\n\t"
  51151. "movs r4, #0\n\t"
  51152. "mov %[a], r9\n\t"
  51153. "mov %[a], r12\n\t"
  51154. "uxth r5, %[a]\n\t"
  51155. "uxth r6, r7\n\t"
  51156. #ifdef WOLFSSL_KEIL
  51157. "muls r6, r5, r6\n\t"
  51158. #elif defined(__clang__)
  51159. "muls r6, r5\n\t"
  51160. #else
  51161. "mul r6, r5\n\t"
  51162. #endif
  51163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51164. "adds r2, r2, r6\n\t"
  51165. #else
  51166. "add r2, r2, r6\n\t"
  51167. #endif
  51168. #ifdef WOLFSSL_KEIL
  51169. "adcs r3, r3, %[r]\n\t"
  51170. #elif defined(__clang__)
  51171. "adcs r3, %[r]\n\t"
  51172. #else
  51173. "adc r3, %[r]\n\t"
  51174. #endif
  51175. #ifdef WOLFSSL_KEIL
  51176. "adcs r4, r4, %[r]\n\t"
  51177. #elif defined(__clang__)
  51178. "adcs r4, %[r]\n\t"
  51179. #else
  51180. "adc r4, %[r]\n\t"
  51181. #endif
  51182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51183. "adds r2, r2, r6\n\t"
  51184. #else
  51185. "add r2, r2, r6\n\t"
  51186. #endif
  51187. #ifdef WOLFSSL_KEIL
  51188. "adcs r3, r3, %[r]\n\t"
  51189. #elif defined(__clang__)
  51190. "adcs r3, %[r]\n\t"
  51191. #else
  51192. "adc r3, %[r]\n\t"
  51193. #endif
  51194. #ifdef WOLFSSL_KEIL
  51195. "adcs r4, r4, %[r]\n\t"
  51196. #elif defined(__clang__)
  51197. "adcs r4, %[r]\n\t"
  51198. #else
  51199. "adc r4, %[r]\n\t"
  51200. #endif
  51201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51202. "lsrs r6, r7, #16\n\t"
  51203. #else
  51204. "lsr r6, r7, #16\n\t"
  51205. #endif
  51206. #ifdef WOLFSSL_KEIL
  51207. "muls r5, r6, r5\n\t"
  51208. #elif defined(__clang__)
  51209. "muls r5, r6\n\t"
  51210. #else
  51211. "mul r5, r6\n\t"
  51212. #endif
  51213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51214. "lsrs r6, r5, #16\n\t"
  51215. #else
  51216. "lsr r6, r5, #16\n\t"
  51217. #endif
  51218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51219. "lsls r5, r5, #16\n\t"
  51220. #else
  51221. "lsl r5, r5, #16\n\t"
  51222. #endif
  51223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51224. "adds r2, r2, r5\n\t"
  51225. #else
  51226. "add r2, r2, r5\n\t"
  51227. #endif
  51228. #ifdef WOLFSSL_KEIL
  51229. "adcs r3, r3, r6\n\t"
  51230. #elif defined(__clang__)
  51231. "adcs r3, r6\n\t"
  51232. #else
  51233. "adc r3, r6\n\t"
  51234. #endif
  51235. #ifdef WOLFSSL_KEIL
  51236. "adcs r4, r4, %[r]\n\t"
  51237. #elif defined(__clang__)
  51238. "adcs r4, %[r]\n\t"
  51239. #else
  51240. "adc r4, %[r]\n\t"
  51241. #endif
  51242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51243. "adds r2, r2, r5\n\t"
  51244. #else
  51245. "add r2, r2, r5\n\t"
  51246. #endif
  51247. #ifdef WOLFSSL_KEIL
  51248. "adcs r3, r3, r6\n\t"
  51249. #elif defined(__clang__)
  51250. "adcs r3, r6\n\t"
  51251. #else
  51252. "adc r3, r6\n\t"
  51253. #endif
  51254. #ifdef WOLFSSL_KEIL
  51255. "adcs r4, r4, %[r]\n\t"
  51256. #elif defined(__clang__)
  51257. "adcs r4, %[r]\n\t"
  51258. #else
  51259. "adc r4, %[r]\n\t"
  51260. #endif
  51261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51262. "lsrs r5, %[a], #16\n\t"
  51263. #else
  51264. "lsr r5, %[a], #16\n\t"
  51265. #endif
  51266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51267. "lsrs r6, r7, #16\n\t"
  51268. #else
  51269. "lsr r6, r7, #16\n\t"
  51270. #endif
  51271. #ifdef WOLFSSL_KEIL
  51272. "muls r6, r5, r6\n\t"
  51273. #elif defined(__clang__)
  51274. "muls r6, r5\n\t"
  51275. #else
  51276. "mul r6, r5\n\t"
  51277. #endif
  51278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51279. "adds r3, r3, r6\n\t"
  51280. #else
  51281. "add r3, r3, r6\n\t"
  51282. #endif
  51283. #ifdef WOLFSSL_KEIL
  51284. "adcs r4, r4, %[r]\n\t"
  51285. #elif defined(__clang__)
  51286. "adcs r4, %[r]\n\t"
  51287. #else
  51288. "adc r4, %[r]\n\t"
  51289. #endif
  51290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51291. "adds r3, r3, r6\n\t"
  51292. #else
  51293. "add r3, r3, r6\n\t"
  51294. #endif
  51295. #ifdef WOLFSSL_KEIL
  51296. "adcs r4, r4, %[r]\n\t"
  51297. #elif defined(__clang__)
  51298. "adcs r4, %[r]\n\t"
  51299. #else
  51300. "adc r4, %[r]\n\t"
  51301. #endif
  51302. "uxth r6, r7\n\t"
  51303. #ifdef WOLFSSL_KEIL
  51304. "muls r5, r6, r5\n\t"
  51305. #elif defined(__clang__)
  51306. "muls r5, r6\n\t"
  51307. #else
  51308. "mul r5, r6\n\t"
  51309. #endif
  51310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51311. "lsrs r6, r5, #16\n\t"
  51312. #else
  51313. "lsr r6, r5, #16\n\t"
  51314. #endif
  51315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51316. "lsls r5, r5, #16\n\t"
  51317. #else
  51318. "lsl r5, r5, #16\n\t"
  51319. #endif
  51320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51321. "adds r2, r2, r5\n\t"
  51322. #else
  51323. "add r2, r2, r5\n\t"
  51324. #endif
  51325. #ifdef WOLFSSL_KEIL
  51326. "adcs r3, r3, r6\n\t"
  51327. #elif defined(__clang__)
  51328. "adcs r3, r6\n\t"
  51329. #else
  51330. "adc r3, r6\n\t"
  51331. #endif
  51332. #ifdef WOLFSSL_KEIL
  51333. "adcs r4, r4, %[r]\n\t"
  51334. #elif defined(__clang__)
  51335. "adcs r4, %[r]\n\t"
  51336. #else
  51337. "adc r4, %[r]\n\t"
  51338. #endif
  51339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51340. "adds r2, r2, r5\n\t"
  51341. #else
  51342. "add r2, r2, r5\n\t"
  51343. #endif
  51344. #ifdef WOLFSSL_KEIL
  51345. "adcs r3, r3, r6\n\t"
  51346. #elif defined(__clang__)
  51347. "adcs r3, r6\n\t"
  51348. #else
  51349. "adc r3, r6\n\t"
  51350. #endif
  51351. #ifdef WOLFSSL_KEIL
  51352. "adcs r4, r4, %[r]\n\t"
  51353. #elif defined(__clang__)
  51354. "adcs r4, %[r]\n\t"
  51355. #else
  51356. "adc r4, %[r]\n\t"
  51357. #endif
  51358. "# A[3] * A[0]\n\t"
  51359. "mov %[a], r9\n\t"
  51360. "mov r7, r10\n\t"
  51361. "mov %[a], lr\n\t"
  51362. "uxth r5, %[a]\n\t"
  51363. "uxth r6, r7\n\t"
  51364. #ifdef WOLFSSL_KEIL
  51365. "muls r6, r5, r6\n\t"
  51366. #elif defined(__clang__)
  51367. "muls r6, r5\n\t"
  51368. #else
  51369. "mul r6, r5\n\t"
  51370. #endif
  51371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51372. "adds r2, r2, r6\n\t"
  51373. #else
  51374. "add r2, r2, r6\n\t"
  51375. #endif
  51376. #ifdef WOLFSSL_KEIL
  51377. "adcs r3, r3, %[r]\n\t"
  51378. #elif defined(__clang__)
  51379. "adcs r3, %[r]\n\t"
  51380. #else
  51381. "adc r3, %[r]\n\t"
  51382. #endif
  51383. #ifdef WOLFSSL_KEIL
  51384. "adcs r4, r4, %[r]\n\t"
  51385. #elif defined(__clang__)
  51386. "adcs r4, %[r]\n\t"
  51387. #else
  51388. "adc r4, %[r]\n\t"
  51389. #endif
  51390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51391. "adds r2, r2, r6\n\t"
  51392. #else
  51393. "add r2, r2, r6\n\t"
  51394. #endif
  51395. #ifdef WOLFSSL_KEIL
  51396. "adcs r3, r3, %[r]\n\t"
  51397. #elif defined(__clang__)
  51398. "adcs r3, %[r]\n\t"
  51399. #else
  51400. "adc r3, %[r]\n\t"
  51401. #endif
  51402. #ifdef WOLFSSL_KEIL
  51403. "adcs r4, r4, %[r]\n\t"
  51404. #elif defined(__clang__)
  51405. "adcs r4, %[r]\n\t"
  51406. #else
  51407. "adc r4, %[r]\n\t"
  51408. #endif
  51409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51410. "lsrs r6, r7, #16\n\t"
  51411. #else
  51412. "lsr r6, r7, #16\n\t"
  51413. #endif
  51414. #ifdef WOLFSSL_KEIL
  51415. "muls r5, r6, r5\n\t"
  51416. #elif defined(__clang__)
  51417. "muls r5, r6\n\t"
  51418. #else
  51419. "mul r5, r6\n\t"
  51420. #endif
  51421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51422. "lsrs r6, r5, #16\n\t"
  51423. #else
  51424. "lsr r6, r5, #16\n\t"
  51425. #endif
  51426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51427. "lsls r5, r5, #16\n\t"
  51428. #else
  51429. "lsl r5, r5, #16\n\t"
  51430. #endif
  51431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51432. "adds r2, r2, r5\n\t"
  51433. #else
  51434. "add r2, r2, r5\n\t"
  51435. #endif
  51436. #ifdef WOLFSSL_KEIL
  51437. "adcs r3, r3, r6\n\t"
  51438. #elif defined(__clang__)
  51439. "adcs r3, r6\n\t"
  51440. #else
  51441. "adc r3, r6\n\t"
  51442. #endif
  51443. #ifdef WOLFSSL_KEIL
  51444. "adcs r4, r4, %[r]\n\t"
  51445. #elif defined(__clang__)
  51446. "adcs r4, %[r]\n\t"
  51447. #else
  51448. "adc r4, %[r]\n\t"
  51449. #endif
  51450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51451. "adds r2, r2, r5\n\t"
  51452. #else
  51453. "add r2, r2, r5\n\t"
  51454. #endif
  51455. #ifdef WOLFSSL_KEIL
  51456. "adcs r3, r3, r6\n\t"
  51457. #elif defined(__clang__)
  51458. "adcs r3, r6\n\t"
  51459. #else
  51460. "adc r3, r6\n\t"
  51461. #endif
  51462. #ifdef WOLFSSL_KEIL
  51463. "adcs r4, r4, %[r]\n\t"
  51464. #elif defined(__clang__)
  51465. "adcs r4, %[r]\n\t"
  51466. #else
  51467. "adc r4, %[r]\n\t"
  51468. #endif
  51469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51470. "lsrs r5, %[a], #16\n\t"
  51471. #else
  51472. "lsr r5, %[a], #16\n\t"
  51473. #endif
  51474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51475. "lsrs r6, r7, #16\n\t"
  51476. #else
  51477. "lsr r6, r7, #16\n\t"
  51478. #endif
  51479. #ifdef WOLFSSL_KEIL
  51480. "muls r6, r5, r6\n\t"
  51481. #elif defined(__clang__)
  51482. "muls r6, r5\n\t"
  51483. #else
  51484. "mul r6, r5\n\t"
  51485. #endif
  51486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51487. "adds r3, r3, r6\n\t"
  51488. #else
  51489. "add r3, r3, r6\n\t"
  51490. #endif
  51491. #ifdef WOLFSSL_KEIL
  51492. "adcs r4, r4, %[r]\n\t"
  51493. #elif defined(__clang__)
  51494. "adcs r4, %[r]\n\t"
  51495. #else
  51496. "adc r4, %[r]\n\t"
  51497. #endif
  51498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51499. "adds r3, r3, r6\n\t"
  51500. #else
  51501. "add r3, r3, r6\n\t"
  51502. #endif
  51503. #ifdef WOLFSSL_KEIL
  51504. "adcs r4, r4, %[r]\n\t"
  51505. #elif defined(__clang__)
  51506. "adcs r4, %[r]\n\t"
  51507. #else
  51508. "adc r4, %[r]\n\t"
  51509. #endif
  51510. "uxth r6, r7\n\t"
  51511. #ifdef WOLFSSL_KEIL
  51512. "muls r5, r6, r5\n\t"
  51513. #elif defined(__clang__)
  51514. "muls r5, r6\n\t"
  51515. #else
  51516. "mul r5, r6\n\t"
  51517. #endif
  51518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51519. "lsrs r6, r5, #16\n\t"
  51520. #else
  51521. "lsr r6, r5, #16\n\t"
  51522. #endif
  51523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51524. "lsls r5, r5, #16\n\t"
  51525. #else
  51526. "lsl r5, r5, #16\n\t"
  51527. #endif
  51528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51529. "adds r2, r2, r5\n\t"
  51530. #else
  51531. "add r2, r2, r5\n\t"
  51532. #endif
  51533. #ifdef WOLFSSL_KEIL
  51534. "adcs r3, r3, r6\n\t"
  51535. #elif defined(__clang__)
  51536. "adcs r3, r6\n\t"
  51537. #else
  51538. "adc r3, r6\n\t"
  51539. #endif
  51540. #ifdef WOLFSSL_KEIL
  51541. "adcs r4, r4, %[r]\n\t"
  51542. #elif defined(__clang__)
  51543. "adcs r4, %[r]\n\t"
  51544. #else
  51545. "adc r4, %[r]\n\t"
  51546. #endif
  51547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51548. "adds r2, r2, r5\n\t"
  51549. #else
  51550. "add r2, r2, r5\n\t"
  51551. #endif
  51552. #ifdef WOLFSSL_KEIL
  51553. "adcs r3, r3, r6\n\t"
  51554. #elif defined(__clang__)
  51555. "adcs r3, r6\n\t"
  51556. #else
  51557. "adc r3, r6\n\t"
  51558. #endif
  51559. #ifdef WOLFSSL_KEIL
  51560. "adcs r4, r4, %[r]\n\t"
  51561. #elif defined(__clang__)
  51562. "adcs r4, %[r]\n\t"
  51563. #else
  51564. "adc r4, %[r]\n\t"
  51565. #endif
  51566. "str r2, [sp, #12]\n\t"
  51567. "# A[4] * A[0]\n\t"
  51568. "movs r2, #0\n\t"
  51569. "mov %[a], r9\n\t"
  51570. "ldr %[a], [%[a], #16]\n\t"
  51571. "uxth r5, %[a]\n\t"
  51572. "uxth r6, r7\n\t"
  51573. #ifdef WOLFSSL_KEIL
  51574. "muls r6, r5, r6\n\t"
  51575. #elif defined(__clang__)
  51576. "muls r6, r5\n\t"
  51577. #else
  51578. "mul r6, r5\n\t"
  51579. #endif
  51580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51581. "adds r3, r3, r6\n\t"
  51582. #else
  51583. "add r3, r3, r6\n\t"
  51584. #endif
  51585. #ifdef WOLFSSL_KEIL
  51586. "adcs r4, r4, %[r]\n\t"
  51587. #elif defined(__clang__)
  51588. "adcs r4, %[r]\n\t"
  51589. #else
  51590. "adc r4, %[r]\n\t"
  51591. #endif
  51592. #ifdef WOLFSSL_KEIL
  51593. "adcs r2, r2, %[r]\n\t"
  51594. #elif defined(__clang__)
  51595. "adcs r2, %[r]\n\t"
  51596. #else
  51597. "adc r2, %[r]\n\t"
  51598. #endif
  51599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51600. "adds r3, r3, r6\n\t"
  51601. #else
  51602. "add r3, r3, r6\n\t"
  51603. #endif
  51604. #ifdef WOLFSSL_KEIL
  51605. "adcs r4, r4, %[r]\n\t"
  51606. #elif defined(__clang__)
  51607. "adcs r4, %[r]\n\t"
  51608. #else
  51609. "adc r4, %[r]\n\t"
  51610. #endif
  51611. #ifdef WOLFSSL_KEIL
  51612. "adcs r2, r2, %[r]\n\t"
  51613. #elif defined(__clang__)
  51614. "adcs r2, %[r]\n\t"
  51615. #else
  51616. "adc r2, %[r]\n\t"
  51617. #endif
  51618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51619. "lsrs r6, r7, #16\n\t"
  51620. #else
  51621. "lsr r6, r7, #16\n\t"
  51622. #endif
  51623. #ifdef WOLFSSL_KEIL
  51624. "muls r5, r6, r5\n\t"
  51625. #elif defined(__clang__)
  51626. "muls r5, r6\n\t"
  51627. #else
  51628. "mul r5, r6\n\t"
  51629. #endif
  51630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51631. "lsrs r6, r5, #16\n\t"
  51632. #else
  51633. "lsr r6, r5, #16\n\t"
  51634. #endif
  51635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51636. "lsls r5, r5, #16\n\t"
  51637. #else
  51638. "lsl r5, r5, #16\n\t"
  51639. #endif
  51640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51641. "adds r3, r3, r5\n\t"
  51642. #else
  51643. "add r3, r3, r5\n\t"
  51644. #endif
  51645. #ifdef WOLFSSL_KEIL
  51646. "adcs r4, r4, r6\n\t"
  51647. #elif defined(__clang__)
  51648. "adcs r4, r6\n\t"
  51649. #else
  51650. "adc r4, r6\n\t"
  51651. #endif
  51652. #ifdef WOLFSSL_KEIL
  51653. "adcs r2, r2, %[r]\n\t"
  51654. #elif defined(__clang__)
  51655. "adcs r2, %[r]\n\t"
  51656. #else
  51657. "adc r2, %[r]\n\t"
  51658. #endif
  51659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51660. "adds r3, r3, r5\n\t"
  51661. #else
  51662. "add r3, r3, r5\n\t"
  51663. #endif
  51664. #ifdef WOLFSSL_KEIL
  51665. "adcs r4, r4, r6\n\t"
  51666. #elif defined(__clang__)
  51667. "adcs r4, r6\n\t"
  51668. #else
  51669. "adc r4, r6\n\t"
  51670. #endif
  51671. #ifdef WOLFSSL_KEIL
  51672. "adcs r2, r2, %[r]\n\t"
  51673. #elif defined(__clang__)
  51674. "adcs r2, %[r]\n\t"
  51675. #else
  51676. "adc r2, %[r]\n\t"
  51677. #endif
  51678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51679. "lsrs r5, %[a], #16\n\t"
  51680. #else
  51681. "lsr r5, %[a], #16\n\t"
  51682. #endif
  51683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51684. "lsrs r6, r7, #16\n\t"
  51685. #else
  51686. "lsr r6, r7, #16\n\t"
  51687. #endif
  51688. #ifdef WOLFSSL_KEIL
  51689. "muls r6, r5, r6\n\t"
  51690. #elif defined(__clang__)
  51691. "muls r6, r5\n\t"
  51692. #else
  51693. "mul r6, r5\n\t"
  51694. #endif
  51695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51696. "adds r4, r4, r6\n\t"
  51697. #else
  51698. "add r4, r4, r6\n\t"
  51699. #endif
  51700. #ifdef WOLFSSL_KEIL
  51701. "adcs r2, r2, %[r]\n\t"
  51702. #elif defined(__clang__)
  51703. "adcs r2, %[r]\n\t"
  51704. #else
  51705. "adc r2, %[r]\n\t"
  51706. #endif
  51707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51708. "adds r4, r4, r6\n\t"
  51709. #else
  51710. "add r4, r4, r6\n\t"
  51711. #endif
  51712. #ifdef WOLFSSL_KEIL
  51713. "adcs r2, r2, %[r]\n\t"
  51714. #elif defined(__clang__)
  51715. "adcs r2, %[r]\n\t"
  51716. #else
  51717. "adc r2, %[r]\n\t"
  51718. #endif
  51719. "uxth r6, r7\n\t"
  51720. #ifdef WOLFSSL_KEIL
  51721. "muls r5, r6, r5\n\t"
  51722. #elif defined(__clang__)
  51723. "muls r5, r6\n\t"
  51724. #else
  51725. "mul r5, r6\n\t"
  51726. #endif
  51727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51728. "lsrs r6, r5, #16\n\t"
  51729. #else
  51730. "lsr r6, r5, #16\n\t"
  51731. #endif
  51732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51733. "lsls r5, r5, #16\n\t"
  51734. #else
  51735. "lsl r5, r5, #16\n\t"
  51736. #endif
  51737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51738. "adds r3, r3, r5\n\t"
  51739. #else
  51740. "add r3, r3, r5\n\t"
  51741. #endif
  51742. #ifdef WOLFSSL_KEIL
  51743. "adcs r4, r4, r6\n\t"
  51744. #elif defined(__clang__)
  51745. "adcs r4, r6\n\t"
  51746. #else
  51747. "adc r4, r6\n\t"
  51748. #endif
  51749. #ifdef WOLFSSL_KEIL
  51750. "adcs r2, r2, %[r]\n\t"
  51751. #elif defined(__clang__)
  51752. "adcs r2, %[r]\n\t"
  51753. #else
  51754. "adc r2, %[r]\n\t"
  51755. #endif
  51756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51757. "adds r3, r3, r5\n\t"
  51758. #else
  51759. "add r3, r3, r5\n\t"
  51760. #endif
  51761. #ifdef WOLFSSL_KEIL
  51762. "adcs r4, r4, r6\n\t"
  51763. #elif defined(__clang__)
  51764. "adcs r4, r6\n\t"
  51765. #else
  51766. "adc r4, r6\n\t"
  51767. #endif
  51768. #ifdef WOLFSSL_KEIL
  51769. "adcs r2, r2, %[r]\n\t"
  51770. #elif defined(__clang__)
  51771. "adcs r2, %[r]\n\t"
  51772. #else
  51773. "adc r2, %[r]\n\t"
  51774. #endif
  51775. "# A[3] * A[1]\n\t"
  51776. "mov %[a], r9\n\t"
  51777. "mov r7, r11\n\t"
  51778. "mov %[a], lr\n\t"
  51779. "uxth r5, %[a]\n\t"
  51780. "uxth r6, r7\n\t"
  51781. #ifdef WOLFSSL_KEIL
  51782. "muls r6, r5, r6\n\t"
  51783. #elif defined(__clang__)
  51784. "muls r6, r5\n\t"
  51785. #else
  51786. "mul r6, r5\n\t"
  51787. #endif
  51788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51789. "adds r3, r3, r6\n\t"
  51790. #else
  51791. "add r3, r3, r6\n\t"
  51792. #endif
  51793. #ifdef WOLFSSL_KEIL
  51794. "adcs r4, r4, %[r]\n\t"
  51795. #elif defined(__clang__)
  51796. "adcs r4, %[r]\n\t"
  51797. #else
  51798. "adc r4, %[r]\n\t"
  51799. #endif
  51800. #ifdef WOLFSSL_KEIL
  51801. "adcs r2, r2, %[r]\n\t"
  51802. #elif defined(__clang__)
  51803. "adcs r2, %[r]\n\t"
  51804. #else
  51805. "adc r2, %[r]\n\t"
  51806. #endif
  51807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51808. "adds r3, r3, r6\n\t"
  51809. #else
  51810. "add r3, r3, r6\n\t"
  51811. #endif
  51812. #ifdef WOLFSSL_KEIL
  51813. "adcs r4, r4, %[r]\n\t"
  51814. #elif defined(__clang__)
  51815. "adcs r4, %[r]\n\t"
  51816. #else
  51817. "adc r4, %[r]\n\t"
  51818. #endif
  51819. #ifdef WOLFSSL_KEIL
  51820. "adcs r2, r2, %[r]\n\t"
  51821. #elif defined(__clang__)
  51822. "adcs r2, %[r]\n\t"
  51823. #else
  51824. "adc r2, %[r]\n\t"
  51825. #endif
  51826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51827. "lsrs r6, r7, #16\n\t"
  51828. #else
  51829. "lsr r6, r7, #16\n\t"
  51830. #endif
  51831. #ifdef WOLFSSL_KEIL
  51832. "muls r5, r6, r5\n\t"
  51833. #elif defined(__clang__)
  51834. "muls r5, r6\n\t"
  51835. #else
  51836. "mul r5, r6\n\t"
  51837. #endif
  51838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51839. "lsrs r6, r5, #16\n\t"
  51840. #else
  51841. "lsr r6, r5, #16\n\t"
  51842. #endif
  51843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51844. "lsls r5, r5, #16\n\t"
  51845. #else
  51846. "lsl r5, r5, #16\n\t"
  51847. #endif
  51848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51849. "adds r3, r3, r5\n\t"
  51850. #else
  51851. "add r3, r3, r5\n\t"
  51852. #endif
  51853. #ifdef WOLFSSL_KEIL
  51854. "adcs r4, r4, r6\n\t"
  51855. #elif defined(__clang__)
  51856. "adcs r4, r6\n\t"
  51857. #else
  51858. "adc r4, r6\n\t"
  51859. #endif
  51860. #ifdef WOLFSSL_KEIL
  51861. "adcs r2, r2, %[r]\n\t"
  51862. #elif defined(__clang__)
  51863. "adcs r2, %[r]\n\t"
  51864. #else
  51865. "adc r2, %[r]\n\t"
  51866. #endif
  51867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51868. "adds r3, r3, r5\n\t"
  51869. #else
  51870. "add r3, r3, r5\n\t"
  51871. #endif
  51872. #ifdef WOLFSSL_KEIL
  51873. "adcs r4, r4, r6\n\t"
  51874. #elif defined(__clang__)
  51875. "adcs r4, r6\n\t"
  51876. #else
  51877. "adc r4, r6\n\t"
  51878. #endif
  51879. #ifdef WOLFSSL_KEIL
  51880. "adcs r2, r2, %[r]\n\t"
  51881. #elif defined(__clang__)
  51882. "adcs r2, %[r]\n\t"
  51883. #else
  51884. "adc r2, %[r]\n\t"
  51885. #endif
  51886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51887. "lsrs r5, %[a], #16\n\t"
  51888. #else
  51889. "lsr r5, %[a], #16\n\t"
  51890. #endif
  51891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51892. "lsrs r6, r7, #16\n\t"
  51893. #else
  51894. "lsr r6, r7, #16\n\t"
  51895. #endif
  51896. #ifdef WOLFSSL_KEIL
  51897. "muls r6, r5, r6\n\t"
  51898. #elif defined(__clang__)
  51899. "muls r6, r5\n\t"
  51900. #else
  51901. "mul r6, r5\n\t"
  51902. #endif
  51903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51904. "adds r4, r4, r6\n\t"
  51905. #else
  51906. "add r4, r4, r6\n\t"
  51907. #endif
  51908. #ifdef WOLFSSL_KEIL
  51909. "adcs r2, r2, %[r]\n\t"
  51910. #elif defined(__clang__)
  51911. "adcs r2, %[r]\n\t"
  51912. #else
  51913. "adc r2, %[r]\n\t"
  51914. #endif
  51915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51916. "adds r4, r4, r6\n\t"
  51917. #else
  51918. "add r4, r4, r6\n\t"
  51919. #endif
  51920. #ifdef WOLFSSL_KEIL
  51921. "adcs r2, r2, %[r]\n\t"
  51922. #elif defined(__clang__)
  51923. "adcs r2, %[r]\n\t"
  51924. #else
  51925. "adc r2, %[r]\n\t"
  51926. #endif
  51927. "uxth r6, r7\n\t"
  51928. #ifdef WOLFSSL_KEIL
  51929. "muls r5, r6, r5\n\t"
  51930. #elif defined(__clang__)
  51931. "muls r5, r6\n\t"
  51932. #else
  51933. "mul r5, r6\n\t"
  51934. #endif
  51935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51936. "lsrs r6, r5, #16\n\t"
  51937. #else
  51938. "lsr r6, r5, #16\n\t"
  51939. #endif
  51940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51941. "lsls r5, r5, #16\n\t"
  51942. #else
  51943. "lsl r5, r5, #16\n\t"
  51944. #endif
  51945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51946. "adds r3, r3, r5\n\t"
  51947. #else
  51948. "add r3, r3, r5\n\t"
  51949. #endif
  51950. #ifdef WOLFSSL_KEIL
  51951. "adcs r4, r4, r6\n\t"
  51952. #elif defined(__clang__)
  51953. "adcs r4, r6\n\t"
  51954. #else
  51955. "adc r4, r6\n\t"
  51956. #endif
  51957. #ifdef WOLFSSL_KEIL
  51958. "adcs r2, r2, %[r]\n\t"
  51959. #elif defined(__clang__)
  51960. "adcs r2, %[r]\n\t"
  51961. #else
  51962. "adc r2, %[r]\n\t"
  51963. #endif
  51964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51965. "adds r3, r3, r5\n\t"
  51966. #else
  51967. "add r3, r3, r5\n\t"
  51968. #endif
  51969. #ifdef WOLFSSL_KEIL
  51970. "adcs r4, r4, r6\n\t"
  51971. #elif defined(__clang__)
  51972. "adcs r4, r6\n\t"
  51973. #else
  51974. "adc r4, r6\n\t"
  51975. #endif
  51976. #ifdef WOLFSSL_KEIL
  51977. "adcs r2, r2, %[r]\n\t"
  51978. #elif defined(__clang__)
  51979. "adcs r2, %[r]\n\t"
  51980. #else
  51981. "adc r2, %[r]\n\t"
  51982. #endif
  51983. "# A[2] * A[2]\n\t"
  51984. "mov r7, r12\n\t"
  51985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51986. "lsrs r6, r7, #16\n\t"
  51987. #else
  51988. "lsr r6, r7, #16\n\t"
  51989. #endif
  51990. "uxth r5, r7\n\t"
  51991. #ifdef WOLFSSL_KEIL
  51992. "muls r5, r5, r5\n\t"
  51993. #elif defined(__clang__)
  51994. "muls r5, r5\n\t"
  51995. #else
  51996. "mul r5, r5\n\t"
  51997. #endif
  51998. #ifdef WOLFSSL_KEIL
  51999. "muls r6, r6, r6\n\t"
  52000. #elif defined(__clang__)
  52001. "muls r6, r6\n\t"
  52002. #else
  52003. "mul r6, r6\n\t"
  52004. #endif
  52005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52006. "adds r3, r3, r5\n\t"
  52007. #else
  52008. "add r3, r3, r5\n\t"
  52009. #endif
  52010. #ifdef WOLFSSL_KEIL
  52011. "adcs r4, r4, r6\n\t"
  52012. #elif defined(__clang__)
  52013. "adcs r4, r6\n\t"
  52014. #else
  52015. "adc r4, r6\n\t"
  52016. #endif
  52017. #ifdef WOLFSSL_KEIL
  52018. "adcs r2, r2, %[r]\n\t"
  52019. #elif defined(__clang__)
  52020. "adcs r2, %[r]\n\t"
  52021. #else
  52022. "adc r2, %[r]\n\t"
  52023. #endif
  52024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52025. "lsrs r6, r7, #16\n\t"
  52026. #else
  52027. "lsr r6, r7, #16\n\t"
  52028. #endif
  52029. "uxth r5, r7\n\t"
  52030. #ifdef WOLFSSL_KEIL
  52031. "muls r5, r6, r5\n\t"
  52032. #elif defined(__clang__)
  52033. "muls r5, r6\n\t"
  52034. #else
  52035. "mul r5, r6\n\t"
  52036. #endif
  52037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52038. "lsrs r6, r5, #15\n\t"
  52039. #else
  52040. "lsr r6, r5, #15\n\t"
  52041. #endif
  52042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52043. "lsls r5, r5, #17\n\t"
  52044. #else
  52045. "lsl r5, r5, #17\n\t"
  52046. #endif
  52047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52048. "adds r3, r3, r5\n\t"
  52049. #else
  52050. "add r3, r3, r5\n\t"
  52051. #endif
  52052. #ifdef WOLFSSL_KEIL
  52053. "adcs r4, r4, r6\n\t"
  52054. #elif defined(__clang__)
  52055. "adcs r4, r6\n\t"
  52056. #else
  52057. "adc r4, r6\n\t"
  52058. #endif
  52059. #ifdef WOLFSSL_KEIL
  52060. "adcs r2, r2, %[r]\n\t"
  52061. #elif defined(__clang__)
  52062. "adcs r2, %[r]\n\t"
  52063. #else
  52064. "adc r2, %[r]\n\t"
  52065. #endif
  52066. "str r3, [sp, #16]\n\t"
  52067. "# A[3] * A[2]\n\t"
  52068. "movs r3, #0\n\t"
  52069. "mov %[a], r9\n\t"
  52070. "mov %[a], lr\n\t"
  52071. "uxth r5, %[a]\n\t"
  52072. "uxth r6, r7\n\t"
  52073. #ifdef WOLFSSL_KEIL
  52074. "muls r6, r5, r6\n\t"
  52075. #elif defined(__clang__)
  52076. "muls r6, r5\n\t"
  52077. #else
  52078. "mul r6, r5\n\t"
  52079. #endif
  52080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52081. "adds r4, r4, r6\n\t"
  52082. #else
  52083. "add r4, r4, r6\n\t"
  52084. #endif
  52085. #ifdef WOLFSSL_KEIL
  52086. "adcs r2, r2, %[r]\n\t"
  52087. #elif defined(__clang__)
  52088. "adcs r2, %[r]\n\t"
  52089. #else
  52090. "adc r2, %[r]\n\t"
  52091. #endif
  52092. #ifdef WOLFSSL_KEIL
  52093. "adcs r3, r3, %[r]\n\t"
  52094. #elif defined(__clang__)
  52095. "adcs r3, %[r]\n\t"
  52096. #else
  52097. "adc r3, %[r]\n\t"
  52098. #endif
  52099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52100. "adds r4, r4, r6\n\t"
  52101. #else
  52102. "add r4, r4, r6\n\t"
  52103. #endif
  52104. #ifdef WOLFSSL_KEIL
  52105. "adcs r2, r2, %[r]\n\t"
  52106. #elif defined(__clang__)
  52107. "adcs r2, %[r]\n\t"
  52108. #else
  52109. "adc r2, %[r]\n\t"
  52110. #endif
  52111. #ifdef WOLFSSL_KEIL
  52112. "adcs r3, r3, %[r]\n\t"
  52113. #elif defined(__clang__)
  52114. "adcs r3, %[r]\n\t"
  52115. #else
  52116. "adc r3, %[r]\n\t"
  52117. #endif
  52118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52119. "lsrs r6, r7, #16\n\t"
  52120. #else
  52121. "lsr r6, r7, #16\n\t"
  52122. #endif
  52123. #ifdef WOLFSSL_KEIL
  52124. "muls r5, r6, r5\n\t"
  52125. #elif defined(__clang__)
  52126. "muls r5, r6\n\t"
  52127. #else
  52128. "mul r5, r6\n\t"
  52129. #endif
  52130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52131. "lsrs r6, r5, #16\n\t"
  52132. #else
  52133. "lsr r6, r5, #16\n\t"
  52134. #endif
  52135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52136. "lsls r5, r5, #16\n\t"
  52137. #else
  52138. "lsl r5, r5, #16\n\t"
  52139. #endif
  52140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52141. "adds r4, r4, r5\n\t"
  52142. #else
  52143. "add r4, r4, r5\n\t"
  52144. #endif
  52145. #ifdef WOLFSSL_KEIL
  52146. "adcs r2, r2, r6\n\t"
  52147. #elif defined(__clang__)
  52148. "adcs r2, r6\n\t"
  52149. #else
  52150. "adc r2, r6\n\t"
  52151. #endif
  52152. #ifdef WOLFSSL_KEIL
  52153. "adcs r3, r3, %[r]\n\t"
  52154. #elif defined(__clang__)
  52155. "adcs r3, %[r]\n\t"
  52156. #else
  52157. "adc r3, %[r]\n\t"
  52158. #endif
  52159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52160. "adds r4, r4, r5\n\t"
  52161. #else
  52162. "add r4, r4, r5\n\t"
  52163. #endif
  52164. #ifdef WOLFSSL_KEIL
  52165. "adcs r2, r2, r6\n\t"
  52166. #elif defined(__clang__)
  52167. "adcs r2, r6\n\t"
  52168. #else
  52169. "adc r2, r6\n\t"
  52170. #endif
  52171. #ifdef WOLFSSL_KEIL
  52172. "adcs r3, r3, %[r]\n\t"
  52173. #elif defined(__clang__)
  52174. "adcs r3, %[r]\n\t"
  52175. #else
  52176. "adc r3, %[r]\n\t"
  52177. #endif
  52178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52179. "lsrs r5, %[a], #16\n\t"
  52180. #else
  52181. "lsr r5, %[a], #16\n\t"
  52182. #endif
  52183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52184. "lsrs r6, r7, #16\n\t"
  52185. #else
  52186. "lsr r6, r7, #16\n\t"
  52187. #endif
  52188. #ifdef WOLFSSL_KEIL
  52189. "muls r6, r5, r6\n\t"
  52190. #elif defined(__clang__)
  52191. "muls r6, r5\n\t"
  52192. #else
  52193. "mul r6, r5\n\t"
  52194. #endif
  52195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52196. "adds r2, r2, r6\n\t"
  52197. #else
  52198. "add r2, r2, r6\n\t"
  52199. #endif
  52200. #ifdef WOLFSSL_KEIL
  52201. "adcs r3, r3, %[r]\n\t"
  52202. #elif defined(__clang__)
  52203. "adcs r3, %[r]\n\t"
  52204. #else
  52205. "adc r3, %[r]\n\t"
  52206. #endif
  52207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52208. "adds r2, r2, r6\n\t"
  52209. #else
  52210. "add r2, r2, r6\n\t"
  52211. #endif
  52212. #ifdef WOLFSSL_KEIL
  52213. "adcs r3, r3, %[r]\n\t"
  52214. #elif defined(__clang__)
  52215. "adcs r3, %[r]\n\t"
  52216. #else
  52217. "adc r3, %[r]\n\t"
  52218. #endif
  52219. "uxth r6, r7\n\t"
  52220. #ifdef WOLFSSL_KEIL
  52221. "muls r5, r6, r5\n\t"
  52222. #elif defined(__clang__)
  52223. "muls r5, r6\n\t"
  52224. #else
  52225. "mul r5, r6\n\t"
  52226. #endif
  52227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52228. "lsrs r6, r5, #16\n\t"
  52229. #else
  52230. "lsr r6, r5, #16\n\t"
  52231. #endif
  52232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52233. "lsls r5, r5, #16\n\t"
  52234. #else
  52235. "lsl r5, r5, #16\n\t"
  52236. #endif
  52237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52238. "adds r4, r4, r5\n\t"
  52239. #else
  52240. "add r4, r4, r5\n\t"
  52241. #endif
  52242. #ifdef WOLFSSL_KEIL
  52243. "adcs r2, r2, r6\n\t"
  52244. #elif defined(__clang__)
  52245. "adcs r2, r6\n\t"
  52246. #else
  52247. "adc r2, r6\n\t"
  52248. #endif
  52249. #ifdef WOLFSSL_KEIL
  52250. "adcs r3, r3, %[r]\n\t"
  52251. #elif defined(__clang__)
  52252. "adcs r3, %[r]\n\t"
  52253. #else
  52254. "adc r3, %[r]\n\t"
  52255. #endif
  52256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52257. "adds r4, r4, r5\n\t"
  52258. #else
  52259. "add r4, r4, r5\n\t"
  52260. #endif
  52261. #ifdef WOLFSSL_KEIL
  52262. "adcs r2, r2, r6\n\t"
  52263. #elif defined(__clang__)
  52264. "adcs r2, r6\n\t"
  52265. #else
  52266. "adc r2, r6\n\t"
  52267. #endif
  52268. #ifdef WOLFSSL_KEIL
  52269. "adcs r3, r3, %[r]\n\t"
  52270. #elif defined(__clang__)
  52271. "adcs r3, %[r]\n\t"
  52272. #else
  52273. "adc r3, %[r]\n\t"
  52274. #endif
  52275. "# A[4] * A[1]\n\t"
  52276. "mov %[a], r9\n\t"
  52277. "mov r7, r11\n\t"
  52278. "ldr %[a], [%[a], #16]\n\t"
  52279. "uxth r5, %[a]\n\t"
  52280. "uxth r6, r7\n\t"
  52281. #ifdef WOLFSSL_KEIL
  52282. "muls r6, r5, r6\n\t"
  52283. #elif defined(__clang__)
  52284. "muls r6, r5\n\t"
  52285. #else
  52286. "mul r6, r5\n\t"
  52287. #endif
  52288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52289. "adds r4, r4, r6\n\t"
  52290. #else
  52291. "add r4, r4, r6\n\t"
  52292. #endif
  52293. #ifdef WOLFSSL_KEIL
  52294. "adcs r2, r2, %[r]\n\t"
  52295. #elif defined(__clang__)
  52296. "adcs r2, %[r]\n\t"
  52297. #else
  52298. "adc r2, %[r]\n\t"
  52299. #endif
  52300. #ifdef WOLFSSL_KEIL
  52301. "adcs r3, r3, %[r]\n\t"
  52302. #elif defined(__clang__)
  52303. "adcs r3, %[r]\n\t"
  52304. #else
  52305. "adc r3, %[r]\n\t"
  52306. #endif
  52307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52308. "adds r4, r4, r6\n\t"
  52309. #else
  52310. "add r4, r4, r6\n\t"
  52311. #endif
  52312. #ifdef WOLFSSL_KEIL
  52313. "adcs r2, r2, %[r]\n\t"
  52314. #elif defined(__clang__)
  52315. "adcs r2, %[r]\n\t"
  52316. #else
  52317. "adc r2, %[r]\n\t"
  52318. #endif
  52319. #ifdef WOLFSSL_KEIL
  52320. "adcs r3, r3, %[r]\n\t"
  52321. #elif defined(__clang__)
  52322. "adcs r3, %[r]\n\t"
  52323. #else
  52324. "adc r3, %[r]\n\t"
  52325. #endif
  52326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52327. "lsrs r6, r7, #16\n\t"
  52328. #else
  52329. "lsr r6, r7, #16\n\t"
  52330. #endif
  52331. #ifdef WOLFSSL_KEIL
  52332. "muls r5, r6, r5\n\t"
  52333. #elif defined(__clang__)
  52334. "muls r5, r6\n\t"
  52335. #else
  52336. "mul r5, r6\n\t"
  52337. #endif
  52338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52339. "lsrs r6, r5, #16\n\t"
  52340. #else
  52341. "lsr r6, r5, #16\n\t"
  52342. #endif
  52343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52344. "lsls r5, r5, #16\n\t"
  52345. #else
  52346. "lsl r5, r5, #16\n\t"
  52347. #endif
  52348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52349. "adds r4, r4, r5\n\t"
  52350. #else
  52351. "add r4, r4, r5\n\t"
  52352. #endif
  52353. #ifdef WOLFSSL_KEIL
  52354. "adcs r2, r2, r6\n\t"
  52355. #elif defined(__clang__)
  52356. "adcs r2, r6\n\t"
  52357. #else
  52358. "adc r2, r6\n\t"
  52359. #endif
  52360. #ifdef WOLFSSL_KEIL
  52361. "adcs r3, r3, %[r]\n\t"
  52362. #elif defined(__clang__)
  52363. "adcs r3, %[r]\n\t"
  52364. #else
  52365. "adc r3, %[r]\n\t"
  52366. #endif
  52367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52368. "adds r4, r4, r5\n\t"
  52369. #else
  52370. "add r4, r4, r5\n\t"
  52371. #endif
  52372. #ifdef WOLFSSL_KEIL
  52373. "adcs r2, r2, r6\n\t"
  52374. #elif defined(__clang__)
  52375. "adcs r2, r6\n\t"
  52376. #else
  52377. "adc r2, r6\n\t"
  52378. #endif
  52379. #ifdef WOLFSSL_KEIL
  52380. "adcs r3, r3, %[r]\n\t"
  52381. #elif defined(__clang__)
  52382. "adcs r3, %[r]\n\t"
  52383. #else
  52384. "adc r3, %[r]\n\t"
  52385. #endif
  52386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52387. "lsrs r5, %[a], #16\n\t"
  52388. #else
  52389. "lsr r5, %[a], #16\n\t"
  52390. #endif
  52391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52392. "lsrs r6, r7, #16\n\t"
  52393. #else
  52394. "lsr r6, r7, #16\n\t"
  52395. #endif
  52396. #ifdef WOLFSSL_KEIL
  52397. "muls r6, r5, r6\n\t"
  52398. #elif defined(__clang__)
  52399. "muls r6, r5\n\t"
  52400. #else
  52401. "mul r6, r5\n\t"
  52402. #endif
  52403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52404. "adds r2, r2, r6\n\t"
  52405. #else
  52406. "add r2, r2, r6\n\t"
  52407. #endif
  52408. #ifdef WOLFSSL_KEIL
  52409. "adcs r3, r3, %[r]\n\t"
  52410. #elif defined(__clang__)
  52411. "adcs r3, %[r]\n\t"
  52412. #else
  52413. "adc r3, %[r]\n\t"
  52414. #endif
  52415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52416. "adds r2, r2, r6\n\t"
  52417. #else
  52418. "add r2, r2, r6\n\t"
  52419. #endif
  52420. #ifdef WOLFSSL_KEIL
  52421. "adcs r3, r3, %[r]\n\t"
  52422. #elif defined(__clang__)
  52423. "adcs r3, %[r]\n\t"
  52424. #else
  52425. "adc r3, %[r]\n\t"
  52426. #endif
  52427. "uxth r6, r7\n\t"
  52428. #ifdef WOLFSSL_KEIL
  52429. "muls r5, r6, r5\n\t"
  52430. #elif defined(__clang__)
  52431. "muls r5, r6\n\t"
  52432. #else
  52433. "mul r5, r6\n\t"
  52434. #endif
  52435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52436. "lsrs r6, r5, #16\n\t"
  52437. #else
  52438. "lsr r6, r5, #16\n\t"
  52439. #endif
  52440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52441. "lsls r5, r5, #16\n\t"
  52442. #else
  52443. "lsl r5, r5, #16\n\t"
  52444. #endif
  52445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52446. "adds r4, r4, r5\n\t"
  52447. #else
  52448. "add r4, r4, r5\n\t"
  52449. #endif
  52450. #ifdef WOLFSSL_KEIL
  52451. "adcs r2, r2, r6\n\t"
  52452. #elif defined(__clang__)
  52453. "adcs r2, r6\n\t"
  52454. #else
  52455. "adc r2, r6\n\t"
  52456. #endif
  52457. #ifdef WOLFSSL_KEIL
  52458. "adcs r3, r3, %[r]\n\t"
  52459. #elif defined(__clang__)
  52460. "adcs r3, %[r]\n\t"
  52461. #else
  52462. "adc r3, %[r]\n\t"
  52463. #endif
  52464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52465. "adds r4, r4, r5\n\t"
  52466. #else
  52467. "add r4, r4, r5\n\t"
  52468. #endif
  52469. #ifdef WOLFSSL_KEIL
  52470. "adcs r2, r2, r6\n\t"
  52471. #elif defined(__clang__)
  52472. "adcs r2, r6\n\t"
  52473. #else
  52474. "adc r2, r6\n\t"
  52475. #endif
  52476. #ifdef WOLFSSL_KEIL
  52477. "adcs r3, r3, %[r]\n\t"
  52478. #elif defined(__clang__)
  52479. "adcs r3, %[r]\n\t"
  52480. #else
  52481. "adc r3, %[r]\n\t"
  52482. #endif
  52483. "# A[5] * A[0]\n\t"
  52484. "mov %[a], r9\n\t"
  52485. "mov r7, r10\n\t"
  52486. "ldr %[a], [%[a], #20]\n\t"
  52487. "uxth r5, %[a]\n\t"
  52488. "uxth r6, r7\n\t"
  52489. #ifdef WOLFSSL_KEIL
  52490. "muls r6, r5, r6\n\t"
  52491. #elif defined(__clang__)
  52492. "muls r6, r5\n\t"
  52493. #else
  52494. "mul r6, r5\n\t"
  52495. #endif
  52496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52497. "adds r4, r4, r6\n\t"
  52498. #else
  52499. "add r4, r4, r6\n\t"
  52500. #endif
  52501. #ifdef WOLFSSL_KEIL
  52502. "adcs r2, r2, %[r]\n\t"
  52503. #elif defined(__clang__)
  52504. "adcs r2, %[r]\n\t"
  52505. #else
  52506. "adc r2, %[r]\n\t"
  52507. #endif
  52508. #ifdef WOLFSSL_KEIL
  52509. "adcs r3, r3, %[r]\n\t"
  52510. #elif defined(__clang__)
  52511. "adcs r3, %[r]\n\t"
  52512. #else
  52513. "adc r3, %[r]\n\t"
  52514. #endif
  52515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52516. "adds r4, r4, r6\n\t"
  52517. #else
  52518. "add r4, r4, r6\n\t"
  52519. #endif
  52520. #ifdef WOLFSSL_KEIL
  52521. "adcs r2, r2, %[r]\n\t"
  52522. #elif defined(__clang__)
  52523. "adcs r2, %[r]\n\t"
  52524. #else
  52525. "adc r2, %[r]\n\t"
  52526. #endif
  52527. #ifdef WOLFSSL_KEIL
  52528. "adcs r3, r3, %[r]\n\t"
  52529. #elif defined(__clang__)
  52530. "adcs r3, %[r]\n\t"
  52531. #else
  52532. "adc r3, %[r]\n\t"
  52533. #endif
  52534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52535. "lsrs r6, r7, #16\n\t"
  52536. #else
  52537. "lsr r6, r7, #16\n\t"
  52538. #endif
  52539. #ifdef WOLFSSL_KEIL
  52540. "muls r5, r6, r5\n\t"
  52541. #elif defined(__clang__)
  52542. "muls r5, r6\n\t"
  52543. #else
  52544. "mul r5, r6\n\t"
  52545. #endif
  52546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52547. "lsrs r6, r5, #16\n\t"
  52548. #else
  52549. "lsr r6, r5, #16\n\t"
  52550. #endif
  52551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52552. "lsls r5, r5, #16\n\t"
  52553. #else
  52554. "lsl r5, r5, #16\n\t"
  52555. #endif
  52556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52557. "adds r4, r4, r5\n\t"
  52558. #else
  52559. "add r4, r4, r5\n\t"
  52560. #endif
  52561. #ifdef WOLFSSL_KEIL
  52562. "adcs r2, r2, r6\n\t"
  52563. #elif defined(__clang__)
  52564. "adcs r2, r6\n\t"
  52565. #else
  52566. "adc r2, r6\n\t"
  52567. #endif
  52568. #ifdef WOLFSSL_KEIL
  52569. "adcs r3, r3, %[r]\n\t"
  52570. #elif defined(__clang__)
  52571. "adcs r3, %[r]\n\t"
  52572. #else
  52573. "adc r3, %[r]\n\t"
  52574. #endif
  52575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52576. "adds r4, r4, r5\n\t"
  52577. #else
  52578. "add r4, r4, r5\n\t"
  52579. #endif
  52580. #ifdef WOLFSSL_KEIL
  52581. "adcs r2, r2, r6\n\t"
  52582. #elif defined(__clang__)
  52583. "adcs r2, r6\n\t"
  52584. #else
  52585. "adc r2, r6\n\t"
  52586. #endif
  52587. #ifdef WOLFSSL_KEIL
  52588. "adcs r3, r3, %[r]\n\t"
  52589. #elif defined(__clang__)
  52590. "adcs r3, %[r]\n\t"
  52591. #else
  52592. "adc r3, %[r]\n\t"
  52593. #endif
  52594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52595. "lsrs r5, %[a], #16\n\t"
  52596. #else
  52597. "lsr r5, %[a], #16\n\t"
  52598. #endif
  52599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52600. "lsrs r6, r7, #16\n\t"
  52601. #else
  52602. "lsr r6, r7, #16\n\t"
  52603. #endif
  52604. #ifdef WOLFSSL_KEIL
  52605. "muls r6, r5, r6\n\t"
  52606. #elif defined(__clang__)
  52607. "muls r6, r5\n\t"
  52608. #else
  52609. "mul r6, r5\n\t"
  52610. #endif
  52611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52612. "adds r2, r2, r6\n\t"
  52613. #else
  52614. "add r2, r2, r6\n\t"
  52615. #endif
  52616. #ifdef WOLFSSL_KEIL
  52617. "adcs r3, r3, %[r]\n\t"
  52618. #elif defined(__clang__)
  52619. "adcs r3, %[r]\n\t"
  52620. #else
  52621. "adc r3, %[r]\n\t"
  52622. #endif
  52623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52624. "adds r2, r2, r6\n\t"
  52625. #else
  52626. "add r2, r2, r6\n\t"
  52627. #endif
  52628. #ifdef WOLFSSL_KEIL
  52629. "adcs r3, r3, %[r]\n\t"
  52630. #elif defined(__clang__)
  52631. "adcs r3, %[r]\n\t"
  52632. #else
  52633. "adc r3, %[r]\n\t"
  52634. #endif
  52635. "uxth r6, r7\n\t"
  52636. #ifdef WOLFSSL_KEIL
  52637. "muls r5, r6, r5\n\t"
  52638. #elif defined(__clang__)
  52639. "muls r5, r6\n\t"
  52640. #else
  52641. "mul r5, r6\n\t"
  52642. #endif
  52643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52644. "lsrs r6, r5, #16\n\t"
  52645. #else
  52646. "lsr r6, r5, #16\n\t"
  52647. #endif
  52648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52649. "lsls r5, r5, #16\n\t"
  52650. #else
  52651. "lsl r5, r5, #16\n\t"
  52652. #endif
  52653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52654. "adds r4, r4, r5\n\t"
  52655. #else
  52656. "add r4, r4, r5\n\t"
  52657. #endif
  52658. #ifdef WOLFSSL_KEIL
  52659. "adcs r2, r2, r6\n\t"
  52660. #elif defined(__clang__)
  52661. "adcs r2, r6\n\t"
  52662. #else
  52663. "adc r2, r6\n\t"
  52664. #endif
  52665. #ifdef WOLFSSL_KEIL
  52666. "adcs r3, r3, %[r]\n\t"
  52667. #elif defined(__clang__)
  52668. "adcs r3, %[r]\n\t"
  52669. #else
  52670. "adc r3, %[r]\n\t"
  52671. #endif
  52672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52673. "adds r4, r4, r5\n\t"
  52674. #else
  52675. "add r4, r4, r5\n\t"
  52676. #endif
  52677. #ifdef WOLFSSL_KEIL
  52678. "adcs r2, r2, r6\n\t"
  52679. #elif defined(__clang__)
  52680. "adcs r2, r6\n\t"
  52681. #else
  52682. "adc r2, r6\n\t"
  52683. #endif
  52684. #ifdef WOLFSSL_KEIL
  52685. "adcs r3, r3, %[r]\n\t"
  52686. #elif defined(__clang__)
  52687. "adcs r3, %[r]\n\t"
  52688. #else
  52689. "adc r3, %[r]\n\t"
  52690. #endif
  52691. "str r4, [sp, #20]\n\t"
  52692. "# A[6] * A[0]\n\t"
  52693. "movs r4, #0\n\t"
  52694. "mov %[a], r9\n\t"
  52695. "ldr %[a], [%[a], #24]\n\t"
  52696. "uxth r5, %[a]\n\t"
  52697. "uxth r6, r7\n\t"
  52698. #ifdef WOLFSSL_KEIL
  52699. "muls r6, r5, r6\n\t"
  52700. #elif defined(__clang__)
  52701. "muls r6, r5\n\t"
  52702. #else
  52703. "mul r6, r5\n\t"
  52704. #endif
  52705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52706. "adds r2, r2, r6\n\t"
  52707. #else
  52708. "add r2, r2, r6\n\t"
  52709. #endif
  52710. #ifdef WOLFSSL_KEIL
  52711. "adcs r3, r3, %[r]\n\t"
  52712. #elif defined(__clang__)
  52713. "adcs r3, %[r]\n\t"
  52714. #else
  52715. "adc r3, %[r]\n\t"
  52716. #endif
  52717. #ifdef WOLFSSL_KEIL
  52718. "adcs r4, r4, %[r]\n\t"
  52719. #elif defined(__clang__)
  52720. "adcs r4, %[r]\n\t"
  52721. #else
  52722. "adc r4, %[r]\n\t"
  52723. #endif
  52724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52725. "adds r2, r2, r6\n\t"
  52726. #else
  52727. "add r2, r2, r6\n\t"
  52728. #endif
  52729. #ifdef WOLFSSL_KEIL
  52730. "adcs r3, r3, %[r]\n\t"
  52731. #elif defined(__clang__)
  52732. "adcs r3, %[r]\n\t"
  52733. #else
  52734. "adc r3, %[r]\n\t"
  52735. #endif
  52736. #ifdef WOLFSSL_KEIL
  52737. "adcs r4, r4, %[r]\n\t"
  52738. #elif defined(__clang__)
  52739. "adcs r4, %[r]\n\t"
  52740. #else
  52741. "adc r4, %[r]\n\t"
  52742. #endif
  52743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52744. "lsrs r6, r7, #16\n\t"
  52745. #else
  52746. "lsr r6, r7, #16\n\t"
  52747. #endif
  52748. #ifdef WOLFSSL_KEIL
  52749. "muls r5, r6, r5\n\t"
  52750. #elif defined(__clang__)
  52751. "muls r5, r6\n\t"
  52752. #else
  52753. "mul r5, r6\n\t"
  52754. #endif
  52755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52756. "lsrs r6, r5, #16\n\t"
  52757. #else
  52758. "lsr r6, r5, #16\n\t"
  52759. #endif
  52760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52761. "lsls r5, r5, #16\n\t"
  52762. #else
  52763. "lsl r5, r5, #16\n\t"
  52764. #endif
  52765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52766. "adds r2, r2, r5\n\t"
  52767. #else
  52768. "add r2, r2, r5\n\t"
  52769. #endif
  52770. #ifdef WOLFSSL_KEIL
  52771. "adcs r3, r3, r6\n\t"
  52772. #elif defined(__clang__)
  52773. "adcs r3, r6\n\t"
  52774. #else
  52775. "adc r3, r6\n\t"
  52776. #endif
  52777. #ifdef WOLFSSL_KEIL
  52778. "adcs r4, r4, %[r]\n\t"
  52779. #elif defined(__clang__)
  52780. "adcs r4, %[r]\n\t"
  52781. #else
  52782. "adc r4, %[r]\n\t"
  52783. #endif
  52784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52785. "adds r2, r2, r5\n\t"
  52786. #else
  52787. "add r2, r2, r5\n\t"
  52788. #endif
  52789. #ifdef WOLFSSL_KEIL
  52790. "adcs r3, r3, r6\n\t"
  52791. #elif defined(__clang__)
  52792. "adcs r3, r6\n\t"
  52793. #else
  52794. "adc r3, r6\n\t"
  52795. #endif
  52796. #ifdef WOLFSSL_KEIL
  52797. "adcs r4, r4, %[r]\n\t"
  52798. #elif defined(__clang__)
  52799. "adcs r4, %[r]\n\t"
  52800. #else
  52801. "adc r4, %[r]\n\t"
  52802. #endif
  52803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52804. "lsrs r5, %[a], #16\n\t"
  52805. #else
  52806. "lsr r5, %[a], #16\n\t"
  52807. #endif
  52808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52809. "lsrs r6, r7, #16\n\t"
  52810. #else
  52811. "lsr r6, r7, #16\n\t"
  52812. #endif
  52813. #ifdef WOLFSSL_KEIL
  52814. "muls r6, r5, r6\n\t"
  52815. #elif defined(__clang__)
  52816. "muls r6, r5\n\t"
  52817. #else
  52818. "mul r6, r5\n\t"
  52819. #endif
  52820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52821. "adds r3, r3, r6\n\t"
  52822. #else
  52823. "add r3, r3, r6\n\t"
  52824. #endif
  52825. #ifdef WOLFSSL_KEIL
  52826. "adcs r4, r4, %[r]\n\t"
  52827. #elif defined(__clang__)
  52828. "adcs r4, %[r]\n\t"
  52829. #else
  52830. "adc r4, %[r]\n\t"
  52831. #endif
  52832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52833. "adds r3, r3, r6\n\t"
  52834. #else
  52835. "add r3, r3, r6\n\t"
  52836. #endif
  52837. #ifdef WOLFSSL_KEIL
  52838. "adcs r4, r4, %[r]\n\t"
  52839. #elif defined(__clang__)
  52840. "adcs r4, %[r]\n\t"
  52841. #else
  52842. "adc r4, %[r]\n\t"
  52843. #endif
  52844. "uxth r6, r7\n\t"
  52845. #ifdef WOLFSSL_KEIL
  52846. "muls r5, r6, r5\n\t"
  52847. #elif defined(__clang__)
  52848. "muls r5, r6\n\t"
  52849. #else
  52850. "mul r5, r6\n\t"
  52851. #endif
  52852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52853. "lsrs r6, r5, #16\n\t"
  52854. #else
  52855. "lsr r6, r5, #16\n\t"
  52856. #endif
  52857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52858. "lsls r5, r5, #16\n\t"
  52859. #else
  52860. "lsl r5, r5, #16\n\t"
  52861. #endif
  52862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52863. "adds r2, r2, r5\n\t"
  52864. #else
  52865. "add r2, r2, r5\n\t"
  52866. #endif
  52867. #ifdef WOLFSSL_KEIL
  52868. "adcs r3, r3, r6\n\t"
  52869. #elif defined(__clang__)
  52870. "adcs r3, r6\n\t"
  52871. #else
  52872. "adc r3, r6\n\t"
  52873. #endif
  52874. #ifdef WOLFSSL_KEIL
  52875. "adcs r4, r4, %[r]\n\t"
  52876. #elif defined(__clang__)
  52877. "adcs r4, %[r]\n\t"
  52878. #else
  52879. "adc r4, %[r]\n\t"
  52880. #endif
  52881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52882. "adds r2, r2, r5\n\t"
  52883. #else
  52884. "add r2, r2, r5\n\t"
  52885. #endif
  52886. #ifdef WOLFSSL_KEIL
  52887. "adcs r3, r3, r6\n\t"
  52888. #elif defined(__clang__)
  52889. "adcs r3, r6\n\t"
  52890. #else
  52891. "adc r3, r6\n\t"
  52892. #endif
  52893. #ifdef WOLFSSL_KEIL
  52894. "adcs r4, r4, %[r]\n\t"
  52895. #elif defined(__clang__)
  52896. "adcs r4, %[r]\n\t"
  52897. #else
  52898. "adc r4, %[r]\n\t"
  52899. #endif
  52900. "# A[5] * A[1]\n\t"
  52901. "mov %[a], r9\n\t"
  52902. "mov r7, r11\n\t"
  52903. "ldr %[a], [%[a], #20]\n\t"
  52904. "uxth r5, %[a]\n\t"
  52905. "uxth r6, r7\n\t"
  52906. #ifdef WOLFSSL_KEIL
  52907. "muls r6, r5, r6\n\t"
  52908. #elif defined(__clang__)
  52909. "muls r6, r5\n\t"
  52910. #else
  52911. "mul r6, r5\n\t"
  52912. #endif
  52913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52914. "adds r2, r2, r6\n\t"
  52915. #else
  52916. "add r2, r2, r6\n\t"
  52917. #endif
  52918. #ifdef WOLFSSL_KEIL
  52919. "adcs r3, r3, %[r]\n\t"
  52920. #elif defined(__clang__)
  52921. "adcs r3, %[r]\n\t"
  52922. #else
  52923. "adc r3, %[r]\n\t"
  52924. #endif
  52925. #ifdef WOLFSSL_KEIL
  52926. "adcs r4, r4, %[r]\n\t"
  52927. #elif defined(__clang__)
  52928. "adcs r4, %[r]\n\t"
  52929. #else
  52930. "adc r4, %[r]\n\t"
  52931. #endif
  52932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52933. "adds r2, r2, r6\n\t"
  52934. #else
  52935. "add r2, r2, r6\n\t"
  52936. #endif
  52937. #ifdef WOLFSSL_KEIL
  52938. "adcs r3, r3, %[r]\n\t"
  52939. #elif defined(__clang__)
  52940. "adcs r3, %[r]\n\t"
  52941. #else
  52942. "adc r3, %[r]\n\t"
  52943. #endif
  52944. #ifdef WOLFSSL_KEIL
  52945. "adcs r4, r4, %[r]\n\t"
  52946. #elif defined(__clang__)
  52947. "adcs r4, %[r]\n\t"
  52948. #else
  52949. "adc r4, %[r]\n\t"
  52950. #endif
  52951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52952. "lsrs r6, r7, #16\n\t"
  52953. #else
  52954. "lsr r6, r7, #16\n\t"
  52955. #endif
  52956. #ifdef WOLFSSL_KEIL
  52957. "muls r5, r6, r5\n\t"
  52958. #elif defined(__clang__)
  52959. "muls r5, r6\n\t"
  52960. #else
  52961. "mul r5, r6\n\t"
  52962. #endif
  52963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52964. "lsrs r6, r5, #16\n\t"
  52965. #else
  52966. "lsr r6, r5, #16\n\t"
  52967. #endif
  52968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52969. "lsls r5, r5, #16\n\t"
  52970. #else
  52971. "lsl r5, r5, #16\n\t"
  52972. #endif
  52973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52974. "adds r2, r2, r5\n\t"
  52975. #else
  52976. "add r2, r2, r5\n\t"
  52977. #endif
  52978. #ifdef WOLFSSL_KEIL
  52979. "adcs r3, r3, r6\n\t"
  52980. #elif defined(__clang__)
  52981. "adcs r3, r6\n\t"
  52982. #else
  52983. "adc r3, r6\n\t"
  52984. #endif
  52985. #ifdef WOLFSSL_KEIL
  52986. "adcs r4, r4, %[r]\n\t"
  52987. #elif defined(__clang__)
  52988. "adcs r4, %[r]\n\t"
  52989. #else
  52990. "adc r4, %[r]\n\t"
  52991. #endif
  52992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52993. "adds r2, r2, r5\n\t"
  52994. #else
  52995. "add r2, r2, r5\n\t"
  52996. #endif
  52997. #ifdef WOLFSSL_KEIL
  52998. "adcs r3, r3, r6\n\t"
  52999. #elif defined(__clang__)
  53000. "adcs r3, r6\n\t"
  53001. #else
  53002. "adc r3, r6\n\t"
  53003. #endif
  53004. #ifdef WOLFSSL_KEIL
  53005. "adcs r4, r4, %[r]\n\t"
  53006. #elif defined(__clang__)
  53007. "adcs r4, %[r]\n\t"
  53008. #else
  53009. "adc r4, %[r]\n\t"
  53010. #endif
  53011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53012. "lsrs r5, %[a], #16\n\t"
  53013. #else
  53014. "lsr r5, %[a], #16\n\t"
  53015. #endif
  53016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53017. "lsrs r6, r7, #16\n\t"
  53018. #else
  53019. "lsr r6, r7, #16\n\t"
  53020. #endif
  53021. #ifdef WOLFSSL_KEIL
  53022. "muls r6, r5, r6\n\t"
  53023. #elif defined(__clang__)
  53024. "muls r6, r5\n\t"
  53025. #else
  53026. "mul r6, r5\n\t"
  53027. #endif
  53028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53029. "adds r3, r3, r6\n\t"
  53030. #else
  53031. "add r3, r3, r6\n\t"
  53032. #endif
  53033. #ifdef WOLFSSL_KEIL
  53034. "adcs r4, r4, %[r]\n\t"
  53035. #elif defined(__clang__)
  53036. "adcs r4, %[r]\n\t"
  53037. #else
  53038. "adc r4, %[r]\n\t"
  53039. #endif
  53040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53041. "adds r3, r3, r6\n\t"
  53042. #else
  53043. "add r3, r3, r6\n\t"
  53044. #endif
  53045. #ifdef WOLFSSL_KEIL
  53046. "adcs r4, r4, %[r]\n\t"
  53047. #elif defined(__clang__)
  53048. "adcs r4, %[r]\n\t"
  53049. #else
  53050. "adc r4, %[r]\n\t"
  53051. #endif
  53052. "uxth r6, r7\n\t"
  53053. #ifdef WOLFSSL_KEIL
  53054. "muls r5, r6, r5\n\t"
  53055. #elif defined(__clang__)
  53056. "muls r5, r6\n\t"
  53057. #else
  53058. "mul r5, r6\n\t"
  53059. #endif
  53060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53061. "lsrs r6, r5, #16\n\t"
  53062. #else
  53063. "lsr r6, r5, #16\n\t"
  53064. #endif
  53065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53066. "lsls r5, r5, #16\n\t"
  53067. #else
  53068. "lsl r5, r5, #16\n\t"
  53069. #endif
  53070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53071. "adds r2, r2, r5\n\t"
  53072. #else
  53073. "add r2, r2, r5\n\t"
  53074. #endif
  53075. #ifdef WOLFSSL_KEIL
  53076. "adcs r3, r3, r6\n\t"
  53077. #elif defined(__clang__)
  53078. "adcs r3, r6\n\t"
  53079. #else
  53080. "adc r3, r6\n\t"
  53081. #endif
  53082. #ifdef WOLFSSL_KEIL
  53083. "adcs r4, r4, %[r]\n\t"
  53084. #elif defined(__clang__)
  53085. "adcs r4, %[r]\n\t"
  53086. #else
  53087. "adc r4, %[r]\n\t"
  53088. #endif
  53089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53090. "adds r2, r2, r5\n\t"
  53091. #else
  53092. "add r2, r2, r5\n\t"
  53093. #endif
  53094. #ifdef WOLFSSL_KEIL
  53095. "adcs r3, r3, r6\n\t"
  53096. #elif defined(__clang__)
  53097. "adcs r3, r6\n\t"
  53098. #else
  53099. "adc r3, r6\n\t"
  53100. #endif
  53101. #ifdef WOLFSSL_KEIL
  53102. "adcs r4, r4, %[r]\n\t"
  53103. #elif defined(__clang__)
  53104. "adcs r4, %[r]\n\t"
  53105. #else
  53106. "adc r4, %[r]\n\t"
  53107. #endif
  53108. "# A[4] * A[2]\n\t"
  53109. "mov %[a], r9\n\t"
  53110. "mov r7, r12\n\t"
  53111. "ldr %[a], [%[a], #16]\n\t"
  53112. "uxth r5, %[a]\n\t"
  53113. "uxth r6, r7\n\t"
  53114. #ifdef WOLFSSL_KEIL
  53115. "muls r6, r5, r6\n\t"
  53116. #elif defined(__clang__)
  53117. "muls r6, r5\n\t"
  53118. #else
  53119. "mul r6, r5\n\t"
  53120. #endif
  53121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53122. "adds r2, r2, r6\n\t"
  53123. #else
  53124. "add r2, r2, r6\n\t"
  53125. #endif
  53126. #ifdef WOLFSSL_KEIL
  53127. "adcs r3, r3, %[r]\n\t"
  53128. #elif defined(__clang__)
  53129. "adcs r3, %[r]\n\t"
  53130. #else
  53131. "adc r3, %[r]\n\t"
  53132. #endif
  53133. #ifdef WOLFSSL_KEIL
  53134. "adcs r4, r4, %[r]\n\t"
  53135. #elif defined(__clang__)
  53136. "adcs r4, %[r]\n\t"
  53137. #else
  53138. "adc r4, %[r]\n\t"
  53139. #endif
  53140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53141. "adds r2, r2, r6\n\t"
  53142. #else
  53143. "add r2, r2, r6\n\t"
  53144. #endif
  53145. #ifdef WOLFSSL_KEIL
  53146. "adcs r3, r3, %[r]\n\t"
  53147. #elif defined(__clang__)
  53148. "adcs r3, %[r]\n\t"
  53149. #else
  53150. "adc r3, %[r]\n\t"
  53151. #endif
  53152. #ifdef WOLFSSL_KEIL
  53153. "adcs r4, r4, %[r]\n\t"
  53154. #elif defined(__clang__)
  53155. "adcs r4, %[r]\n\t"
  53156. #else
  53157. "adc r4, %[r]\n\t"
  53158. #endif
  53159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53160. "lsrs r6, r7, #16\n\t"
  53161. #else
  53162. "lsr r6, r7, #16\n\t"
  53163. #endif
  53164. #ifdef WOLFSSL_KEIL
  53165. "muls r5, r6, r5\n\t"
  53166. #elif defined(__clang__)
  53167. "muls r5, r6\n\t"
  53168. #else
  53169. "mul r5, r6\n\t"
  53170. #endif
  53171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53172. "lsrs r6, r5, #16\n\t"
  53173. #else
  53174. "lsr r6, r5, #16\n\t"
  53175. #endif
  53176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53177. "lsls r5, r5, #16\n\t"
  53178. #else
  53179. "lsl r5, r5, #16\n\t"
  53180. #endif
  53181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53182. "adds r2, r2, r5\n\t"
  53183. #else
  53184. "add r2, r2, r5\n\t"
  53185. #endif
  53186. #ifdef WOLFSSL_KEIL
  53187. "adcs r3, r3, r6\n\t"
  53188. #elif defined(__clang__)
  53189. "adcs r3, r6\n\t"
  53190. #else
  53191. "adc r3, r6\n\t"
  53192. #endif
  53193. #ifdef WOLFSSL_KEIL
  53194. "adcs r4, r4, %[r]\n\t"
  53195. #elif defined(__clang__)
  53196. "adcs r4, %[r]\n\t"
  53197. #else
  53198. "adc r4, %[r]\n\t"
  53199. #endif
  53200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53201. "adds r2, r2, r5\n\t"
  53202. #else
  53203. "add r2, r2, r5\n\t"
  53204. #endif
  53205. #ifdef WOLFSSL_KEIL
  53206. "adcs r3, r3, r6\n\t"
  53207. #elif defined(__clang__)
  53208. "adcs r3, r6\n\t"
  53209. #else
  53210. "adc r3, r6\n\t"
  53211. #endif
  53212. #ifdef WOLFSSL_KEIL
  53213. "adcs r4, r4, %[r]\n\t"
  53214. #elif defined(__clang__)
  53215. "adcs r4, %[r]\n\t"
  53216. #else
  53217. "adc r4, %[r]\n\t"
  53218. #endif
  53219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53220. "lsrs r5, %[a], #16\n\t"
  53221. #else
  53222. "lsr r5, %[a], #16\n\t"
  53223. #endif
  53224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53225. "lsrs r6, r7, #16\n\t"
  53226. #else
  53227. "lsr r6, r7, #16\n\t"
  53228. #endif
  53229. #ifdef WOLFSSL_KEIL
  53230. "muls r6, r5, r6\n\t"
  53231. #elif defined(__clang__)
  53232. "muls r6, r5\n\t"
  53233. #else
  53234. "mul r6, r5\n\t"
  53235. #endif
  53236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53237. "adds r3, r3, r6\n\t"
  53238. #else
  53239. "add r3, r3, r6\n\t"
  53240. #endif
  53241. #ifdef WOLFSSL_KEIL
  53242. "adcs r4, r4, %[r]\n\t"
  53243. #elif defined(__clang__)
  53244. "adcs r4, %[r]\n\t"
  53245. #else
  53246. "adc r4, %[r]\n\t"
  53247. #endif
  53248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53249. "adds r3, r3, r6\n\t"
  53250. #else
  53251. "add r3, r3, r6\n\t"
  53252. #endif
  53253. #ifdef WOLFSSL_KEIL
  53254. "adcs r4, r4, %[r]\n\t"
  53255. #elif defined(__clang__)
  53256. "adcs r4, %[r]\n\t"
  53257. #else
  53258. "adc r4, %[r]\n\t"
  53259. #endif
  53260. "uxth r6, r7\n\t"
  53261. #ifdef WOLFSSL_KEIL
  53262. "muls r5, r6, r5\n\t"
  53263. #elif defined(__clang__)
  53264. "muls r5, r6\n\t"
  53265. #else
  53266. "mul r5, r6\n\t"
  53267. #endif
  53268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53269. "lsrs r6, r5, #16\n\t"
  53270. #else
  53271. "lsr r6, r5, #16\n\t"
  53272. #endif
  53273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53274. "lsls r5, r5, #16\n\t"
  53275. #else
  53276. "lsl r5, r5, #16\n\t"
  53277. #endif
  53278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53279. "adds r2, r2, r5\n\t"
  53280. #else
  53281. "add r2, r2, r5\n\t"
  53282. #endif
  53283. #ifdef WOLFSSL_KEIL
  53284. "adcs r3, r3, r6\n\t"
  53285. #elif defined(__clang__)
  53286. "adcs r3, r6\n\t"
  53287. #else
  53288. "adc r3, r6\n\t"
  53289. #endif
  53290. #ifdef WOLFSSL_KEIL
  53291. "adcs r4, r4, %[r]\n\t"
  53292. #elif defined(__clang__)
  53293. "adcs r4, %[r]\n\t"
  53294. #else
  53295. "adc r4, %[r]\n\t"
  53296. #endif
  53297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53298. "adds r2, r2, r5\n\t"
  53299. #else
  53300. "add r2, r2, r5\n\t"
  53301. #endif
  53302. #ifdef WOLFSSL_KEIL
  53303. "adcs r3, r3, r6\n\t"
  53304. #elif defined(__clang__)
  53305. "adcs r3, r6\n\t"
  53306. #else
  53307. "adc r3, r6\n\t"
  53308. #endif
  53309. #ifdef WOLFSSL_KEIL
  53310. "adcs r4, r4, %[r]\n\t"
  53311. #elif defined(__clang__)
  53312. "adcs r4, %[r]\n\t"
  53313. #else
  53314. "adc r4, %[r]\n\t"
  53315. #endif
  53316. "# A[3] * A[3]\n\t"
  53317. "mov r7, lr\n\t"
  53318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53319. "lsrs r6, r7, #16\n\t"
  53320. #else
  53321. "lsr r6, r7, #16\n\t"
  53322. #endif
  53323. "uxth r5, r7\n\t"
  53324. #ifdef WOLFSSL_KEIL
  53325. "muls r5, r5, r5\n\t"
  53326. #elif defined(__clang__)
  53327. "muls r5, r5\n\t"
  53328. #else
  53329. "mul r5, r5\n\t"
  53330. #endif
  53331. #ifdef WOLFSSL_KEIL
  53332. "muls r6, r6, r6\n\t"
  53333. #elif defined(__clang__)
  53334. "muls r6, r6\n\t"
  53335. #else
  53336. "mul r6, r6\n\t"
  53337. #endif
  53338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53339. "adds r2, r2, r5\n\t"
  53340. #else
  53341. "add r2, r2, r5\n\t"
  53342. #endif
  53343. #ifdef WOLFSSL_KEIL
  53344. "adcs r3, r3, r6\n\t"
  53345. #elif defined(__clang__)
  53346. "adcs r3, r6\n\t"
  53347. #else
  53348. "adc r3, r6\n\t"
  53349. #endif
  53350. #ifdef WOLFSSL_KEIL
  53351. "adcs r4, r4, %[r]\n\t"
  53352. #elif defined(__clang__)
  53353. "adcs r4, %[r]\n\t"
  53354. #else
  53355. "adc r4, %[r]\n\t"
  53356. #endif
  53357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53358. "lsrs r6, r7, #16\n\t"
  53359. #else
  53360. "lsr r6, r7, #16\n\t"
  53361. #endif
  53362. "uxth r5, r7\n\t"
  53363. #ifdef WOLFSSL_KEIL
  53364. "muls r5, r6, r5\n\t"
  53365. #elif defined(__clang__)
  53366. "muls r5, r6\n\t"
  53367. #else
  53368. "mul r5, r6\n\t"
  53369. #endif
  53370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53371. "lsrs r6, r5, #15\n\t"
  53372. #else
  53373. "lsr r6, r5, #15\n\t"
  53374. #endif
  53375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53376. "lsls r5, r5, #17\n\t"
  53377. #else
  53378. "lsl r5, r5, #17\n\t"
  53379. #endif
  53380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53381. "adds r2, r2, r5\n\t"
  53382. #else
  53383. "add r2, r2, r5\n\t"
  53384. #endif
  53385. #ifdef WOLFSSL_KEIL
  53386. "adcs r3, r3, r6\n\t"
  53387. #elif defined(__clang__)
  53388. "adcs r3, r6\n\t"
  53389. #else
  53390. "adc r3, r6\n\t"
  53391. #endif
  53392. #ifdef WOLFSSL_KEIL
  53393. "adcs r4, r4, %[r]\n\t"
  53394. #elif defined(__clang__)
  53395. "adcs r4, %[r]\n\t"
  53396. #else
  53397. "adc r4, %[r]\n\t"
  53398. #endif
  53399. "str r2, [sp, #24]\n\t"
  53400. "# A[4] * A[3]\n\t"
  53401. "movs r2, #0\n\t"
  53402. "mov %[a], r9\n\t"
  53403. "ldr %[a], [%[a], #16]\n\t"
  53404. "uxth r5, %[a]\n\t"
  53405. "uxth r6, r7\n\t"
  53406. #ifdef WOLFSSL_KEIL
  53407. "muls r6, r5, r6\n\t"
  53408. #elif defined(__clang__)
  53409. "muls r6, r5\n\t"
  53410. #else
  53411. "mul r6, r5\n\t"
  53412. #endif
  53413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53414. "adds r3, r3, r6\n\t"
  53415. #else
  53416. "add r3, r3, r6\n\t"
  53417. #endif
  53418. #ifdef WOLFSSL_KEIL
  53419. "adcs r4, r4, %[r]\n\t"
  53420. #elif defined(__clang__)
  53421. "adcs r4, %[r]\n\t"
  53422. #else
  53423. "adc r4, %[r]\n\t"
  53424. #endif
  53425. #ifdef WOLFSSL_KEIL
  53426. "adcs r2, r2, %[r]\n\t"
  53427. #elif defined(__clang__)
  53428. "adcs r2, %[r]\n\t"
  53429. #else
  53430. "adc r2, %[r]\n\t"
  53431. #endif
  53432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53433. "adds r3, r3, r6\n\t"
  53434. #else
  53435. "add r3, r3, r6\n\t"
  53436. #endif
  53437. #ifdef WOLFSSL_KEIL
  53438. "adcs r4, r4, %[r]\n\t"
  53439. #elif defined(__clang__)
  53440. "adcs r4, %[r]\n\t"
  53441. #else
  53442. "adc r4, %[r]\n\t"
  53443. #endif
  53444. #ifdef WOLFSSL_KEIL
  53445. "adcs r2, r2, %[r]\n\t"
  53446. #elif defined(__clang__)
  53447. "adcs r2, %[r]\n\t"
  53448. #else
  53449. "adc r2, %[r]\n\t"
  53450. #endif
  53451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53452. "lsrs r6, r7, #16\n\t"
  53453. #else
  53454. "lsr r6, r7, #16\n\t"
  53455. #endif
  53456. #ifdef WOLFSSL_KEIL
  53457. "muls r5, r6, r5\n\t"
  53458. #elif defined(__clang__)
  53459. "muls r5, r6\n\t"
  53460. #else
  53461. "mul r5, r6\n\t"
  53462. #endif
  53463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53464. "lsrs r6, r5, #16\n\t"
  53465. #else
  53466. "lsr r6, r5, #16\n\t"
  53467. #endif
  53468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53469. "lsls r5, r5, #16\n\t"
  53470. #else
  53471. "lsl r5, r5, #16\n\t"
  53472. #endif
  53473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53474. "adds r3, r3, r5\n\t"
  53475. #else
  53476. "add r3, r3, r5\n\t"
  53477. #endif
  53478. #ifdef WOLFSSL_KEIL
  53479. "adcs r4, r4, r6\n\t"
  53480. #elif defined(__clang__)
  53481. "adcs r4, r6\n\t"
  53482. #else
  53483. "adc r4, r6\n\t"
  53484. #endif
  53485. #ifdef WOLFSSL_KEIL
  53486. "adcs r2, r2, %[r]\n\t"
  53487. #elif defined(__clang__)
  53488. "adcs r2, %[r]\n\t"
  53489. #else
  53490. "adc r2, %[r]\n\t"
  53491. #endif
  53492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53493. "adds r3, r3, r5\n\t"
  53494. #else
  53495. "add r3, r3, r5\n\t"
  53496. #endif
  53497. #ifdef WOLFSSL_KEIL
  53498. "adcs r4, r4, r6\n\t"
  53499. #elif defined(__clang__)
  53500. "adcs r4, r6\n\t"
  53501. #else
  53502. "adc r4, r6\n\t"
  53503. #endif
  53504. #ifdef WOLFSSL_KEIL
  53505. "adcs r2, r2, %[r]\n\t"
  53506. #elif defined(__clang__)
  53507. "adcs r2, %[r]\n\t"
  53508. #else
  53509. "adc r2, %[r]\n\t"
  53510. #endif
  53511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53512. "lsrs r5, %[a], #16\n\t"
  53513. #else
  53514. "lsr r5, %[a], #16\n\t"
  53515. #endif
  53516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53517. "lsrs r6, r7, #16\n\t"
  53518. #else
  53519. "lsr r6, r7, #16\n\t"
  53520. #endif
  53521. #ifdef WOLFSSL_KEIL
  53522. "muls r6, r5, r6\n\t"
  53523. #elif defined(__clang__)
  53524. "muls r6, r5\n\t"
  53525. #else
  53526. "mul r6, r5\n\t"
  53527. #endif
  53528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53529. "adds r4, r4, r6\n\t"
  53530. #else
  53531. "add r4, r4, r6\n\t"
  53532. #endif
  53533. #ifdef WOLFSSL_KEIL
  53534. "adcs r2, r2, %[r]\n\t"
  53535. #elif defined(__clang__)
  53536. "adcs r2, %[r]\n\t"
  53537. #else
  53538. "adc r2, %[r]\n\t"
  53539. #endif
  53540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53541. "adds r4, r4, r6\n\t"
  53542. #else
  53543. "add r4, r4, r6\n\t"
  53544. #endif
  53545. #ifdef WOLFSSL_KEIL
  53546. "adcs r2, r2, %[r]\n\t"
  53547. #elif defined(__clang__)
  53548. "adcs r2, %[r]\n\t"
  53549. #else
  53550. "adc r2, %[r]\n\t"
  53551. #endif
  53552. "uxth r6, r7\n\t"
  53553. #ifdef WOLFSSL_KEIL
  53554. "muls r5, r6, r5\n\t"
  53555. #elif defined(__clang__)
  53556. "muls r5, r6\n\t"
  53557. #else
  53558. "mul r5, r6\n\t"
  53559. #endif
  53560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53561. "lsrs r6, r5, #16\n\t"
  53562. #else
  53563. "lsr r6, r5, #16\n\t"
  53564. #endif
  53565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53566. "lsls r5, r5, #16\n\t"
  53567. #else
  53568. "lsl r5, r5, #16\n\t"
  53569. #endif
  53570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53571. "adds r3, r3, r5\n\t"
  53572. #else
  53573. "add r3, r3, r5\n\t"
  53574. #endif
  53575. #ifdef WOLFSSL_KEIL
  53576. "adcs r4, r4, r6\n\t"
  53577. #elif defined(__clang__)
  53578. "adcs r4, r6\n\t"
  53579. #else
  53580. "adc r4, r6\n\t"
  53581. #endif
  53582. #ifdef WOLFSSL_KEIL
  53583. "adcs r2, r2, %[r]\n\t"
  53584. #elif defined(__clang__)
  53585. "adcs r2, %[r]\n\t"
  53586. #else
  53587. "adc r2, %[r]\n\t"
  53588. #endif
  53589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53590. "adds r3, r3, r5\n\t"
  53591. #else
  53592. "add r3, r3, r5\n\t"
  53593. #endif
  53594. #ifdef WOLFSSL_KEIL
  53595. "adcs r4, r4, r6\n\t"
  53596. #elif defined(__clang__)
  53597. "adcs r4, r6\n\t"
  53598. #else
  53599. "adc r4, r6\n\t"
  53600. #endif
  53601. #ifdef WOLFSSL_KEIL
  53602. "adcs r2, r2, %[r]\n\t"
  53603. #elif defined(__clang__)
  53604. "adcs r2, %[r]\n\t"
  53605. #else
  53606. "adc r2, %[r]\n\t"
  53607. #endif
  53608. "# A[5] * A[2]\n\t"
  53609. "mov %[a], r9\n\t"
  53610. "mov r7, r12\n\t"
  53611. "ldr %[a], [%[a], #20]\n\t"
  53612. "uxth r5, %[a]\n\t"
  53613. "uxth r6, r7\n\t"
  53614. #ifdef WOLFSSL_KEIL
  53615. "muls r6, r5, r6\n\t"
  53616. #elif defined(__clang__)
  53617. "muls r6, r5\n\t"
  53618. #else
  53619. "mul r6, r5\n\t"
  53620. #endif
  53621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53622. "adds r3, r3, r6\n\t"
  53623. #else
  53624. "add r3, r3, r6\n\t"
  53625. #endif
  53626. #ifdef WOLFSSL_KEIL
  53627. "adcs r4, r4, %[r]\n\t"
  53628. #elif defined(__clang__)
  53629. "adcs r4, %[r]\n\t"
  53630. #else
  53631. "adc r4, %[r]\n\t"
  53632. #endif
  53633. #ifdef WOLFSSL_KEIL
  53634. "adcs r2, r2, %[r]\n\t"
  53635. #elif defined(__clang__)
  53636. "adcs r2, %[r]\n\t"
  53637. #else
  53638. "adc r2, %[r]\n\t"
  53639. #endif
  53640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53641. "adds r3, r3, r6\n\t"
  53642. #else
  53643. "add r3, r3, r6\n\t"
  53644. #endif
  53645. #ifdef WOLFSSL_KEIL
  53646. "adcs r4, r4, %[r]\n\t"
  53647. #elif defined(__clang__)
  53648. "adcs r4, %[r]\n\t"
  53649. #else
  53650. "adc r4, %[r]\n\t"
  53651. #endif
  53652. #ifdef WOLFSSL_KEIL
  53653. "adcs r2, r2, %[r]\n\t"
  53654. #elif defined(__clang__)
  53655. "adcs r2, %[r]\n\t"
  53656. #else
  53657. "adc r2, %[r]\n\t"
  53658. #endif
  53659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53660. "lsrs r6, r7, #16\n\t"
  53661. #else
  53662. "lsr r6, r7, #16\n\t"
  53663. #endif
  53664. #ifdef WOLFSSL_KEIL
  53665. "muls r5, r6, r5\n\t"
  53666. #elif defined(__clang__)
  53667. "muls r5, r6\n\t"
  53668. #else
  53669. "mul r5, r6\n\t"
  53670. #endif
  53671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53672. "lsrs r6, r5, #16\n\t"
  53673. #else
  53674. "lsr r6, r5, #16\n\t"
  53675. #endif
  53676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53677. "lsls r5, r5, #16\n\t"
  53678. #else
  53679. "lsl r5, r5, #16\n\t"
  53680. #endif
  53681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53682. "adds r3, r3, r5\n\t"
  53683. #else
  53684. "add r3, r3, r5\n\t"
  53685. #endif
  53686. #ifdef WOLFSSL_KEIL
  53687. "adcs r4, r4, r6\n\t"
  53688. #elif defined(__clang__)
  53689. "adcs r4, r6\n\t"
  53690. #else
  53691. "adc r4, r6\n\t"
  53692. #endif
  53693. #ifdef WOLFSSL_KEIL
  53694. "adcs r2, r2, %[r]\n\t"
  53695. #elif defined(__clang__)
  53696. "adcs r2, %[r]\n\t"
  53697. #else
  53698. "adc r2, %[r]\n\t"
  53699. #endif
  53700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53701. "adds r3, r3, r5\n\t"
  53702. #else
  53703. "add r3, r3, r5\n\t"
  53704. #endif
  53705. #ifdef WOLFSSL_KEIL
  53706. "adcs r4, r4, r6\n\t"
  53707. #elif defined(__clang__)
  53708. "adcs r4, r6\n\t"
  53709. #else
  53710. "adc r4, r6\n\t"
  53711. #endif
  53712. #ifdef WOLFSSL_KEIL
  53713. "adcs r2, r2, %[r]\n\t"
  53714. #elif defined(__clang__)
  53715. "adcs r2, %[r]\n\t"
  53716. #else
  53717. "adc r2, %[r]\n\t"
  53718. #endif
  53719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53720. "lsrs r5, %[a], #16\n\t"
  53721. #else
  53722. "lsr r5, %[a], #16\n\t"
  53723. #endif
  53724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53725. "lsrs r6, r7, #16\n\t"
  53726. #else
  53727. "lsr r6, r7, #16\n\t"
  53728. #endif
  53729. #ifdef WOLFSSL_KEIL
  53730. "muls r6, r5, r6\n\t"
  53731. #elif defined(__clang__)
  53732. "muls r6, r5\n\t"
  53733. #else
  53734. "mul r6, r5\n\t"
  53735. #endif
  53736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53737. "adds r4, r4, r6\n\t"
  53738. #else
  53739. "add r4, r4, r6\n\t"
  53740. #endif
  53741. #ifdef WOLFSSL_KEIL
  53742. "adcs r2, r2, %[r]\n\t"
  53743. #elif defined(__clang__)
  53744. "adcs r2, %[r]\n\t"
  53745. #else
  53746. "adc r2, %[r]\n\t"
  53747. #endif
  53748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53749. "adds r4, r4, r6\n\t"
  53750. #else
  53751. "add r4, r4, r6\n\t"
  53752. #endif
  53753. #ifdef WOLFSSL_KEIL
  53754. "adcs r2, r2, %[r]\n\t"
  53755. #elif defined(__clang__)
  53756. "adcs r2, %[r]\n\t"
  53757. #else
  53758. "adc r2, %[r]\n\t"
  53759. #endif
  53760. "uxth r6, r7\n\t"
  53761. #ifdef WOLFSSL_KEIL
  53762. "muls r5, r6, r5\n\t"
  53763. #elif defined(__clang__)
  53764. "muls r5, r6\n\t"
  53765. #else
  53766. "mul r5, r6\n\t"
  53767. #endif
  53768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53769. "lsrs r6, r5, #16\n\t"
  53770. #else
  53771. "lsr r6, r5, #16\n\t"
  53772. #endif
  53773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53774. "lsls r5, r5, #16\n\t"
  53775. #else
  53776. "lsl r5, r5, #16\n\t"
  53777. #endif
  53778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53779. "adds r3, r3, r5\n\t"
  53780. #else
  53781. "add r3, r3, r5\n\t"
  53782. #endif
  53783. #ifdef WOLFSSL_KEIL
  53784. "adcs r4, r4, r6\n\t"
  53785. #elif defined(__clang__)
  53786. "adcs r4, r6\n\t"
  53787. #else
  53788. "adc r4, r6\n\t"
  53789. #endif
  53790. #ifdef WOLFSSL_KEIL
  53791. "adcs r2, r2, %[r]\n\t"
  53792. #elif defined(__clang__)
  53793. "adcs r2, %[r]\n\t"
  53794. #else
  53795. "adc r2, %[r]\n\t"
  53796. #endif
  53797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53798. "adds r3, r3, r5\n\t"
  53799. #else
  53800. "add r3, r3, r5\n\t"
  53801. #endif
  53802. #ifdef WOLFSSL_KEIL
  53803. "adcs r4, r4, r6\n\t"
  53804. #elif defined(__clang__)
  53805. "adcs r4, r6\n\t"
  53806. #else
  53807. "adc r4, r6\n\t"
  53808. #endif
  53809. #ifdef WOLFSSL_KEIL
  53810. "adcs r2, r2, %[r]\n\t"
  53811. #elif defined(__clang__)
  53812. "adcs r2, %[r]\n\t"
  53813. #else
  53814. "adc r2, %[r]\n\t"
  53815. #endif
  53816. "# A[6] * A[1]\n\t"
  53817. "mov %[a], r9\n\t"
  53818. "mov r7, r11\n\t"
  53819. "ldr %[a], [%[a], #24]\n\t"
  53820. "uxth r5, %[a]\n\t"
  53821. "uxth r6, r7\n\t"
  53822. #ifdef WOLFSSL_KEIL
  53823. "muls r6, r5, r6\n\t"
  53824. #elif defined(__clang__)
  53825. "muls r6, r5\n\t"
  53826. #else
  53827. "mul r6, r5\n\t"
  53828. #endif
  53829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53830. "adds r3, r3, r6\n\t"
  53831. #else
  53832. "add r3, r3, r6\n\t"
  53833. #endif
  53834. #ifdef WOLFSSL_KEIL
  53835. "adcs r4, r4, %[r]\n\t"
  53836. #elif defined(__clang__)
  53837. "adcs r4, %[r]\n\t"
  53838. #else
  53839. "adc r4, %[r]\n\t"
  53840. #endif
  53841. #ifdef WOLFSSL_KEIL
  53842. "adcs r2, r2, %[r]\n\t"
  53843. #elif defined(__clang__)
  53844. "adcs r2, %[r]\n\t"
  53845. #else
  53846. "adc r2, %[r]\n\t"
  53847. #endif
  53848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53849. "adds r3, r3, r6\n\t"
  53850. #else
  53851. "add r3, r3, r6\n\t"
  53852. #endif
  53853. #ifdef WOLFSSL_KEIL
  53854. "adcs r4, r4, %[r]\n\t"
  53855. #elif defined(__clang__)
  53856. "adcs r4, %[r]\n\t"
  53857. #else
  53858. "adc r4, %[r]\n\t"
  53859. #endif
  53860. #ifdef WOLFSSL_KEIL
  53861. "adcs r2, r2, %[r]\n\t"
  53862. #elif defined(__clang__)
  53863. "adcs r2, %[r]\n\t"
  53864. #else
  53865. "adc r2, %[r]\n\t"
  53866. #endif
  53867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53868. "lsrs r6, r7, #16\n\t"
  53869. #else
  53870. "lsr r6, r7, #16\n\t"
  53871. #endif
  53872. #ifdef WOLFSSL_KEIL
  53873. "muls r5, r6, r5\n\t"
  53874. #elif defined(__clang__)
  53875. "muls r5, r6\n\t"
  53876. #else
  53877. "mul r5, r6\n\t"
  53878. #endif
  53879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53880. "lsrs r6, r5, #16\n\t"
  53881. #else
  53882. "lsr r6, r5, #16\n\t"
  53883. #endif
  53884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53885. "lsls r5, r5, #16\n\t"
  53886. #else
  53887. "lsl r5, r5, #16\n\t"
  53888. #endif
  53889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53890. "adds r3, r3, r5\n\t"
  53891. #else
  53892. "add r3, r3, r5\n\t"
  53893. #endif
  53894. #ifdef WOLFSSL_KEIL
  53895. "adcs r4, r4, r6\n\t"
  53896. #elif defined(__clang__)
  53897. "adcs r4, r6\n\t"
  53898. #else
  53899. "adc r4, r6\n\t"
  53900. #endif
  53901. #ifdef WOLFSSL_KEIL
  53902. "adcs r2, r2, %[r]\n\t"
  53903. #elif defined(__clang__)
  53904. "adcs r2, %[r]\n\t"
  53905. #else
  53906. "adc r2, %[r]\n\t"
  53907. #endif
  53908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53909. "adds r3, r3, r5\n\t"
  53910. #else
  53911. "add r3, r3, r5\n\t"
  53912. #endif
  53913. #ifdef WOLFSSL_KEIL
  53914. "adcs r4, r4, r6\n\t"
  53915. #elif defined(__clang__)
  53916. "adcs r4, r6\n\t"
  53917. #else
  53918. "adc r4, r6\n\t"
  53919. #endif
  53920. #ifdef WOLFSSL_KEIL
  53921. "adcs r2, r2, %[r]\n\t"
  53922. #elif defined(__clang__)
  53923. "adcs r2, %[r]\n\t"
  53924. #else
  53925. "adc r2, %[r]\n\t"
  53926. #endif
  53927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53928. "lsrs r5, %[a], #16\n\t"
  53929. #else
  53930. "lsr r5, %[a], #16\n\t"
  53931. #endif
  53932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53933. "lsrs r6, r7, #16\n\t"
  53934. #else
  53935. "lsr r6, r7, #16\n\t"
  53936. #endif
  53937. #ifdef WOLFSSL_KEIL
  53938. "muls r6, r5, r6\n\t"
  53939. #elif defined(__clang__)
  53940. "muls r6, r5\n\t"
  53941. #else
  53942. "mul r6, r5\n\t"
  53943. #endif
  53944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53945. "adds r4, r4, r6\n\t"
  53946. #else
  53947. "add r4, r4, r6\n\t"
  53948. #endif
  53949. #ifdef WOLFSSL_KEIL
  53950. "adcs r2, r2, %[r]\n\t"
  53951. #elif defined(__clang__)
  53952. "adcs r2, %[r]\n\t"
  53953. #else
  53954. "adc r2, %[r]\n\t"
  53955. #endif
  53956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53957. "adds r4, r4, r6\n\t"
  53958. #else
  53959. "add r4, r4, r6\n\t"
  53960. #endif
  53961. #ifdef WOLFSSL_KEIL
  53962. "adcs r2, r2, %[r]\n\t"
  53963. #elif defined(__clang__)
  53964. "adcs r2, %[r]\n\t"
  53965. #else
  53966. "adc r2, %[r]\n\t"
  53967. #endif
  53968. "uxth r6, r7\n\t"
  53969. #ifdef WOLFSSL_KEIL
  53970. "muls r5, r6, r5\n\t"
  53971. #elif defined(__clang__)
  53972. "muls r5, r6\n\t"
  53973. #else
  53974. "mul r5, r6\n\t"
  53975. #endif
  53976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53977. "lsrs r6, r5, #16\n\t"
  53978. #else
  53979. "lsr r6, r5, #16\n\t"
  53980. #endif
  53981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53982. "lsls r5, r5, #16\n\t"
  53983. #else
  53984. "lsl r5, r5, #16\n\t"
  53985. #endif
  53986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53987. "adds r3, r3, r5\n\t"
  53988. #else
  53989. "add r3, 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. #ifdef WOLFSSL_KEIL
  53999. "adcs r2, r2, %[r]\n\t"
  54000. #elif defined(__clang__)
  54001. "adcs r2, %[r]\n\t"
  54002. #else
  54003. "adc r2, %[r]\n\t"
  54004. #endif
  54005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54006. "adds r3, r3, r5\n\t"
  54007. #else
  54008. "add r3, r3, r5\n\t"
  54009. #endif
  54010. #ifdef WOLFSSL_KEIL
  54011. "adcs r4, r4, r6\n\t"
  54012. #elif defined(__clang__)
  54013. "adcs r4, r6\n\t"
  54014. #else
  54015. "adc r4, r6\n\t"
  54016. #endif
  54017. #ifdef WOLFSSL_KEIL
  54018. "adcs r2, r2, %[r]\n\t"
  54019. #elif defined(__clang__)
  54020. "adcs r2, %[r]\n\t"
  54021. #else
  54022. "adc r2, %[r]\n\t"
  54023. #endif
  54024. "# A[7] * A[0]\n\t"
  54025. "mov %[a], r9\n\t"
  54026. "mov r7, r10\n\t"
  54027. "ldr %[a], [%[a], #28]\n\t"
  54028. "uxth r5, %[a]\n\t"
  54029. "uxth r6, r7\n\t"
  54030. #ifdef WOLFSSL_KEIL
  54031. "muls r6, r5, r6\n\t"
  54032. #elif defined(__clang__)
  54033. "muls r6, r5\n\t"
  54034. #else
  54035. "mul r6, r5\n\t"
  54036. #endif
  54037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54038. "adds r3, r3, r6\n\t"
  54039. #else
  54040. "add r3, r3, r6\n\t"
  54041. #endif
  54042. #ifdef WOLFSSL_KEIL
  54043. "adcs r4, r4, %[r]\n\t"
  54044. #elif defined(__clang__)
  54045. "adcs r4, %[r]\n\t"
  54046. #else
  54047. "adc r4, %[r]\n\t"
  54048. #endif
  54049. #ifdef WOLFSSL_KEIL
  54050. "adcs r2, r2, %[r]\n\t"
  54051. #elif defined(__clang__)
  54052. "adcs r2, %[r]\n\t"
  54053. #else
  54054. "adc r2, %[r]\n\t"
  54055. #endif
  54056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54057. "adds r3, r3, r6\n\t"
  54058. #else
  54059. "add r3, r3, r6\n\t"
  54060. #endif
  54061. #ifdef WOLFSSL_KEIL
  54062. "adcs r4, r4, %[r]\n\t"
  54063. #elif defined(__clang__)
  54064. "adcs r4, %[r]\n\t"
  54065. #else
  54066. "adc r4, %[r]\n\t"
  54067. #endif
  54068. #ifdef WOLFSSL_KEIL
  54069. "adcs r2, r2, %[r]\n\t"
  54070. #elif defined(__clang__)
  54071. "adcs r2, %[r]\n\t"
  54072. #else
  54073. "adc r2, %[r]\n\t"
  54074. #endif
  54075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54076. "lsrs r6, r7, #16\n\t"
  54077. #else
  54078. "lsr r6, r7, #16\n\t"
  54079. #endif
  54080. #ifdef WOLFSSL_KEIL
  54081. "muls r5, r6, r5\n\t"
  54082. #elif defined(__clang__)
  54083. "muls r5, r6\n\t"
  54084. #else
  54085. "mul r5, r6\n\t"
  54086. #endif
  54087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54088. "lsrs r6, r5, #16\n\t"
  54089. #else
  54090. "lsr r6, r5, #16\n\t"
  54091. #endif
  54092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54093. "lsls r5, r5, #16\n\t"
  54094. #else
  54095. "lsl r5, r5, #16\n\t"
  54096. #endif
  54097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54098. "adds r3, r3, r5\n\t"
  54099. #else
  54100. "add r3, r3, r5\n\t"
  54101. #endif
  54102. #ifdef WOLFSSL_KEIL
  54103. "adcs r4, r4, r6\n\t"
  54104. #elif defined(__clang__)
  54105. "adcs r4, r6\n\t"
  54106. #else
  54107. "adc r4, r6\n\t"
  54108. #endif
  54109. #ifdef WOLFSSL_KEIL
  54110. "adcs r2, r2, %[r]\n\t"
  54111. #elif defined(__clang__)
  54112. "adcs r2, %[r]\n\t"
  54113. #else
  54114. "adc r2, %[r]\n\t"
  54115. #endif
  54116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54117. "adds r3, r3, r5\n\t"
  54118. #else
  54119. "add r3, r3, r5\n\t"
  54120. #endif
  54121. #ifdef WOLFSSL_KEIL
  54122. "adcs r4, r4, r6\n\t"
  54123. #elif defined(__clang__)
  54124. "adcs r4, r6\n\t"
  54125. #else
  54126. "adc r4, r6\n\t"
  54127. #endif
  54128. #ifdef WOLFSSL_KEIL
  54129. "adcs r2, r2, %[r]\n\t"
  54130. #elif defined(__clang__)
  54131. "adcs r2, %[r]\n\t"
  54132. #else
  54133. "adc r2, %[r]\n\t"
  54134. #endif
  54135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54136. "lsrs r5, %[a], #16\n\t"
  54137. #else
  54138. "lsr r5, %[a], #16\n\t"
  54139. #endif
  54140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54141. "lsrs r6, r7, #16\n\t"
  54142. #else
  54143. "lsr r6, r7, #16\n\t"
  54144. #endif
  54145. #ifdef WOLFSSL_KEIL
  54146. "muls r6, r5, r6\n\t"
  54147. #elif defined(__clang__)
  54148. "muls r6, r5\n\t"
  54149. #else
  54150. "mul r6, r5\n\t"
  54151. #endif
  54152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54153. "adds r4, r4, r6\n\t"
  54154. #else
  54155. "add r4, r4, r6\n\t"
  54156. #endif
  54157. #ifdef WOLFSSL_KEIL
  54158. "adcs r2, r2, %[r]\n\t"
  54159. #elif defined(__clang__)
  54160. "adcs r2, %[r]\n\t"
  54161. #else
  54162. "adc r2, %[r]\n\t"
  54163. #endif
  54164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54165. "adds r4, r4, r6\n\t"
  54166. #else
  54167. "add r4, r4, r6\n\t"
  54168. #endif
  54169. #ifdef WOLFSSL_KEIL
  54170. "adcs r2, r2, %[r]\n\t"
  54171. #elif defined(__clang__)
  54172. "adcs r2, %[r]\n\t"
  54173. #else
  54174. "adc r2, %[r]\n\t"
  54175. #endif
  54176. "uxth r6, r7\n\t"
  54177. #ifdef WOLFSSL_KEIL
  54178. "muls r5, r6, r5\n\t"
  54179. #elif defined(__clang__)
  54180. "muls r5, r6\n\t"
  54181. #else
  54182. "mul r5, r6\n\t"
  54183. #endif
  54184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54185. "lsrs r6, r5, #16\n\t"
  54186. #else
  54187. "lsr r6, r5, #16\n\t"
  54188. #endif
  54189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54190. "lsls r5, r5, #16\n\t"
  54191. #else
  54192. "lsl r5, r5, #16\n\t"
  54193. #endif
  54194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54195. "adds r3, r3, r5\n\t"
  54196. #else
  54197. "add r3, r3, r5\n\t"
  54198. #endif
  54199. #ifdef WOLFSSL_KEIL
  54200. "adcs r4, r4, r6\n\t"
  54201. #elif defined(__clang__)
  54202. "adcs r4, r6\n\t"
  54203. #else
  54204. "adc r4, r6\n\t"
  54205. #endif
  54206. #ifdef WOLFSSL_KEIL
  54207. "adcs r2, r2, %[r]\n\t"
  54208. #elif defined(__clang__)
  54209. "adcs r2, %[r]\n\t"
  54210. #else
  54211. "adc r2, %[r]\n\t"
  54212. #endif
  54213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54214. "adds r3, r3, r5\n\t"
  54215. #else
  54216. "add r3, r3, r5\n\t"
  54217. #endif
  54218. #ifdef WOLFSSL_KEIL
  54219. "adcs r4, r4, r6\n\t"
  54220. #elif defined(__clang__)
  54221. "adcs r4, r6\n\t"
  54222. #else
  54223. "adc r4, r6\n\t"
  54224. #endif
  54225. #ifdef WOLFSSL_KEIL
  54226. "adcs r2, r2, %[r]\n\t"
  54227. #elif defined(__clang__)
  54228. "adcs r2, %[r]\n\t"
  54229. #else
  54230. "adc r2, %[r]\n\t"
  54231. #endif
  54232. "str r3, [sp, #28]\n\t"
  54233. "# A[8] * A[0]\n\t"
  54234. "movs r3, #0\n\t"
  54235. "mov %[a], r9\n\t"
  54236. "ldr %[a], [%[a], #32]\n\t"
  54237. "uxth r5, %[a]\n\t"
  54238. "uxth r6, r7\n\t"
  54239. #ifdef WOLFSSL_KEIL
  54240. "muls r6, r5, r6\n\t"
  54241. #elif defined(__clang__)
  54242. "muls r6, r5\n\t"
  54243. #else
  54244. "mul r6, r5\n\t"
  54245. #endif
  54246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54247. "adds r4, r4, r6\n\t"
  54248. #else
  54249. "add r4, r4, r6\n\t"
  54250. #endif
  54251. #ifdef WOLFSSL_KEIL
  54252. "adcs r2, r2, %[r]\n\t"
  54253. #elif defined(__clang__)
  54254. "adcs r2, %[r]\n\t"
  54255. #else
  54256. "adc r2, %[r]\n\t"
  54257. #endif
  54258. #ifdef WOLFSSL_KEIL
  54259. "adcs r3, r3, %[r]\n\t"
  54260. #elif defined(__clang__)
  54261. "adcs r3, %[r]\n\t"
  54262. #else
  54263. "adc r3, %[r]\n\t"
  54264. #endif
  54265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54266. "adds r4, r4, r6\n\t"
  54267. #else
  54268. "add r4, r4, r6\n\t"
  54269. #endif
  54270. #ifdef WOLFSSL_KEIL
  54271. "adcs r2, r2, %[r]\n\t"
  54272. #elif defined(__clang__)
  54273. "adcs r2, %[r]\n\t"
  54274. #else
  54275. "adc r2, %[r]\n\t"
  54276. #endif
  54277. #ifdef WOLFSSL_KEIL
  54278. "adcs r3, r3, %[r]\n\t"
  54279. #elif defined(__clang__)
  54280. "adcs r3, %[r]\n\t"
  54281. #else
  54282. "adc r3, %[r]\n\t"
  54283. #endif
  54284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54285. "lsrs r6, r7, #16\n\t"
  54286. #else
  54287. "lsr r6, r7, #16\n\t"
  54288. #endif
  54289. #ifdef WOLFSSL_KEIL
  54290. "muls r5, r6, r5\n\t"
  54291. #elif defined(__clang__)
  54292. "muls r5, r6\n\t"
  54293. #else
  54294. "mul r5, r6\n\t"
  54295. #endif
  54296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54297. "lsrs r6, r5, #16\n\t"
  54298. #else
  54299. "lsr r6, r5, #16\n\t"
  54300. #endif
  54301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54302. "lsls r5, r5, #16\n\t"
  54303. #else
  54304. "lsl r5, r5, #16\n\t"
  54305. #endif
  54306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54307. "adds r4, r4, r5\n\t"
  54308. #else
  54309. "add r4, r4, r5\n\t"
  54310. #endif
  54311. #ifdef WOLFSSL_KEIL
  54312. "adcs r2, r2, r6\n\t"
  54313. #elif defined(__clang__)
  54314. "adcs r2, r6\n\t"
  54315. #else
  54316. "adc r2, r6\n\t"
  54317. #endif
  54318. #ifdef WOLFSSL_KEIL
  54319. "adcs r3, r3, %[r]\n\t"
  54320. #elif defined(__clang__)
  54321. "adcs r3, %[r]\n\t"
  54322. #else
  54323. "adc r3, %[r]\n\t"
  54324. #endif
  54325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54326. "adds r4, r4, r5\n\t"
  54327. #else
  54328. "add r4, r4, r5\n\t"
  54329. #endif
  54330. #ifdef WOLFSSL_KEIL
  54331. "adcs r2, r2, r6\n\t"
  54332. #elif defined(__clang__)
  54333. "adcs r2, r6\n\t"
  54334. #else
  54335. "adc r2, r6\n\t"
  54336. #endif
  54337. #ifdef WOLFSSL_KEIL
  54338. "adcs r3, r3, %[r]\n\t"
  54339. #elif defined(__clang__)
  54340. "adcs r3, %[r]\n\t"
  54341. #else
  54342. "adc r3, %[r]\n\t"
  54343. #endif
  54344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54345. "lsrs r5, %[a], #16\n\t"
  54346. #else
  54347. "lsr r5, %[a], #16\n\t"
  54348. #endif
  54349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54350. "lsrs r6, r7, #16\n\t"
  54351. #else
  54352. "lsr r6, r7, #16\n\t"
  54353. #endif
  54354. #ifdef WOLFSSL_KEIL
  54355. "muls r6, r5, r6\n\t"
  54356. #elif defined(__clang__)
  54357. "muls r6, r5\n\t"
  54358. #else
  54359. "mul r6, r5\n\t"
  54360. #endif
  54361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54362. "adds r2, r2, r6\n\t"
  54363. #else
  54364. "add r2, r2, r6\n\t"
  54365. #endif
  54366. #ifdef WOLFSSL_KEIL
  54367. "adcs r3, r3, %[r]\n\t"
  54368. #elif defined(__clang__)
  54369. "adcs r3, %[r]\n\t"
  54370. #else
  54371. "adc r3, %[r]\n\t"
  54372. #endif
  54373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54374. "adds r2, r2, r6\n\t"
  54375. #else
  54376. "add r2, r2, r6\n\t"
  54377. #endif
  54378. #ifdef WOLFSSL_KEIL
  54379. "adcs r3, r3, %[r]\n\t"
  54380. #elif defined(__clang__)
  54381. "adcs r3, %[r]\n\t"
  54382. #else
  54383. "adc r3, %[r]\n\t"
  54384. #endif
  54385. "uxth r6, r7\n\t"
  54386. #ifdef WOLFSSL_KEIL
  54387. "muls r5, r6, r5\n\t"
  54388. #elif defined(__clang__)
  54389. "muls r5, r6\n\t"
  54390. #else
  54391. "mul r5, r6\n\t"
  54392. #endif
  54393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54394. "lsrs r6, r5, #16\n\t"
  54395. #else
  54396. "lsr r6, r5, #16\n\t"
  54397. #endif
  54398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54399. "lsls r5, r5, #16\n\t"
  54400. #else
  54401. "lsl r5, r5, #16\n\t"
  54402. #endif
  54403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54404. "adds r4, r4, r5\n\t"
  54405. #else
  54406. "add r4, r4, r5\n\t"
  54407. #endif
  54408. #ifdef WOLFSSL_KEIL
  54409. "adcs r2, r2, r6\n\t"
  54410. #elif defined(__clang__)
  54411. "adcs r2, r6\n\t"
  54412. #else
  54413. "adc r2, r6\n\t"
  54414. #endif
  54415. #ifdef WOLFSSL_KEIL
  54416. "adcs r3, r3, %[r]\n\t"
  54417. #elif defined(__clang__)
  54418. "adcs r3, %[r]\n\t"
  54419. #else
  54420. "adc r3, %[r]\n\t"
  54421. #endif
  54422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54423. "adds r4, r4, r5\n\t"
  54424. #else
  54425. "add r4, r4, r5\n\t"
  54426. #endif
  54427. #ifdef WOLFSSL_KEIL
  54428. "adcs r2, r2, r6\n\t"
  54429. #elif defined(__clang__)
  54430. "adcs r2, r6\n\t"
  54431. #else
  54432. "adc r2, r6\n\t"
  54433. #endif
  54434. #ifdef WOLFSSL_KEIL
  54435. "adcs r3, r3, %[r]\n\t"
  54436. #elif defined(__clang__)
  54437. "adcs r3, %[r]\n\t"
  54438. #else
  54439. "adc r3, %[r]\n\t"
  54440. #endif
  54441. "# A[7] * A[1]\n\t"
  54442. "mov %[a], r9\n\t"
  54443. "mov r7, r11\n\t"
  54444. "ldr %[a], [%[a], #28]\n\t"
  54445. "uxth r5, %[a]\n\t"
  54446. "uxth r6, r7\n\t"
  54447. #ifdef WOLFSSL_KEIL
  54448. "muls r6, r5, r6\n\t"
  54449. #elif defined(__clang__)
  54450. "muls r6, r5\n\t"
  54451. #else
  54452. "mul r6, r5\n\t"
  54453. #endif
  54454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54455. "adds r4, r4, r6\n\t"
  54456. #else
  54457. "add r4, r4, r6\n\t"
  54458. #endif
  54459. #ifdef WOLFSSL_KEIL
  54460. "adcs r2, r2, %[r]\n\t"
  54461. #elif defined(__clang__)
  54462. "adcs r2, %[r]\n\t"
  54463. #else
  54464. "adc r2, %[r]\n\t"
  54465. #endif
  54466. #ifdef WOLFSSL_KEIL
  54467. "adcs r3, r3, %[r]\n\t"
  54468. #elif defined(__clang__)
  54469. "adcs r3, %[r]\n\t"
  54470. #else
  54471. "adc r3, %[r]\n\t"
  54472. #endif
  54473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54474. "adds r4, r4, r6\n\t"
  54475. #else
  54476. "add r4, r4, r6\n\t"
  54477. #endif
  54478. #ifdef WOLFSSL_KEIL
  54479. "adcs r2, r2, %[r]\n\t"
  54480. #elif defined(__clang__)
  54481. "adcs r2, %[r]\n\t"
  54482. #else
  54483. "adc r2, %[r]\n\t"
  54484. #endif
  54485. #ifdef WOLFSSL_KEIL
  54486. "adcs r3, r3, %[r]\n\t"
  54487. #elif defined(__clang__)
  54488. "adcs r3, %[r]\n\t"
  54489. #else
  54490. "adc r3, %[r]\n\t"
  54491. #endif
  54492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54493. "lsrs r6, r7, #16\n\t"
  54494. #else
  54495. "lsr r6, r7, #16\n\t"
  54496. #endif
  54497. #ifdef WOLFSSL_KEIL
  54498. "muls r5, r6, r5\n\t"
  54499. #elif defined(__clang__)
  54500. "muls r5, r6\n\t"
  54501. #else
  54502. "mul r5, r6\n\t"
  54503. #endif
  54504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54505. "lsrs r6, r5, #16\n\t"
  54506. #else
  54507. "lsr r6, r5, #16\n\t"
  54508. #endif
  54509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54510. "lsls r5, r5, #16\n\t"
  54511. #else
  54512. "lsl r5, r5, #16\n\t"
  54513. #endif
  54514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54515. "adds r4, r4, r5\n\t"
  54516. #else
  54517. "add r4, r4, r5\n\t"
  54518. #endif
  54519. #ifdef WOLFSSL_KEIL
  54520. "adcs r2, r2, r6\n\t"
  54521. #elif defined(__clang__)
  54522. "adcs r2, r6\n\t"
  54523. #else
  54524. "adc r2, r6\n\t"
  54525. #endif
  54526. #ifdef WOLFSSL_KEIL
  54527. "adcs r3, r3, %[r]\n\t"
  54528. #elif defined(__clang__)
  54529. "adcs r3, %[r]\n\t"
  54530. #else
  54531. "adc r3, %[r]\n\t"
  54532. #endif
  54533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54534. "adds r4, r4, r5\n\t"
  54535. #else
  54536. "add r4, r4, r5\n\t"
  54537. #endif
  54538. #ifdef WOLFSSL_KEIL
  54539. "adcs r2, r2, r6\n\t"
  54540. #elif defined(__clang__)
  54541. "adcs r2, r6\n\t"
  54542. #else
  54543. "adc r2, r6\n\t"
  54544. #endif
  54545. #ifdef WOLFSSL_KEIL
  54546. "adcs r3, r3, %[r]\n\t"
  54547. #elif defined(__clang__)
  54548. "adcs r3, %[r]\n\t"
  54549. #else
  54550. "adc r3, %[r]\n\t"
  54551. #endif
  54552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54553. "lsrs r5, %[a], #16\n\t"
  54554. #else
  54555. "lsr r5, %[a], #16\n\t"
  54556. #endif
  54557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54558. "lsrs r6, r7, #16\n\t"
  54559. #else
  54560. "lsr r6, r7, #16\n\t"
  54561. #endif
  54562. #ifdef WOLFSSL_KEIL
  54563. "muls r6, r5, r6\n\t"
  54564. #elif defined(__clang__)
  54565. "muls r6, r5\n\t"
  54566. #else
  54567. "mul r6, r5\n\t"
  54568. #endif
  54569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54570. "adds r2, r2, r6\n\t"
  54571. #else
  54572. "add r2, r2, r6\n\t"
  54573. #endif
  54574. #ifdef WOLFSSL_KEIL
  54575. "adcs r3, r3, %[r]\n\t"
  54576. #elif defined(__clang__)
  54577. "adcs r3, %[r]\n\t"
  54578. #else
  54579. "adc r3, %[r]\n\t"
  54580. #endif
  54581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54582. "adds r2, r2, r6\n\t"
  54583. #else
  54584. "add r2, r2, r6\n\t"
  54585. #endif
  54586. #ifdef WOLFSSL_KEIL
  54587. "adcs r3, r3, %[r]\n\t"
  54588. #elif defined(__clang__)
  54589. "adcs r3, %[r]\n\t"
  54590. #else
  54591. "adc r3, %[r]\n\t"
  54592. #endif
  54593. "uxth r6, r7\n\t"
  54594. #ifdef WOLFSSL_KEIL
  54595. "muls r5, r6, r5\n\t"
  54596. #elif defined(__clang__)
  54597. "muls r5, r6\n\t"
  54598. #else
  54599. "mul r5, r6\n\t"
  54600. #endif
  54601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54602. "lsrs r6, r5, #16\n\t"
  54603. #else
  54604. "lsr r6, r5, #16\n\t"
  54605. #endif
  54606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54607. "lsls r5, r5, #16\n\t"
  54608. #else
  54609. "lsl r5, r5, #16\n\t"
  54610. #endif
  54611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54612. "adds r4, r4, r5\n\t"
  54613. #else
  54614. "add r4, r4, r5\n\t"
  54615. #endif
  54616. #ifdef WOLFSSL_KEIL
  54617. "adcs r2, r2, r6\n\t"
  54618. #elif defined(__clang__)
  54619. "adcs r2, r6\n\t"
  54620. #else
  54621. "adc r2, r6\n\t"
  54622. #endif
  54623. #ifdef WOLFSSL_KEIL
  54624. "adcs r3, r3, %[r]\n\t"
  54625. #elif defined(__clang__)
  54626. "adcs r3, %[r]\n\t"
  54627. #else
  54628. "adc r3, %[r]\n\t"
  54629. #endif
  54630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54631. "adds r4, r4, r5\n\t"
  54632. #else
  54633. "add r4, r4, r5\n\t"
  54634. #endif
  54635. #ifdef WOLFSSL_KEIL
  54636. "adcs r2, r2, r6\n\t"
  54637. #elif defined(__clang__)
  54638. "adcs r2, r6\n\t"
  54639. #else
  54640. "adc r2, r6\n\t"
  54641. #endif
  54642. #ifdef WOLFSSL_KEIL
  54643. "adcs r3, r3, %[r]\n\t"
  54644. #elif defined(__clang__)
  54645. "adcs r3, %[r]\n\t"
  54646. #else
  54647. "adc r3, %[r]\n\t"
  54648. #endif
  54649. "# A[6] * A[2]\n\t"
  54650. "mov %[a], r9\n\t"
  54651. "mov r7, r12\n\t"
  54652. "ldr %[a], [%[a], #24]\n\t"
  54653. "uxth r5, %[a]\n\t"
  54654. "uxth r6, r7\n\t"
  54655. #ifdef WOLFSSL_KEIL
  54656. "muls r6, r5, r6\n\t"
  54657. #elif defined(__clang__)
  54658. "muls r6, r5\n\t"
  54659. #else
  54660. "mul r6, r5\n\t"
  54661. #endif
  54662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54663. "adds r4, r4, r6\n\t"
  54664. #else
  54665. "add r4, r4, r6\n\t"
  54666. #endif
  54667. #ifdef WOLFSSL_KEIL
  54668. "adcs r2, r2, %[r]\n\t"
  54669. #elif defined(__clang__)
  54670. "adcs r2, %[r]\n\t"
  54671. #else
  54672. "adc r2, %[r]\n\t"
  54673. #endif
  54674. #ifdef WOLFSSL_KEIL
  54675. "adcs r3, r3, %[r]\n\t"
  54676. #elif defined(__clang__)
  54677. "adcs r3, %[r]\n\t"
  54678. #else
  54679. "adc r3, %[r]\n\t"
  54680. #endif
  54681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54682. "adds r4, r4, r6\n\t"
  54683. #else
  54684. "add r4, r4, r6\n\t"
  54685. #endif
  54686. #ifdef WOLFSSL_KEIL
  54687. "adcs r2, r2, %[r]\n\t"
  54688. #elif defined(__clang__)
  54689. "adcs r2, %[r]\n\t"
  54690. #else
  54691. "adc r2, %[r]\n\t"
  54692. #endif
  54693. #ifdef WOLFSSL_KEIL
  54694. "adcs r3, r3, %[r]\n\t"
  54695. #elif defined(__clang__)
  54696. "adcs r3, %[r]\n\t"
  54697. #else
  54698. "adc r3, %[r]\n\t"
  54699. #endif
  54700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54701. "lsrs r6, r7, #16\n\t"
  54702. #else
  54703. "lsr r6, r7, #16\n\t"
  54704. #endif
  54705. #ifdef WOLFSSL_KEIL
  54706. "muls r5, r6, r5\n\t"
  54707. #elif defined(__clang__)
  54708. "muls r5, r6\n\t"
  54709. #else
  54710. "mul r5, r6\n\t"
  54711. #endif
  54712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54713. "lsrs r6, r5, #16\n\t"
  54714. #else
  54715. "lsr r6, r5, #16\n\t"
  54716. #endif
  54717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54718. "lsls r5, r5, #16\n\t"
  54719. #else
  54720. "lsl r5, r5, #16\n\t"
  54721. #endif
  54722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54723. "adds r4, r4, r5\n\t"
  54724. #else
  54725. "add r4, r4, r5\n\t"
  54726. #endif
  54727. #ifdef WOLFSSL_KEIL
  54728. "adcs r2, r2, r6\n\t"
  54729. #elif defined(__clang__)
  54730. "adcs r2, r6\n\t"
  54731. #else
  54732. "adc r2, r6\n\t"
  54733. #endif
  54734. #ifdef WOLFSSL_KEIL
  54735. "adcs r3, r3, %[r]\n\t"
  54736. #elif defined(__clang__)
  54737. "adcs r3, %[r]\n\t"
  54738. #else
  54739. "adc r3, %[r]\n\t"
  54740. #endif
  54741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54742. "adds r4, r4, r5\n\t"
  54743. #else
  54744. "add r4, r4, r5\n\t"
  54745. #endif
  54746. #ifdef WOLFSSL_KEIL
  54747. "adcs r2, r2, r6\n\t"
  54748. #elif defined(__clang__)
  54749. "adcs r2, r6\n\t"
  54750. #else
  54751. "adc r2, r6\n\t"
  54752. #endif
  54753. #ifdef WOLFSSL_KEIL
  54754. "adcs r3, r3, %[r]\n\t"
  54755. #elif defined(__clang__)
  54756. "adcs r3, %[r]\n\t"
  54757. #else
  54758. "adc r3, %[r]\n\t"
  54759. #endif
  54760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54761. "lsrs r5, %[a], #16\n\t"
  54762. #else
  54763. "lsr r5, %[a], #16\n\t"
  54764. #endif
  54765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54766. "lsrs r6, r7, #16\n\t"
  54767. #else
  54768. "lsr r6, r7, #16\n\t"
  54769. #endif
  54770. #ifdef WOLFSSL_KEIL
  54771. "muls r6, r5, r6\n\t"
  54772. #elif defined(__clang__)
  54773. "muls r6, r5\n\t"
  54774. #else
  54775. "mul r6, r5\n\t"
  54776. #endif
  54777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54778. "adds r2, r2, r6\n\t"
  54779. #else
  54780. "add r2, r2, r6\n\t"
  54781. #endif
  54782. #ifdef WOLFSSL_KEIL
  54783. "adcs r3, r3, %[r]\n\t"
  54784. #elif defined(__clang__)
  54785. "adcs r3, %[r]\n\t"
  54786. #else
  54787. "adc r3, %[r]\n\t"
  54788. #endif
  54789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54790. "adds r2, r2, r6\n\t"
  54791. #else
  54792. "add r2, r2, r6\n\t"
  54793. #endif
  54794. #ifdef WOLFSSL_KEIL
  54795. "adcs r3, r3, %[r]\n\t"
  54796. #elif defined(__clang__)
  54797. "adcs r3, %[r]\n\t"
  54798. #else
  54799. "adc r3, %[r]\n\t"
  54800. #endif
  54801. "uxth r6, r7\n\t"
  54802. #ifdef WOLFSSL_KEIL
  54803. "muls r5, r6, r5\n\t"
  54804. #elif defined(__clang__)
  54805. "muls r5, r6\n\t"
  54806. #else
  54807. "mul r5, r6\n\t"
  54808. #endif
  54809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54810. "lsrs r6, r5, #16\n\t"
  54811. #else
  54812. "lsr r6, r5, #16\n\t"
  54813. #endif
  54814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54815. "lsls r5, r5, #16\n\t"
  54816. #else
  54817. "lsl r5, r5, #16\n\t"
  54818. #endif
  54819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54820. "adds r4, r4, r5\n\t"
  54821. #else
  54822. "add r4, r4, r5\n\t"
  54823. #endif
  54824. #ifdef WOLFSSL_KEIL
  54825. "adcs r2, r2, r6\n\t"
  54826. #elif defined(__clang__)
  54827. "adcs r2, r6\n\t"
  54828. #else
  54829. "adc r2, r6\n\t"
  54830. #endif
  54831. #ifdef WOLFSSL_KEIL
  54832. "adcs r3, r3, %[r]\n\t"
  54833. #elif defined(__clang__)
  54834. "adcs r3, %[r]\n\t"
  54835. #else
  54836. "adc r3, %[r]\n\t"
  54837. #endif
  54838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54839. "adds r4, r4, r5\n\t"
  54840. #else
  54841. "add r4, r4, r5\n\t"
  54842. #endif
  54843. #ifdef WOLFSSL_KEIL
  54844. "adcs r2, r2, r6\n\t"
  54845. #elif defined(__clang__)
  54846. "adcs r2, r6\n\t"
  54847. #else
  54848. "adc r2, r6\n\t"
  54849. #endif
  54850. #ifdef WOLFSSL_KEIL
  54851. "adcs r3, r3, %[r]\n\t"
  54852. #elif defined(__clang__)
  54853. "adcs r3, %[r]\n\t"
  54854. #else
  54855. "adc r3, %[r]\n\t"
  54856. #endif
  54857. "# A[5] * A[3]\n\t"
  54858. "mov %[a], r9\n\t"
  54859. "mov r7, lr\n\t"
  54860. "ldr %[a], [%[a], #20]\n\t"
  54861. "uxth r5, %[a]\n\t"
  54862. "uxth r6, r7\n\t"
  54863. #ifdef WOLFSSL_KEIL
  54864. "muls r6, r5, r6\n\t"
  54865. #elif defined(__clang__)
  54866. "muls r6, r5\n\t"
  54867. #else
  54868. "mul r6, r5\n\t"
  54869. #endif
  54870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54871. "adds r4, r4, r6\n\t"
  54872. #else
  54873. "add r4, r4, r6\n\t"
  54874. #endif
  54875. #ifdef WOLFSSL_KEIL
  54876. "adcs r2, r2, %[r]\n\t"
  54877. #elif defined(__clang__)
  54878. "adcs r2, %[r]\n\t"
  54879. #else
  54880. "adc r2, %[r]\n\t"
  54881. #endif
  54882. #ifdef WOLFSSL_KEIL
  54883. "adcs r3, r3, %[r]\n\t"
  54884. #elif defined(__clang__)
  54885. "adcs r3, %[r]\n\t"
  54886. #else
  54887. "adc r3, %[r]\n\t"
  54888. #endif
  54889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54890. "adds r4, r4, r6\n\t"
  54891. #else
  54892. "add r4, r4, r6\n\t"
  54893. #endif
  54894. #ifdef WOLFSSL_KEIL
  54895. "adcs r2, r2, %[r]\n\t"
  54896. #elif defined(__clang__)
  54897. "adcs r2, %[r]\n\t"
  54898. #else
  54899. "adc r2, %[r]\n\t"
  54900. #endif
  54901. #ifdef WOLFSSL_KEIL
  54902. "adcs r3, r3, %[r]\n\t"
  54903. #elif defined(__clang__)
  54904. "adcs r3, %[r]\n\t"
  54905. #else
  54906. "adc r3, %[r]\n\t"
  54907. #endif
  54908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54909. "lsrs r6, r7, #16\n\t"
  54910. #else
  54911. "lsr r6, r7, #16\n\t"
  54912. #endif
  54913. #ifdef WOLFSSL_KEIL
  54914. "muls r5, r6, r5\n\t"
  54915. #elif defined(__clang__)
  54916. "muls r5, r6\n\t"
  54917. #else
  54918. "mul r5, r6\n\t"
  54919. #endif
  54920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54921. "lsrs r6, r5, #16\n\t"
  54922. #else
  54923. "lsr r6, r5, #16\n\t"
  54924. #endif
  54925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54926. "lsls r5, r5, #16\n\t"
  54927. #else
  54928. "lsl r5, r5, #16\n\t"
  54929. #endif
  54930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54931. "adds r4, r4, r5\n\t"
  54932. #else
  54933. "add r4, r4, r5\n\t"
  54934. #endif
  54935. #ifdef WOLFSSL_KEIL
  54936. "adcs r2, r2, r6\n\t"
  54937. #elif defined(__clang__)
  54938. "adcs r2, r6\n\t"
  54939. #else
  54940. "adc r2, r6\n\t"
  54941. #endif
  54942. #ifdef WOLFSSL_KEIL
  54943. "adcs r3, r3, %[r]\n\t"
  54944. #elif defined(__clang__)
  54945. "adcs r3, %[r]\n\t"
  54946. #else
  54947. "adc r3, %[r]\n\t"
  54948. #endif
  54949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54950. "adds r4, r4, r5\n\t"
  54951. #else
  54952. "add r4, r4, r5\n\t"
  54953. #endif
  54954. #ifdef WOLFSSL_KEIL
  54955. "adcs r2, r2, r6\n\t"
  54956. #elif defined(__clang__)
  54957. "adcs r2, r6\n\t"
  54958. #else
  54959. "adc r2, r6\n\t"
  54960. #endif
  54961. #ifdef WOLFSSL_KEIL
  54962. "adcs r3, r3, %[r]\n\t"
  54963. #elif defined(__clang__)
  54964. "adcs r3, %[r]\n\t"
  54965. #else
  54966. "adc r3, %[r]\n\t"
  54967. #endif
  54968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54969. "lsrs r5, %[a], #16\n\t"
  54970. #else
  54971. "lsr r5, %[a], #16\n\t"
  54972. #endif
  54973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54974. "lsrs r6, r7, #16\n\t"
  54975. #else
  54976. "lsr r6, r7, #16\n\t"
  54977. #endif
  54978. #ifdef WOLFSSL_KEIL
  54979. "muls r6, r5, r6\n\t"
  54980. #elif defined(__clang__)
  54981. "muls r6, r5\n\t"
  54982. #else
  54983. "mul r6, r5\n\t"
  54984. #endif
  54985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54986. "adds r2, r2, r6\n\t"
  54987. #else
  54988. "add r2, r2, r6\n\t"
  54989. #endif
  54990. #ifdef WOLFSSL_KEIL
  54991. "adcs r3, r3, %[r]\n\t"
  54992. #elif defined(__clang__)
  54993. "adcs r3, %[r]\n\t"
  54994. #else
  54995. "adc r3, %[r]\n\t"
  54996. #endif
  54997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54998. "adds r2, r2, r6\n\t"
  54999. #else
  55000. "add r2, r2, r6\n\t"
  55001. #endif
  55002. #ifdef WOLFSSL_KEIL
  55003. "adcs r3, r3, %[r]\n\t"
  55004. #elif defined(__clang__)
  55005. "adcs r3, %[r]\n\t"
  55006. #else
  55007. "adc r3, %[r]\n\t"
  55008. #endif
  55009. "uxth r6, r7\n\t"
  55010. #ifdef WOLFSSL_KEIL
  55011. "muls r5, r6, r5\n\t"
  55012. #elif defined(__clang__)
  55013. "muls r5, r6\n\t"
  55014. #else
  55015. "mul r5, r6\n\t"
  55016. #endif
  55017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55018. "lsrs r6, r5, #16\n\t"
  55019. #else
  55020. "lsr r6, r5, #16\n\t"
  55021. #endif
  55022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55023. "lsls r5, r5, #16\n\t"
  55024. #else
  55025. "lsl r5, r5, #16\n\t"
  55026. #endif
  55027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55028. "adds r4, r4, r5\n\t"
  55029. #else
  55030. "add r4, r4, r5\n\t"
  55031. #endif
  55032. #ifdef WOLFSSL_KEIL
  55033. "adcs r2, r2, r6\n\t"
  55034. #elif defined(__clang__)
  55035. "adcs r2, r6\n\t"
  55036. #else
  55037. "adc r2, r6\n\t"
  55038. #endif
  55039. #ifdef WOLFSSL_KEIL
  55040. "adcs r3, r3, %[r]\n\t"
  55041. #elif defined(__clang__)
  55042. "adcs r3, %[r]\n\t"
  55043. #else
  55044. "adc r3, %[r]\n\t"
  55045. #endif
  55046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55047. "adds r4, r4, r5\n\t"
  55048. #else
  55049. "add r4, r4, r5\n\t"
  55050. #endif
  55051. #ifdef WOLFSSL_KEIL
  55052. "adcs r2, r2, r6\n\t"
  55053. #elif defined(__clang__)
  55054. "adcs r2, r6\n\t"
  55055. #else
  55056. "adc r2, r6\n\t"
  55057. #endif
  55058. #ifdef WOLFSSL_KEIL
  55059. "adcs r3, r3, %[r]\n\t"
  55060. #elif defined(__clang__)
  55061. "adcs r3, %[r]\n\t"
  55062. #else
  55063. "adc r3, %[r]\n\t"
  55064. #endif
  55065. "# A[4] * A[4]\n\t"
  55066. "mov %[a], r9\n\t"
  55067. "ldr r7, [%[a], #16]\n\t"
  55068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55069. "lsrs r6, r7, #16\n\t"
  55070. #else
  55071. "lsr r6, r7, #16\n\t"
  55072. #endif
  55073. "uxth r5, r7\n\t"
  55074. #ifdef WOLFSSL_KEIL
  55075. "muls r5, r5, r5\n\t"
  55076. #elif defined(__clang__)
  55077. "muls r5, r5\n\t"
  55078. #else
  55079. "mul r5, r5\n\t"
  55080. #endif
  55081. #ifdef WOLFSSL_KEIL
  55082. "muls r6, r6, r6\n\t"
  55083. #elif defined(__clang__)
  55084. "muls r6, r6\n\t"
  55085. #else
  55086. "mul r6, r6\n\t"
  55087. #endif
  55088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55089. "adds r4, r4, r5\n\t"
  55090. #else
  55091. "add r4, r4, r5\n\t"
  55092. #endif
  55093. #ifdef WOLFSSL_KEIL
  55094. "adcs r2, r2, r6\n\t"
  55095. #elif defined(__clang__)
  55096. "adcs r2, r6\n\t"
  55097. #else
  55098. "adc r2, r6\n\t"
  55099. #endif
  55100. #ifdef WOLFSSL_KEIL
  55101. "adcs r3, r3, %[r]\n\t"
  55102. #elif defined(__clang__)
  55103. "adcs r3, %[r]\n\t"
  55104. #else
  55105. "adc r3, %[r]\n\t"
  55106. #endif
  55107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55108. "lsrs r6, r7, #16\n\t"
  55109. #else
  55110. "lsr r6, r7, #16\n\t"
  55111. #endif
  55112. "uxth r5, r7\n\t"
  55113. #ifdef WOLFSSL_KEIL
  55114. "muls r5, r6, r5\n\t"
  55115. #elif defined(__clang__)
  55116. "muls r5, r6\n\t"
  55117. #else
  55118. "mul r5, r6\n\t"
  55119. #endif
  55120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55121. "lsrs r6, r5, #15\n\t"
  55122. #else
  55123. "lsr r6, r5, #15\n\t"
  55124. #endif
  55125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55126. "lsls r5, r5, #17\n\t"
  55127. #else
  55128. "lsl r5, r5, #17\n\t"
  55129. #endif
  55130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55131. "adds r4, r4, r5\n\t"
  55132. #else
  55133. "add r4, r4, r5\n\t"
  55134. #endif
  55135. #ifdef WOLFSSL_KEIL
  55136. "adcs r2, r2, r6\n\t"
  55137. #elif defined(__clang__)
  55138. "adcs r2, r6\n\t"
  55139. #else
  55140. "adc r2, r6\n\t"
  55141. #endif
  55142. #ifdef WOLFSSL_KEIL
  55143. "adcs r3, r3, %[r]\n\t"
  55144. #elif defined(__clang__)
  55145. "adcs r3, %[r]\n\t"
  55146. #else
  55147. "adc r3, %[r]\n\t"
  55148. #endif
  55149. "str r4, [sp, #32]\n\t"
  55150. "# A[5] * A[4]\n\t"
  55151. "movs r4, #0\n\t"
  55152. "ldr %[a], [%[a], #20]\n\t"
  55153. "uxth r5, %[a]\n\t"
  55154. "uxth r6, r7\n\t"
  55155. #ifdef WOLFSSL_KEIL
  55156. "muls r6, r5, r6\n\t"
  55157. #elif defined(__clang__)
  55158. "muls r6, r5\n\t"
  55159. #else
  55160. "mul r6, r5\n\t"
  55161. #endif
  55162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55163. "adds r2, r2, r6\n\t"
  55164. #else
  55165. "add r2, r2, r6\n\t"
  55166. #endif
  55167. #ifdef WOLFSSL_KEIL
  55168. "adcs r3, r3, %[r]\n\t"
  55169. #elif defined(__clang__)
  55170. "adcs r3, %[r]\n\t"
  55171. #else
  55172. "adc r3, %[r]\n\t"
  55173. #endif
  55174. #ifdef WOLFSSL_KEIL
  55175. "adcs r4, r4, %[r]\n\t"
  55176. #elif defined(__clang__)
  55177. "adcs r4, %[r]\n\t"
  55178. #else
  55179. "adc r4, %[r]\n\t"
  55180. #endif
  55181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55182. "adds r2, r2, r6\n\t"
  55183. #else
  55184. "add r2, r2, r6\n\t"
  55185. #endif
  55186. #ifdef WOLFSSL_KEIL
  55187. "adcs r3, r3, %[r]\n\t"
  55188. #elif defined(__clang__)
  55189. "adcs r3, %[r]\n\t"
  55190. #else
  55191. "adc r3, %[r]\n\t"
  55192. #endif
  55193. #ifdef WOLFSSL_KEIL
  55194. "adcs r4, r4, %[r]\n\t"
  55195. #elif defined(__clang__)
  55196. "adcs r4, %[r]\n\t"
  55197. #else
  55198. "adc r4, %[r]\n\t"
  55199. #endif
  55200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55201. "lsrs r6, r7, #16\n\t"
  55202. #else
  55203. "lsr r6, r7, #16\n\t"
  55204. #endif
  55205. #ifdef WOLFSSL_KEIL
  55206. "muls r5, r6, r5\n\t"
  55207. #elif defined(__clang__)
  55208. "muls r5, r6\n\t"
  55209. #else
  55210. "mul r5, r6\n\t"
  55211. #endif
  55212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55213. "lsrs r6, r5, #16\n\t"
  55214. #else
  55215. "lsr r6, r5, #16\n\t"
  55216. #endif
  55217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55218. "lsls r5, r5, #16\n\t"
  55219. #else
  55220. "lsl r5, r5, #16\n\t"
  55221. #endif
  55222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55223. "adds r2, r2, r5\n\t"
  55224. #else
  55225. "add r2, r2, r5\n\t"
  55226. #endif
  55227. #ifdef WOLFSSL_KEIL
  55228. "adcs r3, r3, r6\n\t"
  55229. #elif defined(__clang__)
  55230. "adcs r3, r6\n\t"
  55231. #else
  55232. "adc r3, r6\n\t"
  55233. #endif
  55234. #ifdef WOLFSSL_KEIL
  55235. "adcs r4, r4, %[r]\n\t"
  55236. #elif defined(__clang__)
  55237. "adcs r4, %[r]\n\t"
  55238. #else
  55239. "adc r4, %[r]\n\t"
  55240. #endif
  55241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55242. "adds r2, r2, r5\n\t"
  55243. #else
  55244. "add r2, r2, r5\n\t"
  55245. #endif
  55246. #ifdef WOLFSSL_KEIL
  55247. "adcs r3, r3, r6\n\t"
  55248. #elif defined(__clang__)
  55249. "adcs r3, r6\n\t"
  55250. #else
  55251. "adc r3, r6\n\t"
  55252. #endif
  55253. #ifdef WOLFSSL_KEIL
  55254. "adcs r4, r4, %[r]\n\t"
  55255. #elif defined(__clang__)
  55256. "adcs r4, %[r]\n\t"
  55257. #else
  55258. "adc r4, %[r]\n\t"
  55259. #endif
  55260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55261. "lsrs r5, %[a], #16\n\t"
  55262. #else
  55263. "lsr r5, %[a], #16\n\t"
  55264. #endif
  55265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55266. "lsrs r6, r7, #16\n\t"
  55267. #else
  55268. "lsr r6, r7, #16\n\t"
  55269. #endif
  55270. #ifdef WOLFSSL_KEIL
  55271. "muls r6, r5, r6\n\t"
  55272. #elif defined(__clang__)
  55273. "muls r6, r5\n\t"
  55274. #else
  55275. "mul r6, r5\n\t"
  55276. #endif
  55277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55278. "adds r3, r3, r6\n\t"
  55279. #else
  55280. "add r3, r3, r6\n\t"
  55281. #endif
  55282. #ifdef WOLFSSL_KEIL
  55283. "adcs r4, r4, %[r]\n\t"
  55284. #elif defined(__clang__)
  55285. "adcs r4, %[r]\n\t"
  55286. #else
  55287. "adc r4, %[r]\n\t"
  55288. #endif
  55289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55290. "adds r3, r3, r6\n\t"
  55291. #else
  55292. "add r3, r3, r6\n\t"
  55293. #endif
  55294. #ifdef WOLFSSL_KEIL
  55295. "adcs r4, r4, %[r]\n\t"
  55296. #elif defined(__clang__)
  55297. "adcs r4, %[r]\n\t"
  55298. #else
  55299. "adc r4, %[r]\n\t"
  55300. #endif
  55301. "uxth r6, r7\n\t"
  55302. #ifdef WOLFSSL_KEIL
  55303. "muls r5, r6, r5\n\t"
  55304. #elif defined(__clang__)
  55305. "muls r5, r6\n\t"
  55306. #else
  55307. "mul r5, r6\n\t"
  55308. #endif
  55309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55310. "lsrs r6, r5, #16\n\t"
  55311. #else
  55312. "lsr r6, r5, #16\n\t"
  55313. #endif
  55314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55315. "lsls r5, r5, #16\n\t"
  55316. #else
  55317. "lsl r5, r5, #16\n\t"
  55318. #endif
  55319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55320. "adds r2, r2, r5\n\t"
  55321. #else
  55322. "add r2, r2, r5\n\t"
  55323. #endif
  55324. #ifdef WOLFSSL_KEIL
  55325. "adcs r3, r3, r6\n\t"
  55326. #elif defined(__clang__)
  55327. "adcs r3, r6\n\t"
  55328. #else
  55329. "adc r3, r6\n\t"
  55330. #endif
  55331. #ifdef WOLFSSL_KEIL
  55332. "adcs r4, r4, %[r]\n\t"
  55333. #elif defined(__clang__)
  55334. "adcs r4, %[r]\n\t"
  55335. #else
  55336. "adc r4, %[r]\n\t"
  55337. #endif
  55338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55339. "adds r2, r2, r5\n\t"
  55340. #else
  55341. "add r2, r2, r5\n\t"
  55342. #endif
  55343. #ifdef WOLFSSL_KEIL
  55344. "adcs r3, r3, r6\n\t"
  55345. #elif defined(__clang__)
  55346. "adcs r3, r6\n\t"
  55347. #else
  55348. "adc r3, r6\n\t"
  55349. #endif
  55350. #ifdef WOLFSSL_KEIL
  55351. "adcs r4, r4, %[r]\n\t"
  55352. #elif defined(__clang__)
  55353. "adcs r4, %[r]\n\t"
  55354. #else
  55355. "adc r4, %[r]\n\t"
  55356. #endif
  55357. "# A[6] * A[3]\n\t"
  55358. "mov %[a], r9\n\t"
  55359. "mov r7, lr\n\t"
  55360. "ldr %[a], [%[a], #24]\n\t"
  55361. "uxth r5, %[a]\n\t"
  55362. "uxth r6, r7\n\t"
  55363. #ifdef WOLFSSL_KEIL
  55364. "muls r6, r5, r6\n\t"
  55365. #elif defined(__clang__)
  55366. "muls r6, r5\n\t"
  55367. #else
  55368. "mul r6, r5\n\t"
  55369. #endif
  55370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55371. "adds r2, r2, r6\n\t"
  55372. #else
  55373. "add r2, r2, r6\n\t"
  55374. #endif
  55375. #ifdef WOLFSSL_KEIL
  55376. "adcs r3, r3, %[r]\n\t"
  55377. #elif defined(__clang__)
  55378. "adcs r3, %[r]\n\t"
  55379. #else
  55380. "adc r3, %[r]\n\t"
  55381. #endif
  55382. #ifdef WOLFSSL_KEIL
  55383. "adcs r4, r4, %[r]\n\t"
  55384. #elif defined(__clang__)
  55385. "adcs r4, %[r]\n\t"
  55386. #else
  55387. "adc r4, %[r]\n\t"
  55388. #endif
  55389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55390. "adds r2, r2, r6\n\t"
  55391. #else
  55392. "add r2, r2, r6\n\t"
  55393. #endif
  55394. #ifdef WOLFSSL_KEIL
  55395. "adcs r3, r3, %[r]\n\t"
  55396. #elif defined(__clang__)
  55397. "adcs r3, %[r]\n\t"
  55398. #else
  55399. "adc r3, %[r]\n\t"
  55400. #endif
  55401. #ifdef WOLFSSL_KEIL
  55402. "adcs r4, r4, %[r]\n\t"
  55403. #elif defined(__clang__)
  55404. "adcs r4, %[r]\n\t"
  55405. #else
  55406. "adc r4, %[r]\n\t"
  55407. #endif
  55408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55409. "lsrs r6, r7, #16\n\t"
  55410. #else
  55411. "lsr r6, r7, #16\n\t"
  55412. #endif
  55413. #ifdef WOLFSSL_KEIL
  55414. "muls r5, r6, r5\n\t"
  55415. #elif defined(__clang__)
  55416. "muls r5, r6\n\t"
  55417. #else
  55418. "mul r5, r6\n\t"
  55419. #endif
  55420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55421. "lsrs r6, r5, #16\n\t"
  55422. #else
  55423. "lsr r6, r5, #16\n\t"
  55424. #endif
  55425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55426. "lsls r5, r5, #16\n\t"
  55427. #else
  55428. "lsl r5, r5, #16\n\t"
  55429. #endif
  55430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55431. "adds r2, r2, r5\n\t"
  55432. #else
  55433. "add r2, r2, r5\n\t"
  55434. #endif
  55435. #ifdef WOLFSSL_KEIL
  55436. "adcs r3, r3, r6\n\t"
  55437. #elif defined(__clang__)
  55438. "adcs r3, r6\n\t"
  55439. #else
  55440. "adc r3, r6\n\t"
  55441. #endif
  55442. #ifdef WOLFSSL_KEIL
  55443. "adcs r4, r4, %[r]\n\t"
  55444. #elif defined(__clang__)
  55445. "adcs r4, %[r]\n\t"
  55446. #else
  55447. "adc r4, %[r]\n\t"
  55448. #endif
  55449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55450. "adds r2, r2, r5\n\t"
  55451. #else
  55452. "add r2, r2, r5\n\t"
  55453. #endif
  55454. #ifdef WOLFSSL_KEIL
  55455. "adcs r3, r3, r6\n\t"
  55456. #elif defined(__clang__)
  55457. "adcs r3, r6\n\t"
  55458. #else
  55459. "adc r3, r6\n\t"
  55460. #endif
  55461. #ifdef WOLFSSL_KEIL
  55462. "adcs r4, r4, %[r]\n\t"
  55463. #elif defined(__clang__)
  55464. "adcs r4, %[r]\n\t"
  55465. #else
  55466. "adc r4, %[r]\n\t"
  55467. #endif
  55468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55469. "lsrs r5, %[a], #16\n\t"
  55470. #else
  55471. "lsr r5, %[a], #16\n\t"
  55472. #endif
  55473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55474. "lsrs r6, r7, #16\n\t"
  55475. #else
  55476. "lsr r6, r7, #16\n\t"
  55477. #endif
  55478. #ifdef WOLFSSL_KEIL
  55479. "muls r6, r5, r6\n\t"
  55480. #elif defined(__clang__)
  55481. "muls r6, r5\n\t"
  55482. #else
  55483. "mul r6, r5\n\t"
  55484. #endif
  55485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55486. "adds r3, r3, r6\n\t"
  55487. #else
  55488. "add r3, r3, r6\n\t"
  55489. #endif
  55490. #ifdef WOLFSSL_KEIL
  55491. "adcs r4, r4, %[r]\n\t"
  55492. #elif defined(__clang__)
  55493. "adcs r4, %[r]\n\t"
  55494. #else
  55495. "adc r4, %[r]\n\t"
  55496. #endif
  55497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55498. "adds r3, r3, r6\n\t"
  55499. #else
  55500. "add r3, r3, r6\n\t"
  55501. #endif
  55502. #ifdef WOLFSSL_KEIL
  55503. "adcs r4, r4, %[r]\n\t"
  55504. #elif defined(__clang__)
  55505. "adcs r4, %[r]\n\t"
  55506. #else
  55507. "adc r4, %[r]\n\t"
  55508. #endif
  55509. "uxth r6, r7\n\t"
  55510. #ifdef WOLFSSL_KEIL
  55511. "muls r5, r6, r5\n\t"
  55512. #elif defined(__clang__)
  55513. "muls r5, r6\n\t"
  55514. #else
  55515. "mul r5, r6\n\t"
  55516. #endif
  55517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55518. "lsrs r6, r5, #16\n\t"
  55519. #else
  55520. "lsr r6, r5, #16\n\t"
  55521. #endif
  55522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55523. "lsls r5, r5, #16\n\t"
  55524. #else
  55525. "lsl r5, r5, #16\n\t"
  55526. #endif
  55527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55528. "adds r2, r2, r5\n\t"
  55529. #else
  55530. "add r2, r2, r5\n\t"
  55531. #endif
  55532. #ifdef WOLFSSL_KEIL
  55533. "adcs r3, r3, r6\n\t"
  55534. #elif defined(__clang__)
  55535. "adcs r3, r6\n\t"
  55536. #else
  55537. "adc r3, r6\n\t"
  55538. #endif
  55539. #ifdef WOLFSSL_KEIL
  55540. "adcs r4, r4, %[r]\n\t"
  55541. #elif defined(__clang__)
  55542. "adcs r4, %[r]\n\t"
  55543. #else
  55544. "adc r4, %[r]\n\t"
  55545. #endif
  55546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55547. "adds r2, r2, r5\n\t"
  55548. #else
  55549. "add r2, r2, r5\n\t"
  55550. #endif
  55551. #ifdef WOLFSSL_KEIL
  55552. "adcs r3, r3, r6\n\t"
  55553. #elif defined(__clang__)
  55554. "adcs r3, r6\n\t"
  55555. #else
  55556. "adc r3, r6\n\t"
  55557. #endif
  55558. #ifdef WOLFSSL_KEIL
  55559. "adcs r4, r4, %[r]\n\t"
  55560. #elif defined(__clang__)
  55561. "adcs r4, %[r]\n\t"
  55562. #else
  55563. "adc r4, %[r]\n\t"
  55564. #endif
  55565. "# A[7] * A[2]\n\t"
  55566. "mov %[a], r9\n\t"
  55567. "mov r7, r12\n\t"
  55568. "ldr %[a], [%[a], #28]\n\t"
  55569. "uxth r5, %[a]\n\t"
  55570. "uxth r6, r7\n\t"
  55571. #ifdef WOLFSSL_KEIL
  55572. "muls r6, r5, r6\n\t"
  55573. #elif defined(__clang__)
  55574. "muls r6, r5\n\t"
  55575. #else
  55576. "mul r6, r5\n\t"
  55577. #endif
  55578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55579. "adds r2, r2, r6\n\t"
  55580. #else
  55581. "add r2, r2, r6\n\t"
  55582. #endif
  55583. #ifdef WOLFSSL_KEIL
  55584. "adcs r3, r3, %[r]\n\t"
  55585. #elif defined(__clang__)
  55586. "adcs r3, %[r]\n\t"
  55587. #else
  55588. "adc r3, %[r]\n\t"
  55589. #endif
  55590. #ifdef WOLFSSL_KEIL
  55591. "adcs r4, r4, %[r]\n\t"
  55592. #elif defined(__clang__)
  55593. "adcs r4, %[r]\n\t"
  55594. #else
  55595. "adc r4, %[r]\n\t"
  55596. #endif
  55597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55598. "adds r2, r2, r6\n\t"
  55599. #else
  55600. "add r2, r2, r6\n\t"
  55601. #endif
  55602. #ifdef WOLFSSL_KEIL
  55603. "adcs r3, r3, %[r]\n\t"
  55604. #elif defined(__clang__)
  55605. "adcs r3, %[r]\n\t"
  55606. #else
  55607. "adc r3, %[r]\n\t"
  55608. #endif
  55609. #ifdef WOLFSSL_KEIL
  55610. "adcs r4, r4, %[r]\n\t"
  55611. #elif defined(__clang__)
  55612. "adcs r4, %[r]\n\t"
  55613. #else
  55614. "adc r4, %[r]\n\t"
  55615. #endif
  55616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55617. "lsrs r6, r7, #16\n\t"
  55618. #else
  55619. "lsr r6, r7, #16\n\t"
  55620. #endif
  55621. #ifdef WOLFSSL_KEIL
  55622. "muls r5, r6, r5\n\t"
  55623. #elif defined(__clang__)
  55624. "muls r5, r6\n\t"
  55625. #else
  55626. "mul r5, r6\n\t"
  55627. #endif
  55628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55629. "lsrs r6, r5, #16\n\t"
  55630. #else
  55631. "lsr r6, r5, #16\n\t"
  55632. #endif
  55633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55634. "lsls r5, r5, #16\n\t"
  55635. #else
  55636. "lsl r5, r5, #16\n\t"
  55637. #endif
  55638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55639. "adds r2, r2, r5\n\t"
  55640. #else
  55641. "add r2, r2, r5\n\t"
  55642. #endif
  55643. #ifdef WOLFSSL_KEIL
  55644. "adcs r3, r3, r6\n\t"
  55645. #elif defined(__clang__)
  55646. "adcs r3, r6\n\t"
  55647. #else
  55648. "adc r3, r6\n\t"
  55649. #endif
  55650. #ifdef WOLFSSL_KEIL
  55651. "adcs r4, r4, %[r]\n\t"
  55652. #elif defined(__clang__)
  55653. "adcs r4, %[r]\n\t"
  55654. #else
  55655. "adc r4, %[r]\n\t"
  55656. #endif
  55657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55658. "adds r2, r2, r5\n\t"
  55659. #else
  55660. "add r2, r2, r5\n\t"
  55661. #endif
  55662. #ifdef WOLFSSL_KEIL
  55663. "adcs r3, r3, r6\n\t"
  55664. #elif defined(__clang__)
  55665. "adcs r3, r6\n\t"
  55666. #else
  55667. "adc r3, r6\n\t"
  55668. #endif
  55669. #ifdef WOLFSSL_KEIL
  55670. "adcs r4, r4, %[r]\n\t"
  55671. #elif defined(__clang__)
  55672. "adcs r4, %[r]\n\t"
  55673. #else
  55674. "adc r4, %[r]\n\t"
  55675. #endif
  55676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55677. "lsrs r5, %[a], #16\n\t"
  55678. #else
  55679. "lsr r5, %[a], #16\n\t"
  55680. #endif
  55681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55682. "lsrs r6, r7, #16\n\t"
  55683. #else
  55684. "lsr r6, r7, #16\n\t"
  55685. #endif
  55686. #ifdef WOLFSSL_KEIL
  55687. "muls r6, r5, r6\n\t"
  55688. #elif defined(__clang__)
  55689. "muls r6, r5\n\t"
  55690. #else
  55691. "mul r6, r5\n\t"
  55692. #endif
  55693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55694. "adds r3, r3, r6\n\t"
  55695. #else
  55696. "add r3, r3, r6\n\t"
  55697. #endif
  55698. #ifdef WOLFSSL_KEIL
  55699. "adcs r4, r4, %[r]\n\t"
  55700. #elif defined(__clang__)
  55701. "adcs r4, %[r]\n\t"
  55702. #else
  55703. "adc r4, %[r]\n\t"
  55704. #endif
  55705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55706. "adds r3, r3, r6\n\t"
  55707. #else
  55708. "add r3, r3, r6\n\t"
  55709. #endif
  55710. #ifdef WOLFSSL_KEIL
  55711. "adcs r4, r4, %[r]\n\t"
  55712. #elif defined(__clang__)
  55713. "adcs r4, %[r]\n\t"
  55714. #else
  55715. "adc r4, %[r]\n\t"
  55716. #endif
  55717. "uxth r6, r7\n\t"
  55718. #ifdef WOLFSSL_KEIL
  55719. "muls r5, r6, r5\n\t"
  55720. #elif defined(__clang__)
  55721. "muls r5, r6\n\t"
  55722. #else
  55723. "mul r5, r6\n\t"
  55724. #endif
  55725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55726. "lsrs r6, r5, #16\n\t"
  55727. #else
  55728. "lsr r6, r5, #16\n\t"
  55729. #endif
  55730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55731. "lsls r5, r5, #16\n\t"
  55732. #else
  55733. "lsl r5, r5, #16\n\t"
  55734. #endif
  55735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55736. "adds r2, r2, r5\n\t"
  55737. #else
  55738. "add r2, r2, r5\n\t"
  55739. #endif
  55740. #ifdef WOLFSSL_KEIL
  55741. "adcs r3, r3, r6\n\t"
  55742. #elif defined(__clang__)
  55743. "adcs r3, r6\n\t"
  55744. #else
  55745. "adc r3, r6\n\t"
  55746. #endif
  55747. #ifdef WOLFSSL_KEIL
  55748. "adcs r4, r4, %[r]\n\t"
  55749. #elif defined(__clang__)
  55750. "adcs r4, %[r]\n\t"
  55751. #else
  55752. "adc r4, %[r]\n\t"
  55753. #endif
  55754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55755. "adds r2, r2, r5\n\t"
  55756. #else
  55757. "add r2, r2, r5\n\t"
  55758. #endif
  55759. #ifdef WOLFSSL_KEIL
  55760. "adcs r3, r3, r6\n\t"
  55761. #elif defined(__clang__)
  55762. "adcs r3, r6\n\t"
  55763. #else
  55764. "adc r3, r6\n\t"
  55765. #endif
  55766. #ifdef WOLFSSL_KEIL
  55767. "adcs r4, r4, %[r]\n\t"
  55768. #elif defined(__clang__)
  55769. "adcs r4, %[r]\n\t"
  55770. #else
  55771. "adc r4, %[r]\n\t"
  55772. #endif
  55773. "# A[8] * A[1]\n\t"
  55774. "mov %[a], r9\n\t"
  55775. "mov r7, r11\n\t"
  55776. "ldr %[a], [%[a], #32]\n\t"
  55777. "uxth r5, %[a]\n\t"
  55778. "uxth r6, r7\n\t"
  55779. #ifdef WOLFSSL_KEIL
  55780. "muls r6, r5, r6\n\t"
  55781. #elif defined(__clang__)
  55782. "muls r6, r5\n\t"
  55783. #else
  55784. "mul r6, r5\n\t"
  55785. #endif
  55786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55787. "adds r2, r2, r6\n\t"
  55788. #else
  55789. "add r2, r2, r6\n\t"
  55790. #endif
  55791. #ifdef WOLFSSL_KEIL
  55792. "adcs r3, r3, %[r]\n\t"
  55793. #elif defined(__clang__)
  55794. "adcs r3, %[r]\n\t"
  55795. #else
  55796. "adc r3, %[r]\n\t"
  55797. #endif
  55798. #ifdef WOLFSSL_KEIL
  55799. "adcs r4, r4, %[r]\n\t"
  55800. #elif defined(__clang__)
  55801. "adcs r4, %[r]\n\t"
  55802. #else
  55803. "adc r4, %[r]\n\t"
  55804. #endif
  55805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55806. "adds r2, r2, r6\n\t"
  55807. #else
  55808. "add r2, r2, r6\n\t"
  55809. #endif
  55810. #ifdef WOLFSSL_KEIL
  55811. "adcs r3, r3, %[r]\n\t"
  55812. #elif defined(__clang__)
  55813. "adcs r3, %[r]\n\t"
  55814. #else
  55815. "adc r3, %[r]\n\t"
  55816. #endif
  55817. #ifdef WOLFSSL_KEIL
  55818. "adcs r4, r4, %[r]\n\t"
  55819. #elif defined(__clang__)
  55820. "adcs r4, %[r]\n\t"
  55821. #else
  55822. "adc r4, %[r]\n\t"
  55823. #endif
  55824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55825. "lsrs r6, r7, #16\n\t"
  55826. #else
  55827. "lsr r6, r7, #16\n\t"
  55828. #endif
  55829. #ifdef WOLFSSL_KEIL
  55830. "muls r5, r6, r5\n\t"
  55831. #elif defined(__clang__)
  55832. "muls r5, r6\n\t"
  55833. #else
  55834. "mul r5, r6\n\t"
  55835. #endif
  55836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55837. "lsrs r6, r5, #16\n\t"
  55838. #else
  55839. "lsr r6, r5, #16\n\t"
  55840. #endif
  55841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55842. "lsls r5, r5, #16\n\t"
  55843. #else
  55844. "lsl r5, r5, #16\n\t"
  55845. #endif
  55846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55847. "adds r2, r2, r5\n\t"
  55848. #else
  55849. "add r2, r2, r5\n\t"
  55850. #endif
  55851. #ifdef WOLFSSL_KEIL
  55852. "adcs r3, r3, r6\n\t"
  55853. #elif defined(__clang__)
  55854. "adcs r3, r6\n\t"
  55855. #else
  55856. "adc r3, r6\n\t"
  55857. #endif
  55858. #ifdef WOLFSSL_KEIL
  55859. "adcs r4, r4, %[r]\n\t"
  55860. #elif defined(__clang__)
  55861. "adcs r4, %[r]\n\t"
  55862. #else
  55863. "adc r4, %[r]\n\t"
  55864. #endif
  55865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55866. "adds r2, r2, r5\n\t"
  55867. #else
  55868. "add r2, r2, r5\n\t"
  55869. #endif
  55870. #ifdef WOLFSSL_KEIL
  55871. "adcs r3, r3, r6\n\t"
  55872. #elif defined(__clang__)
  55873. "adcs r3, r6\n\t"
  55874. #else
  55875. "adc r3, r6\n\t"
  55876. #endif
  55877. #ifdef WOLFSSL_KEIL
  55878. "adcs r4, r4, %[r]\n\t"
  55879. #elif defined(__clang__)
  55880. "adcs r4, %[r]\n\t"
  55881. #else
  55882. "adc r4, %[r]\n\t"
  55883. #endif
  55884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55885. "lsrs r5, %[a], #16\n\t"
  55886. #else
  55887. "lsr r5, %[a], #16\n\t"
  55888. #endif
  55889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55890. "lsrs r6, r7, #16\n\t"
  55891. #else
  55892. "lsr r6, r7, #16\n\t"
  55893. #endif
  55894. #ifdef WOLFSSL_KEIL
  55895. "muls r6, r5, r6\n\t"
  55896. #elif defined(__clang__)
  55897. "muls r6, r5\n\t"
  55898. #else
  55899. "mul r6, r5\n\t"
  55900. #endif
  55901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55902. "adds r3, r3, r6\n\t"
  55903. #else
  55904. "add r3, r3, r6\n\t"
  55905. #endif
  55906. #ifdef WOLFSSL_KEIL
  55907. "adcs r4, r4, %[r]\n\t"
  55908. #elif defined(__clang__)
  55909. "adcs r4, %[r]\n\t"
  55910. #else
  55911. "adc r4, %[r]\n\t"
  55912. #endif
  55913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55914. "adds r3, r3, r6\n\t"
  55915. #else
  55916. "add r3, r3, r6\n\t"
  55917. #endif
  55918. #ifdef WOLFSSL_KEIL
  55919. "adcs r4, r4, %[r]\n\t"
  55920. #elif defined(__clang__)
  55921. "adcs r4, %[r]\n\t"
  55922. #else
  55923. "adc r4, %[r]\n\t"
  55924. #endif
  55925. "uxth r6, r7\n\t"
  55926. #ifdef WOLFSSL_KEIL
  55927. "muls r5, r6, r5\n\t"
  55928. #elif defined(__clang__)
  55929. "muls r5, r6\n\t"
  55930. #else
  55931. "mul r5, r6\n\t"
  55932. #endif
  55933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55934. "lsrs r6, r5, #16\n\t"
  55935. #else
  55936. "lsr r6, r5, #16\n\t"
  55937. #endif
  55938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55939. "lsls r5, r5, #16\n\t"
  55940. #else
  55941. "lsl r5, r5, #16\n\t"
  55942. #endif
  55943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55944. "adds r2, r2, r5\n\t"
  55945. #else
  55946. "add r2, r2, r5\n\t"
  55947. #endif
  55948. #ifdef WOLFSSL_KEIL
  55949. "adcs r3, r3, r6\n\t"
  55950. #elif defined(__clang__)
  55951. "adcs r3, r6\n\t"
  55952. #else
  55953. "adc r3, r6\n\t"
  55954. #endif
  55955. #ifdef WOLFSSL_KEIL
  55956. "adcs r4, r4, %[r]\n\t"
  55957. #elif defined(__clang__)
  55958. "adcs r4, %[r]\n\t"
  55959. #else
  55960. "adc r4, %[r]\n\t"
  55961. #endif
  55962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55963. "adds r2, r2, r5\n\t"
  55964. #else
  55965. "add r2, r2, r5\n\t"
  55966. #endif
  55967. #ifdef WOLFSSL_KEIL
  55968. "adcs r3, r3, r6\n\t"
  55969. #elif defined(__clang__)
  55970. "adcs r3, r6\n\t"
  55971. #else
  55972. "adc r3, r6\n\t"
  55973. #endif
  55974. #ifdef WOLFSSL_KEIL
  55975. "adcs r4, r4, %[r]\n\t"
  55976. #elif defined(__clang__)
  55977. "adcs r4, %[r]\n\t"
  55978. #else
  55979. "adc r4, %[r]\n\t"
  55980. #endif
  55981. "# A[9] * A[0]\n\t"
  55982. "mov %[a], r9\n\t"
  55983. "mov r7, r10\n\t"
  55984. "ldr %[a], [%[a], #36]\n\t"
  55985. "uxth r5, %[a]\n\t"
  55986. "uxth r6, r7\n\t"
  55987. #ifdef WOLFSSL_KEIL
  55988. "muls r6, r5, r6\n\t"
  55989. #elif defined(__clang__)
  55990. "muls r6, r5\n\t"
  55991. #else
  55992. "mul r6, r5\n\t"
  55993. #endif
  55994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55995. "adds r2, r2, r6\n\t"
  55996. #else
  55997. "add r2, r2, r6\n\t"
  55998. #endif
  55999. #ifdef WOLFSSL_KEIL
  56000. "adcs r3, r3, %[r]\n\t"
  56001. #elif defined(__clang__)
  56002. "adcs r3, %[r]\n\t"
  56003. #else
  56004. "adc r3, %[r]\n\t"
  56005. #endif
  56006. #ifdef WOLFSSL_KEIL
  56007. "adcs r4, r4, %[r]\n\t"
  56008. #elif defined(__clang__)
  56009. "adcs r4, %[r]\n\t"
  56010. #else
  56011. "adc r4, %[r]\n\t"
  56012. #endif
  56013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56014. "adds r2, r2, r6\n\t"
  56015. #else
  56016. "add r2, r2, r6\n\t"
  56017. #endif
  56018. #ifdef WOLFSSL_KEIL
  56019. "adcs r3, r3, %[r]\n\t"
  56020. #elif defined(__clang__)
  56021. "adcs r3, %[r]\n\t"
  56022. #else
  56023. "adc r3, %[r]\n\t"
  56024. #endif
  56025. #ifdef WOLFSSL_KEIL
  56026. "adcs r4, r4, %[r]\n\t"
  56027. #elif defined(__clang__)
  56028. "adcs r4, %[r]\n\t"
  56029. #else
  56030. "adc r4, %[r]\n\t"
  56031. #endif
  56032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56033. "lsrs r6, r7, #16\n\t"
  56034. #else
  56035. "lsr r6, r7, #16\n\t"
  56036. #endif
  56037. #ifdef WOLFSSL_KEIL
  56038. "muls r5, r6, r5\n\t"
  56039. #elif defined(__clang__)
  56040. "muls r5, r6\n\t"
  56041. #else
  56042. "mul r5, r6\n\t"
  56043. #endif
  56044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56045. "lsrs r6, r5, #16\n\t"
  56046. #else
  56047. "lsr r6, r5, #16\n\t"
  56048. #endif
  56049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56050. "lsls r5, r5, #16\n\t"
  56051. #else
  56052. "lsl r5, r5, #16\n\t"
  56053. #endif
  56054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56055. "adds r2, r2, r5\n\t"
  56056. #else
  56057. "add r2, r2, r5\n\t"
  56058. #endif
  56059. #ifdef WOLFSSL_KEIL
  56060. "adcs r3, r3, r6\n\t"
  56061. #elif defined(__clang__)
  56062. "adcs r3, r6\n\t"
  56063. #else
  56064. "adc r3, r6\n\t"
  56065. #endif
  56066. #ifdef WOLFSSL_KEIL
  56067. "adcs r4, r4, %[r]\n\t"
  56068. #elif defined(__clang__)
  56069. "adcs r4, %[r]\n\t"
  56070. #else
  56071. "adc r4, %[r]\n\t"
  56072. #endif
  56073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56074. "adds r2, r2, r5\n\t"
  56075. #else
  56076. "add r2, r2, r5\n\t"
  56077. #endif
  56078. #ifdef WOLFSSL_KEIL
  56079. "adcs r3, r3, r6\n\t"
  56080. #elif defined(__clang__)
  56081. "adcs r3, r6\n\t"
  56082. #else
  56083. "adc r3, r6\n\t"
  56084. #endif
  56085. #ifdef WOLFSSL_KEIL
  56086. "adcs r4, r4, %[r]\n\t"
  56087. #elif defined(__clang__)
  56088. "adcs r4, %[r]\n\t"
  56089. #else
  56090. "adc r4, %[r]\n\t"
  56091. #endif
  56092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56093. "lsrs r5, %[a], #16\n\t"
  56094. #else
  56095. "lsr r5, %[a], #16\n\t"
  56096. #endif
  56097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56098. "lsrs r6, r7, #16\n\t"
  56099. #else
  56100. "lsr r6, r7, #16\n\t"
  56101. #endif
  56102. #ifdef WOLFSSL_KEIL
  56103. "muls r6, r5, r6\n\t"
  56104. #elif defined(__clang__)
  56105. "muls r6, r5\n\t"
  56106. #else
  56107. "mul r6, r5\n\t"
  56108. #endif
  56109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56110. "adds r3, r3, r6\n\t"
  56111. #else
  56112. "add r3, r3, r6\n\t"
  56113. #endif
  56114. #ifdef WOLFSSL_KEIL
  56115. "adcs r4, r4, %[r]\n\t"
  56116. #elif defined(__clang__)
  56117. "adcs r4, %[r]\n\t"
  56118. #else
  56119. "adc r4, %[r]\n\t"
  56120. #endif
  56121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56122. "adds r3, r3, r6\n\t"
  56123. #else
  56124. "add r3, r3, r6\n\t"
  56125. #endif
  56126. #ifdef WOLFSSL_KEIL
  56127. "adcs r4, r4, %[r]\n\t"
  56128. #elif defined(__clang__)
  56129. "adcs r4, %[r]\n\t"
  56130. #else
  56131. "adc r4, %[r]\n\t"
  56132. #endif
  56133. "uxth r6, r7\n\t"
  56134. #ifdef WOLFSSL_KEIL
  56135. "muls r5, r6, r5\n\t"
  56136. #elif defined(__clang__)
  56137. "muls r5, r6\n\t"
  56138. #else
  56139. "mul r5, r6\n\t"
  56140. #endif
  56141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56142. "lsrs r6, r5, #16\n\t"
  56143. #else
  56144. "lsr r6, r5, #16\n\t"
  56145. #endif
  56146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56147. "lsls r5, r5, #16\n\t"
  56148. #else
  56149. "lsl r5, r5, #16\n\t"
  56150. #endif
  56151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56152. "adds r2, r2, r5\n\t"
  56153. #else
  56154. "add r2, r2, r5\n\t"
  56155. #endif
  56156. #ifdef WOLFSSL_KEIL
  56157. "adcs r3, r3, r6\n\t"
  56158. #elif defined(__clang__)
  56159. "adcs r3, r6\n\t"
  56160. #else
  56161. "adc r3, r6\n\t"
  56162. #endif
  56163. #ifdef WOLFSSL_KEIL
  56164. "adcs r4, r4, %[r]\n\t"
  56165. #elif defined(__clang__)
  56166. "adcs r4, %[r]\n\t"
  56167. #else
  56168. "adc r4, %[r]\n\t"
  56169. #endif
  56170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56171. "adds r2, r2, r5\n\t"
  56172. #else
  56173. "add r2, r2, r5\n\t"
  56174. #endif
  56175. #ifdef WOLFSSL_KEIL
  56176. "adcs r3, r3, r6\n\t"
  56177. #elif defined(__clang__)
  56178. "adcs r3, r6\n\t"
  56179. #else
  56180. "adc r3, r6\n\t"
  56181. #endif
  56182. #ifdef WOLFSSL_KEIL
  56183. "adcs r4, r4, %[r]\n\t"
  56184. #elif defined(__clang__)
  56185. "adcs r4, %[r]\n\t"
  56186. #else
  56187. "adc r4, %[r]\n\t"
  56188. #endif
  56189. "str r2, [sp, #36]\n\t"
  56190. "# A[10] * A[0]\n\t"
  56191. "movs r2, #0\n\t"
  56192. "mov %[a], r9\n\t"
  56193. "ldr %[a], [%[a], #40]\n\t"
  56194. "uxth r5, %[a]\n\t"
  56195. "uxth r6, r7\n\t"
  56196. #ifdef WOLFSSL_KEIL
  56197. "muls r6, r5, r6\n\t"
  56198. #elif defined(__clang__)
  56199. "muls r6, r5\n\t"
  56200. #else
  56201. "mul r6, r5\n\t"
  56202. #endif
  56203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56204. "adds r3, r3, r6\n\t"
  56205. #else
  56206. "add r3, r3, r6\n\t"
  56207. #endif
  56208. #ifdef WOLFSSL_KEIL
  56209. "adcs r4, r4, %[r]\n\t"
  56210. #elif defined(__clang__)
  56211. "adcs r4, %[r]\n\t"
  56212. #else
  56213. "adc r4, %[r]\n\t"
  56214. #endif
  56215. #ifdef WOLFSSL_KEIL
  56216. "adcs r2, r2, %[r]\n\t"
  56217. #elif defined(__clang__)
  56218. "adcs r2, %[r]\n\t"
  56219. #else
  56220. "adc r2, %[r]\n\t"
  56221. #endif
  56222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56223. "adds r3, r3, r6\n\t"
  56224. #else
  56225. "add r3, r3, r6\n\t"
  56226. #endif
  56227. #ifdef WOLFSSL_KEIL
  56228. "adcs r4, r4, %[r]\n\t"
  56229. #elif defined(__clang__)
  56230. "adcs r4, %[r]\n\t"
  56231. #else
  56232. "adc r4, %[r]\n\t"
  56233. #endif
  56234. #ifdef WOLFSSL_KEIL
  56235. "adcs r2, r2, %[r]\n\t"
  56236. #elif defined(__clang__)
  56237. "adcs r2, %[r]\n\t"
  56238. #else
  56239. "adc r2, %[r]\n\t"
  56240. #endif
  56241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56242. "lsrs r6, r7, #16\n\t"
  56243. #else
  56244. "lsr r6, r7, #16\n\t"
  56245. #endif
  56246. #ifdef WOLFSSL_KEIL
  56247. "muls r5, r6, r5\n\t"
  56248. #elif defined(__clang__)
  56249. "muls r5, r6\n\t"
  56250. #else
  56251. "mul r5, r6\n\t"
  56252. #endif
  56253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56254. "lsrs r6, r5, #16\n\t"
  56255. #else
  56256. "lsr r6, r5, #16\n\t"
  56257. #endif
  56258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56259. "lsls r5, r5, #16\n\t"
  56260. #else
  56261. "lsl r5, r5, #16\n\t"
  56262. #endif
  56263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56264. "adds r3, r3, r5\n\t"
  56265. #else
  56266. "add r3, r3, r5\n\t"
  56267. #endif
  56268. #ifdef WOLFSSL_KEIL
  56269. "adcs r4, r4, r6\n\t"
  56270. #elif defined(__clang__)
  56271. "adcs r4, r6\n\t"
  56272. #else
  56273. "adc r4, r6\n\t"
  56274. #endif
  56275. #ifdef WOLFSSL_KEIL
  56276. "adcs r2, r2, %[r]\n\t"
  56277. #elif defined(__clang__)
  56278. "adcs r2, %[r]\n\t"
  56279. #else
  56280. "adc r2, %[r]\n\t"
  56281. #endif
  56282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56283. "adds r3, r3, r5\n\t"
  56284. #else
  56285. "add r3, r3, r5\n\t"
  56286. #endif
  56287. #ifdef WOLFSSL_KEIL
  56288. "adcs r4, r4, r6\n\t"
  56289. #elif defined(__clang__)
  56290. "adcs r4, r6\n\t"
  56291. #else
  56292. "adc r4, r6\n\t"
  56293. #endif
  56294. #ifdef WOLFSSL_KEIL
  56295. "adcs r2, r2, %[r]\n\t"
  56296. #elif defined(__clang__)
  56297. "adcs r2, %[r]\n\t"
  56298. #else
  56299. "adc r2, %[r]\n\t"
  56300. #endif
  56301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56302. "lsrs r5, %[a], #16\n\t"
  56303. #else
  56304. "lsr r5, %[a], #16\n\t"
  56305. #endif
  56306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56307. "lsrs r6, r7, #16\n\t"
  56308. #else
  56309. "lsr r6, r7, #16\n\t"
  56310. #endif
  56311. #ifdef WOLFSSL_KEIL
  56312. "muls r6, r5, r6\n\t"
  56313. #elif defined(__clang__)
  56314. "muls r6, r5\n\t"
  56315. #else
  56316. "mul r6, r5\n\t"
  56317. #endif
  56318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56319. "adds r4, r4, r6\n\t"
  56320. #else
  56321. "add r4, r4, r6\n\t"
  56322. #endif
  56323. #ifdef WOLFSSL_KEIL
  56324. "adcs r2, r2, %[r]\n\t"
  56325. #elif defined(__clang__)
  56326. "adcs r2, %[r]\n\t"
  56327. #else
  56328. "adc r2, %[r]\n\t"
  56329. #endif
  56330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56331. "adds r4, r4, r6\n\t"
  56332. #else
  56333. "add r4, r4, r6\n\t"
  56334. #endif
  56335. #ifdef WOLFSSL_KEIL
  56336. "adcs r2, r2, %[r]\n\t"
  56337. #elif defined(__clang__)
  56338. "adcs r2, %[r]\n\t"
  56339. #else
  56340. "adc r2, %[r]\n\t"
  56341. #endif
  56342. "uxth r6, r7\n\t"
  56343. #ifdef WOLFSSL_KEIL
  56344. "muls r5, r6, r5\n\t"
  56345. #elif defined(__clang__)
  56346. "muls r5, r6\n\t"
  56347. #else
  56348. "mul r5, r6\n\t"
  56349. #endif
  56350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56351. "lsrs r6, r5, #16\n\t"
  56352. #else
  56353. "lsr r6, r5, #16\n\t"
  56354. #endif
  56355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56356. "lsls r5, r5, #16\n\t"
  56357. #else
  56358. "lsl r5, r5, #16\n\t"
  56359. #endif
  56360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56361. "adds r3, r3, r5\n\t"
  56362. #else
  56363. "add r3, r3, r5\n\t"
  56364. #endif
  56365. #ifdef WOLFSSL_KEIL
  56366. "adcs r4, r4, r6\n\t"
  56367. #elif defined(__clang__)
  56368. "adcs r4, r6\n\t"
  56369. #else
  56370. "adc r4, r6\n\t"
  56371. #endif
  56372. #ifdef WOLFSSL_KEIL
  56373. "adcs r2, r2, %[r]\n\t"
  56374. #elif defined(__clang__)
  56375. "adcs r2, %[r]\n\t"
  56376. #else
  56377. "adc r2, %[r]\n\t"
  56378. #endif
  56379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56380. "adds r3, r3, r5\n\t"
  56381. #else
  56382. "add r3, r3, r5\n\t"
  56383. #endif
  56384. #ifdef WOLFSSL_KEIL
  56385. "adcs r4, r4, r6\n\t"
  56386. #elif defined(__clang__)
  56387. "adcs r4, r6\n\t"
  56388. #else
  56389. "adc r4, r6\n\t"
  56390. #endif
  56391. #ifdef WOLFSSL_KEIL
  56392. "adcs r2, r2, %[r]\n\t"
  56393. #elif defined(__clang__)
  56394. "adcs r2, %[r]\n\t"
  56395. #else
  56396. "adc r2, %[r]\n\t"
  56397. #endif
  56398. "# A[9] * A[1]\n\t"
  56399. "mov %[a], r9\n\t"
  56400. "mov r7, r11\n\t"
  56401. "ldr %[a], [%[a], #36]\n\t"
  56402. "uxth r5, %[a]\n\t"
  56403. "uxth r6, r7\n\t"
  56404. #ifdef WOLFSSL_KEIL
  56405. "muls r6, r5, r6\n\t"
  56406. #elif defined(__clang__)
  56407. "muls r6, r5\n\t"
  56408. #else
  56409. "mul r6, r5\n\t"
  56410. #endif
  56411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56412. "adds r3, r3, r6\n\t"
  56413. #else
  56414. "add r3, r3, r6\n\t"
  56415. #endif
  56416. #ifdef WOLFSSL_KEIL
  56417. "adcs r4, r4, %[r]\n\t"
  56418. #elif defined(__clang__)
  56419. "adcs r4, %[r]\n\t"
  56420. #else
  56421. "adc r4, %[r]\n\t"
  56422. #endif
  56423. #ifdef WOLFSSL_KEIL
  56424. "adcs r2, r2, %[r]\n\t"
  56425. #elif defined(__clang__)
  56426. "adcs r2, %[r]\n\t"
  56427. #else
  56428. "adc r2, %[r]\n\t"
  56429. #endif
  56430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56431. "adds r3, r3, r6\n\t"
  56432. #else
  56433. "add r3, r3, r6\n\t"
  56434. #endif
  56435. #ifdef WOLFSSL_KEIL
  56436. "adcs r4, r4, %[r]\n\t"
  56437. #elif defined(__clang__)
  56438. "adcs r4, %[r]\n\t"
  56439. #else
  56440. "adc r4, %[r]\n\t"
  56441. #endif
  56442. #ifdef WOLFSSL_KEIL
  56443. "adcs r2, r2, %[r]\n\t"
  56444. #elif defined(__clang__)
  56445. "adcs r2, %[r]\n\t"
  56446. #else
  56447. "adc r2, %[r]\n\t"
  56448. #endif
  56449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56450. "lsrs r6, r7, #16\n\t"
  56451. #else
  56452. "lsr r6, r7, #16\n\t"
  56453. #endif
  56454. #ifdef WOLFSSL_KEIL
  56455. "muls r5, r6, r5\n\t"
  56456. #elif defined(__clang__)
  56457. "muls r5, r6\n\t"
  56458. #else
  56459. "mul r5, r6\n\t"
  56460. #endif
  56461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56462. "lsrs r6, r5, #16\n\t"
  56463. #else
  56464. "lsr r6, r5, #16\n\t"
  56465. #endif
  56466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56467. "lsls r5, r5, #16\n\t"
  56468. #else
  56469. "lsl r5, r5, #16\n\t"
  56470. #endif
  56471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56472. "adds r3, r3, r5\n\t"
  56473. #else
  56474. "add r3, r3, r5\n\t"
  56475. #endif
  56476. #ifdef WOLFSSL_KEIL
  56477. "adcs r4, r4, r6\n\t"
  56478. #elif defined(__clang__)
  56479. "adcs r4, r6\n\t"
  56480. #else
  56481. "adc r4, r6\n\t"
  56482. #endif
  56483. #ifdef WOLFSSL_KEIL
  56484. "adcs r2, r2, %[r]\n\t"
  56485. #elif defined(__clang__)
  56486. "adcs r2, %[r]\n\t"
  56487. #else
  56488. "adc r2, %[r]\n\t"
  56489. #endif
  56490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56491. "adds r3, r3, r5\n\t"
  56492. #else
  56493. "add r3, r3, r5\n\t"
  56494. #endif
  56495. #ifdef WOLFSSL_KEIL
  56496. "adcs r4, r4, r6\n\t"
  56497. #elif defined(__clang__)
  56498. "adcs r4, r6\n\t"
  56499. #else
  56500. "adc r4, r6\n\t"
  56501. #endif
  56502. #ifdef WOLFSSL_KEIL
  56503. "adcs r2, r2, %[r]\n\t"
  56504. #elif defined(__clang__)
  56505. "adcs r2, %[r]\n\t"
  56506. #else
  56507. "adc r2, %[r]\n\t"
  56508. #endif
  56509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56510. "lsrs r5, %[a], #16\n\t"
  56511. #else
  56512. "lsr r5, %[a], #16\n\t"
  56513. #endif
  56514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56515. "lsrs r6, r7, #16\n\t"
  56516. #else
  56517. "lsr r6, r7, #16\n\t"
  56518. #endif
  56519. #ifdef WOLFSSL_KEIL
  56520. "muls r6, r5, r6\n\t"
  56521. #elif defined(__clang__)
  56522. "muls r6, r5\n\t"
  56523. #else
  56524. "mul r6, r5\n\t"
  56525. #endif
  56526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56527. "adds r4, r4, r6\n\t"
  56528. #else
  56529. "add r4, 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. "adds r4, r4, r6\n\t"
  56540. #else
  56541. "add r4, r4, r6\n\t"
  56542. #endif
  56543. #ifdef WOLFSSL_KEIL
  56544. "adcs r2, r2, %[r]\n\t"
  56545. #elif defined(__clang__)
  56546. "adcs r2, %[r]\n\t"
  56547. #else
  56548. "adc r2, %[r]\n\t"
  56549. #endif
  56550. "uxth r6, r7\n\t"
  56551. #ifdef WOLFSSL_KEIL
  56552. "muls r5, r6, r5\n\t"
  56553. #elif defined(__clang__)
  56554. "muls r5, r6\n\t"
  56555. #else
  56556. "mul r5, r6\n\t"
  56557. #endif
  56558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56559. "lsrs r6, r5, #16\n\t"
  56560. #else
  56561. "lsr r6, r5, #16\n\t"
  56562. #endif
  56563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56564. "lsls r5, r5, #16\n\t"
  56565. #else
  56566. "lsl r5, r5, #16\n\t"
  56567. #endif
  56568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56569. "adds r3, r3, r5\n\t"
  56570. #else
  56571. "add r3, r3, r5\n\t"
  56572. #endif
  56573. #ifdef WOLFSSL_KEIL
  56574. "adcs r4, r4, r6\n\t"
  56575. #elif defined(__clang__)
  56576. "adcs r4, r6\n\t"
  56577. #else
  56578. "adc r4, r6\n\t"
  56579. #endif
  56580. #ifdef WOLFSSL_KEIL
  56581. "adcs r2, r2, %[r]\n\t"
  56582. #elif defined(__clang__)
  56583. "adcs r2, %[r]\n\t"
  56584. #else
  56585. "adc r2, %[r]\n\t"
  56586. #endif
  56587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56588. "adds r3, r3, r5\n\t"
  56589. #else
  56590. "add r3, r3, r5\n\t"
  56591. #endif
  56592. #ifdef WOLFSSL_KEIL
  56593. "adcs r4, r4, r6\n\t"
  56594. #elif defined(__clang__)
  56595. "adcs r4, r6\n\t"
  56596. #else
  56597. "adc 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. "# A[8] * A[2]\n\t"
  56607. "mov %[a], r9\n\t"
  56608. "mov r7, r12\n\t"
  56609. "ldr %[a], [%[a], #32]\n\t"
  56610. "uxth r5, %[a]\n\t"
  56611. "uxth r6, r7\n\t"
  56612. #ifdef WOLFSSL_KEIL
  56613. "muls r6, r5, r6\n\t"
  56614. #elif defined(__clang__)
  56615. "muls r6, r5\n\t"
  56616. #else
  56617. "mul r6, r5\n\t"
  56618. #endif
  56619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56620. "adds r3, r3, r6\n\t"
  56621. #else
  56622. "add r3, r3, r6\n\t"
  56623. #endif
  56624. #ifdef WOLFSSL_KEIL
  56625. "adcs r4, r4, %[r]\n\t"
  56626. #elif defined(__clang__)
  56627. "adcs r4, %[r]\n\t"
  56628. #else
  56629. "adc r4, %[r]\n\t"
  56630. #endif
  56631. #ifdef WOLFSSL_KEIL
  56632. "adcs r2, r2, %[r]\n\t"
  56633. #elif defined(__clang__)
  56634. "adcs r2, %[r]\n\t"
  56635. #else
  56636. "adc r2, %[r]\n\t"
  56637. #endif
  56638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56639. "adds r3, r3, r6\n\t"
  56640. #else
  56641. "add r3, r3, r6\n\t"
  56642. #endif
  56643. #ifdef WOLFSSL_KEIL
  56644. "adcs r4, r4, %[r]\n\t"
  56645. #elif defined(__clang__)
  56646. "adcs r4, %[r]\n\t"
  56647. #else
  56648. "adc r4, %[r]\n\t"
  56649. #endif
  56650. #ifdef WOLFSSL_KEIL
  56651. "adcs r2, r2, %[r]\n\t"
  56652. #elif defined(__clang__)
  56653. "adcs r2, %[r]\n\t"
  56654. #else
  56655. "adc r2, %[r]\n\t"
  56656. #endif
  56657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56658. "lsrs r6, r7, #16\n\t"
  56659. #else
  56660. "lsr r6, r7, #16\n\t"
  56661. #endif
  56662. #ifdef WOLFSSL_KEIL
  56663. "muls r5, r6, r5\n\t"
  56664. #elif defined(__clang__)
  56665. "muls r5, r6\n\t"
  56666. #else
  56667. "mul r5, r6\n\t"
  56668. #endif
  56669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56670. "lsrs r6, r5, #16\n\t"
  56671. #else
  56672. "lsr r6, r5, #16\n\t"
  56673. #endif
  56674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56675. "lsls r5, r5, #16\n\t"
  56676. #else
  56677. "lsl r5, r5, #16\n\t"
  56678. #endif
  56679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56680. "adds r3, r3, r5\n\t"
  56681. #else
  56682. "add r3, r3, r5\n\t"
  56683. #endif
  56684. #ifdef WOLFSSL_KEIL
  56685. "adcs r4, r4, r6\n\t"
  56686. #elif defined(__clang__)
  56687. "adcs r4, r6\n\t"
  56688. #else
  56689. "adc r4, r6\n\t"
  56690. #endif
  56691. #ifdef WOLFSSL_KEIL
  56692. "adcs r2, r2, %[r]\n\t"
  56693. #elif defined(__clang__)
  56694. "adcs r2, %[r]\n\t"
  56695. #else
  56696. "adc r2, %[r]\n\t"
  56697. #endif
  56698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56699. "adds r3, r3, r5\n\t"
  56700. #else
  56701. "add r3, r3, r5\n\t"
  56702. #endif
  56703. #ifdef WOLFSSL_KEIL
  56704. "adcs r4, r4, r6\n\t"
  56705. #elif defined(__clang__)
  56706. "adcs r4, r6\n\t"
  56707. #else
  56708. "adc r4, r6\n\t"
  56709. #endif
  56710. #ifdef WOLFSSL_KEIL
  56711. "adcs r2, r2, %[r]\n\t"
  56712. #elif defined(__clang__)
  56713. "adcs r2, %[r]\n\t"
  56714. #else
  56715. "adc r2, %[r]\n\t"
  56716. #endif
  56717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56718. "lsrs r5, %[a], #16\n\t"
  56719. #else
  56720. "lsr r5, %[a], #16\n\t"
  56721. #endif
  56722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56723. "lsrs r6, r7, #16\n\t"
  56724. #else
  56725. "lsr r6, r7, #16\n\t"
  56726. #endif
  56727. #ifdef WOLFSSL_KEIL
  56728. "muls r6, r5, r6\n\t"
  56729. #elif defined(__clang__)
  56730. "muls r6, r5\n\t"
  56731. #else
  56732. "mul r6, r5\n\t"
  56733. #endif
  56734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56735. "adds r4, r4, r6\n\t"
  56736. #else
  56737. "add r4, r4, r6\n\t"
  56738. #endif
  56739. #ifdef WOLFSSL_KEIL
  56740. "adcs r2, r2, %[r]\n\t"
  56741. #elif defined(__clang__)
  56742. "adcs r2, %[r]\n\t"
  56743. #else
  56744. "adc r2, %[r]\n\t"
  56745. #endif
  56746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56747. "adds r4, r4, r6\n\t"
  56748. #else
  56749. "add r4, r4, r6\n\t"
  56750. #endif
  56751. #ifdef WOLFSSL_KEIL
  56752. "adcs r2, r2, %[r]\n\t"
  56753. #elif defined(__clang__)
  56754. "adcs r2, %[r]\n\t"
  56755. #else
  56756. "adc r2, %[r]\n\t"
  56757. #endif
  56758. "uxth r6, r7\n\t"
  56759. #ifdef WOLFSSL_KEIL
  56760. "muls r5, r6, r5\n\t"
  56761. #elif defined(__clang__)
  56762. "muls r5, r6\n\t"
  56763. #else
  56764. "mul r5, r6\n\t"
  56765. #endif
  56766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56767. "lsrs r6, r5, #16\n\t"
  56768. #else
  56769. "lsr r6, r5, #16\n\t"
  56770. #endif
  56771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56772. "lsls r5, r5, #16\n\t"
  56773. #else
  56774. "lsl r5, r5, #16\n\t"
  56775. #endif
  56776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56777. "adds r3, r3, r5\n\t"
  56778. #else
  56779. "add r3, r3, r5\n\t"
  56780. #endif
  56781. #ifdef WOLFSSL_KEIL
  56782. "adcs r4, r4, r6\n\t"
  56783. #elif defined(__clang__)
  56784. "adcs r4, r6\n\t"
  56785. #else
  56786. "adc r4, r6\n\t"
  56787. #endif
  56788. #ifdef WOLFSSL_KEIL
  56789. "adcs r2, r2, %[r]\n\t"
  56790. #elif defined(__clang__)
  56791. "adcs r2, %[r]\n\t"
  56792. #else
  56793. "adc r2, %[r]\n\t"
  56794. #endif
  56795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56796. "adds r3, r3, r5\n\t"
  56797. #else
  56798. "add r3, r3, r5\n\t"
  56799. #endif
  56800. #ifdef WOLFSSL_KEIL
  56801. "adcs r4, r4, r6\n\t"
  56802. #elif defined(__clang__)
  56803. "adcs r4, r6\n\t"
  56804. #else
  56805. "adc 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. "# A[7] * A[3]\n\t"
  56815. "mov %[a], r9\n\t"
  56816. "mov r7, lr\n\t"
  56817. "ldr %[a], [%[a], #28]\n\t"
  56818. "uxth r5, %[a]\n\t"
  56819. "uxth r6, r7\n\t"
  56820. #ifdef WOLFSSL_KEIL
  56821. "muls r6, r5, r6\n\t"
  56822. #elif defined(__clang__)
  56823. "muls r6, r5\n\t"
  56824. #else
  56825. "mul r6, r5\n\t"
  56826. #endif
  56827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56828. "adds r3, r3, r6\n\t"
  56829. #else
  56830. "add r3, r3, r6\n\t"
  56831. #endif
  56832. #ifdef WOLFSSL_KEIL
  56833. "adcs r4, r4, %[r]\n\t"
  56834. #elif defined(__clang__)
  56835. "adcs r4, %[r]\n\t"
  56836. #else
  56837. "adc r4, %[r]\n\t"
  56838. #endif
  56839. #ifdef WOLFSSL_KEIL
  56840. "adcs r2, r2, %[r]\n\t"
  56841. #elif defined(__clang__)
  56842. "adcs r2, %[r]\n\t"
  56843. #else
  56844. "adc r2, %[r]\n\t"
  56845. #endif
  56846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56847. "adds r3, r3, r6\n\t"
  56848. #else
  56849. "add r3, r3, r6\n\t"
  56850. #endif
  56851. #ifdef WOLFSSL_KEIL
  56852. "adcs r4, r4, %[r]\n\t"
  56853. #elif defined(__clang__)
  56854. "adcs r4, %[r]\n\t"
  56855. #else
  56856. "adc r4, %[r]\n\t"
  56857. #endif
  56858. #ifdef WOLFSSL_KEIL
  56859. "adcs r2, r2, %[r]\n\t"
  56860. #elif defined(__clang__)
  56861. "adcs r2, %[r]\n\t"
  56862. #else
  56863. "adc r2, %[r]\n\t"
  56864. #endif
  56865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56866. "lsrs r6, r7, #16\n\t"
  56867. #else
  56868. "lsr r6, r7, #16\n\t"
  56869. #endif
  56870. #ifdef WOLFSSL_KEIL
  56871. "muls r5, r6, r5\n\t"
  56872. #elif defined(__clang__)
  56873. "muls r5, r6\n\t"
  56874. #else
  56875. "mul r5, r6\n\t"
  56876. #endif
  56877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56878. "lsrs r6, r5, #16\n\t"
  56879. #else
  56880. "lsr r6, r5, #16\n\t"
  56881. #endif
  56882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56883. "lsls r5, r5, #16\n\t"
  56884. #else
  56885. "lsl r5, r5, #16\n\t"
  56886. #endif
  56887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56888. "adds r3, r3, r5\n\t"
  56889. #else
  56890. "add r3, r3, r5\n\t"
  56891. #endif
  56892. #ifdef WOLFSSL_KEIL
  56893. "adcs r4, r4, r6\n\t"
  56894. #elif defined(__clang__)
  56895. "adcs r4, r6\n\t"
  56896. #else
  56897. "adc r4, r6\n\t"
  56898. #endif
  56899. #ifdef WOLFSSL_KEIL
  56900. "adcs r2, r2, %[r]\n\t"
  56901. #elif defined(__clang__)
  56902. "adcs r2, %[r]\n\t"
  56903. #else
  56904. "adc r2, %[r]\n\t"
  56905. #endif
  56906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56907. "adds r3, r3, r5\n\t"
  56908. #else
  56909. "add r3, r3, r5\n\t"
  56910. #endif
  56911. #ifdef WOLFSSL_KEIL
  56912. "adcs r4, r4, r6\n\t"
  56913. #elif defined(__clang__)
  56914. "adcs r4, r6\n\t"
  56915. #else
  56916. "adc r4, r6\n\t"
  56917. #endif
  56918. #ifdef WOLFSSL_KEIL
  56919. "adcs r2, r2, %[r]\n\t"
  56920. #elif defined(__clang__)
  56921. "adcs r2, %[r]\n\t"
  56922. #else
  56923. "adc r2, %[r]\n\t"
  56924. #endif
  56925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56926. "lsrs r5, %[a], #16\n\t"
  56927. #else
  56928. "lsr r5, %[a], #16\n\t"
  56929. #endif
  56930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56931. "lsrs r6, r7, #16\n\t"
  56932. #else
  56933. "lsr r6, r7, #16\n\t"
  56934. #endif
  56935. #ifdef WOLFSSL_KEIL
  56936. "muls r6, r5, r6\n\t"
  56937. #elif defined(__clang__)
  56938. "muls r6, r5\n\t"
  56939. #else
  56940. "mul r6, r5\n\t"
  56941. #endif
  56942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56943. "adds r4, r4, r6\n\t"
  56944. #else
  56945. "add r4, r4, r6\n\t"
  56946. #endif
  56947. #ifdef WOLFSSL_KEIL
  56948. "adcs r2, r2, %[r]\n\t"
  56949. #elif defined(__clang__)
  56950. "adcs r2, %[r]\n\t"
  56951. #else
  56952. "adc r2, %[r]\n\t"
  56953. #endif
  56954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56955. "adds r4, r4, r6\n\t"
  56956. #else
  56957. "add r4, r4, r6\n\t"
  56958. #endif
  56959. #ifdef WOLFSSL_KEIL
  56960. "adcs r2, r2, %[r]\n\t"
  56961. #elif defined(__clang__)
  56962. "adcs r2, %[r]\n\t"
  56963. #else
  56964. "adc r2, %[r]\n\t"
  56965. #endif
  56966. "uxth r6, r7\n\t"
  56967. #ifdef WOLFSSL_KEIL
  56968. "muls r5, r6, r5\n\t"
  56969. #elif defined(__clang__)
  56970. "muls r5, r6\n\t"
  56971. #else
  56972. "mul r5, r6\n\t"
  56973. #endif
  56974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56975. "lsrs r6, r5, #16\n\t"
  56976. #else
  56977. "lsr r6, r5, #16\n\t"
  56978. #endif
  56979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56980. "lsls r5, r5, #16\n\t"
  56981. #else
  56982. "lsl r5, r5, #16\n\t"
  56983. #endif
  56984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56985. "adds r3, r3, r5\n\t"
  56986. #else
  56987. "add r3, r3, r5\n\t"
  56988. #endif
  56989. #ifdef WOLFSSL_KEIL
  56990. "adcs r4, r4, r6\n\t"
  56991. #elif defined(__clang__)
  56992. "adcs r4, r6\n\t"
  56993. #else
  56994. "adc r4, r6\n\t"
  56995. #endif
  56996. #ifdef WOLFSSL_KEIL
  56997. "adcs r2, r2, %[r]\n\t"
  56998. #elif defined(__clang__)
  56999. "adcs r2, %[r]\n\t"
  57000. #else
  57001. "adc r2, %[r]\n\t"
  57002. #endif
  57003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57004. "adds r3, r3, r5\n\t"
  57005. #else
  57006. "add r3, r3, r5\n\t"
  57007. #endif
  57008. #ifdef WOLFSSL_KEIL
  57009. "adcs r4, r4, r6\n\t"
  57010. #elif defined(__clang__)
  57011. "adcs r4, r6\n\t"
  57012. #else
  57013. "adc 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. "# A[6] * A[4]\n\t"
  57023. "mov %[a], r9\n\t"
  57024. "ldr r7, [%[a], #16]\n\t"
  57025. "ldr %[a], [%[a], #24]\n\t"
  57026. "uxth r5, %[a]\n\t"
  57027. "uxth r6, r7\n\t"
  57028. #ifdef WOLFSSL_KEIL
  57029. "muls r6, r5, r6\n\t"
  57030. #elif defined(__clang__)
  57031. "muls r6, r5\n\t"
  57032. #else
  57033. "mul r6, r5\n\t"
  57034. #endif
  57035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57036. "adds r3, r3, r6\n\t"
  57037. #else
  57038. "add r3, r3, r6\n\t"
  57039. #endif
  57040. #ifdef WOLFSSL_KEIL
  57041. "adcs r4, r4, %[r]\n\t"
  57042. #elif defined(__clang__)
  57043. "adcs r4, %[r]\n\t"
  57044. #else
  57045. "adc r4, %[r]\n\t"
  57046. #endif
  57047. #ifdef WOLFSSL_KEIL
  57048. "adcs r2, r2, %[r]\n\t"
  57049. #elif defined(__clang__)
  57050. "adcs r2, %[r]\n\t"
  57051. #else
  57052. "adc r2, %[r]\n\t"
  57053. #endif
  57054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57055. "adds r3, r3, r6\n\t"
  57056. #else
  57057. "add r3, r3, r6\n\t"
  57058. #endif
  57059. #ifdef WOLFSSL_KEIL
  57060. "adcs r4, r4, %[r]\n\t"
  57061. #elif defined(__clang__)
  57062. "adcs r4, %[r]\n\t"
  57063. #else
  57064. "adc r4, %[r]\n\t"
  57065. #endif
  57066. #ifdef WOLFSSL_KEIL
  57067. "adcs r2, r2, %[r]\n\t"
  57068. #elif defined(__clang__)
  57069. "adcs r2, %[r]\n\t"
  57070. #else
  57071. "adc r2, %[r]\n\t"
  57072. #endif
  57073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57074. "lsrs r6, r7, #16\n\t"
  57075. #else
  57076. "lsr r6, r7, #16\n\t"
  57077. #endif
  57078. #ifdef WOLFSSL_KEIL
  57079. "muls r5, r6, r5\n\t"
  57080. #elif defined(__clang__)
  57081. "muls r5, r6\n\t"
  57082. #else
  57083. "mul r5, r6\n\t"
  57084. #endif
  57085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57086. "lsrs r6, r5, #16\n\t"
  57087. #else
  57088. "lsr r6, r5, #16\n\t"
  57089. #endif
  57090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57091. "lsls r5, r5, #16\n\t"
  57092. #else
  57093. "lsl r5, r5, #16\n\t"
  57094. #endif
  57095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57096. "adds r3, r3, r5\n\t"
  57097. #else
  57098. "add r3, r3, r5\n\t"
  57099. #endif
  57100. #ifdef WOLFSSL_KEIL
  57101. "adcs r4, r4, r6\n\t"
  57102. #elif defined(__clang__)
  57103. "adcs r4, r6\n\t"
  57104. #else
  57105. "adc r4, r6\n\t"
  57106. #endif
  57107. #ifdef WOLFSSL_KEIL
  57108. "adcs r2, r2, %[r]\n\t"
  57109. #elif defined(__clang__)
  57110. "adcs r2, %[r]\n\t"
  57111. #else
  57112. "adc r2, %[r]\n\t"
  57113. #endif
  57114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57115. "adds r3, r3, r5\n\t"
  57116. #else
  57117. "add r3, r3, r5\n\t"
  57118. #endif
  57119. #ifdef WOLFSSL_KEIL
  57120. "adcs r4, r4, r6\n\t"
  57121. #elif defined(__clang__)
  57122. "adcs r4, r6\n\t"
  57123. #else
  57124. "adc r4, r6\n\t"
  57125. #endif
  57126. #ifdef WOLFSSL_KEIL
  57127. "adcs r2, r2, %[r]\n\t"
  57128. #elif defined(__clang__)
  57129. "adcs r2, %[r]\n\t"
  57130. #else
  57131. "adc r2, %[r]\n\t"
  57132. #endif
  57133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57134. "lsrs r5, %[a], #16\n\t"
  57135. #else
  57136. "lsr r5, %[a], #16\n\t"
  57137. #endif
  57138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57139. "lsrs r6, r7, #16\n\t"
  57140. #else
  57141. "lsr r6, r7, #16\n\t"
  57142. #endif
  57143. #ifdef WOLFSSL_KEIL
  57144. "muls r6, r5, r6\n\t"
  57145. #elif defined(__clang__)
  57146. "muls r6, r5\n\t"
  57147. #else
  57148. "mul r6, r5\n\t"
  57149. #endif
  57150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57151. "adds r4, r4, r6\n\t"
  57152. #else
  57153. "add r4, r4, r6\n\t"
  57154. #endif
  57155. #ifdef WOLFSSL_KEIL
  57156. "adcs r2, r2, %[r]\n\t"
  57157. #elif defined(__clang__)
  57158. "adcs r2, %[r]\n\t"
  57159. #else
  57160. "adc r2, %[r]\n\t"
  57161. #endif
  57162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57163. "adds r4, r4, r6\n\t"
  57164. #else
  57165. "add r4, r4, r6\n\t"
  57166. #endif
  57167. #ifdef WOLFSSL_KEIL
  57168. "adcs r2, r2, %[r]\n\t"
  57169. #elif defined(__clang__)
  57170. "adcs r2, %[r]\n\t"
  57171. #else
  57172. "adc r2, %[r]\n\t"
  57173. #endif
  57174. "uxth r6, r7\n\t"
  57175. #ifdef WOLFSSL_KEIL
  57176. "muls r5, r6, r5\n\t"
  57177. #elif defined(__clang__)
  57178. "muls r5, r6\n\t"
  57179. #else
  57180. "mul r5, r6\n\t"
  57181. #endif
  57182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57183. "lsrs r6, r5, #16\n\t"
  57184. #else
  57185. "lsr r6, r5, #16\n\t"
  57186. #endif
  57187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57188. "lsls r5, r5, #16\n\t"
  57189. #else
  57190. "lsl r5, r5, #16\n\t"
  57191. #endif
  57192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57193. "adds r3, r3, r5\n\t"
  57194. #else
  57195. "add r3, r3, r5\n\t"
  57196. #endif
  57197. #ifdef WOLFSSL_KEIL
  57198. "adcs r4, r4, r6\n\t"
  57199. #elif defined(__clang__)
  57200. "adcs r4, r6\n\t"
  57201. #else
  57202. "adc r4, r6\n\t"
  57203. #endif
  57204. #ifdef WOLFSSL_KEIL
  57205. "adcs r2, r2, %[r]\n\t"
  57206. #elif defined(__clang__)
  57207. "adcs r2, %[r]\n\t"
  57208. #else
  57209. "adc r2, %[r]\n\t"
  57210. #endif
  57211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57212. "adds r3, r3, r5\n\t"
  57213. #else
  57214. "add r3, r3, r5\n\t"
  57215. #endif
  57216. #ifdef WOLFSSL_KEIL
  57217. "adcs r4, r4, r6\n\t"
  57218. #elif defined(__clang__)
  57219. "adcs r4, r6\n\t"
  57220. #else
  57221. "adc r4, r6\n\t"
  57222. #endif
  57223. #ifdef WOLFSSL_KEIL
  57224. "adcs r2, r2, %[r]\n\t"
  57225. #elif defined(__clang__)
  57226. "adcs r2, %[r]\n\t"
  57227. #else
  57228. "adc r2, %[r]\n\t"
  57229. #endif
  57230. "# A[5] * A[5]\n\t"
  57231. "mov %[a], r9\n\t"
  57232. "ldr r7, [%[a], #20]\n\t"
  57233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57234. "lsrs r6, r7, #16\n\t"
  57235. #else
  57236. "lsr r6, r7, #16\n\t"
  57237. #endif
  57238. "uxth r5, r7\n\t"
  57239. #ifdef WOLFSSL_KEIL
  57240. "muls r5, r5, r5\n\t"
  57241. #elif defined(__clang__)
  57242. "muls r5, r5\n\t"
  57243. #else
  57244. "mul r5, r5\n\t"
  57245. #endif
  57246. #ifdef WOLFSSL_KEIL
  57247. "muls r6, r6, r6\n\t"
  57248. #elif defined(__clang__)
  57249. "muls r6, r6\n\t"
  57250. #else
  57251. "mul r6, r6\n\t"
  57252. #endif
  57253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57254. "adds r3, r3, r5\n\t"
  57255. #else
  57256. "add r3, r3, r5\n\t"
  57257. #endif
  57258. #ifdef WOLFSSL_KEIL
  57259. "adcs r4, r4, r6\n\t"
  57260. #elif defined(__clang__)
  57261. "adcs r4, r6\n\t"
  57262. #else
  57263. "adc r4, r6\n\t"
  57264. #endif
  57265. #ifdef WOLFSSL_KEIL
  57266. "adcs r2, r2, %[r]\n\t"
  57267. #elif defined(__clang__)
  57268. "adcs r2, %[r]\n\t"
  57269. #else
  57270. "adc r2, %[r]\n\t"
  57271. #endif
  57272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57273. "lsrs r6, r7, #16\n\t"
  57274. #else
  57275. "lsr r6, r7, #16\n\t"
  57276. #endif
  57277. "uxth r5, r7\n\t"
  57278. #ifdef WOLFSSL_KEIL
  57279. "muls r5, r6, r5\n\t"
  57280. #elif defined(__clang__)
  57281. "muls r5, r6\n\t"
  57282. #else
  57283. "mul r5, r6\n\t"
  57284. #endif
  57285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57286. "lsrs r6, r5, #15\n\t"
  57287. #else
  57288. "lsr r6, r5, #15\n\t"
  57289. #endif
  57290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57291. "lsls r5, r5, #17\n\t"
  57292. #else
  57293. "lsl r5, r5, #17\n\t"
  57294. #endif
  57295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57296. "adds r3, r3, r5\n\t"
  57297. #else
  57298. "add r3, r3, r5\n\t"
  57299. #endif
  57300. #ifdef WOLFSSL_KEIL
  57301. "adcs r4, r4, r6\n\t"
  57302. #elif defined(__clang__)
  57303. "adcs r4, r6\n\t"
  57304. #else
  57305. "adc r4, r6\n\t"
  57306. #endif
  57307. #ifdef WOLFSSL_KEIL
  57308. "adcs r2, r2, %[r]\n\t"
  57309. #elif defined(__clang__)
  57310. "adcs r2, %[r]\n\t"
  57311. #else
  57312. "adc r2, %[r]\n\t"
  57313. #endif
  57314. "str r3, [sp, #40]\n\t"
  57315. "# A[6] * A[5]\n\t"
  57316. "movs r3, #0\n\t"
  57317. "ldr %[a], [%[a], #24]\n\t"
  57318. "uxth r5, %[a]\n\t"
  57319. "uxth r6, r7\n\t"
  57320. #ifdef WOLFSSL_KEIL
  57321. "muls r6, r5, r6\n\t"
  57322. #elif defined(__clang__)
  57323. "muls r6, r5\n\t"
  57324. #else
  57325. "mul r6, r5\n\t"
  57326. #endif
  57327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57328. "adds r4, r4, r6\n\t"
  57329. #else
  57330. "add r4, r4, r6\n\t"
  57331. #endif
  57332. #ifdef WOLFSSL_KEIL
  57333. "adcs r2, r2, %[r]\n\t"
  57334. #elif defined(__clang__)
  57335. "adcs r2, %[r]\n\t"
  57336. #else
  57337. "adc r2, %[r]\n\t"
  57338. #endif
  57339. #ifdef WOLFSSL_KEIL
  57340. "adcs r3, r3, %[r]\n\t"
  57341. #elif defined(__clang__)
  57342. "adcs r3, %[r]\n\t"
  57343. #else
  57344. "adc r3, %[r]\n\t"
  57345. #endif
  57346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57347. "adds r4, r4, r6\n\t"
  57348. #else
  57349. "add r4, r4, r6\n\t"
  57350. #endif
  57351. #ifdef WOLFSSL_KEIL
  57352. "adcs r2, r2, %[r]\n\t"
  57353. #elif defined(__clang__)
  57354. "adcs r2, %[r]\n\t"
  57355. #else
  57356. "adc r2, %[r]\n\t"
  57357. #endif
  57358. #ifdef WOLFSSL_KEIL
  57359. "adcs r3, r3, %[r]\n\t"
  57360. #elif defined(__clang__)
  57361. "adcs r3, %[r]\n\t"
  57362. #else
  57363. "adc r3, %[r]\n\t"
  57364. #endif
  57365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57366. "lsrs r6, r7, #16\n\t"
  57367. #else
  57368. "lsr r6, r7, #16\n\t"
  57369. #endif
  57370. #ifdef WOLFSSL_KEIL
  57371. "muls r5, r6, r5\n\t"
  57372. #elif defined(__clang__)
  57373. "muls r5, r6\n\t"
  57374. #else
  57375. "mul r5, r6\n\t"
  57376. #endif
  57377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57378. "lsrs r6, r5, #16\n\t"
  57379. #else
  57380. "lsr r6, r5, #16\n\t"
  57381. #endif
  57382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57383. "lsls r5, r5, #16\n\t"
  57384. #else
  57385. "lsl r5, r5, #16\n\t"
  57386. #endif
  57387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57388. "adds r4, r4, r5\n\t"
  57389. #else
  57390. "add r4, r4, r5\n\t"
  57391. #endif
  57392. #ifdef WOLFSSL_KEIL
  57393. "adcs r2, r2, r6\n\t"
  57394. #elif defined(__clang__)
  57395. "adcs r2, r6\n\t"
  57396. #else
  57397. "adc r2, r6\n\t"
  57398. #endif
  57399. #ifdef WOLFSSL_KEIL
  57400. "adcs r3, r3, %[r]\n\t"
  57401. #elif defined(__clang__)
  57402. "adcs r3, %[r]\n\t"
  57403. #else
  57404. "adc r3, %[r]\n\t"
  57405. #endif
  57406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57407. "adds r4, r4, r5\n\t"
  57408. #else
  57409. "add r4, r4, r5\n\t"
  57410. #endif
  57411. #ifdef WOLFSSL_KEIL
  57412. "adcs r2, r2, r6\n\t"
  57413. #elif defined(__clang__)
  57414. "adcs r2, r6\n\t"
  57415. #else
  57416. "adc r2, r6\n\t"
  57417. #endif
  57418. #ifdef WOLFSSL_KEIL
  57419. "adcs r3, r3, %[r]\n\t"
  57420. #elif defined(__clang__)
  57421. "adcs r3, %[r]\n\t"
  57422. #else
  57423. "adc r3, %[r]\n\t"
  57424. #endif
  57425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57426. "lsrs r5, %[a], #16\n\t"
  57427. #else
  57428. "lsr r5, %[a], #16\n\t"
  57429. #endif
  57430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57431. "lsrs r6, r7, #16\n\t"
  57432. #else
  57433. "lsr r6, r7, #16\n\t"
  57434. #endif
  57435. #ifdef WOLFSSL_KEIL
  57436. "muls r6, r5, r6\n\t"
  57437. #elif defined(__clang__)
  57438. "muls r6, r5\n\t"
  57439. #else
  57440. "mul r6, r5\n\t"
  57441. #endif
  57442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57443. "adds r2, r2, r6\n\t"
  57444. #else
  57445. "add r2, r2, r6\n\t"
  57446. #endif
  57447. #ifdef WOLFSSL_KEIL
  57448. "adcs r3, r3, %[r]\n\t"
  57449. #elif defined(__clang__)
  57450. "adcs r3, %[r]\n\t"
  57451. #else
  57452. "adc r3, %[r]\n\t"
  57453. #endif
  57454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57455. "adds r2, r2, r6\n\t"
  57456. #else
  57457. "add r2, r2, r6\n\t"
  57458. #endif
  57459. #ifdef WOLFSSL_KEIL
  57460. "adcs r3, r3, %[r]\n\t"
  57461. #elif defined(__clang__)
  57462. "adcs r3, %[r]\n\t"
  57463. #else
  57464. "adc r3, %[r]\n\t"
  57465. #endif
  57466. "uxth r6, r7\n\t"
  57467. #ifdef WOLFSSL_KEIL
  57468. "muls r5, r6, r5\n\t"
  57469. #elif defined(__clang__)
  57470. "muls r5, r6\n\t"
  57471. #else
  57472. "mul r5, r6\n\t"
  57473. #endif
  57474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57475. "lsrs r6, r5, #16\n\t"
  57476. #else
  57477. "lsr r6, r5, #16\n\t"
  57478. #endif
  57479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57480. "lsls r5, r5, #16\n\t"
  57481. #else
  57482. "lsl r5, r5, #16\n\t"
  57483. #endif
  57484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57485. "adds r4, r4, r5\n\t"
  57486. #else
  57487. "add r4, r4, r5\n\t"
  57488. #endif
  57489. #ifdef WOLFSSL_KEIL
  57490. "adcs r2, r2, r6\n\t"
  57491. #elif defined(__clang__)
  57492. "adcs r2, r6\n\t"
  57493. #else
  57494. "adc r2, r6\n\t"
  57495. #endif
  57496. #ifdef WOLFSSL_KEIL
  57497. "adcs r3, r3, %[r]\n\t"
  57498. #elif defined(__clang__)
  57499. "adcs r3, %[r]\n\t"
  57500. #else
  57501. "adc r3, %[r]\n\t"
  57502. #endif
  57503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57504. "adds r4, r4, r5\n\t"
  57505. #else
  57506. "add r4, r4, r5\n\t"
  57507. #endif
  57508. #ifdef WOLFSSL_KEIL
  57509. "adcs r2, r2, r6\n\t"
  57510. #elif defined(__clang__)
  57511. "adcs r2, r6\n\t"
  57512. #else
  57513. "adc r2, r6\n\t"
  57514. #endif
  57515. #ifdef WOLFSSL_KEIL
  57516. "adcs r3, r3, %[r]\n\t"
  57517. #elif defined(__clang__)
  57518. "adcs r3, %[r]\n\t"
  57519. #else
  57520. "adc r3, %[r]\n\t"
  57521. #endif
  57522. "# A[7] * A[4]\n\t"
  57523. "mov %[a], r9\n\t"
  57524. "ldr r7, [%[a], #16]\n\t"
  57525. "ldr %[a], [%[a], #28]\n\t"
  57526. "uxth r5, %[a]\n\t"
  57527. "uxth r6, r7\n\t"
  57528. #ifdef WOLFSSL_KEIL
  57529. "muls r6, r5, r6\n\t"
  57530. #elif defined(__clang__)
  57531. "muls r6, r5\n\t"
  57532. #else
  57533. "mul r6, r5\n\t"
  57534. #endif
  57535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57536. "adds r4, r4, r6\n\t"
  57537. #else
  57538. "add r4, r4, r6\n\t"
  57539. #endif
  57540. #ifdef WOLFSSL_KEIL
  57541. "adcs r2, r2, %[r]\n\t"
  57542. #elif defined(__clang__)
  57543. "adcs r2, %[r]\n\t"
  57544. #else
  57545. "adc r2, %[r]\n\t"
  57546. #endif
  57547. #ifdef WOLFSSL_KEIL
  57548. "adcs r3, r3, %[r]\n\t"
  57549. #elif defined(__clang__)
  57550. "adcs r3, %[r]\n\t"
  57551. #else
  57552. "adc r3, %[r]\n\t"
  57553. #endif
  57554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57555. "adds r4, r4, r6\n\t"
  57556. #else
  57557. "add r4, r4, r6\n\t"
  57558. #endif
  57559. #ifdef WOLFSSL_KEIL
  57560. "adcs r2, r2, %[r]\n\t"
  57561. #elif defined(__clang__)
  57562. "adcs r2, %[r]\n\t"
  57563. #else
  57564. "adc r2, %[r]\n\t"
  57565. #endif
  57566. #ifdef WOLFSSL_KEIL
  57567. "adcs r3, r3, %[r]\n\t"
  57568. #elif defined(__clang__)
  57569. "adcs r3, %[r]\n\t"
  57570. #else
  57571. "adc r3, %[r]\n\t"
  57572. #endif
  57573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57574. "lsrs r6, r7, #16\n\t"
  57575. #else
  57576. "lsr r6, r7, #16\n\t"
  57577. #endif
  57578. #ifdef WOLFSSL_KEIL
  57579. "muls r5, r6, r5\n\t"
  57580. #elif defined(__clang__)
  57581. "muls r5, r6\n\t"
  57582. #else
  57583. "mul r5, r6\n\t"
  57584. #endif
  57585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57586. "lsrs r6, r5, #16\n\t"
  57587. #else
  57588. "lsr r6, r5, #16\n\t"
  57589. #endif
  57590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57591. "lsls r5, r5, #16\n\t"
  57592. #else
  57593. "lsl r5, r5, #16\n\t"
  57594. #endif
  57595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57596. "adds r4, r4, r5\n\t"
  57597. #else
  57598. "add r4, r4, r5\n\t"
  57599. #endif
  57600. #ifdef WOLFSSL_KEIL
  57601. "adcs r2, r2, r6\n\t"
  57602. #elif defined(__clang__)
  57603. "adcs r2, r6\n\t"
  57604. #else
  57605. "adc r2, r6\n\t"
  57606. #endif
  57607. #ifdef WOLFSSL_KEIL
  57608. "adcs r3, r3, %[r]\n\t"
  57609. #elif defined(__clang__)
  57610. "adcs r3, %[r]\n\t"
  57611. #else
  57612. "adc r3, %[r]\n\t"
  57613. #endif
  57614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57615. "adds r4, r4, r5\n\t"
  57616. #else
  57617. "add r4, r4, r5\n\t"
  57618. #endif
  57619. #ifdef WOLFSSL_KEIL
  57620. "adcs r2, r2, r6\n\t"
  57621. #elif defined(__clang__)
  57622. "adcs r2, r6\n\t"
  57623. #else
  57624. "adc r2, r6\n\t"
  57625. #endif
  57626. #ifdef WOLFSSL_KEIL
  57627. "adcs r3, r3, %[r]\n\t"
  57628. #elif defined(__clang__)
  57629. "adcs r3, %[r]\n\t"
  57630. #else
  57631. "adc r3, %[r]\n\t"
  57632. #endif
  57633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57634. "lsrs r5, %[a], #16\n\t"
  57635. #else
  57636. "lsr r5, %[a], #16\n\t"
  57637. #endif
  57638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57639. "lsrs r6, r7, #16\n\t"
  57640. #else
  57641. "lsr r6, r7, #16\n\t"
  57642. #endif
  57643. #ifdef WOLFSSL_KEIL
  57644. "muls r6, r5, r6\n\t"
  57645. #elif defined(__clang__)
  57646. "muls r6, r5\n\t"
  57647. #else
  57648. "mul r6, r5\n\t"
  57649. #endif
  57650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57651. "adds r2, r2, r6\n\t"
  57652. #else
  57653. "add r2, r2, r6\n\t"
  57654. #endif
  57655. #ifdef WOLFSSL_KEIL
  57656. "adcs r3, r3, %[r]\n\t"
  57657. #elif defined(__clang__)
  57658. "adcs r3, %[r]\n\t"
  57659. #else
  57660. "adc r3, %[r]\n\t"
  57661. #endif
  57662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57663. "adds r2, r2, r6\n\t"
  57664. #else
  57665. "add r2, r2, r6\n\t"
  57666. #endif
  57667. #ifdef WOLFSSL_KEIL
  57668. "adcs r3, r3, %[r]\n\t"
  57669. #elif defined(__clang__)
  57670. "adcs r3, %[r]\n\t"
  57671. #else
  57672. "adc r3, %[r]\n\t"
  57673. #endif
  57674. "uxth r6, r7\n\t"
  57675. #ifdef WOLFSSL_KEIL
  57676. "muls r5, r6, r5\n\t"
  57677. #elif defined(__clang__)
  57678. "muls r5, r6\n\t"
  57679. #else
  57680. "mul r5, r6\n\t"
  57681. #endif
  57682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57683. "lsrs r6, r5, #16\n\t"
  57684. #else
  57685. "lsr r6, r5, #16\n\t"
  57686. #endif
  57687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57688. "lsls r5, r5, #16\n\t"
  57689. #else
  57690. "lsl r5, r5, #16\n\t"
  57691. #endif
  57692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57693. "adds r4, r4, r5\n\t"
  57694. #else
  57695. "add r4, r4, r5\n\t"
  57696. #endif
  57697. #ifdef WOLFSSL_KEIL
  57698. "adcs r2, r2, r6\n\t"
  57699. #elif defined(__clang__)
  57700. "adcs r2, r6\n\t"
  57701. #else
  57702. "adc r2, r6\n\t"
  57703. #endif
  57704. #ifdef WOLFSSL_KEIL
  57705. "adcs r3, r3, %[r]\n\t"
  57706. #elif defined(__clang__)
  57707. "adcs r3, %[r]\n\t"
  57708. #else
  57709. "adc r3, %[r]\n\t"
  57710. #endif
  57711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57712. "adds r4, r4, r5\n\t"
  57713. #else
  57714. "add r4, r4, r5\n\t"
  57715. #endif
  57716. #ifdef WOLFSSL_KEIL
  57717. "adcs r2, r2, r6\n\t"
  57718. #elif defined(__clang__)
  57719. "adcs r2, r6\n\t"
  57720. #else
  57721. "adc r2, r6\n\t"
  57722. #endif
  57723. #ifdef WOLFSSL_KEIL
  57724. "adcs r3, r3, %[r]\n\t"
  57725. #elif defined(__clang__)
  57726. "adcs r3, %[r]\n\t"
  57727. #else
  57728. "adc r3, %[r]\n\t"
  57729. #endif
  57730. "# A[8] * A[3]\n\t"
  57731. "mov %[a], r9\n\t"
  57732. "mov r7, lr\n\t"
  57733. "ldr %[a], [%[a], #32]\n\t"
  57734. "uxth r5, %[a]\n\t"
  57735. "uxth r6, r7\n\t"
  57736. #ifdef WOLFSSL_KEIL
  57737. "muls r6, r5, r6\n\t"
  57738. #elif defined(__clang__)
  57739. "muls r6, r5\n\t"
  57740. #else
  57741. "mul r6, r5\n\t"
  57742. #endif
  57743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57744. "adds r4, r4, r6\n\t"
  57745. #else
  57746. "add r4, r4, r6\n\t"
  57747. #endif
  57748. #ifdef WOLFSSL_KEIL
  57749. "adcs r2, r2, %[r]\n\t"
  57750. #elif defined(__clang__)
  57751. "adcs r2, %[r]\n\t"
  57752. #else
  57753. "adc r2, %[r]\n\t"
  57754. #endif
  57755. #ifdef WOLFSSL_KEIL
  57756. "adcs r3, r3, %[r]\n\t"
  57757. #elif defined(__clang__)
  57758. "adcs r3, %[r]\n\t"
  57759. #else
  57760. "adc r3, %[r]\n\t"
  57761. #endif
  57762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57763. "adds r4, r4, r6\n\t"
  57764. #else
  57765. "add r4, r4, r6\n\t"
  57766. #endif
  57767. #ifdef WOLFSSL_KEIL
  57768. "adcs r2, r2, %[r]\n\t"
  57769. #elif defined(__clang__)
  57770. "adcs r2, %[r]\n\t"
  57771. #else
  57772. "adc r2, %[r]\n\t"
  57773. #endif
  57774. #ifdef WOLFSSL_KEIL
  57775. "adcs r3, r3, %[r]\n\t"
  57776. #elif defined(__clang__)
  57777. "adcs r3, %[r]\n\t"
  57778. #else
  57779. "adc r3, %[r]\n\t"
  57780. #endif
  57781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57782. "lsrs r6, r7, #16\n\t"
  57783. #else
  57784. "lsr r6, r7, #16\n\t"
  57785. #endif
  57786. #ifdef WOLFSSL_KEIL
  57787. "muls r5, r6, r5\n\t"
  57788. #elif defined(__clang__)
  57789. "muls r5, r6\n\t"
  57790. #else
  57791. "mul r5, r6\n\t"
  57792. #endif
  57793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57794. "lsrs r6, r5, #16\n\t"
  57795. #else
  57796. "lsr r6, r5, #16\n\t"
  57797. #endif
  57798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57799. "lsls r5, r5, #16\n\t"
  57800. #else
  57801. "lsl r5, r5, #16\n\t"
  57802. #endif
  57803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57804. "adds r4, r4, r5\n\t"
  57805. #else
  57806. "add r4, r4, r5\n\t"
  57807. #endif
  57808. #ifdef WOLFSSL_KEIL
  57809. "adcs r2, r2, r6\n\t"
  57810. #elif defined(__clang__)
  57811. "adcs r2, r6\n\t"
  57812. #else
  57813. "adc r2, r6\n\t"
  57814. #endif
  57815. #ifdef WOLFSSL_KEIL
  57816. "adcs r3, r3, %[r]\n\t"
  57817. #elif defined(__clang__)
  57818. "adcs r3, %[r]\n\t"
  57819. #else
  57820. "adc r3, %[r]\n\t"
  57821. #endif
  57822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57823. "adds r4, r4, r5\n\t"
  57824. #else
  57825. "add r4, r4, r5\n\t"
  57826. #endif
  57827. #ifdef WOLFSSL_KEIL
  57828. "adcs r2, r2, r6\n\t"
  57829. #elif defined(__clang__)
  57830. "adcs r2, r6\n\t"
  57831. #else
  57832. "adc r2, r6\n\t"
  57833. #endif
  57834. #ifdef WOLFSSL_KEIL
  57835. "adcs r3, r3, %[r]\n\t"
  57836. #elif defined(__clang__)
  57837. "adcs r3, %[r]\n\t"
  57838. #else
  57839. "adc r3, %[r]\n\t"
  57840. #endif
  57841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57842. "lsrs r5, %[a], #16\n\t"
  57843. #else
  57844. "lsr r5, %[a], #16\n\t"
  57845. #endif
  57846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57847. "lsrs r6, r7, #16\n\t"
  57848. #else
  57849. "lsr r6, r7, #16\n\t"
  57850. #endif
  57851. #ifdef WOLFSSL_KEIL
  57852. "muls r6, r5, r6\n\t"
  57853. #elif defined(__clang__)
  57854. "muls r6, r5\n\t"
  57855. #else
  57856. "mul r6, r5\n\t"
  57857. #endif
  57858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57859. "adds r2, r2, r6\n\t"
  57860. #else
  57861. "add r2, r2, r6\n\t"
  57862. #endif
  57863. #ifdef WOLFSSL_KEIL
  57864. "adcs r3, r3, %[r]\n\t"
  57865. #elif defined(__clang__)
  57866. "adcs r3, %[r]\n\t"
  57867. #else
  57868. "adc r3, %[r]\n\t"
  57869. #endif
  57870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57871. "adds r2, r2, r6\n\t"
  57872. #else
  57873. "add r2, r2, r6\n\t"
  57874. #endif
  57875. #ifdef WOLFSSL_KEIL
  57876. "adcs r3, r3, %[r]\n\t"
  57877. #elif defined(__clang__)
  57878. "adcs r3, %[r]\n\t"
  57879. #else
  57880. "adc r3, %[r]\n\t"
  57881. #endif
  57882. "uxth r6, r7\n\t"
  57883. #ifdef WOLFSSL_KEIL
  57884. "muls r5, r6, r5\n\t"
  57885. #elif defined(__clang__)
  57886. "muls r5, r6\n\t"
  57887. #else
  57888. "mul r5, r6\n\t"
  57889. #endif
  57890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57891. "lsrs r6, r5, #16\n\t"
  57892. #else
  57893. "lsr r6, r5, #16\n\t"
  57894. #endif
  57895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57896. "lsls r5, r5, #16\n\t"
  57897. #else
  57898. "lsl r5, r5, #16\n\t"
  57899. #endif
  57900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57901. "adds r4, r4, r5\n\t"
  57902. #else
  57903. "add r4, r4, r5\n\t"
  57904. #endif
  57905. #ifdef WOLFSSL_KEIL
  57906. "adcs r2, r2, r6\n\t"
  57907. #elif defined(__clang__)
  57908. "adcs r2, r6\n\t"
  57909. #else
  57910. "adc r2, r6\n\t"
  57911. #endif
  57912. #ifdef WOLFSSL_KEIL
  57913. "adcs r3, r3, %[r]\n\t"
  57914. #elif defined(__clang__)
  57915. "adcs r3, %[r]\n\t"
  57916. #else
  57917. "adc r3, %[r]\n\t"
  57918. #endif
  57919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57920. "adds r4, r4, r5\n\t"
  57921. #else
  57922. "add r4, r4, r5\n\t"
  57923. #endif
  57924. #ifdef WOLFSSL_KEIL
  57925. "adcs r2, r2, r6\n\t"
  57926. #elif defined(__clang__)
  57927. "adcs r2, r6\n\t"
  57928. #else
  57929. "adc r2, r6\n\t"
  57930. #endif
  57931. #ifdef WOLFSSL_KEIL
  57932. "adcs r3, r3, %[r]\n\t"
  57933. #elif defined(__clang__)
  57934. "adcs r3, %[r]\n\t"
  57935. #else
  57936. "adc r3, %[r]\n\t"
  57937. #endif
  57938. "# A[9] * A[2]\n\t"
  57939. "mov %[a], r9\n\t"
  57940. "mov r7, r12\n\t"
  57941. "ldr %[a], [%[a], #36]\n\t"
  57942. "uxth r5, %[a]\n\t"
  57943. "uxth r6, r7\n\t"
  57944. #ifdef WOLFSSL_KEIL
  57945. "muls r6, r5, r6\n\t"
  57946. #elif defined(__clang__)
  57947. "muls r6, r5\n\t"
  57948. #else
  57949. "mul r6, r5\n\t"
  57950. #endif
  57951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57952. "adds r4, r4, r6\n\t"
  57953. #else
  57954. "add r4, r4, r6\n\t"
  57955. #endif
  57956. #ifdef WOLFSSL_KEIL
  57957. "adcs r2, r2, %[r]\n\t"
  57958. #elif defined(__clang__)
  57959. "adcs r2, %[r]\n\t"
  57960. #else
  57961. "adc r2, %[r]\n\t"
  57962. #endif
  57963. #ifdef WOLFSSL_KEIL
  57964. "adcs r3, r3, %[r]\n\t"
  57965. #elif defined(__clang__)
  57966. "adcs r3, %[r]\n\t"
  57967. #else
  57968. "adc r3, %[r]\n\t"
  57969. #endif
  57970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57971. "adds r4, r4, r6\n\t"
  57972. #else
  57973. "add r4, r4, r6\n\t"
  57974. #endif
  57975. #ifdef WOLFSSL_KEIL
  57976. "adcs r2, r2, %[r]\n\t"
  57977. #elif defined(__clang__)
  57978. "adcs r2, %[r]\n\t"
  57979. #else
  57980. "adc r2, %[r]\n\t"
  57981. #endif
  57982. #ifdef WOLFSSL_KEIL
  57983. "adcs r3, r3, %[r]\n\t"
  57984. #elif defined(__clang__)
  57985. "adcs r3, %[r]\n\t"
  57986. #else
  57987. "adc r3, %[r]\n\t"
  57988. #endif
  57989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57990. "lsrs r6, r7, #16\n\t"
  57991. #else
  57992. "lsr r6, r7, #16\n\t"
  57993. #endif
  57994. #ifdef WOLFSSL_KEIL
  57995. "muls r5, r6, r5\n\t"
  57996. #elif defined(__clang__)
  57997. "muls r5, r6\n\t"
  57998. #else
  57999. "mul r5, r6\n\t"
  58000. #endif
  58001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58002. "lsrs r6, r5, #16\n\t"
  58003. #else
  58004. "lsr r6, r5, #16\n\t"
  58005. #endif
  58006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58007. "lsls r5, r5, #16\n\t"
  58008. #else
  58009. "lsl r5, r5, #16\n\t"
  58010. #endif
  58011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58012. "adds r4, r4, r5\n\t"
  58013. #else
  58014. "add r4, r4, r5\n\t"
  58015. #endif
  58016. #ifdef WOLFSSL_KEIL
  58017. "adcs r2, r2, r6\n\t"
  58018. #elif defined(__clang__)
  58019. "adcs r2, r6\n\t"
  58020. #else
  58021. "adc r2, r6\n\t"
  58022. #endif
  58023. #ifdef WOLFSSL_KEIL
  58024. "adcs r3, r3, %[r]\n\t"
  58025. #elif defined(__clang__)
  58026. "adcs r3, %[r]\n\t"
  58027. #else
  58028. "adc r3, %[r]\n\t"
  58029. #endif
  58030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58031. "adds r4, r4, r5\n\t"
  58032. #else
  58033. "add r4, r4, r5\n\t"
  58034. #endif
  58035. #ifdef WOLFSSL_KEIL
  58036. "adcs r2, r2, r6\n\t"
  58037. #elif defined(__clang__)
  58038. "adcs r2, r6\n\t"
  58039. #else
  58040. "adc r2, r6\n\t"
  58041. #endif
  58042. #ifdef WOLFSSL_KEIL
  58043. "adcs r3, r3, %[r]\n\t"
  58044. #elif defined(__clang__)
  58045. "adcs r3, %[r]\n\t"
  58046. #else
  58047. "adc r3, %[r]\n\t"
  58048. #endif
  58049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58050. "lsrs r5, %[a], #16\n\t"
  58051. #else
  58052. "lsr r5, %[a], #16\n\t"
  58053. #endif
  58054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58055. "lsrs r6, r7, #16\n\t"
  58056. #else
  58057. "lsr r6, r7, #16\n\t"
  58058. #endif
  58059. #ifdef WOLFSSL_KEIL
  58060. "muls r6, r5, r6\n\t"
  58061. #elif defined(__clang__)
  58062. "muls r6, r5\n\t"
  58063. #else
  58064. "mul r6, r5\n\t"
  58065. #endif
  58066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58067. "adds r2, r2, r6\n\t"
  58068. #else
  58069. "add r2, r2, r6\n\t"
  58070. #endif
  58071. #ifdef WOLFSSL_KEIL
  58072. "adcs r3, r3, %[r]\n\t"
  58073. #elif defined(__clang__)
  58074. "adcs r3, %[r]\n\t"
  58075. #else
  58076. "adc r3, %[r]\n\t"
  58077. #endif
  58078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58079. "adds r2, r2, r6\n\t"
  58080. #else
  58081. "add r2, r2, r6\n\t"
  58082. #endif
  58083. #ifdef WOLFSSL_KEIL
  58084. "adcs r3, r3, %[r]\n\t"
  58085. #elif defined(__clang__)
  58086. "adcs r3, %[r]\n\t"
  58087. #else
  58088. "adc r3, %[r]\n\t"
  58089. #endif
  58090. "uxth r6, r7\n\t"
  58091. #ifdef WOLFSSL_KEIL
  58092. "muls r5, r6, r5\n\t"
  58093. #elif defined(__clang__)
  58094. "muls r5, r6\n\t"
  58095. #else
  58096. "mul r5, r6\n\t"
  58097. #endif
  58098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58099. "lsrs r6, r5, #16\n\t"
  58100. #else
  58101. "lsr r6, r5, #16\n\t"
  58102. #endif
  58103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58104. "lsls r5, r5, #16\n\t"
  58105. #else
  58106. "lsl r5, r5, #16\n\t"
  58107. #endif
  58108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58109. "adds r4, r4, r5\n\t"
  58110. #else
  58111. "add r4, r4, r5\n\t"
  58112. #endif
  58113. #ifdef WOLFSSL_KEIL
  58114. "adcs r2, r2, r6\n\t"
  58115. #elif defined(__clang__)
  58116. "adcs r2, r6\n\t"
  58117. #else
  58118. "adc r2, r6\n\t"
  58119. #endif
  58120. #ifdef WOLFSSL_KEIL
  58121. "adcs r3, r3, %[r]\n\t"
  58122. #elif defined(__clang__)
  58123. "adcs r3, %[r]\n\t"
  58124. #else
  58125. "adc r3, %[r]\n\t"
  58126. #endif
  58127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58128. "adds r4, r4, r5\n\t"
  58129. #else
  58130. "add r4, r4, r5\n\t"
  58131. #endif
  58132. #ifdef WOLFSSL_KEIL
  58133. "adcs r2, r2, r6\n\t"
  58134. #elif defined(__clang__)
  58135. "adcs r2, r6\n\t"
  58136. #else
  58137. "adc r2, r6\n\t"
  58138. #endif
  58139. #ifdef WOLFSSL_KEIL
  58140. "adcs r3, r3, %[r]\n\t"
  58141. #elif defined(__clang__)
  58142. "adcs r3, %[r]\n\t"
  58143. #else
  58144. "adc r3, %[r]\n\t"
  58145. #endif
  58146. "# A[10] * A[1]\n\t"
  58147. "mov %[a], r9\n\t"
  58148. "mov r7, r11\n\t"
  58149. "ldr %[a], [%[a], #40]\n\t"
  58150. "uxth r5, %[a]\n\t"
  58151. "uxth r6, r7\n\t"
  58152. #ifdef WOLFSSL_KEIL
  58153. "muls r6, r5, r6\n\t"
  58154. #elif defined(__clang__)
  58155. "muls r6, r5\n\t"
  58156. #else
  58157. "mul r6, r5\n\t"
  58158. #endif
  58159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58160. "adds r4, r4, r6\n\t"
  58161. #else
  58162. "add r4, r4, r6\n\t"
  58163. #endif
  58164. #ifdef WOLFSSL_KEIL
  58165. "adcs r2, r2, %[r]\n\t"
  58166. #elif defined(__clang__)
  58167. "adcs r2, %[r]\n\t"
  58168. #else
  58169. "adc r2, %[r]\n\t"
  58170. #endif
  58171. #ifdef WOLFSSL_KEIL
  58172. "adcs r3, r3, %[r]\n\t"
  58173. #elif defined(__clang__)
  58174. "adcs r3, %[r]\n\t"
  58175. #else
  58176. "adc r3, %[r]\n\t"
  58177. #endif
  58178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58179. "adds r4, r4, r6\n\t"
  58180. #else
  58181. "add r4, r4, r6\n\t"
  58182. #endif
  58183. #ifdef WOLFSSL_KEIL
  58184. "adcs r2, r2, %[r]\n\t"
  58185. #elif defined(__clang__)
  58186. "adcs r2, %[r]\n\t"
  58187. #else
  58188. "adc r2, %[r]\n\t"
  58189. #endif
  58190. #ifdef WOLFSSL_KEIL
  58191. "adcs r3, r3, %[r]\n\t"
  58192. #elif defined(__clang__)
  58193. "adcs r3, %[r]\n\t"
  58194. #else
  58195. "adc r3, %[r]\n\t"
  58196. #endif
  58197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58198. "lsrs r6, r7, #16\n\t"
  58199. #else
  58200. "lsr r6, r7, #16\n\t"
  58201. #endif
  58202. #ifdef WOLFSSL_KEIL
  58203. "muls r5, r6, r5\n\t"
  58204. #elif defined(__clang__)
  58205. "muls r5, r6\n\t"
  58206. #else
  58207. "mul r5, r6\n\t"
  58208. #endif
  58209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58210. "lsrs r6, r5, #16\n\t"
  58211. #else
  58212. "lsr r6, r5, #16\n\t"
  58213. #endif
  58214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58215. "lsls r5, r5, #16\n\t"
  58216. #else
  58217. "lsl r5, r5, #16\n\t"
  58218. #endif
  58219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58220. "adds r4, r4, r5\n\t"
  58221. #else
  58222. "add r4, r4, r5\n\t"
  58223. #endif
  58224. #ifdef WOLFSSL_KEIL
  58225. "adcs r2, r2, r6\n\t"
  58226. #elif defined(__clang__)
  58227. "adcs r2, r6\n\t"
  58228. #else
  58229. "adc r2, r6\n\t"
  58230. #endif
  58231. #ifdef WOLFSSL_KEIL
  58232. "adcs r3, r3, %[r]\n\t"
  58233. #elif defined(__clang__)
  58234. "adcs r3, %[r]\n\t"
  58235. #else
  58236. "adc r3, %[r]\n\t"
  58237. #endif
  58238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58239. "adds r4, r4, r5\n\t"
  58240. #else
  58241. "add r4, r4, r5\n\t"
  58242. #endif
  58243. #ifdef WOLFSSL_KEIL
  58244. "adcs r2, r2, r6\n\t"
  58245. #elif defined(__clang__)
  58246. "adcs r2, r6\n\t"
  58247. #else
  58248. "adc r2, r6\n\t"
  58249. #endif
  58250. #ifdef WOLFSSL_KEIL
  58251. "adcs r3, r3, %[r]\n\t"
  58252. #elif defined(__clang__)
  58253. "adcs r3, %[r]\n\t"
  58254. #else
  58255. "adc r3, %[r]\n\t"
  58256. #endif
  58257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58258. "lsrs r5, %[a], #16\n\t"
  58259. #else
  58260. "lsr r5, %[a], #16\n\t"
  58261. #endif
  58262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58263. "lsrs r6, r7, #16\n\t"
  58264. #else
  58265. "lsr r6, r7, #16\n\t"
  58266. #endif
  58267. #ifdef WOLFSSL_KEIL
  58268. "muls r6, r5, r6\n\t"
  58269. #elif defined(__clang__)
  58270. "muls r6, r5\n\t"
  58271. #else
  58272. "mul r6, r5\n\t"
  58273. #endif
  58274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58275. "adds r2, r2, r6\n\t"
  58276. #else
  58277. "add r2, r2, r6\n\t"
  58278. #endif
  58279. #ifdef WOLFSSL_KEIL
  58280. "adcs r3, r3, %[r]\n\t"
  58281. #elif defined(__clang__)
  58282. "adcs r3, %[r]\n\t"
  58283. #else
  58284. "adc r3, %[r]\n\t"
  58285. #endif
  58286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58287. "adds r2, r2, r6\n\t"
  58288. #else
  58289. "add r2, r2, r6\n\t"
  58290. #endif
  58291. #ifdef WOLFSSL_KEIL
  58292. "adcs r3, r3, %[r]\n\t"
  58293. #elif defined(__clang__)
  58294. "adcs r3, %[r]\n\t"
  58295. #else
  58296. "adc r3, %[r]\n\t"
  58297. #endif
  58298. "uxth r6, r7\n\t"
  58299. #ifdef WOLFSSL_KEIL
  58300. "muls r5, r6, r5\n\t"
  58301. #elif defined(__clang__)
  58302. "muls r5, r6\n\t"
  58303. #else
  58304. "mul r5, r6\n\t"
  58305. #endif
  58306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58307. "lsrs r6, r5, #16\n\t"
  58308. #else
  58309. "lsr r6, r5, #16\n\t"
  58310. #endif
  58311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58312. "lsls r5, r5, #16\n\t"
  58313. #else
  58314. "lsl r5, r5, #16\n\t"
  58315. #endif
  58316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58317. "adds r4, r4, r5\n\t"
  58318. #else
  58319. "add r4, r4, r5\n\t"
  58320. #endif
  58321. #ifdef WOLFSSL_KEIL
  58322. "adcs r2, r2, r6\n\t"
  58323. #elif defined(__clang__)
  58324. "adcs r2, r6\n\t"
  58325. #else
  58326. "adc r2, r6\n\t"
  58327. #endif
  58328. #ifdef WOLFSSL_KEIL
  58329. "adcs r3, r3, %[r]\n\t"
  58330. #elif defined(__clang__)
  58331. "adcs r3, %[r]\n\t"
  58332. #else
  58333. "adc r3, %[r]\n\t"
  58334. #endif
  58335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58336. "adds r4, r4, r5\n\t"
  58337. #else
  58338. "add r4, r4, r5\n\t"
  58339. #endif
  58340. #ifdef WOLFSSL_KEIL
  58341. "adcs r2, r2, r6\n\t"
  58342. #elif defined(__clang__)
  58343. "adcs r2, r6\n\t"
  58344. #else
  58345. "adc r2, r6\n\t"
  58346. #endif
  58347. #ifdef WOLFSSL_KEIL
  58348. "adcs r3, r3, %[r]\n\t"
  58349. #elif defined(__clang__)
  58350. "adcs r3, %[r]\n\t"
  58351. #else
  58352. "adc r3, %[r]\n\t"
  58353. #endif
  58354. "# A[11] * A[0]\n\t"
  58355. "mov %[a], r9\n\t"
  58356. "mov r7, r10\n\t"
  58357. "ldr %[a], [%[a], #44]\n\t"
  58358. "uxth r5, %[a]\n\t"
  58359. "uxth r6, r7\n\t"
  58360. #ifdef WOLFSSL_KEIL
  58361. "muls r6, r5, r6\n\t"
  58362. #elif defined(__clang__)
  58363. "muls r6, r5\n\t"
  58364. #else
  58365. "mul r6, r5\n\t"
  58366. #endif
  58367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58368. "adds r4, r4, r6\n\t"
  58369. #else
  58370. "add r4, r4, r6\n\t"
  58371. #endif
  58372. #ifdef WOLFSSL_KEIL
  58373. "adcs r2, r2, %[r]\n\t"
  58374. #elif defined(__clang__)
  58375. "adcs r2, %[r]\n\t"
  58376. #else
  58377. "adc r2, %[r]\n\t"
  58378. #endif
  58379. #ifdef WOLFSSL_KEIL
  58380. "adcs r3, r3, %[r]\n\t"
  58381. #elif defined(__clang__)
  58382. "adcs r3, %[r]\n\t"
  58383. #else
  58384. "adc r3, %[r]\n\t"
  58385. #endif
  58386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58387. "adds r4, r4, r6\n\t"
  58388. #else
  58389. "add r4, r4, r6\n\t"
  58390. #endif
  58391. #ifdef WOLFSSL_KEIL
  58392. "adcs r2, r2, %[r]\n\t"
  58393. #elif defined(__clang__)
  58394. "adcs r2, %[r]\n\t"
  58395. #else
  58396. "adc r2, %[r]\n\t"
  58397. #endif
  58398. #ifdef WOLFSSL_KEIL
  58399. "adcs r3, r3, %[r]\n\t"
  58400. #elif defined(__clang__)
  58401. "adcs r3, %[r]\n\t"
  58402. #else
  58403. "adc r3, %[r]\n\t"
  58404. #endif
  58405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58406. "lsrs r6, r7, #16\n\t"
  58407. #else
  58408. "lsr r6, r7, #16\n\t"
  58409. #endif
  58410. #ifdef WOLFSSL_KEIL
  58411. "muls r5, r6, r5\n\t"
  58412. #elif defined(__clang__)
  58413. "muls r5, r6\n\t"
  58414. #else
  58415. "mul r5, r6\n\t"
  58416. #endif
  58417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58418. "lsrs r6, r5, #16\n\t"
  58419. #else
  58420. "lsr r6, r5, #16\n\t"
  58421. #endif
  58422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58423. "lsls r5, r5, #16\n\t"
  58424. #else
  58425. "lsl r5, r5, #16\n\t"
  58426. #endif
  58427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58428. "adds r4, r4, r5\n\t"
  58429. #else
  58430. "add r4, r4, r5\n\t"
  58431. #endif
  58432. #ifdef WOLFSSL_KEIL
  58433. "adcs r2, r2, r6\n\t"
  58434. #elif defined(__clang__)
  58435. "adcs r2, r6\n\t"
  58436. #else
  58437. "adc r2, r6\n\t"
  58438. #endif
  58439. #ifdef WOLFSSL_KEIL
  58440. "adcs r3, r3, %[r]\n\t"
  58441. #elif defined(__clang__)
  58442. "adcs r3, %[r]\n\t"
  58443. #else
  58444. "adc r3, %[r]\n\t"
  58445. #endif
  58446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58447. "adds r4, r4, r5\n\t"
  58448. #else
  58449. "add r4, r4, r5\n\t"
  58450. #endif
  58451. #ifdef WOLFSSL_KEIL
  58452. "adcs r2, r2, r6\n\t"
  58453. #elif defined(__clang__)
  58454. "adcs r2, r6\n\t"
  58455. #else
  58456. "adc r2, r6\n\t"
  58457. #endif
  58458. #ifdef WOLFSSL_KEIL
  58459. "adcs r3, r3, %[r]\n\t"
  58460. #elif defined(__clang__)
  58461. "adcs r3, %[r]\n\t"
  58462. #else
  58463. "adc r3, %[r]\n\t"
  58464. #endif
  58465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58466. "lsrs r5, %[a], #16\n\t"
  58467. #else
  58468. "lsr r5, %[a], #16\n\t"
  58469. #endif
  58470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58471. "lsrs r6, r7, #16\n\t"
  58472. #else
  58473. "lsr r6, r7, #16\n\t"
  58474. #endif
  58475. #ifdef WOLFSSL_KEIL
  58476. "muls r6, r5, r6\n\t"
  58477. #elif defined(__clang__)
  58478. "muls r6, r5\n\t"
  58479. #else
  58480. "mul r6, r5\n\t"
  58481. #endif
  58482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58483. "adds r2, r2, r6\n\t"
  58484. #else
  58485. "add r2, r2, r6\n\t"
  58486. #endif
  58487. #ifdef WOLFSSL_KEIL
  58488. "adcs r3, r3, %[r]\n\t"
  58489. #elif defined(__clang__)
  58490. "adcs r3, %[r]\n\t"
  58491. #else
  58492. "adc r3, %[r]\n\t"
  58493. #endif
  58494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58495. "adds r2, r2, r6\n\t"
  58496. #else
  58497. "add r2, r2, r6\n\t"
  58498. #endif
  58499. #ifdef WOLFSSL_KEIL
  58500. "adcs r3, r3, %[r]\n\t"
  58501. #elif defined(__clang__)
  58502. "adcs r3, %[r]\n\t"
  58503. #else
  58504. "adc r3, %[r]\n\t"
  58505. #endif
  58506. "uxth r6, r7\n\t"
  58507. #ifdef WOLFSSL_KEIL
  58508. "muls r5, r6, r5\n\t"
  58509. #elif defined(__clang__)
  58510. "muls r5, r6\n\t"
  58511. #else
  58512. "mul r5, r6\n\t"
  58513. #endif
  58514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58515. "lsrs r6, r5, #16\n\t"
  58516. #else
  58517. "lsr r6, r5, #16\n\t"
  58518. #endif
  58519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58520. "lsls r5, r5, #16\n\t"
  58521. #else
  58522. "lsl r5, r5, #16\n\t"
  58523. #endif
  58524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58525. "adds r4, r4, r5\n\t"
  58526. #else
  58527. "add r4, r4, r5\n\t"
  58528. #endif
  58529. #ifdef WOLFSSL_KEIL
  58530. "adcs r2, r2, r6\n\t"
  58531. #elif defined(__clang__)
  58532. "adcs r2, r6\n\t"
  58533. #else
  58534. "adc r2, r6\n\t"
  58535. #endif
  58536. #ifdef WOLFSSL_KEIL
  58537. "adcs r3, r3, %[r]\n\t"
  58538. #elif defined(__clang__)
  58539. "adcs r3, %[r]\n\t"
  58540. #else
  58541. "adc r3, %[r]\n\t"
  58542. #endif
  58543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58544. "adds r4, r4, r5\n\t"
  58545. #else
  58546. "add r4, r4, r5\n\t"
  58547. #endif
  58548. #ifdef WOLFSSL_KEIL
  58549. "adcs r2, r2, r6\n\t"
  58550. #elif defined(__clang__)
  58551. "adcs r2, r6\n\t"
  58552. #else
  58553. "adc r2, r6\n\t"
  58554. #endif
  58555. #ifdef WOLFSSL_KEIL
  58556. "adcs r3, r3, %[r]\n\t"
  58557. #elif defined(__clang__)
  58558. "adcs r3, %[r]\n\t"
  58559. #else
  58560. "adc r3, %[r]\n\t"
  58561. #endif
  58562. "str r4, [sp, #44]\n\t"
  58563. "# A[11] * A[1]\n\t"
  58564. "movs r4, #0\n\t"
  58565. "mov %[a], r9\n\t"
  58566. "mov r7, r11\n\t"
  58567. "ldr %[a], [%[a], #44]\n\t"
  58568. "uxth r5, %[a]\n\t"
  58569. "uxth r6, r7\n\t"
  58570. #ifdef WOLFSSL_KEIL
  58571. "muls r6, r5, r6\n\t"
  58572. #elif defined(__clang__)
  58573. "muls r6, r5\n\t"
  58574. #else
  58575. "mul r6, r5\n\t"
  58576. #endif
  58577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58578. "adds r2, r2, r6\n\t"
  58579. #else
  58580. "add r2, r2, r6\n\t"
  58581. #endif
  58582. #ifdef WOLFSSL_KEIL
  58583. "adcs r3, r3, %[r]\n\t"
  58584. #elif defined(__clang__)
  58585. "adcs r3, %[r]\n\t"
  58586. #else
  58587. "adc r3, %[r]\n\t"
  58588. #endif
  58589. #ifdef WOLFSSL_KEIL
  58590. "adcs r4, r4, %[r]\n\t"
  58591. #elif defined(__clang__)
  58592. "adcs r4, %[r]\n\t"
  58593. #else
  58594. "adc r4, %[r]\n\t"
  58595. #endif
  58596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58597. "adds r2, r2, r6\n\t"
  58598. #else
  58599. "add r2, r2, r6\n\t"
  58600. #endif
  58601. #ifdef WOLFSSL_KEIL
  58602. "adcs r3, r3, %[r]\n\t"
  58603. #elif defined(__clang__)
  58604. "adcs r3, %[r]\n\t"
  58605. #else
  58606. "adc r3, %[r]\n\t"
  58607. #endif
  58608. #ifdef WOLFSSL_KEIL
  58609. "adcs r4, r4, %[r]\n\t"
  58610. #elif defined(__clang__)
  58611. "adcs r4, %[r]\n\t"
  58612. #else
  58613. "adc r4, %[r]\n\t"
  58614. #endif
  58615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58616. "lsrs r6, r7, #16\n\t"
  58617. #else
  58618. "lsr r6, r7, #16\n\t"
  58619. #endif
  58620. #ifdef WOLFSSL_KEIL
  58621. "muls r5, r6, r5\n\t"
  58622. #elif defined(__clang__)
  58623. "muls r5, r6\n\t"
  58624. #else
  58625. "mul r5, r6\n\t"
  58626. #endif
  58627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58628. "lsrs r6, r5, #16\n\t"
  58629. #else
  58630. "lsr r6, r5, #16\n\t"
  58631. #endif
  58632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58633. "lsls r5, r5, #16\n\t"
  58634. #else
  58635. "lsl r5, r5, #16\n\t"
  58636. #endif
  58637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58638. "adds r2, r2, r5\n\t"
  58639. #else
  58640. "add r2, r2, r5\n\t"
  58641. #endif
  58642. #ifdef WOLFSSL_KEIL
  58643. "adcs r3, r3, r6\n\t"
  58644. #elif defined(__clang__)
  58645. "adcs r3, r6\n\t"
  58646. #else
  58647. "adc r3, r6\n\t"
  58648. #endif
  58649. #ifdef WOLFSSL_KEIL
  58650. "adcs r4, r4, %[r]\n\t"
  58651. #elif defined(__clang__)
  58652. "adcs r4, %[r]\n\t"
  58653. #else
  58654. "adc r4, %[r]\n\t"
  58655. #endif
  58656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58657. "adds r2, r2, r5\n\t"
  58658. #else
  58659. "add r2, r2, r5\n\t"
  58660. #endif
  58661. #ifdef WOLFSSL_KEIL
  58662. "adcs r3, r3, r6\n\t"
  58663. #elif defined(__clang__)
  58664. "adcs r3, r6\n\t"
  58665. #else
  58666. "adc r3, r6\n\t"
  58667. #endif
  58668. #ifdef WOLFSSL_KEIL
  58669. "adcs r4, r4, %[r]\n\t"
  58670. #elif defined(__clang__)
  58671. "adcs r4, %[r]\n\t"
  58672. #else
  58673. "adc r4, %[r]\n\t"
  58674. #endif
  58675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58676. "lsrs r5, %[a], #16\n\t"
  58677. #else
  58678. "lsr r5, %[a], #16\n\t"
  58679. #endif
  58680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58681. "lsrs r6, r7, #16\n\t"
  58682. #else
  58683. "lsr r6, r7, #16\n\t"
  58684. #endif
  58685. #ifdef WOLFSSL_KEIL
  58686. "muls r6, r5, r6\n\t"
  58687. #elif defined(__clang__)
  58688. "muls r6, r5\n\t"
  58689. #else
  58690. "mul r6, r5\n\t"
  58691. #endif
  58692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58693. "adds r3, r3, r6\n\t"
  58694. #else
  58695. "add r3, r3, r6\n\t"
  58696. #endif
  58697. #ifdef WOLFSSL_KEIL
  58698. "adcs r4, r4, %[r]\n\t"
  58699. #elif defined(__clang__)
  58700. "adcs r4, %[r]\n\t"
  58701. #else
  58702. "adc r4, %[r]\n\t"
  58703. #endif
  58704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58705. "adds r3, r3, r6\n\t"
  58706. #else
  58707. "add r3, r3, r6\n\t"
  58708. #endif
  58709. #ifdef WOLFSSL_KEIL
  58710. "adcs r4, r4, %[r]\n\t"
  58711. #elif defined(__clang__)
  58712. "adcs r4, %[r]\n\t"
  58713. #else
  58714. "adc r4, %[r]\n\t"
  58715. #endif
  58716. "uxth r6, r7\n\t"
  58717. #ifdef WOLFSSL_KEIL
  58718. "muls r5, r6, r5\n\t"
  58719. #elif defined(__clang__)
  58720. "muls r5, r6\n\t"
  58721. #else
  58722. "mul r5, r6\n\t"
  58723. #endif
  58724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58725. "lsrs r6, r5, #16\n\t"
  58726. #else
  58727. "lsr r6, r5, #16\n\t"
  58728. #endif
  58729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58730. "lsls r5, r5, #16\n\t"
  58731. #else
  58732. "lsl r5, r5, #16\n\t"
  58733. #endif
  58734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58735. "adds r2, r2, r5\n\t"
  58736. #else
  58737. "add r2, r2, r5\n\t"
  58738. #endif
  58739. #ifdef WOLFSSL_KEIL
  58740. "adcs r3, r3, r6\n\t"
  58741. #elif defined(__clang__)
  58742. "adcs r3, r6\n\t"
  58743. #else
  58744. "adc r3, r6\n\t"
  58745. #endif
  58746. #ifdef WOLFSSL_KEIL
  58747. "adcs r4, r4, %[r]\n\t"
  58748. #elif defined(__clang__)
  58749. "adcs r4, %[r]\n\t"
  58750. #else
  58751. "adc r4, %[r]\n\t"
  58752. #endif
  58753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58754. "adds r2, r2, r5\n\t"
  58755. #else
  58756. "add r2, r2, r5\n\t"
  58757. #endif
  58758. #ifdef WOLFSSL_KEIL
  58759. "adcs r3, r3, r6\n\t"
  58760. #elif defined(__clang__)
  58761. "adcs r3, r6\n\t"
  58762. #else
  58763. "adc r3, r6\n\t"
  58764. #endif
  58765. #ifdef WOLFSSL_KEIL
  58766. "adcs r4, r4, %[r]\n\t"
  58767. #elif defined(__clang__)
  58768. "adcs r4, %[r]\n\t"
  58769. #else
  58770. "adc r4, %[r]\n\t"
  58771. #endif
  58772. "# A[10] * A[2]\n\t"
  58773. "mov %[a], r9\n\t"
  58774. "mov r7, r12\n\t"
  58775. "ldr %[a], [%[a], #40]\n\t"
  58776. "uxth r5, %[a]\n\t"
  58777. "uxth r6, r7\n\t"
  58778. #ifdef WOLFSSL_KEIL
  58779. "muls r6, r5, r6\n\t"
  58780. #elif defined(__clang__)
  58781. "muls r6, r5\n\t"
  58782. #else
  58783. "mul r6, r5\n\t"
  58784. #endif
  58785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58786. "adds r2, r2, r6\n\t"
  58787. #else
  58788. "add r2, r2, r6\n\t"
  58789. #endif
  58790. #ifdef WOLFSSL_KEIL
  58791. "adcs r3, r3, %[r]\n\t"
  58792. #elif defined(__clang__)
  58793. "adcs r3, %[r]\n\t"
  58794. #else
  58795. "adc r3, %[r]\n\t"
  58796. #endif
  58797. #ifdef WOLFSSL_KEIL
  58798. "adcs r4, r4, %[r]\n\t"
  58799. #elif defined(__clang__)
  58800. "adcs r4, %[r]\n\t"
  58801. #else
  58802. "adc r4, %[r]\n\t"
  58803. #endif
  58804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58805. "adds r2, r2, r6\n\t"
  58806. #else
  58807. "add r2, r2, r6\n\t"
  58808. #endif
  58809. #ifdef WOLFSSL_KEIL
  58810. "adcs r3, r3, %[r]\n\t"
  58811. #elif defined(__clang__)
  58812. "adcs r3, %[r]\n\t"
  58813. #else
  58814. "adc r3, %[r]\n\t"
  58815. #endif
  58816. #ifdef WOLFSSL_KEIL
  58817. "adcs r4, r4, %[r]\n\t"
  58818. #elif defined(__clang__)
  58819. "adcs r4, %[r]\n\t"
  58820. #else
  58821. "adc r4, %[r]\n\t"
  58822. #endif
  58823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58824. "lsrs r6, r7, #16\n\t"
  58825. #else
  58826. "lsr r6, r7, #16\n\t"
  58827. #endif
  58828. #ifdef WOLFSSL_KEIL
  58829. "muls r5, r6, r5\n\t"
  58830. #elif defined(__clang__)
  58831. "muls r5, r6\n\t"
  58832. #else
  58833. "mul r5, r6\n\t"
  58834. #endif
  58835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58836. "lsrs r6, r5, #16\n\t"
  58837. #else
  58838. "lsr r6, r5, #16\n\t"
  58839. #endif
  58840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58841. "lsls r5, r5, #16\n\t"
  58842. #else
  58843. "lsl r5, r5, #16\n\t"
  58844. #endif
  58845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58846. "adds r2, r2, r5\n\t"
  58847. #else
  58848. "add r2, r2, r5\n\t"
  58849. #endif
  58850. #ifdef WOLFSSL_KEIL
  58851. "adcs r3, r3, r6\n\t"
  58852. #elif defined(__clang__)
  58853. "adcs r3, r6\n\t"
  58854. #else
  58855. "adc r3, r6\n\t"
  58856. #endif
  58857. #ifdef WOLFSSL_KEIL
  58858. "adcs r4, r4, %[r]\n\t"
  58859. #elif defined(__clang__)
  58860. "adcs r4, %[r]\n\t"
  58861. #else
  58862. "adc r4, %[r]\n\t"
  58863. #endif
  58864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58865. "adds r2, r2, r5\n\t"
  58866. #else
  58867. "add r2, r2, r5\n\t"
  58868. #endif
  58869. #ifdef WOLFSSL_KEIL
  58870. "adcs r3, r3, r6\n\t"
  58871. #elif defined(__clang__)
  58872. "adcs r3, r6\n\t"
  58873. #else
  58874. "adc r3, r6\n\t"
  58875. #endif
  58876. #ifdef WOLFSSL_KEIL
  58877. "adcs r4, r4, %[r]\n\t"
  58878. #elif defined(__clang__)
  58879. "adcs r4, %[r]\n\t"
  58880. #else
  58881. "adc r4, %[r]\n\t"
  58882. #endif
  58883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58884. "lsrs r5, %[a], #16\n\t"
  58885. #else
  58886. "lsr r5, %[a], #16\n\t"
  58887. #endif
  58888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58889. "lsrs r6, r7, #16\n\t"
  58890. #else
  58891. "lsr r6, r7, #16\n\t"
  58892. #endif
  58893. #ifdef WOLFSSL_KEIL
  58894. "muls r6, r5, r6\n\t"
  58895. #elif defined(__clang__)
  58896. "muls r6, r5\n\t"
  58897. #else
  58898. "mul r6, r5\n\t"
  58899. #endif
  58900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58901. "adds r3, r3, r6\n\t"
  58902. #else
  58903. "add r3, r3, r6\n\t"
  58904. #endif
  58905. #ifdef WOLFSSL_KEIL
  58906. "adcs r4, r4, %[r]\n\t"
  58907. #elif defined(__clang__)
  58908. "adcs r4, %[r]\n\t"
  58909. #else
  58910. "adc r4, %[r]\n\t"
  58911. #endif
  58912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58913. "adds r3, r3, r6\n\t"
  58914. #else
  58915. "add r3, r3, r6\n\t"
  58916. #endif
  58917. #ifdef WOLFSSL_KEIL
  58918. "adcs r4, r4, %[r]\n\t"
  58919. #elif defined(__clang__)
  58920. "adcs r4, %[r]\n\t"
  58921. #else
  58922. "adc r4, %[r]\n\t"
  58923. #endif
  58924. "uxth r6, r7\n\t"
  58925. #ifdef WOLFSSL_KEIL
  58926. "muls r5, r6, r5\n\t"
  58927. #elif defined(__clang__)
  58928. "muls r5, r6\n\t"
  58929. #else
  58930. "mul r5, r6\n\t"
  58931. #endif
  58932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58933. "lsrs r6, r5, #16\n\t"
  58934. #else
  58935. "lsr r6, r5, #16\n\t"
  58936. #endif
  58937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58938. "lsls r5, r5, #16\n\t"
  58939. #else
  58940. "lsl r5, r5, #16\n\t"
  58941. #endif
  58942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58943. "adds r2, r2, r5\n\t"
  58944. #else
  58945. "add r2, r2, r5\n\t"
  58946. #endif
  58947. #ifdef WOLFSSL_KEIL
  58948. "adcs r3, r3, r6\n\t"
  58949. #elif defined(__clang__)
  58950. "adcs r3, r6\n\t"
  58951. #else
  58952. "adc r3, r6\n\t"
  58953. #endif
  58954. #ifdef WOLFSSL_KEIL
  58955. "adcs r4, r4, %[r]\n\t"
  58956. #elif defined(__clang__)
  58957. "adcs r4, %[r]\n\t"
  58958. #else
  58959. "adc r4, %[r]\n\t"
  58960. #endif
  58961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58962. "adds r2, r2, r5\n\t"
  58963. #else
  58964. "add r2, r2, r5\n\t"
  58965. #endif
  58966. #ifdef WOLFSSL_KEIL
  58967. "adcs r3, r3, r6\n\t"
  58968. #elif defined(__clang__)
  58969. "adcs r3, r6\n\t"
  58970. #else
  58971. "adc r3, r6\n\t"
  58972. #endif
  58973. #ifdef WOLFSSL_KEIL
  58974. "adcs r4, r4, %[r]\n\t"
  58975. #elif defined(__clang__)
  58976. "adcs r4, %[r]\n\t"
  58977. #else
  58978. "adc r4, %[r]\n\t"
  58979. #endif
  58980. "# A[9] * A[3]\n\t"
  58981. "mov %[a], r9\n\t"
  58982. "mov r7, lr\n\t"
  58983. "ldr %[a], [%[a], #36]\n\t"
  58984. "uxth r5, %[a]\n\t"
  58985. "uxth r6, r7\n\t"
  58986. #ifdef WOLFSSL_KEIL
  58987. "muls r6, r5, r6\n\t"
  58988. #elif defined(__clang__)
  58989. "muls r6, r5\n\t"
  58990. #else
  58991. "mul r6, r5\n\t"
  58992. #endif
  58993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58994. "adds r2, r2, r6\n\t"
  58995. #else
  58996. "add r2, r2, r6\n\t"
  58997. #endif
  58998. #ifdef WOLFSSL_KEIL
  58999. "adcs r3, r3, %[r]\n\t"
  59000. #elif defined(__clang__)
  59001. "adcs r3, %[r]\n\t"
  59002. #else
  59003. "adc r3, %[r]\n\t"
  59004. #endif
  59005. #ifdef WOLFSSL_KEIL
  59006. "adcs r4, r4, %[r]\n\t"
  59007. #elif defined(__clang__)
  59008. "adcs r4, %[r]\n\t"
  59009. #else
  59010. "adc r4, %[r]\n\t"
  59011. #endif
  59012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59013. "adds r2, r2, r6\n\t"
  59014. #else
  59015. "add r2, r2, r6\n\t"
  59016. #endif
  59017. #ifdef WOLFSSL_KEIL
  59018. "adcs r3, r3, %[r]\n\t"
  59019. #elif defined(__clang__)
  59020. "adcs r3, %[r]\n\t"
  59021. #else
  59022. "adc r3, %[r]\n\t"
  59023. #endif
  59024. #ifdef WOLFSSL_KEIL
  59025. "adcs r4, r4, %[r]\n\t"
  59026. #elif defined(__clang__)
  59027. "adcs r4, %[r]\n\t"
  59028. #else
  59029. "adc r4, %[r]\n\t"
  59030. #endif
  59031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59032. "lsrs r6, r7, #16\n\t"
  59033. #else
  59034. "lsr r6, r7, #16\n\t"
  59035. #endif
  59036. #ifdef WOLFSSL_KEIL
  59037. "muls r5, r6, r5\n\t"
  59038. #elif defined(__clang__)
  59039. "muls r5, r6\n\t"
  59040. #else
  59041. "mul r5, r6\n\t"
  59042. #endif
  59043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59044. "lsrs r6, r5, #16\n\t"
  59045. #else
  59046. "lsr r6, r5, #16\n\t"
  59047. #endif
  59048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59049. "lsls r5, r5, #16\n\t"
  59050. #else
  59051. "lsl r5, r5, #16\n\t"
  59052. #endif
  59053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59054. "adds r2, r2, r5\n\t"
  59055. #else
  59056. "add r2, r2, r5\n\t"
  59057. #endif
  59058. #ifdef WOLFSSL_KEIL
  59059. "adcs r3, r3, r6\n\t"
  59060. #elif defined(__clang__)
  59061. "adcs r3, r6\n\t"
  59062. #else
  59063. "adc r3, r6\n\t"
  59064. #endif
  59065. #ifdef WOLFSSL_KEIL
  59066. "adcs r4, r4, %[r]\n\t"
  59067. #elif defined(__clang__)
  59068. "adcs r4, %[r]\n\t"
  59069. #else
  59070. "adc r4, %[r]\n\t"
  59071. #endif
  59072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59073. "adds r2, r2, r5\n\t"
  59074. #else
  59075. "add r2, r2, r5\n\t"
  59076. #endif
  59077. #ifdef WOLFSSL_KEIL
  59078. "adcs r3, r3, r6\n\t"
  59079. #elif defined(__clang__)
  59080. "adcs r3, r6\n\t"
  59081. #else
  59082. "adc r3, r6\n\t"
  59083. #endif
  59084. #ifdef WOLFSSL_KEIL
  59085. "adcs r4, r4, %[r]\n\t"
  59086. #elif defined(__clang__)
  59087. "adcs r4, %[r]\n\t"
  59088. #else
  59089. "adc r4, %[r]\n\t"
  59090. #endif
  59091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59092. "lsrs r5, %[a], #16\n\t"
  59093. #else
  59094. "lsr r5, %[a], #16\n\t"
  59095. #endif
  59096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59097. "lsrs r6, r7, #16\n\t"
  59098. #else
  59099. "lsr r6, r7, #16\n\t"
  59100. #endif
  59101. #ifdef WOLFSSL_KEIL
  59102. "muls r6, r5, r6\n\t"
  59103. #elif defined(__clang__)
  59104. "muls r6, r5\n\t"
  59105. #else
  59106. "mul r6, r5\n\t"
  59107. #endif
  59108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59109. "adds r3, r3, r6\n\t"
  59110. #else
  59111. "add r3, r3, r6\n\t"
  59112. #endif
  59113. #ifdef WOLFSSL_KEIL
  59114. "adcs r4, r4, %[r]\n\t"
  59115. #elif defined(__clang__)
  59116. "adcs r4, %[r]\n\t"
  59117. #else
  59118. "adc r4, %[r]\n\t"
  59119. #endif
  59120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59121. "adds r3, r3, r6\n\t"
  59122. #else
  59123. "add r3, r3, r6\n\t"
  59124. #endif
  59125. #ifdef WOLFSSL_KEIL
  59126. "adcs r4, r4, %[r]\n\t"
  59127. #elif defined(__clang__)
  59128. "adcs r4, %[r]\n\t"
  59129. #else
  59130. "adc r4, %[r]\n\t"
  59131. #endif
  59132. "uxth r6, r7\n\t"
  59133. #ifdef WOLFSSL_KEIL
  59134. "muls r5, r6, r5\n\t"
  59135. #elif defined(__clang__)
  59136. "muls r5, r6\n\t"
  59137. #else
  59138. "mul r5, r6\n\t"
  59139. #endif
  59140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59141. "lsrs r6, r5, #16\n\t"
  59142. #else
  59143. "lsr r6, r5, #16\n\t"
  59144. #endif
  59145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59146. "lsls r5, r5, #16\n\t"
  59147. #else
  59148. "lsl r5, r5, #16\n\t"
  59149. #endif
  59150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59151. "adds r2, r2, r5\n\t"
  59152. #else
  59153. "add r2, r2, r5\n\t"
  59154. #endif
  59155. #ifdef WOLFSSL_KEIL
  59156. "adcs r3, r3, r6\n\t"
  59157. #elif defined(__clang__)
  59158. "adcs r3, r6\n\t"
  59159. #else
  59160. "adc r3, r6\n\t"
  59161. #endif
  59162. #ifdef WOLFSSL_KEIL
  59163. "adcs r4, r4, %[r]\n\t"
  59164. #elif defined(__clang__)
  59165. "adcs r4, %[r]\n\t"
  59166. #else
  59167. "adc r4, %[r]\n\t"
  59168. #endif
  59169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59170. "adds r2, r2, r5\n\t"
  59171. #else
  59172. "add r2, r2, r5\n\t"
  59173. #endif
  59174. #ifdef WOLFSSL_KEIL
  59175. "adcs r3, r3, r6\n\t"
  59176. #elif defined(__clang__)
  59177. "adcs r3, r6\n\t"
  59178. #else
  59179. "adc r3, r6\n\t"
  59180. #endif
  59181. #ifdef WOLFSSL_KEIL
  59182. "adcs r4, r4, %[r]\n\t"
  59183. #elif defined(__clang__)
  59184. "adcs r4, %[r]\n\t"
  59185. #else
  59186. "adc r4, %[r]\n\t"
  59187. #endif
  59188. "# A[8] * A[4]\n\t"
  59189. "mov %[a], r9\n\t"
  59190. "ldr r7, [%[a], #16]\n\t"
  59191. "ldr %[a], [%[a], #32]\n\t"
  59192. "uxth r5, %[a]\n\t"
  59193. "uxth r6, r7\n\t"
  59194. #ifdef WOLFSSL_KEIL
  59195. "muls r6, r5, r6\n\t"
  59196. #elif defined(__clang__)
  59197. "muls r6, r5\n\t"
  59198. #else
  59199. "mul r6, r5\n\t"
  59200. #endif
  59201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59202. "adds r2, r2, r6\n\t"
  59203. #else
  59204. "add r2, r2, r6\n\t"
  59205. #endif
  59206. #ifdef WOLFSSL_KEIL
  59207. "adcs r3, r3, %[r]\n\t"
  59208. #elif defined(__clang__)
  59209. "adcs r3, %[r]\n\t"
  59210. #else
  59211. "adc r3, %[r]\n\t"
  59212. #endif
  59213. #ifdef WOLFSSL_KEIL
  59214. "adcs r4, r4, %[r]\n\t"
  59215. #elif defined(__clang__)
  59216. "adcs r4, %[r]\n\t"
  59217. #else
  59218. "adc r4, %[r]\n\t"
  59219. #endif
  59220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59221. "adds r2, r2, r6\n\t"
  59222. #else
  59223. "add r2, r2, r6\n\t"
  59224. #endif
  59225. #ifdef WOLFSSL_KEIL
  59226. "adcs r3, r3, %[r]\n\t"
  59227. #elif defined(__clang__)
  59228. "adcs r3, %[r]\n\t"
  59229. #else
  59230. "adc r3, %[r]\n\t"
  59231. #endif
  59232. #ifdef WOLFSSL_KEIL
  59233. "adcs r4, r4, %[r]\n\t"
  59234. #elif defined(__clang__)
  59235. "adcs r4, %[r]\n\t"
  59236. #else
  59237. "adc r4, %[r]\n\t"
  59238. #endif
  59239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59240. "lsrs r6, r7, #16\n\t"
  59241. #else
  59242. "lsr r6, r7, #16\n\t"
  59243. #endif
  59244. #ifdef WOLFSSL_KEIL
  59245. "muls r5, r6, r5\n\t"
  59246. #elif defined(__clang__)
  59247. "muls r5, r6\n\t"
  59248. #else
  59249. "mul r5, r6\n\t"
  59250. #endif
  59251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59252. "lsrs r6, r5, #16\n\t"
  59253. #else
  59254. "lsr r6, r5, #16\n\t"
  59255. #endif
  59256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59257. "lsls r5, r5, #16\n\t"
  59258. #else
  59259. "lsl r5, r5, #16\n\t"
  59260. #endif
  59261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59262. "adds r2, r2, r5\n\t"
  59263. #else
  59264. "add r2, r2, r5\n\t"
  59265. #endif
  59266. #ifdef WOLFSSL_KEIL
  59267. "adcs r3, r3, r6\n\t"
  59268. #elif defined(__clang__)
  59269. "adcs r3, r6\n\t"
  59270. #else
  59271. "adc r3, r6\n\t"
  59272. #endif
  59273. #ifdef WOLFSSL_KEIL
  59274. "adcs r4, r4, %[r]\n\t"
  59275. #elif defined(__clang__)
  59276. "adcs r4, %[r]\n\t"
  59277. #else
  59278. "adc r4, %[r]\n\t"
  59279. #endif
  59280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59281. "adds r2, r2, r5\n\t"
  59282. #else
  59283. "add r2, r2, r5\n\t"
  59284. #endif
  59285. #ifdef WOLFSSL_KEIL
  59286. "adcs r3, r3, r6\n\t"
  59287. #elif defined(__clang__)
  59288. "adcs r3, r6\n\t"
  59289. #else
  59290. "adc r3, r6\n\t"
  59291. #endif
  59292. #ifdef WOLFSSL_KEIL
  59293. "adcs r4, r4, %[r]\n\t"
  59294. #elif defined(__clang__)
  59295. "adcs r4, %[r]\n\t"
  59296. #else
  59297. "adc r4, %[r]\n\t"
  59298. #endif
  59299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59300. "lsrs r5, %[a], #16\n\t"
  59301. #else
  59302. "lsr r5, %[a], #16\n\t"
  59303. #endif
  59304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59305. "lsrs r6, r7, #16\n\t"
  59306. #else
  59307. "lsr r6, r7, #16\n\t"
  59308. #endif
  59309. #ifdef WOLFSSL_KEIL
  59310. "muls r6, r5, r6\n\t"
  59311. #elif defined(__clang__)
  59312. "muls r6, r5\n\t"
  59313. #else
  59314. "mul r6, r5\n\t"
  59315. #endif
  59316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59317. "adds r3, r3, r6\n\t"
  59318. #else
  59319. "add r3, r3, r6\n\t"
  59320. #endif
  59321. #ifdef WOLFSSL_KEIL
  59322. "adcs r4, r4, %[r]\n\t"
  59323. #elif defined(__clang__)
  59324. "adcs r4, %[r]\n\t"
  59325. #else
  59326. "adc r4, %[r]\n\t"
  59327. #endif
  59328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59329. "adds r3, r3, r6\n\t"
  59330. #else
  59331. "add r3, r3, r6\n\t"
  59332. #endif
  59333. #ifdef WOLFSSL_KEIL
  59334. "adcs r4, r4, %[r]\n\t"
  59335. #elif defined(__clang__)
  59336. "adcs r4, %[r]\n\t"
  59337. #else
  59338. "adc r4, %[r]\n\t"
  59339. #endif
  59340. "uxth r6, r7\n\t"
  59341. #ifdef WOLFSSL_KEIL
  59342. "muls r5, r6, r5\n\t"
  59343. #elif defined(__clang__)
  59344. "muls r5, r6\n\t"
  59345. #else
  59346. "mul r5, r6\n\t"
  59347. #endif
  59348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59349. "lsrs r6, r5, #16\n\t"
  59350. #else
  59351. "lsr r6, r5, #16\n\t"
  59352. #endif
  59353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59354. "lsls r5, r5, #16\n\t"
  59355. #else
  59356. "lsl r5, r5, #16\n\t"
  59357. #endif
  59358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59359. "adds r2, r2, r5\n\t"
  59360. #else
  59361. "add r2, r2, r5\n\t"
  59362. #endif
  59363. #ifdef WOLFSSL_KEIL
  59364. "adcs r3, r3, r6\n\t"
  59365. #elif defined(__clang__)
  59366. "adcs r3, r6\n\t"
  59367. #else
  59368. "adc r3, r6\n\t"
  59369. #endif
  59370. #ifdef WOLFSSL_KEIL
  59371. "adcs r4, r4, %[r]\n\t"
  59372. #elif defined(__clang__)
  59373. "adcs r4, %[r]\n\t"
  59374. #else
  59375. "adc r4, %[r]\n\t"
  59376. #endif
  59377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59378. "adds r2, r2, r5\n\t"
  59379. #else
  59380. "add r2, r2, r5\n\t"
  59381. #endif
  59382. #ifdef WOLFSSL_KEIL
  59383. "adcs r3, r3, r6\n\t"
  59384. #elif defined(__clang__)
  59385. "adcs r3, r6\n\t"
  59386. #else
  59387. "adc r3, r6\n\t"
  59388. #endif
  59389. #ifdef WOLFSSL_KEIL
  59390. "adcs r4, r4, %[r]\n\t"
  59391. #elif defined(__clang__)
  59392. "adcs r4, %[r]\n\t"
  59393. #else
  59394. "adc r4, %[r]\n\t"
  59395. #endif
  59396. "# A[7] * A[5]\n\t"
  59397. "mov %[a], r9\n\t"
  59398. "ldr r7, [%[a], #20]\n\t"
  59399. "ldr %[a], [%[a], #28]\n\t"
  59400. "uxth r5, %[a]\n\t"
  59401. "uxth r6, r7\n\t"
  59402. #ifdef WOLFSSL_KEIL
  59403. "muls r6, r5, r6\n\t"
  59404. #elif defined(__clang__)
  59405. "muls r6, r5\n\t"
  59406. #else
  59407. "mul r6, r5\n\t"
  59408. #endif
  59409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59410. "adds r2, r2, r6\n\t"
  59411. #else
  59412. "add r2, r2, r6\n\t"
  59413. #endif
  59414. #ifdef WOLFSSL_KEIL
  59415. "adcs r3, r3, %[r]\n\t"
  59416. #elif defined(__clang__)
  59417. "adcs r3, %[r]\n\t"
  59418. #else
  59419. "adc r3, %[r]\n\t"
  59420. #endif
  59421. #ifdef WOLFSSL_KEIL
  59422. "adcs r4, r4, %[r]\n\t"
  59423. #elif defined(__clang__)
  59424. "adcs r4, %[r]\n\t"
  59425. #else
  59426. "adc r4, %[r]\n\t"
  59427. #endif
  59428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59429. "adds r2, r2, r6\n\t"
  59430. #else
  59431. "add r2, r2, r6\n\t"
  59432. #endif
  59433. #ifdef WOLFSSL_KEIL
  59434. "adcs r3, r3, %[r]\n\t"
  59435. #elif defined(__clang__)
  59436. "adcs r3, %[r]\n\t"
  59437. #else
  59438. "adc r3, %[r]\n\t"
  59439. #endif
  59440. #ifdef WOLFSSL_KEIL
  59441. "adcs r4, r4, %[r]\n\t"
  59442. #elif defined(__clang__)
  59443. "adcs r4, %[r]\n\t"
  59444. #else
  59445. "adc r4, %[r]\n\t"
  59446. #endif
  59447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59448. "lsrs r6, r7, #16\n\t"
  59449. #else
  59450. "lsr r6, r7, #16\n\t"
  59451. #endif
  59452. #ifdef WOLFSSL_KEIL
  59453. "muls r5, r6, r5\n\t"
  59454. #elif defined(__clang__)
  59455. "muls r5, r6\n\t"
  59456. #else
  59457. "mul r5, r6\n\t"
  59458. #endif
  59459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59460. "lsrs r6, r5, #16\n\t"
  59461. #else
  59462. "lsr r6, r5, #16\n\t"
  59463. #endif
  59464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59465. "lsls r5, r5, #16\n\t"
  59466. #else
  59467. "lsl r5, r5, #16\n\t"
  59468. #endif
  59469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59470. "adds r2, r2, r5\n\t"
  59471. #else
  59472. "add r2, r2, r5\n\t"
  59473. #endif
  59474. #ifdef WOLFSSL_KEIL
  59475. "adcs r3, r3, r6\n\t"
  59476. #elif defined(__clang__)
  59477. "adcs r3, r6\n\t"
  59478. #else
  59479. "adc r3, r6\n\t"
  59480. #endif
  59481. #ifdef WOLFSSL_KEIL
  59482. "adcs r4, r4, %[r]\n\t"
  59483. #elif defined(__clang__)
  59484. "adcs r4, %[r]\n\t"
  59485. #else
  59486. "adc r4, %[r]\n\t"
  59487. #endif
  59488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59489. "adds r2, r2, r5\n\t"
  59490. #else
  59491. "add r2, r2, r5\n\t"
  59492. #endif
  59493. #ifdef WOLFSSL_KEIL
  59494. "adcs r3, r3, r6\n\t"
  59495. #elif defined(__clang__)
  59496. "adcs r3, r6\n\t"
  59497. #else
  59498. "adc r3, r6\n\t"
  59499. #endif
  59500. #ifdef WOLFSSL_KEIL
  59501. "adcs r4, r4, %[r]\n\t"
  59502. #elif defined(__clang__)
  59503. "adcs r4, %[r]\n\t"
  59504. #else
  59505. "adc r4, %[r]\n\t"
  59506. #endif
  59507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59508. "lsrs r5, %[a], #16\n\t"
  59509. #else
  59510. "lsr r5, %[a], #16\n\t"
  59511. #endif
  59512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59513. "lsrs r6, r7, #16\n\t"
  59514. #else
  59515. "lsr r6, r7, #16\n\t"
  59516. #endif
  59517. #ifdef WOLFSSL_KEIL
  59518. "muls r6, r5, r6\n\t"
  59519. #elif defined(__clang__)
  59520. "muls r6, r5\n\t"
  59521. #else
  59522. "mul r6, r5\n\t"
  59523. #endif
  59524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59525. "adds r3, r3, r6\n\t"
  59526. #else
  59527. "add r3, r3, r6\n\t"
  59528. #endif
  59529. #ifdef WOLFSSL_KEIL
  59530. "adcs r4, r4, %[r]\n\t"
  59531. #elif defined(__clang__)
  59532. "adcs r4, %[r]\n\t"
  59533. #else
  59534. "adc r4, %[r]\n\t"
  59535. #endif
  59536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59537. "adds r3, r3, r6\n\t"
  59538. #else
  59539. "add r3, r3, r6\n\t"
  59540. #endif
  59541. #ifdef WOLFSSL_KEIL
  59542. "adcs r4, r4, %[r]\n\t"
  59543. #elif defined(__clang__)
  59544. "adcs r4, %[r]\n\t"
  59545. #else
  59546. "adc r4, %[r]\n\t"
  59547. #endif
  59548. "uxth r6, r7\n\t"
  59549. #ifdef WOLFSSL_KEIL
  59550. "muls r5, r6, r5\n\t"
  59551. #elif defined(__clang__)
  59552. "muls r5, r6\n\t"
  59553. #else
  59554. "mul r5, r6\n\t"
  59555. #endif
  59556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59557. "lsrs r6, r5, #16\n\t"
  59558. #else
  59559. "lsr r6, r5, #16\n\t"
  59560. #endif
  59561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59562. "lsls r5, r5, #16\n\t"
  59563. #else
  59564. "lsl r5, r5, #16\n\t"
  59565. #endif
  59566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59567. "adds r2, r2, r5\n\t"
  59568. #else
  59569. "add r2, r2, r5\n\t"
  59570. #endif
  59571. #ifdef WOLFSSL_KEIL
  59572. "adcs r3, r3, r6\n\t"
  59573. #elif defined(__clang__)
  59574. "adcs r3, r6\n\t"
  59575. #else
  59576. "adc r3, r6\n\t"
  59577. #endif
  59578. #ifdef WOLFSSL_KEIL
  59579. "adcs r4, r4, %[r]\n\t"
  59580. #elif defined(__clang__)
  59581. "adcs r4, %[r]\n\t"
  59582. #else
  59583. "adc r4, %[r]\n\t"
  59584. #endif
  59585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59586. "adds r2, r2, r5\n\t"
  59587. #else
  59588. "add r2, r2, r5\n\t"
  59589. #endif
  59590. #ifdef WOLFSSL_KEIL
  59591. "adcs r3, r3, r6\n\t"
  59592. #elif defined(__clang__)
  59593. "adcs r3, r6\n\t"
  59594. #else
  59595. "adc r3, r6\n\t"
  59596. #endif
  59597. #ifdef WOLFSSL_KEIL
  59598. "adcs r4, r4, %[r]\n\t"
  59599. #elif defined(__clang__)
  59600. "adcs r4, %[r]\n\t"
  59601. #else
  59602. "adc r4, %[r]\n\t"
  59603. #endif
  59604. "# A[6] * A[6]\n\t"
  59605. "mov %[a], r9\n\t"
  59606. "ldr r7, [%[a], #24]\n\t"
  59607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59608. "lsrs r6, r7, #16\n\t"
  59609. #else
  59610. "lsr r6, r7, #16\n\t"
  59611. #endif
  59612. "uxth r5, r7\n\t"
  59613. #ifdef WOLFSSL_KEIL
  59614. "muls r5, r5, r5\n\t"
  59615. #elif defined(__clang__)
  59616. "muls r5, r5\n\t"
  59617. #else
  59618. "mul r5, r5\n\t"
  59619. #endif
  59620. #ifdef WOLFSSL_KEIL
  59621. "muls r6, r6, r6\n\t"
  59622. #elif defined(__clang__)
  59623. "muls r6, r6\n\t"
  59624. #else
  59625. "mul r6, r6\n\t"
  59626. #endif
  59627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59628. "adds r2, r2, r5\n\t"
  59629. #else
  59630. "add r2, r2, r5\n\t"
  59631. #endif
  59632. #ifdef WOLFSSL_KEIL
  59633. "adcs r3, r3, r6\n\t"
  59634. #elif defined(__clang__)
  59635. "adcs r3, r6\n\t"
  59636. #else
  59637. "adc r3, r6\n\t"
  59638. #endif
  59639. #ifdef WOLFSSL_KEIL
  59640. "adcs r4, r4, %[r]\n\t"
  59641. #elif defined(__clang__)
  59642. "adcs r4, %[r]\n\t"
  59643. #else
  59644. "adc r4, %[r]\n\t"
  59645. #endif
  59646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59647. "lsrs r6, r7, #16\n\t"
  59648. #else
  59649. "lsr r6, r7, #16\n\t"
  59650. #endif
  59651. "uxth r5, r7\n\t"
  59652. #ifdef WOLFSSL_KEIL
  59653. "muls r5, r6, r5\n\t"
  59654. #elif defined(__clang__)
  59655. "muls r5, r6\n\t"
  59656. #else
  59657. "mul r5, r6\n\t"
  59658. #endif
  59659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59660. "lsrs r6, r5, #15\n\t"
  59661. #else
  59662. "lsr r6, r5, #15\n\t"
  59663. #endif
  59664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59665. "lsls r5, r5, #17\n\t"
  59666. #else
  59667. "lsl r5, r5, #17\n\t"
  59668. #endif
  59669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59670. "adds r2, r2, r5\n\t"
  59671. #else
  59672. "add r2, r2, r5\n\t"
  59673. #endif
  59674. #ifdef WOLFSSL_KEIL
  59675. "adcs r3, r3, r6\n\t"
  59676. #elif defined(__clang__)
  59677. "adcs r3, r6\n\t"
  59678. #else
  59679. "adc r3, r6\n\t"
  59680. #endif
  59681. #ifdef WOLFSSL_KEIL
  59682. "adcs r4, r4, %[r]\n\t"
  59683. #elif defined(__clang__)
  59684. "adcs r4, %[r]\n\t"
  59685. #else
  59686. "adc r4, %[r]\n\t"
  59687. #endif
  59688. "mov %[r], r8\n\t"
  59689. "str r2, [%[r], #48]\n\t"
  59690. "movs %[r], #0\n\t"
  59691. "movs %[a], #32\n\t"
  59692. "add %[a], %[a], r9\n\t"
  59693. "ldm %[a]!, {r5, r6}\n\t"
  59694. "mov r10, r5\n\t"
  59695. "mov r11, r6\n\t"
  59696. "ldm %[a]!, {r5, r6}\n\t"
  59697. "mov r12, r5\n\t"
  59698. "mov lr, r6\n\t"
  59699. "mov %[a], r9\n\t"
  59700. "# A[7] * A[6]\n\t"
  59701. "movs r2, #0\n\t"
  59702. "ldr %[a], [%[a], #28]\n\t"
  59703. "uxth r5, %[a]\n\t"
  59704. "uxth r6, r7\n\t"
  59705. #ifdef WOLFSSL_KEIL
  59706. "muls r6, r5, r6\n\t"
  59707. #elif defined(__clang__)
  59708. "muls r6, r5\n\t"
  59709. #else
  59710. "mul r6, r5\n\t"
  59711. #endif
  59712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59713. "adds r3, r3, r6\n\t"
  59714. #else
  59715. "add r3, r3, r6\n\t"
  59716. #endif
  59717. #ifdef WOLFSSL_KEIL
  59718. "adcs r4, r4, %[r]\n\t"
  59719. #elif defined(__clang__)
  59720. "adcs r4, %[r]\n\t"
  59721. #else
  59722. "adc r4, %[r]\n\t"
  59723. #endif
  59724. #ifdef WOLFSSL_KEIL
  59725. "adcs r2, r2, %[r]\n\t"
  59726. #elif defined(__clang__)
  59727. "adcs r2, %[r]\n\t"
  59728. #else
  59729. "adc r2, %[r]\n\t"
  59730. #endif
  59731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59732. "adds r3, r3, r6\n\t"
  59733. #else
  59734. "add r3, r3, r6\n\t"
  59735. #endif
  59736. #ifdef WOLFSSL_KEIL
  59737. "adcs r4, r4, %[r]\n\t"
  59738. #elif defined(__clang__)
  59739. "adcs r4, %[r]\n\t"
  59740. #else
  59741. "adc r4, %[r]\n\t"
  59742. #endif
  59743. #ifdef WOLFSSL_KEIL
  59744. "adcs r2, r2, %[r]\n\t"
  59745. #elif defined(__clang__)
  59746. "adcs r2, %[r]\n\t"
  59747. #else
  59748. "adc r2, %[r]\n\t"
  59749. #endif
  59750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59751. "lsrs r6, r7, #16\n\t"
  59752. #else
  59753. "lsr r6, r7, #16\n\t"
  59754. #endif
  59755. #ifdef WOLFSSL_KEIL
  59756. "muls r5, r6, r5\n\t"
  59757. #elif defined(__clang__)
  59758. "muls r5, r6\n\t"
  59759. #else
  59760. "mul r5, r6\n\t"
  59761. #endif
  59762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59763. "lsrs r6, r5, #16\n\t"
  59764. #else
  59765. "lsr r6, r5, #16\n\t"
  59766. #endif
  59767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59768. "lsls r5, r5, #16\n\t"
  59769. #else
  59770. "lsl r5, r5, #16\n\t"
  59771. #endif
  59772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59773. "adds r3, r3, r5\n\t"
  59774. #else
  59775. "add r3, r3, r5\n\t"
  59776. #endif
  59777. #ifdef WOLFSSL_KEIL
  59778. "adcs r4, r4, r6\n\t"
  59779. #elif defined(__clang__)
  59780. "adcs r4, r6\n\t"
  59781. #else
  59782. "adc r4, r6\n\t"
  59783. #endif
  59784. #ifdef WOLFSSL_KEIL
  59785. "adcs r2, r2, %[r]\n\t"
  59786. #elif defined(__clang__)
  59787. "adcs r2, %[r]\n\t"
  59788. #else
  59789. "adc r2, %[r]\n\t"
  59790. #endif
  59791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59792. "adds r3, r3, r5\n\t"
  59793. #else
  59794. "add r3, r3, r5\n\t"
  59795. #endif
  59796. #ifdef WOLFSSL_KEIL
  59797. "adcs r4, r4, r6\n\t"
  59798. #elif defined(__clang__)
  59799. "adcs r4, r6\n\t"
  59800. #else
  59801. "adc r4, r6\n\t"
  59802. #endif
  59803. #ifdef WOLFSSL_KEIL
  59804. "adcs r2, r2, %[r]\n\t"
  59805. #elif defined(__clang__)
  59806. "adcs r2, %[r]\n\t"
  59807. #else
  59808. "adc r2, %[r]\n\t"
  59809. #endif
  59810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59811. "lsrs r5, %[a], #16\n\t"
  59812. #else
  59813. "lsr r5, %[a], #16\n\t"
  59814. #endif
  59815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59816. "lsrs r6, r7, #16\n\t"
  59817. #else
  59818. "lsr r6, r7, #16\n\t"
  59819. #endif
  59820. #ifdef WOLFSSL_KEIL
  59821. "muls r6, r5, r6\n\t"
  59822. #elif defined(__clang__)
  59823. "muls r6, r5\n\t"
  59824. #else
  59825. "mul r6, r5\n\t"
  59826. #endif
  59827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59828. "adds r4, r4, r6\n\t"
  59829. #else
  59830. "add r4, r4, r6\n\t"
  59831. #endif
  59832. #ifdef WOLFSSL_KEIL
  59833. "adcs r2, r2, %[r]\n\t"
  59834. #elif defined(__clang__)
  59835. "adcs r2, %[r]\n\t"
  59836. #else
  59837. "adc r2, %[r]\n\t"
  59838. #endif
  59839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59840. "adds r4, r4, r6\n\t"
  59841. #else
  59842. "add r4, r4, r6\n\t"
  59843. #endif
  59844. #ifdef WOLFSSL_KEIL
  59845. "adcs r2, r2, %[r]\n\t"
  59846. #elif defined(__clang__)
  59847. "adcs r2, %[r]\n\t"
  59848. #else
  59849. "adc r2, %[r]\n\t"
  59850. #endif
  59851. "uxth r6, r7\n\t"
  59852. #ifdef WOLFSSL_KEIL
  59853. "muls r5, r6, r5\n\t"
  59854. #elif defined(__clang__)
  59855. "muls r5, r6\n\t"
  59856. #else
  59857. "mul r5, r6\n\t"
  59858. #endif
  59859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59860. "lsrs r6, r5, #16\n\t"
  59861. #else
  59862. "lsr r6, r5, #16\n\t"
  59863. #endif
  59864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59865. "lsls r5, r5, #16\n\t"
  59866. #else
  59867. "lsl r5, r5, #16\n\t"
  59868. #endif
  59869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59870. "adds r3, r3, r5\n\t"
  59871. #else
  59872. "add r3, r3, r5\n\t"
  59873. #endif
  59874. #ifdef WOLFSSL_KEIL
  59875. "adcs r4, r4, r6\n\t"
  59876. #elif defined(__clang__)
  59877. "adcs r4, r6\n\t"
  59878. #else
  59879. "adc r4, r6\n\t"
  59880. #endif
  59881. #ifdef WOLFSSL_KEIL
  59882. "adcs r2, r2, %[r]\n\t"
  59883. #elif defined(__clang__)
  59884. "adcs r2, %[r]\n\t"
  59885. #else
  59886. "adc r2, %[r]\n\t"
  59887. #endif
  59888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59889. "adds r3, r3, r5\n\t"
  59890. #else
  59891. "add r3, r3, r5\n\t"
  59892. #endif
  59893. #ifdef WOLFSSL_KEIL
  59894. "adcs r4, r4, r6\n\t"
  59895. #elif defined(__clang__)
  59896. "adcs r4, r6\n\t"
  59897. #else
  59898. "adc r4, r6\n\t"
  59899. #endif
  59900. #ifdef WOLFSSL_KEIL
  59901. "adcs r2, r2, %[r]\n\t"
  59902. #elif defined(__clang__)
  59903. "adcs r2, %[r]\n\t"
  59904. #else
  59905. "adc r2, %[r]\n\t"
  59906. #endif
  59907. "# A[8] * A[5]\n\t"
  59908. "mov %[a], r9\n\t"
  59909. "ldr r7, [%[a], #20]\n\t"
  59910. "mov %[a], r10\n\t"
  59911. "uxth r5, %[a]\n\t"
  59912. "uxth r6, r7\n\t"
  59913. #ifdef WOLFSSL_KEIL
  59914. "muls r6, r5, r6\n\t"
  59915. #elif defined(__clang__)
  59916. "muls r6, r5\n\t"
  59917. #else
  59918. "mul r6, r5\n\t"
  59919. #endif
  59920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59921. "adds r3, r3, r6\n\t"
  59922. #else
  59923. "add r3, r3, r6\n\t"
  59924. #endif
  59925. #ifdef WOLFSSL_KEIL
  59926. "adcs r4, r4, %[r]\n\t"
  59927. #elif defined(__clang__)
  59928. "adcs r4, %[r]\n\t"
  59929. #else
  59930. "adc r4, %[r]\n\t"
  59931. #endif
  59932. #ifdef WOLFSSL_KEIL
  59933. "adcs r2, r2, %[r]\n\t"
  59934. #elif defined(__clang__)
  59935. "adcs r2, %[r]\n\t"
  59936. #else
  59937. "adc r2, %[r]\n\t"
  59938. #endif
  59939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59940. "adds r3, r3, r6\n\t"
  59941. #else
  59942. "add r3, r3, r6\n\t"
  59943. #endif
  59944. #ifdef WOLFSSL_KEIL
  59945. "adcs r4, r4, %[r]\n\t"
  59946. #elif defined(__clang__)
  59947. "adcs r4, %[r]\n\t"
  59948. #else
  59949. "adc r4, %[r]\n\t"
  59950. #endif
  59951. #ifdef WOLFSSL_KEIL
  59952. "adcs r2, r2, %[r]\n\t"
  59953. #elif defined(__clang__)
  59954. "adcs r2, %[r]\n\t"
  59955. #else
  59956. "adc r2, %[r]\n\t"
  59957. #endif
  59958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59959. "lsrs r6, r7, #16\n\t"
  59960. #else
  59961. "lsr r6, r7, #16\n\t"
  59962. #endif
  59963. #ifdef WOLFSSL_KEIL
  59964. "muls r5, r6, r5\n\t"
  59965. #elif defined(__clang__)
  59966. "muls r5, r6\n\t"
  59967. #else
  59968. "mul r5, r6\n\t"
  59969. #endif
  59970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59971. "lsrs r6, r5, #16\n\t"
  59972. #else
  59973. "lsr r6, r5, #16\n\t"
  59974. #endif
  59975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59976. "lsls r5, r5, #16\n\t"
  59977. #else
  59978. "lsl r5, r5, #16\n\t"
  59979. #endif
  59980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59981. "adds r3, r3, r5\n\t"
  59982. #else
  59983. "add r3, r3, r5\n\t"
  59984. #endif
  59985. #ifdef WOLFSSL_KEIL
  59986. "adcs r4, r4, r6\n\t"
  59987. #elif defined(__clang__)
  59988. "adcs r4, r6\n\t"
  59989. #else
  59990. "adc r4, r6\n\t"
  59991. #endif
  59992. #ifdef WOLFSSL_KEIL
  59993. "adcs r2, r2, %[r]\n\t"
  59994. #elif defined(__clang__)
  59995. "adcs r2, %[r]\n\t"
  59996. #else
  59997. "adc r2, %[r]\n\t"
  59998. #endif
  59999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60000. "adds r3, r3, r5\n\t"
  60001. #else
  60002. "add r3, r3, r5\n\t"
  60003. #endif
  60004. #ifdef WOLFSSL_KEIL
  60005. "adcs r4, r4, r6\n\t"
  60006. #elif defined(__clang__)
  60007. "adcs r4, r6\n\t"
  60008. #else
  60009. "adc r4, r6\n\t"
  60010. #endif
  60011. #ifdef WOLFSSL_KEIL
  60012. "adcs r2, r2, %[r]\n\t"
  60013. #elif defined(__clang__)
  60014. "adcs r2, %[r]\n\t"
  60015. #else
  60016. "adc r2, %[r]\n\t"
  60017. #endif
  60018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60019. "lsrs r5, %[a], #16\n\t"
  60020. #else
  60021. "lsr r5, %[a], #16\n\t"
  60022. #endif
  60023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60024. "lsrs r6, r7, #16\n\t"
  60025. #else
  60026. "lsr r6, r7, #16\n\t"
  60027. #endif
  60028. #ifdef WOLFSSL_KEIL
  60029. "muls r6, r5, r6\n\t"
  60030. #elif defined(__clang__)
  60031. "muls r6, r5\n\t"
  60032. #else
  60033. "mul r6, r5\n\t"
  60034. #endif
  60035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60036. "adds r4, r4, r6\n\t"
  60037. #else
  60038. "add r4, r4, r6\n\t"
  60039. #endif
  60040. #ifdef WOLFSSL_KEIL
  60041. "adcs r2, r2, %[r]\n\t"
  60042. #elif defined(__clang__)
  60043. "adcs r2, %[r]\n\t"
  60044. #else
  60045. "adc r2, %[r]\n\t"
  60046. #endif
  60047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60048. "adds r4, r4, r6\n\t"
  60049. #else
  60050. "add r4, r4, r6\n\t"
  60051. #endif
  60052. #ifdef WOLFSSL_KEIL
  60053. "adcs r2, r2, %[r]\n\t"
  60054. #elif defined(__clang__)
  60055. "adcs r2, %[r]\n\t"
  60056. #else
  60057. "adc r2, %[r]\n\t"
  60058. #endif
  60059. "uxth r6, r7\n\t"
  60060. #ifdef WOLFSSL_KEIL
  60061. "muls r5, r6, r5\n\t"
  60062. #elif defined(__clang__)
  60063. "muls r5, r6\n\t"
  60064. #else
  60065. "mul r5, r6\n\t"
  60066. #endif
  60067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60068. "lsrs r6, r5, #16\n\t"
  60069. #else
  60070. "lsr r6, r5, #16\n\t"
  60071. #endif
  60072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60073. "lsls r5, r5, #16\n\t"
  60074. #else
  60075. "lsl r5, r5, #16\n\t"
  60076. #endif
  60077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60078. "adds r3, r3, r5\n\t"
  60079. #else
  60080. "add r3, r3, r5\n\t"
  60081. #endif
  60082. #ifdef WOLFSSL_KEIL
  60083. "adcs r4, r4, r6\n\t"
  60084. #elif defined(__clang__)
  60085. "adcs r4, r6\n\t"
  60086. #else
  60087. "adc r4, r6\n\t"
  60088. #endif
  60089. #ifdef WOLFSSL_KEIL
  60090. "adcs r2, r2, %[r]\n\t"
  60091. #elif defined(__clang__)
  60092. "adcs r2, %[r]\n\t"
  60093. #else
  60094. "adc r2, %[r]\n\t"
  60095. #endif
  60096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60097. "adds r3, r3, r5\n\t"
  60098. #else
  60099. "add r3, r3, r5\n\t"
  60100. #endif
  60101. #ifdef WOLFSSL_KEIL
  60102. "adcs r4, r4, r6\n\t"
  60103. #elif defined(__clang__)
  60104. "adcs r4, r6\n\t"
  60105. #else
  60106. "adc r4, r6\n\t"
  60107. #endif
  60108. #ifdef WOLFSSL_KEIL
  60109. "adcs r2, r2, %[r]\n\t"
  60110. #elif defined(__clang__)
  60111. "adcs r2, %[r]\n\t"
  60112. #else
  60113. "adc r2, %[r]\n\t"
  60114. #endif
  60115. "# A[9] * A[4]\n\t"
  60116. "mov %[a], r9\n\t"
  60117. "ldr r7, [%[a], #16]\n\t"
  60118. "mov %[a], r11\n\t"
  60119. "uxth r5, %[a]\n\t"
  60120. "uxth r6, r7\n\t"
  60121. #ifdef WOLFSSL_KEIL
  60122. "muls r6, r5, r6\n\t"
  60123. #elif defined(__clang__)
  60124. "muls r6, r5\n\t"
  60125. #else
  60126. "mul r6, r5\n\t"
  60127. #endif
  60128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60129. "adds r3, r3, r6\n\t"
  60130. #else
  60131. "add r3, r3, r6\n\t"
  60132. #endif
  60133. #ifdef WOLFSSL_KEIL
  60134. "adcs r4, r4, %[r]\n\t"
  60135. #elif defined(__clang__)
  60136. "adcs r4, %[r]\n\t"
  60137. #else
  60138. "adc r4, %[r]\n\t"
  60139. #endif
  60140. #ifdef WOLFSSL_KEIL
  60141. "adcs r2, r2, %[r]\n\t"
  60142. #elif defined(__clang__)
  60143. "adcs r2, %[r]\n\t"
  60144. #else
  60145. "adc r2, %[r]\n\t"
  60146. #endif
  60147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60148. "adds r3, r3, r6\n\t"
  60149. #else
  60150. "add r3, r3, r6\n\t"
  60151. #endif
  60152. #ifdef WOLFSSL_KEIL
  60153. "adcs r4, r4, %[r]\n\t"
  60154. #elif defined(__clang__)
  60155. "adcs r4, %[r]\n\t"
  60156. #else
  60157. "adc r4, %[r]\n\t"
  60158. #endif
  60159. #ifdef WOLFSSL_KEIL
  60160. "adcs r2, r2, %[r]\n\t"
  60161. #elif defined(__clang__)
  60162. "adcs r2, %[r]\n\t"
  60163. #else
  60164. "adc r2, %[r]\n\t"
  60165. #endif
  60166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60167. "lsrs r6, r7, #16\n\t"
  60168. #else
  60169. "lsr r6, r7, #16\n\t"
  60170. #endif
  60171. #ifdef WOLFSSL_KEIL
  60172. "muls r5, r6, r5\n\t"
  60173. #elif defined(__clang__)
  60174. "muls r5, r6\n\t"
  60175. #else
  60176. "mul r5, r6\n\t"
  60177. #endif
  60178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60179. "lsrs r6, r5, #16\n\t"
  60180. #else
  60181. "lsr r6, r5, #16\n\t"
  60182. #endif
  60183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60184. "lsls r5, r5, #16\n\t"
  60185. #else
  60186. "lsl r5, r5, #16\n\t"
  60187. #endif
  60188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60189. "adds r3, r3, r5\n\t"
  60190. #else
  60191. "add r3, r3, r5\n\t"
  60192. #endif
  60193. #ifdef WOLFSSL_KEIL
  60194. "adcs r4, r4, r6\n\t"
  60195. #elif defined(__clang__)
  60196. "adcs r4, r6\n\t"
  60197. #else
  60198. "adc r4, r6\n\t"
  60199. #endif
  60200. #ifdef WOLFSSL_KEIL
  60201. "adcs r2, r2, %[r]\n\t"
  60202. #elif defined(__clang__)
  60203. "adcs r2, %[r]\n\t"
  60204. #else
  60205. "adc r2, %[r]\n\t"
  60206. #endif
  60207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60208. "adds r3, r3, r5\n\t"
  60209. #else
  60210. "add r3, r3, r5\n\t"
  60211. #endif
  60212. #ifdef WOLFSSL_KEIL
  60213. "adcs r4, r4, r6\n\t"
  60214. #elif defined(__clang__)
  60215. "adcs r4, r6\n\t"
  60216. #else
  60217. "adc r4, r6\n\t"
  60218. #endif
  60219. #ifdef WOLFSSL_KEIL
  60220. "adcs r2, r2, %[r]\n\t"
  60221. #elif defined(__clang__)
  60222. "adcs r2, %[r]\n\t"
  60223. #else
  60224. "adc r2, %[r]\n\t"
  60225. #endif
  60226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60227. "lsrs r5, %[a], #16\n\t"
  60228. #else
  60229. "lsr r5, %[a], #16\n\t"
  60230. #endif
  60231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60232. "lsrs r6, r7, #16\n\t"
  60233. #else
  60234. "lsr r6, r7, #16\n\t"
  60235. #endif
  60236. #ifdef WOLFSSL_KEIL
  60237. "muls r6, r5, r6\n\t"
  60238. #elif defined(__clang__)
  60239. "muls r6, r5\n\t"
  60240. #else
  60241. "mul r6, r5\n\t"
  60242. #endif
  60243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60244. "adds r4, r4, r6\n\t"
  60245. #else
  60246. "add r4, r4, r6\n\t"
  60247. #endif
  60248. #ifdef WOLFSSL_KEIL
  60249. "adcs r2, r2, %[r]\n\t"
  60250. #elif defined(__clang__)
  60251. "adcs r2, %[r]\n\t"
  60252. #else
  60253. "adc r2, %[r]\n\t"
  60254. #endif
  60255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60256. "adds r4, r4, r6\n\t"
  60257. #else
  60258. "add r4, r4, r6\n\t"
  60259. #endif
  60260. #ifdef WOLFSSL_KEIL
  60261. "adcs r2, r2, %[r]\n\t"
  60262. #elif defined(__clang__)
  60263. "adcs r2, %[r]\n\t"
  60264. #else
  60265. "adc r2, %[r]\n\t"
  60266. #endif
  60267. "uxth r6, r7\n\t"
  60268. #ifdef WOLFSSL_KEIL
  60269. "muls r5, r6, r5\n\t"
  60270. #elif defined(__clang__)
  60271. "muls r5, r6\n\t"
  60272. #else
  60273. "mul r5, r6\n\t"
  60274. #endif
  60275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60276. "lsrs r6, r5, #16\n\t"
  60277. #else
  60278. "lsr r6, r5, #16\n\t"
  60279. #endif
  60280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60281. "lsls r5, r5, #16\n\t"
  60282. #else
  60283. "lsl r5, r5, #16\n\t"
  60284. #endif
  60285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60286. "adds r3, r3, r5\n\t"
  60287. #else
  60288. "add r3, r3, r5\n\t"
  60289. #endif
  60290. #ifdef WOLFSSL_KEIL
  60291. "adcs r4, r4, r6\n\t"
  60292. #elif defined(__clang__)
  60293. "adcs r4, r6\n\t"
  60294. #else
  60295. "adc r4, r6\n\t"
  60296. #endif
  60297. #ifdef WOLFSSL_KEIL
  60298. "adcs r2, r2, %[r]\n\t"
  60299. #elif defined(__clang__)
  60300. "adcs r2, %[r]\n\t"
  60301. #else
  60302. "adc r2, %[r]\n\t"
  60303. #endif
  60304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60305. "adds r3, r3, r5\n\t"
  60306. #else
  60307. "add r3, r3, r5\n\t"
  60308. #endif
  60309. #ifdef WOLFSSL_KEIL
  60310. "adcs r4, r4, r6\n\t"
  60311. #elif defined(__clang__)
  60312. "adcs r4, r6\n\t"
  60313. #else
  60314. "adc r4, r6\n\t"
  60315. #endif
  60316. #ifdef WOLFSSL_KEIL
  60317. "adcs r2, r2, %[r]\n\t"
  60318. #elif defined(__clang__)
  60319. "adcs r2, %[r]\n\t"
  60320. #else
  60321. "adc r2, %[r]\n\t"
  60322. #endif
  60323. "# A[10] * A[3]\n\t"
  60324. "mov %[a], r9\n\t"
  60325. "ldr r7, [%[a], #12]\n\t"
  60326. "mov %[a], r12\n\t"
  60327. "uxth r5, %[a]\n\t"
  60328. "uxth r6, r7\n\t"
  60329. #ifdef WOLFSSL_KEIL
  60330. "muls r6, r5, r6\n\t"
  60331. #elif defined(__clang__)
  60332. "muls r6, r5\n\t"
  60333. #else
  60334. "mul r6, r5\n\t"
  60335. #endif
  60336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60337. "adds r3, r3, r6\n\t"
  60338. #else
  60339. "add r3, r3, r6\n\t"
  60340. #endif
  60341. #ifdef WOLFSSL_KEIL
  60342. "adcs r4, r4, %[r]\n\t"
  60343. #elif defined(__clang__)
  60344. "adcs r4, %[r]\n\t"
  60345. #else
  60346. "adc r4, %[r]\n\t"
  60347. #endif
  60348. #ifdef WOLFSSL_KEIL
  60349. "adcs r2, r2, %[r]\n\t"
  60350. #elif defined(__clang__)
  60351. "adcs r2, %[r]\n\t"
  60352. #else
  60353. "adc r2, %[r]\n\t"
  60354. #endif
  60355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60356. "adds r3, r3, r6\n\t"
  60357. #else
  60358. "add r3, r3, r6\n\t"
  60359. #endif
  60360. #ifdef WOLFSSL_KEIL
  60361. "adcs r4, r4, %[r]\n\t"
  60362. #elif defined(__clang__)
  60363. "adcs r4, %[r]\n\t"
  60364. #else
  60365. "adc r4, %[r]\n\t"
  60366. #endif
  60367. #ifdef WOLFSSL_KEIL
  60368. "adcs r2, r2, %[r]\n\t"
  60369. #elif defined(__clang__)
  60370. "adcs r2, %[r]\n\t"
  60371. #else
  60372. "adc r2, %[r]\n\t"
  60373. #endif
  60374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60375. "lsrs r6, r7, #16\n\t"
  60376. #else
  60377. "lsr r6, r7, #16\n\t"
  60378. #endif
  60379. #ifdef WOLFSSL_KEIL
  60380. "muls r5, r6, r5\n\t"
  60381. #elif defined(__clang__)
  60382. "muls r5, r6\n\t"
  60383. #else
  60384. "mul r5, r6\n\t"
  60385. #endif
  60386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60387. "lsrs r6, r5, #16\n\t"
  60388. #else
  60389. "lsr r6, r5, #16\n\t"
  60390. #endif
  60391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60392. "lsls r5, r5, #16\n\t"
  60393. #else
  60394. "lsl r5, r5, #16\n\t"
  60395. #endif
  60396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60397. "adds r3, r3, r5\n\t"
  60398. #else
  60399. "add r3, r3, r5\n\t"
  60400. #endif
  60401. #ifdef WOLFSSL_KEIL
  60402. "adcs r4, r4, r6\n\t"
  60403. #elif defined(__clang__)
  60404. "adcs r4, r6\n\t"
  60405. #else
  60406. "adc r4, r6\n\t"
  60407. #endif
  60408. #ifdef WOLFSSL_KEIL
  60409. "adcs r2, r2, %[r]\n\t"
  60410. #elif defined(__clang__)
  60411. "adcs r2, %[r]\n\t"
  60412. #else
  60413. "adc r2, %[r]\n\t"
  60414. #endif
  60415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60416. "adds r3, r3, r5\n\t"
  60417. #else
  60418. "add r3, r3, r5\n\t"
  60419. #endif
  60420. #ifdef WOLFSSL_KEIL
  60421. "adcs r4, r4, r6\n\t"
  60422. #elif defined(__clang__)
  60423. "adcs r4, r6\n\t"
  60424. #else
  60425. "adc r4, r6\n\t"
  60426. #endif
  60427. #ifdef WOLFSSL_KEIL
  60428. "adcs r2, r2, %[r]\n\t"
  60429. #elif defined(__clang__)
  60430. "adcs r2, %[r]\n\t"
  60431. #else
  60432. "adc r2, %[r]\n\t"
  60433. #endif
  60434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60435. "lsrs r5, %[a], #16\n\t"
  60436. #else
  60437. "lsr r5, %[a], #16\n\t"
  60438. #endif
  60439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60440. "lsrs r6, r7, #16\n\t"
  60441. #else
  60442. "lsr r6, r7, #16\n\t"
  60443. #endif
  60444. #ifdef WOLFSSL_KEIL
  60445. "muls r6, r5, r6\n\t"
  60446. #elif defined(__clang__)
  60447. "muls r6, r5\n\t"
  60448. #else
  60449. "mul r6, r5\n\t"
  60450. #endif
  60451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60452. "adds r4, r4, r6\n\t"
  60453. #else
  60454. "add r4, r4, r6\n\t"
  60455. #endif
  60456. #ifdef WOLFSSL_KEIL
  60457. "adcs r2, r2, %[r]\n\t"
  60458. #elif defined(__clang__)
  60459. "adcs r2, %[r]\n\t"
  60460. #else
  60461. "adc r2, %[r]\n\t"
  60462. #endif
  60463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60464. "adds r4, r4, r6\n\t"
  60465. #else
  60466. "add r4, r4, r6\n\t"
  60467. #endif
  60468. #ifdef WOLFSSL_KEIL
  60469. "adcs r2, r2, %[r]\n\t"
  60470. #elif defined(__clang__)
  60471. "adcs r2, %[r]\n\t"
  60472. #else
  60473. "adc r2, %[r]\n\t"
  60474. #endif
  60475. "uxth r6, r7\n\t"
  60476. #ifdef WOLFSSL_KEIL
  60477. "muls r5, r6, r5\n\t"
  60478. #elif defined(__clang__)
  60479. "muls r5, r6\n\t"
  60480. #else
  60481. "mul r5, r6\n\t"
  60482. #endif
  60483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60484. "lsrs r6, r5, #16\n\t"
  60485. #else
  60486. "lsr r6, r5, #16\n\t"
  60487. #endif
  60488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60489. "lsls r5, r5, #16\n\t"
  60490. #else
  60491. "lsl r5, r5, #16\n\t"
  60492. #endif
  60493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60494. "adds r3, r3, r5\n\t"
  60495. #else
  60496. "add r3, r3, r5\n\t"
  60497. #endif
  60498. #ifdef WOLFSSL_KEIL
  60499. "adcs r4, r4, r6\n\t"
  60500. #elif defined(__clang__)
  60501. "adcs r4, r6\n\t"
  60502. #else
  60503. "adc r4, r6\n\t"
  60504. #endif
  60505. #ifdef WOLFSSL_KEIL
  60506. "adcs r2, r2, %[r]\n\t"
  60507. #elif defined(__clang__)
  60508. "adcs r2, %[r]\n\t"
  60509. #else
  60510. "adc r2, %[r]\n\t"
  60511. #endif
  60512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60513. "adds r3, r3, r5\n\t"
  60514. #else
  60515. "add r3, r3, r5\n\t"
  60516. #endif
  60517. #ifdef WOLFSSL_KEIL
  60518. "adcs r4, r4, r6\n\t"
  60519. #elif defined(__clang__)
  60520. "adcs r4, r6\n\t"
  60521. #else
  60522. "adc r4, r6\n\t"
  60523. #endif
  60524. #ifdef WOLFSSL_KEIL
  60525. "adcs r2, r2, %[r]\n\t"
  60526. #elif defined(__clang__)
  60527. "adcs r2, %[r]\n\t"
  60528. #else
  60529. "adc r2, %[r]\n\t"
  60530. #endif
  60531. "# A[11] * A[2]\n\t"
  60532. "mov %[a], r9\n\t"
  60533. "ldr r7, [%[a], #8]\n\t"
  60534. "mov %[a], lr\n\t"
  60535. "uxth r5, %[a]\n\t"
  60536. "uxth r6, r7\n\t"
  60537. #ifdef WOLFSSL_KEIL
  60538. "muls r6, r5, r6\n\t"
  60539. #elif defined(__clang__)
  60540. "muls r6, r5\n\t"
  60541. #else
  60542. "mul r6, r5\n\t"
  60543. #endif
  60544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60545. "adds r3, r3, r6\n\t"
  60546. #else
  60547. "add r3, r3, r6\n\t"
  60548. #endif
  60549. #ifdef WOLFSSL_KEIL
  60550. "adcs r4, r4, %[r]\n\t"
  60551. #elif defined(__clang__)
  60552. "adcs r4, %[r]\n\t"
  60553. #else
  60554. "adc r4, %[r]\n\t"
  60555. #endif
  60556. #ifdef WOLFSSL_KEIL
  60557. "adcs r2, r2, %[r]\n\t"
  60558. #elif defined(__clang__)
  60559. "adcs r2, %[r]\n\t"
  60560. #else
  60561. "adc r2, %[r]\n\t"
  60562. #endif
  60563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60564. "adds r3, r3, r6\n\t"
  60565. #else
  60566. "add r3, r3, r6\n\t"
  60567. #endif
  60568. #ifdef WOLFSSL_KEIL
  60569. "adcs r4, r4, %[r]\n\t"
  60570. #elif defined(__clang__)
  60571. "adcs r4, %[r]\n\t"
  60572. #else
  60573. "adc r4, %[r]\n\t"
  60574. #endif
  60575. #ifdef WOLFSSL_KEIL
  60576. "adcs r2, r2, %[r]\n\t"
  60577. #elif defined(__clang__)
  60578. "adcs r2, %[r]\n\t"
  60579. #else
  60580. "adc r2, %[r]\n\t"
  60581. #endif
  60582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60583. "lsrs r6, r7, #16\n\t"
  60584. #else
  60585. "lsr r6, r7, #16\n\t"
  60586. #endif
  60587. #ifdef WOLFSSL_KEIL
  60588. "muls r5, r6, r5\n\t"
  60589. #elif defined(__clang__)
  60590. "muls r5, r6\n\t"
  60591. #else
  60592. "mul r5, r6\n\t"
  60593. #endif
  60594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60595. "lsrs r6, r5, #16\n\t"
  60596. #else
  60597. "lsr r6, r5, #16\n\t"
  60598. #endif
  60599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60600. "lsls r5, r5, #16\n\t"
  60601. #else
  60602. "lsl r5, r5, #16\n\t"
  60603. #endif
  60604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60605. "adds r3, r3, r5\n\t"
  60606. #else
  60607. "add r3, r3, r5\n\t"
  60608. #endif
  60609. #ifdef WOLFSSL_KEIL
  60610. "adcs r4, r4, r6\n\t"
  60611. #elif defined(__clang__)
  60612. "adcs r4, r6\n\t"
  60613. #else
  60614. "adc r4, r6\n\t"
  60615. #endif
  60616. #ifdef WOLFSSL_KEIL
  60617. "adcs r2, r2, %[r]\n\t"
  60618. #elif defined(__clang__)
  60619. "adcs r2, %[r]\n\t"
  60620. #else
  60621. "adc r2, %[r]\n\t"
  60622. #endif
  60623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60624. "adds r3, r3, r5\n\t"
  60625. #else
  60626. "add r3, r3, r5\n\t"
  60627. #endif
  60628. #ifdef WOLFSSL_KEIL
  60629. "adcs r4, r4, r6\n\t"
  60630. #elif defined(__clang__)
  60631. "adcs r4, r6\n\t"
  60632. #else
  60633. "adc r4, r6\n\t"
  60634. #endif
  60635. #ifdef WOLFSSL_KEIL
  60636. "adcs r2, r2, %[r]\n\t"
  60637. #elif defined(__clang__)
  60638. "adcs r2, %[r]\n\t"
  60639. #else
  60640. "adc r2, %[r]\n\t"
  60641. #endif
  60642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60643. "lsrs r5, %[a], #16\n\t"
  60644. #else
  60645. "lsr r5, %[a], #16\n\t"
  60646. #endif
  60647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60648. "lsrs r6, r7, #16\n\t"
  60649. #else
  60650. "lsr r6, r7, #16\n\t"
  60651. #endif
  60652. #ifdef WOLFSSL_KEIL
  60653. "muls r6, r5, r6\n\t"
  60654. #elif defined(__clang__)
  60655. "muls r6, r5\n\t"
  60656. #else
  60657. "mul r6, r5\n\t"
  60658. #endif
  60659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60660. "adds r4, r4, r6\n\t"
  60661. #else
  60662. "add r4, r4, r6\n\t"
  60663. #endif
  60664. #ifdef WOLFSSL_KEIL
  60665. "adcs r2, r2, %[r]\n\t"
  60666. #elif defined(__clang__)
  60667. "adcs r2, %[r]\n\t"
  60668. #else
  60669. "adc r2, %[r]\n\t"
  60670. #endif
  60671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60672. "adds r4, r4, r6\n\t"
  60673. #else
  60674. "add r4, r4, r6\n\t"
  60675. #endif
  60676. #ifdef WOLFSSL_KEIL
  60677. "adcs r2, r2, %[r]\n\t"
  60678. #elif defined(__clang__)
  60679. "adcs r2, %[r]\n\t"
  60680. #else
  60681. "adc r2, %[r]\n\t"
  60682. #endif
  60683. "uxth r6, r7\n\t"
  60684. #ifdef WOLFSSL_KEIL
  60685. "muls r5, r6, r5\n\t"
  60686. #elif defined(__clang__)
  60687. "muls r5, r6\n\t"
  60688. #else
  60689. "mul r5, r6\n\t"
  60690. #endif
  60691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60692. "lsrs r6, r5, #16\n\t"
  60693. #else
  60694. "lsr r6, r5, #16\n\t"
  60695. #endif
  60696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60697. "lsls r5, r5, #16\n\t"
  60698. #else
  60699. "lsl r5, r5, #16\n\t"
  60700. #endif
  60701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60702. "adds r3, r3, r5\n\t"
  60703. #else
  60704. "add r3, r3, r5\n\t"
  60705. #endif
  60706. #ifdef WOLFSSL_KEIL
  60707. "adcs r4, r4, r6\n\t"
  60708. #elif defined(__clang__)
  60709. "adcs r4, r6\n\t"
  60710. #else
  60711. "adc r4, r6\n\t"
  60712. #endif
  60713. #ifdef WOLFSSL_KEIL
  60714. "adcs r2, r2, %[r]\n\t"
  60715. #elif defined(__clang__)
  60716. "adcs r2, %[r]\n\t"
  60717. #else
  60718. "adc r2, %[r]\n\t"
  60719. #endif
  60720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60721. "adds r3, r3, r5\n\t"
  60722. #else
  60723. "add r3, r3, r5\n\t"
  60724. #endif
  60725. #ifdef WOLFSSL_KEIL
  60726. "adcs r4, r4, r6\n\t"
  60727. #elif defined(__clang__)
  60728. "adcs r4, r6\n\t"
  60729. #else
  60730. "adc r4, r6\n\t"
  60731. #endif
  60732. #ifdef WOLFSSL_KEIL
  60733. "adcs r2, r2, %[r]\n\t"
  60734. #elif defined(__clang__)
  60735. "adcs r2, %[r]\n\t"
  60736. #else
  60737. "adc r2, %[r]\n\t"
  60738. #endif
  60739. "mov %[r], r8\n\t"
  60740. "str r3, [%[r], #52]\n\t"
  60741. "movs %[r], #0\n\t"
  60742. "# A[11] * A[3]\n\t"
  60743. "movs r3, #0\n\t"
  60744. "mov %[a], r9\n\t"
  60745. "ldr r7, [%[a], #12]\n\t"
  60746. "mov %[a], lr\n\t"
  60747. "uxth r5, %[a]\n\t"
  60748. "uxth r6, r7\n\t"
  60749. #ifdef WOLFSSL_KEIL
  60750. "muls r6, r5, r6\n\t"
  60751. #elif defined(__clang__)
  60752. "muls r6, r5\n\t"
  60753. #else
  60754. "mul r6, r5\n\t"
  60755. #endif
  60756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60757. "adds r4, r4, r6\n\t"
  60758. #else
  60759. "add r4, r4, r6\n\t"
  60760. #endif
  60761. #ifdef WOLFSSL_KEIL
  60762. "adcs r2, r2, %[r]\n\t"
  60763. #elif defined(__clang__)
  60764. "adcs r2, %[r]\n\t"
  60765. #else
  60766. "adc r2, %[r]\n\t"
  60767. #endif
  60768. #ifdef WOLFSSL_KEIL
  60769. "adcs r3, r3, %[r]\n\t"
  60770. #elif defined(__clang__)
  60771. "adcs r3, %[r]\n\t"
  60772. #else
  60773. "adc r3, %[r]\n\t"
  60774. #endif
  60775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60776. "adds r4, r4, r6\n\t"
  60777. #else
  60778. "add r4, r4, r6\n\t"
  60779. #endif
  60780. #ifdef WOLFSSL_KEIL
  60781. "adcs r2, r2, %[r]\n\t"
  60782. #elif defined(__clang__)
  60783. "adcs r2, %[r]\n\t"
  60784. #else
  60785. "adc r2, %[r]\n\t"
  60786. #endif
  60787. #ifdef WOLFSSL_KEIL
  60788. "adcs r3, r3, %[r]\n\t"
  60789. #elif defined(__clang__)
  60790. "adcs r3, %[r]\n\t"
  60791. #else
  60792. "adc r3, %[r]\n\t"
  60793. #endif
  60794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60795. "lsrs r6, r7, #16\n\t"
  60796. #else
  60797. "lsr r6, r7, #16\n\t"
  60798. #endif
  60799. #ifdef WOLFSSL_KEIL
  60800. "muls r5, r6, r5\n\t"
  60801. #elif defined(__clang__)
  60802. "muls r5, r6\n\t"
  60803. #else
  60804. "mul r5, r6\n\t"
  60805. #endif
  60806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60807. "lsrs r6, r5, #16\n\t"
  60808. #else
  60809. "lsr r6, r5, #16\n\t"
  60810. #endif
  60811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60812. "lsls r5, r5, #16\n\t"
  60813. #else
  60814. "lsl r5, r5, #16\n\t"
  60815. #endif
  60816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60817. "adds r4, r4, r5\n\t"
  60818. #else
  60819. "add r4, r4, r5\n\t"
  60820. #endif
  60821. #ifdef WOLFSSL_KEIL
  60822. "adcs r2, r2, r6\n\t"
  60823. #elif defined(__clang__)
  60824. "adcs r2, r6\n\t"
  60825. #else
  60826. "adc r2, r6\n\t"
  60827. #endif
  60828. #ifdef WOLFSSL_KEIL
  60829. "adcs r3, r3, %[r]\n\t"
  60830. #elif defined(__clang__)
  60831. "adcs r3, %[r]\n\t"
  60832. #else
  60833. "adc r3, %[r]\n\t"
  60834. #endif
  60835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60836. "adds r4, r4, r5\n\t"
  60837. #else
  60838. "add r4, r4, r5\n\t"
  60839. #endif
  60840. #ifdef WOLFSSL_KEIL
  60841. "adcs r2, r2, r6\n\t"
  60842. #elif defined(__clang__)
  60843. "adcs r2, r6\n\t"
  60844. #else
  60845. "adc r2, r6\n\t"
  60846. #endif
  60847. #ifdef WOLFSSL_KEIL
  60848. "adcs r3, r3, %[r]\n\t"
  60849. #elif defined(__clang__)
  60850. "adcs r3, %[r]\n\t"
  60851. #else
  60852. "adc r3, %[r]\n\t"
  60853. #endif
  60854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60855. "lsrs r5, %[a], #16\n\t"
  60856. #else
  60857. "lsr r5, %[a], #16\n\t"
  60858. #endif
  60859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60860. "lsrs r6, r7, #16\n\t"
  60861. #else
  60862. "lsr r6, r7, #16\n\t"
  60863. #endif
  60864. #ifdef WOLFSSL_KEIL
  60865. "muls r6, r5, r6\n\t"
  60866. #elif defined(__clang__)
  60867. "muls r6, r5\n\t"
  60868. #else
  60869. "mul r6, r5\n\t"
  60870. #endif
  60871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60872. "adds r2, r2, r6\n\t"
  60873. #else
  60874. "add r2, r2, r6\n\t"
  60875. #endif
  60876. #ifdef WOLFSSL_KEIL
  60877. "adcs r3, r3, %[r]\n\t"
  60878. #elif defined(__clang__)
  60879. "adcs r3, %[r]\n\t"
  60880. #else
  60881. "adc r3, %[r]\n\t"
  60882. #endif
  60883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60884. "adds r2, r2, r6\n\t"
  60885. #else
  60886. "add r2, r2, r6\n\t"
  60887. #endif
  60888. #ifdef WOLFSSL_KEIL
  60889. "adcs r3, r3, %[r]\n\t"
  60890. #elif defined(__clang__)
  60891. "adcs r3, %[r]\n\t"
  60892. #else
  60893. "adc r3, %[r]\n\t"
  60894. #endif
  60895. "uxth r6, r7\n\t"
  60896. #ifdef WOLFSSL_KEIL
  60897. "muls r5, r6, r5\n\t"
  60898. #elif defined(__clang__)
  60899. "muls r5, r6\n\t"
  60900. #else
  60901. "mul r5, r6\n\t"
  60902. #endif
  60903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60904. "lsrs r6, r5, #16\n\t"
  60905. #else
  60906. "lsr r6, r5, #16\n\t"
  60907. #endif
  60908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60909. "lsls r5, r5, #16\n\t"
  60910. #else
  60911. "lsl r5, r5, #16\n\t"
  60912. #endif
  60913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60914. "adds r4, r4, r5\n\t"
  60915. #else
  60916. "add r4, r4, r5\n\t"
  60917. #endif
  60918. #ifdef WOLFSSL_KEIL
  60919. "adcs r2, r2, r6\n\t"
  60920. #elif defined(__clang__)
  60921. "adcs r2, r6\n\t"
  60922. #else
  60923. "adc r2, r6\n\t"
  60924. #endif
  60925. #ifdef WOLFSSL_KEIL
  60926. "adcs r3, r3, %[r]\n\t"
  60927. #elif defined(__clang__)
  60928. "adcs r3, %[r]\n\t"
  60929. #else
  60930. "adc r3, %[r]\n\t"
  60931. #endif
  60932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60933. "adds r4, r4, r5\n\t"
  60934. #else
  60935. "add r4, r4, r5\n\t"
  60936. #endif
  60937. #ifdef WOLFSSL_KEIL
  60938. "adcs r2, r2, r6\n\t"
  60939. #elif defined(__clang__)
  60940. "adcs r2, r6\n\t"
  60941. #else
  60942. "adc r2, r6\n\t"
  60943. #endif
  60944. #ifdef WOLFSSL_KEIL
  60945. "adcs r3, r3, %[r]\n\t"
  60946. #elif defined(__clang__)
  60947. "adcs r3, %[r]\n\t"
  60948. #else
  60949. "adc r3, %[r]\n\t"
  60950. #endif
  60951. "# A[10] * A[4]\n\t"
  60952. "mov %[a], r9\n\t"
  60953. "ldr r7, [%[a], #16]\n\t"
  60954. "mov %[a], r12\n\t"
  60955. "uxth r5, %[a]\n\t"
  60956. "uxth r6, r7\n\t"
  60957. #ifdef WOLFSSL_KEIL
  60958. "muls r6, r5, r6\n\t"
  60959. #elif defined(__clang__)
  60960. "muls r6, r5\n\t"
  60961. #else
  60962. "mul r6, r5\n\t"
  60963. #endif
  60964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60965. "adds r4, r4, r6\n\t"
  60966. #else
  60967. "add r4, r4, r6\n\t"
  60968. #endif
  60969. #ifdef WOLFSSL_KEIL
  60970. "adcs r2, r2, %[r]\n\t"
  60971. #elif defined(__clang__)
  60972. "adcs r2, %[r]\n\t"
  60973. #else
  60974. "adc r2, %[r]\n\t"
  60975. #endif
  60976. #ifdef WOLFSSL_KEIL
  60977. "adcs r3, r3, %[r]\n\t"
  60978. #elif defined(__clang__)
  60979. "adcs r3, %[r]\n\t"
  60980. #else
  60981. "adc r3, %[r]\n\t"
  60982. #endif
  60983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60984. "adds r4, r4, r6\n\t"
  60985. #else
  60986. "add r4, r4, r6\n\t"
  60987. #endif
  60988. #ifdef WOLFSSL_KEIL
  60989. "adcs r2, r2, %[r]\n\t"
  60990. #elif defined(__clang__)
  60991. "adcs r2, %[r]\n\t"
  60992. #else
  60993. "adc r2, %[r]\n\t"
  60994. #endif
  60995. #ifdef WOLFSSL_KEIL
  60996. "adcs r3, r3, %[r]\n\t"
  60997. #elif defined(__clang__)
  60998. "adcs r3, %[r]\n\t"
  60999. #else
  61000. "adc r3, %[r]\n\t"
  61001. #endif
  61002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61003. "lsrs r6, r7, #16\n\t"
  61004. #else
  61005. "lsr r6, r7, #16\n\t"
  61006. #endif
  61007. #ifdef WOLFSSL_KEIL
  61008. "muls r5, r6, r5\n\t"
  61009. #elif defined(__clang__)
  61010. "muls r5, r6\n\t"
  61011. #else
  61012. "mul r5, r6\n\t"
  61013. #endif
  61014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61015. "lsrs r6, r5, #16\n\t"
  61016. #else
  61017. "lsr r6, r5, #16\n\t"
  61018. #endif
  61019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61020. "lsls r5, r5, #16\n\t"
  61021. #else
  61022. "lsl r5, r5, #16\n\t"
  61023. #endif
  61024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61025. "adds r4, r4, r5\n\t"
  61026. #else
  61027. "add r4, r4, r5\n\t"
  61028. #endif
  61029. #ifdef WOLFSSL_KEIL
  61030. "adcs r2, r2, r6\n\t"
  61031. #elif defined(__clang__)
  61032. "adcs r2, r6\n\t"
  61033. #else
  61034. "adc r2, r6\n\t"
  61035. #endif
  61036. #ifdef WOLFSSL_KEIL
  61037. "adcs r3, r3, %[r]\n\t"
  61038. #elif defined(__clang__)
  61039. "adcs r3, %[r]\n\t"
  61040. #else
  61041. "adc r3, %[r]\n\t"
  61042. #endif
  61043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61044. "adds r4, r4, r5\n\t"
  61045. #else
  61046. "add r4, r4, r5\n\t"
  61047. #endif
  61048. #ifdef WOLFSSL_KEIL
  61049. "adcs r2, r2, r6\n\t"
  61050. #elif defined(__clang__)
  61051. "adcs r2, r6\n\t"
  61052. #else
  61053. "adc r2, r6\n\t"
  61054. #endif
  61055. #ifdef WOLFSSL_KEIL
  61056. "adcs r3, r3, %[r]\n\t"
  61057. #elif defined(__clang__)
  61058. "adcs r3, %[r]\n\t"
  61059. #else
  61060. "adc r3, %[r]\n\t"
  61061. #endif
  61062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61063. "lsrs r5, %[a], #16\n\t"
  61064. #else
  61065. "lsr r5, %[a], #16\n\t"
  61066. #endif
  61067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61068. "lsrs r6, r7, #16\n\t"
  61069. #else
  61070. "lsr r6, r7, #16\n\t"
  61071. #endif
  61072. #ifdef WOLFSSL_KEIL
  61073. "muls r6, r5, r6\n\t"
  61074. #elif defined(__clang__)
  61075. "muls r6, r5\n\t"
  61076. #else
  61077. "mul r6, r5\n\t"
  61078. #endif
  61079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61080. "adds r2, r2, r6\n\t"
  61081. #else
  61082. "add r2, r2, r6\n\t"
  61083. #endif
  61084. #ifdef WOLFSSL_KEIL
  61085. "adcs r3, r3, %[r]\n\t"
  61086. #elif defined(__clang__)
  61087. "adcs r3, %[r]\n\t"
  61088. #else
  61089. "adc r3, %[r]\n\t"
  61090. #endif
  61091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61092. "adds r2, r2, r6\n\t"
  61093. #else
  61094. "add r2, r2, r6\n\t"
  61095. #endif
  61096. #ifdef WOLFSSL_KEIL
  61097. "adcs r3, r3, %[r]\n\t"
  61098. #elif defined(__clang__)
  61099. "adcs r3, %[r]\n\t"
  61100. #else
  61101. "adc r3, %[r]\n\t"
  61102. #endif
  61103. "uxth r6, r7\n\t"
  61104. #ifdef WOLFSSL_KEIL
  61105. "muls r5, r6, r5\n\t"
  61106. #elif defined(__clang__)
  61107. "muls r5, r6\n\t"
  61108. #else
  61109. "mul r5, r6\n\t"
  61110. #endif
  61111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61112. "lsrs r6, r5, #16\n\t"
  61113. #else
  61114. "lsr r6, r5, #16\n\t"
  61115. #endif
  61116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61117. "lsls r5, r5, #16\n\t"
  61118. #else
  61119. "lsl r5, r5, #16\n\t"
  61120. #endif
  61121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61122. "adds r4, r4, r5\n\t"
  61123. #else
  61124. "add r4, r4, r5\n\t"
  61125. #endif
  61126. #ifdef WOLFSSL_KEIL
  61127. "adcs r2, r2, r6\n\t"
  61128. #elif defined(__clang__)
  61129. "adcs r2, r6\n\t"
  61130. #else
  61131. "adc r2, r6\n\t"
  61132. #endif
  61133. #ifdef WOLFSSL_KEIL
  61134. "adcs r3, r3, %[r]\n\t"
  61135. #elif defined(__clang__)
  61136. "adcs r3, %[r]\n\t"
  61137. #else
  61138. "adc r3, %[r]\n\t"
  61139. #endif
  61140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61141. "adds r4, r4, r5\n\t"
  61142. #else
  61143. "add r4, r4, r5\n\t"
  61144. #endif
  61145. #ifdef WOLFSSL_KEIL
  61146. "adcs r2, r2, r6\n\t"
  61147. #elif defined(__clang__)
  61148. "adcs r2, r6\n\t"
  61149. #else
  61150. "adc r2, r6\n\t"
  61151. #endif
  61152. #ifdef WOLFSSL_KEIL
  61153. "adcs r3, r3, %[r]\n\t"
  61154. #elif defined(__clang__)
  61155. "adcs r3, %[r]\n\t"
  61156. #else
  61157. "adc r3, %[r]\n\t"
  61158. #endif
  61159. "# A[9] * A[5]\n\t"
  61160. "mov %[a], r9\n\t"
  61161. "ldr r7, [%[a], #20]\n\t"
  61162. "mov %[a], r11\n\t"
  61163. "uxth r5, %[a]\n\t"
  61164. "uxth r6, r7\n\t"
  61165. #ifdef WOLFSSL_KEIL
  61166. "muls r6, r5, r6\n\t"
  61167. #elif defined(__clang__)
  61168. "muls r6, r5\n\t"
  61169. #else
  61170. "mul r6, r5\n\t"
  61171. #endif
  61172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61173. "adds r4, r4, r6\n\t"
  61174. #else
  61175. "add r4, r4, r6\n\t"
  61176. #endif
  61177. #ifdef WOLFSSL_KEIL
  61178. "adcs r2, r2, %[r]\n\t"
  61179. #elif defined(__clang__)
  61180. "adcs r2, %[r]\n\t"
  61181. #else
  61182. "adc r2, %[r]\n\t"
  61183. #endif
  61184. #ifdef WOLFSSL_KEIL
  61185. "adcs r3, r3, %[r]\n\t"
  61186. #elif defined(__clang__)
  61187. "adcs r3, %[r]\n\t"
  61188. #else
  61189. "adc r3, %[r]\n\t"
  61190. #endif
  61191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61192. "adds r4, r4, r6\n\t"
  61193. #else
  61194. "add r4, r4, r6\n\t"
  61195. #endif
  61196. #ifdef WOLFSSL_KEIL
  61197. "adcs r2, r2, %[r]\n\t"
  61198. #elif defined(__clang__)
  61199. "adcs r2, %[r]\n\t"
  61200. #else
  61201. "adc r2, %[r]\n\t"
  61202. #endif
  61203. #ifdef WOLFSSL_KEIL
  61204. "adcs r3, r3, %[r]\n\t"
  61205. #elif defined(__clang__)
  61206. "adcs r3, %[r]\n\t"
  61207. #else
  61208. "adc r3, %[r]\n\t"
  61209. #endif
  61210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61211. "lsrs r6, r7, #16\n\t"
  61212. #else
  61213. "lsr r6, r7, #16\n\t"
  61214. #endif
  61215. #ifdef WOLFSSL_KEIL
  61216. "muls r5, r6, r5\n\t"
  61217. #elif defined(__clang__)
  61218. "muls r5, r6\n\t"
  61219. #else
  61220. "mul r5, r6\n\t"
  61221. #endif
  61222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61223. "lsrs r6, r5, #16\n\t"
  61224. #else
  61225. "lsr r6, r5, #16\n\t"
  61226. #endif
  61227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61228. "lsls r5, r5, #16\n\t"
  61229. #else
  61230. "lsl r5, r5, #16\n\t"
  61231. #endif
  61232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61233. "adds r4, r4, r5\n\t"
  61234. #else
  61235. "add r4, r4, r5\n\t"
  61236. #endif
  61237. #ifdef WOLFSSL_KEIL
  61238. "adcs r2, r2, r6\n\t"
  61239. #elif defined(__clang__)
  61240. "adcs r2, r6\n\t"
  61241. #else
  61242. "adc r2, r6\n\t"
  61243. #endif
  61244. #ifdef WOLFSSL_KEIL
  61245. "adcs r3, r3, %[r]\n\t"
  61246. #elif defined(__clang__)
  61247. "adcs r3, %[r]\n\t"
  61248. #else
  61249. "adc r3, %[r]\n\t"
  61250. #endif
  61251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61252. "adds r4, r4, r5\n\t"
  61253. #else
  61254. "add r4, r4, r5\n\t"
  61255. #endif
  61256. #ifdef WOLFSSL_KEIL
  61257. "adcs r2, r2, r6\n\t"
  61258. #elif defined(__clang__)
  61259. "adcs r2, r6\n\t"
  61260. #else
  61261. "adc r2, r6\n\t"
  61262. #endif
  61263. #ifdef WOLFSSL_KEIL
  61264. "adcs r3, r3, %[r]\n\t"
  61265. #elif defined(__clang__)
  61266. "adcs r3, %[r]\n\t"
  61267. #else
  61268. "adc r3, %[r]\n\t"
  61269. #endif
  61270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61271. "lsrs r5, %[a], #16\n\t"
  61272. #else
  61273. "lsr r5, %[a], #16\n\t"
  61274. #endif
  61275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61276. "lsrs r6, r7, #16\n\t"
  61277. #else
  61278. "lsr r6, r7, #16\n\t"
  61279. #endif
  61280. #ifdef WOLFSSL_KEIL
  61281. "muls r6, r5, r6\n\t"
  61282. #elif defined(__clang__)
  61283. "muls r6, r5\n\t"
  61284. #else
  61285. "mul r6, r5\n\t"
  61286. #endif
  61287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61288. "adds r2, r2, r6\n\t"
  61289. #else
  61290. "add r2, r2, r6\n\t"
  61291. #endif
  61292. #ifdef WOLFSSL_KEIL
  61293. "adcs r3, r3, %[r]\n\t"
  61294. #elif defined(__clang__)
  61295. "adcs r3, %[r]\n\t"
  61296. #else
  61297. "adc r3, %[r]\n\t"
  61298. #endif
  61299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61300. "adds r2, r2, r6\n\t"
  61301. #else
  61302. "add r2, r2, r6\n\t"
  61303. #endif
  61304. #ifdef WOLFSSL_KEIL
  61305. "adcs r3, r3, %[r]\n\t"
  61306. #elif defined(__clang__)
  61307. "adcs r3, %[r]\n\t"
  61308. #else
  61309. "adc r3, %[r]\n\t"
  61310. #endif
  61311. "uxth r6, r7\n\t"
  61312. #ifdef WOLFSSL_KEIL
  61313. "muls r5, r6, r5\n\t"
  61314. #elif defined(__clang__)
  61315. "muls r5, r6\n\t"
  61316. #else
  61317. "mul r5, r6\n\t"
  61318. #endif
  61319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61320. "lsrs r6, r5, #16\n\t"
  61321. #else
  61322. "lsr r6, r5, #16\n\t"
  61323. #endif
  61324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61325. "lsls r5, r5, #16\n\t"
  61326. #else
  61327. "lsl r5, r5, #16\n\t"
  61328. #endif
  61329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61330. "adds r4, r4, r5\n\t"
  61331. #else
  61332. "add r4, r4, r5\n\t"
  61333. #endif
  61334. #ifdef WOLFSSL_KEIL
  61335. "adcs r2, r2, r6\n\t"
  61336. #elif defined(__clang__)
  61337. "adcs r2, r6\n\t"
  61338. #else
  61339. "adc r2, r6\n\t"
  61340. #endif
  61341. #ifdef WOLFSSL_KEIL
  61342. "adcs r3, r3, %[r]\n\t"
  61343. #elif defined(__clang__)
  61344. "adcs r3, %[r]\n\t"
  61345. #else
  61346. "adc r3, %[r]\n\t"
  61347. #endif
  61348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61349. "adds r4, r4, r5\n\t"
  61350. #else
  61351. "add r4, r4, r5\n\t"
  61352. #endif
  61353. #ifdef WOLFSSL_KEIL
  61354. "adcs r2, r2, r6\n\t"
  61355. #elif defined(__clang__)
  61356. "adcs r2, r6\n\t"
  61357. #else
  61358. "adc r2, r6\n\t"
  61359. #endif
  61360. #ifdef WOLFSSL_KEIL
  61361. "adcs r3, r3, %[r]\n\t"
  61362. #elif defined(__clang__)
  61363. "adcs r3, %[r]\n\t"
  61364. #else
  61365. "adc r3, %[r]\n\t"
  61366. #endif
  61367. "# A[8] * A[6]\n\t"
  61368. "mov %[a], r9\n\t"
  61369. "ldr r7, [%[a], #24]\n\t"
  61370. "mov %[a], r10\n\t"
  61371. "uxth r5, %[a]\n\t"
  61372. "uxth r6, r7\n\t"
  61373. #ifdef WOLFSSL_KEIL
  61374. "muls r6, r5, r6\n\t"
  61375. #elif defined(__clang__)
  61376. "muls r6, r5\n\t"
  61377. #else
  61378. "mul r6, r5\n\t"
  61379. #endif
  61380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61381. "adds r4, r4, r6\n\t"
  61382. #else
  61383. "add r4, r4, r6\n\t"
  61384. #endif
  61385. #ifdef WOLFSSL_KEIL
  61386. "adcs r2, r2, %[r]\n\t"
  61387. #elif defined(__clang__)
  61388. "adcs r2, %[r]\n\t"
  61389. #else
  61390. "adc r2, %[r]\n\t"
  61391. #endif
  61392. #ifdef WOLFSSL_KEIL
  61393. "adcs r3, r3, %[r]\n\t"
  61394. #elif defined(__clang__)
  61395. "adcs r3, %[r]\n\t"
  61396. #else
  61397. "adc r3, %[r]\n\t"
  61398. #endif
  61399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61400. "adds r4, r4, r6\n\t"
  61401. #else
  61402. "add r4, r4, r6\n\t"
  61403. #endif
  61404. #ifdef WOLFSSL_KEIL
  61405. "adcs r2, r2, %[r]\n\t"
  61406. #elif defined(__clang__)
  61407. "adcs r2, %[r]\n\t"
  61408. #else
  61409. "adc r2, %[r]\n\t"
  61410. #endif
  61411. #ifdef WOLFSSL_KEIL
  61412. "adcs r3, r3, %[r]\n\t"
  61413. #elif defined(__clang__)
  61414. "adcs r3, %[r]\n\t"
  61415. #else
  61416. "adc r3, %[r]\n\t"
  61417. #endif
  61418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61419. "lsrs r6, r7, #16\n\t"
  61420. #else
  61421. "lsr r6, r7, #16\n\t"
  61422. #endif
  61423. #ifdef WOLFSSL_KEIL
  61424. "muls r5, r6, r5\n\t"
  61425. #elif defined(__clang__)
  61426. "muls r5, r6\n\t"
  61427. #else
  61428. "mul r5, r6\n\t"
  61429. #endif
  61430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61431. "lsrs r6, r5, #16\n\t"
  61432. #else
  61433. "lsr r6, r5, #16\n\t"
  61434. #endif
  61435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61436. "lsls r5, r5, #16\n\t"
  61437. #else
  61438. "lsl r5, r5, #16\n\t"
  61439. #endif
  61440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61441. "adds r4, r4, r5\n\t"
  61442. #else
  61443. "add r4, r4, r5\n\t"
  61444. #endif
  61445. #ifdef WOLFSSL_KEIL
  61446. "adcs r2, r2, r6\n\t"
  61447. #elif defined(__clang__)
  61448. "adcs r2, r6\n\t"
  61449. #else
  61450. "adc r2, r6\n\t"
  61451. #endif
  61452. #ifdef WOLFSSL_KEIL
  61453. "adcs r3, r3, %[r]\n\t"
  61454. #elif defined(__clang__)
  61455. "adcs r3, %[r]\n\t"
  61456. #else
  61457. "adc r3, %[r]\n\t"
  61458. #endif
  61459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61460. "adds r4, r4, r5\n\t"
  61461. #else
  61462. "add r4, r4, r5\n\t"
  61463. #endif
  61464. #ifdef WOLFSSL_KEIL
  61465. "adcs r2, r2, r6\n\t"
  61466. #elif defined(__clang__)
  61467. "adcs r2, r6\n\t"
  61468. #else
  61469. "adc r2, r6\n\t"
  61470. #endif
  61471. #ifdef WOLFSSL_KEIL
  61472. "adcs r3, r3, %[r]\n\t"
  61473. #elif defined(__clang__)
  61474. "adcs r3, %[r]\n\t"
  61475. #else
  61476. "adc r3, %[r]\n\t"
  61477. #endif
  61478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61479. "lsrs r5, %[a], #16\n\t"
  61480. #else
  61481. "lsr r5, %[a], #16\n\t"
  61482. #endif
  61483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61484. "lsrs r6, r7, #16\n\t"
  61485. #else
  61486. "lsr r6, r7, #16\n\t"
  61487. #endif
  61488. #ifdef WOLFSSL_KEIL
  61489. "muls r6, r5, r6\n\t"
  61490. #elif defined(__clang__)
  61491. "muls r6, r5\n\t"
  61492. #else
  61493. "mul r6, r5\n\t"
  61494. #endif
  61495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61496. "adds r2, r2, r6\n\t"
  61497. #else
  61498. "add r2, r2, r6\n\t"
  61499. #endif
  61500. #ifdef WOLFSSL_KEIL
  61501. "adcs r3, r3, %[r]\n\t"
  61502. #elif defined(__clang__)
  61503. "adcs r3, %[r]\n\t"
  61504. #else
  61505. "adc r3, %[r]\n\t"
  61506. #endif
  61507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61508. "adds r2, r2, r6\n\t"
  61509. #else
  61510. "add r2, r2, r6\n\t"
  61511. #endif
  61512. #ifdef WOLFSSL_KEIL
  61513. "adcs r3, r3, %[r]\n\t"
  61514. #elif defined(__clang__)
  61515. "adcs r3, %[r]\n\t"
  61516. #else
  61517. "adc r3, %[r]\n\t"
  61518. #endif
  61519. "uxth r6, r7\n\t"
  61520. #ifdef WOLFSSL_KEIL
  61521. "muls r5, r6, r5\n\t"
  61522. #elif defined(__clang__)
  61523. "muls r5, r6\n\t"
  61524. #else
  61525. "mul r5, r6\n\t"
  61526. #endif
  61527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61528. "lsrs r6, r5, #16\n\t"
  61529. #else
  61530. "lsr r6, r5, #16\n\t"
  61531. #endif
  61532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61533. "lsls r5, r5, #16\n\t"
  61534. #else
  61535. "lsl r5, r5, #16\n\t"
  61536. #endif
  61537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61538. "adds r4, r4, r5\n\t"
  61539. #else
  61540. "add r4, r4, r5\n\t"
  61541. #endif
  61542. #ifdef WOLFSSL_KEIL
  61543. "adcs r2, r2, r6\n\t"
  61544. #elif defined(__clang__)
  61545. "adcs r2, r6\n\t"
  61546. #else
  61547. "adc r2, r6\n\t"
  61548. #endif
  61549. #ifdef WOLFSSL_KEIL
  61550. "adcs r3, r3, %[r]\n\t"
  61551. #elif defined(__clang__)
  61552. "adcs r3, %[r]\n\t"
  61553. #else
  61554. "adc r3, %[r]\n\t"
  61555. #endif
  61556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61557. "adds r4, r4, r5\n\t"
  61558. #else
  61559. "add r4, r4, r5\n\t"
  61560. #endif
  61561. #ifdef WOLFSSL_KEIL
  61562. "adcs r2, r2, r6\n\t"
  61563. #elif defined(__clang__)
  61564. "adcs r2, r6\n\t"
  61565. #else
  61566. "adc r2, r6\n\t"
  61567. #endif
  61568. #ifdef WOLFSSL_KEIL
  61569. "adcs r3, r3, %[r]\n\t"
  61570. #elif defined(__clang__)
  61571. "adcs r3, %[r]\n\t"
  61572. #else
  61573. "adc r3, %[r]\n\t"
  61574. #endif
  61575. "# A[7] * A[7]\n\t"
  61576. "mov %[a], r9\n\t"
  61577. "ldr r7, [%[a], #28]\n\t"
  61578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61579. "lsrs r6, r7, #16\n\t"
  61580. #else
  61581. "lsr r6, r7, #16\n\t"
  61582. #endif
  61583. "uxth r5, r7\n\t"
  61584. #ifdef WOLFSSL_KEIL
  61585. "muls r5, r5, r5\n\t"
  61586. #elif defined(__clang__)
  61587. "muls r5, r5\n\t"
  61588. #else
  61589. "mul r5, r5\n\t"
  61590. #endif
  61591. #ifdef WOLFSSL_KEIL
  61592. "muls r6, r6, r6\n\t"
  61593. #elif defined(__clang__)
  61594. "muls r6, r6\n\t"
  61595. #else
  61596. "mul r6, r6\n\t"
  61597. #endif
  61598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61599. "adds r4, r4, r5\n\t"
  61600. #else
  61601. "add r4, r4, r5\n\t"
  61602. #endif
  61603. #ifdef WOLFSSL_KEIL
  61604. "adcs r2, r2, r6\n\t"
  61605. #elif defined(__clang__)
  61606. "adcs r2, r6\n\t"
  61607. #else
  61608. "adc r2, r6\n\t"
  61609. #endif
  61610. #ifdef WOLFSSL_KEIL
  61611. "adcs r3, r3, %[r]\n\t"
  61612. #elif defined(__clang__)
  61613. "adcs r3, %[r]\n\t"
  61614. #else
  61615. "adc r3, %[r]\n\t"
  61616. #endif
  61617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61618. "lsrs r6, r7, #16\n\t"
  61619. #else
  61620. "lsr r6, r7, #16\n\t"
  61621. #endif
  61622. "uxth r5, r7\n\t"
  61623. #ifdef WOLFSSL_KEIL
  61624. "muls r5, r6, r5\n\t"
  61625. #elif defined(__clang__)
  61626. "muls r5, r6\n\t"
  61627. #else
  61628. "mul r5, r6\n\t"
  61629. #endif
  61630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61631. "lsrs r6, r5, #15\n\t"
  61632. #else
  61633. "lsr r6, r5, #15\n\t"
  61634. #endif
  61635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61636. "lsls r5, r5, #17\n\t"
  61637. #else
  61638. "lsl r5, r5, #17\n\t"
  61639. #endif
  61640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61641. "adds r4, r4, r5\n\t"
  61642. #else
  61643. "add r4, r4, r5\n\t"
  61644. #endif
  61645. #ifdef WOLFSSL_KEIL
  61646. "adcs r2, r2, r6\n\t"
  61647. #elif defined(__clang__)
  61648. "adcs r2, r6\n\t"
  61649. #else
  61650. "adc r2, r6\n\t"
  61651. #endif
  61652. #ifdef WOLFSSL_KEIL
  61653. "adcs r3, r3, %[r]\n\t"
  61654. #elif defined(__clang__)
  61655. "adcs r3, %[r]\n\t"
  61656. #else
  61657. "adc r3, %[r]\n\t"
  61658. #endif
  61659. "mov %[r], r8\n\t"
  61660. "str r4, [%[r], #56]\n\t"
  61661. "movs %[r], #0\n\t"
  61662. "# A[8] * A[7]\n\t"
  61663. "movs r4, #0\n\t"
  61664. "mov %[a], r10\n\t"
  61665. "uxth r5, %[a]\n\t"
  61666. "uxth r6, r7\n\t"
  61667. #ifdef WOLFSSL_KEIL
  61668. "muls r6, r5, r6\n\t"
  61669. #elif defined(__clang__)
  61670. "muls r6, r5\n\t"
  61671. #else
  61672. "mul r6, r5\n\t"
  61673. #endif
  61674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61675. "adds r2, r2, r6\n\t"
  61676. #else
  61677. "add r2, r2, r6\n\t"
  61678. #endif
  61679. #ifdef WOLFSSL_KEIL
  61680. "adcs r3, r3, %[r]\n\t"
  61681. #elif defined(__clang__)
  61682. "adcs r3, %[r]\n\t"
  61683. #else
  61684. "adc r3, %[r]\n\t"
  61685. #endif
  61686. #ifdef WOLFSSL_KEIL
  61687. "adcs r4, r4, %[r]\n\t"
  61688. #elif defined(__clang__)
  61689. "adcs r4, %[r]\n\t"
  61690. #else
  61691. "adc r4, %[r]\n\t"
  61692. #endif
  61693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61694. "adds r2, r2, r6\n\t"
  61695. #else
  61696. "add r2, r2, r6\n\t"
  61697. #endif
  61698. #ifdef WOLFSSL_KEIL
  61699. "adcs r3, r3, %[r]\n\t"
  61700. #elif defined(__clang__)
  61701. "adcs r3, %[r]\n\t"
  61702. #else
  61703. "adc r3, %[r]\n\t"
  61704. #endif
  61705. #ifdef WOLFSSL_KEIL
  61706. "adcs r4, r4, %[r]\n\t"
  61707. #elif defined(__clang__)
  61708. "adcs r4, %[r]\n\t"
  61709. #else
  61710. "adc r4, %[r]\n\t"
  61711. #endif
  61712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61713. "lsrs r6, r7, #16\n\t"
  61714. #else
  61715. "lsr r6, r7, #16\n\t"
  61716. #endif
  61717. #ifdef WOLFSSL_KEIL
  61718. "muls r5, r6, r5\n\t"
  61719. #elif defined(__clang__)
  61720. "muls r5, r6\n\t"
  61721. #else
  61722. "mul r5, r6\n\t"
  61723. #endif
  61724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61725. "lsrs r6, r5, #16\n\t"
  61726. #else
  61727. "lsr r6, r5, #16\n\t"
  61728. #endif
  61729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61730. "lsls r5, r5, #16\n\t"
  61731. #else
  61732. "lsl r5, r5, #16\n\t"
  61733. #endif
  61734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61735. "adds r2, r2, r5\n\t"
  61736. #else
  61737. "add r2, r2, r5\n\t"
  61738. #endif
  61739. #ifdef WOLFSSL_KEIL
  61740. "adcs r3, r3, r6\n\t"
  61741. #elif defined(__clang__)
  61742. "adcs r3, r6\n\t"
  61743. #else
  61744. "adc r3, r6\n\t"
  61745. #endif
  61746. #ifdef WOLFSSL_KEIL
  61747. "adcs r4, r4, %[r]\n\t"
  61748. #elif defined(__clang__)
  61749. "adcs r4, %[r]\n\t"
  61750. #else
  61751. "adc r4, %[r]\n\t"
  61752. #endif
  61753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61754. "adds r2, r2, r5\n\t"
  61755. #else
  61756. "add r2, r2, r5\n\t"
  61757. #endif
  61758. #ifdef WOLFSSL_KEIL
  61759. "adcs r3, r3, r6\n\t"
  61760. #elif defined(__clang__)
  61761. "adcs r3, r6\n\t"
  61762. #else
  61763. "adc r3, r6\n\t"
  61764. #endif
  61765. #ifdef WOLFSSL_KEIL
  61766. "adcs r4, r4, %[r]\n\t"
  61767. #elif defined(__clang__)
  61768. "adcs r4, %[r]\n\t"
  61769. #else
  61770. "adc r4, %[r]\n\t"
  61771. #endif
  61772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61773. "lsrs r5, %[a], #16\n\t"
  61774. #else
  61775. "lsr r5, %[a], #16\n\t"
  61776. #endif
  61777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61778. "lsrs r6, r7, #16\n\t"
  61779. #else
  61780. "lsr r6, r7, #16\n\t"
  61781. #endif
  61782. #ifdef WOLFSSL_KEIL
  61783. "muls r6, r5, r6\n\t"
  61784. #elif defined(__clang__)
  61785. "muls r6, r5\n\t"
  61786. #else
  61787. "mul r6, r5\n\t"
  61788. #endif
  61789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61790. "adds r3, r3, r6\n\t"
  61791. #else
  61792. "add r3, r3, r6\n\t"
  61793. #endif
  61794. #ifdef WOLFSSL_KEIL
  61795. "adcs r4, r4, %[r]\n\t"
  61796. #elif defined(__clang__)
  61797. "adcs r4, %[r]\n\t"
  61798. #else
  61799. "adc r4, %[r]\n\t"
  61800. #endif
  61801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61802. "adds r3, r3, r6\n\t"
  61803. #else
  61804. "add r3, r3, r6\n\t"
  61805. #endif
  61806. #ifdef WOLFSSL_KEIL
  61807. "adcs r4, r4, %[r]\n\t"
  61808. #elif defined(__clang__)
  61809. "adcs r4, %[r]\n\t"
  61810. #else
  61811. "adc r4, %[r]\n\t"
  61812. #endif
  61813. "uxth r6, r7\n\t"
  61814. #ifdef WOLFSSL_KEIL
  61815. "muls r5, r6, r5\n\t"
  61816. #elif defined(__clang__)
  61817. "muls r5, r6\n\t"
  61818. #else
  61819. "mul r5, r6\n\t"
  61820. #endif
  61821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61822. "lsrs r6, r5, #16\n\t"
  61823. #else
  61824. "lsr r6, r5, #16\n\t"
  61825. #endif
  61826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61827. "lsls r5, r5, #16\n\t"
  61828. #else
  61829. "lsl r5, r5, #16\n\t"
  61830. #endif
  61831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61832. "adds r2, r2, r5\n\t"
  61833. #else
  61834. "add r2, r2, r5\n\t"
  61835. #endif
  61836. #ifdef WOLFSSL_KEIL
  61837. "adcs r3, r3, r6\n\t"
  61838. #elif defined(__clang__)
  61839. "adcs r3, r6\n\t"
  61840. #else
  61841. "adc r3, r6\n\t"
  61842. #endif
  61843. #ifdef WOLFSSL_KEIL
  61844. "adcs r4, r4, %[r]\n\t"
  61845. #elif defined(__clang__)
  61846. "adcs r4, %[r]\n\t"
  61847. #else
  61848. "adc r4, %[r]\n\t"
  61849. #endif
  61850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61851. "adds r2, r2, r5\n\t"
  61852. #else
  61853. "add r2, r2, r5\n\t"
  61854. #endif
  61855. #ifdef WOLFSSL_KEIL
  61856. "adcs r3, r3, r6\n\t"
  61857. #elif defined(__clang__)
  61858. "adcs r3, r6\n\t"
  61859. #else
  61860. "adc r3, r6\n\t"
  61861. #endif
  61862. #ifdef WOLFSSL_KEIL
  61863. "adcs r4, r4, %[r]\n\t"
  61864. #elif defined(__clang__)
  61865. "adcs r4, %[r]\n\t"
  61866. #else
  61867. "adc r4, %[r]\n\t"
  61868. #endif
  61869. "# A[9] * A[6]\n\t"
  61870. "mov %[a], r9\n\t"
  61871. "ldr r7, [%[a], #24]\n\t"
  61872. "mov %[a], r11\n\t"
  61873. "uxth r5, %[a]\n\t"
  61874. "uxth r6, r7\n\t"
  61875. #ifdef WOLFSSL_KEIL
  61876. "muls r6, r5, r6\n\t"
  61877. #elif defined(__clang__)
  61878. "muls r6, r5\n\t"
  61879. #else
  61880. "mul r6, r5\n\t"
  61881. #endif
  61882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61883. "adds r2, r2, r6\n\t"
  61884. #else
  61885. "add r2, r2, r6\n\t"
  61886. #endif
  61887. #ifdef WOLFSSL_KEIL
  61888. "adcs r3, r3, %[r]\n\t"
  61889. #elif defined(__clang__)
  61890. "adcs r3, %[r]\n\t"
  61891. #else
  61892. "adc r3, %[r]\n\t"
  61893. #endif
  61894. #ifdef WOLFSSL_KEIL
  61895. "adcs r4, r4, %[r]\n\t"
  61896. #elif defined(__clang__)
  61897. "adcs r4, %[r]\n\t"
  61898. #else
  61899. "adc r4, %[r]\n\t"
  61900. #endif
  61901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61902. "adds r2, r2, r6\n\t"
  61903. #else
  61904. "add r2, r2, r6\n\t"
  61905. #endif
  61906. #ifdef WOLFSSL_KEIL
  61907. "adcs r3, r3, %[r]\n\t"
  61908. #elif defined(__clang__)
  61909. "adcs r3, %[r]\n\t"
  61910. #else
  61911. "adc r3, %[r]\n\t"
  61912. #endif
  61913. #ifdef WOLFSSL_KEIL
  61914. "adcs r4, r4, %[r]\n\t"
  61915. #elif defined(__clang__)
  61916. "adcs r4, %[r]\n\t"
  61917. #else
  61918. "adc r4, %[r]\n\t"
  61919. #endif
  61920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61921. "lsrs r6, r7, #16\n\t"
  61922. #else
  61923. "lsr r6, r7, #16\n\t"
  61924. #endif
  61925. #ifdef WOLFSSL_KEIL
  61926. "muls r5, r6, r5\n\t"
  61927. #elif defined(__clang__)
  61928. "muls r5, r6\n\t"
  61929. #else
  61930. "mul r5, r6\n\t"
  61931. #endif
  61932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61933. "lsrs r6, r5, #16\n\t"
  61934. #else
  61935. "lsr r6, r5, #16\n\t"
  61936. #endif
  61937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61938. "lsls r5, r5, #16\n\t"
  61939. #else
  61940. "lsl r5, r5, #16\n\t"
  61941. #endif
  61942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61943. "adds r2, r2, r5\n\t"
  61944. #else
  61945. "add r2, r2, r5\n\t"
  61946. #endif
  61947. #ifdef WOLFSSL_KEIL
  61948. "adcs r3, r3, r6\n\t"
  61949. #elif defined(__clang__)
  61950. "adcs r3, r6\n\t"
  61951. #else
  61952. "adc r3, r6\n\t"
  61953. #endif
  61954. #ifdef WOLFSSL_KEIL
  61955. "adcs r4, r4, %[r]\n\t"
  61956. #elif defined(__clang__)
  61957. "adcs r4, %[r]\n\t"
  61958. #else
  61959. "adc r4, %[r]\n\t"
  61960. #endif
  61961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61962. "adds r2, r2, r5\n\t"
  61963. #else
  61964. "add r2, r2, r5\n\t"
  61965. #endif
  61966. #ifdef WOLFSSL_KEIL
  61967. "adcs r3, r3, r6\n\t"
  61968. #elif defined(__clang__)
  61969. "adcs r3, r6\n\t"
  61970. #else
  61971. "adc r3, r6\n\t"
  61972. #endif
  61973. #ifdef WOLFSSL_KEIL
  61974. "adcs r4, r4, %[r]\n\t"
  61975. #elif defined(__clang__)
  61976. "adcs r4, %[r]\n\t"
  61977. #else
  61978. "adc r4, %[r]\n\t"
  61979. #endif
  61980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61981. "lsrs r5, %[a], #16\n\t"
  61982. #else
  61983. "lsr r5, %[a], #16\n\t"
  61984. #endif
  61985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61986. "lsrs r6, r7, #16\n\t"
  61987. #else
  61988. "lsr r6, r7, #16\n\t"
  61989. #endif
  61990. #ifdef WOLFSSL_KEIL
  61991. "muls r6, r5, r6\n\t"
  61992. #elif defined(__clang__)
  61993. "muls r6, r5\n\t"
  61994. #else
  61995. "mul r6, r5\n\t"
  61996. #endif
  61997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61998. "adds r3, r3, r6\n\t"
  61999. #else
  62000. "add r3, r3, r6\n\t"
  62001. #endif
  62002. #ifdef WOLFSSL_KEIL
  62003. "adcs r4, r4, %[r]\n\t"
  62004. #elif defined(__clang__)
  62005. "adcs r4, %[r]\n\t"
  62006. #else
  62007. "adc r4, %[r]\n\t"
  62008. #endif
  62009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62010. "adds r3, r3, r6\n\t"
  62011. #else
  62012. "add r3, r3, r6\n\t"
  62013. #endif
  62014. #ifdef WOLFSSL_KEIL
  62015. "adcs r4, r4, %[r]\n\t"
  62016. #elif defined(__clang__)
  62017. "adcs r4, %[r]\n\t"
  62018. #else
  62019. "adc r4, %[r]\n\t"
  62020. #endif
  62021. "uxth r6, r7\n\t"
  62022. #ifdef WOLFSSL_KEIL
  62023. "muls r5, r6, r5\n\t"
  62024. #elif defined(__clang__)
  62025. "muls r5, r6\n\t"
  62026. #else
  62027. "mul r5, r6\n\t"
  62028. #endif
  62029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62030. "lsrs r6, r5, #16\n\t"
  62031. #else
  62032. "lsr r6, r5, #16\n\t"
  62033. #endif
  62034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62035. "lsls r5, r5, #16\n\t"
  62036. #else
  62037. "lsl r5, r5, #16\n\t"
  62038. #endif
  62039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62040. "adds r2, r2, r5\n\t"
  62041. #else
  62042. "add r2, r2, r5\n\t"
  62043. #endif
  62044. #ifdef WOLFSSL_KEIL
  62045. "adcs r3, r3, r6\n\t"
  62046. #elif defined(__clang__)
  62047. "adcs r3, r6\n\t"
  62048. #else
  62049. "adc r3, r6\n\t"
  62050. #endif
  62051. #ifdef WOLFSSL_KEIL
  62052. "adcs r4, r4, %[r]\n\t"
  62053. #elif defined(__clang__)
  62054. "adcs r4, %[r]\n\t"
  62055. #else
  62056. "adc r4, %[r]\n\t"
  62057. #endif
  62058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62059. "adds r2, r2, r5\n\t"
  62060. #else
  62061. "add r2, r2, r5\n\t"
  62062. #endif
  62063. #ifdef WOLFSSL_KEIL
  62064. "adcs r3, r3, r6\n\t"
  62065. #elif defined(__clang__)
  62066. "adcs r3, r6\n\t"
  62067. #else
  62068. "adc r3, r6\n\t"
  62069. #endif
  62070. #ifdef WOLFSSL_KEIL
  62071. "adcs r4, r4, %[r]\n\t"
  62072. #elif defined(__clang__)
  62073. "adcs r4, %[r]\n\t"
  62074. #else
  62075. "adc r4, %[r]\n\t"
  62076. #endif
  62077. "# A[10] * A[5]\n\t"
  62078. "mov %[a], r9\n\t"
  62079. "ldr r7, [%[a], #20]\n\t"
  62080. "mov %[a], r12\n\t"
  62081. "uxth r5, %[a]\n\t"
  62082. "uxth r6, r7\n\t"
  62083. #ifdef WOLFSSL_KEIL
  62084. "muls r6, r5, r6\n\t"
  62085. #elif defined(__clang__)
  62086. "muls r6, r5\n\t"
  62087. #else
  62088. "mul r6, r5\n\t"
  62089. #endif
  62090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62091. "adds r2, r2, r6\n\t"
  62092. #else
  62093. "add r2, r2, r6\n\t"
  62094. #endif
  62095. #ifdef WOLFSSL_KEIL
  62096. "adcs r3, r3, %[r]\n\t"
  62097. #elif defined(__clang__)
  62098. "adcs r3, %[r]\n\t"
  62099. #else
  62100. "adc r3, %[r]\n\t"
  62101. #endif
  62102. #ifdef WOLFSSL_KEIL
  62103. "adcs r4, r4, %[r]\n\t"
  62104. #elif defined(__clang__)
  62105. "adcs r4, %[r]\n\t"
  62106. #else
  62107. "adc r4, %[r]\n\t"
  62108. #endif
  62109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62110. "adds r2, r2, r6\n\t"
  62111. #else
  62112. "add r2, r2, r6\n\t"
  62113. #endif
  62114. #ifdef WOLFSSL_KEIL
  62115. "adcs r3, r3, %[r]\n\t"
  62116. #elif defined(__clang__)
  62117. "adcs r3, %[r]\n\t"
  62118. #else
  62119. "adc r3, %[r]\n\t"
  62120. #endif
  62121. #ifdef WOLFSSL_KEIL
  62122. "adcs r4, r4, %[r]\n\t"
  62123. #elif defined(__clang__)
  62124. "adcs r4, %[r]\n\t"
  62125. #else
  62126. "adc r4, %[r]\n\t"
  62127. #endif
  62128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62129. "lsrs r6, r7, #16\n\t"
  62130. #else
  62131. "lsr r6, r7, #16\n\t"
  62132. #endif
  62133. #ifdef WOLFSSL_KEIL
  62134. "muls r5, r6, r5\n\t"
  62135. #elif defined(__clang__)
  62136. "muls r5, r6\n\t"
  62137. #else
  62138. "mul r5, r6\n\t"
  62139. #endif
  62140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62141. "lsrs r6, r5, #16\n\t"
  62142. #else
  62143. "lsr r6, r5, #16\n\t"
  62144. #endif
  62145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62146. "lsls r5, r5, #16\n\t"
  62147. #else
  62148. "lsl r5, r5, #16\n\t"
  62149. #endif
  62150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62151. "adds r2, r2, r5\n\t"
  62152. #else
  62153. "add r2, r2, r5\n\t"
  62154. #endif
  62155. #ifdef WOLFSSL_KEIL
  62156. "adcs r3, r3, r6\n\t"
  62157. #elif defined(__clang__)
  62158. "adcs r3, r6\n\t"
  62159. #else
  62160. "adc r3, r6\n\t"
  62161. #endif
  62162. #ifdef WOLFSSL_KEIL
  62163. "adcs r4, r4, %[r]\n\t"
  62164. #elif defined(__clang__)
  62165. "adcs r4, %[r]\n\t"
  62166. #else
  62167. "adc r4, %[r]\n\t"
  62168. #endif
  62169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62170. "adds r2, r2, r5\n\t"
  62171. #else
  62172. "add r2, r2, r5\n\t"
  62173. #endif
  62174. #ifdef WOLFSSL_KEIL
  62175. "adcs r3, r3, r6\n\t"
  62176. #elif defined(__clang__)
  62177. "adcs r3, r6\n\t"
  62178. #else
  62179. "adc r3, r6\n\t"
  62180. #endif
  62181. #ifdef WOLFSSL_KEIL
  62182. "adcs r4, r4, %[r]\n\t"
  62183. #elif defined(__clang__)
  62184. "adcs r4, %[r]\n\t"
  62185. #else
  62186. "adc r4, %[r]\n\t"
  62187. #endif
  62188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62189. "lsrs r5, %[a], #16\n\t"
  62190. #else
  62191. "lsr r5, %[a], #16\n\t"
  62192. #endif
  62193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62194. "lsrs r6, r7, #16\n\t"
  62195. #else
  62196. "lsr r6, r7, #16\n\t"
  62197. #endif
  62198. #ifdef WOLFSSL_KEIL
  62199. "muls r6, r5, r6\n\t"
  62200. #elif defined(__clang__)
  62201. "muls r6, r5\n\t"
  62202. #else
  62203. "mul r6, r5\n\t"
  62204. #endif
  62205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62206. "adds r3, r3, r6\n\t"
  62207. #else
  62208. "add r3, r3, r6\n\t"
  62209. #endif
  62210. #ifdef WOLFSSL_KEIL
  62211. "adcs r4, r4, %[r]\n\t"
  62212. #elif defined(__clang__)
  62213. "adcs r4, %[r]\n\t"
  62214. #else
  62215. "adc r4, %[r]\n\t"
  62216. #endif
  62217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62218. "adds r3, r3, r6\n\t"
  62219. #else
  62220. "add r3, r3, r6\n\t"
  62221. #endif
  62222. #ifdef WOLFSSL_KEIL
  62223. "adcs r4, r4, %[r]\n\t"
  62224. #elif defined(__clang__)
  62225. "adcs r4, %[r]\n\t"
  62226. #else
  62227. "adc r4, %[r]\n\t"
  62228. #endif
  62229. "uxth r6, r7\n\t"
  62230. #ifdef WOLFSSL_KEIL
  62231. "muls r5, r6, r5\n\t"
  62232. #elif defined(__clang__)
  62233. "muls r5, r6\n\t"
  62234. #else
  62235. "mul r5, r6\n\t"
  62236. #endif
  62237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62238. "lsrs r6, r5, #16\n\t"
  62239. #else
  62240. "lsr r6, r5, #16\n\t"
  62241. #endif
  62242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62243. "lsls r5, r5, #16\n\t"
  62244. #else
  62245. "lsl r5, r5, #16\n\t"
  62246. #endif
  62247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62248. "adds r2, r2, r5\n\t"
  62249. #else
  62250. "add r2, r2, r5\n\t"
  62251. #endif
  62252. #ifdef WOLFSSL_KEIL
  62253. "adcs r3, r3, r6\n\t"
  62254. #elif defined(__clang__)
  62255. "adcs r3, r6\n\t"
  62256. #else
  62257. "adc r3, r6\n\t"
  62258. #endif
  62259. #ifdef WOLFSSL_KEIL
  62260. "adcs r4, r4, %[r]\n\t"
  62261. #elif defined(__clang__)
  62262. "adcs r4, %[r]\n\t"
  62263. #else
  62264. "adc r4, %[r]\n\t"
  62265. #endif
  62266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62267. "adds r2, r2, r5\n\t"
  62268. #else
  62269. "add r2, r2, r5\n\t"
  62270. #endif
  62271. #ifdef WOLFSSL_KEIL
  62272. "adcs r3, r3, r6\n\t"
  62273. #elif defined(__clang__)
  62274. "adcs r3, r6\n\t"
  62275. #else
  62276. "adc r3, r6\n\t"
  62277. #endif
  62278. #ifdef WOLFSSL_KEIL
  62279. "adcs r4, r4, %[r]\n\t"
  62280. #elif defined(__clang__)
  62281. "adcs r4, %[r]\n\t"
  62282. #else
  62283. "adc r4, %[r]\n\t"
  62284. #endif
  62285. "# A[11] * A[4]\n\t"
  62286. "mov %[a], r9\n\t"
  62287. "ldr r7, [%[a], #16]\n\t"
  62288. "mov %[a], lr\n\t"
  62289. "uxth r5, %[a]\n\t"
  62290. "uxth r6, r7\n\t"
  62291. #ifdef WOLFSSL_KEIL
  62292. "muls r6, r5, r6\n\t"
  62293. #elif defined(__clang__)
  62294. "muls r6, r5\n\t"
  62295. #else
  62296. "mul r6, r5\n\t"
  62297. #endif
  62298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62299. "adds r2, r2, r6\n\t"
  62300. #else
  62301. "add r2, r2, r6\n\t"
  62302. #endif
  62303. #ifdef WOLFSSL_KEIL
  62304. "adcs r3, r3, %[r]\n\t"
  62305. #elif defined(__clang__)
  62306. "adcs r3, %[r]\n\t"
  62307. #else
  62308. "adc r3, %[r]\n\t"
  62309. #endif
  62310. #ifdef WOLFSSL_KEIL
  62311. "adcs r4, r4, %[r]\n\t"
  62312. #elif defined(__clang__)
  62313. "adcs r4, %[r]\n\t"
  62314. #else
  62315. "adc r4, %[r]\n\t"
  62316. #endif
  62317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62318. "adds r2, r2, r6\n\t"
  62319. #else
  62320. "add r2, r2, r6\n\t"
  62321. #endif
  62322. #ifdef WOLFSSL_KEIL
  62323. "adcs r3, r3, %[r]\n\t"
  62324. #elif defined(__clang__)
  62325. "adcs r3, %[r]\n\t"
  62326. #else
  62327. "adc r3, %[r]\n\t"
  62328. #endif
  62329. #ifdef WOLFSSL_KEIL
  62330. "adcs r4, r4, %[r]\n\t"
  62331. #elif defined(__clang__)
  62332. "adcs r4, %[r]\n\t"
  62333. #else
  62334. "adc r4, %[r]\n\t"
  62335. #endif
  62336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62337. "lsrs r6, r7, #16\n\t"
  62338. #else
  62339. "lsr r6, r7, #16\n\t"
  62340. #endif
  62341. #ifdef WOLFSSL_KEIL
  62342. "muls r5, r6, r5\n\t"
  62343. #elif defined(__clang__)
  62344. "muls r5, r6\n\t"
  62345. #else
  62346. "mul r5, r6\n\t"
  62347. #endif
  62348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62349. "lsrs r6, r5, #16\n\t"
  62350. #else
  62351. "lsr r6, r5, #16\n\t"
  62352. #endif
  62353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62354. "lsls r5, r5, #16\n\t"
  62355. #else
  62356. "lsl r5, r5, #16\n\t"
  62357. #endif
  62358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62359. "adds r2, r2, r5\n\t"
  62360. #else
  62361. "add r2, r2, r5\n\t"
  62362. #endif
  62363. #ifdef WOLFSSL_KEIL
  62364. "adcs r3, r3, r6\n\t"
  62365. #elif defined(__clang__)
  62366. "adcs r3, r6\n\t"
  62367. #else
  62368. "adc r3, r6\n\t"
  62369. #endif
  62370. #ifdef WOLFSSL_KEIL
  62371. "adcs r4, r4, %[r]\n\t"
  62372. #elif defined(__clang__)
  62373. "adcs r4, %[r]\n\t"
  62374. #else
  62375. "adc r4, %[r]\n\t"
  62376. #endif
  62377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62378. "adds r2, r2, r5\n\t"
  62379. #else
  62380. "add r2, r2, r5\n\t"
  62381. #endif
  62382. #ifdef WOLFSSL_KEIL
  62383. "adcs r3, r3, r6\n\t"
  62384. #elif defined(__clang__)
  62385. "adcs r3, r6\n\t"
  62386. #else
  62387. "adc r3, r6\n\t"
  62388. #endif
  62389. #ifdef WOLFSSL_KEIL
  62390. "adcs r4, r4, %[r]\n\t"
  62391. #elif defined(__clang__)
  62392. "adcs r4, %[r]\n\t"
  62393. #else
  62394. "adc r4, %[r]\n\t"
  62395. #endif
  62396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62397. "lsrs r5, %[a], #16\n\t"
  62398. #else
  62399. "lsr r5, %[a], #16\n\t"
  62400. #endif
  62401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62402. "lsrs r6, r7, #16\n\t"
  62403. #else
  62404. "lsr r6, r7, #16\n\t"
  62405. #endif
  62406. #ifdef WOLFSSL_KEIL
  62407. "muls r6, r5, r6\n\t"
  62408. #elif defined(__clang__)
  62409. "muls r6, r5\n\t"
  62410. #else
  62411. "mul r6, r5\n\t"
  62412. #endif
  62413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62414. "adds r3, r3, r6\n\t"
  62415. #else
  62416. "add r3, r3, r6\n\t"
  62417. #endif
  62418. #ifdef WOLFSSL_KEIL
  62419. "adcs r4, r4, %[r]\n\t"
  62420. #elif defined(__clang__)
  62421. "adcs r4, %[r]\n\t"
  62422. #else
  62423. "adc r4, %[r]\n\t"
  62424. #endif
  62425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62426. "adds r3, r3, r6\n\t"
  62427. #else
  62428. "add r3, r3, r6\n\t"
  62429. #endif
  62430. #ifdef WOLFSSL_KEIL
  62431. "adcs r4, r4, %[r]\n\t"
  62432. #elif defined(__clang__)
  62433. "adcs r4, %[r]\n\t"
  62434. #else
  62435. "adc r4, %[r]\n\t"
  62436. #endif
  62437. "uxth r6, r7\n\t"
  62438. #ifdef WOLFSSL_KEIL
  62439. "muls r5, r6, r5\n\t"
  62440. #elif defined(__clang__)
  62441. "muls r5, r6\n\t"
  62442. #else
  62443. "mul r5, r6\n\t"
  62444. #endif
  62445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62446. "lsrs r6, r5, #16\n\t"
  62447. #else
  62448. "lsr r6, r5, #16\n\t"
  62449. #endif
  62450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62451. "lsls r5, r5, #16\n\t"
  62452. #else
  62453. "lsl r5, r5, #16\n\t"
  62454. #endif
  62455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62456. "adds r2, r2, r5\n\t"
  62457. #else
  62458. "add r2, r2, r5\n\t"
  62459. #endif
  62460. #ifdef WOLFSSL_KEIL
  62461. "adcs r3, r3, r6\n\t"
  62462. #elif defined(__clang__)
  62463. "adcs r3, r6\n\t"
  62464. #else
  62465. "adc r3, r6\n\t"
  62466. #endif
  62467. #ifdef WOLFSSL_KEIL
  62468. "adcs r4, r4, %[r]\n\t"
  62469. #elif defined(__clang__)
  62470. "adcs r4, %[r]\n\t"
  62471. #else
  62472. "adc r4, %[r]\n\t"
  62473. #endif
  62474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62475. "adds r2, r2, r5\n\t"
  62476. #else
  62477. "add r2, r2, r5\n\t"
  62478. #endif
  62479. #ifdef WOLFSSL_KEIL
  62480. "adcs r3, r3, r6\n\t"
  62481. #elif defined(__clang__)
  62482. "adcs r3, r6\n\t"
  62483. #else
  62484. "adc r3, r6\n\t"
  62485. #endif
  62486. #ifdef WOLFSSL_KEIL
  62487. "adcs r4, r4, %[r]\n\t"
  62488. #elif defined(__clang__)
  62489. "adcs r4, %[r]\n\t"
  62490. #else
  62491. "adc r4, %[r]\n\t"
  62492. #endif
  62493. "mov %[r], r8\n\t"
  62494. "str r2, [%[r], #60]\n\t"
  62495. "movs %[r], #0\n\t"
  62496. "# A[11] * A[5]\n\t"
  62497. "movs r2, #0\n\t"
  62498. "mov %[a], r9\n\t"
  62499. "ldr r7, [%[a], #20]\n\t"
  62500. "mov %[a], lr\n\t"
  62501. "uxth r5, %[a]\n\t"
  62502. "uxth r6, r7\n\t"
  62503. #ifdef WOLFSSL_KEIL
  62504. "muls r6, r5, r6\n\t"
  62505. #elif defined(__clang__)
  62506. "muls r6, r5\n\t"
  62507. #else
  62508. "mul r6, r5\n\t"
  62509. #endif
  62510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62511. "adds r3, r3, r6\n\t"
  62512. #else
  62513. "add r3, r3, r6\n\t"
  62514. #endif
  62515. #ifdef WOLFSSL_KEIL
  62516. "adcs r4, r4, %[r]\n\t"
  62517. #elif defined(__clang__)
  62518. "adcs r4, %[r]\n\t"
  62519. #else
  62520. "adc r4, %[r]\n\t"
  62521. #endif
  62522. #ifdef WOLFSSL_KEIL
  62523. "adcs r2, r2, %[r]\n\t"
  62524. #elif defined(__clang__)
  62525. "adcs r2, %[r]\n\t"
  62526. #else
  62527. "adc r2, %[r]\n\t"
  62528. #endif
  62529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62530. "adds r3, r3, r6\n\t"
  62531. #else
  62532. "add r3, r3, r6\n\t"
  62533. #endif
  62534. #ifdef WOLFSSL_KEIL
  62535. "adcs r4, r4, %[r]\n\t"
  62536. #elif defined(__clang__)
  62537. "adcs r4, %[r]\n\t"
  62538. #else
  62539. "adc r4, %[r]\n\t"
  62540. #endif
  62541. #ifdef WOLFSSL_KEIL
  62542. "adcs r2, r2, %[r]\n\t"
  62543. #elif defined(__clang__)
  62544. "adcs r2, %[r]\n\t"
  62545. #else
  62546. "adc r2, %[r]\n\t"
  62547. #endif
  62548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62549. "lsrs r6, r7, #16\n\t"
  62550. #else
  62551. "lsr r6, r7, #16\n\t"
  62552. #endif
  62553. #ifdef WOLFSSL_KEIL
  62554. "muls r5, r6, r5\n\t"
  62555. #elif defined(__clang__)
  62556. "muls r5, r6\n\t"
  62557. #else
  62558. "mul r5, r6\n\t"
  62559. #endif
  62560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62561. "lsrs r6, r5, #16\n\t"
  62562. #else
  62563. "lsr r6, r5, #16\n\t"
  62564. #endif
  62565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62566. "lsls r5, r5, #16\n\t"
  62567. #else
  62568. "lsl r5, r5, #16\n\t"
  62569. #endif
  62570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62571. "adds r3, r3, r5\n\t"
  62572. #else
  62573. "add r3, r3, r5\n\t"
  62574. #endif
  62575. #ifdef WOLFSSL_KEIL
  62576. "adcs r4, r4, r6\n\t"
  62577. #elif defined(__clang__)
  62578. "adcs r4, r6\n\t"
  62579. #else
  62580. "adc r4, r6\n\t"
  62581. #endif
  62582. #ifdef WOLFSSL_KEIL
  62583. "adcs r2, r2, %[r]\n\t"
  62584. #elif defined(__clang__)
  62585. "adcs r2, %[r]\n\t"
  62586. #else
  62587. "adc r2, %[r]\n\t"
  62588. #endif
  62589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62590. "adds r3, r3, r5\n\t"
  62591. #else
  62592. "add r3, r3, r5\n\t"
  62593. #endif
  62594. #ifdef WOLFSSL_KEIL
  62595. "adcs r4, r4, r6\n\t"
  62596. #elif defined(__clang__)
  62597. "adcs r4, r6\n\t"
  62598. #else
  62599. "adc r4, r6\n\t"
  62600. #endif
  62601. #ifdef WOLFSSL_KEIL
  62602. "adcs r2, r2, %[r]\n\t"
  62603. #elif defined(__clang__)
  62604. "adcs r2, %[r]\n\t"
  62605. #else
  62606. "adc r2, %[r]\n\t"
  62607. #endif
  62608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62609. "lsrs r5, %[a], #16\n\t"
  62610. #else
  62611. "lsr r5, %[a], #16\n\t"
  62612. #endif
  62613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62614. "lsrs r6, r7, #16\n\t"
  62615. #else
  62616. "lsr r6, r7, #16\n\t"
  62617. #endif
  62618. #ifdef WOLFSSL_KEIL
  62619. "muls r6, r5, r6\n\t"
  62620. #elif defined(__clang__)
  62621. "muls r6, r5\n\t"
  62622. #else
  62623. "mul r6, r5\n\t"
  62624. #endif
  62625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62626. "adds r4, r4, r6\n\t"
  62627. #else
  62628. "add r4, r4, r6\n\t"
  62629. #endif
  62630. #ifdef WOLFSSL_KEIL
  62631. "adcs r2, r2, %[r]\n\t"
  62632. #elif defined(__clang__)
  62633. "adcs r2, %[r]\n\t"
  62634. #else
  62635. "adc r2, %[r]\n\t"
  62636. #endif
  62637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62638. "adds r4, r4, r6\n\t"
  62639. #else
  62640. "add r4, r4, r6\n\t"
  62641. #endif
  62642. #ifdef WOLFSSL_KEIL
  62643. "adcs r2, r2, %[r]\n\t"
  62644. #elif defined(__clang__)
  62645. "adcs r2, %[r]\n\t"
  62646. #else
  62647. "adc r2, %[r]\n\t"
  62648. #endif
  62649. "uxth r6, r7\n\t"
  62650. #ifdef WOLFSSL_KEIL
  62651. "muls r5, r6, r5\n\t"
  62652. #elif defined(__clang__)
  62653. "muls r5, r6\n\t"
  62654. #else
  62655. "mul r5, r6\n\t"
  62656. #endif
  62657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62658. "lsrs r6, r5, #16\n\t"
  62659. #else
  62660. "lsr r6, r5, #16\n\t"
  62661. #endif
  62662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62663. "lsls r5, r5, #16\n\t"
  62664. #else
  62665. "lsl r5, r5, #16\n\t"
  62666. #endif
  62667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62668. "adds r3, r3, r5\n\t"
  62669. #else
  62670. "add r3, r3, r5\n\t"
  62671. #endif
  62672. #ifdef WOLFSSL_KEIL
  62673. "adcs r4, r4, r6\n\t"
  62674. #elif defined(__clang__)
  62675. "adcs r4, r6\n\t"
  62676. #else
  62677. "adc r4, r6\n\t"
  62678. #endif
  62679. #ifdef WOLFSSL_KEIL
  62680. "adcs r2, r2, %[r]\n\t"
  62681. #elif defined(__clang__)
  62682. "adcs r2, %[r]\n\t"
  62683. #else
  62684. "adc r2, %[r]\n\t"
  62685. #endif
  62686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62687. "adds r3, r3, r5\n\t"
  62688. #else
  62689. "add r3, r3, r5\n\t"
  62690. #endif
  62691. #ifdef WOLFSSL_KEIL
  62692. "adcs r4, r4, r6\n\t"
  62693. #elif defined(__clang__)
  62694. "adcs r4, r6\n\t"
  62695. #else
  62696. "adc r4, r6\n\t"
  62697. #endif
  62698. #ifdef WOLFSSL_KEIL
  62699. "adcs r2, r2, %[r]\n\t"
  62700. #elif defined(__clang__)
  62701. "adcs r2, %[r]\n\t"
  62702. #else
  62703. "adc r2, %[r]\n\t"
  62704. #endif
  62705. "# A[10] * A[6]\n\t"
  62706. "mov %[a], r9\n\t"
  62707. "ldr r7, [%[a], #24]\n\t"
  62708. "mov %[a], r12\n\t"
  62709. "uxth r5, %[a]\n\t"
  62710. "uxth r6, r7\n\t"
  62711. #ifdef WOLFSSL_KEIL
  62712. "muls r6, r5, r6\n\t"
  62713. #elif defined(__clang__)
  62714. "muls r6, r5\n\t"
  62715. #else
  62716. "mul r6, r5\n\t"
  62717. #endif
  62718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62719. "adds r3, r3, r6\n\t"
  62720. #else
  62721. "add r3, r3, r6\n\t"
  62722. #endif
  62723. #ifdef WOLFSSL_KEIL
  62724. "adcs r4, r4, %[r]\n\t"
  62725. #elif defined(__clang__)
  62726. "adcs r4, %[r]\n\t"
  62727. #else
  62728. "adc r4, %[r]\n\t"
  62729. #endif
  62730. #ifdef WOLFSSL_KEIL
  62731. "adcs r2, r2, %[r]\n\t"
  62732. #elif defined(__clang__)
  62733. "adcs r2, %[r]\n\t"
  62734. #else
  62735. "adc r2, %[r]\n\t"
  62736. #endif
  62737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62738. "adds r3, r3, r6\n\t"
  62739. #else
  62740. "add r3, r3, r6\n\t"
  62741. #endif
  62742. #ifdef WOLFSSL_KEIL
  62743. "adcs r4, r4, %[r]\n\t"
  62744. #elif defined(__clang__)
  62745. "adcs r4, %[r]\n\t"
  62746. #else
  62747. "adc r4, %[r]\n\t"
  62748. #endif
  62749. #ifdef WOLFSSL_KEIL
  62750. "adcs r2, r2, %[r]\n\t"
  62751. #elif defined(__clang__)
  62752. "adcs r2, %[r]\n\t"
  62753. #else
  62754. "adc r2, %[r]\n\t"
  62755. #endif
  62756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62757. "lsrs r6, r7, #16\n\t"
  62758. #else
  62759. "lsr r6, r7, #16\n\t"
  62760. #endif
  62761. #ifdef WOLFSSL_KEIL
  62762. "muls r5, r6, r5\n\t"
  62763. #elif defined(__clang__)
  62764. "muls r5, r6\n\t"
  62765. #else
  62766. "mul r5, r6\n\t"
  62767. #endif
  62768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62769. "lsrs r6, r5, #16\n\t"
  62770. #else
  62771. "lsr r6, r5, #16\n\t"
  62772. #endif
  62773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62774. "lsls r5, r5, #16\n\t"
  62775. #else
  62776. "lsl r5, r5, #16\n\t"
  62777. #endif
  62778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62779. "adds r3, r3, r5\n\t"
  62780. #else
  62781. "add r3, r3, r5\n\t"
  62782. #endif
  62783. #ifdef WOLFSSL_KEIL
  62784. "adcs r4, r4, r6\n\t"
  62785. #elif defined(__clang__)
  62786. "adcs r4, r6\n\t"
  62787. #else
  62788. "adc r4, r6\n\t"
  62789. #endif
  62790. #ifdef WOLFSSL_KEIL
  62791. "adcs r2, r2, %[r]\n\t"
  62792. #elif defined(__clang__)
  62793. "adcs r2, %[r]\n\t"
  62794. #else
  62795. "adc r2, %[r]\n\t"
  62796. #endif
  62797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62798. "adds r3, r3, r5\n\t"
  62799. #else
  62800. "add r3, r3, r5\n\t"
  62801. #endif
  62802. #ifdef WOLFSSL_KEIL
  62803. "adcs r4, r4, r6\n\t"
  62804. #elif defined(__clang__)
  62805. "adcs r4, r6\n\t"
  62806. #else
  62807. "adc r4, r6\n\t"
  62808. #endif
  62809. #ifdef WOLFSSL_KEIL
  62810. "adcs r2, r2, %[r]\n\t"
  62811. #elif defined(__clang__)
  62812. "adcs r2, %[r]\n\t"
  62813. #else
  62814. "adc r2, %[r]\n\t"
  62815. #endif
  62816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62817. "lsrs r5, %[a], #16\n\t"
  62818. #else
  62819. "lsr r5, %[a], #16\n\t"
  62820. #endif
  62821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62822. "lsrs r6, r7, #16\n\t"
  62823. #else
  62824. "lsr r6, r7, #16\n\t"
  62825. #endif
  62826. #ifdef WOLFSSL_KEIL
  62827. "muls r6, r5, r6\n\t"
  62828. #elif defined(__clang__)
  62829. "muls r6, r5\n\t"
  62830. #else
  62831. "mul r6, r5\n\t"
  62832. #endif
  62833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62834. "adds r4, r4, r6\n\t"
  62835. #else
  62836. "add r4, r4, r6\n\t"
  62837. #endif
  62838. #ifdef WOLFSSL_KEIL
  62839. "adcs r2, r2, %[r]\n\t"
  62840. #elif defined(__clang__)
  62841. "adcs r2, %[r]\n\t"
  62842. #else
  62843. "adc r2, %[r]\n\t"
  62844. #endif
  62845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62846. "adds r4, r4, r6\n\t"
  62847. #else
  62848. "add r4, r4, r6\n\t"
  62849. #endif
  62850. #ifdef WOLFSSL_KEIL
  62851. "adcs r2, r2, %[r]\n\t"
  62852. #elif defined(__clang__)
  62853. "adcs r2, %[r]\n\t"
  62854. #else
  62855. "adc r2, %[r]\n\t"
  62856. #endif
  62857. "uxth r6, r7\n\t"
  62858. #ifdef WOLFSSL_KEIL
  62859. "muls r5, r6, r5\n\t"
  62860. #elif defined(__clang__)
  62861. "muls r5, r6\n\t"
  62862. #else
  62863. "mul r5, r6\n\t"
  62864. #endif
  62865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62866. "lsrs r6, r5, #16\n\t"
  62867. #else
  62868. "lsr r6, r5, #16\n\t"
  62869. #endif
  62870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62871. "lsls r5, r5, #16\n\t"
  62872. #else
  62873. "lsl r5, r5, #16\n\t"
  62874. #endif
  62875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62876. "adds r3, r3, r5\n\t"
  62877. #else
  62878. "add r3, r3, r5\n\t"
  62879. #endif
  62880. #ifdef WOLFSSL_KEIL
  62881. "adcs r4, r4, r6\n\t"
  62882. #elif defined(__clang__)
  62883. "adcs r4, r6\n\t"
  62884. #else
  62885. "adc r4, r6\n\t"
  62886. #endif
  62887. #ifdef WOLFSSL_KEIL
  62888. "adcs r2, r2, %[r]\n\t"
  62889. #elif defined(__clang__)
  62890. "adcs r2, %[r]\n\t"
  62891. #else
  62892. "adc r2, %[r]\n\t"
  62893. #endif
  62894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62895. "adds r3, r3, r5\n\t"
  62896. #else
  62897. "add r3, r3, r5\n\t"
  62898. #endif
  62899. #ifdef WOLFSSL_KEIL
  62900. "adcs r4, r4, r6\n\t"
  62901. #elif defined(__clang__)
  62902. "adcs r4, r6\n\t"
  62903. #else
  62904. "adc r4, r6\n\t"
  62905. #endif
  62906. #ifdef WOLFSSL_KEIL
  62907. "adcs r2, r2, %[r]\n\t"
  62908. #elif defined(__clang__)
  62909. "adcs r2, %[r]\n\t"
  62910. #else
  62911. "adc r2, %[r]\n\t"
  62912. #endif
  62913. "# A[9] * A[7]\n\t"
  62914. "mov %[a], r9\n\t"
  62915. "ldr r7, [%[a], #28]\n\t"
  62916. "mov %[a], r11\n\t"
  62917. "uxth r5, %[a]\n\t"
  62918. "uxth r6, r7\n\t"
  62919. #ifdef WOLFSSL_KEIL
  62920. "muls r6, r5, r6\n\t"
  62921. #elif defined(__clang__)
  62922. "muls r6, r5\n\t"
  62923. #else
  62924. "mul r6, r5\n\t"
  62925. #endif
  62926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62927. "adds r3, r3, r6\n\t"
  62928. #else
  62929. "add r3, r3, r6\n\t"
  62930. #endif
  62931. #ifdef WOLFSSL_KEIL
  62932. "adcs r4, r4, %[r]\n\t"
  62933. #elif defined(__clang__)
  62934. "adcs r4, %[r]\n\t"
  62935. #else
  62936. "adc r4, %[r]\n\t"
  62937. #endif
  62938. #ifdef WOLFSSL_KEIL
  62939. "adcs r2, r2, %[r]\n\t"
  62940. #elif defined(__clang__)
  62941. "adcs r2, %[r]\n\t"
  62942. #else
  62943. "adc r2, %[r]\n\t"
  62944. #endif
  62945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62946. "adds r3, r3, r6\n\t"
  62947. #else
  62948. "add r3, r3, r6\n\t"
  62949. #endif
  62950. #ifdef WOLFSSL_KEIL
  62951. "adcs r4, r4, %[r]\n\t"
  62952. #elif defined(__clang__)
  62953. "adcs r4, %[r]\n\t"
  62954. #else
  62955. "adc r4, %[r]\n\t"
  62956. #endif
  62957. #ifdef WOLFSSL_KEIL
  62958. "adcs r2, r2, %[r]\n\t"
  62959. #elif defined(__clang__)
  62960. "adcs r2, %[r]\n\t"
  62961. #else
  62962. "adc r2, %[r]\n\t"
  62963. #endif
  62964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62965. "lsrs r6, r7, #16\n\t"
  62966. #else
  62967. "lsr r6, r7, #16\n\t"
  62968. #endif
  62969. #ifdef WOLFSSL_KEIL
  62970. "muls r5, r6, r5\n\t"
  62971. #elif defined(__clang__)
  62972. "muls r5, r6\n\t"
  62973. #else
  62974. "mul r5, r6\n\t"
  62975. #endif
  62976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62977. "lsrs r6, r5, #16\n\t"
  62978. #else
  62979. "lsr r6, r5, #16\n\t"
  62980. #endif
  62981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62982. "lsls r5, r5, #16\n\t"
  62983. #else
  62984. "lsl r5, r5, #16\n\t"
  62985. #endif
  62986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62987. "adds r3, r3, r5\n\t"
  62988. #else
  62989. "add r3, r3, r5\n\t"
  62990. #endif
  62991. #ifdef WOLFSSL_KEIL
  62992. "adcs r4, r4, r6\n\t"
  62993. #elif defined(__clang__)
  62994. "adcs r4, r6\n\t"
  62995. #else
  62996. "adc r4, r6\n\t"
  62997. #endif
  62998. #ifdef WOLFSSL_KEIL
  62999. "adcs r2, r2, %[r]\n\t"
  63000. #elif defined(__clang__)
  63001. "adcs r2, %[r]\n\t"
  63002. #else
  63003. "adc r2, %[r]\n\t"
  63004. #endif
  63005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63006. "adds r3, r3, r5\n\t"
  63007. #else
  63008. "add r3, r3, r5\n\t"
  63009. #endif
  63010. #ifdef WOLFSSL_KEIL
  63011. "adcs r4, r4, r6\n\t"
  63012. #elif defined(__clang__)
  63013. "adcs r4, r6\n\t"
  63014. #else
  63015. "adc r4, r6\n\t"
  63016. #endif
  63017. #ifdef WOLFSSL_KEIL
  63018. "adcs r2, r2, %[r]\n\t"
  63019. #elif defined(__clang__)
  63020. "adcs r2, %[r]\n\t"
  63021. #else
  63022. "adc r2, %[r]\n\t"
  63023. #endif
  63024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63025. "lsrs r5, %[a], #16\n\t"
  63026. #else
  63027. "lsr r5, %[a], #16\n\t"
  63028. #endif
  63029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63030. "lsrs r6, r7, #16\n\t"
  63031. #else
  63032. "lsr r6, r7, #16\n\t"
  63033. #endif
  63034. #ifdef WOLFSSL_KEIL
  63035. "muls r6, r5, r6\n\t"
  63036. #elif defined(__clang__)
  63037. "muls r6, r5\n\t"
  63038. #else
  63039. "mul r6, r5\n\t"
  63040. #endif
  63041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63042. "adds r4, r4, r6\n\t"
  63043. #else
  63044. "add r4, r4, r6\n\t"
  63045. #endif
  63046. #ifdef WOLFSSL_KEIL
  63047. "adcs r2, r2, %[r]\n\t"
  63048. #elif defined(__clang__)
  63049. "adcs r2, %[r]\n\t"
  63050. #else
  63051. "adc r2, %[r]\n\t"
  63052. #endif
  63053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63054. "adds r4, r4, r6\n\t"
  63055. #else
  63056. "add r4, r4, r6\n\t"
  63057. #endif
  63058. #ifdef WOLFSSL_KEIL
  63059. "adcs r2, r2, %[r]\n\t"
  63060. #elif defined(__clang__)
  63061. "adcs r2, %[r]\n\t"
  63062. #else
  63063. "adc r2, %[r]\n\t"
  63064. #endif
  63065. "uxth r6, r7\n\t"
  63066. #ifdef WOLFSSL_KEIL
  63067. "muls r5, r6, r5\n\t"
  63068. #elif defined(__clang__)
  63069. "muls r5, r6\n\t"
  63070. #else
  63071. "mul r5, r6\n\t"
  63072. #endif
  63073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63074. "lsrs r6, r5, #16\n\t"
  63075. #else
  63076. "lsr r6, r5, #16\n\t"
  63077. #endif
  63078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63079. "lsls r5, r5, #16\n\t"
  63080. #else
  63081. "lsl r5, r5, #16\n\t"
  63082. #endif
  63083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63084. "adds r3, r3, r5\n\t"
  63085. #else
  63086. "add r3, r3, r5\n\t"
  63087. #endif
  63088. #ifdef WOLFSSL_KEIL
  63089. "adcs r4, r4, r6\n\t"
  63090. #elif defined(__clang__)
  63091. "adcs r4, r6\n\t"
  63092. #else
  63093. "adc r4, r6\n\t"
  63094. #endif
  63095. #ifdef WOLFSSL_KEIL
  63096. "adcs r2, r2, %[r]\n\t"
  63097. #elif defined(__clang__)
  63098. "adcs r2, %[r]\n\t"
  63099. #else
  63100. "adc r2, %[r]\n\t"
  63101. #endif
  63102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63103. "adds r3, r3, r5\n\t"
  63104. #else
  63105. "add r3, r3, r5\n\t"
  63106. #endif
  63107. #ifdef WOLFSSL_KEIL
  63108. "adcs r4, r4, r6\n\t"
  63109. #elif defined(__clang__)
  63110. "adcs r4, r6\n\t"
  63111. #else
  63112. "adc r4, r6\n\t"
  63113. #endif
  63114. #ifdef WOLFSSL_KEIL
  63115. "adcs r2, r2, %[r]\n\t"
  63116. #elif defined(__clang__)
  63117. "adcs r2, %[r]\n\t"
  63118. #else
  63119. "adc r2, %[r]\n\t"
  63120. #endif
  63121. "# A[8] * A[8]\n\t"
  63122. "mov r7, r10\n\t"
  63123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63124. "lsrs r6, r7, #16\n\t"
  63125. #else
  63126. "lsr r6, r7, #16\n\t"
  63127. #endif
  63128. "uxth r5, r7\n\t"
  63129. #ifdef WOLFSSL_KEIL
  63130. "muls r5, r5, r5\n\t"
  63131. #elif defined(__clang__)
  63132. "muls r5, r5\n\t"
  63133. #else
  63134. "mul r5, r5\n\t"
  63135. #endif
  63136. #ifdef WOLFSSL_KEIL
  63137. "muls r6, r6, r6\n\t"
  63138. #elif defined(__clang__)
  63139. "muls r6, r6\n\t"
  63140. #else
  63141. "mul r6, r6\n\t"
  63142. #endif
  63143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63144. "adds r3, r3, r5\n\t"
  63145. #else
  63146. "add r3, r3, r5\n\t"
  63147. #endif
  63148. #ifdef WOLFSSL_KEIL
  63149. "adcs r4, r4, r6\n\t"
  63150. #elif defined(__clang__)
  63151. "adcs r4, r6\n\t"
  63152. #else
  63153. "adc r4, r6\n\t"
  63154. #endif
  63155. #ifdef WOLFSSL_KEIL
  63156. "adcs r2, r2, %[r]\n\t"
  63157. #elif defined(__clang__)
  63158. "adcs r2, %[r]\n\t"
  63159. #else
  63160. "adc r2, %[r]\n\t"
  63161. #endif
  63162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63163. "lsrs r6, r7, #16\n\t"
  63164. #else
  63165. "lsr r6, r7, #16\n\t"
  63166. #endif
  63167. "uxth r5, r7\n\t"
  63168. #ifdef WOLFSSL_KEIL
  63169. "muls r5, r6, r5\n\t"
  63170. #elif defined(__clang__)
  63171. "muls r5, r6\n\t"
  63172. #else
  63173. "mul r5, r6\n\t"
  63174. #endif
  63175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63176. "lsrs r6, r5, #15\n\t"
  63177. #else
  63178. "lsr r6, r5, #15\n\t"
  63179. #endif
  63180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63181. "lsls r5, r5, #17\n\t"
  63182. #else
  63183. "lsl r5, r5, #17\n\t"
  63184. #endif
  63185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63186. "adds r3, r3, r5\n\t"
  63187. #else
  63188. "add r3, r3, r5\n\t"
  63189. #endif
  63190. #ifdef WOLFSSL_KEIL
  63191. "adcs r4, r4, r6\n\t"
  63192. #elif defined(__clang__)
  63193. "adcs r4, r6\n\t"
  63194. #else
  63195. "adc r4, r6\n\t"
  63196. #endif
  63197. #ifdef WOLFSSL_KEIL
  63198. "adcs r2, r2, %[r]\n\t"
  63199. #elif defined(__clang__)
  63200. "adcs r2, %[r]\n\t"
  63201. #else
  63202. "adc r2, %[r]\n\t"
  63203. #endif
  63204. "mov %[r], r8\n\t"
  63205. "str r3, [%[r], #64]\n\t"
  63206. "movs %[r], #0\n\t"
  63207. "# A[9] * A[8]\n\t"
  63208. "movs r3, #0\n\t"
  63209. "mov %[a], r9\n\t"
  63210. "mov %[a], r11\n\t"
  63211. "uxth r5, %[a]\n\t"
  63212. "uxth r6, r7\n\t"
  63213. #ifdef WOLFSSL_KEIL
  63214. "muls r6, r5, r6\n\t"
  63215. #elif defined(__clang__)
  63216. "muls r6, r5\n\t"
  63217. #else
  63218. "mul r6, r5\n\t"
  63219. #endif
  63220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63221. "adds r4, r4, r6\n\t"
  63222. #else
  63223. "add r4, r4, r6\n\t"
  63224. #endif
  63225. #ifdef WOLFSSL_KEIL
  63226. "adcs r2, r2, %[r]\n\t"
  63227. #elif defined(__clang__)
  63228. "adcs r2, %[r]\n\t"
  63229. #else
  63230. "adc r2, %[r]\n\t"
  63231. #endif
  63232. #ifdef WOLFSSL_KEIL
  63233. "adcs r3, r3, %[r]\n\t"
  63234. #elif defined(__clang__)
  63235. "adcs r3, %[r]\n\t"
  63236. #else
  63237. "adc r3, %[r]\n\t"
  63238. #endif
  63239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63240. "adds r4, r4, r6\n\t"
  63241. #else
  63242. "add r4, r4, r6\n\t"
  63243. #endif
  63244. #ifdef WOLFSSL_KEIL
  63245. "adcs r2, r2, %[r]\n\t"
  63246. #elif defined(__clang__)
  63247. "adcs r2, %[r]\n\t"
  63248. #else
  63249. "adc r2, %[r]\n\t"
  63250. #endif
  63251. #ifdef WOLFSSL_KEIL
  63252. "adcs r3, r3, %[r]\n\t"
  63253. #elif defined(__clang__)
  63254. "adcs r3, %[r]\n\t"
  63255. #else
  63256. "adc r3, %[r]\n\t"
  63257. #endif
  63258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63259. "lsrs r6, r7, #16\n\t"
  63260. #else
  63261. "lsr r6, r7, #16\n\t"
  63262. #endif
  63263. #ifdef WOLFSSL_KEIL
  63264. "muls r5, r6, r5\n\t"
  63265. #elif defined(__clang__)
  63266. "muls r5, r6\n\t"
  63267. #else
  63268. "mul r5, r6\n\t"
  63269. #endif
  63270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63271. "lsrs r6, r5, #16\n\t"
  63272. #else
  63273. "lsr r6, r5, #16\n\t"
  63274. #endif
  63275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63276. "lsls r5, r5, #16\n\t"
  63277. #else
  63278. "lsl r5, r5, #16\n\t"
  63279. #endif
  63280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63281. "adds r4, r4, r5\n\t"
  63282. #else
  63283. "add r4, r4, r5\n\t"
  63284. #endif
  63285. #ifdef WOLFSSL_KEIL
  63286. "adcs r2, r2, r6\n\t"
  63287. #elif defined(__clang__)
  63288. "adcs r2, r6\n\t"
  63289. #else
  63290. "adc r2, r6\n\t"
  63291. #endif
  63292. #ifdef WOLFSSL_KEIL
  63293. "adcs r3, r3, %[r]\n\t"
  63294. #elif defined(__clang__)
  63295. "adcs r3, %[r]\n\t"
  63296. #else
  63297. "adc r3, %[r]\n\t"
  63298. #endif
  63299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63300. "adds r4, r4, r5\n\t"
  63301. #else
  63302. "add r4, r4, r5\n\t"
  63303. #endif
  63304. #ifdef WOLFSSL_KEIL
  63305. "adcs r2, r2, r6\n\t"
  63306. #elif defined(__clang__)
  63307. "adcs r2, r6\n\t"
  63308. #else
  63309. "adc r2, r6\n\t"
  63310. #endif
  63311. #ifdef WOLFSSL_KEIL
  63312. "adcs r3, r3, %[r]\n\t"
  63313. #elif defined(__clang__)
  63314. "adcs r3, %[r]\n\t"
  63315. #else
  63316. "adc r3, %[r]\n\t"
  63317. #endif
  63318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63319. "lsrs r5, %[a], #16\n\t"
  63320. #else
  63321. "lsr r5, %[a], #16\n\t"
  63322. #endif
  63323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63324. "lsrs r6, r7, #16\n\t"
  63325. #else
  63326. "lsr r6, r7, #16\n\t"
  63327. #endif
  63328. #ifdef WOLFSSL_KEIL
  63329. "muls r6, r5, r6\n\t"
  63330. #elif defined(__clang__)
  63331. "muls r6, r5\n\t"
  63332. #else
  63333. "mul r6, r5\n\t"
  63334. #endif
  63335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63336. "adds r2, r2, r6\n\t"
  63337. #else
  63338. "add r2, r2, r6\n\t"
  63339. #endif
  63340. #ifdef WOLFSSL_KEIL
  63341. "adcs r3, r3, %[r]\n\t"
  63342. #elif defined(__clang__)
  63343. "adcs r3, %[r]\n\t"
  63344. #else
  63345. "adc r3, %[r]\n\t"
  63346. #endif
  63347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63348. "adds r2, r2, r6\n\t"
  63349. #else
  63350. "add r2, r2, r6\n\t"
  63351. #endif
  63352. #ifdef WOLFSSL_KEIL
  63353. "adcs r3, r3, %[r]\n\t"
  63354. #elif defined(__clang__)
  63355. "adcs r3, %[r]\n\t"
  63356. #else
  63357. "adc r3, %[r]\n\t"
  63358. #endif
  63359. "uxth r6, r7\n\t"
  63360. #ifdef WOLFSSL_KEIL
  63361. "muls r5, r6, r5\n\t"
  63362. #elif defined(__clang__)
  63363. "muls r5, r6\n\t"
  63364. #else
  63365. "mul r5, r6\n\t"
  63366. #endif
  63367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63368. "lsrs r6, r5, #16\n\t"
  63369. #else
  63370. "lsr r6, r5, #16\n\t"
  63371. #endif
  63372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63373. "lsls r5, r5, #16\n\t"
  63374. #else
  63375. "lsl r5, r5, #16\n\t"
  63376. #endif
  63377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63378. "adds r4, r4, r5\n\t"
  63379. #else
  63380. "add r4, r4, r5\n\t"
  63381. #endif
  63382. #ifdef WOLFSSL_KEIL
  63383. "adcs r2, r2, r6\n\t"
  63384. #elif defined(__clang__)
  63385. "adcs r2, r6\n\t"
  63386. #else
  63387. "adc r2, r6\n\t"
  63388. #endif
  63389. #ifdef WOLFSSL_KEIL
  63390. "adcs r3, r3, %[r]\n\t"
  63391. #elif defined(__clang__)
  63392. "adcs r3, %[r]\n\t"
  63393. #else
  63394. "adc r3, %[r]\n\t"
  63395. #endif
  63396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63397. "adds r4, r4, r5\n\t"
  63398. #else
  63399. "add r4, r4, r5\n\t"
  63400. #endif
  63401. #ifdef WOLFSSL_KEIL
  63402. "adcs r2, r2, r6\n\t"
  63403. #elif defined(__clang__)
  63404. "adcs r2, r6\n\t"
  63405. #else
  63406. "adc r2, r6\n\t"
  63407. #endif
  63408. #ifdef WOLFSSL_KEIL
  63409. "adcs r3, r3, %[r]\n\t"
  63410. #elif defined(__clang__)
  63411. "adcs r3, %[r]\n\t"
  63412. #else
  63413. "adc r3, %[r]\n\t"
  63414. #endif
  63415. "# A[10] * A[7]\n\t"
  63416. "mov %[a], r9\n\t"
  63417. "ldr r7, [%[a], #28]\n\t"
  63418. "mov %[a], r12\n\t"
  63419. "uxth r5, %[a]\n\t"
  63420. "uxth r6, r7\n\t"
  63421. #ifdef WOLFSSL_KEIL
  63422. "muls r6, r5, r6\n\t"
  63423. #elif defined(__clang__)
  63424. "muls r6, r5\n\t"
  63425. #else
  63426. "mul r6, r5\n\t"
  63427. #endif
  63428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63429. "adds r4, r4, r6\n\t"
  63430. #else
  63431. "add r4, r4, r6\n\t"
  63432. #endif
  63433. #ifdef WOLFSSL_KEIL
  63434. "adcs r2, r2, %[r]\n\t"
  63435. #elif defined(__clang__)
  63436. "adcs r2, %[r]\n\t"
  63437. #else
  63438. "adc r2, %[r]\n\t"
  63439. #endif
  63440. #ifdef WOLFSSL_KEIL
  63441. "adcs r3, r3, %[r]\n\t"
  63442. #elif defined(__clang__)
  63443. "adcs r3, %[r]\n\t"
  63444. #else
  63445. "adc r3, %[r]\n\t"
  63446. #endif
  63447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63448. "adds r4, r4, r6\n\t"
  63449. #else
  63450. "add r4, r4, r6\n\t"
  63451. #endif
  63452. #ifdef WOLFSSL_KEIL
  63453. "adcs r2, r2, %[r]\n\t"
  63454. #elif defined(__clang__)
  63455. "adcs r2, %[r]\n\t"
  63456. #else
  63457. "adc r2, %[r]\n\t"
  63458. #endif
  63459. #ifdef WOLFSSL_KEIL
  63460. "adcs r3, r3, %[r]\n\t"
  63461. #elif defined(__clang__)
  63462. "adcs r3, %[r]\n\t"
  63463. #else
  63464. "adc r3, %[r]\n\t"
  63465. #endif
  63466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63467. "lsrs r6, r7, #16\n\t"
  63468. #else
  63469. "lsr r6, r7, #16\n\t"
  63470. #endif
  63471. #ifdef WOLFSSL_KEIL
  63472. "muls r5, r6, r5\n\t"
  63473. #elif defined(__clang__)
  63474. "muls r5, r6\n\t"
  63475. #else
  63476. "mul r5, r6\n\t"
  63477. #endif
  63478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63479. "lsrs r6, r5, #16\n\t"
  63480. #else
  63481. "lsr r6, r5, #16\n\t"
  63482. #endif
  63483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63484. "lsls r5, r5, #16\n\t"
  63485. #else
  63486. "lsl r5, r5, #16\n\t"
  63487. #endif
  63488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63489. "adds r4, r4, r5\n\t"
  63490. #else
  63491. "add r4, r4, r5\n\t"
  63492. #endif
  63493. #ifdef WOLFSSL_KEIL
  63494. "adcs r2, r2, r6\n\t"
  63495. #elif defined(__clang__)
  63496. "adcs r2, r6\n\t"
  63497. #else
  63498. "adc r2, r6\n\t"
  63499. #endif
  63500. #ifdef WOLFSSL_KEIL
  63501. "adcs r3, r3, %[r]\n\t"
  63502. #elif defined(__clang__)
  63503. "adcs r3, %[r]\n\t"
  63504. #else
  63505. "adc r3, %[r]\n\t"
  63506. #endif
  63507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63508. "adds r4, r4, r5\n\t"
  63509. #else
  63510. "add r4, r4, r5\n\t"
  63511. #endif
  63512. #ifdef WOLFSSL_KEIL
  63513. "adcs r2, r2, r6\n\t"
  63514. #elif defined(__clang__)
  63515. "adcs r2, r6\n\t"
  63516. #else
  63517. "adc r2, r6\n\t"
  63518. #endif
  63519. #ifdef WOLFSSL_KEIL
  63520. "adcs r3, r3, %[r]\n\t"
  63521. #elif defined(__clang__)
  63522. "adcs r3, %[r]\n\t"
  63523. #else
  63524. "adc r3, %[r]\n\t"
  63525. #endif
  63526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63527. "lsrs r5, %[a], #16\n\t"
  63528. #else
  63529. "lsr r5, %[a], #16\n\t"
  63530. #endif
  63531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63532. "lsrs r6, r7, #16\n\t"
  63533. #else
  63534. "lsr r6, r7, #16\n\t"
  63535. #endif
  63536. #ifdef WOLFSSL_KEIL
  63537. "muls r6, r5, r6\n\t"
  63538. #elif defined(__clang__)
  63539. "muls r6, r5\n\t"
  63540. #else
  63541. "mul r6, r5\n\t"
  63542. #endif
  63543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63544. "adds r2, r2, r6\n\t"
  63545. #else
  63546. "add r2, r2, r6\n\t"
  63547. #endif
  63548. #ifdef WOLFSSL_KEIL
  63549. "adcs r3, r3, %[r]\n\t"
  63550. #elif defined(__clang__)
  63551. "adcs r3, %[r]\n\t"
  63552. #else
  63553. "adc r3, %[r]\n\t"
  63554. #endif
  63555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63556. "adds r2, r2, r6\n\t"
  63557. #else
  63558. "add r2, r2, r6\n\t"
  63559. #endif
  63560. #ifdef WOLFSSL_KEIL
  63561. "adcs r3, r3, %[r]\n\t"
  63562. #elif defined(__clang__)
  63563. "adcs r3, %[r]\n\t"
  63564. #else
  63565. "adc r3, %[r]\n\t"
  63566. #endif
  63567. "uxth r6, r7\n\t"
  63568. #ifdef WOLFSSL_KEIL
  63569. "muls r5, r6, r5\n\t"
  63570. #elif defined(__clang__)
  63571. "muls r5, r6\n\t"
  63572. #else
  63573. "mul r5, r6\n\t"
  63574. #endif
  63575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63576. "lsrs r6, r5, #16\n\t"
  63577. #else
  63578. "lsr r6, r5, #16\n\t"
  63579. #endif
  63580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63581. "lsls r5, r5, #16\n\t"
  63582. #else
  63583. "lsl r5, r5, #16\n\t"
  63584. #endif
  63585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63586. "adds r4, r4, r5\n\t"
  63587. #else
  63588. "add r4, r4, r5\n\t"
  63589. #endif
  63590. #ifdef WOLFSSL_KEIL
  63591. "adcs r2, r2, r6\n\t"
  63592. #elif defined(__clang__)
  63593. "adcs r2, r6\n\t"
  63594. #else
  63595. "adc r2, r6\n\t"
  63596. #endif
  63597. #ifdef WOLFSSL_KEIL
  63598. "adcs r3, r3, %[r]\n\t"
  63599. #elif defined(__clang__)
  63600. "adcs r3, %[r]\n\t"
  63601. #else
  63602. "adc r3, %[r]\n\t"
  63603. #endif
  63604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63605. "adds r4, r4, r5\n\t"
  63606. #else
  63607. "add r4, r4, r5\n\t"
  63608. #endif
  63609. #ifdef WOLFSSL_KEIL
  63610. "adcs r2, r2, r6\n\t"
  63611. #elif defined(__clang__)
  63612. "adcs r2, r6\n\t"
  63613. #else
  63614. "adc r2, r6\n\t"
  63615. #endif
  63616. #ifdef WOLFSSL_KEIL
  63617. "adcs r3, r3, %[r]\n\t"
  63618. #elif defined(__clang__)
  63619. "adcs r3, %[r]\n\t"
  63620. #else
  63621. "adc r3, %[r]\n\t"
  63622. #endif
  63623. "# A[11] * A[6]\n\t"
  63624. "mov %[a], r9\n\t"
  63625. "ldr r7, [%[a], #24]\n\t"
  63626. "mov %[a], lr\n\t"
  63627. "uxth r5, %[a]\n\t"
  63628. "uxth r6, r7\n\t"
  63629. #ifdef WOLFSSL_KEIL
  63630. "muls r6, r5, r6\n\t"
  63631. #elif defined(__clang__)
  63632. "muls r6, r5\n\t"
  63633. #else
  63634. "mul r6, r5\n\t"
  63635. #endif
  63636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63637. "adds r4, r4, r6\n\t"
  63638. #else
  63639. "add r4, r4, r6\n\t"
  63640. #endif
  63641. #ifdef WOLFSSL_KEIL
  63642. "adcs r2, r2, %[r]\n\t"
  63643. #elif defined(__clang__)
  63644. "adcs r2, %[r]\n\t"
  63645. #else
  63646. "adc r2, %[r]\n\t"
  63647. #endif
  63648. #ifdef WOLFSSL_KEIL
  63649. "adcs r3, r3, %[r]\n\t"
  63650. #elif defined(__clang__)
  63651. "adcs r3, %[r]\n\t"
  63652. #else
  63653. "adc r3, %[r]\n\t"
  63654. #endif
  63655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63656. "adds r4, r4, r6\n\t"
  63657. #else
  63658. "add r4, r4, r6\n\t"
  63659. #endif
  63660. #ifdef WOLFSSL_KEIL
  63661. "adcs r2, r2, %[r]\n\t"
  63662. #elif defined(__clang__)
  63663. "adcs r2, %[r]\n\t"
  63664. #else
  63665. "adc r2, %[r]\n\t"
  63666. #endif
  63667. #ifdef WOLFSSL_KEIL
  63668. "adcs r3, r3, %[r]\n\t"
  63669. #elif defined(__clang__)
  63670. "adcs r3, %[r]\n\t"
  63671. #else
  63672. "adc r3, %[r]\n\t"
  63673. #endif
  63674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63675. "lsrs r6, r7, #16\n\t"
  63676. #else
  63677. "lsr r6, r7, #16\n\t"
  63678. #endif
  63679. #ifdef WOLFSSL_KEIL
  63680. "muls r5, r6, r5\n\t"
  63681. #elif defined(__clang__)
  63682. "muls r5, r6\n\t"
  63683. #else
  63684. "mul r5, r6\n\t"
  63685. #endif
  63686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63687. "lsrs r6, r5, #16\n\t"
  63688. #else
  63689. "lsr r6, r5, #16\n\t"
  63690. #endif
  63691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63692. "lsls r5, r5, #16\n\t"
  63693. #else
  63694. "lsl r5, r5, #16\n\t"
  63695. #endif
  63696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63697. "adds r4, r4, r5\n\t"
  63698. #else
  63699. "add r4, r4, r5\n\t"
  63700. #endif
  63701. #ifdef WOLFSSL_KEIL
  63702. "adcs r2, r2, r6\n\t"
  63703. #elif defined(__clang__)
  63704. "adcs r2, r6\n\t"
  63705. #else
  63706. "adc r2, r6\n\t"
  63707. #endif
  63708. #ifdef WOLFSSL_KEIL
  63709. "adcs r3, r3, %[r]\n\t"
  63710. #elif defined(__clang__)
  63711. "adcs r3, %[r]\n\t"
  63712. #else
  63713. "adc r3, %[r]\n\t"
  63714. #endif
  63715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63716. "adds r4, r4, r5\n\t"
  63717. #else
  63718. "add r4, r4, r5\n\t"
  63719. #endif
  63720. #ifdef WOLFSSL_KEIL
  63721. "adcs r2, r2, r6\n\t"
  63722. #elif defined(__clang__)
  63723. "adcs r2, r6\n\t"
  63724. #else
  63725. "adc r2, r6\n\t"
  63726. #endif
  63727. #ifdef WOLFSSL_KEIL
  63728. "adcs r3, r3, %[r]\n\t"
  63729. #elif defined(__clang__)
  63730. "adcs r3, %[r]\n\t"
  63731. #else
  63732. "adc r3, %[r]\n\t"
  63733. #endif
  63734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63735. "lsrs r5, %[a], #16\n\t"
  63736. #else
  63737. "lsr r5, %[a], #16\n\t"
  63738. #endif
  63739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63740. "lsrs r6, r7, #16\n\t"
  63741. #else
  63742. "lsr r6, r7, #16\n\t"
  63743. #endif
  63744. #ifdef WOLFSSL_KEIL
  63745. "muls r6, r5, r6\n\t"
  63746. #elif defined(__clang__)
  63747. "muls r6, r5\n\t"
  63748. #else
  63749. "mul r6, r5\n\t"
  63750. #endif
  63751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63752. "adds r2, r2, r6\n\t"
  63753. #else
  63754. "add r2, r2, r6\n\t"
  63755. #endif
  63756. #ifdef WOLFSSL_KEIL
  63757. "adcs r3, r3, %[r]\n\t"
  63758. #elif defined(__clang__)
  63759. "adcs r3, %[r]\n\t"
  63760. #else
  63761. "adc r3, %[r]\n\t"
  63762. #endif
  63763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63764. "adds r2, r2, r6\n\t"
  63765. #else
  63766. "add r2, r2, r6\n\t"
  63767. #endif
  63768. #ifdef WOLFSSL_KEIL
  63769. "adcs r3, r3, %[r]\n\t"
  63770. #elif defined(__clang__)
  63771. "adcs r3, %[r]\n\t"
  63772. #else
  63773. "adc r3, %[r]\n\t"
  63774. #endif
  63775. "uxth r6, r7\n\t"
  63776. #ifdef WOLFSSL_KEIL
  63777. "muls r5, r6, r5\n\t"
  63778. #elif defined(__clang__)
  63779. "muls r5, r6\n\t"
  63780. #else
  63781. "mul r5, r6\n\t"
  63782. #endif
  63783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63784. "lsrs r6, r5, #16\n\t"
  63785. #else
  63786. "lsr r6, r5, #16\n\t"
  63787. #endif
  63788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63789. "lsls r5, r5, #16\n\t"
  63790. #else
  63791. "lsl r5, r5, #16\n\t"
  63792. #endif
  63793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63794. "adds r4, r4, r5\n\t"
  63795. #else
  63796. "add r4, r4, r5\n\t"
  63797. #endif
  63798. #ifdef WOLFSSL_KEIL
  63799. "adcs r2, r2, r6\n\t"
  63800. #elif defined(__clang__)
  63801. "adcs r2, r6\n\t"
  63802. #else
  63803. "adc r2, r6\n\t"
  63804. #endif
  63805. #ifdef WOLFSSL_KEIL
  63806. "adcs r3, r3, %[r]\n\t"
  63807. #elif defined(__clang__)
  63808. "adcs r3, %[r]\n\t"
  63809. #else
  63810. "adc r3, %[r]\n\t"
  63811. #endif
  63812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63813. "adds r4, r4, r5\n\t"
  63814. #else
  63815. "add r4, r4, r5\n\t"
  63816. #endif
  63817. #ifdef WOLFSSL_KEIL
  63818. "adcs r2, r2, r6\n\t"
  63819. #elif defined(__clang__)
  63820. "adcs r2, r6\n\t"
  63821. #else
  63822. "adc r2, r6\n\t"
  63823. #endif
  63824. #ifdef WOLFSSL_KEIL
  63825. "adcs r3, r3, %[r]\n\t"
  63826. #elif defined(__clang__)
  63827. "adcs r3, %[r]\n\t"
  63828. #else
  63829. "adc r3, %[r]\n\t"
  63830. #endif
  63831. "mov %[r], r8\n\t"
  63832. "str r4, [%[r], #68]\n\t"
  63833. "movs %[r], #0\n\t"
  63834. "# A[11] * A[7]\n\t"
  63835. "movs r4, #0\n\t"
  63836. "mov %[a], r9\n\t"
  63837. "ldr r7, [%[a], #28]\n\t"
  63838. "mov %[a], lr\n\t"
  63839. "uxth r5, %[a]\n\t"
  63840. "uxth r6, r7\n\t"
  63841. #ifdef WOLFSSL_KEIL
  63842. "muls r6, r5, r6\n\t"
  63843. #elif defined(__clang__)
  63844. "muls r6, r5\n\t"
  63845. #else
  63846. "mul r6, r5\n\t"
  63847. #endif
  63848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63849. "adds r2, r2, r6\n\t"
  63850. #else
  63851. "add r2, r2, r6\n\t"
  63852. #endif
  63853. #ifdef WOLFSSL_KEIL
  63854. "adcs r3, r3, %[r]\n\t"
  63855. #elif defined(__clang__)
  63856. "adcs r3, %[r]\n\t"
  63857. #else
  63858. "adc r3, %[r]\n\t"
  63859. #endif
  63860. #ifdef WOLFSSL_KEIL
  63861. "adcs r4, r4, %[r]\n\t"
  63862. #elif defined(__clang__)
  63863. "adcs r4, %[r]\n\t"
  63864. #else
  63865. "adc r4, %[r]\n\t"
  63866. #endif
  63867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63868. "adds r2, r2, r6\n\t"
  63869. #else
  63870. "add r2, r2, r6\n\t"
  63871. #endif
  63872. #ifdef WOLFSSL_KEIL
  63873. "adcs r3, r3, %[r]\n\t"
  63874. #elif defined(__clang__)
  63875. "adcs r3, %[r]\n\t"
  63876. #else
  63877. "adc r3, %[r]\n\t"
  63878. #endif
  63879. #ifdef WOLFSSL_KEIL
  63880. "adcs r4, r4, %[r]\n\t"
  63881. #elif defined(__clang__)
  63882. "adcs r4, %[r]\n\t"
  63883. #else
  63884. "adc r4, %[r]\n\t"
  63885. #endif
  63886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63887. "lsrs r6, r7, #16\n\t"
  63888. #else
  63889. "lsr r6, r7, #16\n\t"
  63890. #endif
  63891. #ifdef WOLFSSL_KEIL
  63892. "muls r5, r6, r5\n\t"
  63893. #elif defined(__clang__)
  63894. "muls r5, r6\n\t"
  63895. #else
  63896. "mul r5, r6\n\t"
  63897. #endif
  63898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63899. "lsrs r6, r5, #16\n\t"
  63900. #else
  63901. "lsr r6, r5, #16\n\t"
  63902. #endif
  63903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63904. "lsls r5, r5, #16\n\t"
  63905. #else
  63906. "lsl r5, r5, #16\n\t"
  63907. #endif
  63908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63909. "adds r2, r2, r5\n\t"
  63910. #else
  63911. "add r2, r2, r5\n\t"
  63912. #endif
  63913. #ifdef WOLFSSL_KEIL
  63914. "adcs r3, r3, r6\n\t"
  63915. #elif defined(__clang__)
  63916. "adcs r3, r6\n\t"
  63917. #else
  63918. "adc r3, r6\n\t"
  63919. #endif
  63920. #ifdef WOLFSSL_KEIL
  63921. "adcs r4, r4, %[r]\n\t"
  63922. #elif defined(__clang__)
  63923. "adcs r4, %[r]\n\t"
  63924. #else
  63925. "adc r4, %[r]\n\t"
  63926. #endif
  63927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63928. "adds r2, r2, r5\n\t"
  63929. #else
  63930. "add r2, r2, r5\n\t"
  63931. #endif
  63932. #ifdef WOLFSSL_KEIL
  63933. "adcs r3, r3, r6\n\t"
  63934. #elif defined(__clang__)
  63935. "adcs r3, r6\n\t"
  63936. #else
  63937. "adc r3, r6\n\t"
  63938. #endif
  63939. #ifdef WOLFSSL_KEIL
  63940. "adcs r4, r4, %[r]\n\t"
  63941. #elif defined(__clang__)
  63942. "adcs r4, %[r]\n\t"
  63943. #else
  63944. "adc r4, %[r]\n\t"
  63945. #endif
  63946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63947. "lsrs r5, %[a], #16\n\t"
  63948. #else
  63949. "lsr r5, %[a], #16\n\t"
  63950. #endif
  63951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63952. "lsrs r6, r7, #16\n\t"
  63953. #else
  63954. "lsr r6, r7, #16\n\t"
  63955. #endif
  63956. #ifdef WOLFSSL_KEIL
  63957. "muls r6, r5, r6\n\t"
  63958. #elif defined(__clang__)
  63959. "muls r6, r5\n\t"
  63960. #else
  63961. "mul r6, r5\n\t"
  63962. #endif
  63963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63964. "adds r3, r3, r6\n\t"
  63965. #else
  63966. "add r3, r3, r6\n\t"
  63967. #endif
  63968. #ifdef WOLFSSL_KEIL
  63969. "adcs r4, r4, %[r]\n\t"
  63970. #elif defined(__clang__)
  63971. "adcs r4, %[r]\n\t"
  63972. #else
  63973. "adc r4, %[r]\n\t"
  63974. #endif
  63975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63976. "adds r3, r3, r6\n\t"
  63977. #else
  63978. "add r3, r3, r6\n\t"
  63979. #endif
  63980. #ifdef WOLFSSL_KEIL
  63981. "adcs r4, r4, %[r]\n\t"
  63982. #elif defined(__clang__)
  63983. "adcs r4, %[r]\n\t"
  63984. #else
  63985. "adc r4, %[r]\n\t"
  63986. #endif
  63987. "uxth r6, r7\n\t"
  63988. #ifdef WOLFSSL_KEIL
  63989. "muls r5, r6, r5\n\t"
  63990. #elif defined(__clang__)
  63991. "muls r5, r6\n\t"
  63992. #else
  63993. "mul r5, r6\n\t"
  63994. #endif
  63995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63996. "lsrs r6, r5, #16\n\t"
  63997. #else
  63998. "lsr r6, r5, #16\n\t"
  63999. #endif
  64000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64001. "lsls r5, r5, #16\n\t"
  64002. #else
  64003. "lsl r5, r5, #16\n\t"
  64004. #endif
  64005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64006. "adds r2, r2, r5\n\t"
  64007. #else
  64008. "add r2, r2, r5\n\t"
  64009. #endif
  64010. #ifdef WOLFSSL_KEIL
  64011. "adcs r3, r3, r6\n\t"
  64012. #elif defined(__clang__)
  64013. "adcs r3, r6\n\t"
  64014. #else
  64015. "adc r3, r6\n\t"
  64016. #endif
  64017. #ifdef WOLFSSL_KEIL
  64018. "adcs r4, r4, %[r]\n\t"
  64019. #elif defined(__clang__)
  64020. "adcs r4, %[r]\n\t"
  64021. #else
  64022. "adc r4, %[r]\n\t"
  64023. #endif
  64024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64025. "adds r2, r2, r5\n\t"
  64026. #else
  64027. "add r2, r2, r5\n\t"
  64028. #endif
  64029. #ifdef WOLFSSL_KEIL
  64030. "adcs r3, r3, r6\n\t"
  64031. #elif defined(__clang__)
  64032. "adcs r3, r6\n\t"
  64033. #else
  64034. "adc r3, r6\n\t"
  64035. #endif
  64036. #ifdef WOLFSSL_KEIL
  64037. "adcs r4, r4, %[r]\n\t"
  64038. #elif defined(__clang__)
  64039. "adcs r4, %[r]\n\t"
  64040. #else
  64041. "adc r4, %[r]\n\t"
  64042. #endif
  64043. "# A[10] * A[8]\n\t"
  64044. "mov %[a], r9\n\t"
  64045. "mov r7, r10\n\t"
  64046. "mov %[a], r12\n\t"
  64047. "uxth r5, %[a]\n\t"
  64048. "uxth r6, r7\n\t"
  64049. #ifdef WOLFSSL_KEIL
  64050. "muls r6, r5, r6\n\t"
  64051. #elif defined(__clang__)
  64052. "muls r6, r5\n\t"
  64053. #else
  64054. "mul r6, r5\n\t"
  64055. #endif
  64056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64057. "adds r2, r2, r6\n\t"
  64058. #else
  64059. "add r2, r2, r6\n\t"
  64060. #endif
  64061. #ifdef WOLFSSL_KEIL
  64062. "adcs r3, r3, %[r]\n\t"
  64063. #elif defined(__clang__)
  64064. "adcs r3, %[r]\n\t"
  64065. #else
  64066. "adc r3, %[r]\n\t"
  64067. #endif
  64068. #ifdef WOLFSSL_KEIL
  64069. "adcs r4, r4, %[r]\n\t"
  64070. #elif defined(__clang__)
  64071. "adcs r4, %[r]\n\t"
  64072. #else
  64073. "adc r4, %[r]\n\t"
  64074. #endif
  64075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64076. "adds r2, r2, r6\n\t"
  64077. #else
  64078. "add r2, r2, r6\n\t"
  64079. #endif
  64080. #ifdef WOLFSSL_KEIL
  64081. "adcs r3, r3, %[r]\n\t"
  64082. #elif defined(__clang__)
  64083. "adcs r3, %[r]\n\t"
  64084. #else
  64085. "adc r3, %[r]\n\t"
  64086. #endif
  64087. #ifdef WOLFSSL_KEIL
  64088. "adcs r4, r4, %[r]\n\t"
  64089. #elif defined(__clang__)
  64090. "adcs r4, %[r]\n\t"
  64091. #else
  64092. "adc r4, %[r]\n\t"
  64093. #endif
  64094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64095. "lsrs r6, r7, #16\n\t"
  64096. #else
  64097. "lsr r6, r7, #16\n\t"
  64098. #endif
  64099. #ifdef WOLFSSL_KEIL
  64100. "muls r5, r6, r5\n\t"
  64101. #elif defined(__clang__)
  64102. "muls r5, r6\n\t"
  64103. #else
  64104. "mul r5, r6\n\t"
  64105. #endif
  64106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64107. "lsrs r6, r5, #16\n\t"
  64108. #else
  64109. "lsr r6, r5, #16\n\t"
  64110. #endif
  64111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64112. "lsls r5, r5, #16\n\t"
  64113. #else
  64114. "lsl r5, r5, #16\n\t"
  64115. #endif
  64116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64117. "adds r2, r2, r5\n\t"
  64118. #else
  64119. "add r2, r2, r5\n\t"
  64120. #endif
  64121. #ifdef WOLFSSL_KEIL
  64122. "adcs r3, r3, r6\n\t"
  64123. #elif defined(__clang__)
  64124. "adcs r3, r6\n\t"
  64125. #else
  64126. "adc r3, r6\n\t"
  64127. #endif
  64128. #ifdef WOLFSSL_KEIL
  64129. "adcs r4, r4, %[r]\n\t"
  64130. #elif defined(__clang__)
  64131. "adcs r4, %[r]\n\t"
  64132. #else
  64133. "adc r4, %[r]\n\t"
  64134. #endif
  64135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64136. "adds r2, r2, r5\n\t"
  64137. #else
  64138. "add r2, r2, r5\n\t"
  64139. #endif
  64140. #ifdef WOLFSSL_KEIL
  64141. "adcs r3, r3, r6\n\t"
  64142. #elif defined(__clang__)
  64143. "adcs r3, r6\n\t"
  64144. #else
  64145. "adc r3, r6\n\t"
  64146. #endif
  64147. #ifdef WOLFSSL_KEIL
  64148. "adcs r4, r4, %[r]\n\t"
  64149. #elif defined(__clang__)
  64150. "adcs r4, %[r]\n\t"
  64151. #else
  64152. "adc r4, %[r]\n\t"
  64153. #endif
  64154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64155. "lsrs r5, %[a], #16\n\t"
  64156. #else
  64157. "lsr r5, %[a], #16\n\t"
  64158. #endif
  64159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64160. "lsrs r6, r7, #16\n\t"
  64161. #else
  64162. "lsr r6, r7, #16\n\t"
  64163. #endif
  64164. #ifdef WOLFSSL_KEIL
  64165. "muls r6, r5, r6\n\t"
  64166. #elif defined(__clang__)
  64167. "muls r6, r5\n\t"
  64168. #else
  64169. "mul r6, r5\n\t"
  64170. #endif
  64171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64172. "adds r3, r3, r6\n\t"
  64173. #else
  64174. "add r3, r3, r6\n\t"
  64175. #endif
  64176. #ifdef WOLFSSL_KEIL
  64177. "adcs r4, r4, %[r]\n\t"
  64178. #elif defined(__clang__)
  64179. "adcs r4, %[r]\n\t"
  64180. #else
  64181. "adc r4, %[r]\n\t"
  64182. #endif
  64183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64184. "adds r3, r3, r6\n\t"
  64185. #else
  64186. "add r3, r3, r6\n\t"
  64187. #endif
  64188. #ifdef WOLFSSL_KEIL
  64189. "adcs r4, r4, %[r]\n\t"
  64190. #elif defined(__clang__)
  64191. "adcs r4, %[r]\n\t"
  64192. #else
  64193. "adc r4, %[r]\n\t"
  64194. #endif
  64195. "uxth r6, r7\n\t"
  64196. #ifdef WOLFSSL_KEIL
  64197. "muls r5, r6, r5\n\t"
  64198. #elif defined(__clang__)
  64199. "muls r5, r6\n\t"
  64200. #else
  64201. "mul r5, r6\n\t"
  64202. #endif
  64203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64204. "lsrs r6, r5, #16\n\t"
  64205. #else
  64206. "lsr r6, r5, #16\n\t"
  64207. #endif
  64208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64209. "lsls r5, r5, #16\n\t"
  64210. #else
  64211. "lsl r5, r5, #16\n\t"
  64212. #endif
  64213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64214. "adds r2, r2, r5\n\t"
  64215. #else
  64216. "add r2, r2, r5\n\t"
  64217. #endif
  64218. #ifdef WOLFSSL_KEIL
  64219. "adcs r3, r3, r6\n\t"
  64220. #elif defined(__clang__)
  64221. "adcs r3, r6\n\t"
  64222. #else
  64223. "adc r3, r6\n\t"
  64224. #endif
  64225. #ifdef WOLFSSL_KEIL
  64226. "adcs r4, r4, %[r]\n\t"
  64227. #elif defined(__clang__)
  64228. "adcs r4, %[r]\n\t"
  64229. #else
  64230. "adc r4, %[r]\n\t"
  64231. #endif
  64232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64233. "adds r2, r2, r5\n\t"
  64234. #else
  64235. "add r2, r2, r5\n\t"
  64236. #endif
  64237. #ifdef WOLFSSL_KEIL
  64238. "adcs r3, r3, r6\n\t"
  64239. #elif defined(__clang__)
  64240. "adcs r3, r6\n\t"
  64241. #else
  64242. "adc r3, r6\n\t"
  64243. #endif
  64244. #ifdef WOLFSSL_KEIL
  64245. "adcs r4, r4, %[r]\n\t"
  64246. #elif defined(__clang__)
  64247. "adcs r4, %[r]\n\t"
  64248. #else
  64249. "adc r4, %[r]\n\t"
  64250. #endif
  64251. "# A[9] * A[9]\n\t"
  64252. "mov r7, r11\n\t"
  64253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64254. "lsrs r6, r7, #16\n\t"
  64255. #else
  64256. "lsr r6, r7, #16\n\t"
  64257. #endif
  64258. "uxth r5, r7\n\t"
  64259. #ifdef WOLFSSL_KEIL
  64260. "muls r5, r5, r5\n\t"
  64261. #elif defined(__clang__)
  64262. "muls r5, r5\n\t"
  64263. #else
  64264. "mul r5, r5\n\t"
  64265. #endif
  64266. #ifdef WOLFSSL_KEIL
  64267. "muls r6, r6, r6\n\t"
  64268. #elif defined(__clang__)
  64269. "muls r6, r6\n\t"
  64270. #else
  64271. "mul r6, r6\n\t"
  64272. #endif
  64273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64274. "adds r2, r2, r5\n\t"
  64275. #else
  64276. "add r2, r2, r5\n\t"
  64277. #endif
  64278. #ifdef WOLFSSL_KEIL
  64279. "adcs r3, r3, r6\n\t"
  64280. #elif defined(__clang__)
  64281. "adcs r3, r6\n\t"
  64282. #else
  64283. "adc r3, r6\n\t"
  64284. #endif
  64285. #ifdef WOLFSSL_KEIL
  64286. "adcs r4, r4, %[r]\n\t"
  64287. #elif defined(__clang__)
  64288. "adcs r4, %[r]\n\t"
  64289. #else
  64290. "adc r4, %[r]\n\t"
  64291. #endif
  64292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64293. "lsrs r6, r7, #16\n\t"
  64294. #else
  64295. "lsr r6, r7, #16\n\t"
  64296. #endif
  64297. "uxth r5, r7\n\t"
  64298. #ifdef WOLFSSL_KEIL
  64299. "muls r5, r6, r5\n\t"
  64300. #elif defined(__clang__)
  64301. "muls r5, r6\n\t"
  64302. #else
  64303. "mul r5, r6\n\t"
  64304. #endif
  64305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64306. "lsrs r6, r5, #15\n\t"
  64307. #else
  64308. "lsr r6, r5, #15\n\t"
  64309. #endif
  64310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64311. "lsls r5, r5, #17\n\t"
  64312. #else
  64313. "lsl r5, r5, #17\n\t"
  64314. #endif
  64315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64316. "adds r2, r2, r5\n\t"
  64317. #else
  64318. "add r2, r2, r5\n\t"
  64319. #endif
  64320. #ifdef WOLFSSL_KEIL
  64321. "adcs r3, r3, r6\n\t"
  64322. #elif defined(__clang__)
  64323. "adcs r3, r6\n\t"
  64324. #else
  64325. "adc r3, r6\n\t"
  64326. #endif
  64327. #ifdef WOLFSSL_KEIL
  64328. "adcs r4, r4, %[r]\n\t"
  64329. #elif defined(__clang__)
  64330. "adcs r4, %[r]\n\t"
  64331. #else
  64332. "adc r4, %[r]\n\t"
  64333. #endif
  64334. "mov %[r], r8\n\t"
  64335. "str r2, [%[r], #72]\n\t"
  64336. "movs %[r], #0\n\t"
  64337. "# A[10] * A[9]\n\t"
  64338. "movs r2, #0\n\t"
  64339. "mov %[a], r9\n\t"
  64340. "mov %[a], r12\n\t"
  64341. "uxth r5, %[a]\n\t"
  64342. "uxth r6, r7\n\t"
  64343. #ifdef WOLFSSL_KEIL
  64344. "muls r6, r5, r6\n\t"
  64345. #elif defined(__clang__)
  64346. "muls r6, r5\n\t"
  64347. #else
  64348. "mul r6, r5\n\t"
  64349. #endif
  64350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64351. "adds r3, r3, r6\n\t"
  64352. #else
  64353. "add r3, r3, r6\n\t"
  64354. #endif
  64355. #ifdef WOLFSSL_KEIL
  64356. "adcs r4, r4, %[r]\n\t"
  64357. #elif defined(__clang__)
  64358. "adcs r4, %[r]\n\t"
  64359. #else
  64360. "adc r4, %[r]\n\t"
  64361. #endif
  64362. #ifdef WOLFSSL_KEIL
  64363. "adcs r2, r2, %[r]\n\t"
  64364. #elif defined(__clang__)
  64365. "adcs r2, %[r]\n\t"
  64366. #else
  64367. "adc r2, %[r]\n\t"
  64368. #endif
  64369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64370. "adds r3, r3, r6\n\t"
  64371. #else
  64372. "add r3, r3, r6\n\t"
  64373. #endif
  64374. #ifdef WOLFSSL_KEIL
  64375. "adcs r4, r4, %[r]\n\t"
  64376. #elif defined(__clang__)
  64377. "adcs r4, %[r]\n\t"
  64378. #else
  64379. "adc r4, %[r]\n\t"
  64380. #endif
  64381. #ifdef WOLFSSL_KEIL
  64382. "adcs r2, r2, %[r]\n\t"
  64383. #elif defined(__clang__)
  64384. "adcs r2, %[r]\n\t"
  64385. #else
  64386. "adc r2, %[r]\n\t"
  64387. #endif
  64388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64389. "lsrs r6, r7, #16\n\t"
  64390. #else
  64391. "lsr r6, r7, #16\n\t"
  64392. #endif
  64393. #ifdef WOLFSSL_KEIL
  64394. "muls r5, r6, r5\n\t"
  64395. #elif defined(__clang__)
  64396. "muls r5, r6\n\t"
  64397. #else
  64398. "mul r5, r6\n\t"
  64399. #endif
  64400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64401. "lsrs r6, r5, #16\n\t"
  64402. #else
  64403. "lsr r6, r5, #16\n\t"
  64404. #endif
  64405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64406. "lsls r5, r5, #16\n\t"
  64407. #else
  64408. "lsl r5, r5, #16\n\t"
  64409. #endif
  64410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64411. "adds r3, r3, r5\n\t"
  64412. #else
  64413. "add r3, r3, r5\n\t"
  64414. #endif
  64415. #ifdef WOLFSSL_KEIL
  64416. "adcs r4, r4, r6\n\t"
  64417. #elif defined(__clang__)
  64418. "adcs r4, r6\n\t"
  64419. #else
  64420. "adc r4, r6\n\t"
  64421. #endif
  64422. #ifdef WOLFSSL_KEIL
  64423. "adcs r2, r2, %[r]\n\t"
  64424. #elif defined(__clang__)
  64425. "adcs r2, %[r]\n\t"
  64426. #else
  64427. "adc r2, %[r]\n\t"
  64428. #endif
  64429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64430. "adds r3, r3, r5\n\t"
  64431. #else
  64432. "add r3, r3, r5\n\t"
  64433. #endif
  64434. #ifdef WOLFSSL_KEIL
  64435. "adcs r4, r4, r6\n\t"
  64436. #elif defined(__clang__)
  64437. "adcs r4, r6\n\t"
  64438. #else
  64439. "adc r4, r6\n\t"
  64440. #endif
  64441. #ifdef WOLFSSL_KEIL
  64442. "adcs r2, r2, %[r]\n\t"
  64443. #elif defined(__clang__)
  64444. "adcs r2, %[r]\n\t"
  64445. #else
  64446. "adc r2, %[r]\n\t"
  64447. #endif
  64448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64449. "lsrs r5, %[a], #16\n\t"
  64450. #else
  64451. "lsr r5, %[a], #16\n\t"
  64452. #endif
  64453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64454. "lsrs r6, r7, #16\n\t"
  64455. #else
  64456. "lsr r6, r7, #16\n\t"
  64457. #endif
  64458. #ifdef WOLFSSL_KEIL
  64459. "muls r6, r5, r6\n\t"
  64460. #elif defined(__clang__)
  64461. "muls r6, r5\n\t"
  64462. #else
  64463. "mul r6, r5\n\t"
  64464. #endif
  64465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64466. "adds r4, r4, r6\n\t"
  64467. #else
  64468. "add r4, r4, r6\n\t"
  64469. #endif
  64470. #ifdef WOLFSSL_KEIL
  64471. "adcs r2, r2, %[r]\n\t"
  64472. #elif defined(__clang__)
  64473. "adcs r2, %[r]\n\t"
  64474. #else
  64475. "adc r2, %[r]\n\t"
  64476. #endif
  64477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64478. "adds r4, r4, r6\n\t"
  64479. #else
  64480. "add r4, r4, r6\n\t"
  64481. #endif
  64482. #ifdef WOLFSSL_KEIL
  64483. "adcs r2, r2, %[r]\n\t"
  64484. #elif defined(__clang__)
  64485. "adcs r2, %[r]\n\t"
  64486. #else
  64487. "adc r2, %[r]\n\t"
  64488. #endif
  64489. "uxth r6, r7\n\t"
  64490. #ifdef WOLFSSL_KEIL
  64491. "muls r5, r6, r5\n\t"
  64492. #elif defined(__clang__)
  64493. "muls r5, r6\n\t"
  64494. #else
  64495. "mul r5, r6\n\t"
  64496. #endif
  64497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64498. "lsrs r6, r5, #16\n\t"
  64499. #else
  64500. "lsr r6, r5, #16\n\t"
  64501. #endif
  64502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64503. "lsls r5, r5, #16\n\t"
  64504. #else
  64505. "lsl r5, r5, #16\n\t"
  64506. #endif
  64507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64508. "adds r3, r3, r5\n\t"
  64509. #else
  64510. "add r3, r3, r5\n\t"
  64511. #endif
  64512. #ifdef WOLFSSL_KEIL
  64513. "adcs r4, r4, r6\n\t"
  64514. #elif defined(__clang__)
  64515. "adcs r4, r6\n\t"
  64516. #else
  64517. "adc r4, r6\n\t"
  64518. #endif
  64519. #ifdef WOLFSSL_KEIL
  64520. "adcs r2, r2, %[r]\n\t"
  64521. #elif defined(__clang__)
  64522. "adcs r2, %[r]\n\t"
  64523. #else
  64524. "adc r2, %[r]\n\t"
  64525. #endif
  64526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64527. "adds r3, r3, r5\n\t"
  64528. #else
  64529. "add r3, r3, r5\n\t"
  64530. #endif
  64531. #ifdef WOLFSSL_KEIL
  64532. "adcs r4, r4, r6\n\t"
  64533. #elif defined(__clang__)
  64534. "adcs r4, r6\n\t"
  64535. #else
  64536. "adc r4, r6\n\t"
  64537. #endif
  64538. #ifdef WOLFSSL_KEIL
  64539. "adcs r2, r2, %[r]\n\t"
  64540. #elif defined(__clang__)
  64541. "adcs r2, %[r]\n\t"
  64542. #else
  64543. "adc r2, %[r]\n\t"
  64544. #endif
  64545. "# A[11] * A[8]\n\t"
  64546. "mov %[a], r9\n\t"
  64547. "mov r7, r10\n\t"
  64548. "mov %[a], lr\n\t"
  64549. "uxth r5, %[a]\n\t"
  64550. "uxth r6, r7\n\t"
  64551. #ifdef WOLFSSL_KEIL
  64552. "muls r6, r5, r6\n\t"
  64553. #elif defined(__clang__)
  64554. "muls r6, r5\n\t"
  64555. #else
  64556. "mul r6, r5\n\t"
  64557. #endif
  64558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64559. "adds r3, r3, r6\n\t"
  64560. #else
  64561. "add r3, r3, r6\n\t"
  64562. #endif
  64563. #ifdef WOLFSSL_KEIL
  64564. "adcs r4, r4, %[r]\n\t"
  64565. #elif defined(__clang__)
  64566. "adcs r4, %[r]\n\t"
  64567. #else
  64568. "adc r4, %[r]\n\t"
  64569. #endif
  64570. #ifdef WOLFSSL_KEIL
  64571. "adcs r2, r2, %[r]\n\t"
  64572. #elif defined(__clang__)
  64573. "adcs r2, %[r]\n\t"
  64574. #else
  64575. "adc r2, %[r]\n\t"
  64576. #endif
  64577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64578. "adds r3, r3, r6\n\t"
  64579. #else
  64580. "add r3, r3, r6\n\t"
  64581. #endif
  64582. #ifdef WOLFSSL_KEIL
  64583. "adcs r4, r4, %[r]\n\t"
  64584. #elif defined(__clang__)
  64585. "adcs r4, %[r]\n\t"
  64586. #else
  64587. "adc r4, %[r]\n\t"
  64588. #endif
  64589. #ifdef WOLFSSL_KEIL
  64590. "adcs r2, r2, %[r]\n\t"
  64591. #elif defined(__clang__)
  64592. "adcs r2, %[r]\n\t"
  64593. #else
  64594. "adc r2, %[r]\n\t"
  64595. #endif
  64596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64597. "lsrs r6, r7, #16\n\t"
  64598. #else
  64599. "lsr r6, r7, #16\n\t"
  64600. #endif
  64601. #ifdef WOLFSSL_KEIL
  64602. "muls r5, r6, r5\n\t"
  64603. #elif defined(__clang__)
  64604. "muls r5, r6\n\t"
  64605. #else
  64606. "mul r5, r6\n\t"
  64607. #endif
  64608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64609. "lsrs r6, r5, #16\n\t"
  64610. #else
  64611. "lsr r6, r5, #16\n\t"
  64612. #endif
  64613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64614. "lsls r5, r5, #16\n\t"
  64615. #else
  64616. "lsl r5, r5, #16\n\t"
  64617. #endif
  64618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64619. "adds r3, r3, r5\n\t"
  64620. #else
  64621. "add r3, r3, r5\n\t"
  64622. #endif
  64623. #ifdef WOLFSSL_KEIL
  64624. "adcs r4, r4, r6\n\t"
  64625. #elif defined(__clang__)
  64626. "adcs r4, r6\n\t"
  64627. #else
  64628. "adc r4, r6\n\t"
  64629. #endif
  64630. #ifdef WOLFSSL_KEIL
  64631. "adcs r2, r2, %[r]\n\t"
  64632. #elif defined(__clang__)
  64633. "adcs r2, %[r]\n\t"
  64634. #else
  64635. "adc r2, %[r]\n\t"
  64636. #endif
  64637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64638. "adds r3, r3, r5\n\t"
  64639. #else
  64640. "add r3, r3, r5\n\t"
  64641. #endif
  64642. #ifdef WOLFSSL_KEIL
  64643. "adcs r4, r4, r6\n\t"
  64644. #elif defined(__clang__)
  64645. "adcs r4, r6\n\t"
  64646. #else
  64647. "adc r4, r6\n\t"
  64648. #endif
  64649. #ifdef WOLFSSL_KEIL
  64650. "adcs r2, r2, %[r]\n\t"
  64651. #elif defined(__clang__)
  64652. "adcs r2, %[r]\n\t"
  64653. #else
  64654. "adc r2, %[r]\n\t"
  64655. #endif
  64656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64657. "lsrs r5, %[a], #16\n\t"
  64658. #else
  64659. "lsr r5, %[a], #16\n\t"
  64660. #endif
  64661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64662. "lsrs r6, r7, #16\n\t"
  64663. #else
  64664. "lsr r6, r7, #16\n\t"
  64665. #endif
  64666. #ifdef WOLFSSL_KEIL
  64667. "muls r6, r5, r6\n\t"
  64668. #elif defined(__clang__)
  64669. "muls r6, r5\n\t"
  64670. #else
  64671. "mul r6, r5\n\t"
  64672. #endif
  64673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64674. "adds r4, r4, r6\n\t"
  64675. #else
  64676. "add r4, r4, r6\n\t"
  64677. #endif
  64678. #ifdef WOLFSSL_KEIL
  64679. "adcs r2, r2, %[r]\n\t"
  64680. #elif defined(__clang__)
  64681. "adcs r2, %[r]\n\t"
  64682. #else
  64683. "adc r2, %[r]\n\t"
  64684. #endif
  64685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64686. "adds r4, r4, r6\n\t"
  64687. #else
  64688. "add r4, r4, r6\n\t"
  64689. #endif
  64690. #ifdef WOLFSSL_KEIL
  64691. "adcs r2, r2, %[r]\n\t"
  64692. #elif defined(__clang__)
  64693. "adcs r2, %[r]\n\t"
  64694. #else
  64695. "adc r2, %[r]\n\t"
  64696. #endif
  64697. "uxth r6, r7\n\t"
  64698. #ifdef WOLFSSL_KEIL
  64699. "muls r5, r6, r5\n\t"
  64700. #elif defined(__clang__)
  64701. "muls r5, r6\n\t"
  64702. #else
  64703. "mul r5, r6\n\t"
  64704. #endif
  64705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64706. "lsrs r6, r5, #16\n\t"
  64707. #else
  64708. "lsr r6, r5, #16\n\t"
  64709. #endif
  64710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64711. "lsls r5, r5, #16\n\t"
  64712. #else
  64713. "lsl r5, r5, #16\n\t"
  64714. #endif
  64715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64716. "adds r3, r3, r5\n\t"
  64717. #else
  64718. "add r3, r3, r5\n\t"
  64719. #endif
  64720. #ifdef WOLFSSL_KEIL
  64721. "adcs r4, r4, r6\n\t"
  64722. #elif defined(__clang__)
  64723. "adcs r4, r6\n\t"
  64724. #else
  64725. "adc r4, r6\n\t"
  64726. #endif
  64727. #ifdef WOLFSSL_KEIL
  64728. "adcs r2, r2, %[r]\n\t"
  64729. #elif defined(__clang__)
  64730. "adcs r2, %[r]\n\t"
  64731. #else
  64732. "adc r2, %[r]\n\t"
  64733. #endif
  64734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64735. "adds r3, r3, r5\n\t"
  64736. #else
  64737. "add r3, r3, r5\n\t"
  64738. #endif
  64739. #ifdef WOLFSSL_KEIL
  64740. "adcs r4, r4, r6\n\t"
  64741. #elif defined(__clang__)
  64742. "adcs r4, r6\n\t"
  64743. #else
  64744. "adc r4, r6\n\t"
  64745. #endif
  64746. #ifdef WOLFSSL_KEIL
  64747. "adcs r2, r2, %[r]\n\t"
  64748. #elif defined(__clang__)
  64749. "adcs r2, %[r]\n\t"
  64750. #else
  64751. "adc r2, %[r]\n\t"
  64752. #endif
  64753. "mov %[r], r8\n\t"
  64754. "str r3, [%[r], #76]\n\t"
  64755. "movs %[r], #0\n\t"
  64756. "# A[11] * A[9]\n\t"
  64757. "movs r3, #0\n\t"
  64758. "mov %[a], r9\n\t"
  64759. "mov r7, r11\n\t"
  64760. "mov %[a], lr\n\t"
  64761. "uxth r5, %[a]\n\t"
  64762. "uxth r6, r7\n\t"
  64763. #ifdef WOLFSSL_KEIL
  64764. "muls r6, r5, r6\n\t"
  64765. #elif defined(__clang__)
  64766. "muls r6, r5\n\t"
  64767. #else
  64768. "mul r6, r5\n\t"
  64769. #endif
  64770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64771. "adds r4, r4, r6\n\t"
  64772. #else
  64773. "add r4, r4, r6\n\t"
  64774. #endif
  64775. #ifdef WOLFSSL_KEIL
  64776. "adcs r2, r2, %[r]\n\t"
  64777. #elif defined(__clang__)
  64778. "adcs r2, %[r]\n\t"
  64779. #else
  64780. "adc r2, %[r]\n\t"
  64781. #endif
  64782. #ifdef WOLFSSL_KEIL
  64783. "adcs r3, r3, %[r]\n\t"
  64784. #elif defined(__clang__)
  64785. "adcs r3, %[r]\n\t"
  64786. #else
  64787. "adc r3, %[r]\n\t"
  64788. #endif
  64789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64790. "adds r4, r4, r6\n\t"
  64791. #else
  64792. "add r4, r4, r6\n\t"
  64793. #endif
  64794. #ifdef WOLFSSL_KEIL
  64795. "adcs r2, r2, %[r]\n\t"
  64796. #elif defined(__clang__)
  64797. "adcs r2, %[r]\n\t"
  64798. #else
  64799. "adc r2, %[r]\n\t"
  64800. #endif
  64801. #ifdef WOLFSSL_KEIL
  64802. "adcs r3, r3, %[r]\n\t"
  64803. #elif defined(__clang__)
  64804. "adcs r3, %[r]\n\t"
  64805. #else
  64806. "adc r3, %[r]\n\t"
  64807. #endif
  64808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64809. "lsrs r6, r7, #16\n\t"
  64810. #else
  64811. "lsr r6, r7, #16\n\t"
  64812. #endif
  64813. #ifdef WOLFSSL_KEIL
  64814. "muls r5, r6, r5\n\t"
  64815. #elif defined(__clang__)
  64816. "muls r5, r6\n\t"
  64817. #else
  64818. "mul r5, r6\n\t"
  64819. #endif
  64820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64821. "lsrs r6, r5, #16\n\t"
  64822. #else
  64823. "lsr r6, r5, #16\n\t"
  64824. #endif
  64825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64826. "lsls r5, r5, #16\n\t"
  64827. #else
  64828. "lsl r5, r5, #16\n\t"
  64829. #endif
  64830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64831. "adds r4, r4, r5\n\t"
  64832. #else
  64833. "add r4, r4, r5\n\t"
  64834. #endif
  64835. #ifdef WOLFSSL_KEIL
  64836. "adcs r2, r2, r6\n\t"
  64837. #elif defined(__clang__)
  64838. "adcs r2, r6\n\t"
  64839. #else
  64840. "adc r2, r6\n\t"
  64841. #endif
  64842. #ifdef WOLFSSL_KEIL
  64843. "adcs r3, r3, %[r]\n\t"
  64844. #elif defined(__clang__)
  64845. "adcs r3, %[r]\n\t"
  64846. #else
  64847. "adc r3, %[r]\n\t"
  64848. #endif
  64849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64850. "adds r4, r4, r5\n\t"
  64851. #else
  64852. "add r4, r4, r5\n\t"
  64853. #endif
  64854. #ifdef WOLFSSL_KEIL
  64855. "adcs r2, r2, r6\n\t"
  64856. #elif defined(__clang__)
  64857. "adcs r2, r6\n\t"
  64858. #else
  64859. "adc r2, r6\n\t"
  64860. #endif
  64861. #ifdef WOLFSSL_KEIL
  64862. "adcs r3, r3, %[r]\n\t"
  64863. #elif defined(__clang__)
  64864. "adcs r3, %[r]\n\t"
  64865. #else
  64866. "adc r3, %[r]\n\t"
  64867. #endif
  64868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64869. "lsrs r5, %[a], #16\n\t"
  64870. #else
  64871. "lsr r5, %[a], #16\n\t"
  64872. #endif
  64873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64874. "lsrs r6, r7, #16\n\t"
  64875. #else
  64876. "lsr r6, r7, #16\n\t"
  64877. #endif
  64878. #ifdef WOLFSSL_KEIL
  64879. "muls r6, r5, r6\n\t"
  64880. #elif defined(__clang__)
  64881. "muls r6, r5\n\t"
  64882. #else
  64883. "mul r6, r5\n\t"
  64884. #endif
  64885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64886. "adds r2, r2, r6\n\t"
  64887. #else
  64888. "add r2, r2, r6\n\t"
  64889. #endif
  64890. #ifdef WOLFSSL_KEIL
  64891. "adcs r3, r3, %[r]\n\t"
  64892. #elif defined(__clang__)
  64893. "adcs r3, %[r]\n\t"
  64894. #else
  64895. "adc r3, %[r]\n\t"
  64896. #endif
  64897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64898. "adds r2, r2, r6\n\t"
  64899. #else
  64900. "add r2, r2, r6\n\t"
  64901. #endif
  64902. #ifdef WOLFSSL_KEIL
  64903. "adcs r3, r3, %[r]\n\t"
  64904. #elif defined(__clang__)
  64905. "adcs r3, %[r]\n\t"
  64906. #else
  64907. "adc r3, %[r]\n\t"
  64908. #endif
  64909. "uxth r6, r7\n\t"
  64910. #ifdef WOLFSSL_KEIL
  64911. "muls r5, r6, r5\n\t"
  64912. #elif defined(__clang__)
  64913. "muls r5, r6\n\t"
  64914. #else
  64915. "mul r5, r6\n\t"
  64916. #endif
  64917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64918. "lsrs r6, r5, #16\n\t"
  64919. #else
  64920. "lsr r6, r5, #16\n\t"
  64921. #endif
  64922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64923. "lsls r5, r5, #16\n\t"
  64924. #else
  64925. "lsl r5, r5, #16\n\t"
  64926. #endif
  64927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64928. "adds r4, r4, r5\n\t"
  64929. #else
  64930. "add r4, r4, r5\n\t"
  64931. #endif
  64932. #ifdef WOLFSSL_KEIL
  64933. "adcs r2, r2, r6\n\t"
  64934. #elif defined(__clang__)
  64935. "adcs r2, r6\n\t"
  64936. #else
  64937. "adc r2, r6\n\t"
  64938. #endif
  64939. #ifdef WOLFSSL_KEIL
  64940. "adcs r3, r3, %[r]\n\t"
  64941. #elif defined(__clang__)
  64942. "adcs r3, %[r]\n\t"
  64943. #else
  64944. "adc r3, %[r]\n\t"
  64945. #endif
  64946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64947. "adds r4, r4, r5\n\t"
  64948. #else
  64949. "add r4, r4, r5\n\t"
  64950. #endif
  64951. #ifdef WOLFSSL_KEIL
  64952. "adcs r2, r2, r6\n\t"
  64953. #elif defined(__clang__)
  64954. "adcs r2, r6\n\t"
  64955. #else
  64956. "adc r2, r6\n\t"
  64957. #endif
  64958. #ifdef WOLFSSL_KEIL
  64959. "adcs r3, r3, %[r]\n\t"
  64960. #elif defined(__clang__)
  64961. "adcs r3, %[r]\n\t"
  64962. #else
  64963. "adc r3, %[r]\n\t"
  64964. #endif
  64965. "# A[10] * A[10]\n\t"
  64966. "mov r7, r12\n\t"
  64967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64968. "lsrs r6, r7, #16\n\t"
  64969. #else
  64970. "lsr r6, r7, #16\n\t"
  64971. #endif
  64972. "uxth r5, r7\n\t"
  64973. #ifdef WOLFSSL_KEIL
  64974. "muls r5, r5, r5\n\t"
  64975. #elif defined(__clang__)
  64976. "muls r5, r5\n\t"
  64977. #else
  64978. "mul r5, r5\n\t"
  64979. #endif
  64980. #ifdef WOLFSSL_KEIL
  64981. "muls r6, r6, r6\n\t"
  64982. #elif defined(__clang__)
  64983. "muls r6, r6\n\t"
  64984. #else
  64985. "mul r6, r6\n\t"
  64986. #endif
  64987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64988. "adds r4, r4, r5\n\t"
  64989. #else
  64990. "add r4, r4, r5\n\t"
  64991. #endif
  64992. #ifdef WOLFSSL_KEIL
  64993. "adcs r2, r2, r6\n\t"
  64994. #elif defined(__clang__)
  64995. "adcs r2, r6\n\t"
  64996. #else
  64997. "adc r2, r6\n\t"
  64998. #endif
  64999. #ifdef WOLFSSL_KEIL
  65000. "adcs r3, r3, %[r]\n\t"
  65001. #elif defined(__clang__)
  65002. "adcs r3, %[r]\n\t"
  65003. #else
  65004. "adc r3, %[r]\n\t"
  65005. #endif
  65006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65007. "lsrs r6, r7, #16\n\t"
  65008. #else
  65009. "lsr r6, r7, #16\n\t"
  65010. #endif
  65011. "uxth r5, r7\n\t"
  65012. #ifdef WOLFSSL_KEIL
  65013. "muls r5, r6, r5\n\t"
  65014. #elif defined(__clang__)
  65015. "muls r5, r6\n\t"
  65016. #else
  65017. "mul r5, r6\n\t"
  65018. #endif
  65019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65020. "lsrs r6, r5, #15\n\t"
  65021. #else
  65022. "lsr r6, r5, #15\n\t"
  65023. #endif
  65024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65025. "lsls r5, r5, #17\n\t"
  65026. #else
  65027. "lsl r5, r5, #17\n\t"
  65028. #endif
  65029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65030. "adds r4, r4, r5\n\t"
  65031. #else
  65032. "add r4, r4, r5\n\t"
  65033. #endif
  65034. #ifdef WOLFSSL_KEIL
  65035. "adcs r2, r2, r6\n\t"
  65036. #elif defined(__clang__)
  65037. "adcs r2, r6\n\t"
  65038. #else
  65039. "adc r2, r6\n\t"
  65040. #endif
  65041. #ifdef WOLFSSL_KEIL
  65042. "adcs r3, r3, %[r]\n\t"
  65043. #elif defined(__clang__)
  65044. "adcs r3, %[r]\n\t"
  65045. #else
  65046. "adc r3, %[r]\n\t"
  65047. #endif
  65048. "mov %[r], r8\n\t"
  65049. "str r4, [%[r], #80]\n\t"
  65050. "movs %[r], #0\n\t"
  65051. "# A[11] * A[10]\n\t"
  65052. "movs r4, #0\n\t"
  65053. "mov %[a], r9\n\t"
  65054. "mov %[a], lr\n\t"
  65055. "uxth r5, %[a]\n\t"
  65056. "uxth r6, r7\n\t"
  65057. #ifdef WOLFSSL_KEIL
  65058. "muls r6, r5, r6\n\t"
  65059. #elif defined(__clang__)
  65060. "muls r6, r5\n\t"
  65061. #else
  65062. "mul r6, r5\n\t"
  65063. #endif
  65064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65065. "adds r2, r2, r6\n\t"
  65066. #else
  65067. "add r2, r2, r6\n\t"
  65068. #endif
  65069. #ifdef WOLFSSL_KEIL
  65070. "adcs r3, r3, %[r]\n\t"
  65071. #elif defined(__clang__)
  65072. "adcs r3, %[r]\n\t"
  65073. #else
  65074. "adc r3, %[r]\n\t"
  65075. #endif
  65076. #ifdef WOLFSSL_KEIL
  65077. "adcs r4, r4, %[r]\n\t"
  65078. #elif defined(__clang__)
  65079. "adcs r4, %[r]\n\t"
  65080. #else
  65081. "adc r4, %[r]\n\t"
  65082. #endif
  65083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65084. "adds r2, r2, r6\n\t"
  65085. #else
  65086. "add r2, r2, r6\n\t"
  65087. #endif
  65088. #ifdef WOLFSSL_KEIL
  65089. "adcs r3, r3, %[r]\n\t"
  65090. #elif defined(__clang__)
  65091. "adcs r3, %[r]\n\t"
  65092. #else
  65093. "adc r3, %[r]\n\t"
  65094. #endif
  65095. #ifdef WOLFSSL_KEIL
  65096. "adcs r4, r4, %[r]\n\t"
  65097. #elif defined(__clang__)
  65098. "adcs r4, %[r]\n\t"
  65099. #else
  65100. "adc r4, %[r]\n\t"
  65101. #endif
  65102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65103. "lsrs r6, r7, #16\n\t"
  65104. #else
  65105. "lsr r6, r7, #16\n\t"
  65106. #endif
  65107. #ifdef WOLFSSL_KEIL
  65108. "muls r5, r6, r5\n\t"
  65109. #elif defined(__clang__)
  65110. "muls r5, r6\n\t"
  65111. #else
  65112. "mul r5, r6\n\t"
  65113. #endif
  65114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65115. "lsrs r6, r5, #16\n\t"
  65116. #else
  65117. "lsr r6, r5, #16\n\t"
  65118. #endif
  65119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65120. "lsls r5, r5, #16\n\t"
  65121. #else
  65122. "lsl r5, r5, #16\n\t"
  65123. #endif
  65124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65125. "adds r2, r2, r5\n\t"
  65126. #else
  65127. "add r2, r2, r5\n\t"
  65128. #endif
  65129. #ifdef WOLFSSL_KEIL
  65130. "adcs r3, r3, r6\n\t"
  65131. #elif defined(__clang__)
  65132. "adcs r3, r6\n\t"
  65133. #else
  65134. "adc r3, r6\n\t"
  65135. #endif
  65136. #ifdef WOLFSSL_KEIL
  65137. "adcs r4, r4, %[r]\n\t"
  65138. #elif defined(__clang__)
  65139. "adcs r4, %[r]\n\t"
  65140. #else
  65141. "adc r4, %[r]\n\t"
  65142. #endif
  65143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65144. "adds r2, r2, r5\n\t"
  65145. #else
  65146. "add r2, r2, r5\n\t"
  65147. #endif
  65148. #ifdef WOLFSSL_KEIL
  65149. "adcs r3, r3, r6\n\t"
  65150. #elif defined(__clang__)
  65151. "adcs r3, r6\n\t"
  65152. #else
  65153. "adc r3, r6\n\t"
  65154. #endif
  65155. #ifdef WOLFSSL_KEIL
  65156. "adcs r4, r4, %[r]\n\t"
  65157. #elif defined(__clang__)
  65158. "adcs r4, %[r]\n\t"
  65159. #else
  65160. "adc r4, %[r]\n\t"
  65161. #endif
  65162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65163. "lsrs r5, %[a], #16\n\t"
  65164. #else
  65165. "lsr r5, %[a], #16\n\t"
  65166. #endif
  65167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65168. "lsrs r6, r7, #16\n\t"
  65169. #else
  65170. "lsr r6, r7, #16\n\t"
  65171. #endif
  65172. #ifdef WOLFSSL_KEIL
  65173. "muls r6, r5, r6\n\t"
  65174. #elif defined(__clang__)
  65175. "muls r6, r5\n\t"
  65176. #else
  65177. "mul r6, r5\n\t"
  65178. #endif
  65179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65180. "adds r3, r3, r6\n\t"
  65181. #else
  65182. "add r3, r3, r6\n\t"
  65183. #endif
  65184. #ifdef WOLFSSL_KEIL
  65185. "adcs r4, r4, %[r]\n\t"
  65186. #elif defined(__clang__)
  65187. "adcs r4, %[r]\n\t"
  65188. #else
  65189. "adc r4, %[r]\n\t"
  65190. #endif
  65191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65192. "adds r3, r3, r6\n\t"
  65193. #else
  65194. "add r3, r3, r6\n\t"
  65195. #endif
  65196. #ifdef WOLFSSL_KEIL
  65197. "adcs r4, r4, %[r]\n\t"
  65198. #elif defined(__clang__)
  65199. "adcs r4, %[r]\n\t"
  65200. #else
  65201. "adc r4, %[r]\n\t"
  65202. #endif
  65203. "uxth r6, r7\n\t"
  65204. #ifdef WOLFSSL_KEIL
  65205. "muls r5, r6, r5\n\t"
  65206. #elif defined(__clang__)
  65207. "muls r5, r6\n\t"
  65208. #else
  65209. "mul r5, r6\n\t"
  65210. #endif
  65211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65212. "lsrs r6, r5, #16\n\t"
  65213. #else
  65214. "lsr r6, r5, #16\n\t"
  65215. #endif
  65216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65217. "lsls r5, r5, #16\n\t"
  65218. #else
  65219. "lsl r5, r5, #16\n\t"
  65220. #endif
  65221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65222. "adds r2, r2, r5\n\t"
  65223. #else
  65224. "add r2, r2, r5\n\t"
  65225. #endif
  65226. #ifdef WOLFSSL_KEIL
  65227. "adcs r3, r3, r6\n\t"
  65228. #elif defined(__clang__)
  65229. "adcs r3, r6\n\t"
  65230. #else
  65231. "adc r3, r6\n\t"
  65232. #endif
  65233. #ifdef WOLFSSL_KEIL
  65234. "adcs r4, r4, %[r]\n\t"
  65235. #elif defined(__clang__)
  65236. "adcs r4, %[r]\n\t"
  65237. #else
  65238. "adc r4, %[r]\n\t"
  65239. #endif
  65240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65241. "adds r2, r2, r5\n\t"
  65242. #else
  65243. "add r2, r2, r5\n\t"
  65244. #endif
  65245. #ifdef WOLFSSL_KEIL
  65246. "adcs r3, r3, r6\n\t"
  65247. #elif defined(__clang__)
  65248. "adcs r3, r6\n\t"
  65249. #else
  65250. "adc r3, r6\n\t"
  65251. #endif
  65252. #ifdef WOLFSSL_KEIL
  65253. "adcs r4, r4, %[r]\n\t"
  65254. #elif defined(__clang__)
  65255. "adcs r4, %[r]\n\t"
  65256. #else
  65257. "adc r4, %[r]\n\t"
  65258. #endif
  65259. "mov %[r], r8\n\t"
  65260. "str r2, [%[r], #84]\n\t"
  65261. "movs %[r], #0\n\t"
  65262. "# A[11] * A[11]\n\t"
  65263. "mov %[a], r9\n\t"
  65264. "mov r7, lr\n\t"
  65265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65266. "lsrs r6, r7, #16\n\t"
  65267. #else
  65268. "lsr r6, r7, #16\n\t"
  65269. #endif
  65270. "uxth r5, r7\n\t"
  65271. #ifdef WOLFSSL_KEIL
  65272. "muls r5, r5, r5\n\t"
  65273. #elif defined(__clang__)
  65274. "muls r5, r5\n\t"
  65275. #else
  65276. "mul r5, r5\n\t"
  65277. #endif
  65278. #ifdef WOLFSSL_KEIL
  65279. "muls r6, r6, r6\n\t"
  65280. #elif defined(__clang__)
  65281. "muls r6, r6\n\t"
  65282. #else
  65283. "mul r6, r6\n\t"
  65284. #endif
  65285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65286. "adds r3, r3, r5\n\t"
  65287. #else
  65288. "add r3, r3, r5\n\t"
  65289. #endif
  65290. #ifdef WOLFSSL_KEIL
  65291. "adcs r4, r4, r6\n\t"
  65292. #elif defined(__clang__)
  65293. "adcs r4, r6\n\t"
  65294. #else
  65295. "adc r4, r6\n\t"
  65296. #endif
  65297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65298. "lsrs r6, r7, #16\n\t"
  65299. #else
  65300. "lsr r6, r7, #16\n\t"
  65301. #endif
  65302. "uxth r5, r7\n\t"
  65303. #ifdef WOLFSSL_KEIL
  65304. "muls r5, r6, r5\n\t"
  65305. #elif defined(__clang__)
  65306. "muls r5, r6\n\t"
  65307. #else
  65308. "mul r5, r6\n\t"
  65309. #endif
  65310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65311. "lsrs r6, r5, #15\n\t"
  65312. #else
  65313. "lsr r6, r5, #15\n\t"
  65314. #endif
  65315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65316. "lsls r5, r5, #17\n\t"
  65317. #else
  65318. "lsl r5, r5, #17\n\t"
  65319. #endif
  65320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65321. "adds r3, r3, r5\n\t"
  65322. #else
  65323. "add r3, r3, r5\n\t"
  65324. #endif
  65325. #ifdef WOLFSSL_KEIL
  65326. "adcs r4, r4, r6\n\t"
  65327. #elif defined(__clang__)
  65328. "adcs r4, r6\n\t"
  65329. #else
  65330. "adc r4, r6\n\t"
  65331. #endif
  65332. "mov %[r], r8\n\t"
  65333. "str r3, [%[r], #88]\n\t"
  65334. "str r4, [%[r], #92]\n\t"
  65335. "pop {r2, r3, r4, r5}\n\t"
  65336. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  65337. "pop {r2, r3, r4, r5}\n\t"
  65338. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  65339. "pop {r2, r3, r4, r5}\n\t"
  65340. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  65341. : [r] "+r" (r), [a] "+r" (a)
  65342. :
  65343. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  65344. );
  65345. }
  65346. #endif /* !WOLFSSL_SP_LARGE_CODE */
  65347. /* Add b to a into r. (r = a + b)
  65348. *
  65349. * r A single precision integer.
  65350. * a A single precision integer.
  65351. * b A single precision integer.
  65352. */
  65353. SP_NOINLINE static sp_digit sp_3072_add_12(sp_digit* r, const sp_digit* a,
  65354. const sp_digit* b)
  65355. {
  65356. __asm__ __volatile__ (
  65357. "ldm %[b]!, {r5, r6}\n\t"
  65358. "ldm %[a]!, {r3, r4}\n\t"
  65359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65360. "adds r3, r3, r5\n\t"
  65361. #else
  65362. "add r3, r3, r5\n\t"
  65363. #endif
  65364. #ifdef WOLFSSL_KEIL
  65365. "adcs r4, r4, r6\n\t"
  65366. #elif defined(__clang__)
  65367. "adcs r4, r6\n\t"
  65368. #else
  65369. "adc r4, r6\n\t"
  65370. #endif
  65371. "stm %[r]!, {r3, r4}\n\t"
  65372. "ldm %[b]!, {r5, r6}\n\t"
  65373. "ldm %[a]!, {r3, r4}\n\t"
  65374. #ifdef WOLFSSL_KEIL
  65375. "adcs r3, r3, r5\n\t"
  65376. #elif defined(__clang__)
  65377. "adcs r3, r5\n\t"
  65378. #else
  65379. "adc r3, r5\n\t"
  65380. #endif
  65381. #ifdef WOLFSSL_KEIL
  65382. "adcs r4, r4, r6\n\t"
  65383. #elif defined(__clang__)
  65384. "adcs r4, r6\n\t"
  65385. #else
  65386. "adc r4, r6\n\t"
  65387. #endif
  65388. "stm %[r]!, {r3, r4}\n\t"
  65389. "ldm %[b]!, {r5, r6}\n\t"
  65390. "ldm %[a]!, {r3, r4}\n\t"
  65391. #ifdef WOLFSSL_KEIL
  65392. "adcs r3, r3, r5\n\t"
  65393. #elif defined(__clang__)
  65394. "adcs r3, r5\n\t"
  65395. #else
  65396. "adc r3, r5\n\t"
  65397. #endif
  65398. #ifdef WOLFSSL_KEIL
  65399. "adcs r4, r4, r6\n\t"
  65400. #elif defined(__clang__)
  65401. "adcs r4, r6\n\t"
  65402. #else
  65403. "adc r4, r6\n\t"
  65404. #endif
  65405. "stm %[r]!, {r3, r4}\n\t"
  65406. "ldm %[b]!, {r5, r6}\n\t"
  65407. "ldm %[a]!, {r3, r4}\n\t"
  65408. #ifdef WOLFSSL_KEIL
  65409. "adcs r3, r3, r5\n\t"
  65410. #elif defined(__clang__)
  65411. "adcs r3, r5\n\t"
  65412. #else
  65413. "adc r3, r5\n\t"
  65414. #endif
  65415. #ifdef WOLFSSL_KEIL
  65416. "adcs r4, r4, r6\n\t"
  65417. #elif defined(__clang__)
  65418. "adcs r4, r6\n\t"
  65419. #else
  65420. "adc r4, r6\n\t"
  65421. #endif
  65422. "stm %[r]!, {r3, r4}\n\t"
  65423. "ldm %[b]!, {r5, r6}\n\t"
  65424. "ldm %[a]!, {r3, r4}\n\t"
  65425. #ifdef WOLFSSL_KEIL
  65426. "adcs r3, r3, r5\n\t"
  65427. #elif defined(__clang__)
  65428. "adcs r3, r5\n\t"
  65429. #else
  65430. "adc r3, r5\n\t"
  65431. #endif
  65432. #ifdef WOLFSSL_KEIL
  65433. "adcs r4, r4, r6\n\t"
  65434. #elif defined(__clang__)
  65435. "adcs r4, r6\n\t"
  65436. #else
  65437. "adc r4, r6\n\t"
  65438. #endif
  65439. "stm %[r]!, {r3, r4}\n\t"
  65440. "ldm %[b]!, {r5, r6}\n\t"
  65441. "ldm %[a]!, {r3, r4}\n\t"
  65442. #ifdef WOLFSSL_KEIL
  65443. "adcs r3, r3, r5\n\t"
  65444. #elif defined(__clang__)
  65445. "adcs r3, r5\n\t"
  65446. #else
  65447. "adc r3, r5\n\t"
  65448. #endif
  65449. #ifdef WOLFSSL_KEIL
  65450. "adcs r4, r4, r6\n\t"
  65451. #elif defined(__clang__)
  65452. "adcs r4, r6\n\t"
  65453. #else
  65454. "adc r4, r6\n\t"
  65455. #endif
  65456. "stm %[r]!, {r3, r4}\n\t"
  65457. "movs %[r], #0\n\t"
  65458. #ifdef WOLFSSL_KEIL
  65459. "adcs %[r], %[r], %[r]\n\t"
  65460. #elif defined(__clang__)
  65461. "adcs %[r], %[r]\n\t"
  65462. #else
  65463. "adc %[r], %[r]\n\t"
  65464. #endif
  65465. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  65466. :
  65467. : "memory", "r3", "r4", "r5", "r6"
  65468. );
  65469. return (uint32_t)(size_t)r;
  65470. }
  65471. /* Add b to a into r. (r = a + b)
  65472. *
  65473. * r A single precision integer.
  65474. * a A single precision integer.
  65475. * b A single precision integer.
  65476. */
  65477. SP_NOINLINE static sp_digit sp_3072_add_to_word_12(sp_digit* r, sp_digit a,
  65478. const sp_digit* b)
  65479. {
  65480. __asm__ __volatile__ (
  65481. "movs r5, #0\n\t"
  65482. "ldm %[b]!, {r3, r4}\n\t"
  65483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65484. "adds r3, r3, %[a]\n\t"
  65485. #else
  65486. "add r3, r3, %[a]\n\t"
  65487. #endif
  65488. #ifdef WOLFSSL_KEIL
  65489. "adcs r4, r4, r5\n\t"
  65490. #elif defined(__clang__)
  65491. "adcs r4, r5\n\t"
  65492. #else
  65493. "adc r4, r5\n\t"
  65494. #endif
  65495. "stm %[r]!, {r3, r4}\n\t"
  65496. "ldm %[b]!, {r3, r4}\n\t"
  65497. #ifdef WOLFSSL_KEIL
  65498. "adcs r3, r3, r5\n\t"
  65499. #elif defined(__clang__)
  65500. "adcs r3, r5\n\t"
  65501. #else
  65502. "adc r3, r5\n\t"
  65503. #endif
  65504. #ifdef WOLFSSL_KEIL
  65505. "adcs r4, r4, r5\n\t"
  65506. #elif defined(__clang__)
  65507. "adcs r4, r5\n\t"
  65508. #else
  65509. "adc r4, r5\n\t"
  65510. #endif
  65511. "stm %[r]!, {r3, r4}\n\t"
  65512. "ldm %[b]!, {r3, r4}\n\t"
  65513. #ifdef WOLFSSL_KEIL
  65514. "adcs r3, r3, r5\n\t"
  65515. #elif defined(__clang__)
  65516. "adcs r3, r5\n\t"
  65517. #else
  65518. "adc r3, r5\n\t"
  65519. #endif
  65520. #ifdef WOLFSSL_KEIL
  65521. "adcs r4, r4, r5\n\t"
  65522. #elif defined(__clang__)
  65523. "adcs r4, r5\n\t"
  65524. #else
  65525. "adc r4, r5\n\t"
  65526. #endif
  65527. "stm %[r]!, {r3, r4}\n\t"
  65528. "ldm %[b]!, {r3, r4}\n\t"
  65529. #ifdef WOLFSSL_KEIL
  65530. "adcs r3, r3, r5\n\t"
  65531. #elif defined(__clang__)
  65532. "adcs r3, r5\n\t"
  65533. #else
  65534. "adc r3, r5\n\t"
  65535. #endif
  65536. #ifdef WOLFSSL_KEIL
  65537. "adcs r4, r4, r5\n\t"
  65538. #elif defined(__clang__)
  65539. "adcs r4, r5\n\t"
  65540. #else
  65541. "adc r4, r5\n\t"
  65542. #endif
  65543. "stm %[r]!, {r3, r4}\n\t"
  65544. "ldm %[b]!, {r3, r4}\n\t"
  65545. #ifdef WOLFSSL_KEIL
  65546. "adcs r3, r3, r5\n\t"
  65547. #elif defined(__clang__)
  65548. "adcs r3, r5\n\t"
  65549. #else
  65550. "adc r3, r5\n\t"
  65551. #endif
  65552. #ifdef WOLFSSL_KEIL
  65553. "adcs r4, r4, r5\n\t"
  65554. #elif defined(__clang__)
  65555. "adcs r4, r5\n\t"
  65556. #else
  65557. "adc r4, r5\n\t"
  65558. #endif
  65559. "stm %[r]!, {r3, r4}\n\t"
  65560. "ldm %[b]!, {r3, r4}\n\t"
  65561. #ifdef WOLFSSL_KEIL
  65562. "adcs r3, r3, r5\n\t"
  65563. #elif defined(__clang__)
  65564. "adcs r3, r5\n\t"
  65565. #else
  65566. "adc r3, r5\n\t"
  65567. #endif
  65568. #ifdef WOLFSSL_KEIL
  65569. "adcs r4, r4, r5\n\t"
  65570. #elif defined(__clang__)
  65571. "adcs r4, r5\n\t"
  65572. #else
  65573. "adc r4, r5\n\t"
  65574. #endif
  65575. "stm %[r]!, {r3, r4}\n\t"
  65576. "movs %[r], #0\n\t"
  65577. #ifdef WOLFSSL_KEIL
  65578. "adcs %[r], %[r], %[r]\n\t"
  65579. #elif defined(__clang__)
  65580. "adcs %[r], %[r]\n\t"
  65581. #else
  65582. "adc %[r], %[r]\n\t"
  65583. #endif
  65584. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  65585. :
  65586. : "memory", "r3", "r4", "r5"
  65587. );
  65588. return (uint32_t)(size_t)r;
  65589. }
  65590. /* Sub b from a into a. (a -= b)
  65591. *
  65592. * a A single precision integer.
  65593. * b A single precision integer.
  65594. */
  65595. SP_NOINLINE static sp_digit sp_3072_sub_in_place_24(sp_digit* a,
  65596. const sp_digit* b)
  65597. {
  65598. __asm__ __volatile__ (
  65599. "ldm %[b]!, {r4, r5}\n\t"
  65600. "ldr r2, [%[a]]\n\t"
  65601. "ldr r3, [%[a], #4]\n\t"
  65602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65603. "subs r2, r2, r4\n\t"
  65604. #else
  65605. "sub r2, r2, r4\n\t"
  65606. #endif
  65607. #ifdef WOLFSSL_KEIL
  65608. "sbcs r3, r3, r5\n\t"
  65609. #elif defined(__clang__)
  65610. "sbcs r3, r5\n\t"
  65611. #else
  65612. "sbc r3, r5\n\t"
  65613. #endif
  65614. "stm %[a]!, {r2, r3}\n\t"
  65615. "ldm %[b]!, {r4, r5}\n\t"
  65616. "ldr r2, [%[a]]\n\t"
  65617. "ldr r3, [%[a], #4]\n\t"
  65618. #ifdef WOLFSSL_KEIL
  65619. "sbcs r2, r2, r4\n\t"
  65620. #elif defined(__clang__)
  65621. "sbcs r2, r4\n\t"
  65622. #else
  65623. "sbc r2, r4\n\t"
  65624. #endif
  65625. #ifdef WOLFSSL_KEIL
  65626. "sbcs r3, r3, r5\n\t"
  65627. #elif defined(__clang__)
  65628. "sbcs r3, r5\n\t"
  65629. #else
  65630. "sbc r3, r5\n\t"
  65631. #endif
  65632. "stm %[a]!, {r2, r3}\n\t"
  65633. "ldm %[b]!, {r4, r5}\n\t"
  65634. "ldr r2, [%[a]]\n\t"
  65635. "ldr r3, [%[a], #4]\n\t"
  65636. #ifdef WOLFSSL_KEIL
  65637. "sbcs r2, r2, r4\n\t"
  65638. #elif defined(__clang__)
  65639. "sbcs r2, r4\n\t"
  65640. #else
  65641. "sbc r2, r4\n\t"
  65642. #endif
  65643. #ifdef WOLFSSL_KEIL
  65644. "sbcs r3, r3, r5\n\t"
  65645. #elif defined(__clang__)
  65646. "sbcs r3, r5\n\t"
  65647. #else
  65648. "sbc r3, r5\n\t"
  65649. #endif
  65650. "stm %[a]!, {r2, r3}\n\t"
  65651. "ldm %[b]!, {r4, r5}\n\t"
  65652. "ldr r2, [%[a]]\n\t"
  65653. "ldr r3, [%[a], #4]\n\t"
  65654. #ifdef WOLFSSL_KEIL
  65655. "sbcs r2, r2, r4\n\t"
  65656. #elif defined(__clang__)
  65657. "sbcs r2, r4\n\t"
  65658. #else
  65659. "sbc r2, r4\n\t"
  65660. #endif
  65661. #ifdef WOLFSSL_KEIL
  65662. "sbcs r3, r3, r5\n\t"
  65663. #elif defined(__clang__)
  65664. "sbcs r3, r5\n\t"
  65665. #else
  65666. "sbc r3, r5\n\t"
  65667. #endif
  65668. "stm %[a]!, {r2, r3}\n\t"
  65669. "ldm %[b]!, {r4, r5}\n\t"
  65670. "ldr r2, [%[a]]\n\t"
  65671. "ldr r3, [%[a], #4]\n\t"
  65672. #ifdef WOLFSSL_KEIL
  65673. "sbcs r2, r2, r4\n\t"
  65674. #elif defined(__clang__)
  65675. "sbcs r2, r4\n\t"
  65676. #else
  65677. "sbc r2, r4\n\t"
  65678. #endif
  65679. #ifdef WOLFSSL_KEIL
  65680. "sbcs r3, r3, r5\n\t"
  65681. #elif defined(__clang__)
  65682. "sbcs r3, r5\n\t"
  65683. #else
  65684. "sbc r3, r5\n\t"
  65685. #endif
  65686. "stm %[a]!, {r2, r3}\n\t"
  65687. "ldm %[b]!, {r4, r5}\n\t"
  65688. "ldr r2, [%[a]]\n\t"
  65689. "ldr r3, [%[a], #4]\n\t"
  65690. #ifdef WOLFSSL_KEIL
  65691. "sbcs r2, r2, r4\n\t"
  65692. #elif defined(__clang__)
  65693. "sbcs r2, r4\n\t"
  65694. #else
  65695. "sbc r2, r4\n\t"
  65696. #endif
  65697. #ifdef WOLFSSL_KEIL
  65698. "sbcs r3, r3, r5\n\t"
  65699. #elif defined(__clang__)
  65700. "sbcs r3, r5\n\t"
  65701. #else
  65702. "sbc r3, r5\n\t"
  65703. #endif
  65704. "stm %[a]!, {r2, r3}\n\t"
  65705. "ldm %[b]!, {r4, r5}\n\t"
  65706. "ldr r2, [%[a]]\n\t"
  65707. "ldr r3, [%[a], #4]\n\t"
  65708. #ifdef WOLFSSL_KEIL
  65709. "sbcs r2, r2, r4\n\t"
  65710. #elif defined(__clang__)
  65711. "sbcs r2, r4\n\t"
  65712. #else
  65713. "sbc r2, r4\n\t"
  65714. #endif
  65715. #ifdef WOLFSSL_KEIL
  65716. "sbcs r3, r3, r5\n\t"
  65717. #elif defined(__clang__)
  65718. "sbcs r3, r5\n\t"
  65719. #else
  65720. "sbc r3, r5\n\t"
  65721. #endif
  65722. "stm %[a]!, {r2, r3}\n\t"
  65723. "ldm %[b]!, {r4, r5}\n\t"
  65724. "ldr r2, [%[a]]\n\t"
  65725. "ldr r3, [%[a], #4]\n\t"
  65726. #ifdef WOLFSSL_KEIL
  65727. "sbcs r2, r2, r4\n\t"
  65728. #elif defined(__clang__)
  65729. "sbcs r2, r4\n\t"
  65730. #else
  65731. "sbc r2, r4\n\t"
  65732. #endif
  65733. #ifdef WOLFSSL_KEIL
  65734. "sbcs r3, r3, r5\n\t"
  65735. #elif defined(__clang__)
  65736. "sbcs r3, r5\n\t"
  65737. #else
  65738. "sbc r3, r5\n\t"
  65739. #endif
  65740. "stm %[a]!, {r2, r3}\n\t"
  65741. "ldm %[b]!, {r4, r5}\n\t"
  65742. "ldr r2, [%[a]]\n\t"
  65743. "ldr r3, [%[a], #4]\n\t"
  65744. #ifdef WOLFSSL_KEIL
  65745. "sbcs r2, r2, r4\n\t"
  65746. #elif defined(__clang__)
  65747. "sbcs r2, r4\n\t"
  65748. #else
  65749. "sbc r2, r4\n\t"
  65750. #endif
  65751. #ifdef WOLFSSL_KEIL
  65752. "sbcs r3, r3, r5\n\t"
  65753. #elif defined(__clang__)
  65754. "sbcs r3, r5\n\t"
  65755. #else
  65756. "sbc r3, r5\n\t"
  65757. #endif
  65758. "stm %[a]!, {r2, r3}\n\t"
  65759. "ldm %[b]!, {r4, r5}\n\t"
  65760. "ldr r2, [%[a]]\n\t"
  65761. "ldr r3, [%[a], #4]\n\t"
  65762. #ifdef WOLFSSL_KEIL
  65763. "sbcs r2, r2, r4\n\t"
  65764. #elif defined(__clang__)
  65765. "sbcs r2, r4\n\t"
  65766. #else
  65767. "sbc r2, r4\n\t"
  65768. #endif
  65769. #ifdef WOLFSSL_KEIL
  65770. "sbcs r3, r3, r5\n\t"
  65771. #elif defined(__clang__)
  65772. "sbcs r3, r5\n\t"
  65773. #else
  65774. "sbc r3, r5\n\t"
  65775. #endif
  65776. "stm %[a]!, {r2, r3}\n\t"
  65777. "ldm %[b]!, {r4, r5}\n\t"
  65778. "ldr r2, [%[a]]\n\t"
  65779. "ldr r3, [%[a], #4]\n\t"
  65780. #ifdef WOLFSSL_KEIL
  65781. "sbcs r2, r2, r4\n\t"
  65782. #elif defined(__clang__)
  65783. "sbcs r2, r4\n\t"
  65784. #else
  65785. "sbc r2, r4\n\t"
  65786. #endif
  65787. #ifdef WOLFSSL_KEIL
  65788. "sbcs r3, r3, r5\n\t"
  65789. #elif defined(__clang__)
  65790. "sbcs r3, r5\n\t"
  65791. #else
  65792. "sbc r3, r5\n\t"
  65793. #endif
  65794. "stm %[a]!, {r2, r3}\n\t"
  65795. "ldm %[b]!, {r4, r5}\n\t"
  65796. "ldr r2, [%[a]]\n\t"
  65797. "ldr r3, [%[a], #4]\n\t"
  65798. #ifdef WOLFSSL_KEIL
  65799. "sbcs r2, r2, r4\n\t"
  65800. #elif defined(__clang__)
  65801. "sbcs r2, r4\n\t"
  65802. #else
  65803. "sbc r2, r4\n\t"
  65804. #endif
  65805. #ifdef WOLFSSL_KEIL
  65806. "sbcs r3, r3, r5\n\t"
  65807. #elif defined(__clang__)
  65808. "sbcs r3, r5\n\t"
  65809. #else
  65810. "sbc r3, r5\n\t"
  65811. #endif
  65812. "stm %[a]!, {r2, r3}\n\t"
  65813. #ifdef WOLFSSL_KEIL
  65814. "sbcs %[a], %[a], %[a]\n\t"
  65815. #elif defined(__clang__)
  65816. "sbcs %[a], %[a]\n\t"
  65817. #else
  65818. "sbc %[a], %[a]\n\t"
  65819. #endif
  65820. : [a] "+r" (a), [b] "+r" (b)
  65821. :
  65822. : "memory", "r2", "r3", "r4", "r5"
  65823. );
  65824. return (uint32_t)(size_t)a;
  65825. }
  65826. /* Add b to a into r. (r = a + b)
  65827. *
  65828. * r A single precision integer.
  65829. * a A single precision integer.
  65830. * b A single precision integer.
  65831. */
  65832. SP_NOINLINE static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a,
  65833. const sp_digit* b)
  65834. {
  65835. __asm__ __volatile__ (
  65836. "ldm %[b]!, {r5, r6}\n\t"
  65837. "ldm %[a]!, {r3, r4}\n\t"
  65838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65839. "adds r3, r3, r5\n\t"
  65840. #else
  65841. "add r3, r3, r5\n\t"
  65842. #endif
  65843. #ifdef WOLFSSL_KEIL
  65844. "adcs r4, r4, r6\n\t"
  65845. #elif defined(__clang__)
  65846. "adcs r4, r6\n\t"
  65847. #else
  65848. "adc r4, r6\n\t"
  65849. #endif
  65850. "stm %[r]!, {r3, r4}\n\t"
  65851. "ldm %[b]!, {r5, r6}\n\t"
  65852. "ldm %[a]!, {r3, r4}\n\t"
  65853. #ifdef WOLFSSL_KEIL
  65854. "adcs r3, r3, r5\n\t"
  65855. #elif defined(__clang__)
  65856. "adcs r3, r5\n\t"
  65857. #else
  65858. "adc r3, r5\n\t"
  65859. #endif
  65860. #ifdef WOLFSSL_KEIL
  65861. "adcs r4, r4, r6\n\t"
  65862. #elif defined(__clang__)
  65863. "adcs r4, r6\n\t"
  65864. #else
  65865. "adc r4, r6\n\t"
  65866. #endif
  65867. "stm %[r]!, {r3, r4}\n\t"
  65868. "ldm %[b]!, {r5, r6}\n\t"
  65869. "ldm %[a]!, {r3, r4}\n\t"
  65870. #ifdef WOLFSSL_KEIL
  65871. "adcs r3, r3, r5\n\t"
  65872. #elif defined(__clang__)
  65873. "adcs r3, r5\n\t"
  65874. #else
  65875. "adc r3, r5\n\t"
  65876. #endif
  65877. #ifdef WOLFSSL_KEIL
  65878. "adcs r4, r4, r6\n\t"
  65879. #elif defined(__clang__)
  65880. "adcs r4, r6\n\t"
  65881. #else
  65882. "adc r4, r6\n\t"
  65883. #endif
  65884. "stm %[r]!, {r3, r4}\n\t"
  65885. "ldm %[b]!, {r5, r6}\n\t"
  65886. "ldm %[a]!, {r3, r4}\n\t"
  65887. #ifdef WOLFSSL_KEIL
  65888. "adcs r3, r3, r5\n\t"
  65889. #elif defined(__clang__)
  65890. "adcs r3, r5\n\t"
  65891. #else
  65892. "adc r3, r5\n\t"
  65893. #endif
  65894. #ifdef WOLFSSL_KEIL
  65895. "adcs r4, r4, r6\n\t"
  65896. #elif defined(__clang__)
  65897. "adcs r4, r6\n\t"
  65898. #else
  65899. "adc r4, r6\n\t"
  65900. #endif
  65901. "stm %[r]!, {r3, r4}\n\t"
  65902. "ldm %[b]!, {r5, r6}\n\t"
  65903. "ldm %[a]!, {r3, r4}\n\t"
  65904. #ifdef WOLFSSL_KEIL
  65905. "adcs r3, r3, r5\n\t"
  65906. #elif defined(__clang__)
  65907. "adcs r3, r5\n\t"
  65908. #else
  65909. "adc r3, r5\n\t"
  65910. #endif
  65911. #ifdef WOLFSSL_KEIL
  65912. "adcs r4, r4, r6\n\t"
  65913. #elif defined(__clang__)
  65914. "adcs r4, r6\n\t"
  65915. #else
  65916. "adc r4, r6\n\t"
  65917. #endif
  65918. "stm %[r]!, {r3, r4}\n\t"
  65919. "ldm %[b]!, {r5, r6}\n\t"
  65920. "ldm %[a]!, {r3, r4}\n\t"
  65921. #ifdef WOLFSSL_KEIL
  65922. "adcs r3, r3, r5\n\t"
  65923. #elif defined(__clang__)
  65924. "adcs r3, r5\n\t"
  65925. #else
  65926. "adc r3, r5\n\t"
  65927. #endif
  65928. #ifdef WOLFSSL_KEIL
  65929. "adcs r4, r4, r6\n\t"
  65930. #elif defined(__clang__)
  65931. "adcs r4, r6\n\t"
  65932. #else
  65933. "adc r4, r6\n\t"
  65934. #endif
  65935. "stm %[r]!, {r3, r4}\n\t"
  65936. "ldm %[b]!, {r5, r6}\n\t"
  65937. "ldm %[a]!, {r3, r4}\n\t"
  65938. #ifdef WOLFSSL_KEIL
  65939. "adcs r3, r3, r5\n\t"
  65940. #elif defined(__clang__)
  65941. "adcs r3, r5\n\t"
  65942. #else
  65943. "adc r3, r5\n\t"
  65944. #endif
  65945. #ifdef WOLFSSL_KEIL
  65946. "adcs r4, r4, r6\n\t"
  65947. #elif defined(__clang__)
  65948. "adcs r4, r6\n\t"
  65949. #else
  65950. "adc r4, r6\n\t"
  65951. #endif
  65952. "stm %[r]!, {r3, r4}\n\t"
  65953. "ldm %[b]!, {r5, r6}\n\t"
  65954. "ldm %[a]!, {r3, r4}\n\t"
  65955. #ifdef WOLFSSL_KEIL
  65956. "adcs r3, r3, r5\n\t"
  65957. #elif defined(__clang__)
  65958. "adcs r3, r5\n\t"
  65959. #else
  65960. "adc r3, r5\n\t"
  65961. #endif
  65962. #ifdef WOLFSSL_KEIL
  65963. "adcs r4, r4, r6\n\t"
  65964. #elif defined(__clang__)
  65965. "adcs r4, r6\n\t"
  65966. #else
  65967. "adc r4, r6\n\t"
  65968. #endif
  65969. "stm %[r]!, {r3, r4}\n\t"
  65970. "ldm %[b]!, {r5, r6}\n\t"
  65971. "ldm %[a]!, {r3, r4}\n\t"
  65972. #ifdef WOLFSSL_KEIL
  65973. "adcs r3, r3, r5\n\t"
  65974. #elif defined(__clang__)
  65975. "adcs r3, r5\n\t"
  65976. #else
  65977. "adc r3, r5\n\t"
  65978. #endif
  65979. #ifdef WOLFSSL_KEIL
  65980. "adcs r4, r4, r6\n\t"
  65981. #elif defined(__clang__)
  65982. "adcs r4, r6\n\t"
  65983. #else
  65984. "adc r4, r6\n\t"
  65985. #endif
  65986. "stm %[r]!, {r3, r4}\n\t"
  65987. "ldm %[b]!, {r5, r6}\n\t"
  65988. "ldm %[a]!, {r3, r4}\n\t"
  65989. #ifdef WOLFSSL_KEIL
  65990. "adcs r3, r3, r5\n\t"
  65991. #elif defined(__clang__)
  65992. "adcs r3, r5\n\t"
  65993. #else
  65994. "adc r3, r5\n\t"
  65995. #endif
  65996. #ifdef WOLFSSL_KEIL
  65997. "adcs r4, r4, r6\n\t"
  65998. #elif defined(__clang__)
  65999. "adcs r4, r6\n\t"
  66000. #else
  66001. "adc r4, r6\n\t"
  66002. #endif
  66003. "stm %[r]!, {r3, r4}\n\t"
  66004. "ldm %[b]!, {r5, r6}\n\t"
  66005. "ldm %[a]!, {r3, r4}\n\t"
  66006. #ifdef WOLFSSL_KEIL
  66007. "adcs r3, r3, r5\n\t"
  66008. #elif defined(__clang__)
  66009. "adcs r3, r5\n\t"
  66010. #else
  66011. "adc r3, r5\n\t"
  66012. #endif
  66013. #ifdef WOLFSSL_KEIL
  66014. "adcs r4, r4, r6\n\t"
  66015. #elif defined(__clang__)
  66016. "adcs r4, r6\n\t"
  66017. #else
  66018. "adc r4, r6\n\t"
  66019. #endif
  66020. "stm %[r]!, {r3, r4}\n\t"
  66021. "ldm %[b]!, {r5, r6}\n\t"
  66022. "ldm %[a]!, {r3, r4}\n\t"
  66023. #ifdef WOLFSSL_KEIL
  66024. "adcs r3, r3, r5\n\t"
  66025. #elif defined(__clang__)
  66026. "adcs r3, r5\n\t"
  66027. #else
  66028. "adc r3, r5\n\t"
  66029. #endif
  66030. #ifdef WOLFSSL_KEIL
  66031. "adcs r4, r4, r6\n\t"
  66032. #elif defined(__clang__)
  66033. "adcs r4, r6\n\t"
  66034. #else
  66035. "adc r4, r6\n\t"
  66036. #endif
  66037. "stm %[r]!, {r3, r4}\n\t"
  66038. "movs %[r], #0\n\t"
  66039. #ifdef WOLFSSL_KEIL
  66040. "adcs %[r], %[r], %[r]\n\t"
  66041. #elif defined(__clang__)
  66042. "adcs %[r], %[r]\n\t"
  66043. #else
  66044. "adc %[r], %[r]\n\t"
  66045. #endif
  66046. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  66047. :
  66048. : "memory", "r3", "r4", "r5", "r6"
  66049. );
  66050. return (uint32_t)(size_t)r;
  66051. }
  66052. /* AND m into each word of a and store in r.
  66053. *
  66054. * r A single precision integer.
  66055. * a A single precision integer.
  66056. * m Mask to AND against each digit.
  66057. */
  66058. static void sp_3072_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  66059. {
  66060. #ifdef WOLFSSL_SP_SMALL
  66061. int i;
  66062. for (i=0; i<12; i++) {
  66063. r[i] = a[i] & m;
  66064. }
  66065. #else
  66066. r[0] = a[0] & m;
  66067. r[1] = a[1] & m;
  66068. r[2] = a[2] & m;
  66069. r[3] = a[3] & m;
  66070. r[4] = a[4] & m;
  66071. r[5] = a[5] & m;
  66072. r[6] = a[6] & m;
  66073. r[7] = a[7] & m;
  66074. r[8] = a[8] & m;
  66075. r[9] = a[9] & m;
  66076. r[10] = a[10] & m;
  66077. r[11] = a[11] & m;
  66078. #endif
  66079. }
  66080. /* Multiply a and b into r. (r = a * b)
  66081. *
  66082. * r A single precision integer.
  66083. * a A single precision integer.
  66084. * b A single precision integer.
  66085. */
  66086. SP_NOINLINE static void sp_3072_mul_24(sp_digit* r, const sp_digit* a,
  66087. const sp_digit* b)
  66088. {
  66089. sp_digit* z0 = r;
  66090. sp_digit z1[24];
  66091. sp_digit a1[12];
  66092. sp_digit b1[12];
  66093. sp_digit z2[24];
  66094. sp_digit u;
  66095. sp_digit ca;
  66096. sp_digit cb;
  66097. ca = sp_3072_add_12(a1, a, &a[12]);
  66098. cb = sp_3072_add_12(b1, b, &b[12]);
  66099. u = ca & cb;
  66100. sp_3072_mul_12(z1, a1, b1);
  66101. sp_3072_mul_12(z2, &a[12], &b[12]);
  66102. sp_3072_mul_12(z0, a, b);
  66103. sp_3072_mask_12(r + 24, a1, 0 - cb);
  66104. sp_3072_mask_12(b1, b1, 0 - ca);
  66105. u += sp_3072_add_12(r + 24, r + 24, b1);
  66106. u += sp_3072_sub_in_place_24(z1, z2);
  66107. u += sp_3072_sub_in_place_24(z1, z0);
  66108. u += sp_3072_add_24(r + 12, r + 12, z1);
  66109. u += sp_3072_add_12(r + 24, r + 24, z2);
  66110. (void)sp_3072_add_to_word_12(r + 36, u, z2 + 12);
  66111. }
  66112. /* Double a into r. (r = a + a)
  66113. *
  66114. * r A single precision integer.
  66115. * a A single precision integer.
  66116. */
  66117. SP_NOINLINE static sp_digit sp_3072_dbl_12(sp_digit* r, const sp_digit* a)
  66118. {
  66119. __asm__ __volatile__ (
  66120. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  66121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66122. "adds r2, r2, r2\n\t"
  66123. #else
  66124. "add r2, r2, r2\n\t"
  66125. #endif
  66126. #ifdef WOLFSSL_KEIL
  66127. "adcs r3, r3, r3\n\t"
  66128. #elif defined(__clang__)
  66129. "adcs r3, r3\n\t"
  66130. #else
  66131. "adc r3, r3\n\t"
  66132. #endif
  66133. #ifdef WOLFSSL_KEIL
  66134. "adcs r4, r4, r4\n\t"
  66135. #elif defined(__clang__)
  66136. "adcs r4, r4\n\t"
  66137. #else
  66138. "adc r4, r4\n\t"
  66139. #endif
  66140. #ifdef WOLFSSL_KEIL
  66141. "adcs r5, r5, r5\n\t"
  66142. #elif defined(__clang__)
  66143. "adcs r5, r5\n\t"
  66144. #else
  66145. "adc r5, r5\n\t"
  66146. #endif
  66147. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  66148. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  66149. #ifdef WOLFSSL_KEIL
  66150. "adcs r2, r2, r2\n\t"
  66151. #elif defined(__clang__)
  66152. "adcs r2, r2\n\t"
  66153. #else
  66154. "adc r2, r2\n\t"
  66155. #endif
  66156. #ifdef WOLFSSL_KEIL
  66157. "adcs r3, r3, r3\n\t"
  66158. #elif defined(__clang__)
  66159. "adcs r3, r3\n\t"
  66160. #else
  66161. "adc r3, r3\n\t"
  66162. #endif
  66163. #ifdef WOLFSSL_KEIL
  66164. "adcs r4, r4, r4\n\t"
  66165. #elif defined(__clang__)
  66166. "adcs r4, r4\n\t"
  66167. #else
  66168. "adc r4, r4\n\t"
  66169. #endif
  66170. #ifdef WOLFSSL_KEIL
  66171. "adcs r5, r5, r5\n\t"
  66172. #elif defined(__clang__)
  66173. "adcs r5, r5\n\t"
  66174. #else
  66175. "adc r5, r5\n\t"
  66176. #endif
  66177. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  66178. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  66179. #ifdef WOLFSSL_KEIL
  66180. "adcs r2, r2, r2\n\t"
  66181. #elif defined(__clang__)
  66182. "adcs r2, r2\n\t"
  66183. #else
  66184. "adc r2, r2\n\t"
  66185. #endif
  66186. #ifdef WOLFSSL_KEIL
  66187. "adcs r3, r3, r3\n\t"
  66188. #elif defined(__clang__)
  66189. "adcs r3, r3\n\t"
  66190. #else
  66191. "adc r3, r3\n\t"
  66192. #endif
  66193. #ifdef WOLFSSL_KEIL
  66194. "adcs r4, r4, r4\n\t"
  66195. #elif defined(__clang__)
  66196. "adcs r4, r4\n\t"
  66197. #else
  66198. "adc r4, r4\n\t"
  66199. #endif
  66200. #ifdef WOLFSSL_KEIL
  66201. "adcs r5, r5, r5\n\t"
  66202. #elif defined(__clang__)
  66203. "adcs r5, r5\n\t"
  66204. #else
  66205. "adc r5, r5\n\t"
  66206. #endif
  66207. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  66208. "movs %[r], #0\n\t"
  66209. #ifdef WOLFSSL_KEIL
  66210. "adcs %[r], %[r], %[r]\n\t"
  66211. #elif defined(__clang__)
  66212. "adcs %[r], %[r]\n\t"
  66213. #else
  66214. "adc %[r], %[r]\n\t"
  66215. #endif
  66216. : [r] "+r" (r), [a] "+r" (a)
  66217. :
  66218. : "memory", "r2", "r3", "r4", "r5"
  66219. );
  66220. return (uint32_t)(size_t)r;
  66221. }
  66222. /* Square a and put result in r. (r = a * a)
  66223. *
  66224. * r A single precision integer.
  66225. * a A single precision integer.
  66226. */
  66227. SP_NOINLINE static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a)
  66228. {
  66229. sp_digit* z0 = r;
  66230. sp_digit z2[24];
  66231. sp_digit z1[24];
  66232. sp_digit a1[12];
  66233. sp_digit u;
  66234. u = sp_3072_add_12(a1, a, &a[12]);
  66235. sp_3072_sqr_12(z1, a1);
  66236. sp_3072_sqr_12(z2, &a[12]);
  66237. sp_3072_sqr_12(z0, a);
  66238. sp_3072_mask_12(r + 24, a1, 0 - u);
  66239. u += sp_3072_dbl_12(r + 24, r + 24);
  66240. u += sp_3072_sub_in_place_24(z1, z2);
  66241. u += sp_3072_sub_in_place_24(z1, z0);
  66242. u += sp_3072_add_24(r + 12, r + 12, z1);
  66243. u += sp_3072_add_12(r + 24, r + 24, z2);
  66244. (void)sp_3072_add_to_word_12(r + 36, u, z2 + 12);
  66245. }
  66246. /* Add b to a into r. (r = a + b)
  66247. *
  66248. * r A single precision integer.
  66249. * a A single precision integer.
  66250. * b A single precision integer.
  66251. */
  66252. SP_NOINLINE static sp_digit sp_3072_add_to_word_24(sp_digit* r, sp_digit a,
  66253. const sp_digit* b)
  66254. {
  66255. __asm__ __volatile__ (
  66256. "movs r5, #0\n\t"
  66257. "ldm %[b]!, {r3, r4}\n\t"
  66258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66259. "adds r3, r3, %[a]\n\t"
  66260. #else
  66261. "add r3, r3, %[a]\n\t"
  66262. #endif
  66263. #ifdef WOLFSSL_KEIL
  66264. "adcs r4, r4, r5\n\t"
  66265. #elif defined(__clang__)
  66266. "adcs r4, r5\n\t"
  66267. #else
  66268. "adc r4, r5\n\t"
  66269. #endif
  66270. "stm %[r]!, {r3, r4}\n\t"
  66271. "ldm %[b]!, {r3, r4}\n\t"
  66272. #ifdef WOLFSSL_KEIL
  66273. "adcs r3, r3, r5\n\t"
  66274. #elif defined(__clang__)
  66275. "adcs r3, r5\n\t"
  66276. #else
  66277. "adc r3, r5\n\t"
  66278. #endif
  66279. #ifdef WOLFSSL_KEIL
  66280. "adcs r4, r4, r5\n\t"
  66281. #elif defined(__clang__)
  66282. "adcs r4, r5\n\t"
  66283. #else
  66284. "adc r4, r5\n\t"
  66285. #endif
  66286. "stm %[r]!, {r3, r4}\n\t"
  66287. "ldm %[b]!, {r3, r4}\n\t"
  66288. #ifdef WOLFSSL_KEIL
  66289. "adcs r3, r3, r5\n\t"
  66290. #elif defined(__clang__)
  66291. "adcs r3, r5\n\t"
  66292. #else
  66293. "adc r3, r5\n\t"
  66294. #endif
  66295. #ifdef WOLFSSL_KEIL
  66296. "adcs r4, r4, r5\n\t"
  66297. #elif defined(__clang__)
  66298. "adcs r4, r5\n\t"
  66299. #else
  66300. "adc r4, r5\n\t"
  66301. #endif
  66302. "stm %[r]!, {r3, r4}\n\t"
  66303. "ldm %[b]!, {r3, r4}\n\t"
  66304. #ifdef WOLFSSL_KEIL
  66305. "adcs r3, r3, r5\n\t"
  66306. #elif defined(__clang__)
  66307. "adcs r3, r5\n\t"
  66308. #else
  66309. "adc r3, r5\n\t"
  66310. #endif
  66311. #ifdef WOLFSSL_KEIL
  66312. "adcs r4, r4, r5\n\t"
  66313. #elif defined(__clang__)
  66314. "adcs r4, r5\n\t"
  66315. #else
  66316. "adc r4, r5\n\t"
  66317. #endif
  66318. "stm %[r]!, {r3, r4}\n\t"
  66319. "ldm %[b]!, {r3, r4}\n\t"
  66320. #ifdef WOLFSSL_KEIL
  66321. "adcs r3, r3, r5\n\t"
  66322. #elif defined(__clang__)
  66323. "adcs r3, r5\n\t"
  66324. #else
  66325. "adc r3, r5\n\t"
  66326. #endif
  66327. #ifdef WOLFSSL_KEIL
  66328. "adcs r4, r4, r5\n\t"
  66329. #elif defined(__clang__)
  66330. "adcs r4, r5\n\t"
  66331. #else
  66332. "adc r4, r5\n\t"
  66333. #endif
  66334. "stm %[r]!, {r3, r4}\n\t"
  66335. "ldm %[b]!, {r3, r4}\n\t"
  66336. #ifdef WOLFSSL_KEIL
  66337. "adcs r3, r3, r5\n\t"
  66338. #elif defined(__clang__)
  66339. "adcs r3, r5\n\t"
  66340. #else
  66341. "adc r3, r5\n\t"
  66342. #endif
  66343. #ifdef WOLFSSL_KEIL
  66344. "adcs r4, r4, r5\n\t"
  66345. #elif defined(__clang__)
  66346. "adcs r4, r5\n\t"
  66347. #else
  66348. "adc r4, r5\n\t"
  66349. #endif
  66350. "stm %[r]!, {r3, r4}\n\t"
  66351. "ldm %[b]!, {r3, r4}\n\t"
  66352. #ifdef WOLFSSL_KEIL
  66353. "adcs r3, r3, r5\n\t"
  66354. #elif defined(__clang__)
  66355. "adcs r3, r5\n\t"
  66356. #else
  66357. "adc r3, r5\n\t"
  66358. #endif
  66359. #ifdef WOLFSSL_KEIL
  66360. "adcs r4, r4, r5\n\t"
  66361. #elif defined(__clang__)
  66362. "adcs r4, r5\n\t"
  66363. #else
  66364. "adc r4, r5\n\t"
  66365. #endif
  66366. "stm %[r]!, {r3, r4}\n\t"
  66367. "ldm %[b]!, {r3, r4}\n\t"
  66368. #ifdef WOLFSSL_KEIL
  66369. "adcs r3, r3, r5\n\t"
  66370. #elif defined(__clang__)
  66371. "adcs r3, r5\n\t"
  66372. #else
  66373. "adc r3, r5\n\t"
  66374. #endif
  66375. #ifdef WOLFSSL_KEIL
  66376. "adcs r4, r4, r5\n\t"
  66377. #elif defined(__clang__)
  66378. "adcs r4, r5\n\t"
  66379. #else
  66380. "adc r4, r5\n\t"
  66381. #endif
  66382. "stm %[r]!, {r3, r4}\n\t"
  66383. "ldm %[b]!, {r3, r4}\n\t"
  66384. #ifdef WOLFSSL_KEIL
  66385. "adcs r3, r3, r5\n\t"
  66386. #elif defined(__clang__)
  66387. "adcs r3, r5\n\t"
  66388. #else
  66389. "adc r3, r5\n\t"
  66390. #endif
  66391. #ifdef WOLFSSL_KEIL
  66392. "adcs r4, r4, r5\n\t"
  66393. #elif defined(__clang__)
  66394. "adcs r4, r5\n\t"
  66395. #else
  66396. "adc r4, r5\n\t"
  66397. #endif
  66398. "stm %[r]!, {r3, r4}\n\t"
  66399. "ldm %[b]!, {r3, r4}\n\t"
  66400. #ifdef WOLFSSL_KEIL
  66401. "adcs r3, r3, r5\n\t"
  66402. #elif defined(__clang__)
  66403. "adcs r3, r5\n\t"
  66404. #else
  66405. "adc r3, r5\n\t"
  66406. #endif
  66407. #ifdef WOLFSSL_KEIL
  66408. "adcs r4, r4, r5\n\t"
  66409. #elif defined(__clang__)
  66410. "adcs r4, r5\n\t"
  66411. #else
  66412. "adc r4, r5\n\t"
  66413. #endif
  66414. "stm %[r]!, {r3, r4}\n\t"
  66415. "ldm %[b]!, {r3, r4}\n\t"
  66416. #ifdef WOLFSSL_KEIL
  66417. "adcs r3, r3, r5\n\t"
  66418. #elif defined(__clang__)
  66419. "adcs r3, r5\n\t"
  66420. #else
  66421. "adc r3, r5\n\t"
  66422. #endif
  66423. #ifdef WOLFSSL_KEIL
  66424. "adcs r4, r4, r5\n\t"
  66425. #elif defined(__clang__)
  66426. "adcs r4, r5\n\t"
  66427. #else
  66428. "adc r4, r5\n\t"
  66429. #endif
  66430. "stm %[r]!, {r3, r4}\n\t"
  66431. "ldm %[b]!, {r3, r4}\n\t"
  66432. #ifdef WOLFSSL_KEIL
  66433. "adcs r3, r3, r5\n\t"
  66434. #elif defined(__clang__)
  66435. "adcs r3, r5\n\t"
  66436. #else
  66437. "adc r3, r5\n\t"
  66438. #endif
  66439. #ifdef WOLFSSL_KEIL
  66440. "adcs r4, r4, r5\n\t"
  66441. #elif defined(__clang__)
  66442. "adcs r4, r5\n\t"
  66443. #else
  66444. "adc r4, r5\n\t"
  66445. #endif
  66446. "stm %[r]!, {r3, r4}\n\t"
  66447. "movs %[r], #0\n\t"
  66448. #ifdef WOLFSSL_KEIL
  66449. "adcs %[r], %[r], %[r]\n\t"
  66450. #elif defined(__clang__)
  66451. "adcs %[r], %[r]\n\t"
  66452. #else
  66453. "adc %[r], %[r]\n\t"
  66454. #endif
  66455. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  66456. :
  66457. : "memory", "r3", "r4", "r5"
  66458. );
  66459. return (uint32_t)(size_t)r;
  66460. }
  66461. /* Sub b from a into a. (a -= b)
  66462. *
  66463. * a A single precision integer.
  66464. * b A single precision integer.
  66465. */
  66466. SP_NOINLINE static sp_digit sp_3072_sub_in_place_48(sp_digit* a,
  66467. const sp_digit* b)
  66468. {
  66469. __asm__ __volatile__ (
  66470. "ldm %[b]!, {r4, r5}\n\t"
  66471. "ldr r2, [%[a]]\n\t"
  66472. "ldr r3, [%[a], #4]\n\t"
  66473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66474. "subs r2, r2, r4\n\t"
  66475. #else
  66476. "sub r2, r2, r4\n\t"
  66477. #endif
  66478. #ifdef WOLFSSL_KEIL
  66479. "sbcs r3, r3, r5\n\t"
  66480. #elif defined(__clang__)
  66481. "sbcs r3, r5\n\t"
  66482. #else
  66483. "sbc r3, r5\n\t"
  66484. #endif
  66485. "stm %[a]!, {r2, r3}\n\t"
  66486. "ldm %[b]!, {r4, r5}\n\t"
  66487. "ldr r2, [%[a]]\n\t"
  66488. "ldr r3, [%[a], #4]\n\t"
  66489. #ifdef WOLFSSL_KEIL
  66490. "sbcs r2, r2, r4\n\t"
  66491. #elif defined(__clang__)
  66492. "sbcs r2, r4\n\t"
  66493. #else
  66494. "sbc r2, r4\n\t"
  66495. #endif
  66496. #ifdef WOLFSSL_KEIL
  66497. "sbcs r3, r3, r5\n\t"
  66498. #elif defined(__clang__)
  66499. "sbcs r3, r5\n\t"
  66500. #else
  66501. "sbc r3, r5\n\t"
  66502. #endif
  66503. "stm %[a]!, {r2, r3}\n\t"
  66504. "ldm %[b]!, {r4, r5}\n\t"
  66505. "ldr r2, [%[a]]\n\t"
  66506. "ldr r3, [%[a], #4]\n\t"
  66507. #ifdef WOLFSSL_KEIL
  66508. "sbcs r2, r2, r4\n\t"
  66509. #elif defined(__clang__)
  66510. "sbcs r2, r4\n\t"
  66511. #else
  66512. "sbc r2, r4\n\t"
  66513. #endif
  66514. #ifdef WOLFSSL_KEIL
  66515. "sbcs r3, r3, r5\n\t"
  66516. #elif defined(__clang__)
  66517. "sbcs r3, r5\n\t"
  66518. #else
  66519. "sbc r3, r5\n\t"
  66520. #endif
  66521. "stm %[a]!, {r2, r3}\n\t"
  66522. "ldm %[b]!, {r4, r5}\n\t"
  66523. "ldr r2, [%[a]]\n\t"
  66524. "ldr r3, [%[a], #4]\n\t"
  66525. #ifdef WOLFSSL_KEIL
  66526. "sbcs r2, r2, r4\n\t"
  66527. #elif defined(__clang__)
  66528. "sbcs r2, r4\n\t"
  66529. #else
  66530. "sbc r2, r4\n\t"
  66531. #endif
  66532. #ifdef WOLFSSL_KEIL
  66533. "sbcs r3, r3, r5\n\t"
  66534. #elif defined(__clang__)
  66535. "sbcs r3, r5\n\t"
  66536. #else
  66537. "sbc r3, r5\n\t"
  66538. #endif
  66539. "stm %[a]!, {r2, r3}\n\t"
  66540. "ldm %[b]!, {r4, r5}\n\t"
  66541. "ldr r2, [%[a]]\n\t"
  66542. "ldr r3, [%[a], #4]\n\t"
  66543. #ifdef WOLFSSL_KEIL
  66544. "sbcs r2, r2, r4\n\t"
  66545. #elif defined(__clang__)
  66546. "sbcs r2, r4\n\t"
  66547. #else
  66548. "sbc r2, r4\n\t"
  66549. #endif
  66550. #ifdef WOLFSSL_KEIL
  66551. "sbcs r3, r3, r5\n\t"
  66552. #elif defined(__clang__)
  66553. "sbcs r3, r5\n\t"
  66554. #else
  66555. "sbc r3, r5\n\t"
  66556. #endif
  66557. "stm %[a]!, {r2, r3}\n\t"
  66558. "ldm %[b]!, {r4, r5}\n\t"
  66559. "ldr r2, [%[a]]\n\t"
  66560. "ldr r3, [%[a], #4]\n\t"
  66561. #ifdef WOLFSSL_KEIL
  66562. "sbcs r2, r2, r4\n\t"
  66563. #elif defined(__clang__)
  66564. "sbcs r2, r4\n\t"
  66565. #else
  66566. "sbc r2, r4\n\t"
  66567. #endif
  66568. #ifdef WOLFSSL_KEIL
  66569. "sbcs r3, r3, r5\n\t"
  66570. #elif defined(__clang__)
  66571. "sbcs r3, r5\n\t"
  66572. #else
  66573. "sbc r3, r5\n\t"
  66574. #endif
  66575. "stm %[a]!, {r2, r3}\n\t"
  66576. "ldm %[b]!, {r4, r5}\n\t"
  66577. "ldr r2, [%[a]]\n\t"
  66578. "ldr r3, [%[a], #4]\n\t"
  66579. #ifdef WOLFSSL_KEIL
  66580. "sbcs r2, r2, r4\n\t"
  66581. #elif defined(__clang__)
  66582. "sbcs r2, r4\n\t"
  66583. #else
  66584. "sbc r2, r4\n\t"
  66585. #endif
  66586. #ifdef WOLFSSL_KEIL
  66587. "sbcs r3, r3, r5\n\t"
  66588. #elif defined(__clang__)
  66589. "sbcs r3, r5\n\t"
  66590. #else
  66591. "sbc r3, r5\n\t"
  66592. #endif
  66593. "stm %[a]!, {r2, r3}\n\t"
  66594. "ldm %[b]!, {r4, r5}\n\t"
  66595. "ldr r2, [%[a]]\n\t"
  66596. "ldr r3, [%[a], #4]\n\t"
  66597. #ifdef WOLFSSL_KEIL
  66598. "sbcs r2, r2, r4\n\t"
  66599. #elif defined(__clang__)
  66600. "sbcs r2, r4\n\t"
  66601. #else
  66602. "sbc r2, r4\n\t"
  66603. #endif
  66604. #ifdef WOLFSSL_KEIL
  66605. "sbcs r3, r3, r5\n\t"
  66606. #elif defined(__clang__)
  66607. "sbcs r3, r5\n\t"
  66608. #else
  66609. "sbc r3, r5\n\t"
  66610. #endif
  66611. "stm %[a]!, {r2, r3}\n\t"
  66612. "ldm %[b]!, {r4, r5}\n\t"
  66613. "ldr r2, [%[a]]\n\t"
  66614. "ldr r3, [%[a], #4]\n\t"
  66615. #ifdef WOLFSSL_KEIL
  66616. "sbcs r2, r2, r4\n\t"
  66617. #elif defined(__clang__)
  66618. "sbcs r2, r4\n\t"
  66619. #else
  66620. "sbc r2, r4\n\t"
  66621. #endif
  66622. #ifdef WOLFSSL_KEIL
  66623. "sbcs r3, r3, r5\n\t"
  66624. #elif defined(__clang__)
  66625. "sbcs r3, r5\n\t"
  66626. #else
  66627. "sbc r3, r5\n\t"
  66628. #endif
  66629. "stm %[a]!, {r2, r3}\n\t"
  66630. "ldm %[b]!, {r4, r5}\n\t"
  66631. "ldr r2, [%[a]]\n\t"
  66632. "ldr r3, [%[a], #4]\n\t"
  66633. #ifdef WOLFSSL_KEIL
  66634. "sbcs r2, r2, r4\n\t"
  66635. #elif defined(__clang__)
  66636. "sbcs r2, r4\n\t"
  66637. #else
  66638. "sbc r2, r4\n\t"
  66639. #endif
  66640. #ifdef WOLFSSL_KEIL
  66641. "sbcs r3, r3, r5\n\t"
  66642. #elif defined(__clang__)
  66643. "sbcs r3, r5\n\t"
  66644. #else
  66645. "sbc r3, r5\n\t"
  66646. #endif
  66647. "stm %[a]!, {r2, r3}\n\t"
  66648. "ldm %[b]!, {r4, r5}\n\t"
  66649. "ldr r2, [%[a]]\n\t"
  66650. "ldr r3, [%[a], #4]\n\t"
  66651. #ifdef WOLFSSL_KEIL
  66652. "sbcs r2, r2, r4\n\t"
  66653. #elif defined(__clang__)
  66654. "sbcs r2, r4\n\t"
  66655. #else
  66656. "sbc r2, r4\n\t"
  66657. #endif
  66658. #ifdef WOLFSSL_KEIL
  66659. "sbcs r3, r3, r5\n\t"
  66660. #elif defined(__clang__)
  66661. "sbcs r3, r5\n\t"
  66662. #else
  66663. "sbc r3, r5\n\t"
  66664. #endif
  66665. "stm %[a]!, {r2, r3}\n\t"
  66666. "ldm %[b]!, {r4, r5}\n\t"
  66667. "ldr r2, [%[a]]\n\t"
  66668. "ldr r3, [%[a], #4]\n\t"
  66669. #ifdef WOLFSSL_KEIL
  66670. "sbcs r2, r2, r4\n\t"
  66671. #elif defined(__clang__)
  66672. "sbcs r2, r4\n\t"
  66673. #else
  66674. "sbc r2, r4\n\t"
  66675. #endif
  66676. #ifdef WOLFSSL_KEIL
  66677. "sbcs r3, r3, r5\n\t"
  66678. #elif defined(__clang__)
  66679. "sbcs r3, r5\n\t"
  66680. #else
  66681. "sbc r3, r5\n\t"
  66682. #endif
  66683. "stm %[a]!, {r2, r3}\n\t"
  66684. "ldm %[b]!, {r4, r5}\n\t"
  66685. "ldr r2, [%[a]]\n\t"
  66686. "ldr r3, [%[a], #4]\n\t"
  66687. #ifdef WOLFSSL_KEIL
  66688. "sbcs r2, r2, r4\n\t"
  66689. #elif defined(__clang__)
  66690. "sbcs r2, r4\n\t"
  66691. #else
  66692. "sbc r2, r4\n\t"
  66693. #endif
  66694. #ifdef WOLFSSL_KEIL
  66695. "sbcs r3, r3, r5\n\t"
  66696. #elif defined(__clang__)
  66697. "sbcs r3, r5\n\t"
  66698. #else
  66699. "sbc r3, r5\n\t"
  66700. #endif
  66701. "stm %[a]!, {r2, r3}\n\t"
  66702. "ldm %[b]!, {r4, r5}\n\t"
  66703. "ldr r2, [%[a]]\n\t"
  66704. "ldr r3, [%[a], #4]\n\t"
  66705. #ifdef WOLFSSL_KEIL
  66706. "sbcs r2, r2, r4\n\t"
  66707. #elif defined(__clang__)
  66708. "sbcs r2, r4\n\t"
  66709. #else
  66710. "sbc r2, r4\n\t"
  66711. #endif
  66712. #ifdef WOLFSSL_KEIL
  66713. "sbcs r3, r3, r5\n\t"
  66714. #elif defined(__clang__)
  66715. "sbcs r3, r5\n\t"
  66716. #else
  66717. "sbc r3, r5\n\t"
  66718. #endif
  66719. "stm %[a]!, {r2, r3}\n\t"
  66720. "ldm %[b]!, {r4, r5}\n\t"
  66721. "ldr r2, [%[a]]\n\t"
  66722. "ldr r3, [%[a], #4]\n\t"
  66723. #ifdef WOLFSSL_KEIL
  66724. "sbcs r2, r2, r4\n\t"
  66725. #elif defined(__clang__)
  66726. "sbcs r2, r4\n\t"
  66727. #else
  66728. "sbc r2, r4\n\t"
  66729. #endif
  66730. #ifdef WOLFSSL_KEIL
  66731. "sbcs r3, r3, r5\n\t"
  66732. #elif defined(__clang__)
  66733. "sbcs r3, r5\n\t"
  66734. #else
  66735. "sbc r3, r5\n\t"
  66736. #endif
  66737. "stm %[a]!, {r2, r3}\n\t"
  66738. "ldm %[b]!, {r4, r5}\n\t"
  66739. "ldr r2, [%[a]]\n\t"
  66740. "ldr r3, [%[a], #4]\n\t"
  66741. #ifdef WOLFSSL_KEIL
  66742. "sbcs r2, r2, r4\n\t"
  66743. #elif defined(__clang__)
  66744. "sbcs r2, r4\n\t"
  66745. #else
  66746. "sbc r2, r4\n\t"
  66747. #endif
  66748. #ifdef WOLFSSL_KEIL
  66749. "sbcs r3, r3, r5\n\t"
  66750. #elif defined(__clang__)
  66751. "sbcs r3, r5\n\t"
  66752. #else
  66753. "sbc r3, r5\n\t"
  66754. #endif
  66755. "stm %[a]!, {r2, r3}\n\t"
  66756. "ldm %[b]!, {r4, r5}\n\t"
  66757. "ldr r2, [%[a]]\n\t"
  66758. "ldr r3, [%[a], #4]\n\t"
  66759. #ifdef WOLFSSL_KEIL
  66760. "sbcs r2, r2, r4\n\t"
  66761. #elif defined(__clang__)
  66762. "sbcs r2, r4\n\t"
  66763. #else
  66764. "sbc r2, r4\n\t"
  66765. #endif
  66766. #ifdef WOLFSSL_KEIL
  66767. "sbcs r3, r3, r5\n\t"
  66768. #elif defined(__clang__)
  66769. "sbcs r3, r5\n\t"
  66770. #else
  66771. "sbc r3, r5\n\t"
  66772. #endif
  66773. "stm %[a]!, {r2, r3}\n\t"
  66774. "ldm %[b]!, {r4, r5}\n\t"
  66775. "ldr r2, [%[a]]\n\t"
  66776. "ldr r3, [%[a], #4]\n\t"
  66777. #ifdef WOLFSSL_KEIL
  66778. "sbcs r2, r2, r4\n\t"
  66779. #elif defined(__clang__)
  66780. "sbcs r2, r4\n\t"
  66781. #else
  66782. "sbc r2, r4\n\t"
  66783. #endif
  66784. #ifdef WOLFSSL_KEIL
  66785. "sbcs r3, r3, r5\n\t"
  66786. #elif defined(__clang__)
  66787. "sbcs r3, r5\n\t"
  66788. #else
  66789. "sbc r3, r5\n\t"
  66790. #endif
  66791. "stm %[a]!, {r2, r3}\n\t"
  66792. "ldm %[b]!, {r4, r5}\n\t"
  66793. "ldr r2, [%[a]]\n\t"
  66794. "ldr r3, [%[a], #4]\n\t"
  66795. #ifdef WOLFSSL_KEIL
  66796. "sbcs r2, r2, r4\n\t"
  66797. #elif defined(__clang__)
  66798. "sbcs r2, r4\n\t"
  66799. #else
  66800. "sbc r2, r4\n\t"
  66801. #endif
  66802. #ifdef WOLFSSL_KEIL
  66803. "sbcs r3, r3, r5\n\t"
  66804. #elif defined(__clang__)
  66805. "sbcs r3, r5\n\t"
  66806. #else
  66807. "sbc r3, r5\n\t"
  66808. #endif
  66809. "stm %[a]!, {r2, r3}\n\t"
  66810. "ldm %[b]!, {r4, r5}\n\t"
  66811. "ldr r2, [%[a]]\n\t"
  66812. "ldr r3, [%[a], #4]\n\t"
  66813. #ifdef WOLFSSL_KEIL
  66814. "sbcs r2, r2, r4\n\t"
  66815. #elif defined(__clang__)
  66816. "sbcs r2, r4\n\t"
  66817. #else
  66818. "sbc r2, r4\n\t"
  66819. #endif
  66820. #ifdef WOLFSSL_KEIL
  66821. "sbcs r3, r3, r5\n\t"
  66822. #elif defined(__clang__)
  66823. "sbcs r3, r5\n\t"
  66824. #else
  66825. "sbc r3, r5\n\t"
  66826. #endif
  66827. "stm %[a]!, {r2, r3}\n\t"
  66828. "ldm %[b]!, {r4, r5}\n\t"
  66829. "ldr r2, [%[a]]\n\t"
  66830. "ldr r3, [%[a], #4]\n\t"
  66831. #ifdef WOLFSSL_KEIL
  66832. "sbcs r2, r2, r4\n\t"
  66833. #elif defined(__clang__)
  66834. "sbcs r2, r4\n\t"
  66835. #else
  66836. "sbc r2, r4\n\t"
  66837. #endif
  66838. #ifdef WOLFSSL_KEIL
  66839. "sbcs r3, r3, r5\n\t"
  66840. #elif defined(__clang__)
  66841. "sbcs r3, r5\n\t"
  66842. #else
  66843. "sbc r3, r5\n\t"
  66844. #endif
  66845. "stm %[a]!, {r2, r3}\n\t"
  66846. "ldm %[b]!, {r4, r5}\n\t"
  66847. "ldr r2, [%[a]]\n\t"
  66848. "ldr r3, [%[a], #4]\n\t"
  66849. #ifdef WOLFSSL_KEIL
  66850. "sbcs r2, r2, r4\n\t"
  66851. #elif defined(__clang__)
  66852. "sbcs r2, r4\n\t"
  66853. #else
  66854. "sbc r2, r4\n\t"
  66855. #endif
  66856. #ifdef WOLFSSL_KEIL
  66857. "sbcs r3, r3, r5\n\t"
  66858. #elif defined(__clang__)
  66859. "sbcs r3, r5\n\t"
  66860. #else
  66861. "sbc r3, r5\n\t"
  66862. #endif
  66863. "stm %[a]!, {r2, r3}\n\t"
  66864. "ldm %[b]!, {r4, r5}\n\t"
  66865. "ldr r2, [%[a]]\n\t"
  66866. "ldr r3, [%[a], #4]\n\t"
  66867. #ifdef WOLFSSL_KEIL
  66868. "sbcs r2, r2, r4\n\t"
  66869. #elif defined(__clang__)
  66870. "sbcs r2, r4\n\t"
  66871. #else
  66872. "sbc r2, r4\n\t"
  66873. #endif
  66874. #ifdef WOLFSSL_KEIL
  66875. "sbcs r3, r3, r5\n\t"
  66876. #elif defined(__clang__)
  66877. "sbcs r3, r5\n\t"
  66878. #else
  66879. "sbc r3, r5\n\t"
  66880. #endif
  66881. "stm %[a]!, {r2, r3}\n\t"
  66882. "ldm %[b]!, {r4, r5}\n\t"
  66883. "ldr r2, [%[a]]\n\t"
  66884. "ldr r3, [%[a], #4]\n\t"
  66885. #ifdef WOLFSSL_KEIL
  66886. "sbcs r2, r2, r4\n\t"
  66887. #elif defined(__clang__)
  66888. "sbcs r2, r4\n\t"
  66889. #else
  66890. "sbc r2, r4\n\t"
  66891. #endif
  66892. #ifdef WOLFSSL_KEIL
  66893. "sbcs r3, r3, r5\n\t"
  66894. #elif defined(__clang__)
  66895. "sbcs r3, r5\n\t"
  66896. #else
  66897. "sbc r3, r5\n\t"
  66898. #endif
  66899. "stm %[a]!, {r2, r3}\n\t"
  66900. #ifdef WOLFSSL_KEIL
  66901. "sbcs %[a], %[a], %[a]\n\t"
  66902. #elif defined(__clang__)
  66903. "sbcs %[a], %[a]\n\t"
  66904. #else
  66905. "sbc %[a], %[a]\n\t"
  66906. #endif
  66907. : [a] "+r" (a), [b] "+r" (b)
  66908. :
  66909. : "memory", "r2", "r3", "r4", "r5"
  66910. );
  66911. return (uint32_t)(size_t)a;
  66912. }
  66913. /* Add b to a into r. (r = a + b)
  66914. *
  66915. * r A single precision integer.
  66916. * a A single precision integer.
  66917. * b A single precision integer.
  66918. */
  66919. SP_NOINLINE static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
  66920. const sp_digit* b)
  66921. {
  66922. __asm__ __volatile__ (
  66923. "ldm %[b]!, {r5, r6}\n\t"
  66924. "ldm %[a]!, {r3, r4}\n\t"
  66925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66926. "adds r3, r3, r5\n\t"
  66927. #else
  66928. "add r3, r3, r5\n\t"
  66929. #endif
  66930. #ifdef WOLFSSL_KEIL
  66931. "adcs r4, r4, r6\n\t"
  66932. #elif defined(__clang__)
  66933. "adcs r4, r6\n\t"
  66934. #else
  66935. "adc r4, r6\n\t"
  66936. #endif
  66937. "stm %[r]!, {r3, r4}\n\t"
  66938. "ldm %[b]!, {r5, r6}\n\t"
  66939. "ldm %[a]!, {r3, r4}\n\t"
  66940. #ifdef WOLFSSL_KEIL
  66941. "adcs r3, r3, r5\n\t"
  66942. #elif defined(__clang__)
  66943. "adcs r3, r5\n\t"
  66944. #else
  66945. "adc r3, r5\n\t"
  66946. #endif
  66947. #ifdef WOLFSSL_KEIL
  66948. "adcs r4, r4, r6\n\t"
  66949. #elif defined(__clang__)
  66950. "adcs r4, r6\n\t"
  66951. #else
  66952. "adc r4, r6\n\t"
  66953. #endif
  66954. "stm %[r]!, {r3, r4}\n\t"
  66955. "ldm %[b]!, {r5, r6}\n\t"
  66956. "ldm %[a]!, {r3, r4}\n\t"
  66957. #ifdef WOLFSSL_KEIL
  66958. "adcs r3, r3, r5\n\t"
  66959. #elif defined(__clang__)
  66960. "adcs r3, r5\n\t"
  66961. #else
  66962. "adc r3, r5\n\t"
  66963. #endif
  66964. #ifdef WOLFSSL_KEIL
  66965. "adcs r4, r4, r6\n\t"
  66966. #elif defined(__clang__)
  66967. "adcs r4, r6\n\t"
  66968. #else
  66969. "adc r4, r6\n\t"
  66970. #endif
  66971. "stm %[r]!, {r3, r4}\n\t"
  66972. "ldm %[b]!, {r5, r6}\n\t"
  66973. "ldm %[a]!, {r3, r4}\n\t"
  66974. #ifdef WOLFSSL_KEIL
  66975. "adcs r3, r3, r5\n\t"
  66976. #elif defined(__clang__)
  66977. "adcs r3, r5\n\t"
  66978. #else
  66979. "adc r3, r5\n\t"
  66980. #endif
  66981. #ifdef WOLFSSL_KEIL
  66982. "adcs r4, r4, r6\n\t"
  66983. #elif defined(__clang__)
  66984. "adcs r4, r6\n\t"
  66985. #else
  66986. "adc r4, r6\n\t"
  66987. #endif
  66988. "stm %[r]!, {r3, r4}\n\t"
  66989. "ldm %[b]!, {r5, r6}\n\t"
  66990. "ldm %[a]!, {r3, r4}\n\t"
  66991. #ifdef WOLFSSL_KEIL
  66992. "adcs r3, r3, r5\n\t"
  66993. #elif defined(__clang__)
  66994. "adcs r3, r5\n\t"
  66995. #else
  66996. "adc r3, r5\n\t"
  66997. #endif
  66998. #ifdef WOLFSSL_KEIL
  66999. "adcs r4, r4, r6\n\t"
  67000. #elif defined(__clang__)
  67001. "adcs r4, r6\n\t"
  67002. #else
  67003. "adc r4, r6\n\t"
  67004. #endif
  67005. "stm %[r]!, {r3, r4}\n\t"
  67006. "ldm %[b]!, {r5, r6}\n\t"
  67007. "ldm %[a]!, {r3, r4}\n\t"
  67008. #ifdef WOLFSSL_KEIL
  67009. "adcs r3, r3, r5\n\t"
  67010. #elif defined(__clang__)
  67011. "adcs r3, r5\n\t"
  67012. #else
  67013. "adc r3, r5\n\t"
  67014. #endif
  67015. #ifdef WOLFSSL_KEIL
  67016. "adcs r4, r4, r6\n\t"
  67017. #elif defined(__clang__)
  67018. "adcs r4, r6\n\t"
  67019. #else
  67020. "adc r4, r6\n\t"
  67021. #endif
  67022. "stm %[r]!, {r3, r4}\n\t"
  67023. "ldm %[b]!, {r5, r6}\n\t"
  67024. "ldm %[a]!, {r3, r4}\n\t"
  67025. #ifdef WOLFSSL_KEIL
  67026. "adcs r3, r3, r5\n\t"
  67027. #elif defined(__clang__)
  67028. "adcs r3, r5\n\t"
  67029. #else
  67030. "adc r3, r5\n\t"
  67031. #endif
  67032. #ifdef WOLFSSL_KEIL
  67033. "adcs r4, r4, r6\n\t"
  67034. #elif defined(__clang__)
  67035. "adcs r4, r6\n\t"
  67036. #else
  67037. "adc r4, r6\n\t"
  67038. #endif
  67039. "stm %[r]!, {r3, r4}\n\t"
  67040. "ldm %[b]!, {r5, r6}\n\t"
  67041. "ldm %[a]!, {r3, r4}\n\t"
  67042. #ifdef WOLFSSL_KEIL
  67043. "adcs r3, r3, r5\n\t"
  67044. #elif defined(__clang__)
  67045. "adcs r3, r5\n\t"
  67046. #else
  67047. "adc r3, r5\n\t"
  67048. #endif
  67049. #ifdef WOLFSSL_KEIL
  67050. "adcs r4, r4, r6\n\t"
  67051. #elif defined(__clang__)
  67052. "adcs r4, r6\n\t"
  67053. #else
  67054. "adc r4, r6\n\t"
  67055. #endif
  67056. "stm %[r]!, {r3, r4}\n\t"
  67057. "ldm %[b]!, {r5, r6}\n\t"
  67058. "ldm %[a]!, {r3, r4}\n\t"
  67059. #ifdef WOLFSSL_KEIL
  67060. "adcs r3, r3, r5\n\t"
  67061. #elif defined(__clang__)
  67062. "adcs r3, r5\n\t"
  67063. #else
  67064. "adc r3, r5\n\t"
  67065. #endif
  67066. #ifdef WOLFSSL_KEIL
  67067. "adcs r4, r4, r6\n\t"
  67068. #elif defined(__clang__)
  67069. "adcs r4, r6\n\t"
  67070. #else
  67071. "adc r4, r6\n\t"
  67072. #endif
  67073. "stm %[r]!, {r3, r4}\n\t"
  67074. "ldm %[b]!, {r5, r6}\n\t"
  67075. "ldm %[a]!, {r3, r4}\n\t"
  67076. #ifdef WOLFSSL_KEIL
  67077. "adcs r3, r3, r5\n\t"
  67078. #elif defined(__clang__)
  67079. "adcs r3, r5\n\t"
  67080. #else
  67081. "adc r3, r5\n\t"
  67082. #endif
  67083. #ifdef WOLFSSL_KEIL
  67084. "adcs r4, r4, r6\n\t"
  67085. #elif defined(__clang__)
  67086. "adcs r4, r6\n\t"
  67087. #else
  67088. "adc r4, r6\n\t"
  67089. #endif
  67090. "stm %[r]!, {r3, r4}\n\t"
  67091. "ldm %[b]!, {r5, r6}\n\t"
  67092. "ldm %[a]!, {r3, r4}\n\t"
  67093. #ifdef WOLFSSL_KEIL
  67094. "adcs r3, r3, r5\n\t"
  67095. #elif defined(__clang__)
  67096. "adcs r3, r5\n\t"
  67097. #else
  67098. "adc r3, r5\n\t"
  67099. #endif
  67100. #ifdef WOLFSSL_KEIL
  67101. "adcs r4, r4, r6\n\t"
  67102. #elif defined(__clang__)
  67103. "adcs r4, r6\n\t"
  67104. #else
  67105. "adc r4, r6\n\t"
  67106. #endif
  67107. "stm %[r]!, {r3, r4}\n\t"
  67108. "ldm %[b]!, {r5, r6}\n\t"
  67109. "ldm %[a]!, {r3, r4}\n\t"
  67110. #ifdef WOLFSSL_KEIL
  67111. "adcs r3, r3, r5\n\t"
  67112. #elif defined(__clang__)
  67113. "adcs r3, r5\n\t"
  67114. #else
  67115. "adc r3, r5\n\t"
  67116. #endif
  67117. #ifdef WOLFSSL_KEIL
  67118. "adcs r4, r4, r6\n\t"
  67119. #elif defined(__clang__)
  67120. "adcs r4, r6\n\t"
  67121. #else
  67122. "adc r4, r6\n\t"
  67123. #endif
  67124. "stm %[r]!, {r3, r4}\n\t"
  67125. "ldm %[b]!, {r5, r6}\n\t"
  67126. "ldm %[a]!, {r3, r4}\n\t"
  67127. #ifdef WOLFSSL_KEIL
  67128. "adcs r3, r3, r5\n\t"
  67129. #elif defined(__clang__)
  67130. "adcs r3, r5\n\t"
  67131. #else
  67132. "adc r3, r5\n\t"
  67133. #endif
  67134. #ifdef WOLFSSL_KEIL
  67135. "adcs r4, r4, r6\n\t"
  67136. #elif defined(__clang__)
  67137. "adcs r4, r6\n\t"
  67138. #else
  67139. "adc r4, r6\n\t"
  67140. #endif
  67141. "stm %[r]!, {r3, r4}\n\t"
  67142. "ldm %[b]!, {r5, r6}\n\t"
  67143. "ldm %[a]!, {r3, r4}\n\t"
  67144. #ifdef WOLFSSL_KEIL
  67145. "adcs r3, r3, r5\n\t"
  67146. #elif defined(__clang__)
  67147. "adcs r3, r5\n\t"
  67148. #else
  67149. "adc r3, r5\n\t"
  67150. #endif
  67151. #ifdef WOLFSSL_KEIL
  67152. "adcs r4, r4, r6\n\t"
  67153. #elif defined(__clang__)
  67154. "adcs r4, r6\n\t"
  67155. #else
  67156. "adc r4, r6\n\t"
  67157. #endif
  67158. "stm %[r]!, {r3, r4}\n\t"
  67159. "ldm %[b]!, {r5, r6}\n\t"
  67160. "ldm %[a]!, {r3, r4}\n\t"
  67161. #ifdef WOLFSSL_KEIL
  67162. "adcs r3, r3, r5\n\t"
  67163. #elif defined(__clang__)
  67164. "adcs r3, r5\n\t"
  67165. #else
  67166. "adc r3, r5\n\t"
  67167. #endif
  67168. #ifdef WOLFSSL_KEIL
  67169. "adcs r4, r4, r6\n\t"
  67170. #elif defined(__clang__)
  67171. "adcs r4, r6\n\t"
  67172. #else
  67173. "adc r4, r6\n\t"
  67174. #endif
  67175. "stm %[r]!, {r3, r4}\n\t"
  67176. "ldm %[b]!, {r5, r6}\n\t"
  67177. "ldm %[a]!, {r3, r4}\n\t"
  67178. #ifdef WOLFSSL_KEIL
  67179. "adcs r3, r3, r5\n\t"
  67180. #elif defined(__clang__)
  67181. "adcs r3, r5\n\t"
  67182. #else
  67183. "adc r3, r5\n\t"
  67184. #endif
  67185. #ifdef WOLFSSL_KEIL
  67186. "adcs r4, r4, r6\n\t"
  67187. #elif defined(__clang__)
  67188. "adcs r4, r6\n\t"
  67189. #else
  67190. "adc r4, r6\n\t"
  67191. #endif
  67192. "stm %[r]!, {r3, r4}\n\t"
  67193. "ldm %[b]!, {r5, r6}\n\t"
  67194. "ldm %[a]!, {r3, r4}\n\t"
  67195. #ifdef WOLFSSL_KEIL
  67196. "adcs r3, r3, r5\n\t"
  67197. #elif defined(__clang__)
  67198. "adcs r3, r5\n\t"
  67199. #else
  67200. "adc r3, r5\n\t"
  67201. #endif
  67202. #ifdef WOLFSSL_KEIL
  67203. "adcs r4, r4, r6\n\t"
  67204. #elif defined(__clang__)
  67205. "adcs r4, r6\n\t"
  67206. #else
  67207. "adc r4, r6\n\t"
  67208. #endif
  67209. "stm %[r]!, {r3, r4}\n\t"
  67210. "ldm %[b]!, {r5, r6}\n\t"
  67211. "ldm %[a]!, {r3, r4}\n\t"
  67212. #ifdef WOLFSSL_KEIL
  67213. "adcs r3, r3, r5\n\t"
  67214. #elif defined(__clang__)
  67215. "adcs r3, r5\n\t"
  67216. #else
  67217. "adc r3, r5\n\t"
  67218. #endif
  67219. #ifdef WOLFSSL_KEIL
  67220. "adcs r4, r4, r6\n\t"
  67221. #elif defined(__clang__)
  67222. "adcs r4, r6\n\t"
  67223. #else
  67224. "adc r4, r6\n\t"
  67225. #endif
  67226. "stm %[r]!, {r3, r4}\n\t"
  67227. "ldm %[b]!, {r5, r6}\n\t"
  67228. "ldm %[a]!, {r3, r4}\n\t"
  67229. #ifdef WOLFSSL_KEIL
  67230. "adcs r3, r3, r5\n\t"
  67231. #elif defined(__clang__)
  67232. "adcs r3, r5\n\t"
  67233. #else
  67234. "adc r3, r5\n\t"
  67235. #endif
  67236. #ifdef WOLFSSL_KEIL
  67237. "adcs r4, r4, r6\n\t"
  67238. #elif defined(__clang__)
  67239. "adcs r4, r6\n\t"
  67240. #else
  67241. "adc r4, r6\n\t"
  67242. #endif
  67243. "stm %[r]!, {r3, r4}\n\t"
  67244. "ldm %[b]!, {r5, r6}\n\t"
  67245. "ldm %[a]!, {r3, r4}\n\t"
  67246. #ifdef WOLFSSL_KEIL
  67247. "adcs r3, r3, r5\n\t"
  67248. #elif defined(__clang__)
  67249. "adcs r3, r5\n\t"
  67250. #else
  67251. "adc r3, r5\n\t"
  67252. #endif
  67253. #ifdef WOLFSSL_KEIL
  67254. "adcs r4, r4, r6\n\t"
  67255. #elif defined(__clang__)
  67256. "adcs r4, r6\n\t"
  67257. #else
  67258. "adc r4, r6\n\t"
  67259. #endif
  67260. "stm %[r]!, {r3, r4}\n\t"
  67261. "ldm %[b]!, {r5, r6}\n\t"
  67262. "ldm %[a]!, {r3, r4}\n\t"
  67263. #ifdef WOLFSSL_KEIL
  67264. "adcs r3, r3, r5\n\t"
  67265. #elif defined(__clang__)
  67266. "adcs r3, r5\n\t"
  67267. #else
  67268. "adc r3, r5\n\t"
  67269. #endif
  67270. #ifdef WOLFSSL_KEIL
  67271. "adcs r4, r4, r6\n\t"
  67272. #elif defined(__clang__)
  67273. "adcs r4, r6\n\t"
  67274. #else
  67275. "adc r4, r6\n\t"
  67276. #endif
  67277. "stm %[r]!, {r3, r4}\n\t"
  67278. "ldm %[b]!, {r5, r6}\n\t"
  67279. "ldm %[a]!, {r3, r4}\n\t"
  67280. #ifdef WOLFSSL_KEIL
  67281. "adcs r3, r3, r5\n\t"
  67282. #elif defined(__clang__)
  67283. "adcs r3, r5\n\t"
  67284. #else
  67285. "adc r3, r5\n\t"
  67286. #endif
  67287. #ifdef WOLFSSL_KEIL
  67288. "adcs r4, r4, r6\n\t"
  67289. #elif defined(__clang__)
  67290. "adcs r4, r6\n\t"
  67291. #else
  67292. "adc r4, r6\n\t"
  67293. #endif
  67294. "stm %[r]!, {r3, r4}\n\t"
  67295. "ldm %[b]!, {r5, r6}\n\t"
  67296. "ldm %[a]!, {r3, r4}\n\t"
  67297. #ifdef WOLFSSL_KEIL
  67298. "adcs r3, r3, r5\n\t"
  67299. #elif defined(__clang__)
  67300. "adcs r3, r5\n\t"
  67301. #else
  67302. "adc r3, r5\n\t"
  67303. #endif
  67304. #ifdef WOLFSSL_KEIL
  67305. "adcs r4, r4, r6\n\t"
  67306. #elif defined(__clang__)
  67307. "adcs r4, r6\n\t"
  67308. #else
  67309. "adc r4, r6\n\t"
  67310. #endif
  67311. "stm %[r]!, {r3, r4}\n\t"
  67312. "ldm %[b]!, {r5, r6}\n\t"
  67313. "ldm %[a]!, {r3, r4}\n\t"
  67314. #ifdef WOLFSSL_KEIL
  67315. "adcs r3, r3, r5\n\t"
  67316. #elif defined(__clang__)
  67317. "adcs r3, r5\n\t"
  67318. #else
  67319. "adc r3, r5\n\t"
  67320. #endif
  67321. #ifdef WOLFSSL_KEIL
  67322. "adcs r4, r4, r6\n\t"
  67323. #elif defined(__clang__)
  67324. "adcs r4, r6\n\t"
  67325. #else
  67326. "adc r4, r6\n\t"
  67327. #endif
  67328. "stm %[r]!, {r3, r4}\n\t"
  67329. "movs %[r], #0\n\t"
  67330. #ifdef WOLFSSL_KEIL
  67331. "adcs %[r], %[r], %[r]\n\t"
  67332. #elif defined(__clang__)
  67333. "adcs %[r], %[r]\n\t"
  67334. #else
  67335. "adc %[r], %[r]\n\t"
  67336. #endif
  67337. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  67338. :
  67339. : "memory", "r3", "r4", "r5", "r6"
  67340. );
  67341. return (uint32_t)(size_t)r;
  67342. }
  67343. /* AND m into each word of a and store in r.
  67344. *
  67345. * r A single precision integer.
  67346. * a A single precision integer.
  67347. * m Mask to AND against each digit.
  67348. */
  67349. static void sp_3072_mask_24(sp_digit* r, const sp_digit* a, sp_digit m)
  67350. {
  67351. #ifdef WOLFSSL_SP_SMALL
  67352. int i;
  67353. for (i=0; i<24; i++) {
  67354. r[i] = a[i] & m;
  67355. }
  67356. #else
  67357. int i;
  67358. for (i = 0; i < 24; i += 8) {
  67359. r[i+0] = a[i+0] & m;
  67360. r[i+1] = a[i+1] & m;
  67361. r[i+2] = a[i+2] & m;
  67362. r[i+3] = a[i+3] & m;
  67363. r[i+4] = a[i+4] & m;
  67364. r[i+5] = a[i+5] & m;
  67365. r[i+6] = a[i+6] & m;
  67366. r[i+7] = a[i+7] & m;
  67367. }
  67368. #endif
  67369. }
  67370. /* Multiply a and b into r. (r = a * b)
  67371. *
  67372. * r A single precision integer.
  67373. * a A single precision integer.
  67374. * b A single precision integer.
  67375. */
  67376. SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
  67377. const sp_digit* b)
  67378. {
  67379. sp_digit* z0 = r;
  67380. sp_digit z1[48];
  67381. sp_digit a1[24];
  67382. sp_digit b1[24];
  67383. sp_digit z2[48];
  67384. sp_digit u;
  67385. sp_digit ca;
  67386. sp_digit cb;
  67387. ca = sp_3072_add_24(a1, a, &a[24]);
  67388. cb = sp_3072_add_24(b1, b, &b[24]);
  67389. u = ca & cb;
  67390. sp_3072_mul_24(z1, a1, b1);
  67391. sp_3072_mul_24(z2, &a[24], &b[24]);
  67392. sp_3072_mul_24(z0, a, b);
  67393. sp_3072_mask_24(r + 48, a1, 0 - cb);
  67394. sp_3072_mask_24(b1, b1, 0 - ca);
  67395. u += sp_3072_add_24(r + 48, r + 48, b1);
  67396. u += sp_3072_sub_in_place_48(z1, z2);
  67397. u += sp_3072_sub_in_place_48(z1, z0);
  67398. u += sp_3072_add_48(r + 24, r + 24, z1);
  67399. u += sp_3072_add_24(r + 48, r + 48, z2);
  67400. (void)sp_3072_add_to_word_24(r + 72, u, z2 + 24);
  67401. }
  67402. /* Double a into r. (r = a + a)
  67403. *
  67404. * r A single precision integer.
  67405. * a A single precision integer.
  67406. */
  67407. SP_NOINLINE static sp_digit sp_3072_dbl_24(sp_digit* r, const sp_digit* a)
  67408. {
  67409. __asm__ __volatile__ (
  67410. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  67411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67412. "adds r2, r2, r2\n\t"
  67413. #else
  67414. "add r2, r2, r2\n\t"
  67415. #endif
  67416. #ifdef WOLFSSL_KEIL
  67417. "adcs r3, r3, r3\n\t"
  67418. #elif defined(__clang__)
  67419. "adcs r3, r3\n\t"
  67420. #else
  67421. "adc r3, r3\n\t"
  67422. #endif
  67423. #ifdef WOLFSSL_KEIL
  67424. "adcs r4, r4, r4\n\t"
  67425. #elif defined(__clang__)
  67426. "adcs r4, r4\n\t"
  67427. #else
  67428. "adc r4, r4\n\t"
  67429. #endif
  67430. #ifdef WOLFSSL_KEIL
  67431. "adcs r5, r5, r5\n\t"
  67432. #elif defined(__clang__)
  67433. "adcs r5, r5\n\t"
  67434. #else
  67435. "adc r5, r5\n\t"
  67436. #endif
  67437. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  67438. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  67439. #ifdef WOLFSSL_KEIL
  67440. "adcs r2, r2, r2\n\t"
  67441. #elif defined(__clang__)
  67442. "adcs r2, r2\n\t"
  67443. #else
  67444. "adc r2, r2\n\t"
  67445. #endif
  67446. #ifdef WOLFSSL_KEIL
  67447. "adcs r3, r3, r3\n\t"
  67448. #elif defined(__clang__)
  67449. "adcs r3, r3\n\t"
  67450. #else
  67451. "adc r3, r3\n\t"
  67452. #endif
  67453. #ifdef WOLFSSL_KEIL
  67454. "adcs r4, r4, r4\n\t"
  67455. #elif defined(__clang__)
  67456. "adcs r4, r4\n\t"
  67457. #else
  67458. "adc r4, r4\n\t"
  67459. #endif
  67460. #ifdef WOLFSSL_KEIL
  67461. "adcs r5, r5, r5\n\t"
  67462. #elif defined(__clang__)
  67463. "adcs r5, r5\n\t"
  67464. #else
  67465. "adc r5, r5\n\t"
  67466. #endif
  67467. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  67468. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  67469. #ifdef WOLFSSL_KEIL
  67470. "adcs r2, r2, r2\n\t"
  67471. #elif defined(__clang__)
  67472. "adcs r2, r2\n\t"
  67473. #else
  67474. "adc r2, r2\n\t"
  67475. #endif
  67476. #ifdef WOLFSSL_KEIL
  67477. "adcs r3, r3, r3\n\t"
  67478. #elif defined(__clang__)
  67479. "adcs r3, r3\n\t"
  67480. #else
  67481. "adc r3, r3\n\t"
  67482. #endif
  67483. #ifdef WOLFSSL_KEIL
  67484. "adcs r4, r4, r4\n\t"
  67485. #elif defined(__clang__)
  67486. "adcs r4, r4\n\t"
  67487. #else
  67488. "adc r4, r4\n\t"
  67489. #endif
  67490. #ifdef WOLFSSL_KEIL
  67491. "adcs r5, r5, r5\n\t"
  67492. #elif defined(__clang__)
  67493. "adcs r5, r5\n\t"
  67494. #else
  67495. "adc r5, r5\n\t"
  67496. #endif
  67497. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  67498. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  67499. #ifdef WOLFSSL_KEIL
  67500. "adcs r2, r2, r2\n\t"
  67501. #elif defined(__clang__)
  67502. "adcs r2, r2\n\t"
  67503. #else
  67504. "adc r2, r2\n\t"
  67505. #endif
  67506. #ifdef WOLFSSL_KEIL
  67507. "adcs r3, r3, r3\n\t"
  67508. #elif defined(__clang__)
  67509. "adcs r3, r3\n\t"
  67510. #else
  67511. "adc r3, r3\n\t"
  67512. #endif
  67513. #ifdef WOLFSSL_KEIL
  67514. "adcs r4, r4, r4\n\t"
  67515. #elif defined(__clang__)
  67516. "adcs r4, r4\n\t"
  67517. #else
  67518. "adc r4, r4\n\t"
  67519. #endif
  67520. #ifdef WOLFSSL_KEIL
  67521. "adcs r5, r5, r5\n\t"
  67522. #elif defined(__clang__)
  67523. "adcs r5, r5\n\t"
  67524. #else
  67525. "adc r5, r5\n\t"
  67526. #endif
  67527. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  67528. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  67529. #ifdef WOLFSSL_KEIL
  67530. "adcs r2, r2, r2\n\t"
  67531. #elif defined(__clang__)
  67532. "adcs r2, r2\n\t"
  67533. #else
  67534. "adc r2, r2\n\t"
  67535. #endif
  67536. #ifdef WOLFSSL_KEIL
  67537. "adcs r3, r3, r3\n\t"
  67538. #elif defined(__clang__)
  67539. "adcs r3, r3\n\t"
  67540. #else
  67541. "adc r3, r3\n\t"
  67542. #endif
  67543. #ifdef WOLFSSL_KEIL
  67544. "adcs r4, r4, r4\n\t"
  67545. #elif defined(__clang__)
  67546. "adcs r4, r4\n\t"
  67547. #else
  67548. "adc r4, r4\n\t"
  67549. #endif
  67550. #ifdef WOLFSSL_KEIL
  67551. "adcs r5, r5, r5\n\t"
  67552. #elif defined(__clang__)
  67553. "adcs r5, r5\n\t"
  67554. #else
  67555. "adc r5, r5\n\t"
  67556. #endif
  67557. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  67558. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  67559. #ifdef WOLFSSL_KEIL
  67560. "adcs r2, r2, r2\n\t"
  67561. #elif defined(__clang__)
  67562. "adcs r2, r2\n\t"
  67563. #else
  67564. "adc r2, r2\n\t"
  67565. #endif
  67566. #ifdef WOLFSSL_KEIL
  67567. "adcs r3, r3, r3\n\t"
  67568. #elif defined(__clang__)
  67569. "adcs r3, r3\n\t"
  67570. #else
  67571. "adc r3, r3\n\t"
  67572. #endif
  67573. #ifdef WOLFSSL_KEIL
  67574. "adcs r4, r4, r4\n\t"
  67575. #elif defined(__clang__)
  67576. "adcs r4, r4\n\t"
  67577. #else
  67578. "adc r4, r4\n\t"
  67579. #endif
  67580. #ifdef WOLFSSL_KEIL
  67581. "adcs r5, r5, r5\n\t"
  67582. #elif defined(__clang__)
  67583. "adcs r5, r5\n\t"
  67584. #else
  67585. "adc r5, r5\n\t"
  67586. #endif
  67587. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  67588. "movs %[r], #0\n\t"
  67589. #ifdef WOLFSSL_KEIL
  67590. "adcs %[r], %[r], %[r]\n\t"
  67591. #elif defined(__clang__)
  67592. "adcs %[r], %[r]\n\t"
  67593. #else
  67594. "adc %[r], %[r]\n\t"
  67595. #endif
  67596. : [r] "+r" (r), [a] "+r" (a)
  67597. :
  67598. : "memory", "r2", "r3", "r4", "r5"
  67599. );
  67600. return (uint32_t)(size_t)r;
  67601. }
  67602. /* Square a and put result in r. (r = a * a)
  67603. *
  67604. * r A single precision integer.
  67605. * a A single precision integer.
  67606. */
  67607. SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
  67608. {
  67609. sp_digit* z0 = r;
  67610. sp_digit z2[48];
  67611. sp_digit z1[48];
  67612. sp_digit a1[24];
  67613. sp_digit u;
  67614. u = sp_3072_add_24(a1, a, &a[24]);
  67615. sp_3072_sqr_24(z1, a1);
  67616. sp_3072_sqr_24(z2, &a[24]);
  67617. sp_3072_sqr_24(z0, a);
  67618. sp_3072_mask_24(r + 48, a1, 0 - u);
  67619. u += sp_3072_dbl_24(r + 48, r + 48);
  67620. u += sp_3072_sub_in_place_48(z1, z2);
  67621. u += sp_3072_sub_in_place_48(z1, z0);
  67622. u += sp_3072_add_48(r + 24, r + 24, z1);
  67623. u += sp_3072_add_24(r + 48, r + 48, z2);
  67624. (void)sp_3072_add_to_word_24(r + 72, u, z2 + 24);
  67625. }
  67626. /* Add b to a into r. (r = a + b)
  67627. *
  67628. * r A single precision integer.
  67629. * a A single precision integer.
  67630. * b A single precision integer.
  67631. */
  67632. SP_NOINLINE static sp_digit sp_3072_add_to_word_48(sp_digit* r, sp_digit a,
  67633. const sp_digit* b)
  67634. {
  67635. __asm__ __volatile__ (
  67636. "movs r5, #0\n\t"
  67637. "ldm %[b]!, {r3, r4}\n\t"
  67638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67639. "adds r3, r3, %[a]\n\t"
  67640. #else
  67641. "add r3, r3, %[a]\n\t"
  67642. #endif
  67643. #ifdef WOLFSSL_KEIL
  67644. "adcs r4, r4, r5\n\t"
  67645. #elif defined(__clang__)
  67646. "adcs r4, r5\n\t"
  67647. #else
  67648. "adc r4, r5\n\t"
  67649. #endif
  67650. "stm %[r]!, {r3, r4}\n\t"
  67651. "ldm %[b]!, {r3, r4}\n\t"
  67652. #ifdef WOLFSSL_KEIL
  67653. "adcs r3, r3, r5\n\t"
  67654. #elif defined(__clang__)
  67655. "adcs r3, r5\n\t"
  67656. #else
  67657. "adc r3, r5\n\t"
  67658. #endif
  67659. #ifdef WOLFSSL_KEIL
  67660. "adcs r4, r4, r5\n\t"
  67661. #elif defined(__clang__)
  67662. "adcs r4, r5\n\t"
  67663. #else
  67664. "adc r4, r5\n\t"
  67665. #endif
  67666. "stm %[r]!, {r3, r4}\n\t"
  67667. "ldm %[b]!, {r3, r4}\n\t"
  67668. #ifdef WOLFSSL_KEIL
  67669. "adcs r3, r3, r5\n\t"
  67670. #elif defined(__clang__)
  67671. "adcs r3, r5\n\t"
  67672. #else
  67673. "adc r3, r5\n\t"
  67674. #endif
  67675. #ifdef WOLFSSL_KEIL
  67676. "adcs r4, r4, r5\n\t"
  67677. #elif defined(__clang__)
  67678. "adcs r4, r5\n\t"
  67679. #else
  67680. "adc r4, r5\n\t"
  67681. #endif
  67682. "stm %[r]!, {r3, r4}\n\t"
  67683. "ldm %[b]!, {r3, r4}\n\t"
  67684. #ifdef WOLFSSL_KEIL
  67685. "adcs r3, r3, r5\n\t"
  67686. #elif defined(__clang__)
  67687. "adcs r3, r5\n\t"
  67688. #else
  67689. "adc r3, r5\n\t"
  67690. #endif
  67691. #ifdef WOLFSSL_KEIL
  67692. "adcs r4, r4, r5\n\t"
  67693. #elif defined(__clang__)
  67694. "adcs r4, r5\n\t"
  67695. #else
  67696. "adc r4, r5\n\t"
  67697. #endif
  67698. "stm %[r]!, {r3, r4}\n\t"
  67699. "ldm %[b]!, {r3, r4}\n\t"
  67700. #ifdef WOLFSSL_KEIL
  67701. "adcs r3, r3, r5\n\t"
  67702. #elif defined(__clang__)
  67703. "adcs r3, r5\n\t"
  67704. #else
  67705. "adc r3, r5\n\t"
  67706. #endif
  67707. #ifdef WOLFSSL_KEIL
  67708. "adcs r4, r4, r5\n\t"
  67709. #elif defined(__clang__)
  67710. "adcs r4, r5\n\t"
  67711. #else
  67712. "adc r4, r5\n\t"
  67713. #endif
  67714. "stm %[r]!, {r3, r4}\n\t"
  67715. "ldm %[b]!, {r3, r4}\n\t"
  67716. #ifdef WOLFSSL_KEIL
  67717. "adcs r3, r3, r5\n\t"
  67718. #elif defined(__clang__)
  67719. "adcs r3, r5\n\t"
  67720. #else
  67721. "adc r3, r5\n\t"
  67722. #endif
  67723. #ifdef WOLFSSL_KEIL
  67724. "adcs r4, r4, r5\n\t"
  67725. #elif defined(__clang__)
  67726. "adcs r4, r5\n\t"
  67727. #else
  67728. "adc r4, r5\n\t"
  67729. #endif
  67730. "stm %[r]!, {r3, r4}\n\t"
  67731. "ldm %[b]!, {r3, r4}\n\t"
  67732. #ifdef WOLFSSL_KEIL
  67733. "adcs r3, r3, r5\n\t"
  67734. #elif defined(__clang__)
  67735. "adcs r3, r5\n\t"
  67736. #else
  67737. "adc r3, r5\n\t"
  67738. #endif
  67739. #ifdef WOLFSSL_KEIL
  67740. "adcs r4, r4, r5\n\t"
  67741. #elif defined(__clang__)
  67742. "adcs r4, r5\n\t"
  67743. #else
  67744. "adc r4, r5\n\t"
  67745. #endif
  67746. "stm %[r]!, {r3, r4}\n\t"
  67747. "ldm %[b]!, {r3, r4}\n\t"
  67748. #ifdef WOLFSSL_KEIL
  67749. "adcs r3, r3, r5\n\t"
  67750. #elif defined(__clang__)
  67751. "adcs r3, r5\n\t"
  67752. #else
  67753. "adc r3, r5\n\t"
  67754. #endif
  67755. #ifdef WOLFSSL_KEIL
  67756. "adcs r4, r4, r5\n\t"
  67757. #elif defined(__clang__)
  67758. "adcs r4, r5\n\t"
  67759. #else
  67760. "adc r4, r5\n\t"
  67761. #endif
  67762. "stm %[r]!, {r3, r4}\n\t"
  67763. "ldm %[b]!, {r3, r4}\n\t"
  67764. #ifdef WOLFSSL_KEIL
  67765. "adcs r3, r3, r5\n\t"
  67766. #elif defined(__clang__)
  67767. "adcs r3, r5\n\t"
  67768. #else
  67769. "adc r3, r5\n\t"
  67770. #endif
  67771. #ifdef WOLFSSL_KEIL
  67772. "adcs r4, r4, r5\n\t"
  67773. #elif defined(__clang__)
  67774. "adcs r4, r5\n\t"
  67775. #else
  67776. "adc r4, r5\n\t"
  67777. #endif
  67778. "stm %[r]!, {r3, r4}\n\t"
  67779. "ldm %[b]!, {r3, r4}\n\t"
  67780. #ifdef WOLFSSL_KEIL
  67781. "adcs r3, r3, r5\n\t"
  67782. #elif defined(__clang__)
  67783. "adcs r3, r5\n\t"
  67784. #else
  67785. "adc r3, r5\n\t"
  67786. #endif
  67787. #ifdef WOLFSSL_KEIL
  67788. "adcs r4, r4, r5\n\t"
  67789. #elif defined(__clang__)
  67790. "adcs r4, r5\n\t"
  67791. #else
  67792. "adc r4, r5\n\t"
  67793. #endif
  67794. "stm %[r]!, {r3, r4}\n\t"
  67795. "ldm %[b]!, {r3, r4}\n\t"
  67796. #ifdef WOLFSSL_KEIL
  67797. "adcs r3, r3, r5\n\t"
  67798. #elif defined(__clang__)
  67799. "adcs r3, r5\n\t"
  67800. #else
  67801. "adc r3, r5\n\t"
  67802. #endif
  67803. #ifdef WOLFSSL_KEIL
  67804. "adcs r4, r4, r5\n\t"
  67805. #elif defined(__clang__)
  67806. "adcs r4, r5\n\t"
  67807. #else
  67808. "adc r4, r5\n\t"
  67809. #endif
  67810. "stm %[r]!, {r3, r4}\n\t"
  67811. "ldm %[b]!, {r3, r4}\n\t"
  67812. #ifdef WOLFSSL_KEIL
  67813. "adcs r3, r3, r5\n\t"
  67814. #elif defined(__clang__)
  67815. "adcs r3, r5\n\t"
  67816. #else
  67817. "adc r3, r5\n\t"
  67818. #endif
  67819. #ifdef WOLFSSL_KEIL
  67820. "adcs r4, r4, r5\n\t"
  67821. #elif defined(__clang__)
  67822. "adcs r4, r5\n\t"
  67823. #else
  67824. "adc r4, r5\n\t"
  67825. #endif
  67826. "stm %[r]!, {r3, r4}\n\t"
  67827. "ldm %[b]!, {r3, r4}\n\t"
  67828. #ifdef WOLFSSL_KEIL
  67829. "adcs r3, r3, r5\n\t"
  67830. #elif defined(__clang__)
  67831. "adcs r3, r5\n\t"
  67832. #else
  67833. "adc r3, r5\n\t"
  67834. #endif
  67835. #ifdef WOLFSSL_KEIL
  67836. "adcs r4, r4, r5\n\t"
  67837. #elif defined(__clang__)
  67838. "adcs r4, r5\n\t"
  67839. #else
  67840. "adc r4, r5\n\t"
  67841. #endif
  67842. "stm %[r]!, {r3, r4}\n\t"
  67843. "ldm %[b]!, {r3, r4}\n\t"
  67844. #ifdef WOLFSSL_KEIL
  67845. "adcs r3, r3, r5\n\t"
  67846. #elif defined(__clang__)
  67847. "adcs r3, r5\n\t"
  67848. #else
  67849. "adc r3, r5\n\t"
  67850. #endif
  67851. #ifdef WOLFSSL_KEIL
  67852. "adcs r4, r4, r5\n\t"
  67853. #elif defined(__clang__)
  67854. "adcs r4, r5\n\t"
  67855. #else
  67856. "adc r4, r5\n\t"
  67857. #endif
  67858. "stm %[r]!, {r3, r4}\n\t"
  67859. "ldm %[b]!, {r3, r4}\n\t"
  67860. #ifdef WOLFSSL_KEIL
  67861. "adcs r3, r3, r5\n\t"
  67862. #elif defined(__clang__)
  67863. "adcs r3, r5\n\t"
  67864. #else
  67865. "adc r3, r5\n\t"
  67866. #endif
  67867. #ifdef WOLFSSL_KEIL
  67868. "adcs r4, r4, r5\n\t"
  67869. #elif defined(__clang__)
  67870. "adcs r4, r5\n\t"
  67871. #else
  67872. "adc r4, r5\n\t"
  67873. #endif
  67874. "stm %[r]!, {r3, r4}\n\t"
  67875. "ldm %[b]!, {r3, r4}\n\t"
  67876. #ifdef WOLFSSL_KEIL
  67877. "adcs r3, r3, r5\n\t"
  67878. #elif defined(__clang__)
  67879. "adcs r3, r5\n\t"
  67880. #else
  67881. "adc r3, r5\n\t"
  67882. #endif
  67883. #ifdef WOLFSSL_KEIL
  67884. "adcs r4, r4, r5\n\t"
  67885. #elif defined(__clang__)
  67886. "adcs r4, r5\n\t"
  67887. #else
  67888. "adc r4, r5\n\t"
  67889. #endif
  67890. "stm %[r]!, {r3, r4}\n\t"
  67891. "ldm %[b]!, {r3, r4}\n\t"
  67892. #ifdef WOLFSSL_KEIL
  67893. "adcs r3, r3, r5\n\t"
  67894. #elif defined(__clang__)
  67895. "adcs r3, r5\n\t"
  67896. #else
  67897. "adc r3, r5\n\t"
  67898. #endif
  67899. #ifdef WOLFSSL_KEIL
  67900. "adcs r4, r4, r5\n\t"
  67901. #elif defined(__clang__)
  67902. "adcs r4, r5\n\t"
  67903. #else
  67904. "adc r4, r5\n\t"
  67905. #endif
  67906. "stm %[r]!, {r3, r4}\n\t"
  67907. "ldm %[b]!, {r3, r4}\n\t"
  67908. #ifdef WOLFSSL_KEIL
  67909. "adcs r3, r3, r5\n\t"
  67910. #elif defined(__clang__)
  67911. "adcs r3, r5\n\t"
  67912. #else
  67913. "adc r3, r5\n\t"
  67914. #endif
  67915. #ifdef WOLFSSL_KEIL
  67916. "adcs r4, r4, r5\n\t"
  67917. #elif defined(__clang__)
  67918. "adcs r4, r5\n\t"
  67919. #else
  67920. "adc r4, r5\n\t"
  67921. #endif
  67922. "stm %[r]!, {r3, r4}\n\t"
  67923. "ldm %[b]!, {r3, r4}\n\t"
  67924. #ifdef WOLFSSL_KEIL
  67925. "adcs r3, r3, r5\n\t"
  67926. #elif defined(__clang__)
  67927. "adcs r3, r5\n\t"
  67928. #else
  67929. "adc r3, r5\n\t"
  67930. #endif
  67931. #ifdef WOLFSSL_KEIL
  67932. "adcs r4, r4, r5\n\t"
  67933. #elif defined(__clang__)
  67934. "adcs r4, r5\n\t"
  67935. #else
  67936. "adc r4, r5\n\t"
  67937. #endif
  67938. "stm %[r]!, {r3, r4}\n\t"
  67939. "ldm %[b]!, {r3, r4}\n\t"
  67940. #ifdef WOLFSSL_KEIL
  67941. "adcs r3, r3, r5\n\t"
  67942. #elif defined(__clang__)
  67943. "adcs r3, r5\n\t"
  67944. #else
  67945. "adc r3, r5\n\t"
  67946. #endif
  67947. #ifdef WOLFSSL_KEIL
  67948. "adcs r4, r4, r5\n\t"
  67949. #elif defined(__clang__)
  67950. "adcs r4, r5\n\t"
  67951. #else
  67952. "adc r4, r5\n\t"
  67953. #endif
  67954. "stm %[r]!, {r3, r4}\n\t"
  67955. "ldm %[b]!, {r3, r4}\n\t"
  67956. #ifdef WOLFSSL_KEIL
  67957. "adcs r3, r3, r5\n\t"
  67958. #elif defined(__clang__)
  67959. "adcs r3, r5\n\t"
  67960. #else
  67961. "adc r3, r5\n\t"
  67962. #endif
  67963. #ifdef WOLFSSL_KEIL
  67964. "adcs r4, r4, r5\n\t"
  67965. #elif defined(__clang__)
  67966. "adcs r4, r5\n\t"
  67967. #else
  67968. "adc r4, r5\n\t"
  67969. #endif
  67970. "stm %[r]!, {r3, r4}\n\t"
  67971. "ldm %[b]!, {r3, r4}\n\t"
  67972. #ifdef WOLFSSL_KEIL
  67973. "adcs r3, r3, r5\n\t"
  67974. #elif defined(__clang__)
  67975. "adcs r3, r5\n\t"
  67976. #else
  67977. "adc r3, r5\n\t"
  67978. #endif
  67979. #ifdef WOLFSSL_KEIL
  67980. "adcs r4, r4, r5\n\t"
  67981. #elif defined(__clang__)
  67982. "adcs r4, r5\n\t"
  67983. #else
  67984. "adc r4, r5\n\t"
  67985. #endif
  67986. "stm %[r]!, {r3, r4}\n\t"
  67987. "ldm %[b]!, {r3, r4}\n\t"
  67988. #ifdef WOLFSSL_KEIL
  67989. "adcs r3, r3, r5\n\t"
  67990. #elif defined(__clang__)
  67991. "adcs r3, r5\n\t"
  67992. #else
  67993. "adc r3, r5\n\t"
  67994. #endif
  67995. #ifdef WOLFSSL_KEIL
  67996. "adcs r4, r4, r5\n\t"
  67997. #elif defined(__clang__)
  67998. "adcs r4, r5\n\t"
  67999. #else
  68000. "adc r4, r5\n\t"
  68001. #endif
  68002. "stm %[r]!, {r3, r4}\n\t"
  68003. "ldm %[b]!, {r3, r4}\n\t"
  68004. #ifdef WOLFSSL_KEIL
  68005. "adcs r3, r3, r5\n\t"
  68006. #elif defined(__clang__)
  68007. "adcs r3, r5\n\t"
  68008. #else
  68009. "adc r3, r5\n\t"
  68010. #endif
  68011. #ifdef WOLFSSL_KEIL
  68012. "adcs r4, r4, r5\n\t"
  68013. #elif defined(__clang__)
  68014. "adcs r4, r5\n\t"
  68015. #else
  68016. "adc r4, r5\n\t"
  68017. #endif
  68018. "stm %[r]!, {r3, r4}\n\t"
  68019. "movs %[r], #0\n\t"
  68020. #ifdef WOLFSSL_KEIL
  68021. "adcs %[r], %[r], %[r]\n\t"
  68022. #elif defined(__clang__)
  68023. "adcs %[r], %[r]\n\t"
  68024. #else
  68025. "adc %[r], %[r]\n\t"
  68026. #endif
  68027. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  68028. :
  68029. : "memory", "r3", "r4", "r5"
  68030. );
  68031. return (uint32_t)(size_t)r;
  68032. }
  68033. /* Sub b from a into a. (a -= b)
  68034. *
  68035. * a A single precision integer.
  68036. * b A single precision integer.
  68037. */
  68038. SP_NOINLINE static sp_digit sp_3072_sub_in_place_96(sp_digit* a,
  68039. const sp_digit* b)
  68040. {
  68041. __asm__ __volatile__ (
  68042. "ldm %[b]!, {r4, r5}\n\t"
  68043. "ldr r2, [%[a]]\n\t"
  68044. "ldr r3, [%[a], #4]\n\t"
  68045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68046. "subs r2, r2, r4\n\t"
  68047. #else
  68048. "sub r2, r2, r4\n\t"
  68049. #endif
  68050. #ifdef WOLFSSL_KEIL
  68051. "sbcs r3, r3, r5\n\t"
  68052. #elif defined(__clang__)
  68053. "sbcs r3, r5\n\t"
  68054. #else
  68055. "sbc r3, r5\n\t"
  68056. #endif
  68057. "stm %[a]!, {r2, r3}\n\t"
  68058. "ldm %[b]!, {r4, r5}\n\t"
  68059. "ldr r2, [%[a]]\n\t"
  68060. "ldr r3, [%[a], #4]\n\t"
  68061. #ifdef WOLFSSL_KEIL
  68062. "sbcs r2, r2, r4\n\t"
  68063. #elif defined(__clang__)
  68064. "sbcs r2, r4\n\t"
  68065. #else
  68066. "sbc r2, r4\n\t"
  68067. #endif
  68068. #ifdef WOLFSSL_KEIL
  68069. "sbcs r3, r3, r5\n\t"
  68070. #elif defined(__clang__)
  68071. "sbcs r3, r5\n\t"
  68072. #else
  68073. "sbc r3, r5\n\t"
  68074. #endif
  68075. "stm %[a]!, {r2, r3}\n\t"
  68076. "ldm %[b]!, {r4, r5}\n\t"
  68077. "ldr r2, [%[a]]\n\t"
  68078. "ldr r3, [%[a], #4]\n\t"
  68079. #ifdef WOLFSSL_KEIL
  68080. "sbcs r2, r2, r4\n\t"
  68081. #elif defined(__clang__)
  68082. "sbcs r2, r4\n\t"
  68083. #else
  68084. "sbc r2, r4\n\t"
  68085. #endif
  68086. #ifdef WOLFSSL_KEIL
  68087. "sbcs r3, r3, r5\n\t"
  68088. #elif defined(__clang__)
  68089. "sbcs r3, r5\n\t"
  68090. #else
  68091. "sbc r3, r5\n\t"
  68092. #endif
  68093. "stm %[a]!, {r2, r3}\n\t"
  68094. "ldm %[b]!, {r4, r5}\n\t"
  68095. "ldr r2, [%[a]]\n\t"
  68096. "ldr r3, [%[a], #4]\n\t"
  68097. #ifdef WOLFSSL_KEIL
  68098. "sbcs r2, r2, r4\n\t"
  68099. #elif defined(__clang__)
  68100. "sbcs r2, r4\n\t"
  68101. #else
  68102. "sbc r2, r4\n\t"
  68103. #endif
  68104. #ifdef WOLFSSL_KEIL
  68105. "sbcs r3, r3, r5\n\t"
  68106. #elif defined(__clang__)
  68107. "sbcs r3, r5\n\t"
  68108. #else
  68109. "sbc r3, r5\n\t"
  68110. #endif
  68111. "stm %[a]!, {r2, r3}\n\t"
  68112. "ldm %[b]!, {r4, r5}\n\t"
  68113. "ldr r2, [%[a]]\n\t"
  68114. "ldr r3, [%[a], #4]\n\t"
  68115. #ifdef WOLFSSL_KEIL
  68116. "sbcs r2, r2, r4\n\t"
  68117. #elif defined(__clang__)
  68118. "sbcs r2, r4\n\t"
  68119. #else
  68120. "sbc r2, r4\n\t"
  68121. #endif
  68122. #ifdef WOLFSSL_KEIL
  68123. "sbcs r3, r3, r5\n\t"
  68124. #elif defined(__clang__)
  68125. "sbcs r3, r5\n\t"
  68126. #else
  68127. "sbc r3, r5\n\t"
  68128. #endif
  68129. "stm %[a]!, {r2, r3}\n\t"
  68130. "ldm %[b]!, {r4, r5}\n\t"
  68131. "ldr r2, [%[a]]\n\t"
  68132. "ldr r3, [%[a], #4]\n\t"
  68133. #ifdef WOLFSSL_KEIL
  68134. "sbcs r2, r2, r4\n\t"
  68135. #elif defined(__clang__)
  68136. "sbcs r2, r4\n\t"
  68137. #else
  68138. "sbc r2, r4\n\t"
  68139. #endif
  68140. #ifdef WOLFSSL_KEIL
  68141. "sbcs r3, r3, r5\n\t"
  68142. #elif defined(__clang__)
  68143. "sbcs r3, r5\n\t"
  68144. #else
  68145. "sbc r3, r5\n\t"
  68146. #endif
  68147. "stm %[a]!, {r2, r3}\n\t"
  68148. "ldm %[b]!, {r4, r5}\n\t"
  68149. "ldr r2, [%[a]]\n\t"
  68150. "ldr r3, [%[a], #4]\n\t"
  68151. #ifdef WOLFSSL_KEIL
  68152. "sbcs r2, r2, r4\n\t"
  68153. #elif defined(__clang__)
  68154. "sbcs r2, r4\n\t"
  68155. #else
  68156. "sbc r2, r4\n\t"
  68157. #endif
  68158. #ifdef WOLFSSL_KEIL
  68159. "sbcs r3, r3, r5\n\t"
  68160. #elif defined(__clang__)
  68161. "sbcs r3, r5\n\t"
  68162. #else
  68163. "sbc r3, r5\n\t"
  68164. #endif
  68165. "stm %[a]!, {r2, r3}\n\t"
  68166. "ldm %[b]!, {r4, r5}\n\t"
  68167. "ldr r2, [%[a]]\n\t"
  68168. "ldr r3, [%[a], #4]\n\t"
  68169. #ifdef WOLFSSL_KEIL
  68170. "sbcs r2, r2, r4\n\t"
  68171. #elif defined(__clang__)
  68172. "sbcs r2, r4\n\t"
  68173. #else
  68174. "sbc r2, r4\n\t"
  68175. #endif
  68176. #ifdef WOLFSSL_KEIL
  68177. "sbcs r3, r3, r5\n\t"
  68178. #elif defined(__clang__)
  68179. "sbcs r3, r5\n\t"
  68180. #else
  68181. "sbc r3, r5\n\t"
  68182. #endif
  68183. "stm %[a]!, {r2, r3}\n\t"
  68184. "ldm %[b]!, {r4, r5}\n\t"
  68185. "ldr r2, [%[a]]\n\t"
  68186. "ldr r3, [%[a], #4]\n\t"
  68187. #ifdef WOLFSSL_KEIL
  68188. "sbcs r2, r2, r4\n\t"
  68189. #elif defined(__clang__)
  68190. "sbcs r2, r4\n\t"
  68191. #else
  68192. "sbc r2, r4\n\t"
  68193. #endif
  68194. #ifdef WOLFSSL_KEIL
  68195. "sbcs r3, r3, r5\n\t"
  68196. #elif defined(__clang__)
  68197. "sbcs r3, r5\n\t"
  68198. #else
  68199. "sbc r3, r5\n\t"
  68200. #endif
  68201. "stm %[a]!, {r2, r3}\n\t"
  68202. "ldm %[b]!, {r4, r5}\n\t"
  68203. "ldr r2, [%[a]]\n\t"
  68204. "ldr r3, [%[a], #4]\n\t"
  68205. #ifdef WOLFSSL_KEIL
  68206. "sbcs r2, r2, r4\n\t"
  68207. #elif defined(__clang__)
  68208. "sbcs r2, r4\n\t"
  68209. #else
  68210. "sbc r2, r4\n\t"
  68211. #endif
  68212. #ifdef WOLFSSL_KEIL
  68213. "sbcs r3, r3, r5\n\t"
  68214. #elif defined(__clang__)
  68215. "sbcs r3, r5\n\t"
  68216. #else
  68217. "sbc r3, r5\n\t"
  68218. #endif
  68219. "stm %[a]!, {r2, r3}\n\t"
  68220. "ldm %[b]!, {r4, r5}\n\t"
  68221. "ldr r2, [%[a]]\n\t"
  68222. "ldr r3, [%[a], #4]\n\t"
  68223. #ifdef WOLFSSL_KEIL
  68224. "sbcs r2, r2, r4\n\t"
  68225. #elif defined(__clang__)
  68226. "sbcs r2, r4\n\t"
  68227. #else
  68228. "sbc r2, r4\n\t"
  68229. #endif
  68230. #ifdef WOLFSSL_KEIL
  68231. "sbcs r3, r3, r5\n\t"
  68232. #elif defined(__clang__)
  68233. "sbcs r3, r5\n\t"
  68234. #else
  68235. "sbc r3, r5\n\t"
  68236. #endif
  68237. "stm %[a]!, {r2, r3}\n\t"
  68238. "ldm %[b]!, {r4, r5}\n\t"
  68239. "ldr r2, [%[a]]\n\t"
  68240. "ldr r3, [%[a], #4]\n\t"
  68241. #ifdef WOLFSSL_KEIL
  68242. "sbcs r2, r2, r4\n\t"
  68243. #elif defined(__clang__)
  68244. "sbcs r2, r4\n\t"
  68245. #else
  68246. "sbc r2, r4\n\t"
  68247. #endif
  68248. #ifdef WOLFSSL_KEIL
  68249. "sbcs r3, r3, r5\n\t"
  68250. #elif defined(__clang__)
  68251. "sbcs r3, r5\n\t"
  68252. #else
  68253. "sbc r3, r5\n\t"
  68254. #endif
  68255. "stm %[a]!, {r2, r3}\n\t"
  68256. "ldm %[b]!, {r4, r5}\n\t"
  68257. "ldr r2, [%[a]]\n\t"
  68258. "ldr r3, [%[a], #4]\n\t"
  68259. #ifdef WOLFSSL_KEIL
  68260. "sbcs r2, r2, r4\n\t"
  68261. #elif defined(__clang__)
  68262. "sbcs r2, r4\n\t"
  68263. #else
  68264. "sbc r2, r4\n\t"
  68265. #endif
  68266. #ifdef WOLFSSL_KEIL
  68267. "sbcs r3, r3, r5\n\t"
  68268. #elif defined(__clang__)
  68269. "sbcs r3, r5\n\t"
  68270. #else
  68271. "sbc r3, r5\n\t"
  68272. #endif
  68273. "stm %[a]!, {r2, r3}\n\t"
  68274. "ldm %[b]!, {r4, r5}\n\t"
  68275. "ldr r2, [%[a]]\n\t"
  68276. "ldr r3, [%[a], #4]\n\t"
  68277. #ifdef WOLFSSL_KEIL
  68278. "sbcs r2, r2, r4\n\t"
  68279. #elif defined(__clang__)
  68280. "sbcs r2, r4\n\t"
  68281. #else
  68282. "sbc r2, r4\n\t"
  68283. #endif
  68284. #ifdef WOLFSSL_KEIL
  68285. "sbcs r3, r3, r5\n\t"
  68286. #elif defined(__clang__)
  68287. "sbcs r3, r5\n\t"
  68288. #else
  68289. "sbc r3, r5\n\t"
  68290. #endif
  68291. "stm %[a]!, {r2, r3}\n\t"
  68292. "ldm %[b]!, {r4, r5}\n\t"
  68293. "ldr r2, [%[a]]\n\t"
  68294. "ldr r3, [%[a], #4]\n\t"
  68295. #ifdef WOLFSSL_KEIL
  68296. "sbcs r2, r2, r4\n\t"
  68297. #elif defined(__clang__)
  68298. "sbcs r2, r4\n\t"
  68299. #else
  68300. "sbc r2, r4\n\t"
  68301. #endif
  68302. #ifdef WOLFSSL_KEIL
  68303. "sbcs r3, r3, r5\n\t"
  68304. #elif defined(__clang__)
  68305. "sbcs r3, r5\n\t"
  68306. #else
  68307. "sbc r3, r5\n\t"
  68308. #endif
  68309. "stm %[a]!, {r2, r3}\n\t"
  68310. "ldm %[b]!, {r4, r5}\n\t"
  68311. "ldr r2, [%[a]]\n\t"
  68312. "ldr r3, [%[a], #4]\n\t"
  68313. #ifdef WOLFSSL_KEIL
  68314. "sbcs r2, r2, r4\n\t"
  68315. #elif defined(__clang__)
  68316. "sbcs r2, r4\n\t"
  68317. #else
  68318. "sbc r2, r4\n\t"
  68319. #endif
  68320. #ifdef WOLFSSL_KEIL
  68321. "sbcs r3, r3, r5\n\t"
  68322. #elif defined(__clang__)
  68323. "sbcs r3, r5\n\t"
  68324. #else
  68325. "sbc r3, r5\n\t"
  68326. #endif
  68327. "stm %[a]!, {r2, r3}\n\t"
  68328. "ldm %[b]!, {r4, r5}\n\t"
  68329. "ldr r2, [%[a]]\n\t"
  68330. "ldr r3, [%[a], #4]\n\t"
  68331. #ifdef WOLFSSL_KEIL
  68332. "sbcs r2, r2, r4\n\t"
  68333. #elif defined(__clang__)
  68334. "sbcs r2, r4\n\t"
  68335. #else
  68336. "sbc r2, r4\n\t"
  68337. #endif
  68338. #ifdef WOLFSSL_KEIL
  68339. "sbcs r3, r3, r5\n\t"
  68340. #elif defined(__clang__)
  68341. "sbcs r3, r5\n\t"
  68342. #else
  68343. "sbc r3, r5\n\t"
  68344. #endif
  68345. "stm %[a]!, {r2, r3}\n\t"
  68346. "ldm %[b]!, {r4, r5}\n\t"
  68347. "ldr r2, [%[a]]\n\t"
  68348. "ldr r3, [%[a], #4]\n\t"
  68349. #ifdef WOLFSSL_KEIL
  68350. "sbcs r2, r2, r4\n\t"
  68351. #elif defined(__clang__)
  68352. "sbcs r2, r4\n\t"
  68353. #else
  68354. "sbc r2, r4\n\t"
  68355. #endif
  68356. #ifdef WOLFSSL_KEIL
  68357. "sbcs r3, r3, r5\n\t"
  68358. #elif defined(__clang__)
  68359. "sbcs r3, r5\n\t"
  68360. #else
  68361. "sbc r3, r5\n\t"
  68362. #endif
  68363. "stm %[a]!, {r2, r3}\n\t"
  68364. "ldm %[b]!, {r4, r5}\n\t"
  68365. "ldr r2, [%[a]]\n\t"
  68366. "ldr r3, [%[a], #4]\n\t"
  68367. #ifdef WOLFSSL_KEIL
  68368. "sbcs r2, r2, r4\n\t"
  68369. #elif defined(__clang__)
  68370. "sbcs r2, r4\n\t"
  68371. #else
  68372. "sbc r2, r4\n\t"
  68373. #endif
  68374. #ifdef WOLFSSL_KEIL
  68375. "sbcs r3, r3, r5\n\t"
  68376. #elif defined(__clang__)
  68377. "sbcs r3, r5\n\t"
  68378. #else
  68379. "sbc r3, r5\n\t"
  68380. #endif
  68381. "stm %[a]!, {r2, r3}\n\t"
  68382. "ldm %[b]!, {r4, r5}\n\t"
  68383. "ldr r2, [%[a]]\n\t"
  68384. "ldr r3, [%[a], #4]\n\t"
  68385. #ifdef WOLFSSL_KEIL
  68386. "sbcs r2, r2, r4\n\t"
  68387. #elif defined(__clang__)
  68388. "sbcs r2, r4\n\t"
  68389. #else
  68390. "sbc r2, r4\n\t"
  68391. #endif
  68392. #ifdef WOLFSSL_KEIL
  68393. "sbcs r3, r3, r5\n\t"
  68394. #elif defined(__clang__)
  68395. "sbcs r3, r5\n\t"
  68396. #else
  68397. "sbc r3, r5\n\t"
  68398. #endif
  68399. "stm %[a]!, {r2, r3}\n\t"
  68400. "ldm %[b]!, {r4, r5}\n\t"
  68401. "ldr r2, [%[a]]\n\t"
  68402. "ldr r3, [%[a], #4]\n\t"
  68403. #ifdef WOLFSSL_KEIL
  68404. "sbcs r2, r2, r4\n\t"
  68405. #elif defined(__clang__)
  68406. "sbcs r2, r4\n\t"
  68407. #else
  68408. "sbc r2, r4\n\t"
  68409. #endif
  68410. #ifdef WOLFSSL_KEIL
  68411. "sbcs r3, r3, r5\n\t"
  68412. #elif defined(__clang__)
  68413. "sbcs r3, r5\n\t"
  68414. #else
  68415. "sbc r3, r5\n\t"
  68416. #endif
  68417. "stm %[a]!, {r2, r3}\n\t"
  68418. "ldm %[b]!, {r4, r5}\n\t"
  68419. "ldr r2, [%[a]]\n\t"
  68420. "ldr r3, [%[a], #4]\n\t"
  68421. #ifdef WOLFSSL_KEIL
  68422. "sbcs r2, r2, r4\n\t"
  68423. #elif defined(__clang__)
  68424. "sbcs r2, r4\n\t"
  68425. #else
  68426. "sbc r2, r4\n\t"
  68427. #endif
  68428. #ifdef WOLFSSL_KEIL
  68429. "sbcs r3, r3, r5\n\t"
  68430. #elif defined(__clang__)
  68431. "sbcs r3, r5\n\t"
  68432. #else
  68433. "sbc r3, r5\n\t"
  68434. #endif
  68435. "stm %[a]!, {r2, r3}\n\t"
  68436. "ldm %[b]!, {r4, r5}\n\t"
  68437. "ldr r2, [%[a]]\n\t"
  68438. "ldr r3, [%[a], #4]\n\t"
  68439. #ifdef WOLFSSL_KEIL
  68440. "sbcs r2, r2, r4\n\t"
  68441. #elif defined(__clang__)
  68442. "sbcs r2, r4\n\t"
  68443. #else
  68444. "sbc r2, r4\n\t"
  68445. #endif
  68446. #ifdef WOLFSSL_KEIL
  68447. "sbcs r3, r3, r5\n\t"
  68448. #elif defined(__clang__)
  68449. "sbcs r3, r5\n\t"
  68450. #else
  68451. "sbc r3, r5\n\t"
  68452. #endif
  68453. "stm %[a]!, {r2, r3}\n\t"
  68454. "ldm %[b]!, {r4, r5}\n\t"
  68455. "ldr r2, [%[a]]\n\t"
  68456. "ldr r3, [%[a], #4]\n\t"
  68457. #ifdef WOLFSSL_KEIL
  68458. "sbcs r2, r2, r4\n\t"
  68459. #elif defined(__clang__)
  68460. "sbcs r2, r4\n\t"
  68461. #else
  68462. "sbc r2, r4\n\t"
  68463. #endif
  68464. #ifdef WOLFSSL_KEIL
  68465. "sbcs r3, r3, r5\n\t"
  68466. #elif defined(__clang__)
  68467. "sbcs r3, r5\n\t"
  68468. #else
  68469. "sbc r3, r5\n\t"
  68470. #endif
  68471. "stm %[a]!, {r2, r3}\n\t"
  68472. "ldm %[b]!, {r4, r5}\n\t"
  68473. "ldr r2, [%[a]]\n\t"
  68474. "ldr r3, [%[a], #4]\n\t"
  68475. #ifdef WOLFSSL_KEIL
  68476. "sbcs r2, r2, r4\n\t"
  68477. #elif defined(__clang__)
  68478. "sbcs r2, r4\n\t"
  68479. #else
  68480. "sbc r2, r4\n\t"
  68481. #endif
  68482. #ifdef WOLFSSL_KEIL
  68483. "sbcs r3, r3, r5\n\t"
  68484. #elif defined(__clang__)
  68485. "sbcs r3, r5\n\t"
  68486. #else
  68487. "sbc r3, r5\n\t"
  68488. #endif
  68489. "stm %[a]!, {r2, r3}\n\t"
  68490. "ldm %[b]!, {r4, r5}\n\t"
  68491. "ldr r2, [%[a]]\n\t"
  68492. "ldr r3, [%[a], #4]\n\t"
  68493. #ifdef WOLFSSL_KEIL
  68494. "sbcs r2, r2, r4\n\t"
  68495. #elif defined(__clang__)
  68496. "sbcs r2, r4\n\t"
  68497. #else
  68498. "sbc r2, r4\n\t"
  68499. #endif
  68500. #ifdef WOLFSSL_KEIL
  68501. "sbcs r3, r3, r5\n\t"
  68502. #elif defined(__clang__)
  68503. "sbcs r3, r5\n\t"
  68504. #else
  68505. "sbc r3, r5\n\t"
  68506. #endif
  68507. "stm %[a]!, {r2, r3}\n\t"
  68508. "ldm %[b]!, {r4, r5}\n\t"
  68509. "ldr r2, [%[a]]\n\t"
  68510. "ldr r3, [%[a], #4]\n\t"
  68511. #ifdef WOLFSSL_KEIL
  68512. "sbcs r2, r2, r4\n\t"
  68513. #elif defined(__clang__)
  68514. "sbcs r2, r4\n\t"
  68515. #else
  68516. "sbc r2, r4\n\t"
  68517. #endif
  68518. #ifdef WOLFSSL_KEIL
  68519. "sbcs r3, r3, r5\n\t"
  68520. #elif defined(__clang__)
  68521. "sbcs r3, r5\n\t"
  68522. #else
  68523. "sbc r3, r5\n\t"
  68524. #endif
  68525. "stm %[a]!, {r2, r3}\n\t"
  68526. "ldm %[b]!, {r4, r5}\n\t"
  68527. "ldr r2, [%[a]]\n\t"
  68528. "ldr r3, [%[a], #4]\n\t"
  68529. #ifdef WOLFSSL_KEIL
  68530. "sbcs r2, r2, r4\n\t"
  68531. #elif defined(__clang__)
  68532. "sbcs r2, r4\n\t"
  68533. #else
  68534. "sbc r2, r4\n\t"
  68535. #endif
  68536. #ifdef WOLFSSL_KEIL
  68537. "sbcs r3, r3, r5\n\t"
  68538. #elif defined(__clang__)
  68539. "sbcs r3, r5\n\t"
  68540. #else
  68541. "sbc r3, r5\n\t"
  68542. #endif
  68543. "stm %[a]!, {r2, r3}\n\t"
  68544. "ldm %[b]!, {r4, r5}\n\t"
  68545. "ldr r2, [%[a]]\n\t"
  68546. "ldr r3, [%[a], #4]\n\t"
  68547. #ifdef WOLFSSL_KEIL
  68548. "sbcs r2, r2, r4\n\t"
  68549. #elif defined(__clang__)
  68550. "sbcs r2, r4\n\t"
  68551. #else
  68552. "sbc r2, r4\n\t"
  68553. #endif
  68554. #ifdef WOLFSSL_KEIL
  68555. "sbcs r3, r3, r5\n\t"
  68556. #elif defined(__clang__)
  68557. "sbcs r3, r5\n\t"
  68558. #else
  68559. "sbc r3, r5\n\t"
  68560. #endif
  68561. "stm %[a]!, {r2, r3}\n\t"
  68562. "ldm %[b]!, {r4, r5}\n\t"
  68563. "ldr r2, [%[a]]\n\t"
  68564. "ldr r3, [%[a], #4]\n\t"
  68565. #ifdef WOLFSSL_KEIL
  68566. "sbcs r2, r2, r4\n\t"
  68567. #elif defined(__clang__)
  68568. "sbcs r2, r4\n\t"
  68569. #else
  68570. "sbc r2, r4\n\t"
  68571. #endif
  68572. #ifdef WOLFSSL_KEIL
  68573. "sbcs r3, r3, r5\n\t"
  68574. #elif defined(__clang__)
  68575. "sbcs r3, r5\n\t"
  68576. #else
  68577. "sbc r3, r5\n\t"
  68578. #endif
  68579. "stm %[a]!, {r2, r3}\n\t"
  68580. "ldm %[b]!, {r4, r5}\n\t"
  68581. "ldr r2, [%[a]]\n\t"
  68582. "ldr r3, [%[a], #4]\n\t"
  68583. #ifdef WOLFSSL_KEIL
  68584. "sbcs r2, r2, r4\n\t"
  68585. #elif defined(__clang__)
  68586. "sbcs r2, r4\n\t"
  68587. #else
  68588. "sbc r2, r4\n\t"
  68589. #endif
  68590. #ifdef WOLFSSL_KEIL
  68591. "sbcs r3, r3, r5\n\t"
  68592. #elif defined(__clang__)
  68593. "sbcs r3, r5\n\t"
  68594. #else
  68595. "sbc r3, r5\n\t"
  68596. #endif
  68597. "stm %[a]!, {r2, r3}\n\t"
  68598. "ldm %[b]!, {r4, r5}\n\t"
  68599. "ldr r2, [%[a]]\n\t"
  68600. "ldr r3, [%[a], #4]\n\t"
  68601. #ifdef WOLFSSL_KEIL
  68602. "sbcs r2, r2, r4\n\t"
  68603. #elif defined(__clang__)
  68604. "sbcs r2, r4\n\t"
  68605. #else
  68606. "sbc r2, r4\n\t"
  68607. #endif
  68608. #ifdef WOLFSSL_KEIL
  68609. "sbcs r3, r3, r5\n\t"
  68610. #elif defined(__clang__)
  68611. "sbcs r3, r5\n\t"
  68612. #else
  68613. "sbc r3, r5\n\t"
  68614. #endif
  68615. "stm %[a]!, {r2, r3}\n\t"
  68616. "ldm %[b]!, {r4, r5}\n\t"
  68617. "ldr r2, [%[a]]\n\t"
  68618. "ldr r3, [%[a], #4]\n\t"
  68619. #ifdef WOLFSSL_KEIL
  68620. "sbcs r2, r2, r4\n\t"
  68621. #elif defined(__clang__)
  68622. "sbcs r2, r4\n\t"
  68623. #else
  68624. "sbc r2, r4\n\t"
  68625. #endif
  68626. #ifdef WOLFSSL_KEIL
  68627. "sbcs r3, r3, r5\n\t"
  68628. #elif defined(__clang__)
  68629. "sbcs r3, r5\n\t"
  68630. #else
  68631. "sbc r3, r5\n\t"
  68632. #endif
  68633. "stm %[a]!, {r2, r3}\n\t"
  68634. "ldm %[b]!, {r4, r5}\n\t"
  68635. "ldr r2, [%[a]]\n\t"
  68636. "ldr r3, [%[a], #4]\n\t"
  68637. #ifdef WOLFSSL_KEIL
  68638. "sbcs r2, r2, r4\n\t"
  68639. #elif defined(__clang__)
  68640. "sbcs r2, r4\n\t"
  68641. #else
  68642. "sbc r2, r4\n\t"
  68643. #endif
  68644. #ifdef WOLFSSL_KEIL
  68645. "sbcs r3, r3, r5\n\t"
  68646. #elif defined(__clang__)
  68647. "sbcs r3, r5\n\t"
  68648. #else
  68649. "sbc r3, r5\n\t"
  68650. #endif
  68651. "stm %[a]!, {r2, r3}\n\t"
  68652. "ldm %[b]!, {r4, r5}\n\t"
  68653. "ldr r2, [%[a]]\n\t"
  68654. "ldr r3, [%[a], #4]\n\t"
  68655. #ifdef WOLFSSL_KEIL
  68656. "sbcs r2, r2, r4\n\t"
  68657. #elif defined(__clang__)
  68658. "sbcs r2, r4\n\t"
  68659. #else
  68660. "sbc r2, r4\n\t"
  68661. #endif
  68662. #ifdef WOLFSSL_KEIL
  68663. "sbcs r3, r3, r5\n\t"
  68664. #elif defined(__clang__)
  68665. "sbcs r3, r5\n\t"
  68666. #else
  68667. "sbc r3, r5\n\t"
  68668. #endif
  68669. "stm %[a]!, {r2, r3}\n\t"
  68670. "ldm %[b]!, {r4, r5}\n\t"
  68671. "ldr r2, [%[a]]\n\t"
  68672. "ldr r3, [%[a], #4]\n\t"
  68673. #ifdef WOLFSSL_KEIL
  68674. "sbcs r2, r2, r4\n\t"
  68675. #elif defined(__clang__)
  68676. "sbcs r2, r4\n\t"
  68677. #else
  68678. "sbc r2, r4\n\t"
  68679. #endif
  68680. #ifdef WOLFSSL_KEIL
  68681. "sbcs r3, r3, r5\n\t"
  68682. #elif defined(__clang__)
  68683. "sbcs r3, r5\n\t"
  68684. #else
  68685. "sbc r3, r5\n\t"
  68686. #endif
  68687. "stm %[a]!, {r2, r3}\n\t"
  68688. "ldm %[b]!, {r4, r5}\n\t"
  68689. "ldr r2, [%[a]]\n\t"
  68690. "ldr r3, [%[a], #4]\n\t"
  68691. #ifdef WOLFSSL_KEIL
  68692. "sbcs r2, r2, r4\n\t"
  68693. #elif defined(__clang__)
  68694. "sbcs r2, r4\n\t"
  68695. #else
  68696. "sbc r2, r4\n\t"
  68697. #endif
  68698. #ifdef WOLFSSL_KEIL
  68699. "sbcs r3, r3, r5\n\t"
  68700. #elif defined(__clang__)
  68701. "sbcs r3, r5\n\t"
  68702. #else
  68703. "sbc r3, r5\n\t"
  68704. #endif
  68705. "stm %[a]!, {r2, r3}\n\t"
  68706. "ldm %[b]!, {r4, r5}\n\t"
  68707. "ldr r2, [%[a]]\n\t"
  68708. "ldr r3, [%[a], #4]\n\t"
  68709. #ifdef WOLFSSL_KEIL
  68710. "sbcs r2, r2, r4\n\t"
  68711. #elif defined(__clang__)
  68712. "sbcs r2, r4\n\t"
  68713. #else
  68714. "sbc r2, r4\n\t"
  68715. #endif
  68716. #ifdef WOLFSSL_KEIL
  68717. "sbcs r3, r3, r5\n\t"
  68718. #elif defined(__clang__)
  68719. "sbcs r3, r5\n\t"
  68720. #else
  68721. "sbc r3, r5\n\t"
  68722. #endif
  68723. "stm %[a]!, {r2, r3}\n\t"
  68724. "ldm %[b]!, {r4, r5}\n\t"
  68725. "ldr r2, [%[a]]\n\t"
  68726. "ldr r3, [%[a], #4]\n\t"
  68727. #ifdef WOLFSSL_KEIL
  68728. "sbcs r2, r2, r4\n\t"
  68729. #elif defined(__clang__)
  68730. "sbcs r2, r4\n\t"
  68731. #else
  68732. "sbc r2, r4\n\t"
  68733. #endif
  68734. #ifdef WOLFSSL_KEIL
  68735. "sbcs r3, r3, r5\n\t"
  68736. #elif defined(__clang__)
  68737. "sbcs r3, r5\n\t"
  68738. #else
  68739. "sbc r3, r5\n\t"
  68740. #endif
  68741. "stm %[a]!, {r2, r3}\n\t"
  68742. "ldm %[b]!, {r4, r5}\n\t"
  68743. "ldr r2, [%[a]]\n\t"
  68744. "ldr r3, [%[a], #4]\n\t"
  68745. #ifdef WOLFSSL_KEIL
  68746. "sbcs r2, r2, r4\n\t"
  68747. #elif defined(__clang__)
  68748. "sbcs r2, r4\n\t"
  68749. #else
  68750. "sbc r2, r4\n\t"
  68751. #endif
  68752. #ifdef WOLFSSL_KEIL
  68753. "sbcs r3, r3, r5\n\t"
  68754. #elif defined(__clang__)
  68755. "sbcs r3, r5\n\t"
  68756. #else
  68757. "sbc r3, r5\n\t"
  68758. #endif
  68759. "stm %[a]!, {r2, r3}\n\t"
  68760. "ldm %[b]!, {r4, r5}\n\t"
  68761. "ldr r2, [%[a]]\n\t"
  68762. "ldr r3, [%[a], #4]\n\t"
  68763. #ifdef WOLFSSL_KEIL
  68764. "sbcs r2, r2, r4\n\t"
  68765. #elif defined(__clang__)
  68766. "sbcs r2, r4\n\t"
  68767. #else
  68768. "sbc r2, r4\n\t"
  68769. #endif
  68770. #ifdef WOLFSSL_KEIL
  68771. "sbcs r3, r3, r5\n\t"
  68772. #elif defined(__clang__)
  68773. "sbcs r3, r5\n\t"
  68774. #else
  68775. "sbc r3, r5\n\t"
  68776. #endif
  68777. "stm %[a]!, {r2, r3}\n\t"
  68778. "ldm %[b]!, {r4, r5}\n\t"
  68779. "ldr r2, [%[a]]\n\t"
  68780. "ldr r3, [%[a], #4]\n\t"
  68781. #ifdef WOLFSSL_KEIL
  68782. "sbcs r2, r2, r4\n\t"
  68783. #elif defined(__clang__)
  68784. "sbcs r2, r4\n\t"
  68785. #else
  68786. "sbc r2, r4\n\t"
  68787. #endif
  68788. #ifdef WOLFSSL_KEIL
  68789. "sbcs r3, r3, r5\n\t"
  68790. #elif defined(__clang__)
  68791. "sbcs r3, r5\n\t"
  68792. #else
  68793. "sbc r3, r5\n\t"
  68794. #endif
  68795. "stm %[a]!, {r2, r3}\n\t"
  68796. "ldm %[b]!, {r4, r5}\n\t"
  68797. "ldr r2, [%[a]]\n\t"
  68798. "ldr r3, [%[a], #4]\n\t"
  68799. #ifdef WOLFSSL_KEIL
  68800. "sbcs r2, r2, r4\n\t"
  68801. #elif defined(__clang__)
  68802. "sbcs r2, r4\n\t"
  68803. #else
  68804. "sbc r2, r4\n\t"
  68805. #endif
  68806. #ifdef WOLFSSL_KEIL
  68807. "sbcs r3, r3, r5\n\t"
  68808. #elif defined(__clang__)
  68809. "sbcs r3, r5\n\t"
  68810. #else
  68811. "sbc r3, r5\n\t"
  68812. #endif
  68813. "stm %[a]!, {r2, r3}\n\t"
  68814. "ldm %[b]!, {r4, r5}\n\t"
  68815. "ldr r2, [%[a]]\n\t"
  68816. "ldr r3, [%[a], #4]\n\t"
  68817. #ifdef WOLFSSL_KEIL
  68818. "sbcs r2, r2, r4\n\t"
  68819. #elif defined(__clang__)
  68820. "sbcs r2, r4\n\t"
  68821. #else
  68822. "sbc r2, r4\n\t"
  68823. #endif
  68824. #ifdef WOLFSSL_KEIL
  68825. "sbcs r3, r3, r5\n\t"
  68826. #elif defined(__clang__)
  68827. "sbcs r3, r5\n\t"
  68828. #else
  68829. "sbc r3, r5\n\t"
  68830. #endif
  68831. "stm %[a]!, {r2, r3}\n\t"
  68832. "ldm %[b]!, {r4, r5}\n\t"
  68833. "ldr r2, [%[a]]\n\t"
  68834. "ldr r3, [%[a], #4]\n\t"
  68835. #ifdef WOLFSSL_KEIL
  68836. "sbcs r2, r2, r4\n\t"
  68837. #elif defined(__clang__)
  68838. "sbcs r2, r4\n\t"
  68839. #else
  68840. "sbc r2, r4\n\t"
  68841. #endif
  68842. #ifdef WOLFSSL_KEIL
  68843. "sbcs r3, r3, r5\n\t"
  68844. #elif defined(__clang__)
  68845. "sbcs r3, r5\n\t"
  68846. #else
  68847. "sbc r3, r5\n\t"
  68848. #endif
  68849. "stm %[a]!, {r2, r3}\n\t"
  68850. "ldm %[b]!, {r4, r5}\n\t"
  68851. "ldr r2, [%[a]]\n\t"
  68852. "ldr r3, [%[a], #4]\n\t"
  68853. #ifdef WOLFSSL_KEIL
  68854. "sbcs r2, r2, r4\n\t"
  68855. #elif defined(__clang__)
  68856. "sbcs r2, r4\n\t"
  68857. #else
  68858. "sbc r2, r4\n\t"
  68859. #endif
  68860. #ifdef WOLFSSL_KEIL
  68861. "sbcs r3, r3, r5\n\t"
  68862. #elif defined(__clang__)
  68863. "sbcs r3, r5\n\t"
  68864. #else
  68865. "sbc r3, r5\n\t"
  68866. #endif
  68867. "stm %[a]!, {r2, r3}\n\t"
  68868. "ldm %[b]!, {r4, r5}\n\t"
  68869. "ldr r2, [%[a]]\n\t"
  68870. "ldr r3, [%[a], #4]\n\t"
  68871. #ifdef WOLFSSL_KEIL
  68872. "sbcs r2, r2, r4\n\t"
  68873. #elif defined(__clang__)
  68874. "sbcs r2, r4\n\t"
  68875. #else
  68876. "sbc r2, r4\n\t"
  68877. #endif
  68878. #ifdef WOLFSSL_KEIL
  68879. "sbcs r3, r3, r5\n\t"
  68880. #elif defined(__clang__)
  68881. "sbcs r3, r5\n\t"
  68882. #else
  68883. "sbc r3, r5\n\t"
  68884. #endif
  68885. "stm %[a]!, {r2, r3}\n\t"
  68886. "ldm %[b]!, {r4, r5}\n\t"
  68887. "ldr r2, [%[a]]\n\t"
  68888. "ldr r3, [%[a], #4]\n\t"
  68889. #ifdef WOLFSSL_KEIL
  68890. "sbcs r2, r2, r4\n\t"
  68891. #elif defined(__clang__)
  68892. "sbcs r2, r4\n\t"
  68893. #else
  68894. "sbc r2, r4\n\t"
  68895. #endif
  68896. #ifdef WOLFSSL_KEIL
  68897. "sbcs r3, r3, r5\n\t"
  68898. #elif defined(__clang__)
  68899. "sbcs r3, r5\n\t"
  68900. #else
  68901. "sbc r3, r5\n\t"
  68902. #endif
  68903. "stm %[a]!, {r2, r3}\n\t"
  68904. #ifdef WOLFSSL_KEIL
  68905. "sbcs %[a], %[a], %[a]\n\t"
  68906. #elif defined(__clang__)
  68907. "sbcs %[a], %[a]\n\t"
  68908. #else
  68909. "sbc %[a], %[a]\n\t"
  68910. #endif
  68911. : [a] "+r" (a), [b] "+r" (b)
  68912. :
  68913. : "memory", "r2", "r3", "r4", "r5"
  68914. );
  68915. return (uint32_t)(size_t)a;
  68916. }
  68917. /* Add b to a into r. (r = a + b)
  68918. *
  68919. * r A single precision integer.
  68920. * a A single precision integer.
  68921. * b A single precision integer.
  68922. */
  68923. SP_NOINLINE static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a,
  68924. const sp_digit* b)
  68925. {
  68926. __asm__ __volatile__ (
  68927. "ldm %[b]!, {r5, r6}\n\t"
  68928. "ldm %[a]!, {r3, r4}\n\t"
  68929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68930. "adds r3, r3, r5\n\t"
  68931. #else
  68932. "add r3, r3, r5\n\t"
  68933. #endif
  68934. #ifdef WOLFSSL_KEIL
  68935. "adcs r4, r4, r6\n\t"
  68936. #elif defined(__clang__)
  68937. "adcs r4, r6\n\t"
  68938. #else
  68939. "adc r4, r6\n\t"
  68940. #endif
  68941. "stm %[r]!, {r3, r4}\n\t"
  68942. "ldm %[b]!, {r5, r6}\n\t"
  68943. "ldm %[a]!, {r3, r4}\n\t"
  68944. #ifdef WOLFSSL_KEIL
  68945. "adcs r3, r3, r5\n\t"
  68946. #elif defined(__clang__)
  68947. "adcs r3, r5\n\t"
  68948. #else
  68949. "adc r3, r5\n\t"
  68950. #endif
  68951. #ifdef WOLFSSL_KEIL
  68952. "adcs r4, r4, r6\n\t"
  68953. #elif defined(__clang__)
  68954. "adcs r4, r6\n\t"
  68955. #else
  68956. "adc r4, r6\n\t"
  68957. #endif
  68958. "stm %[r]!, {r3, r4}\n\t"
  68959. "ldm %[b]!, {r5, r6}\n\t"
  68960. "ldm %[a]!, {r3, r4}\n\t"
  68961. #ifdef WOLFSSL_KEIL
  68962. "adcs r3, r3, r5\n\t"
  68963. #elif defined(__clang__)
  68964. "adcs r3, r5\n\t"
  68965. #else
  68966. "adc r3, r5\n\t"
  68967. #endif
  68968. #ifdef WOLFSSL_KEIL
  68969. "adcs r4, r4, r6\n\t"
  68970. #elif defined(__clang__)
  68971. "adcs r4, r6\n\t"
  68972. #else
  68973. "adc r4, r6\n\t"
  68974. #endif
  68975. "stm %[r]!, {r3, r4}\n\t"
  68976. "ldm %[b]!, {r5, r6}\n\t"
  68977. "ldm %[a]!, {r3, r4}\n\t"
  68978. #ifdef WOLFSSL_KEIL
  68979. "adcs r3, r3, r5\n\t"
  68980. #elif defined(__clang__)
  68981. "adcs r3, r5\n\t"
  68982. #else
  68983. "adc r3, r5\n\t"
  68984. #endif
  68985. #ifdef WOLFSSL_KEIL
  68986. "adcs r4, r4, r6\n\t"
  68987. #elif defined(__clang__)
  68988. "adcs r4, r6\n\t"
  68989. #else
  68990. "adc r4, r6\n\t"
  68991. #endif
  68992. "stm %[r]!, {r3, r4}\n\t"
  68993. "ldm %[b]!, {r5, r6}\n\t"
  68994. "ldm %[a]!, {r3, r4}\n\t"
  68995. #ifdef WOLFSSL_KEIL
  68996. "adcs r3, r3, r5\n\t"
  68997. #elif defined(__clang__)
  68998. "adcs r3, r5\n\t"
  68999. #else
  69000. "adc r3, r5\n\t"
  69001. #endif
  69002. #ifdef WOLFSSL_KEIL
  69003. "adcs r4, r4, r6\n\t"
  69004. #elif defined(__clang__)
  69005. "adcs r4, r6\n\t"
  69006. #else
  69007. "adc r4, r6\n\t"
  69008. #endif
  69009. "stm %[r]!, {r3, r4}\n\t"
  69010. "ldm %[b]!, {r5, r6}\n\t"
  69011. "ldm %[a]!, {r3, r4}\n\t"
  69012. #ifdef WOLFSSL_KEIL
  69013. "adcs r3, r3, r5\n\t"
  69014. #elif defined(__clang__)
  69015. "adcs r3, r5\n\t"
  69016. #else
  69017. "adc r3, r5\n\t"
  69018. #endif
  69019. #ifdef WOLFSSL_KEIL
  69020. "adcs r4, r4, r6\n\t"
  69021. #elif defined(__clang__)
  69022. "adcs r4, r6\n\t"
  69023. #else
  69024. "adc r4, r6\n\t"
  69025. #endif
  69026. "stm %[r]!, {r3, r4}\n\t"
  69027. "ldm %[b]!, {r5, r6}\n\t"
  69028. "ldm %[a]!, {r3, r4}\n\t"
  69029. #ifdef WOLFSSL_KEIL
  69030. "adcs r3, r3, r5\n\t"
  69031. #elif defined(__clang__)
  69032. "adcs r3, r5\n\t"
  69033. #else
  69034. "adc r3, r5\n\t"
  69035. #endif
  69036. #ifdef WOLFSSL_KEIL
  69037. "adcs r4, r4, r6\n\t"
  69038. #elif defined(__clang__)
  69039. "adcs r4, r6\n\t"
  69040. #else
  69041. "adc r4, r6\n\t"
  69042. #endif
  69043. "stm %[r]!, {r3, r4}\n\t"
  69044. "ldm %[b]!, {r5, r6}\n\t"
  69045. "ldm %[a]!, {r3, r4}\n\t"
  69046. #ifdef WOLFSSL_KEIL
  69047. "adcs r3, r3, r5\n\t"
  69048. #elif defined(__clang__)
  69049. "adcs r3, r5\n\t"
  69050. #else
  69051. "adc r3, r5\n\t"
  69052. #endif
  69053. #ifdef WOLFSSL_KEIL
  69054. "adcs r4, r4, r6\n\t"
  69055. #elif defined(__clang__)
  69056. "adcs r4, r6\n\t"
  69057. #else
  69058. "adc r4, r6\n\t"
  69059. #endif
  69060. "stm %[r]!, {r3, r4}\n\t"
  69061. "ldm %[b]!, {r5, r6}\n\t"
  69062. "ldm %[a]!, {r3, r4}\n\t"
  69063. #ifdef WOLFSSL_KEIL
  69064. "adcs r3, r3, r5\n\t"
  69065. #elif defined(__clang__)
  69066. "adcs r3, r5\n\t"
  69067. #else
  69068. "adc r3, r5\n\t"
  69069. #endif
  69070. #ifdef WOLFSSL_KEIL
  69071. "adcs r4, r4, r6\n\t"
  69072. #elif defined(__clang__)
  69073. "adcs r4, r6\n\t"
  69074. #else
  69075. "adc r4, r6\n\t"
  69076. #endif
  69077. "stm %[r]!, {r3, r4}\n\t"
  69078. "ldm %[b]!, {r5, r6}\n\t"
  69079. "ldm %[a]!, {r3, r4}\n\t"
  69080. #ifdef WOLFSSL_KEIL
  69081. "adcs r3, r3, r5\n\t"
  69082. #elif defined(__clang__)
  69083. "adcs r3, r5\n\t"
  69084. #else
  69085. "adc r3, r5\n\t"
  69086. #endif
  69087. #ifdef WOLFSSL_KEIL
  69088. "adcs r4, r4, r6\n\t"
  69089. #elif defined(__clang__)
  69090. "adcs r4, r6\n\t"
  69091. #else
  69092. "adc r4, r6\n\t"
  69093. #endif
  69094. "stm %[r]!, {r3, r4}\n\t"
  69095. "ldm %[b]!, {r5, r6}\n\t"
  69096. "ldm %[a]!, {r3, r4}\n\t"
  69097. #ifdef WOLFSSL_KEIL
  69098. "adcs r3, r3, r5\n\t"
  69099. #elif defined(__clang__)
  69100. "adcs r3, r5\n\t"
  69101. #else
  69102. "adc r3, r5\n\t"
  69103. #endif
  69104. #ifdef WOLFSSL_KEIL
  69105. "adcs r4, r4, r6\n\t"
  69106. #elif defined(__clang__)
  69107. "adcs r4, r6\n\t"
  69108. #else
  69109. "adc r4, r6\n\t"
  69110. #endif
  69111. "stm %[r]!, {r3, r4}\n\t"
  69112. "ldm %[b]!, {r5, r6}\n\t"
  69113. "ldm %[a]!, {r3, r4}\n\t"
  69114. #ifdef WOLFSSL_KEIL
  69115. "adcs r3, r3, r5\n\t"
  69116. #elif defined(__clang__)
  69117. "adcs r3, r5\n\t"
  69118. #else
  69119. "adc r3, r5\n\t"
  69120. #endif
  69121. #ifdef WOLFSSL_KEIL
  69122. "adcs r4, r4, r6\n\t"
  69123. #elif defined(__clang__)
  69124. "adcs r4, r6\n\t"
  69125. #else
  69126. "adc r4, r6\n\t"
  69127. #endif
  69128. "stm %[r]!, {r3, r4}\n\t"
  69129. "ldm %[b]!, {r5, r6}\n\t"
  69130. "ldm %[a]!, {r3, r4}\n\t"
  69131. #ifdef WOLFSSL_KEIL
  69132. "adcs r3, r3, r5\n\t"
  69133. #elif defined(__clang__)
  69134. "adcs r3, r5\n\t"
  69135. #else
  69136. "adc r3, r5\n\t"
  69137. #endif
  69138. #ifdef WOLFSSL_KEIL
  69139. "adcs r4, r4, r6\n\t"
  69140. #elif defined(__clang__)
  69141. "adcs r4, r6\n\t"
  69142. #else
  69143. "adc r4, r6\n\t"
  69144. #endif
  69145. "stm %[r]!, {r3, r4}\n\t"
  69146. "ldm %[b]!, {r5, r6}\n\t"
  69147. "ldm %[a]!, {r3, r4}\n\t"
  69148. #ifdef WOLFSSL_KEIL
  69149. "adcs r3, r3, r5\n\t"
  69150. #elif defined(__clang__)
  69151. "adcs r3, r5\n\t"
  69152. #else
  69153. "adc r3, r5\n\t"
  69154. #endif
  69155. #ifdef WOLFSSL_KEIL
  69156. "adcs r4, r4, r6\n\t"
  69157. #elif defined(__clang__)
  69158. "adcs r4, r6\n\t"
  69159. #else
  69160. "adc r4, r6\n\t"
  69161. #endif
  69162. "stm %[r]!, {r3, r4}\n\t"
  69163. "ldm %[b]!, {r5, r6}\n\t"
  69164. "ldm %[a]!, {r3, r4}\n\t"
  69165. #ifdef WOLFSSL_KEIL
  69166. "adcs r3, r3, r5\n\t"
  69167. #elif defined(__clang__)
  69168. "adcs r3, r5\n\t"
  69169. #else
  69170. "adc r3, r5\n\t"
  69171. #endif
  69172. #ifdef WOLFSSL_KEIL
  69173. "adcs r4, r4, r6\n\t"
  69174. #elif defined(__clang__)
  69175. "adcs r4, r6\n\t"
  69176. #else
  69177. "adc r4, r6\n\t"
  69178. #endif
  69179. "stm %[r]!, {r3, r4}\n\t"
  69180. "ldm %[b]!, {r5, r6}\n\t"
  69181. "ldm %[a]!, {r3, r4}\n\t"
  69182. #ifdef WOLFSSL_KEIL
  69183. "adcs r3, r3, r5\n\t"
  69184. #elif defined(__clang__)
  69185. "adcs r3, r5\n\t"
  69186. #else
  69187. "adc r3, r5\n\t"
  69188. #endif
  69189. #ifdef WOLFSSL_KEIL
  69190. "adcs r4, r4, r6\n\t"
  69191. #elif defined(__clang__)
  69192. "adcs r4, r6\n\t"
  69193. #else
  69194. "adc r4, r6\n\t"
  69195. #endif
  69196. "stm %[r]!, {r3, r4}\n\t"
  69197. "ldm %[b]!, {r5, r6}\n\t"
  69198. "ldm %[a]!, {r3, r4}\n\t"
  69199. #ifdef WOLFSSL_KEIL
  69200. "adcs r3, r3, r5\n\t"
  69201. #elif defined(__clang__)
  69202. "adcs r3, r5\n\t"
  69203. #else
  69204. "adc r3, r5\n\t"
  69205. #endif
  69206. #ifdef WOLFSSL_KEIL
  69207. "adcs r4, r4, r6\n\t"
  69208. #elif defined(__clang__)
  69209. "adcs r4, r6\n\t"
  69210. #else
  69211. "adc r4, r6\n\t"
  69212. #endif
  69213. "stm %[r]!, {r3, r4}\n\t"
  69214. "ldm %[b]!, {r5, r6}\n\t"
  69215. "ldm %[a]!, {r3, r4}\n\t"
  69216. #ifdef WOLFSSL_KEIL
  69217. "adcs r3, r3, r5\n\t"
  69218. #elif defined(__clang__)
  69219. "adcs r3, r5\n\t"
  69220. #else
  69221. "adc r3, r5\n\t"
  69222. #endif
  69223. #ifdef WOLFSSL_KEIL
  69224. "adcs r4, r4, r6\n\t"
  69225. #elif defined(__clang__)
  69226. "adcs r4, r6\n\t"
  69227. #else
  69228. "adc r4, r6\n\t"
  69229. #endif
  69230. "stm %[r]!, {r3, r4}\n\t"
  69231. "ldm %[b]!, {r5, r6}\n\t"
  69232. "ldm %[a]!, {r3, r4}\n\t"
  69233. #ifdef WOLFSSL_KEIL
  69234. "adcs r3, r3, r5\n\t"
  69235. #elif defined(__clang__)
  69236. "adcs r3, r5\n\t"
  69237. #else
  69238. "adc r3, r5\n\t"
  69239. #endif
  69240. #ifdef WOLFSSL_KEIL
  69241. "adcs r4, r4, r6\n\t"
  69242. #elif defined(__clang__)
  69243. "adcs r4, r6\n\t"
  69244. #else
  69245. "adc r4, r6\n\t"
  69246. #endif
  69247. "stm %[r]!, {r3, r4}\n\t"
  69248. "ldm %[b]!, {r5, r6}\n\t"
  69249. "ldm %[a]!, {r3, r4}\n\t"
  69250. #ifdef WOLFSSL_KEIL
  69251. "adcs r3, r3, r5\n\t"
  69252. #elif defined(__clang__)
  69253. "adcs r3, r5\n\t"
  69254. #else
  69255. "adc r3, r5\n\t"
  69256. #endif
  69257. #ifdef WOLFSSL_KEIL
  69258. "adcs r4, r4, r6\n\t"
  69259. #elif defined(__clang__)
  69260. "adcs r4, r6\n\t"
  69261. #else
  69262. "adc r4, r6\n\t"
  69263. #endif
  69264. "stm %[r]!, {r3, r4}\n\t"
  69265. "ldm %[b]!, {r5, r6}\n\t"
  69266. "ldm %[a]!, {r3, r4}\n\t"
  69267. #ifdef WOLFSSL_KEIL
  69268. "adcs r3, r3, r5\n\t"
  69269. #elif defined(__clang__)
  69270. "adcs r3, r5\n\t"
  69271. #else
  69272. "adc r3, r5\n\t"
  69273. #endif
  69274. #ifdef WOLFSSL_KEIL
  69275. "adcs r4, r4, r6\n\t"
  69276. #elif defined(__clang__)
  69277. "adcs r4, r6\n\t"
  69278. #else
  69279. "adc r4, r6\n\t"
  69280. #endif
  69281. "stm %[r]!, {r3, r4}\n\t"
  69282. "ldm %[b]!, {r5, r6}\n\t"
  69283. "ldm %[a]!, {r3, r4}\n\t"
  69284. #ifdef WOLFSSL_KEIL
  69285. "adcs r3, r3, r5\n\t"
  69286. #elif defined(__clang__)
  69287. "adcs r3, r5\n\t"
  69288. #else
  69289. "adc r3, r5\n\t"
  69290. #endif
  69291. #ifdef WOLFSSL_KEIL
  69292. "adcs r4, r4, r6\n\t"
  69293. #elif defined(__clang__)
  69294. "adcs r4, r6\n\t"
  69295. #else
  69296. "adc r4, r6\n\t"
  69297. #endif
  69298. "stm %[r]!, {r3, r4}\n\t"
  69299. "ldm %[b]!, {r5, r6}\n\t"
  69300. "ldm %[a]!, {r3, r4}\n\t"
  69301. #ifdef WOLFSSL_KEIL
  69302. "adcs r3, r3, r5\n\t"
  69303. #elif defined(__clang__)
  69304. "adcs r3, r5\n\t"
  69305. #else
  69306. "adc r3, r5\n\t"
  69307. #endif
  69308. #ifdef WOLFSSL_KEIL
  69309. "adcs r4, r4, r6\n\t"
  69310. #elif defined(__clang__)
  69311. "adcs r4, r6\n\t"
  69312. #else
  69313. "adc r4, r6\n\t"
  69314. #endif
  69315. "stm %[r]!, {r3, r4}\n\t"
  69316. "ldm %[b]!, {r5, r6}\n\t"
  69317. "ldm %[a]!, {r3, r4}\n\t"
  69318. #ifdef WOLFSSL_KEIL
  69319. "adcs r3, r3, r5\n\t"
  69320. #elif defined(__clang__)
  69321. "adcs r3, r5\n\t"
  69322. #else
  69323. "adc r3, r5\n\t"
  69324. #endif
  69325. #ifdef WOLFSSL_KEIL
  69326. "adcs r4, r4, r6\n\t"
  69327. #elif defined(__clang__)
  69328. "adcs r4, r6\n\t"
  69329. #else
  69330. "adc r4, r6\n\t"
  69331. #endif
  69332. "stm %[r]!, {r3, r4}\n\t"
  69333. "ldm %[b]!, {r5, r6}\n\t"
  69334. "ldm %[a]!, {r3, r4}\n\t"
  69335. #ifdef WOLFSSL_KEIL
  69336. "adcs r3, r3, r5\n\t"
  69337. #elif defined(__clang__)
  69338. "adcs r3, r5\n\t"
  69339. #else
  69340. "adc r3, r5\n\t"
  69341. #endif
  69342. #ifdef WOLFSSL_KEIL
  69343. "adcs r4, r4, r6\n\t"
  69344. #elif defined(__clang__)
  69345. "adcs r4, r6\n\t"
  69346. #else
  69347. "adc r4, r6\n\t"
  69348. #endif
  69349. "stm %[r]!, {r3, r4}\n\t"
  69350. "ldm %[b]!, {r5, r6}\n\t"
  69351. "ldm %[a]!, {r3, r4}\n\t"
  69352. #ifdef WOLFSSL_KEIL
  69353. "adcs r3, r3, r5\n\t"
  69354. #elif defined(__clang__)
  69355. "adcs r3, r5\n\t"
  69356. #else
  69357. "adc r3, r5\n\t"
  69358. #endif
  69359. #ifdef WOLFSSL_KEIL
  69360. "adcs r4, r4, r6\n\t"
  69361. #elif defined(__clang__)
  69362. "adcs r4, r6\n\t"
  69363. #else
  69364. "adc r4, r6\n\t"
  69365. #endif
  69366. "stm %[r]!, {r3, r4}\n\t"
  69367. "ldm %[b]!, {r5, r6}\n\t"
  69368. "ldm %[a]!, {r3, r4}\n\t"
  69369. #ifdef WOLFSSL_KEIL
  69370. "adcs r3, r3, r5\n\t"
  69371. #elif defined(__clang__)
  69372. "adcs r3, r5\n\t"
  69373. #else
  69374. "adc r3, r5\n\t"
  69375. #endif
  69376. #ifdef WOLFSSL_KEIL
  69377. "adcs r4, r4, r6\n\t"
  69378. #elif defined(__clang__)
  69379. "adcs r4, r6\n\t"
  69380. #else
  69381. "adc r4, r6\n\t"
  69382. #endif
  69383. "stm %[r]!, {r3, r4}\n\t"
  69384. "ldm %[b]!, {r5, r6}\n\t"
  69385. "ldm %[a]!, {r3, r4}\n\t"
  69386. #ifdef WOLFSSL_KEIL
  69387. "adcs r3, r3, r5\n\t"
  69388. #elif defined(__clang__)
  69389. "adcs r3, r5\n\t"
  69390. #else
  69391. "adc r3, r5\n\t"
  69392. #endif
  69393. #ifdef WOLFSSL_KEIL
  69394. "adcs r4, r4, r6\n\t"
  69395. #elif defined(__clang__)
  69396. "adcs r4, r6\n\t"
  69397. #else
  69398. "adc r4, r6\n\t"
  69399. #endif
  69400. "stm %[r]!, {r3, r4}\n\t"
  69401. "ldm %[b]!, {r5, r6}\n\t"
  69402. "ldm %[a]!, {r3, r4}\n\t"
  69403. #ifdef WOLFSSL_KEIL
  69404. "adcs r3, r3, r5\n\t"
  69405. #elif defined(__clang__)
  69406. "adcs r3, r5\n\t"
  69407. #else
  69408. "adc r3, r5\n\t"
  69409. #endif
  69410. #ifdef WOLFSSL_KEIL
  69411. "adcs r4, r4, r6\n\t"
  69412. #elif defined(__clang__)
  69413. "adcs r4, r6\n\t"
  69414. #else
  69415. "adc r4, r6\n\t"
  69416. #endif
  69417. "stm %[r]!, {r3, r4}\n\t"
  69418. "ldm %[b]!, {r5, r6}\n\t"
  69419. "ldm %[a]!, {r3, r4}\n\t"
  69420. #ifdef WOLFSSL_KEIL
  69421. "adcs r3, r3, r5\n\t"
  69422. #elif defined(__clang__)
  69423. "adcs r3, r5\n\t"
  69424. #else
  69425. "adc r3, r5\n\t"
  69426. #endif
  69427. #ifdef WOLFSSL_KEIL
  69428. "adcs r4, r4, r6\n\t"
  69429. #elif defined(__clang__)
  69430. "adcs r4, r6\n\t"
  69431. #else
  69432. "adc r4, r6\n\t"
  69433. #endif
  69434. "stm %[r]!, {r3, r4}\n\t"
  69435. "ldm %[b]!, {r5, r6}\n\t"
  69436. "ldm %[a]!, {r3, r4}\n\t"
  69437. #ifdef WOLFSSL_KEIL
  69438. "adcs r3, r3, r5\n\t"
  69439. #elif defined(__clang__)
  69440. "adcs r3, r5\n\t"
  69441. #else
  69442. "adc r3, r5\n\t"
  69443. #endif
  69444. #ifdef WOLFSSL_KEIL
  69445. "adcs r4, r4, r6\n\t"
  69446. #elif defined(__clang__)
  69447. "adcs r4, r6\n\t"
  69448. #else
  69449. "adc r4, r6\n\t"
  69450. #endif
  69451. "stm %[r]!, {r3, r4}\n\t"
  69452. "ldm %[b]!, {r5, r6}\n\t"
  69453. "ldm %[a]!, {r3, r4}\n\t"
  69454. #ifdef WOLFSSL_KEIL
  69455. "adcs r3, r3, r5\n\t"
  69456. #elif defined(__clang__)
  69457. "adcs r3, r5\n\t"
  69458. #else
  69459. "adc r3, r5\n\t"
  69460. #endif
  69461. #ifdef WOLFSSL_KEIL
  69462. "adcs r4, r4, r6\n\t"
  69463. #elif defined(__clang__)
  69464. "adcs r4, r6\n\t"
  69465. #else
  69466. "adc r4, r6\n\t"
  69467. #endif
  69468. "stm %[r]!, {r3, r4}\n\t"
  69469. "ldm %[b]!, {r5, r6}\n\t"
  69470. "ldm %[a]!, {r3, r4}\n\t"
  69471. #ifdef WOLFSSL_KEIL
  69472. "adcs r3, r3, r5\n\t"
  69473. #elif defined(__clang__)
  69474. "adcs r3, r5\n\t"
  69475. #else
  69476. "adc r3, r5\n\t"
  69477. #endif
  69478. #ifdef WOLFSSL_KEIL
  69479. "adcs r4, r4, r6\n\t"
  69480. #elif defined(__clang__)
  69481. "adcs r4, r6\n\t"
  69482. #else
  69483. "adc r4, r6\n\t"
  69484. #endif
  69485. "stm %[r]!, {r3, r4}\n\t"
  69486. "ldm %[b]!, {r5, r6}\n\t"
  69487. "ldm %[a]!, {r3, r4}\n\t"
  69488. #ifdef WOLFSSL_KEIL
  69489. "adcs r3, r3, r5\n\t"
  69490. #elif defined(__clang__)
  69491. "adcs r3, r5\n\t"
  69492. #else
  69493. "adc r3, r5\n\t"
  69494. #endif
  69495. #ifdef WOLFSSL_KEIL
  69496. "adcs r4, r4, r6\n\t"
  69497. #elif defined(__clang__)
  69498. "adcs r4, r6\n\t"
  69499. #else
  69500. "adc r4, r6\n\t"
  69501. #endif
  69502. "stm %[r]!, {r3, r4}\n\t"
  69503. "ldm %[b]!, {r5, r6}\n\t"
  69504. "ldm %[a]!, {r3, r4}\n\t"
  69505. #ifdef WOLFSSL_KEIL
  69506. "adcs r3, r3, r5\n\t"
  69507. #elif defined(__clang__)
  69508. "adcs r3, r5\n\t"
  69509. #else
  69510. "adc r3, r5\n\t"
  69511. #endif
  69512. #ifdef WOLFSSL_KEIL
  69513. "adcs r4, r4, r6\n\t"
  69514. #elif defined(__clang__)
  69515. "adcs r4, r6\n\t"
  69516. #else
  69517. "adc r4, r6\n\t"
  69518. #endif
  69519. "stm %[r]!, {r3, r4}\n\t"
  69520. "ldm %[b]!, {r5, r6}\n\t"
  69521. "ldm %[a]!, {r3, r4}\n\t"
  69522. #ifdef WOLFSSL_KEIL
  69523. "adcs r3, r3, r5\n\t"
  69524. #elif defined(__clang__)
  69525. "adcs r3, r5\n\t"
  69526. #else
  69527. "adc r3, r5\n\t"
  69528. #endif
  69529. #ifdef WOLFSSL_KEIL
  69530. "adcs r4, r4, r6\n\t"
  69531. #elif defined(__clang__)
  69532. "adcs r4, r6\n\t"
  69533. #else
  69534. "adc r4, r6\n\t"
  69535. #endif
  69536. "stm %[r]!, {r3, r4}\n\t"
  69537. "ldm %[b]!, {r5, r6}\n\t"
  69538. "ldm %[a]!, {r3, r4}\n\t"
  69539. #ifdef WOLFSSL_KEIL
  69540. "adcs r3, r3, r5\n\t"
  69541. #elif defined(__clang__)
  69542. "adcs r3, r5\n\t"
  69543. #else
  69544. "adc r3, r5\n\t"
  69545. #endif
  69546. #ifdef WOLFSSL_KEIL
  69547. "adcs r4, r4, r6\n\t"
  69548. #elif defined(__clang__)
  69549. "adcs r4, r6\n\t"
  69550. #else
  69551. "adc r4, r6\n\t"
  69552. #endif
  69553. "stm %[r]!, {r3, r4}\n\t"
  69554. "ldm %[b]!, {r5, r6}\n\t"
  69555. "ldm %[a]!, {r3, r4}\n\t"
  69556. #ifdef WOLFSSL_KEIL
  69557. "adcs r3, r3, r5\n\t"
  69558. #elif defined(__clang__)
  69559. "adcs r3, r5\n\t"
  69560. #else
  69561. "adc r3, r5\n\t"
  69562. #endif
  69563. #ifdef WOLFSSL_KEIL
  69564. "adcs r4, r4, r6\n\t"
  69565. #elif defined(__clang__)
  69566. "adcs r4, r6\n\t"
  69567. #else
  69568. "adc r4, r6\n\t"
  69569. #endif
  69570. "stm %[r]!, {r3, r4}\n\t"
  69571. "ldm %[b]!, {r5, r6}\n\t"
  69572. "ldm %[a]!, {r3, r4}\n\t"
  69573. #ifdef WOLFSSL_KEIL
  69574. "adcs r3, r3, r5\n\t"
  69575. #elif defined(__clang__)
  69576. "adcs r3, r5\n\t"
  69577. #else
  69578. "adc r3, r5\n\t"
  69579. #endif
  69580. #ifdef WOLFSSL_KEIL
  69581. "adcs r4, r4, r6\n\t"
  69582. #elif defined(__clang__)
  69583. "adcs r4, r6\n\t"
  69584. #else
  69585. "adc r4, r6\n\t"
  69586. #endif
  69587. "stm %[r]!, {r3, r4}\n\t"
  69588. "ldm %[b]!, {r5, r6}\n\t"
  69589. "ldm %[a]!, {r3, r4}\n\t"
  69590. #ifdef WOLFSSL_KEIL
  69591. "adcs r3, r3, r5\n\t"
  69592. #elif defined(__clang__)
  69593. "adcs r3, r5\n\t"
  69594. #else
  69595. "adc r3, r5\n\t"
  69596. #endif
  69597. #ifdef WOLFSSL_KEIL
  69598. "adcs r4, r4, r6\n\t"
  69599. #elif defined(__clang__)
  69600. "adcs r4, r6\n\t"
  69601. #else
  69602. "adc r4, r6\n\t"
  69603. #endif
  69604. "stm %[r]!, {r3, r4}\n\t"
  69605. "ldm %[b]!, {r5, r6}\n\t"
  69606. "ldm %[a]!, {r3, r4}\n\t"
  69607. #ifdef WOLFSSL_KEIL
  69608. "adcs r3, r3, r5\n\t"
  69609. #elif defined(__clang__)
  69610. "adcs r3, r5\n\t"
  69611. #else
  69612. "adc r3, r5\n\t"
  69613. #endif
  69614. #ifdef WOLFSSL_KEIL
  69615. "adcs r4, r4, r6\n\t"
  69616. #elif defined(__clang__)
  69617. "adcs r4, r6\n\t"
  69618. #else
  69619. "adc r4, r6\n\t"
  69620. #endif
  69621. "stm %[r]!, {r3, r4}\n\t"
  69622. "ldm %[b]!, {r5, r6}\n\t"
  69623. "ldm %[a]!, {r3, r4}\n\t"
  69624. #ifdef WOLFSSL_KEIL
  69625. "adcs r3, r3, r5\n\t"
  69626. #elif defined(__clang__)
  69627. "adcs r3, r5\n\t"
  69628. #else
  69629. "adc r3, r5\n\t"
  69630. #endif
  69631. #ifdef WOLFSSL_KEIL
  69632. "adcs r4, r4, r6\n\t"
  69633. #elif defined(__clang__)
  69634. "adcs r4, r6\n\t"
  69635. #else
  69636. "adc r4, r6\n\t"
  69637. #endif
  69638. "stm %[r]!, {r3, r4}\n\t"
  69639. "ldm %[b]!, {r5, r6}\n\t"
  69640. "ldm %[a]!, {r3, r4}\n\t"
  69641. #ifdef WOLFSSL_KEIL
  69642. "adcs r3, r3, r5\n\t"
  69643. #elif defined(__clang__)
  69644. "adcs r3, r5\n\t"
  69645. #else
  69646. "adc r3, r5\n\t"
  69647. #endif
  69648. #ifdef WOLFSSL_KEIL
  69649. "adcs r4, r4, r6\n\t"
  69650. #elif defined(__clang__)
  69651. "adcs r4, r6\n\t"
  69652. #else
  69653. "adc r4, r6\n\t"
  69654. #endif
  69655. "stm %[r]!, {r3, r4}\n\t"
  69656. "ldm %[b]!, {r5, r6}\n\t"
  69657. "ldm %[a]!, {r3, r4}\n\t"
  69658. #ifdef WOLFSSL_KEIL
  69659. "adcs r3, r3, r5\n\t"
  69660. #elif defined(__clang__)
  69661. "adcs r3, r5\n\t"
  69662. #else
  69663. "adc r3, r5\n\t"
  69664. #endif
  69665. #ifdef WOLFSSL_KEIL
  69666. "adcs r4, r4, r6\n\t"
  69667. #elif defined(__clang__)
  69668. "adcs r4, r6\n\t"
  69669. #else
  69670. "adc r4, r6\n\t"
  69671. #endif
  69672. "stm %[r]!, {r3, r4}\n\t"
  69673. "ldm %[b]!, {r5, r6}\n\t"
  69674. "ldm %[a]!, {r3, r4}\n\t"
  69675. #ifdef WOLFSSL_KEIL
  69676. "adcs r3, r3, r5\n\t"
  69677. #elif defined(__clang__)
  69678. "adcs r3, r5\n\t"
  69679. #else
  69680. "adc r3, r5\n\t"
  69681. #endif
  69682. #ifdef WOLFSSL_KEIL
  69683. "adcs r4, r4, r6\n\t"
  69684. #elif defined(__clang__)
  69685. "adcs r4, r6\n\t"
  69686. #else
  69687. "adc r4, r6\n\t"
  69688. #endif
  69689. "stm %[r]!, {r3, r4}\n\t"
  69690. "ldm %[b]!, {r5, r6}\n\t"
  69691. "ldm %[a]!, {r3, r4}\n\t"
  69692. #ifdef WOLFSSL_KEIL
  69693. "adcs r3, r3, r5\n\t"
  69694. #elif defined(__clang__)
  69695. "adcs r3, r5\n\t"
  69696. #else
  69697. "adc r3, r5\n\t"
  69698. #endif
  69699. #ifdef WOLFSSL_KEIL
  69700. "adcs r4, r4, r6\n\t"
  69701. #elif defined(__clang__)
  69702. "adcs r4, r6\n\t"
  69703. #else
  69704. "adc r4, r6\n\t"
  69705. #endif
  69706. "stm %[r]!, {r3, r4}\n\t"
  69707. "ldm %[b]!, {r5, r6}\n\t"
  69708. "ldm %[a]!, {r3, r4}\n\t"
  69709. #ifdef WOLFSSL_KEIL
  69710. "adcs r3, r3, r5\n\t"
  69711. #elif defined(__clang__)
  69712. "adcs r3, r5\n\t"
  69713. #else
  69714. "adc r3, r5\n\t"
  69715. #endif
  69716. #ifdef WOLFSSL_KEIL
  69717. "adcs r4, r4, r6\n\t"
  69718. #elif defined(__clang__)
  69719. "adcs r4, r6\n\t"
  69720. #else
  69721. "adc r4, r6\n\t"
  69722. #endif
  69723. "stm %[r]!, {r3, r4}\n\t"
  69724. "ldm %[b]!, {r5, r6}\n\t"
  69725. "ldm %[a]!, {r3, r4}\n\t"
  69726. #ifdef WOLFSSL_KEIL
  69727. "adcs r3, r3, r5\n\t"
  69728. #elif defined(__clang__)
  69729. "adcs r3, r5\n\t"
  69730. #else
  69731. "adc r3, r5\n\t"
  69732. #endif
  69733. #ifdef WOLFSSL_KEIL
  69734. "adcs r4, r4, r6\n\t"
  69735. #elif defined(__clang__)
  69736. "adcs r4, r6\n\t"
  69737. #else
  69738. "adc r4, r6\n\t"
  69739. #endif
  69740. "stm %[r]!, {r3, r4}\n\t"
  69741. "movs %[r], #0\n\t"
  69742. #ifdef WOLFSSL_KEIL
  69743. "adcs %[r], %[r], %[r]\n\t"
  69744. #elif defined(__clang__)
  69745. "adcs %[r], %[r]\n\t"
  69746. #else
  69747. "adc %[r], %[r]\n\t"
  69748. #endif
  69749. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  69750. :
  69751. : "memory", "r3", "r4", "r5", "r6"
  69752. );
  69753. return (uint32_t)(size_t)r;
  69754. }
  69755. /* AND m into each word of a and store in r.
  69756. *
  69757. * r A single precision integer.
  69758. * a A single precision integer.
  69759. * m Mask to AND against each digit.
  69760. */
  69761. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  69762. {
  69763. #ifdef WOLFSSL_SP_SMALL
  69764. int i;
  69765. for (i=0; i<48; i++) {
  69766. r[i] = a[i] & m;
  69767. }
  69768. #else
  69769. int i;
  69770. for (i = 0; i < 48; i += 8) {
  69771. r[i+0] = a[i+0] & m;
  69772. r[i+1] = a[i+1] & m;
  69773. r[i+2] = a[i+2] & m;
  69774. r[i+3] = a[i+3] & m;
  69775. r[i+4] = a[i+4] & m;
  69776. r[i+5] = a[i+5] & m;
  69777. r[i+6] = a[i+6] & m;
  69778. r[i+7] = a[i+7] & m;
  69779. }
  69780. #endif
  69781. }
  69782. /* Multiply a and b into r. (r = a * b)
  69783. *
  69784. * r A single precision integer.
  69785. * a A single precision integer.
  69786. * b A single precision integer.
  69787. */
  69788. SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a,
  69789. const sp_digit* b)
  69790. {
  69791. sp_digit* z0 = r;
  69792. sp_digit z1[96];
  69793. sp_digit a1[48];
  69794. sp_digit b1[48];
  69795. sp_digit z2[96];
  69796. sp_digit u;
  69797. sp_digit ca;
  69798. sp_digit cb;
  69799. ca = sp_3072_add_48(a1, a, &a[48]);
  69800. cb = sp_3072_add_48(b1, b, &b[48]);
  69801. u = ca & cb;
  69802. sp_3072_mul_48(z1, a1, b1);
  69803. sp_3072_mul_48(z2, &a[48], &b[48]);
  69804. sp_3072_mul_48(z0, a, b);
  69805. sp_3072_mask_48(r + 96, a1, 0 - cb);
  69806. sp_3072_mask_48(b1, b1, 0 - ca);
  69807. u += sp_3072_add_48(r + 96, r + 96, b1);
  69808. u += sp_3072_sub_in_place_96(z1, z2);
  69809. u += sp_3072_sub_in_place_96(z1, z0);
  69810. u += sp_3072_add_96(r + 48, r + 48, z1);
  69811. u += sp_3072_add_48(r + 96, r + 96, z2);
  69812. (void)sp_3072_add_to_word_48(r + 144, u, z2 + 48);
  69813. }
  69814. /* Double a into r. (r = a + a)
  69815. *
  69816. * r A single precision integer.
  69817. * a A single precision integer.
  69818. */
  69819. SP_NOINLINE static sp_digit sp_3072_dbl_48(sp_digit* r, const sp_digit* a)
  69820. {
  69821. __asm__ __volatile__ (
  69822. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  69823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69824. "adds r2, r2, r2\n\t"
  69825. #else
  69826. "add r2, r2, r2\n\t"
  69827. #endif
  69828. #ifdef WOLFSSL_KEIL
  69829. "adcs r3, r3, r3\n\t"
  69830. #elif defined(__clang__)
  69831. "adcs r3, r3\n\t"
  69832. #else
  69833. "adc r3, r3\n\t"
  69834. #endif
  69835. #ifdef WOLFSSL_KEIL
  69836. "adcs r4, r4, r4\n\t"
  69837. #elif defined(__clang__)
  69838. "adcs r4, r4\n\t"
  69839. #else
  69840. "adc r4, r4\n\t"
  69841. #endif
  69842. #ifdef WOLFSSL_KEIL
  69843. "adcs r5, r5, r5\n\t"
  69844. #elif defined(__clang__)
  69845. "adcs r5, r5\n\t"
  69846. #else
  69847. "adc r5, r5\n\t"
  69848. #endif
  69849. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69850. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  69851. #ifdef WOLFSSL_KEIL
  69852. "adcs r2, r2, r2\n\t"
  69853. #elif defined(__clang__)
  69854. "adcs r2, r2\n\t"
  69855. #else
  69856. "adc r2, r2\n\t"
  69857. #endif
  69858. #ifdef WOLFSSL_KEIL
  69859. "adcs r3, r3, r3\n\t"
  69860. #elif defined(__clang__)
  69861. "adcs r3, r3\n\t"
  69862. #else
  69863. "adc r3, r3\n\t"
  69864. #endif
  69865. #ifdef WOLFSSL_KEIL
  69866. "adcs r4, r4, r4\n\t"
  69867. #elif defined(__clang__)
  69868. "adcs r4, r4\n\t"
  69869. #else
  69870. "adc r4, r4\n\t"
  69871. #endif
  69872. #ifdef WOLFSSL_KEIL
  69873. "adcs r5, r5, r5\n\t"
  69874. #elif defined(__clang__)
  69875. "adcs r5, r5\n\t"
  69876. #else
  69877. "adc r5, r5\n\t"
  69878. #endif
  69879. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69880. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  69881. #ifdef WOLFSSL_KEIL
  69882. "adcs r2, r2, r2\n\t"
  69883. #elif defined(__clang__)
  69884. "adcs r2, r2\n\t"
  69885. #else
  69886. "adc r2, r2\n\t"
  69887. #endif
  69888. #ifdef WOLFSSL_KEIL
  69889. "adcs r3, r3, r3\n\t"
  69890. #elif defined(__clang__)
  69891. "adcs r3, r3\n\t"
  69892. #else
  69893. "adc r3, r3\n\t"
  69894. #endif
  69895. #ifdef WOLFSSL_KEIL
  69896. "adcs r4, r4, r4\n\t"
  69897. #elif defined(__clang__)
  69898. "adcs r4, r4\n\t"
  69899. #else
  69900. "adc r4, r4\n\t"
  69901. #endif
  69902. #ifdef WOLFSSL_KEIL
  69903. "adcs r5, r5, r5\n\t"
  69904. #elif defined(__clang__)
  69905. "adcs r5, r5\n\t"
  69906. #else
  69907. "adc r5, r5\n\t"
  69908. #endif
  69909. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69910. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  69911. #ifdef WOLFSSL_KEIL
  69912. "adcs r2, r2, r2\n\t"
  69913. #elif defined(__clang__)
  69914. "adcs r2, r2\n\t"
  69915. #else
  69916. "adc r2, r2\n\t"
  69917. #endif
  69918. #ifdef WOLFSSL_KEIL
  69919. "adcs r3, r3, r3\n\t"
  69920. #elif defined(__clang__)
  69921. "adcs r3, r3\n\t"
  69922. #else
  69923. "adc r3, r3\n\t"
  69924. #endif
  69925. #ifdef WOLFSSL_KEIL
  69926. "adcs r4, r4, r4\n\t"
  69927. #elif defined(__clang__)
  69928. "adcs r4, r4\n\t"
  69929. #else
  69930. "adc r4, r4\n\t"
  69931. #endif
  69932. #ifdef WOLFSSL_KEIL
  69933. "adcs r5, r5, r5\n\t"
  69934. #elif defined(__clang__)
  69935. "adcs r5, r5\n\t"
  69936. #else
  69937. "adc r5, r5\n\t"
  69938. #endif
  69939. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69940. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  69941. #ifdef WOLFSSL_KEIL
  69942. "adcs r2, r2, r2\n\t"
  69943. #elif defined(__clang__)
  69944. "adcs r2, r2\n\t"
  69945. #else
  69946. "adc r2, r2\n\t"
  69947. #endif
  69948. #ifdef WOLFSSL_KEIL
  69949. "adcs r3, r3, r3\n\t"
  69950. #elif defined(__clang__)
  69951. "adcs r3, r3\n\t"
  69952. #else
  69953. "adc r3, r3\n\t"
  69954. #endif
  69955. #ifdef WOLFSSL_KEIL
  69956. "adcs r4, r4, r4\n\t"
  69957. #elif defined(__clang__)
  69958. "adcs r4, r4\n\t"
  69959. #else
  69960. "adc r4, r4\n\t"
  69961. #endif
  69962. #ifdef WOLFSSL_KEIL
  69963. "adcs r5, r5, r5\n\t"
  69964. #elif defined(__clang__)
  69965. "adcs r5, r5\n\t"
  69966. #else
  69967. "adc r5, r5\n\t"
  69968. #endif
  69969. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69970. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  69971. #ifdef WOLFSSL_KEIL
  69972. "adcs r2, r2, r2\n\t"
  69973. #elif defined(__clang__)
  69974. "adcs r2, r2\n\t"
  69975. #else
  69976. "adc r2, r2\n\t"
  69977. #endif
  69978. #ifdef WOLFSSL_KEIL
  69979. "adcs r3, r3, r3\n\t"
  69980. #elif defined(__clang__)
  69981. "adcs r3, r3\n\t"
  69982. #else
  69983. "adc r3, r3\n\t"
  69984. #endif
  69985. #ifdef WOLFSSL_KEIL
  69986. "adcs r4, r4, r4\n\t"
  69987. #elif defined(__clang__)
  69988. "adcs r4, r4\n\t"
  69989. #else
  69990. "adc r4, r4\n\t"
  69991. #endif
  69992. #ifdef WOLFSSL_KEIL
  69993. "adcs r5, r5, r5\n\t"
  69994. #elif defined(__clang__)
  69995. "adcs r5, r5\n\t"
  69996. #else
  69997. "adc r5, r5\n\t"
  69998. #endif
  69999. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  70000. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  70001. #ifdef WOLFSSL_KEIL
  70002. "adcs r2, r2, r2\n\t"
  70003. #elif defined(__clang__)
  70004. "adcs r2, r2\n\t"
  70005. #else
  70006. "adc r2, r2\n\t"
  70007. #endif
  70008. #ifdef WOLFSSL_KEIL
  70009. "adcs r3, r3, r3\n\t"
  70010. #elif defined(__clang__)
  70011. "adcs r3, r3\n\t"
  70012. #else
  70013. "adc r3, r3\n\t"
  70014. #endif
  70015. #ifdef WOLFSSL_KEIL
  70016. "adcs r4, r4, r4\n\t"
  70017. #elif defined(__clang__)
  70018. "adcs r4, r4\n\t"
  70019. #else
  70020. "adc r4, r4\n\t"
  70021. #endif
  70022. #ifdef WOLFSSL_KEIL
  70023. "adcs r5, r5, r5\n\t"
  70024. #elif defined(__clang__)
  70025. "adcs r5, r5\n\t"
  70026. #else
  70027. "adc r5, r5\n\t"
  70028. #endif
  70029. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  70030. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  70031. #ifdef WOLFSSL_KEIL
  70032. "adcs r2, r2, r2\n\t"
  70033. #elif defined(__clang__)
  70034. "adcs r2, r2\n\t"
  70035. #else
  70036. "adc r2, r2\n\t"
  70037. #endif
  70038. #ifdef WOLFSSL_KEIL
  70039. "adcs r3, r3, r3\n\t"
  70040. #elif defined(__clang__)
  70041. "adcs r3, r3\n\t"
  70042. #else
  70043. "adc r3, r3\n\t"
  70044. #endif
  70045. #ifdef WOLFSSL_KEIL
  70046. "adcs r4, r4, r4\n\t"
  70047. #elif defined(__clang__)
  70048. "adcs r4, r4\n\t"
  70049. #else
  70050. "adc r4, r4\n\t"
  70051. #endif
  70052. #ifdef WOLFSSL_KEIL
  70053. "adcs r5, r5, r5\n\t"
  70054. #elif defined(__clang__)
  70055. "adcs r5, r5\n\t"
  70056. #else
  70057. "adc r5, r5\n\t"
  70058. #endif
  70059. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  70060. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  70061. #ifdef WOLFSSL_KEIL
  70062. "adcs r2, r2, r2\n\t"
  70063. #elif defined(__clang__)
  70064. "adcs r2, r2\n\t"
  70065. #else
  70066. "adc r2, r2\n\t"
  70067. #endif
  70068. #ifdef WOLFSSL_KEIL
  70069. "adcs r3, r3, r3\n\t"
  70070. #elif defined(__clang__)
  70071. "adcs r3, r3\n\t"
  70072. #else
  70073. "adc r3, r3\n\t"
  70074. #endif
  70075. #ifdef WOLFSSL_KEIL
  70076. "adcs r4, r4, r4\n\t"
  70077. #elif defined(__clang__)
  70078. "adcs r4, r4\n\t"
  70079. #else
  70080. "adc r4, r4\n\t"
  70081. #endif
  70082. #ifdef WOLFSSL_KEIL
  70083. "adcs r5, r5, r5\n\t"
  70084. #elif defined(__clang__)
  70085. "adcs r5, r5\n\t"
  70086. #else
  70087. "adc r5, r5\n\t"
  70088. #endif
  70089. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  70090. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  70091. #ifdef WOLFSSL_KEIL
  70092. "adcs r2, r2, r2\n\t"
  70093. #elif defined(__clang__)
  70094. "adcs r2, r2\n\t"
  70095. #else
  70096. "adc r2, r2\n\t"
  70097. #endif
  70098. #ifdef WOLFSSL_KEIL
  70099. "adcs r3, r3, r3\n\t"
  70100. #elif defined(__clang__)
  70101. "adcs r3, r3\n\t"
  70102. #else
  70103. "adc r3, r3\n\t"
  70104. #endif
  70105. #ifdef WOLFSSL_KEIL
  70106. "adcs r4, r4, r4\n\t"
  70107. #elif defined(__clang__)
  70108. "adcs r4, r4\n\t"
  70109. #else
  70110. "adc r4, r4\n\t"
  70111. #endif
  70112. #ifdef WOLFSSL_KEIL
  70113. "adcs r5, r5, r5\n\t"
  70114. #elif defined(__clang__)
  70115. "adcs r5, r5\n\t"
  70116. #else
  70117. "adc r5, r5\n\t"
  70118. #endif
  70119. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  70120. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  70121. #ifdef WOLFSSL_KEIL
  70122. "adcs r2, r2, r2\n\t"
  70123. #elif defined(__clang__)
  70124. "adcs r2, r2\n\t"
  70125. #else
  70126. "adc r2, r2\n\t"
  70127. #endif
  70128. #ifdef WOLFSSL_KEIL
  70129. "adcs r3, r3, r3\n\t"
  70130. #elif defined(__clang__)
  70131. "adcs r3, r3\n\t"
  70132. #else
  70133. "adc r3, r3\n\t"
  70134. #endif
  70135. #ifdef WOLFSSL_KEIL
  70136. "adcs r4, r4, r4\n\t"
  70137. #elif defined(__clang__)
  70138. "adcs r4, r4\n\t"
  70139. #else
  70140. "adc r4, r4\n\t"
  70141. #endif
  70142. #ifdef WOLFSSL_KEIL
  70143. "adcs r5, r5, r5\n\t"
  70144. #elif defined(__clang__)
  70145. "adcs r5, r5\n\t"
  70146. #else
  70147. "adc r5, r5\n\t"
  70148. #endif
  70149. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  70150. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  70151. #ifdef WOLFSSL_KEIL
  70152. "adcs r2, r2, r2\n\t"
  70153. #elif defined(__clang__)
  70154. "adcs r2, r2\n\t"
  70155. #else
  70156. "adc r2, r2\n\t"
  70157. #endif
  70158. #ifdef WOLFSSL_KEIL
  70159. "adcs r3, r3, r3\n\t"
  70160. #elif defined(__clang__)
  70161. "adcs r3, r3\n\t"
  70162. #else
  70163. "adc r3, r3\n\t"
  70164. #endif
  70165. #ifdef WOLFSSL_KEIL
  70166. "adcs r4, r4, r4\n\t"
  70167. #elif defined(__clang__)
  70168. "adcs r4, r4\n\t"
  70169. #else
  70170. "adc r4, r4\n\t"
  70171. #endif
  70172. #ifdef WOLFSSL_KEIL
  70173. "adcs r5, r5, r5\n\t"
  70174. #elif defined(__clang__)
  70175. "adcs r5, r5\n\t"
  70176. #else
  70177. "adc r5, r5\n\t"
  70178. #endif
  70179. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  70180. "movs %[r], #0\n\t"
  70181. #ifdef WOLFSSL_KEIL
  70182. "adcs %[r], %[r], %[r]\n\t"
  70183. #elif defined(__clang__)
  70184. "adcs %[r], %[r]\n\t"
  70185. #else
  70186. "adc %[r], %[r]\n\t"
  70187. #endif
  70188. : [r] "+r" (r), [a] "+r" (a)
  70189. :
  70190. : "memory", "r2", "r3", "r4", "r5"
  70191. );
  70192. return (uint32_t)(size_t)r;
  70193. }
  70194. /* Square a and put result in r. (r = a * a)
  70195. *
  70196. * r A single precision integer.
  70197. * a A single precision integer.
  70198. */
  70199. SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a)
  70200. {
  70201. sp_digit* z0 = r;
  70202. sp_digit z2[96];
  70203. sp_digit z1[96];
  70204. sp_digit a1[48];
  70205. sp_digit u;
  70206. u = sp_3072_add_48(a1, a, &a[48]);
  70207. sp_3072_sqr_48(z1, a1);
  70208. sp_3072_sqr_48(z2, &a[48]);
  70209. sp_3072_sqr_48(z0, a);
  70210. sp_3072_mask_48(r + 96, a1, 0 - u);
  70211. u += sp_3072_dbl_48(r + 96, r + 96);
  70212. u += sp_3072_sub_in_place_96(z1, z2);
  70213. u += sp_3072_sub_in_place_96(z1, z0);
  70214. u += sp_3072_add_96(r + 48, r + 48, z1);
  70215. u += sp_3072_add_48(r + 96, r + 96, z2);
  70216. (void)sp_3072_add_to_word_48(r + 144, u, z2 + 48);
  70217. }
  70218. #endif /* !WOLFSSL_SP_SMALL */
  70219. #ifdef WOLFSSL_SP_SMALL
  70220. /* Add b to a into r. (r = a + b)
  70221. *
  70222. * r A single precision integer.
  70223. * a A single precision integer.
  70224. * b A single precision integer.
  70225. */
  70226. SP_NOINLINE static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a,
  70227. const sp_digit* b)
  70228. {
  70229. __asm__ __volatile__ (
  70230. "movs r6, %[a]\n\t"
  70231. "movs r7, #0\n\t"
  70232. "movs r3, #0\n\t"
  70233. "movs r4, #0xff\n\t"
  70234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70235. "adds r4, r4, #0x81\n\t"
  70236. #else
  70237. "add r4, r4, #0x81\n\t"
  70238. #endif
  70239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70240. "subs r7, r7, #1\n\t"
  70241. #else
  70242. "sub r7, r7, #1\n\t"
  70243. #endif
  70244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70245. "adds r6, r6, r4\n\t"
  70246. #else
  70247. "add r6, r6, r4\n\t"
  70248. #endif
  70249. "\n"
  70250. "L_sp_3072_add_96_word_%=:\n\t"
  70251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70252. "adds r3, r3, r7\n\t"
  70253. #else
  70254. "add r3, r3, r7\n\t"
  70255. #endif
  70256. "ldr r4, [%[a]]\n\t"
  70257. "ldr r5, [%[b]]\n\t"
  70258. #ifdef WOLFSSL_KEIL
  70259. "adcs r4, r4, r5\n\t"
  70260. #elif defined(__clang__)
  70261. "adcs r4, r5\n\t"
  70262. #else
  70263. "adc r4, r5\n\t"
  70264. #endif
  70265. "str r4, [%[r]]\n\t"
  70266. "movs r3, #0\n\t"
  70267. #ifdef WOLFSSL_KEIL
  70268. "adcs r3, r3, r3\n\t"
  70269. #elif defined(__clang__)
  70270. "adcs r3, r3\n\t"
  70271. #else
  70272. "adc r3, r3\n\t"
  70273. #endif
  70274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70275. "adds %[a], %[a], #4\n\t"
  70276. #else
  70277. "add %[a], %[a], #4\n\t"
  70278. #endif
  70279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70280. "adds %[b], %[b], #4\n\t"
  70281. #else
  70282. "add %[b], %[b], #4\n\t"
  70283. #endif
  70284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70285. "adds %[r], %[r], #4\n\t"
  70286. #else
  70287. "add %[r], %[r], #4\n\t"
  70288. #endif
  70289. "cmp %[a], r6\n\t"
  70290. "bne L_sp_3072_add_96_word_%=\n\t"
  70291. "movs %[r], r3\n\t"
  70292. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  70293. :
  70294. : "memory", "r3", "r4", "r5", "r6", "r7"
  70295. );
  70296. return (uint32_t)(size_t)r;
  70297. }
  70298. #endif /* WOLFSSL_SP_SMALL */
  70299. #ifdef WOLFSSL_SP_SMALL
  70300. /* Sub b from a into a. (a -= b)
  70301. *
  70302. * a A single precision integer.
  70303. * b A single precision integer.
  70304. */
  70305. SP_NOINLINE static sp_digit sp_3072_sub_in_place_96(sp_digit* a,
  70306. const sp_digit* b)
  70307. {
  70308. __asm__ __volatile__ (
  70309. "movs r7, %[a]\n\t"
  70310. "movs r2, #0\n\t"
  70311. "movs r5, #0xff\n\t"
  70312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70313. "adds r5, r5, #0x81\n\t"
  70314. #else
  70315. "add r5, r5, #0x81\n\t"
  70316. #endif
  70317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70318. "adds r7, r7, r5\n\t"
  70319. #else
  70320. "add r7, r7, r5\n\t"
  70321. #endif
  70322. "\n"
  70323. "L_sp_3072_sub_in_place_96_words_%=:\n\t"
  70324. "movs r5, #0\n\t"
  70325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70326. "subs r5, r5, r2\n\t"
  70327. #else
  70328. "sub r5, r5, r2\n\t"
  70329. #endif
  70330. "ldr r3, [%[a]]\n\t"
  70331. "ldr r4, [%[a], #4]\n\t"
  70332. "ldr r5, [%[b]]\n\t"
  70333. "ldr r6, [%[b], #4]\n\t"
  70334. #ifdef WOLFSSL_KEIL
  70335. "sbcs r3, r3, r5\n\t"
  70336. #elif defined(__clang__)
  70337. "sbcs r3, r5\n\t"
  70338. #else
  70339. "sbc r3, r5\n\t"
  70340. #endif
  70341. #ifdef WOLFSSL_KEIL
  70342. "sbcs r4, r4, r6\n\t"
  70343. #elif defined(__clang__)
  70344. "sbcs r4, r6\n\t"
  70345. #else
  70346. "sbc r4, r6\n\t"
  70347. #endif
  70348. "str r3, [%[a]]\n\t"
  70349. "str r4, [%[a], #4]\n\t"
  70350. #ifdef WOLFSSL_KEIL
  70351. "sbcs r2, r2, r2\n\t"
  70352. #elif defined(__clang__)
  70353. "sbcs r2, r2\n\t"
  70354. #else
  70355. "sbc r2, r2\n\t"
  70356. #endif
  70357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70358. "adds %[a], %[a], #8\n\t"
  70359. #else
  70360. "add %[a], %[a], #8\n\t"
  70361. #endif
  70362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70363. "adds %[b], %[b], #8\n\t"
  70364. #else
  70365. "add %[b], %[b], #8\n\t"
  70366. #endif
  70367. "cmp %[a], r7\n\t"
  70368. "bne L_sp_3072_sub_in_place_96_words_%=\n\t"
  70369. "movs %[a], r2\n\t"
  70370. : [a] "+r" (a), [b] "+r" (b)
  70371. :
  70372. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  70373. );
  70374. return (uint32_t)(size_t)a;
  70375. }
  70376. #endif /* WOLFSSL_SP_SMALL */
  70377. #ifdef WOLFSSL_SP_SMALL
  70378. /* Multiply a and b into r. (r = a * b)
  70379. *
  70380. * r A single precision integer.
  70381. * a A single precision integer.
  70382. * b A single precision integer.
  70383. */
  70384. SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a,
  70385. const sp_digit* b)
  70386. {
  70387. sp_digit t[96 * 2];
  70388. sp_digit* tmp = t;
  70389. __asm__ __volatile__ (
  70390. "movs r3, #0\n\t"
  70391. "movs r4, #0\n\t"
  70392. "mov r8, r3\n\t"
  70393. "mov r11, %[tmp]\n\t"
  70394. "mov r9, %[a]\n\t"
  70395. "mov r10, %[b]\n\t"
  70396. "movs r6, #0xff\n\t"
  70397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70398. "adds r6, r6, #0x81\n\t"
  70399. #else
  70400. "add r6, r6, #0x81\n\t"
  70401. #endif
  70402. "add r6, r6, r9\n\t"
  70403. "mov r12, r6\n\t"
  70404. "\n"
  70405. "L_sp_3072_mul_96_words_%=:\n\t"
  70406. "movs %[tmp], #0\n\t"
  70407. "movs r5, #0\n\t"
  70408. "movs r6, #0xff\n\t"
  70409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70410. "adds r6, r6, #0x7d\n\t"
  70411. #else
  70412. "add r6, r6, #0x7d\n\t"
  70413. #endif
  70414. "mov %[a], r8\n\t"
  70415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70416. "subs %[a], %[a], r6\n\t"
  70417. #else
  70418. "sub %[a], %[a], r6\n\t"
  70419. #endif
  70420. #ifdef WOLFSSL_KEIL
  70421. "sbcs r6, r6, r6\n\t"
  70422. #elif defined(__clang__)
  70423. "sbcs r6, r6\n\t"
  70424. #else
  70425. "sbc r6, r6\n\t"
  70426. #endif
  70427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70428. "mvns r6, r6\n\t"
  70429. #else
  70430. "mvn r6, r6\n\t"
  70431. #endif
  70432. #ifdef WOLFSSL_KEIL
  70433. "ands %[a], %[a], r6\n\t"
  70434. #elif defined(__clang__)
  70435. "ands %[a], r6\n\t"
  70436. #else
  70437. "and %[a], r6\n\t"
  70438. #endif
  70439. "mov %[b], r8\n\t"
  70440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70441. "subs %[b], %[b], %[a]\n\t"
  70442. #else
  70443. "sub %[b], %[b], %[a]\n\t"
  70444. #endif
  70445. "add %[a], %[a], r9\n\t"
  70446. "add %[b], %[b], r10\n\t"
  70447. "\n"
  70448. "L_sp_3072_mul_96_mul_%=:\n\t"
  70449. "# Multiply Start\n\t"
  70450. "ldrh r6, [%[a]]\n\t"
  70451. "ldrh r7, [%[b]]\n\t"
  70452. #ifdef WOLFSSL_KEIL
  70453. "muls r7, r6, r7\n\t"
  70454. #elif defined(__clang__)
  70455. "muls r7, r6\n\t"
  70456. #else
  70457. "mul r7, r6\n\t"
  70458. #endif
  70459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70460. "adds r3, r3, r7\n\t"
  70461. #else
  70462. "add r3, r3, r7\n\t"
  70463. #endif
  70464. #ifdef WOLFSSL_KEIL
  70465. "adcs r4, r4, %[tmp]\n\t"
  70466. #elif defined(__clang__)
  70467. "adcs r4, %[tmp]\n\t"
  70468. #else
  70469. "adc r4, %[tmp]\n\t"
  70470. #endif
  70471. #ifdef WOLFSSL_KEIL
  70472. "adcs r5, r5, %[tmp]\n\t"
  70473. #elif defined(__clang__)
  70474. "adcs r5, %[tmp]\n\t"
  70475. #else
  70476. "adc r5, %[tmp]\n\t"
  70477. #endif
  70478. "ldr r7, [%[b]]\n\t"
  70479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70480. "lsrs r7, r7, #16\n\t"
  70481. #else
  70482. "lsr r7, r7, #16\n\t"
  70483. #endif
  70484. #ifdef WOLFSSL_KEIL
  70485. "muls r6, r7, r6\n\t"
  70486. #elif defined(__clang__)
  70487. "muls r6, r7\n\t"
  70488. #else
  70489. "mul r6, r7\n\t"
  70490. #endif
  70491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70492. "lsrs r7, r6, #16\n\t"
  70493. #else
  70494. "lsr r7, r6, #16\n\t"
  70495. #endif
  70496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70497. "lsls r6, r6, #16\n\t"
  70498. #else
  70499. "lsl r6, r6, #16\n\t"
  70500. #endif
  70501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70502. "adds r3, r3, r6\n\t"
  70503. #else
  70504. "add r3, r3, r6\n\t"
  70505. #endif
  70506. #ifdef WOLFSSL_KEIL
  70507. "adcs r4, r4, r7\n\t"
  70508. #elif defined(__clang__)
  70509. "adcs r4, r7\n\t"
  70510. #else
  70511. "adc r4, r7\n\t"
  70512. #endif
  70513. #ifdef WOLFSSL_KEIL
  70514. "adcs r5, r5, %[tmp]\n\t"
  70515. #elif defined(__clang__)
  70516. "adcs r5, %[tmp]\n\t"
  70517. #else
  70518. "adc r5, %[tmp]\n\t"
  70519. #endif
  70520. "ldr r6, [%[a]]\n\t"
  70521. "ldr r7, [%[b]]\n\t"
  70522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70523. "lsrs r6, r6, #16\n\t"
  70524. #else
  70525. "lsr r6, r6, #16\n\t"
  70526. #endif
  70527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70528. "lsrs r7, r7, #16\n\t"
  70529. #else
  70530. "lsr r7, r7, #16\n\t"
  70531. #endif
  70532. #ifdef WOLFSSL_KEIL
  70533. "muls r7, r6, r7\n\t"
  70534. #elif defined(__clang__)
  70535. "muls r7, r6\n\t"
  70536. #else
  70537. "mul r7, r6\n\t"
  70538. #endif
  70539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70540. "adds r4, r4, r7\n\t"
  70541. #else
  70542. "add r4, r4, r7\n\t"
  70543. #endif
  70544. #ifdef WOLFSSL_KEIL
  70545. "adcs r5, r5, %[tmp]\n\t"
  70546. #elif defined(__clang__)
  70547. "adcs r5, %[tmp]\n\t"
  70548. #else
  70549. "adc r5, %[tmp]\n\t"
  70550. #endif
  70551. "ldrh r7, [%[b]]\n\t"
  70552. #ifdef WOLFSSL_KEIL
  70553. "muls r6, r7, r6\n\t"
  70554. #elif defined(__clang__)
  70555. "muls r6, r7\n\t"
  70556. #else
  70557. "mul r6, r7\n\t"
  70558. #endif
  70559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70560. "lsrs r7, r6, #16\n\t"
  70561. #else
  70562. "lsr r7, r6, #16\n\t"
  70563. #endif
  70564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70565. "lsls r6, r6, #16\n\t"
  70566. #else
  70567. "lsl r6, r6, #16\n\t"
  70568. #endif
  70569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70570. "adds r3, r3, r6\n\t"
  70571. #else
  70572. "add r3, r3, r6\n\t"
  70573. #endif
  70574. #ifdef WOLFSSL_KEIL
  70575. "adcs r4, r4, r7\n\t"
  70576. #elif defined(__clang__)
  70577. "adcs r4, r7\n\t"
  70578. #else
  70579. "adc r4, r7\n\t"
  70580. #endif
  70581. #ifdef WOLFSSL_KEIL
  70582. "adcs r5, r5, %[tmp]\n\t"
  70583. #elif defined(__clang__)
  70584. "adcs r5, %[tmp]\n\t"
  70585. #else
  70586. "adc r5, %[tmp]\n\t"
  70587. #endif
  70588. "# Multiply Done\n\t"
  70589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70590. "adds %[a], %[a], #4\n\t"
  70591. #else
  70592. "add %[a], %[a], #4\n\t"
  70593. #endif
  70594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70595. "subs %[b], %[b], #4\n\t"
  70596. #else
  70597. "sub %[b], %[b], #4\n\t"
  70598. #endif
  70599. "cmp %[a], r12\n\t"
  70600. "beq L_sp_3072_mul_96_done_mul_%=\n\t"
  70601. "mov r6, r8\n\t"
  70602. "add r6, r6, r9\n\t"
  70603. "cmp %[a], r6\n\t"
  70604. "ble L_sp_3072_mul_96_mul_%=\n\t"
  70605. "\n"
  70606. "L_sp_3072_mul_96_done_mul_%=:\n\t"
  70607. "mov %[tmp], r11\n\t"
  70608. "mov r7, r8\n\t"
  70609. "str r3, [%[tmp], r7]\n\t"
  70610. "movs r3, r4\n\t"
  70611. "movs r4, r5\n\t"
  70612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70613. "adds r7, r7, #4\n\t"
  70614. #else
  70615. "add r7, r7, #4\n\t"
  70616. #endif
  70617. "mov r8, r7\n\t"
  70618. "movs r6, #2\n\t"
  70619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70620. "lsls r6, r6, #8\n\t"
  70621. #else
  70622. "lsl r6, r6, #8\n\t"
  70623. #endif
  70624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70625. "adds r6, r6, #0xf8\n\t"
  70626. #else
  70627. "add r6, r6, #0xf8\n\t"
  70628. #endif
  70629. "cmp r7, r6\n\t"
  70630. "ble L_sp_3072_mul_96_words_%=\n\t"
  70631. "str r3, [%[tmp], r7]\n\t"
  70632. "mov %[a], r9\n\t"
  70633. "mov %[b], r10\n\t"
  70634. : [a] "+r" (a), [b] "+r" (b), [tmp] "+r" (tmp)
  70635. :
  70636. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  70637. );
  70638. XMEMCPY(r, t, sizeof(t));
  70639. }
  70640. /* Square a and put result in r. (r = a * a)
  70641. *
  70642. * r A single precision integer.
  70643. * a A single precision integer.
  70644. */
  70645. SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a)
  70646. {
  70647. __asm__ __volatile__ (
  70648. "movs r3, #0\n\t"
  70649. "movs r4, #0\n\t"
  70650. "movs r5, #0\n\t"
  70651. "mov r8, r3\n\t"
  70652. "mov r11, %[r]\n\t"
  70653. "movs r6, #3\n\t"
  70654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70655. "lsls r6, r6, #8\n\t"
  70656. #else
  70657. "lsl r6, r6, #8\n\t"
  70658. #endif
  70659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70660. "negs r6, r6\n\t"
  70661. #else
  70662. "neg r6, r6\n\t"
  70663. #endif
  70664. "add sp, sp, r6\n\t"
  70665. "mov r10, sp\n\t"
  70666. "mov r9, %[a]\n\t"
  70667. "\n"
  70668. "L_sp_3072_sqr_96_words_%=:\n\t"
  70669. "movs %[r], #0\n\t"
  70670. "movs r6, #0xff\n\t"
  70671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70672. "adds r6, r6, #0x7d\n\t"
  70673. #else
  70674. "add r6, r6, #0x7d\n\t"
  70675. #endif
  70676. "mov %[a], r8\n\t"
  70677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70678. "subs %[a], %[a], r6\n\t"
  70679. #else
  70680. "sub %[a], %[a], r6\n\t"
  70681. #endif
  70682. #ifdef WOLFSSL_KEIL
  70683. "sbcs r6, r6, r6\n\t"
  70684. #elif defined(__clang__)
  70685. "sbcs r6, r6\n\t"
  70686. #else
  70687. "sbc r6, r6\n\t"
  70688. #endif
  70689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70690. "mvns r6, r6\n\t"
  70691. #else
  70692. "mvn r6, r6\n\t"
  70693. #endif
  70694. #ifdef WOLFSSL_KEIL
  70695. "ands %[a], %[a], r6\n\t"
  70696. #elif defined(__clang__)
  70697. "ands %[a], r6\n\t"
  70698. #else
  70699. "and %[a], r6\n\t"
  70700. #endif
  70701. "mov r2, r8\n\t"
  70702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70703. "subs r2, r2, %[a]\n\t"
  70704. #else
  70705. "sub r2, r2, %[a]\n\t"
  70706. #endif
  70707. "add %[a], %[a], r9\n\t"
  70708. "add r2, r2, r9\n\t"
  70709. "\n"
  70710. "L_sp_3072_sqr_96_mul_%=:\n\t"
  70711. "cmp r2, %[a]\n\t"
  70712. "beq L_sp_3072_sqr_96_sqr_%=\n\t"
  70713. "# Multiply * 2: Start\n\t"
  70714. "ldrh r6, [%[a]]\n\t"
  70715. "ldrh r7, [r2]\n\t"
  70716. #ifdef WOLFSSL_KEIL
  70717. "muls r7, r6, r7\n\t"
  70718. #elif defined(__clang__)
  70719. "muls r7, r6\n\t"
  70720. #else
  70721. "mul r7, r6\n\t"
  70722. #endif
  70723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70724. "adds r3, r3, r7\n\t"
  70725. #else
  70726. "add r3, r3, r7\n\t"
  70727. #endif
  70728. #ifdef WOLFSSL_KEIL
  70729. "adcs r4, r4, %[r]\n\t"
  70730. #elif defined(__clang__)
  70731. "adcs r4, %[r]\n\t"
  70732. #else
  70733. "adc r4, %[r]\n\t"
  70734. #endif
  70735. #ifdef WOLFSSL_KEIL
  70736. "adcs r5, r5, %[r]\n\t"
  70737. #elif defined(__clang__)
  70738. "adcs r5, %[r]\n\t"
  70739. #else
  70740. "adc r5, %[r]\n\t"
  70741. #endif
  70742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70743. "adds r3, r3, r7\n\t"
  70744. #else
  70745. "add r3, r3, r7\n\t"
  70746. #endif
  70747. #ifdef WOLFSSL_KEIL
  70748. "adcs r4, r4, %[r]\n\t"
  70749. #elif defined(__clang__)
  70750. "adcs r4, %[r]\n\t"
  70751. #else
  70752. "adc r4, %[r]\n\t"
  70753. #endif
  70754. #ifdef WOLFSSL_KEIL
  70755. "adcs r5, r5, %[r]\n\t"
  70756. #elif defined(__clang__)
  70757. "adcs r5, %[r]\n\t"
  70758. #else
  70759. "adc r5, %[r]\n\t"
  70760. #endif
  70761. "ldr r7, [r2]\n\t"
  70762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70763. "lsrs r7, r7, #16\n\t"
  70764. #else
  70765. "lsr r7, r7, #16\n\t"
  70766. #endif
  70767. #ifdef WOLFSSL_KEIL
  70768. "muls r6, r7, r6\n\t"
  70769. #elif defined(__clang__)
  70770. "muls r6, r7\n\t"
  70771. #else
  70772. "mul r6, r7\n\t"
  70773. #endif
  70774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70775. "lsrs r7, r6, #16\n\t"
  70776. #else
  70777. "lsr r7, r6, #16\n\t"
  70778. #endif
  70779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70780. "lsls r6, r6, #16\n\t"
  70781. #else
  70782. "lsl r6, r6, #16\n\t"
  70783. #endif
  70784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70785. "adds r3, r3, r6\n\t"
  70786. #else
  70787. "add r3, r3, r6\n\t"
  70788. #endif
  70789. #ifdef WOLFSSL_KEIL
  70790. "adcs r4, r4, r7\n\t"
  70791. #elif defined(__clang__)
  70792. "adcs r4, r7\n\t"
  70793. #else
  70794. "adc r4, r7\n\t"
  70795. #endif
  70796. #ifdef WOLFSSL_KEIL
  70797. "adcs r5, r5, %[r]\n\t"
  70798. #elif defined(__clang__)
  70799. "adcs r5, %[r]\n\t"
  70800. #else
  70801. "adc r5, %[r]\n\t"
  70802. #endif
  70803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70804. "adds r3, r3, r6\n\t"
  70805. #else
  70806. "add r3, r3, r6\n\t"
  70807. #endif
  70808. #ifdef WOLFSSL_KEIL
  70809. "adcs r4, r4, r7\n\t"
  70810. #elif defined(__clang__)
  70811. "adcs r4, r7\n\t"
  70812. #else
  70813. "adc r4, r7\n\t"
  70814. #endif
  70815. #ifdef WOLFSSL_KEIL
  70816. "adcs r5, r5, %[r]\n\t"
  70817. #elif defined(__clang__)
  70818. "adcs r5, %[r]\n\t"
  70819. #else
  70820. "adc r5, %[r]\n\t"
  70821. #endif
  70822. "ldr r6, [%[a]]\n\t"
  70823. "ldr r7, [r2]\n\t"
  70824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70825. "lsrs r6, r6, #16\n\t"
  70826. #else
  70827. "lsr r6, r6, #16\n\t"
  70828. #endif
  70829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70830. "lsrs r7, r7, #16\n\t"
  70831. #else
  70832. "lsr r7, r7, #16\n\t"
  70833. #endif
  70834. #ifdef WOLFSSL_KEIL
  70835. "muls r7, r6, r7\n\t"
  70836. #elif defined(__clang__)
  70837. "muls r7, r6\n\t"
  70838. #else
  70839. "mul r7, r6\n\t"
  70840. #endif
  70841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70842. "adds r4, r4, r7\n\t"
  70843. #else
  70844. "add r4, r4, r7\n\t"
  70845. #endif
  70846. #ifdef WOLFSSL_KEIL
  70847. "adcs r5, r5, %[r]\n\t"
  70848. #elif defined(__clang__)
  70849. "adcs r5, %[r]\n\t"
  70850. #else
  70851. "adc r5, %[r]\n\t"
  70852. #endif
  70853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70854. "adds r4, r4, r7\n\t"
  70855. #else
  70856. "add r4, r4, r7\n\t"
  70857. #endif
  70858. #ifdef WOLFSSL_KEIL
  70859. "adcs r5, r5, %[r]\n\t"
  70860. #elif defined(__clang__)
  70861. "adcs r5, %[r]\n\t"
  70862. #else
  70863. "adc r5, %[r]\n\t"
  70864. #endif
  70865. "ldrh r7, [r2]\n\t"
  70866. #ifdef WOLFSSL_KEIL
  70867. "muls r6, r7, r6\n\t"
  70868. #elif defined(__clang__)
  70869. "muls r6, r7\n\t"
  70870. #else
  70871. "mul r6, r7\n\t"
  70872. #endif
  70873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70874. "lsrs r7, r6, #16\n\t"
  70875. #else
  70876. "lsr r7, r6, #16\n\t"
  70877. #endif
  70878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70879. "lsls r6, r6, #16\n\t"
  70880. #else
  70881. "lsl r6, r6, #16\n\t"
  70882. #endif
  70883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70884. "adds r3, r3, r6\n\t"
  70885. #else
  70886. "add r3, r3, r6\n\t"
  70887. #endif
  70888. #ifdef WOLFSSL_KEIL
  70889. "adcs r4, r4, r7\n\t"
  70890. #elif defined(__clang__)
  70891. "adcs r4, r7\n\t"
  70892. #else
  70893. "adc r4, r7\n\t"
  70894. #endif
  70895. #ifdef WOLFSSL_KEIL
  70896. "adcs r5, r5, %[r]\n\t"
  70897. #elif defined(__clang__)
  70898. "adcs r5, %[r]\n\t"
  70899. #else
  70900. "adc r5, %[r]\n\t"
  70901. #endif
  70902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70903. "adds r3, r3, r6\n\t"
  70904. #else
  70905. "add r3, r3, r6\n\t"
  70906. #endif
  70907. #ifdef WOLFSSL_KEIL
  70908. "adcs r4, r4, r7\n\t"
  70909. #elif defined(__clang__)
  70910. "adcs r4, r7\n\t"
  70911. #else
  70912. "adc r4, r7\n\t"
  70913. #endif
  70914. #ifdef WOLFSSL_KEIL
  70915. "adcs r5, r5, %[r]\n\t"
  70916. #elif defined(__clang__)
  70917. "adcs r5, %[r]\n\t"
  70918. #else
  70919. "adc r5, %[r]\n\t"
  70920. #endif
  70921. "# Multiply * 2: Done\n\t"
  70922. "bal L_sp_3072_sqr_96_done_sqr_%=\n\t"
  70923. "\n"
  70924. "L_sp_3072_sqr_96_sqr_%=:\n\t"
  70925. "mov r12, r2\n\t"
  70926. "ldr r2, [%[a]]\n\t"
  70927. "# Square: Start\n\t"
  70928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70929. "lsrs r7, r2, #16\n\t"
  70930. #else
  70931. "lsr r7, r2, #16\n\t"
  70932. #endif
  70933. "uxth r6, r2\n\t"
  70934. #ifdef WOLFSSL_KEIL
  70935. "muls r6, r6, r6\n\t"
  70936. #elif defined(__clang__)
  70937. "muls r6, r6\n\t"
  70938. #else
  70939. "mul r6, r6\n\t"
  70940. #endif
  70941. #ifdef WOLFSSL_KEIL
  70942. "muls r7, r7, r7\n\t"
  70943. #elif defined(__clang__)
  70944. "muls r7, r7\n\t"
  70945. #else
  70946. "mul r7, r7\n\t"
  70947. #endif
  70948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70949. "adds r3, r3, r6\n\t"
  70950. #else
  70951. "add r3, r3, r6\n\t"
  70952. #endif
  70953. #ifdef WOLFSSL_KEIL
  70954. "adcs r4, r4, r7\n\t"
  70955. #elif defined(__clang__)
  70956. "adcs r4, r7\n\t"
  70957. #else
  70958. "adc r4, r7\n\t"
  70959. #endif
  70960. #ifdef WOLFSSL_KEIL
  70961. "adcs r5, r5, %[r]\n\t"
  70962. #elif defined(__clang__)
  70963. "adcs r5, %[r]\n\t"
  70964. #else
  70965. "adc r5, %[r]\n\t"
  70966. #endif
  70967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70968. "lsrs r7, r2, #16\n\t"
  70969. #else
  70970. "lsr r7, r2, #16\n\t"
  70971. #endif
  70972. "uxth r6, r2\n\t"
  70973. #ifdef WOLFSSL_KEIL
  70974. "muls r6, r7, r6\n\t"
  70975. #elif defined(__clang__)
  70976. "muls r6, r7\n\t"
  70977. #else
  70978. "mul r6, r7\n\t"
  70979. #endif
  70980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70981. "lsrs r7, r6, #15\n\t"
  70982. #else
  70983. "lsr r7, r6, #15\n\t"
  70984. #endif
  70985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70986. "lsls r6, r6, #17\n\t"
  70987. #else
  70988. "lsl r6, r6, #17\n\t"
  70989. #endif
  70990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70991. "adds r3, r3, r6\n\t"
  70992. #else
  70993. "add r3, r3, r6\n\t"
  70994. #endif
  70995. #ifdef WOLFSSL_KEIL
  70996. "adcs r4, r4, r7\n\t"
  70997. #elif defined(__clang__)
  70998. "adcs r4, r7\n\t"
  70999. #else
  71000. "adc r4, r7\n\t"
  71001. #endif
  71002. #ifdef WOLFSSL_KEIL
  71003. "adcs r5, r5, %[r]\n\t"
  71004. #elif defined(__clang__)
  71005. "adcs r5, %[r]\n\t"
  71006. #else
  71007. "adc r5, %[r]\n\t"
  71008. #endif
  71009. "# Square: Done\n\t"
  71010. "mov r2, r12\n\t"
  71011. "\n"
  71012. "L_sp_3072_sqr_96_done_sqr_%=:\n\t"
  71013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71014. "adds %[a], %[a], #4\n\t"
  71015. #else
  71016. "add %[a], %[a], #4\n\t"
  71017. #endif
  71018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71019. "subs r2, r2, #4\n\t"
  71020. #else
  71021. "sub r2, r2, #4\n\t"
  71022. #endif
  71023. "movs r6, #0xff\n\t"
  71024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71025. "adds r6, r6, #0x81\n\t"
  71026. #else
  71027. "add r6, r6, #0x81\n\t"
  71028. #endif
  71029. "add r6, r6, r9\n\t"
  71030. "cmp %[a], r6\n\t"
  71031. "beq L_sp_3072_sqr_96_done_mul_%=\n\t"
  71032. "cmp %[a], r2\n\t"
  71033. "bgt L_sp_3072_sqr_96_done_mul_%=\n\t"
  71034. "mov r7, r8\n\t"
  71035. "add r7, r7, r9\n\t"
  71036. "cmp %[a], r7\n\t"
  71037. "ble L_sp_3072_sqr_96_mul_%=\n\t"
  71038. "\n"
  71039. "L_sp_3072_sqr_96_done_mul_%=:\n\t"
  71040. "mov %[r], r10\n\t"
  71041. "mov r7, r8\n\t"
  71042. "str r3, [%[r], r7]\n\t"
  71043. "movs r3, r4\n\t"
  71044. "movs r4, r5\n\t"
  71045. "movs r5, #0\n\t"
  71046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71047. "adds r7, r7, #4\n\t"
  71048. #else
  71049. "add r7, r7, #4\n\t"
  71050. #endif
  71051. "mov r8, r7\n\t"
  71052. "movs r6, #2\n\t"
  71053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71054. "lsls r6, r6, #8\n\t"
  71055. #else
  71056. "lsl r6, r6, #8\n\t"
  71057. #endif
  71058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71059. "adds r6, r6, #0xf8\n\t"
  71060. #else
  71061. "add r6, r6, #0xf8\n\t"
  71062. #endif
  71063. "cmp r7, r6\n\t"
  71064. "ble L_sp_3072_sqr_96_words_%=\n\t"
  71065. "mov %[a], r9\n\t"
  71066. "str r3, [%[r], r7]\n\t"
  71067. "mov %[r], r11\n\t"
  71068. "mov %[a], r10\n\t"
  71069. "movs r3, #2\n\t"
  71070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71071. "lsls r3, r3, #8\n\t"
  71072. #else
  71073. "lsl r3, r3, #8\n\t"
  71074. #endif
  71075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71076. "adds r3, r3, #0xfc\n\t"
  71077. #else
  71078. "add r3, r3, #0xfc\n\t"
  71079. #endif
  71080. "\n"
  71081. "L_sp_3072_sqr_96_store_%=:\n\t"
  71082. "ldr r6, [%[a], r3]\n\t"
  71083. "str r6, [%[r], r3]\n\t"
  71084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71085. "subs r3, r3, #4\n\t"
  71086. #else
  71087. "sub r3, r3, #4\n\t"
  71088. #endif
  71089. "bge L_sp_3072_sqr_96_store_%=\n\t"
  71090. "movs r6, #3\n\t"
  71091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71092. "lsls r6, r6, #8\n\t"
  71093. #else
  71094. "lsl r6, r6, #8\n\t"
  71095. #endif
  71096. "add sp, sp, r6\n\t"
  71097. : [r] "+r" (r), [a] "+r" (a)
  71098. :
  71099. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  71100. );
  71101. }
  71102. #endif /* WOLFSSL_SP_SMALL */
  71103. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  71104. #ifdef WOLFSSL_SP_SMALL
  71105. /* AND m into each word of a and store in r.
  71106. *
  71107. * r A single precision integer.
  71108. * a A single precision integer.
  71109. * m Mask to AND against each digit.
  71110. */
  71111. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  71112. {
  71113. int i;
  71114. for (i=0; i<48; i++) {
  71115. r[i] = a[i] & m;
  71116. }
  71117. }
  71118. #endif /* WOLFSSL_SP_SMALL */
  71119. #ifdef WOLFSSL_SP_SMALL
  71120. /* Add b to a into r. (r = a + b)
  71121. *
  71122. * r A single precision integer.
  71123. * a A single precision integer.
  71124. * b A single precision integer.
  71125. */
  71126. SP_NOINLINE static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
  71127. const sp_digit* b)
  71128. {
  71129. __asm__ __volatile__ (
  71130. "movs r6, %[a]\n\t"
  71131. "movs r7, #0\n\t"
  71132. "movs r3, #0\n\t"
  71133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71134. "adds r6, r6, #0xc0\n\t"
  71135. #else
  71136. "add r6, r6, #0xc0\n\t"
  71137. #endif
  71138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71139. "subs r7, r7, #1\n\t"
  71140. #else
  71141. "sub r7, r7, #1\n\t"
  71142. #endif
  71143. "\n"
  71144. "L_sp_3072_add_48_word_%=:\n\t"
  71145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71146. "adds r3, r3, r7\n\t"
  71147. #else
  71148. "add r3, r3, r7\n\t"
  71149. #endif
  71150. "ldr r4, [%[a]]\n\t"
  71151. "ldr r5, [%[b]]\n\t"
  71152. #ifdef WOLFSSL_KEIL
  71153. "adcs r4, r4, r5\n\t"
  71154. #elif defined(__clang__)
  71155. "adcs r4, r5\n\t"
  71156. #else
  71157. "adc r4, r5\n\t"
  71158. #endif
  71159. "str r4, [%[r]]\n\t"
  71160. "movs r3, #0\n\t"
  71161. #ifdef WOLFSSL_KEIL
  71162. "adcs r3, r3, r3\n\t"
  71163. #elif defined(__clang__)
  71164. "adcs r3, r3\n\t"
  71165. #else
  71166. "adc r3, r3\n\t"
  71167. #endif
  71168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71169. "adds %[a], %[a], #4\n\t"
  71170. #else
  71171. "add %[a], %[a], #4\n\t"
  71172. #endif
  71173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71174. "adds %[b], %[b], #4\n\t"
  71175. #else
  71176. "add %[b], %[b], #4\n\t"
  71177. #endif
  71178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71179. "adds %[r], %[r], #4\n\t"
  71180. #else
  71181. "add %[r], %[r], #4\n\t"
  71182. #endif
  71183. "cmp %[a], r6\n\t"
  71184. "bne L_sp_3072_add_48_word_%=\n\t"
  71185. "movs %[r], r3\n\t"
  71186. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  71187. :
  71188. : "memory", "r3", "r4", "r5", "r6", "r7"
  71189. );
  71190. return (uint32_t)(size_t)r;
  71191. }
  71192. #endif /* WOLFSSL_SP_SMALL */
  71193. #ifdef WOLFSSL_SP_SMALL
  71194. /* Sub b from a into a. (a -= b)
  71195. *
  71196. * a A single precision integer.
  71197. * b A single precision integer.
  71198. */
  71199. SP_NOINLINE static sp_digit sp_3072_sub_in_place_48(sp_digit* a,
  71200. const sp_digit* b)
  71201. {
  71202. __asm__ __volatile__ (
  71203. "movs r7, %[a]\n\t"
  71204. "movs r2, #0\n\t"
  71205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71206. "adds r7, r7, #0xc0\n\t"
  71207. #else
  71208. "add r7, r7, #0xc0\n\t"
  71209. #endif
  71210. "\n"
  71211. "L_sp_3072_sub_in_place_48_words_%=:\n\t"
  71212. "movs r5, #0\n\t"
  71213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71214. "subs r5, r5, r2\n\t"
  71215. #else
  71216. "sub r5, r5, r2\n\t"
  71217. #endif
  71218. "ldr r3, [%[a]]\n\t"
  71219. "ldr r4, [%[a], #4]\n\t"
  71220. "ldr r5, [%[b]]\n\t"
  71221. "ldr r6, [%[b], #4]\n\t"
  71222. #ifdef WOLFSSL_KEIL
  71223. "sbcs r3, r3, r5\n\t"
  71224. #elif defined(__clang__)
  71225. "sbcs r3, r5\n\t"
  71226. #else
  71227. "sbc r3, r5\n\t"
  71228. #endif
  71229. #ifdef WOLFSSL_KEIL
  71230. "sbcs r4, r4, r6\n\t"
  71231. #elif defined(__clang__)
  71232. "sbcs r4, r6\n\t"
  71233. #else
  71234. "sbc r4, r6\n\t"
  71235. #endif
  71236. "str r3, [%[a]]\n\t"
  71237. "str r4, [%[a], #4]\n\t"
  71238. #ifdef WOLFSSL_KEIL
  71239. "sbcs r2, r2, r2\n\t"
  71240. #elif defined(__clang__)
  71241. "sbcs r2, r2\n\t"
  71242. #else
  71243. "sbc r2, r2\n\t"
  71244. #endif
  71245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71246. "adds %[a], %[a], #8\n\t"
  71247. #else
  71248. "add %[a], %[a], #8\n\t"
  71249. #endif
  71250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71251. "adds %[b], %[b], #8\n\t"
  71252. #else
  71253. "add %[b], %[b], #8\n\t"
  71254. #endif
  71255. "cmp %[a], r7\n\t"
  71256. "bne L_sp_3072_sub_in_place_48_words_%=\n\t"
  71257. "movs %[a], r2\n\t"
  71258. : [a] "+r" (a), [b] "+r" (b)
  71259. :
  71260. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  71261. );
  71262. return (uint32_t)(size_t)a;
  71263. }
  71264. #endif /* WOLFSSL_SP_SMALL */
  71265. #ifdef WOLFSSL_SP_SMALL
  71266. /* Multiply a and b into r. (r = a * b)
  71267. *
  71268. * r A single precision integer.
  71269. * a A single precision integer.
  71270. * b A single precision integer.
  71271. */
  71272. SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
  71273. const sp_digit* b)
  71274. {
  71275. sp_digit t[48 * 2];
  71276. sp_digit* tmp = t;
  71277. __asm__ __volatile__ (
  71278. "movs r3, #0\n\t"
  71279. "movs r4, #0\n\t"
  71280. "mov r8, r3\n\t"
  71281. "mov r11, %[tmp]\n\t"
  71282. "mov r9, %[a]\n\t"
  71283. "mov r10, %[b]\n\t"
  71284. "movs r6, #0xc0\n\t"
  71285. "add r6, r6, r9\n\t"
  71286. "mov r12, r6\n\t"
  71287. "\n"
  71288. "L_sp_3072_mul_48_words_%=:\n\t"
  71289. "movs %[tmp], #0\n\t"
  71290. "movs r5, #0\n\t"
  71291. "movs r6, #0xbc\n\t"
  71292. "mov %[a], r8\n\t"
  71293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71294. "subs %[a], %[a], r6\n\t"
  71295. #else
  71296. "sub %[a], %[a], r6\n\t"
  71297. #endif
  71298. #ifdef WOLFSSL_KEIL
  71299. "sbcs r6, r6, r6\n\t"
  71300. #elif defined(__clang__)
  71301. "sbcs r6, r6\n\t"
  71302. #else
  71303. "sbc r6, r6\n\t"
  71304. #endif
  71305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71306. "mvns r6, r6\n\t"
  71307. #else
  71308. "mvn r6, r6\n\t"
  71309. #endif
  71310. #ifdef WOLFSSL_KEIL
  71311. "ands %[a], %[a], r6\n\t"
  71312. #elif defined(__clang__)
  71313. "ands %[a], r6\n\t"
  71314. #else
  71315. "and %[a], r6\n\t"
  71316. #endif
  71317. "mov %[b], r8\n\t"
  71318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71319. "subs %[b], %[b], %[a]\n\t"
  71320. #else
  71321. "sub %[b], %[b], %[a]\n\t"
  71322. #endif
  71323. "add %[a], %[a], r9\n\t"
  71324. "add %[b], %[b], r10\n\t"
  71325. "\n"
  71326. "L_sp_3072_mul_48_mul_%=:\n\t"
  71327. "# Multiply Start\n\t"
  71328. "ldrh r6, [%[a]]\n\t"
  71329. "ldrh r7, [%[b]]\n\t"
  71330. #ifdef WOLFSSL_KEIL
  71331. "muls r7, r6, r7\n\t"
  71332. #elif defined(__clang__)
  71333. "muls r7, r6\n\t"
  71334. #else
  71335. "mul r7, r6\n\t"
  71336. #endif
  71337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71338. "adds r3, r3, r7\n\t"
  71339. #else
  71340. "add r3, r3, r7\n\t"
  71341. #endif
  71342. #ifdef WOLFSSL_KEIL
  71343. "adcs r4, r4, %[tmp]\n\t"
  71344. #elif defined(__clang__)
  71345. "adcs r4, %[tmp]\n\t"
  71346. #else
  71347. "adc r4, %[tmp]\n\t"
  71348. #endif
  71349. #ifdef WOLFSSL_KEIL
  71350. "adcs r5, r5, %[tmp]\n\t"
  71351. #elif defined(__clang__)
  71352. "adcs r5, %[tmp]\n\t"
  71353. #else
  71354. "adc r5, %[tmp]\n\t"
  71355. #endif
  71356. "ldr r7, [%[b]]\n\t"
  71357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71358. "lsrs r7, r7, #16\n\t"
  71359. #else
  71360. "lsr r7, r7, #16\n\t"
  71361. #endif
  71362. #ifdef WOLFSSL_KEIL
  71363. "muls r6, r7, r6\n\t"
  71364. #elif defined(__clang__)
  71365. "muls r6, r7\n\t"
  71366. #else
  71367. "mul r6, r7\n\t"
  71368. #endif
  71369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71370. "lsrs r7, r6, #16\n\t"
  71371. #else
  71372. "lsr r7, r6, #16\n\t"
  71373. #endif
  71374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71375. "lsls r6, r6, #16\n\t"
  71376. #else
  71377. "lsl r6, r6, #16\n\t"
  71378. #endif
  71379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71380. "adds r3, r3, r6\n\t"
  71381. #else
  71382. "add r3, r3, r6\n\t"
  71383. #endif
  71384. #ifdef WOLFSSL_KEIL
  71385. "adcs r4, r4, r7\n\t"
  71386. #elif defined(__clang__)
  71387. "adcs r4, r7\n\t"
  71388. #else
  71389. "adc r4, r7\n\t"
  71390. #endif
  71391. #ifdef WOLFSSL_KEIL
  71392. "adcs r5, r5, %[tmp]\n\t"
  71393. #elif defined(__clang__)
  71394. "adcs r5, %[tmp]\n\t"
  71395. #else
  71396. "adc r5, %[tmp]\n\t"
  71397. #endif
  71398. "ldr r6, [%[a]]\n\t"
  71399. "ldr r7, [%[b]]\n\t"
  71400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71401. "lsrs r6, r6, #16\n\t"
  71402. #else
  71403. "lsr r6, r6, #16\n\t"
  71404. #endif
  71405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71406. "lsrs r7, r7, #16\n\t"
  71407. #else
  71408. "lsr r7, r7, #16\n\t"
  71409. #endif
  71410. #ifdef WOLFSSL_KEIL
  71411. "muls r7, r6, r7\n\t"
  71412. #elif defined(__clang__)
  71413. "muls r7, r6\n\t"
  71414. #else
  71415. "mul r7, r6\n\t"
  71416. #endif
  71417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71418. "adds r4, r4, r7\n\t"
  71419. #else
  71420. "add r4, r4, r7\n\t"
  71421. #endif
  71422. #ifdef WOLFSSL_KEIL
  71423. "adcs r5, r5, %[tmp]\n\t"
  71424. #elif defined(__clang__)
  71425. "adcs r5, %[tmp]\n\t"
  71426. #else
  71427. "adc r5, %[tmp]\n\t"
  71428. #endif
  71429. "ldrh r7, [%[b]]\n\t"
  71430. #ifdef WOLFSSL_KEIL
  71431. "muls r6, r7, r6\n\t"
  71432. #elif defined(__clang__)
  71433. "muls r6, r7\n\t"
  71434. #else
  71435. "mul r6, r7\n\t"
  71436. #endif
  71437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71438. "lsrs r7, r6, #16\n\t"
  71439. #else
  71440. "lsr r7, r6, #16\n\t"
  71441. #endif
  71442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71443. "lsls r6, r6, #16\n\t"
  71444. #else
  71445. "lsl r6, r6, #16\n\t"
  71446. #endif
  71447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71448. "adds r3, r3, r6\n\t"
  71449. #else
  71450. "add r3, r3, r6\n\t"
  71451. #endif
  71452. #ifdef WOLFSSL_KEIL
  71453. "adcs r4, r4, r7\n\t"
  71454. #elif defined(__clang__)
  71455. "adcs r4, r7\n\t"
  71456. #else
  71457. "adc r4, r7\n\t"
  71458. #endif
  71459. #ifdef WOLFSSL_KEIL
  71460. "adcs r5, r5, %[tmp]\n\t"
  71461. #elif defined(__clang__)
  71462. "adcs r5, %[tmp]\n\t"
  71463. #else
  71464. "adc r5, %[tmp]\n\t"
  71465. #endif
  71466. "# Multiply Done\n\t"
  71467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71468. "adds %[a], %[a], #4\n\t"
  71469. #else
  71470. "add %[a], %[a], #4\n\t"
  71471. #endif
  71472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71473. "subs %[b], %[b], #4\n\t"
  71474. #else
  71475. "sub %[b], %[b], #4\n\t"
  71476. #endif
  71477. "cmp %[a], r12\n\t"
  71478. "beq L_sp_3072_mul_48_done_mul_%=\n\t"
  71479. "mov r6, r8\n\t"
  71480. "add r6, r6, r9\n\t"
  71481. "cmp %[a], r6\n\t"
  71482. "ble L_sp_3072_mul_48_mul_%=\n\t"
  71483. "\n"
  71484. "L_sp_3072_mul_48_done_mul_%=:\n\t"
  71485. "mov %[tmp], r11\n\t"
  71486. "mov r7, r8\n\t"
  71487. "str r3, [%[tmp], r7]\n\t"
  71488. "movs r3, r4\n\t"
  71489. "movs r4, r5\n\t"
  71490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71491. "adds r7, r7, #4\n\t"
  71492. #else
  71493. "add r7, r7, #4\n\t"
  71494. #endif
  71495. "mov r8, r7\n\t"
  71496. "movs r6, #0xff\n\t"
  71497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71498. "adds r6, r6, #0x79\n\t"
  71499. #else
  71500. "add r6, r6, #0x79\n\t"
  71501. #endif
  71502. "cmp r7, r6\n\t"
  71503. "ble L_sp_3072_mul_48_words_%=\n\t"
  71504. "str r3, [%[tmp], r7]\n\t"
  71505. "mov %[a], r9\n\t"
  71506. "mov %[b], r10\n\t"
  71507. : [a] "+r" (a), [b] "+r" (b), [tmp] "+r" (tmp)
  71508. :
  71509. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  71510. );
  71511. XMEMCPY(r, t, sizeof(t));
  71512. }
  71513. /* Square a and put result in r. (r = a * a)
  71514. *
  71515. * r A single precision integer.
  71516. * a A single precision integer.
  71517. */
  71518. SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
  71519. {
  71520. __asm__ __volatile__ (
  71521. "movs r3, #0\n\t"
  71522. "movs r4, #0\n\t"
  71523. "movs r5, #0\n\t"
  71524. "mov r8, r3\n\t"
  71525. "mov r11, %[r]\n\t"
  71526. "movs r6, #0xff\n\t"
  71527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71528. "adds r6, r6, #0x81\n\t"
  71529. #else
  71530. "add r6, r6, #0x81\n\t"
  71531. #endif
  71532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71533. "negs r6, r6\n\t"
  71534. #else
  71535. "neg r6, r6\n\t"
  71536. #endif
  71537. "add sp, sp, r6\n\t"
  71538. "mov r10, sp\n\t"
  71539. "mov r9, %[a]\n\t"
  71540. "\n"
  71541. "L_sp_3072_sqr_48_words_%=:\n\t"
  71542. "movs %[r], #0\n\t"
  71543. "movs r6, #0xbc\n\t"
  71544. "mov %[a], r8\n\t"
  71545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71546. "subs %[a], %[a], r6\n\t"
  71547. #else
  71548. "sub %[a], %[a], r6\n\t"
  71549. #endif
  71550. #ifdef WOLFSSL_KEIL
  71551. "sbcs r6, r6, r6\n\t"
  71552. #elif defined(__clang__)
  71553. "sbcs r6, r6\n\t"
  71554. #else
  71555. "sbc r6, r6\n\t"
  71556. #endif
  71557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71558. "mvns r6, r6\n\t"
  71559. #else
  71560. "mvn r6, r6\n\t"
  71561. #endif
  71562. #ifdef WOLFSSL_KEIL
  71563. "ands %[a], %[a], r6\n\t"
  71564. #elif defined(__clang__)
  71565. "ands %[a], r6\n\t"
  71566. #else
  71567. "and %[a], r6\n\t"
  71568. #endif
  71569. "mov r2, r8\n\t"
  71570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71571. "subs r2, r2, %[a]\n\t"
  71572. #else
  71573. "sub r2, r2, %[a]\n\t"
  71574. #endif
  71575. "add %[a], %[a], r9\n\t"
  71576. "add r2, r2, r9\n\t"
  71577. "\n"
  71578. "L_sp_3072_sqr_48_mul_%=:\n\t"
  71579. "cmp r2, %[a]\n\t"
  71580. "beq L_sp_3072_sqr_48_sqr_%=\n\t"
  71581. "# Multiply * 2: Start\n\t"
  71582. "ldrh r6, [%[a]]\n\t"
  71583. "ldrh r7, [r2]\n\t"
  71584. #ifdef WOLFSSL_KEIL
  71585. "muls r7, r6, r7\n\t"
  71586. #elif defined(__clang__)
  71587. "muls r7, r6\n\t"
  71588. #else
  71589. "mul r7, r6\n\t"
  71590. #endif
  71591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71592. "adds r3, r3, r7\n\t"
  71593. #else
  71594. "add r3, r3, r7\n\t"
  71595. #endif
  71596. #ifdef WOLFSSL_KEIL
  71597. "adcs r4, r4, %[r]\n\t"
  71598. #elif defined(__clang__)
  71599. "adcs r4, %[r]\n\t"
  71600. #else
  71601. "adc r4, %[r]\n\t"
  71602. #endif
  71603. #ifdef WOLFSSL_KEIL
  71604. "adcs r5, r5, %[r]\n\t"
  71605. #elif defined(__clang__)
  71606. "adcs r5, %[r]\n\t"
  71607. #else
  71608. "adc r5, %[r]\n\t"
  71609. #endif
  71610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71611. "adds r3, r3, r7\n\t"
  71612. #else
  71613. "add r3, r3, r7\n\t"
  71614. #endif
  71615. #ifdef WOLFSSL_KEIL
  71616. "adcs r4, r4, %[r]\n\t"
  71617. #elif defined(__clang__)
  71618. "adcs r4, %[r]\n\t"
  71619. #else
  71620. "adc r4, %[r]\n\t"
  71621. #endif
  71622. #ifdef WOLFSSL_KEIL
  71623. "adcs r5, r5, %[r]\n\t"
  71624. #elif defined(__clang__)
  71625. "adcs r5, %[r]\n\t"
  71626. #else
  71627. "adc r5, %[r]\n\t"
  71628. #endif
  71629. "ldr r7, [r2]\n\t"
  71630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71631. "lsrs r7, r7, #16\n\t"
  71632. #else
  71633. "lsr r7, r7, #16\n\t"
  71634. #endif
  71635. #ifdef WOLFSSL_KEIL
  71636. "muls r6, r7, r6\n\t"
  71637. #elif defined(__clang__)
  71638. "muls r6, r7\n\t"
  71639. #else
  71640. "mul r6, r7\n\t"
  71641. #endif
  71642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71643. "lsrs r7, r6, #16\n\t"
  71644. #else
  71645. "lsr r7, r6, #16\n\t"
  71646. #endif
  71647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71648. "lsls r6, r6, #16\n\t"
  71649. #else
  71650. "lsl r6, r6, #16\n\t"
  71651. #endif
  71652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71653. "adds r3, r3, r6\n\t"
  71654. #else
  71655. "add r3, r3, r6\n\t"
  71656. #endif
  71657. #ifdef WOLFSSL_KEIL
  71658. "adcs r4, r4, r7\n\t"
  71659. #elif defined(__clang__)
  71660. "adcs r4, r7\n\t"
  71661. #else
  71662. "adc r4, r7\n\t"
  71663. #endif
  71664. #ifdef WOLFSSL_KEIL
  71665. "adcs r5, r5, %[r]\n\t"
  71666. #elif defined(__clang__)
  71667. "adcs r5, %[r]\n\t"
  71668. #else
  71669. "adc r5, %[r]\n\t"
  71670. #endif
  71671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71672. "adds r3, r3, r6\n\t"
  71673. #else
  71674. "add r3, r3, r6\n\t"
  71675. #endif
  71676. #ifdef WOLFSSL_KEIL
  71677. "adcs r4, r4, r7\n\t"
  71678. #elif defined(__clang__)
  71679. "adcs r4, r7\n\t"
  71680. #else
  71681. "adc r4, r7\n\t"
  71682. #endif
  71683. #ifdef WOLFSSL_KEIL
  71684. "adcs r5, r5, %[r]\n\t"
  71685. #elif defined(__clang__)
  71686. "adcs r5, %[r]\n\t"
  71687. #else
  71688. "adc r5, %[r]\n\t"
  71689. #endif
  71690. "ldr r6, [%[a]]\n\t"
  71691. "ldr r7, [r2]\n\t"
  71692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71693. "lsrs r6, r6, #16\n\t"
  71694. #else
  71695. "lsr r6, r6, #16\n\t"
  71696. #endif
  71697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71698. "lsrs r7, r7, #16\n\t"
  71699. #else
  71700. "lsr r7, r7, #16\n\t"
  71701. #endif
  71702. #ifdef WOLFSSL_KEIL
  71703. "muls r7, r6, r7\n\t"
  71704. #elif defined(__clang__)
  71705. "muls r7, r6\n\t"
  71706. #else
  71707. "mul r7, r6\n\t"
  71708. #endif
  71709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71710. "adds r4, r4, r7\n\t"
  71711. #else
  71712. "add r4, r4, r7\n\t"
  71713. #endif
  71714. #ifdef WOLFSSL_KEIL
  71715. "adcs r5, r5, %[r]\n\t"
  71716. #elif defined(__clang__)
  71717. "adcs r5, %[r]\n\t"
  71718. #else
  71719. "adc r5, %[r]\n\t"
  71720. #endif
  71721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71722. "adds r4, r4, r7\n\t"
  71723. #else
  71724. "add r4, r4, r7\n\t"
  71725. #endif
  71726. #ifdef WOLFSSL_KEIL
  71727. "adcs r5, r5, %[r]\n\t"
  71728. #elif defined(__clang__)
  71729. "adcs r5, %[r]\n\t"
  71730. #else
  71731. "adc r5, %[r]\n\t"
  71732. #endif
  71733. "ldrh r7, [r2]\n\t"
  71734. #ifdef WOLFSSL_KEIL
  71735. "muls r6, r7, r6\n\t"
  71736. #elif defined(__clang__)
  71737. "muls r6, r7\n\t"
  71738. #else
  71739. "mul r6, r7\n\t"
  71740. #endif
  71741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71742. "lsrs r7, r6, #16\n\t"
  71743. #else
  71744. "lsr r7, r6, #16\n\t"
  71745. #endif
  71746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71747. "lsls r6, r6, #16\n\t"
  71748. #else
  71749. "lsl r6, r6, #16\n\t"
  71750. #endif
  71751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71752. "adds r3, r3, r6\n\t"
  71753. #else
  71754. "add r3, r3, r6\n\t"
  71755. #endif
  71756. #ifdef WOLFSSL_KEIL
  71757. "adcs r4, r4, r7\n\t"
  71758. #elif defined(__clang__)
  71759. "adcs r4, r7\n\t"
  71760. #else
  71761. "adc r4, r7\n\t"
  71762. #endif
  71763. #ifdef WOLFSSL_KEIL
  71764. "adcs r5, r5, %[r]\n\t"
  71765. #elif defined(__clang__)
  71766. "adcs r5, %[r]\n\t"
  71767. #else
  71768. "adc r5, %[r]\n\t"
  71769. #endif
  71770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71771. "adds r3, r3, r6\n\t"
  71772. #else
  71773. "add r3, r3, r6\n\t"
  71774. #endif
  71775. #ifdef WOLFSSL_KEIL
  71776. "adcs r4, r4, r7\n\t"
  71777. #elif defined(__clang__)
  71778. "adcs r4, r7\n\t"
  71779. #else
  71780. "adc r4, r7\n\t"
  71781. #endif
  71782. #ifdef WOLFSSL_KEIL
  71783. "adcs r5, r5, %[r]\n\t"
  71784. #elif defined(__clang__)
  71785. "adcs r5, %[r]\n\t"
  71786. #else
  71787. "adc r5, %[r]\n\t"
  71788. #endif
  71789. "# Multiply * 2: Done\n\t"
  71790. "bal L_sp_3072_sqr_48_done_sqr_%=\n\t"
  71791. "\n"
  71792. "L_sp_3072_sqr_48_sqr_%=:\n\t"
  71793. "mov r12, r2\n\t"
  71794. "ldr r2, [%[a]]\n\t"
  71795. "# Square: Start\n\t"
  71796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71797. "lsrs r7, r2, #16\n\t"
  71798. #else
  71799. "lsr r7, r2, #16\n\t"
  71800. #endif
  71801. "uxth r6, r2\n\t"
  71802. #ifdef WOLFSSL_KEIL
  71803. "muls r6, r6, r6\n\t"
  71804. #elif defined(__clang__)
  71805. "muls r6, r6\n\t"
  71806. #else
  71807. "mul r6, r6\n\t"
  71808. #endif
  71809. #ifdef WOLFSSL_KEIL
  71810. "muls r7, r7, r7\n\t"
  71811. #elif defined(__clang__)
  71812. "muls r7, r7\n\t"
  71813. #else
  71814. "mul r7, r7\n\t"
  71815. #endif
  71816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71817. "adds r3, r3, r6\n\t"
  71818. #else
  71819. "add r3, r3, r6\n\t"
  71820. #endif
  71821. #ifdef WOLFSSL_KEIL
  71822. "adcs r4, r4, r7\n\t"
  71823. #elif defined(__clang__)
  71824. "adcs r4, r7\n\t"
  71825. #else
  71826. "adc r4, r7\n\t"
  71827. #endif
  71828. #ifdef WOLFSSL_KEIL
  71829. "adcs r5, r5, %[r]\n\t"
  71830. #elif defined(__clang__)
  71831. "adcs r5, %[r]\n\t"
  71832. #else
  71833. "adc r5, %[r]\n\t"
  71834. #endif
  71835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71836. "lsrs r7, r2, #16\n\t"
  71837. #else
  71838. "lsr r7, r2, #16\n\t"
  71839. #endif
  71840. "uxth r6, r2\n\t"
  71841. #ifdef WOLFSSL_KEIL
  71842. "muls r6, r7, r6\n\t"
  71843. #elif defined(__clang__)
  71844. "muls r6, r7\n\t"
  71845. #else
  71846. "mul r6, r7\n\t"
  71847. #endif
  71848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71849. "lsrs r7, r6, #15\n\t"
  71850. #else
  71851. "lsr r7, r6, #15\n\t"
  71852. #endif
  71853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71854. "lsls r6, r6, #17\n\t"
  71855. #else
  71856. "lsl r6, r6, #17\n\t"
  71857. #endif
  71858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71859. "adds r3, r3, r6\n\t"
  71860. #else
  71861. "add r3, r3, r6\n\t"
  71862. #endif
  71863. #ifdef WOLFSSL_KEIL
  71864. "adcs r4, r4, r7\n\t"
  71865. #elif defined(__clang__)
  71866. "adcs r4, r7\n\t"
  71867. #else
  71868. "adc r4, r7\n\t"
  71869. #endif
  71870. #ifdef WOLFSSL_KEIL
  71871. "adcs r5, r5, %[r]\n\t"
  71872. #elif defined(__clang__)
  71873. "adcs r5, %[r]\n\t"
  71874. #else
  71875. "adc r5, %[r]\n\t"
  71876. #endif
  71877. "# Square: Done\n\t"
  71878. "mov r2, r12\n\t"
  71879. "\n"
  71880. "L_sp_3072_sqr_48_done_sqr_%=:\n\t"
  71881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71882. "adds %[a], %[a], #4\n\t"
  71883. #else
  71884. "add %[a], %[a], #4\n\t"
  71885. #endif
  71886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71887. "subs r2, r2, #4\n\t"
  71888. #else
  71889. "sub r2, r2, #4\n\t"
  71890. #endif
  71891. "movs r6, #0xc0\n\t"
  71892. "add r6, r6, r9\n\t"
  71893. "cmp %[a], r6\n\t"
  71894. "beq L_sp_3072_sqr_48_done_mul_%=\n\t"
  71895. "cmp %[a], r2\n\t"
  71896. "bgt L_sp_3072_sqr_48_done_mul_%=\n\t"
  71897. "mov r7, r8\n\t"
  71898. "add r7, r7, r9\n\t"
  71899. "cmp %[a], r7\n\t"
  71900. "ble L_sp_3072_sqr_48_mul_%=\n\t"
  71901. "\n"
  71902. "L_sp_3072_sqr_48_done_mul_%=:\n\t"
  71903. "mov %[r], r10\n\t"
  71904. "mov r7, r8\n\t"
  71905. "str r3, [%[r], r7]\n\t"
  71906. "movs r3, r4\n\t"
  71907. "movs r4, r5\n\t"
  71908. "movs r5, #0\n\t"
  71909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71910. "adds r7, r7, #4\n\t"
  71911. #else
  71912. "add r7, r7, #4\n\t"
  71913. #endif
  71914. "mov r8, r7\n\t"
  71915. "movs r6, #0xff\n\t"
  71916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71917. "adds r6, r6, #0x79\n\t"
  71918. #else
  71919. "add r6, r6, #0x79\n\t"
  71920. #endif
  71921. "cmp r7, r6\n\t"
  71922. "ble L_sp_3072_sqr_48_words_%=\n\t"
  71923. "mov %[a], r9\n\t"
  71924. "str r3, [%[r], r7]\n\t"
  71925. "mov %[r], r11\n\t"
  71926. "mov %[a], r10\n\t"
  71927. "movs r3, #0xff\n\t"
  71928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71929. "adds r3, r3, #0x7d\n\t"
  71930. #else
  71931. "add r3, r3, #0x7d\n\t"
  71932. #endif
  71933. "\n"
  71934. "L_sp_3072_sqr_48_store_%=:\n\t"
  71935. "ldr r6, [%[a], r3]\n\t"
  71936. "str r6, [%[r], r3]\n\t"
  71937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71938. "subs r3, r3, #4\n\t"
  71939. #else
  71940. "sub r3, r3, #4\n\t"
  71941. #endif
  71942. "bge L_sp_3072_sqr_48_store_%=\n\t"
  71943. "movs r6, #0xff\n\t"
  71944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71945. "adds r6, r6, #0x81\n\t"
  71946. #else
  71947. "add r6, r6, #0x81\n\t"
  71948. #endif
  71949. "add sp, sp, r6\n\t"
  71950. : [r] "+r" (r), [a] "+r" (a)
  71951. :
  71952. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  71953. );
  71954. }
  71955. #endif /* WOLFSSL_SP_SMALL */
  71956. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  71957. /* Caclulate the bottom digit of -1/a mod 2^n.
  71958. *
  71959. * a A single precision number.
  71960. * rho Bottom word of inverse.
  71961. */
  71962. static void sp_3072_mont_setup(const sp_digit* a, sp_digit* rho)
  71963. {
  71964. sp_digit x;
  71965. sp_digit b;
  71966. b = a[0];
  71967. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  71968. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  71969. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  71970. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  71971. /* rho = -1/m mod b */
  71972. *rho = (sp_digit)0 - x;
  71973. }
  71974. /* Mul a by digit b into r. (r = a * b)
  71975. *
  71976. * r A single precision integer.
  71977. * a A single precision integer.
  71978. * b A single precision digit.
  71979. */
  71980. SP_NOINLINE static void sp_3072_mul_d_96(sp_digit* r, const sp_digit* a,
  71981. sp_digit b)
  71982. {
  71983. __asm__ __volatile__ (
  71984. "movs r6, #0xff\n\t"
  71985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71986. "adds r6, r6, #0x81\n\t"
  71987. #else
  71988. "add r6, r6, #0x81\n\t"
  71989. #endif
  71990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71991. "adds r6, r6, %[a]\n\t"
  71992. #else
  71993. "add r6, r6, %[a]\n\t"
  71994. #endif
  71995. "mov r8, %[r]\n\t"
  71996. "mov r9, r6\n\t"
  71997. "movs r3, #0\n\t"
  71998. "movs r4, #0\n\t"
  71999. "\n"
  72000. "L_sp_3072_mul_d_96_%=:\n\t"
  72001. "movs %[r], #0\n\t"
  72002. "movs r5, #0\n\t"
  72003. "# A[] * B\n\t"
  72004. "ldrh r6, [%[a]]\n\t"
  72005. "uxth r7, %[b]\n\t"
  72006. #ifdef WOLFSSL_KEIL
  72007. "muls r7, r6, r7\n\t"
  72008. #elif defined(__clang__)
  72009. "muls r7, r6\n\t"
  72010. #else
  72011. "mul r7, r6\n\t"
  72012. #endif
  72013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72014. "adds r3, r3, r7\n\t"
  72015. #else
  72016. "add r3, r3, r7\n\t"
  72017. #endif
  72018. #ifdef WOLFSSL_KEIL
  72019. "adcs r4, r4, %[r]\n\t"
  72020. #elif defined(__clang__)
  72021. "adcs r4, %[r]\n\t"
  72022. #else
  72023. "adc r4, %[r]\n\t"
  72024. #endif
  72025. #ifdef WOLFSSL_KEIL
  72026. "adcs r5, r5, %[r]\n\t"
  72027. #elif defined(__clang__)
  72028. "adcs r5, %[r]\n\t"
  72029. #else
  72030. "adc r5, %[r]\n\t"
  72031. #endif
  72032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72033. "lsrs r7, %[b], #16\n\t"
  72034. #else
  72035. "lsr r7, %[b], #16\n\t"
  72036. #endif
  72037. #ifdef WOLFSSL_KEIL
  72038. "muls r6, r7, r6\n\t"
  72039. #elif defined(__clang__)
  72040. "muls r6, r7\n\t"
  72041. #else
  72042. "mul r6, r7\n\t"
  72043. #endif
  72044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72045. "lsrs r7, r6, #16\n\t"
  72046. #else
  72047. "lsr r7, r6, #16\n\t"
  72048. #endif
  72049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72050. "lsls r6, r6, #16\n\t"
  72051. #else
  72052. "lsl r6, r6, #16\n\t"
  72053. #endif
  72054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72055. "adds r3, r3, r6\n\t"
  72056. #else
  72057. "add r3, r3, r6\n\t"
  72058. #endif
  72059. #ifdef WOLFSSL_KEIL
  72060. "adcs r4, r4, r7\n\t"
  72061. #elif defined(__clang__)
  72062. "adcs r4, r7\n\t"
  72063. #else
  72064. "adc r4, r7\n\t"
  72065. #endif
  72066. #ifdef WOLFSSL_KEIL
  72067. "adcs r5, r5, %[r]\n\t"
  72068. #elif defined(__clang__)
  72069. "adcs r5, %[r]\n\t"
  72070. #else
  72071. "adc r5, %[r]\n\t"
  72072. #endif
  72073. "ldr r6, [%[a]]\n\t"
  72074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72075. "lsrs r6, r6, #16\n\t"
  72076. #else
  72077. "lsr r6, r6, #16\n\t"
  72078. #endif
  72079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72080. "lsrs r7, %[b], #16\n\t"
  72081. #else
  72082. "lsr r7, %[b], #16\n\t"
  72083. #endif
  72084. #ifdef WOLFSSL_KEIL
  72085. "muls r7, r6, r7\n\t"
  72086. #elif defined(__clang__)
  72087. "muls r7, r6\n\t"
  72088. #else
  72089. "mul r7, r6\n\t"
  72090. #endif
  72091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72092. "adds r4, r4, r7\n\t"
  72093. #else
  72094. "add r4, r4, r7\n\t"
  72095. #endif
  72096. #ifdef WOLFSSL_KEIL
  72097. "adcs r5, r5, %[r]\n\t"
  72098. #elif defined(__clang__)
  72099. "adcs r5, %[r]\n\t"
  72100. #else
  72101. "adc r5, %[r]\n\t"
  72102. #endif
  72103. "uxth r7, %[b]\n\t"
  72104. #ifdef WOLFSSL_KEIL
  72105. "muls r6, r7, r6\n\t"
  72106. #elif defined(__clang__)
  72107. "muls r6, r7\n\t"
  72108. #else
  72109. "mul r6, r7\n\t"
  72110. #endif
  72111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72112. "lsrs r7, r6, #16\n\t"
  72113. #else
  72114. "lsr r7, r6, #16\n\t"
  72115. #endif
  72116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72117. "lsls r6, r6, #16\n\t"
  72118. #else
  72119. "lsl r6, r6, #16\n\t"
  72120. #endif
  72121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72122. "adds r3, r3, r6\n\t"
  72123. #else
  72124. "add r3, r3, r6\n\t"
  72125. #endif
  72126. #ifdef WOLFSSL_KEIL
  72127. "adcs r4, r4, r7\n\t"
  72128. #elif defined(__clang__)
  72129. "adcs r4, r7\n\t"
  72130. #else
  72131. "adc r4, r7\n\t"
  72132. #endif
  72133. #ifdef WOLFSSL_KEIL
  72134. "adcs r5, r5, %[r]\n\t"
  72135. #elif defined(__clang__)
  72136. "adcs r5, %[r]\n\t"
  72137. #else
  72138. "adc r5, %[r]\n\t"
  72139. #endif
  72140. "# A[] * B - Done\n\t"
  72141. "mov %[r], r8\n\t"
  72142. "str r3, [%[r]]\n\t"
  72143. "movs r3, r4\n\t"
  72144. "movs r4, r5\n\t"
  72145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72146. "adds %[r], %[r], #4\n\t"
  72147. #else
  72148. "add %[r], %[r], #4\n\t"
  72149. #endif
  72150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72151. "adds %[a], %[a], #4\n\t"
  72152. #else
  72153. "add %[a], %[a], #4\n\t"
  72154. #endif
  72155. "mov r8, %[r]\n\t"
  72156. "cmp %[a], r9\n\t"
  72157. "blt L_sp_3072_mul_d_96_%=\n\t"
  72158. "str r3, [%[r]]\n\t"
  72159. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  72160. :
  72161. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  72162. );
  72163. }
  72164. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  72165. /* r = 2^n mod m where n is the number of bits to reduce by.
  72166. * Given m must be 3072 bits, just need to subtract.
  72167. *
  72168. * r A single precision number.
  72169. * m A single precision number.
  72170. */
  72171. static void sp_3072_mont_norm_48(sp_digit* r, const sp_digit* m)
  72172. {
  72173. XMEMSET(r, 0, sizeof(sp_digit) * 48);
  72174. /* r = 2^n mod m */
  72175. sp_3072_sub_in_place_48(r, m);
  72176. }
  72177. /* Conditionally subtract b from a using the mask m.
  72178. * m is -1 to subtract and 0 when not copying.
  72179. *
  72180. * r A single precision number representing condition subtract result.
  72181. * a A single precision number to subtract from.
  72182. * b A single precision number to subtract.
  72183. * m Mask value to apply.
  72184. */
  72185. SP_NOINLINE static sp_digit sp_3072_cond_sub_48(sp_digit* r, const sp_digit* a,
  72186. const sp_digit* b, sp_digit m)
  72187. {
  72188. __asm__ __volatile__ (
  72189. "movs r4, #0\n\t"
  72190. "movs r5, #0xc0\n\t"
  72191. "mov r8, r5\n\t"
  72192. "movs r7, #0\n\t"
  72193. "\n"
  72194. "L_sp_3072_cond_sub_48_words_%=:\n\t"
  72195. "ldr r6, [%[b], r7]\n\t"
  72196. #ifdef WOLFSSL_KEIL
  72197. "ands r6, r6, %[m]\n\t"
  72198. #elif defined(__clang__)
  72199. "ands r6, %[m]\n\t"
  72200. #else
  72201. "and r6, %[m]\n\t"
  72202. #endif
  72203. "movs r5, #0\n\t"
  72204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72205. "subs r5, r5, r4\n\t"
  72206. #else
  72207. "sub r5, r5, r4\n\t"
  72208. #endif
  72209. "ldr r5, [%[a], r7]\n\t"
  72210. #ifdef WOLFSSL_KEIL
  72211. "sbcs r5, r5, r6\n\t"
  72212. #elif defined(__clang__)
  72213. "sbcs r5, r6\n\t"
  72214. #else
  72215. "sbc r5, r6\n\t"
  72216. #endif
  72217. #ifdef WOLFSSL_KEIL
  72218. "sbcs r4, r4, r4\n\t"
  72219. #elif defined(__clang__)
  72220. "sbcs r4, r4\n\t"
  72221. #else
  72222. "sbc r4, r4\n\t"
  72223. #endif
  72224. "str r5, [%[r], r7]\n\t"
  72225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72226. "adds r7, r7, #4\n\t"
  72227. #else
  72228. "add r7, r7, #4\n\t"
  72229. #endif
  72230. "cmp r7, r8\n\t"
  72231. "blt L_sp_3072_cond_sub_48_words_%=\n\t"
  72232. "movs %[r], r4\n\t"
  72233. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  72234. :
  72235. : "memory", "r4", "r5", "r6", "r7", "r8"
  72236. );
  72237. return (uint32_t)(size_t)r;
  72238. }
  72239. /* Reduce the number back to 3072 bits using Montgomery reduction.
  72240. *
  72241. * a A single precision number to reduce in place.
  72242. * m The single precision number representing the modulus.
  72243. * mp The digit representing the negative inverse of m mod 2^n.
  72244. */
  72245. SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, const sp_digit* m,
  72246. sp_digit mp)
  72247. {
  72248. __asm__ __volatile__ (
  72249. "movs r7, #0\n\t"
  72250. "mov r8, %[mp]\n\t"
  72251. "mov r12, r7\n\t"
  72252. "mov lr, %[m]\n\t"
  72253. "mov r9, %[a]\n\t"
  72254. "mov r11, %[a]\n\t"
  72255. "movs r5, #0xbc\n\t"
  72256. "movs r6, #0xc0\n\t"
  72257. "add r9, r9, r5\n\t"
  72258. "add r11, r11, r6\n\t"
  72259. "\n"
  72260. "L_sp_3072_mont_reduce_48_mod_%=:\n\t"
  72261. "movs r7, #0\n\t"
  72262. "movs r4, #0\n\t"
  72263. "# a[i] += m[0] * mu\n\t"
  72264. "ldm %[m]!, {%[mp]}\n\t"
  72265. "ldm %[a]!, {r3}\n\t"
  72266. "# mu = a[i] * mp\n\t"
  72267. "mov r5, r8\n\t"
  72268. #ifdef WOLFSSL_KEIL
  72269. "muls r5, r3, r5\n\t"
  72270. #elif defined(__clang__)
  72271. "muls r5, r3\n\t"
  72272. #else
  72273. "mul r5, r3\n\t"
  72274. #endif
  72275. "mov r10, r5\n\t"
  72276. "# Multiply m[0] and mu - Start\n\t"
  72277. "mov r5, r10\n\t"
  72278. "uxth r6, %[mp]\n\t"
  72279. "uxth r5, r5\n\t"
  72280. #ifdef WOLFSSL_KEIL
  72281. "muls r6, r5, r6\n\t"
  72282. #elif defined(__clang__)
  72283. "muls r6, r5\n\t"
  72284. #else
  72285. "mul r6, r5\n\t"
  72286. #endif
  72287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72288. "adds r3, r3, r6\n\t"
  72289. #else
  72290. "add r3, r3, r6\n\t"
  72291. #endif
  72292. #ifdef WOLFSSL_KEIL
  72293. "adcs r4, r4, r7\n\t"
  72294. #elif defined(__clang__)
  72295. "adcs r4, r7\n\t"
  72296. #else
  72297. "adc r4, r7\n\t"
  72298. #endif
  72299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72300. "lsrs r6, %[mp], #16\n\t"
  72301. #else
  72302. "lsr r6, %[mp], #16\n\t"
  72303. #endif
  72304. #ifdef WOLFSSL_KEIL
  72305. "muls r5, r6, r5\n\t"
  72306. #elif defined(__clang__)
  72307. "muls r5, r6\n\t"
  72308. #else
  72309. "mul r5, r6\n\t"
  72310. #endif
  72311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72312. "lsrs r6, r5, #16\n\t"
  72313. #else
  72314. "lsr r6, r5, #16\n\t"
  72315. #endif
  72316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72317. "lsls r5, r5, #16\n\t"
  72318. #else
  72319. "lsl r5, r5, #16\n\t"
  72320. #endif
  72321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72322. "adds r3, r3, r5\n\t"
  72323. #else
  72324. "add r3, r3, r5\n\t"
  72325. #endif
  72326. #ifdef WOLFSSL_KEIL
  72327. "adcs r4, r4, r6\n\t"
  72328. #elif defined(__clang__)
  72329. "adcs r4, r6\n\t"
  72330. #else
  72331. "adc r4, r6\n\t"
  72332. #endif
  72333. "mov r5, r10\n\t"
  72334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72335. "lsrs r6, %[mp], #16\n\t"
  72336. #else
  72337. "lsr r6, %[mp], #16\n\t"
  72338. #endif
  72339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72340. "lsrs r5, r5, #16\n\t"
  72341. #else
  72342. "lsr r5, r5, #16\n\t"
  72343. #endif
  72344. #ifdef WOLFSSL_KEIL
  72345. "muls r6, r5, r6\n\t"
  72346. #elif defined(__clang__)
  72347. "muls r6, r5\n\t"
  72348. #else
  72349. "mul r6, r5\n\t"
  72350. #endif
  72351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72352. "adds r4, r4, r6\n\t"
  72353. #else
  72354. "add r4, r4, r6\n\t"
  72355. #endif
  72356. "uxth r6, %[mp]\n\t"
  72357. #ifdef WOLFSSL_KEIL
  72358. "muls r5, r6, r5\n\t"
  72359. #elif defined(__clang__)
  72360. "muls r5, r6\n\t"
  72361. #else
  72362. "mul r5, r6\n\t"
  72363. #endif
  72364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72365. "lsrs r6, r5, #16\n\t"
  72366. #else
  72367. "lsr r6, r5, #16\n\t"
  72368. #endif
  72369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72370. "lsls r5, r5, #16\n\t"
  72371. #else
  72372. "lsl r5, r5, #16\n\t"
  72373. #endif
  72374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72375. "adds r3, r3, r5\n\t"
  72376. #else
  72377. "add r3, r3, r5\n\t"
  72378. #endif
  72379. #ifdef WOLFSSL_KEIL
  72380. "adcs r4, r4, r6\n\t"
  72381. #elif defined(__clang__)
  72382. "adcs r4, r6\n\t"
  72383. #else
  72384. "adc r4, r6\n\t"
  72385. #endif
  72386. "# Multiply m[0] and mu - Done\n\t"
  72387. "\n"
  72388. "L_sp_3072_mont_reduce_48_word_%=:\n\t"
  72389. "# a[i+j] += m[j] * mu\n\t"
  72390. "ldr r3, [%[a]]\n\t"
  72391. "ldm %[m]!, {%[mp]}\n\t"
  72392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72393. "adds r3, r3, r4\n\t"
  72394. #else
  72395. "add r3, r3, r4\n\t"
  72396. #endif
  72397. "movs r4, #0\n\t"
  72398. #ifdef WOLFSSL_KEIL
  72399. "adcs r4, r4, r7\n\t"
  72400. #elif defined(__clang__)
  72401. "adcs r4, r7\n\t"
  72402. #else
  72403. "adc r4, r7\n\t"
  72404. #endif
  72405. "# Multiply m[j] and mu - Start\n\t"
  72406. "mov r5, r10\n\t"
  72407. "uxth r6, %[mp]\n\t"
  72408. "uxth r5, r5\n\t"
  72409. #ifdef WOLFSSL_KEIL
  72410. "muls r6, r5, r6\n\t"
  72411. #elif defined(__clang__)
  72412. "muls r6, r5\n\t"
  72413. #else
  72414. "mul r6, r5\n\t"
  72415. #endif
  72416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72417. "adds r3, r3, r6\n\t"
  72418. #else
  72419. "add r3, r3, r6\n\t"
  72420. #endif
  72421. #ifdef WOLFSSL_KEIL
  72422. "adcs r4, r4, r7\n\t"
  72423. #elif defined(__clang__)
  72424. "adcs r4, r7\n\t"
  72425. #else
  72426. "adc r4, r7\n\t"
  72427. #endif
  72428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72429. "lsrs r6, %[mp], #16\n\t"
  72430. #else
  72431. "lsr r6, %[mp], #16\n\t"
  72432. #endif
  72433. #ifdef WOLFSSL_KEIL
  72434. "muls r5, r6, r5\n\t"
  72435. #elif defined(__clang__)
  72436. "muls r5, r6\n\t"
  72437. #else
  72438. "mul r5, r6\n\t"
  72439. #endif
  72440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72441. "lsrs r6, r5, #16\n\t"
  72442. #else
  72443. "lsr r6, r5, #16\n\t"
  72444. #endif
  72445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72446. "lsls r5, r5, #16\n\t"
  72447. #else
  72448. "lsl r5, r5, #16\n\t"
  72449. #endif
  72450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72451. "adds r3, r3, r5\n\t"
  72452. #else
  72453. "add r3, r3, r5\n\t"
  72454. #endif
  72455. #ifdef WOLFSSL_KEIL
  72456. "adcs r4, r4, r6\n\t"
  72457. #elif defined(__clang__)
  72458. "adcs r4, r6\n\t"
  72459. #else
  72460. "adc r4, r6\n\t"
  72461. #endif
  72462. "mov r5, r10\n\t"
  72463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72464. "lsrs r6, %[mp], #16\n\t"
  72465. #else
  72466. "lsr r6, %[mp], #16\n\t"
  72467. #endif
  72468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72469. "lsrs r5, r5, #16\n\t"
  72470. #else
  72471. "lsr r5, r5, #16\n\t"
  72472. #endif
  72473. #ifdef WOLFSSL_KEIL
  72474. "muls r6, r5, r6\n\t"
  72475. #elif defined(__clang__)
  72476. "muls r6, r5\n\t"
  72477. #else
  72478. "mul r6, r5\n\t"
  72479. #endif
  72480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72481. "adds r4, r4, r6\n\t"
  72482. #else
  72483. "add r4, r4, r6\n\t"
  72484. #endif
  72485. "uxth r6, %[mp]\n\t"
  72486. #ifdef WOLFSSL_KEIL
  72487. "muls r5, r6, r5\n\t"
  72488. #elif defined(__clang__)
  72489. "muls r5, r6\n\t"
  72490. #else
  72491. "mul r5, r6\n\t"
  72492. #endif
  72493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72494. "lsrs r6, r5, #16\n\t"
  72495. #else
  72496. "lsr r6, r5, #16\n\t"
  72497. #endif
  72498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72499. "lsls r5, r5, #16\n\t"
  72500. #else
  72501. "lsl r5, r5, #16\n\t"
  72502. #endif
  72503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72504. "adds r3, r3, r5\n\t"
  72505. #else
  72506. "add r3, r3, r5\n\t"
  72507. #endif
  72508. #ifdef WOLFSSL_KEIL
  72509. "adcs r4, r4, r6\n\t"
  72510. #elif defined(__clang__)
  72511. "adcs r4, r6\n\t"
  72512. #else
  72513. "adc r4, r6\n\t"
  72514. #endif
  72515. "# Multiply m[j] and mu - Done\n\t"
  72516. "stm %[a]!, {r3}\n\t"
  72517. "cmp %[a], r9\n\t"
  72518. "blt L_sp_3072_mont_reduce_48_word_%=\n\t"
  72519. "# a[i+47] += m[47] * mu\n\t"
  72520. "ldr %[mp], [%[m]]\n\t"
  72521. "mov r3, r12\n\t"
  72522. "# Multiply m[47] and mu - Start\n\t"
  72523. "mov r5, r10\n\t"
  72524. "uxth r6, %[mp]\n\t"
  72525. "uxth r5, r5\n\t"
  72526. #ifdef WOLFSSL_KEIL
  72527. "muls r6, r5, r6\n\t"
  72528. #elif defined(__clang__)
  72529. "muls r6, r5\n\t"
  72530. #else
  72531. "mul r6, r5\n\t"
  72532. #endif
  72533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72534. "adds r4, r4, r6\n\t"
  72535. #else
  72536. "add r4, r4, r6\n\t"
  72537. #endif
  72538. #ifdef WOLFSSL_KEIL
  72539. "adcs r3, r3, r7\n\t"
  72540. #elif defined(__clang__)
  72541. "adcs r3, r7\n\t"
  72542. #else
  72543. "adc r3, r7\n\t"
  72544. #endif
  72545. #ifdef WOLFSSL_KEIL
  72546. "adcs r7, r7, r7\n\t"
  72547. #elif defined(__clang__)
  72548. "adcs r7, r7\n\t"
  72549. #else
  72550. "adc r7, r7\n\t"
  72551. #endif
  72552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72553. "lsrs r6, %[mp], #16\n\t"
  72554. #else
  72555. "lsr r6, %[mp], #16\n\t"
  72556. #endif
  72557. #ifdef WOLFSSL_KEIL
  72558. "muls r5, r6, r5\n\t"
  72559. #elif defined(__clang__)
  72560. "muls r5, r6\n\t"
  72561. #else
  72562. "mul r5, r6\n\t"
  72563. #endif
  72564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72565. "lsrs r6, r5, #16\n\t"
  72566. #else
  72567. "lsr r6, r5, #16\n\t"
  72568. #endif
  72569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72570. "lsls r5, r5, #16\n\t"
  72571. #else
  72572. "lsl r5, r5, #16\n\t"
  72573. #endif
  72574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72575. "adds r4, r4, r5\n\t"
  72576. #else
  72577. "add r4, r4, r5\n\t"
  72578. #endif
  72579. #ifdef WOLFSSL_KEIL
  72580. "adcs r3, r3, r6\n\t"
  72581. #elif defined(__clang__)
  72582. "adcs r3, r6\n\t"
  72583. #else
  72584. "adc r3, r6\n\t"
  72585. #endif
  72586. #ifdef WOLFSSL_KEIL
  72587. "adcs r7, r7, r7\n\t"
  72588. #elif defined(__clang__)
  72589. "adcs r7, r7\n\t"
  72590. #else
  72591. "adc r7, r7\n\t"
  72592. #endif
  72593. "mov r5, r10\n\t"
  72594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72595. "lsrs r6, %[mp], #16\n\t"
  72596. #else
  72597. "lsr r6, %[mp], #16\n\t"
  72598. #endif
  72599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72600. "lsrs r5, r5, #16\n\t"
  72601. #else
  72602. "lsr r5, r5, #16\n\t"
  72603. #endif
  72604. #ifdef WOLFSSL_KEIL
  72605. "muls r6, r5, r6\n\t"
  72606. #elif defined(__clang__)
  72607. "muls r6, r5\n\t"
  72608. #else
  72609. "mul r6, r5\n\t"
  72610. #endif
  72611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72612. "adds r3, r3, r6\n\t"
  72613. #else
  72614. "add r3, r3, r6\n\t"
  72615. #endif
  72616. #ifdef WOLFSSL_KEIL
  72617. "adcs r7, r7, r7\n\t"
  72618. #elif defined(__clang__)
  72619. "adcs r7, r7\n\t"
  72620. #else
  72621. "adc r7, r7\n\t"
  72622. #endif
  72623. "uxth r6, %[mp]\n\t"
  72624. #ifdef WOLFSSL_KEIL
  72625. "muls r5, r6, r5\n\t"
  72626. #elif defined(__clang__)
  72627. "muls r5, r6\n\t"
  72628. #else
  72629. "mul r5, r6\n\t"
  72630. #endif
  72631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72632. "lsrs r6, r5, #16\n\t"
  72633. #else
  72634. "lsr r6, r5, #16\n\t"
  72635. #endif
  72636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72637. "lsls r5, r5, #16\n\t"
  72638. #else
  72639. "lsl r5, r5, #16\n\t"
  72640. #endif
  72641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72642. "adds r4, r4, r5\n\t"
  72643. #else
  72644. "add r4, r4, r5\n\t"
  72645. #endif
  72646. #ifdef WOLFSSL_KEIL
  72647. "adcs r3, r3, r6\n\t"
  72648. #elif defined(__clang__)
  72649. "adcs r3, r6\n\t"
  72650. #else
  72651. "adc r3, r6\n\t"
  72652. #endif
  72653. #ifdef WOLFSSL_KEIL
  72654. "adcs r7, r7, r7\n\t"
  72655. #elif defined(__clang__)
  72656. "adcs r7, r7\n\t"
  72657. #else
  72658. "adc r7, r7\n\t"
  72659. #endif
  72660. "# Multiply m[47] and mu - Done\n\t"
  72661. "ldr r5, [%[a]]\n\t"
  72662. "ldr r6, [%[a], #4]\n\t"
  72663. "movs %[mp], #0\n\t"
  72664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72665. "adds r5, r5, r4\n\t"
  72666. #else
  72667. "add r5, r5, r4\n\t"
  72668. #endif
  72669. #ifdef WOLFSSL_KEIL
  72670. "adcs r6, r6, r3\n\t"
  72671. #elif defined(__clang__)
  72672. "adcs r6, r3\n\t"
  72673. #else
  72674. "adc r6, r3\n\t"
  72675. #endif
  72676. #ifdef WOLFSSL_KEIL
  72677. "adcs r7, r7, %[mp]\n\t"
  72678. #elif defined(__clang__)
  72679. "adcs r7, %[mp]\n\t"
  72680. #else
  72681. "adc r7, %[mp]\n\t"
  72682. #endif
  72683. "stm %[a]!, {r5, r6}\n\t"
  72684. "# i += 1\n\t"
  72685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72686. "subs %[a], %[a], #4\n\t"
  72687. #else
  72688. "sub %[a], %[a], #4\n\t"
  72689. #endif
  72690. "movs r3, #0xbc\n\t"
  72691. "mov r9, %[a]\n\t"
  72692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72693. "subs %[a], %[a], r3\n\t"
  72694. #else
  72695. "sub %[a], %[a], r3\n\t"
  72696. #endif
  72697. "mov r12, r7\n\t"
  72698. "mov %[m], lr\n\t"
  72699. "cmp r11, %[a]\n\t"
  72700. "bgt L_sp_3072_mont_reduce_48_mod_%=\n\t"
  72701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72702. "negs r7, r7\n\t"
  72703. #else
  72704. "neg r7, r7\n\t"
  72705. #endif
  72706. "# Subtract masked modulus\n\t"
  72707. "movs r4, #0xc0\n\t"
  72708. "movs %[mp], #0\n\t"
  72709. "movs r3, #0\n\t"
  72710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72711. "subs %[a], %[a], r4\n\t"
  72712. #else
  72713. "sub %[a], %[a], r4\n\t"
  72714. #endif
  72715. #ifndef WOLFSSL_SP_LARGE_CODE
  72716. "\n"
  72717. "L_sp_3072_mont_reduce_48_sub_mask_%=:\n\t"
  72718. "ldm %[m]!, {r6}\n\t"
  72719. "movs r5, #0\n\t"
  72720. #ifdef WOLFSSL_KEIL
  72721. "ands r6, r6, r7\n\t"
  72722. #elif defined(__clang__)
  72723. "ands r6, r7\n\t"
  72724. #else
  72725. "and r6, r7\n\t"
  72726. #endif
  72727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72728. "subs r5, r5, %[mp]\n\t"
  72729. #else
  72730. "sub r5, r5, %[mp]\n\t"
  72731. #endif
  72732. "ldr r5, [%[a], r4]\n\t"
  72733. #ifdef WOLFSSL_KEIL
  72734. "sbcs r5, r5, r6\n\t"
  72735. #elif defined(__clang__)
  72736. "sbcs r5, r6\n\t"
  72737. #else
  72738. "sbc r5, r6\n\t"
  72739. #endif
  72740. #ifdef WOLFSSL_KEIL
  72741. "sbcs %[mp], %[mp], %[mp]\n\t"
  72742. #elif defined(__clang__)
  72743. "sbcs %[mp], %[mp]\n\t"
  72744. #else
  72745. "sbc %[mp], %[mp]\n\t"
  72746. #endif
  72747. "stm %[a]!, {r5}\n\t"
  72748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72749. "adds r3, r3, #4\n\t"
  72750. #else
  72751. "add r3, r3, #4\n\t"
  72752. #endif
  72753. "cmp r3, r4\n\t"
  72754. "blt L_sp_3072_mont_reduce_48_sub_mask_%=\n\t"
  72755. #else /* WOLFSSL_SP_LARGE_CODE */
  72756. "ldm %[m]!, {r6}\n\t"
  72757. #ifdef WOLFSSL_KEIL
  72758. "ands r6, r6, r7\n\t"
  72759. #elif defined(__clang__)
  72760. "ands r6, r7\n\t"
  72761. #else
  72762. "and r6, r7\n\t"
  72763. #endif
  72764. "ldr r5, [%[a], r4]\n\t"
  72765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72766. "subs r5, r5, r6\n\t"
  72767. #else
  72768. "sub r5, r5, r6\n\t"
  72769. #endif
  72770. "stm %[a]!, {r5}\n\t"
  72771. "ldm %[m]!, {r6}\n\t"
  72772. #ifdef WOLFSSL_KEIL
  72773. "ands r6, r6, r7\n\t"
  72774. #elif defined(__clang__)
  72775. "ands r6, r7\n\t"
  72776. #else
  72777. "and r6, r7\n\t"
  72778. #endif
  72779. "ldr r5, [%[a], r4]\n\t"
  72780. #ifdef WOLFSSL_KEIL
  72781. "sbcs r5, r5, r6\n\t"
  72782. #elif defined(__clang__)
  72783. "sbcs r5, r6\n\t"
  72784. #else
  72785. "sbc r5, r6\n\t"
  72786. #endif
  72787. "stm %[a]!, {r5}\n\t"
  72788. "ldm %[m]!, {r6}\n\t"
  72789. #ifdef WOLFSSL_KEIL
  72790. "ands r6, r6, r7\n\t"
  72791. #elif defined(__clang__)
  72792. "ands r6, r7\n\t"
  72793. #else
  72794. "and r6, r7\n\t"
  72795. #endif
  72796. "ldr r5, [%[a], r4]\n\t"
  72797. #ifdef WOLFSSL_KEIL
  72798. "sbcs r5, r5, r6\n\t"
  72799. #elif defined(__clang__)
  72800. "sbcs r5, r6\n\t"
  72801. #else
  72802. "sbc r5, r6\n\t"
  72803. #endif
  72804. "stm %[a]!, {r5}\n\t"
  72805. "ldm %[m]!, {r6}\n\t"
  72806. #ifdef WOLFSSL_KEIL
  72807. "ands r6, r6, r7\n\t"
  72808. #elif defined(__clang__)
  72809. "ands r6, r7\n\t"
  72810. #else
  72811. "and r6, r7\n\t"
  72812. #endif
  72813. "ldr r5, [%[a], r4]\n\t"
  72814. #ifdef WOLFSSL_KEIL
  72815. "sbcs r5, r5, r6\n\t"
  72816. #elif defined(__clang__)
  72817. "sbcs r5, r6\n\t"
  72818. #else
  72819. "sbc r5, r6\n\t"
  72820. #endif
  72821. "stm %[a]!, {r5}\n\t"
  72822. "ldm %[m]!, {r6}\n\t"
  72823. #ifdef WOLFSSL_KEIL
  72824. "ands r6, r6, r7\n\t"
  72825. #elif defined(__clang__)
  72826. "ands r6, r7\n\t"
  72827. #else
  72828. "and r6, r7\n\t"
  72829. #endif
  72830. "ldr r5, [%[a], r4]\n\t"
  72831. #ifdef WOLFSSL_KEIL
  72832. "sbcs r5, r5, r6\n\t"
  72833. #elif defined(__clang__)
  72834. "sbcs r5, r6\n\t"
  72835. #else
  72836. "sbc r5, r6\n\t"
  72837. #endif
  72838. "stm %[a]!, {r5}\n\t"
  72839. "ldm %[m]!, {r6}\n\t"
  72840. #ifdef WOLFSSL_KEIL
  72841. "ands r6, r6, r7\n\t"
  72842. #elif defined(__clang__)
  72843. "ands r6, r7\n\t"
  72844. #else
  72845. "and r6, r7\n\t"
  72846. #endif
  72847. "ldr r5, [%[a], r4]\n\t"
  72848. #ifdef WOLFSSL_KEIL
  72849. "sbcs r5, r5, r6\n\t"
  72850. #elif defined(__clang__)
  72851. "sbcs r5, r6\n\t"
  72852. #else
  72853. "sbc r5, r6\n\t"
  72854. #endif
  72855. "stm %[a]!, {r5}\n\t"
  72856. "ldm %[m]!, {r6}\n\t"
  72857. #ifdef WOLFSSL_KEIL
  72858. "ands r6, r6, r7\n\t"
  72859. #elif defined(__clang__)
  72860. "ands r6, r7\n\t"
  72861. #else
  72862. "and r6, r7\n\t"
  72863. #endif
  72864. "ldr r5, [%[a], r4]\n\t"
  72865. #ifdef WOLFSSL_KEIL
  72866. "sbcs r5, r5, r6\n\t"
  72867. #elif defined(__clang__)
  72868. "sbcs r5, r6\n\t"
  72869. #else
  72870. "sbc r5, r6\n\t"
  72871. #endif
  72872. "stm %[a]!, {r5}\n\t"
  72873. "ldm %[m]!, {r6}\n\t"
  72874. #ifdef WOLFSSL_KEIL
  72875. "ands r6, r6, r7\n\t"
  72876. #elif defined(__clang__)
  72877. "ands r6, r7\n\t"
  72878. #else
  72879. "and r6, r7\n\t"
  72880. #endif
  72881. "ldr r5, [%[a], r4]\n\t"
  72882. #ifdef WOLFSSL_KEIL
  72883. "sbcs r5, r5, r6\n\t"
  72884. #elif defined(__clang__)
  72885. "sbcs r5, r6\n\t"
  72886. #else
  72887. "sbc r5, r6\n\t"
  72888. #endif
  72889. "stm %[a]!, {r5}\n\t"
  72890. "ldm %[m]!, {r6}\n\t"
  72891. #ifdef WOLFSSL_KEIL
  72892. "ands r6, r6, r7\n\t"
  72893. #elif defined(__clang__)
  72894. "ands r6, r7\n\t"
  72895. #else
  72896. "and r6, r7\n\t"
  72897. #endif
  72898. "ldr r5, [%[a], r4]\n\t"
  72899. #ifdef WOLFSSL_KEIL
  72900. "sbcs r5, r5, r6\n\t"
  72901. #elif defined(__clang__)
  72902. "sbcs r5, r6\n\t"
  72903. #else
  72904. "sbc r5, r6\n\t"
  72905. #endif
  72906. "stm %[a]!, {r5}\n\t"
  72907. "ldm %[m]!, {r6}\n\t"
  72908. #ifdef WOLFSSL_KEIL
  72909. "ands r6, r6, r7\n\t"
  72910. #elif defined(__clang__)
  72911. "ands r6, r7\n\t"
  72912. #else
  72913. "and r6, r7\n\t"
  72914. #endif
  72915. "ldr r5, [%[a], r4]\n\t"
  72916. #ifdef WOLFSSL_KEIL
  72917. "sbcs r5, r5, r6\n\t"
  72918. #elif defined(__clang__)
  72919. "sbcs r5, r6\n\t"
  72920. #else
  72921. "sbc r5, r6\n\t"
  72922. #endif
  72923. "stm %[a]!, {r5}\n\t"
  72924. "ldm %[m]!, {r6}\n\t"
  72925. #ifdef WOLFSSL_KEIL
  72926. "ands r6, r6, r7\n\t"
  72927. #elif defined(__clang__)
  72928. "ands r6, r7\n\t"
  72929. #else
  72930. "and r6, r7\n\t"
  72931. #endif
  72932. "ldr r5, [%[a], r4]\n\t"
  72933. #ifdef WOLFSSL_KEIL
  72934. "sbcs r5, r5, r6\n\t"
  72935. #elif defined(__clang__)
  72936. "sbcs r5, r6\n\t"
  72937. #else
  72938. "sbc r5, r6\n\t"
  72939. #endif
  72940. "stm %[a]!, {r5}\n\t"
  72941. "ldm %[m]!, {r6}\n\t"
  72942. #ifdef WOLFSSL_KEIL
  72943. "ands r6, r6, r7\n\t"
  72944. #elif defined(__clang__)
  72945. "ands r6, r7\n\t"
  72946. #else
  72947. "and r6, r7\n\t"
  72948. #endif
  72949. "ldr r5, [%[a], r4]\n\t"
  72950. #ifdef WOLFSSL_KEIL
  72951. "sbcs r5, r5, r6\n\t"
  72952. #elif defined(__clang__)
  72953. "sbcs r5, r6\n\t"
  72954. #else
  72955. "sbc r5, r6\n\t"
  72956. #endif
  72957. "stm %[a]!, {r5}\n\t"
  72958. "ldm %[m]!, {r6}\n\t"
  72959. #ifdef WOLFSSL_KEIL
  72960. "ands r6, r6, r7\n\t"
  72961. #elif defined(__clang__)
  72962. "ands r6, r7\n\t"
  72963. #else
  72964. "and r6, r7\n\t"
  72965. #endif
  72966. "ldr r5, [%[a], r4]\n\t"
  72967. #ifdef WOLFSSL_KEIL
  72968. "sbcs r5, r5, r6\n\t"
  72969. #elif defined(__clang__)
  72970. "sbcs r5, r6\n\t"
  72971. #else
  72972. "sbc r5, r6\n\t"
  72973. #endif
  72974. "stm %[a]!, {r5}\n\t"
  72975. "ldm %[m]!, {r6}\n\t"
  72976. #ifdef WOLFSSL_KEIL
  72977. "ands r6, r6, r7\n\t"
  72978. #elif defined(__clang__)
  72979. "ands r6, r7\n\t"
  72980. #else
  72981. "and r6, r7\n\t"
  72982. #endif
  72983. "ldr r5, [%[a], r4]\n\t"
  72984. #ifdef WOLFSSL_KEIL
  72985. "sbcs r5, r5, r6\n\t"
  72986. #elif defined(__clang__)
  72987. "sbcs r5, r6\n\t"
  72988. #else
  72989. "sbc r5, r6\n\t"
  72990. #endif
  72991. "stm %[a]!, {r5}\n\t"
  72992. "ldm %[m]!, {r6}\n\t"
  72993. #ifdef WOLFSSL_KEIL
  72994. "ands r6, r6, r7\n\t"
  72995. #elif defined(__clang__)
  72996. "ands r6, r7\n\t"
  72997. #else
  72998. "and r6, r7\n\t"
  72999. #endif
  73000. "ldr r5, [%[a], r4]\n\t"
  73001. #ifdef WOLFSSL_KEIL
  73002. "sbcs r5, r5, r6\n\t"
  73003. #elif defined(__clang__)
  73004. "sbcs r5, r6\n\t"
  73005. #else
  73006. "sbc r5, r6\n\t"
  73007. #endif
  73008. "stm %[a]!, {r5}\n\t"
  73009. "ldm %[m]!, {r6}\n\t"
  73010. #ifdef WOLFSSL_KEIL
  73011. "ands r6, r6, r7\n\t"
  73012. #elif defined(__clang__)
  73013. "ands r6, r7\n\t"
  73014. #else
  73015. "and r6, r7\n\t"
  73016. #endif
  73017. "ldr r5, [%[a], r4]\n\t"
  73018. #ifdef WOLFSSL_KEIL
  73019. "sbcs r5, r5, r6\n\t"
  73020. #elif defined(__clang__)
  73021. "sbcs r5, r6\n\t"
  73022. #else
  73023. "sbc r5, r6\n\t"
  73024. #endif
  73025. "stm %[a]!, {r5}\n\t"
  73026. "ldm %[m]!, {r6}\n\t"
  73027. #ifdef WOLFSSL_KEIL
  73028. "ands r6, r6, r7\n\t"
  73029. #elif defined(__clang__)
  73030. "ands r6, r7\n\t"
  73031. #else
  73032. "and r6, r7\n\t"
  73033. #endif
  73034. "ldr r5, [%[a], r4]\n\t"
  73035. #ifdef WOLFSSL_KEIL
  73036. "sbcs r5, r5, r6\n\t"
  73037. #elif defined(__clang__)
  73038. "sbcs r5, r6\n\t"
  73039. #else
  73040. "sbc r5, r6\n\t"
  73041. #endif
  73042. "stm %[a]!, {r5}\n\t"
  73043. "ldm %[m]!, {r6}\n\t"
  73044. #ifdef WOLFSSL_KEIL
  73045. "ands r6, r6, r7\n\t"
  73046. #elif defined(__clang__)
  73047. "ands r6, r7\n\t"
  73048. #else
  73049. "and r6, r7\n\t"
  73050. #endif
  73051. "ldr r5, [%[a], r4]\n\t"
  73052. #ifdef WOLFSSL_KEIL
  73053. "sbcs r5, r5, r6\n\t"
  73054. #elif defined(__clang__)
  73055. "sbcs r5, r6\n\t"
  73056. #else
  73057. "sbc r5, r6\n\t"
  73058. #endif
  73059. "stm %[a]!, {r5}\n\t"
  73060. "ldm %[m]!, {r6}\n\t"
  73061. #ifdef WOLFSSL_KEIL
  73062. "ands r6, r6, r7\n\t"
  73063. #elif defined(__clang__)
  73064. "ands r6, r7\n\t"
  73065. #else
  73066. "and r6, r7\n\t"
  73067. #endif
  73068. "ldr r5, [%[a], r4]\n\t"
  73069. #ifdef WOLFSSL_KEIL
  73070. "sbcs r5, r5, r6\n\t"
  73071. #elif defined(__clang__)
  73072. "sbcs r5, r6\n\t"
  73073. #else
  73074. "sbc r5, r6\n\t"
  73075. #endif
  73076. "stm %[a]!, {r5}\n\t"
  73077. "ldm %[m]!, {r6}\n\t"
  73078. #ifdef WOLFSSL_KEIL
  73079. "ands r6, r6, r7\n\t"
  73080. #elif defined(__clang__)
  73081. "ands r6, r7\n\t"
  73082. #else
  73083. "and r6, r7\n\t"
  73084. #endif
  73085. "ldr r5, [%[a], r4]\n\t"
  73086. #ifdef WOLFSSL_KEIL
  73087. "sbcs r5, r5, r6\n\t"
  73088. #elif defined(__clang__)
  73089. "sbcs r5, r6\n\t"
  73090. #else
  73091. "sbc r5, r6\n\t"
  73092. #endif
  73093. "stm %[a]!, {r5}\n\t"
  73094. "ldm %[m]!, {r6}\n\t"
  73095. #ifdef WOLFSSL_KEIL
  73096. "ands r6, r6, r7\n\t"
  73097. #elif defined(__clang__)
  73098. "ands r6, r7\n\t"
  73099. #else
  73100. "and r6, r7\n\t"
  73101. #endif
  73102. "ldr r5, [%[a], r4]\n\t"
  73103. #ifdef WOLFSSL_KEIL
  73104. "sbcs r5, r5, r6\n\t"
  73105. #elif defined(__clang__)
  73106. "sbcs r5, r6\n\t"
  73107. #else
  73108. "sbc r5, r6\n\t"
  73109. #endif
  73110. "stm %[a]!, {r5}\n\t"
  73111. "ldm %[m]!, {r6}\n\t"
  73112. #ifdef WOLFSSL_KEIL
  73113. "ands r6, r6, r7\n\t"
  73114. #elif defined(__clang__)
  73115. "ands r6, r7\n\t"
  73116. #else
  73117. "and r6, r7\n\t"
  73118. #endif
  73119. "ldr r5, [%[a], r4]\n\t"
  73120. #ifdef WOLFSSL_KEIL
  73121. "sbcs r5, r5, r6\n\t"
  73122. #elif defined(__clang__)
  73123. "sbcs r5, r6\n\t"
  73124. #else
  73125. "sbc r5, r6\n\t"
  73126. #endif
  73127. "stm %[a]!, {r5}\n\t"
  73128. "ldm %[m]!, {r6}\n\t"
  73129. #ifdef WOLFSSL_KEIL
  73130. "ands r6, r6, r7\n\t"
  73131. #elif defined(__clang__)
  73132. "ands r6, r7\n\t"
  73133. #else
  73134. "and r6, r7\n\t"
  73135. #endif
  73136. "ldr r5, [%[a], r4]\n\t"
  73137. #ifdef WOLFSSL_KEIL
  73138. "sbcs r5, r5, r6\n\t"
  73139. #elif defined(__clang__)
  73140. "sbcs r5, r6\n\t"
  73141. #else
  73142. "sbc r5, r6\n\t"
  73143. #endif
  73144. "stm %[a]!, {r5}\n\t"
  73145. "ldm %[m]!, {r6}\n\t"
  73146. #ifdef WOLFSSL_KEIL
  73147. "ands r6, r6, r7\n\t"
  73148. #elif defined(__clang__)
  73149. "ands r6, r7\n\t"
  73150. #else
  73151. "and r6, r7\n\t"
  73152. #endif
  73153. "ldr r5, [%[a], r4]\n\t"
  73154. #ifdef WOLFSSL_KEIL
  73155. "sbcs r5, r5, r6\n\t"
  73156. #elif defined(__clang__)
  73157. "sbcs r5, r6\n\t"
  73158. #else
  73159. "sbc r5, r6\n\t"
  73160. #endif
  73161. "stm %[a]!, {r5}\n\t"
  73162. "ldm %[m]!, {r6}\n\t"
  73163. #ifdef WOLFSSL_KEIL
  73164. "ands r6, r6, r7\n\t"
  73165. #elif defined(__clang__)
  73166. "ands r6, r7\n\t"
  73167. #else
  73168. "and r6, r7\n\t"
  73169. #endif
  73170. "ldr r5, [%[a], r4]\n\t"
  73171. #ifdef WOLFSSL_KEIL
  73172. "sbcs r5, r5, r6\n\t"
  73173. #elif defined(__clang__)
  73174. "sbcs r5, r6\n\t"
  73175. #else
  73176. "sbc r5, r6\n\t"
  73177. #endif
  73178. "stm %[a]!, {r5}\n\t"
  73179. "ldm %[m]!, {r6}\n\t"
  73180. #ifdef WOLFSSL_KEIL
  73181. "ands r6, r6, r7\n\t"
  73182. #elif defined(__clang__)
  73183. "ands r6, r7\n\t"
  73184. #else
  73185. "and r6, r7\n\t"
  73186. #endif
  73187. "ldr r5, [%[a], r4]\n\t"
  73188. #ifdef WOLFSSL_KEIL
  73189. "sbcs r5, r5, r6\n\t"
  73190. #elif defined(__clang__)
  73191. "sbcs r5, r6\n\t"
  73192. #else
  73193. "sbc r5, r6\n\t"
  73194. #endif
  73195. "stm %[a]!, {r5}\n\t"
  73196. "ldm %[m]!, {r6}\n\t"
  73197. #ifdef WOLFSSL_KEIL
  73198. "ands r6, r6, r7\n\t"
  73199. #elif defined(__clang__)
  73200. "ands r6, r7\n\t"
  73201. #else
  73202. "and r6, r7\n\t"
  73203. #endif
  73204. "ldr r5, [%[a], r4]\n\t"
  73205. #ifdef WOLFSSL_KEIL
  73206. "sbcs r5, r5, r6\n\t"
  73207. #elif defined(__clang__)
  73208. "sbcs r5, r6\n\t"
  73209. #else
  73210. "sbc r5, r6\n\t"
  73211. #endif
  73212. "stm %[a]!, {r5}\n\t"
  73213. "ldm %[m]!, {r6}\n\t"
  73214. #ifdef WOLFSSL_KEIL
  73215. "ands r6, r6, r7\n\t"
  73216. #elif defined(__clang__)
  73217. "ands r6, r7\n\t"
  73218. #else
  73219. "and r6, r7\n\t"
  73220. #endif
  73221. "ldr r5, [%[a], r4]\n\t"
  73222. #ifdef WOLFSSL_KEIL
  73223. "sbcs r5, r5, r6\n\t"
  73224. #elif defined(__clang__)
  73225. "sbcs r5, r6\n\t"
  73226. #else
  73227. "sbc r5, r6\n\t"
  73228. #endif
  73229. "stm %[a]!, {r5}\n\t"
  73230. "ldm %[m]!, {r6}\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. "ldr r5, [%[a], r4]\n\t"
  73239. #ifdef WOLFSSL_KEIL
  73240. "sbcs r5, r5, r6\n\t"
  73241. #elif defined(__clang__)
  73242. "sbcs r5, r6\n\t"
  73243. #else
  73244. "sbc r5, r6\n\t"
  73245. #endif
  73246. "stm %[a]!, {r5}\n\t"
  73247. "ldm %[m]!, {r6}\n\t"
  73248. #ifdef WOLFSSL_KEIL
  73249. "ands r6, r6, r7\n\t"
  73250. #elif defined(__clang__)
  73251. "ands r6, r7\n\t"
  73252. #else
  73253. "and r6, r7\n\t"
  73254. #endif
  73255. "ldr r5, [%[a], r4]\n\t"
  73256. #ifdef WOLFSSL_KEIL
  73257. "sbcs r5, r5, r6\n\t"
  73258. #elif defined(__clang__)
  73259. "sbcs r5, r6\n\t"
  73260. #else
  73261. "sbc r5, r6\n\t"
  73262. #endif
  73263. "stm %[a]!, {r5}\n\t"
  73264. "ldm %[m]!, {r6}\n\t"
  73265. #ifdef WOLFSSL_KEIL
  73266. "ands r6, r6, r7\n\t"
  73267. #elif defined(__clang__)
  73268. "ands r6, r7\n\t"
  73269. #else
  73270. "and r6, r7\n\t"
  73271. #endif
  73272. "ldr r5, [%[a], r4]\n\t"
  73273. #ifdef WOLFSSL_KEIL
  73274. "sbcs r5, r5, r6\n\t"
  73275. #elif defined(__clang__)
  73276. "sbcs r5, r6\n\t"
  73277. #else
  73278. "sbc r5, r6\n\t"
  73279. #endif
  73280. "stm %[a]!, {r5}\n\t"
  73281. "ldm %[m]!, {r6}\n\t"
  73282. #ifdef WOLFSSL_KEIL
  73283. "ands r6, r6, r7\n\t"
  73284. #elif defined(__clang__)
  73285. "ands r6, r7\n\t"
  73286. #else
  73287. "and r6, r7\n\t"
  73288. #endif
  73289. "ldr r5, [%[a], r4]\n\t"
  73290. #ifdef WOLFSSL_KEIL
  73291. "sbcs r5, r5, r6\n\t"
  73292. #elif defined(__clang__)
  73293. "sbcs r5, r6\n\t"
  73294. #else
  73295. "sbc r5, r6\n\t"
  73296. #endif
  73297. "stm %[a]!, {r5}\n\t"
  73298. "ldm %[m]!, {r6}\n\t"
  73299. #ifdef WOLFSSL_KEIL
  73300. "ands r6, r6, r7\n\t"
  73301. #elif defined(__clang__)
  73302. "ands r6, r7\n\t"
  73303. #else
  73304. "and r6, r7\n\t"
  73305. #endif
  73306. "ldr r5, [%[a], r4]\n\t"
  73307. #ifdef WOLFSSL_KEIL
  73308. "sbcs r5, r5, r6\n\t"
  73309. #elif defined(__clang__)
  73310. "sbcs r5, r6\n\t"
  73311. #else
  73312. "sbc r5, r6\n\t"
  73313. #endif
  73314. "stm %[a]!, {r5}\n\t"
  73315. "ldm %[m]!, {r6}\n\t"
  73316. #ifdef WOLFSSL_KEIL
  73317. "ands r6, r6, r7\n\t"
  73318. #elif defined(__clang__)
  73319. "ands r6, r7\n\t"
  73320. #else
  73321. "and r6, r7\n\t"
  73322. #endif
  73323. "ldr r5, [%[a], r4]\n\t"
  73324. #ifdef WOLFSSL_KEIL
  73325. "sbcs r5, r5, r6\n\t"
  73326. #elif defined(__clang__)
  73327. "sbcs r5, r6\n\t"
  73328. #else
  73329. "sbc r5, r6\n\t"
  73330. #endif
  73331. "stm %[a]!, {r5}\n\t"
  73332. "ldm %[m]!, {r6}\n\t"
  73333. #ifdef WOLFSSL_KEIL
  73334. "ands r6, r6, r7\n\t"
  73335. #elif defined(__clang__)
  73336. "ands r6, r7\n\t"
  73337. #else
  73338. "and r6, r7\n\t"
  73339. #endif
  73340. "ldr r5, [%[a], r4]\n\t"
  73341. #ifdef WOLFSSL_KEIL
  73342. "sbcs r5, r5, r6\n\t"
  73343. #elif defined(__clang__)
  73344. "sbcs r5, r6\n\t"
  73345. #else
  73346. "sbc r5, r6\n\t"
  73347. #endif
  73348. "stm %[a]!, {r5}\n\t"
  73349. "ldm %[m]!, {r6}\n\t"
  73350. #ifdef WOLFSSL_KEIL
  73351. "ands r6, r6, r7\n\t"
  73352. #elif defined(__clang__)
  73353. "ands r6, r7\n\t"
  73354. #else
  73355. "and r6, r7\n\t"
  73356. #endif
  73357. "ldr r5, [%[a], r4]\n\t"
  73358. #ifdef WOLFSSL_KEIL
  73359. "sbcs r5, r5, r6\n\t"
  73360. #elif defined(__clang__)
  73361. "sbcs r5, r6\n\t"
  73362. #else
  73363. "sbc r5, r6\n\t"
  73364. #endif
  73365. "stm %[a]!, {r5}\n\t"
  73366. "ldm %[m]!, {r6}\n\t"
  73367. #ifdef WOLFSSL_KEIL
  73368. "ands r6, r6, r7\n\t"
  73369. #elif defined(__clang__)
  73370. "ands r6, r7\n\t"
  73371. #else
  73372. "and r6, r7\n\t"
  73373. #endif
  73374. "ldr r5, [%[a], r4]\n\t"
  73375. #ifdef WOLFSSL_KEIL
  73376. "sbcs r5, r5, r6\n\t"
  73377. #elif defined(__clang__)
  73378. "sbcs r5, r6\n\t"
  73379. #else
  73380. "sbc r5, r6\n\t"
  73381. #endif
  73382. "stm %[a]!, {r5}\n\t"
  73383. "ldm %[m]!, {r6}\n\t"
  73384. #ifdef WOLFSSL_KEIL
  73385. "ands r6, r6, r7\n\t"
  73386. #elif defined(__clang__)
  73387. "ands r6, r7\n\t"
  73388. #else
  73389. "and r6, r7\n\t"
  73390. #endif
  73391. "ldr r5, [%[a], r4]\n\t"
  73392. #ifdef WOLFSSL_KEIL
  73393. "sbcs r5, r5, r6\n\t"
  73394. #elif defined(__clang__)
  73395. "sbcs r5, r6\n\t"
  73396. #else
  73397. "sbc r5, r6\n\t"
  73398. #endif
  73399. "stm %[a]!, {r5}\n\t"
  73400. "ldm %[m]!, {r6}\n\t"
  73401. #ifdef WOLFSSL_KEIL
  73402. "ands r6, r6, r7\n\t"
  73403. #elif defined(__clang__)
  73404. "ands r6, r7\n\t"
  73405. #else
  73406. "and r6, r7\n\t"
  73407. #endif
  73408. "ldr r5, [%[a], r4]\n\t"
  73409. #ifdef WOLFSSL_KEIL
  73410. "sbcs r5, r5, r6\n\t"
  73411. #elif defined(__clang__)
  73412. "sbcs r5, r6\n\t"
  73413. #else
  73414. "sbc r5, r6\n\t"
  73415. #endif
  73416. "stm %[a]!, {r5}\n\t"
  73417. "ldm %[m]!, {r6}\n\t"
  73418. #ifdef WOLFSSL_KEIL
  73419. "ands r6, r6, r7\n\t"
  73420. #elif defined(__clang__)
  73421. "ands r6, r7\n\t"
  73422. #else
  73423. "and r6, r7\n\t"
  73424. #endif
  73425. "ldr r5, [%[a], r4]\n\t"
  73426. #ifdef WOLFSSL_KEIL
  73427. "sbcs r5, r5, r6\n\t"
  73428. #elif defined(__clang__)
  73429. "sbcs r5, r6\n\t"
  73430. #else
  73431. "sbc r5, r6\n\t"
  73432. #endif
  73433. "stm %[a]!, {r5}\n\t"
  73434. "ldm %[m]!, {r6}\n\t"
  73435. #ifdef WOLFSSL_KEIL
  73436. "ands r6, r6, r7\n\t"
  73437. #elif defined(__clang__)
  73438. "ands r6, r7\n\t"
  73439. #else
  73440. "and r6, r7\n\t"
  73441. #endif
  73442. "ldr r5, [%[a], r4]\n\t"
  73443. #ifdef WOLFSSL_KEIL
  73444. "sbcs r5, r5, r6\n\t"
  73445. #elif defined(__clang__)
  73446. "sbcs r5, r6\n\t"
  73447. #else
  73448. "sbc r5, r6\n\t"
  73449. #endif
  73450. "stm %[a]!, {r5}\n\t"
  73451. "ldm %[m]!, {r6}\n\t"
  73452. #ifdef WOLFSSL_KEIL
  73453. "ands r6, r6, r7\n\t"
  73454. #elif defined(__clang__)
  73455. "ands r6, r7\n\t"
  73456. #else
  73457. "and r6, r7\n\t"
  73458. #endif
  73459. "ldr r5, [%[a], r4]\n\t"
  73460. #ifdef WOLFSSL_KEIL
  73461. "sbcs r5, r5, r6\n\t"
  73462. #elif defined(__clang__)
  73463. "sbcs r5, r6\n\t"
  73464. #else
  73465. "sbc r5, r6\n\t"
  73466. #endif
  73467. "stm %[a]!, {r5}\n\t"
  73468. "ldm %[m]!, {r6}\n\t"
  73469. #ifdef WOLFSSL_KEIL
  73470. "ands r6, r6, r7\n\t"
  73471. #elif defined(__clang__)
  73472. "ands r6, r7\n\t"
  73473. #else
  73474. "and r6, r7\n\t"
  73475. #endif
  73476. "ldr r5, [%[a], r4]\n\t"
  73477. #ifdef WOLFSSL_KEIL
  73478. "sbcs r5, r5, r6\n\t"
  73479. #elif defined(__clang__)
  73480. "sbcs r5, r6\n\t"
  73481. #else
  73482. "sbc r5, r6\n\t"
  73483. #endif
  73484. "stm %[a]!, {r5}\n\t"
  73485. "ldm %[m]!, {r6}\n\t"
  73486. #ifdef WOLFSSL_KEIL
  73487. "ands r6, r6, r7\n\t"
  73488. #elif defined(__clang__)
  73489. "ands r6, r7\n\t"
  73490. #else
  73491. "and r6, r7\n\t"
  73492. #endif
  73493. "ldr r5, [%[a], r4]\n\t"
  73494. #ifdef WOLFSSL_KEIL
  73495. "sbcs r5, r5, r6\n\t"
  73496. #elif defined(__clang__)
  73497. "sbcs r5, r6\n\t"
  73498. #else
  73499. "sbc r5, r6\n\t"
  73500. #endif
  73501. "stm %[a]!, {r5}\n\t"
  73502. "ldm %[m]!, {r6}\n\t"
  73503. #ifdef WOLFSSL_KEIL
  73504. "ands r6, r6, r7\n\t"
  73505. #elif defined(__clang__)
  73506. "ands r6, r7\n\t"
  73507. #else
  73508. "and r6, r7\n\t"
  73509. #endif
  73510. "ldr r5, [%[a], r4]\n\t"
  73511. #ifdef WOLFSSL_KEIL
  73512. "sbcs r5, r5, r6\n\t"
  73513. #elif defined(__clang__)
  73514. "sbcs r5, r6\n\t"
  73515. #else
  73516. "sbc r5, r6\n\t"
  73517. #endif
  73518. "stm %[a]!, {r5}\n\t"
  73519. "ldm %[m]!, {r6}\n\t"
  73520. #ifdef WOLFSSL_KEIL
  73521. "ands r6, r6, r7\n\t"
  73522. #elif defined(__clang__)
  73523. "ands r6, r7\n\t"
  73524. #else
  73525. "and r6, r7\n\t"
  73526. #endif
  73527. "ldr r5, [%[a], r4]\n\t"
  73528. #ifdef WOLFSSL_KEIL
  73529. "sbcs r5, r5, r6\n\t"
  73530. #elif defined(__clang__)
  73531. "sbcs r5, r6\n\t"
  73532. #else
  73533. "sbc r5, r6\n\t"
  73534. #endif
  73535. "stm %[a]!, {r5}\n\t"
  73536. "ldm %[m]!, {r6}\n\t"
  73537. #ifdef WOLFSSL_KEIL
  73538. "ands r6, r6, r7\n\t"
  73539. #elif defined(__clang__)
  73540. "ands r6, r7\n\t"
  73541. #else
  73542. "and r6, r7\n\t"
  73543. #endif
  73544. "ldr r5, [%[a], r4]\n\t"
  73545. #ifdef WOLFSSL_KEIL
  73546. "sbcs r5, r5, r6\n\t"
  73547. #elif defined(__clang__)
  73548. "sbcs r5, r6\n\t"
  73549. #else
  73550. "sbc r5, r6\n\t"
  73551. #endif
  73552. "stm %[a]!, {r5}\n\t"
  73553. "ldm %[m]!, {r6}\n\t"
  73554. #ifdef WOLFSSL_KEIL
  73555. "ands r6, r6, r7\n\t"
  73556. #elif defined(__clang__)
  73557. "ands r6, r7\n\t"
  73558. #else
  73559. "and r6, r7\n\t"
  73560. #endif
  73561. "ldr r5, [%[a], r4]\n\t"
  73562. #ifdef WOLFSSL_KEIL
  73563. "sbcs r5, r5, r6\n\t"
  73564. #elif defined(__clang__)
  73565. "sbcs r5, r6\n\t"
  73566. #else
  73567. "sbc r5, r6\n\t"
  73568. #endif
  73569. "stm %[a]!, {r5}\n\t"
  73570. #endif /* WOLFSSL_SP_LARGE_CODE */
  73571. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  73572. :
  73573. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  73574. );
  73575. }
  73576. /* Multiply two Montgomery form numbers mod the modulus (prime).
  73577. * (r = a * b mod m)
  73578. *
  73579. * r Result of multiplication.
  73580. * a First number to multiply in Montgomery form.
  73581. * b Second number to multiply in Montgomery form.
  73582. * m Modulus (prime).
  73583. * mp Montgomery mulitplier.
  73584. */
  73585. static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a,
  73586. const sp_digit* b, const sp_digit* m, sp_digit mp)
  73587. {
  73588. sp_3072_mul_48(r, a, b);
  73589. sp_3072_mont_reduce_48(r, m, mp);
  73590. }
  73591. /* Square the Montgomery form number. (r = a * a mod m)
  73592. *
  73593. * r Result of squaring.
  73594. * a Number to square in Montgomery form.
  73595. * m Modulus (prime).
  73596. * mp Montgomery mulitplier.
  73597. */
  73598. static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a,
  73599. const sp_digit* m, sp_digit mp)
  73600. {
  73601. sp_3072_sqr_48(r, a);
  73602. sp_3072_mont_reduce_48(r, m, mp);
  73603. }
  73604. /* Mul a by digit b into r. (r = a * b)
  73605. *
  73606. * r A single precision integer.
  73607. * a A single precision integer.
  73608. * b A single precision digit.
  73609. */
  73610. SP_NOINLINE static void sp_3072_mul_d_48(sp_digit* r, const sp_digit* a,
  73611. sp_digit b)
  73612. {
  73613. __asm__ __volatile__ (
  73614. "movs r6, #0xc0\n\t"
  73615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73616. "adds r6, r6, %[a]\n\t"
  73617. #else
  73618. "add r6, r6, %[a]\n\t"
  73619. #endif
  73620. "mov r8, %[r]\n\t"
  73621. "mov r9, r6\n\t"
  73622. "movs r3, #0\n\t"
  73623. "movs r4, #0\n\t"
  73624. "\n"
  73625. "L_sp_3072_mul_d_48_%=:\n\t"
  73626. "movs %[r], #0\n\t"
  73627. "movs r5, #0\n\t"
  73628. "# A[] * B\n\t"
  73629. "ldrh r6, [%[a]]\n\t"
  73630. "uxth r7, %[b]\n\t"
  73631. #ifdef WOLFSSL_KEIL
  73632. "muls r7, r6, r7\n\t"
  73633. #elif defined(__clang__)
  73634. "muls r7, r6\n\t"
  73635. #else
  73636. "mul r7, r6\n\t"
  73637. #endif
  73638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73639. "adds r3, r3, r7\n\t"
  73640. #else
  73641. "add r3, r3, r7\n\t"
  73642. #endif
  73643. #ifdef WOLFSSL_KEIL
  73644. "adcs r4, r4, %[r]\n\t"
  73645. #elif defined(__clang__)
  73646. "adcs r4, %[r]\n\t"
  73647. #else
  73648. "adc r4, %[r]\n\t"
  73649. #endif
  73650. #ifdef WOLFSSL_KEIL
  73651. "adcs r5, r5, %[r]\n\t"
  73652. #elif defined(__clang__)
  73653. "adcs r5, %[r]\n\t"
  73654. #else
  73655. "adc r5, %[r]\n\t"
  73656. #endif
  73657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73658. "lsrs r7, %[b], #16\n\t"
  73659. #else
  73660. "lsr r7, %[b], #16\n\t"
  73661. #endif
  73662. #ifdef WOLFSSL_KEIL
  73663. "muls r6, r7, r6\n\t"
  73664. #elif defined(__clang__)
  73665. "muls r6, r7\n\t"
  73666. #else
  73667. "mul r6, r7\n\t"
  73668. #endif
  73669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73670. "lsrs r7, r6, #16\n\t"
  73671. #else
  73672. "lsr r7, r6, #16\n\t"
  73673. #endif
  73674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73675. "lsls r6, r6, #16\n\t"
  73676. #else
  73677. "lsl r6, r6, #16\n\t"
  73678. #endif
  73679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73680. "adds r3, r3, r6\n\t"
  73681. #else
  73682. "add r3, r3, r6\n\t"
  73683. #endif
  73684. #ifdef WOLFSSL_KEIL
  73685. "adcs r4, r4, r7\n\t"
  73686. #elif defined(__clang__)
  73687. "adcs r4, r7\n\t"
  73688. #else
  73689. "adc r4, r7\n\t"
  73690. #endif
  73691. #ifdef WOLFSSL_KEIL
  73692. "adcs r5, r5, %[r]\n\t"
  73693. #elif defined(__clang__)
  73694. "adcs r5, %[r]\n\t"
  73695. #else
  73696. "adc r5, %[r]\n\t"
  73697. #endif
  73698. "ldr r6, [%[a]]\n\t"
  73699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73700. "lsrs r6, r6, #16\n\t"
  73701. #else
  73702. "lsr r6, r6, #16\n\t"
  73703. #endif
  73704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73705. "lsrs r7, %[b], #16\n\t"
  73706. #else
  73707. "lsr r7, %[b], #16\n\t"
  73708. #endif
  73709. #ifdef WOLFSSL_KEIL
  73710. "muls r7, r6, r7\n\t"
  73711. #elif defined(__clang__)
  73712. "muls r7, r6\n\t"
  73713. #else
  73714. "mul r7, r6\n\t"
  73715. #endif
  73716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73717. "adds r4, r4, r7\n\t"
  73718. #else
  73719. "add r4, r4, r7\n\t"
  73720. #endif
  73721. #ifdef WOLFSSL_KEIL
  73722. "adcs r5, r5, %[r]\n\t"
  73723. #elif defined(__clang__)
  73724. "adcs r5, %[r]\n\t"
  73725. #else
  73726. "adc r5, %[r]\n\t"
  73727. #endif
  73728. "uxth r7, %[b]\n\t"
  73729. #ifdef WOLFSSL_KEIL
  73730. "muls r6, r7, r6\n\t"
  73731. #elif defined(__clang__)
  73732. "muls r6, r7\n\t"
  73733. #else
  73734. "mul r6, r7\n\t"
  73735. #endif
  73736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73737. "lsrs r7, r6, #16\n\t"
  73738. #else
  73739. "lsr r7, r6, #16\n\t"
  73740. #endif
  73741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73742. "lsls r6, r6, #16\n\t"
  73743. #else
  73744. "lsl r6, r6, #16\n\t"
  73745. #endif
  73746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73747. "adds r3, r3, r6\n\t"
  73748. #else
  73749. "add r3, r3, r6\n\t"
  73750. #endif
  73751. #ifdef WOLFSSL_KEIL
  73752. "adcs r4, r4, r7\n\t"
  73753. #elif defined(__clang__)
  73754. "adcs r4, r7\n\t"
  73755. #else
  73756. "adc r4, r7\n\t"
  73757. #endif
  73758. #ifdef WOLFSSL_KEIL
  73759. "adcs r5, r5, %[r]\n\t"
  73760. #elif defined(__clang__)
  73761. "adcs r5, %[r]\n\t"
  73762. #else
  73763. "adc r5, %[r]\n\t"
  73764. #endif
  73765. "# A[] * B - Done\n\t"
  73766. "mov %[r], r8\n\t"
  73767. "str r3, [%[r]]\n\t"
  73768. "movs r3, r4\n\t"
  73769. "movs r4, r5\n\t"
  73770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73771. "adds %[r], %[r], #4\n\t"
  73772. #else
  73773. "add %[r], %[r], #4\n\t"
  73774. #endif
  73775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73776. "adds %[a], %[a], #4\n\t"
  73777. #else
  73778. "add %[a], %[a], #4\n\t"
  73779. #endif
  73780. "mov r8, %[r]\n\t"
  73781. "cmp %[a], r9\n\t"
  73782. "blt L_sp_3072_mul_d_48_%=\n\t"
  73783. "str r3, [%[r]]\n\t"
  73784. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  73785. :
  73786. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  73787. );
  73788. }
  73789. /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
  73790. *
  73791. * d1 The high order half of the number to divide.
  73792. * d0 The low order half of the number to divide.
  73793. * div The dividend.
  73794. * returns the result of the division.
  73795. *
  73796. * Note that this is an approximate div. It may give an answer 1 larger.
  73797. */
  73798. SP_NOINLINE static sp_digit div_3072_word_48(sp_digit d1, sp_digit d0,
  73799. sp_digit div)
  73800. {
  73801. __asm__ __volatile__ (
  73802. "movs r3, #0\n\t"
  73803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73804. "lsrs r5, %[div], #1\n\t"
  73805. #else
  73806. "lsr r5, %[div], #1\n\t"
  73807. #endif
  73808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73809. "adds r5, r5, #1\n\t"
  73810. #else
  73811. "add r5, r5, #1\n\t"
  73812. #endif
  73813. "mov r8, %[d0]\n\t"
  73814. "mov r9, %[d1]\n\t"
  73815. "# Do top 32\n\t"
  73816. "movs r6, r5\n\t"
  73817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73818. "subs r6, r6, %[d1]\n\t"
  73819. #else
  73820. "sub r6, r6, %[d1]\n\t"
  73821. #endif
  73822. #ifdef WOLFSSL_KEIL
  73823. "sbcs r6, r6, r6\n\t"
  73824. #elif defined(__clang__)
  73825. "sbcs r6, r6\n\t"
  73826. #else
  73827. "sbc r6, r6\n\t"
  73828. #endif
  73829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73830. "adds r3, r3, r3\n\t"
  73831. #else
  73832. "add r3, r3, r3\n\t"
  73833. #endif
  73834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73835. "subs r3, r3, r6\n\t"
  73836. #else
  73837. "sub r3, r3, r6\n\t"
  73838. #endif
  73839. #ifdef WOLFSSL_KEIL
  73840. "ands r6, r6, r5\n\t"
  73841. #elif defined(__clang__)
  73842. "ands r6, r5\n\t"
  73843. #else
  73844. "and r6, r5\n\t"
  73845. #endif
  73846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73847. "subs %[d1], %[d1], r6\n\t"
  73848. #else
  73849. "sub %[d1], %[d1], r6\n\t"
  73850. #endif
  73851. "movs r4, #29\n\t"
  73852. "\n"
  73853. "L_div_3072_word_48_loop_%=:\n\t"
  73854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73855. "lsls %[d0], %[d0], #1\n\t"
  73856. #else
  73857. "lsl %[d0], %[d0], #1\n\t"
  73858. #endif
  73859. #ifdef WOLFSSL_KEIL
  73860. "adcs %[d1], %[d1], %[d1]\n\t"
  73861. #elif defined(__clang__)
  73862. "adcs %[d1], %[d1]\n\t"
  73863. #else
  73864. "adc %[d1], %[d1]\n\t"
  73865. #endif
  73866. "movs r6, r5\n\t"
  73867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73868. "subs r6, r6, %[d1]\n\t"
  73869. #else
  73870. "sub r6, r6, %[d1]\n\t"
  73871. #endif
  73872. #ifdef WOLFSSL_KEIL
  73873. "sbcs r6, r6, r6\n\t"
  73874. #elif defined(__clang__)
  73875. "sbcs r6, r6\n\t"
  73876. #else
  73877. "sbc r6, r6\n\t"
  73878. #endif
  73879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73880. "adds r3, r3, r3\n\t"
  73881. #else
  73882. "add r3, r3, r3\n\t"
  73883. #endif
  73884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73885. "subs r3, r3, r6\n\t"
  73886. #else
  73887. "sub r3, r3, r6\n\t"
  73888. #endif
  73889. #ifdef WOLFSSL_KEIL
  73890. "ands r6, r6, r5\n\t"
  73891. #elif defined(__clang__)
  73892. "ands r6, r5\n\t"
  73893. #else
  73894. "and r6, r5\n\t"
  73895. #endif
  73896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73897. "subs %[d1], %[d1], r6\n\t"
  73898. #else
  73899. "sub %[d1], %[d1], r6\n\t"
  73900. #endif
  73901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73902. "subs r4, r4, #1\n\t"
  73903. #else
  73904. "sub r4, r4, #1\n\t"
  73905. #endif
  73906. "bpl L_div_3072_word_48_loop_%=\n\t"
  73907. "movs r7, #0\n\t"
  73908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73909. "adds r3, r3, r3\n\t"
  73910. #else
  73911. "add r3, r3, r3\n\t"
  73912. #endif
  73913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73914. "adds r3, r3, #1\n\t"
  73915. #else
  73916. "add r3, r3, #1\n\t"
  73917. #endif
  73918. "# r * div - Start\n\t"
  73919. "uxth %[d1], r3\n\t"
  73920. "uxth r4, %[div]\n\t"
  73921. #ifdef WOLFSSL_KEIL
  73922. "muls r4, %[d1], r4\n\t"
  73923. #elif defined(__clang__)
  73924. "muls r4, %[d1]\n\t"
  73925. #else
  73926. "mul r4, %[d1]\n\t"
  73927. #endif
  73928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73929. "lsrs r6, %[div], #16\n\t"
  73930. #else
  73931. "lsr r6, %[div], #16\n\t"
  73932. #endif
  73933. #ifdef WOLFSSL_KEIL
  73934. "muls %[d1], r6, %[d1]\n\t"
  73935. #elif defined(__clang__)
  73936. "muls %[d1], r6\n\t"
  73937. #else
  73938. "mul %[d1], r6\n\t"
  73939. #endif
  73940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73941. "lsrs r5, %[d1], #16\n\t"
  73942. #else
  73943. "lsr r5, %[d1], #16\n\t"
  73944. #endif
  73945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73946. "lsls %[d1], %[d1], #16\n\t"
  73947. #else
  73948. "lsl %[d1], %[d1], #16\n\t"
  73949. #endif
  73950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73951. "adds r4, r4, %[d1]\n\t"
  73952. #else
  73953. "add r4, r4, %[d1]\n\t"
  73954. #endif
  73955. #ifdef WOLFSSL_KEIL
  73956. "adcs r5, r5, r7\n\t"
  73957. #elif defined(__clang__)
  73958. "adcs r5, r7\n\t"
  73959. #else
  73960. "adc r5, r7\n\t"
  73961. #endif
  73962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73963. "lsrs %[d1], r3, #16\n\t"
  73964. #else
  73965. "lsr %[d1], r3, #16\n\t"
  73966. #endif
  73967. #ifdef WOLFSSL_KEIL
  73968. "muls r6, %[d1], r6\n\t"
  73969. #elif defined(__clang__)
  73970. "muls r6, %[d1]\n\t"
  73971. #else
  73972. "mul r6, %[d1]\n\t"
  73973. #endif
  73974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73975. "adds r5, r5, r6\n\t"
  73976. #else
  73977. "add r5, r5, r6\n\t"
  73978. #endif
  73979. "uxth r6, %[div]\n\t"
  73980. #ifdef WOLFSSL_KEIL
  73981. "muls %[d1], r6, %[d1]\n\t"
  73982. #elif defined(__clang__)
  73983. "muls %[d1], r6\n\t"
  73984. #else
  73985. "mul %[d1], r6\n\t"
  73986. #endif
  73987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73988. "lsrs r6, %[d1], #16\n\t"
  73989. #else
  73990. "lsr r6, %[d1], #16\n\t"
  73991. #endif
  73992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73993. "lsls %[d1], %[d1], #16\n\t"
  73994. #else
  73995. "lsl %[d1], %[d1], #16\n\t"
  73996. #endif
  73997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73998. "adds r4, r4, %[d1]\n\t"
  73999. #else
  74000. "add r4, r4, %[d1]\n\t"
  74001. #endif
  74002. #ifdef WOLFSSL_KEIL
  74003. "adcs r5, r5, r6\n\t"
  74004. #elif defined(__clang__)
  74005. "adcs r5, r6\n\t"
  74006. #else
  74007. "adc r5, r6\n\t"
  74008. #endif
  74009. "# r * div - Done\n\t"
  74010. "mov %[d1], r8\n\t"
  74011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74012. "subs %[d1], %[d1], r4\n\t"
  74013. #else
  74014. "sub %[d1], %[d1], r4\n\t"
  74015. #endif
  74016. "movs r4, %[d1]\n\t"
  74017. "mov %[d1], r9\n\t"
  74018. #ifdef WOLFSSL_KEIL
  74019. "sbcs %[d1], %[d1], r5\n\t"
  74020. #elif defined(__clang__)
  74021. "sbcs %[d1], r5\n\t"
  74022. #else
  74023. "sbc %[d1], r5\n\t"
  74024. #endif
  74025. "movs r5, %[d1]\n\t"
  74026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74027. "adds r3, r3, r5\n\t"
  74028. #else
  74029. "add r3, r3, r5\n\t"
  74030. #endif
  74031. "# r * div - Start\n\t"
  74032. "uxth %[d1], r3\n\t"
  74033. "uxth r4, %[div]\n\t"
  74034. #ifdef WOLFSSL_KEIL
  74035. "muls r4, %[d1], r4\n\t"
  74036. #elif defined(__clang__)
  74037. "muls r4, %[d1]\n\t"
  74038. #else
  74039. "mul r4, %[d1]\n\t"
  74040. #endif
  74041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74042. "lsrs r6, %[div], #16\n\t"
  74043. #else
  74044. "lsr r6, %[div], #16\n\t"
  74045. #endif
  74046. #ifdef WOLFSSL_KEIL
  74047. "muls %[d1], r6, %[d1]\n\t"
  74048. #elif defined(__clang__)
  74049. "muls %[d1], r6\n\t"
  74050. #else
  74051. "mul %[d1], r6\n\t"
  74052. #endif
  74053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74054. "lsrs r5, %[d1], #16\n\t"
  74055. #else
  74056. "lsr r5, %[d1], #16\n\t"
  74057. #endif
  74058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74059. "lsls %[d1], %[d1], #16\n\t"
  74060. #else
  74061. "lsl %[d1], %[d1], #16\n\t"
  74062. #endif
  74063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74064. "adds r4, r4, %[d1]\n\t"
  74065. #else
  74066. "add r4, r4, %[d1]\n\t"
  74067. #endif
  74068. #ifdef WOLFSSL_KEIL
  74069. "adcs r5, r5, r7\n\t"
  74070. #elif defined(__clang__)
  74071. "adcs r5, r7\n\t"
  74072. #else
  74073. "adc r5, r7\n\t"
  74074. #endif
  74075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74076. "lsrs %[d1], r3, #16\n\t"
  74077. #else
  74078. "lsr %[d1], r3, #16\n\t"
  74079. #endif
  74080. #ifdef WOLFSSL_KEIL
  74081. "muls r6, %[d1], r6\n\t"
  74082. #elif defined(__clang__)
  74083. "muls r6, %[d1]\n\t"
  74084. #else
  74085. "mul r6, %[d1]\n\t"
  74086. #endif
  74087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74088. "adds r5, r5, r6\n\t"
  74089. #else
  74090. "add r5, r5, r6\n\t"
  74091. #endif
  74092. "uxth r6, %[div]\n\t"
  74093. #ifdef WOLFSSL_KEIL
  74094. "muls %[d1], r6, %[d1]\n\t"
  74095. #elif defined(__clang__)
  74096. "muls %[d1], r6\n\t"
  74097. #else
  74098. "mul %[d1], r6\n\t"
  74099. #endif
  74100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74101. "lsrs r6, %[d1], #16\n\t"
  74102. #else
  74103. "lsr r6, %[d1], #16\n\t"
  74104. #endif
  74105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74106. "lsls %[d1], %[d1], #16\n\t"
  74107. #else
  74108. "lsl %[d1], %[d1], #16\n\t"
  74109. #endif
  74110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74111. "adds r4, r4, %[d1]\n\t"
  74112. #else
  74113. "add r4, r4, %[d1]\n\t"
  74114. #endif
  74115. #ifdef WOLFSSL_KEIL
  74116. "adcs r5, r5, r6\n\t"
  74117. #elif defined(__clang__)
  74118. "adcs r5, r6\n\t"
  74119. #else
  74120. "adc r5, r6\n\t"
  74121. #endif
  74122. "# r * div - Done\n\t"
  74123. "mov %[d1], r8\n\t"
  74124. "mov r6, r9\n\t"
  74125. #ifdef WOLFSSL_KEIL
  74126. "subs r4, %[d1], r4\n\t"
  74127. #else
  74128. #ifdef __clang__
  74129. "subs r4, %[d1], r4\n\t"
  74130. #else
  74131. "sub r4, %[d1], r4\n\t"
  74132. #endif
  74133. #endif
  74134. #ifdef WOLFSSL_KEIL
  74135. "sbcs r6, r6, r5\n\t"
  74136. #elif defined(__clang__)
  74137. "sbcs r6, r5\n\t"
  74138. #else
  74139. "sbc r6, r5\n\t"
  74140. #endif
  74141. "movs r5, r6\n\t"
  74142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74143. "adds r3, r3, r5\n\t"
  74144. #else
  74145. "add r3, r3, r5\n\t"
  74146. #endif
  74147. "# r * div - Start\n\t"
  74148. "uxth %[d1], r3\n\t"
  74149. "uxth r4, %[div]\n\t"
  74150. #ifdef WOLFSSL_KEIL
  74151. "muls r4, %[d1], r4\n\t"
  74152. #elif defined(__clang__)
  74153. "muls r4, %[d1]\n\t"
  74154. #else
  74155. "mul r4, %[d1]\n\t"
  74156. #endif
  74157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74158. "lsrs r6, %[div], #16\n\t"
  74159. #else
  74160. "lsr r6, %[div], #16\n\t"
  74161. #endif
  74162. #ifdef WOLFSSL_KEIL
  74163. "muls %[d1], r6, %[d1]\n\t"
  74164. #elif defined(__clang__)
  74165. "muls %[d1], r6\n\t"
  74166. #else
  74167. "mul %[d1], r6\n\t"
  74168. #endif
  74169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74170. "lsrs r5, %[d1], #16\n\t"
  74171. #else
  74172. "lsr r5, %[d1], #16\n\t"
  74173. #endif
  74174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74175. "lsls %[d1], %[d1], #16\n\t"
  74176. #else
  74177. "lsl %[d1], %[d1], #16\n\t"
  74178. #endif
  74179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74180. "adds r4, r4, %[d1]\n\t"
  74181. #else
  74182. "add r4, r4, %[d1]\n\t"
  74183. #endif
  74184. #ifdef WOLFSSL_KEIL
  74185. "adcs r5, r5, r7\n\t"
  74186. #elif defined(__clang__)
  74187. "adcs r5, r7\n\t"
  74188. #else
  74189. "adc r5, r7\n\t"
  74190. #endif
  74191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74192. "lsrs %[d1], r3, #16\n\t"
  74193. #else
  74194. "lsr %[d1], r3, #16\n\t"
  74195. #endif
  74196. #ifdef WOLFSSL_KEIL
  74197. "muls r6, %[d1], r6\n\t"
  74198. #elif defined(__clang__)
  74199. "muls r6, %[d1]\n\t"
  74200. #else
  74201. "mul r6, %[d1]\n\t"
  74202. #endif
  74203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74204. "adds r5, r5, r6\n\t"
  74205. #else
  74206. "add r5, r5, r6\n\t"
  74207. #endif
  74208. "uxth r6, %[div]\n\t"
  74209. #ifdef WOLFSSL_KEIL
  74210. "muls %[d1], r6, %[d1]\n\t"
  74211. #elif defined(__clang__)
  74212. "muls %[d1], r6\n\t"
  74213. #else
  74214. "mul %[d1], r6\n\t"
  74215. #endif
  74216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74217. "lsrs r6, %[d1], #16\n\t"
  74218. #else
  74219. "lsr r6, %[d1], #16\n\t"
  74220. #endif
  74221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74222. "lsls %[d1], %[d1], #16\n\t"
  74223. #else
  74224. "lsl %[d1], %[d1], #16\n\t"
  74225. #endif
  74226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74227. "adds r4, r4, %[d1]\n\t"
  74228. #else
  74229. "add r4, r4, %[d1]\n\t"
  74230. #endif
  74231. #ifdef WOLFSSL_KEIL
  74232. "adcs r5, r5, r6\n\t"
  74233. #elif defined(__clang__)
  74234. "adcs r5, r6\n\t"
  74235. #else
  74236. "adc r5, r6\n\t"
  74237. #endif
  74238. "# r * div - Done\n\t"
  74239. "mov %[d1], r8\n\t"
  74240. "mov r6, r9\n\t"
  74241. #ifdef WOLFSSL_KEIL
  74242. "subs r4, %[d1], r4\n\t"
  74243. #else
  74244. #ifdef __clang__
  74245. "subs r4, %[d1], r4\n\t"
  74246. #else
  74247. "sub r4, %[d1], r4\n\t"
  74248. #endif
  74249. #endif
  74250. #ifdef WOLFSSL_KEIL
  74251. "sbcs r6, r6, r5\n\t"
  74252. #elif defined(__clang__)
  74253. "sbcs r6, r5\n\t"
  74254. #else
  74255. "sbc r6, r5\n\t"
  74256. #endif
  74257. "movs r5, r6\n\t"
  74258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74259. "adds r3, r3, r5\n\t"
  74260. #else
  74261. "add r3, r3, r5\n\t"
  74262. #endif
  74263. "movs r6, %[div]\n\t"
  74264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74265. "subs r6, r6, r4\n\t"
  74266. #else
  74267. "sub r6, r6, r4\n\t"
  74268. #endif
  74269. #ifdef WOLFSSL_KEIL
  74270. "sbcs r6, r6, r6\n\t"
  74271. #elif defined(__clang__)
  74272. "sbcs r6, r6\n\t"
  74273. #else
  74274. "sbc r6, r6\n\t"
  74275. #endif
  74276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74277. "subs r3, r3, r6\n\t"
  74278. #else
  74279. "sub r3, r3, r6\n\t"
  74280. #endif
  74281. "movs %[d1], r3\n\t"
  74282. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  74283. :
  74284. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  74285. );
  74286. return (uint32_t)(size_t)d1;
  74287. }
  74288. /* Compare a with b in constant time.
  74289. *
  74290. * a A single precision integer.
  74291. * b A single precision integer.
  74292. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  74293. * respectively.
  74294. */
  74295. SP_NOINLINE static sp_int32 sp_3072_cmp_48(const sp_digit* a, const sp_digit* b)
  74296. {
  74297. __asm__ __volatile__ (
  74298. "movs r2, #0\n\t"
  74299. "movs r3, #0\n\t"
  74300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74301. "mvns r3, r3\n\t"
  74302. #else
  74303. "mvn r3, r3\n\t"
  74304. #endif
  74305. "movs r6, #0xbc\n\t"
  74306. "\n"
  74307. "L_sp_3072_cmp_48_words_%=:\n\t"
  74308. "ldr r7, [%[a], r6]\n\t"
  74309. "ldr r5, [%[b], r6]\n\t"
  74310. #ifdef WOLFSSL_KEIL
  74311. "ands r7, r7, r3\n\t"
  74312. #elif defined(__clang__)
  74313. "ands r7, r3\n\t"
  74314. #else
  74315. "and r7, r3\n\t"
  74316. #endif
  74317. #ifdef WOLFSSL_KEIL
  74318. "ands r5, r5, r3\n\t"
  74319. #elif defined(__clang__)
  74320. "ands r5, r3\n\t"
  74321. #else
  74322. "and r5, r3\n\t"
  74323. #endif
  74324. "movs r4, r7\n\t"
  74325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74326. "subs r7, r7, r5\n\t"
  74327. #else
  74328. "sub r7, r7, r5\n\t"
  74329. #endif
  74330. #ifdef WOLFSSL_KEIL
  74331. "sbcs r7, r7, r7\n\t"
  74332. #elif defined(__clang__)
  74333. "sbcs r7, r7\n\t"
  74334. #else
  74335. "sbc r7, r7\n\t"
  74336. #endif
  74337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74338. "adds r2, r2, r7\n\t"
  74339. #else
  74340. "add r2, r2, r7\n\t"
  74341. #endif
  74342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74343. "mvns r7, r7\n\t"
  74344. #else
  74345. "mvn r7, r7\n\t"
  74346. #endif
  74347. #ifdef WOLFSSL_KEIL
  74348. "ands r3, r3, r7\n\t"
  74349. #elif defined(__clang__)
  74350. "ands r3, r7\n\t"
  74351. #else
  74352. "and r3, r7\n\t"
  74353. #endif
  74354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74355. "subs r5, r5, r4\n\t"
  74356. #else
  74357. "sub r5, r5, r4\n\t"
  74358. #endif
  74359. #ifdef WOLFSSL_KEIL
  74360. "sbcs r7, r7, r7\n\t"
  74361. #elif defined(__clang__)
  74362. "sbcs r7, r7\n\t"
  74363. #else
  74364. "sbc r7, r7\n\t"
  74365. #endif
  74366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74367. "subs r2, r2, r7\n\t"
  74368. #else
  74369. "sub r2, r2, r7\n\t"
  74370. #endif
  74371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74372. "mvns r7, r7\n\t"
  74373. #else
  74374. "mvn r7, r7\n\t"
  74375. #endif
  74376. #ifdef WOLFSSL_KEIL
  74377. "ands r3, r3, r7\n\t"
  74378. #elif defined(__clang__)
  74379. "ands r3, r7\n\t"
  74380. #else
  74381. "and r3, r7\n\t"
  74382. #endif
  74383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74384. "subs r6, r6, #4\n\t"
  74385. #else
  74386. "sub r6, r6, #4\n\t"
  74387. #endif
  74388. "cmp r6, #0\n\t"
  74389. "bge L_sp_3072_cmp_48_words_%=\n\t"
  74390. "movs %[a], r2\n\t"
  74391. : [a] "+r" (a), [b] "+r" (b)
  74392. :
  74393. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  74394. );
  74395. return (uint32_t)(size_t)a;
  74396. }
  74397. /* Divide d in a and put remainder into r (m*d + r = a)
  74398. * m is not calculated as it is not needed at this time.
  74399. *
  74400. * a Number to be divided.
  74401. * d Number to divide with.
  74402. * m Multiplier result.
  74403. * r Remainder from the division.
  74404. * returns MP_OKAY indicating success.
  74405. */
  74406. static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, sp_digit* m,
  74407. sp_digit* r)
  74408. {
  74409. sp_digit t1[96], t2[49];
  74410. sp_digit div, r1;
  74411. int i;
  74412. (void)m;
  74413. div = d[47];
  74414. XMEMCPY(t1, a, sizeof(*t1) * 2 * 48);
  74415. for (i=47; i>=0; i--) {
  74416. sp_digit hi = t1[48 + i] - (t1[48 + i] == div);
  74417. r1 = div_3072_word_48(hi, t1[48 + i - 1], div);
  74418. sp_3072_mul_d_48(t2, d, r1);
  74419. t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2);
  74420. t1[48 + i] -= t2[48];
  74421. sp_3072_mask_48(t2, d, t1[48 + i]);
  74422. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  74423. sp_3072_mask_48(t2, d, t1[48 + i]);
  74424. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  74425. }
  74426. r1 = sp_3072_cmp_48(t1, d) >= 0;
  74427. sp_3072_cond_sub_48(r, t1, d, (sp_digit)0 - r1);
  74428. return MP_OKAY;
  74429. }
  74430. /* Reduce a modulo m into r. (r = a mod m)
  74431. *
  74432. * r A single precision number that is the reduced result.
  74433. * a A single precision number that is to be reduced.
  74434. * m A single precision number that is the modulus to reduce with.
  74435. * returns MP_OKAY indicating success.
  74436. */
  74437. static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a, const sp_digit* m)
  74438. {
  74439. return sp_3072_div_48(a, m, NULL, r);
  74440. }
  74441. #ifdef WOLFSSL_SP_SMALL
  74442. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  74443. *
  74444. * r A single precision number that is the result of the operation.
  74445. * a A single precision number being exponentiated.
  74446. * e A single precision number that is the exponent.
  74447. * bits The number of bits in the exponent.
  74448. * m A single precision number that is the modulus.
  74449. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  74450. */
  74451. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  74452. int bits, const sp_digit* m, int reduceA)
  74453. {
  74454. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74455. sp_digit* td = NULL;
  74456. #else
  74457. sp_digit td[16 * 96];
  74458. #endif
  74459. sp_digit* t[16];
  74460. sp_digit* norm = NULL;
  74461. sp_digit mp = 1;
  74462. sp_digit n;
  74463. sp_digit mask;
  74464. int i;
  74465. int c;
  74466. byte y;
  74467. int err = MP_OKAY;
  74468. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74469. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL,
  74470. DYNAMIC_TYPE_TMP_BUFFER);
  74471. if (td == NULL)
  74472. err = MEMORY_E;
  74473. #endif
  74474. if (err == MP_OKAY) {
  74475. norm = td;
  74476. for (i=0; i<16; i++) {
  74477. t[i] = td + i * 96;
  74478. }
  74479. sp_3072_mont_setup(m, &mp);
  74480. sp_3072_mont_norm_48(norm, m);
  74481. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  74482. if (reduceA != 0) {
  74483. err = sp_3072_mod_48(t[1] + 48, a, m);
  74484. if (err == MP_OKAY) {
  74485. err = sp_3072_mod_48(t[1], t[1], m);
  74486. }
  74487. }
  74488. else {
  74489. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  74490. err = sp_3072_mod_48(t[1], t[1], m);
  74491. }
  74492. }
  74493. if (err == MP_OKAY) {
  74494. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  74495. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  74496. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  74497. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  74498. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  74499. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  74500. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  74501. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  74502. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  74503. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  74504. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  74505. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  74506. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  74507. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  74508. i = (bits - 1) / 32;
  74509. n = e[i--];
  74510. c = bits & 31;
  74511. if (c == 0) {
  74512. c = 32;
  74513. }
  74514. c -= bits % 4;
  74515. if (c == 32) {
  74516. c = 28;
  74517. }
  74518. if (c < 0) {
  74519. /* Number of bits in top word is less than number needed. */
  74520. c = -c;
  74521. y = (byte)(n << c);
  74522. n = e[i--];
  74523. y |= (byte)(n >> (64 - c));
  74524. n <<= c;
  74525. c = 64 - c;
  74526. }
  74527. else {
  74528. y = (byte)(n >> c);
  74529. n <<= 32 - c;
  74530. }
  74531. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  74532. for (; i>=0 || c>=4; ) {
  74533. if (c == 0) {
  74534. n = e[i--];
  74535. y = (byte)(n >> 28);
  74536. n <<= 4;
  74537. c = 28;
  74538. }
  74539. else if (c < 4) {
  74540. y = (byte)(n >> 28);
  74541. n = e[i--];
  74542. c = 4 - c;
  74543. y |= (byte)(n >> (32 - c));
  74544. n <<= c;
  74545. c = 32 - c;
  74546. }
  74547. else {
  74548. y = (byte)((n >> 28) & 0xf);
  74549. n <<= 4;
  74550. c -= 4;
  74551. }
  74552. sp_3072_mont_sqr_48(r, r, m, mp);
  74553. sp_3072_mont_sqr_48(r, r, m, mp);
  74554. sp_3072_mont_sqr_48(r, r, m, mp);
  74555. sp_3072_mont_sqr_48(r, r, m, mp);
  74556. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  74557. }
  74558. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  74559. sp_3072_mont_reduce_48(r, m, mp);
  74560. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  74561. sp_3072_cond_sub_48(r, r, m, mask);
  74562. }
  74563. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74564. if (td != NULL)
  74565. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  74566. #endif
  74567. return err;
  74568. }
  74569. #else
  74570. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  74571. *
  74572. * r A single precision number that is the result of the operation.
  74573. * a A single precision number being exponentiated.
  74574. * e A single precision number that is the exponent.
  74575. * bits The number of bits in the exponent.
  74576. * m A single precision number that is the modulus.
  74577. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  74578. */
  74579. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  74580. int bits, const sp_digit* m, int reduceA)
  74581. {
  74582. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74583. sp_digit* td = NULL;
  74584. #else
  74585. sp_digit td[32 * 96];
  74586. #endif
  74587. sp_digit* t[32];
  74588. sp_digit* norm = NULL;
  74589. sp_digit mp = 1;
  74590. sp_digit n;
  74591. sp_digit mask;
  74592. int i;
  74593. int c;
  74594. byte y;
  74595. int err = MP_OKAY;
  74596. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74597. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 96), NULL,
  74598. DYNAMIC_TYPE_TMP_BUFFER);
  74599. if (td == NULL)
  74600. err = MEMORY_E;
  74601. #endif
  74602. if (err == MP_OKAY) {
  74603. norm = td;
  74604. for (i=0; i<32; i++) {
  74605. t[i] = td + i * 96;
  74606. }
  74607. sp_3072_mont_setup(m, &mp);
  74608. sp_3072_mont_norm_48(norm, m);
  74609. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  74610. if (reduceA != 0) {
  74611. err = sp_3072_mod_48(t[1] + 48, a, m);
  74612. if (err == MP_OKAY) {
  74613. err = sp_3072_mod_48(t[1], t[1], m);
  74614. }
  74615. }
  74616. else {
  74617. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  74618. err = sp_3072_mod_48(t[1], t[1], m);
  74619. }
  74620. }
  74621. if (err == MP_OKAY) {
  74622. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  74623. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  74624. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  74625. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  74626. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  74627. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  74628. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  74629. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  74630. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  74631. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  74632. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  74633. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  74634. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  74635. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  74636. sp_3072_mont_sqr_48(t[16], t[ 8], m, mp);
  74637. sp_3072_mont_mul_48(t[17], t[ 9], t[ 8], m, mp);
  74638. sp_3072_mont_sqr_48(t[18], t[ 9], m, mp);
  74639. sp_3072_mont_mul_48(t[19], t[10], t[ 9], m, mp);
  74640. sp_3072_mont_sqr_48(t[20], t[10], m, mp);
  74641. sp_3072_mont_mul_48(t[21], t[11], t[10], m, mp);
  74642. sp_3072_mont_sqr_48(t[22], t[11], m, mp);
  74643. sp_3072_mont_mul_48(t[23], t[12], t[11], m, mp);
  74644. sp_3072_mont_sqr_48(t[24], t[12], m, mp);
  74645. sp_3072_mont_mul_48(t[25], t[13], t[12], m, mp);
  74646. sp_3072_mont_sqr_48(t[26], t[13], m, mp);
  74647. sp_3072_mont_mul_48(t[27], t[14], t[13], m, mp);
  74648. sp_3072_mont_sqr_48(t[28], t[14], m, mp);
  74649. sp_3072_mont_mul_48(t[29], t[15], t[14], m, mp);
  74650. sp_3072_mont_sqr_48(t[30], t[15], m, mp);
  74651. sp_3072_mont_mul_48(t[31], t[16], t[15], m, mp);
  74652. i = (bits - 1) / 32;
  74653. n = e[i--];
  74654. c = bits & 31;
  74655. if (c == 0) {
  74656. c = 32;
  74657. }
  74658. c -= bits % 5;
  74659. if (c == 32) {
  74660. c = 27;
  74661. }
  74662. if (c < 0) {
  74663. /* Number of bits in top word is less than number needed. */
  74664. c = -c;
  74665. y = (byte)(n << c);
  74666. n = e[i--];
  74667. y |= (byte)(n >> (64 - c));
  74668. n <<= c;
  74669. c = 64 - c;
  74670. }
  74671. else {
  74672. y = (byte)(n >> c);
  74673. n <<= 32 - c;
  74674. }
  74675. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  74676. for (; i>=0 || c>=5; ) {
  74677. if (c == 0) {
  74678. n = e[i--];
  74679. y = (byte)(n >> 27);
  74680. n <<= 5;
  74681. c = 27;
  74682. }
  74683. else if (c < 5) {
  74684. y = (byte)(n >> 27);
  74685. n = e[i--];
  74686. c = 5 - c;
  74687. y |= (byte)(n >> (32 - c));
  74688. n <<= c;
  74689. c = 32 - c;
  74690. }
  74691. else {
  74692. y = (byte)((n >> 27) & 0x1f);
  74693. n <<= 5;
  74694. c -= 5;
  74695. }
  74696. sp_3072_mont_sqr_48(r, r, m, mp);
  74697. sp_3072_mont_sqr_48(r, r, m, mp);
  74698. sp_3072_mont_sqr_48(r, r, m, mp);
  74699. sp_3072_mont_sqr_48(r, r, m, mp);
  74700. sp_3072_mont_sqr_48(r, r, m, mp);
  74701. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  74702. }
  74703. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  74704. sp_3072_mont_reduce_48(r, m, mp);
  74705. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  74706. sp_3072_cond_sub_48(r, r, m, mask);
  74707. }
  74708. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74709. if (td != NULL)
  74710. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  74711. #endif
  74712. return err;
  74713. }
  74714. #endif /* WOLFSSL_SP_SMALL */
  74715. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  74716. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  74717. /* r = 2^n mod m where n is the number of bits to reduce by.
  74718. * Given m must be 3072 bits, just need to subtract.
  74719. *
  74720. * r A single precision number.
  74721. * m A single precision number.
  74722. */
  74723. static void sp_3072_mont_norm_96(sp_digit* r, const sp_digit* m)
  74724. {
  74725. XMEMSET(r, 0, sizeof(sp_digit) * 96);
  74726. /* r = 2^n mod m */
  74727. sp_3072_sub_in_place_96(r, m);
  74728. }
  74729. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  74730. /* Conditionally subtract b from a using the mask m.
  74731. * m is -1 to subtract and 0 when not copying.
  74732. *
  74733. * r A single precision number representing condition subtract result.
  74734. * a A single precision number to subtract from.
  74735. * b A single precision number to subtract.
  74736. * m Mask value to apply.
  74737. */
  74738. SP_NOINLINE static sp_digit sp_3072_cond_sub_96(sp_digit* r, const sp_digit* a,
  74739. const sp_digit* b, sp_digit m)
  74740. {
  74741. __asm__ __volatile__ (
  74742. "movs r4, #0\n\t"
  74743. "movs r5, #0xff\n\t"
  74744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74745. "adds r5, r5, #0x81\n\t"
  74746. #else
  74747. "add r5, r5, #0x81\n\t"
  74748. #endif
  74749. "mov r8, r5\n\t"
  74750. "movs r7, #0\n\t"
  74751. "\n"
  74752. "L_sp_3072_cond_sub_96_words_%=:\n\t"
  74753. "ldr r6, [%[b], r7]\n\t"
  74754. #ifdef WOLFSSL_KEIL
  74755. "ands r6, r6, %[m]\n\t"
  74756. #elif defined(__clang__)
  74757. "ands r6, %[m]\n\t"
  74758. #else
  74759. "and r6, %[m]\n\t"
  74760. #endif
  74761. "movs r5, #0\n\t"
  74762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74763. "subs r5, r5, r4\n\t"
  74764. #else
  74765. "sub r5, r5, r4\n\t"
  74766. #endif
  74767. "ldr r5, [%[a], r7]\n\t"
  74768. #ifdef WOLFSSL_KEIL
  74769. "sbcs r5, r5, r6\n\t"
  74770. #elif defined(__clang__)
  74771. "sbcs r5, r6\n\t"
  74772. #else
  74773. "sbc r5, r6\n\t"
  74774. #endif
  74775. #ifdef WOLFSSL_KEIL
  74776. "sbcs r4, r4, r4\n\t"
  74777. #elif defined(__clang__)
  74778. "sbcs r4, r4\n\t"
  74779. #else
  74780. "sbc r4, r4\n\t"
  74781. #endif
  74782. "str r5, [%[r], r7]\n\t"
  74783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74784. "adds r7, r7, #4\n\t"
  74785. #else
  74786. "add r7, r7, #4\n\t"
  74787. #endif
  74788. "cmp r7, r8\n\t"
  74789. "blt L_sp_3072_cond_sub_96_words_%=\n\t"
  74790. "movs %[r], r4\n\t"
  74791. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  74792. :
  74793. : "memory", "r4", "r5", "r6", "r7", "r8"
  74794. );
  74795. return (uint32_t)(size_t)r;
  74796. }
  74797. /* Reduce the number back to 3072 bits using Montgomery reduction.
  74798. *
  74799. * a A single precision number to reduce in place.
  74800. * m The single precision number representing the modulus.
  74801. * mp The digit representing the negative inverse of m mod 2^n.
  74802. */
  74803. SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a, const sp_digit* m,
  74804. sp_digit mp)
  74805. {
  74806. __asm__ __volatile__ (
  74807. "movs r7, #0\n\t"
  74808. "mov r8, %[mp]\n\t"
  74809. "mov r12, r7\n\t"
  74810. "mov lr, %[m]\n\t"
  74811. "mov r9, %[a]\n\t"
  74812. "mov r11, %[a]\n\t"
  74813. "movs r5, #0xff\n\t"
  74814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74815. "adds r5, r5, #0x7d\n\t"
  74816. #else
  74817. "add r5, r5, #0x7d\n\t"
  74818. #endif
  74819. "movs r6, #0xff\n\t"
  74820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74821. "adds r6, r6, #0x81\n\t"
  74822. #else
  74823. "add r6, r6, #0x81\n\t"
  74824. #endif
  74825. "add r9, r9, r5\n\t"
  74826. "add r11, r11, r6\n\t"
  74827. "\n"
  74828. "L_sp_3072_mont_reduce_96_mod_%=:\n\t"
  74829. "movs r7, #0\n\t"
  74830. "movs r4, #0\n\t"
  74831. "# a[i] += m[0] * mu\n\t"
  74832. "ldm %[m]!, {%[mp]}\n\t"
  74833. "ldm %[a]!, {r3}\n\t"
  74834. "# mu = a[i] * mp\n\t"
  74835. "mov r5, r8\n\t"
  74836. #ifdef WOLFSSL_KEIL
  74837. "muls r5, r3, r5\n\t"
  74838. #elif defined(__clang__)
  74839. "muls r5, r3\n\t"
  74840. #else
  74841. "mul r5, r3\n\t"
  74842. #endif
  74843. "mov r10, r5\n\t"
  74844. "# Multiply m[0] and mu - Start\n\t"
  74845. "mov r5, r10\n\t"
  74846. "uxth r6, %[mp]\n\t"
  74847. "uxth r5, r5\n\t"
  74848. #ifdef WOLFSSL_KEIL
  74849. "muls r6, r5, r6\n\t"
  74850. #elif defined(__clang__)
  74851. "muls r6, r5\n\t"
  74852. #else
  74853. "mul r6, r5\n\t"
  74854. #endif
  74855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74856. "adds r3, r3, r6\n\t"
  74857. #else
  74858. "add r3, r3, r6\n\t"
  74859. #endif
  74860. #ifdef WOLFSSL_KEIL
  74861. "adcs r4, r4, r7\n\t"
  74862. #elif defined(__clang__)
  74863. "adcs r4, r7\n\t"
  74864. #else
  74865. "adc r4, r7\n\t"
  74866. #endif
  74867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74868. "lsrs r6, %[mp], #16\n\t"
  74869. #else
  74870. "lsr r6, %[mp], #16\n\t"
  74871. #endif
  74872. #ifdef WOLFSSL_KEIL
  74873. "muls r5, r6, r5\n\t"
  74874. #elif defined(__clang__)
  74875. "muls r5, r6\n\t"
  74876. #else
  74877. "mul r5, r6\n\t"
  74878. #endif
  74879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74880. "lsrs r6, r5, #16\n\t"
  74881. #else
  74882. "lsr r6, r5, #16\n\t"
  74883. #endif
  74884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74885. "lsls r5, r5, #16\n\t"
  74886. #else
  74887. "lsl r5, r5, #16\n\t"
  74888. #endif
  74889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74890. "adds r3, r3, r5\n\t"
  74891. #else
  74892. "add r3, r3, r5\n\t"
  74893. #endif
  74894. #ifdef WOLFSSL_KEIL
  74895. "adcs r4, r4, r6\n\t"
  74896. #elif defined(__clang__)
  74897. "adcs r4, r6\n\t"
  74898. #else
  74899. "adc r4, r6\n\t"
  74900. #endif
  74901. "mov r5, r10\n\t"
  74902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74903. "lsrs r6, %[mp], #16\n\t"
  74904. #else
  74905. "lsr r6, %[mp], #16\n\t"
  74906. #endif
  74907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74908. "lsrs r5, r5, #16\n\t"
  74909. #else
  74910. "lsr r5, r5, #16\n\t"
  74911. #endif
  74912. #ifdef WOLFSSL_KEIL
  74913. "muls r6, r5, r6\n\t"
  74914. #elif defined(__clang__)
  74915. "muls r6, r5\n\t"
  74916. #else
  74917. "mul r6, r5\n\t"
  74918. #endif
  74919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74920. "adds r4, r4, r6\n\t"
  74921. #else
  74922. "add r4, r4, r6\n\t"
  74923. #endif
  74924. "uxth r6, %[mp]\n\t"
  74925. #ifdef WOLFSSL_KEIL
  74926. "muls r5, r6, r5\n\t"
  74927. #elif defined(__clang__)
  74928. "muls r5, r6\n\t"
  74929. #else
  74930. "mul r5, r6\n\t"
  74931. #endif
  74932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74933. "lsrs r6, r5, #16\n\t"
  74934. #else
  74935. "lsr r6, r5, #16\n\t"
  74936. #endif
  74937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74938. "lsls r5, r5, #16\n\t"
  74939. #else
  74940. "lsl r5, r5, #16\n\t"
  74941. #endif
  74942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74943. "adds r3, r3, r5\n\t"
  74944. #else
  74945. "add r3, r3, r5\n\t"
  74946. #endif
  74947. #ifdef WOLFSSL_KEIL
  74948. "adcs r4, r4, r6\n\t"
  74949. #elif defined(__clang__)
  74950. "adcs r4, r6\n\t"
  74951. #else
  74952. "adc r4, r6\n\t"
  74953. #endif
  74954. "# Multiply m[0] and mu - Done\n\t"
  74955. "\n"
  74956. "L_sp_3072_mont_reduce_96_word_%=:\n\t"
  74957. "# a[i+j] += m[j] * mu\n\t"
  74958. "ldr r3, [%[a]]\n\t"
  74959. "ldm %[m]!, {%[mp]}\n\t"
  74960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74961. "adds r3, r3, r4\n\t"
  74962. #else
  74963. "add r3, r3, r4\n\t"
  74964. #endif
  74965. "movs r4, #0\n\t"
  74966. #ifdef WOLFSSL_KEIL
  74967. "adcs r4, r4, r7\n\t"
  74968. #elif defined(__clang__)
  74969. "adcs r4, r7\n\t"
  74970. #else
  74971. "adc r4, r7\n\t"
  74972. #endif
  74973. "# Multiply m[j] and mu - Start\n\t"
  74974. "mov r5, r10\n\t"
  74975. "uxth r6, %[mp]\n\t"
  74976. "uxth r5, r5\n\t"
  74977. #ifdef WOLFSSL_KEIL
  74978. "muls r6, r5, r6\n\t"
  74979. #elif defined(__clang__)
  74980. "muls r6, r5\n\t"
  74981. #else
  74982. "mul r6, r5\n\t"
  74983. #endif
  74984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74985. "adds r3, r3, r6\n\t"
  74986. #else
  74987. "add r3, r3, r6\n\t"
  74988. #endif
  74989. #ifdef WOLFSSL_KEIL
  74990. "adcs r4, r4, r7\n\t"
  74991. #elif defined(__clang__)
  74992. "adcs r4, r7\n\t"
  74993. #else
  74994. "adc r4, r7\n\t"
  74995. #endif
  74996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74997. "lsrs r6, %[mp], #16\n\t"
  74998. #else
  74999. "lsr r6, %[mp], #16\n\t"
  75000. #endif
  75001. #ifdef WOLFSSL_KEIL
  75002. "muls r5, r6, r5\n\t"
  75003. #elif defined(__clang__)
  75004. "muls r5, r6\n\t"
  75005. #else
  75006. "mul r5, r6\n\t"
  75007. #endif
  75008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75009. "lsrs r6, r5, #16\n\t"
  75010. #else
  75011. "lsr r6, r5, #16\n\t"
  75012. #endif
  75013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75014. "lsls r5, r5, #16\n\t"
  75015. #else
  75016. "lsl r5, r5, #16\n\t"
  75017. #endif
  75018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75019. "adds r3, r3, r5\n\t"
  75020. #else
  75021. "add r3, r3, r5\n\t"
  75022. #endif
  75023. #ifdef WOLFSSL_KEIL
  75024. "adcs r4, r4, r6\n\t"
  75025. #elif defined(__clang__)
  75026. "adcs r4, r6\n\t"
  75027. #else
  75028. "adc r4, r6\n\t"
  75029. #endif
  75030. "mov r5, r10\n\t"
  75031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75032. "lsrs r6, %[mp], #16\n\t"
  75033. #else
  75034. "lsr r6, %[mp], #16\n\t"
  75035. #endif
  75036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75037. "lsrs r5, r5, #16\n\t"
  75038. #else
  75039. "lsr r5, r5, #16\n\t"
  75040. #endif
  75041. #ifdef WOLFSSL_KEIL
  75042. "muls r6, r5, r6\n\t"
  75043. #elif defined(__clang__)
  75044. "muls r6, r5\n\t"
  75045. #else
  75046. "mul r6, r5\n\t"
  75047. #endif
  75048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75049. "adds r4, r4, r6\n\t"
  75050. #else
  75051. "add r4, r4, r6\n\t"
  75052. #endif
  75053. "uxth r6, %[mp]\n\t"
  75054. #ifdef WOLFSSL_KEIL
  75055. "muls r5, r6, r5\n\t"
  75056. #elif defined(__clang__)
  75057. "muls r5, r6\n\t"
  75058. #else
  75059. "mul r5, r6\n\t"
  75060. #endif
  75061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75062. "lsrs r6, r5, #16\n\t"
  75063. #else
  75064. "lsr r6, r5, #16\n\t"
  75065. #endif
  75066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75067. "lsls r5, r5, #16\n\t"
  75068. #else
  75069. "lsl r5, r5, #16\n\t"
  75070. #endif
  75071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75072. "adds r3, r3, r5\n\t"
  75073. #else
  75074. "add r3, r3, r5\n\t"
  75075. #endif
  75076. #ifdef WOLFSSL_KEIL
  75077. "adcs r4, r4, r6\n\t"
  75078. #elif defined(__clang__)
  75079. "adcs r4, r6\n\t"
  75080. #else
  75081. "adc r4, r6\n\t"
  75082. #endif
  75083. "# Multiply m[j] and mu - Done\n\t"
  75084. "stm %[a]!, {r3}\n\t"
  75085. "cmp %[a], r9\n\t"
  75086. "blt L_sp_3072_mont_reduce_96_word_%=\n\t"
  75087. "# a[i+95] += m[95] * mu\n\t"
  75088. "ldr %[mp], [%[m]]\n\t"
  75089. "mov r3, r12\n\t"
  75090. "# Multiply m[95] and mu - Start\n\t"
  75091. "mov r5, r10\n\t"
  75092. "uxth r6, %[mp]\n\t"
  75093. "uxth r5, r5\n\t"
  75094. #ifdef WOLFSSL_KEIL
  75095. "muls r6, r5, r6\n\t"
  75096. #elif defined(__clang__)
  75097. "muls r6, r5\n\t"
  75098. #else
  75099. "mul r6, r5\n\t"
  75100. #endif
  75101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75102. "adds r4, r4, r6\n\t"
  75103. #else
  75104. "add r4, r4, r6\n\t"
  75105. #endif
  75106. #ifdef WOLFSSL_KEIL
  75107. "adcs r3, r3, r7\n\t"
  75108. #elif defined(__clang__)
  75109. "adcs r3, r7\n\t"
  75110. #else
  75111. "adc r3, r7\n\t"
  75112. #endif
  75113. #ifdef WOLFSSL_KEIL
  75114. "adcs r7, r7, r7\n\t"
  75115. #elif defined(__clang__)
  75116. "adcs r7, r7\n\t"
  75117. #else
  75118. "adc r7, r7\n\t"
  75119. #endif
  75120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75121. "lsrs r6, %[mp], #16\n\t"
  75122. #else
  75123. "lsr r6, %[mp], #16\n\t"
  75124. #endif
  75125. #ifdef WOLFSSL_KEIL
  75126. "muls r5, r6, r5\n\t"
  75127. #elif defined(__clang__)
  75128. "muls r5, r6\n\t"
  75129. #else
  75130. "mul r5, r6\n\t"
  75131. #endif
  75132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75133. "lsrs r6, r5, #16\n\t"
  75134. #else
  75135. "lsr r6, r5, #16\n\t"
  75136. #endif
  75137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75138. "lsls r5, r5, #16\n\t"
  75139. #else
  75140. "lsl r5, r5, #16\n\t"
  75141. #endif
  75142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75143. "adds r4, r4, r5\n\t"
  75144. #else
  75145. "add r4, r4, r5\n\t"
  75146. #endif
  75147. #ifdef WOLFSSL_KEIL
  75148. "adcs r3, r3, r6\n\t"
  75149. #elif defined(__clang__)
  75150. "adcs r3, r6\n\t"
  75151. #else
  75152. "adc r3, r6\n\t"
  75153. #endif
  75154. #ifdef WOLFSSL_KEIL
  75155. "adcs r7, r7, r7\n\t"
  75156. #elif defined(__clang__)
  75157. "adcs r7, r7\n\t"
  75158. #else
  75159. "adc r7, r7\n\t"
  75160. #endif
  75161. "mov r5, r10\n\t"
  75162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75163. "lsrs r6, %[mp], #16\n\t"
  75164. #else
  75165. "lsr r6, %[mp], #16\n\t"
  75166. #endif
  75167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75168. "lsrs r5, r5, #16\n\t"
  75169. #else
  75170. "lsr r5, r5, #16\n\t"
  75171. #endif
  75172. #ifdef WOLFSSL_KEIL
  75173. "muls r6, r5, r6\n\t"
  75174. #elif defined(__clang__)
  75175. "muls r6, r5\n\t"
  75176. #else
  75177. "mul r6, r5\n\t"
  75178. #endif
  75179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75180. "adds r3, r3, r6\n\t"
  75181. #else
  75182. "add r3, r3, r6\n\t"
  75183. #endif
  75184. #ifdef WOLFSSL_KEIL
  75185. "adcs r7, r7, r7\n\t"
  75186. #elif defined(__clang__)
  75187. "adcs r7, r7\n\t"
  75188. #else
  75189. "adc r7, r7\n\t"
  75190. #endif
  75191. "uxth r6, %[mp]\n\t"
  75192. #ifdef WOLFSSL_KEIL
  75193. "muls r5, r6, r5\n\t"
  75194. #elif defined(__clang__)
  75195. "muls r5, r6\n\t"
  75196. #else
  75197. "mul r5, r6\n\t"
  75198. #endif
  75199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75200. "lsrs r6, r5, #16\n\t"
  75201. #else
  75202. "lsr r6, r5, #16\n\t"
  75203. #endif
  75204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75205. "lsls r5, r5, #16\n\t"
  75206. #else
  75207. "lsl r5, r5, #16\n\t"
  75208. #endif
  75209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75210. "adds r4, r4, r5\n\t"
  75211. #else
  75212. "add r4, r4, r5\n\t"
  75213. #endif
  75214. #ifdef WOLFSSL_KEIL
  75215. "adcs r3, r3, r6\n\t"
  75216. #elif defined(__clang__)
  75217. "adcs r3, r6\n\t"
  75218. #else
  75219. "adc r3, r6\n\t"
  75220. #endif
  75221. #ifdef WOLFSSL_KEIL
  75222. "adcs r7, r7, r7\n\t"
  75223. #elif defined(__clang__)
  75224. "adcs r7, r7\n\t"
  75225. #else
  75226. "adc r7, r7\n\t"
  75227. #endif
  75228. "# Multiply m[95] and mu - Done\n\t"
  75229. "ldr r5, [%[a]]\n\t"
  75230. "ldr r6, [%[a], #4]\n\t"
  75231. "movs %[mp], #0\n\t"
  75232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75233. "adds r5, r5, r4\n\t"
  75234. #else
  75235. "add r5, r5, r4\n\t"
  75236. #endif
  75237. #ifdef WOLFSSL_KEIL
  75238. "adcs r6, r6, r3\n\t"
  75239. #elif defined(__clang__)
  75240. "adcs r6, r3\n\t"
  75241. #else
  75242. "adc r6, r3\n\t"
  75243. #endif
  75244. #ifdef WOLFSSL_KEIL
  75245. "adcs r7, r7, %[mp]\n\t"
  75246. #elif defined(__clang__)
  75247. "adcs r7, %[mp]\n\t"
  75248. #else
  75249. "adc r7, %[mp]\n\t"
  75250. #endif
  75251. "stm %[a]!, {r5, r6}\n\t"
  75252. "# i += 1\n\t"
  75253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75254. "subs %[a], %[a], #4\n\t"
  75255. #else
  75256. "sub %[a], %[a], #4\n\t"
  75257. #endif
  75258. "movs r3, #0xff\n\t"
  75259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75260. "adds r3, r3, #0x7d\n\t"
  75261. #else
  75262. "add r3, r3, #0x7d\n\t"
  75263. #endif
  75264. "mov r9, %[a]\n\t"
  75265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75266. "subs %[a], %[a], r3\n\t"
  75267. #else
  75268. "sub %[a], %[a], r3\n\t"
  75269. #endif
  75270. "mov r12, r7\n\t"
  75271. "mov %[m], lr\n\t"
  75272. "cmp r11, %[a]\n\t"
  75273. "bgt L_sp_3072_mont_reduce_96_mod_%=\n\t"
  75274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75275. "negs r7, r7\n\t"
  75276. #else
  75277. "neg r7, r7\n\t"
  75278. #endif
  75279. "# Subtract masked modulus\n\t"
  75280. "movs r4, #0xff\n\t"
  75281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75282. "adds r4, r4, #0x81\n\t"
  75283. #else
  75284. "add r4, r4, #0x81\n\t"
  75285. #endif
  75286. "movs %[mp], #0\n\t"
  75287. "movs r3, #0\n\t"
  75288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75289. "subs %[a], %[a], r4\n\t"
  75290. #else
  75291. "sub %[a], %[a], r4\n\t"
  75292. #endif
  75293. #ifndef WOLFSSL_SP_LARGE_CODE
  75294. "\n"
  75295. "L_sp_3072_mont_reduce_96_sub_mask_%=:\n\t"
  75296. "ldm %[m]!, {r6}\n\t"
  75297. "movs r5, #0\n\t"
  75298. #ifdef WOLFSSL_KEIL
  75299. "ands r6, r6, r7\n\t"
  75300. #elif defined(__clang__)
  75301. "ands r6, r7\n\t"
  75302. #else
  75303. "and r6, r7\n\t"
  75304. #endif
  75305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75306. "subs r5, r5, %[mp]\n\t"
  75307. #else
  75308. "sub r5, r5, %[mp]\n\t"
  75309. #endif
  75310. "ldr r5, [%[a], r4]\n\t"
  75311. #ifdef WOLFSSL_KEIL
  75312. "sbcs r5, r5, r6\n\t"
  75313. #elif defined(__clang__)
  75314. "sbcs r5, r6\n\t"
  75315. #else
  75316. "sbc r5, r6\n\t"
  75317. #endif
  75318. #ifdef WOLFSSL_KEIL
  75319. "sbcs %[mp], %[mp], %[mp]\n\t"
  75320. #elif defined(__clang__)
  75321. "sbcs %[mp], %[mp]\n\t"
  75322. #else
  75323. "sbc %[mp], %[mp]\n\t"
  75324. #endif
  75325. "stm %[a]!, {r5}\n\t"
  75326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75327. "adds r3, r3, #4\n\t"
  75328. #else
  75329. "add r3, r3, #4\n\t"
  75330. #endif
  75331. "cmp r3, r4\n\t"
  75332. "blt L_sp_3072_mont_reduce_96_sub_mask_%=\n\t"
  75333. #else /* WOLFSSL_SP_LARGE_CODE */
  75334. "ldm %[m]!, {r6}\n\t"
  75335. #ifdef WOLFSSL_KEIL
  75336. "ands r6, r6, r7\n\t"
  75337. #elif defined(__clang__)
  75338. "ands r6, r7\n\t"
  75339. #else
  75340. "and r6, r7\n\t"
  75341. #endif
  75342. "ldr r5, [%[a], r4]\n\t"
  75343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75344. "subs r5, r5, r6\n\t"
  75345. #else
  75346. "sub r5, r5, r6\n\t"
  75347. #endif
  75348. "stm %[a]!, {r5}\n\t"
  75349. "ldm %[m]!, {r6}\n\t"
  75350. #ifdef WOLFSSL_KEIL
  75351. "ands r6, r6, r7\n\t"
  75352. #elif defined(__clang__)
  75353. "ands r6, r7\n\t"
  75354. #else
  75355. "and r6, r7\n\t"
  75356. #endif
  75357. "ldr r5, [%[a], r4]\n\t"
  75358. #ifdef WOLFSSL_KEIL
  75359. "sbcs r5, r5, r6\n\t"
  75360. #elif defined(__clang__)
  75361. "sbcs r5, r6\n\t"
  75362. #else
  75363. "sbc r5, r6\n\t"
  75364. #endif
  75365. "stm %[a]!, {r5}\n\t"
  75366. "ldm %[m]!, {r6}\n\t"
  75367. #ifdef WOLFSSL_KEIL
  75368. "ands r6, r6, r7\n\t"
  75369. #elif defined(__clang__)
  75370. "ands r6, r7\n\t"
  75371. #else
  75372. "and r6, r7\n\t"
  75373. #endif
  75374. "ldr r5, [%[a], r4]\n\t"
  75375. #ifdef WOLFSSL_KEIL
  75376. "sbcs r5, r5, r6\n\t"
  75377. #elif defined(__clang__)
  75378. "sbcs r5, r6\n\t"
  75379. #else
  75380. "sbc r5, r6\n\t"
  75381. #endif
  75382. "stm %[a]!, {r5}\n\t"
  75383. "ldm %[m]!, {r6}\n\t"
  75384. #ifdef WOLFSSL_KEIL
  75385. "ands r6, r6, r7\n\t"
  75386. #elif defined(__clang__)
  75387. "ands r6, r7\n\t"
  75388. #else
  75389. "and r6, r7\n\t"
  75390. #endif
  75391. "ldr r5, [%[a], r4]\n\t"
  75392. #ifdef WOLFSSL_KEIL
  75393. "sbcs r5, r5, r6\n\t"
  75394. #elif defined(__clang__)
  75395. "sbcs r5, r6\n\t"
  75396. #else
  75397. "sbc r5, r6\n\t"
  75398. #endif
  75399. "stm %[a]!, {r5}\n\t"
  75400. "ldm %[m]!, {r6}\n\t"
  75401. #ifdef WOLFSSL_KEIL
  75402. "ands r6, r6, r7\n\t"
  75403. #elif defined(__clang__)
  75404. "ands r6, r7\n\t"
  75405. #else
  75406. "and r6, r7\n\t"
  75407. #endif
  75408. "ldr r5, [%[a], r4]\n\t"
  75409. #ifdef WOLFSSL_KEIL
  75410. "sbcs r5, r5, r6\n\t"
  75411. #elif defined(__clang__)
  75412. "sbcs r5, r6\n\t"
  75413. #else
  75414. "sbc r5, r6\n\t"
  75415. #endif
  75416. "stm %[a]!, {r5}\n\t"
  75417. "ldm %[m]!, {r6}\n\t"
  75418. #ifdef WOLFSSL_KEIL
  75419. "ands r6, r6, r7\n\t"
  75420. #elif defined(__clang__)
  75421. "ands r6, r7\n\t"
  75422. #else
  75423. "and r6, r7\n\t"
  75424. #endif
  75425. "ldr r5, [%[a], r4]\n\t"
  75426. #ifdef WOLFSSL_KEIL
  75427. "sbcs r5, r5, r6\n\t"
  75428. #elif defined(__clang__)
  75429. "sbcs r5, r6\n\t"
  75430. #else
  75431. "sbc r5, r6\n\t"
  75432. #endif
  75433. "stm %[a]!, {r5}\n\t"
  75434. "ldm %[m]!, {r6}\n\t"
  75435. #ifdef WOLFSSL_KEIL
  75436. "ands r6, r6, r7\n\t"
  75437. #elif defined(__clang__)
  75438. "ands r6, r7\n\t"
  75439. #else
  75440. "and r6, r7\n\t"
  75441. #endif
  75442. "ldr r5, [%[a], r4]\n\t"
  75443. #ifdef WOLFSSL_KEIL
  75444. "sbcs r5, r5, r6\n\t"
  75445. #elif defined(__clang__)
  75446. "sbcs r5, r6\n\t"
  75447. #else
  75448. "sbc r5, r6\n\t"
  75449. #endif
  75450. "stm %[a]!, {r5}\n\t"
  75451. "ldm %[m]!, {r6}\n\t"
  75452. #ifdef WOLFSSL_KEIL
  75453. "ands r6, r6, r7\n\t"
  75454. #elif defined(__clang__)
  75455. "ands r6, r7\n\t"
  75456. #else
  75457. "and r6, r7\n\t"
  75458. #endif
  75459. "ldr r5, [%[a], r4]\n\t"
  75460. #ifdef WOLFSSL_KEIL
  75461. "sbcs r5, r5, r6\n\t"
  75462. #elif defined(__clang__)
  75463. "sbcs r5, r6\n\t"
  75464. #else
  75465. "sbc r5, r6\n\t"
  75466. #endif
  75467. "stm %[a]!, {r5}\n\t"
  75468. "ldm %[m]!, {r6}\n\t"
  75469. #ifdef WOLFSSL_KEIL
  75470. "ands r6, r6, r7\n\t"
  75471. #elif defined(__clang__)
  75472. "ands r6, r7\n\t"
  75473. #else
  75474. "and r6, r7\n\t"
  75475. #endif
  75476. "ldr r5, [%[a], r4]\n\t"
  75477. #ifdef WOLFSSL_KEIL
  75478. "sbcs r5, r5, r6\n\t"
  75479. #elif defined(__clang__)
  75480. "sbcs r5, r6\n\t"
  75481. #else
  75482. "sbc r5, r6\n\t"
  75483. #endif
  75484. "stm %[a]!, {r5}\n\t"
  75485. "ldm %[m]!, {r6}\n\t"
  75486. #ifdef WOLFSSL_KEIL
  75487. "ands r6, r6, r7\n\t"
  75488. #elif defined(__clang__)
  75489. "ands r6, r7\n\t"
  75490. #else
  75491. "and r6, r7\n\t"
  75492. #endif
  75493. "ldr r5, [%[a], r4]\n\t"
  75494. #ifdef WOLFSSL_KEIL
  75495. "sbcs r5, r5, r6\n\t"
  75496. #elif defined(__clang__)
  75497. "sbcs r5, r6\n\t"
  75498. #else
  75499. "sbc r5, r6\n\t"
  75500. #endif
  75501. "stm %[a]!, {r5}\n\t"
  75502. "ldm %[m]!, {r6}\n\t"
  75503. #ifdef WOLFSSL_KEIL
  75504. "ands r6, r6, r7\n\t"
  75505. #elif defined(__clang__)
  75506. "ands r6, r7\n\t"
  75507. #else
  75508. "and r6, r7\n\t"
  75509. #endif
  75510. "ldr r5, [%[a], r4]\n\t"
  75511. #ifdef WOLFSSL_KEIL
  75512. "sbcs r5, r5, r6\n\t"
  75513. #elif defined(__clang__)
  75514. "sbcs r5, r6\n\t"
  75515. #else
  75516. "sbc r5, r6\n\t"
  75517. #endif
  75518. "stm %[a]!, {r5}\n\t"
  75519. "ldm %[m]!, {r6}\n\t"
  75520. #ifdef WOLFSSL_KEIL
  75521. "ands r6, r6, r7\n\t"
  75522. #elif defined(__clang__)
  75523. "ands r6, r7\n\t"
  75524. #else
  75525. "and r6, r7\n\t"
  75526. #endif
  75527. "ldr r5, [%[a], r4]\n\t"
  75528. #ifdef WOLFSSL_KEIL
  75529. "sbcs r5, r5, r6\n\t"
  75530. #elif defined(__clang__)
  75531. "sbcs r5, r6\n\t"
  75532. #else
  75533. "sbc r5, r6\n\t"
  75534. #endif
  75535. "stm %[a]!, {r5}\n\t"
  75536. "ldm %[m]!, {r6}\n\t"
  75537. #ifdef WOLFSSL_KEIL
  75538. "ands r6, r6, r7\n\t"
  75539. #elif defined(__clang__)
  75540. "ands r6, r7\n\t"
  75541. #else
  75542. "and r6, r7\n\t"
  75543. #endif
  75544. "ldr r5, [%[a], r4]\n\t"
  75545. #ifdef WOLFSSL_KEIL
  75546. "sbcs r5, r5, r6\n\t"
  75547. #elif defined(__clang__)
  75548. "sbcs r5, r6\n\t"
  75549. #else
  75550. "sbc r5, r6\n\t"
  75551. #endif
  75552. "stm %[a]!, {r5}\n\t"
  75553. "ldm %[m]!, {r6}\n\t"
  75554. #ifdef WOLFSSL_KEIL
  75555. "ands r6, r6, r7\n\t"
  75556. #elif defined(__clang__)
  75557. "ands r6, r7\n\t"
  75558. #else
  75559. "and r6, r7\n\t"
  75560. #endif
  75561. "ldr r5, [%[a], r4]\n\t"
  75562. #ifdef WOLFSSL_KEIL
  75563. "sbcs r5, r5, r6\n\t"
  75564. #elif defined(__clang__)
  75565. "sbcs r5, r6\n\t"
  75566. #else
  75567. "sbc r5, r6\n\t"
  75568. #endif
  75569. "stm %[a]!, {r5}\n\t"
  75570. "ldm %[m]!, {r6}\n\t"
  75571. #ifdef WOLFSSL_KEIL
  75572. "ands r6, r6, r7\n\t"
  75573. #elif defined(__clang__)
  75574. "ands r6, r7\n\t"
  75575. #else
  75576. "and r6, r7\n\t"
  75577. #endif
  75578. "ldr r5, [%[a], r4]\n\t"
  75579. #ifdef WOLFSSL_KEIL
  75580. "sbcs r5, r5, r6\n\t"
  75581. #elif defined(__clang__)
  75582. "sbcs r5, r6\n\t"
  75583. #else
  75584. "sbc r5, r6\n\t"
  75585. #endif
  75586. "stm %[a]!, {r5}\n\t"
  75587. "ldm %[m]!, {r6}\n\t"
  75588. #ifdef WOLFSSL_KEIL
  75589. "ands r6, r6, r7\n\t"
  75590. #elif defined(__clang__)
  75591. "ands r6, r7\n\t"
  75592. #else
  75593. "and r6, r7\n\t"
  75594. #endif
  75595. "ldr r5, [%[a], r4]\n\t"
  75596. #ifdef WOLFSSL_KEIL
  75597. "sbcs r5, r5, r6\n\t"
  75598. #elif defined(__clang__)
  75599. "sbcs r5, r6\n\t"
  75600. #else
  75601. "sbc r5, r6\n\t"
  75602. #endif
  75603. "stm %[a]!, {r5}\n\t"
  75604. "ldm %[m]!, {r6}\n\t"
  75605. #ifdef WOLFSSL_KEIL
  75606. "ands r6, r6, r7\n\t"
  75607. #elif defined(__clang__)
  75608. "ands r6, r7\n\t"
  75609. #else
  75610. "and r6, r7\n\t"
  75611. #endif
  75612. "ldr r5, [%[a], r4]\n\t"
  75613. #ifdef WOLFSSL_KEIL
  75614. "sbcs r5, r5, r6\n\t"
  75615. #elif defined(__clang__)
  75616. "sbcs r5, r6\n\t"
  75617. #else
  75618. "sbc r5, r6\n\t"
  75619. #endif
  75620. "stm %[a]!, {r5}\n\t"
  75621. "ldm %[m]!, {r6}\n\t"
  75622. #ifdef WOLFSSL_KEIL
  75623. "ands r6, r6, r7\n\t"
  75624. #elif defined(__clang__)
  75625. "ands r6, r7\n\t"
  75626. #else
  75627. "and r6, r7\n\t"
  75628. #endif
  75629. "ldr r5, [%[a], r4]\n\t"
  75630. #ifdef WOLFSSL_KEIL
  75631. "sbcs r5, r5, r6\n\t"
  75632. #elif defined(__clang__)
  75633. "sbcs r5, r6\n\t"
  75634. #else
  75635. "sbc r5, r6\n\t"
  75636. #endif
  75637. "stm %[a]!, {r5}\n\t"
  75638. "ldm %[m]!, {r6}\n\t"
  75639. #ifdef WOLFSSL_KEIL
  75640. "ands r6, r6, r7\n\t"
  75641. #elif defined(__clang__)
  75642. "ands r6, r7\n\t"
  75643. #else
  75644. "and r6, r7\n\t"
  75645. #endif
  75646. "ldr r5, [%[a], r4]\n\t"
  75647. #ifdef WOLFSSL_KEIL
  75648. "sbcs r5, r5, r6\n\t"
  75649. #elif defined(__clang__)
  75650. "sbcs r5, r6\n\t"
  75651. #else
  75652. "sbc r5, r6\n\t"
  75653. #endif
  75654. "stm %[a]!, {r5}\n\t"
  75655. "ldm %[m]!, {r6}\n\t"
  75656. #ifdef WOLFSSL_KEIL
  75657. "ands r6, r6, r7\n\t"
  75658. #elif defined(__clang__)
  75659. "ands r6, r7\n\t"
  75660. #else
  75661. "and r6, r7\n\t"
  75662. #endif
  75663. "ldr r5, [%[a], r4]\n\t"
  75664. #ifdef WOLFSSL_KEIL
  75665. "sbcs r5, r5, r6\n\t"
  75666. #elif defined(__clang__)
  75667. "sbcs r5, r6\n\t"
  75668. #else
  75669. "sbc r5, r6\n\t"
  75670. #endif
  75671. "stm %[a]!, {r5}\n\t"
  75672. "ldm %[m]!, {r6}\n\t"
  75673. #ifdef WOLFSSL_KEIL
  75674. "ands r6, r6, r7\n\t"
  75675. #elif defined(__clang__)
  75676. "ands r6, r7\n\t"
  75677. #else
  75678. "and r6, r7\n\t"
  75679. #endif
  75680. "ldr r5, [%[a], r4]\n\t"
  75681. #ifdef WOLFSSL_KEIL
  75682. "sbcs r5, r5, r6\n\t"
  75683. #elif defined(__clang__)
  75684. "sbcs r5, r6\n\t"
  75685. #else
  75686. "sbc r5, r6\n\t"
  75687. #endif
  75688. "stm %[a]!, {r5}\n\t"
  75689. "ldm %[m]!, {r6}\n\t"
  75690. #ifdef WOLFSSL_KEIL
  75691. "ands r6, r6, r7\n\t"
  75692. #elif defined(__clang__)
  75693. "ands r6, r7\n\t"
  75694. #else
  75695. "and r6, r7\n\t"
  75696. #endif
  75697. "ldr r5, [%[a], r4]\n\t"
  75698. #ifdef WOLFSSL_KEIL
  75699. "sbcs r5, r5, r6\n\t"
  75700. #elif defined(__clang__)
  75701. "sbcs r5, r6\n\t"
  75702. #else
  75703. "sbc r5, r6\n\t"
  75704. #endif
  75705. "stm %[a]!, {r5}\n\t"
  75706. "ldm %[m]!, {r6}\n\t"
  75707. #ifdef WOLFSSL_KEIL
  75708. "ands r6, r6, r7\n\t"
  75709. #elif defined(__clang__)
  75710. "ands r6, r7\n\t"
  75711. #else
  75712. "and r6, r7\n\t"
  75713. #endif
  75714. "ldr r5, [%[a], r4]\n\t"
  75715. #ifdef WOLFSSL_KEIL
  75716. "sbcs r5, r5, r6\n\t"
  75717. #elif defined(__clang__)
  75718. "sbcs r5, r6\n\t"
  75719. #else
  75720. "sbc r5, r6\n\t"
  75721. #endif
  75722. "stm %[a]!, {r5}\n\t"
  75723. "ldm %[m]!, {r6}\n\t"
  75724. #ifdef WOLFSSL_KEIL
  75725. "ands r6, r6, r7\n\t"
  75726. #elif defined(__clang__)
  75727. "ands r6, r7\n\t"
  75728. #else
  75729. "and r6, r7\n\t"
  75730. #endif
  75731. "ldr r5, [%[a], r4]\n\t"
  75732. #ifdef WOLFSSL_KEIL
  75733. "sbcs r5, r5, r6\n\t"
  75734. #elif defined(__clang__)
  75735. "sbcs r5, r6\n\t"
  75736. #else
  75737. "sbc r5, r6\n\t"
  75738. #endif
  75739. "stm %[a]!, {r5}\n\t"
  75740. "ldm %[m]!, {r6}\n\t"
  75741. #ifdef WOLFSSL_KEIL
  75742. "ands r6, r6, r7\n\t"
  75743. #elif defined(__clang__)
  75744. "ands r6, r7\n\t"
  75745. #else
  75746. "and r6, r7\n\t"
  75747. #endif
  75748. "ldr r5, [%[a], r4]\n\t"
  75749. #ifdef WOLFSSL_KEIL
  75750. "sbcs r5, r5, r6\n\t"
  75751. #elif defined(__clang__)
  75752. "sbcs r5, r6\n\t"
  75753. #else
  75754. "sbc r5, r6\n\t"
  75755. #endif
  75756. "stm %[a]!, {r5}\n\t"
  75757. "ldm %[m]!, {r6}\n\t"
  75758. #ifdef WOLFSSL_KEIL
  75759. "ands r6, r6, r7\n\t"
  75760. #elif defined(__clang__)
  75761. "ands r6, r7\n\t"
  75762. #else
  75763. "and r6, r7\n\t"
  75764. #endif
  75765. "ldr r5, [%[a], r4]\n\t"
  75766. #ifdef WOLFSSL_KEIL
  75767. "sbcs r5, r5, r6\n\t"
  75768. #elif defined(__clang__)
  75769. "sbcs r5, r6\n\t"
  75770. #else
  75771. "sbc r5, r6\n\t"
  75772. #endif
  75773. "stm %[a]!, {r5}\n\t"
  75774. "ldm %[m]!, {r6}\n\t"
  75775. #ifdef WOLFSSL_KEIL
  75776. "ands r6, r6, r7\n\t"
  75777. #elif defined(__clang__)
  75778. "ands r6, r7\n\t"
  75779. #else
  75780. "and r6, r7\n\t"
  75781. #endif
  75782. "ldr r5, [%[a], r4]\n\t"
  75783. #ifdef WOLFSSL_KEIL
  75784. "sbcs r5, r5, r6\n\t"
  75785. #elif defined(__clang__)
  75786. "sbcs r5, r6\n\t"
  75787. #else
  75788. "sbc r5, r6\n\t"
  75789. #endif
  75790. "stm %[a]!, {r5}\n\t"
  75791. "ldm %[m]!, {r6}\n\t"
  75792. #ifdef WOLFSSL_KEIL
  75793. "ands r6, r6, r7\n\t"
  75794. #elif defined(__clang__)
  75795. "ands r6, r7\n\t"
  75796. #else
  75797. "and r6, r7\n\t"
  75798. #endif
  75799. "ldr r5, [%[a], r4]\n\t"
  75800. #ifdef WOLFSSL_KEIL
  75801. "sbcs r5, r5, r6\n\t"
  75802. #elif defined(__clang__)
  75803. "sbcs r5, r6\n\t"
  75804. #else
  75805. "sbc r5, r6\n\t"
  75806. #endif
  75807. "stm %[a]!, {r5}\n\t"
  75808. "ldm %[m]!, {r6}\n\t"
  75809. #ifdef WOLFSSL_KEIL
  75810. "ands r6, r6, r7\n\t"
  75811. #elif defined(__clang__)
  75812. "ands r6, r7\n\t"
  75813. #else
  75814. "and r6, r7\n\t"
  75815. #endif
  75816. "ldr r5, [%[a], r4]\n\t"
  75817. #ifdef WOLFSSL_KEIL
  75818. "sbcs r5, r5, r6\n\t"
  75819. #elif defined(__clang__)
  75820. "sbcs r5, r6\n\t"
  75821. #else
  75822. "sbc r5, r6\n\t"
  75823. #endif
  75824. "stm %[a]!, {r5}\n\t"
  75825. "ldm %[m]!, {r6}\n\t"
  75826. #ifdef WOLFSSL_KEIL
  75827. "ands r6, r6, r7\n\t"
  75828. #elif defined(__clang__)
  75829. "ands r6, r7\n\t"
  75830. #else
  75831. "and r6, r7\n\t"
  75832. #endif
  75833. "ldr r5, [%[a], r4]\n\t"
  75834. #ifdef WOLFSSL_KEIL
  75835. "sbcs r5, r5, r6\n\t"
  75836. #elif defined(__clang__)
  75837. "sbcs r5, r6\n\t"
  75838. #else
  75839. "sbc r5, r6\n\t"
  75840. #endif
  75841. "stm %[a]!, {r5}\n\t"
  75842. "ldm %[m]!, {r6}\n\t"
  75843. #ifdef WOLFSSL_KEIL
  75844. "ands r6, r6, r7\n\t"
  75845. #elif defined(__clang__)
  75846. "ands r6, r7\n\t"
  75847. #else
  75848. "and r6, r7\n\t"
  75849. #endif
  75850. "ldr r5, [%[a], r4]\n\t"
  75851. #ifdef WOLFSSL_KEIL
  75852. "sbcs r5, r5, r6\n\t"
  75853. #elif defined(__clang__)
  75854. "sbcs r5, r6\n\t"
  75855. #else
  75856. "sbc r5, r6\n\t"
  75857. #endif
  75858. "stm %[a]!, {r5}\n\t"
  75859. "ldm %[m]!, {r6}\n\t"
  75860. #ifdef WOLFSSL_KEIL
  75861. "ands r6, r6, r7\n\t"
  75862. #elif defined(__clang__)
  75863. "ands r6, r7\n\t"
  75864. #else
  75865. "and r6, r7\n\t"
  75866. #endif
  75867. "ldr r5, [%[a], r4]\n\t"
  75868. #ifdef WOLFSSL_KEIL
  75869. "sbcs r5, r5, r6\n\t"
  75870. #elif defined(__clang__)
  75871. "sbcs r5, r6\n\t"
  75872. #else
  75873. "sbc r5, r6\n\t"
  75874. #endif
  75875. "stm %[a]!, {r5}\n\t"
  75876. "ldm %[m]!, {r6}\n\t"
  75877. #ifdef WOLFSSL_KEIL
  75878. "ands r6, r6, r7\n\t"
  75879. #elif defined(__clang__)
  75880. "ands r6, r7\n\t"
  75881. #else
  75882. "and r6, r7\n\t"
  75883. #endif
  75884. "ldr r5, [%[a], r4]\n\t"
  75885. #ifdef WOLFSSL_KEIL
  75886. "sbcs r5, r5, r6\n\t"
  75887. #elif defined(__clang__)
  75888. "sbcs r5, r6\n\t"
  75889. #else
  75890. "sbc r5, r6\n\t"
  75891. #endif
  75892. "stm %[a]!, {r5}\n\t"
  75893. "ldm %[m]!, {r6}\n\t"
  75894. #ifdef WOLFSSL_KEIL
  75895. "ands r6, r6, r7\n\t"
  75896. #elif defined(__clang__)
  75897. "ands r6, r7\n\t"
  75898. #else
  75899. "and r6, r7\n\t"
  75900. #endif
  75901. "ldr r5, [%[a], r4]\n\t"
  75902. #ifdef WOLFSSL_KEIL
  75903. "sbcs r5, r5, r6\n\t"
  75904. #elif defined(__clang__)
  75905. "sbcs r5, r6\n\t"
  75906. #else
  75907. "sbc r5, r6\n\t"
  75908. #endif
  75909. "stm %[a]!, {r5}\n\t"
  75910. "ldm %[m]!, {r6}\n\t"
  75911. #ifdef WOLFSSL_KEIL
  75912. "ands r6, r6, r7\n\t"
  75913. #elif defined(__clang__)
  75914. "ands r6, r7\n\t"
  75915. #else
  75916. "and r6, r7\n\t"
  75917. #endif
  75918. "ldr r5, [%[a], r4]\n\t"
  75919. #ifdef WOLFSSL_KEIL
  75920. "sbcs r5, r5, r6\n\t"
  75921. #elif defined(__clang__)
  75922. "sbcs r5, r6\n\t"
  75923. #else
  75924. "sbc r5, r6\n\t"
  75925. #endif
  75926. "stm %[a]!, {r5}\n\t"
  75927. "ldm %[m]!, {r6}\n\t"
  75928. #ifdef WOLFSSL_KEIL
  75929. "ands r6, r6, r7\n\t"
  75930. #elif defined(__clang__)
  75931. "ands r6, r7\n\t"
  75932. #else
  75933. "and r6, r7\n\t"
  75934. #endif
  75935. "ldr r5, [%[a], r4]\n\t"
  75936. #ifdef WOLFSSL_KEIL
  75937. "sbcs r5, r5, r6\n\t"
  75938. #elif defined(__clang__)
  75939. "sbcs r5, r6\n\t"
  75940. #else
  75941. "sbc r5, r6\n\t"
  75942. #endif
  75943. "stm %[a]!, {r5}\n\t"
  75944. "ldm %[m]!, {r6}\n\t"
  75945. #ifdef WOLFSSL_KEIL
  75946. "ands r6, r6, r7\n\t"
  75947. #elif defined(__clang__)
  75948. "ands r6, r7\n\t"
  75949. #else
  75950. "and r6, r7\n\t"
  75951. #endif
  75952. "ldr r5, [%[a], r4]\n\t"
  75953. #ifdef WOLFSSL_KEIL
  75954. "sbcs r5, r5, r6\n\t"
  75955. #elif defined(__clang__)
  75956. "sbcs r5, r6\n\t"
  75957. #else
  75958. "sbc r5, r6\n\t"
  75959. #endif
  75960. "stm %[a]!, {r5}\n\t"
  75961. "ldm %[m]!, {r6}\n\t"
  75962. #ifdef WOLFSSL_KEIL
  75963. "ands r6, r6, r7\n\t"
  75964. #elif defined(__clang__)
  75965. "ands r6, r7\n\t"
  75966. #else
  75967. "and r6, r7\n\t"
  75968. #endif
  75969. "ldr r5, [%[a], r4]\n\t"
  75970. #ifdef WOLFSSL_KEIL
  75971. "sbcs r5, r5, r6\n\t"
  75972. #elif defined(__clang__)
  75973. "sbcs r5, r6\n\t"
  75974. #else
  75975. "sbc r5, r6\n\t"
  75976. #endif
  75977. "stm %[a]!, {r5}\n\t"
  75978. "ldm %[m]!, {r6}\n\t"
  75979. #ifdef WOLFSSL_KEIL
  75980. "ands r6, r6, r7\n\t"
  75981. #elif defined(__clang__)
  75982. "ands r6, r7\n\t"
  75983. #else
  75984. "and r6, r7\n\t"
  75985. #endif
  75986. "ldr r5, [%[a], r4]\n\t"
  75987. #ifdef WOLFSSL_KEIL
  75988. "sbcs r5, r5, r6\n\t"
  75989. #elif defined(__clang__)
  75990. "sbcs r5, r6\n\t"
  75991. #else
  75992. "sbc r5, r6\n\t"
  75993. #endif
  75994. "stm %[a]!, {r5}\n\t"
  75995. "ldm %[m]!, {r6}\n\t"
  75996. #ifdef WOLFSSL_KEIL
  75997. "ands r6, r6, r7\n\t"
  75998. #elif defined(__clang__)
  75999. "ands r6, r7\n\t"
  76000. #else
  76001. "and r6, r7\n\t"
  76002. #endif
  76003. "ldr r5, [%[a], r4]\n\t"
  76004. #ifdef WOLFSSL_KEIL
  76005. "sbcs r5, r5, r6\n\t"
  76006. #elif defined(__clang__)
  76007. "sbcs r5, r6\n\t"
  76008. #else
  76009. "sbc r5, r6\n\t"
  76010. #endif
  76011. "stm %[a]!, {r5}\n\t"
  76012. "ldm %[m]!, {r6}\n\t"
  76013. #ifdef WOLFSSL_KEIL
  76014. "ands r6, r6, r7\n\t"
  76015. #elif defined(__clang__)
  76016. "ands r6, r7\n\t"
  76017. #else
  76018. "and r6, r7\n\t"
  76019. #endif
  76020. "ldr r5, [%[a], r4]\n\t"
  76021. #ifdef WOLFSSL_KEIL
  76022. "sbcs r5, r5, r6\n\t"
  76023. #elif defined(__clang__)
  76024. "sbcs r5, r6\n\t"
  76025. #else
  76026. "sbc r5, r6\n\t"
  76027. #endif
  76028. "stm %[a]!, {r5}\n\t"
  76029. "ldm %[m]!, {r6}\n\t"
  76030. #ifdef WOLFSSL_KEIL
  76031. "ands r6, r6, r7\n\t"
  76032. #elif defined(__clang__)
  76033. "ands r6, r7\n\t"
  76034. #else
  76035. "and r6, r7\n\t"
  76036. #endif
  76037. "ldr r5, [%[a], r4]\n\t"
  76038. #ifdef WOLFSSL_KEIL
  76039. "sbcs r5, r5, r6\n\t"
  76040. #elif defined(__clang__)
  76041. "sbcs r5, r6\n\t"
  76042. #else
  76043. "sbc r5, r6\n\t"
  76044. #endif
  76045. "stm %[a]!, {r5}\n\t"
  76046. "ldm %[m]!, {r6}\n\t"
  76047. #ifdef WOLFSSL_KEIL
  76048. "ands r6, r6, r7\n\t"
  76049. #elif defined(__clang__)
  76050. "ands r6, r7\n\t"
  76051. #else
  76052. "and r6, r7\n\t"
  76053. #endif
  76054. "ldr r5, [%[a], r4]\n\t"
  76055. #ifdef WOLFSSL_KEIL
  76056. "sbcs r5, r5, r6\n\t"
  76057. #elif defined(__clang__)
  76058. "sbcs r5, r6\n\t"
  76059. #else
  76060. "sbc r5, r6\n\t"
  76061. #endif
  76062. "stm %[a]!, {r5}\n\t"
  76063. "ldm %[m]!, {r6}\n\t"
  76064. #ifdef WOLFSSL_KEIL
  76065. "ands r6, r6, r7\n\t"
  76066. #elif defined(__clang__)
  76067. "ands r6, r7\n\t"
  76068. #else
  76069. "and r6, r7\n\t"
  76070. #endif
  76071. "ldr r5, [%[a], r4]\n\t"
  76072. #ifdef WOLFSSL_KEIL
  76073. "sbcs r5, r5, r6\n\t"
  76074. #elif defined(__clang__)
  76075. "sbcs r5, r6\n\t"
  76076. #else
  76077. "sbc r5, r6\n\t"
  76078. #endif
  76079. "stm %[a]!, {r5}\n\t"
  76080. "ldm %[m]!, {r6}\n\t"
  76081. #ifdef WOLFSSL_KEIL
  76082. "ands r6, r6, r7\n\t"
  76083. #elif defined(__clang__)
  76084. "ands r6, r7\n\t"
  76085. #else
  76086. "and r6, r7\n\t"
  76087. #endif
  76088. "ldr r5, [%[a], r4]\n\t"
  76089. #ifdef WOLFSSL_KEIL
  76090. "sbcs r5, r5, r6\n\t"
  76091. #elif defined(__clang__)
  76092. "sbcs r5, r6\n\t"
  76093. #else
  76094. "sbc r5, r6\n\t"
  76095. #endif
  76096. "stm %[a]!, {r5}\n\t"
  76097. "ldm %[m]!, {r6}\n\t"
  76098. #ifdef WOLFSSL_KEIL
  76099. "ands r6, r6, r7\n\t"
  76100. #elif defined(__clang__)
  76101. "ands r6, r7\n\t"
  76102. #else
  76103. "and r6, r7\n\t"
  76104. #endif
  76105. "ldr r5, [%[a], r4]\n\t"
  76106. #ifdef WOLFSSL_KEIL
  76107. "sbcs r5, r5, r6\n\t"
  76108. #elif defined(__clang__)
  76109. "sbcs r5, r6\n\t"
  76110. #else
  76111. "sbc r5, r6\n\t"
  76112. #endif
  76113. "stm %[a]!, {r5}\n\t"
  76114. "ldm %[m]!, {r6}\n\t"
  76115. #ifdef WOLFSSL_KEIL
  76116. "ands r6, r6, r7\n\t"
  76117. #elif defined(__clang__)
  76118. "ands r6, r7\n\t"
  76119. #else
  76120. "and r6, r7\n\t"
  76121. #endif
  76122. "ldr r5, [%[a], r4]\n\t"
  76123. #ifdef WOLFSSL_KEIL
  76124. "sbcs r5, r5, r6\n\t"
  76125. #elif defined(__clang__)
  76126. "sbcs r5, r6\n\t"
  76127. #else
  76128. "sbc r5, r6\n\t"
  76129. #endif
  76130. "stm %[a]!, {r5}\n\t"
  76131. "ldm %[m]!, {r6}\n\t"
  76132. #ifdef WOLFSSL_KEIL
  76133. "ands r6, r6, r7\n\t"
  76134. #elif defined(__clang__)
  76135. "ands r6, r7\n\t"
  76136. #else
  76137. "and r6, r7\n\t"
  76138. #endif
  76139. "ldr r5, [%[a], r4]\n\t"
  76140. #ifdef WOLFSSL_KEIL
  76141. "sbcs r5, r5, r6\n\t"
  76142. #elif defined(__clang__)
  76143. "sbcs r5, r6\n\t"
  76144. #else
  76145. "sbc r5, r6\n\t"
  76146. #endif
  76147. "stm %[a]!, {r5}\n\t"
  76148. "ldm %[m]!, {r6}\n\t"
  76149. #ifdef WOLFSSL_KEIL
  76150. "ands r6, r6, r7\n\t"
  76151. #elif defined(__clang__)
  76152. "ands r6, r7\n\t"
  76153. #else
  76154. "and r6, r7\n\t"
  76155. #endif
  76156. "ldr r5, [%[a], r4]\n\t"
  76157. #ifdef WOLFSSL_KEIL
  76158. "sbcs r5, r5, r6\n\t"
  76159. #elif defined(__clang__)
  76160. "sbcs r5, r6\n\t"
  76161. #else
  76162. "sbc r5, r6\n\t"
  76163. #endif
  76164. "stm %[a]!, {r5}\n\t"
  76165. "ldm %[m]!, {r6}\n\t"
  76166. #ifdef WOLFSSL_KEIL
  76167. "ands r6, r6, r7\n\t"
  76168. #elif defined(__clang__)
  76169. "ands r6, r7\n\t"
  76170. #else
  76171. "and r6, r7\n\t"
  76172. #endif
  76173. "ldr r5, [%[a], r4]\n\t"
  76174. #ifdef WOLFSSL_KEIL
  76175. "sbcs r5, r5, r6\n\t"
  76176. #elif defined(__clang__)
  76177. "sbcs r5, r6\n\t"
  76178. #else
  76179. "sbc r5, r6\n\t"
  76180. #endif
  76181. "stm %[a]!, {r5}\n\t"
  76182. "ldm %[m]!, {r6}\n\t"
  76183. #ifdef WOLFSSL_KEIL
  76184. "ands r6, r6, r7\n\t"
  76185. #elif defined(__clang__)
  76186. "ands r6, r7\n\t"
  76187. #else
  76188. "and r6, r7\n\t"
  76189. #endif
  76190. "ldr r5, [%[a], r4]\n\t"
  76191. #ifdef WOLFSSL_KEIL
  76192. "sbcs r5, r5, r6\n\t"
  76193. #elif defined(__clang__)
  76194. "sbcs r5, r6\n\t"
  76195. #else
  76196. "sbc r5, r6\n\t"
  76197. #endif
  76198. "stm %[a]!, {r5}\n\t"
  76199. "ldm %[m]!, {r6}\n\t"
  76200. #ifdef WOLFSSL_KEIL
  76201. "ands r6, r6, r7\n\t"
  76202. #elif defined(__clang__)
  76203. "ands r6, r7\n\t"
  76204. #else
  76205. "and r6, r7\n\t"
  76206. #endif
  76207. "ldr r5, [%[a], r4]\n\t"
  76208. #ifdef WOLFSSL_KEIL
  76209. "sbcs r5, r5, r6\n\t"
  76210. #elif defined(__clang__)
  76211. "sbcs r5, r6\n\t"
  76212. #else
  76213. "sbc r5, r6\n\t"
  76214. #endif
  76215. "stm %[a]!, {r5}\n\t"
  76216. "ldm %[m]!, {r6}\n\t"
  76217. #ifdef WOLFSSL_KEIL
  76218. "ands r6, r6, r7\n\t"
  76219. #elif defined(__clang__)
  76220. "ands r6, r7\n\t"
  76221. #else
  76222. "and r6, r7\n\t"
  76223. #endif
  76224. "ldr r5, [%[a], r4]\n\t"
  76225. #ifdef WOLFSSL_KEIL
  76226. "sbcs r5, r5, r6\n\t"
  76227. #elif defined(__clang__)
  76228. "sbcs r5, r6\n\t"
  76229. #else
  76230. "sbc r5, r6\n\t"
  76231. #endif
  76232. "stm %[a]!, {r5}\n\t"
  76233. "ldm %[m]!, {r6}\n\t"
  76234. #ifdef WOLFSSL_KEIL
  76235. "ands r6, r6, r7\n\t"
  76236. #elif defined(__clang__)
  76237. "ands r6, r7\n\t"
  76238. #else
  76239. "and r6, r7\n\t"
  76240. #endif
  76241. "ldr r5, [%[a], r4]\n\t"
  76242. #ifdef WOLFSSL_KEIL
  76243. "sbcs r5, r5, r6\n\t"
  76244. #elif defined(__clang__)
  76245. "sbcs r5, r6\n\t"
  76246. #else
  76247. "sbc r5, r6\n\t"
  76248. #endif
  76249. "stm %[a]!, {r5}\n\t"
  76250. "ldm %[m]!, {r6}\n\t"
  76251. #ifdef WOLFSSL_KEIL
  76252. "ands r6, r6, r7\n\t"
  76253. #elif defined(__clang__)
  76254. "ands r6, r7\n\t"
  76255. #else
  76256. "and r6, r7\n\t"
  76257. #endif
  76258. "ldr r5, [%[a], r4]\n\t"
  76259. #ifdef WOLFSSL_KEIL
  76260. "sbcs r5, r5, r6\n\t"
  76261. #elif defined(__clang__)
  76262. "sbcs r5, r6\n\t"
  76263. #else
  76264. "sbc r5, r6\n\t"
  76265. #endif
  76266. "stm %[a]!, {r5}\n\t"
  76267. "ldm %[m]!, {r6}\n\t"
  76268. #ifdef WOLFSSL_KEIL
  76269. "ands r6, r6, r7\n\t"
  76270. #elif defined(__clang__)
  76271. "ands r6, r7\n\t"
  76272. #else
  76273. "and r6, r7\n\t"
  76274. #endif
  76275. "ldr r5, [%[a], r4]\n\t"
  76276. #ifdef WOLFSSL_KEIL
  76277. "sbcs r5, r5, r6\n\t"
  76278. #elif defined(__clang__)
  76279. "sbcs r5, r6\n\t"
  76280. #else
  76281. "sbc r5, r6\n\t"
  76282. #endif
  76283. "stm %[a]!, {r5}\n\t"
  76284. "ldm %[m]!, {r6}\n\t"
  76285. #ifdef WOLFSSL_KEIL
  76286. "ands r6, r6, r7\n\t"
  76287. #elif defined(__clang__)
  76288. "ands r6, r7\n\t"
  76289. #else
  76290. "and r6, r7\n\t"
  76291. #endif
  76292. "ldr r5, [%[a], r4]\n\t"
  76293. #ifdef WOLFSSL_KEIL
  76294. "sbcs r5, r5, r6\n\t"
  76295. #elif defined(__clang__)
  76296. "sbcs r5, r6\n\t"
  76297. #else
  76298. "sbc r5, r6\n\t"
  76299. #endif
  76300. "stm %[a]!, {r5}\n\t"
  76301. "ldm %[m]!, {r6}\n\t"
  76302. #ifdef WOLFSSL_KEIL
  76303. "ands r6, r6, r7\n\t"
  76304. #elif defined(__clang__)
  76305. "ands r6, r7\n\t"
  76306. #else
  76307. "and r6, r7\n\t"
  76308. #endif
  76309. "ldr r5, [%[a], r4]\n\t"
  76310. #ifdef WOLFSSL_KEIL
  76311. "sbcs r5, r5, r6\n\t"
  76312. #elif defined(__clang__)
  76313. "sbcs r5, r6\n\t"
  76314. #else
  76315. "sbc r5, r6\n\t"
  76316. #endif
  76317. "stm %[a]!, {r5}\n\t"
  76318. "ldm %[m]!, {r6}\n\t"
  76319. #ifdef WOLFSSL_KEIL
  76320. "ands r6, r6, r7\n\t"
  76321. #elif defined(__clang__)
  76322. "ands r6, r7\n\t"
  76323. #else
  76324. "and r6, r7\n\t"
  76325. #endif
  76326. "ldr r5, [%[a], r4]\n\t"
  76327. #ifdef WOLFSSL_KEIL
  76328. "sbcs r5, r5, r6\n\t"
  76329. #elif defined(__clang__)
  76330. "sbcs r5, r6\n\t"
  76331. #else
  76332. "sbc r5, r6\n\t"
  76333. #endif
  76334. "stm %[a]!, {r5}\n\t"
  76335. "ldm %[m]!, {r6}\n\t"
  76336. #ifdef WOLFSSL_KEIL
  76337. "ands r6, r6, r7\n\t"
  76338. #elif defined(__clang__)
  76339. "ands r6, r7\n\t"
  76340. #else
  76341. "and r6, r7\n\t"
  76342. #endif
  76343. "ldr r5, [%[a], r4]\n\t"
  76344. #ifdef WOLFSSL_KEIL
  76345. "sbcs r5, r5, r6\n\t"
  76346. #elif defined(__clang__)
  76347. "sbcs r5, r6\n\t"
  76348. #else
  76349. "sbc r5, r6\n\t"
  76350. #endif
  76351. "stm %[a]!, {r5}\n\t"
  76352. "ldm %[m]!, {r6}\n\t"
  76353. #ifdef WOLFSSL_KEIL
  76354. "ands r6, r6, r7\n\t"
  76355. #elif defined(__clang__)
  76356. "ands r6, r7\n\t"
  76357. #else
  76358. "and r6, r7\n\t"
  76359. #endif
  76360. "ldr r5, [%[a], r4]\n\t"
  76361. #ifdef WOLFSSL_KEIL
  76362. "sbcs r5, r5, r6\n\t"
  76363. #elif defined(__clang__)
  76364. "sbcs r5, r6\n\t"
  76365. #else
  76366. "sbc r5, r6\n\t"
  76367. #endif
  76368. "stm %[a]!, {r5}\n\t"
  76369. "ldm %[m]!, {r6}\n\t"
  76370. #ifdef WOLFSSL_KEIL
  76371. "ands r6, r6, r7\n\t"
  76372. #elif defined(__clang__)
  76373. "ands r6, r7\n\t"
  76374. #else
  76375. "and r6, r7\n\t"
  76376. #endif
  76377. "ldr r5, [%[a], r4]\n\t"
  76378. #ifdef WOLFSSL_KEIL
  76379. "sbcs r5, r5, r6\n\t"
  76380. #elif defined(__clang__)
  76381. "sbcs r5, r6\n\t"
  76382. #else
  76383. "sbc r5, r6\n\t"
  76384. #endif
  76385. "stm %[a]!, {r5}\n\t"
  76386. "ldm %[m]!, {r6}\n\t"
  76387. #ifdef WOLFSSL_KEIL
  76388. "ands r6, r6, r7\n\t"
  76389. #elif defined(__clang__)
  76390. "ands r6, r7\n\t"
  76391. #else
  76392. "and r6, r7\n\t"
  76393. #endif
  76394. "ldr r5, [%[a], r4]\n\t"
  76395. #ifdef WOLFSSL_KEIL
  76396. "sbcs r5, r5, r6\n\t"
  76397. #elif defined(__clang__)
  76398. "sbcs r5, r6\n\t"
  76399. #else
  76400. "sbc r5, r6\n\t"
  76401. #endif
  76402. "stm %[a]!, {r5}\n\t"
  76403. "ldm %[m]!, {r6}\n\t"
  76404. #ifdef WOLFSSL_KEIL
  76405. "ands r6, r6, r7\n\t"
  76406. #elif defined(__clang__)
  76407. "ands r6, r7\n\t"
  76408. #else
  76409. "and r6, r7\n\t"
  76410. #endif
  76411. "ldr r5, [%[a], r4]\n\t"
  76412. #ifdef WOLFSSL_KEIL
  76413. "sbcs r5, r5, r6\n\t"
  76414. #elif defined(__clang__)
  76415. "sbcs r5, r6\n\t"
  76416. #else
  76417. "sbc r5, r6\n\t"
  76418. #endif
  76419. "stm %[a]!, {r5}\n\t"
  76420. "ldm %[m]!, {r6}\n\t"
  76421. #ifdef WOLFSSL_KEIL
  76422. "ands r6, r6, r7\n\t"
  76423. #elif defined(__clang__)
  76424. "ands r6, r7\n\t"
  76425. #else
  76426. "and r6, r7\n\t"
  76427. #endif
  76428. "ldr r5, [%[a], r4]\n\t"
  76429. #ifdef WOLFSSL_KEIL
  76430. "sbcs r5, r5, r6\n\t"
  76431. #elif defined(__clang__)
  76432. "sbcs r5, r6\n\t"
  76433. #else
  76434. "sbc r5, r6\n\t"
  76435. #endif
  76436. "stm %[a]!, {r5}\n\t"
  76437. "ldm %[m]!, {r6}\n\t"
  76438. #ifdef WOLFSSL_KEIL
  76439. "ands r6, r6, r7\n\t"
  76440. #elif defined(__clang__)
  76441. "ands r6, r7\n\t"
  76442. #else
  76443. "and r6, r7\n\t"
  76444. #endif
  76445. "ldr r5, [%[a], r4]\n\t"
  76446. #ifdef WOLFSSL_KEIL
  76447. "sbcs r5, r5, r6\n\t"
  76448. #elif defined(__clang__)
  76449. "sbcs r5, r6\n\t"
  76450. #else
  76451. "sbc r5, r6\n\t"
  76452. #endif
  76453. "stm %[a]!, {r5}\n\t"
  76454. "ldm %[m]!, {r6}\n\t"
  76455. #ifdef WOLFSSL_KEIL
  76456. "ands r6, r6, r7\n\t"
  76457. #elif defined(__clang__)
  76458. "ands r6, r7\n\t"
  76459. #else
  76460. "and r6, r7\n\t"
  76461. #endif
  76462. "ldr r5, [%[a], r4]\n\t"
  76463. #ifdef WOLFSSL_KEIL
  76464. "sbcs r5, r5, r6\n\t"
  76465. #elif defined(__clang__)
  76466. "sbcs r5, r6\n\t"
  76467. #else
  76468. "sbc r5, r6\n\t"
  76469. #endif
  76470. "stm %[a]!, {r5}\n\t"
  76471. "ldm %[m]!, {r6}\n\t"
  76472. #ifdef WOLFSSL_KEIL
  76473. "ands r6, r6, r7\n\t"
  76474. #elif defined(__clang__)
  76475. "ands r6, r7\n\t"
  76476. #else
  76477. "and r6, r7\n\t"
  76478. #endif
  76479. "ldr r5, [%[a], r4]\n\t"
  76480. #ifdef WOLFSSL_KEIL
  76481. "sbcs r5, r5, r6\n\t"
  76482. #elif defined(__clang__)
  76483. "sbcs r5, r6\n\t"
  76484. #else
  76485. "sbc r5, r6\n\t"
  76486. #endif
  76487. "stm %[a]!, {r5}\n\t"
  76488. "ldm %[m]!, {r6}\n\t"
  76489. #ifdef WOLFSSL_KEIL
  76490. "ands r6, r6, r7\n\t"
  76491. #elif defined(__clang__)
  76492. "ands r6, r7\n\t"
  76493. #else
  76494. "and r6, r7\n\t"
  76495. #endif
  76496. "ldr r5, [%[a], r4]\n\t"
  76497. #ifdef WOLFSSL_KEIL
  76498. "sbcs r5, r5, r6\n\t"
  76499. #elif defined(__clang__)
  76500. "sbcs r5, r6\n\t"
  76501. #else
  76502. "sbc r5, r6\n\t"
  76503. #endif
  76504. "stm %[a]!, {r5}\n\t"
  76505. "ldm %[m]!, {r6}\n\t"
  76506. #ifdef WOLFSSL_KEIL
  76507. "ands r6, r6, r7\n\t"
  76508. #elif defined(__clang__)
  76509. "ands r6, r7\n\t"
  76510. #else
  76511. "and r6, r7\n\t"
  76512. #endif
  76513. "ldr r5, [%[a], r4]\n\t"
  76514. #ifdef WOLFSSL_KEIL
  76515. "sbcs r5, r5, r6\n\t"
  76516. #elif defined(__clang__)
  76517. "sbcs r5, r6\n\t"
  76518. #else
  76519. "sbc r5, r6\n\t"
  76520. #endif
  76521. "stm %[a]!, {r5}\n\t"
  76522. "ldm %[m]!, {r6}\n\t"
  76523. #ifdef WOLFSSL_KEIL
  76524. "ands r6, r6, r7\n\t"
  76525. #elif defined(__clang__)
  76526. "ands r6, r7\n\t"
  76527. #else
  76528. "and r6, r7\n\t"
  76529. #endif
  76530. "ldr r5, [%[a], r4]\n\t"
  76531. #ifdef WOLFSSL_KEIL
  76532. "sbcs r5, r5, r6\n\t"
  76533. #elif defined(__clang__)
  76534. "sbcs r5, r6\n\t"
  76535. #else
  76536. "sbc r5, r6\n\t"
  76537. #endif
  76538. "stm %[a]!, {r5}\n\t"
  76539. "ldm %[m]!, {r6}\n\t"
  76540. #ifdef WOLFSSL_KEIL
  76541. "ands r6, r6, r7\n\t"
  76542. #elif defined(__clang__)
  76543. "ands r6, r7\n\t"
  76544. #else
  76545. "and r6, r7\n\t"
  76546. #endif
  76547. "ldr r5, [%[a], r4]\n\t"
  76548. #ifdef WOLFSSL_KEIL
  76549. "sbcs r5, r5, r6\n\t"
  76550. #elif defined(__clang__)
  76551. "sbcs r5, r6\n\t"
  76552. #else
  76553. "sbc r5, r6\n\t"
  76554. #endif
  76555. "stm %[a]!, {r5}\n\t"
  76556. "ldm %[m]!, {r6}\n\t"
  76557. #ifdef WOLFSSL_KEIL
  76558. "ands r6, r6, r7\n\t"
  76559. #elif defined(__clang__)
  76560. "ands r6, r7\n\t"
  76561. #else
  76562. "and r6, r7\n\t"
  76563. #endif
  76564. "ldr r5, [%[a], r4]\n\t"
  76565. #ifdef WOLFSSL_KEIL
  76566. "sbcs r5, r5, r6\n\t"
  76567. #elif defined(__clang__)
  76568. "sbcs r5, r6\n\t"
  76569. #else
  76570. "sbc r5, r6\n\t"
  76571. #endif
  76572. "stm %[a]!, {r5}\n\t"
  76573. "ldm %[m]!, {r6}\n\t"
  76574. #ifdef WOLFSSL_KEIL
  76575. "ands r6, r6, r7\n\t"
  76576. #elif defined(__clang__)
  76577. "ands r6, r7\n\t"
  76578. #else
  76579. "and r6, r7\n\t"
  76580. #endif
  76581. "ldr r5, [%[a], r4]\n\t"
  76582. #ifdef WOLFSSL_KEIL
  76583. "sbcs r5, r5, r6\n\t"
  76584. #elif defined(__clang__)
  76585. "sbcs r5, r6\n\t"
  76586. #else
  76587. "sbc r5, r6\n\t"
  76588. #endif
  76589. "stm %[a]!, {r5}\n\t"
  76590. "ldm %[m]!, {r6}\n\t"
  76591. #ifdef WOLFSSL_KEIL
  76592. "ands r6, r6, r7\n\t"
  76593. #elif defined(__clang__)
  76594. "ands r6, r7\n\t"
  76595. #else
  76596. "and r6, r7\n\t"
  76597. #endif
  76598. "ldr r5, [%[a], r4]\n\t"
  76599. #ifdef WOLFSSL_KEIL
  76600. "sbcs r5, r5, r6\n\t"
  76601. #elif defined(__clang__)
  76602. "sbcs r5, r6\n\t"
  76603. #else
  76604. "sbc r5, r6\n\t"
  76605. #endif
  76606. "stm %[a]!, {r5}\n\t"
  76607. "ldm %[m]!, {r6}\n\t"
  76608. #ifdef WOLFSSL_KEIL
  76609. "ands r6, r6, r7\n\t"
  76610. #elif defined(__clang__)
  76611. "ands r6, r7\n\t"
  76612. #else
  76613. "and r6, r7\n\t"
  76614. #endif
  76615. "ldr r5, [%[a], r4]\n\t"
  76616. #ifdef WOLFSSL_KEIL
  76617. "sbcs r5, r5, r6\n\t"
  76618. #elif defined(__clang__)
  76619. "sbcs r5, r6\n\t"
  76620. #else
  76621. "sbc r5, r6\n\t"
  76622. #endif
  76623. "stm %[a]!, {r5}\n\t"
  76624. "ldm %[m]!, {r6}\n\t"
  76625. #ifdef WOLFSSL_KEIL
  76626. "ands r6, r6, r7\n\t"
  76627. #elif defined(__clang__)
  76628. "ands r6, r7\n\t"
  76629. #else
  76630. "and r6, r7\n\t"
  76631. #endif
  76632. "ldr r5, [%[a], r4]\n\t"
  76633. #ifdef WOLFSSL_KEIL
  76634. "sbcs r5, r5, r6\n\t"
  76635. #elif defined(__clang__)
  76636. "sbcs r5, r6\n\t"
  76637. #else
  76638. "sbc r5, r6\n\t"
  76639. #endif
  76640. "stm %[a]!, {r5}\n\t"
  76641. "ldm %[m]!, {r6}\n\t"
  76642. #ifdef WOLFSSL_KEIL
  76643. "ands r6, r6, r7\n\t"
  76644. #elif defined(__clang__)
  76645. "ands r6, r7\n\t"
  76646. #else
  76647. "and r6, r7\n\t"
  76648. #endif
  76649. "ldr r5, [%[a], r4]\n\t"
  76650. #ifdef WOLFSSL_KEIL
  76651. "sbcs r5, r5, r6\n\t"
  76652. #elif defined(__clang__)
  76653. "sbcs r5, r6\n\t"
  76654. #else
  76655. "sbc r5, r6\n\t"
  76656. #endif
  76657. "stm %[a]!, {r5}\n\t"
  76658. "ldm %[m]!, {r6}\n\t"
  76659. #ifdef WOLFSSL_KEIL
  76660. "ands r6, r6, r7\n\t"
  76661. #elif defined(__clang__)
  76662. "ands r6, r7\n\t"
  76663. #else
  76664. "and r6, r7\n\t"
  76665. #endif
  76666. "ldr r5, [%[a], r4]\n\t"
  76667. #ifdef WOLFSSL_KEIL
  76668. "sbcs r5, r5, r6\n\t"
  76669. #elif defined(__clang__)
  76670. "sbcs r5, r6\n\t"
  76671. #else
  76672. "sbc r5, r6\n\t"
  76673. #endif
  76674. "stm %[a]!, {r5}\n\t"
  76675. "ldm %[m]!, {r6}\n\t"
  76676. #ifdef WOLFSSL_KEIL
  76677. "ands r6, r6, r7\n\t"
  76678. #elif defined(__clang__)
  76679. "ands r6, r7\n\t"
  76680. #else
  76681. "and r6, r7\n\t"
  76682. #endif
  76683. "ldr r5, [%[a], r4]\n\t"
  76684. #ifdef WOLFSSL_KEIL
  76685. "sbcs r5, r5, r6\n\t"
  76686. #elif defined(__clang__)
  76687. "sbcs r5, r6\n\t"
  76688. #else
  76689. "sbc r5, r6\n\t"
  76690. #endif
  76691. "stm %[a]!, {r5}\n\t"
  76692. "ldm %[m]!, {r6}\n\t"
  76693. #ifdef WOLFSSL_KEIL
  76694. "ands r6, r6, r7\n\t"
  76695. #elif defined(__clang__)
  76696. "ands r6, r7\n\t"
  76697. #else
  76698. "and r6, r7\n\t"
  76699. #endif
  76700. "ldr r5, [%[a], r4]\n\t"
  76701. #ifdef WOLFSSL_KEIL
  76702. "sbcs r5, r5, r6\n\t"
  76703. #elif defined(__clang__)
  76704. "sbcs r5, r6\n\t"
  76705. #else
  76706. "sbc r5, r6\n\t"
  76707. #endif
  76708. "stm %[a]!, {r5}\n\t"
  76709. "ldm %[m]!, {r6}\n\t"
  76710. #ifdef WOLFSSL_KEIL
  76711. "ands r6, r6, r7\n\t"
  76712. #elif defined(__clang__)
  76713. "ands r6, r7\n\t"
  76714. #else
  76715. "and r6, r7\n\t"
  76716. #endif
  76717. "ldr r5, [%[a], r4]\n\t"
  76718. #ifdef WOLFSSL_KEIL
  76719. "sbcs r5, r5, r6\n\t"
  76720. #elif defined(__clang__)
  76721. "sbcs r5, r6\n\t"
  76722. #else
  76723. "sbc r5, r6\n\t"
  76724. #endif
  76725. "stm %[a]!, {r5}\n\t"
  76726. "ldm %[m]!, {r6}\n\t"
  76727. #ifdef WOLFSSL_KEIL
  76728. "ands r6, r6, r7\n\t"
  76729. #elif defined(__clang__)
  76730. "ands r6, r7\n\t"
  76731. #else
  76732. "and r6, r7\n\t"
  76733. #endif
  76734. "ldr r5, [%[a], r4]\n\t"
  76735. #ifdef WOLFSSL_KEIL
  76736. "sbcs r5, r5, r6\n\t"
  76737. #elif defined(__clang__)
  76738. "sbcs r5, r6\n\t"
  76739. #else
  76740. "sbc r5, r6\n\t"
  76741. #endif
  76742. "stm %[a]!, {r5}\n\t"
  76743. "ldm %[m]!, {r6}\n\t"
  76744. #ifdef WOLFSSL_KEIL
  76745. "ands r6, r6, r7\n\t"
  76746. #elif defined(__clang__)
  76747. "ands r6, r7\n\t"
  76748. #else
  76749. "and r6, r7\n\t"
  76750. #endif
  76751. "ldr r5, [%[a], r4]\n\t"
  76752. #ifdef WOLFSSL_KEIL
  76753. "sbcs r5, r5, r6\n\t"
  76754. #elif defined(__clang__)
  76755. "sbcs r5, r6\n\t"
  76756. #else
  76757. "sbc r5, r6\n\t"
  76758. #endif
  76759. "stm %[a]!, {r5}\n\t"
  76760. "ldm %[m]!, {r6}\n\t"
  76761. #ifdef WOLFSSL_KEIL
  76762. "ands r6, r6, r7\n\t"
  76763. #elif defined(__clang__)
  76764. "ands r6, r7\n\t"
  76765. #else
  76766. "and r6, r7\n\t"
  76767. #endif
  76768. "ldr r5, [%[a], r4]\n\t"
  76769. #ifdef WOLFSSL_KEIL
  76770. "sbcs r5, r5, r6\n\t"
  76771. #elif defined(__clang__)
  76772. "sbcs r5, r6\n\t"
  76773. #else
  76774. "sbc r5, r6\n\t"
  76775. #endif
  76776. "stm %[a]!, {r5}\n\t"
  76777. "ldm %[m]!, {r6}\n\t"
  76778. #ifdef WOLFSSL_KEIL
  76779. "ands r6, r6, r7\n\t"
  76780. #elif defined(__clang__)
  76781. "ands r6, r7\n\t"
  76782. #else
  76783. "and r6, r7\n\t"
  76784. #endif
  76785. "ldr r5, [%[a], r4]\n\t"
  76786. #ifdef WOLFSSL_KEIL
  76787. "sbcs r5, r5, r6\n\t"
  76788. #elif defined(__clang__)
  76789. "sbcs r5, r6\n\t"
  76790. #else
  76791. "sbc r5, r6\n\t"
  76792. #endif
  76793. "stm %[a]!, {r5}\n\t"
  76794. "ldm %[m]!, {r6}\n\t"
  76795. #ifdef WOLFSSL_KEIL
  76796. "ands r6, r6, r7\n\t"
  76797. #elif defined(__clang__)
  76798. "ands r6, r7\n\t"
  76799. #else
  76800. "and r6, r7\n\t"
  76801. #endif
  76802. "ldr r5, [%[a], r4]\n\t"
  76803. #ifdef WOLFSSL_KEIL
  76804. "sbcs r5, r5, r6\n\t"
  76805. #elif defined(__clang__)
  76806. "sbcs r5, r6\n\t"
  76807. #else
  76808. "sbc r5, r6\n\t"
  76809. #endif
  76810. "stm %[a]!, {r5}\n\t"
  76811. "ldm %[m]!, {r6}\n\t"
  76812. #ifdef WOLFSSL_KEIL
  76813. "ands r6, r6, r7\n\t"
  76814. #elif defined(__clang__)
  76815. "ands r6, r7\n\t"
  76816. #else
  76817. "and r6, r7\n\t"
  76818. #endif
  76819. "ldr r5, [%[a], r4]\n\t"
  76820. #ifdef WOLFSSL_KEIL
  76821. "sbcs r5, r5, r6\n\t"
  76822. #elif defined(__clang__)
  76823. "sbcs r5, r6\n\t"
  76824. #else
  76825. "sbc r5, r6\n\t"
  76826. #endif
  76827. "stm %[a]!, {r5}\n\t"
  76828. "ldm %[m]!, {r6}\n\t"
  76829. #ifdef WOLFSSL_KEIL
  76830. "ands r6, r6, r7\n\t"
  76831. #elif defined(__clang__)
  76832. "ands r6, r7\n\t"
  76833. #else
  76834. "and r6, r7\n\t"
  76835. #endif
  76836. "ldr r5, [%[a], r4]\n\t"
  76837. #ifdef WOLFSSL_KEIL
  76838. "sbcs r5, r5, r6\n\t"
  76839. #elif defined(__clang__)
  76840. "sbcs r5, r6\n\t"
  76841. #else
  76842. "sbc r5, r6\n\t"
  76843. #endif
  76844. "stm %[a]!, {r5}\n\t"
  76845. "ldm %[m]!, {r6}\n\t"
  76846. #ifdef WOLFSSL_KEIL
  76847. "ands r6, r6, r7\n\t"
  76848. #elif defined(__clang__)
  76849. "ands r6, r7\n\t"
  76850. #else
  76851. "and r6, r7\n\t"
  76852. #endif
  76853. "ldr r5, [%[a], r4]\n\t"
  76854. #ifdef WOLFSSL_KEIL
  76855. "sbcs r5, r5, r6\n\t"
  76856. #elif defined(__clang__)
  76857. "sbcs r5, r6\n\t"
  76858. #else
  76859. "sbc r5, r6\n\t"
  76860. #endif
  76861. "stm %[a]!, {r5}\n\t"
  76862. "ldm %[m]!, {r6}\n\t"
  76863. #ifdef WOLFSSL_KEIL
  76864. "ands r6, r6, r7\n\t"
  76865. #elif defined(__clang__)
  76866. "ands r6, r7\n\t"
  76867. #else
  76868. "and r6, r7\n\t"
  76869. #endif
  76870. "ldr r5, [%[a], r4]\n\t"
  76871. #ifdef WOLFSSL_KEIL
  76872. "sbcs r5, r5, r6\n\t"
  76873. #elif defined(__clang__)
  76874. "sbcs r5, r6\n\t"
  76875. #else
  76876. "sbc r5, r6\n\t"
  76877. #endif
  76878. "stm %[a]!, {r5}\n\t"
  76879. "ldm %[m]!, {r6}\n\t"
  76880. #ifdef WOLFSSL_KEIL
  76881. "ands r6, r6, r7\n\t"
  76882. #elif defined(__clang__)
  76883. "ands r6, r7\n\t"
  76884. #else
  76885. "and r6, r7\n\t"
  76886. #endif
  76887. "ldr r5, [%[a], r4]\n\t"
  76888. #ifdef WOLFSSL_KEIL
  76889. "sbcs r5, r5, r6\n\t"
  76890. #elif defined(__clang__)
  76891. "sbcs r5, r6\n\t"
  76892. #else
  76893. "sbc r5, r6\n\t"
  76894. #endif
  76895. "stm %[a]!, {r5}\n\t"
  76896. "ldm %[m]!, {r6}\n\t"
  76897. #ifdef WOLFSSL_KEIL
  76898. "ands r6, r6, r7\n\t"
  76899. #elif defined(__clang__)
  76900. "ands r6, r7\n\t"
  76901. #else
  76902. "and r6, r7\n\t"
  76903. #endif
  76904. "ldr r5, [%[a], r4]\n\t"
  76905. #ifdef WOLFSSL_KEIL
  76906. "sbcs r5, r5, r6\n\t"
  76907. #elif defined(__clang__)
  76908. "sbcs r5, r6\n\t"
  76909. #else
  76910. "sbc r5, r6\n\t"
  76911. #endif
  76912. "stm %[a]!, {r5}\n\t"
  76913. "ldm %[m]!, {r6}\n\t"
  76914. #ifdef WOLFSSL_KEIL
  76915. "ands r6, r6, r7\n\t"
  76916. #elif defined(__clang__)
  76917. "ands r6, r7\n\t"
  76918. #else
  76919. "and r6, r7\n\t"
  76920. #endif
  76921. "ldr r5, [%[a], r4]\n\t"
  76922. #ifdef WOLFSSL_KEIL
  76923. "sbcs r5, r5, r6\n\t"
  76924. #elif defined(__clang__)
  76925. "sbcs r5, r6\n\t"
  76926. #else
  76927. "sbc r5, r6\n\t"
  76928. #endif
  76929. "stm %[a]!, {r5}\n\t"
  76930. "ldm %[m]!, {r6}\n\t"
  76931. #ifdef WOLFSSL_KEIL
  76932. "ands r6, r6, r7\n\t"
  76933. #elif defined(__clang__)
  76934. "ands r6, r7\n\t"
  76935. #else
  76936. "and r6, r7\n\t"
  76937. #endif
  76938. "ldr r5, [%[a], r4]\n\t"
  76939. #ifdef WOLFSSL_KEIL
  76940. "sbcs r5, r5, r6\n\t"
  76941. #elif defined(__clang__)
  76942. "sbcs r5, r6\n\t"
  76943. #else
  76944. "sbc r5, r6\n\t"
  76945. #endif
  76946. "stm %[a]!, {r5}\n\t"
  76947. "ldm %[m]!, {r6}\n\t"
  76948. #ifdef WOLFSSL_KEIL
  76949. "ands r6, r6, r7\n\t"
  76950. #elif defined(__clang__)
  76951. "ands r6, r7\n\t"
  76952. #else
  76953. "and r6, r7\n\t"
  76954. #endif
  76955. "ldr r5, [%[a], r4]\n\t"
  76956. #ifdef WOLFSSL_KEIL
  76957. "sbcs r5, r5, r6\n\t"
  76958. #elif defined(__clang__)
  76959. "sbcs r5, r6\n\t"
  76960. #else
  76961. "sbc r5, r6\n\t"
  76962. #endif
  76963. "stm %[a]!, {r5}\n\t"
  76964. #endif /* WOLFSSL_SP_LARGE_CODE */
  76965. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  76966. :
  76967. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  76968. );
  76969. }
  76970. /* Multiply two Montgomery form numbers mod the modulus (prime).
  76971. * (r = a * b mod m)
  76972. *
  76973. * r Result of multiplication.
  76974. * a First number to multiply in Montgomery form.
  76975. * b Second number to multiply in Montgomery form.
  76976. * m Modulus (prime).
  76977. * mp Montgomery mulitplier.
  76978. */
  76979. static void sp_3072_mont_mul_96(sp_digit* r, const sp_digit* a,
  76980. const sp_digit* b, const sp_digit* m, sp_digit mp)
  76981. {
  76982. sp_3072_mul_96(r, a, b);
  76983. sp_3072_mont_reduce_96(r, m, mp);
  76984. }
  76985. /* Square the Montgomery form number. (r = a * a mod m)
  76986. *
  76987. * r Result of squaring.
  76988. * a Number to square in Montgomery form.
  76989. * m Modulus (prime).
  76990. * mp Montgomery mulitplier.
  76991. */
  76992. static void sp_3072_mont_sqr_96(sp_digit* r, const sp_digit* a,
  76993. const sp_digit* m, sp_digit mp)
  76994. {
  76995. sp_3072_sqr_96(r, a);
  76996. sp_3072_mont_reduce_96(r, m, mp);
  76997. }
  76998. #ifdef WOLFSSL_SP_SMALL
  76999. /* Sub b from a into r. (r = a - b)
  77000. *
  77001. * r A single precision integer.
  77002. * a A single precision integer.
  77003. * b A single precision integer.
  77004. */
  77005. SP_NOINLINE static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a,
  77006. const sp_digit* b)
  77007. {
  77008. __asm__ __volatile__ (
  77009. "movs r6, %[a]\n\t"
  77010. "movs r3, #0\n\t"
  77011. "movs r5, #0xff\n\t"
  77012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77013. "adds r5, r5, #0x81\n\t"
  77014. #else
  77015. "add r5, r5, #0x81\n\t"
  77016. #endif
  77017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77018. "adds r6, r6, r5\n\t"
  77019. #else
  77020. "add r6, r6, r5\n\t"
  77021. #endif
  77022. "\n"
  77023. "L_sp_3072_sub_96_word_%=:\n\t"
  77024. "movs r5, #0\n\t"
  77025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77026. "subs r5, r5, r3\n\t"
  77027. #else
  77028. "sub r5, r5, r3\n\t"
  77029. #endif
  77030. "ldr r4, [%[a]]\n\t"
  77031. "ldr r5, [%[b]]\n\t"
  77032. #ifdef WOLFSSL_KEIL
  77033. "sbcs r4, r4, r5\n\t"
  77034. #elif defined(__clang__)
  77035. "sbcs r4, r5\n\t"
  77036. #else
  77037. "sbc r4, r5\n\t"
  77038. #endif
  77039. "str r4, [%[r]]\n\t"
  77040. #ifdef WOLFSSL_KEIL
  77041. "sbcs r3, r3, r3\n\t"
  77042. #elif defined(__clang__)
  77043. "sbcs r3, r3\n\t"
  77044. #else
  77045. "sbc r3, r3\n\t"
  77046. #endif
  77047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77048. "adds %[a], %[a], #4\n\t"
  77049. #else
  77050. "add %[a], %[a], #4\n\t"
  77051. #endif
  77052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77053. "adds %[b], %[b], #4\n\t"
  77054. #else
  77055. "add %[b], %[b], #4\n\t"
  77056. #endif
  77057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77058. "adds %[r], %[r], #4\n\t"
  77059. #else
  77060. "add %[r], %[r], #4\n\t"
  77061. #endif
  77062. "cmp %[a], r6\n\t"
  77063. "bne L_sp_3072_sub_96_word_%=\n\t"
  77064. "movs %[r], r3\n\t"
  77065. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  77066. :
  77067. : "memory", "r3", "r4", "r5", "r6"
  77068. );
  77069. return (uint32_t)(size_t)r;
  77070. }
  77071. #else
  77072. /* Sub b from a into r. (r = a - b)
  77073. *
  77074. * r A single precision integer.
  77075. * a A single precision integer.
  77076. * b A single precision integer.
  77077. */
  77078. SP_NOINLINE static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a,
  77079. const sp_digit* b)
  77080. {
  77081. __asm__ __volatile__ (
  77082. "ldm %[b]!, {r5, r6}\n\t"
  77083. "ldm %[a]!, {r3, r4}\n\t"
  77084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77085. "subs r3, r3, r5\n\t"
  77086. #else
  77087. "sub r3, r3, r5\n\t"
  77088. #endif
  77089. #ifdef WOLFSSL_KEIL
  77090. "sbcs r4, r4, r6\n\t"
  77091. #elif defined(__clang__)
  77092. "sbcs r4, r6\n\t"
  77093. #else
  77094. "sbc r4, r6\n\t"
  77095. #endif
  77096. "stm %[r]!, {r3, r4}\n\t"
  77097. "ldm %[b]!, {r5, r6}\n\t"
  77098. "ldm %[a]!, {r3, r4}\n\t"
  77099. #ifdef WOLFSSL_KEIL
  77100. "sbcs r3, r3, r5\n\t"
  77101. #elif defined(__clang__)
  77102. "sbcs r3, r5\n\t"
  77103. #else
  77104. "sbc r3, r5\n\t"
  77105. #endif
  77106. #ifdef WOLFSSL_KEIL
  77107. "sbcs r4, r4, r6\n\t"
  77108. #elif defined(__clang__)
  77109. "sbcs r4, r6\n\t"
  77110. #else
  77111. "sbc r4, r6\n\t"
  77112. #endif
  77113. "stm %[r]!, {r3, r4}\n\t"
  77114. "ldm %[b]!, {r5, r6}\n\t"
  77115. "ldm %[a]!, {r3, r4}\n\t"
  77116. #ifdef WOLFSSL_KEIL
  77117. "sbcs r3, r3, r5\n\t"
  77118. #elif defined(__clang__)
  77119. "sbcs r3, r5\n\t"
  77120. #else
  77121. "sbc r3, r5\n\t"
  77122. #endif
  77123. #ifdef WOLFSSL_KEIL
  77124. "sbcs r4, r4, r6\n\t"
  77125. #elif defined(__clang__)
  77126. "sbcs r4, r6\n\t"
  77127. #else
  77128. "sbc r4, r6\n\t"
  77129. #endif
  77130. "stm %[r]!, {r3, r4}\n\t"
  77131. "ldm %[b]!, {r5, r6}\n\t"
  77132. "ldm %[a]!, {r3, r4}\n\t"
  77133. #ifdef WOLFSSL_KEIL
  77134. "sbcs r3, r3, r5\n\t"
  77135. #elif defined(__clang__)
  77136. "sbcs r3, r5\n\t"
  77137. #else
  77138. "sbc r3, r5\n\t"
  77139. #endif
  77140. #ifdef WOLFSSL_KEIL
  77141. "sbcs r4, r4, r6\n\t"
  77142. #elif defined(__clang__)
  77143. "sbcs r4, r6\n\t"
  77144. #else
  77145. "sbc r4, r6\n\t"
  77146. #endif
  77147. "stm %[r]!, {r3, r4}\n\t"
  77148. "ldm %[b]!, {r5, r6}\n\t"
  77149. "ldm %[a]!, {r3, r4}\n\t"
  77150. #ifdef WOLFSSL_KEIL
  77151. "sbcs r3, r3, r5\n\t"
  77152. #elif defined(__clang__)
  77153. "sbcs r3, r5\n\t"
  77154. #else
  77155. "sbc r3, r5\n\t"
  77156. #endif
  77157. #ifdef WOLFSSL_KEIL
  77158. "sbcs r4, r4, r6\n\t"
  77159. #elif defined(__clang__)
  77160. "sbcs r4, r6\n\t"
  77161. #else
  77162. "sbc r4, r6\n\t"
  77163. #endif
  77164. "stm %[r]!, {r3, r4}\n\t"
  77165. "ldm %[b]!, {r5, r6}\n\t"
  77166. "ldm %[a]!, {r3, r4}\n\t"
  77167. #ifdef WOLFSSL_KEIL
  77168. "sbcs r3, r3, r5\n\t"
  77169. #elif defined(__clang__)
  77170. "sbcs r3, r5\n\t"
  77171. #else
  77172. "sbc r3, r5\n\t"
  77173. #endif
  77174. #ifdef WOLFSSL_KEIL
  77175. "sbcs r4, r4, r6\n\t"
  77176. #elif defined(__clang__)
  77177. "sbcs r4, r6\n\t"
  77178. #else
  77179. "sbc r4, r6\n\t"
  77180. #endif
  77181. "stm %[r]!, {r3, r4}\n\t"
  77182. "ldm %[b]!, {r5, r6}\n\t"
  77183. "ldm %[a]!, {r3, r4}\n\t"
  77184. #ifdef WOLFSSL_KEIL
  77185. "sbcs r3, r3, r5\n\t"
  77186. #elif defined(__clang__)
  77187. "sbcs r3, r5\n\t"
  77188. #else
  77189. "sbc r3, r5\n\t"
  77190. #endif
  77191. #ifdef WOLFSSL_KEIL
  77192. "sbcs r4, r4, r6\n\t"
  77193. #elif defined(__clang__)
  77194. "sbcs r4, r6\n\t"
  77195. #else
  77196. "sbc r4, r6\n\t"
  77197. #endif
  77198. "stm %[r]!, {r3, r4}\n\t"
  77199. "ldm %[b]!, {r5, r6}\n\t"
  77200. "ldm %[a]!, {r3, r4}\n\t"
  77201. #ifdef WOLFSSL_KEIL
  77202. "sbcs r3, r3, r5\n\t"
  77203. #elif defined(__clang__)
  77204. "sbcs r3, r5\n\t"
  77205. #else
  77206. "sbc r3, r5\n\t"
  77207. #endif
  77208. #ifdef WOLFSSL_KEIL
  77209. "sbcs r4, r4, r6\n\t"
  77210. #elif defined(__clang__)
  77211. "sbcs r4, r6\n\t"
  77212. #else
  77213. "sbc r4, r6\n\t"
  77214. #endif
  77215. "stm %[r]!, {r3, r4}\n\t"
  77216. "ldm %[b]!, {r5, r6}\n\t"
  77217. "ldm %[a]!, {r3, r4}\n\t"
  77218. #ifdef WOLFSSL_KEIL
  77219. "sbcs r3, r3, r5\n\t"
  77220. #elif defined(__clang__)
  77221. "sbcs r3, r5\n\t"
  77222. #else
  77223. "sbc r3, r5\n\t"
  77224. #endif
  77225. #ifdef WOLFSSL_KEIL
  77226. "sbcs r4, r4, r6\n\t"
  77227. #elif defined(__clang__)
  77228. "sbcs r4, r6\n\t"
  77229. #else
  77230. "sbc r4, r6\n\t"
  77231. #endif
  77232. "stm %[r]!, {r3, r4}\n\t"
  77233. "ldm %[b]!, {r5, r6}\n\t"
  77234. "ldm %[a]!, {r3, r4}\n\t"
  77235. #ifdef WOLFSSL_KEIL
  77236. "sbcs r3, r3, r5\n\t"
  77237. #elif defined(__clang__)
  77238. "sbcs r3, r5\n\t"
  77239. #else
  77240. "sbc r3, r5\n\t"
  77241. #endif
  77242. #ifdef WOLFSSL_KEIL
  77243. "sbcs r4, r4, r6\n\t"
  77244. #elif defined(__clang__)
  77245. "sbcs r4, r6\n\t"
  77246. #else
  77247. "sbc r4, r6\n\t"
  77248. #endif
  77249. "stm %[r]!, {r3, r4}\n\t"
  77250. "ldm %[b]!, {r5, r6}\n\t"
  77251. "ldm %[a]!, {r3, r4}\n\t"
  77252. #ifdef WOLFSSL_KEIL
  77253. "sbcs r3, r3, r5\n\t"
  77254. #elif defined(__clang__)
  77255. "sbcs r3, r5\n\t"
  77256. #else
  77257. "sbc r3, r5\n\t"
  77258. #endif
  77259. #ifdef WOLFSSL_KEIL
  77260. "sbcs r4, r4, r6\n\t"
  77261. #elif defined(__clang__)
  77262. "sbcs r4, r6\n\t"
  77263. #else
  77264. "sbc r4, r6\n\t"
  77265. #endif
  77266. "stm %[r]!, {r3, r4}\n\t"
  77267. "ldm %[b]!, {r5, r6}\n\t"
  77268. "ldm %[a]!, {r3, r4}\n\t"
  77269. #ifdef WOLFSSL_KEIL
  77270. "sbcs r3, r3, r5\n\t"
  77271. #elif defined(__clang__)
  77272. "sbcs r3, r5\n\t"
  77273. #else
  77274. "sbc r3, r5\n\t"
  77275. #endif
  77276. #ifdef WOLFSSL_KEIL
  77277. "sbcs r4, r4, r6\n\t"
  77278. #elif defined(__clang__)
  77279. "sbcs r4, r6\n\t"
  77280. #else
  77281. "sbc r4, r6\n\t"
  77282. #endif
  77283. "stm %[r]!, {r3, r4}\n\t"
  77284. "ldm %[b]!, {r5, r6}\n\t"
  77285. "ldm %[a]!, {r3, r4}\n\t"
  77286. #ifdef WOLFSSL_KEIL
  77287. "sbcs r3, r3, r5\n\t"
  77288. #elif defined(__clang__)
  77289. "sbcs r3, r5\n\t"
  77290. #else
  77291. "sbc r3, r5\n\t"
  77292. #endif
  77293. #ifdef WOLFSSL_KEIL
  77294. "sbcs r4, r4, r6\n\t"
  77295. #elif defined(__clang__)
  77296. "sbcs r4, r6\n\t"
  77297. #else
  77298. "sbc r4, r6\n\t"
  77299. #endif
  77300. "stm %[r]!, {r3, r4}\n\t"
  77301. "ldm %[b]!, {r5, r6}\n\t"
  77302. "ldm %[a]!, {r3, r4}\n\t"
  77303. #ifdef WOLFSSL_KEIL
  77304. "sbcs r3, r3, r5\n\t"
  77305. #elif defined(__clang__)
  77306. "sbcs r3, r5\n\t"
  77307. #else
  77308. "sbc r3, r5\n\t"
  77309. #endif
  77310. #ifdef WOLFSSL_KEIL
  77311. "sbcs r4, r4, r6\n\t"
  77312. #elif defined(__clang__)
  77313. "sbcs r4, r6\n\t"
  77314. #else
  77315. "sbc r4, r6\n\t"
  77316. #endif
  77317. "stm %[r]!, {r3, r4}\n\t"
  77318. "ldm %[b]!, {r5, r6}\n\t"
  77319. "ldm %[a]!, {r3, r4}\n\t"
  77320. #ifdef WOLFSSL_KEIL
  77321. "sbcs r3, r3, r5\n\t"
  77322. #elif defined(__clang__)
  77323. "sbcs r3, r5\n\t"
  77324. #else
  77325. "sbc r3, r5\n\t"
  77326. #endif
  77327. #ifdef WOLFSSL_KEIL
  77328. "sbcs r4, r4, r6\n\t"
  77329. #elif defined(__clang__)
  77330. "sbcs r4, r6\n\t"
  77331. #else
  77332. "sbc r4, r6\n\t"
  77333. #endif
  77334. "stm %[r]!, {r3, r4}\n\t"
  77335. "ldm %[b]!, {r5, r6}\n\t"
  77336. "ldm %[a]!, {r3, r4}\n\t"
  77337. #ifdef WOLFSSL_KEIL
  77338. "sbcs r3, r3, r5\n\t"
  77339. #elif defined(__clang__)
  77340. "sbcs r3, r5\n\t"
  77341. #else
  77342. "sbc r3, r5\n\t"
  77343. #endif
  77344. #ifdef WOLFSSL_KEIL
  77345. "sbcs r4, r4, r6\n\t"
  77346. #elif defined(__clang__)
  77347. "sbcs r4, r6\n\t"
  77348. #else
  77349. "sbc r4, r6\n\t"
  77350. #endif
  77351. "stm %[r]!, {r3, r4}\n\t"
  77352. "ldm %[b]!, {r5, r6}\n\t"
  77353. "ldm %[a]!, {r3, r4}\n\t"
  77354. #ifdef WOLFSSL_KEIL
  77355. "sbcs r3, r3, r5\n\t"
  77356. #elif defined(__clang__)
  77357. "sbcs r3, r5\n\t"
  77358. #else
  77359. "sbc r3, r5\n\t"
  77360. #endif
  77361. #ifdef WOLFSSL_KEIL
  77362. "sbcs r4, r4, r6\n\t"
  77363. #elif defined(__clang__)
  77364. "sbcs r4, r6\n\t"
  77365. #else
  77366. "sbc r4, r6\n\t"
  77367. #endif
  77368. "stm %[r]!, {r3, r4}\n\t"
  77369. "ldm %[b]!, {r5, r6}\n\t"
  77370. "ldm %[a]!, {r3, r4}\n\t"
  77371. #ifdef WOLFSSL_KEIL
  77372. "sbcs r3, r3, r5\n\t"
  77373. #elif defined(__clang__)
  77374. "sbcs r3, r5\n\t"
  77375. #else
  77376. "sbc r3, r5\n\t"
  77377. #endif
  77378. #ifdef WOLFSSL_KEIL
  77379. "sbcs r4, r4, r6\n\t"
  77380. #elif defined(__clang__)
  77381. "sbcs r4, r6\n\t"
  77382. #else
  77383. "sbc r4, r6\n\t"
  77384. #endif
  77385. "stm %[r]!, {r3, r4}\n\t"
  77386. "ldm %[b]!, {r5, r6}\n\t"
  77387. "ldm %[a]!, {r3, r4}\n\t"
  77388. #ifdef WOLFSSL_KEIL
  77389. "sbcs r3, r3, r5\n\t"
  77390. #elif defined(__clang__)
  77391. "sbcs r3, r5\n\t"
  77392. #else
  77393. "sbc r3, r5\n\t"
  77394. #endif
  77395. #ifdef WOLFSSL_KEIL
  77396. "sbcs r4, r4, r6\n\t"
  77397. #elif defined(__clang__)
  77398. "sbcs r4, r6\n\t"
  77399. #else
  77400. "sbc r4, r6\n\t"
  77401. #endif
  77402. "stm %[r]!, {r3, r4}\n\t"
  77403. "ldm %[b]!, {r5, r6}\n\t"
  77404. "ldm %[a]!, {r3, r4}\n\t"
  77405. #ifdef WOLFSSL_KEIL
  77406. "sbcs r3, r3, r5\n\t"
  77407. #elif defined(__clang__)
  77408. "sbcs r3, r5\n\t"
  77409. #else
  77410. "sbc r3, r5\n\t"
  77411. #endif
  77412. #ifdef WOLFSSL_KEIL
  77413. "sbcs r4, r4, r6\n\t"
  77414. #elif defined(__clang__)
  77415. "sbcs r4, r6\n\t"
  77416. #else
  77417. "sbc r4, r6\n\t"
  77418. #endif
  77419. "stm %[r]!, {r3, r4}\n\t"
  77420. "ldm %[b]!, {r5, r6}\n\t"
  77421. "ldm %[a]!, {r3, r4}\n\t"
  77422. #ifdef WOLFSSL_KEIL
  77423. "sbcs r3, r3, r5\n\t"
  77424. #elif defined(__clang__)
  77425. "sbcs r3, r5\n\t"
  77426. #else
  77427. "sbc r3, r5\n\t"
  77428. #endif
  77429. #ifdef WOLFSSL_KEIL
  77430. "sbcs r4, r4, r6\n\t"
  77431. #elif defined(__clang__)
  77432. "sbcs r4, r6\n\t"
  77433. #else
  77434. "sbc r4, r6\n\t"
  77435. #endif
  77436. "stm %[r]!, {r3, r4}\n\t"
  77437. "ldm %[b]!, {r5, r6}\n\t"
  77438. "ldm %[a]!, {r3, r4}\n\t"
  77439. #ifdef WOLFSSL_KEIL
  77440. "sbcs r3, r3, r5\n\t"
  77441. #elif defined(__clang__)
  77442. "sbcs r3, r5\n\t"
  77443. #else
  77444. "sbc r3, r5\n\t"
  77445. #endif
  77446. #ifdef WOLFSSL_KEIL
  77447. "sbcs r4, r4, r6\n\t"
  77448. #elif defined(__clang__)
  77449. "sbcs r4, r6\n\t"
  77450. #else
  77451. "sbc r4, r6\n\t"
  77452. #endif
  77453. "stm %[r]!, {r3, r4}\n\t"
  77454. "ldm %[b]!, {r5, r6}\n\t"
  77455. "ldm %[a]!, {r3, r4}\n\t"
  77456. #ifdef WOLFSSL_KEIL
  77457. "sbcs r3, r3, r5\n\t"
  77458. #elif defined(__clang__)
  77459. "sbcs r3, r5\n\t"
  77460. #else
  77461. "sbc r3, r5\n\t"
  77462. #endif
  77463. #ifdef WOLFSSL_KEIL
  77464. "sbcs r4, r4, r6\n\t"
  77465. #elif defined(__clang__)
  77466. "sbcs r4, r6\n\t"
  77467. #else
  77468. "sbc r4, r6\n\t"
  77469. #endif
  77470. "stm %[r]!, {r3, r4}\n\t"
  77471. "ldm %[b]!, {r5, r6}\n\t"
  77472. "ldm %[a]!, {r3, r4}\n\t"
  77473. #ifdef WOLFSSL_KEIL
  77474. "sbcs r3, r3, r5\n\t"
  77475. #elif defined(__clang__)
  77476. "sbcs r3, r5\n\t"
  77477. #else
  77478. "sbc r3, r5\n\t"
  77479. #endif
  77480. #ifdef WOLFSSL_KEIL
  77481. "sbcs r4, r4, r6\n\t"
  77482. #elif defined(__clang__)
  77483. "sbcs r4, r6\n\t"
  77484. #else
  77485. "sbc r4, r6\n\t"
  77486. #endif
  77487. "stm %[r]!, {r3, r4}\n\t"
  77488. "ldm %[b]!, {r5, r6}\n\t"
  77489. "ldm %[a]!, {r3, r4}\n\t"
  77490. #ifdef WOLFSSL_KEIL
  77491. "sbcs r3, r3, r5\n\t"
  77492. #elif defined(__clang__)
  77493. "sbcs r3, r5\n\t"
  77494. #else
  77495. "sbc r3, r5\n\t"
  77496. #endif
  77497. #ifdef WOLFSSL_KEIL
  77498. "sbcs r4, r4, r6\n\t"
  77499. #elif defined(__clang__)
  77500. "sbcs r4, r6\n\t"
  77501. #else
  77502. "sbc r4, r6\n\t"
  77503. #endif
  77504. "stm %[r]!, {r3, r4}\n\t"
  77505. "ldm %[b]!, {r5, r6}\n\t"
  77506. "ldm %[a]!, {r3, r4}\n\t"
  77507. #ifdef WOLFSSL_KEIL
  77508. "sbcs r3, r3, r5\n\t"
  77509. #elif defined(__clang__)
  77510. "sbcs r3, r5\n\t"
  77511. #else
  77512. "sbc r3, r5\n\t"
  77513. #endif
  77514. #ifdef WOLFSSL_KEIL
  77515. "sbcs r4, r4, r6\n\t"
  77516. #elif defined(__clang__)
  77517. "sbcs r4, r6\n\t"
  77518. #else
  77519. "sbc r4, r6\n\t"
  77520. #endif
  77521. "stm %[r]!, {r3, r4}\n\t"
  77522. "ldm %[b]!, {r5, r6}\n\t"
  77523. "ldm %[a]!, {r3, r4}\n\t"
  77524. #ifdef WOLFSSL_KEIL
  77525. "sbcs r3, r3, r5\n\t"
  77526. #elif defined(__clang__)
  77527. "sbcs r3, r5\n\t"
  77528. #else
  77529. "sbc r3, r5\n\t"
  77530. #endif
  77531. #ifdef WOLFSSL_KEIL
  77532. "sbcs r4, r4, r6\n\t"
  77533. #elif defined(__clang__)
  77534. "sbcs r4, r6\n\t"
  77535. #else
  77536. "sbc r4, r6\n\t"
  77537. #endif
  77538. "stm %[r]!, {r3, r4}\n\t"
  77539. "ldm %[b]!, {r5, r6}\n\t"
  77540. "ldm %[a]!, {r3, r4}\n\t"
  77541. #ifdef WOLFSSL_KEIL
  77542. "sbcs r3, r3, r5\n\t"
  77543. #elif defined(__clang__)
  77544. "sbcs r3, r5\n\t"
  77545. #else
  77546. "sbc r3, r5\n\t"
  77547. #endif
  77548. #ifdef WOLFSSL_KEIL
  77549. "sbcs r4, r4, r6\n\t"
  77550. #elif defined(__clang__)
  77551. "sbcs r4, r6\n\t"
  77552. #else
  77553. "sbc r4, r6\n\t"
  77554. #endif
  77555. "stm %[r]!, {r3, r4}\n\t"
  77556. "ldm %[b]!, {r5, r6}\n\t"
  77557. "ldm %[a]!, {r3, r4}\n\t"
  77558. #ifdef WOLFSSL_KEIL
  77559. "sbcs r3, r3, r5\n\t"
  77560. #elif defined(__clang__)
  77561. "sbcs r3, r5\n\t"
  77562. #else
  77563. "sbc r3, r5\n\t"
  77564. #endif
  77565. #ifdef WOLFSSL_KEIL
  77566. "sbcs r4, r4, r6\n\t"
  77567. #elif defined(__clang__)
  77568. "sbcs r4, r6\n\t"
  77569. #else
  77570. "sbc r4, r6\n\t"
  77571. #endif
  77572. "stm %[r]!, {r3, r4}\n\t"
  77573. "ldm %[b]!, {r5, r6}\n\t"
  77574. "ldm %[a]!, {r3, r4}\n\t"
  77575. #ifdef WOLFSSL_KEIL
  77576. "sbcs r3, r3, r5\n\t"
  77577. #elif defined(__clang__)
  77578. "sbcs r3, r5\n\t"
  77579. #else
  77580. "sbc r3, r5\n\t"
  77581. #endif
  77582. #ifdef WOLFSSL_KEIL
  77583. "sbcs r4, r4, r6\n\t"
  77584. #elif defined(__clang__)
  77585. "sbcs r4, r6\n\t"
  77586. #else
  77587. "sbc r4, r6\n\t"
  77588. #endif
  77589. "stm %[r]!, {r3, r4}\n\t"
  77590. "ldm %[b]!, {r5, r6}\n\t"
  77591. "ldm %[a]!, {r3, r4}\n\t"
  77592. #ifdef WOLFSSL_KEIL
  77593. "sbcs r3, r3, r5\n\t"
  77594. #elif defined(__clang__)
  77595. "sbcs r3, r5\n\t"
  77596. #else
  77597. "sbc r3, r5\n\t"
  77598. #endif
  77599. #ifdef WOLFSSL_KEIL
  77600. "sbcs r4, r4, r6\n\t"
  77601. #elif defined(__clang__)
  77602. "sbcs r4, r6\n\t"
  77603. #else
  77604. "sbc r4, r6\n\t"
  77605. #endif
  77606. "stm %[r]!, {r3, r4}\n\t"
  77607. "ldm %[b]!, {r5, r6}\n\t"
  77608. "ldm %[a]!, {r3, r4}\n\t"
  77609. #ifdef WOLFSSL_KEIL
  77610. "sbcs r3, r3, r5\n\t"
  77611. #elif defined(__clang__)
  77612. "sbcs r3, r5\n\t"
  77613. #else
  77614. "sbc r3, r5\n\t"
  77615. #endif
  77616. #ifdef WOLFSSL_KEIL
  77617. "sbcs r4, r4, r6\n\t"
  77618. #elif defined(__clang__)
  77619. "sbcs r4, r6\n\t"
  77620. #else
  77621. "sbc r4, r6\n\t"
  77622. #endif
  77623. "stm %[r]!, {r3, r4}\n\t"
  77624. "ldm %[b]!, {r5, r6}\n\t"
  77625. "ldm %[a]!, {r3, r4}\n\t"
  77626. #ifdef WOLFSSL_KEIL
  77627. "sbcs r3, r3, r5\n\t"
  77628. #elif defined(__clang__)
  77629. "sbcs r3, r5\n\t"
  77630. #else
  77631. "sbc r3, r5\n\t"
  77632. #endif
  77633. #ifdef WOLFSSL_KEIL
  77634. "sbcs r4, r4, r6\n\t"
  77635. #elif defined(__clang__)
  77636. "sbcs r4, r6\n\t"
  77637. #else
  77638. "sbc r4, r6\n\t"
  77639. #endif
  77640. "stm %[r]!, {r3, r4}\n\t"
  77641. "ldm %[b]!, {r5, r6}\n\t"
  77642. "ldm %[a]!, {r3, r4}\n\t"
  77643. #ifdef WOLFSSL_KEIL
  77644. "sbcs r3, r3, r5\n\t"
  77645. #elif defined(__clang__)
  77646. "sbcs r3, r5\n\t"
  77647. #else
  77648. "sbc r3, r5\n\t"
  77649. #endif
  77650. #ifdef WOLFSSL_KEIL
  77651. "sbcs r4, r4, r6\n\t"
  77652. #elif defined(__clang__)
  77653. "sbcs r4, r6\n\t"
  77654. #else
  77655. "sbc r4, r6\n\t"
  77656. #endif
  77657. "stm %[r]!, {r3, r4}\n\t"
  77658. "ldm %[b]!, {r5, r6}\n\t"
  77659. "ldm %[a]!, {r3, r4}\n\t"
  77660. #ifdef WOLFSSL_KEIL
  77661. "sbcs r3, r3, r5\n\t"
  77662. #elif defined(__clang__)
  77663. "sbcs r3, r5\n\t"
  77664. #else
  77665. "sbc r3, r5\n\t"
  77666. #endif
  77667. #ifdef WOLFSSL_KEIL
  77668. "sbcs r4, r4, r6\n\t"
  77669. #elif defined(__clang__)
  77670. "sbcs r4, r6\n\t"
  77671. #else
  77672. "sbc r4, r6\n\t"
  77673. #endif
  77674. "stm %[r]!, {r3, r4}\n\t"
  77675. "ldm %[b]!, {r5, r6}\n\t"
  77676. "ldm %[a]!, {r3, r4}\n\t"
  77677. #ifdef WOLFSSL_KEIL
  77678. "sbcs r3, r3, r5\n\t"
  77679. #elif defined(__clang__)
  77680. "sbcs r3, r5\n\t"
  77681. #else
  77682. "sbc r3, r5\n\t"
  77683. #endif
  77684. #ifdef WOLFSSL_KEIL
  77685. "sbcs r4, r4, r6\n\t"
  77686. #elif defined(__clang__)
  77687. "sbcs r4, r6\n\t"
  77688. #else
  77689. "sbc r4, r6\n\t"
  77690. #endif
  77691. "stm %[r]!, {r3, r4}\n\t"
  77692. "ldm %[b]!, {r5, r6}\n\t"
  77693. "ldm %[a]!, {r3, r4}\n\t"
  77694. #ifdef WOLFSSL_KEIL
  77695. "sbcs r3, r3, r5\n\t"
  77696. #elif defined(__clang__)
  77697. "sbcs r3, r5\n\t"
  77698. #else
  77699. "sbc r3, r5\n\t"
  77700. #endif
  77701. #ifdef WOLFSSL_KEIL
  77702. "sbcs r4, r4, r6\n\t"
  77703. #elif defined(__clang__)
  77704. "sbcs r4, r6\n\t"
  77705. #else
  77706. "sbc r4, r6\n\t"
  77707. #endif
  77708. "stm %[r]!, {r3, r4}\n\t"
  77709. "ldm %[b]!, {r5, r6}\n\t"
  77710. "ldm %[a]!, {r3, r4}\n\t"
  77711. #ifdef WOLFSSL_KEIL
  77712. "sbcs r3, r3, r5\n\t"
  77713. #elif defined(__clang__)
  77714. "sbcs r3, r5\n\t"
  77715. #else
  77716. "sbc r3, r5\n\t"
  77717. #endif
  77718. #ifdef WOLFSSL_KEIL
  77719. "sbcs r4, r4, r6\n\t"
  77720. #elif defined(__clang__)
  77721. "sbcs r4, r6\n\t"
  77722. #else
  77723. "sbc r4, r6\n\t"
  77724. #endif
  77725. "stm %[r]!, {r3, r4}\n\t"
  77726. "ldm %[b]!, {r5, r6}\n\t"
  77727. "ldm %[a]!, {r3, r4}\n\t"
  77728. #ifdef WOLFSSL_KEIL
  77729. "sbcs r3, r3, r5\n\t"
  77730. #elif defined(__clang__)
  77731. "sbcs r3, r5\n\t"
  77732. #else
  77733. "sbc r3, r5\n\t"
  77734. #endif
  77735. #ifdef WOLFSSL_KEIL
  77736. "sbcs r4, r4, r6\n\t"
  77737. #elif defined(__clang__)
  77738. "sbcs r4, r6\n\t"
  77739. #else
  77740. "sbc r4, r6\n\t"
  77741. #endif
  77742. "stm %[r]!, {r3, r4}\n\t"
  77743. "ldm %[b]!, {r5, r6}\n\t"
  77744. "ldm %[a]!, {r3, r4}\n\t"
  77745. #ifdef WOLFSSL_KEIL
  77746. "sbcs r3, r3, r5\n\t"
  77747. #elif defined(__clang__)
  77748. "sbcs r3, r5\n\t"
  77749. #else
  77750. "sbc r3, r5\n\t"
  77751. #endif
  77752. #ifdef WOLFSSL_KEIL
  77753. "sbcs r4, r4, r6\n\t"
  77754. #elif defined(__clang__)
  77755. "sbcs r4, r6\n\t"
  77756. #else
  77757. "sbc r4, r6\n\t"
  77758. #endif
  77759. "stm %[r]!, {r3, r4}\n\t"
  77760. "ldm %[b]!, {r5, r6}\n\t"
  77761. "ldm %[a]!, {r3, r4}\n\t"
  77762. #ifdef WOLFSSL_KEIL
  77763. "sbcs r3, r3, r5\n\t"
  77764. #elif defined(__clang__)
  77765. "sbcs r3, r5\n\t"
  77766. #else
  77767. "sbc r3, r5\n\t"
  77768. #endif
  77769. #ifdef WOLFSSL_KEIL
  77770. "sbcs r4, r4, r6\n\t"
  77771. #elif defined(__clang__)
  77772. "sbcs r4, r6\n\t"
  77773. #else
  77774. "sbc r4, r6\n\t"
  77775. #endif
  77776. "stm %[r]!, {r3, r4}\n\t"
  77777. "ldm %[b]!, {r5, r6}\n\t"
  77778. "ldm %[a]!, {r3, r4}\n\t"
  77779. #ifdef WOLFSSL_KEIL
  77780. "sbcs r3, r3, r5\n\t"
  77781. #elif defined(__clang__)
  77782. "sbcs r3, r5\n\t"
  77783. #else
  77784. "sbc r3, r5\n\t"
  77785. #endif
  77786. #ifdef WOLFSSL_KEIL
  77787. "sbcs r4, r4, r6\n\t"
  77788. #elif defined(__clang__)
  77789. "sbcs r4, r6\n\t"
  77790. #else
  77791. "sbc r4, r6\n\t"
  77792. #endif
  77793. "stm %[r]!, {r3, r4}\n\t"
  77794. "ldm %[b]!, {r5, r6}\n\t"
  77795. "ldm %[a]!, {r3, r4}\n\t"
  77796. #ifdef WOLFSSL_KEIL
  77797. "sbcs r3, r3, r5\n\t"
  77798. #elif defined(__clang__)
  77799. "sbcs r3, r5\n\t"
  77800. #else
  77801. "sbc r3, r5\n\t"
  77802. #endif
  77803. #ifdef WOLFSSL_KEIL
  77804. "sbcs r4, r4, r6\n\t"
  77805. #elif defined(__clang__)
  77806. "sbcs r4, r6\n\t"
  77807. #else
  77808. "sbc r4, r6\n\t"
  77809. #endif
  77810. "stm %[r]!, {r3, r4}\n\t"
  77811. "ldm %[b]!, {r5, r6}\n\t"
  77812. "ldm %[a]!, {r3, r4}\n\t"
  77813. #ifdef WOLFSSL_KEIL
  77814. "sbcs r3, r3, r5\n\t"
  77815. #elif defined(__clang__)
  77816. "sbcs r3, r5\n\t"
  77817. #else
  77818. "sbc r3, r5\n\t"
  77819. #endif
  77820. #ifdef WOLFSSL_KEIL
  77821. "sbcs r4, r4, r6\n\t"
  77822. #elif defined(__clang__)
  77823. "sbcs r4, r6\n\t"
  77824. #else
  77825. "sbc r4, r6\n\t"
  77826. #endif
  77827. "stm %[r]!, {r3, r4}\n\t"
  77828. "ldm %[b]!, {r5, r6}\n\t"
  77829. "ldm %[a]!, {r3, r4}\n\t"
  77830. #ifdef WOLFSSL_KEIL
  77831. "sbcs r3, r3, r5\n\t"
  77832. #elif defined(__clang__)
  77833. "sbcs r3, r5\n\t"
  77834. #else
  77835. "sbc r3, r5\n\t"
  77836. #endif
  77837. #ifdef WOLFSSL_KEIL
  77838. "sbcs r4, r4, r6\n\t"
  77839. #elif defined(__clang__)
  77840. "sbcs r4, r6\n\t"
  77841. #else
  77842. "sbc r4, r6\n\t"
  77843. #endif
  77844. "stm %[r]!, {r3, r4}\n\t"
  77845. "ldm %[b]!, {r5, r6}\n\t"
  77846. "ldm %[a]!, {r3, r4}\n\t"
  77847. #ifdef WOLFSSL_KEIL
  77848. "sbcs r3, r3, r5\n\t"
  77849. #elif defined(__clang__)
  77850. "sbcs r3, r5\n\t"
  77851. #else
  77852. "sbc r3, r5\n\t"
  77853. #endif
  77854. #ifdef WOLFSSL_KEIL
  77855. "sbcs r4, r4, r6\n\t"
  77856. #elif defined(__clang__)
  77857. "sbcs r4, r6\n\t"
  77858. #else
  77859. "sbc r4, r6\n\t"
  77860. #endif
  77861. "stm %[r]!, {r3, r4}\n\t"
  77862. "ldm %[b]!, {r5, r6}\n\t"
  77863. "ldm %[a]!, {r3, r4}\n\t"
  77864. #ifdef WOLFSSL_KEIL
  77865. "sbcs r3, r3, r5\n\t"
  77866. #elif defined(__clang__)
  77867. "sbcs r3, r5\n\t"
  77868. #else
  77869. "sbc r3, r5\n\t"
  77870. #endif
  77871. #ifdef WOLFSSL_KEIL
  77872. "sbcs r4, r4, r6\n\t"
  77873. #elif defined(__clang__)
  77874. "sbcs r4, r6\n\t"
  77875. #else
  77876. "sbc r4, r6\n\t"
  77877. #endif
  77878. "stm %[r]!, {r3, r4}\n\t"
  77879. "ldm %[b]!, {r5, r6}\n\t"
  77880. "ldm %[a]!, {r3, r4}\n\t"
  77881. #ifdef WOLFSSL_KEIL
  77882. "sbcs r3, r3, r5\n\t"
  77883. #elif defined(__clang__)
  77884. "sbcs r3, r5\n\t"
  77885. #else
  77886. "sbc r3, r5\n\t"
  77887. #endif
  77888. #ifdef WOLFSSL_KEIL
  77889. "sbcs r4, r4, r6\n\t"
  77890. #elif defined(__clang__)
  77891. "sbcs r4, r6\n\t"
  77892. #else
  77893. "sbc r4, r6\n\t"
  77894. #endif
  77895. "stm %[r]!, {r3, r4}\n\t"
  77896. #ifdef WOLFSSL_KEIL
  77897. "sbcs %[r], %[r], %[r]\n\t"
  77898. #elif defined(__clang__)
  77899. "sbcs %[r], %[r]\n\t"
  77900. #else
  77901. "sbc %[r], %[r]\n\t"
  77902. #endif
  77903. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  77904. :
  77905. : "memory", "r3", "r4", "r5", "r6"
  77906. );
  77907. return (uint32_t)(size_t)r;
  77908. }
  77909. #endif /* WOLFSSL_SP_SMALL */
  77910. /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
  77911. *
  77912. * d1 The high order half of the number to divide.
  77913. * d0 The low order half of the number to divide.
  77914. * div The dividend.
  77915. * returns the result of the division.
  77916. *
  77917. * Note that this is an approximate div. It may give an answer 1 larger.
  77918. */
  77919. SP_NOINLINE static sp_digit div_3072_word_96(sp_digit d1, sp_digit d0,
  77920. sp_digit div)
  77921. {
  77922. __asm__ __volatile__ (
  77923. "movs r3, #0\n\t"
  77924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77925. "lsrs r5, %[div], #1\n\t"
  77926. #else
  77927. "lsr r5, %[div], #1\n\t"
  77928. #endif
  77929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77930. "adds r5, r5, #1\n\t"
  77931. #else
  77932. "add r5, r5, #1\n\t"
  77933. #endif
  77934. "mov r8, %[d0]\n\t"
  77935. "mov r9, %[d1]\n\t"
  77936. "# Do top 32\n\t"
  77937. "movs r6, r5\n\t"
  77938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77939. "subs r6, r6, %[d1]\n\t"
  77940. #else
  77941. "sub r6, r6, %[d1]\n\t"
  77942. #endif
  77943. #ifdef WOLFSSL_KEIL
  77944. "sbcs r6, r6, r6\n\t"
  77945. #elif defined(__clang__)
  77946. "sbcs r6, r6\n\t"
  77947. #else
  77948. "sbc r6, r6\n\t"
  77949. #endif
  77950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77951. "adds r3, r3, r3\n\t"
  77952. #else
  77953. "add r3, r3, r3\n\t"
  77954. #endif
  77955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77956. "subs r3, r3, r6\n\t"
  77957. #else
  77958. "sub r3, r3, r6\n\t"
  77959. #endif
  77960. #ifdef WOLFSSL_KEIL
  77961. "ands r6, r6, r5\n\t"
  77962. #elif defined(__clang__)
  77963. "ands r6, r5\n\t"
  77964. #else
  77965. "and r6, r5\n\t"
  77966. #endif
  77967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77968. "subs %[d1], %[d1], r6\n\t"
  77969. #else
  77970. "sub %[d1], %[d1], r6\n\t"
  77971. #endif
  77972. "movs r4, #29\n\t"
  77973. "\n"
  77974. "L_div_3072_word_96_loop_%=:\n\t"
  77975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77976. "lsls %[d0], %[d0], #1\n\t"
  77977. #else
  77978. "lsl %[d0], %[d0], #1\n\t"
  77979. #endif
  77980. #ifdef WOLFSSL_KEIL
  77981. "adcs %[d1], %[d1], %[d1]\n\t"
  77982. #elif defined(__clang__)
  77983. "adcs %[d1], %[d1]\n\t"
  77984. #else
  77985. "adc %[d1], %[d1]\n\t"
  77986. #endif
  77987. "movs r6, r5\n\t"
  77988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77989. "subs r6, r6, %[d1]\n\t"
  77990. #else
  77991. "sub r6, r6, %[d1]\n\t"
  77992. #endif
  77993. #ifdef WOLFSSL_KEIL
  77994. "sbcs r6, r6, r6\n\t"
  77995. #elif defined(__clang__)
  77996. "sbcs r6, r6\n\t"
  77997. #else
  77998. "sbc r6, r6\n\t"
  77999. #endif
  78000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78001. "adds r3, r3, r3\n\t"
  78002. #else
  78003. "add r3, r3, r3\n\t"
  78004. #endif
  78005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78006. "subs r3, r3, r6\n\t"
  78007. #else
  78008. "sub r3, r3, r6\n\t"
  78009. #endif
  78010. #ifdef WOLFSSL_KEIL
  78011. "ands r6, r6, r5\n\t"
  78012. #elif defined(__clang__)
  78013. "ands r6, r5\n\t"
  78014. #else
  78015. "and r6, r5\n\t"
  78016. #endif
  78017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78018. "subs %[d1], %[d1], r6\n\t"
  78019. #else
  78020. "sub %[d1], %[d1], r6\n\t"
  78021. #endif
  78022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78023. "subs r4, r4, #1\n\t"
  78024. #else
  78025. "sub r4, r4, #1\n\t"
  78026. #endif
  78027. "bpl L_div_3072_word_96_loop_%=\n\t"
  78028. "movs r7, #0\n\t"
  78029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78030. "adds r3, r3, r3\n\t"
  78031. #else
  78032. "add r3, r3, r3\n\t"
  78033. #endif
  78034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78035. "adds r3, r3, #1\n\t"
  78036. #else
  78037. "add r3, r3, #1\n\t"
  78038. #endif
  78039. "# r * div - Start\n\t"
  78040. "uxth %[d1], r3\n\t"
  78041. "uxth r4, %[div]\n\t"
  78042. #ifdef WOLFSSL_KEIL
  78043. "muls r4, %[d1], r4\n\t"
  78044. #elif defined(__clang__)
  78045. "muls r4, %[d1]\n\t"
  78046. #else
  78047. "mul r4, %[d1]\n\t"
  78048. #endif
  78049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78050. "lsrs r6, %[div], #16\n\t"
  78051. #else
  78052. "lsr r6, %[div], #16\n\t"
  78053. #endif
  78054. #ifdef WOLFSSL_KEIL
  78055. "muls %[d1], r6, %[d1]\n\t"
  78056. #elif defined(__clang__)
  78057. "muls %[d1], r6\n\t"
  78058. #else
  78059. "mul %[d1], r6\n\t"
  78060. #endif
  78061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78062. "lsrs r5, %[d1], #16\n\t"
  78063. #else
  78064. "lsr r5, %[d1], #16\n\t"
  78065. #endif
  78066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78067. "lsls %[d1], %[d1], #16\n\t"
  78068. #else
  78069. "lsl %[d1], %[d1], #16\n\t"
  78070. #endif
  78071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78072. "adds r4, r4, %[d1]\n\t"
  78073. #else
  78074. "add r4, r4, %[d1]\n\t"
  78075. #endif
  78076. #ifdef WOLFSSL_KEIL
  78077. "adcs r5, r5, r7\n\t"
  78078. #elif defined(__clang__)
  78079. "adcs r5, r7\n\t"
  78080. #else
  78081. "adc r5, r7\n\t"
  78082. #endif
  78083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78084. "lsrs %[d1], r3, #16\n\t"
  78085. #else
  78086. "lsr %[d1], r3, #16\n\t"
  78087. #endif
  78088. #ifdef WOLFSSL_KEIL
  78089. "muls r6, %[d1], r6\n\t"
  78090. #elif defined(__clang__)
  78091. "muls r6, %[d1]\n\t"
  78092. #else
  78093. "mul r6, %[d1]\n\t"
  78094. #endif
  78095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78096. "adds r5, r5, r6\n\t"
  78097. #else
  78098. "add r5, r5, r6\n\t"
  78099. #endif
  78100. "uxth r6, %[div]\n\t"
  78101. #ifdef WOLFSSL_KEIL
  78102. "muls %[d1], r6, %[d1]\n\t"
  78103. #elif defined(__clang__)
  78104. "muls %[d1], r6\n\t"
  78105. #else
  78106. "mul %[d1], r6\n\t"
  78107. #endif
  78108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78109. "lsrs r6, %[d1], #16\n\t"
  78110. #else
  78111. "lsr r6, %[d1], #16\n\t"
  78112. #endif
  78113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78114. "lsls %[d1], %[d1], #16\n\t"
  78115. #else
  78116. "lsl %[d1], %[d1], #16\n\t"
  78117. #endif
  78118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78119. "adds r4, r4, %[d1]\n\t"
  78120. #else
  78121. "add r4, r4, %[d1]\n\t"
  78122. #endif
  78123. #ifdef WOLFSSL_KEIL
  78124. "adcs r5, r5, r6\n\t"
  78125. #elif defined(__clang__)
  78126. "adcs r5, r6\n\t"
  78127. #else
  78128. "adc r5, r6\n\t"
  78129. #endif
  78130. "# r * div - Done\n\t"
  78131. "mov %[d1], r8\n\t"
  78132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78133. "subs %[d1], %[d1], r4\n\t"
  78134. #else
  78135. "sub %[d1], %[d1], r4\n\t"
  78136. #endif
  78137. "movs r4, %[d1]\n\t"
  78138. "mov %[d1], r9\n\t"
  78139. #ifdef WOLFSSL_KEIL
  78140. "sbcs %[d1], %[d1], r5\n\t"
  78141. #elif defined(__clang__)
  78142. "sbcs %[d1], r5\n\t"
  78143. #else
  78144. "sbc %[d1], r5\n\t"
  78145. #endif
  78146. "movs r5, %[d1]\n\t"
  78147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78148. "adds r3, r3, r5\n\t"
  78149. #else
  78150. "add r3, r3, r5\n\t"
  78151. #endif
  78152. "# r * div - Start\n\t"
  78153. "uxth %[d1], r3\n\t"
  78154. "uxth r4, %[div]\n\t"
  78155. #ifdef WOLFSSL_KEIL
  78156. "muls r4, %[d1], r4\n\t"
  78157. #elif defined(__clang__)
  78158. "muls r4, %[d1]\n\t"
  78159. #else
  78160. "mul r4, %[d1]\n\t"
  78161. #endif
  78162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78163. "lsrs r6, %[div], #16\n\t"
  78164. #else
  78165. "lsr r6, %[div], #16\n\t"
  78166. #endif
  78167. #ifdef WOLFSSL_KEIL
  78168. "muls %[d1], r6, %[d1]\n\t"
  78169. #elif defined(__clang__)
  78170. "muls %[d1], r6\n\t"
  78171. #else
  78172. "mul %[d1], r6\n\t"
  78173. #endif
  78174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78175. "lsrs r5, %[d1], #16\n\t"
  78176. #else
  78177. "lsr r5, %[d1], #16\n\t"
  78178. #endif
  78179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78180. "lsls %[d1], %[d1], #16\n\t"
  78181. #else
  78182. "lsl %[d1], %[d1], #16\n\t"
  78183. #endif
  78184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78185. "adds r4, r4, %[d1]\n\t"
  78186. #else
  78187. "add r4, r4, %[d1]\n\t"
  78188. #endif
  78189. #ifdef WOLFSSL_KEIL
  78190. "adcs r5, r5, r7\n\t"
  78191. #elif defined(__clang__)
  78192. "adcs r5, r7\n\t"
  78193. #else
  78194. "adc r5, r7\n\t"
  78195. #endif
  78196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78197. "lsrs %[d1], r3, #16\n\t"
  78198. #else
  78199. "lsr %[d1], r3, #16\n\t"
  78200. #endif
  78201. #ifdef WOLFSSL_KEIL
  78202. "muls r6, %[d1], r6\n\t"
  78203. #elif defined(__clang__)
  78204. "muls r6, %[d1]\n\t"
  78205. #else
  78206. "mul r6, %[d1]\n\t"
  78207. #endif
  78208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78209. "adds r5, r5, r6\n\t"
  78210. #else
  78211. "add r5, r5, r6\n\t"
  78212. #endif
  78213. "uxth r6, %[div]\n\t"
  78214. #ifdef WOLFSSL_KEIL
  78215. "muls %[d1], r6, %[d1]\n\t"
  78216. #elif defined(__clang__)
  78217. "muls %[d1], r6\n\t"
  78218. #else
  78219. "mul %[d1], r6\n\t"
  78220. #endif
  78221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78222. "lsrs r6, %[d1], #16\n\t"
  78223. #else
  78224. "lsr r6, %[d1], #16\n\t"
  78225. #endif
  78226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78227. "lsls %[d1], %[d1], #16\n\t"
  78228. #else
  78229. "lsl %[d1], %[d1], #16\n\t"
  78230. #endif
  78231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78232. "adds r4, r4, %[d1]\n\t"
  78233. #else
  78234. "add r4, r4, %[d1]\n\t"
  78235. #endif
  78236. #ifdef WOLFSSL_KEIL
  78237. "adcs r5, r5, r6\n\t"
  78238. #elif defined(__clang__)
  78239. "adcs r5, r6\n\t"
  78240. #else
  78241. "adc r5, r6\n\t"
  78242. #endif
  78243. "# r * div - Done\n\t"
  78244. "mov %[d1], r8\n\t"
  78245. "mov r6, r9\n\t"
  78246. #ifdef WOLFSSL_KEIL
  78247. "subs r4, %[d1], r4\n\t"
  78248. #else
  78249. #ifdef __clang__
  78250. "subs r4, %[d1], r4\n\t"
  78251. #else
  78252. "sub r4, %[d1], r4\n\t"
  78253. #endif
  78254. #endif
  78255. #ifdef WOLFSSL_KEIL
  78256. "sbcs r6, r6, r5\n\t"
  78257. #elif defined(__clang__)
  78258. "sbcs r6, r5\n\t"
  78259. #else
  78260. "sbc r6, r5\n\t"
  78261. #endif
  78262. "movs r5, r6\n\t"
  78263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78264. "adds r3, r3, r5\n\t"
  78265. #else
  78266. "add r3, r3, r5\n\t"
  78267. #endif
  78268. "# r * div - Start\n\t"
  78269. "uxth %[d1], r3\n\t"
  78270. "uxth r4, %[div]\n\t"
  78271. #ifdef WOLFSSL_KEIL
  78272. "muls r4, %[d1], r4\n\t"
  78273. #elif defined(__clang__)
  78274. "muls r4, %[d1]\n\t"
  78275. #else
  78276. "mul r4, %[d1]\n\t"
  78277. #endif
  78278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78279. "lsrs r6, %[div], #16\n\t"
  78280. #else
  78281. "lsr r6, %[div], #16\n\t"
  78282. #endif
  78283. #ifdef WOLFSSL_KEIL
  78284. "muls %[d1], r6, %[d1]\n\t"
  78285. #elif defined(__clang__)
  78286. "muls %[d1], r6\n\t"
  78287. #else
  78288. "mul %[d1], r6\n\t"
  78289. #endif
  78290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78291. "lsrs r5, %[d1], #16\n\t"
  78292. #else
  78293. "lsr r5, %[d1], #16\n\t"
  78294. #endif
  78295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78296. "lsls %[d1], %[d1], #16\n\t"
  78297. #else
  78298. "lsl %[d1], %[d1], #16\n\t"
  78299. #endif
  78300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78301. "adds r4, r4, %[d1]\n\t"
  78302. #else
  78303. "add r4, r4, %[d1]\n\t"
  78304. #endif
  78305. #ifdef WOLFSSL_KEIL
  78306. "adcs r5, r5, r7\n\t"
  78307. #elif defined(__clang__)
  78308. "adcs r5, r7\n\t"
  78309. #else
  78310. "adc r5, r7\n\t"
  78311. #endif
  78312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78313. "lsrs %[d1], r3, #16\n\t"
  78314. #else
  78315. "lsr %[d1], r3, #16\n\t"
  78316. #endif
  78317. #ifdef WOLFSSL_KEIL
  78318. "muls r6, %[d1], r6\n\t"
  78319. #elif defined(__clang__)
  78320. "muls r6, %[d1]\n\t"
  78321. #else
  78322. "mul r6, %[d1]\n\t"
  78323. #endif
  78324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78325. "adds r5, r5, r6\n\t"
  78326. #else
  78327. "add r5, r5, r6\n\t"
  78328. #endif
  78329. "uxth r6, %[div]\n\t"
  78330. #ifdef WOLFSSL_KEIL
  78331. "muls %[d1], r6, %[d1]\n\t"
  78332. #elif defined(__clang__)
  78333. "muls %[d1], r6\n\t"
  78334. #else
  78335. "mul %[d1], r6\n\t"
  78336. #endif
  78337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78338. "lsrs r6, %[d1], #16\n\t"
  78339. #else
  78340. "lsr r6, %[d1], #16\n\t"
  78341. #endif
  78342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78343. "lsls %[d1], %[d1], #16\n\t"
  78344. #else
  78345. "lsl %[d1], %[d1], #16\n\t"
  78346. #endif
  78347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78348. "adds r4, r4, %[d1]\n\t"
  78349. #else
  78350. "add r4, r4, %[d1]\n\t"
  78351. #endif
  78352. #ifdef WOLFSSL_KEIL
  78353. "adcs r5, r5, r6\n\t"
  78354. #elif defined(__clang__)
  78355. "adcs r5, r6\n\t"
  78356. #else
  78357. "adc r5, r6\n\t"
  78358. #endif
  78359. "# r * div - Done\n\t"
  78360. "mov %[d1], r8\n\t"
  78361. "mov r6, r9\n\t"
  78362. #ifdef WOLFSSL_KEIL
  78363. "subs r4, %[d1], r4\n\t"
  78364. #else
  78365. #ifdef __clang__
  78366. "subs r4, %[d1], r4\n\t"
  78367. #else
  78368. "sub r4, %[d1], r4\n\t"
  78369. #endif
  78370. #endif
  78371. #ifdef WOLFSSL_KEIL
  78372. "sbcs r6, r6, r5\n\t"
  78373. #elif defined(__clang__)
  78374. "sbcs r6, r5\n\t"
  78375. #else
  78376. "sbc r6, r5\n\t"
  78377. #endif
  78378. "movs r5, r6\n\t"
  78379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78380. "adds r3, r3, r5\n\t"
  78381. #else
  78382. "add r3, r3, r5\n\t"
  78383. #endif
  78384. "movs r6, %[div]\n\t"
  78385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78386. "subs r6, r6, r4\n\t"
  78387. #else
  78388. "sub r6, r6, r4\n\t"
  78389. #endif
  78390. #ifdef WOLFSSL_KEIL
  78391. "sbcs r6, r6, r6\n\t"
  78392. #elif defined(__clang__)
  78393. "sbcs r6, r6\n\t"
  78394. #else
  78395. "sbc r6, r6\n\t"
  78396. #endif
  78397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78398. "subs r3, r3, r6\n\t"
  78399. #else
  78400. "sub r3, r3, r6\n\t"
  78401. #endif
  78402. "movs %[d1], r3\n\t"
  78403. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  78404. :
  78405. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  78406. );
  78407. return (uint32_t)(size_t)d1;
  78408. }
  78409. /* Divide d in a and put remainder into r (m*d + r = a)
  78410. * m is not calculated as it is not needed at this time.
  78411. *
  78412. * a Number to be divided.
  78413. * d Number to divide with.
  78414. * m Multiplier result.
  78415. * r Remainder from the division.
  78416. * returns MP_OKAY indicating success.
  78417. */
  78418. static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  78419. sp_digit* r)
  78420. {
  78421. sp_digit t1[192], t2[97];
  78422. sp_digit div, r1;
  78423. int i;
  78424. (void)m;
  78425. div = d[95];
  78426. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  78427. for (i=95; i>=0; i--) {
  78428. sp_digit hi = t1[96 + i] - (t1[96 + i] == div);
  78429. r1 = div_3072_word_96(hi, t1[96 + i - 1], div);
  78430. sp_3072_mul_d_96(t2, d, r1);
  78431. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  78432. t1[96 + i] -= t2[96];
  78433. if (t1[96 + i] != 0) {
  78434. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  78435. if (t1[96 + i] != 0)
  78436. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  78437. }
  78438. }
  78439. for (i = 95; i > 0; i--) {
  78440. if (t1[i] != d[i])
  78441. break;
  78442. }
  78443. if (t1[i] >= d[i]) {
  78444. sp_3072_sub_96(r, t1, d);
  78445. }
  78446. else {
  78447. XMEMCPY(r, t1, sizeof(*t1) * 96);
  78448. }
  78449. return MP_OKAY;
  78450. }
  78451. /* Reduce a modulo m into r. (r = a mod m)
  78452. *
  78453. * r A single precision number that is the reduced result.
  78454. * a A single precision number that is to be reduced.
  78455. * m A single precision number that is the modulus to reduce with.
  78456. * returns MP_OKAY indicating success.
  78457. */
  78458. static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  78459. {
  78460. return sp_3072_div_96_cond(a, m, NULL, r);
  78461. }
  78462. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  78463. /* AND m into each word of a and store in r.
  78464. *
  78465. * r A single precision integer.
  78466. * a A single precision integer.
  78467. * m Mask to AND against each digit.
  78468. */
  78469. static void sp_3072_mask_96(sp_digit* r, const sp_digit* a, sp_digit m)
  78470. {
  78471. #ifdef WOLFSSL_SP_SMALL
  78472. int i;
  78473. for (i=0; i<96; i++) {
  78474. r[i] = a[i] & m;
  78475. }
  78476. #else
  78477. int i;
  78478. for (i = 0; i < 96; i += 8) {
  78479. r[i+0] = a[i+0] & m;
  78480. r[i+1] = a[i+1] & m;
  78481. r[i+2] = a[i+2] & m;
  78482. r[i+3] = a[i+3] & m;
  78483. r[i+4] = a[i+4] & m;
  78484. r[i+5] = a[i+5] & m;
  78485. r[i+6] = a[i+6] & m;
  78486. r[i+7] = a[i+7] & m;
  78487. }
  78488. #endif
  78489. }
  78490. /* Compare a with b in constant time.
  78491. *
  78492. * a A single precision integer.
  78493. * b A single precision integer.
  78494. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  78495. * respectively.
  78496. */
  78497. SP_NOINLINE static sp_int32 sp_3072_cmp_96(const sp_digit* a, const sp_digit* b)
  78498. {
  78499. __asm__ __volatile__ (
  78500. "movs r2, #0\n\t"
  78501. "movs r3, #0\n\t"
  78502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78503. "mvns r3, r3\n\t"
  78504. #else
  78505. "mvn r3, r3\n\t"
  78506. #endif
  78507. "movs r6, #0xff\n\t"
  78508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78509. "adds r6, r6, #0x7d\n\t"
  78510. #else
  78511. "add r6, r6, #0x7d\n\t"
  78512. #endif
  78513. "\n"
  78514. "L_sp_3072_cmp_96_words_%=:\n\t"
  78515. "ldr r7, [%[a], r6]\n\t"
  78516. "ldr r5, [%[b], r6]\n\t"
  78517. #ifdef WOLFSSL_KEIL
  78518. "ands r7, r7, r3\n\t"
  78519. #elif defined(__clang__)
  78520. "ands r7, r3\n\t"
  78521. #else
  78522. "and r7, r3\n\t"
  78523. #endif
  78524. #ifdef WOLFSSL_KEIL
  78525. "ands r5, r5, r3\n\t"
  78526. #elif defined(__clang__)
  78527. "ands r5, r3\n\t"
  78528. #else
  78529. "and r5, r3\n\t"
  78530. #endif
  78531. "movs r4, r7\n\t"
  78532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78533. "subs r7, r7, r5\n\t"
  78534. #else
  78535. "sub r7, r7, r5\n\t"
  78536. #endif
  78537. #ifdef WOLFSSL_KEIL
  78538. "sbcs r7, r7, r7\n\t"
  78539. #elif defined(__clang__)
  78540. "sbcs r7, r7\n\t"
  78541. #else
  78542. "sbc r7, r7\n\t"
  78543. #endif
  78544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78545. "adds r2, r2, r7\n\t"
  78546. #else
  78547. "add r2, r2, r7\n\t"
  78548. #endif
  78549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78550. "mvns r7, r7\n\t"
  78551. #else
  78552. "mvn r7, r7\n\t"
  78553. #endif
  78554. #ifdef WOLFSSL_KEIL
  78555. "ands r3, r3, r7\n\t"
  78556. #elif defined(__clang__)
  78557. "ands r3, r7\n\t"
  78558. #else
  78559. "and r3, r7\n\t"
  78560. #endif
  78561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78562. "subs r5, r5, r4\n\t"
  78563. #else
  78564. "sub r5, r5, r4\n\t"
  78565. #endif
  78566. #ifdef WOLFSSL_KEIL
  78567. "sbcs r7, r7, r7\n\t"
  78568. #elif defined(__clang__)
  78569. "sbcs r7, r7\n\t"
  78570. #else
  78571. "sbc r7, r7\n\t"
  78572. #endif
  78573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78574. "subs r2, r2, r7\n\t"
  78575. #else
  78576. "sub r2, r2, r7\n\t"
  78577. #endif
  78578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78579. "mvns r7, r7\n\t"
  78580. #else
  78581. "mvn r7, r7\n\t"
  78582. #endif
  78583. #ifdef WOLFSSL_KEIL
  78584. "ands r3, r3, r7\n\t"
  78585. #elif defined(__clang__)
  78586. "ands r3, r7\n\t"
  78587. #else
  78588. "and r3, r7\n\t"
  78589. #endif
  78590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78591. "subs r6, r6, #4\n\t"
  78592. #else
  78593. "sub r6, r6, #4\n\t"
  78594. #endif
  78595. "cmp r6, #0\n\t"
  78596. "bge L_sp_3072_cmp_96_words_%=\n\t"
  78597. "movs %[a], r2\n\t"
  78598. : [a] "+r" (a), [b] "+r" (b)
  78599. :
  78600. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  78601. );
  78602. return (uint32_t)(size_t)a;
  78603. }
  78604. /* Divide d in a and put remainder into r (m*d + r = a)
  78605. * m is not calculated as it is not needed at this time.
  78606. *
  78607. * a Number to be divided.
  78608. * d Number to divide with.
  78609. * m Multiplier result.
  78610. * r Remainder from the division.
  78611. * returns MP_OKAY indicating success.
  78612. */
  78613. static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d, sp_digit* m,
  78614. sp_digit* r)
  78615. {
  78616. sp_digit t1[192], t2[97];
  78617. sp_digit div, r1;
  78618. int i;
  78619. (void)m;
  78620. div = d[95];
  78621. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  78622. for (i=95; i>=0; i--) {
  78623. sp_digit hi = t1[96 + i] - (t1[96 + i] == div);
  78624. r1 = div_3072_word_96(hi, t1[96 + i - 1], div);
  78625. sp_3072_mul_d_96(t2, d, r1);
  78626. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  78627. t1[96 + i] -= t2[96];
  78628. sp_3072_mask_96(t2, d, t1[96 + i]);
  78629. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  78630. sp_3072_mask_96(t2, d, t1[96 + i]);
  78631. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  78632. }
  78633. r1 = sp_3072_cmp_96(t1, d) >= 0;
  78634. sp_3072_cond_sub_96(r, t1, d, (sp_digit)0 - r1);
  78635. return MP_OKAY;
  78636. }
  78637. /* Reduce a modulo m into r. (r = a mod m)
  78638. *
  78639. * r A single precision number that is the reduced result.
  78640. * a A single precision number that is to be reduced.
  78641. * m A single precision number that is the modulus to reduce with.
  78642. * returns MP_OKAY indicating success.
  78643. */
  78644. static WC_INLINE int sp_3072_mod_96(sp_digit* r, const sp_digit* a, const sp_digit* m)
  78645. {
  78646. return sp_3072_div_96(a, m, NULL, r);
  78647. }
  78648. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  78649. defined(WOLFSSL_HAVE_SP_DH)
  78650. #ifdef WOLFSSL_SP_SMALL
  78651. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  78652. *
  78653. * r A single precision number that is the result of the operation.
  78654. * a A single precision number being exponentiated.
  78655. * e A single precision number that is the exponent.
  78656. * bits The number of bits in the exponent.
  78657. * m A single precision number that is the modulus.
  78658. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  78659. */
  78660. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  78661. int bits, const sp_digit* m, int reduceA)
  78662. {
  78663. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  78664. sp_digit* td = NULL;
  78665. #else
  78666. sp_digit td[8 * 192];
  78667. #endif
  78668. sp_digit* t[8];
  78669. sp_digit* norm = NULL;
  78670. sp_digit mp = 1;
  78671. sp_digit n;
  78672. sp_digit mask;
  78673. int i;
  78674. int c;
  78675. byte y;
  78676. int err = MP_OKAY;
  78677. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  78678. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 192), NULL,
  78679. DYNAMIC_TYPE_TMP_BUFFER);
  78680. if (td == NULL)
  78681. err = MEMORY_E;
  78682. #endif
  78683. if (err == MP_OKAY) {
  78684. norm = td;
  78685. for (i=0; i<8; i++) {
  78686. t[i] = td + i * 192;
  78687. }
  78688. sp_3072_mont_setup(m, &mp);
  78689. sp_3072_mont_norm_96(norm, m);
  78690. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  78691. if (reduceA != 0) {
  78692. err = sp_3072_mod_96(t[1] + 96, a, m);
  78693. if (err == MP_OKAY) {
  78694. err = sp_3072_mod_96(t[1], t[1], m);
  78695. }
  78696. }
  78697. else {
  78698. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  78699. err = sp_3072_mod_96(t[1], t[1], m);
  78700. }
  78701. }
  78702. if (err == MP_OKAY) {
  78703. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  78704. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  78705. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  78706. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  78707. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  78708. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  78709. i = (bits - 1) / 32;
  78710. n = e[i--];
  78711. c = bits & 31;
  78712. if (c == 0) {
  78713. c = 32;
  78714. }
  78715. c -= bits % 3;
  78716. if (c == 32) {
  78717. c = 29;
  78718. }
  78719. if (c < 0) {
  78720. /* Number of bits in top word is less than number needed. */
  78721. c = -c;
  78722. y = (byte)(n << c);
  78723. n = e[i--];
  78724. y |= (byte)(n >> (64 - c));
  78725. n <<= c;
  78726. c = 64 - c;
  78727. }
  78728. else {
  78729. y = (byte)(n >> c);
  78730. n <<= 32 - c;
  78731. }
  78732. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  78733. for (; i>=0 || c>=3; ) {
  78734. if (c == 0) {
  78735. n = e[i--];
  78736. y = (byte)(n >> 29);
  78737. n <<= 3;
  78738. c = 29;
  78739. }
  78740. else if (c < 3) {
  78741. y = (byte)(n >> 29);
  78742. n = e[i--];
  78743. c = 3 - c;
  78744. y |= (byte)(n >> (32 - c));
  78745. n <<= c;
  78746. c = 32 - c;
  78747. }
  78748. else {
  78749. y = (byte)((n >> 29) & 0x7);
  78750. n <<= 3;
  78751. c -= 3;
  78752. }
  78753. sp_3072_mont_sqr_96(r, r, m, mp);
  78754. sp_3072_mont_sqr_96(r, r, m, mp);
  78755. sp_3072_mont_sqr_96(r, r, m, mp);
  78756. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  78757. }
  78758. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  78759. sp_3072_mont_reduce_96(r, m, mp);
  78760. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  78761. sp_3072_cond_sub_96(r, r, m, mask);
  78762. }
  78763. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  78764. if (td != NULL)
  78765. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  78766. #endif
  78767. return err;
  78768. }
  78769. #else
  78770. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  78771. *
  78772. * r A single precision number that is the result of the operation.
  78773. * a A single precision number being exponentiated.
  78774. * e A single precision number that is the exponent.
  78775. * bits The number of bits in the exponent.
  78776. * m A single precision number that is the modulus.
  78777. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  78778. */
  78779. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  78780. int bits, const sp_digit* m, int reduceA)
  78781. {
  78782. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  78783. sp_digit* td = NULL;
  78784. #else
  78785. sp_digit td[16 * 192];
  78786. #endif
  78787. sp_digit* t[16];
  78788. sp_digit* norm = NULL;
  78789. sp_digit mp = 1;
  78790. sp_digit n;
  78791. sp_digit mask;
  78792. int i;
  78793. int c;
  78794. byte y;
  78795. int err = MP_OKAY;
  78796. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  78797. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 192), NULL,
  78798. DYNAMIC_TYPE_TMP_BUFFER);
  78799. if (td == NULL)
  78800. err = MEMORY_E;
  78801. #endif
  78802. if (err == MP_OKAY) {
  78803. norm = td;
  78804. for (i=0; i<16; i++) {
  78805. t[i] = td + i * 192;
  78806. }
  78807. sp_3072_mont_setup(m, &mp);
  78808. sp_3072_mont_norm_96(norm, m);
  78809. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  78810. if (reduceA != 0) {
  78811. err = sp_3072_mod_96(t[1] + 96, a, m);
  78812. if (err == MP_OKAY) {
  78813. err = sp_3072_mod_96(t[1], t[1], m);
  78814. }
  78815. }
  78816. else {
  78817. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  78818. err = sp_3072_mod_96(t[1], t[1], m);
  78819. }
  78820. }
  78821. if (err == MP_OKAY) {
  78822. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  78823. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  78824. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  78825. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  78826. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  78827. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  78828. sp_3072_mont_sqr_96(t[ 8], t[ 4], m, mp);
  78829. sp_3072_mont_mul_96(t[ 9], t[ 5], t[ 4], m, mp);
  78830. sp_3072_mont_sqr_96(t[10], t[ 5], m, mp);
  78831. sp_3072_mont_mul_96(t[11], t[ 6], t[ 5], m, mp);
  78832. sp_3072_mont_sqr_96(t[12], t[ 6], m, mp);
  78833. sp_3072_mont_mul_96(t[13], t[ 7], t[ 6], m, mp);
  78834. sp_3072_mont_sqr_96(t[14], t[ 7], m, mp);
  78835. sp_3072_mont_mul_96(t[15], t[ 8], t[ 7], m, mp);
  78836. i = (bits - 1) / 32;
  78837. n = e[i--];
  78838. c = bits & 31;
  78839. if (c == 0) {
  78840. c = 32;
  78841. }
  78842. c -= bits % 4;
  78843. if (c == 32) {
  78844. c = 28;
  78845. }
  78846. if (c < 0) {
  78847. /* Number of bits in top word is less than number needed. */
  78848. c = -c;
  78849. y = (byte)(n << c);
  78850. n = e[i--];
  78851. y |= (byte)(n >> (64 - c));
  78852. n <<= c;
  78853. c = 64 - c;
  78854. }
  78855. else {
  78856. y = (byte)(n >> c);
  78857. n <<= 32 - c;
  78858. }
  78859. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  78860. for (; i>=0 || c>=4; ) {
  78861. if (c == 0) {
  78862. n = e[i--];
  78863. y = (byte)(n >> 28);
  78864. n <<= 4;
  78865. c = 28;
  78866. }
  78867. else if (c < 4) {
  78868. y = (byte)(n >> 28);
  78869. n = e[i--];
  78870. c = 4 - c;
  78871. y |= (byte)(n >> (32 - c));
  78872. n <<= c;
  78873. c = 32 - c;
  78874. }
  78875. else {
  78876. y = (byte)((n >> 28) & 0xf);
  78877. n <<= 4;
  78878. c -= 4;
  78879. }
  78880. sp_3072_mont_sqr_96(r, r, m, mp);
  78881. sp_3072_mont_sqr_96(r, r, m, mp);
  78882. sp_3072_mont_sqr_96(r, r, m, mp);
  78883. sp_3072_mont_sqr_96(r, r, m, mp);
  78884. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  78885. }
  78886. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  78887. sp_3072_mont_reduce_96(r, m, mp);
  78888. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  78889. sp_3072_cond_sub_96(r, r, m, mask);
  78890. }
  78891. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  78892. if (td != NULL)
  78893. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  78894. #endif
  78895. return err;
  78896. }
  78897. #endif /* WOLFSSL_SP_SMALL */
  78898. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  78899. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  78900. #ifdef WOLFSSL_HAVE_SP_RSA
  78901. /* RSA public key operation.
  78902. *
  78903. * in Array of bytes representing the number to exponentiate, base.
  78904. * inLen Number of bytes in base.
  78905. * em Public exponent.
  78906. * mm Modulus.
  78907. * out Buffer to hold big-endian bytes of exponentiation result.
  78908. * Must be at least 384 bytes long.
  78909. * outLen Number of bytes in result.
  78910. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  78911. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  78912. */
  78913. int sp_RsaPublic_3072(const byte* in, word32 inLen, const mp_int* em,
  78914. const mp_int* mm, byte* out, word32* outLen)
  78915. {
  78916. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  78917. sp_digit* a = NULL;
  78918. #else
  78919. sp_digit a[96 * 5];
  78920. #endif
  78921. sp_digit* m = NULL;
  78922. sp_digit* r = NULL;
  78923. sp_digit *ah = NULL;
  78924. sp_digit e[1] = {0};
  78925. int err = MP_OKAY;
  78926. if (*outLen < 384) {
  78927. err = MP_TO_E;
  78928. }
  78929. else if (mp_count_bits(em) > 32 || inLen > 384 ||
  78930. mp_count_bits(mm) != 3072) {
  78931. err = MP_READ_E;
  78932. }
  78933. else if (mp_iseven(mm)) {
  78934. err = MP_VAL;
  78935. }
  78936. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  78937. if (err == MP_OKAY) {
  78938. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 5, NULL,
  78939. DYNAMIC_TYPE_RSA);
  78940. if (a == NULL)
  78941. err = MEMORY_E;
  78942. }
  78943. #endif
  78944. if (err == MP_OKAY) {
  78945. r = a + 96 * 2;
  78946. m = r + 96 * 2;
  78947. ah = a + 96;
  78948. sp_3072_from_bin(ah, 96, in, inLen);
  78949. #if DIGIT_BIT >= 32
  78950. e[0] = em->dp[0];
  78951. #else
  78952. e[0] = em->dp[0];
  78953. if (em->used > 1) {
  78954. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  78955. }
  78956. #endif
  78957. if (e[0] == 0) {
  78958. err = MP_EXPTMOD_E;
  78959. }
  78960. }
  78961. if (err == MP_OKAY) {
  78962. sp_3072_from_mp(m, 96, mm);
  78963. if (e[0] == 0x3) {
  78964. if (err == MP_OKAY) {
  78965. sp_3072_sqr_96(r, ah);
  78966. err = sp_3072_mod_96_cond(r, r, m);
  78967. }
  78968. if (err == MP_OKAY) {
  78969. sp_3072_mul_96(r, ah, r);
  78970. err = sp_3072_mod_96_cond(r, r, m);
  78971. }
  78972. }
  78973. else {
  78974. int i;
  78975. sp_digit mp;
  78976. sp_3072_mont_setup(m, &mp);
  78977. /* Convert to Montgomery form. */
  78978. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  78979. err = sp_3072_mod_96_cond(a, a, m);
  78980. if (err == MP_OKAY) {
  78981. for (i = 31; i >= 0; i--) {
  78982. if (e[0] >> i) {
  78983. break;
  78984. }
  78985. }
  78986. XMEMCPY(r, a, sizeof(sp_digit) * 96);
  78987. for (i--; i>=0; i--) {
  78988. sp_3072_mont_sqr_96(r, r, m, mp);
  78989. if (((e[0] >> i) & 1) == 1) {
  78990. sp_3072_mont_mul_96(r, r, a, m, mp);
  78991. }
  78992. }
  78993. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96);
  78994. sp_3072_mont_reduce_96(r, m, mp);
  78995. for (i = 95; i > 0; i--) {
  78996. if (r[i] != m[i]) {
  78997. break;
  78998. }
  78999. }
  79000. if (r[i] >= m[i]) {
  79001. sp_3072_sub_in_place_96(r, m);
  79002. }
  79003. }
  79004. }
  79005. }
  79006. if (err == MP_OKAY) {
  79007. sp_3072_to_bin_96(r, out);
  79008. *outLen = 384;
  79009. }
  79010. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79011. if (a != NULL)
  79012. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  79013. #endif
  79014. return err;
  79015. }
  79016. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  79017. /* Conditionally add a and b using the mask m.
  79018. * m is -1 to add and 0 when not.
  79019. *
  79020. * r A single precision number representing conditional add result.
  79021. * a A single precision number to add with.
  79022. * b A single precision number to add.
  79023. * m Mask value to apply.
  79024. */
  79025. SP_NOINLINE static sp_digit sp_3072_cond_add_48(sp_digit* r, const sp_digit* a,
  79026. const sp_digit* b, sp_digit m)
  79027. {
  79028. __asm__ __volatile__ (
  79029. "movs r4, #0\n\t"
  79030. "movs r5, #0xc0\n\t"
  79031. "mov r8, r5\n\t"
  79032. "movs r7, #0\n\t"
  79033. "\n"
  79034. "L_sp_3072_cond_add_48_words_%=:\n\t"
  79035. "ldr r6, [%[b], r7]\n\t"
  79036. #ifdef WOLFSSL_KEIL
  79037. "ands r6, r6, %[m]\n\t"
  79038. #elif defined(__clang__)
  79039. "ands r6, %[m]\n\t"
  79040. #else
  79041. "and r6, %[m]\n\t"
  79042. #endif
  79043. "movs r5, #0\n\t"
  79044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79045. "subs r5, r5, #1\n\t"
  79046. #else
  79047. "sub r5, r5, #1\n\t"
  79048. #endif
  79049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79050. "adds r5, r5, r4\n\t"
  79051. #else
  79052. "add r5, r5, r4\n\t"
  79053. #endif
  79054. "ldr r5, [%[a], r7]\n\t"
  79055. #ifdef WOLFSSL_KEIL
  79056. "adcs r5, r5, r6\n\t"
  79057. #elif defined(__clang__)
  79058. "adcs r5, r6\n\t"
  79059. #else
  79060. "adc r5, r6\n\t"
  79061. #endif
  79062. "movs r4, #0\n\t"
  79063. #ifdef WOLFSSL_KEIL
  79064. "adcs r4, r4, r4\n\t"
  79065. #elif defined(__clang__)
  79066. "adcs r4, r4\n\t"
  79067. #else
  79068. "adc r4, r4\n\t"
  79069. #endif
  79070. "str r5, [%[r], r7]\n\t"
  79071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79072. "adds r7, r7, #4\n\t"
  79073. #else
  79074. "add r7, r7, #4\n\t"
  79075. #endif
  79076. "cmp r7, r8\n\t"
  79077. "blt L_sp_3072_cond_add_48_words_%=\n\t"
  79078. "movs %[r], r4\n\t"
  79079. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  79080. :
  79081. : "memory", "r4", "r5", "r6", "r7", "r8"
  79082. );
  79083. return (uint32_t)(size_t)r;
  79084. }
  79085. /* RSA private key operation.
  79086. *
  79087. * in Array of bytes representing the number to exponentiate, base.
  79088. * inLen Number of bytes in base.
  79089. * dm Private exponent.
  79090. * pm First prime.
  79091. * qm Second prime.
  79092. * dpm First prime's CRT exponent.
  79093. * dqm Second prime's CRT exponent.
  79094. * qim Inverse of second prime mod p.
  79095. * mm Modulus.
  79096. * out Buffer to hold big-endian bytes of exponentiation result.
  79097. * Must be at least 384 bytes long.
  79098. * outLen Number of bytes in result.
  79099. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  79100. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  79101. */
  79102. int sp_RsaPrivate_3072(const byte* in, word32 inLen, const mp_int* dm,
  79103. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  79104. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  79105. {
  79106. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  79107. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79108. sp_digit* d = NULL;
  79109. #else
  79110. sp_digit d[96 * 4];
  79111. #endif
  79112. sp_digit* a = NULL;
  79113. sp_digit* m = NULL;
  79114. sp_digit* r = NULL;
  79115. int err = MP_OKAY;
  79116. (void)pm;
  79117. (void)qm;
  79118. (void)dpm;
  79119. (void)dqm;
  79120. (void)qim;
  79121. if (*outLen < 384U) {
  79122. err = MP_TO_E;
  79123. }
  79124. if (err == MP_OKAY) {
  79125. if (mp_count_bits(dm) > 3072) {
  79126. err = MP_READ_E;
  79127. }
  79128. else if (inLen > 384) {
  79129. err = MP_READ_E;
  79130. }
  79131. else if (mp_count_bits(mm) != 3072) {
  79132. err = MP_READ_E;
  79133. }
  79134. else if (mp_iseven(mm)) {
  79135. err = MP_VAL;
  79136. }
  79137. }
  79138. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79139. if (err == MP_OKAY) {
  79140. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL,
  79141. DYNAMIC_TYPE_RSA);
  79142. if (d == NULL)
  79143. err = MEMORY_E;
  79144. }
  79145. #endif
  79146. if (err == MP_OKAY) {
  79147. a = d + 96;
  79148. m = a + 192;
  79149. r = a;
  79150. sp_3072_from_bin(a, 96, in, inLen);
  79151. sp_3072_from_mp(d, 96, dm);
  79152. sp_3072_from_mp(m, 96, mm);
  79153. err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0);
  79154. }
  79155. if (err == MP_OKAY) {
  79156. sp_3072_to_bin_96(r, out);
  79157. *outLen = 384;
  79158. }
  79159. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79160. if (d != NULL)
  79161. #endif
  79162. {
  79163. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  79164. if (a != NULL)
  79165. ForceZero(a, sizeof(sp_digit) * 96);
  79166. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79167. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  79168. #endif
  79169. }
  79170. return err;
  79171. #else
  79172. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79173. sp_digit* a = NULL;
  79174. #else
  79175. sp_digit a[48 * 11];
  79176. #endif
  79177. sp_digit* p = NULL;
  79178. sp_digit* q = NULL;
  79179. sp_digit* dp = NULL;
  79180. sp_digit* tmpa = NULL;
  79181. sp_digit* tmpb = NULL;
  79182. sp_digit* r = NULL;
  79183. sp_digit* qi = NULL;
  79184. sp_digit* dq = NULL;
  79185. sp_digit c;
  79186. int err = MP_OKAY;
  79187. (void)dm;
  79188. (void)mm;
  79189. if (*outLen < 384) {
  79190. err = MP_TO_E;
  79191. }
  79192. else if (inLen > 384 || mp_count_bits(mm) != 3072) {
  79193. err = MP_READ_E;
  79194. }
  79195. else if (mp_iseven(mm)) {
  79196. err = MP_VAL;
  79197. }
  79198. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79199. if (err == MP_OKAY) {
  79200. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 11, NULL,
  79201. DYNAMIC_TYPE_RSA);
  79202. if (a == NULL)
  79203. err = MEMORY_E;
  79204. }
  79205. #endif
  79206. if (err == MP_OKAY) {
  79207. p = a + 96 * 2;
  79208. q = p + 48;
  79209. qi = dq = dp = q + 48;
  79210. tmpa = qi + 48;
  79211. tmpb = tmpa + 96;
  79212. r = a;
  79213. sp_3072_from_bin(a, 96, in, inLen);
  79214. sp_3072_from_mp(p, 48, pm);
  79215. sp_3072_from_mp(q, 48, qm);
  79216. sp_3072_from_mp(dp, 48, dpm);
  79217. err = sp_3072_mod_exp_48(tmpa, a, dp, 1536, p, 1);
  79218. }
  79219. if (err == MP_OKAY) {
  79220. sp_3072_from_mp(dq, 48, dqm);
  79221. err = sp_3072_mod_exp_48(tmpb, a, dq, 1536, q, 1);
  79222. }
  79223. if (err == MP_OKAY) {
  79224. c = sp_3072_sub_in_place_48(tmpa, tmpb);
  79225. c += sp_3072_cond_add_48(tmpa, tmpa, p, c);
  79226. sp_3072_cond_add_48(tmpa, tmpa, p, c);
  79227. sp_3072_from_mp(qi, 48, qim);
  79228. sp_3072_mul_48(tmpa, tmpa, qi);
  79229. err = sp_3072_mod_48(tmpa, tmpa, p);
  79230. }
  79231. if (err == MP_OKAY) {
  79232. sp_3072_mul_48(tmpa, q, tmpa);
  79233. XMEMSET(&tmpb[48], 0, sizeof(sp_digit) * 48);
  79234. sp_3072_add_96(r, tmpb, tmpa);
  79235. sp_3072_to_bin_96(r, out);
  79236. *outLen = 384;
  79237. }
  79238. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79239. if (a != NULL)
  79240. #endif
  79241. {
  79242. ForceZero(a, sizeof(sp_digit) * 48 * 11);
  79243. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79244. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  79245. #endif
  79246. }
  79247. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  79248. return err;
  79249. }
  79250. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  79251. #endif /* WOLFSSL_HAVE_SP_RSA */
  79252. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  79253. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  79254. /* Convert an array of sp_digit to an mp_int.
  79255. *
  79256. * a A single precision integer.
  79257. * r A multi-precision integer.
  79258. */
  79259. static int sp_3072_to_mp(const sp_digit* a, mp_int* r)
  79260. {
  79261. int err;
  79262. err = mp_grow(r, (3072 + DIGIT_BIT - 1) / DIGIT_BIT);
  79263. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  79264. #if DIGIT_BIT == 32
  79265. XMEMCPY(r->dp, a, sizeof(sp_digit) * 96);
  79266. r->used = 96;
  79267. mp_clamp(r);
  79268. #elif DIGIT_BIT < 32
  79269. int i;
  79270. int j = 0;
  79271. int s = 0;
  79272. r->dp[0] = 0;
  79273. for (i = 0; i < 96; i++) {
  79274. r->dp[j] |= (mp_digit)(a[i] << s);
  79275. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  79276. s = DIGIT_BIT - s;
  79277. r->dp[++j] = (mp_digit)(a[i] >> s);
  79278. while (s + DIGIT_BIT <= 32) {
  79279. s += DIGIT_BIT;
  79280. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  79281. if (s == SP_WORD_SIZE) {
  79282. r->dp[j] = 0;
  79283. }
  79284. else {
  79285. r->dp[j] = (mp_digit)(a[i] >> s);
  79286. }
  79287. }
  79288. s = 32 - s;
  79289. }
  79290. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  79291. mp_clamp(r);
  79292. #else
  79293. int i;
  79294. int j = 0;
  79295. int s = 0;
  79296. r->dp[0] = 0;
  79297. for (i = 0; i < 96; i++) {
  79298. r->dp[j] |= ((mp_digit)a[i]) << s;
  79299. if (s + 32 >= DIGIT_BIT) {
  79300. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  79301. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  79302. #endif
  79303. s = DIGIT_BIT - s;
  79304. r->dp[++j] = a[i] >> s;
  79305. s = 32 - s;
  79306. }
  79307. else {
  79308. s += 32;
  79309. }
  79310. }
  79311. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  79312. mp_clamp(r);
  79313. #endif
  79314. }
  79315. return err;
  79316. }
  79317. /* Perform the modular exponentiation for Diffie-Hellman.
  79318. *
  79319. * base Base. MP integer.
  79320. * exp Exponent. MP integer.
  79321. * mod Modulus. MP integer.
  79322. * res Result. MP integer.
  79323. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  79324. * and MEMORY_E if memory allocation fails.
  79325. */
  79326. int sp_ModExp_3072(const mp_int* base, const mp_int* exp, const mp_int* mod,
  79327. mp_int* res)
  79328. {
  79329. int err = MP_OKAY;
  79330. sp_digit b[192];
  79331. sp_digit e[96];
  79332. sp_digit m[96];
  79333. sp_digit* r = b;
  79334. int expBits = mp_count_bits(exp);
  79335. if (mp_count_bits(base) > 3072) {
  79336. err = MP_READ_E;
  79337. }
  79338. else if (expBits > 3072) {
  79339. err = MP_READ_E;
  79340. }
  79341. else if (mp_count_bits(mod) != 3072) {
  79342. err = MP_READ_E;
  79343. }
  79344. else if (mp_iseven(mod)) {
  79345. err = MP_VAL;
  79346. }
  79347. if (err == MP_OKAY) {
  79348. sp_3072_from_mp(b, 96, base);
  79349. sp_3072_from_mp(e, 96, exp);
  79350. sp_3072_from_mp(m, 96, mod);
  79351. err = sp_3072_mod_exp_96(r, b, e, expBits, m, 0);
  79352. }
  79353. if (err == MP_OKAY) {
  79354. err = sp_3072_to_mp(r, res);
  79355. }
  79356. XMEMSET(e, 0, sizeof(e));
  79357. return err;
  79358. }
  79359. #ifdef WOLFSSL_HAVE_SP_DH
  79360. #ifdef HAVE_FFDHE_3072
  79361. /* Lefy shift a by n bits into r. (r = a << n)
  79362. *
  79363. * r A single precision integer.
  79364. * a A single precision integer.
  79365. * n Integer representing number of bits to shift.
  79366. */
  79367. static void sp_3072_lshift_96(sp_digit* r, const sp_digit* a, byte n)
  79368. {
  79369. __asm__ __volatile__ (
  79370. "movs r7, #31\n\t"
  79371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79372. "subs r7, r7, %[n]\n\t"
  79373. #else
  79374. "sub r7, r7, %[n]\n\t"
  79375. #endif
  79376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79377. "adds %[a], %[a], #0xff\n\t"
  79378. #else
  79379. "add %[a], %[a], #0xff\n\t"
  79380. #endif
  79381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79382. "adds %[r], %[r], #0xff\n\t"
  79383. #else
  79384. "add %[r], %[r], #0xff\n\t"
  79385. #endif
  79386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79387. "adds %[a], %[a], #0x41\n\t"
  79388. #else
  79389. "add %[a], %[a], #0x41\n\t"
  79390. #endif
  79391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79392. "adds %[r], %[r], #0x41\n\t"
  79393. #else
  79394. "add %[r], %[r], #0x41\n\t"
  79395. #endif
  79396. "ldr r4, [%[a], #60]\n\t"
  79397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79398. "lsrs r5, r4, #1\n\t"
  79399. #else
  79400. "lsr r5, r4, #1\n\t"
  79401. #endif
  79402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79403. "lsls r4, r4, %[n]\n\t"
  79404. #else
  79405. "lsl r4, r4, %[n]\n\t"
  79406. #endif
  79407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79408. "lsrs r5, r5, r7\n\t"
  79409. #else
  79410. "lsr r5, r5, r7\n\t"
  79411. #endif
  79412. "ldr r3, [%[a], #56]\n\t"
  79413. "str r5, [%[r], #64]\n\t"
  79414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79415. "lsrs r6, r3, #1\n\t"
  79416. #else
  79417. "lsr r6, r3, #1\n\t"
  79418. #endif
  79419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79420. "lsls r3, r3, %[n]\n\t"
  79421. #else
  79422. "lsl r3, r3, %[n]\n\t"
  79423. #endif
  79424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79425. "lsrs r6, r6, r7\n\t"
  79426. #else
  79427. "lsr r6, r6, r7\n\t"
  79428. #endif
  79429. #ifdef WOLFSSL_KEIL
  79430. "orrs r4, r4, r6\n\t"
  79431. #elif defined(__clang__)
  79432. "orrs r4, r6\n\t"
  79433. #else
  79434. "orr r4, r6\n\t"
  79435. #endif
  79436. "ldr r5, [%[a], #52]\n\t"
  79437. "str r4, [%[r], #60]\n\t"
  79438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79439. "lsrs r6, r5, #1\n\t"
  79440. #else
  79441. "lsr r6, r5, #1\n\t"
  79442. #endif
  79443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79444. "lsls r5, r5, %[n]\n\t"
  79445. #else
  79446. "lsl r5, r5, %[n]\n\t"
  79447. #endif
  79448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79449. "lsrs r6, r6, r7\n\t"
  79450. #else
  79451. "lsr r6, r6, r7\n\t"
  79452. #endif
  79453. #ifdef WOLFSSL_KEIL
  79454. "orrs r3, r3, r6\n\t"
  79455. #elif defined(__clang__)
  79456. "orrs r3, r6\n\t"
  79457. #else
  79458. "orr r3, r6\n\t"
  79459. #endif
  79460. "ldr r4, [%[a], #48]\n\t"
  79461. "str r3, [%[r], #56]\n\t"
  79462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79463. "lsrs r6, r4, #1\n\t"
  79464. #else
  79465. "lsr r6, r4, #1\n\t"
  79466. #endif
  79467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79468. "lsls r4, r4, %[n]\n\t"
  79469. #else
  79470. "lsl r4, r4, %[n]\n\t"
  79471. #endif
  79472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79473. "lsrs r6, r6, r7\n\t"
  79474. #else
  79475. "lsr r6, r6, r7\n\t"
  79476. #endif
  79477. #ifdef WOLFSSL_KEIL
  79478. "orrs r5, r5, r6\n\t"
  79479. #elif defined(__clang__)
  79480. "orrs r5, r6\n\t"
  79481. #else
  79482. "orr r5, r6\n\t"
  79483. #endif
  79484. "ldr r3, [%[a], #44]\n\t"
  79485. "str r5, [%[r], #52]\n\t"
  79486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79487. "lsrs r6, r3, #1\n\t"
  79488. #else
  79489. "lsr r6, r3, #1\n\t"
  79490. #endif
  79491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79492. "lsls r3, r3, %[n]\n\t"
  79493. #else
  79494. "lsl r3, r3, %[n]\n\t"
  79495. #endif
  79496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79497. "lsrs r6, r6, r7\n\t"
  79498. #else
  79499. "lsr r6, r6, r7\n\t"
  79500. #endif
  79501. #ifdef WOLFSSL_KEIL
  79502. "orrs r4, r4, r6\n\t"
  79503. #elif defined(__clang__)
  79504. "orrs r4, r6\n\t"
  79505. #else
  79506. "orr r4, r6\n\t"
  79507. #endif
  79508. "ldr r5, [%[a], #40]\n\t"
  79509. "str r4, [%[r], #48]\n\t"
  79510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79511. "lsrs r6, r5, #1\n\t"
  79512. #else
  79513. "lsr r6, r5, #1\n\t"
  79514. #endif
  79515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79516. "lsls r5, r5, %[n]\n\t"
  79517. #else
  79518. "lsl r5, r5, %[n]\n\t"
  79519. #endif
  79520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79521. "lsrs r6, r6, r7\n\t"
  79522. #else
  79523. "lsr r6, r6, r7\n\t"
  79524. #endif
  79525. #ifdef WOLFSSL_KEIL
  79526. "orrs r3, r3, r6\n\t"
  79527. #elif defined(__clang__)
  79528. "orrs r3, r6\n\t"
  79529. #else
  79530. "orr r3, r6\n\t"
  79531. #endif
  79532. "ldr r4, [%[a], #36]\n\t"
  79533. "str r3, [%[r], #44]\n\t"
  79534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79535. "lsrs r6, r4, #1\n\t"
  79536. #else
  79537. "lsr r6, r4, #1\n\t"
  79538. #endif
  79539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79540. "lsls r4, r4, %[n]\n\t"
  79541. #else
  79542. "lsl r4, r4, %[n]\n\t"
  79543. #endif
  79544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79545. "lsrs r6, r6, r7\n\t"
  79546. #else
  79547. "lsr r6, r6, r7\n\t"
  79548. #endif
  79549. #ifdef WOLFSSL_KEIL
  79550. "orrs r5, r5, r6\n\t"
  79551. #elif defined(__clang__)
  79552. "orrs r5, r6\n\t"
  79553. #else
  79554. "orr r5, r6\n\t"
  79555. #endif
  79556. "ldr r3, [%[a], #32]\n\t"
  79557. "str r5, [%[r], #40]\n\t"
  79558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79559. "lsrs r6, r3, #1\n\t"
  79560. #else
  79561. "lsr r6, r3, #1\n\t"
  79562. #endif
  79563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79564. "lsls r3, r3, %[n]\n\t"
  79565. #else
  79566. "lsl r3, r3, %[n]\n\t"
  79567. #endif
  79568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79569. "lsrs r6, r6, r7\n\t"
  79570. #else
  79571. "lsr r6, r6, r7\n\t"
  79572. #endif
  79573. #ifdef WOLFSSL_KEIL
  79574. "orrs r4, r4, r6\n\t"
  79575. #elif defined(__clang__)
  79576. "orrs r4, r6\n\t"
  79577. #else
  79578. "orr r4, r6\n\t"
  79579. #endif
  79580. "ldr r5, [%[a], #28]\n\t"
  79581. "str r4, [%[r], #36]\n\t"
  79582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79583. "lsrs r6, r5, #1\n\t"
  79584. #else
  79585. "lsr r6, r5, #1\n\t"
  79586. #endif
  79587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79588. "lsls r5, r5, %[n]\n\t"
  79589. #else
  79590. "lsl r5, r5, %[n]\n\t"
  79591. #endif
  79592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79593. "lsrs r6, r6, r7\n\t"
  79594. #else
  79595. "lsr r6, r6, r7\n\t"
  79596. #endif
  79597. #ifdef WOLFSSL_KEIL
  79598. "orrs r3, r3, r6\n\t"
  79599. #elif defined(__clang__)
  79600. "orrs r3, r6\n\t"
  79601. #else
  79602. "orr r3, r6\n\t"
  79603. #endif
  79604. "ldr r4, [%[a], #24]\n\t"
  79605. "str r3, [%[r], #32]\n\t"
  79606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79607. "lsrs r6, r4, #1\n\t"
  79608. #else
  79609. "lsr r6, r4, #1\n\t"
  79610. #endif
  79611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79612. "lsls r4, r4, %[n]\n\t"
  79613. #else
  79614. "lsl r4, r4, %[n]\n\t"
  79615. #endif
  79616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79617. "lsrs r6, r6, r7\n\t"
  79618. #else
  79619. "lsr r6, r6, r7\n\t"
  79620. #endif
  79621. #ifdef WOLFSSL_KEIL
  79622. "orrs r5, r5, r6\n\t"
  79623. #elif defined(__clang__)
  79624. "orrs r5, r6\n\t"
  79625. #else
  79626. "orr r5, r6\n\t"
  79627. #endif
  79628. "ldr r3, [%[a], #20]\n\t"
  79629. "str r5, [%[r], #28]\n\t"
  79630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79631. "lsrs r6, r3, #1\n\t"
  79632. #else
  79633. "lsr r6, r3, #1\n\t"
  79634. #endif
  79635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79636. "lsls r3, r3, %[n]\n\t"
  79637. #else
  79638. "lsl r3, r3, %[n]\n\t"
  79639. #endif
  79640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79641. "lsrs r6, r6, r7\n\t"
  79642. #else
  79643. "lsr r6, r6, r7\n\t"
  79644. #endif
  79645. #ifdef WOLFSSL_KEIL
  79646. "orrs r4, r4, r6\n\t"
  79647. #elif defined(__clang__)
  79648. "orrs r4, r6\n\t"
  79649. #else
  79650. "orr r4, r6\n\t"
  79651. #endif
  79652. "ldr r5, [%[a], #16]\n\t"
  79653. "str r4, [%[r], #24]\n\t"
  79654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79655. "lsrs r6, r5, #1\n\t"
  79656. #else
  79657. "lsr r6, r5, #1\n\t"
  79658. #endif
  79659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79660. "lsls r5, r5, %[n]\n\t"
  79661. #else
  79662. "lsl r5, r5, %[n]\n\t"
  79663. #endif
  79664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79665. "lsrs r6, r6, r7\n\t"
  79666. #else
  79667. "lsr r6, r6, r7\n\t"
  79668. #endif
  79669. #ifdef WOLFSSL_KEIL
  79670. "orrs r3, r3, r6\n\t"
  79671. #elif defined(__clang__)
  79672. "orrs r3, r6\n\t"
  79673. #else
  79674. "orr r3, r6\n\t"
  79675. #endif
  79676. "ldr r4, [%[a], #12]\n\t"
  79677. "str r3, [%[r], #20]\n\t"
  79678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79679. "lsrs r6, r4, #1\n\t"
  79680. #else
  79681. "lsr r6, r4, #1\n\t"
  79682. #endif
  79683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79684. "lsls r4, r4, %[n]\n\t"
  79685. #else
  79686. "lsl r4, r4, %[n]\n\t"
  79687. #endif
  79688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79689. "lsrs r6, r6, r7\n\t"
  79690. #else
  79691. "lsr r6, r6, r7\n\t"
  79692. #endif
  79693. #ifdef WOLFSSL_KEIL
  79694. "orrs r5, r5, r6\n\t"
  79695. #elif defined(__clang__)
  79696. "orrs r5, r6\n\t"
  79697. #else
  79698. "orr r5, r6\n\t"
  79699. #endif
  79700. "ldr r3, [%[a], #8]\n\t"
  79701. "str r5, [%[r], #16]\n\t"
  79702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79703. "lsrs r6, r3, #1\n\t"
  79704. #else
  79705. "lsr r6, r3, #1\n\t"
  79706. #endif
  79707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79708. "lsls r3, r3, %[n]\n\t"
  79709. #else
  79710. "lsl r3, r3, %[n]\n\t"
  79711. #endif
  79712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79713. "lsrs r6, r6, r7\n\t"
  79714. #else
  79715. "lsr r6, r6, r7\n\t"
  79716. #endif
  79717. #ifdef WOLFSSL_KEIL
  79718. "orrs r4, r4, r6\n\t"
  79719. #elif defined(__clang__)
  79720. "orrs r4, r6\n\t"
  79721. #else
  79722. "orr r4, r6\n\t"
  79723. #endif
  79724. "ldr r5, [%[a], #4]\n\t"
  79725. "str r4, [%[r], #12]\n\t"
  79726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79727. "lsrs r6, r5, #1\n\t"
  79728. #else
  79729. "lsr r6, r5, #1\n\t"
  79730. #endif
  79731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79732. "lsls r5, r5, %[n]\n\t"
  79733. #else
  79734. "lsl r5, r5, %[n]\n\t"
  79735. #endif
  79736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79737. "lsrs r6, r6, r7\n\t"
  79738. #else
  79739. "lsr r6, r6, r7\n\t"
  79740. #endif
  79741. #ifdef WOLFSSL_KEIL
  79742. "orrs r3, r3, r6\n\t"
  79743. #elif defined(__clang__)
  79744. "orrs r3, r6\n\t"
  79745. #else
  79746. "orr r3, r6\n\t"
  79747. #endif
  79748. "ldr r4, [%[a]]\n\t"
  79749. "str r3, [%[r], #8]\n\t"
  79750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79751. "lsrs r6, r4, #1\n\t"
  79752. #else
  79753. "lsr r6, r4, #1\n\t"
  79754. #endif
  79755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79756. "lsls r4, r4, %[n]\n\t"
  79757. #else
  79758. "lsl r4, r4, %[n]\n\t"
  79759. #endif
  79760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79761. "lsrs r6, r6, r7\n\t"
  79762. #else
  79763. "lsr r6, r6, r7\n\t"
  79764. #endif
  79765. #ifdef WOLFSSL_KEIL
  79766. "orrs r5, r5, r6\n\t"
  79767. #elif defined(__clang__)
  79768. "orrs r5, r6\n\t"
  79769. #else
  79770. "orr r5, r6\n\t"
  79771. #endif
  79772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79773. "subs %[a], %[a], #0x40\n\t"
  79774. #else
  79775. "sub %[a], %[a], #0x40\n\t"
  79776. #endif
  79777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79778. "subs %[r], %[r], #0x40\n\t"
  79779. #else
  79780. "sub %[r], %[r], #0x40\n\t"
  79781. #endif
  79782. "ldr r3, [%[a], #60]\n\t"
  79783. "str r5, [%[r], #68]\n\t"
  79784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79785. "lsrs r6, r3, #1\n\t"
  79786. #else
  79787. "lsr r6, r3, #1\n\t"
  79788. #endif
  79789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79790. "lsls r3, r3, %[n]\n\t"
  79791. #else
  79792. "lsl r3, r3, %[n]\n\t"
  79793. #endif
  79794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79795. "lsrs r6, r6, r7\n\t"
  79796. #else
  79797. "lsr r6, r6, r7\n\t"
  79798. #endif
  79799. #ifdef WOLFSSL_KEIL
  79800. "orrs r4, r4, r6\n\t"
  79801. #elif defined(__clang__)
  79802. "orrs r4, r6\n\t"
  79803. #else
  79804. "orr r4, r6\n\t"
  79805. #endif
  79806. "ldr r5, [%[a], #56]\n\t"
  79807. "str r4, [%[r], #64]\n\t"
  79808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79809. "lsrs r6, r5, #1\n\t"
  79810. #else
  79811. "lsr r6, r5, #1\n\t"
  79812. #endif
  79813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79814. "lsls r5, r5, %[n]\n\t"
  79815. #else
  79816. "lsl r5, r5, %[n]\n\t"
  79817. #endif
  79818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79819. "lsrs r6, r6, r7\n\t"
  79820. #else
  79821. "lsr r6, r6, r7\n\t"
  79822. #endif
  79823. #ifdef WOLFSSL_KEIL
  79824. "orrs r3, r3, r6\n\t"
  79825. #elif defined(__clang__)
  79826. "orrs r3, r6\n\t"
  79827. #else
  79828. "orr r3, r6\n\t"
  79829. #endif
  79830. "ldr r4, [%[a], #52]\n\t"
  79831. "str r3, [%[r], #60]\n\t"
  79832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79833. "lsrs r6, r4, #1\n\t"
  79834. #else
  79835. "lsr r6, r4, #1\n\t"
  79836. #endif
  79837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79838. "lsls r4, r4, %[n]\n\t"
  79839. #else
  79840. "lsl r4, r4, %[n]\n\t"
  79841. #endif
  79842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79843. "lsrs r6, r6, r7\n\t"
  79844. #else
  79845. "lsr r6, r6, r7\n\t"
  79846. #endif
  79847. #ifdef WOLFSSL_KEIL
  79848. "orrs r5, r5, r6\n\t"
  79849. #elif defined(__clang__)
  79850. "orrs r5, r6\n\t"
  79851. #else
  79852. "orr r5, r6\n\t"
  79853. #endif
  79854. "ldr r3, [%[a], #48]\n\t"
  79855. "str r5, [%[r], #56]\n\t"
  79856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79857. "lsrs r6, r3, #1\n\t"
  79858. #else
  79859. "lsr r6, r3, #1\n\t"
  79860. #endif
  79861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79862. "lsls r3, r3, %[n]\n\t"
  79863. #else
  79864. "lsl r3, r3, %[n]\n\t"
  79865. #endif
  79866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79867. "lsrs r6, r6, r7\n\t"
  79868. #else
  79869. "lsr r6, r6, r7\n\t"
  79870. #endif
  79871. #ifdef WOLFSSL_KEIL
  79872. "orrs r4, r4, r6\n\t"
  79873. #elif defined(__clang__)
  79874. "orrs r4, r6\n\t"
  79875. #else
  79876. "orr r4, r6\n\t"
  79877. #endif
  79878. "ldr r5, [%[a], #44]\n\t"
  79879. "str r4, [%[r], #52]\n\t"
  79880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79881. "lsrs r6, r5, #1\n\t"
  79882. #else
  79883. "lsr r6, r5, #1\n\t"
  79884. #endif
  79885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79886. "lsls r5, r5, %[n]\n\t"
  79887. #else
  79888. "lsl r5, r5, %[n]\n\t"
  79889. #endif
  79890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79891. "lsrs r6, r6, r7\n\t"
  79892. #else
  79893. "lsr r6, r6, r7\n\t"
  79894. #endif
  79895. #ifdef WOLFSSL_KEIL
  79896. "orrs r3, r3, r6\n\t"
  79897. #elif defined(__clang__)
  79898. "orrs r3, r6\n\t"
  79899. #else
  79900. "orr r3, r6\n\t"
  79901. #endif
  79902. "ldr r4, [%[a], #40]\n\t"
  79903. "str r3, [%[r], #48]\n\t"
  79904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79905. "lsrs r6, r4, #1\n\t"
  79906. #else
  79907. "lsr r6, r4, #1\n\t"
  79908. #endif
  79909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79910. "lsls r4, r4, %[n]\n\t"
  79911. #else
  79912. "lsl r4, r4, %[n]\n\t"
  79913. #endif
  79914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79915. "lsrs r6, r6, r7\n\t"
  79916. #else
  79917. "lsr r6, r6, r7\n\t"
  79918. #endif
  79919. #ifdef WOLFSSL_KEIL
  79920. "orrs r5, r5, r6\n\t"
  79921. #elif defined(__clang__)
  79922. "orrs r5, r6\n\t"
  79923. #else
  79924. "orr r5, r6\n\t"
  79925. #endif
  79926. "ldr r3, [%[a], #36]\n\t"
  79927. "str r5, [%[r], #44]\n\t"
  79928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79929. "lsrs r6, r3, #1\n\t"
  79930. #else
  79931. "lsr r6, r3, #1\n\t"
  79932. #endif
  79933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79934. "lsls r3, r3, %[n]\n\t"
  79935. #else
  79936. "lsl r3, r3, %[n]\n\t"
  79937. #endif
  79938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79939. "lsrs r6, r6, r7\n\t"
  79940. #else
  79941. "lsr r6, r6, r7\n\t"
  79942. #endif
  79943. #ifdef WOLFSSL_KEIL
  79944. "orrs r4, r4, r6\n\t"
  79945. #elif defined(__clang__)
  79946. "orrs r4, r6\n\t"
  79947. #else
  79948. "orr r4, r6\n\t"
  79949. #endif
  79950. "ldr r5, [%[a], #32]\n\t"
  79951. "str r4, [%[r], #40]\n\t"
  79952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79953. "lsrs r6, r5, #1\n\t"
  79954. #else
  79955. "lsr r6, r5, #1\n\t"
  79956. #endif
  79957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79958. "lsls r5, r5, %[n]\n\t"
  79959. #else
  79960. "lsl r5, r5, %[n]\n\t"
  79961. #endif
  79962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79963. "lsrs r6, r6, r7\n\t"
  79964. #else
  79965. "lsr r6, r6, r7\n\t"
  79966. #endif
  79967. #ifdef WOLFSSL_KEIL
  79968. "orrs r3, r3, r6\n\t"
  79969. #elif defined(__clang__)
  79970. "orrs r3, r6\n\t"
  79971. #else
  79972. "orr r3, r6\n\t"
  79973. #endif
  79974. "ldr r4, [%[a], #28]\n\t"
  79975. "str r3, [%[r], #36]\n\t"
  79976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79977. "lsrs r6, r4, #1\n\t"
  79978. #else
  79979. "lsr r6, r4, #1\n\t"
  79980. #endif
  79981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79982. "lsls r4, r4, %[n]\n\t"
  79983. #else
  79984. "lsl r4, r4, %[n]\n\t"
  79985. #endif
  79986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79987. "lsrs r6, r6, r7\n\t"
  79988. #else
  79989. "lsr r6, r6, r7\n\t"
  79990. #endif
  79991. #ifdef WOLFSSL_KEIL
  79992. "orrs r5, r5, r6\n\t"
  79993. #elif defined(__clang__)
  79994. "orrs r5, r6\n\t"
  79995. #else
  79996. "orr r5, r6\n\t"
  79997. #endif
  79998. "ldr r3, [%[a], #24]\n\t"
  79999. "str r5, [%[r], #32]\n\t"
  80000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80001. "lsrs r6, r3, #1\n\t"
  80002. #else
  80003. "lsr r6, r3, #1\n\t"
  80004. #endif
  80005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80006. "lsls r3, r3, %[n]\n\t"
  80007. #else
  80008. "lsl r3, r3, %[n]\n\t"
  80009. #endif
  80010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80011. "lsrs r6, r6, r7\n\t"
  80012. #else
  80013. "lsr r6, r6, r7\n\t"
  80014. #endif
  80015. #ifdef WOLFSSL_KEIL
  80016. "orrs r4, r4, r6\n\t"
  80017. #elif defined(__clang__)
  80018. "orrs r4, r6\n\t"
  80019. #else
  80020. "orr r4, r6\n\t"
  80021. #endif
  80022. "ldr r5, [%[a], #20]\n\t"
  80023. "str r4, [%[r], #28]\n\t"
  80024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80025. "lsrs r6, r5, #1\n\t"
  80026. #else
  80027. "lsr r6, r5, #1\n\t"
  80028. #endif
  80029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80030. "lsls r5, r5, %[n]\n\t"
  80031. #else
  80032. "lsl r5, r5, %[n]\n\t"
  80033. #endif
  80034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80035. "lsrs r6, r6, r7\n\t"
  80036. #else
  80037. "lsr r6, r6, r7\n\t"
  80038. #endif
  80039. #ifdef WOLFSSL_KEIL
  80040. "orrs r3, r3, r6\n\t"
  80041. #elif defined(__clang__)
  80042. "orrs r3, r6\n\t"
  80043. #else
  80044. "orr r3, r6\n\t"
  80045. #endif
  80046. "ldr r4, [%[a], #16]\n\t"
  80047. "str r3, [%[r], #24]\n\t"
  80048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80049. "lsrs r6, r4, #1\n\t"
  80050. #else
  80051. "lsr r6, r4, #1\n\t"
  80052. #endif
  80053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80054. "lsls r4, r4, %[n]\n\t"
  80055. #else
  80056. "lsl r4, r4, %[n]\n\t"
  80057. #endif
  80058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80059. "lsrs r6, r6, r7\n\t"
  80060. #else
  80061. "lsr r6, r6, r7\n\t"
  80062. #endif
  80063. #ifdef WOLFSSL_KEIL
  80064. "orrs r5, r5, r6\n\t"
  80065. #elif defined(__clang__)
  80066. "orrs r5, r6\n\t"
  80067. #else
  80068. "orr r5, r6\n\t"
  80069. #endif
  80070. "ldr r3, [%[a], #12]\n\t"
  80071. "str r5, [%[r], #20]\n\t"
  80072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80073. "lsrs r6, r3, #1\n\t"
  80074. #else
  80075. "lsr r6, r3, #1\n\t"
  80076. #endif
  80077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80078. "lsls r3, r3, %[n]\n\t"
  80079. #else
  80080. "lsl r3, r3, %[n]\n\t"
  80081. #endif
  80082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80083. "lsrs r6, r6, r7\n\t"
  80084. #else
  80085. "lsr r6, r6, r7\n\t"
  80086. #endif
  80087. #ifdef WOLFSSL_KEIL
  80088. "orrs r4, r4, r6\n\t"
  80089. #elif defined(__clang__)
  80090. "orrs r4, r6\n\t"
  80091. #else
  80092. "orr r4, r6\n\t"
  80093. #endif
  80094. "ldr r5, [%[a], #8]\n\t"
  80095. "str r4, [%[r], #16]\n\t"
  80096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80097. "lsrs r6, r5, #1\n\t"
  80098. #else
  80099. "lsr r6, r5, #1\n\t"
  80100. #endif
  80101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80102. "lsls r5, r5, %[n]\n\t"
  80103. #else
  80104. "lsl r5, r5, %[n]\n\t"
  80105. #endif
  80106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80107. "lsrs r6, r6, r7\n\t"
  80108. #else
  80109. "lsr r6, r6, r7\n\t"
  80110. #endif
  80111. #ifdef WOLFSSL_KEIL
  80112. "orrs r3, r3, r6\n\t"
  80113. #elif defined(__clang__)
  80114. "orrs r3, r6\n\t"
  80115. #else
  80116. "orr r3, r6\n\t"
  80117. #endif
  80118. "ldr r4, [%[a], #4]\n\t"
  80119. "str r3, [%[r], #12]\n\t"
  80120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80121. "lsrs r6, r4, #1\n\t"
  80122. #else
  80123. "lsr r6, r4, #1\n\t"
  80124. #endif
  80125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80126. "lsls r4, r4, %[n]\n\t"
  80127. #else
  80128. "lsl r4, r4, %[n]\n\t"
  80129. #endif
  80130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80131. "lsrs r6, r6, r7\n\t"
  80132. #else
  80133. "lsr r6, r6, r7\n\t"
  80134. #endif
  80135. #ifdef WOLFSSL_KEIL
  80136. "orrs r5, r5, r6\n\t"
  80137. #elif defined(__clang__)
  80138. "orrs r5, r6\n\t"
  80139. #else
  80140. "orr r5, r6\n\t"
  80141. #endif
  80142. "ldr r3, [%[a]]\n\t"
  80143. "str r5, [%[r], #8]\n\t"
  80144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80145. "lsrs r6, r3, #1\n\t"
  80146. #else
  80147. "lsr r6, r3, #1\n\t"
  80148. #endif
  80149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80150. "lsls r3, r3, %[n]\n\t"
  80151. #else
  80152. "lsl r3, r3, %[n]\n\t"
  80153. #endif
  80154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80155. "lsrs r6, r6, r7\n\t"
  80156. #else
  80157. "lsr r6, r6, r7\n\t"
  80158. #endif
  80159. #ifdef WOLFSSL_KEIL
  80160. "orrs r4, r4, r6\n\t"
  80161. #elif defined(__clang__)
  80162. "orrs r4, r6\n\t"
  80163. #else
  80164. "orr r4, r6\n\t"
  80165. #endif
  80166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80167. "subs %[a], %[a], #0x40\n\t"
  80168. #else
  80169. "sub %[a], %[a], #0x40\n\t"
  80170. #endif
  80171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80172. "subs %[r], %[r], #0x40\n\t"
  80173. #else
  80174. "sub %[r], %[r], #0x40\n\t"
  80175. #endif
  80176. "ldr r5, [%[a], #60]\n\t"
  80177. "str r4, [%[r], #68]\n\t"
  80178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80179. "lsrs r6, r5, #1\n\t"
  80180. #else
  80181. "lsr r6, r5, #1\n\t"
  80182. #endif
  80183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80184. "lsls r5, r5, %[n]\n\t"
  80185. #else
  80186. "lsl r5, r5, %[n]\n\t"
  80187. #endif
  80188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80189. "lsrs r6, r6, r7\n\t"
  80190. #else
  80191. "lsr r6, r6, r7\n\t"
  80192. #endif
  80193. #ifdef WOLFSSL_KEIL
  80194. "orrs r3, r3, r6\n\t"
  80195. #elif defined(__clang__)
  80196. "orrs r3, r6\n\t"
  80197. #else
  80198. "orr r3, r6\n\t"
  80199. #endif
  80200. "ldr r4, [%[a], #56]\n\t"
  80201. "str r3, [%[r], #64]\n\t"
  80202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80203. "lsrs r6, r4, #1\n\t"
  80204. #else
  80205. "lsr r6, r4, #1\n\t"
  80206. #endif
  80207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80208. "lsls r4, r4, %[n]\n\t"
  80209. #else
  80210. "lsl r4, r4, %[n]\n\t"
  80211. #endif
  80212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80213. "lsrs r6, r6, r7\n\t"
  80214. #else
  80215. "lsr r6, r6, r7\n\t"
  80216. #endif
  80217. #ifdef WOLFSSL_KEIL
  80218. "orrs r5, r5, r6\n\t"
  80219. #elif defined(__clang__)
  80220. "orrs r5, r6\n\t"
  80221. #else
  80222. "orr r5, r6\n\t"
  80223. #endif
  80224. "ldr r3, [%[a], #52]\n\t"
  80225. "str r5, [%[r], #60]\n\t"
  80226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80227. "lsrs r6, r3, #1\n\t"
  80228. #else
  80229. "lsr r6, r3, #1\n\t"
  80230. #endif
  80231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80232. "lsls r3, r3, %[n]\n\t"
  80233. #else
  80234. "lsl r3, r3, %[n]\n\t"
  80235. #endif
  80236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80237. "lsrs r6, r6, r7\n\t"
  80238. #else
  80239. "lsr r6, r6, r7\n\t"
  80240. #endif
  80241. #ifdef WOLFSSL_KEIL
  80242. "orrs r4, r4, r6\n\t"
  80243. #elif defined(__clang__)
  80244. "orrs r4, r6\n\t"
  80245. #else
  80246. "orr r4, r6\n\t"
  80247. #endif
  80248. "ldr r5, [%[a], #48]\n\t"
  80249. "str r4, [%[r], #56]\n\t"
  80250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80251. "lsrs r6, r5, #1\n\t"
  80252. #else
  80253. "lsr r6, r5, #1\n\t"
  80254. #endif
  80255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80256. "lsls r5, r5, %[n]\n\t"
  80257. #else
  80258. "lsl r5, r5, %[n]\n\t"
  80259. #endif
  80260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80261. "lsrs r6, r6, r7\n\t"
  80262. #else
  80263. "lsr r6, r6, r7\n\t"
  80264. #endif
  80265. #ifdef WOLFSSL_KEIL
  80266. "orrs r3, r3, r6\n\t"
  80267. #elif defined(__clang__)
  80268. "orrs r3, r6\n\t"
  80269. #else
  80270. "orr r3, r6\n\t"
  80271. #endif
  80272. "ldr r4, [%[a], #44]\n\t"
  80273. "str r3, [%[r], #52]\n\t"
  80274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80275. "lsrs r6, r4, #1\n\t"
  80276. #else
  80277. "lsr r6, r4, #1\n\t"
  80278. #endif
  80279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80280. "lsls r4, r4, %[n]\n\t"
  80281. #else
  80282. "lsl r4, r4, %[n]\n\t"
  80283. #endif
  80284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80285. "lsrs r6, r6, r7\n\t"
  80286. #else
  80287. "lsr r6, r6, r7\n\t"
  80288. #endif
  80289. #ifdef WOLFSSL_KEIL
  80290. "orrs r5, r5, r6\n\t"
  80291. #elif defined(__clang__)
  80292. "orrs r5, r6\n\t"
  80293. #else
  80294. "orr r5, r6\n\t"
  80295. #endif
  80296. "ldr r3, [%[a], #40]\n\t"
  80297. "str r5, [%[r], #48]\n\t"
  80298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80299. "lsrs r6, r3, #1\n\t"
  80300. #else
  80301. "lsr r6, r3, #1\n\t"
  80302. #endif
  80303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80304. "lsls r3, r3, %[n]\n\t"
  80305. #else
  80306. "lsl r3, r3, %[n]\n\t"
  80307. #endif
  80308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80309. "lsrs r6, r6, r7\n\t"
  80310. #else
  80311. "lsr r6, r6, r7\n\t"
  80312. #endif
  80313. #ifdef WOLFSSL_KEIL
  80314. "orrs r4, r4, r6\n\t"
  80315. #elif defined(__clang__)
  80316. "orrs r4, r6\n\t"
  80317. #else
  80318. "orr r4, r6\n\t"
  80319. #endif
  80320. "ldr r5, [%[a], #36]\n\t"
  80321. "str r4, [%[r], #44]\n\t"
  80322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80323. "lsrs r6, r5, #1\n\t"
  80324. #else
  80325. "lsr r6, r5, #1\n\t"
  80326. #endif
  80327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80328. "lsls r5, r5, %[n]\n\t"
  80329. #else
  80330. "lsl r5, r5, %[n]\n\t"
  80331. #endif
  80332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80333. "lsrs r6, r6, r7\n\t"
  80334. #else
  80335. "lsr r6, r6, r7\n\t"
  80336. #endif
  80337. #ifdef WOLFSSL_KEIL
  80338. "orrs r3, r3, r6\n\t"
  80339. #elif defined(__clang__)
  80340. "orrs r3, r6\n\t"
  80341. #else
  80342. "orr r3, r6\n\t"
  80343. #endif
  80344. "ldr r4, [%[a], #32]\n\t"
  80345. "str r3, [%[r], #40]\n\t"
  80346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80347. "lsrs r6, r4, #1\n\t"
  80348. #else
  80349. "lsr r6, r4, #1\n\t"
  80350. #endif
  80351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80352. "lsls r4, r4, %[n]\n\t"
  80353. #else
  80354. "lsl r4, r4, %[n]\n\t"
  80355. #endif
  80356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80357. "lsrs r6, r6, r7\n\t"
  80358. #else
  80359. "lsr r6, r6, r7\n\t"
  80360. #endif
  80361. #ifdef WOLFSSL_KEIL
  80362. "orrs r5, r5, r6\n\t"
  80363. #elif defined(__clang__)
  80364. "orrs r5, r6\n\t"
  80365. #else
  80366. "orr r5, r6\n\t"
  80367. #endif
  80368. "ldr r3, [%[a], #28]\n\t"
  80369. "str r5, [%[r], #36]\n\t"
  80370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80371. "lsrs r6, r3, #1\n\t"
  80372. #else
  80373. "lsr r6, r3, #1\n\t"
  80374. #endif
  80375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80376. "lsls r3, r3, %[n]\n\t"
  80377. #else
  80378. "lsl r3, r3, %[n]\n\t"
  80379. #endif
  80380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80381. "lsrs r6, r6, r7\n\t"
  80382. #else
  80383. "lsr r6, r6, r7\n\t"
  80384. #endif
  80385. #ifdef WOLFSSL_KEIL
  80386. "orrs r4, r4, r6\n\t"
  80387. #elif defined(__clang__)
  80388. "orrs r4, r6\n\t"
  80389. #else
  80390. "orr r4, r6\n\t"
  80391. #endif
  80392. "ldr r5, [%[a], #24]\n\t"
  80393. "str r4, [%[r], #32]\n\t"
  80394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80395. "lsrs r6, r5, #1\n\t"
  80396. #else
  80397. "lsr r6, r5, #1\n\t"
  80398. #endif
  80399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80400. "lsls r5, r5, %[n]\n\t"
  80401. #else
  80402. "lsl r5, r5, %[n]\n\t"
  80403. #endif
  80404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80405. "lsrs r6, r6, r7\n\t"
  80406. #else
  80407. "lsr r6, r6, r7\n\t"
  80408. #endif
  80409. #ifdef WOLFSSL_KEIL
  80410. "orrs r3, r3, r6\n\t"
  80411. #elif defined(__clang__)
  80412. "orrs r3, r6\n\t"
  80413. #else
  80414. "orr r3, r6\n\t"
  80415. #endif
  80416. "ldr r4, [%[a], #20]\n\t"
  80417. "str r3, [%[r], #28]\n\t"
  80418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80419. "lsrs r6, r4, #1\n\t"
  80420. #else
  80421. "lsr r6, r4, #1\n\t"
  80422. #endif
  80423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80424. "lsls r4, r4, %[n]\n\t"
  80425. #else
  80426. "lsl r4, r4, %[n]\n\t"
  80427. #endif
  80428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80429. "lsrs r6, r6, r7\n\t"
  80430. #else
  80431. "lsr r6, r6, r7\n\t"
  80432. #endif
  80433. #ifdef WOLFSSL_KEIL
  80434. "orrs r5, r5, r6\n\t"
  80435. #elif defined(__clang__)
  80436. "orrs r5, r6\n\t"
  80437. #else
  80438. "orr r5, r6\n\t"
  80439. #endif
  80440. "ldr r3, [%[a], #16]\n\t"
  80441. "str r5, [%[r], #24]\n\t"
  80442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80443. "lsrs r6, r3, #1\n\t"
  80444. #else
  80445. "lsr r6, r3, #1\n\t"
  80446. #endif
  80447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80448. "lsls r3, r3, %[n]\n\t"
  80449. #else
  80450. "lsl r3, r3, %[n]\n\t"
  80451. #endif
  80452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80453. "lsrs r6, r6, r7\n\t"
  80454. #else
  80455. "lsr r6, r6, r7\n\t"
  80456. #endif
  80457. #ifdef WOLFSSL_KEIL
  80458. "orrs r4, r4, r6\n\t"
  80459. #elif defined(__clang__)
  80460. "orrs r4, r6\n\t"
  80461. #else
  80462. "orr r4, r6\n\t"
  80463. #endif
  80464. "ldr r5, [%[a], #12]\n\t"
  80465. "str r4, [%[r], #20]\n\t"
  80466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80467. "lsrs r6, r5, #1\n\t"
  80468. #else
  80469. "lsr r6, r5, #1\n\t"
  80470. #endif
  80471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80472. "lsls r5, r5, %[n]\n\t"
  80473. #else
  80474. "lsl r5, r5, %[n]\n\t"
  80475. #endif
  80476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80477. "lsrs r6, r6, r7\n\t"
  80478. #else
  80479. "lsr r6, r6, r7\n\t"
  80480. #endif
  80481. #ifdef WOLFSSL_KEIL
  80482. "orrs r3, r3, r6\n\t"
  80483. #elif defined(__clang__)
  80484. "orrs r3, r6\n\t"
  80485. #else
  80486. "orr r3, r6\n\t"
  80487. #endif
  80488. "ldr r4, [%[a], #8]\n\t"
  80489. "str r3, [%[r], #16]\n\t"
  80490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80491. "lsrs r6, r4, #1\n\t"
  80492. #else
  80493. "lsr r6, r4, #1\n\t"
  80494. #endif
  80495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80496. "lsls r4, r4, %[n]\n\t"
  80497. #else
  80498. "lsl r4, r4, %[n]\n\t"
  80499. #endif
  80500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80501. "lsrs r6, r6, r7\n\t"
  80502. #else
  80503. "lsr r6, r6, r7\n\t"
  80504. #endif
  80505. #ifdef WOLFSSL_KEIL
  80506. "orrs r5, r5, r6\n\t"
  80507. #elif defined(__clang__)
  80508. "orrs r5, r6\n\t"
  80509. #else
  80510. "orr r5, r6\n\t"
  80511. #endif
  80512. "ldr r3, [%[a], #4]\n\t"
  80513. "str r5, [%[r], #12]\n\t"
  80514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80515. "lsrs r6, r3, #1\n\t"
  80516. #else
  80517. "lsr r6, r3, #1\n\t"
  80518. #endif
  80519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80520. "lsls r3, r3, %[n]\n\t"
  80521. #else
  80522. "lsl r3, r3, %[n]\n\t"
  80523. #endif
  80524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80525. "lsrs r6, r6, r7\n\t"
  80526. #else
  80527. "lsr r6, r6, r7\n\t"
  80528. #endif
  80529. #ifdef WOLFSSL_KEIL
  80530. "orrs r4, r4, r6\n\t"
  80531. #elif defined(__clang__)
  80532. "orrs r4, r6\n\t"
  80533. #else
  80534. "orr r4, r6\n\t"
  80535. #endif
  80536. "ldr r5, [%[a]]\n\t"
  80537. "str r4, [%[r], #8]\n\t"
  80538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80539. "lsrs r6, r5, #1\n\t"
  80540. #else
  80541. "lsr r6, r5, #1\n\t"
  80542. #endif
  80543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80544. "lsls r5, r5, %[n]\n\t"
  80545. #else
  80546. "lsl r5, r5, %[n]\n\t"
  80547. #endif
  80548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80549. "lsrs r6, r6, r7\n\t"
  80550. #else
  80551. "lsr r6, r6, r7\n\t"
  80552. #endif
  80553. #ifdef WOLFSSL_KEIL
  80554. "orrs r3, r3, r6\n\t"
  80555. #elif defined(__clang__)
  80556. "orrs r3, r6\n\t"
  80557. #else
  80558. "orr r3, r6\n\t"
  80559. #endif
  80560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80561. "subs %[a], %[a], #0x40\n\t"
  80562. #else
  80563. "sub %[a], %[a], #0x40\n\t"
  80564. #endif
  80565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80566. "subs %[r], %[r], #0x40\n\t"
  80567. #else
  80568. "sub %[r], %[r], #0x40\n\t"
  80569. #endif
  80570. "ldr r4, [%[a], #60]\n\t"
  80571. "str r3, [%[r], #68]\n\t"
  80572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80573. "lsrs r6, r4, #1\n\t"
  80574. #else
  80575. "lsr r6, r4, #1\n\t"
  80576. #endif
  80577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80578. "lsls r4, r4, %[n]\n\t"
  80579. #else
  80580. "lsl r4, r4, %[n]\n\t"
  80581. #endif
  80582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80583. "lsrs r6, r6, r7\n\t"
  80584. #else
  80585. "lsr r6, r6, r7\n\t"
  80586. #endif
  80587. #ifdef WOLFSSL_KEIL
  80588. "orrs r5, r5, r6\n\t"
  80589. #elif defined(__clang__)
  80590. "orrs r5, r6\n\t"
  80591. #else
  80592. "orr r5, r6\n\t"
  80593. #endif
  80594. "ldr r3, [%[a], #56]\n\t"
  80595. "str r5, [%[r], #64]\n\t"
  80596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80597. "lsrs r6, r3, #1\n\t"
  80598. #else
  80599. "lsr r6, r3, #1\n\t"
  80600. #endif
  80601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80602. "lsls r3, r3, %[n]\n\t"
  80603. #else
  80604. "lsl r3, r3, %[n]\n\t"
  80605. #endif
  80606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80607. "lsrs r6, r6, r7\n\t"
  80608. #else
  80609. "lsr r6, r6, r7\n\t"
  80610. #endif
  80611. #ifdef WOLFSSL_KEIL
  80612. "orrs r4, r4, r6\n\t"
  80613. #elif defined(__clang__)
  80614. "orrs r4, r6\n\t"
  80615. #else
  80616. "orr r4, r6\n\t"
  80617. #endif
  80618. "ldr r5, [%[a], #52]\n\t"
  80619. "str r4, [%[r], #60]\n\t"
  80620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80621. "lsrs r6, r5, #1\n\t"
  80622. #else
  80623. "lsr r6, r5, #1\n\t"
  80624. #endif
  80625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80626. "lsls r5, r5, %[n]\n\t"
  80627. #else
  80628. "lsl r5, r5, %[n]\n\t"
  80629. #endif
  80630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80631. "lsrs r6, r6, r7\n\t"
  80632. #else
  80633. "lsr r6, r6, r7\n\t"
  80634. #endif
  80635. #ifdef WOLFSSL_KEIL
  80636. "orrs r3, r3, r6\n\t"
  80637. #elif defined(__clang__)
  80638. "orrs r3, r6\n\t"
  80639. #else
  80640. "orr r3, r6\n\t"
  80641. #endif
  80642. "ldr r4, [%[a], #48]\n\t"
  80643. "str r3, [%[r], #56]\n\t"
  80644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80645. "lsrs r6, r4, #1\n\t"
  80646. #else
  80647. "lsr r6, r4, #1\n\t"
  80648. #endif
  80649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80650. "lsls r4, r4, %[n]\n\t"
  80651. #else
  80652. "lsl r4, r4, %[n]\n\t"
  80653. #endif
  80654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80655. "lsrs r6, r6, r7\n\t"
  80656. #else
  80657. "lsr r6, r6, r7\n\t"
  80658. #endif
  80659. #ifdef WOLFSSL_KEIL
  80660. "orrs r5, r5, r6\n\t"
  80661. #elif defined(__clang__)
  80662. "orrs r5, r6\n\t"
  80663. #else
  80664. "orr r5, r6\n\t"
  80665. #endif
  80666. "ldr r3, [%[a], #44]\n\t"
  80667. "str r5, [%[r], #52]\n\t"
  80668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80669. "lsrs r6, r3, #1\n\t"
  80670. #else
  80671. "lsr r6, r3, #1\n\t"
  80672. #endif
  80673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80674. "lsls r3, r3, %[n]\n\t"
  80675. #else
  80676. "lsl r3, r3, %[n]\n\t"
  80677. #endif
  80678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80679. "lsrs r6, r6, r7\n\t"
  80680. #else
  80681. "lsr r6, r6, r7\n\t"
  80682. #endif
  80683. #ifdef WOLFSSL_KEIL
  80684. "orrs r4, r4, r6\n\t"
  80685. #elif defined(__clang__)
  80686. "orrs r4, r6\n\t"
  80687. #else
  80688. "orr r4, r6\n\t"
  80689. #endif
  80690. "ldr r5, [%[a], #40]\n\t"
  80691. "str r4, [%[r], #48]\n\t"
  80692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80693. "lsrs r6, r5, #1\n\t"
  80694. #else
  80695. "lsr r6, r5, #1\n\t"
  80696. #endif
  80697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80698. "lsls r5, r5, %[n]\n\t"
  80699. #else
  80700. "lsl r5, r5, %[n]\n\t"
  80701. #endif
  80702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80703. "lsrs r6, r6, r7\n\t"
  80704. #else
  80705. "lsr r6, r6, r7\n\t"
  80706. #endif
  80707. #ifdef WOLFSSL_KEIL
  80708. "orrs r3, r3, r6\n\t"
  80709. #elif defined(__clang__)
  80710. "orrs r3, r6\n\t"
  80711. #else
  80712. "orr r3, r6\n\t"
  80713. #endif
  80714. "ldr r4, [%[a], #36]\n\t"
  80715. "str r3, [%[r], #44]\n\t"
  80716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80717. "lsrs r6, r4, #1\n\t"
  80718. #else
  80719. "lsr r6, r4, #1\n\t"
  80720. #endif
  80721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80722. "lsls r4, r4, %[n]\n\t"
  80723. #else
  80724. "lsl r4, r4, %[n]\n\t"
  80725. #endif
  80726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80727. "lsrs r6, r6, r7\n\t"
  80728. #else
  80729. "lsr r6, r6, r7\n\t"
  80730. #endif
  80731. #ifdef WOLFSSL_KEIL
  80732. "orrs r5, r5, r6\n\t"
  80733. #elif defined(__clang__)
  80734. "orrs r5, r6\n\t"
  80735. #else
  80736. "orr r5, r6\n\t"
  80737. #endif
  80738. "ldr r3, [%[a], #32]\n\t"
  80739. "str r5, [%[r], #40]\n\t"
  80740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80741. "lsrs r6, r3, #1\n\t"
  80742. #else
  80743. "lsr r6, r3, #1\n\t"
  80744. #endif
  80745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80746. "lsls r3, r3, %[n]\n\t"
  80747. #else
  80748. "lsl r3, r3, %[n]\n\t"
  80749. #endif
  80750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80751. "lsrs r6, r6, r7\n\t"
  80752. #else
  80753. "lsr r6, r6, r7\n\t"
  80754. #endif
  80755. #ifdef WOLFSSL_KEIL
  80756. "orrs r4, r4, r6\n\t"
  80757. #elif defined(__clang__)
  80758. "orrs r4, r6\n\t"
  80759. #else
  80760. "orr r4, r6\n\t"
  80761. #endif
  80762. "ldr r5, [%[a], #28]\n\t"
  80763. "str r4, [%[r], #36]\n\t"
  80764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80765. "lsrs r6, r5, #1\n\t"
  80766. #else
  80767. "lsr r6, r5, #1\n\t"
  80768. #endif
  80769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80770. "lsls r5, r5, %[n]\n\t"
  80771. #else
  80772. "lsl r5, r5, %[n]\n\t"
  80773. #endif
  80774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80775. "lsrs r6, r6, r7\n\t"
  80776. #else
  80777. "lsr r6, r6, r7\n\t"
  80778. #endif
  80779. #ifdef WOLFSSL_KEIL
  80780. "orrs r3, r3, r6\n\t"
  80781. #elif defined(__clang__)
  80782. "orrs r3, r6\n\t"
  80783. #else
  80784. "orr r3, r6\n\t"
  80785. #endif
  80786. "ldr r4, [%[a], #24]\n\t"
  80787. "str r3, [%[r], #32]\n\t"
  80788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80789. "lsrs r6, r4, #1\n\t"
  80790. #else
  80791. "lsr r6, r4, #1\n\t"
  80792. #endif
  80793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80794. "lsls r4, r4, %[n]\n\t"
  80795. #else
  80796. "lsl r4, r4, %[n]\n\t"
  80797. #endif
  80798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80799. "lsrs r6, r6, r7\n\t"
  80800. #else
  80801. "lsr r6, r6, r7\n\t"
  80802. #endif
  80803. #ifdef WOLFSSL_KEIL
  80804. "orrs r5, r5, r6\n\t"
  80805. #elif defined(__clang__)
  80806. "orrs r5, r6\n\t"
  80807. #else
  80808. "orr r5, r6\n\t"
  80809. #endif
  80810. "ldr r3, [%[a], #20]\n\t"
  80811. "str r5, [%[r], #28]\n\t"
  80812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80813. "lsrs r6, r3, #1\n\t"
  80814. #else
  80815. "lsr r6, r3, #1\n\t"
  80816. #endif
  80817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80818. "lsls r3, r3, %[n]\n\t"
  80819. #else
  80820. "lsl r3, r3, %[n]\n\t"
  80821. #endif
  80822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80823. "lsrs r6, r6, r7\n\t"
  80824. #else
  80825. "lsr r6, r6, r7\n\t"
  80826. #endif
  80827. #ifdef WOLFSSL_KEIL
  80828. "orrs r4, r4, r6\n\t"
  80829. #elif defined(__clang__)
  80830. "orrs r4, r6\n\t"
  80831. #else
  80832. "orr r4, r6\n\t"
  80833. #endif
  80834. "ldr r5, [%[a], #16]\n\t"
  80835. "str r4, [%[r], #24]\n\t"
  80836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80837. "lsrs r6, r5, #1\n\t"
  80838. #else
  80839. "lsr r6, r5, #1\n\t"
  80840. #endif
  80841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80842. "lsls r5, r5, %[n]\n\t"
  80843. #else
  80844. "lsl r5, r5, %[n]\n\t"
  80845. #endif
  80846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80847. "lsrs r6, r6, r7\n\t"
  80848. #else
  80849. "lsr r6, r6, r7\n\t"
  80850. #endif
  80851. #ifdef WOLFSSL_KEIL
  80852. "orrs r3, r3, r6\n\t"
  80853. #elif defined(__clang__)
  80854. "orrs r3, r6\n\t"
  80855. #else
  80856. "orr r3, r6\n\t"
  80857. #endif
  80858. "ldr r4, [%[a], #12]\n\t"
  80859. "str r3, [%[r], #20]\n\t"
  80860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80861. "lsrs r6, r4, #1\n\t"
  80862. #else
  80863. "lsr r6, r4, #1\n\t"
  80864. #endif
  80865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80866. "lsls r4, r4, %[n]\n\t"
  80867. #else
  80868. "lsl r4, r4, %[n]\n\t"
  80869. #endif
  80870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80871. "lsrs r6, r6, r7\n\t"
  80872. #else
  80873. "lsr r6, r6, r7\n\t"
  80874. #endif
  80875. #ifdef WOLFSSL_KEIL
  80876. "orrs r5, r5, r6\n\t"
  80877. #elif defined(__clang__)
  80878. "orrs r5, r6\n\t"
  80879. #else
  80880. "orr r5, r6\n\t"
  80881. #endif
  80882. "ldr r3, [%[a], #8]\n\t"
  80883. "str r5, [%[r], #16]\n\t"
  80884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80885. "lsrs r6, r3, #1\n\t"
  80886. #else
  80887. "lsr r6, r3, #1\n\t"
  80888. #endif
  80889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80890. "lsls r3, r3, %[n]\n\t"
  80891. #else
  80892. "lsl r3, r3, %[n]\n\t"
  80893. #endif
  80894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80895. "lsrs r6, r6, r7\n\t"
  80896. #else
  80897. "lsr r6, r6, r7\n\t"
  80898. #endif
  80899. #ifdef WOLFSSL_KEIL
  80900. "orrs r4, r4, r6\n\t"
  80901. #elif defined(__clang__)
  80902. "orrs r4, r6\n\t"
  80903. #else
  80904. "orr r4, r6\n\t"
  80905. #endif
  80906. "ldr r5, [%[a], #4]\n\t"
  80907. "str r4, [%[r], #12]\n\t"
  80908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80909. "lsrs r6, r5, #1\n\t"
  80910. #else
  80911. "lsr r6, r5, #1\n\t"
  80912. #endif
  80913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80914. "lsls r5, r5, %[n]\n\t"
  80915. #else
  80916. "lsl r5, r5, %[n]\n\t"
  80917. #endif
  80918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80919. "lsrs r6, r6, r7\n\t"
  80920. #else
  80921. "lsr r6, r6, r7\n\t"
  80922. #endif
  80923. #ifdef WOLFSSL_KEIL
  80924. "orrs r3, r3, r6\n\t"
  80925. #elif defined(__clang__)
  80926. "orrs r3, r6\n\t"
  80927. #else
  80928. "orr r3, r6\n\t"
  80929. #endif
  80930. "ldr r4, [%[a]]\n\t"
  80931. "str r3, [%[r], #8]\n\t"
  80932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80933. "lsrs r6, r4, #1\n\t"
  80934. #else
  80935. "lsr r6, r4, #1\n\t"
  80936. #endif
  80937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80938. "lsls r4, r4, %[n]\n\t"
  80939. #else
  80940. "lsl r4, r4, %[n]\n\t"
  80941. #endif
  80942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80943. "lsrs r6, r6, r7\n\t"
  80944. #else
  80945. "lsr r6, r6, r7\n\t"
  80946. #endif
  80947. #ifdef WOLFSSL_KEIL
  80948. "orrs r5, r5, r6\n\t"
  80949. #elif defined(__clang__)
  80950. "orrs r5, r6\n\t"
  80951. #else
  80952. "orr r5, r6\n\t"
  80953. #endif
  80954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80955. "subs %[a], %[a], #0x40\n\t"
  80956. #else
  80957. "sub %[a], %[a], #0x40\n\t"
  80958. #endif
  80959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80960. "subs %[r], %[r], #0x40\n\t"
  80961. #else
  80962. "sub %[r], %[r], #0x40\n\t"
  80963. #endif
  80964. "ldr r3, [%[a], #60]\n\t"
  80965. "str r5, [%[r], #68]\n\t"
  80966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80967. "lsrs r6, r3, #1\n\t"
  80968. #else
  80969. "lsr r6, r3, #1\n\t"
  80970. #endif
  80971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80972. "lsls r3, r3, %[n]\n\t"
  80973. #else
  80974. "lsl r3, r3, %[n]\n\t"
  80975. #endif
  80976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80977. "lsrs r6, r6, r7\n\t"
  80978. #else
  80979. "lsr r6, r6, r7\n\t"
  80980. #endif
  80981. #ifdef WOLFSSL_KEIL
  80982. "orrs r4, r4, r6\n\t"
  80983. #elif defined(__clang__)
  80984. "orrs r4, r6\n\t"
  80985. #else
  80986. "orr r4, r6\n\t"
  80987. #endif
  80988. "ldr r5, [%[a], #56]\n\t"
  80989. "str r4, [%[r], #64]\n\t"
  80990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80991. "lsrs r6, r5, #1\n\t"
  80992. #else
  80993. "lsr r6, r5, #1\n\t"
  80994. #endif
  80995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80996. "lsls r5, r5, %[n]\n\t"
  80997. #else
  80998. "lsl r5, r5, %[n]\n\t"
  80999. #endif
  81000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81001. "lsrs r6, r6, r7\n\t"
  81002. #else
  81003. "lsr r6, r6, r7\n\t"
  81004. #endif
  81005. #ifdef WOLFSSL_KEIL
  81006. "orrs r3, r3, r6\n\t"
  81007. #elif defined(__clang__)
  81008. "orrs r3, r6\n\t"
  81009. #else
  81010. "orr r3, r6\n\t"
  81011. #endif
  81012. "ldr r4, [%[a], #52]\n\t"
  81013. "str r3, [%[r], #60]\n\t"
  81014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81015. "lsrs r6, r4, #1\n\t"
  81016. #else
  81017. "lsr r6, r4, #1\n\t"
  81018. #endif
  81019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81020. "lsls r4, r4, %[n]\n\t"
  81021. #else
  81022. "lsl r4, r4, %[n]\n\t"
  81023. #endif
  81024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81025. "lsrs r6, r6, r7\n\t"
  81026. #else
  81027. "lsr r6, r6, r7\n\t"
  81028. #endif
  81029. #ifdef WOLFSSL_KEIL
  81030. "orrs r5, r5, r6\n\t"
  81031. #elif defined(__clang__)
  81032. "orrs r5, r6\n\t"
  81033. #else
  81034. "orr r5, r6\n\t"
  81035. #endif
  81036. "ldr r3, [%[a], #48]\n\t"
  81037. "str r5, [%[r], #56]\n\t"
  81038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81039. "lsrs r6, r3, #1\n\t"
  81040. #else
  81041. "lsr r6, r3, #1\n\t"
  81042. #endif
  81043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81044. "lsls r3, r3, %[n]\n\t"
  81045. #else
  81046. "lsl r3, r3, %[n]\n\t"
  81047. #endif
  81048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81049. "lsrs r6, r6, r7\n\t"
  81050. #else
  81051. "lsr r6, r6, r7\n\t"
  81052. #endif
  81053. #ifdef WOLFSSL_KEIL
  81054. "orrs r4, r4, r6\n\t"
  81055. #elif defined(__clang__)
  81056. "orrs r4, r6\n\t"
  81057. #else
  81058. "orr r4, r6\n\t"
  81059. #endif
  81060. "ldr r5, [%[a], #44]\n\t"
  81061. "str r4, [%[r], #52]\n\t"
  81062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81063. "lsrs r6, r5, #1\n\t"
  81064. #else
  81065. "lsr r6, r5, #1\n\t"
  81066. #endif
  81067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81068. "lsls r5, r5, %[n]\n\t"
  81069. #else
  81070. "lsl r5, r5, %[n]\n\t"
  81071. #endif
  81072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81073. "lsrs r6, r6, r7\n\t"
  81074. #else
  81075. "lsr r6, r6, r7\n\t"
  81076. #endif
  81077. #ifdef WOLFSSL_KEIL
  81078. "orrs r3, r3, r6\n\t"
  81079. #elif defined(__clang__)
  81080. "orrs r3, r6\n\t"
  81081. #else
  81082. "orr r3, r6\n\t"
  81083. #endif
  81084. "ldr r4, [%[a], #40]\n\t"
  81085. "str r3, [%[r], #48]\n\t"
  81086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81087. "lsrs r6, r4, #1\n\t"
  81088. #else
  81089. "lsr r6, r4, #1\n\t"
  81090. #endif
  81091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81092. "lsls r4, r4, %[n]\n\t"
  81093. #else
  81094. "lsl r4, r4, %[n]\n\t"
  81095. #endif
  81096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81097. "lsrs r6, r6, r7\n\t"
  81098. #else
  81099. "lsr r6, r6, r7\n\t"
  81100. #endif
  81101. #ifdef WOLFSSL_KEIL
  81102. "orrs r5, r5, r6\n\t"
  81103. #elif defined(__clang__)
  81104. "orrs r5, r6\n\t"
  81105. #else
  81106. "orr r5, r6\n\t"
  81107. #endif
  81108. "ldr r3, [%[a], #36]\n\t"
  81109. "str r5, [%[r], #44]\n\t"
  81110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81111. "lsrs r6, r3, #1\n\t"
  81112. #else
  81113. "lsr r6, r3, #1\n\t"
  81114. #endif
  81115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81116. "lsls r3, r3, %[n]\n\t"
  81117. #else
  81118. "lsl r3, r3, %[n]\n\t"
  81119. #endif
  81120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81121. "lsrs r6, r6, r7\n\t"
  81122. #else
  81123. "lsr r6, r6, r7\n\t"
  81124. #endif
  81125. #ifdef WOLFSSL_KEIL
  81126. "orrs r4, r4, r6\n\t"
  81127. #elif defined(__clang__)
  81128. "orrs r4, r6\n\t"
  81129. #else
  81130. "orr r4, r6\n\t"
  81131. #endif
  81132. "ldr r5, [%[a], #32]\n\t"
  81133. "str r4, [%[r], #40]\n\t"
  81134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81135. "lsrs r6, r5, #1\n\t"
  81136. #else
  81137. "lsr r6, r5, #1\n\t"
  81138. #endif
  81139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81140. "lsls r5, r5, %[n]\n\t"
  81141. #else
  81142. "lsl r5, r5, %[n]\n\t"
  81143. #endif
  81144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81145. "lsrs r6, r6, r7\n\t"
  81146. #else
  81147. "lsr r6, r6, r7\n\t"
  81148. #endif
  81149. #ifdef WOLFSSL_KEIL
  81150. "orrs r3, r3, r6\n\t"
  81151. #elif defined(__clang__)
  81152. "orrs r3, r6\n\t"
  81153. #else
  81154. "orr r3, r6\n\t"
  81155. #endif
  81156. "ldr r4, [%[a], #28]\n\t"
  81157. "str r3, [%[r], #36]\n\t"
  81158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81159. "lsrs r6, r4, #1\n\t"
  81160. #else
  81161. "lsr r6, r4, #1\n\t"
  81162. #endif
  81163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81164. "lsls r4, r4, %[n]\n\t"
  81165. #else
  81166. "lsl r4, r4, %[n]\n\t"
  81167. #endif
  81168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81169. "lsrs r6, r6, r7\n\t"
  81170. #else
  81171. "lsr r6, r6, r7\n\t"
  81172. #endif
  81173. #ifdef WOLFSSL_KEIL
  81174. "orrs r5, r5, r6\n\t"
  81175. #elif defined(__clang__)
  81176. "orrs r5, r6\n\t"
  81177. #else
  81178. "orr r5, r6\n\t"
  81179. #endif
  81180. "ldr r3, [%[a], #24]\n\t"
  81181. "str r5, [%[r], #32]\n\t"
  81182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81183. "lsrs r6, r3, #1\n\t"
  81184. #else
  81185. "lsr r6, r3, #1\n\t"
  81186. #endif
  81187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81188. "lsls r3, r3, %[n]\n\t"
  81189. #else
  81190. "lsl r3, r3, %[n]\n\t"
  81191. #endif
  81192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81193. "lsrs r6, r6, r7\n\t"
  81194. #else
  81195. "lsr r6, r6, r7\n\t"
  81196. #endif
  81197. #ifdef WOLFSSL_KEIL
  81198. "orrs r4, r4, r6\n\t"
  81199. #elif defined(__clang__)
  81200. "orrs r4, r6\n\t"
  81201. #else
  81202. "orr r4, r6\n\t"
  81203. #endif
  81204. "ldr r5, [%[a], #20]\n\t"
  81205. "str r4, [%[r], #28]\n\t"
  81206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81207. "lsrs r6, r5, #1\n\t"
  81208. #else
  81209. "lsr r6, r5, #1\n\t"
  81210. #endif
  81211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81212. "lsls r5, r5, %[n]\n\t"
  81213. #else
  81214. "lsl r5, r5, %[n]\n\t"
  81215. #endif
  81216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81217. "lsrs r6, r6, r7\n\t"
  81218. #else
  81219. "lsr r6, r6, r7\n\t"
  81220. #endif
  81221. #ifdef WOLFSSL_KEIL
  81222. "orrs r3, r3, r6\n\t"
  81223. #elif defined(__clang__)
  81224. "orrs r3, r6\n\t"
  81225. #else
  81226. "orr r3, r6\n\t"
  81227. #endif
  81228. "ldr r4, [%[a], #16]\n\t"
  81229. "str r3, [%[r], #24]\n\t"
  81230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81231. "lsrs r6, r4, #1\n\t"
  81232. #else
  81233. "lsr r6, r4, #1\n\t"
  81234. #endif
  81235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81236. "lsls r4, r4, %[n]\n\t"
  81237. #else
  81238. "lsl r4, r4, %[n]\n\t"
  81239. #endif
  81240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81241. "lsrs r6, r6, r7\n\t"
  81242. #else
  81243. "lsr r6, r6, r7\n\t"
  81244. #endif
  81245. #ifdef WOLFSSL_KEIL
  81246. "orrs r5, r5, r6\n\t"
  81247. #elif defined(__clang__)
  81248. "orrs r5, r6\n\t"
  81249. #else
  81250. "orr r5, r6\n\t"
  81251. #endif
  81252. "ldr r3, [%[a], #12]\n\t"
  81253. "str r5, [%[r], #20]\n\t"
  81254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81255. "lsrs r6, r3, #1\n\t"
  81256. #else
  81257. "lsr r6, r3, #1\n\t"
  81258. #endif
  81259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81260. "lsls r3, r3, %[n]\n\t"
  81261. #else
  81262. "lsl r3, r3, %[n]\n\t"
  81263. #endif
  81264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81265. "lsrs r6, r6, r7\n\t"
  81266. #else
  81267. "lsr r6, r6, r7\n\t"
  81268. #endif
  81269. #ifdef WOLFSSL_KEIL
  81270. "orrs r4, r4, r6\n\t"
  81271. #elif defined(__clang__)
  81272. "orrs r4, r6\n\t"
  81273. #else
  81274. "orr r4, r6\n\t"
  81275. #endif
  81276. "ldr r5, [%[a], #8]\n\t"
  81277. "str r4, [%[r], #16]\n\t"
  81278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81279. "lsrs r6, r5, #1\n\t"
  81280. #else
  81281. "lsr r6, r5, #1\n\t"
  81282. #endif
  81283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81284. "lsls r5, r5, %[n]\n\t"
  81285. #else
  81286. "lsl r5, r5, %[n]\n\t"
  81287. #endif
  81288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81289. "lsrs r6, r6, r7\n\t"
  81290. #else
  81291. "lsr r6, r6, r7\n\t"
  81292. #endif
  81293. #ifdef WOLFSSL_KEIL
  81294. "orrs r3, r3, r6\n\t"
  81295. #elif defined(__clang__)
  81296. "orrs r3, r6\n\t"
  81297. #else
  81298. "orr r3, r6\n\t"
  81299. #endif
  81300. "ldr r4, [%[a], #4]\n\t"
  81301. "str r3, [%[r], #12]\n\t"
  81302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81303. "lsrs r6, r4, #1\n\t"
  81304. #else
  81305. "lsr r6, r4, #1\n\t"
  81306. #endif
  81307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81308. "lsls r4, r4, %[n]\n\t"
  81309. #else
  81310. "lsl r4, r4, %[n]\n\t"
  81311. #endif
  81312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81313. "lsrs r6, r6, r7\n\t"
  81314. #else
  81315. "lsr r6, r6, r7\n\t"
  81316. #endif
  81317. #ifdef WOLFSSL_KEIL
  81318. "orrs r5, r5, r6\n\t"
  81319. #elif defined(__clang__)
  81320. "orrs r5, r6\n\t"
  81321. #else
  81322. "orr r5, r6\n\t"
  81323. #endif
  81324. "ldr r3, [%[a]]\n\t"
  81325. "str r5, [%[r], #8]\n\t"
  81326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81327. "lsrs r6, r3, #1\n\t"
  81328. #else
  81329. "lsr r6, r3, #1\n\t"
  81330. #endif
  81331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81332. "lsls r3, r3, %[n]\n\t"
  81333. #else
  81334. "lsl r3, r3, %[n]\n\t"
  81335. #endif
  81336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81337. "lsrs r6, r6, r7\n\t"
  81338. #else
  81339. "lsr r6, r6, r7\n\t"
  81340. #endif
  81341. #ifdef WOLFSSL_KEIL
  81342. "orrs r4, r4, r6\n\t"
  81343. #elif defined(__clang__)
  81344. "orrs r4, r6\n\t"
  81345. #else
  81346. "orr r4, r6\n\t"
  81347. #endif
  81348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81349. "subs %[a], %[a], #0x40\n\t"
  81350. #else
  81351. "sub %[a], %[a], #0x40\n\t"
  81352. #endif
  81353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81354. "subs %[r], %[r], #0x40\n\t"
  81355. #else
  81356. "sub %[r], %[r], #0x40\n\t"
  81357. #endif
  81358. "ldr r5, [%[a], #60]\n\t"
  81359. "str r4, [%[r], #68]\n\t"
  81360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81361. "lsrs r6, r5, #1\n\t"
  81362. #else
  81363. "lsr r6, r5, #1\n\t"
  81364. #endif
  81365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81366. "lsls r5, r5, %[n]\n\t"
  81367. #else
  81368. "lsl r5, r5, %[n]\n\t"
  81369. #endif
  81370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81371. "lsrs r6, r6, r7\n\t"
  81372. #else
  81373. "lsr r6, r6, r7\n\t"
  81374. #endif
  81375. #ifdef WOLFSSL_KEIL
  81376. "orrs r3, r3, r6\n\t"
  81377. #elif defined(__clang__)
  81378. "orrs r3, r6\n\t"
  81379. #else
  81380. "orr r3, r6\n\t"
  81381. #endif
  81382. "ldr r4, [%[a], #56]\n\t"
  81383. "str r3, [%[r], #64]\n\t"
  81384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81385. "lsrs r6, r4, #1\n\t"
  81386. #else
  81387. "lsr r6, r4, #1\n\t"
  81388. #endif
  81389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81390. "lsls r4, r4, %[n]\n\t"
  81391. #else
  81392. "lsl r4, r4, %[n]\n\t"
  81393. #endif
  81394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81395. "lsrs r6, r6, r7\n\t"
  81396. #else
  81397. "lsr r6, r6, r7\n\t"
  81398. #endif
  81399. #ifdef WOLFSSL_KEIL
  81400. "orrs r5, r5, r6\n\t"
  81401. #elif defined(__clang__)
  81402. "orrs r5, r6\n\t"
  81403. #else
  81404. "orr r5, r6\n\t"
  81405. #endif
  81406. "ldr r3, [%[a], #52]\n\t"
  81407. "str r5, [%[r], #60]\n\t"
  81408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81409. "lsrs r6, r3, #1\n\t"
  81410. #else
  81411. "lsr r6, r3, #1\n\t"
  81412. #endif
  81413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81414. "lsls r3, r3, %[n]\n\t"
  81415. #else
  81416. "lsl r3, r3, %[n]\n\t"
  81417. #endif
  81418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81419. "lsrs r6, r6, r7\n\t"
  81420. #else
  81421. "lsr r6, r6, r7\n\t"
  81422. #endif
  81423. #ifdef WOLFSSL_KEIL
  81424. "orrs r4, r4, r6\n\t"
  81425. #elif defined(__clang__)
  81426. "orrs r4, r6\n\t"
  81427. #else
  81428. "orr r4, r6\n\t"
  81429. #endif
  81430. "ldr r5, [%[a], #48]\n\t"
  81431. "str r4, [%[r], #56]\n\t"
  81432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81433. "lsrs r6, r5, #1\n\t"
  81434. #else
  81435. "lsr r6, r5, #1\n\t"
  81436. #endif
  81437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81438. "lsls r5, r5, %[n]\n\t"
  81439. #else
  81440. "lsl r5, r5, %[n]\n\t"
  81441. #endif
  81442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81443. "lsrs r6, r6, r7\n\t"
  81444. #else
  81445. "lsr r6, r6, r7\n\t"
  81446. #endif
  81447. #ifdef WOLFSSL_KEIL
  81448. "orrs r3, r3, r6\n\t"
  81449. #elif defined(__clang__)
  81450. "orrs r3, r6\n\t"
  81451. #else
  81452. "orr r3, r6\n\t"
  81453. #endif
  81454. "ldr r4, [%[a], #44]\n\t"
  81455. "str r3, [%[r], #52]\n\t"
  81456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81457. "lsrs r6, r4, #1\n\t"
  81458. #else
  81459. "lsr r6, r4, #1\n\t"
  81460. #endif
  81461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81462. "lsls r4, r4, %[n]\n\t"
  81463. #else
  81464. "lsl r4, r4, %[n]\n\t"
  81465. #endif
  81466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81467. "lsrs r6, r6, r7\n\t"
  81468. #else
  81469. "lsr r6, r6, r7\n\t"
  81470. #endif
  81471. #ifdef WOLFSSL_KEIL
  81472. "orrs r5, r5, r6\n\t"
  81473. #elif defined(__clang__)
  81474. "orrs r5, r6\n\t"
  81475. #else
  81476. "orr r5, r6\n\t"
  81477. #endif
  81478. "ldr r3, [%[a], #40]\n\t"
  81479. "str r5, [%[r], #48]\n\t"
  81480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81481. "lsrs r6, r3, #1\n\t"
  81482. #else
  81483. "lsr r6, r3, #1\n\t"
  81484. #endif
  81485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81486. "lsls r3, r3, %[n]\n\t"
  81487. #else
  81488. "lsl r3, r3, %[n]\n\t"
  81489. #endif
  81490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81491. "lsrs r6, r6, r7\n\t"
  81492. #else
  81493. "lsr r6, r6, r7\n\t"
  81494. #endif
  81495. #ifdef WOLFSSL_KEIL
  81496. "orrs r4, r4, r6\n\t"
  81497. #elif defined(__clang__)
  81498. "orrs r4, r6\n\t"
  81499. #else
  81500. "orr r4, r6\n\t"
  81501. #endif
  81502. "ldr r5, [%[a], #36]\n\t"
  81503. "str r4, [%[r], #44]\n\t"
  81504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81505. "lsrs r6, r5, #1\n\t"
  81506. #else
  81507. "lsr r6, r5, #1\n\t"
  81508. #endif
  81509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81510. "lsls r5, r5, %[n]\n\t"
  81511. #else
  81512. "lsl r5, r5, %[n]\n\t"
  81513. #endif
  81514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81515. "lsrs r6, r6, r7\n\t"
  81516. #else
  81517. "lsr r6, r6, r7\n\t"
  81518. #endif
  81519. #ifdef WOLFSSL_KEIL
  81520. "orrs r3, r3, r6\n\t"
  81521. #elif defined(__clang__)
  81522. "orrs r3, r6\n\t"
  81523. #else
  81524. "orr r3, r6\n\t"
  81525. #endif
  81526. "ldr r4, [%[a], #32]\n\t"
  81527. "str r3, [%[r], #40]\n\t"
  81528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81529. "lsrs r6, r4, #1\n\t"
  81530. #else
  81531. "lsr r6, r4, #1\n\t"
  81532. #endif
  81533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81534. "lsls r4, r4, %[n]\n\t"
  81535. #else
  81536. "lsl r4, r4, %[n]\n\t"
  81537. #endif
  81538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81539. "lsrs r6, r6, r7\n\t"
  81540. #else
  81541. "lsr r6, r6, r7\n\t"
  81542. #endif
  81543. #ifdef WOLFSSL_KEIL
  81544. "orrs r5, r5, r6\n\t"
  81545. #elif defined(__clang__)
  81546. "orrs r5, r6\n\t"
  81547. #else
  81548. "orr r5, r6\n\t"
  81549. #endif
  81550. "ldr r3, [%[a], #28]\n\t"
  81551. "str r5, [%[r], #36]\n\t"
  81552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81553. "lsrs r6, r3, #1\n\t"
  81554. #else
  81555. "lsr r6, r3, #1\n\t"
  81556. #endif
  81557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81558. "lsls r3, r3, %[n]\n\t"
  81559. #else
  81560. "lsl r3, r3, %[n]\n\t"
  81561. #endif
  81562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81563. "lsrs r6, r6, r7\n\t"
  81564. #else
  81565. "lsr r6, r6, r7\n\t"
  81566. #endif
  81567. #ifdef WOLFSSL_KEIL
  81568. "orrs r4, r4, r6\n\t"
  81569. #elif defined(__clang__)
  81570. "orrs r4, r6\n\t"
  81571. #else
  81572. "orr r4, r6\n\t"
  81573. #endif
  81574. "ldr r5, [%[a], #24]\n\t"
  81575. "str r4, [%[r], #32]\n\t"
  81576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81577. "lsrs r6, r5, #1\n\t"
  81578. #else
  81579. "lsr r6, r5, #1\n\t"
  81580. #endif
  81581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81582. "lsls r5, r5, %[n]\n\t"
  81583. #else
  81584. "lsl r5, r5, %[n]\n\t"
  81585. #endif
  81586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81587. "lsrs r6, r6, r7\n\t"
  81588. #else
  81589. "lsr r6, r6, r7\n\t"
  81590. #endif
  81591. #ifdef WOLFSSL_KEIL
  81592. "orrs r3, r3, r6\n\t"
  81593. #elif defined(__clang__)
  81594. "orrs r3, r6\n\t"
  81595. #else
  81596. "orr r3, r6\n\t"
  81597. #endif
  81598. "ldr r4, [%[a], #20]\n\t"
  81599. "str r3, [%[r], #28]\n\t"
  81600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81601. "lsrs r6, r4, #1\n\t"
  81602. #else
  81603. "lsr r6, r4, #1\n\t"
  81604. #endif
  81605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81606. "lsls r4, r4, %[n]\n\t"
  81607. #else
  81608. "lsl r4, r4, %[n]\n\t"
  81609. #endif
  81610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81611. "lsrs r6, r6, r7\n\t"
  81612. #else
  81613. "lsr r6, r6, r7\n\t"
  81614. #endif
  81615. #ifdef WOLFSSL_KEIL
  81616. "orrs r5, r5, r6\n\t"
  81617. #elif defined(__clang__)
  81618. "orrs r5, r6\n\t"
  81619. #else
  81620. "orr r5, r6\n\t"
  81621. #endif
  81622. "ldr r3, [%[a], #16]\n\t"
  81623. "str r5, [%[r], #24]\n\t"
  81624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81625. "lsrs r6, r3, #1\n\t"
  81626. #else
  81627. "lsr r6, r3, #1\n\t"
  81628. #endif
  81629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81630. "lsls r3, r3, %[n]\n\t"
  81631. #else
  81632. "lsl r3, r3, %[n]\n\t"
  81633. #endif
  81634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81635. "lsrs r6, r6, r7\n\t"
  81636. #else
  81637. "lsr r6, r6, r7\n\t"
  81638. #endif
  81639. #ifdef WOLFSSL_KEIL
  81640. "orrs r4, r4, r6\n\t"
  81641. #elif defined(__clang__)
  81642. "orrs r4, r6\n\t"
  81643. #else
  81644. "orr r4, r6\n\t"
  81645. #endif
  81646. "ldr r5, [%[a], #12]\n\t"
  81647. "str r4, [%[r], #20]\n\t"
  81648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81649. "lsrs r6, r5, #1\n\t"
  81650. #else
  81651. "lsr r6, r5, #1\n\t"
  81652. #endif
  81653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81654. "lsls r5, r5, %[n]\n\t"
  81655. #else
  81656. "lsl r5, r5, %[n]\n\t"
  81657. #endif
  81658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81659. "lsrs r6, r6, r7\n\t"
  81660. #else
  81661. "lsr r6, r6, r7\n\t"
  81662. #endif
  81663. #ifdef WOLFSSL_KEIL
  81664. "orrs r3, r3, r6\n\t"
  81665. #elif defined(__clang__)
  81666. "orrs r3, r6\n\t"
  81667. #else
  81668. "orr r3, r6\n\t"
  81669. #endif
  81670. "ldr r4, [%[a], #8]\n\t"
  81671. "str r3, [%[r], #16]\n\t"
  81672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81673. "lsrs r6, r4, #1\n\t"
  81674. #else
  81675. "lsr r6, r4, #1\n\t"
  81676. #endif
  81677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81678. "lsls r4, r4, %[n]\n\t"
  81679. #else
  81680. "lsl r4, r4, %[n]\n\t"
  81681. #endif
  81682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81683. "lsrs r6, r6, r7\n\t"
  81684. #else
  81685. "lsr r6, r6, r7\n\t"
  81686. #endif
  81687. #ifdef WOLFSSL_KEIL
  81688. "orrs r5, r5, r6\n\t"
  81689. #elif defined(__clang__)
  81690. "orrs r5, r6\n\t"
  81691. #else
  81692. "orr r5, r6\n\t"
  81693. #endif
  81694. "ldr r3, [%[a], #4]\n\t"
  81695. "str r5, [%[r], #12]\n\t"
  81696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81697. "lsrs r6, r3, #1\n\t"
  81698. #else
  81699. "lsr r6, r3, #1\n\t"
  81700. #endif
  81701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81702. "lsls r3, r3, %[n]\n\t"
  81703. #else
  81704. "lsl r3, r3, %[n]\n\t"
  81705. #endif
  81706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81707. "lsrs r6, r6, r7\n\t"
  81708. #else
  81709. "lsr r6, r6, r7\n\t"
  81710. #endif
  81711. #ifdef WOLFSSL_KEIL
  81712. "orrs r4, r4, r6\n\t"
  81713. #elif defined(__clang__)
  81714. "orrs r4, r6\n\t"
  81715. #else
  81716. "orr r4, r6\n\t"
  81717. #endif
  81718. "ldr r5, [%[a]]\n\t"
  81719. "str r4, [%[r], #8]\n\t"
  81720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81721. "lsrs r6, r5, #1\n\t"
  81722. #else
  81723. "lsr r6, r5, #1\n\t"
  81724. #endif
  81725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81726. "lsls r5, r5, %[n]\n\t"
  81727. #else
  81728. "lsl r5, r5, %[n]\n\t"
  81729. #endif
  81730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81731. "lsrs r6, r6, r7\n\t"
  81732. #else
  81733. "lsr r6, r6, r7\n\t"
  81734. #endif
  81735. #ifdef WOLFSSL_KEIL
  81736. "orrs r3, r3, r6\n\t"
  81737. #elif defined(__clang__)
  81738. "orrs r3, r6\n\t"
  81739. #else
  81740. "orr r3, r6\n\t"
  81741. #endif
  81742. "str r5, [%[r]]\n\t"
  81743. "str r3, [%[r], #4]\n\t"
  81744. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  81745. :
  81746. : "memory", "r3", "r4", "r5", "r6", "r7"
  81747. );
  81748. }
  81749. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  81750. *
  81751. * r A single precision number that is the result of the operation.
  81752. * e A single precision number that is the exponent.
  81753. * bits The number of bits in the exponent.
  81754. * m A single precision number that is the modulus.
  81755. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  81756. */
  81757. static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits,
  81758. const sp_digit* m)
  81759. {
  81760. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  81761. sp_digit* td = NULL;
  81762. #else
  81763. sp_digit td[289];
  81764. #endif
  81765. sp_digit* norm = NULL;
  81766. sp_digit* tmp = NULL;
  81767. sp_digit mp = 1;
  81768. sp_digit n;
  81769. sp_digit o;
  81770. sp_digit mask;
  81771. int i;
  81772. int c;
  81773. byte y;
  81774. int err = MP_OKAY;
  81775. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  81776. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 289, NULL,
  81777. DYNAMIC_TYPE_TMP_BUFFER);
  81778. if (td == NULL)
  81779. err = MEMORY_E;
  81780. #endif
  81781. if (err == MP_OKAY) {
  81782. norm = td;
  81783. tmp = td + 192;
  81784. sp_3072_mont_setup(m, &mp);
  81785. sp_3072_mont_norm_96(norm, m);
  81786. i = (bits - 1) / 32;
  81787. n = e[i--];
  81788. c = bits & 31;
  81789. if (c == 0) {
  81790. c = 32;
  81791. }
  81792. c -= bits % 5;
  81793. if (c == 32) {
  81794. c = 27;
  81795. }
  81796. if (c < 0) {
  81797. /* Number of bits in top word is less than number needed. */
  81798. c = -c;
  81799. y = (byte)(n << c);
  81800. n = e[i--];
  81801. y |= (byte)(n >> (64 - c));
  81802. n <<= c;
  81803. c = 64 - c;
  81804. }
  81805. else {
  81806. y = (byte)(n >> c);
  81807. n <<= 32 - c;
  81808. }
  81809. sp_3072_lshift_96(r, norm, y);
  81810. for (; i>=0 || c>=5; ) {
  81811. if (c == 0) {
  81812. n = e[i--];
  81813. y = (byte)(n >> 27);
  81814. n <<= 5;
  81815. c = 27;
  81816. }
  81817. else if (c < 5) {
  81818. y = (byte)(n >> 27);
  81819. n = e[i--];
  81820. c = 5 - c;
  81821. y |= (byte)(n >> (32 - c));
  81822. n <<= c;
  81823. c = 32 - c;
  81824. }
  81825. else {
  81826. y = (byte)((n >> 27) & 0x1f);
  81827. n <<= 5;
  81828. c -= 5;
  81829. }
  81830. sp_3072_mont_sqr_96(r, r, m, mp);
  81831. sp_3072_mont_sqr_96(r, r, m, mp);
  81832. sp_3072_mont_sqr_96(r, r, m, mp);
  81833. sp_3072_mont_sqr_96(r, r, m, mp);
  81834. sp_3072_mont_sqr_96(r, r, m, mp);
  81835. sp_3072_lshift_96(r, r, y);
  81836. sp_3072_mul_d_96(tmp, norm, r[96]);
  81837. r[96] = 0;
  81838. o = sp_3072_add_96(r, r, tmp);
  81839. sp_3072_cond_sub_96(r, r, m, (sp_digit)0 - o);
  81840. }
  81841. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  81842. sp_3072_mont_reduce_96(r, m, mp);
  81843. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  81844. sp_3072_cond_sub_96(r, r, m, mask);
  81845. }
  81846. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  81847. if (td != NULL)
  81848. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  81849. #endif
  81850. return err;
  81851. }
  81852. #endif /* HAVE_FFDHE_3072 */
  81853. /* Perform the modular exponentiation for Diffie-Hellman.
  81854. *
  81855. * base Base.
  81856. * exp Array of bytes that is the exponent.
  81857. * expLen Length of data, in bytes, in exponent.
  81858. * mod Modulus.
  81859. * out Buffer to hold big-endian bytes of exponentiation result.
  81860. * Must be at least 384 bytes long.
  81861. * outLen Length, in bytes, of exponentiation result.
  81862. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  81863. * and MEMORY_E if memory allocation fails.
  81864. */
  81865. int sp_DhExp_3072(const mp_int* base, const byte* exp, word32 expLen,
  81866. const mp_int* mod, byte* out, word32* outLen)
  81867. {
  81868. int err = MP_OKAY;
  81869. sp_digit b[192];
  81870. sp_digit e[96];
  81871. sp_digit m[96];
  81872. sp_digit* r = b;
  81873. word32 i;
  81874. if (mp_count_bits(base) > 3072) {
  81875. err = MP_READ_E;
  81876. }
  81877. else if (expLen > 384) {
  81878. err = MP_READ_E;
  81879. }
  81880. else if (mp_count_bits(mod) != 3072) {
  81881. err = MP_READ_E;
  81882. }
  81883. else if (mp_iseven(mod)) {
  81884. err = MP_VAL;
  81885. }
  81886. if (err == MP_OKAY) {
  81887. sp_3072_from_mp(b, 96, base);
  81888. sp_3072_from_bin(e, 96, exp, expLen);
  81889. sp_3072_from_mp(m, 96, mod);
  81890. #ifdef HAVE_FFDHE_3072
  81891. if (base->used == 1 && base->dp[0] == 2 && m[95] == (sp_digit)-1)
  81892. err = sp_3072_mod_exp_2_96(r, e, expLen * 8, m);
  81893. else
  81894. #endif
  81895. err = sp_3072_mod_exp_96(r, b, e, expLen * 8, m, 0);
  81896. }
  81897. if (err == MP_OKAY) {
  81898. sp_3072_to_bin_96(r, out);
  81899. *outLen = 384;
  81900. for (i=0; i<384 && out[i] == 0; i++) {
  81901. /* Search for first non-zero. */
  81902. }
  81903. *outLen -= i;
  81904. XMEMMOVE(out, out + i, *outLen);
  81905. }
  81906. XMEMSET(e, 0, sizeof(e));
  81907. return err;
  81908. }
  81909. #endif /* WOLFSSL_HAVE_SP_DH */
  81910. /* Perform the modular exponentiation for Diffie-Hellman.
  81911. *
  81912. * base Base. MP integer.
  81913. * exp Exponent. MP integer.
  81914. * mod Modulus. MP integer.
  81915. * res Result. MP integer.
  81916. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  81917. * and MEMORY_E if memory allocation fails.
  81918. */
  81919. int sp_ModExp_1536(const mp_int* base, const mp_int* exp, const mp_int* mod,
  81920. mp_int* res)
  81921. {
  81922. int err = MP_OKAY;
  81923. sp_digit b[96];
  81924. sp_digit e[48];
  81925. sp_digit m[48];
  81926. sp_digit* r = b;
  81927. int expBits = mp_count_bits(exp);
  81928. if (mp_count_bits(base) > 1536) {
  81929. err = MP_READ_E;
  81930. }
  81931. else if (expBits > 1536) {
  81932. err = MP_READ_E;
  81933. }
  81934. else if (mp_count_bits(mod) != 1536) {
  81935. err = MP_READ_E;
  81936. }
  81937. else if (mp_iseven(mod)) {
  81938. err = MP_VAL;
  81939. }
  81940. if (err == MP_OKAY) {
  81941. sp_3072_from_mp(b, 48, base);
  81942. sp_3072_from_mp(e, 48, exp);
  81943. sp_3072_from_mp(m, 48, mod);
  81944. err = sp_3072_mod_exp_48(r, b, e, expBits, m, 0);
  81945. }
  81946. if (err == MP_OKAY) {
  81947. XMEMSET(r + 48, 0, sizeof(*r) * 48U);
  81948. err = sp_3072_to_mp(r, res);
  81949. res->used = mod->used;
  81950. mp_clamp(res);
  81951. }
  81952. XMEMSET(e, 0, sizeof(e));
  81953. return err;
  81954. }
  81955. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  81956. #endif /* !WOLFSSL_SP_NO_3072 */
  81957. #ifdef WOLFSSL_SP_4096
  81958. /* Read big endian unsigned byte array into r.
  81959. *
  81960. * r A single precision integer.
  81961. * size Maximum number of bytes to convert
  81962. * a Byte array.
  81963. * n Number of bytes in array to read.
  81964. */
  81965. static void sp_4096_from_bin(sp_digit* r, int size, const byte* a, int n)
  81966. {
  81967. int i;
  81968. int j = 0;
  81969. word32 s = 0;
  81970. r[0] = 0;
  81971. for (i = n-1; i >= 0; i--) {
  81972. r[j] |= (((sp_digit)a[i]) << s);
  81973. if (s >= 24U) {
  81974. r[j] &= 0xffffffff;
  81975. s = 32U - s;
  81976. if (j + 1 >= size) {
  81977. break;
  81978. }
  81979. r[++j] = (sp_digit)a[i] >> s;
  81980. s = 8U - s;
  81981. }
  81982. else {
  81983. s += 8U;
  81984. }
  81985. }
  81986. for (j++; j < size; j++) {
  81987. r[j] = 0;
  81988. }
  81989. }
  81990. /* Convert an mp_int to an array of sp_digit.
  81991. *
  81992. * r A single precision integer.
  81993. * size Maximum number of bytes to convert
  81994. * a A multi-precision integer.
  81995. */
  81996. static void sp_4096_from_mp(sp_digit* r, int size, const mp_int* a)
  81997. {
  81998. #if DIGIT_BIT == 32
  81999. int j;
  82000. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  82001. for (j = a->used; j < size; j++) {
  82002. r[j] = 0;
  82003. }
  82004. #elif DIGIT_BIT > 32
  82005. int i;
  82006. int j = 0;
  82007. word32 s = 0;
  82008. r[0] = 0;
  82009. for (i = 0; i < a->used && j < size; i++) {
  82010. r[j] |= ((sp_digit)a->dp[i] << s);
  82011. r[j] &= 0xffffffff;
  82012. s = 32U - s;
  82013. if (j + 1 >= size) {
  82014. break;
  82015. }
  82016. /* lint allow cast of mismatch word32 and mp_digit */
  82017. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  82018. while ((s + 32U) <= (word32)DIGIT_BIT) {
  82019. s += 32U;
  82020. r[j] &= 0xffffffff;
  82021. if (j + 1 >= size) {
  82022. break;
  82023. }
  82024. if (s < (word32)DIGIT_BIT) {
  82025. /* lint allow cast of mismatch word32 and mp_digit */
  82026. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  82027. }
  82028. else {
  82029. r[++j] = (sp_digit)0;
  82030. }
  82031. }
  82032. s = (word32)DIGIT_BIT - s;
  82033. }
  82034. for (j++; j < size; j++) {
  82035. r[j] = 0;
  82036. }
  82037. #else
  82038. int i;
  82039. int j = 0;
  82040. int s = 0;
  82041. r[0] = 0;
  82042. for (i = 0; i < a->used && j < size; i++) {
  82043. r[j] |= ((sp_digit)a->dp[i]) << s;
  82044. if (s + DIGIT_BIT >= 32) {
  82045. r[j] &= 0xffffffff;
  82046. if (j + 1 >= size) {
  82047. break;
  82048. }
  82049. s = 32 - s;
  82050. if (s == DIGIT_BIT) {
  82051. r[++j] = 0;
  82052. s = 0;
  82053. }
  82054. else {
  82055. r[++j] = a->dp[i] >> s;
  82056. s = DIGIT_BIT - s;
  82057. }
  82058. }
  82059. else {
  82060. s += DIGIT_BIT;
  82061. }
  82062. }
  82063. for (j++; j < size; j++) {
  82064. r[j] = 0;
  82065. }
  82066. #endif
  82067. }
  82068. /* Write r as big endian to byte array.
  82069. * Fixed length number of bytes written: 512
  82070. *
  82071. * r A single precision integer.
  82072. * a Byte array.
  82073. */
  82074. static void sp_4096_to_bin_128(sp_digit* r, byte* a)
  82075. {
  82076. int i;
  82077. int j;
  82078. int s = 0;
  82079. int b;
  82080. j = 4096 / 8 - 1;
  82081. a[j] = 0;
  82082. for (i=0; i<128 && j>=0; i++) {
  82083. b = 0;
  82084. /* lint allow cast of mismatch sp_digit and int */
  82085. a[j--] |= (byte)(r[i] << s); /*lint !e9033*/
  82086. b += 8 - s;
  82087. if (j < 0) {
  82088. break;
  82089. }
  82090. while (b < 32) {
  82091. a[j--] = (byte)(r[i] >> b);
  82092. b += 8;
  82093. if (j < 0) {
  82094. break;
  82095. }
  82096. }
  82097. s = 8 - (b - 32);
  82098. if (j >= 0) {
  82099. a[j] = 0;
  82100. }
  82101. if (s != 0) {
  82102. j++;
  82103. }
  82104. }
  82105. }
  82106. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  82107. /* Normalize the values in each word to 32.
  82108. *
  82109. * a Array of sp_digit to normalize.
  82110. */
  82111. #define sp_4096_norm_128(a)
  82112. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  82113. /* Normalize the values in each word to 32.
  82114. *
  82115. * a Array of sp_digit to normalize.
  82116. */
  82117. #define sp_4096_norm_128(a)
  82118. #ifndef WOLFSSL_SP_SMALL
  82119. /* Add b to a into r. (r = a + b)
  82120. *
  82121. * r A single precision integer.
  82122. * a A single precision integer.
  82123. * b A single precision integer.
  82124. */
  82125. SP_NOINLINE static sp_digit sp_4096_add_to_word_64(sp_digit* r, sp_digit a,
  82126. const sp_digit* b)
  82127. {
  82128. __asm__ __volatile__ (
  82129. "movs r5, #0\n\t"
  82130. "ldm %[b]!, {r3, r4}\n\t"
  82131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82132. "adds r3, r3, %[a]\n\t"
  82133. #else
  82134. "add r3, r3, %[a]\n\t"
  82135. #endif
  82136. #ifdef WOLFSSL_KEIL
  82137. "adcs r4, r4, r5\n\t"
  82138. #elif defined(__clang__)
  82139. "adcs r4, r5\n\t"
  82140. #else
  82141. "adc r4, r5\n\t"
  82142. #endif
  82143. "stm %[r]!, {r3, r4}\n\t"
  82144. "ldm %[b]!, {r3, r4}\n\t"
  82145. #ifdef WOLFSSL_KEIL
  82146. "adcs r3, r3, r5\n\t"
  82147. #elif defined(__clang__)
  82148. "adcs r3, r5\n\t"
  82149. #else
  82150. "adc r3, r5\n\t"
  82151. #endif
  82152. #ifdef WOLFSSL_KEIL
  82153. "adcs r4, r4, r5\n\t"
  82154. #elif defined(__clang__)
  82155. "adcs r4, r5\n\t"
  82156. #else
  82157. "adc r4, r5\n\t"
  82158. #endif
  82159. "stm %[r]!, {r3, r4}\n\t"
  82160. "ldm %[b]!, {r3, r4}\n\t"
  82161. #ifdef WOLFSSL_KEIL
  82162. "adcs r3, r3, r5\n\t"
  82163. #elif defined(__clang__)
  82164. "adcs r3, r5\n\t"
  82165. #else
  82166. "adc r3, r5\n\t"
  82167. #endif
  82168. #ifdef WOLFSSL_KEIL
  82169. "adcs r4, r4, r5\n\t"
  82170. #elif defined(__clang__)
  82171. "adcs r4, r5\n\t"
  82172. #else
  82173. "adc r4, r5\n\t"
  82174. #endif
  82175. "stm %[r]!, {r3, r4}\n\t"
  82176. "ldm %[b]!, {r3, r4}\n\t"
  82177. #ifdef WOLFSSL_KEIL
  82178. "adcs r3, r3, r5\n\t"
  82179. #elif defined(__clang__)
  82180. "adcs r3, r5\n\t"
  82181. #else
  82182. "adc r3, r5\n\t"
  82183. #endif
  82184. #ifdef WOLFSSL_KEIL
  82185. "adcs r4, r4, r5\n\t"
  82186. #elif defined(__clang__)
  82187. "adcs r4, r5\n\t"
  82188. #else
  82189. "adc r4, r5\n\t"
  82190. #endif
  82191. "stm %[r]!, {r3, r4}\n\t"
  82192. "ldm %[b]!, {r3, r4}\n\t"
  82193. #ifdef WOLFSSL_KEIL
  82194. "adcs r3, r3, r5\n\t"
  82195. #elif defined(__clang__)
  82196. "adcs r3, r5\n\t"
  82197. #else
  82198. "adc r3, r5\n\t"
  82199. #endif
  82200. #ifdef WOLFSSL_KEIL
  82201. "adcs r4, r4, r5\n\t"
  82202. #elif defined(__clang__)
  82203. "adcs r4, r5\n\t"
  82204. #else
  82205. "adc r4, r5\n\t"
  82206. #endif
  82207. "stm %[r]!, {r3, r4}\n\t"
  82208. "ldm %[b]!, {r3, r4}\n\t"
  82209. #ifdef WOLFSSL_KEIL
  82210. "adcs r3, r3, r5\n\t"
  82211. #elif defined(__clang__)
  82212. "adcs r3, r5\n\t"
  82213. #else
  82214. "adc r3, r5\n\t"
  82215. #endif
  82216. #ifdef WOLFSSL_KEIL
  82217. "adcs r4, r4, r5\n\t"
  82218. #elif defined(__clang__)
  82219. "adcs r4, r5\n\t"
  82220. #else
  82221. "adc r4, r5\n\t"
  82222. #endif
  82223. "stm %[r]!, {r3, r4}\n\t"
  82224. "ldm %[b]!, {r3, r4}\n\t"
  82225. #ifdef WOLFSSL_KEIL
  82226. "adcs r3, r3, r5\n\t"
  82227. #elif defined(__clang__)
  82228. "adcs r3, r5\n\t"
  82229. #else
  82230. "adc r3, r5\n\t"
  82231. #endif
  82232. #ifdef WOLFSSL_KEIL
  82233. "adcs r4, r4, r5\n\t"
  82234. #elif defined(__clang__)
  82235. "adcs r4, r5\n\t"
  82236. #else
  82237. "adc r4, r5\n\t"
  82238. #endif
  82239. "stm %[r]!, {r3, r4}\n\t"
  82240. "ldm %[b]!, {r3, r4}\n\t"
  82241. #ifdef WOLFSSL_KEIL
  82242. "adcs r3, r3, r5\n\t"
  82243. #elif defined(__clang__)
  82244. "adcs r3, r5\n\t"
  82245. #else
  82246. "adc r3, r5\n\t"
  82247. #endif
  82248. #ifdef WOLFSSL_KEIL
  82249. "adcs r4, r4, r5\n\t"
  82250. #elif defined(__clang__)
  82251. "adcs r4, r5\n\t"
  82252. #else
  82253. "adc r4, r5\n\t"
  82254. #endif
  82255. "stm %[r]!, {r3, r4}\n\t"
  82256. "ldm %[b]!, {r3, r4}\n\t"
  82257. #ifdef WOLFSSL_KEIL
  82258. "adcs r3, r3, r5\n\t"
  82259. #elif defined(__clang__)
  82260. "adcs r3, r5\n\t"
  82261. #else
  82262. "adc r3, r5\n\t"
  82263. #endif
  82264. #ifdef WOLFSSL_KEIL
  82265. "adcs r4, r4, r5\n\t"
  82266. #elif defined(__clang__)
  82267. "adcs r4, r5\n\t"
  82268. #else
  82269. "adc r4, r5\n\t"
  82270. #endif
  82271. "stm %[r]!, {r3, r4}\n\t"
  82272. "ldm %[b]!, {r3, r4}\n\t"
  82273. #ifdef WOLFSSL_KEIL
  82274. "adcs r3, r3, r5\n\t"
  82275. #elif defined(__clang__)
  82276. "adcs r3, r5\n\t"
  82277. #else
  82278. "adc r3, r5\n\t"
  82279. #endif
  82280. #ifdef WOLFSSL_KEIL
  82281. "adcs r4, r4, r5\n\t"
  82282. #elif defined(__clang__)
  82283. "adcs r4, r5\n\t"
  82284. #else
  82285. "adc r4, r5\n\t"
  82286. #endif
  82287. "stm %[r]!, {r3, r4}\n\t"
  82288. "ldm %[b]!, {r3, r4}\n\t"
  82289. #ifdef WOLFSSL_KEIL
  82290. "adcs r3, r3, r5\n\t"
  82291. #elif defined(__clang__)
  82292. "adcs r3, r5\n\t"
  82293. #else
  82294. "adc r3, r5\n\t"
  82295. #endif
  82296. #ifdef WOLFSSL_KEIL
  82297. "adcs r4, r4, r5\n\t"
  82298. #elif defined(__clang__)
  82299. "adcs r4, r5\n\t"
  82300. #else
  82301. "adc r4, r5\n\t"
  82302. #endif
  82303. "stm %[r]!, {r3, r4}\n\t"
  82304. "ldm %[b]!, {r3, r4}\n\t"
  82305. #ifdef WOLFSSL_KEIL
  82306. "adcs r3, r3, r5\n\t"
  82307. #elif defined(__clang__)
  82308. "adcs r3, r5\n\t"
  82309. #else
  82310. "adc r3, r5\n\t"
  82311. #endif
  82312. #ifdef WOLFSSL_KEIL
  82313. "adcs r4, r4, r5\n\t"
  82314. #elif defined(__clang__)
  82315. "adcs r4, r5\n\t"
  82316. #else
  82317. "adc r4, r5\n\t"
  82318. #endif
  82319. "stm %[r]!, {r3, r4}\n\t"
  82320. "ldm %[b]!, {r3, r4}\n\t"
  82321. #ifdef WOLFSSL_KEIL
  82322. "adcs r3, r3, r5\n\t"
  82323. #elif defined(__clang__)
  82324. "adcs r3, r5\n\t"
  82325. #else
  82326. "adc r3, r5\n\t"
  82327. #endif
  82328. #ifdef WOLFSSL_KEIL
  82329. "adcs r4, r4, r5\n\t"
  82330. #elif defined(__clang__)
  82331. "adcs r4, r5\n\t"
  82332. #else
  82333. "adc r4, r5\n\t"
  82334. #endif
  82335. "stm %[r]!, {r3, r4}\n\t"
  82336. "ldm %[b]!, {r3, r4}\n\t"
  82337. #ifdef WOLFSSL_KEIL
  82338. "adcs r3, r3, r5\n\t"
  82339. #elif defined(__clang__)
  82340. "adcs r3, r5\n\t"
  82341. #else
  82342. "adc r3, r5\n\t"
  82343. #endif
  82344. #ifdef WOLFSSL_KEIL
  82345. "adcs r4, r4, r5\n\t"
  82346. #elif defined(__clang__)
  82347. "adcs r4, r5\n\t"
  82348. #else
  82349. "adc r4, r5\n\t"
  82350. #endif
  82351. "stm %[r]!, {r3, r4}\n\t"
  82352. "ldm %[b]!, {r3, r4}\n\t"
  82353. #ifdef WOLFSSL_KEIL
  82354. "adcs r3, r3, r5\n\t"
  82355. #elif defined(__clang__)
  82356. "adcs r3, r5\n\t"
  82357. #else
  82358. "adc r3, r5\n\t"
  82359. #endif
  82360. #ifdef WOLFSSL_KEIL
  82361. "adcs r4, r4, r5\n\t"
  82362. #elif defined(__clang__)
  82363. "adcs r4, r5\n\t"
  82364. #else
  82365. "adc r4, r5\n\t"
  82366. #endif
  82367. "stm %[r]!, {r3, r4}\n\t"
  82368. "ldm %[b]!, {r3, r4}\n\t"
  82369. #ifdef WOLFSSL_KEIL
  82370. "adcs r3, r3, r5\n\t"
  82371. #elif defined(__clang__)
  82372. "adcs r3, r5\n\t"
  82373. #else
  82374. "adc r3, r5\n\t"
  82375. #endif
  82376. #ifdef WOLFSSL_KEIL
  82377. "adcs r4, r4, r5\n\t"
  82378. #elif defined(__clang__)
  82379. "adcs r4, r5\n\t"
  82380. #else
  82381. "adc r4, r5\n\t"
  82382. #endif
  82383. "stm %[r]!, {r3, r4}\n\t"
  82384. "ldm %[b]!, {r3, r4}\n\t"
  82385. #ifdef WOLFSSL_KEIL
  82386. "adcs r3, r3, r5\n\t"
  82387. #elif defined(__clang__)
  82388. "adcs r3, r5\n\t"
  82389. #else
  82390. "adc r3, r5\n\t"
  82391. #endif
  82392. #ifdef WOLFSSL_KEIL
  82393. "adcs r4, r4, r5\n\t"
  82394. #elif defined(__clang__)
  82395. "adcs r4, r5\n\t"
  82396. #else
  82397. "adc r4, r5\n\t"
  82398. #endif
  82399. "stm %[r]!, {r3, r4}\n\t"
  82400. "ldm %[b]!, {r3, r4}\n\t"
  82401. #ifdef WOLFSSL_KEIL
  82402. "adcs r3, r3, r5\n\t"
  82403. #elif defined(__clang__)
  82404. "adcs r3, r5\n\t"
  82405. #else
  82406. "adc r3, r5\n\t"
  82407. #endif
  82408. #ifdef WOLFSSL_KEIL
  82409. "adcs r4, r4, r5\n\t"
  82410. #elif defined(__clang__)
  82411. "adcs r4, r5\n\t"
  82412. #else
  82413. "adc r4, r5\n\t"
  82414. #endif
  82415. "stm %[r]!, {r3, r4}\n\t"
  82416. "ldm %[b]!, {r3, r4}\n\t"
  82417. #ifdef WOLFSSL_KEIL
  82418. "adcs r3, r3, r5\n\t"
  82419. #elif defined(__clang__)
  82420. "adcs r3, r5\n\t"
  82421. #else
  82422. "adc r3, r5\n\t"
  82423. #endif
  82424. #ifdef WOLFSSL_KEIL
  82425. "adcs r4, r4, r5\n\t"
  82426. #elif defined(__clang__)
  82427. "adcs r4, r5\n\t"
  82428. #else
  82429. "adc r4, r5\n\t"
  82430. #endif
  82431. "stm %[r]!, {r3, r4}\n\t"
  82432. "ldm %[b]!, {r3, r4}\n\t"
  82433. #ifdef WOLFSSL_KEIL
  82434. "adcs r3, r3, r5\n\t"
  82435. #elif defined(__clang__)
  82436. "adcs r3, r5\n\t"
  82437. #else
  82438. "adc r3, r5\n\t"
  82439. #endif
  82440. #ifdef WOLFSSL_KEIL
  82441. "adcs r4, r4, r5\n\t"
  82442. #elif defined(__clang__)
  82443. "adcs r4, r5\n\t"
  82444. #else
  82445. "adc r4, r5\n\t"
  82446. #endif
  82447. "stm %[r]!, {r3, r4}\n\t"
  82448. "ldm %[b]!, {r3, r4}\n\t"
  82449. #ifdef WOLFSSL_KEIL
  82450. "adcs r3, r3, r5\n\t"
  82451. #elif defined(__clang__)
  82452. "adcs r3, r5\n\t"
  82453. #else
  82454. "adc r3, r5\n\t"
  82455. #endif
  82456. #ifdef WOLFSSL_KEIL
  82457. "adcs r4, r4, r5\n\t"
  82458. #elif defined(__clang__)
  82459. "adcs r4, r5\n\t"
  82460. #else
  82461. "adc r4, r5\n\t"
  82462. #endif
  82463. "stm %[r]!, {r3, r4}\n\t"
  82464. "ldm %[b]!, {r3, r4}\n\t"
  82465. #ifdef WOLFSSL_KEIL
  82466. "adcs r3, r3, r5\n\t"
  82467. #elif defined(__clang__)
  82468. "adcs r3, r5\n\t"
  82469. #else
  82470. "adc r3, r5\n\t"
  82471. #endif
  82472. #ifdef WOLFSSL_KEIL
  82473. "adcs r4, r4, r5\n\t"
  82474. #elif defined(__clang__)
  82475. "adcs r4, r5\n\t"
  82476. #else
  82477. "adc r4, r5\n\t"
  82478. #endif
  82479. "stm %[r]!, {r3, r4}\n\t"
  82480. "ldm %[b]!, {r3, r4}\n\t"
  82481. #ifdef WOLFSSL_KEIL
  82482. "adcs r3, r3, r5\n\t"
  82483. #elif defined(__clang__)
  82484. "adcs r3, r5\n\t"
  82485. #else
  82486. "adc r3, r5\n\t"
  82487. #endif
  82488. #ifdef WOLFSSL_KEIL
  82489. "adcs r4, r4, r5\n\t"
  82490. #elif defined(__clang__)
  82491. "adcs r4, r5\n\t"
  82492. #else
  82493. "adc r4, r5\n\t"
  82494. #endif
  82495. "stm %[r]!, {r3, r4}\n\t"
  82496. "ldm %[b]!, {r3, r4}\n\t"
  82497. #ifdef WOLFSSL_KEIL
  82498. "adcs r3, r3, r5\n\t"
  82499. #elif defined(__clang__)
  82500. "adcs r3, r5\n\t"
  82501. #else
  82502. "adc r3, r5\n\t"
  82503. #endif
  82504. #ifdef WOLFSSL_KEIL
  82505. "adcs r4, r4, r5\n\t"
  82506. #elif defined(__clang__)
  82507. "adcs r4, r5\n\t"
  82508. #else
  82509. "adc r4, r5\n\t"
  82510. #endif
  82511. "stm %[r]!, {r3, r4}\n\t"
  82512. "ldm %[b]!, {r3, r4}\n\t"
  82513. #ifdef WOLFSSL_KEIL
  82514. "adcs r3, r3, r5\n\t"
  82515. #elif defined(__clang__)
  82516. "adcs r3, r5\n\t"
  82517. #else
  82518. "adc r3, r5\n\t"
  82519. #endif
  82520. #ifdef WOLFSSL_KEIL
  82521. "adcs r4, r4, r5\n\t"
  82522. #elif defined(__clang__)
  82523. "adcs r4, r5\n\t"
  82524. #else
  82525. "adc r4, r5\n\t"
  82526. #endif
  82527. "stm %[r]!, {r3, r4}\n\t"
  82528. "ldm %[b]!, {r3, r4}\n\t"
  82529. #ifdef WOLFSSL_KEIL
  82530. "adcs r3, r3, r5\n\t"
  82531. #elif defined(__clang__)
  82532. "adcs r3, r5\n\t"
  82533. #else
  82534. "adc r3, r5\n\t"
  82535. #endif
  82536. #ifdef WOLFSSL_KEIL
  82537. "adcs r4, r4, r5\n\t"
  82538. #elif defined(__clang__)
  82539. "adcs r4, r5\n\t"
  82540. #else
  82541. "adc r4, r5\n\t"
  82542. #endif
  82543. "stm %[r]!, {r3, r4}\n\t"
  82544. "ldm %[b]!, {r3, r4}\n\t"
  82545. #ifdef WOLFSSL_KEIL
  82546. "adcs r3, r3, r5\n\t"
  82547. #elif defined(__clang__)
  82548. "adcs r3, r5\n\t"
  82549. #else
  82550. "adc r3, r5\n\t"
  82551. #endif
  82552. #ifdef WOLFSSL_KEIL
  82553. "adcs r4, r4, r5\n\t"
  82554. #elif defined(__clang__)
  82555. "adcs r4, r5\n\t"
  82556. #else
  82557. "adc r4, r5\n\t"
  82558. #endif
  82559. "stm %[r]!, {r3, r4}\n\t"
  82560. "ldm %[b]!, {r3, r4}\n\t"
  82561. #ifdef WOLFSSL_KEIL
  82562. "adcs r3, r3, r5\n\t"
  82563. #elif defined(__clang__)
  82564. "adcs r3, r5\n\t"
  82565. #else
  82566. "adc r3, r5\n\t"
  82567. #endif
  82568. #ifdef WOLFSSL_KEIL
  82569. "adcs r4, r4, r5\n\t"
  82570. #elif defined(__clang__)
  82571. "adcs r4, r5\n\t"
  82572. #else
  82573. "adc r4, r5\n\t"
  82574. #endif
  82575. "stm %[r]!, {r3, r4}\n\t"
  82576. "ldm %[b]!, {r3, r4}\n\t"
  82577. #ifdef WOLFSSL_KEIL
  82578. "adcs r3, r3, r5\n\t"
  82579. #elif defined(__clang__)
  82580. "adcs r3, r5\n\t"
  82581. #else
  82582. "adc r3, r5\n\t"
  82583. #endif
  82584. #ifdef WOLFSSL_KEIL
  82585. "adcs r4, r4, r5\n\t"
  82586. #elif defined(__clang__)
  82587. "adcs r4, r5\n\t"
  82588. #else
  82589. "adc r4, r5\n\t"
  82590. #endif
  82591. "stm %[r]!, {r3, r4}\n\t"
  82592. "ldm %[b]!, {r3, r4}\n\t"
  82593. #ifdef WOLFSSL_KEIL
  82594. "adcs r3, r3, r5\n\t"
  82595. #elif defined(__clang__)
  82596. "adcs r3, r5\n\t"
  82597. #else
  82598. "adc r3, r5\n\t"
  82599. #endif
  82600. #ifdef WOLFSSL_KEIL
  82601. "adcs r4, r4, r5\n\t"
  82602. #elif defined(__clang__)
  82603. "adcs r4, r5\n\t"
  82604. #else
  82605. "adc r4, r5\n\t"
  82606. #endif
  82607. "stm %[r]!, {r3, r4}\n\t"
  82608. "ldm %[b]!, {r3, r4}\n\t"
  82609. #ifdef WOLFSSL_KEIL
  82610. "adcs r3, r3, r5\n\t"
  82611. #elif defined(__clang__)
  82612. "adcs r3, r5\n\t"
  82613. #else
  82614. "adc r3, r5\n\t"
  82615. #endif
  82616. #ifdef WOLFSSL_KEIL
  82617. "adcs r4, r4, r5\n\t"
  82618. #elif defined(__clang__)
  82619. "adcs r4, r5\n\t"
  82620. #else
  82621. "adc r4, r5\n\t"
  82622. #endif
  82623. "stm %[r]!, {r3, r4}\n\t"
  82624. "ldm %[b]!, {r3, r4}\n\t"
  82625. #ifdef WOLFSSL_KEIL
  82626. "adcs r3, r3, r5\n\t"
  82627. #elif defined(__clang__)
  82628. "adcs r3, r5\n\t"
  82629. #else
  82630. "adc r3, r5\n\t"
  82631. #endif
  82632. #ifdef WOLFSSL_KEIL
  82633. "adcs r4, r4, r5\n\t"
  82634. #elif defined(__clang__)
  82635. "adcs r4, r5\n\t"
  82636. #else
  82637. "adc r4, r5\n\t"
  82638. #endif
  82639. "stm %[r]!, {r3, r4}\n\t"
  82640. "movs %[r], #0\n\t"
  82641. #ifdef WOLFSSL_KEIL
  82642. "adcs %[r], %[r], %[r]\n\t"
  82643. #elif defined(__clang__)
  82644. "adcs %[r], %[r]\n\t"
  82645. #else
  82646. "adc %[r], %[r]\n\t"
  82647. #endif
  82648. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  82649. :
  82650. : "memory", "r3", "r4", "r5"
  82651. );
  82652. return (uint32_t)(size_t)r;
  82653. }
  82654. /* Sub b from a into a. (a -= b)
  82655. *
  82656. * a A single precision integer.
  82657. * b A single precision integer.
  82658. */
  82659. SP_NOINLINE static sp_digit sp_4096_sub_in_place_128(sp_digit* a,
  82660. const sp_digit* b)
  82661. {
  82662. __asm__ __volatile__ (
  82663. "ldm %[b]!, {r4, r5}\n\t"
  82664. "ldr r2, [%[a]]\n\t"
  82665. "ldr r3, [%[a], #4]\n\t"
  82666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82667. "subs r2, r2, r4\n\t"
  82668. #else
  82669. "sub r2, r2, r4\n\t"
  82670. #endif
  82671. #ifdef WOLFSSL_KEIL
  82672. "sbcs r3, r3, r5\n\t"
  82673. #elif defined(__clang__)
  82674. "sbcs r3, r5\n\t"
  82675. #else
  82676. "sbc r3, r5\n\t"
  82677. #endif
  82678. "stm %[a]!, {r2, r3}\n\t"
  82679. "ldm %[b]!, {r4, r5}\n\t"
  82680. "ldr r2, [%[a]]\n\t"
  82681. "ldr r3, [%[a], #4]\n\t"
  82682. #ifdef WOLFSSL_KEIL
  82683. "sbcs r2, r2, r4\n\t"
  82684. #elif defined(__clang__)
  82685. "sbcs r2, r4\n\t"
  82686. #else
  82687. "sbc r2, r4\n\t"
  82688. #endif
  82689. #ifdef WOLFSSL_KEIL
  82690. "sbcs r3, r3, r5\n\t"
  82691. #elif defined(__clang__)
  82692. "sbcs r3, r5\n\t"
  82693. #else
  82694. "sbc r3, r5\n\t"
  82695. #endif
  82696. "stm %[a]!, {r2, r3}\n\t"
  82697. "ldm %[b]!, {r4, r5}\n\t"
  82698. "ldr r2, [%[a]]\n\t"
  82699. "ldr r3, [%[a], #4]\n\t"
  82700. #ifdef WOLFSSL_KEIL
  82701. "sbcs r2, r2, r4\n\t"
  82702. #elif defined(__clang__)
  82703. "sbcs r2, r4\n\t"
  82704. #else
  82705. "sbc r2, r4\n\t"
  82706. #endif
  82707. #ifdef WOLFSSL_KEIL
  82708. "sbcs r3, r3, r5\n\t"
  82709. #elif defined(__clang__)
  82710. "sbcs r3, r5\n\t"
  82711. #else
  82712. "sbc r3, r5\n\t"
  82713. #endif
  82714. "stm %[a]!, {r2, r3}\n\t"
  82715. "ldm %[b]!, {r4, r5}\n\t"
  82716. "ldr r2, [%[a]]\n\t"
  82717. "ldr r3, [%[a], #4]\n\t"
  82718. #ifdef WOLFSSL_KEIL
  82719. "sbcs r2, r2, r4\n\t"
  82720. #elif defined(__clang__)
  82721. "sbcs r2, r4\n\t"
  82722. #else
  82723. "sbc r2, r4\n\t"
  82724. #endif
  82725. #ifdef WOLFSSL_KEIL
  82726. "sbcs r3, r3, r5\n\t"
  82727. #elif defined(__clang__)
  82728. "sbcs r3, r5\n\t"
  82729. #else
  82730. "sbc r3, r5\n\t"
  82731. #endif
  82732. "stm %[a]!, {r2, r3}\n\t"
  82733. "ldm %[b]!, {r4, r5}\n\t"
  82734. "ldr r2, [%[a]]\n\t"
  82735. "ldr r3, [%[a], #4]\n\t"
  82736. #ifdef WOLFSSL_KEIL
  82737. "sbcs r2, r2, r4\n\t"
  82738. #elif defined(__clang__)
  82739. "sbcs r2, r4\n\t"
  82740. #else
  82741. "sbc r2, r4\n\t"
  82742. #endif
  82743. #ifdef WOLFSSL_KEIL
  82744. "sbcs r3, r3, r5\n\t"
  82745. #elif defined(__clang__)
  82746. "sbcs r3, r5\n\t"
  82747. #else
  82748. "sbc r3, r5\n\t"
  82749. #endif
  82750. "stm %[a]!, {r2, r3}\n\t"
  82751. "ldm %[b]!, {r4, r5}\n\t"
  82752. "ldr r2, [%[a]]\n\t"
  82753. "ldr r3, [%[a], #4]\n\t"
  82754. #ifdef WOLFSSL_KEIL
  82755. "sbcs r2, r2, r4\n\t"
  82756. #elif defined(__clang__)
  82757. "sbcs r2, r4\n\t"
  82758. #else
  82759. "sbc r2, r4\n\t"
  82760. #endif
  82761. #ifdef WOLFSSL_KEIL
  82762. "sbcs r3, r3, r5\n\t"
  82763. #elif defined(__clang__)
  82764. "sbcs r3, r5\n\t"
  82765. #else
  82766. "sbc r3, r5\n\t"
  82767. #endif
  82768. "stm %[a]!, {r2, r3}\n\t"
  82769. "ldm %[b]!, {r4, r5}\n\t"
  82770. "ldr r2, [%[a]]\n\t"
  82771. "ldr r3, [%[a], #4]\n\t"
  82772. #ifdef WOLFSSL_KEIL
  82773. "sbcs r2, r2, r4\n\t"
  82774. #elif defined(__clang__)
  82775. "sbcs r2, r4\n\t"
  82776. #else
  82777. "sbc r2, r4\n\t"
  82778. #endif
  82779. #ifdef WOLFSSL_KEIL
  82780. "sbcs r3, r3, r5\n\t"
  82781. #elif defined(__clang__)
  82782. "sbcs r3, r5\n\t"
  82783. #else
  82784. "sbc r3, r5\n\t"
  82785. #endif
  82786. "stm %[a]!, {r2, r3}\n\t"
  82787. "ldm %[b]!, {r4, r5}\n\t"
  82788. "ldr r2, [%[a]]\n\t"
  82789. "ldr r3, [%[a], #4]\n\t"
  82790. #ifdef WOLFSSL_KEIL
  82791. "sbcs r2, r2, r4\n\t"
  82792. #elif defined(__clang__)
  82793. "sbcs r2, r4\n\t"
  82794. #else
  82795. "sbc r2, r4\n\t"
  82796. #endif
  82797. #ifdef WOLFSSL_KEIL
  82798. "sbcs r3, r3, r5\n\t"
  82799. #elif defined(__clang__)
  82800. "sbcs r3, r5\n\t"
  82801. #else
  82802. "sbc r3, r5\n\t"
  82803. #endif
  82804. "stm %[a]!, {r2, r3}\n\t"
  82805. "ldm %[b]!, {r4, r5}\n\t"
  82806. "ldr r2, [%[a]]\n\t"
  82807. "ldr r3, [%[a], #4]\n\t"
  82808. #ifdef WOLFSSL_KEIL
  82809. "sbcs r2, r2, r4\n\t"
  82810. #elif defined(__clang__)
  82811. "sbcs r2, r4\n\t"
  82812. #else
  82813. "sbc r2, r4\n\t"
  82814. #endif
  82815. #ifdef WOLFSSL_KEIL
  82816. "sbcs r3, r3, r5\n\t"
  82817. #elif defined(__clang__)
  82818. "sbcs r3, r5\n\t"
  82819. #else
  82820. "sbc r3, r5\n\t"
  82821. #endif
  82822. "stm %[a]!, {r2, r3}\n\t"
  82823. "ldm %[b]!, {r4, r5}\n\t"
  82824. "ldr r2, [%[a]]\n\t"
  82825. "ldr r3, [%[a], #4]\n\t"
  82826. #ifdef WOLFSSL_KEIL
  82827. "sbcs r2, r2, r4\n\t"
  82828. #elif defined(__clang__)
  82829. "sbcs r2, r4\n\t"
  82830. #else
  82831. "sbc r2, r4\n\t"
  82832. #endif
  82833. #ifdef WOLFSSL_KEIL
  82834. "sbcs r3, r3, r5\n\t"
  82835. #elif defined(__clang__)
  82836. "sbcs r3, r5\n\t"
  82837. #else
  82838. "sbc r3, r5\n\t"
  82839. #endif
  82840. "stm %[a]!, {r2, r3}\n\t"
  82841. "ldm %[b]!, {r4, r5}\n\t"
  82842. "ldr r2, [%[a]]\n\t"
  82843. "ldr r3, [%[a], #4]\n\t"
  82844. #ifdef WOLFSSL_KEIL
  82845. "sbcs r2, r2, r4\n\t"
  82846. #elif defined(__clang__)
  82847. "sbcs r2, r4\n\t"
  82848. #else
  82849. "sbc r2, r4\n\t"
  82850. #endif
  82851. #ifdef WOLFSSL_KEIL
  82852. "sbcs r3, r3, r5\n\t"
  82853. #elif defined(__clang__)
  82854. "sbcs r3, r5\n\t"
  82855. #else
  82856. "sbc r3, r5\n\t"
  82857. #endif
  82858. "stm %[a]!, {r2, r3}\n\t"
  82859. "ldm %[b]!, {r4, r5}\n\t"
  82860. "ldr r2, [%[a]]\n\t"
  82861. "ldr r3, [%[a], #4]\n\t"
  82862. #ifdef WOLFSSL_KEIL
  82863. "sbcs r2, r2, r4\n\t"
  82864. #elif defined(__clang__)
  82865. "sbcs r2, r4\n\t"
  82866. #else
  82867. "sbc r2, r4\n\t"
  82868. #endif
  82869. #ifdef WOLFSSL_KEIL
  82870. "sbcs r3, r3, r5\n\t"
  82871. #elif defined(__clang__)
  82872. "sbcs r3, r5\n\t"
  82873. #else
  82874. "sbc r3, r5\n\t"
  82875. #endif
  82876. "stm %[a]!, {r2, r3}\n\t"
  82877. "ldm %[b]!, {r4, r5}\n\t"
  82878. "ldr r2, [%[a]]\n\t"
  82879. "ldr r3, [%[a], #4]\n\t"
  82880. #ifdef WOLFSSL_KEIL
  82881. "sbcs r2, r2, r4\n\t"
  82882. #elif defined(__clang__)
  82883. "sbcs r2, r4\n\t"
  82884. #else
  82885. "sbc r2, r4\n\t"
  82886. #endif
  82887. #ifdef WOLFSSL_KEIL
  82888. "sbcs r3, r3, r5\n\t"
  82889. #elif defined(__clang__)
  82890. "sbcs r3, r5\n\t"
  82891. #else
  82892. "sbc r3, r5\n\t"
  82893. #endif
  82894. "stm %[a]!, {r2, r3}\n\t"
  82895. "ldm %[b]!, {r4, r5}\n\t"
  82896. "ldr r2, [%[a]]\n\t"
  82897. "ldr r3, [%[a], #4]\n\t"
  82898. #ifdef WOLFSSL_KEIL
  82899. "sbcs r2, r2, r4\n\t"
  82900. #elif defined(__clang__)
  82901. "sbcs r2, r4\n\t"
  82902. #else
  82903. "sbc r2, r4\n\t"
  82904. #endif
  82905. #ifdef WOLFSSL_KEIL
  82906. "sbcs r3, r3, r5\n\t"
  82907. #elif defined(__clang__)
  82908. "sbcs r3, r5\n\t"
  82909. #else
  82910. "sbc r3, r5\n\t"
  82911. #endif
  82912. "stm %[a]!, {r2, r3}\n\t"
  82913. "ldm %[b]!, {r4, r5}\n\t"
  82914. "ldr r2, [%[a]]\n\t"
  82915. "ldr r3, [%[a], #4]\n\t"
  82916. #ifdef WOLFSSL_KEIL
  82917. "sbcs r2, r2, r4\n\t"
  82918. #elif defined(__clang__)
  82919. "sbcs r2, r4\n\t"
  82920. #else
  82921. "sbc r2, r4\n\t"
  82922. #endif
  82923. #ifdef WOLFSSL_KEIL
  82924. "sbcs r3, r3, r5\n\t"
  82925. #elif defined(__clang__)
  82926. "sbcs r3, r5\n\t"
  82927. #else
  82928. "sbc r3, r5\n\t"
  82929. #endif
  82930. "stm %[a]!, {r2, r3}\n\t"
  82931. "ldm %[b]!, {r4, r5}\n\t"
  82932. "ldr r2, [%[a]]\n\t"
  82933. "ldr r3, [%[a], #4]\n\t"
  82934. #ifdef WOLFSSL_KEIL
  82935. "sbcs r2, r2, r4\n\t"
  82936. #elif defined(__clang__)
  82937. "sbcs r2, r4\n\t"
  82938. #else
  82939. "sbc r2, r4\n\t"
  82940. #endif
  82941. #ifdef WOLFSSL_KEIL
  82942. "sbcs r3, r3, r5\n\t"
  82943. #elif defined(__clang__)
  82944. "sbcs r3, r5\n\t"
  82945. #else
  82946. "sbc r3, r5\n\t"
  82947. #endif
  82948. "stm %[a]!, {r2, r3}\n\t"
  82949. "ldm %[b]!, {r4, r5}\n\t"
  82950. "ldr r2, [%[a]]\n\t"
  82951. "ldr r3, [%[a], #4]\n\t"
  82952. #ifdef WOLFSSL_KEIL
  82953. "sbcs r2, r2, r4\n\t"
  82954. #elif defined(__clang__)
  82955. "sbcs r2, r4\n\t"
  82956. #else
  82957. "sbc r2, r4\n\t"
  82958. #endif
  82959. #ifdef WOLFSSL_KEIL
  82960. "sbcs r3, r3, r5\n\t"
  82961. #elif defined(__clang__)
  82962. "sbcs r3, r5\n\t"
  82963. #else
  82964. "sbc r3, r5\n\t"
  82965. #endif
  82966. "stm %[a]!, {r2, r3}\n\t"
  82967. "ldm %[b]!, {r4, r5}\n\t"
  82968. "ldr r2, [%[a]]\n\t"
  82969. "ldr r3, [%[a], #4]\n\t"
  82970. #ifdef WOLFSSL_KEIL
  82971. "sbcs r2, r2, r4\n\t"
  82972. #elif defined(__clang__)
  82973. "sbcs r2, r4\n\t"
  82974. #else
  82975. "sbc r2, r4\n\t"
  82976. #endif
  82977. #ifdef WOLFSSL_KEIL
  82978. "sbcs r3, r3, r5\n\t"
  82979. #elif defined(__clang__)
  82980. "sbcs r3, r5\n\t"
  82981. #else
  82982. "sbc r3, r5\n\t"
  82983. #endif
  82984. "stm %[a]!, {r2, r3}\n\t"
  82985. "ldm %[b]!, {r4, r5}\n\t"
  82986. "ldr r2, [%[a]]\n\t"
  82987. "ldr r3, [%[a], #4]\n\t"
  82988. #ifdef WOLFSSL_KEIL
  82989. "sbcs r2, r2, r4\n\t"
  82990. #elif defined(__clang__)
  82991. "sbcs r2, r4\n\t"
  82992. #else
  82993. "sbc r2, r4\n\t"
  82994. #endif
  82995. #ifdef WOLFSSL_KEIL
  82996. "sbcs r3, r3, r5\n\t"
  82997. #elif defined(__clang__)
  82998. "sbcs r3, r5\n\t"
  82999. #else
  83000. "sbc r3, r5\n\t"
  83001. #endif
  83002. "stm %[a]!, {r2, r3}\n\t"
  83003. "ldm %[b]!, {r4, r5}\n\t"
  83004. "ldr r2, [%[a]]\n\t"
  83005. "ldr r3, [%[a], #4]\n\t"
  83006. #ifdef WOLFSSL_KEIL
  83007. "sbcs r2, r2, r4\n\t"
  83008. #elif defined(__clang__)
  83009. "sbcs r2, r4\n\t"
  83010. #else
  83011. "sbc r2, r4\n\t"
  83012. #endif
  83013. #ifdef WOLFSSL_KEIL
  83014. "sbcs r3, r3, r5\n\t"
  83015. #elif defined(__clang__)
  83016. "sbcs r3, r5\n\t"
  83017. #else
  83018. "sbc r3, r5\n\t"
  83019. #endif
  83020. "stm %[a]!, {r2, r3}\n\t"
  83021. "ldm %[b]!, {r4, r5}\n\t"
  83022. "ldr r2, [%[a]]\n\t"
  83023. "ldr r3, [%[a], #4]\n\t"
  83024. #ifdef WOLFSSL_KEIL
  83025. "sbcs r2, r2, r4\n\t"
  83026. #elif defined(__clang__)
  83027. "sbcs r2, r4\n\t"
  83028. #else
  83029. "sbc r2, r4\n\t"
  83030. #endif
  83031. #ifdef WOLFSSL_KEIL
  83032. "sbcs r3, r3, r5\n\t"
  83033. #elif defined(__clang__)
  83034. "sbcs r3, r5\n\t"
  83035. #else
  83036. "sbc r3, r5\n\t"
  83037. #endif
  83038. "stm %[a]!, {r2, r3}\n\t"
  83039. "ldm %[b]!, {r4, r5}\n\t"
  83040. "ldr r2, [%[a]]\n\t"
  83041. "ldr r3, [%[a], #4]\n\t"
  83042. #ifdef WOLFSSL_KEIL
  83043. "sbcs r2, r2, r4\n\t"
  83044. #elif defined(__clang__)
  83045. "sbcs r2, r4\n\t"
  83046. #else
  83047. "sbc r2, r4\n\t"
  83048. #endif
  83049. #ifdef WOLFSSL_KEIL
  83050. "sbcs r3, r3, r5\n\t"
  83051. #elif defined(__clang__)
  83052. "sbcs r3, r5\n\t"
  83053. #else
  83054. "sbc r3, r5\n\t"
  83055. #endif
  83056. "stm %[a]!, {r2, r3}\n\t"
  83057. "ldm %[b]!, {r4, r5}\n\t"
  83058. "ldr r2, [%[a]]\n\t"
  83059. "ldr r3, [%[a], #4]\n\t"
  83060. #ifdef WOLFSSL_KEIL
  83061. "sbcs r2, r2, r4\n\t"
  83062. #elif defined(__clang__)
  83063. "sbcs r2, r4\n\t"
  83064. #else
  83065. "sbc r2, r4\n\t"
  83066. #endif
  83067. #ifdef WOLFSSL_KEIL
  83068. "sbcs r3, r3, r5\n\t"
  83069. #elif defined(__clang__)
  83070. "sbcs r3, r5\n\t"
  83071. #else
  83072. "sbc r3, r5\n\t"
  83073. #endif
  83074. "stm %[a]!, {r2, r3}\n\t"
  83075. "ldm %[b]!, {r4, r5}\n\t"
  83076. "ldr r2, [%[a]]\n\t"
  83077. "ldr r3, [%[a], #4]\n\t"
  83078. #ifdef WOLFSSL_KEIL
  83079. "sbcs r2, r2, r4\n\t"
  83080. #elif defined(__clang__)
  83081. "sbcs r2, r4\n\t"
  83082. #else
  83083. "sbc r2, r4\n\t"
  83084. #endif
  83085. #ifdef WOLFSSL_KEIL
  83086. "sbcs r3, r3, r5\n\t"
  83087. #elif defined(__clang__)
  83088. "sbcs r3, r5\n\t"
  83089. #else
  83090. "sbc r3, r5\n\t"
  83091. #endif
  83092. "stm %[a]!, {r2, r3}\n\t"
  83093. "ldm %[b]!, {r4, r5}\n\t"
  83094. "ldr r2, [%[a]]\n\t"
  83095. "ldr r3, [%[a], #4]\n\t"
  83096. #ifdef WOLFSSL_KEIL
  83097. "sbcs r2, r2, r4\n\t"
  83098. #elif defined(__clang__)
  83099. "sbcs r2, r4\n\t"
  83100. #else
  83101. "sbc r2, r4\n\t"
  83102. #endif
  83103. #ifdef WOLFSSL_KEIL
  83104. "sbcs r3, r3, r5\n\t"
  83105. #elif defined(__clang__)
  83106. "sbcs r3, r5\n\t"
  83107. #else
  83108. "sbc r3, r5\n\t"
  83109. #endif
  83110. "stm %[a]!, {r2, r3}\n\t"
  83111. "ldm %[b]!, {r4, r5}\n\t"
  83112. "ldr r2, [%[a]]\n\t"
  83113. "ldr r3, [%[a], #4]\n\t"
  83114. #ifdef WOLFSSL_KEIL
  83115. "sbcs r2, r2, r4\n\t"
  83116. #elif defined(__clang__)
  83117. "sbcs r2, r4\n\t"
  83118. #else
  83119. "sbc r2, r4\n\t"
  83120. #endif
  83121. #ifdef WOLFSSL_KEIL
  83122. "sbcs r3, r3, r5\n\t"
  83123. #elif defined(__clang__)
  83124. "sbcs r3, r5\n\t"
  83125. #else
  83126. "sbc r3, r5\n\t"
  83127. #endif
  83128. "stm %[a]!, {r2, r3}\n\t"
  83129. "ldm %[b]!, {r4, r5}\n\t"
  83130. "ldr r2, [%[a]]\n\t"
  83131. "ldr r3, [%[a], #4]\n\t"
  83132. #ifdef WOLFSSL_KEIL
  83133. "sbcs r2, r2, r4\n\t"
  83134. #elif defined(__clang__)
  83135. "sbcs r2, r4\n\t"
  83136. #else
  83137. "sbc r2, r4\n\t"
  83138. #endif
  83139. #ifdef WOLFSSL_KEIL
  83140. "sbcs r3, r3, r5\n\t"
  83141. #elif defined(__clang__)
  83142. "sbcs r3, r5\n\t"
  83143. #else
  83144. "sbc r3, r5\n\t"
  83145. #endif
  83146. "stm %[a]!, {r2, r3}\n\t"
  83147. "ldm %[b]!, {r4, r5}\n\t"
  83148. "ldr r2, [%[a]]\n\t"
  83149. "ldr r3, [%[a], #4]\n\t"
  83150. #ifdef WOLFSSL_KEIL
  83151. "sbcs r2, r2, r4\n\t"
  83152. #elif defined(__clang__)
  83153. "sbcs r2, r4\n\t"
  83154. #else
  83155. "sbc r2, r4\n\t"
  83156. #endif
  83157. #ifdef WOLFSSL_KEIL
  83158. "sbcs r3, r3, r5\n\t"
  83159. #elif defined(__clang__)
  83160. "sbcs r3, r5\n\t"
  83161. #else
  83162. "sbc r3, r5\n\t"
  83163. #endif
  83164. "stm %[a]!, {r2, r3}\n\t"
  83165. "ldm %[b]!, {r4, r5}\n\t"
  83166. "ldr r2, [%[a]]\n\t"
  83167. "ldr r3, [%[a], #4]\n\t"
  83168. #ifdef WOLFSSL_KEIL
  83169. "sbcs r2, r2, r4\n\t"
  83170. #elif defined(__clang__)
  83171. "sbcs r2, r4\n\t"
  83172. #else
  83173. "sbc r2, r4\n\t"
  83174. #endif
  83175. #ifdef WOLFSSL_KEIL
  83176. "sbcs r3, r3, r5\n\t"
  83177. #elif defined(__clang__)
  83178. "sbcs r3, r5\n\t"
  83179. #else
  83180. "sbc r3, r5\n\t"
  83181. #endif
  83182. "stm %[a]!, {r2, r3}\n\t"
  83183. "ldm %[b]!, {r4, r5}\n\t"
  83184. "ldr r2, [%[a]]\n\t"
  83185. "ldr r3, [%[a], #4]\n\t"
  83186. #ifdef WOLFSSL_KEIL
  83187. "sbcs r2, r2, r4\n\t"
  83188. #elif defined(__clang__)
  83189. "sbcs r2, r4\n\t"
  83190. #else
  83191. "sbc r2, r4\n\t"
  83192. #endif
  83193. #ifdef WOLFSSL_KEIL
  83194. "sbcs r3, r3, r5\n\t"
  83195. #elif defined(__clang__)
  83196. "sbcs r3, r5\n\t"
  83197. #else
  83198. "sbc r3, r5\n\t"
  83199. #endif
  83200. "stm %[a]!, {r2, r3}\n\t"
  83201. "ldm %[b]!, {r4, r5}\n\t"
  83202. "ldr r2, [%[a]]\n\t"
  83203. "ldr r3, [%[a], #4]\n\t"
  83204. #ifdef WOLFSSL_KEIL
  83205. "sbcs r2, r2, r4\n\t"
  83206. #elif defined(__clang__)
  83207. "sbcs r2, r4\n\t"
  83208. #else
  83209. "sbc r2, r4\n\t"
  83210. #endif
  83211. #ifdef WOLFSSL_KEIL
  83212. "sbcs r3, r3, r5\n\t"
  83213. #elif defined(__clang__)
  83214. "sbcs r3, r5\n\t"
  83215. #else
  83216. "sbc r3, r5\n\t"
  83217. #endif
  83218. "stm %[a]!, {r2, r3}\n\t"
  83219. "ldm %[b]!, {r4, r5}\n\t"
  83220. "ldr r2, [%[a]]\n\t"
  83221. "ldr r3, [%[a], #4]\n\t"
  83222. #ifdef WOLFSSL_KEIL
  83223. "sbcs r2, r2, r4\n\t"
  83224. #elif defined(__clang__)
  83225. "sbcs r2, r4\n\t"
  83226. #else
  83227. "sbc r2, r4\n\t"
  83228. #endif
  83229. #ifdef WOLFSSL_KEIL
  83230. "sbcs r3, r3, r5\n\t"
  83231. #elif defined(__clang__)
  83232. "sbcs r3, r5\n\t"
  83233. #else
  83234. "sbc r3, r5\n\t"
  83235. #endif
  83236. "stm %[a]!, {r2, r3}\n\t"
  83237. "ldm %[b]!, {r4, r5}\n\t"
  83238. "ldr r2, [%[a]]\n\t"
  83239. "ldr r3, [%[a], #4]\n\t"
  83240. #ifdef WOLFSSL_KEIL
  83241. "sbcs r2, r2, r4\n\t"
  83242. #elif defined(__clang__)
  83243. "sbcs r2, r4\n\t"
  83244. #else
  83245. "sbc r2, r4\n\t"
  83246. #endif
  83247. #ifdef WOLFSSL_KEIL
  83248. "sbcs r3, r3, r5\n\t"
  83249. #elif defined(__clang__)
  83250. "sbcs r3, r5\n\t"
  83251. #else
  83252. "sbc r3, r5\n\t"
  83253. #endif
  83254. "stm %[a]!, {r2, r3}\n\t"
  83255. "ldm %[b]!, {r4, r5}\n\t"
  83256. "ldr r2, [%[a]]\n\t"
  83257. "ldr r3, [%[a], #4]\n\t"
  83258. #ifdef WOLFSSL_KEIL
  83259. "sbcs r2, r2, r4\n\t"
  83260. #elif defined(__clang__)
  83261. "sbcs r2, r4\n\t"
  83262. #else
  83263. "sbc r2, r4\n\t"
  83264. #endif
  83265. #ifdef WOLFSSL_KEIL
  83266. "sbcs r3, r3, r5\n\t"
  83267. #elif defined(__clang__)
  83268. "sbcs r3, r5\n\t"
  83269. #else
  83270. "sbc r3, r5\n\t"
  83271. #endif
  83272. "stm %[a]!, {r2, r3}\n\t"
  83273. "ldm %[b]!, {r4, r5}\n\t"
  83274. "ldr r2, [%[a]]\n\t"
  83275. "ldr r3, [%[a], #4]\n\t"
  83276. #ifdef WOLFSSL_KEIL
  83277. "sbcs r2, r2, r4\n\t"
  83278. #elif defined(__clang__)
  83279. "sbcs r2, r4\n\t"
  83280. #else
  83281. "sbc r2, r4\n\t"
  83282. #endif
  83283. #ifdef WOLFSSL_KEIL
  83284. "sbcs r3, r3, r5\n\t"
  83285. #elif defined(__clang__)
  83286. "sbcs r3, r5\n\t"
  83287. #else
  83288. "sbc r3, r5\n\t"
  83289. #endif
  83290. "stm %[a]!, {r2, r3}\n\t"
  83291. "ldm %[b]!, {r4, r5}\n\t"
  83292. "ldr r2, [%[a]]\n\t"
  83293. "ldr r3, [%[a], #4]\n\t"
  83294. #ifdef WOLFSSL_KEIL
  83295. "sbcs r2, r2, r4\n\t"
  83296. #elif defined(__clang__)
  83297. "sbcs r2, r4\n\t"
  83298. #else
  83299. "sbc r2, r4\n\t"
  83300. #endif
  83301. #ifdef WOLFSSL_KEIL
  83302. "sbcs r3, r3, r5\n\t"
  83303. #elif defined(__clang__)
  83304. "sbcs r3, r5\n\t"
  83305. #else
  83306. "sbc r3, r5\n\t"
  83307. #endif
  83308. "stm %[a]!, {r2, r3}\n\t"
  83309. "ldm %[b]!, {r4, r5}\n\t"
  83310. "ldr r2, [%[a]]\n\t"
  83311. "ldr r3, [%[a], #4]\n\t"
  83312. #ifdef WOLFSSL_KEIL
  83313. "sbcs r2, r2, r4\n\t"
  83314. #elif defined(__clang__)
  83315. "sbcs r2, r4\n\t"
  83316. #else
  83317. "sbc r2, r4\n\t"
  83318. #endif
  83319. #ifdef WOLFSSL_KEIL
  83320. "sbcs r3, r3, r5\n\t"
  83321. #elif defined(__clang__)
  83322. "sbcs r3, r5\n\t"
  83323. #else
  83324. "sbc r3, r5\n\t"
  83325. #endif
  83326. "stm %[a]!, {r2, r3}\n\t"
  83327. "ldm %[b]!, {r4, r5}\n\t"
  83328. "ldr r2, [%[a]]\n\t"
  83329. "ldr r3, [%[a], #4]\n\t"
  83330. #ifdef WOLFSSL_KEIL
  83331. "sbcs r2, r2, r4\n\t"
  83332. #elif defined(__clang__)
  83333. "sbcs r2, r4\n\t"
  83334. #else
  83335. "sbc r2, r4\n\t"
  83336. #endif
  83337. #ifdef WOLFSSL_KEIL
  83338. "sbcs r3, r3, r5\n\t"
  83339. #elif defined(__clang__)
  83340. "sbcs r3, r5\n\t"
  83341. #else
  83342. "sbc r3, r5\n\t"
  83343. #endif
  83344. "stm %[a]!, {r2, r3}\n\t"
  83345. "ldm %[b]!, {r4, r5}\n\t"
  83346. "ldr r2, [%[a]]\n\t"
  83347. "ldr r3, [%[a], #4]\n\t"
  83348. #ifdef WOLFSSL_KEIL
  83349. "sbcs r2, r2, r4\n\t"
  83350. #elif defined(__clang__)
  83351. "sbcs r2, r4\n\t"
  83352. #else
  83353. "sbc r2, r4\n\t"
  83354. #endif
  83355. #ifdef WOLFSSL_KEIL
  83356. "sbcs r3, r3, r5\n\t"
  83357. #elif defined(__clang__)
  83358. "sbcs r3, r5\n\t"
  83359. #else
  83360. "sbc r3, r5\n\t"
  83361. #endif
  83362. "stm %[a]!, {r2, r3}\n\t"
  83363. "ldm %[b]!, {r4, r5}\n\t"
  83364. "ldr r2, [%[a]]\n\t"
  83365. "ldr r3, [%[a], #4]\n\t"
  83366. #ifdef WOLFSSL_KEIL
  83367. "sbcs r2, r2, r4\n\t"
  83368. #elif defined(__clang__)
  83369. "sbcs r2, r4\n\t"
  83370. #else
  83371. "sbc r2, r4\n\t"
  83372. #endif
  83373. #ifdef WOLFSSL_KEIL
  83374. "sbcs r3, r3, r5\n\t"
  83375. #elif defined(__clang__)
  83376. "sbcs r3, r5\n\t"
  83377. #else
  83378. "sbc r3, r5\n\t"
  83379. #endif
  83380. "stm %[a]!, {r2, r3}\n\t"
  83381. "ldm %[b]!, {r4, r5}\n\t"
  83382. "ldr r2, [%[a]]\n\t"
  83383. "ldr r3, [%[a], #4]\n\t"
  83384. #ifdef WOLFSSL_KEIL
  83385. "sbcs r2, r2, r4\n\t"
  83386. #elif defined(__clang__)
  83387. "sbcs r2, r4\n\t"
  83388. #else
  83389. "sbc r2, r4\n\t"
  83390. #endif
  83391. #ifdef WOLFSSL_KEIL
  83392. "sbcs r3, r3, r5\n\t"
  83393. #elif defined(__clang__)
  83394. "sbcs r3, r5\n\t"
  83395. #else
  83396. "sbc r3, r5\n\t"
  83397. #endif
  83398. "stm %[a]!, {r2, r3}\n\t"
  83399. "ldm %[b]!, {r4, r5}\n\t"
  83400. "ldr r2, [%[a]]\n\t"
  83401. "ldr r3, [%[a], #4]\n\t"
  83402. #ifdef WOLFSSL_KEIL
  83403. "sbcs r2, r2, r4\n\t"
  83404. #elif defined(__clang__)
  83405. "sbcs r2, r4\n\t"
  83406. #else
  83407. "sbc r2, r4\n\t"
  83408. #endif
  83409. #ifdef WOLFSSL_KEIL
  83410. "sbcs r3, r3, r5\n\t"
  83411. #elif defined(__clang__)
  83412. "sbcs r3, r5\n\t"
  83413. #else
  83414. "sbc r3, r5\n\t"
  83415. #endif
  83416. "stm %[a]!, {r2, r3}\n\t"
  83417. "ldm %[b]!, {r4, r5}\n\t"
  83418. "ldr r2, [%[a]]\n\t"
  83419. "ldr r3, [%[a], #4]\n\t"
  83420. #ifdef WOLFSSL_KEIL
  83421. "sbcs r2, r2, r4\n\t"
  83422. #elif defined(__clang__)
  83423. "sbcs r2, r4\n\t"
  83424. #else
  83425. "sbc r2, r4\n\t"
  83426. #endif
  83427. #ifdef WOLFSSL_KEIL
  83428. "sbcs r3, r3, r5\n\t"
  83429. #elif defined(__clang__)
  83430. "sbcs r3, r5\n\t"
  83431. #else
  83432. "sbc r3, r5\n\t"
  83433. #endif
  83434. "stm %[a]!, {r2, r3}\n\t"
  83435. "ldm %[b]!, {r4, r5}\n\t"
  83436. "ldr r2, [%[a]]\n\t"
  83437. "ldr r3, [%[a], #4]\n\t"
  83438. #ifdef WOLFSSL_KEIL
  83439. "sbcs r2, r2, r4\n\t"
  83440. #elif defined(__clang__)
  83441. "sbcs r2, r4\n\t"
  83442. #else
  83443. "sbc r2, r4\n\t"
  83444. #endif
  83445. #ifdef WOLFSSL_KEIL
  83446. "sbcs r3, r3, r5\n\t"
  83447. #elif defined(__clang__)
  83448. "sbcs r3, r5\n\t"
  83449. #else
  83450. "sbc r3, r5\n\t"
  83451. #endif
  83452. "stm %[a]!, {r2, r3}\n\t"
  83453. "ldm %[b]!, {r4, r5}\n\t"
  83454. "ldr r2, [%[a]]\n\t"
  83455. "ldr r3, [%[a], #4]\n\t"
  83456. #ifdef WOLFSSL_KEIL
  83457. "sbcs r2, r2, r4\n\t"
  83458. #elif defined(__clang__)
  83459. "sbcs r2, r4\n\t"
  83460. #else
  83461. "sbc r2, r4\n\t"
  83462. #endif
  83463. #ifdef WOLFSSL_KEIL
  83464. "sbcs r3, r3, r5\n\t"
  83465. #elif defined(__clang__)
  83466. "sbcs r3, r5\n\t"
  83467. #else
  83468. "sbc r3, r5\n\t"
  83469. #endif
  83470. "stm %[a]!, {r2, r3}\n\t"
  83471. "ldm %[b]!, {r4, r5}\n\t"
  83472. "ldr r2, [%[a]]\n\t"
  83473. "ldr r3, [%[a], #4]\n\t"
  83474. #ifdef WOLFSSL_KEIL
  83475. "sbcs r2, r2, r4\n\t"
  83476. #elif defined(__clang__)
  83477. "sbcs r2, r4\n\t"
  83478. #else
  83479. "sbc r2, r4\n\t"
  83480. #endif
  83481. #ifdef WOLFSSL_KEIL
  83482. "sbcs r3, r3, r5\n\t"
  83483. #elif defined(__clang__)
  83484. "sbcs r3, r5\n\t"
  83485. #else
  83486. "sbc r3, r5\n\t"
  83487. #endif
  83488. "stm %[a]!, {r2, r3}\n\t"
  83489. "ldm %[b]!, {r4, r5}\n\t"
  83490. "ldr r2, [%[a]]\n\t"
  83491. "ldr r3, [%[a], #4]\n\t"
  83492. #ifdef WOLFSSL_KEIL
  83493. "sbcs r2, r2, r4\n\t"
  83494. #elif defined(__clang__)
  83495. "sbcs r2, r4\n\t"
  83496. #else
  83497. "sbc r2, r4\n\t"
  83498. #endif
  83499. #ifdef WOLFSSL_KEIL
  83500. "sbcs r3, r3, r5\n\t"
  83501. #elif defined(__clang__)
  83502. "sbcs r3, r5\n\t"
  83503. #else
  83504. "sbc r3, r5\n\t"
  83505. #endif
  83506. "stm %[a]!, {r2, r3}\n\t"
  83507. "ldm %[b]!, {r4, r5}\n\t"
  83508. "ldr r2, [%[a]]\n\t"
  83509. "ldr r3, [%[a], #4]\n\t"
  83510. #ifdef WOLFSSL_KEIL
  83511. "sbcs r2, r2, r4\n\t"
  83512. #elif defined(__clang__)
  83513. "sbcs r2, r4\n\t"
  83514. #else
  83515. "sbc r2, r4\n\t"
  83516. #endif
  83517. #ifdef WOLFSSL_KEIL
  83518. "sbcs r3, r3, r5\n\t"
  83519. #elif defined(__clang__)
  83520. "sbcs r3, r5\n\t"
  83521. #else
  83522. "sbc r3, r5\n\t"
  83523. #endif
  83524. "stm %[a]!, {r2, r3}\n\t"
  83525. "ldm %[b]!, {r4, r5}\n\t"
  83526. "ldr r2, [%[a]]\n\t"
  83527. "ldr r3, [%[a], #4]\n\t"
  83528. #ifdef WOLFSSL_KEIL
  83529. "sbcs r2, r2, r4\n\t"
  83530. #elif defined(__clang__)
  83531. "sbcs r2, r4\n\t"
  83532. #else
  83533. "sbc r2, r4\n\t"
  83534. #endif
  83535. #ifdef WOLFSSL_KEIL
  83536. "sbcs r3, r3, r5\n\t"
  83537. #elif defined(__clang__)
  83538. "sbcs r3, r5\n\t"
  83539. #else
  83540. "sbc r3, r5\n\t"
  83541. #endif
  83542. "stm %[a]!, {r2, r3}\n\t"
  83543. "ldm %[b]!, {r4, r5}\n\t"
  83544. "ldr r2, [%[a]]\n\t"
  83545. "ldr r3, [%[a], #4]\n\t"
  83546. #ifdef WOLFSSL_KEIL
  83547. "sbcs r2, r2, r4\n\t"
  83548. #elif defined(__clang__)
  83549. "sbcs r2, r4\n\t"
  83550. #else
  83551. "sbc r2, r4\n\t"
  83552. #endif
  83553. #ifdef WOLFSSL_KEIL
  83554. "sbcs r3, r3, r5\n\t"
  83555. #elif defined(__clang__)
  83556. "sbcs r3, r5\n\t"
  83557. #else
  83558. "sbc r3, r5\n\t"
  83559. #endif
  83560. "stm %[a]!, {r2, r3}\n\t"
  83561. "ldm %[b]!, {r4, r5}\n\t"
  83562. "ldr r2, [%[a]]\n\t"
  83563. "ldr r3, [%[a], #4]\n\t"
  83564. #ifdef WOLFSSL_KEIL
  83565. "sbcs r2, r2, r4\n\t"
  83566. #elif defined(__clang__)
  83567. "sbcs r2, r4\n\t"
  83568. #else
  83569. "sbc r2, r4\n\t"
  83570. #endif
  83571. #ifdef WOLFSSL_KEIL
  83572. "sbcs r3, r3, r5\n\t"
  83573. #elif defined(__clang__)
  83574. "sbcs r3, r5\n\t"
  83575. #else
  83576. "sbc r3, r5\n\t"
  83577. #endif
  83578. "stm %[a]!, {r2, r3}\n\t"
  83579. "ldm %[b]!, {r4, r5}\n\t"
  83580. "ldr r2, [%[a]]\n\t"
  83581. "ldr r3, [%[a], #4]\n\t"
  83582. #ifdef WOLFSSL_KEIL
  83583. "sbcs r2, r2, r4\n\t"
  83584. #elif defined(__clang__)
  83585. "sbcs r2, r4\n\t"
  83586. #else
  83587. "sbc r2, r4\n\t"
  83588. #endif
  83589. #ifdef WOLFSSL_KEIL
  83590. "sbcs r3, r3, r5\n\t"
  83591. #elif defined(__clang__)
  83592. "sbcs r3, r5\n\t"
  83593. #else
  83594. "sbc r3, r5\n\t"
  83595. #endif
  83596. "stm %[a]!, {r2, r3}\n\t"
  83597. "ldm %[b]!, {r4, r5}\n\t"
  83598. "ldr r2, [%[a]]\n\t"
  83599. "ldr r3, [%[a], #4]\n\t"
  83600. #ifdef WOLFSSL_KEIL
  83601. "sbcs r2, r2, r4\n\t"
  83602. #elif defined(__clang__)
  83603. "sbcs r2, r4\n\t"
  83604. #else
  83605. "sbc r2, r4\n\t"
  83606. #endif
  83607. #ifdef WOLFSSL_KEIL
  83608. "sbcs r3, r3, r5\n\t"
  83609. #elif defined(__clang__)
  83610. "sbcs r3, r5\n\t"
  83611. #else
  83612. "sbc r3, r5\n\t"
  83613. #endif
  83614. "stm %[a]!, {r2, r3}\n\t"
  83615. "ldm %[b]!, {r4, r5}\n\t"
  83616. "ldr r2, [%[a]]\n\t"
  83617. "ldr r3, [%[a], #4]\n\t"
  83618. #ifdef WOLFSSL_KEIL
  83619. "sbcs r2, r2, r4\n\t"
  83620. #elif defined(__clang__)
  83621. "sbcs r2, r4\n\t"
  83622. #else
  83623. "sbc r2, r4\n\t"
  83624. #endif
  83625. #ifdef WOLFSSL_KEIL
  83626. "sbcs r3, r3, r5\n\t"
  83627. #elif defined(__clang__)
  83628. "sbcs r3, r5\n\t"
  83629. #else
  83630. "sbc r3, r5\n\t"
  83631. #endif
  83632. "stm %[a]!, {r2, r3}\n\t"
  83633. "ldm %[b]!, {r4, r5}\n\t"
  83634. "ldr r2, [%[a]]\n\t"
  83635. "ldr r3, [%[a], #4]\n\t"
  83636. #ifdef WOLFSSL_KEIL
  83637. "sbcs r2, r2, r4\n\t"
  83638. #elif defined(__clang__)
  83639. "sbcs r2, r4\n\t"
  83640. #else
  83641. "sbc r2, r4\n\t"
  83642. #endif
  83643. #ifdef WOLFSSL_KEIL
  83644. "sbcs r3, r3, r5\n\t"
  83645. #elif defined(__clang__)
  83646. "sbcs r3, r5\n\t"
  83647. #else
  83648. "sbc r3, r5\n\t"
  83649. #endif
  83650. "stm %[a]!, {r2, r3}\n\t"
  83651. "ldm %[b]!, {r4, r5}\n\t"
  83652. "ldr r2, [%[a]]\n\t"
  83653. "ldr r3, [%[a], #4]\n\t"
  83654. #ifdef WOLFSSL_KEIL
  83655. "sbcs r2, r2, r4\n\t"
  83656. #elif defined(__clang__)
  83657. "sbcs r2, r4\n\t"
  83658. #else
  83659. "sbc r2, r4\n\t"
  83660. #endif
  83661. #ifdef WOLFSSL_KEIL
  83662. "sbcs r3, r3, r5\n\t"
  83663. #elif defined(__clang__)
  83664. "sbcs r3, r5\n\t"
  83665. #else
  83666. "sbc r3, r5\n\t"
  83667. #endif
  83668. "stm %[a]!, {r2, r3}\n\t"
  83669. "ldm %[b]!, {r4, r5}\n\t"
  83670. "ldr r2, [%[a]]\n\t"
  83671. "ldr r3, [%[a], #4]\n\t"
  83672. #ifdef WOLFSSL_KEIL
  83673. "sbcs r2, r2, r4\n\t"
  83674. #elif defined(__clang__)
  83675. "sbcs r2, r4\n\t"
  83676. #else
  83677. "sbc r2, r4\n\t"
  83678. #endif
  83679. #ifdef WOLFSSL_KEIL
  83680. "sbcs r3, r3, r5\n\t"
  83681. #elif defined(__clang__)
  83682. "sbcs r3, r5\n\t"
  83683. #else
  83684. "sbc r3, r5\n\t"
  83685. #endif
  83686. "stm %[a]!, {r2, r3}\n\t"
  83687. "ldm %[b]!, {r4, r5}\n\t"
  83688. "ldr r2, [%[a]]\n\t"
  83689. "ldr r3, [%[a], #4]\n\t"
  83690. #ifdef WOLFSSL_KEIL
  83691. "sbcs r2, r2, r4\n\t"
  83692. #elif defined(__clang__)
  83693. "sbcs r2, r4\n\t"
  83694. #else
  83695. "sbc r2, r4\n\t"
  83696. #endif
  83697. #ifdef WOLFSSL_KEIL
  83698. "sbcs r3, r3, r5\n\t"
  83699. #elif defined(__clang__)
  83700. "sbcs r3, r5\n\t"
  83701. #else
  83702. "sbc r3, r5\n\t"
  83703. #endif
  83704. "stm %[a]!, {r2, r3}\n\t"
  83705. "ldm %[b]!, {r4, r5}\n\t"
  83706. "ldr r2, [%[a]]\n\t"
  83707. "ldr r3, [%[a], #4]\n\t"
  83708. #ifdef WOLFSSL_KEIL
  83709. "sbcs r2, r2, r4\n\t"
  83710. #elif defined(__clang__)
  83711. "sbcs r2, r4\n\t"
  83712. #else
  83713. "sbc r2, r4\n\t"
  83714. #endif
  83715. #ifdef WOLFSSL_KEIL
  83716. "sbcs r3, r3, r5\n\t"
  83717. #elif defined(__clang__)
  83718. "sbcs r3, r5\n\t"
  83719. #else
  83720. "sbc r3, r5\n\t"
  83721. #endif
  83722. "stm %[a]!, {r2, r3}\n\t"
  83723. "ldm %[b]!, {r4, r5}\n\t"
  83724. "ldr r2, [%[a]]\n\t"
  83725. "ldr r3, [%[a], #4]\n\t"
  83726. #ifdef WOLFSSL_KEIL
  83727. "sbcs r2, r2, r4\n\t"
  83728. #elif defined(__clang__)
  83729. "sbcs r2, r4\n\t"
  83730. #else
  83731. "sbc r2, r4\n\t"
  83732. #endif
  83733. #ifdef WOLFSSL_KEIL
  83734. "sbcs r3, r3, r5\n\t"
  83735. #elif defined(__clang__)
  83736. "sbcs r3, r5\n\t"
  83737. #else
  83738. "sbc r3, r5\n\t"
  83739. #endif
  83740. "stm %[a]!, {r2, r3}\n\t"
  83741. "ldm %[b]!, {r4, r5}\n\t"
  83742. "ldr r2, [%[a]]\n\t"
  83743. "ldr r3, [%[a], #4]\n\t"
  83744. #ifdef WOLFSSL_KEIL
  83745. "sbcs r2, r2, r4\n\t"
  83746. #elif defined(__clang__)
  83747. "sbcs r2, r4\n\t"
  83748. #else
  83749. "sbc r2, r4\n\t"
  83750. #endif
  83751. #ifdef WOLFSSL_KEIL
  83752. "sbcs r3, r3, r5\n\t"
  83753. #elif defined(__clang__)
  83754. "sbcs r3, r5\n\t"
  83755. #else
  83756. "sbc r3, r5\n\t"
  83757. #endif
  83758. "stm %[a]!, {r2, r3}\n\t"
  83759. "ldm %[b]!, {r4, r5}\n\t"
  83760. "ldr r2, [%[a]]\n\t"
  83761. "ldr r3, [%[a], #4]\n\t"
  83762. #ifdef WOLFSSL_KEIL
  83763. "sbcs r2, r2, r4\n\t"
  83764. #elif defined(__clang__)
  83765. "sbcs r2, r4\n\t"
  83766. #else
  83767. "sbc r2, r4\n\t"
  83768. #endif
  83769. #ifdef WOLFSSL_KEIL
  83770. "sbcs r3, r3, r5\n\t"
  83771. #elif defined(__clang__)
  83772. "sbcs r3, r5\n\t"
  83773. #else
  83774. "sbc r3, r5\n\t"
  83775. #endif
  83776. "stm %[a]!, {r2, r3}\n\t"
  83777. "ldm %[b]!, {r4, r5}\n\t"
  83778. "ldr r2, [%[a]]\n\t"
  83779. "ldr r3, [%[a], #4]\n\t"
  83780. #ifdef WOLFSSL_KEIL
  83781. "sbcs r2, r2, r4\n\t"
  83782. #elif defined(__clang__)
  83783. "sbcs r2, r4\n\t"
  83784. #else
  83785. "sbc r2, r4\n\t"
  83786. #endif
  83787. #ifdef WOLFSSL_KEIL
  83788. "sbcs r3, r3, r5\n\t"
  83789. #elif defined(__clang__)
  83790. "sbcs r3, r5\n\t"
  83791. #else
  83792. "sbc r3, r5\n\t"
  83793. #endif
  83794. "stm %[a]!, {r2, r3}\n\t"
  83795. "ldm %[b]!, {r4, r5}\n\t"
  83796. "ldr r2, [%[a]]\n\t"
  83797. "ldr r3, [%[a], #4]\n\t"
  83798. #ifdef WOLFSSL_KEIL
  83799. "sbcs r2, r2, r4\n\t"
  83800. #elif defined(__clang__)
  83801. "sbcs r2, r4\n\t"
  83802. #else
  83803. "sbc r2, r4\n\t"
  83804. #endif
  83805. #ifdef WOLFSSL_KEIL
  83806. "sbcs r3, r3, r5\n\t"
  83807. #elif defined(__clang__)
  83808. "sbcs r3, r5\n\t"
  83809. #else
  83810. "sbc r3, r5\n\t"
  83811. #endif
  83812. "stm %[a]!, {r2, r3}\n\t"
  83813. #ifdef WOLFSSL_KEIL
  83814. "sbcs %[a], %[a], %[a]\n\t"
  83815. #elif defined(__clang__)
  83816. "sbcs %[a], %[a]\n\t"
  83817. #else
  83818. "sbc %[a], %[a]\n\t"
  83819. #endif
  83820. : [a] "+r" (a), [b] "+r" (b)
  83821. :
  83822. : "memory", "r2", "r3", "r4", "r5"
  83823. );
  83824. return (uint32_t)(size_t)a;
  83825. }
  83826. /* Add b to a into r. (r = a + b)
  83827. *
  83828. * r A single precision integer.
  83829. * a A single precision integer.
  83830. * b A single precision integer.
  83831. */
  83832. SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a,
  83833. const sp_digit* b)
  83834. {
  83835. __asm__ __volatile__ (
  83836. "ldm %[b]!, {r5, r6}\n\t"
  83837. "ldm %[a]!, {r3, r4}\n\t"
  83838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  83839. "adds r3, r3, r5\n\t"
  83840. #else
  83841. "add r3, r3, r5\n\t"
  83842. #endif
  83843. #ifdef WOLFSSL_KEIL
  83844. "adcs r4, r4, r6\n\t"
  83845. #elif defined(__clang__)
  83846. "adcs r4, r6\n\t"
  83847. #else
  83848. "adc r4, r6\n\t"
  83849. #endif
  83850. "stm %[r]!, {r3, r4}\n\t"
  83851. "ldm %[b]!, {r5, r6}\n\t"
  83852. "ldm %[a]!, {r3, r4}\n\t"
  83853. #ifdef WOLFSSL_KEIL
  83854. "adcs r3, r3, r5\n\t"
  83855. #elif defined(__clang__)
  83856. "adcs r3, r5\n\t"
  83857. #else
  83858. "adc r3, r5\n\t"
  83859. #endif
  83860. #ifdef WOLFSSL_KEIL
  83861. "adcs r4, r4, r6\n\t"
  83862. #elif defined(__clang__)
  83863. "adcs r4, r6\n\t"
  83864. #else
  83865. "adc r4, r6\n\t"
  83866. #endif
  83867. "stm %[r]!, {r3, r4}\n\t"
  83868. "ldm %[b]!, {r5, r6}\n\t"
  83869. "ldm %[a]!, {r3, r4}\n\t"
  83870. #ifdef WOLFSSL_KEIL
  83871. "adcs r3, r3, r5\n\t"
  83872. #elif defined(__clang__)
  83873. "adcs r3, r5\n\t"
  83874. #else
  83875. "adc r3, r5\n\t"
  83876. #endif
  83877. #ifdef WOLFSSL_KEIL
  83878. "adcs r4, r4, r6\n\t"
  83879. #elif defined(__clang__)
  83880. "adcs r4, r6\n\t"
  83881. #else
  83882. "adc r4, r6\n\t"
  83883. #endif
  83884. "stm %[r]!, {r3, r4}\n\t"
  83885. "ldm %[b]!, {r5, r6}\n\t"
  83886. "ldm %[a]!, {r3, r4}\n\t"
  83887. #ifdef WOLFSSL_KEIL
  83888. "adcs r3, r3, r5\n\t"
  83889. #elif defined(__clang__)
  83890. "adcs r3, r5\n\t"
  83891. #else
  83892. "adc r3, r5\n\t"
  83893. #endif
  83894. #ifdef WOLFSSL_KEIL
  83895. "adcs r4, r4, r6\n\t"
  83896. #elif defined(__clang__)
  83897. "adcs r4, r6\n\t"
  83898. #else
  83899. "adc r4, r6\n\t"
  83900. #endif
  83901. "stm %[r]!, {r3, r4}\n\t"
  83902. "ldm %[b]!, {r5, r6}\n\t"
  83903. "ldm %[a]!, {r3, r4}\n\t"
  83904. #ifdef WOLFSSL_KEIL
  83905. "adcs r3, r3, r5\n\t"
  83906. #elif defined(__clang__)
  83907. "adcs r3, r5\n\t"
  83908. #else
  83909. "adc r3, r5\n\t"
  83910. #endif
  83911. #ifdef WOLFSSL_KEIL
  83912. "adcs r4, r4, r6\n\t"
  83913. #elif defined(__clang__)
  83914. "adcs r4, r6\n\t"
  83915. #else
  83916. "adc r4, r6\n\t"
  83917. #endif
  83918. "stm %[r]!, {r3, r4}\n\t"
  83919. "ldm %[b]!, {r5, r6}\n\t"
  83920. "ldm %[a]!, {r3, r4}\n\t"
  83921. #ifdef WOLFSSL_KEIL
  83922. "adcs r3, r3, r5\n\t"
  83923. #elif defined(__clang__)
  83924. "adcs r3, r5\n\t"
  83925. #else
  83926. "adc r3, r5\n\t"
  83927. #endif
  83928. #ifdef WOLFSSL_KEIL
  83929. "adcs r4, r4, r6\n\t"
  83930. #elif defined(__clang__)
  83931. "adcs r4, r6\n\t"
  83932. #else
  83933. "adc r4, r6\n\t"
  83934. #endif
  83935. "stm %[r]!, {r3, r4}\n\t"
  83936. "ldm %[b]!, {r5, r6}\n\t"
  83937. "ldm %[a]!, {r3, r4}\n\t"
  83938. #ifdef WOLFSSL_KEIL
  83939. "adcs r3, r3, r5\n\t"
  83940. #elif defined(__clang__)
  83941. "adcs r3, r5\n\t"
  83942. #else
  83943. "adc r3, r5\n\t"
  83944. #endif
  83945. #ifdef WOLFSSL_KEIL
  83946. "adcs r4, r4, r6\n\t"
  83947. #elif defined(__clang__)
  83948. "adcs r4, r6\n\t"
  83949. #else
  83950. "adc r4, r6\n\t"
  83951. #endif
  83952. "stm %[r]!, {r3, r4}\n\t"
  83953. "ldm %[b]!, {r5, r6}\n\t"
  83954. "ldm %[a]!, {r3, r4}\n\t"
  83955. #ifdef WOLFSSL_KEIL
  83956. "adcs r3, r3, r5\n\t"
  83957. #elif defined(__clang__)
  83958. "adcs r3, r5\n\t"
  83959. #else
  83960. "adc r3, r5\n\t"
  83961. #endif
  83962. #ifdef WOLFSSL_KEIL
  83963. "adcs r4, r4, r6\n\t"
  83964. #elif defined(__clang__)
  83965. "adcs r4, r6\n\t"
  83966. #else
  83967. "adc r4, r6\n\t"
  83968. #endif
  83969. "stm %[r]!, {r3, r4}\n\t"
  83970. "ldm %[b]!, {r5, r6}\n\t"
  83971. "ldm %[a]!, {r3, r4}\n\t"
  83972. #ifdef WOLFSSL_KEIL
  83973. "adcs r3, r3, r5\n\t"
  83974. #elif defined(__clang__)
  83975. "adcs r3, r5\n\t"
  83976. #else
  83977. "adc r3, r5\n\t"
  83978. #endif
  83979. #ifdef WOLFSSL_KEIL
  83980. "adcs r4, r4, r6\n\t"
  83981. #elif defined(__clang__)
  83982. "adcs r4, r6\n\t"
  83983. #else
  83984. "adc r4, r6\n\t"
  83985. #endif
  83986. "stm %[r]!, {r3, r4}\n\t"
  83987. "ldm %[b]!, {r5, r6}\n\t"
  83988. "ldm %[a]!, {r3, r4}\n\t"
  83989. #ifdef WOLFSSL_KEIL
  83990. "adcs r3, r3, r5\n\t"
  83991. #elif defined(__clang__)
  83992. "adcs r3, r5\n\t"
  83993. #else
  83994. "adc r3, r5\n\t"
  83995. #endif
  83996. #ifdef WOLFSSL_KEIL
  83997. "adcs r4, r4, r6\n\t"
  83998. #elif defined(__clang__)
  83999. "adcs r4, r6\n\t"
  84000. #else
  84001. "adc r4, r6\n\t"
  84002. #endif
  84003. "stm %[r]!, {r3, r4}\n\t"
  84004. "ldm %[b]!, {r5, r6}\n\t"
  84005. "ldm %[a]!, {r3, r4}\n\t"
  84006. #ifdef WOLFSSL_KEIL
  84007. "adcs r3, r3, r5\n\t"
  84008. #elif defined(__clang__)
  84009. "adcs r3, r5\n\t"
  84010. #else
  84011. "adc r3, r5\n\t"
  84012. #endif
  84013. #ifdef WOLFSSL_KEIL
  84014. "adcs r4, r4, r6\n\t"
  84015. #elif defined(__clang__)
  84016. "adcs r4, r6\n\t"
  84017. #else
  84018. "adc r4, r6\n\t"
  84019. #endif
  84020. "stm %[r]!, {r3, r4}\n\t"
  84021. "ldm %[b]!, {r5, r6}\n\t"
  84022. "ldm %[a]!, {r3, r4}\n\t"
  84023. #ifdef WOLFSSL_KEIL
  84024. "adcs r3, r3, r5\n\t"
  84025. #elif defined(__clang__)
  84026. "adcs r3, r5\n\t"
  84027. #else
  84028. "adc r3, r5\n\t"
  84029. #endif
  84030. #ifdef WOLFSSL_KEIL
  84031. "adcs r4, r4, r6\n\t"
  84032. #elif defined(__clang__)
  84033. "adcs r4, r6\n\t"
  84034. #else
  84035. "adc r4, r6\n\t"
  84036. #endif
  84037. "stm %[r]!, {r3, r4}\n\t"
  84038. "ldm %[b]!, {r5, r6}\n\t"
  84039. "ldm %[a]!, {r3, r4}\n\t"
  84040. #ifdef WOLFSSL_KEIL
  84041. "adcs r3, r3, r5\n\t"
  84042. #elif defined(__clang__)
  84043. "adcs r3, r5\n\t"
  84044. #else
  84045. "adc r3, r5\n\t"
  84046. #endif
  84047. #ifdef WOLFSSL_KEIL
  84048. "adcs r4, r4, r6\n\t"
  84049. #elif defined(__clang__)
  84050. "adcs r4, r6\n\t"
  84051. #else
  84052. "adc r4, r6\n\t"
  84053. #endif
  84054. "stm %[r]!, {r3, r4}\n\t"
  84055. "ldm %[b]!, {r5, r6}\n\t"
  84056. "ldm %[a]!, {r3, r4}\n\t"
  84057. #ifdef WOLFSSL_KEIL
  84058. "adcs r3, r3, r5\n\t"
  84059. #elif defined(__clang__)
  84060. "adcs r3, r5\n\t"
  84061. #else
  84062. "adc r3, r5\n\t"
  84063. #endif
  84064. #ifdef WOLFSSL_KEIL
  84065. "adcs r4, r4, r6\n\t"
  84066. #elif defined(__clang__)
  84067. "adcs r4, r6\n\t"
  84068. #else
  84069. "adc r4, r6\n\t"
  84070. #endif
  84071. "stm %[r]!, {r3, r4}\n\t"
  84072. "ldm %[b]!, {r5, r6}\n\t"
  84073. "ldm %[a]!, {r3, r4}\n\t"
  84074. #ifdef WOLFSSL_KEIL
  84075. "adcs r3, r3, r5\n\t"
  84076. #elif defined(__clang__)
  84077. "adcs r3, r5\n\t"
  84078. #else
  84079. "adc r3, r5\n\t"
  84080. #endif
  84081. #ifdef WOLFSSL_KEIL
  84082. "adcs r4, r4, r6\n\t"
  84083. #elif defined(__clang__)
  84084. "adcs r4, r6\n\t"
  84085. #else
  84086. "adc r4, r6\n\t"
  84087. #endif
  84088. "stm %[r]!, {r3, r4}\n\t"
  84089. "ldm %[b]!, {r5, r6}\n\t"
  84090. "ldm %[a]!, {r3, r4}\n\t"
  84091. #ifdef WOLFSSL_KEIL
  84092. "adcs r3, r3, r5\n\t"
  84093. #elif defined(__clang__)
  84094. "adcs r3, r5\n\t"
  84095. #else
  84096. "adc r3, r5\n\t"
  84097. #endif
  84098. #ifdef WOLFSSL_KEIL
  84099. "adcs r4, r4, r6\n\t"
  84100. #elif defined(__clang__)
  84101. "adcs r4, r6\n\t"
  84102. #else
  84103. "adc r4, r6\n\t"
  84104. #endif
  84105. "stm %[r]!, {r3, r4}\n\t"
  84106. "ldm %[b]!, {r5, r6}\n\t"
  84107. "ldm %[a]!, {r3, r4}\n\t"
  84108. #ifdef WOLFSSL_KEIL
  84109. "adcs r3, r3, r5\n\t"
  84110. #elif defined(__clang__)
  84111. "adcs r3, r5\n\t"
  84112. #else
  84113. "adc r3, r5\n\t"
  84114. #endif
  84115. #ifdef WOLFSSL_KEIL
  84116. "adcs r4, r4, r6\n\t"
  84117. #elif defined(__clang__)
  84118. "adcs r4, r6\n\t"
  84119. #else
  84120. "adc r4, r6\n\t"
  84121. #endif
  84122. "stm %[r]!, {r3, r4}\n\t"
  84123. "ldm %[b]!, {r5, r6}\n\t"
  84124. "ldm %[a]!, {r3, r4}\n\t"
  84125. #ifdef WOLFSSL_KEIL
  84126. "adcs r3, r3, r5\n\t"
  84127. #elif defined(__clang__)
  84128. "adcs r3, r5\n\t"
  84129. #else
  84130. "adc r3, r5\n\t"
  84131. #endif
  84132. #ifdef WOLFSSL_KEIL
  84133. "adcs r4, r4, r6\n\t"
  84134. #elif defined(__clang__)
  84135. "adcs r4, r6\n\t"
  84136. #else
  84137. "adc r4, r6\n\t"
  84138. #endif
  84139. "stm %[r]!, {r3, r4}\n\t"
  84140. "ldm %[b]!, {r5, r6}\n\t"
  84141. "ldm %[a]!, {r3, r4}\n\t"
  84142. #ifdef WOLFSSL_KEIL
  84143. "adcs r3, r3, r5\n\t"
  84144. #elif defined(__clang__)
  84145. "adcs r3, r5\n\t"
  84146. #else
  84147. "adc r3, r5\n\t"
  84148. #endif
  84149. #ifdef WOLFSSL_KEIL
  84150. "adcs r4, r4, r6\n\t"
  84151. #elif defined(__clang__)
  84152. "adcs r4, r6\n\t"
  84153. #else
  84154. "adc r4, r6\n\t"
  84155. #endif
  84156. "stm %[r]!, {r3, r4}\n\t"
  84157. "ldm %[b]!, {r5, r6}\n\t"
  84158. "ldm %[a]!, {r3, r4}\n\t"
  84159. #ifdef WOLFSSL_KEIL
  84160. "adcs r3, r3, r5\n\t"
  84161. #elif defined(__clang__)
  84162. "adcs r3, r5\n\t"
  84163. #else
  84164. "adc r3, r5\n\t"
  84165. #endif
  84166. #ifdef WOLFSSL_KEIL
  84167. "adcs r4, r4, r6\n\t"
  84168. #elif defined(__clang__)
  84169. "adcs r4, r6\n\t"
  84170. #else
  84171. "adc r4, r6\n\t"
  84172. #endif
  84173. "stm %[r]!, {r3, r4}\n\t"
  84174. "ldm %[b]!, {r5, r6}\n\t"
  84175. "ldm %[a]!, {r3, r4}\n\t"
  84176. #ifdef WOLFSSL_KEIL
  84177. "adcs r3, r3, r5\n\t"
  84178. #elif defined(__clang__)
  84179. "adcs r3, r5\n\t"
  84180. #else
  84181. "adc r3, r5\n\t"
  84182. #endif
  84183. #ifdef WOLFSSL_KEIL
  84184. "adcs r4, r4, r6\n\t"
  84185. #elif defined(__clang__)
  84186. "adcs r4, r6\n\t"
  84187. #else
  84188. "adc r4, r6\n\t"
  84189. #endif
  84190. "stm %[r]!, {r3, r4}\n\t"
  84191. "ldm %[b]!, {r5, r6}\n\t"
  84192. "ldm %[a]!, {r3, r4}\n\t"
  84193. #ifdef WOLFSSL_KEIL
  84194. "adcs r3, r3, r5\n\t"
  84195. #elif defined(__clang__)
  84196. "adcs r3, r5\n\t"
  84197. #else
  84198. "adc r3, r5\n\t"
  84199. #endif
  84200. #ifdef WOLFSSL_KEIL
  84201. "adcs r4, r4, r6\n\t"
  84202. #elif defined(__clang__)
  84203. "adcs r4, r6\n\t"
  84204. #else
  84205. "adc r4, r6\n\t"
  84206. #endif
  84207. "stm %[r]!, {r3, r4}\n\t"
  84208. "ldm %[b]!, {r5, r6}\n\t"
  84209. "ldm %[a]!, {r3, r4}\n\t"
  84210. #ifdef WOLFSSL_KEIL
  84211. "adcs r3, r3, r5\n\t"
  84212. #elif defined(__clang__)
  84213. "adcs r3, r5\n\t"
  84214. #else
  84215. "adc r3, r5\n\t"
  84216. #endif
  84217. #ifdef WOLFSSL_KEIL
  84218. "adcs r4, r4, r6\n\t"
  84219. #elif defined(__clang__)
  84220. "adcs r4, r6\n\t"
  84221. #else
  84222. "adc r4, r6\n\t"
  84223. #endif
  84224. "stm %[r]!, {r3, r4}\n\t"
  84225. "ldm %[b]!, {r5, r6}\n\t"
  84226. "ldm %[a]!, {r3, r4}\n\t"
  84227. #ifdef WOLFSSL_KEIL
  84228. "adcs r3, r3, r5\n\t"
  84229. #elif defined(__clang__)
  84230. "adcs r3, r5\n\t"
  84231. #else
  84232. "adc r3, r5\n\t"
  84233. #endif
  84234. #ifdef WOLFSSL_KEIL
  84235. "adcs r4, r4, r6\n\t"
  84236. #elif defined(__clang__)
  84237. "adcs r4, r6\n\t"
  84238. #else
  84239. "adc r4, r6\n\t"
  84240. #endif
  84241. "stm %[r]!, {r3, r4}\n\t"
  84242. "ldm %[b]!, {r5, r6}\n\t"
  84243. "ldm %[a]!, {r3, r4}\n\t"
  84244. #ifdef WOLFSSL_KEIL
  84245. "adcs r3, r3, r5\n\t"
  84246. #elif defined(__clang__)
  84247. "adcs r3, r5\n\t"
  84248. #else
  84249. "adc r3, r5\n\t"
  84250. #endif
  84251. #ifdef WOLFSSL_KEIL
  84252. "adcs r4, r4, r6\n\t"
  84253. #elif defined(__clang__)
  84254. "adcs r4, r6\n\t"
  84255. #else
  84256. "adc r4, r6\n\t"
  84257. #endif
  84258. "stm %[r]!, {r3, r4}\n\t"
  84259. "ldm %[b]!, {r5, r6}\n\t"
  84260. "ldm %[a]!, {r3, r4}\n\t"
  84261. #ifdef WOLFSSL_KEIL
  84262. "adcs r3, r3, r5\n\t"
  84263. #elif defined(__clang__)
  84264. "adcs r3, r5\n\t"
  84265. #else
  84266. "adc r3, r5\n\t"
  84267. #endif
  84268. #ifdef WOLFSSL_KEIL
  84269. "adcs r4, r4, r6\n\t"
  84270. #elif defined(__clang__)
  84271. "adcs r4, r6\n\t"
  84272. #else
  84273. "adc r4, r6\n\t"
  84274. #endif
  84275. "stm %[r]!, {r3, r4}\n\t"
  84276. "ldm %[b]!, {r5, r6}\n\t"
  84277. "ldm %[a]!, {r3, r4}\n\t"
  84278. #ifdef WOLFSSL_KEIL
  84279. "adcs r3, r3, r5\n\t"
  84280. #elif defined(__clang__)
  84281. "adcs r3, r5\n\t"
  84282. #else
  84283. "adc r3, r5\n\t"
  84284. #endif
  84285. #ifdef WOLFSSL_KEIL
  84286. "adcs r4, r4, r6\n\t"
  84287. #elif defined(__clang__)
  84288. "adcs r4, r6\n\t"
  84289. #else
  84290. "adc r4, r6\n\t"
  84291. #endif
  84292. "stm %[r]!, {r3, r4}\n\t"
  84293. "ldm %[b]!, {r5, r6}\n\t"
  84294. "ldm %[a]!, {r3, r4}\n\t"
  84295. #ifdef WOLFSSL_KEIL
  84296. "adcs r3, r3, r5\n\t"
  84297. #elif defined(__clang__)
  84298. "adcs r3, r5\n\t"
  84299. #else
  84300. "adc r3, r5\n\t"
  84301. #endif
  84302. #ifdef WOLFSSL_KEIL
  84303. "adcs r4, r4, r6\n\t"
  84304. #elif defined(__clang__)
  84305. "adcs r4, r6\n\t"
  84306. #else
  84307. "adc r4, r6\n\t"
  84308. #endif
  84309. "stm %[r]!, {r3, r4}\n\t"
  84310. "ldm %[b]!, {r5, r6}\n\t"
  84311. "ldm %[a]!, {r3, r4}\n\t"
  84312. #ifdef WOLFSSL_KEIL
  84313. "adcs r3, r3, r5\n\t"
  84314. #elif defined(__clang__)
  84315. "adcs r3, r5\n\t"
  84316. #else
  84317. "adc r3, r5\n\t"
  84318. #endif
  84319. #ifdef WOLFSSL_KEIL
  84320. "adcs r4, r4, r6\n\t"
  84321. #elif defined(__clang__)
  84322. "adcs r4, r6\n\t"
  84323. #else
  84324. "adc r4, r6\n\t"
  84325. #endif
  84326. "stm %[r]!, {r3, r4}\n\t"
  84327. "ldm %[b]!, {r5, r6}\n\t"
  84328. "ldm %[a]!, {r3, r4}\n\t"
  84329. #ifdef WOLFSSL_KEIL
  84330. "adcs r3, r3, r5\n\t"
  84331. #elif defined(__clang__)
  84332. "adcs r3, r5\n\t"
  84333. #else
  84334. "adc r3, r5\n\t"
  84335. #endif
  84336. #ifdef WOLFSSL_KEIL
  84337. "adcs r4, r4, r6\n\t"
  84338. #elif defined(__clang__)
  84339. "adcs r4, r6\n\t"
  84340. #else
  84341. "adc r4, r6\n\t"
  84342. #endif
  84343. "stm %[r]!, {r3, r4}\n\t"
  84344. "ldm %[b]!, {r5, r6}\n\t"
  84345. "ldm %[a]!, {r3, r4}\n\t"
  84346. #ifdef WOLFSSL_KEIL
  84347. "adcs r3, r3, r5\n\t"
  84348. #elif defined(__clang__)
  84349. "adcs r3, r5\n\t"
  84350. #else
  84351. "adc r3, r5\n\t"
  84352. #endif
  84353. #ifdef WOLFSSL_KEIL
  84354. "adcs r4, r4, r6\n\t"
  84355. #elif defined(__clang__)
  84356. "adcs r4, r6\n\t"
  84357. #else
  84358. "adc r4, r6\n\t"
  84359. #endif
  84360. "stm %[r]!, {r3, r4}\n\t"
  84361. "ldm %[b]!, {r5, r6}\n\t"
  84362. "ldm %[a]!, {r3, r4}\n\t"
  84363. #ifdef WOLFSSL_KEIL
  84364. "adcs r3, r3, r5\n\t"
  84365. #elif defined(__clang__)
  84366. "adcs r3, r5\n\t"
  84367. #else
  84368. "adc r3, r5\n\t"
  84369. #endif
  84370. #ifdef WOLFSSL_KEIL
  84371. "adcs r4, r4, r6\n\t"
  84372. #elif defined(__clang__)
  84373. "adcs r4, r6\n\t"
  84374. #else
  84375. "adc r4, r6\n\t"
  84376. #endif
  84377. "stm %[r]!, {r3, r4}\n\t"
  84378. "ldm %[b]!, {r5, r6}\n\t"
  84379. "ldm %[a]!, {r3, r4}\n\t"
  84380. #ifdef WOLFSSL_KEIL
  84381. "adcs r3, r3, r5\n\t"
  84382. #elif defined(__clang__)
  84383. "adcs r3, r5\n\t"
  84384. #else
  84385. "adc r3, r5\n\t"
  84386. #endif
  84387. #ifdef WOLFSSL_KEIL
  84388. "adcs r4, r4, r6\n\t"
  84389. #elif defined(__clang__)
  84390. "adcs r4, r6\n\t"
  84391. #else
  84392. "adc r4, r6\n\t"
  84393. #endif
  84394. "stm %[r]!, {r3, r4}\n\t"
  84395. "ldm %[b]!, {r5, r6}\n\t"
  84396. "ldm %[a]!, {r3, r4}\n\t"
  84397. #ifdef WOLFSSL_KEIL
  84398. "adcs r3, r3, r5\n\t"
  84399. #elif defined(__clang__)
  84400. "adcs r3, r5\n\t"
  84401. #else
  84402. "adc r3, r5\n\t"
  84403. #endif
  84404. #ifdef WOLFSSL_KEIL
  84405. "adcs r4, r4, r6\n\t"
  84406. #elif defined(__clang__)
  84407. "adcs r4, r6\n\t"
  84408. #else
  84409. "adc r4, r6\n\t"
  84410. #endif
  84411. "stm %[r]!, {r3, r4}\n\t"
  84412. "ldm %[b]!, {r5, r6}\n\t"
  84413. "ldm %[a]!, {r3, r4}\n\t"
  84414. #ifdef WOLFSSL_KEIL
  84415. "adcs r3, r3, r5\n\t"
  84416. #elif defined(__clang__)
  84417. "adcs r3, r5\n\t"
  84418. #else
  84419. "adc r3, r5\n\t"
  84420. #endif
  84421. #ifdef WOLFSSL_KEIL
  84422. "adcs r4, r4, r6\n\t"
  84423. #elif defined(__clang__)
  84424. "adcs r4, r6\n\t"
  84425. #else
  84426. "adc r4, r6\n\t"
  84427. #endif
  84428. "stm %[r]!, {r3, r4}\n\t"
  84429. "ldm %[b]!, {r5, r6}\n\t"
  84430. "ldm %[a]!, {r3, r4}\n\t"
  84431. #ifdef WOLFSSL_KEIL
  84432. "adcs r3, r3, r5\n\t"
  84433. #elif defined(__clang__)
  84434. "adcs r3, r5\n\t"
  84435. #else
  84436. "adc r3, r5\n\t"
  84437. #endif
  84438. #ifdef WOLFSSL_KEIL
  84439. "adcs r4, r4, r6\n\t"
  84440. #elif defined(__clang__)
  84441. "adcs r4, r6\n\t"
  84442. #else
  84443. "adc r4, r6\n\t"
  84444. #endif
  84445. "stm %[r]!, {r3, r4}\n\t"
  84446. "ldm %[b]!, {r5, r6}\n\t"
  84447. "ldm %[a]!, {r3, r4}\n\t"
  84448. #ifdef WOLFSSL_KEIL
  84449. "adcs r3, r3, r5\n\t"
  84450. #elif defined(__clang__)
  84451. "adcs r3, r5\n\t"
  84452. #else
  84453. "adc r3, r5\n\t"
  84454. #endif
  84455. #ifdef WOLFSSL_KEIL
  84456. "adcs r4, r4, r6\n\t"
  84457. #elif defined(__clang__)
  84458. "adcs r4, r6\n\t"
  84459. #else
  84460. "adc r4, r6\n\t"
  84461. #endif
  84462. "stm %[r]!, {r3, r4}\n\t"
  84463. "ldm %[b]!, {r5, r6}\n\t"
  84464. "ldm %[a]!, {r3, r4}\n\t"
  84465. #ifdef WOLFSSL_KEIL
  84466. "adcs r3, r3, r5\n\t"
  84467. #elif defined(__clang__)
  84468. "adcs r3, r5\n\t"
  84469. #else
  84470. "adc r3, r5\n\t"
  84471. #endif
  84472. #ifdef WOLFSSL_KEIL
  84473. "adcs r4, r4, r6\n\t"
  84474. #elif defined(__clang__)
  84475. "adcs r4, r6\n\t"
  84476. #else
  84477. "adc r4, r6\n\t"
  84478. #endif
  84479. "stm %[r]!, {r3, r4}\n\t"
  84480. "ldm %[b]!, {r5, r6}\n\t"
  84481. "ldm %[a]!, {r3, r4}\n\t"
  84482. #ifdef WOLFSSL_KEIL
  84483. "adcs r3, r3, r5\n\t"
  84484. #elif defined(__clang__)
  84485. "adcs r3, r5\n\t"
  84486. #else
  84487. "adc r3, r5\n\t"
  84488. #endif
  84489. #ifdef WOLFSSL_KEIL
  84490. "adcs r4, r4, r6\n\t"
  84491. #elif defined(__clang__)
  84492. "adcs r4, r6\n\t"
  84493. #else
  84494. "adc r4, r6\n\t"
  84495. #endif
  84496. "stm %[r]!, {r3, r4}\n\t"
  84497. "ldm %[b]!, {r5, r6}\n\t"
  84498. "ldm %[a]!, {r3, r4}\n\t"
  84499. #ifdef WOLFSSL_KEIL
  84500. "adcs r3, r3, r5\n\t"
  84501. #elif defined(__clang__)
  84502. "adcs r3, r5\n\t"
  84503. #else
  84504. "adc r3, r5\n\t"
  84505. #endif
  84506. #ifdef WOLFSSL_KEIL
  84507. "adcs r4, r4, r6\n\t"
  84508. #elif defined(__clang__)
  84509. "adcs r4, r6\n\t"
  84510. #else
  84511. "adc r4, r6\n\t"
  84512. #endif
  84513. "stm %[r]!, {r3, r4}\n\t"
  84514. "ldm %[b]!, {r5, r6}\n\t"
  84515. "ldm %[a]!, {r3, r4}\n\t"
  84516. #ifdef WOLFSSL_KEIL
  84517. "adcs r3, r3, r5\n\t"
  84518. #elif defined(__clang__)
  84519. "adcs r3, r5\n\t"
  84520. #else
  84521. "adc r3, r5\n\t"
  84522. #endif
  84523. #ifdef WOLFSSL_KEIL
  84524. "adcs r4, r4, r6\n\t"
  84525. #elif defined(__clang__)
  84526. "adcs r4, r6\n\t"
  84527. #else
  84528. "adc r4, r6\n\t"
  84529. #endif
  84530. "stm %[r]!, {r3, r4}\n\t"
  84531. "ldm %[b]!, {r5, r6}\n\t"
  84532. "ldm %[a]!, {r3, r4}\n\t"
  84533. #ifdef WOLFSSL_KEIL
  84534. "adcs r3, r3, r5\n\t"
  84535. #elif defined(__clang__)
  84536. "adcs r3, r5\n\t"
  84537. #else
  84538. "adc r3, r5\n\t"
  84539. #endif
  84540. #ifdef WOLFSSL_KEIL
  84541. "adcs r4, r4, r6\n\t"
  84542. #elif defined(__clang__)
  84543. "adcs r4, r6\n\t"
  84544. #else
  84545. "adc r4, r6\n\t"
  84546. #endif
  84547. "stm %[r]!, {r3, r4}\n\t"
  84548. "ldm %[b]!, {r5, r6}\n\t"
  84549. "ldm %[a]!, {r3, r4}\n\t"
  84550. #ifdef WOLFSSL_KEIL
  84551. "adcs r3, r3, r5\n\t"
  84552. #elif defined(__clang__)
  84553. "adcs r3, r5\n\t"
  84554. #else
  84555. "adc r3, r5\n\t"
  84556. #endif
  84557. #ifdef WOLFSSL_KEIL
  84558. "adcs r4, r4, r6\n\t"
  84559. #elif defined(__clang__)
  84560. "adcs r4, r6\n\t"
  84561. #else
  84562. "adc r4, r6\n\t"
  84563. #endif
  84564. "stm %[r]!, {r3, r4}\n\t"
  84565. "ldm %[b]!, {r5, r6}\n\t"
  84566. "ldm %[a]!, {r3, r4}\n\t"
  84567. #ifdef WOLFSSL_KEIL
  84568. "adcs r3, r3, r5\n\t"
  84569. #elif defined(__clang__)
  84570. "adcs r3, r5\n\t"
  84571. #else
  84572. "adc r3, r5\n\t"
  84573. #endif
  84574. #ifdef WOLFSSL_KEIL
  84575. "adcs r4, r4, r6\n\t"
  84576. #elif defined(__clang__)
  84577. "adcs r4, r6\n\t"
  84578. #else
  84579. "adc r4, r6\n\t"
  84580. #endif
  84581. "stm %[r]!, {r3, r4}\n\t"
  84582. "ldm %[b]!, {r5, r6}\n\t"
  84583. "ldm %[a]!, {r3, r4}\n\t"
  84584. #ifdef WOLFSSL_KEIL
  84585. "adcs r3, r3, r5\n\t"
  84586. #elif defined(__clang__)
  84587. "adcs r3, r5\n\t"
  84588. #else
  84589. "adc r3, r5\n\t"
  84590. #endif
  84591. #ifdef WOLFSSL_KEIL
  84592. "adcs r4, r4, r6\n\t"
  84593. #elif defined(__clang__)
  84594. "adcs r4, r6\n\t"
  84595. #else
  84596. "adc r4, r6\n\t"
  84597. #endif
  84598. "stm %[r]!, {r3, r4}\n\t"
  84599. "ldm %[b]!, {r5, r6}\n\t"
  84600. "ldm %[a]!, {r3, r4}\n\t"
  84601. #ifdef WOLFSSL_KEIL
  84602. "adcs r3, r3, r5\n\t"
  84603. #elif defined(__clang__)
  84604. "adcs r3, r5\n\t"
  84605. #else
  84606. "adc r3, r5\n\t"
  84607. #endif
  84608. #ifdef WOLFSSL_KEIL
  84609. "adcs r4, r4, r6\n\t"
  84610. #elif defined(__clang__)
  84611. "adcs r4, r6\n\t"
  84612. #else
  84613. "adc r4, r6\n\t"
  84614. #endif
  84615. "stm %[r]!, {r3, r4}\n\t"
  84616. "ldm %[b]!, {r5, r6}\n\t"
  84617. "ldm %[a]!, {r3, r4}\n\t"
  84618. #ifdef WOLFSSL_KEIL
  84619. "adcs r3, r3, r5\n\t"
  84620. #elif defined(__clang__)
  84621. "adcs r3, r5\n\t"
  84622. #else
  84623. "adc r3, r5\n\t"
  84624. #endif
  84625. #ifdef WOLFSSL_KEIL
  84626. "adcs r4, r4, r6\n\t"
  84627. #elif defined(__clang__)
  84628. "adcs r4, r6\n\t"
  84629. #else
  84630. "adc r4, r6\n\t"
  84631. #endif
  84632. "stm %[r]!, {r3, r4}\n\t"
  84633. "ldm %[b]!, {r5, r6}\n\t"
  84634. "ldm %[a]!, {r3, r4}\n\t"
  84635. #ifdef WOLFSSL_KEIL
  84636. "adcs r3, r3, r5\n\t"
  84637. #elif defined(__clang__)
  84638. "adcs r3, r5\n\t"
  84639. #else
  84640. "adc r3, r5\n\t"
  84641. #endif
  84642. #ifdef WOLFSSL_KEIL
  84643. "adcs r4, r4, r6\n\t"
  84644. #elif defined(__clang__)
  84645. "adcs r4, r6\n\t"
  84646. #else
  84647. "adc r4, r6\n\t"
  84648. #endif
  84649. "stm %[r]!, {r3, r4}\n\t"
  84650. "ldm %[b]!, {r5, r6}\n\t"
  84651. "ldm %[a]!, {r3, r4}\n\t"
  84652. #ifdef WOLFSSL_KEIL
  84653. "adcs r3, r3, r5\n\t"
  84654. #elif defined(__clang__)
  84655. "adcs r3, r5\n\t"
  84656. #else
  84657. "adc r3, r5\n\t"
  84658. #endif
  84659. #ifdef WOLFSSL_KEIL
  84660. "adcs r4, r4, r6\n\t"
  84661. #elif defined(__clang__)
  84662. "adcs r4, r6\n\t"
  84663. #else
  84664. "adc r4, r6\n\t"
  84665. #endif
  84666. "stm %[r]!, {r3, r4}\n\t"
  84667. "ldm %[b]!, {r5, r6}\n\t"
  84668. "ldm %[a]!, {r3, r4}\n\t"
  84669. #ifdef WOLFSSL_KEIL
  84670. "adcs r3, r3, r5\n\t"
  84671. #elif defined(__clang__)
  84672. "adcs r3, r5\n\t"
  84673. #else
  84674. "adc r3, r5\n\t"
  84675. #endif
  84676. #ifdef WOLFSSL_KEIL
  84677. "adcs r4, r4, r6\n\t"
  84678. #elif defined(__clang__)
  84679. "adcs r4, r6\n\t"
  84680. #else
  84681. "adc r4, r6\n\t"
  84682. #endif
  84683. "stm %[r]!, {r3, r4}\n\t"
  84684. "ldm %[b]!, {r5, r6}\n\t"
  84685. "ldm %[a]!, {r3, r4}\n\t"
  84686. #ifdef WOLFSSL_KEIL
  84687. "adcs r3, r3, r5\n\t"
  84688. #elif defined(__clang__)
  84689. "adcs r3, r5\n\t"
  84690. #else
  84691. "adc r3, r5\n\t"
  84692. #endif
  84693. #ifdef WOLFSSL_KEIL
  84694. "adcs r4, r4, r6\n\t"
  84695. #elif defined(__clang__)
  84696. "adcs r4, r6\n\t"
  84697. #else
  84698. "adc r4, r6\n\t"
  84699. #endif
  84700. "stm %[r]!, {r3, r4}\n\t"
  84701. "ldm %[b]!, {r5, r6}\n\t"
  84702. "ldm %[a]!, {r3, r4}\n\t"
  84703. #ifdef WOLFSSL_KEIL
  84704. "adcs r3, r3, r5\n\t"
  84705. #elif defined(__clang__)
  84706. "adcs r3, r5\n\t"
  84707. #else
  84708. "adc r3, r5\n\t"
  84709. #endif
  84710. #ifdef WOLFSSL_KEIL
  84711. "adcs r4, r4, r6\n\t"
  84712. #elif defined(__clang__)
  84713. "adcs r4, r6\n\t"
  84714. #else
  84715. "adc r4, r6\n\t"
  84716. #endif
  84717. "stm %[r]!, {r3, r4}\n\t"
  84718. "ldm %[b]!, {r5, r6}\n\t"
  84719. "ldm %[a]!, {r3, r4}\n\t"
  84720. #ifdef WOLFSSL_KEIL
  84721. "adcs r3, r3, r5\n\t"
  84722. #elif defined(__clang__)
  84723. "adcs r3, r5\n\t"
  84724. #else
  84725. "adc r3, r5\n\t"
  84726. #endif
  84727. #ifdef WOLFSSL_KEIL
  84728. "adcs r4, r4, r6\n\t"
  84729. #elif defined(__clang__)
  84730. "adcs r4, r6\n\t"
  84731. #else
  84732. "adc r4, r6\n\t"
  84733. #endif
  84734. "stm %[r]!, {r3, r4}\n\t"
  84735. "ldm %[b]!, {r5, r6}\n\t"
  84736. "ldm %[a]!, {r3, r4}\n\t"
  84737. #ifdef WOLFSSL_KEIL
  84738. "adcs r3, r3, r5\n\t"
  84739. #elif defined(__clang__)
  84740. "adcs r3, r5\n\t"
  84741. #else
  84742. "adc r3, r5\n\t"
  84743. #endif
  84744. #ifdef WOLFSSL_KEIL
  84745. "adcs r4, r4, r6\n\t"
  84746. #elif defined(__clang__)
  84747. "adcs r4, r6\n\t"
  84748. #else
  84749. "adc r4, r6\n\t"
  84750. #endif
  84751. "stm %[r]!, {r3, r4}\n\t"
  84752. "ldm %[b]!, {r5, r6}\n\t"
  84753. "ldm %[a]!, {r3, r4}\n\t"
  84754. #ifdef WOLFSSL_KEIL
  84755. "adcs r3, r3, r5\n\t"
  84756. #elif defined(__clang__)
  84757. "adcs r3, r5\n\t"
  84758. #else
  84759. "adc r3, r5\n\t"
  84760. #endif
  84761. #ifdef WOLFSSL_KEIL
  84762. "adcs r4, r4, r6\n\t"
  84763. #elif defined(__clang__)
  84764. "adcs r4, r6\n\t"
  84765. #else
  84766. "adc r4, r6\n\t"
  84767. #endif
  84768. "stm %[r]!, {r3, r4}\n\t"
  84769. "ldm %[b]!, {r5, r6}\n\t"
  84770. "ldm %[a]!, {r3, r4}\n\t"
  84771. #ifdef WOLFSSL_KEIL
  84772. "adcs r3, r3, r5\n\t"
  84773. #elif defined(__clang__)
  84774. "adcs r3, r5\n\t"
  84775. #else
  84776. "adc r3, r5\n\t"
  84777. #endif
  84778. #ifdef WOLFSSL_KEIL
  84779. "adcs r4, r4, r6\n\t"
  84780. #elif defined(__clang__)
  84781. "adcs r4, r6\n\t"
  84782. #else
  84783. "adc r4, r6\n\t"
  84784. #endif
  84785. "stm %[r]!, {r3, r4}\n\t"
  84786. "ldm %[b]!, {r5, r6}\n\t"
  84787. "ldm %[a]!, {r3, r4}\n\t"
  84788. #ifdef WOLFSSL_KEIL
  84789. "adcs r3, r3, r5\n\t"
  84790. #elif defined(__clang__)
  84791. "adcs r3, r5\n\t"
  84792. #else
  84793. "adc r3, r5\n\t"
  84794. #endif
  84795. #ifdef WOLFSSL_KEIL
  84796. "adcs r4, r4, r6\n\t"
  84797. #elif defined(__clang__)
  84798. "adcs r4, r6\n\t"
  84799. #else
  84800. "adc r4, r6\n\t"
  84801. #endif
  84802. "stm %[r]!, {r3, r4}\n\t"
  84803. "ldm %[b]!, {r5, r6}\n\t"
  84804. "ldm %[a]!, {r3, r4}\n\t"
  84805. #ifdef WOLFSSL_KEIL
  84806. "adcs r3, r3, r5\n\t"
  84807. #elif defined(__clang__)
  84808. "adcs r3, r5\n\t"
  84809. #else
  84810. "adc r3, r5\n\t"
  84811. #endif
  84812. #ifdef WOLFSSL_KEIL
  84813. "adcs r4, r4, r6\n\t"
  84814. #elif defined(__clang__)
  84815. "adcs r4, r6\n\t"
  84816. #else
  84817. "adc r4, r6\n\t"
  84818. #endif
  84819. "stm %[r]!, {r3, r4}\n\t"
  84820. "ldm %[b]!, {r5, r6}\n\t"
  84821. "ldm %[a]!, {r3, r4}\n\t"
  84822. #ifdef WOLFSSL_KEIL
  84823. "adcs r3, r3, r5\n\t"
  84824. #elif defined(__clang__)
  84825. "adcs r3, r5\n\t"
  84826. #else
  84827. "adc r3, r5\n\t"
  84828. #endif
  84829. #ifdef WOLFSSL_KEIL
  84830. "adcs r4, r4, r6\n\t"
  84831. #elif defined(__clang__)
  84832. "adcs r4, r6\n\t"
  84833. #else
  84834. "adc r4, r6\n\t"
  84835. #endif
  84836. "stm %[r]!, {r3, r4}\n\t"
  84837. "ldm %[b]!, {r5, r6}\n\t"
  84838. "ldm %[a]!, {r3, r4}\n\t"
  84839. #ifdef WOLFSSL_KEIL
  84840. "adcs r3, r3, r5\n\t"
  84841. #elif defined(__clang__)
  84842. "adcs r3, r5\n\t"
  84843. #else
  84844. "adc r3, r5\n\t"
  84845. #endif
  84846. #ifdef WOLFSSL_KEIL
  84847. "adcs r4, r4, r6\n\t"
  84848. #elif defined(__clang__)
  84849. "adcs r4, r6\n\t"
  84850. #else
  84851. "adc r4, r6\n\t"
  84852. #endif
  84853. "stm %[r]!, {r3, r4}\n\t"
  84854. "ldm %[b]!, {r5, r6}\n\t"
  84855. "ldm %[a]!, {r3, r4}\n\t"
  84856. #ifdef WOLFSSL_KEIL
  84857. "adcs r3, r3, r5\n\t"
  84858. #elif defined(__clang__)
  84859. "adcs r3, r5\n\t"
  84860. #else
  84861. "adc r3, r5\n\t"
  84862. #endif
  84863. #ifdef WOLFSSL_KEIL
  84864. "adcs r4, r4, r6\n\t"
  84865. #elif defined(__clang__)
  84866. "adcs r4, r6\n\t"
  84867. #else
  84868. "adc r4, r6\n\t"
  84869. #endif
  84870. "stm %[r]!, {r3, r4}\n\t"
  84871. "ldm %[b]!, {r5, r6}\n\t"
  84872. "ldm %[a]!, {r3, r4}\n\t"
  84873. #ifdef WOLFSSL_KEIL
  84874. "adcs r3, r3, r5\n\t"
  84875. #elif defined(__clang__)
  84876. "adcs r3, r5\n\t"
  84877. #else
  84878. "adc r3, r5\n\t"
  84879. #endif
  84880. #ifdef WOLFSSL_KEIL
  84881. "adcs r4, r4, r6\n\t"
  84882. #elif defined(__clang__)
  84883. "adcs r4, r6\n\t"
  84884. #else
  84885. "adc r4, r6\n\t"
  84886. #endif
  84887. "stm %[r]!, {r3, r4}\n\t"
  84888. "ldm %[b]!, {r5, r6}\n\t"
  84889. "ldm %[a]!, {r3, r4}\n\t"
  84890. #ifdef WOLFSSL_KEIL
  84891. "adcs r3, r3, r5\n\t"
  84892. #elif defined(__clang__)
  84893. "adcs r3, r5\n\t"
  84894. #else
  84895. "adc r3, r5\n\t"
  84896. #endif
  84897. #ifdef WOLFSSL_KEIL
  84898. "adcs r4, r4, r6\n\t"
  84899. #elif defined(__clang__)
  84900. "adcs r4, r6\n\t"
  84901. #else
  84902. "adc r4, r6\n\t"
  84903. #endif
  84904. "stm %[r]!, {r3, r4}\n\t"
  84905. "ldm %[b]!, {r5, r6}\n\t"
  84906. "ldm %[a]!, {r3, r4}\n\t"
  84907. #ifdef WOLFSSL_KEIL
  84908. "adcs r3, r3, r5\n\t"
  84909. #elif defined(__clang__)
  84910. "adcs r3, r5\n\t"
  84911. #else
  84912. "adc r3, r5\n\t"
  84913. #endif
  84914. #ifdef WOLFSSL_KEIL
  84915. "adcs r4, r4, r6\n\t"
  84916. #elif defined(__clang__)
  84917. "adcs r4, r6\n\t"
  84918. #else
  84919. "adc r4, r6\n\t"
  84920. #endif
  84921. "stm %[r]!, {r3, r4}\n\t"
  84922. "movs %[r], #0\n\t"
  84923. #ifdef WOLFSSL_KEIL
  84924. "adcs %[r], %[r], %[r]\n\t"
  84925. #elif defined(__clang__)
  84926. "adcs %[r], %[r]\n\t"
  84927. #else
  84928. "adc %[r], %[r]\n\t"
  84929. #endif
  84930. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  84931. :
  84932. : "memory", "r3", "r4", "r5", "r6"
  84933. );
  84934. return (uint32_t)(size_t)r;
  84935. }
  84936. /* Multiply a and b into r. (r = a * b)
  84937. *
  84938. * r A single precision integer.
  84939. * a A single precision integer.
  84940. * b A single precision integer.
  84941. */
  84942. SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a,
  84943. const sp_digit* b)
  84944. {
  84945. sp_digit* z0 = r;
  84946. sp_digit z1[128];
  84947. sp_digit a1[64];
  84948. sp_digit b1[64];
  84949. sp_digit z2[128];
  84950. sp_digit u;
  84951. sp_digit ca;
  84952. sp_digit cb;
  84953. ca = sp_2048_add_64(a1, a, &a[64]);
  84954. cb = sp_2048_add_64(b1, b, &b[64]);
  84955. u = ca & cb;
  84956. sp_2048_mul_64(z1, a1, b1);
  84957. sp_2048_mul_64(z2, &a[64], &b[64]);
  84958. sp_2048_mul_64(z0, a, b);
  84959. sp_2048_mask_64(r + 128, a1, 0 - cb);
  84960. sp_2048_mask_64(b1, b1, 0 - ca);
  84961. u += sp_2048_add_64(r + 128, r + 128, b1);
  84962. u += sp_4096_sub_in_place_128(z1, z2);
  84963. u += sp_4096_sub_in_place_128(z1, z0);
  84964. u += sp_4096_add_128(r + 64, r + 64, z1);
  84965. u += sp_4096_add_64(r + 128, r + 128, z2);
  84966. (void)sp_4096_add_to_word_64(r + 192, u, z2 + 64);
  84967. }
  84968. /* Square a and put result in r. (r = a * a)
  84969. *
  84970. * r A single precision integer.
  84971. * a A single precision integer.
  84972. */
  84973. SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a)
  84974. {
  84975. sp_digit* z0 = r;
  84976. sp_digit z2[128];
  84977. sp_digit z1[128];
  84978. sp_digit a1[64];
  84979. sp_digit u;
  84980. u = sp_2048_add_64(a1, a, &a[64]);
  84981. sp_2048_sqr_64(z1, a1);
  84982. sp_2048_sqr_64(z2, &a[64]);
  84983. sp_2048_sqr_64(z0, a);
  84984. sp_2048_mask_64(r + 128, a1, 0 - u);
  84985. u += sp_2048_dbl_64(r + 128, r + 128);
  84986. u += sp_4096_sub_in_place_128(z1, z2);
  84987. u += sp_4096_sub_in_place_128(z1, z0);
  84988. u += sp_4096_add_128(r + 64, r + 64, z1);
  84989. u += sp_4096_add_64(r + 128, r + 128, z2);
  84990. (void)sp_4096_add_to_word_64(r + 192, u, z2 + 64);
  84991. }
  84992. #endif /* !WOLFSSL_SP_SMALL */
  84993. #ifdef WOLFSSL_SP_SMALL
  84994. /* Add b to a into r. (r = a + b)
  84995. *
  84996. * r A single precision integer.
  84997. * a A single precision integer.
  84998. * b A single precision integer.
  84999. */
  85000. SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a,
  85001. const sp_digit* b)
  85002. {
  85003. __asm__ __volatile__ (
  85004. "movs r6, %[a]\n\t"
  85005. "movs r7, #0\n\t"
  85006. "movs r3, #0\n\t"
  85007. "movs r4, #2\n\t"
  85008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85009. "lsls r4, r4, #8\n\t"
  85010. #else
  85011. "lsl r4, r4, #8\n\t"
  85012. #endif
  85013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85014. "subs r7, r7, #1\n\t"
  85015. #else
  85016. "sub r7, r7, #1\n\t"
  85017. #endif
  85018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85019. "adds r6, r6, r4\n\t"
  85020. #else
  85021. "add r6, r6, r4\n\t"
  85022. #endif
  85023. "\n"
  85024. "L_sp_4096_add_128_word_%=:\n\t"
  85025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85026. "adds r3, r3, r7\n\t"
  85027. #else
  85028. "add r3, r3, r7\n\t"
  85029. #endif
  85030. "ldr r4, [%[a]]\n\t"
  85031. "ldr r5, [%[b]]\n\t"
  85032. #ifdef WOLFSSL_KEIL
  85033. "adcs r4, r4, r5\n\t"
  85034. #elif defined(__clang__)
  85035. "adcs r4, r5\n\t"
  85036. #else
  85037. "adc r4, r5\n\t"
  85038. #endif
  85039. "str r4, [%[r]]\n\t"
  85040. "movs r3, #0\n\t"
  85041. #ifdef WOLFSSL_KEIL
  85042. "adcs r3, r3, r3\n\t"
  85043. #elif defined(__clang__)
  85044. "adcs r3, r3\n\t"
  85045. #else
  85046. "adc r3, r3\n\t"
  85047. #endif
  85048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85049. "adds %[a], %[a], #4\n\t"
  85050. #else
  85051. "add %[a], %[a], #4\n\t"
  85052. #endif
  85053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85054. "adds %[b], %[b], #4\n\t"
  85055. #else
  85056. "add %[b], %[b], #4\n\t"
  85057. #endif
  85058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85059. "adds %[r], %[r], #4\n\t"
  85060. #else
  85061. "add %[r], %[r], #4\n\t"
  85062. #endif
  85063. "cmp %[a], r6\n\t"
  85064. "bne L_sp_4096_add_128_word_%=\n\t"
  85065. "movs %[r], r3\n\t"
  85066. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  85067. :
  85068. : "memory", "r3", "r4", "r5", "r6", "r7"
  85069. );
  85070. return (uint32_t)(size_t)r;
  85071. }
  85072. #endif /* WOLFSSL_SP_SMALL */
  85073. #ifdef WOLFSSL_SP_SMALL
  85074. /* Sub b from a into a. (a -= b)
  85075. *
  85076. * a A single precision integer.
  85077. * b A single precision integer.
  85078. */
  85079. SP_NOINLINE static sp_digit sp_4096_sub_in_place_128(sp_digit* a,
  85080. const sp_digit* b)
  85081. {
  85082. __asm__ __volatile__ (
  85083. "movs r7, %[a]\n\t"
  85084. "movs r2, #0\n\t"
  85085. "movs r5, #2\n\t"
  85086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85087. "lsls r5, r5, #8\n\t"
  85088. #else
  85089. "lsl r5, r5, #8\n\t"
  85090. #endif
  85091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85092. "adds r7, r7, r5\n\t"
  85093. #else
  85094. "add r7, r7, r5\n\t"
  85095. #endif
  85096. "\n"
  85097. "L_sp_4096_sub_in_place_128_words_%=:\n\t"
  85098. "movs r5, #0\n\t"
  85099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85100. "subs r5, r5, r2\n\t"
  85101. #else
  85102. "sub r5, r5, r2\n\t"
  85103. #endif
  85104. "ldr r3, [%[a]]\n\t"
  85105. "ldr r4, [%[a], #4]\n\t"
  85106. "ldr r5, [%[b]]\n\t"
  85107. "ldr r6, [%[b], #4]\n\t"
  85108. #ifdef WOLFSSL_KEIL
  85109. "sbcs r3, r3, r5\n\t"
  85110. #elif defined(__clang__)
  85111. "sbcs r3, r5\n\t"
  85112. #else
  85113. "sbc r3, r5\n\t"
  85114. #endif
  85115. #ifdef WOLFSSL_KEIL
  85116. "sbcs r4, r4, r6\n\t"
  85117. #elif defined(__clang__)
  85118. "sbcs r4, r6\n\t"
  85119. #else
  85120. "sbc r4, r6\n\t"
  85121. #endif
  85122. "str r3, [%[a]]\n\t"
  85123. "str r4, [%[a], #4]\n\t"
  85124. #ifdef WOLFSSL_KEIL
  85125. "sbcs r2, r2, r2\n\t"
  85126. #elif defined(__clang__)
  85127. "sbcs r2, r2\n\t"
  85128. #else
  85129. "sbc r2, r2\n\t"
  85130. #endif
  85131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85132. "adds %[a], %[a], #8\n\t"
  85133. #else
  85134. "add %[a], %[a], #8\n\t"
  85135. #endif
  85136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85137. "adds %[b], %[b], #8\n\t"
  85138. #else
  85139. "add %[b], %[b], #8\n\t"
  85140. #endif
  85141. "cmp %[a], r7\n\t"
  85142. "bne L_sp_4096_sub_in_place_128_words_%=\n\t"
  85143. "movs %[a], r2\n\t"
  85144. : [a] "+r" (a), [b] "+r" (b)
  85145. :
  85146. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  85147. );
  85148. return (uint32_t)(size_t)a;
  85149. }
  85150. #endif /* WOLFSSL_SP_SMALL */
  85151. #ifdef WOLFSSL_SP_SMALL
  85152. /* Multiply a and b into r. (r = a * b)
  85153. *
  85154. * r A single precision integer.
  85155. * a A single precision integer.
  85156. * b A single precision integer.
  85157. */
  85158. SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a,
  85159. const sp_digit* b)
  85160. {
  85161. sp_digit t[128 * 2];
  85162. sp_digit* tmp = t;
  85163. __asm__ __volatile__ (
  85164. "movs r3, #0\n\t"
  85165. "movs r4, #0\n\t"
  85166. "mov r8, r3\n\t"
  85167. "mov r11, %[tmp]\n\t"
  85168. "mov r9, %[a]\n\t"
  85169. "mov r10, %[b]\n\t"
  85170. "movs r6, #2\n\t"
  85171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85172. "lsls r6, r6, #8\n\t"
  85173. #else
  85174. "lsl r6, r6, #8\n\t"
  85175. #endif
  85176. "add r6, r6, r9\n\t"
  85177. "mov r12, r6\n\t"
  85178. "\n"
  85179. "L_sp_4096_mul_128_words_%=:\n\t"
  85180. "movs %[tmp], #0\n\t"
  85181. "movs r5, #0\n\t"
  85182. "movs r6, #0xff\n\t"
  85183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85184. "adds r6, r6, #0xfd\n\t"
  85185. #else
  85186. "add r6, r6, #0xfd\n\t"
  85187. #endif
  85188. "mov %[a], r8\n\t"
  85189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85190. "subs %[a], %[a], r6\n\t"
  85191. #else
  85192. "sub %[a], %[a], r6\n\t"
  85193. #endif
  85194. #ifdef WOLFSSL_KEIL
  85195. "sbcs r6, r6, r6\n\t"
  85196. #elif defined(__clang__)
  85197. "sbcs r6, r6\n\t"
  85198. #else
  85199. "sbc r6, r6\n\t"
  85200. #endif
  85201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85202. "mvns r6, r6\n\t"
  85203. #else
  85204. "mvn r6, r6\n\t"
  85205. #endif
  85206. #ifdef WOLFSSL_KEIL
  85207. "ands %[a], %[a], r6\n\t"
  85208. #elif defined(__clang__)
  85209. "ands %[a], r6\n\t"
  85210. #else
  85211. "and %[a], r6\n\t"
  85212. #endif
  85213. "mov %[b], r8\n\t"
  85214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85215. "subs %[b], %[b], %[a]\n\t"
  85216. #else
  85217. "sub %[b], %[b], %[a]\n\t"
  85218. #endif
  85219. "add %[a], %[a], r9\n\t"
  85220. "add %[b], %[b], r10\n\t"
  85221. "\n"
  85222. "L_sp_4096_mul_128_mul_%=:\n\t"
  85223. "# Multiply Start\n\t"
  85224. "ldrh r6, [%[a]]\n\t"
  85225. "ldrh r7, [%[b]]\n\t"
  85226. #ifdef WOLFSSL_KEIL
  85227. "muls r7, r6, r7\n\t"
  85228. #elif defined(__clang__)
  85229. "muls r7, r6\n\t"
  85230. #else
  85231. "mul r7, r6\n\t"
  85232. #endif
  85233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85234. "adds r3, r3, r7\n\t"
  85235. #else
  85236. "add r3, r3, r7\n\t"
  85237. #endif
  85238. #ifdef WOLFSSL_KEIL
  85239. "adcs r4, r4, %[tmp]\n\t"
  85240. #elif defined(__clang__)
  85241. "adcs r4, %[tmp]\n\t"
  85242. #else
  85243. "adc r4, %[tmp]\n\t"
  85244. #endif
  85245. #ifdef WOLFSSL_KEIL
  85246. "adcs r5, r5, %[tmp]\n\t"
  85247. #elif defined(__clang__)
  85248. "adcs r5, %[tmp]\n\t"
  85249. #else
  85250. "adc r5, %[tmp]\n\t"
  85251. #endif
  85252. "ldr r7, [%[b]]\n\t"
  85253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85254. "lsrs r7, r7, #16\n\t"
  85255. #else
  85256. "lsr r7, r7, #16\n\t"
  85257. #endif
  85258. #ifdef WOLFSSL_KEIL
  85259. "muls r6, r7, r6\n\t"
  85260. #elif defined(__clang__)
  85261. "muls r6, r7\n\t"
  85262. #else
  85263. "mul r6, r7\n\t"
  85264. #endif
  85265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85266. "lsrs r7, r6, #16\n\t"
  85267. #else
  85268. "lsr r7, r6, #16\n\t"
  85269. #endif
  85270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85271. "lsls r6, r6, #16\n\t"
  85272. #else
  85273. "lsl r6, r6, #16\n\t"
  85274. #endif
  85275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85276. "adds r3, r3, r6\n\t"
  85277. #else
  85278. "add r3, r3, r6\n\t"
  85279. #endif
  85280. #ifdef WOLFSSL_KEIL
  85281. "adcs r4, r4, r7\n\t"
  85282. #elif defined(__clang__)
  85283. "adcs r4, r7\n\t"
  85284. #else
  85285. "adc r4, r7\n\t"
  85286. #endif
  85287. #ifdef WOLFSSL_KEIL
  85288. "adcs r5, r5, %[tmp]\n\t"
  85289. #elif defined(__clang__)
  85290. "adcs r5, %[tmp]\n\t"
  85291. #else
  85292. "adc r5, %[tmp]\n\t"
  85293. #endif
  85294. "ldr r6, [%[a]]\n\t"
  85295. "ldr r7, [%[b]]\n\t"
  85296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85297. "lsrs r6, r6, #16\n\t"
  85298. #else
  85299. "lsr r6, r6, #16\n\t"
  85300. #endif
  85301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85302. "lsrs r7, r7, #16\n\t"
  85303. #else
  85304. "lsr r7, r7, #16\n\t"
  85305. #endif
  85306. #ifdef WOLFSSL_KEIL
  85307. "muls r7, r6, r7\n\t"
  85308. #elif defined(__clang__)
  85309. "muls r7, r6\n\t"
  85310. #else
  85311. "mul r7, r6\n\t"
  85312. #endif
  85313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85314. "adds r4, r4, r7\n\t"
  85315. #else
  85316. "add r4, r4, r7\n\t"
  85317. #endif
  85318. #ifdef WOLFSSL_KEIL
  85319. "adcs r5, r5, %[tmp]\n\t"
  85320. #elif defined(__clang__)
  85321. "adcs r5, %[tmp]\n\t"
  85322. #else
  85323. "adc r5, %[tmp]\n\t"
  85324. #endif
  85325. "ldrh r7, [%[b]]\n\t"
  85326. #ifdef WOLFSSL_KEIL
  85327. "muls r6, r7, r6\n\t"
  85328. #elif defined(__clang__)
  85329. "muls r6, r7\n\t"
  85330. #else
  85331. "mul r6, r7\n\t"
  85332. #endif
  85333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85334. "lsrs r7, r6, #16\n\t"
  85335. #else
  85336. "lsr r7, r6, #16\n\t"
  85337. #endif
  85338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85339. "lsls r6, r6, #16\n\t"
  85340. #else
  85341. "lsl r6, r6, #16\n\t"
  85342. #endif
  85343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85344. "adds r3, r3, r6\n\t"
  85345. #else
  85346. "add r3, r3, r6\n\t"
  85347. #endif
  85348. #ifdef WOLFSSL_KEIL
  85349. "adcs r4, r4, r7\n\t"
  85350. #elif defined(__clang__)
  85351. "adcs r4, r7\n\t"
  85352. #else
  85353. "adc r4, r7\n\t"
  85354. #endif
  85355. #ifdef WOLFSSL_KEIL
  85356. "adcs r5, r5, %[tmp]\n\t"
  85357. #elif defined(__clang__)
  85358. "adcs r5, %[tmp]\n\t"
  85359. #else
  85360. "adc r5, %[tmp]\n\t"
  85361. #endif
  85362. "# Multiply Done\n\t"
  85363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85364. "adds %[a], %[a], #4\n\t"
  85365. #else
  85366. "add %[a], %[a], #4\n\t"
  85367. #endif
  85368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85369. "subs %[b], %[b], #4\n\t"
  85370. #else
  85371. "sub %[b], %[b], #4\n\t"
  85372. #endif
  85373. "cmp %[a], r12\n\t"
  85374. "beq L_sp_4096_mul_128_done_mul_%=\n\t"
  85375. "mov r6, r8\n\t"
  85376. "add r6, r6, r9\n\t"
  85377. "cmp %[a], r6\n\t"
  85378. "ble L_sp_4096_mul_128_mul_%=\n\t"
  85379. "\n"
  85380. "L_sp_4096_mul_128_done_mul_%=:\n\t"
  85381. "mov %[tmp], r11\n\t"
  85382. "mov r7, r8\n\t"
  85383. "str r3, [%[tmp], r7]\n\t"
  85384. "movs r3, r4\n\t"
  85385. "movs r4, r5\n\t"
  85386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85387. "adds r7, r7, #4\n\t"
  85388. #else
  85389. "add r7, r7, #4\n\t"
  85390. #endif
  85391. "mov r8, r7\n\t"
  85392. "movs r6, #3\n\t"
  85393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85394. "lsls r6, r6, #8\n\t"
  85395. #else
  85396. "lsl r6, r6, #8\n\t"
  85397. #endif
  85398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85399. "adds r6, r6, #0xf8\n\t"
  85400. #else
  85401. "add r6, r6, #0xf8\n\t"
  85402. #endif
  85403. "cmp r7, r6\n\t"
  85404. "ble L_sp_4096_mul_128_words_%=\n\t"
  85405. "str r3, [%[tmp], r7]\n\t"
  85406. "mov %[a], r9\n\t"
  85407. "mov %[b], r10\n\t"
  85408. : [a] "+r" (a), [b] "+r" (b), [tmp] "+r" (tmp)
  85409. :
  85410. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  85411. );
  85412. XMEMCPY(r, t, sizeof(t));
  85413. }
  85414. /* Square a and put result in r. (r = a * a)
  85415. *
  85416. * r A single precision integer.
  85417. * a A single precision integer.
  85418. */
  85419. SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a)
  85420. {
  85421. __asm__ __volatile__ (
  85422. "movs r3, #0\n\t"
  85423. "movs r4, #0\n\t"
  85424. "movs r5, #0\n\t"
  85425. "mov r8, r3\n\t"
  85426. "mov r11, %[r]\n\t"
  85427. "movs r6, #4\n\t"
  85428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85429. "lsls r6, r6, #8\n\t"
  85430. #else
  85431. "lsl r6, r6, #8\n\t"
  85432. #endif
  85433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85434. "negs r6, r6\n\t"
  85435. #else
  85436. "neg r6, r6\n\t"
  85437. #endif
  85438. "add sp, sp, r6\n\t"
  85439. "mov r10, sp\n\t"
  85440. "mov r9, %[a]\n\t"
  85441. "\n"
  85442. "L_sp_4096_sqr_128_words_%=:\n\t"
  85443. "movs %[r], #0\n\t"
  85444. "movs r6, #0xff\n\t"
  85445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85446. "adds r6, r6, #0xfd\n\t"
  85447. #else
  85448. "add r6, r6, #0xfd\n\t"
  85449. #endif
  85450. "mov %[a], r8\n\t"
  85451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85452. "subs %[a], %[a], r6\n\t"
  85453. #else
  85454. "sub %[a], %[a], r6\n\t"
  85455. #endif
  85456. #ifdef WOLFSSL_KEIL
  85457. "sbcs r6, r6, r6\n\t"
  85458. #elif defined(__clang__)
  85459. "sbcs r6, r6\n\t"
  85460. #else
  85461. "sbc r6, r6\n\t"
  85462. #endif
  85463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85464. "mvns r6, r6\n\t"
  85465. #else
  85466. "mvn r6, r6\n\t"
  85467. #endif
  85468. #ifdef WOLFSSL_KEIL
  85469. "ands %[a], %[a], r6\n\t"
  85470. #elif defined(__clang__)
  85471. "ands %[a], r6\n\t"
  85472. #else
  85473. "and %[a], r6\n\t"
  85474. #endif
  85475. "mov r2, r8\n\t"
  85476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85477. "subs r2, r2, %[a]\n\t"
  85478. #else
  85479. "sub r2, r2, %[a]\n\t"
  85480. #endif
  85481. "add %[a], %[a], r9\n\t"
  85482. "add r2, r2, r9\n\t"
  85483. "\n"
  85484. "L_sp_4096_sqr_128_mul_%=:\n\t"
  85485. "cmp r2, %[a]\n\t"
  85486. "beq L_sp_4096_sqr_128_sqr_%=\n\t"
  85487. "# Multiply * 2: Start\n\t"
  85488. "ldrh r6, [%[a]]\n\t"
  85489. "ldrh r7, [r2]\n\t"
  85490. #ifdef WOLFSSL_KEIL
  85491. "muls r7, r6, r7\n\t"
  85492. #elif defined(__clang__)
  85493. "muls r7, r6\n\t"
  85494. #else
  85495. "mul r7, r6\n\t"
  85496. #endif
  85497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85498. "adds r3, r3, r7\n\t"
  85499. #else
  85500. "add r3, r3, r7\n\t"
  85501. #endif
  85502. #ifdef WOLFSSL_KEIL
  85503. "adcs r4, r4, %[r]\n\t"
  85504. #elif defined(__clang__)
  85505. "adcs r4, %[r]\n\t"
  85506. #else
  85507. "adc r4, %[r]\n\t"
  85508. #endif
  85509. #ifdef WOLFSSL_KEIL
  85510. "adcs r5, r5, %[r]\n\t"
  85511. #elif defined(__clang__)
  85512. "adcs r5, %[r]\n\t"
  85513. #else
  85514. "adc r5, %[r]\n\t"
  85515. #endif
  85516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85517. "adds r3, r3, r7\n\t"
  85518. #else
  85519. "add r3, r3, r7\n\t"
  85520. #endif
  85521. #ifdef WOLFSSL_KEIL
  85522. "adcs r4, r4, %[r]\n\t"
  85523. #elif defined(__clang__)
  85524. "adcs r4, %[r]\n\t"
  85525. #else
  85526. "adc r4, %[r]\n\t"
  85527. #endif
  85528. #ifdef WOLFSSL_KEIL
  85529. "adcs r5, r5, %[r]\n\t"
  85530. #elif defined(__clang__)
  85531. "adcs r5, %[r]\n\t"
  85532. #else
  85533. "adc r5, %[r]\n\t"
  85534. #endif
  85535. "ldr r7, [r2]\n\t"
  85536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85537. "lsrs r7, r7, #16\n\t"
  85538. #else
  85539. "lsr r7, r7, #16\n\t"
  85540. #endif
  85541. #ifdef WOLFSSL_KEIL
  85542. "muls r6, r7, r6\n\t"
  85543. #elif defined(__clang__)
  85544. "muls r6, r7\n\t"
  85545. #else
  85546. "mul r6, r7\n\t"
  85547. #endif
  85548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85549. "lsrs r7, r6, #16\n\t"
  85550. #else
  85551. "lsr r7, r6, #16\n\t"
  85552. #endif
  85553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85554. "lsls r6, r6, #16\n\t"
  85555. #else
  85556. "lsl r6, r6, #16\n\t"
  85557. #endif
  85558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85559. "adds r3, r3, r6\n\t"
  85560. #else
  85561. "add r3, r3, r6\n\t"
  85562. #endif
  85563. #ifdef WOLFSSL_KEIL
  85564. "adcs r4, r4, r7\n\t"
  85565. #elif defined(__clang__)
  85566. "adcs r4, r7\n\t"
  85567. #else
  85568. "adc r4, r7\n\t"
  85569. #endif
  85570. #ifdef WOLFSSL_KEIL
  85571. "adcs r5, r5, %[r]\n\t"
  85572. #elif defined(__clang__)
  85573. "adcs r5, %[r]\n\t"
  85574. #else
  85575. "adc r5, %[r]\n\t"
  85576. #endif
  85577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85578. "adds r3, r3, r6\n\t"
  85579. #else
  85580. "add r3, r3, r6\n\t"
  85581. #endif
  85582. #ifdef WOLFSSL_KEIL
  85583. "adcs r4, r4, r7\n\t"
  85584. #elif defined(__clang__)
  85585. "adcs r4, r7\n\t"
  85586. #else
  85587. "adc r4, r7\n\t"
  85588. #endif
  85589. #ifdef WOLFSSL_KEIL
  85590. "adcs r5, r5, %[r]\n\t"
  85591. #elif defined(__clang__)
  85592. "adcs r5, %[r]\n\t"
  85593. #else
  85594. "adc r5, %[r]\n\t"
  85595. #endif
  85596. "ldr r6, [%[a]]\n\t"
  85597. "ldr r7, [r2]\n\t"
  85598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85599. "lsrs r6, r6, #16\n\t"
  85600. #else
  85601. "lsr r6, r6, #16\n\t"
  85602. #endif
  85603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85604. "lsrs r7, r7, #16\n\t"
  85605. #else
  85606. "lsr r7, r7, #16\n\t"
  85607. #endif
  85608. #ifdef WOLFSSL_KEIL
  85609. "muls r7, r6, r7\n\t"
  85610. #elif defined(__clang__)
  85611. "muls r7, r6\n\t"
  85612. #else
  85613. "mul r7, r6\n\t"
  85614. #endif
  85615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85616. "adds r4, r4, r7\n\t"
  85617. #else
  85618. "add r4, r4, r7\n\t"
  85619. #endif
  85620. #ifdef WOLFSSL_KEIL
  85621. "adcs r5, r5, %[r]\n\t"
  85622. #elif defined(__clang__)
  85623. "adcs r5, %[r]\n\t"
  85624. #else
  85625. "adc r5, %[r]\n\t"
  85626. #endif
  85627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85628. "adds r4, r4, r7\n\t"
  85629. #else
  85630. "add r4, r4, r7\n\t"
  85631. #endif
  85632. #ifdef WOLFSSL_KEIL
  85633. "adcs r5, r5, %[r]\n\t"
  85634. #elif defined(__clang__)
  85635. "adcs r5, %[r]\n\t"
  85636. #else
  85637. "adc r5, %[r]\n\t"
  85638. #endif
  85639. "ldrh r7, [r2]\n\t"
  85640. #ifdef WOLFSSL_KEIL
  85641. "muls r6, r7, r6\n\t"
  85642. #elif defined(__clang__)
  85643. "muls r6, r7\n\t"
  85644. #else
  85645. "mul r6, r7\n\t"
  85646. #endif
  85647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85648. "lsrs r7, r6, #16\n\t"
  85649. #else
  85650. "lsr r7, r6, #16\n\t"
  85651. #endif
  85652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85653. "lsls r6, r6, #16\n\t"
  85654. #else
  85655. "lsl r6, r6, #16\n\t"
  85656. #endif
  85657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85658. "adds r3, r3, r6\n\t"
  85659. #else
  85660. "add r3, r3, r6\n\t"
  85661. #endif
  85662. #ifdef WOLFSSL_KEIL
  85663. "adcs r4, r4, r7\n\t"
  85664. #elif defined(__clang__)
  85665. "adcs r4, r7\n\t"
  85666. #else
  85667. "adc r4, r7\n\t"
  85668. #endif
  85669. #ifdef WOLFSSL_KEIL
  85670. "adcs r5, r5, %[r]\n\t"
  85671. #elif defined(__clang__)
  85672. "adcs r5, %[r]\n\t"
  85673. #else
  85674. "adc r5, %[r]\n\t"
  85675. #endif
  85676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85677. "adds r3, r3, r6\n\t"
  85678. #else
  85679. "add r3, r3, r6\n\t"
  85680. #endif
  85681. #ifdef WOLFSSL_KEIL
  85682. "adcs r4, r4, r7\n\t"
  85683. #elif defined(__clang__)
  85684. "adcs r4, r7\n\t"
  85685. #else
  85686. "adc r4, r7\n\t"
  85687. #endif
  85688. #ifdef WOLFSSL_KEIL
  85689. "adcs r5, r5, %[r]\n\t"
  85690. #elif defined(__clang__)
  85691. "adcs r5, %[r]\n\t"
  85692. #else
  85693. "adc r5, %[r]\n\t"
  85694. #endif
  85695. "# Multiply * 2: Done\n\t"
  85696. "bal L_sp_4096_sqr_128_done_sqr_%=\n\t"
  85697. "\n"
  85698. "L_sp_4096_sqr_128_sqr_%=:\n\t"
  85699. "mov r12, r2\n\t"
  85700. "ldr r2, [%[a]]\n\t"
  85701. "# Square: Start\n\t"
  85702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85703. "lsrs r7, r2, #16\n\t"
  85704. #else
  85705. "lsr r7, r2, #16\n\t"
  85706. #endif
  85707. "uxth r6, r2\n\t"
  85708. #ifdef WOLFSSL_KEIL
  85709. "muls r6, r6, r6\n\t"
  85710. #elif defined(__clang__)
  85711. "muls r6, r6\n\t"
  85712. #else
  85713. "mul r6, r6\n\t"
  85714. #endif
  85715. #ifdef WOLFSSL_KEIL
  85716. "muls r7, r7, r7\n\t"
  85717. #elif defined(__clang__)
  85718. "muls r7, r7\n\t"
  85719. #else
  85720. "mul r7, r7\n\t"
  85721. #endif
  85722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85723. "adds r3, r3, r6\n\t"
  85724. #else
  85725. "add r3, r3, r6\n\t"
  85726. #endif
  85727. #ifdef WOLFSSL_KEIL
  85728. "adcs r4, r4, r7\n\t"
  85729. #elif defined(__clang__)
  85730. "adcs r4, r7\n\t"
  85731. #else
  85732. "adc r4, r7\n\t"
  85733. #endif
  85734. #ifdef WOLFSSL_KEIL
  85735. "adcs r5, r5, %[r]\n\t"
  85736. #elif defined(__clang__)
  85737. "adcs r5, %[r]\n\t"
  85738. #else
  85739. "adc r5, %[r]\n\t"
  85740. #endif
  85741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85742. "lsrs r7, r2, #16\n\t"
  85743. #else
  85744. "lsr r7, r2, #16\n\t"
  85745. #endif
  85746. "uxth r6, r2\n\t"
  85747. #ifdef WOLFSSL_KEIL
  85748. "muls r6, r7, r6\n\t"
  85749. #elif defined(__clang__)
  85750. "muls r6, r7\n\t"
  85751. #else
  85752. "mul r6, r7\n\t"
  85753. #endif
  85754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85755. "lsrs r7, r6, #15\n\t"
  85756. #else
  85757. "lsr r7, r6, #15\n\t"
  85758. #endif
  85759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85760. "lsls r6, r6, #17\n\t"
  85761. #else
  85762. "lsl r6, r6, #17\n\t"
  85763. #endif
  85764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85765. "adds r3, r3, r6\n\t"
  85766. #else
  85767. "add r3, r3, r6\n\t"
  85768. #endif
  85769. #ifdef WOLFSSL_KEIL
  85770. "adcs r4, r4, r7\n\t"
  85771. #elif defined(__clang__)
  85772. "adcs r4, r7\n\t"
  85773. #else
  85774. "adc r4, r7\n\t"
  85775. #endif
  85776. #ifdef WOLFSSL_KEIL
  85777. "adcs r5, r5, %[r]\n\t"
  85778. #elif defined(__clang__)
  85779. "adcs r5, %[r]\n\t"
  85780. #else
  85781. "adc r5, %[r]\n\t"
  85782. #endif
  85783. "# Square: Done\n\t"
  85784. "mov r2, r12\n\t"
  85785. "\n"
  85786. "L_sp_4096_sqr_128_done_sqr_%=:\n\t"
  85787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85788. "adds %[a], %[a], #4\n\t"
  85789. #else
  85790. "add %[a], %[a], #4\n\t"
  85791. #endif
  85792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85793. "subs r2, r2, #4\n\t"
  85794. #else
  85795. "sub r2, r2, #4\n\t"
  85796. #endif
  85797. "movs r6, #2\n\t"
  85798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85799. "lsls r6, r6, #8\n\t"
  85800. #else
  85801. "lsl r6, r6, #8\n\t"
  85802. #endif
  85803. "add r6, r6, r9\n\t"
  85804. "cmp %[a], r6\n\t"
  85805. "beq L_sp_4096_sqr_128_done_mul_%=\n\t"
  85806. "cmp %[a], r2\n\t"
  85807. "bgt L_sp_4096_sqr_128_done_mul_%=\n\t"
  85808. "mov r7, r8\n\t"
  85809. "add r7, r7, r9\n\t"
  85810. "cmp %[a], r7\n\t"
  85811. "ble L_sp_4096_sqr_128_mul_%=\n\t"
  85812. "\n"
  85813. "L_sp_4096_sqr_128_done_mul_%=:\n\t"
  85814. "mov %[r], r10\n\t"
  85815. "mov r7, r8\n\t"
  85816. "str r3, [%[r], r7]\n\t"
  85817. "movs r3, r4\n\t"
  85818. "movs r4, r5\n\t"
  85819. "movs r5, #0\n\t"
  85820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85821. "adds r7, r7, #4\n\t"
  85822. #else
  85823. "add r7, r7, #4\n\t"
  85824. #endif
  85825. "mov r8, r7\n\t"
  85826. "movs r6, #3\n\t"
  85827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85828. "lsls r6, r6, #8\n\t"
  85829. #else
  85830. "lsl r6, r6, #8\n\t"
  85831. #endif
  85832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85833. "adds r6, r6, #0xf8\n\t"
  85834. #else
  85835. "add r6, r6, #0xf8\n\t"
  85836. #endif
  85837. "cmp r7, r6\n\t"
  85838. "ble L_sp_4096_sqr_128_words_%=\n\t"
  85839. "mov %[a], r9\n\t"
  85840. "str r3, [%[r], r7]\n\t"
  85841. "mov %[r], r11\n\t"
  85842. "mov %[a], r10\n\t"
  85843. "movs r3, #3\n\t"
  85844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85845. "lsls r3, r3, #8\n\t"
  85846. #else
  85847. "lsl r3, r3, #8\n\t"
  85848. #endif
  85849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85850. "adds r3, r3, #0xfc\n\t"
  85851. #else
  85852. "add r3, r3, #0xfc\n\t"
  85853. #endif
  85854. "\n"
  85855. "L_sp_4096_sqr_128_store_%=:\n\t"
  85856. "ldr r6, [%[a], r3]\n\t"
  85857. "str r6, [%[r], r3]\n\t"
  85858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85859. "subs r3, r3, #4\n\t"
  85860. #else
  85861. "sub r3, r3, #4\n\t"
  85862. #endif
  85863. "bge L_sp_4096_sqr_128_store_%=\n\t"
  85864. "movs r6, #4\n\t"
  85865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85866. "lsls r6, r6, #8\n\t"
  85867. #else
  85868. "lsl r6, r6, #8\n\t"
  85869. #endif
  85870. "add sp, sp, r6\n\t"
  85871. : [r] "+r" (r), [a] "+r" (a)
  85872. :
  85873. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  85874. );
  85875. }
  85876. #endif /* WOLFSSL_SP_SMALL */
  85877. /* Caclulate the bottom digit of -1/a mod 2^n.
  85878. *
  85879. * a A single precision number.
  85880. * rho Bottom word of inverse.
  85881. */
  85882. static void sp_4096_mont_setup(const sp_digit* a, sp_digit* rho)
  85883. {
  85884. sp_digit x;
  85885. sp_digit b;
  85886. b = a[0];
  85887. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  85888. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  85889. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  85890. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  85891. /* rho = -1/m mod b */
  85892. *rho = (sp_digit)0 - x;
  85893. }
  85894. /* Mul a by digit b into r. (r = a * b)
  85895. *
  85896. * r A single precision integer.
  85897. * a A single precision integer.
  85898. * b A single precision digit.
  85899. */
  85900. SP_NOINLINE static void sp_4096_mul_d_128(sp_digit* r, const sp_digit* a,
  85901. sp_digit b)
  85902. {
  85903. __asm__ __volatile__ (
  85904. "movs r6, #2\n\t"
  85905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85906. "lsls r6, r6, #8\n\t"
  85907. #else
  85908. "lsl r6, r6, #8\n\t"
  85909. #endif
  85910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85911. "adds r6, r6, %[a]\n\t"
  85912. #else
  85913. "add r6, r6, %[a]\n\t"
  85914. #endif
  85915. "mov r8, %[r]\n\t"
  85916. "mov r9, r6\n\t"
  85917. "movs r3, #0\n\t"
  85918. "movs r4, #0\n\t"
  85919. "\n"
  85920. "L_sp_4096_mul_d_128_%=:\n\t"
  85921. "movs %[r], #0\n\t"
  85922. "movs r5, #0\n\t"
  85923. "# A[] * B\n\t"
  85924. "ldrh r6, [%[a]]\n\t"
  85925. "uxth r7, %[b]\n\t"
  85926. #ifdef WOLFSSL_KEIL
  85927. "muls r7, r6, r7\n\t"
  85928. #elif defined(__clang__)
  85929. "muls r7, r6\n\t"
  85930. #else
  85931. "mul r7, r6\n\t"
  85932. #endif
  85933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85934. "adds r3, r3, r7\n\t"
  85935. #else
  85936. "add r3, r3, r7\n\t"
  85937. #endif
  85938. #ifdef WOLFSSL_KEIL
  85939. "adcs r4, r4, %[r]\n\t"
  85940. #elif defined(__clang__)
  85941. "adcs r4, %[r]\n\t"
  85942. #else
  85943. "adc r4, %[r]\n\t"
  85944. #endif
  85945. #ifdef WOLFSSL_KEIL
  85946. "adcs r5, r5, %[r]\n\t"
  85947. #elif defined(__clang__)
  85948. "adcs r5, %[r]\n\t"
  85949. #else
  85950. "adc r5, %[r]\n\t"
  85951. #endif
  85952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85953. "lsrs r7, %[b], #16\n\t"
  85954. #else
  85955. "lsr r7, %[b], #16\n\t"
  85956. #endif
  85957. #ifdef WOLFSSL_KEIL
  85958. "muls r6, r7, r6\n\t"
  85959. #elif defined(__clang__)
  85960. "muls r6, r7\n\t"
  85961. #else
  85962. "mul r6, r7\n\t"
  85963. #endif
  85964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85965. "lsrs r7, r6, #16\n\t"
  85966. #else
  85967. "lsr r7, r6, #16\n\t"
  85968. #endif
  85969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85970. "lsls r6, r6, #16\n\t"
  85971. #else
  85972. "lsl r6, r6, #16\n\t"
  85973. #endif
  85974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85975. "adds r3, r3, r6\n\t"
  85976. #else
  85977. "add r3, r3, r6\n\t"
  85978. #endif
  85979. #ifdef WOLFSSL_KEIL
  85980. "adcs r4, r4, r7\n\t"
  85981. #elif defined(__clang__)
  85982. "adcs r4, r7\n\t"
  85983. #else
  85984. "adc r4, r7\n\t"
  85985. #endif
  85986. #ifdef WOLFSSL_KEIL
  85987. "adcs r5, r5, %[r]\n\t"
  85988. #elif defined(__clang__)
  85989. "adcs r5, %[r]\n\t"
  85990. #else
  85991. "adc r5, %[r]\n\t"
  85992. #endif
  85993. "ldr r6, [%[a]]\n\t"
  85994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85995. "lsrs r6, r6, #16\n\t"
  85996. #else
  85997. "lsr r6, r6, #16\n\t"
  85998. #endif
  85999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86000. "lsrs r7, %[b], #16\n\t"
  86001. #else
  86002. "lsr r7, %[b], #16\n\t"
  86003. #endif
  86004. #ifdef WOLFSSL_KEIL
  86005. "muls r7, r6, r7\n\t"
  86006. #elif defined(__clang__)
  86007. "muls r7, r6\n\t"
  86008. #else
  86009. "mul r7, r6\n\t"
  86010. #endif
  86011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86012. "adds r4, r4, r7\n\t"
  86013. #else
  86014. "add r4, r4, r7\n\t"
  86015. #endif
  86016. #ifdef WOLFSSL_KEIL
  86017. "adcs r5, r5, %[r]\n\t"
  86018. #elif defined(__clang__)
  86019. "adcs r5, %[r]\n\t"
  86020. #else
  86021. "adc r5, %[r]\n\t"
  86022. #endif
  86023. "uxth r7, %[b]\n\t"
  86024. #ifdef WOLFSSL_KEIL
  86025. "muls r6, r7, r6\n\t"
  86026. #elif defined(__clang__)
  86027. "muls r6, r7\n\t"
  86028. #else
  86029. "mul r6, r7\n\t"
  86030. #endif
  86031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86032. "lsrs r7, r6, #16\n\t"
  86033. #else
  86034. "lsr r7, r6, #16\n\t"
  86035. #endif
  86036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86037. "lsls r6, r6, #16\n\t"
  86038. #else
  86039. "lsl r6, r6, #16\n\t"
  86040. #endif
  86041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86042. "adds r3, r3, r6\n\t"
  86043. #else
  86044. "add r3, r3, r6\n\t"
  86045. #endif
  86046. #ifdef WOLFSSL_KEIL
  86047. "adcs r4, r4, r7\n\t"
  86048. #elif defined(__clang__)
  86049. "adcs r4, r7\n\t"
  86050. #else
  86051. "adc r4, r7\n\t"
  86052. #endif
  86053. #ifdef WOLFSSL_KEIL
  86054. "adcs r5, r5, %[r]\n\t"
  86055. #elif defined(__clang__)
  86056. "adcs r5, %[r]\n\t"
  86057. #else
  86058. "adc r5, %[r]\n\t"
  86059. #endif
  86060. "# A[] * B - Done\n\t"
  86061. "mov %[r], r8\n\t"
  86062. "str r3, [%[r]]\n\t"
  86063. "movs r3, r4\n\t"
  86064. "movs r4, r5\n\t"
  86065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86066. "adds %[r], %[r], #4\n\t"
  86067. #else
  86068. "add %[r], %[r], #4\n\t"
  86069. #endif
  86070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86071. "adds %[a], %[a], #4\n\t"
  86072. #else
  86073. "add %[a], %[a], #4\n\t"
  86074. #endif
  86075. "mov r8, %[r]\n\t"
  86076. "cmp %[a], r9\n\t"
  86077. "blt L_sp_4096_mul_d_128_%=\n\t"
  86078. "str r3, [%[r]]\n\t"
  86079. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  86080. :
  86081. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  86082. );
  86083. }
  86084. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  86085. /* r = 2^n mod m where n is the number of bits to reduce by.
  86086. * Given m must be 4096 bits, just need to subtract.
  86087. *
  86088. * r A single precision number.
  86089. * m A single precision number.
  86090. */
  86091. static void sp_4096_mont_norm_128(sp_digit* r, const sp_digit* m)
  86092. {
  86093. XMEMSET(r, 0, sizeof(sp_digit) * 128);
  86094. /* r = 2^n mod m */
  86095. sp_4096_sub_in_place_128(r, m);
  86096. }
  86097. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  86098. /* Conditionally subtract b from a using the mask m.
  86099. * m is -1 to subtract and 0 when not copying.
  86100. *
  86101. * r A single precision number representing condition subtract result.
  86102. * a A single precision number to subtract from.
  86103. * b A single precision number to subtract.
  86104. * m Mask value to apply.
  86105. */
  86106. SP_NOINLINE static sp_digit sp_4096_cond_sub_128(sp_digit* r, const sp_digit* a,
  86107. const sp_digit* b, sp_digit m)
  86108. {
  86109. __asm__ __volatile__ (
  86110. "movs r4, #0\n\t"
  86111. "movs r5, #2\n\t"
  86112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86113. "lsls r5, r5, #8\n\t"
  86114. #else
  86115. "lsl r5, r5, #8\n\t"
  86116. #endif
  86117. "mov r8, r5\n\t"
  86118. "movs r7, #0\n\t"
  86119. "\n"
  86120. "L_sp_4096_cond_sub_128_words_%=:\n\t"
  86121. "ldr r6, [%[b], r7]\n\t"
  86122. #ifdef WOLFSSL_KEIL
  86123. "ands r6, r6, %[m]\n\t"
  86124. #elif defined(__clang__)
  86125. "ands r6, %[m]\n\t"
  86126. #else
  86127. "and r6, %[m]\n\t"
  86128. #endif
  86129. "movs r5, #0\n\t"
  86130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86131. "subs r5, r5, r4\n\t"
  86132. #else
  86133. "sub r5, r5, r4\n\t"
  86134. #endif
  86135. "ldr r5, [%[a], r7]\n\t"
  86136. #ifdef WOLFSSL_KEIL
  86137. "sbcs r5, r5, r6\n\t"
  86138. #elif defined(__clang__)
  86139. "sbcs r5, r6\n\t"
  86140. #else
  86141. "sbc r5, r6\n\t"
  86142. #endif
  86143. #ifdef WOLFSSL_KEIL
  86144. "sbcs r4, r4, r4\n\t"
  86145. #elif defined(__clang__)
  86146. "sbcs r4, r4\n\t"
  86147. #else
  86148. "sbc r4, r4\n\t"
  86149. #endif
  86150. "str r5, [%[r], r7]\n\t"
  86151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86152. "adds r7, r7, #4\n\t"
  86153. #else
  86154. "add r7, r7, #4\n\t"
  86155. #endif
  86156. "cmp r7, r8\n\t"
  86157. "blt L_sp_4096_cond_sub_128_words_%=\n\t"
  86158. "movs %[r], r4\n\t"
  86159. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  86160. :
  86161. : "memory", "r4", "r5", "r6", "r7", "r8"
  86162. );
  86163. return (uint32_t)(size_t)r;
  86164. }
  86165. /* Reduce the number back to 4096 bits using Montgomery reduction.
  86166. *
  86167. * a A single precision number to reduce in place.
  86168. * m The single precision number representing the modulus.
  86169. * mp The digit representing the negative inverse of m mod 2^n.
  86170. */
  86171. SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a, const sp_digit* m,
  86172. sp_digit mp)
  86173. {
  86174. __asm__ __volatile__ (
  86175. "movs r7, #0\n\t"
  86176. "mov r8, %[mp]\n\t"
  86177. "mov r12, r7\n\t"
  86178. "mov lr, %[m]\n\t"
  86179. "mov r9, %[a]\n\t"
  86180. "mov r11, %[a]\n\t"
  86181. "movs r5, #0xff\n\t"
  86182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86183. "adds r5, r5, #0xfd\n\t"
  86184. #else
  86185. "add r5, r5, #0xfd\n\t"
  86186. #endif
  86187. "movs r6, #2\n\t"
  86188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86189. "lsls r6, r6, #8\n\t"
  86190. #else
  86191. "lsl r6, r6, #8\n\t"
  86192. #endif
  86193. "add r9, r9, r5\n\t"
  86194. "add r11, r11, r6\n\t"
  86195. "\n"
  86196. "L_sp_4096_mont_reduce_128_mod_%=:\n\t"
  86197. "movs r7, #0\n\t"
  86198. "movs r4, #0\n\t"
  86199. "# a[i] += m[0] * mu\n\t"
  86200. "ldm %[m]!, {%[mp]}\n\t"
  86201. "ldm %[a]!, {r3}\n\t"
  86202. "# mu = a[i] * mp\n\t"
  86203. "mov r5, r8\n\t"
  86204. #ifdef WOLFSSL_KEIL
  86205. "muls r5, r3, r5\n\t"
  86206. #elif defined(__clang__)
  86207. "muls r5, r3\n\t"
  86208. #else
  86209. "mul r5, r3\n\t"
  86210. #endif
  86211. "mov r10, r5\n\t"
  86212. "# Multiply m[0] and mu - Start\n\t"
  86213. "mov r5, r10\n\t"
  86214. "uxth r6, %[mp]\n\t"
  86215. "uxth r5, r5\n\t"
  86216. #ifdef WOLFSSL_KEIL
  86217. "muls r6, r5, r6\n\t"
  86218. #elif defined(__clang__)
  86219. "muls r6, r5\n\t"
  86220. #else
  86221. "mul r6, r5\n\t"
  86222. #endif
  86223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86224. "adds r3, r3, r6\n\t"
  86225. #else
  86226. "add r3, r3, r6\n\t"
  86227. #endif
  86228. #ifdef WOLFSSL_KEIL
  86229. "adcs r4, r4, r7\n\t"
  86230. #elif defined(__clang__)
  86231. "adcs r4, r7\n\t"
  86232. #else
  86233. "adc r4, r7\n\t"
  86234. #endif
  86235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86236. "lsrs r6, %[mp], #16\n\t"
  86237. #else
  86238. "lsr r6, %[mp], #16\n\t"
  86239. #endif
  86240. #ifdef WOLFSSL_KEIL
  86241. "muls r5, r6, r5\n\t"
  86242. #elif defined(__clang__)
  86243. "muls r5, r6\n\t"
  86244. #else
  86245. "mul r5, r6\n\t"
  86246. #endif
  86247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86248. "lsrs r6, r5, #16\n\t"
  86249. #else
  86250. "lsr r6, r5, #16\n\t"
  86251. #endif
  86252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86253. "lsls r5, r5, #16\n\t"
  86254. #else
  86255. "lsl r5, r5, #16\n\t"
  86256. #endif
  86257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86258. "adds r3, r3, r5\n\t"
  86259. #else
  86260. "add r3, r3, r5\n\t"
  86261. #endif
  86262. #ifdef WOLFSSL_KEIL
  86263. "adcs r4, r4, r6\n\t"
  86264. #elif defined(__clang__)
  86265. "adcs r4, r6\n\t"
  86266. #else
  86267. "adc r4, r6\n\t"
  86268. #endif
  86269. "mov r5, r10\n\t"
  86270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86271. "lsrs r6, %[mp], #16\n\t"
  86272. #else
  86273. "lsr r6, %[mp], #16\n\t"
  86274. #endif
  86275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86276. "lsrs r5, r5, #16\n\t"
  86277. #else
  86278. "lsr r5, r5, #16\n\t"
  86279. #endif
  86280. #ifdef WOLFSSL_KEIL
  86281. "muls r6, r5, r6\n\t"
  86282. #elif defined(__clang__)
  86283. "muls r6, r5\n\t"
  86284. #else
  86285. "mul r6, r5\n\t"
  86286. #endif
  86287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86288. "adds r4, r4, r6\n\t"
  86289. #else
  86290. "add r4, r4, r6\n\t"
  86291. #endif
  86292. "uxth r6, %[mp]\n\t"
  86293. #ifdef WOLFSSL_KEIL
  86294. "muls r5, r6, r5\n\t"
  86295. #elif defined(__clang__)
  86296. "muls r5, r6\n\t"
  86297. #else
  86298. "mul r5, r6\n\t"
  86299. #endif
  86300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86301. "lsrs r6, r5, #16\n\t"
  86302. #else
  86303. "lsr r6, r5, #16\n\t"
  86304. #endif
  86305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86306. "lsls r5, r5, #16\n\t"
  86307. #else
  86308. "lsl r5, r5, #16\n\t"
  86309. #endif
  86310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86311. "adds r3, r3, r5\n\t"
  86312. #else
  86313. "add r3, r3, r5\n\t"
  86314. #endif
  86315. #ifdef WOLFSSL_KEIL
  86316. "adcs r4, r4, r6\n\t"
  86317. #elif defined(__clang__)
  86318. "adcs r4, r6\n\t"
  86319. #else
  86320. "adc r4, r6\n\t"
  86321. #endif
  86322. "# Multiply m[0] and mu - Done\n\t"
  86323. "\n"
  86324. "L_sp_4096_mont_reduce_128_word_%=:\n\t"
  86325. "# a[i+j] += m[j] * mu\n\t"
  86326. "ldr r3, [%[a]]\n\t"
  86327. "ldm %[m]!, {%[mp]}\n\t"
  86328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86329. "adds r3, r3, r4\n\t"
  86330. #else
  86331. "add r3, r3, r4\n\t"
  86332. #endif
  86333. "movs r4, #0\n\t"
  86334. #ifdef WOLFSSL_KEIL
  86335. "adcs r4, r4, r7\n\t"
  86336. #elif defined(__clang__)
  86337. "adcs r4, r7\n\t"
  86338. #else
  86339. "adc r4, r7\n\t"
  86340. #endif
  86341. "# Multiply m[j] and mu - Start\n\t"
  86342. "mov r5, r10\n\t"
  86343. "uxth r6, %[mp]\n\t"
  86344. "uxth r5, r5\n\t"
  86345. #ifdef WOLFSSL_KEIL
  86346. "muls r6, r5, r6\n\t"
  86347. #elif defined(__clang__)
  86348. "muls r6, r5\n\t"
  86349. #else
  86350. "mul r6, r5\n\t"
  86351. #endif
  86352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86353. "adds r3, r3, r6\n\t"
  86354. #else
  86355. "add r3, r3, r6\n\t"
  86356. #endif
  86357. #ifdef WOLFSSL_KEIL
  86358. "adcs r4, r4, r7\n\t"
  86359. #elif defined(__clang__)
  86360. "adcs r4, r7\n\t"
  86361. #else
  86362. "adc r4, r7\n\t"
  86363. #endif
  86364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86365. "lsrs r6, %[mp], #16\n\t"
  86366. #else
  86367. "lsr r6, %[mp], #16\n\t"
  86368. #endif
  86369. #ifdef WOLFSSL_KEIL
  86370. "muls r5, r6, r5\n\t"
  86371. #elif defined(__clang__)
  86372. "muls r5, r6\n\t"
  86373. #else
  86374. "mul r5, r6\n\t"
  86375. #endif
  86376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86377. "lsrs r6, r5, #16\n\t"
  86378. #else
  86379. "lsr r6, r5, #16\n\t"
  86380. #endif
  86381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86382. "lsls r5, r5, #16\n\t"
  86383. #else
  86384. "lsl r5, r5, #16\n\t"
  86385. #endif
  86386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86387. "adds r3, r3, r5\n\t"
  86388. #else
  86389. "add r3, r3, r5\n\t"
  86390. #endif
  86391. #ifdef WOLFSSL_KEIL
  86392. "adcs r4, r4, r6\n\t"
  86393. #elif defined(__clang__)
  86394. "adcs r4, r6\n\t"
  86395. #else
  86396. "adc r4, r6\n\t"
  86397. #endif
  86398. "mov r5, r10\n\t"
  86399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86400. "lsrs r6, %[mp], #16\n\t"
  86401. #else
  86402. "lsr r6, %[mp], #16\n\t"
  86403. #endif
  86404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86405. "lsrs r5, r5, #16\n\t"
  86406. #else
  86407. "lsr r5, r5, #16\n\t"
  86408. #endif
  86409. #ifdef WOLFSSL_KEIL
  86410. "muls r6, r5, r6\n\t"
  86411. #elif defined(__clang__)
  86412. "muls r6, r5\n\t"
  86413. #else
  86414. "mul r6, r5\n\t"
  86415. #endif
  86416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86417. "adds r4, r4, r6\n\t"
  86418. #else
  86419. "add r4, r4, r6\n\t"
  86420. #endif
  86421. "uxth r6, %[mp]\n\t"
  86422. #ifdef WOLFSSL_KEIL
  86423. "muls r5, r6, r5\n\t"
  86424. #elif defined(__clang__)
  86425. "muls r5, r6\n\t"
  86426. #else
  86427. "mul r5, r6\n\t"
  86428. #endif
  86429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86430. "lsrs r6, r5, #16\n\t"
  86431. #else
  86432. "lsr r6, r5, #16\n\t"
  86433. #endif
  86434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86435. "lsls r5, r5, #16\n\t"
  86436. #else
  86437. "lsl r5, r5, #16\n\t"
  86438. #endif
  86439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86440. "adds r3, r3, r5\n\t"
  86441. #else
  86442. "add r3, r3, r5\n\t"
  86443. #endif
  86444. #ifdef WOLFSSL_KEIL
  86445. "adcs r4, r4, r6\n\t"
  86446. #elif defined(__clang__)
  86447. "adcs r4, r6\n\t"
  86448. #else
  86449. "adc r4, r6\n\t"
  86450. #endif
  86451. "# Multiply m[j] and mu - Done\n\t"
  86452. "stm %[a]!, {r3}\n\t"
  86453. "cmp %[a], r9\n\t"
  86454. "blt L_sp_4096_mont_reduce_128_word_%=\n\t"
  86455. "# a[i+127] += m[127] * mu\n\t"
  86456. "ldr %[mp], [%[m]]\n\t"
  86457. "mov r3, r12\n\t"
  86458. "# Multiply m[127] and mu - Start\n\t"
  86459. "mov r5, r10\n\t"
  86460. "uxth r6, %[mp]\n\t"
  86461. "uxth r5, r5\n\t"
  86462. #ifdef WOLFSSL_KEIL
  86463. "muls r6, r5, r6\n\t"
  86464. #elif defined(__clang__)
  86465. "muls r6, r5\n\t"
  86466. #else
  86467. "mul r6, r5\n\t"
  86468. #endif
  86469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86470. "adds r4, r4, r6\n\t"
  86471. #else
  86472. "add r4, r4, r6\n\t"
  86473. #endif
  86474. #ifdef WOLFSSL_KEIL
  86475. "adcs r3, r3, r7\n\t"
  86476. #elif defined(__clang__)
  86477. "adcs r3, r7\n\t"
  86478. #else
  86479. "adc r3, r7\n\t"
  86480. #endif
  86481. #ifdef WOLFSSL_KEIL
  86482. "adcs r7, r7, r7\n\t"
  86483. #elif defined(__clang__)
  86484. "adcs r7, r7\n\t"
  86485. #else
  86486. "adc r7, r7\n\t"
  86487. #endif
  86488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86489. "lsrs r6, %[mp], #16\n\t"
  86490. #else
  86491. "lsr r6, %[mp], #16\n\t"
  86492. #endif
  86493. #ifdef WOLFSSL_KEIL
  86494. "muls r5, r6, r5\n\t"
  86495. #elif defined(__clang__)
  86496. "muls r5, r6\n\t"
  86497. #else
  86498. "mul r5, r6\n\t"
  86499. #endif
  86500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86501. "lsrs r6, r5, #16\n\t"
  86502. #else
  86503. "lsr r6, r5, #16\n\t"
  86504. #endif
  86505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86506. "lsls r5, r5, #16\n\t"
  86507. #else
  86508. "lsl r5, r5, #16\n\t"
  86509. #endif
  86510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86511. "adds r4, r4, r5\n\t"
  86512. #else
  86513. "add r4, r4, r5\n\t"
  86514. #endif
  86515. #ifdef WOLFSSL_KEIL
  86516. "adcs r3, r3, r6\n\t"
  86517. #elif defined(__clang__)
  86518. "adcs r3, r6\n\t"
  86519. #else
  86520. "adc r3, r6\n\t"
  86521. #endif
  86522. #ifdef WOLFSSL_KEIL
  86523. "adcs r7, r7, r7\n\t"
  86524. #elif defined(__clang__)
  86525. "adcs r7, r7\n\t"
  86526. #else
  86527. "adc r7, r7\n\t"
  86528. #endif
  86529. "mov r5, r10\n\t"
  86530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86531. "lsrs r6, %[mp], #16\n\t"
  86532. #else
  86533. "lsr r6, %[mp], #16\n\t"
  86534. #endif
  86535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86536. "lsrs r5, r5, #16\n\t"
  86537. #else
  86538. "lsr r5, r5, #16\n\t"
  86539. #endif
  86540. #ifdef WOLFSSL_KEIL
  86541. "muls r6, r5, r6\n\t"
  86542. #elif defined(__clang__)
  86543. "muls r6, r5\n\t"
  86544. #else
  86545. "mul r6, r5\n\t"
  86546. #endif
  86547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86548. "adds r3, r3, r6\n\t"
  86549. #else
  86550. "add r3, r3, r6\n\t"
  86551. #endif
  86552. #ifdef WOLFSSL_KEIL
  86553. "adcs r7, r7, r7\n\t"
  86554. #elif defined(__clang__)
  86555. "adcs r7, r7\n\t"
  86556. #else
  86557. "adc r7, r7\n\t"
  86558. #endif
  86559. "uxth r6, %[mp]\n\t"
  86560. #ifdef WOLFSSL_KEIL
  86561. "muls r5, r6, r5\n\t"
  86562. #elif defined(__clang__)
  86563. "muls r5, r6\n\t"
  86564. #else
  86565. "mul r5, r6\n\t"
  86566. #endif
  86567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86568. "lsrs r6, r5, #16\n\t"
  86569. #else
  86570. "lsr r6, r5, #16\n\t"
  86571. #endif
  86572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86573. "lsls r5, r5, #16\n\t"
  86574. #else
  86575. "lsl r5, r5, #16\n\t"
  86576. #endif
  86577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86578. "adds r4, r4, r5\n\t"
  86579. #else
  86580. "add r4, r4, r5\n\t"
  86581. #endif
  86582. #ifdef WOLFSSL_KEIL
  86583. "adcs r3, r3, r6\n\t"
  86584. #elif defined(__clang__)
  86585. "adcs r3, r6\n\t"
  86586. #else
  86587. "adc r3, r6\n\t"
  86588. #endif
  86589. #ifdef WOLFSSL_KEIL
  86590. "adcs r7, r7, r7\n\t"
  86591. #elif defined(__clang__)
  86592. "adcs r7, r7\n\t"
  86593. #else
  86594. "adc r7, r7\n\t"
  86595. #endif
  86596. "# Multiply m[127] and mu - Done\n\t"
  86597. "ldr r5, [%[a]]\n\t"
  86598. "ldr r6, [%[a], #4]\n\t"
  86599. "movs %[mp], #0\n\t"
  86600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86601. "adds r5, r5, r4\n\t"
  86602. #else
  86603. "add r5, r5, r4\n\t"
  86604. #endif
  86605. #ifdef WOLFSSL_KEIL
  86606. "adcs r6, r6, r3\n\t"
  86607. #elif defined(__clang__)
  86608. "adcs r6, r3\n\t"
  86609. #else
  86610. "adc r6, r3\n\t"
  86611. #endif
  86612. #ifdef WOLFSSL_KEIL
  86613. "adcs r7, r7, %[mp]\n\t"
  86614. #elif defined(__clang__)
  86615. "adcs r7, %[mp]\n\t"
  86616. #else
  86617. "adc r7, %[mp]\n\t"
  86618. #endif
  86619. "stm %[a]!, {r5, r6}\n\t"
  86620. "# i += 1\n\t"
  86621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86622. "subs %[a], %[a], #4\n\t"
  86623. #else
  86624. "sub %[a], %[a], #4\n\t"
  86625. #endif
  86626. "movs r3, #0xff\n\t"
  86627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86628. "adds r3, r3, #0xfd\n\t"
  86629. #else
  86630. "add r3, r3, #0xfd\n\t"
  86631. #endif
  86632. "mov r9, %[a]\n\t"
  86633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86634. "subs %[a], %[a], r3\n\t"
  86635. #else
  86636. "sub %[a], %[a], r3\n\t"
  86637. #endif
  86638. "mov r12, r7\n\t"
  86639. "mov %[m], lr\n\t"
  86640. "cmp r11, %[a]\n\t"
  86641. "bgt L_sp_4096_mont_reduce_128_mod_%=\n\t"
  86642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86643. "negs r7, r7\n\t"
  86644. #else
  86645. "neg r7, r7\n\t"
  86646. #endif
  86647. "# Subtract masked modulus\n\t"
  86648. "movs r4, #2\n\t"
  86649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86650. "lsls r4, r4, #8\n\t"
  86651. #else
  86652. "lsl r4, r4, #8\n\t"
  86653. #endif
  86654. "movs %[mp], #0\n\t"
  86655. "movs r3, #0\n\t"
  86656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86657. "subs %[a], %[a], r4\n\t"
  86658. #else
  86659. "sub %[a], %[a], r4\n\t"
  86660. #endif
  86661. #ifndef WOLFSSL_SP_LARGE_CODE
  86662. "\n"
  86663. "L_sp_4096_mont_reduce_128_sub_mask_%=:\n\t"
  86664. "ldm %[m]!, {r6}\n\t"
  86665. "movs r5, #0\n\t"
  86666. #ifdef WOLFSSL_KEIL
  86667. "ands r6, r6, r7\n\t"
  86668. #elif defined(__clang__)
  86669. "ands r6, r7\n\t"
  86670. #else
  86671. "and r6, r7\n\t"
  86672. #endif
  86673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86674. "subs r5, r5, %[mp]\n\t"
  86675. #else
  86676. "sub r5, r5, %[mp]\n\t"
  86677. #endif
  86678. "ldr r5, [%[a], r4]\n\t"
  86679. #ifdef WOLFSSL_KEIL
  86680. "sbcs r5, r5, r6\n\t"
  86681. #elif defined(__clang__)
  86682. "sbcs r5, r6\n\t"
  86683. #else
  86684. "sbc r5, r6\n\t"
  86685. #endif
  86686. #ifdef WOLFSSL_KEIL
  86687. "sbcs %[mp], %[mp], %[mp]\n\t"
  86688. #elif defined(__clang__)
  86689. "sbcs %[mp], %[mp]\n\t"
  86690. #else
  86691. "sbc %[mp], %[mp]\n\t"
  86692. #endif
  86693. "stm %[a]!, {r5}\n\t"
  86694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86695. "adds r3, r3, #4\n\t"
  86696. #else
  86697. "add r3, r3, #4\n\t"
  86698. #endif
  86699. "cmp r3, r4\n\t"
  86700. "blt L_sp_4096_mont_reduce_128_sub_mask_%=\n\t"
  86701. #else /* WOLFSSL_SP_LARGE_CODE */
  86702. "ldm %[m]!, {r6}\n\t"
  86703. #ifdef WOLFSSL_KEIL
  86704. "ands r6, r6, r7\n\t"
  86705. #elif defined(__clang__)
  86706. "ands r6, r7\n\t"
  86707. #else
  86708. "and r6, r7\n\t"
  86709. #endif
  86710. "ldr r5, [%[a], r4]\n\t"
  86711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86712. "subs r5, r5, r6\n\t"
  86713. #else
  86714. "sub r5, r5, r6\n\t"
  86715. #endif
  86716. "stm %[a]!, {r5}\n\t"
  86717. "ldm %[m]!, {r6}\n\t"
  86718. #ifdef WOLFSSL_KEIL
  86719. "ands r6, r6, r7\n\t"
  86720. #elif defined(__clang__)
  86721. "ands r6, r7\n\t"
  86722. #else
  86723. "and r6, r7\n\t"
  86724. #endif
  86725. "ldr r5, [%[a], r4]\n\t"
  86726. #ifdef WOLFSSL_KEIL
  86727. "sbcs r5, r5, r6\n\t"
  86728. #elif defined(__clang__)
  86729. "sbcs r5, r6\n\t"
  86730. #else
  86731. "sbc r5, r6\n\t"
  86732. #endif
  86733. "stm %[a]!, {r5}\n\t"
  86734. "ldm %[m]!, {r6}\n\t"
  86735. #ifdef WOLFSSL_KEIL
  86736. "ands r6, r6, r7\n\t"
  86737. #elif defined(__clang__)
  86738. "ands r6, r7\n\t"
  86739. #else
  86740. "and r6, r7\n\t"
  86741. #endif
  86742. "ldr r5, [%[a], r4]\n\t"
  86743. #ifdef WOLFSSL_KEIL
  86744. "sbcs r5, r5, r6\n\t"
  86745. #elif defined(__clang__)
  86746. "sbcs r5, r6\n\t"
  86747. #else
  86748. "sbc r5, r6\n\t"
  86749. #endif
  86750. "stm %[a]!, {r5}\n\t"
  86751. "ldm %[m]!, {r6}\n\t"
  86752. #ifdef WOLFSSL_KEIL
  86753. "ands r6, r6, r7\n\t"
  86754. #elif defined(__clang__)
  86755. "ands r6, r7\n\t"
  86756. #else
  86757. "and r6, r7\n\t"
  86758. #endif
  86759. "ldr r5, [%[a], r4]\n\t"
  86760. #ifdef WOLFSSL_KEIL
  86761. "sbcs r5, r5, r6\n\t"
  86762. #elif defined(__clang__)
  86763. "sbcs r5, r6\n\t"
  86764. #else
  86765. "sbc r5, r6\n\t"
  86766. #endif
  86767. "stm %[a]!, {r5}\n\t"
  86768. "ldm %[m]!, {r6}\n\t"
  86769. #ifdef WOLFSSL_KEIL
  86770. "ands r6, r6, r7\n\t"
  86771. #elif defined(__clang__)
  86772. "ands r6, r7\n\t"
  86773. #else
  86774. "and r6, r7\n\t"
  86775. #endif
  86776. "ldr r5, [%[a], r4]\n\t"
  86777. #ifdef WOLFSSL_KEIL
  86778. "sbcs r5, r5, r6\n\t"
  86779. #elif defined(__clang__)
  86780. "sbcs r5, r6\n\t"
  86781. #else
  86782. "sbc r5, r6\n\t"
  86783. #endif
  86784. "stm %[a]!, {r5}\n\t"
  86785. "ldm %[m]!, {r6}\n\t"
  86786. #ifdef WOLFSSL_KEIL
  86787. "ands r6, r6, r7\n\t"
  86788. #elif defined(__clang__)
  86789. "ands r6, r7\n\t"
  86790. #else
  86791. "and r6, r7\n\t"
  86792. #endif
  86793. "ldr r5, [%[a], r4]\n\t"
  86794. #ifdef WOLFSSL_KEIL
  86795. "sbcs r5, r5, r6\n\t"
  86796. #elif defined(__clang__)
  86797. "sbcs r5, r6\n\t"
  86798. #else
  86799. "sbc r5, r6\n\t"
  86800. #endif
  86801. "stm %[a]!, {r5}\n\t"
  86802. "ldm %[m]!, {r6}\n\t"
  86803. #ifdef WOLFSSL_KEIL
  86804. "ands r6, r6, r7\n\t"
  86805. #elif defined(__clang__)
  86806. "ands r6, r7\n\t"
  86807. #else
  86808. "and r6, r7\n\t"
  86809. #endif
  86810. "ldr r5, [%[a], r4]\n\t"
  86811. #ifdef WOLFSSL_KEIL
  86812. "sbcs r5, r5, r6\n\t"
  86813. #elif defined(__clang__)
  86814. "sbcs r5, r6\n\t"
  86815. #else
  86816. "sbc r5, r6\n\t"
  86817. #endif
  86818. "stm %[a]!, {r5}\n\t"
  86819. "ldm %[m]!, {r6}\n\t"
  86820. #ifdef WOLFSSL_KEIL
  86821. "ands r6, r6, r7\n\t"
  86822. #elif defined(__clang__)
  86823. "ands r6, r7\n\t"
  86824. #else
  86825. "and r6, r7\n\t"
  86826. #endif
  86827. "ldr r5, [%[a], r4]\n\t"
  86828. #ifdef WOLFSSL_KEIL
  86829. "sbcs r5, r5, r6\n\t"
  86830. #elif defined(__clang__)
  86831. "sbcs r5, r6\n\t"
  86832. #else
  86833. "sbc r5, r6\n\t"
  86834. #endif
  86835. "stm %[a]!, {r5}\n\t"
  86836. "ldm %[m]!, {r6}\n\t"
  86837. #ifdef WOLFSSL_KEIL
  86838. "ands r6, r6, r7\n\t"
  86839. #elif defined(__clang__)
  86840. "ands r6, r7\n\t"
  86841. #else
  86842. "and r6, r7\n\t"
  86843. #endif
  86844. "ldr r5, [%[a], r4]\n\t"
  86845. #ifdef WOLFSSL_KEIL
  86846. "sbcs r5, r5, r6\n\t"
  86847. #elif defined(__clang__)
  86848. "sbcs r5, r6\n\t"
  86849. #else
  86850. "sbc r5, r6\n\t"
  86851. #endif
  86852. "stm %[a]!, {r5}\n\t"
  86853. "ldm %[m]!, {r6}\n\t"
  86854. #ifdef WOLFSSL_KEIL
  86855. "ands r6, r6, r7\n\t"
  86856. #elif defined(__clang__)
  86857. "ands r6, r7\n\t"
  86858. #else
  86859. "and r6, r7\n\t"
  86860. #endif
  86861. "ldr r5, [%[a], r4]\n\t"
  86862. #ifdef WOLFSSL_KEIL
  86863. "sbcs r5, r5, r6\n\t"
  86864. #elif defined(__clang__)
  86865. "sbcs r5, r6\n\t"
  86866. #else
  86867. "sbc r5, r6\n\t"
  86868. #endif
  86869. "stm %[a]!, {r5}\n\t"
  86870. "ldm %[m]!, {r6}\n\t"
  86871. #ifdef WOLFSSL_KEIL
  86872. "ands r6, r6, r7\n\t"
  86873. #elif defined(__clang__)
  86874. "ands r6, r7\n\t"
  86875. #else
  86876. "and r6, r7\n\t"
  86877. #endif
  86878. "ldr r5, [%[a], r4]\n\t"
  86879. #ifdef WOLFSSL_KEIL
  86880. "sbcs r5, r5, r6\n\t"
  86881. #elif defined(__clang__)
  86882. "sbcs r5, r6\n\t"
  86883. #else
  86884. "sbc r5, r6\n\t"
  86885. #endif
  86886. "stm %[a]!, {r5}\n\t"
  86887. "ldm %[m]!, {r6}\n\t"
  86888. #ifdef WOLFSSL_KEIL
  86889. "ands r6, r6, r7\n\t"
  86890. #elif defined(__clang__)
  86891. "ands r6, r7\n\t"
  86892. #else
  86893. "and r6, r7\n\t"
  86894. #endif
  86895. "ldr r5, [%[a], r4]\n\t"
  86896. #ifdef WOLFSSL_KEIL
  86897. "sbcs r5, r5, r6\n\t"
  86898. #elif defined(__clang__)
  86899. "sbcs r5, r6\n\t"
  86900. #else
  86901. "sbc r5, r6\n\t"
  86902. #endif
  86903. "stm %[a]!, {r5}\n\t"
  86904. "ldm %[m]!, {r6}\n\t"
  86905. #ifdef WOLFSSL_KEIL
  86906. "ands r6, r6, r7\n\t"
  86907. #elif defined(__clang__)
  86908. "ands r6, r7\n\t"
  86909. #else
  86910. "and r6, r7\n\t"
  86911. #endif
  86912. "ldr r5, [%[a], r4]\n\t"
  86913. #ifdef WOLFSSL_KEIL
  86914. "sbcs r5, r5, r6\n\t"
  86915. #elif defined(__clang__)
  86916. "sbcs r5, r6\n\t"
  86917. #else
  86918. "sbc r5, r6\n\t"
  86919. #endif
  86920. "stm %[a]!, {r5}\n\t"
  86921. "ldm %[m]!, {r6}\n\t"
  86922. #ifdef WOLFSSL_KEIL
  86923. "ands r6, r6, r7\n\t"
  86924. #elif defined(__clang__)
  86925. "ands r6, r7\n\t"
  86926. #else
  86927. "and r6, r7\n\t"
  86928. #endif
  86929. "ldr r5, [%[a], r4]\n\t"
  86930. #ifdef WOLFSSL_KEIL
  86931. "sbcs r5, r5, r6\n\t"
  86932. #elif defined(__clang__)
  86933. "sbcs r5, r6\n\t"
  86934. #else
  86935. "sbc r5, r6\n\t"
  86936. #endif
  86937. "stm %[a]!, {r5}\n\t"
  86938. "ldm %[m]!, {r6}\n\t"
  86939. #ifdef WOLFSSL_KEIL
  86940. "ands r6, r6, r7\n\t"
  86941. #elif defined(__clang__)
  86942. "ands r6, r7\n\t"
  86943. #else
  86944. "and r6, r7\n\t"
  86945. #endif
  86946. "ldr r5, [%[a], r4]\n\t"
  86947. #ifdef WOLFSSL_KEIL
  86948. "sbcs r5, r5, r6\n\t"
  86949. #elif defined(__clang__)
  86950. "sbcs r5, r6\n\t"
  86951. #else
  86952. "sbc r5, r6\n\t"
  86953. #endif
  86954. "stm %[a]!, {r5}\n\t"
  86955. "ldm %[m]!, {r6}\n\t"
  86956. #ifdef WOLFSSL_KEIL
  86957. "ands r6, r6, r7\n\t"
  86958. #elif defined(__clang__)
  86959. "ands r6, r7\n\t"
  86960. #else
  86961. "and r6, r7\n\t"
  86962. #endif
  86963. "ldr r5, [%[a], r4]\n\t"
  86964. #ifdef WOLFSSL_KEIL
  86965. "sbcs r5, r5, r6\n\t"
  86966. #elif defined(__clang__)
  86967. "sbcs r5, r6\n\t"
  86968. #else
  86969. "sbc r5, r6\n\t"
  86970. #endif
  86971. "stm %[a]!, {r5}\n\t"
  86972. "ldm %[m]!, {r6}\n\t"
  86973. #ifdef WOLFSSL_KEIL
  86974. "ands r6, r6, r7\n\t"
  86975. #elif defined(__clang__)
  86976. "ands r6, r7\n\t"
  86977. #else
  86978. "and r6, r7\n\t"
  86979. #endif
  86980. "ldr r5, [%[a], r4]\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. "stm %[a]!, {r5}\n\t"
  86989. "ldm %[m]!, {r6}\n\t"
  86990. #ifdef WOLFSSL_KEIL
  86991. "ands r6, r6, r7\n\t"
  86992. #elif defined(__clang__)
  86993. "ands r6, r7\n\t"
  86994. #else
  86995. "and r6, r7\n\t"
  86996. #endif
  86997. "ldr r5, [%[a], r4]\n\t"
  86998. #ifdef WOLFSSL_KEIL
  86999. "sbcs r5, r5, r6\n\t"
  87000. #elif defined(__clang__)
  87001. "sbcs r5, r6\n\t"
  87002. #else
  87003. "sbc r5, r6\n\t"
  87004. #endif
  87005. "stm %[a]!, {r5}\n\t"
  87006. "ldm %[m]!, {r6}\n\t"
  87007. #ifdef WOLFSSL_KEIL
  87008. "ands r6, r6, r7\n\t"
  87009. #elif defined(__clang__)
  87010. "ands r6, r7\n\t"
  87011. #else
  87012. "and r6, r7\n\t"
  87013. #endif
  87014. "ldr r5, [%[a], r4]\n\t"
  87015. #ifdef WOLFSSL_KEIL
  87016. "sbcs r5, r5, r6\n\t"
  87017. #elif defined(__clang__)
  87018. "sbcs r5, r6\n\t"
  87019. #else
  87020. "sbc r5, r6\n\t"
  87021. #endif
  87022. "stm %[a]!, {r5}\n\t"
  87023. "ldm %[m]!, {r6}\n\t"
  87024. #ifdef WOLFSSL_KEIL
  87025. "ands r6, r6, r7\n\t"
  87026. #elif defined(__clang__)
  87027. "ands r6, r7\n\t"
  87028. #else
  87029. "and r6, r7\n\t"
  87030. #endif
  87031. "ldr r5, [%[a], r4]\n\t"
  87032. #ifdef WOLFSSL_KEIL
  87033. "sbcs r5, r5, r6\n\t"
  87034. #elif defined(__clang__)
  87035. "sbcs r5, r6\n\t"
  87036. #else
  87037. "sbc r5, r6\n\t"
  87038. #endif
  87039. "stm %[a]!, {r5}\n\t"
  87040. "ldm %[m]!, {r6}\n\t"
  87041. #ifdef WOLFSSL_KEIL
  87042. "ands r6, r6, r7\n\t"
  87043. #elif defined(__clang__)
  87044. "ands r6, r7\n\t"
  87045. #else
  87046. "and r6, r7\n\t"
  87047. #endif
  87048. "ldr r5, [%[a], r4]\n\t"
  87049. #ifdef WOLFSSL_KEIL
  87050. "sbcs r5, r5, r6\n\t"
  87051. #elif defined(__clang__)
  87052. "sbcs r5, r6\n\t"
  87053. #else
  87054. "sbc r5, r6\n\t"
  87055. #endif
  87056. "stm %[a]!, {r5}\n\t"
  87057. "ldm %[m]!, {r6}\n\t"
  87058. #ifdef WOLFSSL_KEIL
  87059. "ands r6, r6, r7\n\t"
  87060. #elif defined(__clang__)
  87061. "ands r6, r7\n\t"
  87062. #else
  87063. "and r6, r7\n\t"
  87064. #endif
  87065. "ldr r5, [%[a], r4]\n\t"
  87066. #ifdef WOLFSSL_KEIL
  87067. "sbcs r5, r5, r6\n\t"
  87068. #elif defined(__clang__)
  87069. "sbcs r5, r6\n\t"
  87070. #else
  87071. "sbc r5, r6\n\t"
  87072. #endif
  87073. "stm %[a]!, {r5}\n\t"
  87074. "ldm %[m]!, {r6}\n\t"
  87075. #ifdef WOLFSSL_KEIL
  87076. "ands r6, r6, r7\n\t"
  87077. #elif defined(__clang__)
  87078. "ands r6, r7\n\t"
  87079. #else
  87080. "and r6, r7\n\t"
  87081. #endif
  87082. "ldr r5, [%[a], r4]\n\t"
  87083. #ifdef WOLFSSL_KEIL
  87084. "sbcs r5, r5, r6\n\t"
  87085. #elif defined(__clang__)
  87086. "sbcs r5, r6\n\t"
  87087. #else
  87088. "sbc r5, r6\n\t"
  87089. #endif
  87090. "stm %[a]!, {r5}\n\t"
  87091. "ldm %[m]!, {r6}\n\t"
  87092. #ifdef WOLFSSL_KEIL
  87093. "ands r6, r6, r7\n\t"
  87094. #elif defined(__clang__)
  87095. "ands r6, r7\n\t"
  87096. #else
  87097. "and r6, r7\n\t"
  87098. #endif
  87099. "ldr r5, [%[a], r4]\n\t"
  87100. #ifdef WOLFSSL_KEIL
  87101. "sbcs r5, r5, r6\n\t"
  87102. #elif defined(__clang__)
  87103. "sbcs r5, r6\n\t"
  87104. #else
  87105. "sbc r5, r6\n\t"
  87106. #endif
  87107. "stm %[a]!, {r5}\n\t"
  87108. "ldm %[m]!, {r6}\n\t"
  87109. #ifdef WOLFSSL_KEIL
  87110. "ands r6, r6, r7\n\t"
  87111. #elif defined(__clang__)
  87112. "ands r6, r7\n\t"
  87113. #else
  87114. "and r6, r7\n\t"
  87115. #endif
  87116. "ldr r5, [%[a], r4]\n\t"
  87117. #ifdef WOLFSSL_KEIL
  87118. "sbcs r5, r5, r6\n\t"
  87119. #elif defined(__clang__)
  87120. "sbcs r5, r6\n\t"
  87121. #else
  87122. "sbc r5, r6\n\t"
  87123. #endif
  87124. "stm %[a]!, {r5}\n\t"
  87125. "ldm %[m]!, {r6}\n\t"
  87126. #ifdef WOLFSSL_KEIL
  87127. "ands r6, r6, r7\n\t"
  87128. #elif defined(__clang__)
  87129. "ands r6, r7\n\t"
  87130. #else
  87131. "and r6, r7\n\t"
  87132. #endif
  87133. "ldr r5, [%[a], r4]\n\t"
  87134. #ifdef WOLFSSL_KEIL
  87135. "sbcs r5, r5, r6\n\t"
  87136. #elif defined(__clang__)
  87137. "sbcs r5, r6\n\t"
  87138. #else
  87139. "sbc r5, r6\n\t"
  87140. #endif
  87141. "stm %[a]!, {r5}\n\t"
  87142. "ldm %[m]!, {r6}\n\t"
  87143. #ifdef WOLFSSL_KEIL
  87144. "ands r6, r6, r7\n\t"
  87145. #elif defined(__clang__)
  87146. "ands r6, r7\n\t"
  87147. #else
  87148. "and r6, r7\n\t"
  87149. #endif
  87150. "ldr r5, [%[a], r4]\n\t"
  87151. #ifdef WOLFSSL_KEIL
  87152. "sbcs r5, r5, r6\n\t"
  87153. #elif defined(__clang__)
  87154. "sbcs r5, r6\n\t"
  87155. #else
  87156. "sbc r5, r6\n\t"
  87157. #endif
  87158. "stm %[a]!, {r5}\n\t"
  87159. "ldm %[m]!, {r6}\n\t"
  87160. #ifdef WOLFSSL_KEIL
  87161. "ands r6, r6, r7\n\t"
  87162. #elif defined(__clang__)
  87163. "ands r6, r7\n\t"
  87164. #else
  87165. "and r6, r7\n\t"
  87166. #endif
  87167. "ldr r5, [%[a], r4]\n\t"
  87168. #ifdef WOLFSSL_KEIL
  87169. "sbcs r5, r5, r6\n\t"
  87170. #elif defined(__clang__)
  87171. "sbcs r5, r6\n\t"
  87172. #else
  87173. "sbc r5, r6\n\t"
  87174. #endif
  87175. "stm %[a]!, {r5}\n\t"
  87176. "ldm %[m]!, {r6}\n\t"
  87177. #ifdef WOLFSSL_KEIL
  87178. "ands r6, r6, r7\n\t"
  87179. #elif defined(__clang__)
  87180. "ands r6, r7\n\t"
  87181. #else
  87182. "and r6, r7\n\t"
  87183. #endif
  87184. "ldr r5, [%[a], r4]\n\t"
  87185. #ifdef WOLFSSL_KEIL
  87186. "sbcs r5, r5, r6\n\t"
  87187. #elif defined(__clang__)
  87188. "sbcs r5, r6\n\t"
  87189. #else
  87190. "sbc r5, r6\n\t"
  87191. #endif
  87192. "stm %[a]!, {r5}\n\t"
  87193. "ldm %[m]!, {r6}\n\t"
  87194. #ifdef WOLFSSL_KEIL
  87195. "ands r6, r6, r7\n\t"
  87196. #elif defined(__clang__)
  87197. "ands r6, r7\n\t"
  87198. #else
  87199. "and r6, r7\n\t"
  87200. #endif
  87201. "ldr r5, [%[a], r4]\n\t"
  87202. #ifdef WOLFSSL_KEIL
  87203. "sbcs r5, r5, r6\n\t"
  87204. #elif defined(__clang__)
  87205. "sbcs r5, r6\n\t"
  87206. #else
  87207. "sbc r5, r6\n\t"
  87208. #endif
  87209. "stm %[a]!, {r5}\n\t"
  87210. "ldm %[m]!, {r6}\n\t"
  87211. #ifdef WOLFSSL_KEIL
  87212. "ands r6, r6, r7\n\t"
  87213. #elif defined(__clang__)
  87214. "ands r6, r7\n\t"
  87215. #else
  87216. "and r6, r7\n\t"
  87217. #endif
  87218. "ldr r5, [%[a], r4]\n\t"
  87219. #ifdef WOLFSSL_KEIL
  87220. "sbcs r5, r5, r6\n\t"
  87221. #elif defined(__clang__)
  87222. "sbcs r5, r6\n\t"
  87223. #else
  87224. "sbc r5, r6\n\t"
  87225. #endif
  87226. "stm %[a]!, {r5}\n\t"
  87227. "ldm %[m]!, {r6}\n\t"
  87228. #ifdef WOLFSSL_KEIL
  87229. "ands r6, r6, r7\n\t"
  87230. #elif defined(__clang__)
  87231. "ands r6, r7\n\t"
  87232. #else
  87233. "and r6, r7\n\t"
  87234. #endif
  87235. "ldr r5, [%[a], r4]\n\t"
  87236. #ifdef WOLFSSL_KEIL
  87237. "sbcs r5, r5, r6\n\t"
  87238. #elif defined(__clang__)
  87239. "sbcs r5, r6\n\t"
  87240. #else
  87241. "sbc r5, r6\n\t"
  87242. #endif
  87243. "stm %[a]!, {r5}\n\t"
  87244. "ldm %[m]!, {r6}\n\t"
  87245. #ifdef WOLFSSL_KEIL
  87246. "ands r6, r6, r7\n\t"
  87247. #elif defined(__clang__)
  87248. "ands r6, r7\n\t"
  87249. #else
  87250. "and r6, r7\n\t"
  87251. #endif
  87252. "ldr r5, [%[a], r4]\n\t"
  87253. #ifdef WOLFSSL_KEIL
  87254. "sbcs r5, r5, r6\n\t"
  87255. #elif defined(__clang__)
  87256. "sbcs r5, r6\n\t"
  87257. #else
  87258. "sbc r5, r6\n\t"
  87259. #endif
  87260. "stm %[a]!, {r5}\n\t"
  87261. "ldm %[m]!, {r6}\n\t"
  87262. #ifdef WOLFSSL_KEIL
  87263. "ands r6, r6, r7\n\t"
  87264. #elif defined(__clang__)
  87265. "ands r6, r7\n\t"
  87266. #else
  87267. "and r6, r7\n\t"
  87268. #endif
  87269. "ldr r5, [%[a], r4]\n\t"
  87270. #ifdef WOLFSSL_KEIL
  87271. "sbcs r5, r5, r6\n\t"
  87272. #elif defined(__clang__)
  87273. "sbcs r5, r6\n\t"
  87274. #else
  87275. "sbc r5, r6\n\t"
  87276. #endif
  87277. "stm %[a]!, {r5}\n\t"
  87278. "ldm %[m]!, {r6}\n\t"
  87279. #ifdef WOLFSSL_KEIL
  87280. "ands r6, r6, r7\n\t"
  87281. #elif defined(__clang__)
  87282. "ands r6, r7\n\t"
  87283. #else
  87284. "and r6, r7\n\t"
  87285. #endif
  87286. "ldr r5, [%[a], r4]\n\t"
  87287. #ifdef WOLFSSL_KEIL
  87288. "sbcs r5, r5, r6\n\t"
  87289. #elif defined(__clang__)
  87290. "sbcs r5, r6\n\t"
  87291. #else
  87292. "sbc r5, r6\n\t"
  87293. #endif
  87294. "stm %[a]!, {r5}\n\t"
  87295. "ldm %[m]!, {r6}\n\t"
  87296. #ifdef WOLFSSL_KEIL
  87297. "ands r6, r6, r7\n\t"
  87298. #elif defined(__clang__)
  87299. "ands r6, r7\n\t"
  87300. #else
  87301. "and r6, r7\n\t"
  87302. #endif
  87303. "ldr r5, [%[a], r4]\n\t"
  87304. #ifdef WOLFSSL_KEIL
  87305. "sbcs r5, r5, r6\n\t"
  87306. #elif defined(__clang__)
  87307. "sbcs r5, r6\n\t"
  87308. #else
  87309. "sbc r5, r6\n\t"
  87310. #endif
  87311. "stm %[a]!, {r5}\n\t"
  87312. "ldm %[m]!, {r6}\n\t"
  87313. #ifdef WOLFSSL_KEIL
  87314. "ands r6, r6, r7\n\t"
  87315. #elif defined(__clang__)
  87316. "ands r6, r7\n\t"
  87317. #else
  87318. "and r6, r7\n\t"
  87319. #endif
  87320. "ldr r5, [%[a], r4]\n\t"
  87321. #ifdef WOLFSSL_KEIL
  87322. "sbcs r5, r5, r6\n\t"
  87323. #elif defined(__clang__)
  87324. "sbcs r5, r6\n\t"
  87325. #else
  87326. "sbc r5, r6\n\t"
  87327. #endif
  87328. "stm %[a]!, {r5}\n\t"
  87329. "ldm %[m]!, {r6}\n\t"
  87330. #ifdef WOLFSSL_KEIL
  87331. "ands r6, r6, r7\n\t"
  87332. #elif defined(__clang__)
  87333. "ands r6, r7\n\t"
  87334. #else
  87335. "and r6, r7\n\t"
  87336. #endif
  87337. "ldr r5, [%[a], r4]\n\t"
  87338. #ifdef WOLFSSL_KEIL
  87339. "sbcs r5, r5, r6\n\t"
  87340. #elif defined(__clang__)
  87341. "sbcs r5, r6\n\t"
  87342. #else
  87343. "sbc r5, r6\n\t"
  87344. #endif
  87345. "stm %[a]!, {r5}\n\t"
  87346. "ldm %[m]!, {r6}\n\t"
  87347. #ifdef WOLFSSL_KEIL
  87348. "ands r6, r6, r7\n\t"
  87349. #elif defined(__clang__)
  87350. "ands r6, r7\n\t"
  87351. #else
  87352. "and r6, r7\n\t"
  87353. #endif
  87354. "ldr r5, [%[a], r4]\n\t"
  87355. #ifdef WOLFSSL_KEIL
  87356. "sbcs r5, r5, r6\n\t"
  87357. #elif defined(__clang__)
  87358. "sbcs r5, r6\n\t"
  87359. #else
  87360. "sbc r5, r6\n\t"
  87361. #endif
  87362. "stm %[a]!, {r5}\n\t"
  87363. "ldm %[m]!, {r6}\n\t"
  87364. #ifdef WOLFSSL_KEIL
  87365. "ands r6, r6, r7\n\t"
  87366. #elif defined(__clang__)
  87367. "ands r6, r7\n\t"
  87368. #else
  87369. "and r6, r7\n\t"
  87370. #endif
  87371. "ldr r5, [%[a], r4]\n\t"
  87372. #ifdef WOLFSSL_KEIL
  87373. "sbcs r5, r5, r6\n\t"
  87374. #elif defined(__clang__)
  87375. "sbcs r5, r6\n\t"
  87376. #else
  87377. "sbc r5, r6\n\t"
  87378. #endif
  87379. "stm %[a]!, {r5}\n\t"
  87380. "ldm %[m]!, {r6}\n\t"
  87381. #ifdef WOLFSSL_KEIL
  87382. "ands r6, r6, r7\n\t"
  87383. #elif defined(__clang__)
  87384. "ands r6, r7\n\t"
  87385. #else
  87386. "and r6, r7\n\t"
  87387. #endif
  87388. "ldr r5, [%[a], r4]\n\t"
  87389. #ifdef WOLFSSL_KEIL
  87390. "sbcs r5, r5, r6\n\t"
  87391. #elif defined(__clang__)
  87392. "sbcs r5, r6\n\t"
  87393. #else
  87394. "sbc r5, r6\n\t"
  87395. #endif
  87396. "stm %[a]!, {r5}\n\t"
  87397. "ldm %[m]!, {r6}\n\t"
  87398. #ifdef WOLFSSL_KEIL
  87399. "ands r6, r6, r7\n\t"
  87400. #elif defined(__clang__)
  87401. "ands r6, r7\n\t"
  87402. #else
  87403. "and r6, r7\n\t"
  87404. #endif
  87405. "ldr r5, [%[a], r4]\n\t"
  87406. #ifdef WOLFSSL_KEIL
  87407. "sbcs r5, r5, r6\n\t"
  87408. #elif defined(__clang__)
  87409. "sbcs r5, r6\n\t"
  87410. #else
  87411. "sbc r5, r6\n\t"
  87412. #endif
  87413. "stm %[a]!, {r5}\n\t"
  87414. "ldm %[m]!, {r6}\n\t"
  87415. #ifdef WOLFSSL_KEIL
  87416. "ands r6, r6, r7\n\t"
  87417. #elif defined(__clang__)
  87418. "ands r6, r7\n\t"
  87419. #else
  87420. "and r6, r7\n\t"
  87421. #endif
  87422. "ldr r5, [%[a], r4]\n\t"
  87423. #ifdef WOLFSSL_KEIL
  87424. "sbcs r5, r5, r6\n\t"
  87425. #elif defined(__clang__)
  87426. "sbcs r5, r6\n\t"
  87427. #else
  87428. "sbc r5, r6\n\t"
  87429. #endif
  87430. "stm %[a]!, {r5}\n\t"
  87431. "ldm %[m]!, {r6}\n\t"
  87432. #ifdef WOLFSSL_KEIL
  87433. "ands r6, r6, r7\n\t"
  87434. #elif defined(__clang__)
  87435. "ands r6, r7\n\t"
  87436. #else
  87437. "and r6, r7\n\t"
  87438. #endif
  87439. "ldr r5, [%[a], r4]\n\t"
  87440. #ifdef WOLFSSL_KEIL
  87441. "sbcs r5, r5, r6\n\t"
  87442. #elif defined(__clang__)
  87443. "sbcs r5, r6\n\t"
  87444. #else
  87445. "sbc r5, r6\n\t"
  87446. #endif
  87447. "stm %[a]!, {r5}\n\t"
  87448. "ldm %[m]!, {r6}\n\t"
  87449. #ifdef WOLFSSL_KEIL
  87450. "ands r6, r6, r7\n\t"
  87451. #elif defined(__clang__)
  87452. "ands r6, r7\n\t"
  87453. #else
  87454. "and r6, r7\n\t"
  87455. #endif
  87456. "ldr r5, [%[a], r4]\n\t"
  87457. #ifdef WOLFSSL_KEIL
  87458. "sbcs r5, r5, r6\n\t"
  87459. #elif defined(__clang__)
  87460. "sbcs r5, r6\n\t"
  87461. #else
  87462. "sbc r5, r6\n\t"
  87463. #endif
  87464. "stm %[a]!, {r5}\n\t"
  87465. "ldm %[m]!, {r6}\n\t"
  87466. #ifdef WOLFSSL_KEIL
  87467. "ands r6, r6, r7\n\t"
  87468. #elif defined(__clang__)
  87469. "ands r6, r7\n\t"
  87470. #else
  87471. "and r6, r7\n\t"
  87472. #endif
  87473. "ldr r5, [%[a], r4]\n\t"
  87474. #ifdef WOLFSSL_KEIL
  87475. "sbcs r5, r5, r6\n\t"
  87476. #elif defined(__clang__)
  87477. "sbcs r5, r6\n\t"
  87478. #else
  87479. "sbc r5, r6\n\t"
  87480. #endif
  87481. "stm %[a]!, {r5}\n\t"
  87482. "ldm %[m]!, {r6}\n\t"
  87483. #ifdef WOLFSSL_KEIL
  87484. "ands r6, r6, r7\n\t"
  87485. #elif defined(__clang__)
  87486. "ands r6, r7\n\t"
  87487. #else
  87488. "and r6, r7\n\t"
  87489. #endif
  87490. "ldr r5, [%[a], r4]\n\t"
  87491. #ifdef WOLFSSL_KEIL
  87492. "sbcs r5, r5, r6\n\t"
  87493. #elif defined(__clang__)
  87494. "sbcs r5, r6\n\t"
  87495. #else
  87496. "sbc r5, r6\n\t"
  87497. #endif
  87498. "stm %[a]!, {r5}\n\t"
  87499. "ldm %[m]!, {r6}\n\t"
  87500. #ifdef WOLFSSL_KEIL
  87501. "ands r6, r6, r7\n\t"
  87502. #elif defined(__clang__)
  87503. "ands r6, r7\n\t"
  87504. #else
  87505. "and r6, r7\n\t"
  87506. #endif
  87507. "ldr r5, [%[a], r4]\n\t"
  87508. #ifdef WOLFSSL_KEIL
  87509. "sbcs r5, r5, r6\n\t"
  87510. #elif defined(__clang__)
  87511. "sbcs r5, r6\n\t"
  87512. #else
  87513. "sbc r5, r6\n\t"
  87514. #endif
  87515. "stm %[a]!, {r5}\n\t"
  87516. "ldm %[m]!, {r6}\n\t"
  87517. #ifdef WOLFSSL_KEIL
  87518. "ands r6, r6, r7\n\t"
  87519. #elif defined(__clang__)
  87520. "ands r6, r7\n\t"
  87521. #else
  87522. "and r6, r7\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. "stm %[a]!, {r5}\n\t"
  87533. "ldm %[m]!, {r6}\n\t"
  87534. #ifdef WOLFSSL_KEIL
  87535. "ands r6, r6, r7\n\t"
  87536. #elif defined(__clang__)
  87537. "ands r6, r7\n\t"
  87538. #else
  87539. "and r6, r7\n\t"
  87540. #endif
  87541. "ldr r5, [%[a], r4]\n\t"
  87542. #ifdef WOLFSSL_KEIL
  87543. "sbcs r5, r5, r6\n\t"
  87544. #elif defined(__clang__)
  87545. "sbcs r5, r6\n\t"
  87546. #else
  87547. "sbc r5, r6\n\t"
  87548. #endif
  87549. "stm %[a]!, {r5}\n\t"
  87550. "ldm %[m]!, {r6}\n\t"
  87551. #ifdef WOLFSSL_KEIL
  87552. "ands r6, r6, r7\n\t"
  87553. #elif defined(__clang__)
  87554. "ands r6, r7\n\t"
  87555. #else
  87556. "and r6, r7\n\t"
  87557. #endif
  87558. "ldr r5, [%[a], r4]\n\t"
  87559. #ifdef WOLFSSL_KEIL
  87560. "sbcs r5, r5, r6\n\t"
  87561. #elif defined(__clang__)
  87562. "sbcs r5, r6\n\t"
  87563. #else
  87564. "sbc r5, r6\n\t"
  87565. #endif
  87566. "stm %[a]!, {r5}\n\t"
  87567. "ldm %[m]!, {r6}\n\t"
  87568. #ifdef WOLFSSL_KEIL
  87569. "ands r6, r6, r7\n\t"
  87570. #elif defined(__clang__)
  87571. "ands r6, r7\n\t"
  87572. #else
  87573. "and r6, r7\n\t"
  87574. #endif
  87575. "ldr r5, [%[a], r4]\n\t"
  87576. #ifdef WOLFSSL_KEIL
  87577. "sbcs r5, r5, r6\n\t"
  87578. #elif defined(__clang__)
  87579. "sbcs r5, r6\n\t"
  87580. #else
  87581. "sbc r5, r6\n\t"
  87582. #endif
  87583. "stm %[a]!, {r5}\n\t"
  87584. "ldm %[m]!, {r6}\n\t"
  87585. #ifdef WOLFSSL_KEIL
  87586. "ands r6, r6, r7\n\t"
  87587. #elif defined(__clang__)
  87588. "ands r6, r7\n\t"
  87589. #else
  87590. "and r6, r7\n\t"
  87591. #endif
  87592. "ldr r5, [%[a], r4]\n\t"
  87593. #ifdef WOLFSSL_KEIL
  87594. "sbcs r5, r5, r6\n\t"
  87595. #elif defined(__clang__)
  87596. "sbcs r5, r6\n\t"
  87597. #else
  87598. "sbc r5, r6\n\t"
  87599. #endif
  87600. "stm %[a]!, {r5}\n\t"
  87601. "ldm %[m]!, {r6}\n\t"
  87602. #ifdef WOLFSSL_KEIL
  87603. "ands r6, r6, r7\n\t"
  87604. #elif defined(__clang__)
  87605. "ands r6, r7\n\t"
  87606. #else
  87607. "and r6, r7\n\t"
  87608. #endif
  87609. "ldr r5, [%[a], r4]\n\t"
  87610. #ifdef WOLFSSL_KEIL
  87611. "sbcs r5, r5, r6\n\t"
  87612. #elif defined(__clang__)
  87613. "sbcs r5, r6\n\t"
  87614. #else
  87615. "sbc r5, r6\n\t"
  87616. #endif
  87617. "stm %[a]!, {r5}\n\t"
  87618. "ldm %[m]!, {r6}\n\t"
  87619. #ifdef WOLFSSL_KEIL
  87620. "ands r6, r6, r7\n\t"
  87621. #elif defined(__clang__)
  87622. "ands r6, r7\n\t"
  87623. #else
  87624. "and r6, r7\n\t"
  87625. #endif
  87626. "ldr r5, [%[a], r4]\n\t"
  87627. #ifdef WOLFSSL_KEIL
  87628. "sbcs r5, r5, r6\n\t"
  87629. #elif defined(__clang__)
  87630. "sbcs r5, r6\n\t"
  87631. #else
  87632. "sbc r5, r6\n\t"
  87633. #endif
  87634. "stm %[a]!, {r5}\n\t"
  87635. "ldm %[m]!, {r6}\n\t"
  87636. #ifdef WOLFSSL_KEIL
  87637. "ands r6, r6, r7\n\t"
  87638. #elif defined(__clang__)
  87639. "ands r6, r7\n\t"
  87640. #else
  87641. "and r6, r7\n\t"
  87642. #endif
  87643. "ldr r5, [%[a], r4]\n\t"
  87644. #ifdef WOLFSSL_KEIL
  87645. "sbcs r5, r5, r6\n\t"
  87646. #elif defined(__clang__)
  87647. "sbcs r5, r6\n\t"
  87648. #else
  87649. "sbc r5, r6\n\t"
  87650. #endif
  87651. "stm %[a]!, {r5}\n\t"
  87652. "ldm %[m]!, {r6}\n\t"
  87653. #ifdef WOLFSSL_KEIL
  87654. "ands r6, r6, r7\n\t"
  87655. #elif defined(__clang__)
  87656. "ands r6, r7\n\t"
  87657. #else
  87658. "and r6, r7\n\t"
  87659. #endif
  87660. "ldr r5, [%[a], r4]\n\t"
  87661. #ifdef WOLFSSL_KEIL
  87662. "sbcs r5, r5, r6\n\t"
  87663. #elif defined(__clang__)
  87664. "sbcs r5, r6\n\t"
  87665. #else
  87666. "sbc r5, r6\n\t"
  87667. #endif
  87668. "stm %[a]!, {r5}\n\t"
  87669. "ldm %[m]!, {r6}\n\t"
  87670. #ifdef WOLFSSL_KEIL
  87671. "ands r6, r6, r7\n\t"
  87672. #elif defined(__clang__)
  87673. "ands r6, r7\n\t"
  87674. #else
  87675. "and r6, r7\n\t"
  87676. #endif
  87677. "ldr r5, [%[a], r4]\n\t"
  87678. #ifdef WOLFSSL_KEIL
  87679. "sbcs r5, r5, r6\n\t"
  87680. #elif defined(__clang__)
  87681. "sbcs r5, r6\n\t"
  87682. #else
  87683. "sbc r5, r6\n\t"
  87684. #endif
  87685. "stm %[a]!, {r5}\n\t"
  87686. "ldm %[m]!, {r6}\n\t"
  87687. #ifdef WOLFSSL_KEIL
  87688. "ands r6, r6, r7\n\t"
  87689. #elif defined(__clang__)
  87690. "ands r6, r7\n\t"
  87691. #else
  87692. "and r6, r7\n\t"
  87693. #endif
  87694. "ldr r5, [%[a], r4]\n\t"
  87695. #ifdef WOLFSSL_KEIL
  87696. "sbcs r5, r5, r6\n\t"
  87697. #elif defined(__clang__)
  87698. "sbcs r5, r6\n\t"
  87699. #else
  87700. "sbc r5, r6\n\t"
  87701. #endif
  87702. "stm %[a]!, {r5}\n\t"
  87703. "ldm %[m]!, {r6}\n\t"
  87704. #ifdef WOLFSSL_KEIL
  87705. "ands r6, r6, r7\n\t"
  87706. #elif defined(__clang__)
  87707. "ands r6, r7\n\t"
  87708. #else
  87709. "and r6, r7\n\t"
  87710. #endif
  87711. "ldr r5, [%[a], r4]\n\t"
  87712. #ifdef WOLFSSL_KEIL
  87713. "sbcs r5, r5, r6\n\t"
  87714. #elif defined(__clang__)
  87715. "sbcs r5, r6\n\t"
  87716. #else
  87717. "sbc r5, r6\n\t"
  87718. #endif
  87719. "stm %[a]!, {r5}\n\t"
  87720. "ldm %[m]!, {r6}\n\t"
  87721. #ifdef WOLFSSL_KEIL
  87722. "ands r6, r6, r7\n\t"
  87723. #elif defined(__clang__)
  87724. "ands r6, r7\n\t"
  87725. #else
  87726. "and r6, r7\n\t"
  87727. #endif
  87728. "ldr r5, [%[a], r4]\n\t"
  87729. #ifdef WOLFSSL_KEIL
  87730. "sbcs r5, r5, r6\n\t"
  87731. #elif defined(__clang__)
  87732. "sbcs r5, r6\n\t"
  87733. #else
  87734. "sbc r5, r6\n\t"
  87735. #endif
  87736. "stm %[a]!, {r5}\n\t"
  87737. "ldm %[m]!, {r6}\n\t"
  87738. #ifdef WOLFSSL_KEIL
  87739. "ands r6, r6, r7\n\t"
  87740. #elif defined(__clang__)
  87741. "ands r6, r7\n\t"
  87742. #else
  87743. "and r6, r7\n\t"
  87744. #endif
  87745. "ldr r5, [%[a], r4]\n\t"
  87746. #ifdef WOLFSSL_KEIL
  87747. "sbcs r5, r5, r6\n\t"
  87748. #elif defined(__clang__)
  87749. "sbcs r5, r6\n\t"
  87750. #else
  87751. "sbc r5, r6\n\t"
  87752. #endif
  87753. "stm %[a]!, {r5}\n\t"
  87754. "ldm %[m]!, {r6}\n\t"
  87755. #ifdef WOLFSSL_KEIL
  87756. "ands r6, r6, r7\n\t"
  87757. #elif defined(__clang__)
  87758. "ands r6, r7\n\t"
  87759. #else
  87760. "and r6, r7\n\t"
  87761. #endif
  87762. "ldr r5, [%[a], r4]\n\t"
  87763. #ifdef WOLFSSL_KEIL
  87764. "sbcs r5, r5, r6\n\t"
  87765. #elif defined(__clang__)
  87766. "sbcs r5, r6\n\t"
  87767. #else
  87768. "sbc r5, r6\n\t"
  87769. #endif
  87770. "stm %[a]!, {r5}\n\t"
  87771. "ldm %[m]!, {r6}\n\t"
  87772. #ifdef WOLFSSL_KEIL
  87773. "ands r6, r6, r7\n\t"
  87774. #elif defined(__clang__)
  87775. "ands r6, r7\n\t"
  87776. #else
  87777. "and r6, r7\n\t"
  87778. #endif
  87779. "ldr r5, [%[a], r4]\n\t"
  87780. #ifdef WOLFSSL_KEIL
  87781. "sbcs r5, r5, r6\n\t"
  87782. #elif defined(__clang__)
  87783. "sbcs r5, r6\n\t"
  87784. #else
  87785. "sbc r5, r6\n\t"
  87786. #endif
  87787. "stm %[a]!, {r5}\n\t"
  87788. "ldm %[m]!, {r6}\n\t"
  87789. #ifdef WOLFSSL_KEIL
  87790. "ands r6, r6, r7\n\t"
  87791. #elif defined(__clang__)
  87792. "ands r6, r7\n\t"
  87793. #else
  87794. "and r6, r7\n\t"
  87795. #endif
  87796. "ldr r5, [%[a], r4]\n\t"
  87797. #ifdef WOLFSSL_KEIL
  87798. "sbcs r5, r5, r6\n\t"
  87799. #elif defined(__clang__)
  87800. "sbcs r5, r6\n\t"
  87801. #else
  87802. "sbc r5, r6\n\t"
  87803. #endif
  87804. "stm %[a]!, {r5}\n\t"
  87805. "ldm %[m]!, {r6}\n\t"
  87806. #ifdef WOLFSSL_KEIL
  87807. "ands r6, r6, r7\n\t"
  87808. #elif defined(__clang__)
  87809. "ands r6, r7\n\t"
  87810. #else
  87811. "and r6, r7\n\t"
  87812. #endif
  87813. "ldr r5, [%[a], r4]\n\t"
  87814. #ifdef WOLFSSL_KEIL
  87815. "sbcs r5, r5, r6\n\t"
  87816. #elif defined(__clang__)
  87817. "sbcs r5, r6\n\t"
  87818. #else
  87819. "sbc r5, r6\n\t"
  87820. #endif
  87821. "stm %[a]!, {r5}\n\t"
  87822. "ldm %[m]!, {r6}\n\t"
  87823. #ifdef WOLFSSL_KEIL
  87824. "ands r6, r6, r7\n\t"
  87825. #elif defined(__clang__)
  87826. "ands r6, r7\n\t"
  87827. #else
  87828. "and r6, r7\n\t"
  87829. #endif
  87830. "ldr r5, [%[a], r4]\n\t"
  87831. #ifdef WOLFSSL_KEIL
  87832. "sbcs r5, r5, r6\n\t"
  87833. #elif defined(__clang__)
  87834. "sbcs r5, r6\n\t"
  87835. #else
  87836. "sbc r5, r6\n\t"
  87837. #endif
  87838. "stm %[a]!, {r5}\n\t"
  87839. "ldm %[m]!, {r6}\n\t"
  87840. #ifdef WOLFSSL_KEIL
  87841. "ands r6, r6, r7\n\t"
  87842. #elif defined(__clang__)
  87843. "ands r6, r7\n\t"
  87844. #else
  87845. "and r6, r7\n\t"
  87846. #endif
  87847. "ldr r5, [%[a], r4]\n\t"
  87848. #ifdef WOLFSSL_KEIL
  87849. "sbcs r5, r5, r6\n\t"
  87850. #elif defined(__clang__)
  87851. "sbcs r5, r6\n\t"
  87852. #else
  87853. "sbc r5, r6\n\t"
  87854. #endif
  87855. "stm %[a]!, {r5}\n\t"
  87856. "ldm %[m]!, {r6}\n\t"
  87857. #ifdef WOLFSSL_KEIL
  87858. "ands r6, r6, r7\n\t"
  87859. #elif defined(__clang__)
  87860. "ands r6, r7\n\t"
  87861. #else
  87862. "and r6, r7\n\t"
  87863. #endif
  87864. "ldr r5, [%[a], r4]\n\t"
  87865. #ifdef WOLFSSL_KEIL
  87866. "sbcs r5, r5, r6\n\t"
  87867. #elif defined(__clang__)
  87868. "sbcs r5, r6\n\t"
  87869. #else
  87870. "sbc r5, r6\n\t"
  87871. #endif
  87872. "stm %[a]!, {r5}\n\t"
  87873. "ldm %[m]!, {r6}\n\t"
  87874. #ifdef WOLFSSL_KEIL
  87875. "ands r6, r6, r7\n\t"
  87876. #elif defined(__clang__)
  87877. "ands r6, r7\n\t"
  87878. #else
  87879. "and r6, r7\n\t"
  87880. #endif
  87881. "ldr r5, [%[a], r4]\n\t"
  87882. #ifdef WOLFSSL_KEIL
  87883. "sbcs r5, r5, r6\n\t"
  87884. #elif defined(__clang__)
  87885. "sbcs r5, r6\n\t"
  87886. #else
  87887. "sbc r5, r6\n\t"
  87888. #endif
  87889. "stm %[a]!, {r5}\n\t"
  87890. "ldm %[m]!, {r6}\n\t"
  87891. #ifdef WOLFSSL_KEIL
  87892. "ands r6, r6, r7\n\t"
  87893. #elif defined(__clang__)
  87894. "ands r6, r7\n\t"
  87895. #else
  87896. "and r6, r7\n\t"
  87897. #endif
  87898. "ldr r5, [%[a], r4]\n\t"
  87899. #ifdef WOLFSSL_KEIL
  87900. "sbcs r5, r5, r6\n\t"
  87901. #elif defined(__clang__)
  87902. "sbcs r5, r6\n\t"
  87903. #else
  87904. "sbc r5, r6\n\t"
  87905. #endif
  87906. "stm %[a]!, {r5}\n\t"
  87907. "ldm %[m]!, {r6}\n\t"
  87908. #ifdef WOLFSSL_KEIL
  87909. "ands r6, r6, r7\n\t"
  87910. #elif defined(__clang__)
  87911. "ands r6, r7\n\t"
  87912. #else
  87913. "and r6, r7\n\t"
  87914. #endif
  87915. "ldr r5, [%[a], r4]\n\t"
  87916. #ifdef WOLFSSL_KEIL
  87917. "sbcs r5, r5, r6\n\t"
  87918. #elif defined(__clang__)
  87919. "sbcs r5, r6\n\t"
  87920. #else
  87921. "sbc r5, r6\n\t"
  87922. #endif
  87923. "stm %[a]!, {r5}\n\t"
  87924. "ldm %[m]!, {r6}\n\t"
  87925. #ifdef WOLFSSL_KEIL
  87926. "ands r6, r6, r7\n\t"
  87927. #elif defined(__clang__)
  87928. "ands r6, r7\n\t"
  87929. #else
  87930. "and r6, r7\n\t"
  87931. #endif
  87932. "ldr r5, [%[a], r4]\n\t"
  87933. #ifdef WOLFSSL_KEIL
  87934. "sbcs r5, r5, r6\n\t"
  87935. #elif defined(__clang__)
  87936. "sbcs r5, r6\n\t"
  87937. #else
  87938. "sbc r5, r6\n\t"
  87939. #endif
  87940. "stm %[a]!, {r5}\n\t"
  87941. "ldm %[m]!, {r6}\n\t"
  87942. #ifdef WOLFSSL_KEIL
  87943. "ands r6, r6, r7\n\t"
  87944. #elif defined(__clang__)
  87945. "ands r6, r7\n\t"
  87946. #else
  87947. "and r6, r7\n\t"
  87948. #endif
  87949. "ldr r5, [%[a], r4]\n\t"
  87950. #ifdef WOLFSSL_KEIL
  87951. "sbcs r5, r5, r6\n\t"
  87952. #elif defined(__clang__)
  87953. "sbcs r5, r6\n\t"
  87954. #else
  87955. "sbc r5, r6\n\t"
  87956. #endif
  87957. "stm %[a]!, {r5}\n\t"
  87958. "ldm %[m]!, {r6}\n\t"
  87959. #ifdef WOLFSSL_KEIL
  87960. "ands r6, r6, r7\n\t"
  87961. #elif defined(__clang__)
  87962. "ands r6, r7\n\t"
  87963. #else
  87964. "and r6, r7\n\t"
  87965. #endif
  87966. "ldr r5, [%[a], r4]\n\t"
  87967. #ifdef WOLFSSL_KEIL
  87968. "sbcs r5, r5, r6\n\t"
  87969. #elif defined(__clang__)
  87970. "sbcs r5, r6\n\t"
  87971. #else
  87972. "sbc r5, r6\n\t"
  87973. #endif
  87974. "stm %[a]!, {r5}\n\t"
  87975. "ldm %[m]!, {r6}\n\t"
  87976. #ifdef WOLFSSL_KEIL
  87977. "ands r6, r6, r7\n\t"
  87978. #elif defined(__clang__)
  87979. "ands r6, r7\n\t"
  87980. #else
  87981. "and r6, r7\n\t"
  87982. #endif
  87983. "ldr r5, [%[a], r4]\n\t"
  87984. #ifdef WOLFSSL_KEIL
  87985. "sbcs r5, r5, r6\n\t"
  87986. #elif defined(__clang__)
  87987. "sbcs r5, r6\n\t"
  87988. #else
  87989. "sbc r5, r6\n\t"
  87990. #endif
  87991. "stm %[a]!, {r5}\n\t"
  87992. "ldm %[m]!, {r6}\n\t"
  87993. #ifdef WOLFSSL_KEIL
  87994. "ands r6, r6, r7\n\t"
  87995. #elif defined(__clang__)
  87996. "ands r6, r7\n\t"
  87997. #else
  87998. "and r6, r7\n\t"
  87999. #endif
  88000. "ldr r5, [%[a], r4]\n\t"
  88001. #ifdef WOLFSSL_KEIL
  88002. "sbcs r5, r5, r6\n\t"
  88003. #elif defined(__clang__)
  88004. "sbcs r5, r6\n\t"
  88005. #else
  88006. "sbc r5, r6\n\t"
  88007. #endif
  88008. "stm %[a]!, {r5}\n\t"
  88009. "ldm %[m]!, {r6}\n\t"
  88010. #ifdef WOLFSSL_KEIL
  88011. "ands r6, r6, r7\n\t"
  88012. #elif defined(__clang__)
  88013. "ands r6, r7\n\t"
  88014. #else
  88015. "and r6, r7\n\t"
  88016. #endif
  88017. "ldr r5, [%[a], r4]\n\t"
  88018. #ifdef WOLFSSL_KEIL
  88019. "sbcs r5, r5, r6\n\t"
  88020. #elif defined(__clang__)
  88021. "sbcs r5, r6\n\t"
  88022. #else
  88023. "sbc r5, r6\n\t"
  88024. #endif
  88025. "stm %[a]!, {r5}\n\t"
  88026. "ldm %[m]!, {r6}\n\t"
  88027. #ifdef WOLFSSL_KEIL
  88028. "ands r6, r6, r7\n\t"
  88029. #elif defined(__clang__)
  88030. "ands r6, r7\n\t"
  88031. #else
  88032. "and r6, r7\n\t"
  88033. #endif
  88034. "ldr r5, [%[a], r4]\n\t"
  88035. #ifdef WOLFSSL_KEIL
  88036. "sbcs r5, r5, r6\n\t"
  88037. #elif defined(__clang__)
  88038. "sbcs r5, r6\n\t"
  88039. #else
  88040. "sbc r5, r6\n\t"
  88041. #endif
  88042. "stm %[a]!, {r5}\n\t"
  88043. "ldm %[m]!, {r6}\n\t"
  88044. #ifdef WOLFSSL_KEIL
  88045. "ands r6, r6, r7\n\t"
  88046. #elif defined(__clang__)
  88047. "ands r6, r7\n\t"
  88048. #else
  88049. "and r6, r7\n\t"
  88050. #endif
  88051. "ldr r5, [%[a], r4]\n\t"
  88052. #ifdef WOLFSSL_KEIL
  88053. "sbcs r5, r5, r6\n\t"
  88054. #elif defined(__clang__)
  88055. "sbcs r5, r6\n\t"
  88056. #else
  88057. "sbc r5, r6\n\t"
  88058. #endif
  88059. "stm %[a]!, {r5}\n\t"
  88060. "ldm %[m]!, {r6}\n\t"
  88061. #ifdef WOLFSSL_KEIL
  88062. "ands r6, r6, r7\n\t"
  88063. #elif defined(__clang__)
  88064. "ands r6, r7\n\t"
  88065. #else
  88066. "and r6, r7\n\t"
  88067. #endif
  88068. "ldr r5, [%[a], r4]\n\t"
  88069. #ifdef WOLFSSL_KEIL
  88070. "sbcs r5, r5, r6\n\t"
  88071. #elif defined(__clang__)
  88072. "sbcs r5, r6\n\t"
  88073. #else
  88074. "sbc r5, r6\n\t"
  88075. #endif
  88076. "stm %[a]!, {r5}\n\t"
  88077. "ldm %[m]!, {r6}\n\t"
  88078. #ifdef WOLFSSL_KEIL
  88079. "ands r6, r6, r7\n\t"
  88080. #elif defined(__clang__)
  88081. "ands r6, r7\n\t"
  88082. #else
  88083. "and r6, r7\n\t"
  88084. #endif
  88085. "ldr r5, [%[a], r4]\n\t"
  88086. #ifdef WOLFSSL_KEIL
  88087. "sbcs r5, r5, r6\n\t"
  88088. #elif defined(__clang__)
  88089. "sbcs r5, r6\n\t"
  88090. #else
  88091. "sbc r5, r6\n\t"
  88092. #endif
  88093. "stm %[a]!, {r5}\n\t"
  88094. "ldm %[m]!, {r6}\n\t"
  88095. #ifdef WOLFSSL_KEIL
  88096. "ands r6, r6, r7\n\t"
  88097. #elif defined(__clang__)
  88098. "ands r6, r7\n\t"
  88099. #else
  88100. "and r6, r7\n\t"
  88101. #endif
  88102. "ldr r5, [%[a], r4]\n\t"
  88103. #ifdef WOLFSSL_KEIL
  88104. "sbcs r5, r5, r6\n\t"
  88105. #elif defined(__clang__)
  88106. "sbcs r5, r6\n\t"
  88107. #else
  88108. "sbc r5, r6\n\t"
  88109. #endif
  88110. "stm %[a]!, {r5}\n\t"
  88111. "ldm %[m]!, {r6}\n\t"
  88112. #ifdef WOLFSSL_KEIL
  88113. "ands r6, r6, r7\n\t"
  88114. #elif defined(__clang__)
  88115. "ands r6, r7\n\t"
  88116. #else
  88117. "and r6, r7\n\t"
  88118. #endif
  88119. "ldr r5, [%[a], r4]\n\t"
  88120. #ifdef WOLFSSL_KEIL
  88121. "sbcs r5, r5, r6\n\t"
  88122. #elif defined(__clang__)
  88123. "sbcs r5, r6\n\t"
  88124. #else
  88125. "sbc r5, r6\n\t"
  88126. #endif
  88127. "stm %[a]!, {r5}\n\t"
  88128. "ldm %[m]!, {r6}\n\t"
  88129. #ifdef WOLFSSL_KEIL
  88130. "ands r6, r6, r7\n\t"
  88131. #elif defined(__clang__)
  88132. "ands r6, r7\n\t"
  88133. #else
  88134. "and r6, r7\n\t"
  88135. #endif
  88136. "ldr r5, [%[a], r4]\n\t"
  88137. #ifdef WOLFSSL_KEIL
  88138. "sbcs r5, r5, r6\n\t"
  88139. #elif defined(__clang__)
  88140. "sbcs r5, r6\n\t"
  88141. #else
  88142. "sbc r5, r6\n\t"
  88143. #endif
  88144. "stm %[a]!, {r5}\n\t"
  88145. "ldm %[m]!, {r6}\n\t"
  88146. #ifdef WOLFSSL_KEIL
  88147. "ands r6, r6, r7\n\t"
  88148. #elif defined(__clang__)
  88149. "ands r6, r7\n\t"
  88150. #else
  88151. "and r6, r7\n\t"
  88152. #endif
  88153. "ldr r5, [%[a], r4]\n\t"
  88154. #ifdef WOLFSSL_KEIL
  88155. "sbcs r5, r5, r6\n\t"
  88156. #elif defined(__clang__)
  88157. "sbcs r5, r6\n\t"
  88158. #else
  88159. "sbc r5, r6\n\t"
  88160. #endif
  88161. "stm %[a]!, {r5}\n\t"
  88162. "ldm %[m]!, {r6}\n\t"
  88163. #ifdef WOLFSSL_KEIL
  88164. "ands r6, r6, r7\n\t"
  88165. #elif defined(__clang__)
  88166. "ands r6, r7\n\t"
  88167. #else
  88168. "and r6, r7\n\t"
  88169. #endif
  88170. "ldr r5, [%[a], r4]\n\t"
  88171. #ifdef WOLFSSL_KEIL
  88172. "sbcs r5, r5, r6\n\t"
  88173. #elif defined(__clang__)
  88174. "sbcs r5, r6\n\t"
  88175. #else
  88176. "sbc r5, r6\n\t"
  88177. #endif
  88178. "stm %[a]!, {r5}\n\t"
  88179. "ldm %[m]!, {r6}\n\t"
  88180. #ifdef WOLFSSL_KEIL
  88181. "ands r6, r6, r7\n\t"
  88182. #elif defined(__clang__)
  88183. "ands r6, r7\n\t"
  88184. #else
  88185. "and r6, r7\n\t"
  88186. #endif
  88187. "ldr r5, [%[a], r4]\n\t"
  88188. #ifdef WOLFSSL_KEIL
  88189. "sbcs r5, r5, r6\n\t"
  88190. #elif defined(__clang__)
  88191. "sbcs r5, r6\n\t"
  88192. #else
  88193. "sbc r5, r6\n\t"
  88194. #endif
  88195. "stm %[a]!, {r5}\n\t"
  88196. "ldm %[m]!, {r6}\n\t"
  88197. #ifdef WOLFSSL_KEIL
  88198. "ands r6, r6, r7\n\t"
  88199. #elif defined(__clang__)
  88200. "ands r6, r7\n\t"
  88201. #else
  88202. "and r6, r7\n\t"
  88203. #endif
  88204. "ldr r5, [%[a], r4]\n\t"
  88205. #ifdef WOLFSSL_KEIL
  88206. "sbcs r5, r5, r6\n\t"
  88207. #elif defined(__clang__)
  88208. "sbcs r5, r6\n\t"
  88209. #else
  88210. "sbc r5, r6\n\t"
  88211. #endif
  88212. "stm %[a]!, {r5}\n\t"
  88213. "ldm %[m]!, {r6}\n\t"
  88214. #ifdef WOLFSSL_KEIL
  88215. "ands r6, r6, r7\n\t"
  88216. #elif defined(__clang__)
  88217. "ands r6, r7\n\t"
  88218. #else
  88219. "and r6, r7\n\t"
  88220. #endif
  88221. "ldr r5, [%[a], r4]\n\t"
  88222. #ifdef WOLFSSL_KEIL
  88223. "sbcs r5, r5, r6\n\t"
  88224. #elif defined(__clang__)
  88225. "sbcs r5, r6\n\t"
  88226. #else
  88227. "sbc r5, r6\n\t"
  88228. #endif
  88229. "stm %[a]!, {r5}\n\t"
  88230. "ldm %[m]!, {r6}\n\t"
  88231. #ifdef WOLFSSL_KEIL
  88232. "ands r6, r6, r7\n\t"
  88233. #elif defined(__clang__)
  88234. "ands r6, r7\n\t"
  88235. #else
  88236. "and r6, r7\n\t"
  88237. #endif
  88238. "ldr r5, [%[a], r4]\n\t"
  88239. #ifdef WOLFSSL_KEIL
  88240. "sbcs r5, r5, r6\n\t"
  88241. #elif defined(__clang__)
  88242. "sbcs r5, r6\n\t"
  88243. #else
  88244. "sbc r5, r6\n\t"
  88245. #endif
  88246. "stm %[a]!, {r5}\n\t"
  88247. "ldm %[m]!, {r6}\n\t"
  88248. #ifdef WOLFSSL_KEIL
  88249. "ands r6, r6, r7\n\t"
  88250. #elif defined(__clang__)
  88251. "ands r6, r7\n\t"
  88252. #else
  88253. "and r6, r7\n\t"
  88254. #endif
  88255. "ldr r5, [%[a], r4]\n\t"
  88256. #ifdef WOLFSSL_KEIL
  88257. "sbcs r5, r5, r6\n\t"
  88258. #elif defined(__clang__)
  88259. "sbcs r5, r6\n\t"
  88260. #else
  88261. "sbc r5, r6\n\t"
  88262. #endif
  88263. "stm %[a]!, {r5}\n\t"
  88264. "ldm %[m]!, {r6}\n\t"
  88265. #ifdef WOLFSSL_KEIL
  88266. "ands r6, r6, r7\n\t"
  88267. #elif defined(__clang__)
  88268. "ands r6, r7\n\t"
  88269. #else
  88270. "and r6, r7\n\t"
  88271. #endif
  88272. "ldr r5, [%[a], r4]\n\t"
  88273. #ifdef WOLFSSL_KEIL
  88274. "sbcs r5, r5, r6\n\t"
  88275. #elif defined(__clang__)
  88276. "sbcs r5, r6\n\t"
  88277. #else
  88278. "sbc r5, r6\n\t"
  88279. #endif
  88280. "stm %[a]!, {r5}\n\t"
  88281. "ldm %[m]!, {r6}\n\t"
  88282. #ifdef WOLFSSL_KEIL
  88283. "ands r6, r6, r7\n\t"
  88284. #elif defined(__clang__)
  88285. "ands r6, r7\n\t"
  88286. #else
  88287. "and r6, r7\n\t"
  88288. #endif
  88289. "ldr r5, [%[a], r4]\n\t"
  88290. #ifdef WOLFSSL_KEIL
  88291. "sbcs r5, r5, r6\n\t"
  88292. #elif defined(__clang__)
  88293. "sbcs r5, r6\n\t"
  88294. #else
  88295. "sbc r5, r6\n\t"
  88296. #endif
  88297. "stm %[a]!, {r5}\n\t"
  88298. "ldm %[m]!, {r6}\n\t"
  88299. #ifdef WOLFSSL_KEIL
  88300. "ands r6, r6, r7\n\t"
  88301. #elif defined(__clang__)
  88302. "ands r6, r7\n\t"
  88303. #else
  88304. "and r6, r7\n\t"
  88305. #endif
  88306. "ldr r5, [%[a], r4]\n\t"
  88307. #ifdef WOLFSSL_KEIL
  88308. "sbcs r5, r5, r6\n\t"
  88309. #elif defined(__clang__)
  88310. "sbcs r5, r6\n\t"
  88311. #else
  88312. "sbc r5, r6\n\t"
  88313. #endif
  88314. "stm %[a]!, {r5}\n\t"
  88315. "ldm %[m]!, {r6}\n\t"
  88316. #ifdef WOLFSSL_KEIL
  88317. "ands r6, r6, r7\n\t"
  88318. #elif defined(__clang__)
  88319. "ands r6, r7\n\t"
  88320. #else
  88321. "and r6, r7\n\t"
  88322. #endif
  88323. "ldr r5, [%[a], r4]\n\t"
  88324. #ifdef WOLFSSL_KEIL
  88325. "sbcs r5, r5, r6\n\t"
  88326. #elif defined(__clang__)
  88327. "sbcs r5, r6\n\t"
  88328. #else
  88329. "sbc r5, r6\n\t"
  88330. #endif
  88331. "stm %[a]!, {r5}\n\t"
  88332. "ldm %[m]!, {r6}\n\t"
  88333. #ifdef WOLFSSL_KEIL
  88334. "ands r6, r6, r7\n\t"
  88335. #elif defined(__clang__)
  88336. "ands r6, r7\n\t"
  88337. #else
  88338. "and r6, r7\n\t"
  88339. #endif
  88340. "ldr r5, [%[a], r4]\n\t"
  88341. #ifdef WOLFSSL_KEIL
  88342. "sbcs r5, r5, r6\n\t"
  88343. #elif defined(__clang__)
  88344. "sbcs r5, r6\n\t"
  88345. #else
  88346. "sbc r5, r6\n\t"
  88347. #endif
  88348. "stm %[a]!, {r5}\n\t"
  88349. "ldm %[m]!, {r6}\n\t"
  88350. #ifdef WOLFSSL_KEIL
  88351. "ands r6, r6, r7\n\t"
  88352. #elif defined(__clang__)
  88353. "ands r6, r7\n\t"
  88354. #else
  88355. "and r6, r7\n\t"
  88356. #endif
  88357. "ldr r5, [%[a], r4]\n\t"
  88358. #ifdef WOLFSSL_KEIL
  88359. "sbcs r5, r5, r6\n\t"
  88360. #elif defined(__clang__)
  88361. "sbcs r5, r6\n\t"
  88362. #else
  88363. "sbc r5, r6\n\t"
  88364. #endif
  88365. "stm %[a]!, {r5}\n\t"
  88366. "ldm %[m]!, {r6}\n\t"
  88367. #ifdef WOLFSSL_KEIL
  88368. "ands r6, r6, r7\n\t"
  88369. #elif defined(__clang__)
  88370. "ands r6, r7\n\t"
  88371. #else
  88372. "and r6, r7\n\t"
  88373. #endif
  88374. "ldr r5, [%[a], r4]\n\t"
  88375. #ifdef WOLFSSL_KEIL
  88376. "sbcs r5, r5, r6\n\t"
  88377. #elif defined(__clang__)
  88378. "sbcs r5, r6\n\t"
  88379. #else
  88380. "sbc r5, r6\n\t"
  88381. #endif
  88382. "stm %[a]!, {r5}\n\t"
  88383. "ldm %[m]!, {r6}\n\t"
  88384. #ifdef WOLFSSL_KEIL
  88385. "ands r6, r6, r7\n\t"
  88386. #elif defined(__clang__)
  88387. "ands r6, r7\n\t"
  88388. #else
  88389. "and r6, r7\n\t"
  88390. #endif
  88391. "ldr r5, [%[a], r4]\n\t"
  88392. #ifdef WOLFSSL_KEIL
  88393. "sbcs r5, r5, r6\n\t"
  88394. #elif defined(__clang__)
  88395. "sbcs r5, r6\n\t"
  88396. #else
  88397. "sbc r5, r6\n\t"
  88398. #endif
  88399. "stm %[a]!, {r5}\n\t"
  88400. "ldm %[m]!, {r6}\n\t"
  88401. #ifdef WOLFSSL_KEIL
  88402. "ands r6, r6, r7\n\t"
  88403. #elif defined(__clang__)
  88404. "ands r6, r7\n\t"
  88405. #else
  88406. "and r6, r7\n\t"
  88407. #endif
  88408. "ldr r5, [%[a], r4]\n\t"
  88409. #ifdef WOLFSSL_KEIL
  88410. "sbcs r5, r5, r6\n\t"
  88411. #elif defined(__clang__)
  88412. "sbcs r5, r6\n\t"
  88413. #else
  88414. "sbc r5, r6\n\t"
  88415. #endif
  88416. "stm %[a]!, {r5}\n\t"
  88417. "ldm %[m]!, {r6}\n\t"
  88418. #ifdef WOLFSSL_KEIL
  88419. "ands r6, r6, r7\n\t"
  88420. #elif defined(__clang__)
  88421. "ands r6, r7\n\t"
  88422. #else
  88423. "and r6, r7\n\t"
  88424. #endif
  88425. "ldr r5, [%[a], r4]\n\t"
  88426. #ifdef WOLFSSL_KEIL
  88427. "sbcs r5, r5, r6\n\t"
  88428. #elif defined(__clang__)
  88429. "sbcs r5, r6\n\t"
  88430. #else
  88431. "sbc r5, r6\n\t"
  88432. #endif
  88433. "stm %[a]!, {r5}\n\t"
  88434. "ldm %[m]!, {r6}\n\t"
  88435. #ifdef WOLFSSL_KEIL
  88436. "ands r6, r6, r7\n\t"
  88437. #elif defined(__clang__)
  88438. "ands r6, r7\n\t"
  88439. #else
  88440. "and r6, r7\n\t"
  88441. #endif
  88442. "ldr r5, [%[a], r4]\n\t"
  88443. #ifdef WOLFSSL_KEIL
  88444. "sbcs r5, r5, r6\n\t"
  88445. #elif defined(__clang__)
  88446. "sbcs r5, r6\n\t"
  88447. #else
  88448. "sbc r5, r6\n\t"
  88449. #endif
  88450. "stm %[a]!, {r5}\n\t"
  88451. "ldm %[m]!, {r6}\n\t"
  88452. #ifdef WOLFSSL_KEIL
  88453. "ands r6, r6, r7\n\t"
  88454. #elif defined(__clang__)
  88455. "ands r6, r7\n\t"
  88456. #else
  88457. "and r6, r7\n\t"
  88458. #endif
  88459. "ldr r5, [%[a], r4]\n\t"
  88460. #ifdef WOLFSSL_KEIL
  88461. "sbcs r5, r5, r6\n\t"
  88462. #elif defined(__clang__)
  88463. "sbcs r5, r6\n\t"
  88464. #else
  88465. "sbc r5, r6\n\t"
  88466. #endif
  88467. "stm %[a]!, {r5}\n\t"
  88468. "ldm %[m]!, {r6}\n\t"
  88469. #ifdef WOLFSSL_KEIL
  88470. "ands r6, r6, r7\n\t"
  88471. #elif defined(__clang__)
  88472. "ands r6, r7\n\t"
  88473. #else
  88474. "and r6, r7\n\t"
  88475. #endif
  88476. "ldr r5, [%[a], r4]\n\t"
  88477. #ifdef WOLFSSL_KEIL
  88478. "sbcs r5, r5, r6\n\t"
  88479. #elif defined(__clang__)
  88480. "sbcs r5, r6\n\t"
  88481. #else
  88482. "sbc r5, r6\n\t"
  88483. #endif
  88484. "stm %[a]!, {r5}\n\t"
  88485. "ldm %[m]!, {r6}\n\t"
  88486. #ifdef WOLFSSL_KEIL
  88487. "ands r6, r6, r7\n\t"
  88488. #elif defined(__clang__)
  88489. "ands r6, r7\n\t"
  88490. #else
  88491. "and r6, r7\n\t"
  88492. #endif
  88493. "ldr r5, [%[a], r4]\n\t"
  88494. #ifdef WOLFSSL_KEIL
  88495. "sbcs r5, r5, r6\n\t"
  88496. #elif defined(__clang__)
  88497. "sbcs r5, r6\n\t"
  88498. #else
  88499. "sbc r5, r6\n\t"
  88500. #endif
  88501. "stm %[a]!, {r5}\n\t"
  88502. "ldm %[m]!, {r6}\n\t"
  88503. #ifdef WOLFSSL_KEIL
  88504. "ands r6, r6, r7\n\t"
  88505. #elif defined(__clang__)
  88506. "ands r6, r7\n\t"
  88507. #else
  88508. "and r6, r7\n\t"
  88509. #endif
  88510. "ldr r5, [%[a], r4]\n\t"
  88511. #ifdef WOLFSSL_KEIL
  88512. "sbcs r5, r5, r6\n\t"
  88513. #elif defined(__clang__)
  88514. "sbcs r5, r6\n\t"
  88515. #else
  88516. "sbc r5, r6\n\t"
  88517. #endif
  88518. "stm %[a]!, {r5}\n\t"
  88519. "ldm %[m]!, {r6}\n\t"
  88520. #ifdef WOLFSSL_KEIL
  88521. "ands r6, r6, r7\n\t"
  88522. #elif defined(__clang__)
  88523. "ands r6, r7\n\t"
  88524. #else
  88525. "and r6, r7\n\t"
  88526. #endif
  88527. "ldr r5, [%[a], r4]\n\t"
  88528. #ifdef WOLFSSL_KEIL
  88529. "sbcs r5, r5, r6\n\t"
  88530. #elif defined(__clang__)
  88531. "sbcs r5, r6\n\t"
  88532. #else
  88533. "sbc r5, r6\n\t"
  88534. #endif
  88535. "stm %[a]!, {r5}\n\t"
  88536. "ldm %[m]!, {r6}\n\t"
  88537. #ifdef WOLFSSL_KEIL
  88538. "ands r6, r6, r7\n\t"
  88539. #elif defined(__clang__)
  88540. "ands r6, r7\n\t"
  88541. #else
  88542. "and r6, r7\n\t"
  88543. #endif
  88544. "ldr r5, [%[a], r4]\n\t"
  88545. #ifdef WOLFSSL_KEIL
  88546. "sbcs r5, r5, r6\n\t"
  88547. #elif defined(__clang__)
  88548. "sbcs r5, r6\n\t"
  88549. #else
  88550. "sbc r5, r6\n\t"
  88551. #endif
  88552. "stm %[a]!, {r5}\n\t"
  88553. "ldm %[m]!, {r6}\n\t"
  88554. #ifdef WOLFSSL_KEIL
  88555. "ands r6, r6, r7\n\t"
  88556. #elif defined(__clang__)
  88557. "ands r6, r7\n\t"
  88558. #else
  88559. "and r6, r7\n\t"
  88560. #endif
  88561. "ldr r5, [%[a], r4]\n\t"
  88562. #ifdef WOLFSSL_KEIL
  88563. "sbcs r5, r5, r6\n\t"
  88564. #elif defined(__clang__)
  88565. "sbcs r5, r6\n\t"
  88566. #else
  88567. "sbc r5, r6\n\t"
  88568. #endif
  88569. "stm %[a]!, {r5}\n\t"
  88570. "ldm %[m]!, {r6}\n\t"
  88571. #ifdef WOLFSSL_KEIL
  88572. "ands r6, r6, r7\n\t"
  88573. #elif defined(__clang__)
  88574. "ands r6, r7\n\t"
  88575. #else
  88576. "and r6, r7\n\t"
  88577. #endif
  88578. "ldr r5, [%[a], r4]\n\t"
  88579. #ifdef WOLFSSL_KEIL
  88580. "sbcs r5, r5, r6\n\t"
  88581. #elif defined(__clang__)
  88582. "sbcs r5, r6\n\t"
  88583. #else
  88584. "sbc r5, r6\n\t"
  88585. #endif
  88586. "stm %[a]!, {r5}\n\t"
  88587. "ldm %[m]!, {r6}\n\t"
  88588. #ifdef WOLFSSL_KEIL
  88589. "ands r6, r6, r7\n\t"
  88590. #elif defined(__clang__)
  88591. "ands r6, r7\n\t"
  88592. #else
  88593. "and r6, r7\n\t"
  88594. #endif
  88595. "ldr r5, [%[a], r4]\n\t"
  88596. #ifdef WOLFSSL_KEIL
  88597. "sbcs r5, r5, r6\n\t"
  88598. #elif defined(__clang__)
  88599. "sbcs r5, r6\n\t"
  88600. #else
  88601. "sbc r5, r6\n\t"
  88602. #endif
  88603. "stm %[a]!, {r5}\n\t"
  88604. "ldm %[m]!, {r6}\n\t"
  88605. #ifdef WOLFSSL_KEIL
  88606. "ands r6, r6, r7\n\t"
  88607. #elif defined(__clang__)
  88608. "ands r6, r7\n\t"
  88609. #else
  88610. "and r6, r7\n\t"
  88611. #endif
  88612. "ldr r5, [%[a], r4]\n\t"
  88613. #ifdef WOLFSSL_KEIL
  88614. "sbcs r5, r5, r6\n\t"
  88615. #elif defined(__clang__)
  88616. "sbcs r5, r6\n\t"
  88617. #else
  88618. "sbc r5, r6\n\t"
  88619. #endif
  88620. "stm %[a]!, {r5}\n\t"
  88621. "ldm %[m]!, {r6}\n\t"
  88622. #ifdef WOLFSSL_KEIL
  88623. "ands r6, r6, r7\n\t"
  88624. #elif defined(__clang__)
  88625. "ands r6, r7\n\t"
  88626. #else
  88627. "and r6, r7\n\t"
  88628. #endif
  88629. "ldr r5, [%[a], r4]\n\t"
  88630. #ifdef WOLFSSL_KEIL
  88631. "sbcs r5, r5, r6\n\t"
  88632. #elif defined(__clang__)
  88633. "sbcs r5, r6\n\t"
  88634. #else
  88635. "sbc r5, r6\n\t"
  88636. #endif
  88637. "stm %[a]!, {r5}\n\t"
  88638. "ldm %[m]!, {r6}\n\t"
  88639. #ifdef WOLFSSL_KEIL
  88640. "ands r6, r6, r7\n\t"
  88641. #elif defined(__clang__)
  88642. "ands r6, r7\n\t"
  88643. #else
  88644. "and r6, r7\n\t"
  88645. #endif
  88646. "ldr r5, [%[a], r4]\n\t"
  88647. #ifdef WOLFSSL_KEIL
  88648. "sbcs r5, r5, r6\n\t"
  88649. #elif defined(__clang__)
  88650. "sbcs r5, r6\n\t"
  88651. #else
  88652. "sbc r5, r6\n\t"
  88653. #endif
  88654. "stm %[a]!, {r5}\n\t"
  88655. "ldm %[m]!, {r6}\n\t"
  88656. #ifdef WOLFSSL_KEIL
  88657. "ands r6, r6, r7\n\t"
  88658. #elif defined(__clang__)
  88659. "ands r6, r7\n\t"
  88660. #else
  88661. "and r6, r7\n\t"
  88662. #endif
  88663. "ldr r5, [%[a], r4]\n\t"
  88664. #ifdef WOLFSSL_KEIL
  88665. "sbcs r5, r5, r6\n\t"
  88666. #elif defined(__clang__)
  88667. "sbcs r5, r6\n\t"
  88668. #else
  88669. "sbc r5, r6\n\t"
  88670. #endif
  88671. "stm %[a]!, {r5}\n\t"
  88672. "ldm %[m]!, {r6}\n\t"
  88673. #ifdef WOLFSSL_KEIL
  88674. "ands r6, r6, r7\n\t"
  88675. #elif defined(__clang__)
  88676. "ands r6, r7\n\t"
  88677. #else
  88678. "and r6, r7\n\t"
  88679. #endif
  88680. "ldr r5, [%[a], r4]\n\t"
  88681. #ifdef WOLFSSL_KEIL
  88682. "sbcs r5, r5, r6\n\t"
  88683. #elif defined(__clang__)
  88684. "sbcs r5, r6\n\t"
  88685. #else
  88686. "sbc r5, r6\n\t"
  88687. #endif
  88688. "stm %[a]!, {r5}\n\t"
  88689. "ldm %[m]!, {r6}\n\t"
  88690. #ifdef WOLFSSL_KEIL
  88691. "ands r6, r6, r7\n\t"
  88692. #elif defined(__clang__)
  88693. "ands r6, r7\n\t"
  88694. #else
  88695. "and r6, r7\n\t"
  88696. #endif
  88697. "ldr r5, [%[a], r4]\n\t"
  88698. #ifdef WOLFSSL_KEIL
  88699. "sbcs r5, r5, r6\n\t"
  88700. #elif defined(__clang__)
  88701. "sbcs r5, r6\n\t"
  88702. #else
  88703. "sbc r5, r6\n\t"
  88704. #endif
  88705. "stm %[a]!, {r5}\n\t"
  88706. "ldm %[m]!, {r6}\n\t"
  88707. #ifdef WOLFSSL_KEIL
  88708. "ands r6, r6, r7\n\t"
  88709. #elif defined(__clang__)
  88710. "ands r6, r7\n\t"
  88711. #else
  88712. "and r6, r7\n\t"
  88713. #endif
  88714. "ldr r5, [%[a], r4]\n\t"
  88715. #ifdef WOLFSSL_KEIL
  88716. "sbcs r5, r5, r6\n\t"
  88717. #elif defined(__clang__)
  88718. "sbcs r5, r6\n\t"
  88719. #else
  88720. "sbc r5, r6\n\t"
  88721. #endif
  88722. "stm %[a]!, {r5}\n\t"
  88723. "ldm %[m]!, {r6}\n\t"
  88724. #ifdef WOLFSSL_KEIL
  88725. "ands r6, r6, r7\n\t"
  88726. #elif defined(__clang__)
  88727. "ands r6, r7\n\t"
  88728. #else
  88729. "and r6, r7\n\t"
  88730. #endif
  88731. "ldr r5, [%[a], r4]\n\t"
  88732. #ifdef WOLFSSL_KEIL
  88733. "sbcs r5, r5, r6\n\t"
  88734. #elif defined(__clang__)
  88735. "sbcs r5, r6\n\t"
  88736. #else
  88737. "sbc r5, r6\n\t"
  88738. #endif
  88739. "stm %[a]!, {r5}\n\t"
  88740. "ldm %[m]!, {r6}\n\t"
  88741. #ifdef WOLFSSL_KEIL
  88742. "ands r6, r6, r7\n\t"
  88743. #elif defined(__clang__)
  88744. "ands r6, r7\n\t"
  88745. #else
  88746. "and r6, r7\n\t"
  88747. #endif
  88748. "ldr r5, [%[a], r4]\n\t"
  88749. #ifdef WOLFSSL_KEIL
  88750. "sbcs r5, r5, r6\n\t"
  88751. #elif defined(__clang__)
  88752. "sbcs r5, r6\n\t"
  88753. #else
  88754. "sbc r5, r6\n\t"
  88755. #endif
  88756. "stm %[a]!, {r5}\n\t"
  88757. "ldm %[m]!, {r6}\n\t"
  88758. #ifdef WOLFSSL_KEIL
  88759. "ands r6, r6, r7\n\t"
  88760. #elif defined(__clang__)
  88761. "ands r6, r7\n\t"
  88762. #else
  88763. "and r6, r7\n\t"
  88764. #endif
  88765. "ldr r5, [%[a], r4]\n\t"
  88766. #ifdef WOLFSSL_KEIL
  88767. "sbcs r5, r5, r6\n\t"
  88768. #elif defined(__clang__)
  88769. "sbcs r5, r6\n\t"
  88770. #else
  88771. "sbc r5, r6\n\t"
  88772. #endif
  88773. "stm %[a]!, {r5}\n\t"
  88774. "ldm %[m]!, {r6}\n\t"
  88775. #ifdef WOLFSSL_KEIL
  88776. "ands r6, r6, r7\n\t"
  88777. #elif defined(__clang__)
  88778. "ands r6, r7\n\t"
  88779. #else
  88780. "and r6, r7\n\t"
  88781. #endif
  88782. "ldr r5, [%[a], r4]\n\t"
  88783. #ifdef WOLFSSL_KEIL
  88784. "sbcs r5, r5, r6\n\t"
  88785. #elif defined(__clang__)
  88786. "sbcs r5, r6\n\t"
  88787. #else
  88788. "sbc r5, r6\n\t"
  88789. #endif
  88790. "stm %[a]!, {r5}\n\t"
  88791. "ldm %[m]!, {r6}\n\t"
  88792. #ifdef WOLFSSL_KEIL
  88793. "ands r6, r6, r7\n\t"
  88794. #elif defined(__clang__)
  88795. "ands r6, r7\n\t"
  88796. #else
  88797. "and r6, r7\n\t"
  88798. #endif
  88799. "ldr r5, [%[a], r4]\n\t"
  88800. #ifdef WOLFSSL_KEIL
  88801. "sbcs r5, r5, r6\n\t"
  88802. #elif defined(__clang__)
  88803. "sbcs r5, r6\n\t"
  88804. #else
  88805. "sbc r5, r6\n\t"
  88806. #endif
  88807. "stm %[a]!, {r5}\n\t"
  88808. "ldm %[m]!, {r6}\n\t"
  88809. #ifdef WOLFSSL_KEIL
  88810. "ands r6, r6, r7\n\t"
  88811. #elif defined(__clang__)
  88812. "ands r6, r7\n\t"
  88813. #else
  88814. "and r6, r7\n\t"
  88815. #endif
  88816. "ldr r5, [%[a], r4]\n\t"
  88817. #ifdef WOLFSSL_KEIL
  88818. "sbcs r5, r5, r6\n\t"
  88819. #elif defined(__clang__)
  88820. "sbcs r5, r6\n\t"
  88821. #else
  88822. "sbc r5, r6\n\t"
  88823. #endif
  88824. "stm %[a]!, {r5}\n\t"
  88825. "ldm %[m]!, {r6}\n\t"
  88826. #ifdef WOLFSSL_KEIL
  88827. "ands r6, r6, r7\n\t"
  88828. #elif defined(__clang__)
  88829. "ands r6, r7\n\t"
  88830. #else
  88831. "and r6, r7\n\t"
  88832. #endif
  88833. "ldr r5, [%[a], r4]\n\t"
  88834. #ifdef WOLFSSL_KEIL
  88835. "sbcs r5, r5, r6\n\t"
  88836. #elif defined(__clang__)
  88837. "sbcs r5, r6\n\t"
  88838. #else
  88839. "sbc r5, r6\n\t"
  88840. #endif
  88841. "stm %[a]!, {r5}\n\t"
  88842. "ldm %[m]!, {r6}\n\t"
  88843. #ifdef WOLFSSL_KEIL
  88844. "ands r6, r6, r7\n\t"
  88845. #elif defined(__clang__)
  88846. "ands r6, r7\n\t"
  88847. #else
  88848. "and r6, r7\n\t"
  88849. #endif
  88850. "ldr r5, [%[a], r4]\n\t"
  88851. #ifdef WOLFSSL_KEIL
  88852. "sbcs r5, r5, r6\n\t"
  88853. #elif defined(__clang__)
  88854. "sbcs r5, r6\n\t"
  88855. #else
  88856. "sbc r5, r6\n\t"
  88857. #endif
  88858. "stm %[a]!, {r5}\n\t"
  88859. "ldm %[m]!, {r6}\n\t"
  88860. #ifdef WOLFSSL_KEIL
  88861. "ands r6, r6, r7\n\t"
  88862. #elif defined(__clang__)
  88863. "ands r6, r7\n\t"
  88864. #else
  88865. "and r6, r7\n\t"
  88866. #endif
  88867. "ldr r5, [%[a], r4]\n\t"
  88868. #ifdef WOLFSSL_KEIL
  88869. "sbcs r5, r5, r6\n\t"
  88870. #elif defined(__clang__)
  88871. "sbcs r5, r6\n\t"
  88872. #else
  88873. "sbc r5, r6\n\t"
  88874. #endif
  88875. "stm %[a]!, {r5}\n\t"
  88876. #endif /* WOLFSSL_SP_LARGE_CODE */
  88877. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  88878. :
  88879. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  88880. );
  88881. }
  88882. /* Multiply two Montgomery form numbers mod the modulus (prime).
  88883. * (r = a * b mod m)
  88884. *
  88885. * r Result of multiplication.
  88886. * a First number to multiply in Montgomery form.
  88887. * b Second number to multiply in Montgomery form.
  88888. * m Modulus (prime).
  88889. * mp Montgomery mulitplier.
  88890. */
  88891. static void sp_4096_mont_mul_128(sp_digit* r, const sp_digit* a,
  88892. const sp_digit* b, const sp_digit* m, sp_digit mp)
  88893. {
  88894. sp_4096_mul_128(r, a, b);
  88895. sp_4096_mont_reduce_128(r, m, mp);
  88896. }
  88897. /* Square the Montgomery form number. (r = a * a mod m)
  88898. *
  88899. * r Result of squaring.
  88900. * a Number to square in Montgomery form.
  88901. * m Modulus (prime).
  88902. * mp Montgomery mulitplier.
  88903. */
  88904. static void sp_4096_mont_sqr_128(sp_digit* r, const sp_digit* a,
  88905. const sp_digit* m, sp_digit mp)
  88906. {
  88907. sp_4096_sqr_128(r, a);
  88908. sp_4096_mont_reduce_128(r, m, mp);
  88909. }
  88910. #ifdef WOLFSSL_SP_SMALL
  88911. /* Sub b from a into r. (r = a - b)
  88912. *
  88913. * r A single precision integer.
  88914. * a A single precision integer.
  88915. * b A single precision integer.
  88916. */
  88917. SP_NOINLINE static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a,
  88918. const sp_digit* b)
  88919. {
  88920. __asm__ __volatile__ (
  88921. "movs r6, %[a]\n\t"
  88922. "movs r3, #0\n\t"
  88923. "movs r5, #2\n\t"
  88924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  88925. "lsls r5, r5, #8\n\t"
  88926. #else
  88927. "lsl r5, r5, #8\n\t"
  88928. #endif
  88929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  88930. "adds r6, r6, r5\n\t"
  88931. #else
  88932. "add r6, r6, r5\n\t"
  88933. #endif
  88934. "\n"
  88935. "L_sp_4096_sub_128_word_%=:\n\t"
  88936. "movs r5, #0\n\t"
  88937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  88938. "subs r5, r5, r3\n\t"
  88939. #else
  88940. "sub r5, r5, r3\n\t"
  88941. #endif
  88942. "ldr r4, [%[a]]\n\t"
  88943. "ldr r5, [%[b]]\n\t"
  88944. #ifdef WOLFSSL_KEIL
  88945. "sbcs r4, r4, r5\n\t"
  88946. #elif defined(__clang__)
  88947. "sbcs r4, r5\n\t"
  88948. #else
  88949. "sbc r4, r5\n\t"
  88950. #endif
  88951. "str r4, [%[r]]\n\t"
  88952. #ifdef WOLFSSL_KEIL
  88953. "sbcs r3, r3, r3\n\t"
  88954. #elif defined(__clang__)
  88955. "sbcs r3, r3\n\t"
  88956. #else
  88957. "sbc r3, r3\n\t"
  88958. #endif
  88959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  88960. "adds %[a], %[a], #4\n\t"
  88961. #else
  88962. "add %[a], %[a], #4\n\t"
  88963. #endif
  88964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  88965. "adds %[b], %[b], #4\n\t"
  88966. #else
  88967. "add %[b], %[b], #4\n\t"
  88968. #endif
  88969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  88970. "adds %[r], %[r], #4\n\t"
  88971. #else
  88972. "add %[r], %[r], #4\n\t"
  88973. #endif
  88974. "cmp %[a], r6\n\t"
  88975. "bne L_sp_4096_sub_128_word_%=\n\t"
  88976. "movs %[r], r3\n\t"
  88977. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  88978. :
  88979. : "memory", "r3", "r4", "r5", "r6"
  88980. );
  88981. return (uint32_t)(size_t)r;
  88982. }
  88983. #else
  88984. /* Sub b from a into r. (r = a - b)
  88985. *
  88986. * r A single precision integer.
  88987. * a A single precision integer.
  88988. * b A single precision integer.
  88989. */
  88990. SP_NOINLINE static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a,
  88991. const sp_digit* b)
  88992. {
  88993. __asm__ __volatile__ (
  88994. "ldm %[b]!, {r5, r6}\n\t"
  88995. "ldm %[a]!, {r3, r4}\n\t"
  88996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  88997. "subs r3, r3, r5\n\t"
  88998. #else
  88999. "sub r3, r3, r5\n\t"
  89000. #endif
  89001. #ifdef WOLFSSL_KEIL
  89002. "sbcs r4, r4, r6\n\t"
  89003. #elif defined(__clang__)
  89004. "sbcs r4, r6\n\t"
  89005. #else
  89006. "sbc r4, r6\n\t"
  89007. #endif
  89008. "stm %[r]!, {r3, r4}\n\t"
  89009. "ldm %[b]!, {r5, r6}\n\t"
  89010. "ldm %[a]!, {r3, r4}\n\t"
  89011. #ifdef WOLFSSL_KEIL
  89012. "sbcs r3, r3, r5\n\t"
  89013. #elif defined(__clang__)
  89014. "sbcs r3, r5\n\t"
  89015. #else
  89016. "sbc r3, r5\n\t"
  89017. #endif
  89018. #ifdef WOLFSSL_KEIL
  89019. "sbcs r4, r4, r6\n\t"
  89020. #elif defined(__clang__)
  89021. "sbcs r4, r6\n\t"
  89022. #else
  89023. "sbc r4, r6\n\t"
  89024. #endif
  89025. "stm %[r]!, {r3, r4}\n\t"
  89026. "ldm %[b]!, {r5, r6}\n\t"
  89027. "ldm %[a]!, {r3, r4}\n\t"
  89028. #ifdef WOLFSSL_KEIL
  89029. "sbcs r3, r3, r5\n\t"
  89030. #elif defined(__clang__)
  89031. "sbcs r3, r5\n\t"
  89032. #else
  89033. "sbc r3, r5\n\t"
  89034. #endif
  89035. #ifdef WOLFSSL_KEIL
  89036. "sbcs r4, r4, r6\n\t"
  89037. #elif defined(__clang__)
  89038. "sbcs r4, r6\n\t"
  89039. #else
  89040. "sbc r4, r6\n\t"
  89041. #endif
  89042. "stm %[r]!, {r3, r4}\n\t"
  89043. "ldm %[b]!, {r5, r6}\n\t"
  89044. "ldm %[a]!, {r3, r4}\n\t"
  89045. #ifdef WOLFSSL_KEIL
  89046. "sbcs r3, r3, r5\n\t"
  89047. #elif defined(__clang__)
  89048. "sbcs r3, r5\n\t"
  89049. #else
  89050. "sbc r3, r5\n\t"
  89051. #endif
  89052. #ifdef WOLFSSL_KEIL
  89053. "sbcs r4, r4, r6\n\t"
  89054. #elif defined(__clang__)
  89055. "sbcs r4, r6\n\t"
  89056. #else
  89057. "sbc r4, r6\n\t"
  89058. #endif
  89059. "stm %[r]!, {r3, r4}\n\t"
  89060. "ldm %[b]!, {r5, r6}\n\t"
  89061. "ldm %[a]!, {r3, r4}\n\t"
  89062. #ifdef WOLFSSL_KEIL
  89063. "sbcs r3, r3, r5\n\t"
  89064. #elif defined(__clang__)
  89065. "sbcs r3, r5\n\t"
  89066. #else
  89067. "sbc r3, r5\n\t"
  89068. #endif
  89069. #ifdef WOLFSSL_KEIL
  89070. "sbcs r4, r4, r6\n\t"
  89071. #elif defined(__clang__)
  89072. "sbcs r4, r6\n\t"
  89073. #else
  89074. "sbc r4, r6\n\t"
  89075. #endif
  89076. "stm %[r]!, {r3, r4}\n\t"
  89077. "ldm %[b]!, {r5, r6}\n\t"
  89078. "ldm %[a]!, {r3, r4}\n\t"
  89079. #ifdef WOLFSSL_KEIL
  89080. "sbcs r3, r3, r5\n\t"
  89081. #elif defined(__clang__)
  89082. "sbcs r3, r5\n\t"
  89083. #else
  89084. "sbc r3, r5\n\t"
  89085. #endif
  89086. #ifdef WOLFSSL_KEIL
  89087. "sbcs r4, r4, r6\n\t"
  89088. #elif defined(__clang__)
  89089. "sbcs r4, r6\n\t"
  89090. #else
  89091. "sbc r4, r6\n\t"
  89092. #endif
  89093. "stm %[r]!, {r3, r4}\n\t"
  89094. "ldm %[b]!, {r5, r6}\n\t"
  89095. "ldm %[a]!, {r3, r4}\n\t"
  89096. #ifdef WOLFSSL_KEIL
  89097. "sbcs r3, r3, r5\n\t"
  89098. #elif defined(__clang__)
  89099. "sbcs r3, r5\n\t"
  89100. #else
  89101. "sbc r3, r5\n\t"
  89102. #endif
  89103. #ifdef WOLFSSL_KEIL
  89104. "sbcs r4, r4, r6\n\t"
  89105. #elif defined(__clang__)
  89106. "sbcs r4, r6\n\t"
  89107. #else
  89108. "sbc r4, r6\n\t"
  89109. #endif
  89110. "stm %[r]!, {r3, r4}\n\t"
  89111. "ldm %[b]!, {r5, r6}\n\t"
  89112. "ldm %[a]!, {r3, r4}\n\t"
  89113. #ifdef WOLFSSL_KEIL
  89114. "sbcs r3, r3, r5\n\t"
  89115. #elif defined(__clang__)
  89116. "sbcs r3, r5\n\t"
  89117. #else
  89118. "sbc r3, r5\n\t"
  89119. #endif
  89120. #ifdef WOLFSSL_KEIL
  89121. "sbcs r4, r4, r6\n\t"
  89122. #elif defined(__clang__)
  89123. "sbcs r4, r6\n\t"
  89124. #else
  89125. "sbc r4, r6\n\t"
  89126. #endif
  89127. "stm %[r]!, {r3, r4}\n\t"
  89128. "ldm %[b]!, {r5, r6}\n\t"
  89129. "ldm %[a]!, {r3, r4}\n\t"
  89130. #ifdef WOLFSSL_KEIL
  89131. "sbcs r3, r3, r5\n\t"
  89132. #elif defined(__clang__)
  89133. "sbcs r3, r5\n\t"
  89134. #else
  89135. "sbc r3, r5\n\t"
  89136. #endif
  89137. #ifdef WOLFSSL_KEIL
  89138. "sbcs r4, r4, r6\n\t"
  89139. #elif defined(__clang__)
  89140. "sbcs r4, r6\n\t"
  89141. #else
  89142. "sbc r4, r6\n\t"
  89143. #endif
  89144. "stm %[r]!, {r3, r4}\n\t"
  89145. "ldm %[b]!, {r5, r6}\n\t"
  89146. "ldm %[a]!, {r3, r4}\n\t"
  89147. #ifdef WOLFSSL_KEIL
  89148. "sbcs r3, r3, r5\n\t"
  89149. #elif defined(__clang__)
  89150. "sbcs r3, r5\n\t"
  89151. #else
  89152. "sbc r3, r5\n\t"
  89153. #endif
  89154. #ifdef WOLFSSL_KEIL
  89155. "sbcs r4, r4, r6\n\t"
  89156. #elif defined(__clang__)
  89157. "sbcs r4, r6\n\t"
  89158. #else
  89159. "sbc r4, r6\n\t"
  89160. #endif
  89161. "stm %[r]!, {r3, r4}\n\t"
  89162. "ldm %[b]!, {r5, r6}\n\t"
  89163. "ldm %[a]!, {r3, r4}\n\t"
  89164. #ifdef WOLFSSL_KEIL
  89165. "sbcs r3, r3, r5\n\t"
  89166. #elif defined(__clang__)
  89167. "sbcs r3, r5\n\t"
  89168. #else
  89169. "sbc r3, r5\n\t"
  89170. #endif
  89171. #ifdef WOLFSSL_KEIL
  89172. "sbcs r4, r4, r6\n\t"
  89173. #elif defined(__clang__)
  89174. "sbcs r4, r6\n\t"
  89175. #else
  89176. "sbc r4, r6\n\t"
  89177. #endif
  89178. "stm %[r]!, {r3, r4}\n\t"
  89179. "ldm %[b]!, {r5, r6}\n\t"
  89180. "ldm %[a]!, {r3, r4}\n\t"
  89181. #ifdef WOLFSSL_KEIL
  89182. "sbcs r3, r3, r5\n\t"
  89183. #elif defined(__clang__)
  89184. "sbcs r3, r5\n\t"
  89185. #else
  89186. "sbc r3, r5\n\t"
  89187. #endif
  89188. #ifdef WOLFSSL_KEIL
  89189. "sbcs r4, r4, r6\n\t"
  89190. #elif defined(__clang__)
  89191. "sbcs r4, r6\n\t"
  89192. #else
  89193. "sbc r4, r6\n\t"
  89194. #endif
  89195. "stm %[r]!, {r3, r4}\n\t"
  89196. "ldm %[b]!, {r5, r6}\n\t"
  89197. "ldm %[a]!, {r3, r4}\n\t"
  89198. #ifdef WOLFSSL_KEIL
  89199. "sbcs r3, r3, r5\n\t"
  89200. #elif defined(__clang__)
  89201. "sbcs r3, r5\n\t"
  89202. #else
  89203. "sbc r3, r5\n\t"
  89204. #endif
  89205. #ifdef WOLFSSL_KEIL
  89206. "sbcs r4, r4, r6\n\t"
  89207. #elif defined(__clang__)
  89208. "sbcs r4, r6\n\t"
  89209. #else
  89210. "sbc r4, r6\n\t"
  89211. #endif
  89212. "stm %[r]!, {r3, r4}\n\t"
  89213. "ldm %[b]!, {r5, r6}\n\t"
  89214. "ldm %[a]!, {r3, r4}\n\t"
  89215. #ifdef WOLFSSL_KEIL
  89216. "sbcs r3, r3, r5\n\t"
  89217. #elif defined(__clang__)
  89218. "sbcs r3, r5\n\t"
  89219. #else
  89220. "sbc r3, r5\n\t"
  89221. #endif
  89222. #ifdef WOLFSSL_KEIL
  89223. "sbcs r4, r4, r6\n\t"
  89224. #elif defined(__clang__)
  89225. "sbcs r4, r6\n\t"
  89226. #else
  89227. "sbc r4, r6\n\t"
  89228. #endif
  89229. "stm %[r]!, {r3, r4}\n\t"
  89230. "ldm %[b]!, {r5, r6}\n\t"
  89231. "ldm %[a]!, {r3, r4}\n\t"
  89232. #ifdef WOLFSSL_KEIL
  89233. "sbcs r3, r3, r5\n\t"
  89234. #elif defined(__clang__)
  89235. "sbcs r3, r5\n\t"
  89236. #else
  89237. "sbc r3, r5\n\t"
  89238. #endif
  89239. #ifdef WOLFSSL_KEIL
  89240. "sbcs r4, r4, r6\n\t"
  89241. #elif defined(__clang__)
  89242. "sbcs r4, r6\n\t"
  89243. #else
  89244. "sbc r4, r6\n\t"
  89245. #endif
  89246. "stm %[r]!, {r3, r4}\n\t"
  89247. "ldm %[b]!, {r5, r6}\n\t"
  89248. "ldm %[a]!, {r3, r4}\n\t"
  89249. #ifdef WOLFSSL_KEIL
  89250. "sbcs r3, r3, r5\n\t"
  89251. #elif defined(__clang__)
  89252. "sbcs r3, r5\n\t"
  89253. #else
  89254. "sbc r3, r5\n\t"
  89255. #endif
  89256. #ifdef WOLFSSL_KEIL
  89257. "sbcs r4, r4, r6\n\t"
  89258. #elif defined(__clang__)
  89259. "sbcs r4, r6\n\t"
  89260. #else
  89261. "sbc r4, r6\n\t"
  89262. #endif
  89263. "stm %[r]!, {r3, r4}\n\t"
  89264. "ldm %[b]!, {r5, r6}\n\t"
  89265. "ldm %[a]!, {r3, r4}\n\t"
  89266. #ifdef WOLFSSL_KEIL
  89267. "sbcs r3, r3, r5\n\t"
  89268. #elif defined(__clang__)
  89269. "sbcs r3, r5\n\t"
  89270. #else
  89271. "sbc r3, r5\n\t"
  89272. #endif
  89273. #ifdef WOLFSSL_KEIL
  89274. "sbcs r4, r4, r6\n\t"
  89275. #elif defined(__clang__)
  89276. "sbcs r4, r6\n\t"
  89277. #else
  89278. "sbc r4, r6\n\t"
  89279. #endif
  89280. "stm %[r]!, {r3, r4}\n\t"
  89281. "ldm %[b]!, {r5, r6}\n\t"
  89282. "ldm %[a]!, {r3, r4}\n\t"
  89283. #ifdef WOLFSSL_KEIL
  89284. "sbcs r3, r3, r5\n\t"
  89285. #elif defined(__clang__)
  89286. "sbcs r3, r5\n\t"
  89287. #else
  89288. "sbc r3, r5\n\t"
  89289. #endif
  89290. #ifdef WOLFSSL_KEIL
  89291. "sbcs r4, r4, r6\n\t"
  89292. #elif defined(__clang__)
  89293. "sbcs r4, r6\n\t"
  89294. #else
  89295. "sbc r4, r6\n\t"
  89296. #endif
  89297. "stm %[r]!, {r3, r4}\n\t"
  89298. "ldm %[b]!, {r5, r6}\n\t"
  89299. "ldm %[a]!, {r3, r4}\n\t"
  89300. #ifdef WOLFSSL_KEIL
  89301. "sbcs r3, r3, r5\n\t"
  89302. #elif defined(__clang__)
  89303. "sbcs r3, r5\n\t"
  89304. #else
  89305. "sbc r3, r5\n\t"
  89306. #endif
  89307. #ifdef WOLFSSL_KEIL
  89308. "sbcs r4, r4, r6\n\t"
  89309. #elif defined(__clang__)
  89310. "sbcs r4, r6\n\t"
  89311. #else
  89312. "sbc r4, r6\n\t"
  89313. #endif
  89314. "stm %[r]!, {r3, r4}\n\t"
  89315. "ldm %[b]!, {r5, r6}\n\t"
  89316. "ldm %[a]!, {r3, r4}\n\t"
  89317. #ifdef WOLFSSL_KEIL
  89318. "sbcs r3, r3, r5\n\t"
  89319. #elif defined(__clang__)
  89320. "sbcs r3, r5\n\t"
  89321. #else
  89322. "sbc r3, r5\n\t"
  89323. #endif
  89324. #ifdef WOLFSSL_KEIL
  89325. "sbcs r4, r4, r6\n\t"
  89326. #elif defined(__clang__)
  89327. "sbcs r4, r6\n\t"
  89328. #else
  89329. "sbc r4, r6\n\t"
  89330. #endif
  89331. "stm %[r]!, {r3, r4}\n\t"
  89332. "ldm %[b]!, {r5, r6}\n\t"
  89333. "ldm %[a]!, {r3, r4}\n\t"
  89334. #ifdef WOLFSSL_KEIL
  89335. "sbcs r3, r3, r5\n\t"
  89336. #elif defined(__clang__)
  89337. "sbcs r3, r5\n\t"
  89338. #else
  89339. "sbc r3, r5\n\t"
  89340. #endif
  89341. #ifdef WOLFSSL_KEIL
  89342. "sbcs r4, r4, r6\n\t"
  89343. #elif defined(__clang__)
  89344. "sbcs r4, r6\n\t"
  89345. #else
  89346. "sbc r4, r6\n\t"
  89347. #endif
  89348. "stm %[r]!, {r3, r4}\n\t"
  89349. "ldm %[b]!, {r5, r6}\n\t"
  89350. "ldm %[a]!, {r3, r4}\n\t"
  89351. #ifdef WOLFSSL_KEIL
  89352. "sbcs r3, r3, r5\n\t"
  89353. #elif defined(__clang__)
  89354. "sbcs r3, r5\n\t"
  89355. #else
  89356. "sbc r3, r5\n\t"
  89357. #endif
  89358. #ifdef WOLFSSL_KEIL
  89359. "sbcs r4, r4, r6\n\t"
  89360. #elif defined(__clang__)
  89361. "sbcs r4, r6\n\t"
  89362. #else
  89363. "sbc r4, r6\n\t"
  89364. #endif
  89365. "stm %[r]!, {r3, r4}\n\t"
  89366. "ldm %[b]!, {r5, r6}\n\t"
  89367. "ldm %[a]!, {r3, r4}\n\t"
  89368. #ifdef WOLFSSL_KEIL
  89369. "sbcs r3, r3, r5\n\t"
  89370. #elif defined(__clang__)
  89371. "sbcs r3, r5\n\t"
  89372. #else
  89373. "sbc r3, r5\n\t"
  89374. #endif
  89375. #ifdef WOLFSSL_KEIL
  89376. "sbcs r4, r4, r6\n\t"
  89377. #elif defined(__clang__)
  89378. "sbcs r4, r6\n\t"
  89379. #else
  89380. "sbc r4, r6\n\t"
  89381. #endif
  89382. "stm %[r]!, {r3, r4}\n\t"
  89383. "ldm %[b]!, {r5, r6}\n\t"
  89384. "ldm %[a]!, {r3, r4}\n\t"
  89385. #ifdef WOLFSSL_KEIL
  89386. "sbcs r3, r3, r5\n\t"
  89387. #elif defined(__clang__)
  89388. "sbcs r3, r5\n\t"
  89389. #else
  89390. "sbc r3, r5\n\t"
  89391. #endif
  89392. #ifdef WOLFSSL_KEIL
  89393. "sbcs r4, r4, r6\n\t"
  89394. #elif defined(__clang__)
  89395. "sbcs r4, r6\n\t"
  89396. #else
  89397. "sbc r4, r6\n\t"
  89398. #endif
  89399. "stm %[r]!, {r3, r4}\n\t"
  89400. "ldm %[b]!, {r5, r6}\n\t"
  89401. "ldm %[a]!, {r3, r4}\n\t"
  89402. #ifdef WOLFSSL_KEIL
  89403. "sbcs r3, r3, r5\n\t"
  89404. #elif defined(__clang__)
  89405. "sbcs r3, r5\n\t"
  89406. #else
  89407. "sbc r3, r5\n\t"
  89408. #endif
  89409. #ifdef WOLFSSL_KEIL
  89410. "sbcs r4, r4, r6\n\t"
  89411. #elif defined(__clang__)
  89412. "sbcs r4, r6\n\t"
  89413. #else
  89414. "sbc r4, r6\n\t"
  89415. #endif
  89416. "stm %[r]!, {r3, r4}\n\t"
  89417. "ldm %[b]!, {r5, r6}\n\t"
  89418. "ldm %[a]!, {r3, r4}\n\t"
  89419. #ifdef WOLFSSL_KEIL
  89420. "sbcs r3, r3, r5\n\t"
  89421. #elif defined(__clang__)
  89422. "sbcs r3, r5\n\t"
  89423. #else
  89424. "sbc r3, r5\n\t"
  89425. #endif
  89426. #ifdef WOLFSSL_KEIL
  89427. "sbcs r4, r4, r6\n\t"
  89428. #elif defined(__clang__)
  89429. "sbcs r4, r6\n\t"
  89430. #else
  89431. "sbc r4, r6\n\t"
  89432. #endif
  89433. "stm %[r]!, {r3, r4}\n\t"
  89434. "ldm %[b]!, {r5, r6}\n\t"
  89435. "ldm %[a]!, {r3, r4}\n\t"
  89436. #ifdef WOLFSSL_KEIL
  89437. "sbcs r3, r3, r5\n\t"
  89438. #elif defined(__clang__)
  89439. "sbcs r3, r5\n\t"
  89440. #else
  89441. "sbc r3, r5\n\t"
  89442. #endif
  89443. #ifdef WOLFSSL_KEIL
  89444. "sbcs r4, r4, r6\n\t"
  89445. #elif defined(__clang__)
  89446. "sbcs r4, r6\n\t"
  89447. #else
  89448. "sbc r4, r6\n\t"
  89449. #endif
  89450. "stm %[r]!, {r3, r4}\n\t"
  89451. "ldm %[b]!, {r5, r6}\n\t"
  89452. "ldm %[a]!, {r3, r4}\n\t"
  89453. #ifdef WOLFSSL_KEIL
  89454. "sbcs r3, r3, r5\n\t"
  89455. #elif defined(__clang__)
  89456. "sbcs r3, r5\n\t"
  89457. #else
  89458. "sbc r3, r5\n\t"
  89459. #endif
  89460. #ifdef WOLFSSL_KEIL
  89461. "sbcs r4, r4, r6\n\t"
  89462. #elif defined(__clang__)
  89463. "sbcs r4, r6\n\t"
  89464. #else
  89465. "sbc r4, r6\n\t"
  89466. #endif
  89467. "stm %[r]!, {r3, r4}\n\t"
  89468. "ldm %[b]!, {r5, r6}\n\t"
  89469. "ldm %[a]!, {r3, r4}\n\t"
  89470. #ifdef WOLFSSL_KEIL
  89471. "sbcs r3, r3, r5\n\t"
  89472. #elif defined(__clang__)
  89473. "sbcs r3, r5\n\t"
  89474. #else
  89475. "sbc r3, r5\n\t"
  89476. #endif
  89477. #ifdef WOLFSSL_KEIL
  89478. "sbcs r4, r4, r6\n\t"
  89479. #elif defined(__clang__)
  89480. "sbcs r4, r6\n\t"
  89481. #else
  89482. "sbc r4, r6\n\t"
  89483. #endif
  89484. "stm %[r]!, {r3, r4}\n\t"
  89485. "ldm %[b]!, {r5, r6}\n\t"
  89486. "ldm %[a]!, {r3, r4}\n\t"
  89487. #ifdef WOLFSSL_KEIL
  89488. "sbcs r3, r3, r5\n\t"
  89489. #elif defined(__clang__)
  89490. "sbcs r3, r5\n\t"
  89491. #else
  89492. "sbc r3, r5\n\t"
  89493. #endif
  89494. #ifdef WOLFSSL_KEIL
  89495. "sbcs r4, r4, r6\n\t"
  89496. #elif defined(__clang__)
  89497. "sbcs r4, r6\n\t"
  89498. #else
  89499. "sbc r4, r6\n\t"
  89500. #endif
  89501. "stm %[r]!, {r3, r4}\n\t"
  89502. "ldm %[b]!, {r5, r6}\n\t"
  89503. "ldm %[a]!, {r3, r4}\n\t"
  89504. #ifdef WOLFSSL_KEIL
  89505. "sbcs r3, r3, r5\n\t"
  89506. #elif defined(__clang__)
  89507. "sbcs r3, r5\n\t"
  89508. #else
  89509. "sbc r3, r5\n\t"
  89510. #endif
  89511. #ifdef WOLFSSL_KEIL
  89512. "sbcs r4, r4, r6\n\t"
  89513. #elif defined(__clang__)
  89514. "sbcs r4, r6\n\t"
  89515. #else
  89516. "sbc r4, r6\n\t"
  89517. #endif
  89518. "stm %[r]!, {r3, r4}\n\t"
  89519. "ldm %[b]!, {r5, r6}\n\t"
  89520. "ldm %[a]!, {r3, r4}\n\t"
  89521. #ifdef WOLFSSL_KEIL
  89522. "sbcs r3, r3, r5\n\t"
  89523. #elif defined(__clang__)
  89524. "sbcs r3, r5\n\t"
  89525. #else
  89526. "sbc r3, r5\n\t"
  89527. #endif
  89528. #ifdef WOLFSSL_KEIL
  89529. "sbcs r4, r4, r6\n\t"
  89530. #elif defined(__clang__)
  89531. "sbcs r4, r6\n\t"
  89532. #else
  89533. "sbc r4, r6\n\t"
  89534. #endif
  89535. "stm %[r]!, {r3, r4}\n\t"
  89536. "ldm %[b]!, {r5, r6}\n\t"
  89537. "ldm %[a]!, {r3, r4}\n\t"
  89538. #ifdef WOLFSSL_KEIL
  89539. "sbcs r3, r3, r5\n\t"
  89540. #elif defined(__clang__)
  89541. "sbcs r3, r5\n\t"
  89542. #else
  89543. "sbc r3, r5\n\t"
  89544. #endif
  89545. #ifdef WOLFSSL_KEIL
  89546. "sbcs r4, r4, r6\n\t"
  89547. #elif defined(__clang__)
  89548. "sbcs r4, r6\n\t"
  89549. #else
  89550. "sbc r4, r6\n\t"
  89551. #endif
  89552. "stm %[r]!, {r3, r4}\n\t"
  89553. "ldm %[b]!, {r5, r6}\n\t"
  89554. "ldm %[a]!, {r3, r4}\n\t"
  89555. #ifdef WOLFSSL_KEIL
  89556. "sbcs r3, r3, r5\n\t"
  89557. #elif defined(__clang__)
  89558. "sbcs r3, r5\n\t"
  89559. #else
  89560. "sbc r3, r5\n\t"
  89561. #endif
  89562. #ifdef WOLFSSL_KEIL
  89563. "sbcs r4, r4, r6\n\t"
  89564. #elif defined(__clang__)
  89565. "sbcs r4, r6\n\t"
  89566. #else
  89567. "sbc r4, r6\n\t"
  89568. #endif
  89569. "stm %[r]!, {r3, r4}\n\t"
  89570. "ldm %[b]!, {r5, r6}\n\t"
  89571. "ldm %[a]!, {r3, r4}\n\t"
  89572. #ifdef WOLFSSL_KEIL
  89573. "sbcs r3, r3, r5\n\t"
  89574. #elif defined(__clang__)
  89575. "sbcs r3, r5\n\t"
  89576. #else
  89577. "sbc r3, r5\n\t"
  89578. #endif
  89579. #ifdef WOLFSSL_KEIL
  89580. "sbcs r4, r4, r6\n\t"
  89581. #elif defined(__clang__)
  89582. "sbcs r4, r6\n\t"
  89583. #else
  89584. "sbc r4, r6\n\t"
  89585. #endif
  89586. "stm %[r]!, {r3, r4}\n\t"
  89587. "ldm %[b]!, {r5, r6}\n\t"
  89588. "ldm %[a]!, {r3, r4}\n\t"
  89589. #ifdef WOLFSSL_KEIL
  89590. "sbcs r3, r3, r5\n\t"
  89591. #elif defined(__clang__)
  89592. "sbcs r3, r5\n\t"
  89593. #else
  89594. "sbc r3, r5\n\t"
  89595. #endif
  89596. #ifdef WOLFSSL_KEIL
  89597. "sbcs r4, r4, r6\n\t"
  89598. #elif defined(__clang__)
  89599. "sbcs r4, r6\n\t"
  89600. #else
  89601. "sbc r4, r6\n\t"
  89602. #endif
  89603. "stm %[r]!, {r3, r4}\n\t"
  89604. "ldm %[b]!, {r5, r6}\n\t"
  89605. "ldm %[a]!, {r3, r4}\n\t"
  89606. #ifdef WOLFSSL_KEIL
  89607. "sbcs r3, r3, r5\n\t"
  89608. #elif defined(__clang__)
  89609. "sbcs r3, r5\n\t"
  89610. #else
  89611. "sbc r3, r5\n\t"
  89612. #endif
  89613. #ifdef WOLFSSL_KEIL
  89614. "sbcs r4, r4, r6\n\t"
  89615. #elif defined(__clang__)
  89616. "sbcs r4, r6\n\t"
  89617. #else
  89618. "sbc r4, r6\n\t"
  89619. #endif
  89620. "stm %[r]!, {r3, r4}\n\t"
  89621. "ldm %[b]!, {r5, r6}\n\t"
  89622. "ldm %[a]!, {r3, r4}\n\t"
  89623. #ifdef WOLFSSL_KEIL
  89624. "sbcs r3, r3, r5\n\t"
  89625. #elif defined(__clang__)
  89626. "sbcs r3, r5\n\t"
  89627. #else
  89628. "sbc r3, r5\n\t"
  89629. #endif
  89630. #ifdef WOLFSSL_KEIL
  89631. "sbcs r4, r4, r6\n\t"
  89632. #elif defined(__clang__)
  89633. "sbcs r4, r6\n\t"
  89634. #else
  89635. "sbc r4, r6\n\t"
  89636. #endif
  89637. "stm %[r]!, {r3, r4}\n\t"
  89638. "ldm %[b]!, {r5, r6}\n\t"
  89639. "ldm %[a]!, {r3, r4}\n\t"
  89640. #ifdef WOLFSSL_KEIL
  89641. "sbcs r3, r3, r5\n\t"
  89642. #elif defined(__clang__)
  89643. "sbcs r3, r5\n\t"
  89644. #else
  89645. "sbc r3, r5\n\t"
  89646. #endif
  89647. #ifdef WOLFSSL_KEIL
  89648. "sbcs r4, r4, r6\n\t"
  89649. #elif defined(__clang__)
  89650. "sbcs r4, r6\n\t"
  89651. #else
  89652. "sbc r4, r6\n\t"
  89653. #endif
  89654. "stm %[r]!, {r3, r4}\n\t"
  89655. "ldm %[b]!, {r5, r6}\n\t"
  89656. "ldm %[a]!, {r3, r4}\n\t"
  89657. #ifdef WOLFSSL_KEIL
  89658. "sbcs r3, r3, r5\n\t"
  89659. #elif defined(__clang__)
  89660. "sbcs r3, r5\n\t"
  89661. #else
  89662. "sbc r3, r5\n\t"
  89663. #endif
  89664. #ifdef WOLFSSL_KEIL
  89665. "sbcs r4, r4, r6\n\t"
  89666. #elif defined(__clang__)
  89667. "sbcs r4, r6\n\t"
  89668. #else
  89669. "sbc r4, r6\n\t"
  89670. #endif
  89671. "stm %[r]!, {r3, r4}\n\t"
  89672. "ldm %[b]!, {r5, r6}\n\t"
  89673. "ldm %[a]!, {r3, r4}\n\t"
  89674. #ifdef WOLFSSL_KEIL
  89675. "sbcs r3, r3, r5\n\t"
  89676. #elif defined(__clang__)
  89677. "sbcs r3, r5\n\t"
  89678. #else
  89679. "sbc r3, r5\n\t"
  89680. #endif
  89681. #ifdef WOLFSSL_KEIL
  89682. "sbcs r4, r4, r6\n\t"
  89683. #elif defined(__clang__)
  89684. "sbcs r4, r6\n\t"
  89685. #else
  89686. "sbc r4, r6\n\t"
  89687. #endif
  89688. "stm %[r]!, {r3, r4}\n\t"
  89689. "ldm %[b]!, {r5, r6}\n\t"
  89690. "ldm %[a]!, {r3, r4}\n\t"
  89691. #ifdef WOLFSSL_KEIL
  89692. "sbcs r3, r3, r5\n\t"
  89693. #elif defined(__clang__)
  89694. "sbcs r3, r5\n\t"
  89695. #else
  89696. "sbc r3, r5\n\t"
  89697. #endif
  89698. #ifdef WOLFSSL_KEIL
  89699. "sbcs r4, r4, r6\n\t"
  89700. #elif defined(__clang__)
  89701. "sbcs r4, r6\n\t"
  89702. #else
  89703. "sbc r4, r6\n\t"
  89704. #endif
  89705. "stm %[r]!, {r3, r4}\n\t"
  89706. "ldm %[b]!, {r5, r6}\n\t"
  89707. "ldm %[a]!, {r3, r4}\n\t"
  89708. #ifdef WOLFSSL_KEIL
  89709. "sbcs r3, r3, r5\n\t"
  89710. #elif defined(__clang__)
  89711. "sbcs r3, r5\n\t"
  89712. #else
  89713. "sbc r3, r5\n\t"
  89714. #endif
  89715. #ifdef WOLFSSL_KEIL
  89716. "sbcs r4, r4, r6\n\t"
  89717. #elif defined(__clang__)
  89718. "sbcs r4, r6\n\t"
  89719. #else
  89720. "sbc r4, r6\n\t"
  89721. #endif
  89722. "stm %[r]!, {r3, r4}\n\t"
  89723. "ldm %[b]!, {r5, r6}\n\t"
  89724. "ldm %[a]!, {r3, r4}\n\t"
  89725. #ifdef WOLFSSL_KEIL
  89726. "sbcs r3, r3, r5\n\t"
  89727. #elif defined(__clang__)
  89728. "sbcs r3, r5\n\t"
  89729. #else
  89730. "sbc r3, r5\n\t"
  89731. #endif
  89732. #ifdef WOLFSSL_KEIL
  89733. "sbcs r4, r4, r6\n\t"
  89734. #elif defined(__clang__)
  89735. "sbcs r4, r6\n\t"
  89736. #else
  89737. "sbc r4, r6\n\t"
  89738. #endif
  89739. "stm %[r]!, {r3, r4}\n\t"
  89740. "ldm %[b]!, {r5, r6}\n\t"
  89741. "ldm %[a]!, {r3, r4}\n\t"
  89742. #ifdef WOLFSSL_KEIL
  89743. "sbcs r3, r3, r5\n\t"
  89744. #elif defined(__clang__)
  89745. "sbcs r3, r5\n\t"
  89746. #else
  89747. "sbc r3, r5\n\t"
  89748. #endif
  89749. #ifdef WOLFSSL_KEIL
  89750. "sbcs r4, r4, r6\n\t"
  89751. #elif defined(__clang__)
  89752. "sbcs r4, r6\n\t"
  89753. #else
  89754. "sbc r4, r6\n\t"
  89755. #endif
  89756. "stm %[r]!, {r3, r4}\n\t"
  89757. "ldm %[b]!, {r5, r6}\n\t"
  89758. "ldm %[a]!, {r3, r4}\n\t"
  89759. #ifdef WOLFSSL_KEIL
  89760. "sbcs r3, r3, r5\n\t"
  89761. #elif defined(__clang__)
  89762. "sbcs r3, r5\n\t"
  89763. #else
  89764. "sbc r3, r5\n\t"
  89765. #endif
  89766. #ifdef WOLFSSL_KEIL
  89767. "sbcs r4, r4, r6\n\t"
  89768. #elif defined(__clang__)
  89769. "sbcs r4, r6\n\t"
  89770. #else
  89771. "sbc r4, r6\n\t"
  89772. #endif
  89773. "stm %[r]!, {r3, r4}\n\t"
  89774. "ldm %[b]!, {r5, r6}\n\t"
  89775. "ldm %[a]!, {r3, r4}\n\t"
  89776. #ifdef WOLFSSL_KEIL
  89777. "sbcs r3, r3, r5\n\t"
  89778. #elif defined(__clang__)
  89779. "sbcs r3, r5\n\t"
  89780. #else
  89781. "sbc r3, r5\n\t"
  89782. #endif
  89783. #ifdef WOLFSSL_KEIL
  89784. "sbcs r4, r4, r6\n\t"
  89785. #elif defined(__clang__)
  89786. "sbcs r4, r6\n\t"
  89787. #else
  89788. "sbc r4, r6\n\t"
  89789. #endif
  89790. "stm %[r]!, {r3, r4}\n\t"
  89791. "ldm %[b]!, {r5, r6}\n\t"
  89792. "ldm %[a]!, {r3, r4}\n\t"
  89793. #ifdef WOLFSSL_KEIL
  89794. "sbcs r3, r3, r5\n\t"
  89795. #elif defined(__clang__)
  89796. "sbcs r3, r5\n\t"
  89797. #else
  89798. "sbc r3, r5\n\t"
  89799. #endif
  89800. #ifdef WOLFSSL_KEIL
  89801. "sbcs r4, r4, r6\n\t"
  89802. #elif defined(__clang__)
  89803. "sbcs r4, r6\n\t"
  89804. #else
  89805. "sbc r4, r6\n\t"
  89806. #endif
  89807. "stm %[r]!, {r3, r4}\n\t"
  89808. "ldm %[b]!, {r5, r6}\n\t"
  89809. "ldm %[a]!, {r3, r4}\n\t"
  89810. #ifdef WOLFSSL_KEIL
  89811. "sbcs r3, r3, r5\n\t"
  89812. #elif defined(__clang__)
  89813. "sbcs r3, r5\n\t"
  89814. #else
  89815. "sbc r3, r5\n\t"
  89816. #endif
  89817. #ifdef WOLFSSL_KEIL
  89818. "sbcs r4, r4, r6\n\t"
  89819. #elif defined(__clang__)
  89820. "sbcs r4, r6\n\t"
  89821. #else
  89822. "sbc r4, r6\n\t"
  89823. #endif
  89824. "stm %[r]!, {r3, r4}\n\t"
  89825. "ldm %[b]!, {r5, r6}\n\t"
  89826. "ldm %[a]!, {r3, r4}\n\t"
  89827. #ifdef WOLFSSL_KEIL
  89828. "sbcs r3, r3, r5\n\t"
  89829. #elif defined(__clang__)
  89830. "sbcs r3, r5\n\t"
  89831. #else
  89832. "sbc r3, r5\n\t"
  89833. #endif
  89834. #ifdef WOLFSSL_KEIL
  89835. "sbcs r4, r4, r6\n\t"
  89836. #elif defined(__clang__)
  89837. "sbcs r4, r6\n\t"
  89838. #else
  89839. "sbc r4, r6\n\t"
  89840. #endif
  89841. "stm %[r]!, {r3, r4}\n\t"
  89842. "ldm %[b]!, {r5, r6}\n\t"
  89843. "ldm %[a]!, {r3, r4}\n\t"
  89844. #ifdef WOLFSSL_KEIL
  89845. "sbcs r3, r3, r5\n\t"
  89846. #elif defined(__clang__)
  89847. "sbcs r3, r5\n\t"
  89848. #else
  89849. "sbc r3, r5\n\t"
  89850. #endif
  89851. #ifdef WOLFSSL_KEIL
  89852. "sbcs r4, r4, r6\n\t"
  89853. #elif defined(__clang__)
  89854. "sbcs r4, r6\n\t"
  89855. #else
  89856. "sbc r4, r6\n\t"
  89857. #endif
  89858. "stm %[r]!, {r3, r4}\n\t"
  89859. "ldm %[b]!, {r5, r6}\n\t"
  89860. "ldm %[a]!, {r3, r4}\n\t"
  89861. #ifdef WOLFSSL_KEIL
  89862. "sbcs r3, r3, r5\n\t"
  89863. #elif defined(__clang__)
  89864. "sbcs r3, r5\n\t"
  89865. #else
  89866. "sbc r3, r5\n\t"
  89867. #endif
  89868. #ifdef WOLFSSL_KEIL
  89869. "sbcs r4, r4, r6\n\t"
  89870. #elif defined(__clang__)
  89871. "sbcs r4, r6\n\t"
  89872. #else
  89873. "sbc r4, r6\n\t"
  89874. #endif
  89875. "stm %[r]!, {r3, r4}\n\t"
  89876. "ldm %[b]!, {r5, r6}\n\t"
  89877. "ldm %[a]!, {r3, r4}\n\t"
  89878. #ifdef WOLFSSL_KEIL
  89879. "sbcs r3, r3, r5\n\t"
  89880. #elif defined(__clang__)
  89881. "sbcs r3, r5\n\t"
  89882. #else
  89883. "sbc r3, r5\n\t"
  89884. #endif
  89885. #ifdef WOLFSSL_KEIL
  89886. "sbcs r4, r4, r6\n\t"
  89887. #elif defined(__clang__)
  89888. "sbcs r4, r6\n\t"
  89889. #else
  89890. "sbc r4, r6\n\t"
  89891. #endif
  89892. "stm %[r]!, {r3, r4}\n\t"
  89893. "ldm %[b]!, {r5, r6}\n\t"
  89894. "ldm %[a]!, {r3, r4}\n\t"
  89895. #ifdef WOLFSSL_KEIL
  89896. "sbcs r3, r3, r5\n\t"
  89897. #elif defined(__clang__)
  89898. "sbcs r3, r5\n\t"
  89899. #else
  89900. "sbc r3, r5\n\t"
  89901. #endif
  89902. #ifdef WOLFSSL_KEIL
  89903. "sbcs r4, r4, r6\n\t"
  89904. #elif defined(__clang__)
  89905. "sbcs r4, r6\n\t"
  89906. #else
  89907. "sbc r4, r6\n\t"
  89908. #endif
  89909. "stm %[r]!, {r3, r4}\n\t"
  89910. "ldm %[b]!, {r5, r6}\n\t"
  89911. "ldm %[a]!, {r3, r4}\n\t"
  89912. #ifdef WOLFSSL_KEIL
  89913. "sbcs r3, r3, r5\n\t"
  89914. #elif defined(__clang__)
  89915. "sbcs r3, r5\n\t"
  89916. #else
  89917. "sbc r3, r5\n\t"
  89918. #endif
  89919. #ifdef WOLFSSL_KEIL
  89920. "sbcs r4, r4, r6\n\t"
  89921. #elif defined(__clang__)
  89922. "sbcs r4, r6\n\t"
  89923. #else
  89924. "sbc r4, r6\n\t"
  89925. #endif
  89926. "stm %[r]!, {r3, r4}\n\t"
  89927. "ldm %[b]!, {r5, r6}\n\t"
  89928. "ldm %[a]!, {r3, r4}\n\t"
  89929. #ifdef WOLFSSL_KEIL
  89930. "sbcs r3, r3, r5\n\t"
  89931. #elif defined(__clang__)
  89932. "sbcs r3, r5\n\t"
  89933. #else
  89934. "sbc r3, r5\n\t"
  89935. #endif
  89936. #ifdef WOLFSSL_KEIL
  89937. "sbcs r4, r4, r6\n\t"
  89938. #elif defined(__clang__)
  89939. "sbcs r4, r6\n\t"
  89940. #else
  89941. "sbc r4, r6\n\t"
  89942. #endif
  89943. "stm %[r]!, {r3, r4}\n\t"
  89944. "ldm %[b]!, {r5, r6}\n\t"
  89945. "ldm %[a]!, {r3, r4}\n\t"
  89946. #ifdef WOLFSSL_KEIL
  89947. "sbcs r3, r3, r5\n\t"
  89948. #elif defined(__clang__)
  89949. "sbcs r3, r5\n\t"
  89950. #else
  89951. "sbc r3, r5\n\t"
  89952. #endif
  89953. #ifdef WOLFSSL_KEIL
  89954. "sbcs r4, r4, r6\n\t"
  89955. #elif defined(__clang__)
  89956. "sbcs r4, r6\n\t"
  89957. #else
  89958. "sbc r4, r6\n\t"
  89959. #endif
  89960. "stm %[r]!, {r3, r4}\n\t"
  89961. "ldm %[b]!, {r5, r6}\n\t"
  89962. "ldm %[a]!, {r3, r4}\n\t"
  89963. #ifdef WOLFSSL_KEIL
  89964. "sbcs r3, r3, r5\n\t"
  89965. #elif defined(__clang__)
  89966. "sbcs r3, r5\n\t"
  89967. #else
  89968. "sbc r3, r5\n\t"
  89969. #endif
  89970. #ifdef WOLFSSL_KEIL
  89971. "sbcs r4, r4, r6\n\t"
  89972. #elif defined(__clang__)
  89973. "sbcs r4, r6\n\t"
  89974. #else
  89975. "sbc r4, r6\n\t"
  89976. #endif
  89977. "stm %[r]!, {r3, r4}\n\t"
  89978. "ldm %[b]!, {r5, r6}\n\t"
  89979. "ldm %[a]!, {r3, r4}\n\t"
  89980. #ifdef WOLFSSL_KEIL
  89981. "sbcs r3, r3, r5\n\t"
  89982. #elif defined(__clang__)
  89983. "sbcs r3, r5\n\t"
  89984. #else
  89985. "sbc r3, r5\n\t"
  89986. #endif
  89987. #ifdef WOLFSSL_KEIL
  89988. "sbcs r4, r4, r6\n\t"
  89989. #elif defined(__clang__)
  89990. "sbcs r4, r6\n\t"
  89991. #else
  89992. "sbc r4, r6\n\t"
  89993. #endif
  89994. "stm %[r]!, {r3, r4}\n\t"
  89995. "ldm %[b]!, {r5, r6}\n\t"
  89996. "ldm %[a]!, {r3, r4}\n\t"
  89997. #ifdef WOLFSSL_KEIL
  89998. "sbcs r3, r3, r5\n\t"
  89999. #elif defined(__clang__)
  90000. "sbcs r3, r5\n\t"
  90001. #else
  90002. "sbc r3, r5\n\t"
  90003. #endif
  90004. #ifdef WOLFSSL_KEIL
  90005. "sbcs r4, r4, r6\n\t"
  90006. #elif defined(__clang__)
  90007. "sbcs r4, r6\n\t"
  90008. #else
  90009. "sbc r4, r6\n\t"
  90010. #endif
  90011. "stm %[r]!, {r3, r4}\n\t"
  90012. "ldm %[b]!, {r5, r6}\n\t"
  90013. "ldm %[a]!, {r3, r4}\n\t"
  90014. #ifdef WOLFSSL_KEIL
  90015. "sbcs r3, r3, r5\n\t"
  90016. #elif defined(__clang__)
  90017. "sbcs r3, r5\n\t"
  90018. #else
  90019. "sbc r3, r5\n\t"
  90020. #endif
  90021. #ifdef WOLFSSL_KEIL
  90022. "sbcs r4, r4, r6\n\t"
  90023. #elif defined(__clang__)
  90024. "sbcs r4, r6\n\t"
  90025. #else
  90026. "sbc r4, r6\n\t"
  90027. #endif
  90028. "stm %[r]!, {r3, r4}\n\t"
  90029. "ldm %[b]!, {r5, r6}\n\t"
  90030. "ldm %[a]!, {r3, r4}\n\t"
  90031. #ifdef WOLFSSL_KEIL
  90032. "sbcs r3, r3, r5\n\t"
  90033. #elif defined(__clang__)
  90034. "sbcs r3, r5\n\t"
  90035. #else
  90036. "sbc r3, r5\n\t"
  90037. #endif
  90038. #ifdef WOLFSSL_KEIL
  90039. "sbcs r4, r4, r6\n\t"
  90040. #elif defined(__clang__)
  90041. "sbcs r4, r6\n\t"
  90042. #else
  90043. "sbc r4, r6\n\t"
  90044. #endif
  90045. "stm %[r]!, {r3, r4}\n\t"
  90046. "ldm %[b]!, {r5, r6}\n\t"
  90047. "ldm %[a]!, {r3, r4}\n\t"
  90048. #ifdef WOLFSSL_KEIL
  90049. "sbcs r3, r3, r5\n\t"
  90050. #elif defined(__clang__)
  90051. "sbcs r3, r5\n\t"
  90052. #else
  90053. "sbc r3, r5\n\t"
  90054. #endif
  90055. #ifdef WOLFSSL_KEIL
  90056. "sbcs r4, r4, r6\n\t"
  90057. #elif defined(__clang__)
  90058. "sbcs r4, r6\n\t"
  90059. #else
  90060. "sbc r4, r6\n\t"
  90061. #endif
  90062. "stm %[r]!, {r3, r4}\n\t"
  90063. "ldm %[b]!, {r5, r6}\n\t"
  90064. "ldm %[a]!, {r3, r4}\n\t"
  90065. #ifdef WOLFSSL_KEIL
  90066. "sbcs r3, r3, r5\n\t"
  90067. #elif defined(__clang__)
  90068. "sbcs r3, r5\n\t"
  90069. #else
  90070. "sbc r3, r5\n\t"
  90071. #endif
  90072. #ifdef WOLFSSL_KEIL
  90073. "sbcs r4, r4, r6\n\t"
  90074. #elif defined(__clang__)
  90075. "sbcs r4, r6\n\t"
  90076. #else
  90077. "sbc r4, r6\n\t"
  90078. #endif
  90079. "stm %[r]!, {r3, r4}\n\t"
  90080. #ifdef WOLFSSL_KEIL
  90081. "sbcs %[r], %[r], %[r]\n\t"
  90082. #elif defined(__clang__)
  90083. "sbcs %[r], %[r]\n\t"
  90084. #else
  90085. "sbc %[r], %[r]\n\t"
  90086. #endif
  90087. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  90088. :
  90089. : "memory", "r3", "r4", "r5", "r6"
  90090. );
  90091. return (uint32_t)(size_t)r;
  90092. }
  90093. #endif /* WOLFSSL_SP_SMALL */
  90094. /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
  90095. *
  90096. * d1 The high order half of the number to divide.
  90097. * d0 The low order half of the number to divide.
  90098. * div The dividend.
  90099. * returns the result of the division.
  90100. *
  90101. * Note that this is an approximate div. It may give an answer 1 larger.
  90102. */
  90103. SP_NOINLINE static sp_digit div_4096_word_128(sp_digit d1, sp_digit d0,
  90104. sp_digit div)
  90105. {
  90106. __asm__ __volatile__ (
  90107. "movs r3, #0\n\t"
  90108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90109. "lsrs r5, %[div], #1\n\t"
  90110. #else
  90111. "lsr r5, %[div], #1\n\t"
  90112. #endif
  90113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90114. "adds r5, r5, #1\n\t"
  90115. #else
  90116. "add r5, r5, #1\n\t"
  90117. #endif
  90118. "mov r8, %[d0]\n\t"
  90119. "mov r9, %[d1]\n\t"
  90120. "# Do top 32\n\t"
  90121. "movs r6, r5\n\t"
  90122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90123. "subs r6, r6, %[d1]\n\t"
  90124. #else
  90125. "sub r6, r6, %[d1]\n\t"
  90126. #endif
  90127. #ifdef WOLFSSL_KEIL
  90128. "sbcs r6, r6, r6\n\t"
  90129. #elif defined(__clang__)
  90130. "sbcs r6, r6\n\t"
  90131. #else
  90132. "sbc r6, r6\n\t"
  90133. #endif
  90134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90135. "adds r3, r3, r3\n\t"
  90136. #else
  90137. "add r3, r3, r3\n\t"
  90138. #endif
  90139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90140. "subs r3, r3, r6\n\t"
  90141. #else
  90142. "sub r3, r3, r6\n\t"
  90143. #endif
  90144. #ifdef WOLFSSL_KEIL
  90145. "ands r6, r6, r5\n\t"
  90146. #elif defined(__clang__)
  90147. "ands r6, r5\n\t"
  90148. #else
  90149. "and r6, r5\n\t"
  90150. #endif
  90151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90152. "subs %[d1], %[d1], r6\n\t"
  90153. #else
  90154. "sub %[d1], %[d1], r6\n\t"
  90155. #endif
  90156. "movs r4, #29\n\t"
  90157. "\n"
  90158. "L_div_4096_word_128_loop_%=:\n\t"
  90159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90160. "lsls %[d0], %[d0], #1\n\t"
  90161. #else
  90162. "lsl %[d0], %[d0], #1\n\t"
  90163. #endif
  90164. #ifdef WOLFSSL_KEIL
  90165. "adcs %[d1], %[d1], %[d1]\n\t"
  90166. #elif defined(__clang__)
  90167. "adcs %[d1], %[d1]\n\t"
  90168. #else
  90169. "adc %[d1], %[d1]\n\t"
  90170. #endif
  90171. "movs r6, r5\n\t"
  90172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90173. "subs r6, r6, %[d1]\n\t"
  90174. #else
  90175. "sub r6, r6, %[d1]\n\t"
  90176. #endif
  90177. #ifdef WOLFSSL_KEIL
  90178. "sbcs r6, r6, r6\n\t"
  90179. #elif defined(__clang__)
  90180. "sbcs r6, r6\n\t"
  90181. #else
  90182. "sbc r6, r6\n\t"
  90183. #endif
  90184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90185. "adds r3, r3, r3\n\t"
  90186. #else
  90187. "add r3, r3, r3\n\t"
  90188. #endif
  90189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90190. "subs r3, r3, r6\n\t"
  90191. #else
  90192. "sub r3, r3, r6\n\t"
  90193. #endif
  90194. #ifdef WOLFSSL_KEIL
  90195. "ands r6, r6, r5\n\t"
  90196. #elif defined(__clang__)
  90197. "ands r6, r5\n\t"
  90198. #else
  90199. "and r6, r5\n\t"
  90200. #endif
  90201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90202. "subs %[d1], %[d1], r6\n\t"
  90203. #else
  90204. "sub %[d1], %[d1], r6\n\t"
  90205. #endif
  90206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90207. "subs r4, r4, #1\n\t"
  90208. #else
  90209. "sub r4, r4, #1\n\t"
  90210. #endif
  90211. "bpl L_div_4096_word_128_loop_%=\n\t"
  90212. "movs r7, #0\n\t"
  90213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90214. "adds r3, r3, r3\n\t"
  90215. #else
  90216. "add r3, r3, r3\n\t"
  90217. #endif
  90218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90219. "adds r3, r3, #1\n\t"
  90220. #else
  90221. "add r3, r3, #1\n\t"
  90222. #endif
  90223. "# r * div - Start\n\t"
  90224. "uxth %[d1], r3\n\t"
  90225. "uxth r4, %[div]\n\t"
  90226. #ifdef WOLFSSL_KEIL
  90227. "muls r4, %[d1], r4\n\t"
  90228. #elif defined(__clang__)
  90229. "muls r4, %[d1]\n\t"
  90230. #else
  90231. "mul r4, %[d1]\n\t"
  90232. #endif
  90233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90234. "lsrs r6, %[div], #16\n\t"
  90235. #else
  90236. "lsr r6, %[div], #16\n\t"
  90237. #endif
  90238. #ifdef WOLFSSL_KEIL
  90239. "muls %[d1], r6, %[d1]\n\t"
  90240. #elif defined(__clang__)
  90241. "muls %[d1], r6\n\t"
  90242. #else
  90243. "mul %[d1], r6\n\t"
  90244. #endif
  90245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90246. "lsrs r5, %[d1], #16\n\t"
  90247. #else
  90248. "lsr r5, %[d1], #16\n\t"
  90249. #endif
  90250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90251. "lsls %[d1], %[d1], #16\n\t"
  90252. #else
  90253. "lsl %[d1], %[d1], #16\n\t"
  90254. #endif
  90255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90256. "adds r4, r4, %[d1]\n\t"
  90257. #else
  90258. "add r4, r4, %[d1]\n\t"
  90259. #endif
  90260. #ifdef WOLFSSL_KEIL
  90261. "adcs r5, r5, r7\n\t"
  90262. #elif defined(__clang__)
  90263. "adcs r5, r7\n\t"
  90264. #else
  90265. "adc r5, r7\n\t"
  90266. #endif
  90267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90268. "lsrs %[d1], r3, #16\n\t"
  90269. #else
  90270. "lsr %[d1], r3, #16\n\t"
  90271. #endif
  90272. #ifdef WOLFSSL_KEIL
  90273. "muls r6, %[d1], r6\n\t"
  90274. #elif defined(__clang__)
  90275. "muls r6, %[d1]\n\t"
  90276. #else
  90277. "mul r6, %[d1]\n\t"
  90278. #endif
  90279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90280. "adds r5, r5, r6\n\t"
  90281. #else
  90282. "add r5, r5, r6\n\t"
  90283. #endif
  90284. "uxth r6, %[div]\n\t"
  90285. #ifdef WOLFSSL_KEIL
  90286. "muls %[d1], r6, %[d1]\n\t"
  90287. #elif defined(__clang__)
  90288. "muls %[d1], r6\n\t"
  90289. #else
  90290. "mul %[d1], r6\n\t"
  90291. #endif
  90292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90293. "lsrs r6, %[d1], #16\n\t"
  90294. #else
  90295. "lsr r6, %[d1], #16\n\t"
  90296. #endif
  90297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90298. "lsls %[d1], %[d1], #16\n\t"
  90299. #else
  90300. "lsl %[d1], %[d1], #16\n\t"
  90301. #endif
  90302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90303. "adds r4, r4, %[d1]\n\t"
  90304. #else
  90305. "add r4, r4, %[d1]\n\t"
  90306. #endif
  90307. #ifdef WOLFSSL_KEIL
  90308. "adcs r5, r5, r6\n\t"
  90309. #elif defined(__clang__)
  90310. "adcs r5, r6\n\t"
  90311. #else
  90312. "adc r5, r6\n\t"
  90313. #endif
  90314. "# r * div - Done\n\t"
  90315. "mov %[d1], r8\n\t"
  90316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90317. "subs %[d1], %[d1], r4\n\t"
  90318. #else
  90319. "sub %[d1], %[d1], r4\n\t"
  90320. #endif
  90321. "movs r4, %[d1]\n\t"
  90322. "mov %[d1], r9\n\t"
  90323. #ifdef WOLFSSL_KEIL
  90324. "sbcs %[d1], %[d1], r5\n\t"
  90325. #elif defined(__clang__)
  90326. "sbcs %[d1], r5\n\t"
  90327. #else
  90328. "sbc %[d1], r5\n\t"
  90329. #endif
  90330. "movs r5, %[d1]\n\t"
  90331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90332. "adds r3, r3, r5\n\t"
  90333. #else
  90334. "add r3, r3, r5\n\t"
  90335. #endif
  90336. "# r * div - Start\n\t"
  90337. "uxth %[d1], r3\n\t"
  90338. "uxth r4, %[div]\n\t"
  90339. #ifdef WOLFSSL_KEIL
  90340. "muls r4, %[d1], r4\n\t"
  90341. #elif defined(__clang__)
  90342. "muls r4, %[d1]\n\t"
  90343. #else
  90344. "mul r4, %[d1]\n\t"
  90345. #endif
  90346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90347. "lsrs r6, %[div], #16\n\t"
  90348. #else
  90349. "lsr r6, %[div], #16\n\t"
  90350. #endif
  90351. #ifdef WOLFSSL_KEIL
  90352. "muls %[d1], r6, %[d1]\n\t"
  90353. #elif defined(__clang__)
  90354. "muls %[d1], r6\n\t"
  90355. #else
  90356. "mul %[d1], r6\n\t"
  90357. #endif
  90358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90359. "lsrs r5, %[d1], #16\n\t"
  90360. #else
  90361. "lsr r5, %[d1], #16\n\t"
  90362. #endif
  90363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90364. "lsls %[d1], %[d1], #16\n\t"
  90365. #else
  90366. "lsl %[d1], %[d1], #16\n\t"
  90367. #endif
  90368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90369. "adds r4, r4, %[d1]\n\t"
  90370. #else
  90371. "add r4, r4, %[d1]\n\t"
  90372. #endif
  90373. #ifdef WOLFSSL_KEIL
  90374. "adcs r5, r5, r7\n\t"
  90375. #elif defined(__clang__)
  90376. "adcs r5, r7\n\t"
  90377. #else
  90378. "adc r5, r7\n\t"
  90379. #endif
  90380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90381. "lsrs %[d1], r3, #16\n\t"
  90382. #else
  90383. "lsr %[d1], r3, #16\n\t"
  90384. #endif
  90385. #ifdef WOLFSSL_KEIL
  90386. "muls r6, %[d1], r6\n\t"
  90387. #elif defined(__clang__)
  90388. "muls r6, %[d1]\n\t"
  90389. #else
  90390. "mul r6, %[d1]\n\t"
  90391. #endif
  90392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90393. "adds r5, r5, r6\n\t"
  90394. #else
  90395. "add r5, r5, r6\n\t"
  90396. #endif
  90397. "uxth r6, %[div]\n\t"
  90398. #ifdef WOLFSSL_KEIL
  90399. "muls %[d1], r6, %[d1]\n\t"
  90400. #elif defined(__clang__)
  90401. "muls %[d1], r6\n\t"
  90402. #else
  90403. "mul %[d1], r6\n\t"
  90404. #endif
  90405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90406. "lsrs r6, %[d1], #16\n\t"
  90407. #else
  90408. "lsr r6, %[d1], #16\n\t"
  90409. #endif
  90410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90411. "lsls %[d1], %[d1], #16\n\t"
  90412. #else
  90413. "lsl %[d1], %[d1], #16\n\t"
  90414. #endif
  90415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90416. "adds r4, r4, %[d1]\n\t"
  90417. #else
  90418. "add r4, r4, %[d1]\n\t"
  90419. #endif
  90420. #ifdef WOLFSSL_KEIL
  90421. "adcs r5, r5, r6\n\t"
  90422. #elif defined(__clang__)
  90423. "adcs r5, r6\n\t"
  90424. #else
  90425. "adc r5, r6\n\t"
  90426. #endif
  90427. "# r * div - Done\n\t"
  90428. "mov %[d1], r8\n\t"
  90429. "mov r6, r9\n\t"
  90430. #ifdef WOLFSSL_KEIL
  90431. "subs r4, %[d1], r4\n\t"
  90432. #else
  90433. #ifdef __clang__
  90434. "subs r4, %[d1], r4\n\t"
  90435. #else
  90436. "sub r4, %[d1], r4\n\t"
  90437. #endif
  90438. #endif
  90439. #ifdef WOLFSSL_KEIL
  90440. "sbcs r6, r6, r5\n\t"
  90441. #elif defined(__clang__)
  90442. "sbcs r6, r5\n\t"
  90443. #else
  90444. "sbc r6, r5\n\t"
  90445. #endif
  90446. "movs r5, r6\n\t"
  90447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90448. "adds r3, r3, r5\n\t"
  90449. #else
  90450. "add r3, r3, r5\n\t"
  90451. #endif
  90452. "# r * div - Start\n\t"
  90453. "uxth %[d1], r3\n\t"
  90454. "uxth r4, %[div]\n\t"
  90455. #ifdef WOLFSSL_KEIL
  90456. "muls r4, %[d1], r4\n\t"
  90457. #elif defined(__clang__)
  90458. "muls r4, %[d1]\n\t"
  90459. #else
  90460. "mul r4, %[d1]\n\t"
  90461. #endif
  90462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90463. "lsrs r6, %[div], #16\n\t"
  90464. #else
  90465. "lsr r6, %[div], #16\n\t"
  90466. #endif
  90467. #ifdef WOLFSSL_KEIL
  90468. "muls %[d1], r6, %[d1]\n\t"
  90469. #elif defined(__clang__)
  90470. "muls %[d1], r6\n\t"
  90471. #else
  90472. "mul %[d1], r6\n\t"
  90473. #endif
  90474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90475. "lsrs r5, %[d1], #16\n\t"
  90476. #else
  90477. "lsr r5, %[d1], #16\n\t"
  90478. #endif
  90479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90480. "lsls %[d1], %[d1], #16\n\t"
  90481. #else
  90482. "lsl %[d1], %[d1], #16\n\t"
  90483. #endif
  90484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90485. "adds r4, r4, %[d1]\n\t"
  90486. #else
  90487. "add r4, r4, %[d1]\n\t"
  90488. #endif
  90489. #ifdef WOLFSSL_KEIL
  90490. "adcs r5, r5, r7\n\t"
  90491. #elif defined(__clang__)
  90492. "adcs r5, r7\n\t"
  90493. #else
  90494. "adc r5, r7\n\t"
  90495. #endif
  90496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90497. "lsrs %[d1], r3, #16\n\t"
  90498. #else
  90499. "lsr %[d1], r3, #16\n\t"
  90500. #endif
  90501. #ifdef WOLFSSL_KEIL
  90502. "muls r6, %[d1], r6\n\t"
  90503. #elif defined(__clang__)
  90504. "muls r6, %[d1]\n\t"
  90505. #else
  90506. "mul r6, %[d1]\n\t"
  90507. #endif
  90508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90509. "adds r5, r5, r6\n\t"
  90510. #else
  90511. "add r5, r5, r6\n\t"
  90512. #endif
  90513. "uxth r6, %[div]\n\t"
  90514. #ifdef WOLFSSL_KEIL
  90515. "muls %[d1], r6, %[d1]\n\t"
  90516. #elif defined(__clang__)
  90517. "muls %[d1], r6\n\t"
  90518. #else
  90519. "mul %[d1], r6\n\t"
  90520. #endif
  90521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90522. "lsrs r6, %[d1], #16\n\t"
  90523. #else
  90524. "lsr r6, %[d1], #16\n\t"
  90525. #endif
  90526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90527. "lsls %[d1], %[d1], #16\n\t"
  90528. #else
  90529. "lsl %[d1], %[d1], #16\n\t"
  90530. #endif
  90531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90532. "adds r4, r4, %[d1]\n\t"
  90533. #else
  90534. "add r4, r4, %[d1]\n\t"
  90535. #endif
  90536. #ifdef WOLFSSL_KEIL
  90537. "adcs r5, r5, r6\n\t"
  90538. #elif defined(__clang__)
  90539. "adcs r5, r6\n\t"
  90540. #else
  90541. "adc r5, r6\n\t"
  90542. #endif
  90543. "# r * div - Done\n\t"
  90544. "mov %[d1], r8\n\t"
  90545. "mov r6, r9\n\t"
  90546. #ifdef WOLFSSL_KEIL
  90547. "subs r4, %[d1], r4\n\t"
  90548. #else
  90549. #ifdef __clang__
  90550. "subs r4, %[d1], r4\n\t"
  90551. #else
  90552. "sub r4, %[d1], r4\n\t"
  90553. #endif
  90554. #endif
  90555. #ifdef WOLFSSL_KEIL
  90556. "sbcs r6, r6, r5\n\t"
  90557. #elif defined(__clang__)
  90558. "sbcs r6, r5\n\t"
  90559. #else
  90560. "sbc r6, r5\n\t"
  90561. #endif
  90562. "movs r5, r6\n\t"
  90563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90564. "adds r3, r3, r5\n\t"
  90565. #else
  90566. "add r3, r3, r5\n\t"
  90567. #endif
  90568. "movs r6, %[div]\n\t"
  90569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90570. "subs r6, r6, r4\n\t"
  90571. #else
  90572. "sub r6, r6, r4\n\t"
  90573. #endif
  90574. #ifdef WOLFSSL_KEIL
  90575. "sbcs r6, r6, r6\n\t"
  90576. #elif defined(__clang__)
  90577. "sbcs r6, r6\n\t"
  90578. #else
  90579. "sbc r6, r6\n\t"
  90580. #endif
  90581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90582. "subs r3, r3, r6\n\t"
  90583. #else
  90584. "sub r3, r3, r6\n\t"
  90585. #endif
  90586. "movs %[d1], r3\n\t"
  90587. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  90588. :
  90589. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  90590. );
  90591. return (uint32_t)(size_t)d1;
  90592. }
  90593. /* Divide d in a and put remainder into r (m*d + r = a)
  90594. * m is not calculated as it is not needed at this time.
  90595. *
  90596. * a Number to be divided.
  90597. * d Number to divide with.
  90598. * m Multiplier result.
  90599. * r Remainder from the division.
  90600. * returns MP_OKAY indicating success.
  90601. */
  90602. static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  90603. sp_digit* r)
  90604. {
  90605. sp_digit t1[256], t2[129];
  90606. sp_digit div, r1;
  90607. int i;
  90608. (void)m;
  90609. div = d[127];
  90610. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  90611. for (i=127; i>=0; i--) {
  90612. sp_digit hi = t1[128 + i] - (t1[128 + i] == div);
  90613. r1 = div_4096_word_128(hi, t1[128 + i - 1], div);
  90614. sp_4096_mul_d_128(t2, d, r1);
  90615. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  90616. t1[128 + i] -= t2[128];
  90617. if (t1[128 + i] != 0) {
  90618. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  90619. if (t1[128 + i] != 0)
  90620. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  90621. }
  90622. }
  90623. for (i = 127; i > 0; i--) {
  90624. if (t1[i] != d[i])
  90625. break;
  90626. }
  90627. if (t1[i] >= d[i]) {
  90628. sp_4096_sub_128(r, t1, d);
  90629. }
  90630. else {
  90631. XMEMCPY(r, t1, sizeof(*t1) * 128);
  90632. }
  90633. return MP_OKAY;
  90634. }
  90635. /* Reduce a modulo m into r. (r = a mod m)
  90636. *
  90637. * r A single precision number that is the reduced result.
  90638. * a A single precision number that is to be reduced.
  90639. * m A single precision number that is the modulus to reduce with.
  90640. * returns MP_OKAY indicating success.
  90641. */
  90642. static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  90643. {
  90644. return sp_4096_div_128_cond(a, m, NULL, r);
  90645. }
  90646. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  90647. /* AND m into each word of a and store in r.
  90648. *
  90649. * r A single precision integer.
  90650. * a A single precision integer.
  90651. * m Mask to AND against each digit.
  90652. */
  90653. static void sp_4096_mask_128(sp_digit* r, const sp_digit* a, sp_digit m)
  90654. {
  90655. #ifdef WOLFSSL_SP_SMALL
  90656. int i;
  90657. for (i=0; i<128; i++) {
  90658. r[i] = a[i] & m;
  90659. }
  90660. #else
  90661. int i;
  90662. for (i = 0; i < 128; i += 8) {
  90663. r[i+0] = a[i+0] & m;
  90664. r[i+1] = a[i+1] & m;
  90665. r[i+2] = a[i+2] & m;
  90666. r[i+3] = a[i+3] & m;
  90667. r[i+4] = a[i+4] & m;
  90668. r[i+5] = a[i+5] & m;
  90669. r[i+6] = a[i+6] & m;
  90670. r[i+7] = a[i+7] & m;
  90671. }
  90672. #endif
  90673. }
  90674. /* Compare a with b in constant time.
  90675. *
  90676. * a A single precision integer.
  90677. * b A single precision integer.
  90678. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  90679. * respectively.
  90680. */
  90681. SP_NOINLINE static sp_int32 sp_4096_cmp_128(const sp_digit* a,
  90682. const sp_digit* b)
  90683. {
  90684. __asm__ __volatile__ (
  90685. "movs r2, #0\n\t"
  90686. "movs r3, #0\n\t"
  90687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90688. "mvns r3, r3\n\t"
  90689. #else
  90690. "mvn r3, r3\n\t"
  90691. #endif
  90692. "movs r6, #0xff\n\t"
  90693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90694. "adds r6, r6, #0xfd\n\t"
  90695. #else
  90696. "add r6, r6, #0xfd\n\t"
  90697. #endif
  90698. "\n"
  90699. "L_sp_4096_cmp_128_words_%=:\n\t"
  90700. "ldr r7, [%[a], r6]\n\t"
  90701. "ldr r5, [%[b], r6]\n\t"
  90702. #ifdef WOLFSSL_KEIL
  90703. "ands r7, r7, r3\n\t"
  90704. #elif defined(__clang__)
  90705. "ands r7, r3\n\t"
  90706. #else
  90707. "and r7, r3\n\t"
  90708. #endif
  90709. #ifdef WOLFSSL_KEIL
  90710. "ands r5, r5, r3\n\t"
  90711. #elif defined(__clang__)
  90712. "ands r5, r3\n\t"
  90713. #else
  90714. "and r5, r3\n\t"
  90715. #endif
  90716. "movs r4, r7\n\t"
  90717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90718. "subs r7, r7, r5\n\t"
  90719. #else
  90720. "sub r7, r7, r5\n\t"
  90721. #endif
  90722. #ifdef WOLFSSL_KEIL
  90723. "sbcs r7, r7, r7\n\t"
  90724. #elif defined(__clang__)
  90725. "sbcs r7, r7\n\t"
  90726. #else
  90727. "sbc r7, r7\n\t"
  90728. #endif
  90729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90730. "adds r2, r2, r7\n\t"
  90731. #else
  90732. "add r2, r2, r7\n\t"
  90733. #endif
  90734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90735. "mvns r7, r7\n\t"
  90736. #else
  90737. "mvn r7, r7\n\t"
  90738. #endif
  90739. #ifdef WOLFSSL_KEIL
  90740. "ands r3, r3, r7\n\t"
  90741. #elif defined(__clang__)
  90742. "ands r3, r7\n\t"
  90743. #else
  90744. "and r3, r7\n\t"
  90745. #endif
  90746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90747. "subs r5, r5, r4\n\t"
  90748. #else
  90749. "sub r5, r5, r4\n\t"
  90750. #endif
  90751. #ifdef WOLFSSL_KEIL
  90752. "sbcs r7, r7, r7\n\t"
  90753. #elif defined(__clang__)
  90754. "sbcs r7, r7\n\t"
  90755. #else
  90756. "sbc r7, r7\n\t"
  90757. #endif
  90758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90759. "subs r2, r2, r7\n\t"
  90760. #else
  90761. "sub r2, r2, r7\n\t"
  90762. #endif
  90763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90764. "mvns r7, r7\n\t"
  90765. #else
  90766. "mvn r7, r7\n\t"
  90767. #endif
  90768. #ifdef WOLFSSL_KEIL
  90769. "ands r3, r3, r7\n\t"
  90770. #elif defined(__clang__)
  90771. "ands r3, r7\n\t"
  90772. #else
  90773. "and r3, r7\n\t"
  90774. #endif
  90775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90776. "subs r6, r6, #4\n\t"
  90777. #else
  90778. "sub r6, r6, #4\n\t"
  90779. #endif
  90780. "cmp r6, #0\n\t"
  90781. "bge L_sp_4096_cmp_128_words_%=\n\t"
  90782. "movs %[a], r2\n\t"
  90783. : [a] "+r" (a), [b] "+r" (b)
  90784. :
  90785. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  90786. );
  90787. return (uint32_t)(size_t)a;
  90788. }
  90789. /* Divide d in a and put remainder into r (m*d + r = a)
  90790. * m is not calculated as it is not needed at this time.
  90791. *
  90792. * a Number to be divided.
  90793. * d Number to divide with.
  90794. * m Multiplier result.
  90795. * r Remainder from the division.
  90796. * returns MP_OKAY indicating success.
  90797. */
  90798. static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d, sp_digit* m,
  90799. sp_digit* r)
  90800. {
  90801. sp_digit t1[256], t2[129];
  90802. sp_digit div, r1;
  90803. int i;
  90804. (void)m;
  90805. div = d[127];
  90806. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  90807. for (i=127; i>=0; i--) {
  90808. sp_digit hi = t1[128 + i] - (t1[128 + i] == div);
  90809. r1 = div_4096_word_128(hi, t1[128 + i - 1], div);
  90810. sp_4096_mul_d_128(t2, d, r1);
  90811. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  90812. t1[128 + i] -= t2[128];
  90813. sp_4096_mask_128(t2, d, t1[128 + i]);
  90814. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  90815. sp_4096_mask_128(t2, d, t1[128 + i]);
  90816. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  90817. }
  90818. r1 = sp_4096_cmp_128(t1, d) >= 0;
  90819. sp_4096_cond_sub_128(r, t1, d, (sp_digit)0 - r1);
  90820. return MP_OKAY;
  90821. }
  90822. /* Reduce a modulo m into r. (r = a mod m)
  90823. *
  90824. * r A single precision number that is the reduced result.
  90825. * a A single precision number that is to be reduced.
  90826. * m A single precision number that is the modulus to reduce with.
  90827. * returns MP_OKAY indicating success.
  90828. */
  90829. static WC_INLINE int sp_4096_mod_128(sp_digit* r, const sp_digit* a, const sp_digit* m)
  90830. {
  90831. return sp_4096_div_128(a, m, NULL, r);
  90832. }
  90833. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  90834. defined(WOLFSSL_HAVE_SP_DH)
  90835. #ifdef WOLFSSL_SP_SMALL
  90836. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  90837. *
  90838. * r A single precision number that is the result of the operation.
  90839. * a A single precision number being exponentiated.
  90840. * e A single precision number that is the exponent.
  90841. * bits The number of bits in the exponent.
  90842. * m A single precision number that is the modulus.
  90843. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  90844. */
  90845. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  90846. int bits, const sp_digit* m, int reduceA)
  90847. {
  90848. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90849. sp_digit* td = NULL;
  90850. #else
  90851. sp_digit td[8 * 256];
  90852. #endif
  90853. sp_digit* t[8];
  90854. sp_digit* norm = NULL;
  90855. sp_digit mp = 1;
  90856. sp_digit n;
  90857. sp_digit mask;
  90858. int i;
  90859. int c;
  90860. byte y;
  90861. int err = MP_OKAY;
  90862. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90863. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 256), NULL,
  90864. DYNAMIC_TYPE_TMP_BUFFER);
  90865. if (td == NULL)
  90866. err = MEMORY_E;
  90867. #endif
  90868. if (err == MP_OKAY) {
  90869. norm = td;
  90870. for (i=0; i<8; i++) {
  90871. t[i] = td + i * 256;
  90872. }
  90873. sp_4096_mont_setup(m, &mp);
  90874. sp_4096_mont_norm_128(norm, m);
  90875. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  90876. if (reduceA != 0) {
  90877. err = sp_4096_mod_128(t[1] + 128, a, m);
  90878. if (err == MP_OKAY) {
  90879. err = sp_4096_mod_128(t[1], t[1], m);
  90880. }
  90881. }
  90882. else {
  90883. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  90884. err = sp_4096_mod_128(t[1], t[1], m);
  90885. }
  90886. }
  90887. if (err == MP_OKAY) {
  90888. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  90889. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  90890. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  90891. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  90892. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  90893. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  90894. i = (bits - 1) / 32;
  90895. n = e[i--];
  90896. c = bits & 31;
  90897. if (c == 0) {
  90898. c = 32;
  90899. }
  90900. c -= bits % 3;
  90901. if (c == 32) {
  90902. c = 29;
  90903. }
  90904. if (c < 0) {
  90905. /* Number of bits in top word is less than number needed. */
  90906. c = -c;
  90907. y = (byte)(n << c);
  90908. n = e[i--];
  90909. y |= (byte)(n >> (64 - c));
  90910. n <<= c;
  90911. c = 64 - c;
  90912. }
  90913. else {
  90914. y = (byte)(n >> c);
  90915. n <<= 32 - c;
  90916. }
  90917. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  90918. for (; i>=0 || c>=3; ) {
  90919. if (c == 0) {
  90920. n = e[i--];
  90921. y = (byte)(n >> 29);
  90922. n <<= 3;
  90923. c = 29;
  90924. }
  90925. else if (c < 3) {
  90926. y = (byte)(n >> 29);
  90927. n = e[i--];
  90928. c = 3 - c;
  90929. y |= (byte)(n >> (32 - c));
  90930. n <<= c;
  90931. c = 32 - c;
  90932. }
  90933. else {
  90934. y = (byte)((n >> 29) & 0x7);
  90935. n <<= 3;
  90936. c -= 3;
  90937. }
  90938. sp_4096_mont_sqr_128(r, r, m, mp);
  90939. sp_4096_mont_sqr_128(r, r, m, mp);
  90940. sp_4096_mont_sqr_128(r, r, m, mp);
  90941. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  90942. }
  90943. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  90944. sp_4096_mont_reduce_128(r, m, mp);
  90945. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  90946. sp_4096_cond_sub_128(r, r, m, mask);
  90947. }
  90948. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90949. if (td != NULL)
  90950. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  90951. #endif
  90952. return err;
  90953. }
  90954. #else
  90955. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  90956. *
  90957. * r A single precision number that is the result of the operation.
  90958. * a A single precision number being exponentiated.
  90959. * e A single precision number that is the exponent.
  90960. * bits The number of bits in the exponent.
  90961. * m A single precision number that is the modulus.
  90962. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  90963. */
  90964. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  90965. int bits, const sp_digit* m, int reduceA)
  90966. {
  90967. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90968. sp_digit* td = NULL;
  90969. #else
  90970. sp_digit td[16 * 256];
  90971. #endif
  90972. sp_digit* t[16];
  90973. sp_digit* norm = NULL;
  90974. sp_digit mp = 1;
  90975. sp_digit n;
  90976. sp_digit mask;
  90977. int i;
  90978. int c;
  90979. byte y;
  90980. int err = MP_OKAY;
  90981. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90982. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 256), NULL,
  90983. DYNAMIC_TYPE_TMP_BUFFER);
  90984. if (td == NULL)
  90985. err = MEMORY_E;
  90986. #endif
  90987. if (err == MP_OKAY) {
  90988. norm = td;
  90989. for (i=0; i<16; i++) {
  90990. t[i] = td + i * 256;
  90991. }
  90992. sp_4096_mont_setup(m, &mp);
  90993. sp_4096_mont_norm_128(norm, m);
  90994. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  90995. if (reduceA != 0) {
  90996. err = sp_4096_mod_128(t[1] + 128, a, m);
  90997. if (err == MP_OKAY) {
  90998. err = sp_4096_mod_128(t[1], t[1], m);
  90999. }
  91000. }
  91001. else {
  91002. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  91003. err = sp_4096_mod_128(t[1], t[1], m);
  91004. }
  91005. }
  91006. if (err == MP_OKAY) {
  91007. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  91008. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  91009. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  91010. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  91011. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  91012. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  91013. sp_4096_mont_sqr_128(t[ 8], t[ 4], m, mp);
  91014. sp_4096_mont_mul_128(t[ 9], t[ 5], t[ 4], m, mp);
  91015. sp_4096_mont_sqr_128(t[10], t[ 5], m, mp);
  91016. sp_4096_mont_mul_128(t[11], t[ 6], t[ 5], m, mp);
  91017. sp_4096_mont_sqr_128(t[12], t[ 6], m, mp);
  91018. sp_4096_mont_mul_128(t[13], t[ 7], t[ 6], m, mp);
  91019. sp_4096_mont_sqr_128(t[14], t[ 7], m, mp);
  91020. sp_4096_mont_mul_128(t[15], t[ 8], t[ 7], m, mp);
  91021. i = (bits - 1) / 32;
  91022. n = e[i--];
  91023. c = bits & 31;
  91024. if (c == 0) {
  91025. c = 32;
  91026. }
  91027. c -= bits % 4;
  91028. if (c == 32) {
  91029. c = 28;
  91030. }
  91031. if (c < 0) {
  91032. /* Number of bits in top word is less than number needed. */
  91033. c = -c;
  91034. y = (byte)(n << c);
  91035. n = e[i--];
  91036. y |= (byte)(n >> (64 - c));
  91037. n <<= c;
  91038. c = 64 - c;
  91039. }
  91040. else {
  91041. y = (byte)(n >> c);
  91042. n <<= 32 - c;
  91043. }
  91044. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  91045. for (; i>=0 || c>=4; ) {
  91046. if (c == 0) {
  91047. n = e[i--];
  91048. y = (byte)(n >> 28);
  91049. n <<= 4;
  91050. c = 28;
  91051. }
  91052. else if (c < 4) {
  91053. y = (byte)(n >> 28);
  91054. n = e[i--];
  91055. c = 4 - c;
  91056. y |= (byte)(n >> (32 - c));
  91057. n <<= c;
  91058. c = 32 - c;
  91059. }
  91060. else {
  91061. y = (byte)((n >> 28) & 0xf);
  91062. n <<= 4;
  91063. c -= 4;
  91064. }
  91065. sp_4096_mont_sqr_128(r, r, m, mp);
  91066. sp_4096_mont_sqr_128(r, r, m, mp);
  91067. sp_4096_mont_sqr_128(r, r, m, mp);
  91068. sp_4096_mont_sqr_128(r, r, m, mp);
  91069. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  91070. }
  91071. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  91072. sp_4096_mont_reduce_128(r, m, mp);
  91073. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  91074. sp_4096_cond_sub_128(r, r, m, mask);
  91075. }
  91076. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91077. if (td != NULL)
  91078. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  91079. #endif
  91080. return err;
  91081. }
  91082. #endif /* WOLFSSL_SP_SMALL */
  91083. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  91084. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  91085. #ifdef WOLFSSL_HAVE_SP_RSA
  91086. /* RSA public key operation.
  91087. *
  91088. * in Array of bytes representing the number to exponentiate, base.
  91089. * inLen Number of bytes in base.
  91090. * em Public exponent.
  91091. * mm Modulus.
  91092. * out Buffer to hold big-endian bytes of exponentiation result.
  91093. * Must be at least 512 bytes long.
  91094. * outLen Number of bytes in result.
  91095. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  91096. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  91097. */
  91098. int sp_RsaPublic_4096(const byte* in, word32 inLen, const mp_int* em,
  91099. const mp_int* mm, byte* out, word32* outLen)
  91100. {
  91101. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91102. sp_digit* a = NULL;
  91103. #else
  91104. sp_digit a[128 * 5];
  91105. #endif
  91106. sp_digit* m = NULL;
  91107. sp_digit* r = NULL;
  91108. sp_digit *ah = NULL;
  91109. sp_digit e[1] = {0};
  91110. int err = MP_OKAY;
  91111. if (*outLen < 512) {
  91112. err = MP_TO_E;
  91113. }
  91114. else if (mp_count_bits(em) > 32 || inLen > 512 ||
  91115. mp_count_bits(mm) != 4096) {
  91116. err = MP_READ_E;
  91117. }
  91118. else if (mp_iseven(mm)) {
  91119. err = MP_VAL;
  91120. }
  91121. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91122. if (err == MP_OKAY) {
  91123. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 5, NULL,
  91124. DYNAMIC_TYPE_RSA);
  91125. if (a == NULL)
  91126. err = MEMORY_E;
  91127. }
  91128. #endif
  91129. if (err == MP_OKAY) {
  91130. r = a + 128 * 2;
  91131. m = r + 128 * 2;
  91132. ah = a + 128;
  91133. sp_4096_from_bin(ah, 128, in, inLen);
  91134. #if DIGIT_BIT >= 32
  91135. e[0] = em->dp[0];
  91136. #else
  91137. e[0] = em->dp[0];
  91138. if (em->used > 1) {
  91139. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  91140. }
  91141. #endif
  91142. if (e[0] == 0) {
  91143. err = MP_EXPTMOD_E;
  91144. }
  91145. }
  91146. if (err == MP_OKAY) {
  91147. sp_4096_from_mp(m, 128, mm);
  91148. if (e[0] == 0x3) {
  91149. if (err == MP_OKAY) {
  91150. sp_4096_sqr_128(r, ah);
  91151. err = sp_4096_mod_128_cond(r, r, m);
  91152. }
  91153. if (err == MP_OKAY) {
  91154. sp_4096_mul_128(r, ah, r);
  91155. err = sp_4096_mod_128_cond(r, r, m);
  91156. }
  91157. }
  91158. else {
  91159. int i;
  91160. sp_digit mp;
  91161. sp_4096_mont_setup(m, &mp);
  91162. /* Convert to Montgomery form. */
  91163. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  91164. err = sp_4096_mod_128_cond(a, a, m);
  91165. if (err == MP_OKAY) {
  91166. for (i = 31; i >= 0; i--) {
  91167. if (e[0] >> i) {
  91168. break;
  91169. }
  91170. }
  91171. XMEMCPY(r, a, sizeof(sp_digit) * 128);
  91172. for (i--; i>=0; i--) {
  91173. sp_4096_mont_sqr_128(r, r, m, mp);
  91174. if (((e[0] >> i) & 1) == 1) {
  91175. sp_4096_mont_mul_128(r, r, a, m, mp);
  91176. }
  91177. }
  91178. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128);
  91179. sp_4096_mont_reduce_128(r, m, mp);
  91180. for (i = 127; i > 0; i--) {
  91181. if (r[i] != m[i]) {
  91182. break;
  91183. }
  91184. }
  91185. if (r[i] >= m[i]) {
  91186. sp_4096_sub_in_place_128(r, m);
  91187. }
  91188. }
  91189. }
  91190. }
  91191. if (err == MP_OKAY) {
  91192. sp_4096_to_bin_128(r, out);
  91193. *outLen = 512;
  91194. }
  91195. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91196. if (a != NULL)
  91197. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  91198. #endif
  91199. return err;
  91200. }
  91201. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  91202. /* Conditionally add a and b using the mask m.
  91203. * m is -1 to add and 0 when not.
  91204. *
  91205. * r A single precision number representing conditional add result.
  91206. * a A single precision number to add with.
  91207. * b A single precision number to add.
  91208. * m Mask value to apply.
  91209. */
  91210. SP_NOINLINE static sp_digit sp_4096_cond_add_64(sp_digit* r, const sp_digit* a,
  91211. const sp_digit* b, sp_digit m)
  91212. {
  91213. __asm__ __volatile__ (
  91214. "movs r4, #0\n\t"
  91215. "movs r5, #0xff\n\t"
  91216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91217. "adds r5, r5, #1\n\t"
  91218. #else
  91219. "add r5, r5, #1\n\t"
  91220. #endif
  91221. "mov r8, r5\n\t"
  91222. "movs r7, #0\n\t"
  91223. "\n"
  91224. "L_sp_4096_cond_add_64_words_%=:\n\t"
  91225. "ldr r6, [%[b], r7]\n\t"
  91226. #ifdef WOLFSSL_KEIL
  91227. "ands r6, r6, %[m]\n\t"
  91228. #elif defined(__clang__)
  91229. "ands r6, %[m]\n\t"
  91230. #else
  91231. "and r6, %[m]\n\t"
  91232. #endif
  91233. "movs r5, #0\n\t"
  91234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91235. "subs r5, r5, #1\n\t"
  91236. #else
  91237. "sub r5, r5, #1\n\t"
  91238. #endif
  91239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91240. "adds r5, r5, r4\n\t"
  91241. #else
  91242. "add r5, r5, r4\n\t"
  91243. #endif
  91244. "ldr r5, [%[a], r7]\n\t"
  91245. #ifdef WOLFSSL_KEIL
  91246. "adcs r5, r5, r6\n\t"
  91247. #elif defined(__clang__)
  91248. "adcs r5, r6\n\t"
  91249. #else
  91250. "adc r5, r6\n\t"
  91251. #endif
  91252. "movs r4, #0\n\t"
  91253. #ifdef WOLFSSL_KEIL
  91254. "adcs r4, r4, r4\n\t"
  91255. #elif defined(__clang__)
  91256. "adcs r4, r4\n\t"
  91257. #else
  91258. "adc r4, r4\n\t"
  91259. #endif
  91260. "str r5, [%[r], r7]\n\t"
  91261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91262. "adds r7, r7, #4\n\t"
  91263. #else
  91264. "add r7, r7, #4\n\t"
  91265. #endif
  91266. "cmp r7, r8\n\t"
  91267. "blt L_sp_4096_cond_add_64_words_%=\n\t"
  91268. "movs %[r], r4\n\t"
  91269. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  91270. :
  91271. : "memory", "r4", "r5", "r6", "r7", "r8"
  91272. );
  91273. return (uint32_t)(size_t)r;
  91274. }
  91275. /* RSA private key operation.
  91276. *
  91277. * in Array of bytes representing the number to exponentiate, base.
  91278. * inLen Number of bytes in base.
  91279. * dm Private exponent.
  91280. * pm First prime.
  91281. * qm Second prime.
  91282. * dpm First prime's CRT exponent.
  91283. * dqm Second prime's CRT exponent.
  91284. * qim Inverse of second prime mod p.
  91285. * mm Modulus.
  91286. * out Buffer to hold big-endian bytes of exponentiation result.
  91287. * Must be at least 512 bytes long.
  91288. * outLen Number of bytes in result.
  91289. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  91290. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  91291. */
  91292. int sp_RsaPrivate_4096(const byte* in, word32 inLen, const mp_int* dm,
  91293. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  91294. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  91295. {
  91296. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  91297. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91298. sp_digit* d = NULL;
  91299. #else
  91300. sp_digit d[128 * 4];
  91301. #endif
  91302. sp_digit* a = NULL;
  91303. sp_digit* m = NULL;
  91304. sp_digit* r = NULL;
  91305. int err = MP_OKAY;
  91306. (void)pm;
  91307. (void)qm;
  91308. (void)dpm;
  91309. (void)dqm;
  91310. (void)qim;
  91311. if (*outLen < 512U) {
  91312. err = MP_TO_E;
  91313. }
  91314. if (err == MP_OKAY) {
  91315. if (mp_count_bits(dm) > 4096) {
  91316. err = MP_READ_E;
  91317. }
  91318. else if (inLen > 512) {
  91319. err = MP_READ_E;
  91320. }
  91321. else if (mp_count_bits(mm) != 4096) {
  91322. err = MP_READ_E;
  91323. }
  91324. else if (mp_iseven(mm)) {
  91325. err = MP_VAL;
  91326. }
  91327. }
  91328. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91329. if (err == MP_OKAY) {
  91330. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL,
  91331. DYNAMIC_TYPE_RSA);
  91332. if (d == NULL)
  91333. err = MEMORY_E;
  91334. }
  91335. #endif
  91336. if (err == MP_OKAY) {
  91337. a = d + 128;
  91338. m = a + 256;
  91339. r = a;
  91340. sp_4096_from_bin(a, 128, in, inLen);
  91341. sp_4096_from_mp(d, 128, dm);
  91342. sp_4096_from_mp(m, 128, mm);
  91343. err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0);
  91344. }
  91345. if (err == MP_OKAY) {
  91346. sp_4096_to_bin_128(r, out);
  91347. *outLen = 512;
  91348. }
  91349. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91350. if (d != NULL)
  91351. #endif
  91352. {
  91353. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  91354. if (a != NULL)
  91355. ForceZero(a, sizeof(sp_digit) * 128);
  91356. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91357. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  91358. #endif
  91359. }
  91360. return err;
  91361. #else
  91362. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91363. sp_digit* a = NULL;
  91364. #else
  91365. sp_digit a[64 * 11];
  91366. #endif
  91367. sp_digit* p = NULL;
  91368. sp_digit* q = NULL;
  91369. sp_digit* dp = NULL;
  91370. sp_digit* tmpa = NULL;
  91371. sp_digit* tmpb = NULL;
  91372. sp_digit* r = NULL;
  91373. sp_digit* qi = NULL;
  91374. sp_digit* dq = NULL;
  91375. sp_digit c;
  91376. int err = MP_OKAY;
  91377. (void)dm;
  91378. (void)mm;
  91379. if (*outLen < 512) {
  91380. err = MP_TO_E;
  91381. }
  91382. else if (inLen > 512 || mp_count_bits(mm) != 4096) {
  91383. err = MP_READ_E;
  91384. }
  91385. else if (mp_iseven(mm)) {
  91386. err = MP_VAL;
  91387. }
  91388. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91389. if (err == MP_OKAY) {
  91390. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 11, NULL,
  91391. DYNAMIC_TYPE_RSA);
  91392. if (a == NULL)
  91393. err = MEMORY_E;
  91394. }
  91395. #endif
  91396. if (err == MP_OKAY) {
  91397. p = a + 128 * 2;
  91398. q = p + 64;
  91399. qi = dq = dp = q + 64;
  91400. tmpa = qi + 64;
  91401. tmpb = tmpa + 128;
  91402. r = a;
  91403. sp_4096_from_bin(a, 128, in, inLen);
  91404. sp_4096_from_mp(p, 64, pm);
  91405. sp_4096_from_mp(q, 64, qm);
  91406. sp_4096_from_mp(dp, 64, dpm);
  91407. err = sp_2048_mod_exp_64(tmpa, a, dp, 2048, p, 1);
  91408. }
  91409. if (err == MP_OKAY) {
  91410. sp_4096_from_mp(dq, 64, dqm);
  91411. err = sp_2048_mod_exp_64(tmpb, a, dq, 2048, q, 1);
  91412. }
  91413. if (err == MP_OKAY) {
  91414. c = sp_2048_sub_in_place_64(tmpa, tmpb);
  91415. c += sp_4096_cond_add_64(tmpa, tmpa, p, c);
  91416. sp_4096_cond_add_64(tmpa, tmpa, p, c);
  91417. sp_2048_from_mp(qi, 64, qim);
  91418. sp_2048_mul_64(tmpa, tmpa, qi);
  91419. err = sp_2048_mod_64(tmpa, tmpa, p);
  91420. }
  91421. if (err == MP_OKAY) {
  91422. sp_2048_mul_64(tmpa, q, tmpa);
  91423. XMEMSET(&tmpb[64], 0, sizeof(sp_digit) * 64);
  91424. sp_4096_add_128(r, tmpb, tmpa);
  91425. sp_4096_to_bin_128(r, out);
  91426. *outLen = 512;
  91427. }
  91428. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91429. if (a != NULL)
  91430. #endif
  91431. {
  91432. ForceZero(a, sizeof(sp_digit) * 64 * 11);
  91433. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91434. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  91435. #endif
  91436. }
  91437. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  91438. return err;
  91439. }
  91440. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  91441. #endif /* WOLFSSL_HAVE_SP_RSA */
  91442. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  91443. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  91444. /* Convert an array of sp_digit to an mp_int.
  91445. *
  91446. * a A single precision integer.
  91447. * r A multi-precision integer.
  91448. */
  91449. static int sp_4096_to_mp(const sp_digit* a, mp_int* r)
  91450. {
  91451. int err;
  91452. err = mp_grow(r, (4096 + DIGIT_BIT - 1) / DIGIT_BIT);
  91453. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  91454. #if DIGIT_BIT == 32
  91455. XMEMCPY(r->dp, a, sizeof(sp_digit) * 128);
  91456. r->used = 128;
  91457. mp_clamp(r);
  91458. #elif DIGIT_BIT < 32
  91459. int i;
  91460. int j = 0;
  91461. int s = 0;
  91462. r->dp[0] = 0;
  91463. for (i = 0; i < 128; i++) {
  91464. r->dp[j] |= (mp_digit)(a[i] << s);
  91465. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  91466. s = DIGIT_BIT - s;
  91467. r->dp[++j] = (mp_digit)(a[i] >> s);
  91468. while (s + DIGIT_BIT <= 32) {
  91469. s += DIGIT_BIT;
  91470. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  91471. if (s == SP_WORD_SIZE) {
  91472. r->dp[j] = 0;
  91473. }
  91474. else {
  91475. r->dp[j] = (mp_digit)(a[i] >> s);
  91476. }
  91477. }
  91478. s = 32 - s;
  91479. }
  91480. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  91481. mp_clamp(r);
  91482. #else
  91483. int i;
  91484. int j = 0;
  91485. int s = 0;
  91486. r->dp[0] = 0;
  91487. for (i = 0; i < 128; i++) {
  91488. r->dp[j] |= ((mp_digit)a[i]) << s;
  91489. if (s + 32 >= DIGIT_BIT) {
  91490. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  91491. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  91492. #endif
  91493. s = DIGIT_BIT - s;
  91494. r->dp[++j] = a[i] >> s;
  91495. s = 32 - s;
  91496. }
  91497. else {
  91498. s += 32;
  91499. }
  91500. }
  91501. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  91502. mp_clamp(r);
  91503. #endif
  91504. }
  91505. return err;
  91506. }
  91507. /* Perform the modular exponentiation for Diffie-Hellman.
  91508. *
  91509. * base Base. MP integer.
  91510. * exp Exponent. MP integer.
  91511. * mod Modulus. MP integer.
  91512. * res Result. MP integer.
  91513. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  91514. * and MEMORY_E if memory allocation fails.
  91515. */
  91516. int sp_ModExp_4096(const mp_int* base, const mp_int* exp, const mp_int* mod,
  91517. mp_int* res)
  91518. {
  91519. int err = MP_OKAY;
  91520. sp_digit b[256];
  91521. sp_digit e[128];
  91522. sp_digit m[128];
  91523. sp_digit* r = b;
  91524. int expBits = mp_count_bits(exp);
  91525. if (mp_count_bits(base) > 4096) {
  91526. err = MP_READ_E;
  91527. }
  91528. else if (expBits > 4096) {
  91529. err = MP_READ_E;
  91530. }
  91531. else if (mp_count_bits(mod) != 4096) {
  91532. err = MP_READ_E;
  91533. }
  91534. else if (mp_iseven(mod)) {
  91535. err = MP_VAL;
  91536. }
  91537. if (err == MP_OKAY) {
  91538. sp_4096_from_mp(b, 128, base);
  91539. sp_4096_from_mp(e, 128, exp);
  91540. sp_4096_from_mp(m, 128, mod);
  91541. err = sp_4096_mod_exp_128(r, b, e, expBits, m, 0);
  91542. }
  91543. if (err == MP_OKAY) {
  91544. err = sp_4096_to_mp(r, res);
  91545. }
  91546. XMEMSET(e, 0, sizeof(e));
  91547. return err;
  91548. }
  91549. #ifdef WOLFSSL_HAVE_SP_DH
  91550. #ifdef HAVE_FFDHE_4096
  91551. /* Lefy shift a by n bits into r. (r = a << n)
  91552. *
  91553. * r A single precision integer.
  91554. * a A single precision integer.
  91555. * n Integer representing number of bits to shift.
  91556. */
  91557. static void sp_4096_lshift_128(sp_digit* r, const sp_digit* a, byte n)
  91558. {
  91559. __asm__ __volatile__ (
  91560. "movs r7, #31\n\t"
  91561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91562. "subs r7, r7, %[n]\n\t"
  91563. #else
  91564. "sub r7, r7, %[n]\n\t"
  91565. #endif
  91566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91567. "adds %[a], %[a], #0xff\n\t"
  91568. #else
  91569. "add %[a], %[a], #0xff\n\t"
  91570. #endif
  91571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91572. "adds %[r], %[r], #0xff\n\t"
  91573. #else
  91574. "add %[r], %[r], #0xff\n\t"
  91575. #endif
  91576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91577. "adds %[a], %[a], #0xc1\n\t"
  91578. #else
  91579. "add %[a], %[a], #0xc1\n\t"
  91580. #endif
  91581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91582. "adds %[r], %[r], #0xc1\n\t"
  91583. #else
  91584. "add %[r], %[r], #0xc1\n\t"
  91585. #endif
  91586. "ldr r4, [%[a], #60]\n\t"
  91587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91588. "lsrs r5, r4, #1\n\t"
  91589. #else
  91590. "lsr r5, r4, #1\n\t"
  91591. #endif
  91592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91593. "lsls r4, r4, %[n]\n\t"
  91594. #else
  91595. "lsl r4, r4, %[n]\n\t"
  91596. #endif
  91597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91598. "lsrs r5, r5, r7\n\t"
  91599. #else
  91600. "lsr r5, r5, r7\n\t"
  91601. #endif
  91602. "ldr r3, [%[a], #56]\n\t"
  91603. "str r5, [%[r], #64]\n\t"
  91604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91605. "lsrs r6, r3, #1\n\t"
  91606. #else
  91607. "lsr r6, r3, #1\n\t"
  91608. #endif
  91609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91610. "lsls r3, r3, %[n]\n\t"
  91611. #else
  91612. "lsl r3, r3, %[n]\n\t"
  91613. #endif
  91614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91615. "lsrs r6, r6, r7\n\t"
  91616. #else
  91617. "lsr r6, r6, r7\n\t"
  91618. #endif
  91619. #ifdef WOLFSSL_KEIL
  91620. "orrs r4, r4, r6\n\t"
  91621. #elif defined(__clang__)
  91622. "orrs r4, r6\n\t"
  91623. #else
  91624. "orr r4, r6\n\t"
  91625. #endif
  91626. "ldr r5, [%[a], #52]\n\t"
  91627. "str r4, [%[r], #60]\n\t"
  91628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91629. "lsrs r6, r5, #1\n\t"
  91630. #else
  91631. "lsr r6, r5, #1\n\t"
  91632. #endif
  91633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91634. "lsls r5, r5, %[n]\n\t"
  91635. #else
  91636. "lsl r5, r5, %[n]\n\t"
  91637. #endif
  91638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91639. "lsrs r6, r6, r7\n\t"
  91640. #else
  91641. "lsr r6, r6, r7\n\t"
  91642. #endif
  91643. #ifdef WOLFSSL_KEIL
  91644. "orrs r3, r3, r6\n\t"
  91645. #elif defined(__clang__)
  91646. "orrs r3, r6\n\t"
  91647. #else
  91648. "orr r3, r6\n\t"
  91649. #endif
  91650. "ldr r4, [%[a], #48]\n\t"
  91651. "str r3, [%[r], #56]\n\t"
  91652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91653. "lsrs r6, r4, #1\n\t"
  91654. #else
  91655. "lsr r6, r4, #1\n\t"
  91656. #endif
  91657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91658. "lsls r4, r4, %[n]\n\t"
  91659. #else
  91660. "lsl r4, r4, %[n]\n\t"
  91661. #endif
  91662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91663. "lsrs r6, r6, r7\n\t"
  91664. #else
  91665. "lsr r6, r6, r7\n\t"
  91666. #endif
  91667. #ifdef WOLFSSL_KEIL
  91668. "orrs r5, r5, r6\n\t"
  91669. #elif defined(__clang__)
  91670. "orrs r5, r6\n\t"
  91671. #else
  91672. "orr r5, r6\n\t"
  91673. #endif
  91674. "ldr r3, [%[a], #44]\n\t"
  91675. "str r5, [%[r], #52]\n\t"
  91676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91677. "lsrs r6, r3, #1\n\t"
  91678. #else
  91679. "lsr r6, r3, #1\n\t"
  91680. #endif
  91681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91682. "lsls r3, r3, %[n]\n\t"
  91683. #else
  91684. "lsl r3, r3, %[n]\n\t"
  91685. #endif
  91686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91687. "lsrs r6, r6, r7\n\t"
  91688. #else
  91689. "lsr r6, r6, r7\n\t"
  91690. #endif
  91691. #ifdef WOLFSSL_KEIL
  91692. "orrs r4, r4, r6\n\t"
  91693. #elif defined(__clang__)
  91694. "orrs r4, r6\n\t"
  91695. #else
  91696. "orr r4, r6\n\t"
  91697. #endif
  91698. "ldr r5, [%[a], #40]\n\t"
  91699. "str r4, [%[r], #48]\n\t"
  91700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91701. "lsrs r6, r5, #1\n\t"
  91702. #else
  91703. "lsr r6, r5, #1\n\t"
  91704. #endif
  91705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91706. "lsls r5, r5, %[n]\n\t"
  91707. #else
  91708. "lsl r5, r5, %[n]\n\t"
  91709. #endif
  91710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91711. "lsrs r6, r6, r7\n\t"
  91712. #else
  91713. "lsr r6, r6, r7\n\t"
  91714. #endif
  91715. #ifdef WOLFSSL_KEIL
  91716. "orrs r3, r3, r6\n\t"
  91717. #elif defined(__clang__)
  91718. "orrs r3, r6\n\t"
  91719. #else
  91720. "orr r3, r6\n\t"
  91721. #endif
  91722. "ldr r4, [%[a], #36]\n\t"
  91723. "str r3, [%[r], #44]\n\t"
  91724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91725. "lsrs r6, r4, #1\n\t"
  91726. #else
  91727. "lsr r6, r4, #1\n\t"
  91728. #endif
  91729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91730. "lsls r4, r4, %[n]\n\t"
  91731. #else
  91732. "lsl r4, r4, %[n]\n\t"
  91733. #endif
  91734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91735. "lsrs r6, r6, r7\n\t"
  91736. #else
  91737. "lsr r6, r6, r7\n\t"
  91738. #endif
  91739. #ifdef WOLFSSL_KEIL
  91740. "orrs r5, r5, r6\n\t"
  91741. #elif defined(__clang__)
  91742. "orrs r5, r6\n\t"
  91743. #else
  91744. "orr r5, r6\n\t"
  91745. #endif
  91746. "ldr r3, [%[a], #32]\n\t"
  91747. "str r5, [%[r], #40]\n\t"
  91748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91749. "lsrs r6, r3, #1\n\t"
  91750. #else
  91751. "lsr r6, r3, #1\n\t"
  91752. #endif
  91753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91754. "lsls r3, r3, %[n]\n\t"
  91755. #else
  91756. "lsl r3, r3, %[n]\n\t"
  91757. #endif
  91758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91759. "lsrs r6, r6, r7\n\t"
  91760. #else
  91761. "lsr r6, r6, r7\n\t"
  91762. #endif
  91763. #ifdef WOLFSSL_KEIL
  91764. "orrs r4, r4, r6\n\t"
  91765. #elif defined(__clang__)
  91766. "orrs r4, r6\n\t"
  91767. #else
  91768. "orr r4, r6\n\t"
  91769. #endif
  91770. "ldr r5, [%[a], #28]\n\t"
  91771. "str r4, [%[r], #36]\n\t"
  91772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91773. "lsrs r6, r5, #1\n\t"
  91774. #else
  91775. "lsr r6, r5, #1\n\t"
  91776. #endif
  91777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91778. "lsls r5, r5, %[n]\n\t"
  91779. #else
  91780. "lsl r5, r5, %[n]\n\t"
  91781. #endif
  91782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91783. "lsrs r6, r6, r7\n\t"
  91784. #else
  91785. "lsr r6, r6, r7\n\t"
  91786. #endif
  91787. #ifdef WOLFSSL_KEIL
  91788. "orrs r3, r3, r6\n\t"
  91789. #elif defined(__clang__)
  91790. "orrs r3, r6\n\t"
  91791. #else
  91792. "orr r3, r6\n\t"
  91793. #endif
  91794. "ldr r4, [%[a], #24]\n\t"
  91795. "str r3, [%[r], #32]\n\t"
  91796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91797. "lsrs r6, r4, #1\n\t"
  91798. #else
  91799. "lsr r6, r4, #1\n\t"
  91800. #endif
  91801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91802. "lsls r4, r4, %[n]\n\t"
  91803. #else
  91804. "lsl r4, r4, %[n]\n\t"
  91805. #endif
  91806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91807. "lsrs r6, r6, r7\n\t"
  91808. #else
  91809. "lsr r6, r6, r7\n\t"
  91810. #endif
  91811. #ifdef WOLFSSL_KEIL
  91812. "orrs r5, r5, r6\n\t"
  91813. #elif defined(__clang__)
  91814. "orrs r5, r6\n\t"
  91815. #else
  91816. "orr r5, r6\n\t"
  91817. #endif
  91818. "ldr r3, [%[a], #20]\n\t"
  91819. "str r5, [%[r], #28]\n\t"
  91820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91821. "lsrs r6, r3, #1\n\t"
  91822. #else
  91823. "lsr r6, r3, #1\n\t"
  91824. #endif
  91825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91826. "lsls r3, r3, %[n]\n\t"
  91827. #else
  91828. "lsl r3, r3, %[n]\n\t"
  91829. #endif
  91830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91831. "lsrs r6, r6, r7\n\t"
  91832. #else
  91833. "lsr r6, r6, r7\n\t"
  91834. #endif
  91835. #ifdef WOLFSSL_KEIL
  91836. "orrs r4, r4, r6\n\t"
  91837. #elif defined(__clang__)
  91838. "orrs r4, r6\n\t"
  91839. #else
  91840. "orr r4, r6\n\t"
  91841. #endif
  91842. "ldr r5, [%[a], #16]\n\t"
  91843. "str r4, [%[r], #24]\n\t"
  91844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91845. "lsrs r6, r5, #1\n\t"
  91846. #else
  91847. "lsr r6, r5, #1\n\t"
  91848. #endif
  91849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91850. "lsls r5, r5, %[n]\n\t"
  91851. #else
  91852. "lsl r5, r5, %[n]\n\t"
  91853. #endif
  91854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91855. "lsrs r6, r6, r7\n\t"
  91856. #else
  91857. "lsr r6, r6, r7\n\t"
  91858. #endif
  91859. #ifdef WOLFSSL_KEIL
  91860. "orrs r3, r3, r6\n\t"
  91861. #elif defined(__clang__)
  91862. "orrs r3, r6\n\t"
  91863. #else
  91864. "orr r3, r6\n\t"
  91865. #endif
  91866. "ldr r4, [%[a], #12]\n\t"
  91867. "str r3, [%[r], #20]\n\t"
  91868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91869. "lsrs r6, r4, #1\n\t"
  91870. #else
  91871. "lsr r6, r4, #1\n\t"
  91872. #endif
  91873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91874. "lsls r4, r4, %[n]\n\t"
  91875. #else
  91876. "lsl r4, r4, %[n]\n\t"
  91877. #endif
  91878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91879. "lsrs r6, r6, r7\n\t"
  91880. #else
  91881. "lsr r6, r6, r7\n\t"
  91882. #endif
  91883. #ifdef WOLFSSL_KEIL
  91884. "orrs r5, r5, r6\n\t"
  91885. #elif defined(__clang__)
  91886. "orrs r5, r6\n\t"
  91887. #else
  91888. "orr r5, r6\n\t"
  91889. #endif
  91890. "ldr r3, [%[a], #8]\n\t"
  91891. "str r5, [%[r], #16]\n\t"
  91892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91893. "lsrs r6, r3, #1\n\t"
  91894. #else
  91895. "lsr r6, r3, #1\n\t"
  91896. #endif
  91897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91898. "lsls r3, r3, %[n]\n\t"
  91899. #else
  91900. "lsl r3, r3, %[n]\n\t"
  91901. #endif
  91902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91903. "lsrs r6, r6, r7\n\t"
  91904. #else
  91905. "lsr r6, r6, r7\n\t"
  91906. #endif
  91907. #ifdef WOLFSSL_KEIL
  91908. "orrs r4, r4, r6\n\t"
  91909. #elif defined(__clang__)
  91910. "orrs r4, r6\n\t"
  91911. #else
  91912. "orr r4, r6\n\t"
  91913. #endif
  91914. "ldr r5, [%[a], #4]\n\t"
  91915. "str r4, [%[r], #12]\n\t"
  91916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91917. "lsrs r6, r5, #1\n\t"
  91918. #else
  91919. "lsr r6, r5, #1\n\t"
  91920. #endif
  91921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91922. "lsls r5, r5, %[n]\n\t"
  91923. #else
  91924. "lsl r5, r5, %[n]\n\t"
  91925. #endif
  91926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91927. "lsrs r6, r6, r7\n\t"
  91928. #else
  91929. "lsr r6, r6, r7\n\t"
  91930. #endif
  91931. #ifdef WOLFSSL_KEIL
  91932. "orrs r3, r3, r6\n\t"
  91933. #elif defined(__clang__)
  91934. "orrs r3, r6\n\t"
  91935. #else
  91936. "orr r3, r6\n\t"
  91937. #endif
  91938. "ldr r4, [%[a]]\n\t"
  91939. "str r3, [%[r], #8]\n\t"
  91940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91941. "lsrs r6, r4, #1\n\t"
  91942. #else
  91943. "lsr r6, r4, #1\n\t"
  91944. #endif
  91945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91946. "lsls r4, r4, %[n]\n\t"
  91947. #else
  91948. "lsl r4, r4, %[n]\n\t"
  91949. #endif
  91950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91951. "lsrs r6, r6, r7\n\t"
  91952. #else
  91953. "lsr r6, r6, r7\n\t"
  91954. #endif
  91955. #ifdef WOLFSSL_KEIL
  91956. "orrs r5, r5, r6\n\t"
  91957. #elif defined(__clang__)
  91958. "orrs r5, r6\n\t"
  91959. #else
  91960. "orr r5, r6\n\t"
  91961. #endif
  91962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91963. "subs %[a], %[a], #0x40\n\t"
  91964. #else
  91965. "sub %[a], %[a], #0x40\n\t"
  91966. #endif
  91967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91968. "subs %[r], %[r], #0x40\n\t"
  91969. #else
  91970. "sub %[r], %[r], #0x40\n\t"
  91971. #endif
  91972. "ldr r3, [%[a], #60]\n\t"
  91973. "str r5, [%[r], #68]\n\t"
  91974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91975. "lsrs r6, r3, #1\n\t"
  91976. #else
  91977. "lsr r6, r3, #1\n\t"
  91978. #endif
  91979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91980. "lsls r3, r3, %[n]\n\t"
  91981. #else
  91982. "lsl r3, r3, %[n]\n\t"
  91983. #endif
  91984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91985. "lsrs r6, r6, r7\n\t"
  91986. #else
  91987. "lsr r6, r6, r7\n\t"
  91988. #endif
  91989. #ifdef WOLFSSL_KEIL
  91990. "orrs r4, r4, r6\n\t"
  91991. #elif defined(__clang__)
  91992. "orrs r4, r6\n\t"
  91993. #else
  91994. "orr r4, r6\n\t"
  91995. #endif
  91996. "ldr r5, [%[a], #56]\n\t"
  91997. "str r4, [%[r], #64]\n\t"
  91998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91999. "lsrs r6, r5, #1\n\t"
  92000. #else
  92001. "lsr r6, r5, #1\n\t"
  92002. #endif
  92003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92004. "lsls r5, r5, %[n]\n\t"
  92005. #else
  92006. "lsl r5, r5, %[n]\n\t"
  92007. #endif
  92008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92009. "lsrs r6, r6, r7\n\t"
  92010. #else
  92011. "lsr r6, r6, r7\n\t"
  92012. #endif
  92013. #ifdef WOLFSSL_KEIL
  92014. "orrs r3, r3, r6\n\t"
  92015. #elif defined(__clang__)
  92016. "orrs r3, r6\n\t"
  92017. #else
  92018. "orr r3, r6\n\t"
  92019. #endif
  92020. "ldr r4, [%[a], #52]\n\t"
  92021. "str r3, [%[r], #60]\n\t"
  92022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92023. "lsrs r6, r4, #1\n\t"
  92024. #else
  92025. "lsr r6, r4, #1\n\t"
  92026. #endif
  92027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92028. "lsls r4, r4, %[n]\n\t"
  92029. #else
  92030. "lsl r4, r4, %[n]\n\t"
  92031. #endif
  92032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92033. "lsrs r6, r6, r7\n\t"
  92034. #else
  92035. "lsr r6, r6, r7\n\t"
  92036. #endif
  92037. #ifdef WOLFSSL_KEIL
  92038. "orrs r5, r5, r6\n\t"
  92039. #elif defined(__clang__)
  92040. "orrs r5, r6\n\t"
  92041. #else
  92042. "orr r5, r6\n\t"
  92043. #endif
  92044. "ldr r3, [%[a], #48]\n\t"
  92045. "str r5, [%[r], #56]\n\t"
  92046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92047. "lsrs r6, r3, #1\n\t"
  92048. #else
  92049. "lsr r6, r3, #1\n\t"
  92050. #endif
  92051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92052. "lsls r3, r3, %[n]\n\t"
  92053. #else
  92054. "lsl r3, r3, %[n]\n\t"
  92055. #endif
  92056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92057. "lsrs r6, r6, r7\n\t"
  92058. #else
  92059. "lsr r6, r6, r7\n\t"
  92060. #endif
  92061. #ifdef WOLFSSL_KEIL
  92062. "orrs r4, r4, r6\n\t"
  92063. #elif defined(__clang__)
  92064. "orrs r4, r6\n\t"
  92065. #else
  92066. "orr r4, r6\n\t"
  92067. #endif
  92068. "ldr r5, [%[a], #44]\n\t"
  92069. "str r4, [%[r], #52]\n\t"
  92070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92071. "lsrs r6, r5, #1\n\t"
  92072. #else
  92073. "lsr r6, r5, #1\n\t"
  92074. #endif
  92075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92076. "lsls r5, r5, %[n]\n\t"
  92077. #else
  92078. "lsl r5, r5, %[n]\n\t"
  92079. #endif
  92080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92081. "lsrs r6, r6, r7\n\t"
  92082. #else
  92083. "lsr r6, r6, r7\n\t"
  92084. #endif
  92085. #ifdef WOLFSSL_KEIL
  92086. "orrs r3, r3, r6\n\t"
  92087. #elif defined(__clang__)
  92088. "orrs r3, r6\n\t"
  92089. #else
  92090. "orr r3, r6\n\t"
  92091. #endif
  92092. "ldr r4, [%[a], #40]\n\t"
  92093. "str r3, [%[r], #48]\n\t"
  92094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92095. "lsrs r6, r4, #1\n\t"
  92096. #else
  92097. "lsr r6, r4, #1\n\t"
  92098. #endif
  92099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92100. "lsls r4, r4, %[n]\n\t"
  92101. #else
  92102. "lsl r4, r4, %[n]\n\t"
  92103. #endif
  92104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92105. "lsrs r6, r6, r7\n\t"
  92106. #else
  92107. "lsr r6, r6, r7\n\t"
  92108. #endif
  92109. #ifdef WOLFSSL_KEIL
  92110. "orrs r5, r5, r6\n\t"
  92111. #elif defined(__clang__)
  92112. "orrs r5, r6\n\t"
  92113. #else
  92114. "orr r5, r6\n\t"
  92115. #endif
  92116. "ldr r3, [%[a], #36]\n\t"
  92117. "str r5, [%[r], #44]\n\t"
  92118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92119. "lsrs r6, r3, #1\n\t"
  92120. #else
  92121. "lsr r6, r3, #1\n\t"
  92122. #endif
  92123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92124. "lsls r3, r3, %[n]\n\t"
  92125. #else
  92126. "lsl r3, r3, %[n]\n\t"
  92127. #endif
  92128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92129. "lsrs r6, r6, r7\n\t"
  92130. #else
  92131. "lsr r6, r6, r7\n\t"
  92132. #endif
  92133. #ifdef WOLFSSL_KEIL
  92134. "orrs r4, r4, r6\n\t"
  92135. #elif defined(__clang__)
  92136. "orrs r4, r6\n\t"
  92137. #else
  92138. "orr r4, r6\n\t"
  92139. #endif
  92140. "ldr r5, [%[a], #32]\n\t"
  92141. "str r4, [%[r], #40]\n\t"
  92142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92143. "lsrs r6, r5, #1\n\t"
  92144. #else
  92145. "lsr r6, r5, #1\n\t"
  92146. #endif
  92147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92148. "lsls r5, r5, %[n]\n\t"
  92149. #else
  92150. "lsl r5, r5, %[n]\n\t"
  92151. #endif
  92152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92153. "lsrs r6, r6, r7\n\t"
  92154. #else
  92155. "lsr r6, r6, r7\n\t"
  92156. #endif
  92157. #ifdef WOLFSSL_KEIL
  92158. "orrs r3, r3, r6\n\t"
  92159. #elif defined(__clang__)
  92160. "orrs r3, r6\n\t"
  92161. #else
  92162. "orr r3, r6\n\t"
  92163. #endif
  92164. "ldr r4, [%[a], #28]\n\t"
  92165. "str r3, [%[r], #36]\n\t"
  92166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92167. "lsrs r6, r4, #1\n\t"
  92168. #else
  92169. "lsr r6, r4, #1\n\t"
  92170. #endif
  92171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92172. "lsls r4, r4, %[n]\n\t"
  92173. #else
  92174. "lsl r4, r4, %[n]\n\t"
  92175. #endif
  92176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92177. "lsrs r6, r6, r7\n\t"
  92178. #else
  92179. "lsr r6, r6, r7\n\t"
  92180. #endif
  92181. #ifdef WOLFSSL_KEIL
  92182. "orrs r5, r5, r6\n\t"
  92183. #elif defined(__clang__)
  92184. "orrs r5, r6\n\t"
  92185. #else
  92186. "orr r5, r6\n\t"
  92187. #endif
  92188. "ldr r3, [%[a], #24]\n\t"
  92189. "str r5, [%[r], #32]\n\t"
  92190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92191. "lsrs r6, r3, #1\n\t"
  92192. #else
  92193. "lsr r6, r3, #1\n\t"
  92194. #endif
  92195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92196. "lsls r3, r3, %[n]\n\t"
  92197. #else
  92198. "lsl r3, r3, %[n]\n\t"
  92199. #endif
  92200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92201. "lsrs r6, r6, r7\n\t"
  92202. #else
  92203. "lsr r6, r6, r7\n\t"
  92204. #endif
  92205. #ifdef WOLFSSL_KEIL
  92206. "orrs r4, r4, r6\n\t"
  92207. #elif defined(__clang__)
  92208. "orrs r4, r6\n\t"
  92209. #else
  92210. "orr r4, r6\n\t"
  92211. #endif
  92212. "ldr r5, [%[a], #20]\n\t"
  92213. "str r4, [%[r], #28]\n\t"
  92214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92215. "lsrs r6, r5, #1\n\t"
  92216. #else
  92217. "lsr r6, r5, #1\n\t"
  92218. #endif
  92219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92220. "lsls r5, r5, %[n]\n\t"
  92221. #else
  92222. "lsl r5, r5, %[n]\n\t"
  92223. #endif
  92224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92225. "lsrs r6, r6, r7\n\t"
  92226. #else
  92227. "lsr r6, r6, r7\n\t"
  92228. #endif
  92229. #ifdef WOLFSSL_KEIL
  92230. "orrs r3, r3, r6\n\t"
  92231. #elif defined(__clang__)
  92232. "orrs r3, r6\n\t"
  92233. #else
  92234. "orr r3, r6\n\t"
  92235. #endif
  92236. "ldr r4, [%[a], #16]\n\t"
  92237. "str r3, [%[r], #24]\n\t"
  92238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92239. "lsrs r6, r4, #1\n\t"
  92240. #else
  92241. "lsr r6, r4, #1\n\t"
  92242. #endif
  92243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92244. "lsls r4, r4, %[n]\n\t"
  92245. #else
  92246. "lsl r4, r4, %[n]\n\t"
  92247. #endif
  92248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92249. "lsrs r6, r6, r7\n\t"
  92250. #else
  92251. "lsr r6, r6, r7\n\t"
  92252. #endif
  92253. #ifdef WOLFSSL_KEIL
  92254. "orrs r5, r5, r6\n\t"
  92255. #elif defined(__clang__)
  92256. "orrs r5, r6\n\t"
  92257. #else
  92258. "orr r5, r6\n\t"
  92259. #endif
  92260. "ldr r3, [%[a], #12]\n\t"
  92261. "str r5, [%[r], #20]\n\t"
  92262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92263. "lsrs r6, r3, #1\n\t"
  92264. #else
  92265. "lsr r6, r3, #1\n\t"
  92266. #endif
  92267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92268. "lsls r3, r3, %[n]\n\t"
  92269. #else
  92270. "lsl r3, r3, %[n]\n\t"
  92271. #endif
  92272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92273. "lsrs r6, r6, r7\n\t"
  92274. #else
  92275. "lsr r6, r6, r7\n\t"
  92276. #endif
  92277. #ifdef WOLFSSL_KEIL
  92278. "orrs r4, r4, r6\n\t"
  92279. #elif defined(__clang__)
  92280. "orrs r4, r6\n\t"
  92281. #else
  92282. "orr r4, r6\n\t"
  92283. #endif
  92284. "ldr r5, [%[a], #8]\n\t"
  92285. "str r4, [%[r], #16]\n\t"
  92286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92287. "lsrs r6, r5, #1\n\t"
  92288. #else
  92289. "lsr r6, r5, #1\n\t"
  92290. #endif
  92291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92292. "lsls r5, r5, %[n]\n\t"
  92293. #else
  92294. "lsl r5, r5, %[n]\n\t"
  92295. #endif
  92296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92297. "lsrs r6, r6, r7\n\t"
  92298. #else
  92299. "lsr r6, r6, r7\n\t"
  92300. #endif
  92301. #ifdef WOLFSSL_KEIL
  92302. "orrs r3, r3, r6\n\t"
  92303. #elif defined(__clang__)
  92304. "orrs r3, r6\n\t"
  92305. #else
  92306. "orr r3, r6\n\t"
  92307. #endif
  92308. "ldr r4, [%[a], #4]\n\t"
  92309. "str r3, [%[r], #12]\n\t"
  92310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92311. "lsrs r6, r4, #1\n\t"
  92312. #else
  92313. "lsr r6, r4, #1\n\t"
  92314. #endif
  92315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92316. "lsls r4, r4, %[n]\n\t"
  92317. #else
  92318. "lsl r4, r4, %[n]\n\t"
  92319. #endif
  92320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92321. "lsrs r6, r6, r7\n\t"
  92322. #else
  92323. "lsr r6, r6, r7\n\t"
  92324. #endif
  92325. #ifdef WOLFSSL_KEIL
  92326. "orrs r5, r5, r6\n\t"
  92327. #elif defined(__clang__)
  92328. "orrs r5, r6\n\t"
  92329. #else
  92330. "orr r5, r6\n\t"
  92331. #endif
  92332. "ldr r3, [%[a]]\n\t"
  92333. "str r5, [%[r], #8]\n\t"
  92334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92335. "lsrs r6, r3, #1\n\t"
  92336. #else
  92337. "lsr r6, r3, #1\n\t"
  92338. #endif
  92339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92340. "lsls r3, r3, %[n]\n\t"
  92341. #else
  92342. "lsl r3, r3, %[n]\n\t"
  92343. #endif
  92344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92345. "lsrs r6, r6, r7\n\t"
  92346. #else
  92347. "lsr r6, r6, r7\n\t"
  92348. #endif
  92349. #ifdef WOLFSSL_KEIL
  92350. "orrs r4, r4, r6\n\t"
  92351. #elif defined(__clang__)
  92352. "orrs r4, r6\n\t"
  92353. #else
  92354. "orr r4, r6\n\t"
  92355. #endif
  92356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92357. "subs %[a], %[a], #0x40\n\t"
  92358. #else
  92359. "sub %[a], %[a], #0x40\n\t"
  92360. #endif
  92361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92362. "subs %[r], %[r], #0x40\n\t"
  92363. #else
  92364. "sub %[r], %[r], #0x40\n\t"
  92365. #endif
  92366. "ldr r5, [%[a], #60]\n\t"
  92367. "str r4, [%[r], #68]\n\t"
  92368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92369. "lsrs r6, r5, #1\n\t"
  92370. #else
  92371. "lsr r6, r5, #1\n\t"
  92372. #endif
  92373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92374. "lsls r5, r5, %[n]\n\t"
  92375. #else
  92376. "lsl r5, r5, %[n]\n\t"
  92377. #endif
  92378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92379. "lsrs r6, r6, r7\n\t"
  92380. #else
  92381. "lsr r6, r6, r7\n\t"
  92382. #endif
  92383. #ifdef WOLFSSL_KEIL
  92384. "orrs r3, r3, r6\n\t"
  92385. #elif defined(__clang__)
  92386. "orrs r3, r6\n\t"
  92387. #else
  92388. "orr r3, r6\n\t"
  92389. #endif
  92390. "ldr r4, [%[a], #56]\n\t"
  92391. "str r3, [%[r], #64]\n\t"
  92392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92393. "lsrs r6, r4, #1\n\t"
  92394. #else
  92395. "lsr r6, r4, #1\n\t"
  92396. #endif
  92397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92398. "lsls r4, r4, %[n]\n\t"
  92399. #else
  92400. "lsl r4, r4, %[n]\n\t"
  92401. #endif
  92402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92403. "lsrs r6, r6, r7\n\t"
  92404. #else
  92405. "lsr r6, r6, r7\n\t"
  92406. #endif
  92407. #ifdef WOLFSSL_KEIL
  92408. "orrs r5, r5, r6\n\t"
  92409. #elif defined(__clang__)
  92410. "orrs r5, r6\n\t"
  92411. #else
  92412. "orr r5, r6\n\t"
  92413. #endif
  92414. "ldr r3, [%[a], #52]\n\t"
  92415. "str r5, [%[r], #60]\n\t"
  92416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92417. "lsrs r6, r3, #1\n\t"
  92418. #else
  92419. "lsr r6, r3, #1\n\t"
  92420. #endif
  92421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92422. "lsls r3, r3, %[n]\n\t"
  92423. #else
  92424. "lsl r3, r3, %[n]\n\t"
  92425. #endif
  92426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92427. "lsrs r6, r6, r7\n\t"
  92428. #else
  92429. "lsr r6, r6, r7\n\t"
  92430. #endif
  92431. #ifdef WOLFSSL_KEIL
  92432. "orrs r4, r4, r6\n\t"
  92433. #elif defined(__clang__)
  92434. "orrs r4, r6\n\t"
  92435. #else
  92436. "orr r4, r6\n\t"
  92437. #endif
  92438. "ldr r5, [%[a], #48]\n\t"
  92439. "str r4, [%[r], #56]\n\t"
  92440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92441. "lsrs r6, r5, #1\n\t"
  92442. #else
  92443. "lsr r6, r5, #1\n\t"
  92444. #endif
  92445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92446. "lsls r5, r5, %[n]\n\t"
  92447. #else
  92448. "lsl r5, r5, %[n]\n\t"
  92449. #endif
  92450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92451. "lsrs r6, r6, r7\n\t"
  92452. #else
  92453. "lsr r6, r6, r7\n\t"
  92454. #endif
  92455. #ifdef WOLFSSL_KEIL
  92456. "orrs r3, r3, r6\n\t"
  92457. #elif defined(__clang__)
  92458. "orrs r3, r6\n\t"
  92459. #else
  92460. "orr r3, r6\n\t"
  92461. #endif
  92462. "ldr r4, [%[a], #44]\n\t"
  92463. "str r3, [%[r], #52]\n\t"
  92464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92465. "lsrs r6, r4, #1\n\t"
  92466. #else
  92467. "lsr r6, r4, #1\n\t"
  92468. #endif
  92469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92470. "lsls r4, r4, %[n]\n\t"
  92471. #else
  92472. "lsl r4, r4, %[n]\n\t"
  92473. #endif
  92474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92475. "lsrs r6, r6, r7\n\t"
  92476. #else
  92477. "lsr r6, r6, r7\n\t"
  92478. #endif
  92479. #ifdef WOLFSSL_KEIL
  92480. "orrs r5, r5, r6\n\t"
  92481. #elif defined(__clang__)
  92482. "orrs r5, r6\n\t"
  92483. #else
  92484. "orr r5, r6\n\t"
  92485. #endif
  92486. "ldr r3, [%[a], #40]\n\t"
  92487. "str r5, [%[r], #48]\n\t"
  92488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92489. "lsrs r6, r3, #1\n\t"
  92490. #else
  92491. "lsr r6, r3, #1\n\t"
  92492. #endif
  92493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92494. "lsls r3, r3, %[n]\n\t"
  92495. #else
  92496. "lsl r3, r3, %[n]\n\t"
  92497. #endif
  92498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92499. "lsrs r6, r6, r7\n\t"
  92500. #else
  92501. "lsr r6, r6, r7\n\t"
  92502. #endif
  92503. #ifdef WOLFSSL_KEIL
  92504. "orrs r4, r4, r6\n\t"
  92505. #elif defined(__clang__)
  92506. "orrs r4, r6\n\t"
  92507. #else
  92508. "orr r4, r6\n\t"
  92509. #endif
  92510. "ldr r5, [%[a], #36]\n\t"
  92511. "str r4, [%[r], #44]\n\t"
  92512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92513. "lsrs r6, r5, #1\n\t"
  92514. #else
  92515. "lsr r6, r5, #1\n\t"
  92516. #endif
  92517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92518. "lsls r5, r5, %[n]\n\t"
  92519. #else
  92520. "lsl r5, r5, %[n]\n\t"
  92521. #endif
  92522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92523. "lsrs r6, r6, r7\n\t"
  92524. #else
  92525. "lsr r6, r6, r7\n\t"
  92526. #endif
  92527. #ifdef WOLFSSL_KEIL
  92528. "orrs r3, r3, r6\n\t"
  92529. #elif defined(__clang__)
  92530. "orrs r3, r6\n\t"
  92531. #else
  92532. "orr r3, r6\n\t"
  92533. #endif
  92534. "ldr r4, [%[a], #32]\n\t"
  92535. "str r3, [%[r], #40]\n\t"
  92536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92537. "lsrs r6, r4, #1\n\t"
  92538. #else
  92539. "lsr r6, r4, #1\n\t"
  92540. #endif
  92541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92542. "lsls r4, r4, %[n]\n\t"
  92543. #else
  92544. "lsl r4, r4, %[n]\n\t"
  92545. #endif
  92546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92547. "lsrs r6, r6, r7\n\t"
  92548. #else
  92549. "lsr r6, r6, r7\n\t"
  92550. #endif
  92551. #ifdef WOLFSSL_KEIL
  92552. "orrs r5, r5, r6\n\t"
  92553. #elif defined(__clang__)
  92554. "orrs r5, r6\n\t"
  92555. #else
  92556. "orr r5, r6\n\t"
  92557. #endif
  92558. "ldr r3, [%[a], #28]\n\t"
  92559. "str r5, [%[r], #36]\n\t"
  92560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92561. "lsrs r6, r3, #1\n\t"
  92562. #else
  92563. "lsr r6, r3, #1\n\t"
  92564. #endif
  92565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92566. "lsls r3, r3, %[n]\n\t"
  92567. #else
  92568. "lsl r3, r3, %[n]\n\t"
  92569. #endif
  92570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92571. "lsrs r6, r6, r7\n\t"
  92572. #else
  92573. "lsr r6, r6, r7\n\t"
  92574. #endif
  92575. #ifdef WOLFSSL_KEIL
  92576. "orrs r4, r4, r6\n\t"
  92577. #elif defined(__clang__)
  92578. "orrs r4, r6\n\t"
  92579. #else
  92580. "orr r4, r6\n\t"
  92581. #endif
  92582. "ldr r5, [%[a], #24]\n\t"
  92583. "str r4, [%[r], #32]\n\t"
  92584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92585. "lsrs r6, r5, #1\n\t"
  92586. #else
  92587. "lsr r6, r5, #1\n\t"
  92588. #endif
  92589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92590. "lsls r5, r5, %[n]\n\t"
  92591. #else
  92592. "lsl r5, r5, %[n]\n\t"
  92593. #endif
  92594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92595. "lsrs r6, r6, r7\n\t"
  92596. #else
  92597. "lsr r6, r6, r7\n\t"
  92598. #endif
  92599. #ifdef WOLFSSL_KEIL
  92600. "orrs r3, r3, r6\n\t"
  92601. #elif defined(__clang__)
  92602. "orrs r3, r6\n\t"
  92603. #else
  92604. "orr r3, r6\n\t"
  92605. #endif
  92606. "ldr r4, [%[a], #20]\n\t"
  92607. "str r3, [%[r], #28]\n\t"
  92608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92609. "lsrs r6, r4, #1\n\t"
  92610. #else
  92611. "lsr r6, r4, #1\n\t"
  92612. #endif
  92613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92614. "lsls r4, r4, %[n]\n\t"
  92615. #else
  92616. "lsl r4, r4, %[n]\n\t"
  92617. #endif
  92618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92619. "lsrs r6, r6, r7\n\t"
  92620. #else
  92621. "lsr r6, r6, r7\n\t"
  92622. #endif
  92623. #ifdef WOLFSSL_KEIL
  92624. "orrs r5, r5, r6\n\t"
  92625. #elif defined(__clang__)
  92626. "orrs r5, r6\n\t"
  92627. #else
  92628. "orr r5, r6\n\t"
  92629. #endif
  92630. "ldr r3, [%[a], #16]\n\t"
  92631. "str r5, [%[r], #24]\n\t"
  92632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92633. "lsrs r6, r3, #1\n\t"
  92634. #else
  92635. "lsr r6, r3, #1\n\t"
  92636. #endif
  92637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92638. "lsls r3, r3, %[n]\n\t"
  92639. #else
  92640. "lsl r3, r3, %[n]\n\t"
  92641. #endif
  92642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92643. "lsrs r6, r6, r7\n\t"
  92644. #else
  92645. "lsr r6, r6, r7\n\t"
  92646. #endif
  92647. #ifdef WOLFSSL_KEIL
  92648. "orrs r4, r4, r6\n\t"
  92649. #elif defined(__clang__)
  92650. "orrs r4, r6\n\t"
  92651. #else
  92652. "orr r4, r6\n\t"
  92653. #endif
  92654. "ldr r5, [%[a], #12]\n\t"
  92655. "str r4, [%[r], #20]\n\t"
  92656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92657. "lsrs r6, r5, #1\n\t"
  92658. #else
  92659. "lsr r6, r5, #1\n\t"
  92660. #endif
  92661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92662. "lsls r5, r5, %[n]\n\t"
  92663. #else
  92664. "lsl r5, r5, %[n]\n\t"
  92665. #endif
  92666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92667. "lsrs r6, r6, r7\n\t"
  92668. #else
  92669. "lsr r6, r6, r7\n\t"
  92670. #endif
  92671. #ifdef WOLFSSL_KEIL
  92672. "orrs r3, r3, r6\n\t"
  92673. #elif defined(__clang__)
  92674. "orrs r3, r6\n\t"
  92675. #else
  92676. "orr r3, r6\n\t"
  92677. #endif
  92678. "ldr r4, [%[a], #8]\n\t"
  92679. "str r3, [%[r], #16]\n\t"
  92680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92681. "lsrs r6, r4, #1\n\t"
  92682. #else
  92683. "lsr r6, r4, #1\n\t"
  92684. #endif
  92685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92686. "lsls r4, r4, %[n]\n\t"
  92687. #else
  92688. "lsl r4, r4, %[n]\n\t"
  92689. #endif
  92690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92691. "lsrs r6, r6, r7\n\t"
  92692. #else
  92693. "lsr r6, r6, r7\n\t"
  92694. #endif
  92695. #ifdef WOLFSSL_KEIL
  92696. "orrs r5, r5, r6\n\t"
  92697. #elif defined(__clang__)
  92698. "orrs r5, r6\n\t"
  92699. #else
  92700. "orr r5, r6\n\t"
  92701. #endif
  92702. "ldr r3, [%[a], #4]\n\t"
  92703. "str r5, [%[r], #12]\n\t"
  92704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92705. "lsrs r6, r3, #1\n\t"
  92706. #else
  92707. "lsr r6, r3, #1\n\t"
  92708. #endif
  92709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92710. "lsls r3, r3, %[n]\n\t"
  92711. #else
  92712. "lsl r3, r3, %[n]\n\t"
  92713. #endif
  92714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92715. "lsrs r6, r6, r7\n\t"
  92716. #else
  92717. "lsr r6, r6, r7\n\t"
  92718. #endif
  92719. #ifdef WOLFSSL_KEIL
  92720. "orrs r4, r4, r6\n\t"
  92721. #elif defined(__clang__)
  92722. "orrs r4, r6\n\t"
  92723. #else
  92724. "orr r4, r6\n\t"
  92725. #endif
  92726. "ldr r5, [%[a]]\n\t"
  92727. "str r4, [%[r], #8]\n\t"
  92728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92729. "lsrs r6, r5, #1\n\t"
  92730. #else
  92731. "lsr r6, r5, #1\n\t"
  92732. #endif
  92733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92734. "lsls r5, r5, %[n]\n\t"
  92735. #else
  92736. "lsl r5, r5, %[n]\n\t"
  92737. #endif
  92738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92739. "lsrs r6, r6, r7\n\t"
  92740. #else
  92741. "lsr r6, r6, r7\n\t"
  92742. #endif
  92743. #ifdef WOLFSSL_KEIL
  92744. "orrs r3, r3, r6\n\t"
  92745. #elif defined(__clang__)
  92746. "orrs r3, r6\n\t"
  92747. #else
  92748. "orr r3, r6\n\t"
  92749. #endif
  92750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92751. "subs %[a], %[a], #0x40\n\t"
  92752. #else
  92753. "sub %[a], %[a], #0x40\n\t"
  92754. #endif
  92755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92756. "subs %[r], %[r], #0x40\n\t"
  92757. #else
  92758. "sub %[r], %[r], #0x40\n\t"
  92759. #endif
  92760. "ldr r4, [%[a], #60]\n\t"
  92761. "str r3, [%[r], #68]\n\t"
  92762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92763. "lsrs r6, r4, #1\n\t"
  92764. #else
  92765. "lsr r6, r4, #1\n\t"
  92766. #endif
  92767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92768. "lsls r4, r4, %[n]\n\t"
  92769. #else
  92770. "lsl r4, r4, %[n]\n\t"
  92771. #endif
  92772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92773. "lsrs r6, r6, r7\n\t"
  92774. #else
  92775. "lsr r6, r6, r7\n\t"
  92776. #endif
  92777. #ifdef WOLFSSL_KEIL
  92778. "orrs r5, r5, r6\n\t"
  92779. #elif defined(__clang__)
  92780. "orrs r5, r6\n\t"
  92781. #else
  92782. "orr r5, r6\n\t"
  92783. #endif
  92784. "ldr r3, [%[a], #56]\n\t"
  92785. "str r5, [%[r], #64]\n\t"
  92786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92787. "lsrs r6, r3, #1\n\t"
  92788. #else
  92789. "lsr r6, r3, #1\n\t"
  92790. #endif
  92791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92792. "lsls r3, r3, %[n]\n\t"
  92793. #else
  92794. "lsl r3, r3, %[n]\n\t"
  92795. #endif
  92796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92797. "lsrs r6, r6, r7\n\t"
  92798. #else
  92799. "lsr r6, r6, r7\n\t"
  92800. #endif
  92801. #ifdef WOLFSSL_KEIL
  92802. "orrs r4, r4, r6\n\t"
  92803. #elif defined(__clang__)
  92804. "orrs r4, r6\n\t"
  92805. #else
  92806. "orr r4, r6\n\t"
  92807. #endif
  92808. "ldr r5, [%[a], #52]\n\t"
  92809. "str r4, [%[r], #60]\n\t"
  92810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92811. "lsrs r6, r5, #1\n\t"
  92812. #else
  92813. "lsr r6, r5, #1\n\t"
  92814. #endif
  92815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92816. "lsls r5, r5, %[n]\n\t"
  92817. #else
  92818. "lsl r5, r5, %[n]\n\t"
  92819. #endif
  92820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92821. "lsrs r6, r6, r7\n\t"
  92822. #else
  92823. "lsr r6, r6, r7\n\t"
  92824. #endif
  92825. #ifdef WOLFSSL_KEIL
  92826. "orrs r3, r3, r6\n\t"
  92827. #elif defined(__clang__)
  92828. "orrs r3, r6\n\t"
  92829. #else
  92830. "orr r3, r6\n\t"
  92831. #endif
  92832. "ldr r4, [%[a], #48]\n\t"
  92833. "str r3, [%[r], #56]\n\t"
  92834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92835. "lsrs r6, r4, #1\n\t"
  92836. #else
  92837. "lsr r6, r4, #1\n\t"
  92838. #endif
  92839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92840. "lsls r4, r4, %[n]\n\t"
  92841. #else
  92842. "lsl r4, r4, %[n]\n\t"
  92843. #endif
  92844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92845. "lsrs r6, r6, r7\n\t"
  92846. #else
  92847. "lsr r6, r6, r7\n\t"
  92848. #endif
  92849. #ifdef WOLFSSL_KEIL
  92850. "orrs r5, r5, r6\n\t"
  92851. #elif defined(__clang__)
  92852. "orrs r5, r6\n\t"
  92853. #else
  92854. "orr r5, r6\n\t"
  92855. #endif
  92856. "ldr r3, [%[a], #44]\n\t"
  92857. "str r5, [%[r], #52]\n\t"
  92858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92859. "lsrs r6, r3, #1\n\t"
  92860. #else
  92861. "lsr r6, r3, #1\n\t"
  92862. #endif
  92863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92864. "lsls r3, r3, %[n]\n\t"
  92865. #else
  92866. "lsl r3, r3, %[n]\n\t"
  92867. #endif
  92868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92869. "lsrs r6, r6, r7\n\t"
  92870. #else
  92871. "lsr r6, r6, r7\n\t"
  92872. #endif
  92873. #ifdef WOLFSSL_KEIL
  92874. "orrs r4, r4, r6\n\t"
  92875. #elif defined(__clang__)
  92876. "orrs r4, r6\n\t"
  92877. #else
  92878. "orr r4, r6\n\t"
  92879. #endif
  92880. "ldr r5, [%[a], #40]\n\t"
  92881. "str r4, [%[r], #48]\n\t"
  92882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92883. "lsrs r6, r5, #1\n\t"
  92884. #else
  92885. "lsr r6, r5, #1\n\t"
  92886. #endif
  92887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92888. "lsls r5, r5, %[n]\n\t"
  92889. #else
  92890. "lsl r5, r5, %[n]\n\t"
  92891. #endif
  92892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92893. "lsrs r6, r6, r7\n\t"
  92894. #else
  92895. "lsr r6, r6, r7\n\t"
  92896. #endif
  92897. #ifdef WOLFSSL_KEIL
  92898. "orrs r3, r3, r6\n\t"
  92899. #elif defined(__clang__)
  92900. "orrs r3, r6\n\t"
  92901. #else
  92902. "orr r3, r6\n\t"
  92903. #endif
  92904. "ldr r4, [%[a], #36]\n\t"
  92905. "str r3, [%[r], #44]\n\t"
  92906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92907. "lsrs r6, r4, #1\n\t"
  92908. #else
  92909. "lsr r6, r4, #1\n\t"
  92910. #endif
  92911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92912. "lsls r4, r4, %[n]\n\t"
  92913. #else
  92914. "lsl r4, r4, %[n]\n\t"
  92915. #endif
  92916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92917. "lsrs r6, r6, r7\n\t"
  92918. #else
  92919. "lsr r6, r6, r7\n\t"
  92920. #endif
  92921. #ifdef WOLFSSL_KEIL
  92922. "orrs r5, r5, r6\n\t"
  92923. #elif defined(__clang__)
  92924. "orrs r5, r6\n\t"
  92925. #else
  92926. "orr r5, r6\n\t"
  92927. #endif
  92928. "ldr r3, [%[a], #32]\n\t"
  92929. "str r5, [%[r], #40]\n\t"
  92930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92931. "lsrs r6, r3, #1\n\t"
  92932. #else
  92933. "lsr r6, r3, #1\n\t"
  92934. #endif
  92935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92936. "lsls r3, r3, %[n]\n\t"
  92937. #else
  92938. "lsl r3, r3, %[n]\n\t"
  92939. #endif
  92940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92941. "lsrs r6, r6, r7\n\t"
  92942. #else
  92943. "lsr r6, r6, r7\n\t"
  92944. #endif
  92945. #ifdef WOLFSSL_KEIL
  92946. "orrs r4, r4, r6\n\t"
  92947. #elif defined(__clang__)
  92948. "orrs r4, r6\n\t"
  92949. #else
  92950. "orr r4, r6\n\t"
  92951. #endif
  92952. "ldr r5, [%[a], #28]\n\t"
  92953. "str r4, [%[r], #36]\n\t"
  92954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92955. "lsrs r6, r5, #1\n\t"
  92956. #else
  92957. "lsr r6, r5, #1\n\t"
  92958. #endif
  92959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92960. "lsls r5, r5, %[n]\n\t"
  92961. #else
  92962. "lsl r5, r5, %[n]\n\t"
  92963. #endif
  92964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92965. "lsrs r6, r6, r7\n\t"
  92966. #else
  92967. "lsr r6, r6, r7\n\t"
  92968. #endif
  92969. #ifdef WOLFSSL_KEIL
  92970. "orrs r3, r3, r6\n\t"
  92971. #elif defined(__clang__)
  92972. "orrs r3, r6\n\t"
  92973. #else
  92974. "orr r3, r6\n\t"
  92975. #endif
  92976. "ldr r4, [%[a], #24]\n\t"
  92977. "str r3, [%[r], #32]\n\t"
  92978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92979. "lsrs r6, r4, #1\n\t"
  92980. #else
  92981. "lsr r6, r4, #1\n\t"
  92982. #endif
  92983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92984. "lsls r4, r4, %[n]\n\t"
  92985. #else
  92986. "lsl r4, r4, %[n]\n\t"
  92987. #endif
  92988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92989. "lsrs r6, r6, r7\n\t"
  92990. #else
  92991. "lsr r6, r6, r7\n\t"
  92992. #endif
  92993. #ifdef WOLFSSL_KEIL
  92994. "orrs r5, r5, r6\n\t"
  92995. #elif defined(__clang__)
  92996. "orrs r5, r6\n\t"
  92997. #else
  92998. "orr r5, r6\n\t"
  92999. #endif
  93000. "ldr r3, [%[a], #20]\n\t"
  93001. "str r5, [%[r], #28]\n\t"
  93002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93003. "lsrs r6, r3, #1\n\t"
  93004. #else
  93005. "lsr r6, r3, #1\n\t"
  93006. #endif
  93007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93008. "lsls r3, r3, %[n]\n\t"
  93009. #else
  93010. "lsl r3, r3, %[n]\n\t"
  93011. #endif
  93012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93013. "lsrs r6, r6, r7\n\t"
  93014. #else
  93015. "lsr r6, r6, r7\n\t"
  93016. #endif
  93017. #ifdef WOLFSSL_KEIL
  93018. "orrs r4, r4, r6\n\t"
  93019. #elif defined(__clang__)
  93020. "orrs r4, r6\n\t"
  93021. #else
  93022. "orr r4, r6\n\t"
  93023. #endif
  93024. "ldr r5, [%[a], #16]\n\t"
  93025. "str r4, [%[r], #24]\n\t"
  93026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93027. "lsrs r6, r5, #1\n\t"
  93028. #else
  93029. "lsr r6, r5, #1\n\t"
  93030. #endif
  93031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93032. "lsls r5, r5, %[n]\n\t"
  93033. #else
  93034. "lsl r5, r5, %[n]\n\t"
  93035. #endif
  93036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93037. "lsrs r6, r6, r7\n\t"
  93038. #else
  93039. "lsr r6, r6, r7\n\t"
  93040. #endif
  93041. #ifdef WOLFSSL_KEIL
  93042. "orrs r3, r3, r6\n\t"
  93043. #elif defined(__clang__)
  93044. "orrs r3, r6\n\t"
  93045. #else
  93046. "orr r3, r6\n\t"
  93047. #endif
  93048. "ldr r4, [%[a], #12]\n\t"
  93049. "str r3, [%[r], #20]\n\t"
  93050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93051. "lsrs r6, r4, #1\n\t"
  93052. #else
  93053. "lsr r6, r4, #1\n\t"
  93054. #endif
  93055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93056. "lsls r4, r4, %[n]\n\t"
  93057. #else
  93058. "lsl r4, r4, %[n]\n\t"
  93059. #endif
  93060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93061. "lsrs r6, r6, r7\n\t"
  93062. #else
  93063. "lsr r6, r6, r7\n\t"
  93064. #endif
  93065. #ifdef WOLFSSL_KEIL
  93066. "orrs r5, r5, r6\n\t"
  93067. #elif defined(__clang__)
  93068. "orrs r5, r6\n\t"
  93069. #else
  93070. "orr r5, r6\n\t"
  93071. #endif
  93072. "ldr r3, [%[a], #8]\n\t"
  93073. "str r5, [%[r], #16]\n\t"
  93074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93075. "lsrs r6, r3, #1\n\t"
  93076. #else
  93077. "lsr r6, r3, #1\n\t"
  93078. #endif
  93079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93080. "lsls r3, r3, %[n]\n\t"
  93081. #else
  93082. "lsl r3, r3, %[n]\n\t"
  93083. #endif
  93084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93085. "lsrs r6, r6, r7\n\t"
  93086. #else
  93087. "lsr r6, r6, r7\n\t"
  93088. #endif
  93089. #ifdef WOLFSSL_KEIL
  93090. "orrs r4, r4, r6\n\t"
  93091. #elif defined(__clang__)
  93092. "orrs r4, r6\n\t"
  93093. #else
  93094. "orr r4, r6\n\t"
  93095. #endif
  93096. "ldr r5, [%[a], #4]\n\t"
  93097. "str r4, [%[r], #12]\n\t"
  93098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93099. "lsrs r6, r5, #1\n\t"
  93100. #else
  93101. "lsr r6, r5, #1\n\t"
  93102. #endif
  93103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93104. "lsls r5, r5, %[n]\n\t"
  93105. #else
  93106. "lsl r5, r5, %[n]\n\t"
  93107. #endif
  93108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93109. "lsrs r6, r6, r7\n\t"
  93110. #else
  93111. "lsr r6, r6, r7\n\t"
  93112. #endif
  93113. #ifdef WOLFSSL_KEIL
  93114. "orrs r3, r3, r6\n\t"
  93115. #elif defined(__clang__)
  93116. "orrs r3, r6\n\t"
  93117. #else
  93118. "orr r3, r6\n\t"
  93119. #endif
  93120. "ldr r4, [%[a]]\n\t"
  93121. "str r3, [%[r], #8]\n\t"
  93122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93123. "lsrs r6, r4, #1\n\t"
  93124. #else
  93125. "lsr r6, r4, #1\n\t"
  93126. #endif
  93127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93128. "lsls r4, r4, %[n]\n\t"
  93129. #else
  93130. "lsl r4, r4, %[n]\n\t"
  93131. #endif
  93132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93133. "lsrs r6, r6, r7\n\t"
  93134. #else
  93135. "lsr r6, r6, r7\n\t"
  93136. #endif
  93137. #ifdef WOLFSSL_KEIL
  93138. "orrs r5, r5, r6\n\t"
  93139. #elif defined(__clang__)
  93140. "orrs r5, r6\n\t"
  93141. #else
  93142. "orr r5, r6\n\t"
  93143. #endif
  93144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93145. "subs %[a], %[a], #0x40\n\t"
  93146. #else
  93147. "sub %[a], %[a], #0x40\n\t"
  93148. #endif
  93149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93150. "subs %[r], %[r], #0x40\n\t"
  93151. #else
  93152. "sub %[r], %[r], #0x40\n\t"
  93153. #endif
  93154. "ldr r3, [%[a], #60]\n\t"
  93155. "str r5, [%[r], #68]\n\t"
  93156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93157. "lsrs r6, r3, #1\n\t"
  93158. #else
  93159. "lsr r6, r3, #1\n\t"
  93160. #endif
  93161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93162. "lsls r3, r3, %[n]\n\t"
  93163. #else
  93164. "lsl r3, r3, %[n]\n\t"
  93165. #endif
  93166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93167. "lsrs r6, r6, r7\n\t"
  93168. #else
  93169. "lsr r6, r6, r7\n\t"
  93170. #endif
  93171. #ifdef WOLFSSL_KEIL
  93172. "orrs r4, r4, r6\n\t"
  93173. #elif defined(__clang__)
  93174. "orrs r4, r6\n\t"
  93175. #else
  93176. "orr r4, r6\n\t"
  93177. #endif
  93178. "ldr r5, [%[a], #56]\n\t"
  93179. "str r4, [%[r], #64]\n\t"
  93180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93181. "lsrs r6, r5, #1\n\t"
  93182. #else
  93183. "lsr r6, r5, #1\n\t"
  93184. #endif
  93185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93186. "lsls r5, r5, %[n]\n\t"
  93187. #else
  93188. "lsl r5, r5, %[n]\n\t"
  93189. #endif
  93190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93191. "lsrs r6, r6, r7\n\t"
  93192. #else
  93193. "lsr r6, r6, r7\n\t"
  93194. #endif
  93195. #ifdef WOLFSSL_KEIL
  93196. "orrs r3, r3, r6\n\t"
  93197. #elif defined(__clang__)
  93198. "orrs r3, r6\n\t"
  93199. #else
  93200. "orr r3, r6\n\t"
  93201. #endif
  93202. "ldr r4, [%[a], #52]\n\t"
  93203. "str r3, [%[r], #60]\n\t"
  93204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93205. "lsrs r6, r4, #1\n\t"
  93206. #else
  93207. "lsr r6, r4, #1\n\t"
  93208. #endif
  93209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93210. "lsls r4, r4, %[n]\n\t"
  93211. #else
  93212. "lsl r4, r4, %[n]\n\t"
  93213. #endif
  93214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93215. "lsrs r6, r6, r7\n\t"
  93216. #else
  93217. "lsr r6, r6, r7\n\t"
  93218. #endif
  93219. #ifdef WOLFSSL_KEIL
  93220. "orrs r5, r5, r6\n\t"
  93221. #elif defined(__clang__)
  93222. "orrs r5, r6\n\t"
  93223. #else
  93224. "orr r5, r6\n\t"
  93225. #endif
  93226. "ldr r3, [%[a], #48]\n\t"
  93227. "str r5, [%[r], #56]\n\t"
  93228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93229. "lsrs r6, r3, #1\n\t"
  93230. #else
  93231. "lsr r6, r3, #1\n\t"
  93232. #endif
  93233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93234. "lsls r3, r3, %[n]\n\t"
  93235. #else
  93236. "lsl r3, r3, %[n]\n\t"
  93237. #endif
  93238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93239. "lsrs r6, r6, r7\n\t"
  93240. #else
  93241. "lsr r6, r6, r7\n\t"
  93242. #endif
  93243. #ifdef WOLFSSL_KEIL
  93244. "orrs r4, r4, r6\n\t"
  93245. #elif defined(__clang__)
  93246. "orrs r4, r6\n\t"
  93247. #else
  93248. "orr r4, r6\n\t"
  93249. #endif
  93250. "ldr r5, [%[a], #44]\n\t"
  93251. "str r4, [%[r], #52]\n\t"
  93252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93253. "lsrs r6, r5, #1\n\t"
  93254. #else
  93255. "lsr r6, r5, #1\n\t"
  93256. #endif
  93257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93258. "lsls r5, r5, %[n]\n\t"
  93259. #else
  93260. "lsl r5, r5, %[n]\n\t"
  93261. #endif
  93262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93263. "lsrs r6, r6, r7\n\t"
  93264. #else
  93265. "lsr r6, r6, r7\n\t"
  93266. #endif
  93267. #ifdef WOLFSSL_KEIL
  93268. "orrs r3, r3, r6\n\t"
  93269. #elif defined(__clang__)
  93270. "orrs r3, r6\n\t"
  93271. #else
  93272. "orr r3, r6\n\t"
  93273. #endif
  93274. "ldr r4, [%[a], #40]\n\t"
  93275. "str r3, [%[r], #48]\n\t"
  93276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93277. "lsrs r6, r4, #1\n\t"
  93278. #else
  93279. "lsr r6, r4, #1\n\t"
  93280. #endif
  93281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93282. "lsls r4, r4, %[n]\n\t"
  93283. #else
  93284. "lsl r4, r4, %[n]\n\t"
  93285. #endif
  93286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93287. "lsrs r6, r6, r7\n\t"
  93288. #else
  93289. "lsr r6, r6, r7\n\t"
  93290. #endif
  93291. #ifdef WOLFSSL_KEIL
  93292. "orrs r5, r5, r6\n\t"
  93293. #elif defined(__clang__)
  93294. "orrs r5, r6\n\t"
  93295. #else
  93296. "orr r5, r6\n\t"
  93297. #endif
  93298. "ldr r3, [%[a], #36]\n\t"
  93299. "str r5, [%[r], #44]\n\t"
  93300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93301. "lsrs r6, r3, #1\n\t"
  93302. #else
  93303. "lsr r6, r3, #1\n\t"
  93304. #endif
  93305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93306. "lsls r3, r3, %[n]\n\t"
  93307. #else
  93308. "lsl r3, r3, %[n]\n\t"
  93309. #endif
  93310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93311. "lsrs r6, r6, r7\n\t"
  93312. #else
  93313. "lsr r6, r6, r7\n\t"
  93314. #endif
  93315. #ifdef WOLFSSL_KEIL
  93316. "orrs r4, r4, r6\n\t"
  93317. #elif defined(__clang__)
  93318. "orrs r4, r6\n\t"
  93319. #else
  93320. "orr r4, r6\n\t"
  93321. #endif
  93322. "ldr r5, [%[a], #32]\n\t"
  93323. "str r4, [%[r], #40]\n\t"
  93324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93325. "lsrs r6, r5, #1\n\t"
  93326. #else
  93327. "lsr r6, r5, #1\n\t"
  93328. #endif
  93329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93330. "lsls r5, r5, %[n]\n\t"
  93331. #else
  93332. "lsl r5, r5, %[n]\n\t"
  93333. #endif
  93334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93335. "lsrs r6, r6, r7\n\t"
  93336. #else
  93337. "lsr r6, r6, r7\n\t"
  93338. #endif
  93339. #ifdef WOLFSSL_KEIL
  93340. "orrs r3, r3, r6\n\t"
  93341. #elif defined(__clang__)
  93342. "orrs r3, r6\n\t"
  93343. #else
  93344. "orr r3, r6\n\t"
  93345. #endif
  93346. "ldr r4, [%[a], #28]\n\t"
  93347. "str r3, [%[r], #36]\n\t"
  93348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93349. "lsrs r6, r4, #1\n\t"
  93350. #else
  93351. "lsr r6, r4, #1\n\t"
  93352. #endif
  93353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93354. "lsls r4, r4, %[n]\n\t"
  93355. #else
  93356. "lsl r4, r4, %[n]\n\t"
  93357. #endif
  93358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93359. "lsrs r6, r6, r7\n\t"
  93360. #else
  93361. "lsr r6, r6, r7\n\t"
  93362. #endif
  93363. #ifdef WOLFSSL_KEIL
  93364. "orrs r5, r5, r6\n\t"
  93365. #elif defined(__clang__)
  93366. "orrs r5, r6\n\t"
  93367. #else
  93368. "orr r5, r6\n\t"
  93369. #endif
  93370. "ldr r3, [%[a], #24]\n\t"
  93371. "str r5, [%[r], #32]\n\t"
  93372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93373. "lsrs r6, r3, #1\n\t"
  93374. #else
  93375. "lsr r6, r3, #1\n\t"
  93376. #endif
  93377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93378. "lsls r3, r3, %[n]\n\t"
  93379. #else
  93380. "lsl r3, r3, %[n]\n\t"
  93381. #endif
  93382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93383. "lsrs r6, r6, r7\n\t"
  93384. #else
  93385. "lsr r6, r6, r7\n\t"
  93386. #endif
  93387. #ifdef WOLFSSL_KEIL
  93388. "orrs r4, r4, r6\n\t"
  93389. #elif defined(__clang__)
  93390. "orrs r4, r6\n\t"
  93391. #else
  93392. "orr r4, r6\n\t"
  93393. #endif
  93394. "ldr r5, [%[a], #20]\n\t"
  93395. "str r4, [%[r], #28]\n\t"
  93396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93397. "lsrs r6, r5, #1\n\t"
  93398. #else
  93399. "lsr r6, r5, #1\n\t"
  93400. #endif
  93401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93402. "lsls r5, r5, %[n]\n\t"
  93403. #else
  93404. "lsl r5, r5, %[n]\n\t"
  93405. #endif
  93406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93407. "lsrs r6, r6, r7\n\t"
  93408. #else
  93409. "lsr r6, r6, r7\n\t"
  93410. #endif
  93411. #ifdef WOLFSSL_KEIL
  93412. "orrs r3, r3, r6\n\t"
  93413. #elif defined(__clang__)
  93414. "orrs r3, r6\n\t"
  93415. #else
  93416. "orr r3, r6\n\t"
  93417. #endif
  93418. "ldr r4, [%[a], #16]\n\t"
  93419. "str r3, [%[r], #24]\n\t"
  93420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93421. "lsrs r6, r4, #1\n\t"
  93422. #else
  93423. "lsr r6, r4, #1\n\t"
  93424. #endif
  93425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93426. "lsls r4, r4, %[n]\n\t"
  93427. #else
  93428. "lsl r4, r4, %[n]\n\t"
  93429. #endif
  93430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93431. "lsrs r6, r6, r7\n\t"
  93432. #else
  93433. "lsr r6, r6, r7\n\t"
  93434. #endif
  93435. #ifdef WOLFSSL_KEIL
  93436. "orrs r5, r5, r6\n\t"
  93437. #elif defined(__clang__)
  93438. "orrs r5, r6\n\t"
  93439. #else
  93440. "orr r5, r6\n\t"
  93441. #endif
  93442. "ldr r3, [%[a], #12]\n\t"
  93443. "str r5, [%[r], #20]\n\t"
  93444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93445. "lsrs r6, r3, #1\n\t"
  93446. #else
  93447. "lsr r6, r3, #1\n\t"
  93448. #endif
  93449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93450. "lsls r3, r3, %[n]\n\t"
  93451. #else
  93452. "lsl r3, r3, %[n]\n\t"
  93453. #endif
  93454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93455. "lsrs r6, r6, r7\n\t"
  93456. #else
  93457. "lsr r6, r6, r7\n\t"
  93458. #endif
  93459. #ifdef WOLFSSL_KEIL
  93460. "orrs r4, r4, r6\n\t"
  93461. #elif defined(__clang__)
  93462. "orrs r4, r6\n\t"
  93463. #else
  93464. "orr r4, r6\n\t"
  93465. #endif
  93466. "ldr r5, [%[a], #8]\n\t"
  93467. "str r4, [%[r], #16]\n\t"
  93468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93469. "lsrs r6, r5, #1\n\t"
  93470. #else
  93471. "lsr r6, r5, #1\n\t"
  93472. #endif
  93473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93474. "lsls r5, r5, %[n]\n\t"
  93475. #else
  93476. "lsl r5, r5, %[n]\n\t"
  93477. #endif
  93478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93479. "lsrs r6, r6, r7\n\t"
  93480. #else
  93481. "lsr r6, r6, r7\n\t"
  93482. #endif
  93483. #ifdef WOLFSSL_KEIL
  93484. "orrs r3, r3, r6\n\t"
  93485. #elif defined(__clang__)
  93486. "orrs r3, r6\n\t"
  93487. #else
  93488. "orr r3, r6\n\t"
  93489. #endif
  93490. "ldr r4, [%[a], #4]\n\t"
  93491. "str r3, [%[r], #12]\n\t"
  93492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93493. "lsrs r6, r4, #1\n\t"
  93494. #else
  93495. "lsr r6, r4, #1\n\t"
  93496. #endif
  93497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93498. "lsls r4, r4, %[n]\n\t"
  93499. #else
  93500. "lsl r4, r4, %[n]\n\t"
  93501. #endif
  93502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93503. "lsrs r6, r6, r7\n\t"
  93504. #else
  93505. "lsr r6, r6, r7\n\t"
  93506. #endif
  93507. #ifdef WOLFSSL_KEIL
  93508. "orrs r5, r5, r6\n\t"
  93509. #elif defined(__clang__)
  93510. "orrs r5, r6\n\t"
  93511. #else
  93512. "orr r5, r6\n\t"
  93513. #endif
  93514. "ldr r3, [%[a]]\n\t"
  93515. "str r5, [%[r], #8]\n\t"
  93516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93517. "lsrs r6, r3, #1\n\t"
  93518. #else
  93519. "lsr r6, r3, #1\n\t"
  93520. #endif
  93521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93522. "lsls r3, r3, %[n]\n\t"
  93523. #else
  93524. "lsl r3, r3, %[n]\n\t"
  93525. #endif
  93526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93527. "lsrs r6, r6, r7\n\t"
  93528. #else
  93529. "lsr r6, r6, r7\n\t"
  93530. #endif
  93531. #ifdef WOLFSSL_KEIL
  93532. "orrs r4, r4, r6\n\t"
  93533. #elif defined(__clang__)
  93534. "orrs r4, r6\n\t"
  93535. #else
  93536. "orr r4, r6\n\t"
  93537. #endif
  93538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93539. "subs %[a], %[a], #0x40\n\t"
  93540. #else
  93541. "sub %[a], %[a], #0x40\n\t"
  93542. #endif
  93543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93544. "subs %[r], %[r], #0x40\n\t"
  93545. #else
  93546. "sub %[r], %[r], #0x40\n\t"
  93547. #endif
  93548. "ldr r5, [%[a], #60]\n\t"
  93549. "str r4, [%[r], #68]\n\t"
  93550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93551. "lsrs r6, r5, #1\n\t"
  93552. #else
  93553. "lsr r6, r5, #1\n\t"
  93554. #endif
  93555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93556. "lsls r5, r5, %[n]\n\t"
  93557. #else
  93558. "lsl r5, r5, %[n]\n\t"
  93559. #endif
  93560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93561. "lsrs r6, r6, r7\n\t"
  93562. #else
  93563. "lsr r6, r6, r7\n\t"
  93564. #endif
  93565. #ifdef WOLFSSL_KEIL
  93566. "orrs r3, r3, r6\n\t"
  93567. #elif defined(__clang__)
  93568. "orrs r3, r6\n\t"
  93569. #else
  93570. "orr r3, r6\n\t"
  93571. #endif
  93572. "ldr r4, [%[a], #56]\n\t"
  93573. "str r3, [%[r], #64]\n\t"
  93574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93575. "lsrs r6, r4, #1\n\t"
  93576. #else
  93577. "lsr r6, r4, #1\n\t"
  93578. #endif
  93579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93580. "lsls r4, r4, %[n]\n\t"
  93581. #else
  93582. "lsl r4, r4, %[n]\n\t"
  93583. #endif
  93584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93585. "lsrs r6, r6, r7\n\t"
  93586. #else
  93587. "lsr r6, r6, r7\n\t"
  93588. #endif
  93589. #ifdef WOLFSSL_KEIL
  93590. "orrs r5, r5, r6\n\t"
  93591. #elif defined(__clang__)
  93592. "orrs r5, r6\n\t"
  93593. #else
  93594. "orr r5, r6\n\t"
  93595. #endif
  93596. "ldr r3, [%[a], #52]\n\t"
  93597. "str r5, [%[r], #60]\n\t"
  93598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93599. "lsrs r6, r3, #1\n\t"
  93600. #else
  93601. "lsr r6, r3, #1\n\t"
  93602. #endif
  93603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93604. "lsls r3, r3, %[n]\n\t"
  93605. #else
  93606. "lsl r3, r3, %[n]\n\t"
  93607. #endif
  93608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93609. "lsrs r6, r6, r7\n\t"
  93610. #else
  93611. "lsr r6, r6, r7\n\t"
  93612. #endif
  93613. #ifdef WOLFSSL_KEIL
  93614. "orrs r4, r4, r6\n\t"
  93615. #elif defined(__clang__)
  93616. "orrs r4, r6\n\t"
  93617. #else
  93618. "orr r4, r6\n\t"
  93619. #endif
  93620. "ldr r5, [%[a], #48]\n\t"
  93621. "str r4, [%[r], #56]\n\t"
  93622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93623. "lsrs r6, r5, #1\n\t"
  93624. #else
  93625. "lsr r6, r5, #1\n\t"
  93626. #endif
  93627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93628. "lsls r5, r5, %[n]\n\t"
  93629. #else
  93630. "lsl r5, r5, %[n]\n\t"
  93631. #endif
  93632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93633. "lsrs r6, r6, r7\n\t"
  93634. #else
  93635. "lsr r6, r6, r7\n\t"
  93636. #endif
  93637. #ifdef WOLFSSL_KEIL
  93638. "orrs r3, r3, r6\n\t"
  93639. #elif defined(__clang__)
  93640. "orrs r3, r6\n\t"
  93641. #else
  93642. "orr r3, r6\n\t"
  93643. #endif
  93644. "ldr r4, [%[a], #44]\n\t"
  93645. "str r3, [%[r], #52]\n\t"
  93646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93647. "lsrs r6, r4, #1\n\t"
  93648. #else
  93649. "lsr r6, r4, #1\n\t"
  93650. #endif
  93651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93652. "lsls r4, r4, %[n]\n\t"
  93653. #else
  93654. "lsl r4, r4, %[n]\n\t"
  93655. #endif
  93656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93657. "lsrs r6, r6, r7\n\t"
  93658. #else
  93659. "lsr r6, r6, r7\n\t"
  93660. #endif
  93661. #ifdef WOLFSSL_KEIL
  93662. "orrs r5, r5, r6\n\t"
  93663. #elif defined(__clang__)
  93664. "orrs r5, r6\n\t"
  93665. #else
  93666. "orr r5, r6\n\t"
  93667. #endif
  93668. "ldr r3, [%[a], #40]\n\t"
  93669. "str r5, [%[r], #48]\n\t"
  93670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93671. "lsrs r6, r3, #1\n\t"
  93672. #else
  93673. "lsr r6, r3, #1\n\t"
  93674. #endif
  93675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93676. "lsls r3, r3, %[n]\n\t"
  93677. #else
  93678. "lsl r3, r3, %[n]\n\t"
  93679. #endif
  93680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93681. "lsrs r6, r6, r7\n\t"
  93682. #else
  93683. "lsr r6, r6, r7\n\t"
  93684. #endif
  93685. #ifdef WOLFSSL_KEIL
  93686. "orrs r4, r4, r6\n\t"
  93687. #elif defined(__clang__)
  93688. "orrs r4, r6\n\t"
  93689. #else
  93690. "orr r4, r6\n\t"
  93691. #endif
  93692. "ldr r5, [%[a], #36]\n\t"
  93693. "str r4, [%[r], #44]\n\t"
  93694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93695. "lsrs r6, r5, #1\n\t"
  93696. #else
  93697. "lsr r6, r5, #1\n\t"
  93698. #endif
  93699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93700. "lsls r5, r5, %[n]\n\t"
  93701. #else
  93702. "lsl r5, r5, %[n]\n\t"
  93703. #endif
  93704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93705. "lsrs r6, r6, r7\n\t"
  93706. #else
  93707. "lsr r6, r6, r7\n\t"
  93708. #endif
  93709. #ifdef WOLFSSL_KEIL
  93710. "orrs r3, r3, r6\n\t"
  93711. #elif defined(__clang__)
  93712. "orrs r3, r6\n\t"
  93713. #else
  93714. "orr r3, r6\n\t"
  93715. #endif
  93716. "ldr r4, [%[a], #32]\n\t"
  93717. "str r3, [%[r], #40]\n\t"
  93718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93719. "lsrs r6, r4, #1\n\t"
  93720. #else
  93721. "lsr r6, r4, #1\n\t"
  93722. #endif
  93723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93724. "lsls r4, r4, %[n]\n\t"
  93725. #else
  93726. "lsl r4, r4, %[n]\n\t"
  93727. #endif
  93728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93729. "lsrs r6, r6, r7\n\t"
  93730. #else
  93731. "lsr r6, r6, r7\n\t"
  93732. #endif
  93733. #ifdef WOLFSSL_KEIL
  93734. "orrs r5, r5, r6\n\t"
  93735. #elif defined(__clang__)
  93736. "orrs r5, r6\n\t"
  93737. #else
  93738. "orr r5, r6\n\t"
  93739. #endif
  93740. "ldr r3, [%[a], #28]\n\t"
  93741. "str r5, [%[r], #36]\n\t"
  93742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93743. "lsrs r6, r3, #1\n\t"
  93744. #else
  93745. "lsr r6, r3, #1\n\t"
  93746. #endif
  93747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93748. "lsls r3, r3, %[n]\n\t"
  93749. #else
  93750. "lsl r3, r3, %[n]\n\t"
  93751. #endif
  93752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93753. "lsrs r6, r6, r7\n\t"
  93754. #else
  93755. "lsr r6, r6, r7\n\t"
  93756. #endif
  93757. #ifdef WOLFSSL_KEIL
  93758. "orrs r4, r4, r6\n\t"
  93759. #elif defined(__clang__)
  93760. "orrs r4, r6\n\t"
  93761. #else
  93762. "orr r4, r6\n\t"
  93763. #endif
  93764. "ldr r5, [%[a], #24]\n\t"
  93765. "str r4, [%[r], #32]\n\t"
  93766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93767. "lsrs r6, r5, #1\n\t"
  93768. #else
  93769. "lsr r6, r5, #1\n\t"
  93770. #endif
  93771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93772. "lsls r5, r5, %[n]\n\t"
  93773. #else
  93774. "lsl r5, r5, %[n]\n\t"
  93775. #endif
  93776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93777. "lsrs r6, r6, r7\n\t"
  93778. #else
  93779. "lsr r6, r6, r7\n\t"
  93780. #endif
  93781. #ifdef WOLFSSL_KEIL
  93782. "orrs r3, r3, r6\n\t"
  93783. #elif defined(__clang__)
  93784. "orrs r3, r6\n\t"
  93785. #else
  93786. "orr r3, r6\n\t"
  93787. #endif
  93788. "ldr r4, [%[a], #20]\n\t"
  93789. "str r3, [%[r], #28]\n\t"
  93790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93791. "lsrs r6, r4, #1\n\t"
  93792. #else
  93793. "lsr r6, r4, #1\n\t"
  93794. #endif
  93795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93796. "lsls r4, r4, %[n]\n\t"
  93797. #else
  93798. "lsl r4, r4, %[n]\n\t"
  93799. #endif
  93800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93801. "lsrs r6, r6, r7\n\t"
  93802. #else
  93803. "lsr r6, r6, r7\n\t"
  93804. #endif
  93805. #ifdef WOLFSSL_KEIL
  93806. "orrs r5, r5, r6\n\t"
  93807. #elif defined(__clang__)
  93808. "orrs r5, r6\n\t"
  93809. #else
  93810. "orr r5, r6\n\t"
  93811. #endif
  93812. "ldr r3, [%[a], #16]\n\t"
  93813. "str r5, [%[r], #24]\n\t"
  93814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93815. "lsrs r6, r3, #1\n\t"
  93816. #else
  93817. "lsr r6, r3, #1\n\t"
  93818. #endif
  93819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93820. "lsls r3, r3, %[n]\n\t"
  93821. #else
  93822. "lsl r3, r3, %[n]\n\t"
  93823. #endif
  93824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93825. "lsrs r6, r6, r7\n\t"
  93826. #else
  93827. "lsr r6, r6, r7\n\t"
  93828. #endif
  93829. #ifdef WOLFSSL_KEIL
  93830. "orrs r4, r4, r6\n\t"
  93831. #elif defined(__clang__)
  93832. "orrs r4, r6\n\t"
  93833. #else
  93834. "orr r4, r6\n\t"
  93835. #endif
  93836. "ldr r5, [%[a], #12]\n\t"
  93837. "str r4, [%[r], #20]\n\t"
  93838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93839. "lsrs r6, r5, #1\n\t"
  93840. #else
  93841. "lsr r6, r5, #1\n\t"
  93842. #endif
  93843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93844. "lsls r5, r5, %[n]\n\t"
  93845. #else
  93846. "lsl r5, r5, %[n]\n\t"
  93847. #endif
  93848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93849. "lsrs r6, r6, r7\n\t"
  93850. #else
  93851. "lsr r6, r6, r7\n\t"
  93852. #endif
  93853. #ifdef WOLFSSL_KEIL
  93854. "orrs r3, r3, r6\n\t"
  93855. #elif defined(__clang__)
  93856. "orrs r3, r6\n\t"
  93857. #else
  93858. "orr r3, r6\n\t"
  93859. #endif
  93860. "ldr r4, [%[a], #8]\n\t"
  93861. "str r3, [%[r], #16]\n\t"
  93862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93863. "lsrs r6, r4, #1\n\t"
  93864. #else
  93865. "lsr r6, r4, #1\n\t"
  93866. #endif
  93867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93868. "lsls r4, r4, %[n]\n\t"
  93869. #else
  93870. "lsl r4, r4, %[n]\n\t"
  93871. #endif
  93872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93873. "lsrs r6, r6, r7\n\t"
  93874. #else
  93875. "lsr r6, r6, r7\n\t"
  93876. #endif
  93877. #ifdef WOLFSSL_KEIL
  93878. "orrs r5, r5, r6\n\t"
  93879. #elif defined(__clang__)
  93880. "orrs r5, r6\n\t"
  93881. #else
  93882. "orr r5, r6\n\t"
  93883. #endif
  93884. "ldr r3, [%[a], #4]\n\t"
  93885. "str r5, [%[r], #12]\n\t"
  93886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93887. "lsrs r6, r3, #1\n\t"
  93888. #else
  93889. "lsr r6, r3, #1\n\t"
  93890. #endif
  93891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93892. "lsls r3, r3, %[n]\n\t"
  93893. #else
  93894. "lsl r3, r3, %[n]\n\t"
  93895. #endif
  93896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93897. "lsrs r6, r6, r7\n\t"
  93898. #else
  93899. "lsr r6, r6, r7\n\t"
  93900. #endif
  93901. #ifdef WOLFSSL_KEIL
  93902. "orrs r4, r4, r6\n\t"
  93903. #elif defined(__clang__)
  93904. "orrs r4, r6\n\t"
  93905. #else
  93906. "orr r4, r6\n\t"
  93907. #endif
  93908. "ldr r5, [%[a]]\n\t"
  93909. "str r4, [%[r], #8]\n\t"
  93910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93911. "lsrs r6, r5, #1\n\t"
  93912. #else
  93913. "lsr r6, r5, #1\n\t"
  93914. #endif
  93915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93916. "lsls r5, r5, %[n]\n\t"
  93917. #else
  93918. "lsl r5, r5, %[n]\n\t"
  93919. #endif
  93920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93921. "lsrs r6, r6, r7\n\t"
  93922. #else
  93923. "lsr r6, r6, r7\n\t"
  93924. #endif
  93925. #ifdef WOLFSSL_KEIL
  93926. "orrs r3, r3, r6\n\t"
  93927. #elif defined(__clang__)
  93928. "orrs r3, r6\n\t"
  93929. #else
  93930. "orr r3, r6\n\t"
  93931. #endif
  93932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93933. "subs %[a], %[a], #0x40\n\t"
  93934. #else
  93935. "sub %[a], %[a], #0x40\n\t"
  93936. #endif
  93937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93938. "subs %[r], %[r], #0x40\n\t"
  93939. #else
  93940. "sub %[r], %[r], #0x40\n\t"
  93941. #endif
  93942. "ldr r4, [%[a], #60]\n\t"
  93943. "str r3, [%[r], #68]\n\t"
  93944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93945. "lsrs r6, r4, #1\n\t"
  93946. #else
  93947. "lsr r6, r4, #1\n\t"
  93948. #endif
  93949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93950. "lsls r4, r4, %[n]\n\t"
  93951. #else
  93952. "lsl r4, r4, %[n]\n\t"
  93953. #endif
  93954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93955. "lsrs r6, r6, r7\n\t"
  93956. #else
  93957. "lsr r6, r6, r7\n\t"
  93958. #endif
  93959. #ifdef WOLFSSL_KEIL
  93960. "orrs r5, r5, r6\n\t"
  93961. #elif defined(__clang__)
  93962. "orrs r5, r6\n\t"
  93963. #else
  93964. "orr r5, r6\n\t"
  93965. #endif
  93966. "ldr r3, [%[a], #56]\n\t"
  93967. "str r5, [%[r], #64]\n\t"
  93968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93969. "lsrs r6, r3, #1\n\t"
  93970. #else
  93971. "lsr r6, r3, #1\n\t"
  93972. #endif
  93973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93974. "lsls r3, r3, %[n]\n\t"
  93975. #else
  93976. "lsl r3, r3, %[n]\n\t"
  93977. #endif
  93978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93979. "lsrs r6, r6, r7\n\t"
  93980. #else
  93981. "lsr r6, r6, r7\n\t"
  93982. #endif
  93983. #ifdef WOLFSSL_KEIL
  93984. "orrs r4, r4, r6\n\t"
  93985. #elif defined(__clang__)
  93986. "orrs r4, r6\n\t"
  93987. #else
  93988. "orr r4, r6\n\t"
  93989. #endif
  93990. "ldr r5, [%[a], #52]\n\t"
  93991. "str r4, [%[r], #60]\n\t"
  93992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93993. "lsrs r6, r5, #1\n\t"
  93994. #else
  93995. "lsr r6, r5, #1\n\t"
  93996. #endif
  93997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93998. "lsls r5, r5, %[n]\n\t"
  93999. #else
  94000. "lsl r5, r5, %[n]\n\t"
  94001. #endif
  94002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94003. "lsrs r6, r6, r7\n\t"
  94004. #else
  94005. "lsr r6, r6, r7\n\t"
  94006. #endif
  94007. #ifdef WOLFSSL_KEIL
  94008. "orrs r3, r3, r6\n\t"
  94009. #elif defined(__clang__)
  94010. "orrs r3, r6\n\t"
  94011. #else
  94012. "orr r3, r6\n\t"
  94013. #endif
  94014. "ldr r4, [%[a], #48]\n\t"
  94015. "str r3, [%[r], #56]\n\t"
  94016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94017. "lsrs r6, r4, #1\n\t"
  94018. #else
  94019. "lsr r6, r4, #1\n\t"
  94020. #endif
  94021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94022. "lsls r4, r4, %[n]\n\t"
  94023. #else
  94024. "lsl r4, r4, %[n]\n\t"
  94025. #endif
  94026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94027. "lsrs r6, r6, r7\n\t"
  94028. #else
  94029. "lsr r6, r6, r7\n\t"
  94030. #endif
  94031. #ifdef WOLFSSL_KEIL
  94032. "orrs r5, r5, r6\n\t"
  94033. #elif defined(__clang__)
  94034. "orrs r5, r6\n\t"
  94035. #else
  94036. "orr r5, r6\n\t"
  94037. #endif
  94038. "ldr r3, [%[a], #44]\n\t"
  94039. "str r5, [%[r], #52]\n\t"
  94040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94041. "lsrs r6, r3, #1\n\t"
  94042. #else
  94043. "lsr r6, r3, #1\n\t"
  94044. #endif
  94045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94046. "lsls r3, r3, %[n]\n\t"
  94047. #else
  94048. "lsl r3, r3, %[n]\n\t"
  94049. #endif
  94050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94051. "lsrs r6, r6, r7\n\t"
  94052. #else
  94053. "lsr r6, r6, r7\n\t"
  94054. #endif
  94055. #ifdef WOLFSSL_KEIL
  94056. "orrs r4, r4, r6\n\t"
  94057. #elif defined(__clang__)
  94058. "orrs r4, r6\n\t"
  94059. #else
  94060. "orr r4, r6\n\t"
  94061. #endif
  94062. "ldr r5, [%[a], #40]\n\t"
  94063. "str r4, [%[r], #48]\n\t"
  94064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94065. "lsrs r6, r5, #1\n\t"
  94066. #else
  94067. "lsr r6, r5, #1\n\t"
  94068. #endif
  94069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94070. "lsls r5, r5, %[n]\n\t"
  94071. #else
  94072. "lsl r5, r5, %[n]\n\t"
  94073. #endif
  94074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94075. "lsrs r6, r6, r7\n\t"
  94076. #else
  94077. "lsr r6, r6, r7\n\t"
  94078. #endif
  94079. #ifdef WOLFSSL_KEIL
  94080. "orrs r3, r3, r6\n\t"
  94081. #elif defined(__clang__)
  94082. "orrs r3, r6\n\t"
  94083. #else
  94084. "orr r3, r6\n\t"
  94085. #endif
  94086. "ldr r4, [%[a], #36]\n\t"
  94087. "str r3, [%[r], #44]\n\t"
  94088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94089. "lsrs r6, r4, #1\n\t"
  94090. #else
  94091. "lsr r6, r4, #1\n\t"
  94092. #endif
  94093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94094. "lsls r4, r4, %[n]\n\t"
  94095. #else
  94096. "lsl r4, r4, %[n]\n\t"
  94097. #endif
  94098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94099. "lsrs r6, r6, r7\n\t"
  94100. #else
  94101. "lsr r6, r6, r7\n\t"
  94102. #endif
  94103. #ifdef WOLFSSL_KEIL
  94104. "orrs r5, r5, r6\n\t"
  94105. #elif defined(__clang__)
  94106. "orrs r5, r6\n\t"
  94107. #else
  94108. "orr r5, r6\n\t"
  94109. #endif
  94110. "ldr r3, [%[a], #32]\n\t"
  94111. "str r5, [%[r], #40]\n\t"
  94112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94113. "lsrs r6, r3, #1\n\t"
  94114. #else
  94115. "lsr r6, r3, #1\n\t"
  94116. #endif
  94117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94118. "lsls r3, r3, %[n]\n\t"
  94119. #else
  94120. "lsl r3, r3, %[n]\n\t"
  94121. #endif
  94122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94123. "lsrs r6, r6, r7\n\t"
  94124. #else
  94125. "lsr r6, r6, r7\n\t"
  94126. #endif
  94127. #ifdef WOLFSSL_KEIL
  94128. "orrs r4, r4, r6\n\t"
  94129. #elif defined(__clang__)
  94130. "orrs r4, r6\n\t"
  94131. #else
  94132. "orr r4, r6\n\t"
  94133. #endif
  94134. "ldr r5, [%[a], #28]\n\t"
  94135. "str r4, [%[r], #36]\n\t"
  94136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94137. "lsrs r6, r5, #1\n\t"
  94138. #else
  94139. "lsr r6, r5, #1\n\t"
  94140. #endif
  94141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94142. "lsls r5, r5, %[n]\n\t"
  94143. #else
  94144. "lsl r5, r5, %[n]\n\t"
  94145. #endif
  94146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94147. "lsrs r6, r6, r7\n\t"
  94148. #else
  94149. "lsr r6, r6, r7\n\t"
  94150. #endif
  94151. #ifdef WOLFSSL_KEIL
  94152. "orrs r3, r3, r6\n\t"
  94153. #elif defined(__clang__)
  94154. "orrs r3, r6\n\t"
  94155. #else
  94156. "orr r3, r6\n\t"
  94157. #endif
  94158. "ldr r4, [%[a], #24]\n\t"
  94159. "str r3, [%[r], #32]\n\t"
  94160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94161. "lsrs r6, r4, #1\n\t"
  94162. #else
  94163. "lsr r6, r4, #1\n\t"
  94164. #endif
  94165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94166. "lsls r4, r4, %[n]\n\t"
  94167. #else
  94168. "lsl r4, r4, %[n]\n\t"
  94169. #endif
  94170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94171. "lsrs r6, r6, r7\n\t"
  94172. #else
  94173. "lsr r6, r6, r7\n\t"
  94174. #endif
  94175. #ifdef WOLFSSL_KEIL
  94176. "orrs r5, r5, r6\n\t"
  94177. #elif defined(__clang__)
  94178. "orrs r5, r6\n\t"
  94179. #else
  94180. "orr r5, r6\n\t"
  94181. #endif
  94182. "ldr r3, [%[a], #20]\n\t"
  94183. "str r5, [%[r], #28]\n\t"
  94184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94185. "lsrs r6, r3, #1\n\t"
  94186. #else
  94187. "lsr r6, r3, #1\n\t"
  94188. #endif
  94189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94190. "lsls r3, r3, %[n]\n\t"
  94191. #else
  94192. "lsl r3, r3, %[n]\n\t"
  94193. #endif
  94194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94195. "lsrs r6, r6, r7\n\t"
  94196. #else
  94197. "lsr r6, r6, r7\n\t"
  94198. #endif
  94199. #ifdef WOLFSSL_KEIL
  94200. "orrs r4, r4, r6\n\t"
  94201. #elif defined(__clang__)
  94202. "orrs r4, r6\n\t"
  94203. #else
  94204. "orr r4, r6\n\t"
  94205. #endif
  94206. "ldr r5, [%[a], #16]\n\t"
  94207. "str r4, [%[r], #24]\n\t"
  94208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94209. "lsrs r6, r5, #1\n\t"
  94210. #else
  94211. "lsr r6, r5, #1\n\t"
  94212. #endif
  94213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94214. "lsls r5, r5, %[n]\n\t"
  94215. #else
  94216. "lsl r5, r5, %[n]\n\t"
  94217. #endif
  94218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94219. "lsrs r6, r6, r7\n\t"
  94220. #else
  94221. "lsr r6, r6, r7\n\t"
  94222. #endif
  94223. #ifdef WOLFSSL_KEIL
  94224. "orrs r3, r3, r6\n\t"
  94225. #elif defined(__clang__)
  94226. "orrs r3, r6\n\t"
  94227. #else
  94228. "orr r3, r6\n\t"
  94229. #endif
  94230. "ldr r4, [%[a], #12]\n\t"
  94231. "str r3, [%[r], #20]\n\t"
  94232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94233. "lsrs r6, r4, #1\n\t"
  94234. #else
  94235. "lsr r6, r4, #1\n\t"
  94236. #endif
  94237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94238. "lsls r4, r4, %[n]\n\t"
  94239. #else
  94240. "lsl r4, r4, %[n]\n\t"
  94241. #endif
  94242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94243. "lsrs r6, r6, r7\n\t"
  94244. #else
  94245. "lsr r6, r6, r7\n\t"
  94246. #endif
  94247. #ifdef WOLFSSL_KEIL
  94248. "orrs r5, r5, r6\n\t"
  94249. #elif defined(__clang__)
  94250. "orrs r5, r6\n\t"
  94251. #else
  94252. "orr r5, r6\n\t"
  94253. #endif
  94254. "ldr r3, [%[a], #8]\n\t"
  94255. "str r5, [%[r], #16]\n\t"
  94256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94257. "lsrs r6, r3, #1\n\t"
  94258. #else
  94259. "lsr r6, r3, #1\n\t"
  94260. #endif
  94261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94262. "lsls r3, r3, %[n]\n\t"
  94263. #else
  94264. "lsl r3, r3, %[n]\n\t"
  94265. #endif
  94266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94267. "lsrs r6, r6, r7\n\t"
  94268. #else
  94269. "lsr r6, r6, r7\n\t"
  94270. #endif
  94271. #ifdef WOLFSSL_KEIL
  94272. "orrs r4, r4, r6\n\t"
  94273. #elif defined(__clang__)
  94274. "orrs r4, r6\n\t"
  94275. #else
  94276. "orr r4, r6\n\t"
  94277. #endif
  94278. "ldr r5, [%[a], #4]\n\t"
  94279. "str r4, [%[r], #12]\n\t"
  94280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94281. "lsrs r6, r5, #1\n\t"
  94282. #else
  94283. "lsr r6, r5, #1\n\t"
  94284. #endif
  94285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94286. "lsls r5, r5, %[n]\n\t"
  94287. #else
  94288. "lsl r5, r5, %[n]\n\t"
  94289. #endif
  94290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94291. "lsrs r6, r6, r7\n\t"
  94292. #else
  94293. "lsr r6, r6, r7\n\t"
  94294. #endif
  94295. #ifdef WOLFSSL_KEIL
  94296. "orrs r3, r3, r6\n\t"
  94297. #elif defined(__clang__)
  94298. "orrs r3, r6\n\t"
  94299. #else
  94300. "orr r3, r6\n\t"
  94301. #endif
  94302. "ldr r4, [%[a]]\n\t"
  94303. "str r3, [%[r], #8]\n\t"
  94304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94305. "lsrs r6, r4, #1\n\t"
  94306. #else
  94307. "lsr r6, r4, #1\n\t"
  94308. #endif
  94309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94310. "lsls r4, r4, %[n]\n\t"
  94311. #else
  94312. "lsl r4, r4, %[n]\n\t"
  94313. #endif
  94314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94315. "lsrs r6, r6, r7\n\t"
  94316. #else
  94317. "lsr r6, r6, r7\n\t"
  94318. #endif
  94319. #ifdef WOLFSSL_KEIL
  94320. "orrs r5, r5, r6\n\t"
  94321. #elif defined(__clang__)
  94322. "orrs r5, r6\n\t"
  94323. #else
  94324. "orr r5, r6\n\t"
  94325. #endif
  94326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94327. "subs %[a], %[a], #0x40\n\t"
  94328. #else
  94329. "sub %[a], %[a], #0x40\n\t"
  94330. #endif
  94331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94332. "subs %[r], %[r], #0x40\n\t"
  94333. #else
  94334. "sub %[r], %[r], #0x40\n\t"
  94335. #endif
  94336. "ldr r3, [%[a], #60]\n\t"
  94337. "str r5, [%[r], #68]\n\t"
  94338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94339. "lsrs r6, r3, #1\n\t"
  94340. #else
  94341. "lsr r6, r3, #1\n\t"
  94342. #endif
  94343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94344. "lsls r3, r3, %[n]\n\t"
  94345. #else
  94346. "lsl r3, r3, %[n]\n\t"
  94347. #endif
  94348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94349. "lsrs r6, r6, r7\n\t"
  94350. #else
  94351. "lsr r6, r6, r7\n\t"
  94352. #endif
  94353. #ifdef WOLFSSL_KEIL
  94354. "orrs r4, r4, r6\n\t"
  94355. #elif defined(__clang__)
  94356. "orrs r4, r6\n\t"
  94357. #else
  94358. "orr r4, r6\n\t"
  94359. #endif
  94360. "ldr r5, [%[a], #56]\n\t"
  94361. "str r4, [%[r], #64]\n\t"
  94362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94363. "lsrs r6, r5, #1\n\t"
  94364. #else
  94365. "lsr r6, r5, #1\n\t"
  94366. #endif
  94367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94368. "lsls r5, r5, %[n]\n\t"
  94369. #else
  94370. "lsl r5, r5, %[n]\n\t"
  94371. #endif
  94372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94373. "lsrs r6, r6, r7\n\t"
  94374. #else
  94375. "lsr r6, r6, r7\n\t"
  94376. #endif
  94377. #ifdef WOLFSSL_KEIL
  94378. "orrs r3, r3, r6\n\t"
  94379. #elif defined(__clang__)
  94380. "orrs r3, r6\n\t"
  94381. #else
  94382. "orr r3, r6\n\t"
  94383. #endif
  94384. "ldr r4, [%[a], #52]\n\t"
  94385. "str r3, [%[r], #60]\n\t"
  94386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94387. "lsrs r6, r4, #1\n\t"
  94388. #else
  94389. "lsr r6, r4, #1\n\t"
  94390. #endif
  94391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94392. "lsls r4, r4, %[n]\n\t"
  94393. #else
  94394. "lsl r4, r4, %[n]\n\t"
  94395. #endif
  94396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94397. "lsrs r6, r6, r7\n\t"
  94398. #else
  94399. "lsr r6, r6, r7\n\t"
  94400. #endif
  94401. #ifdef WOLFSSL_KEIL
  94402. "orrs r5, r5, r6\n\t"
  94403. #elif defined(__clang__)
  94404. "orrs r5, r6\n\t"
  94405. #else
  94406. "orr r5, r6\n\t"
  94407. #endif
  94408. "ldr r3, [%[a], #48]\n\t"
  94409. "str r5, [%[r], #56]\n\t"
  94410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94411. "lsrs r6, r3, #1\n\t"
  94412. #else
  94413. "lsr r6, r3, #1\n\t"
  94414. #endif
  94415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94416. "lsls r3, r3, %[n]\n\t"
  94417. #else
  94418. "lsl r3, r3, %[n]\n\t"
  94419. #endif
  94420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94421. "lsrs r6, r6, r7\n\t"
  94422. #else
  94423. "lsr r6, r6, r7\n\t"
  94424. #endif
  94425. #ifdef WOLFSSL_KEIL
  94426. "orrs r4, r4, r6\n\t"
  94427. #elif defined(__clang__)
  94428. "orrs r4, r6\n\t"
  94429. #else
  94430. "orr r4, r6\n\t"
  94431. #endif
  94432. "ldr r5, [%[a], #44]\n\t"
  94433. "str r4, [%[r], #52]\n\t"
  94434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94435. "lsrs r6, r5, #1\n\t"
  94436. #else
  94437. "lsr r6, r5, #1\n\t"
  94438. #endif
  94439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94440. "lsls r5, r5, %[n]\n\t"
  94441. #else
  94442. "lsl r5, r5, %[n]\n\t"
  94443. #endif
  94444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94445. "lsrs r6, r6, r7\n\t"
  94446. #else
  94447. "lsr r6, r6, r7\n\t"
  94448. #endif
  94449. #ifdef WOLFSSL_KEIL
  94450. "orrs r3, r3, r6\n\t"
  94451. #elif defined(__clang__)
  94452. "orrs r3, r6\n\t"
  94453. #else
  94454. "orr r3, r6\n\t"
  94455. #endif
  94456. "ldr r4, [%[a], #40]\n\t"
  94457. "str r3, [%[r], #48]\n\t"
  94458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94459. "lsrs r6, r4, #1\n\t"
  94460. #else
  94461. "lsr r6, r4, #1\n\t"
  94462. #endif
  94463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94464. "lsls r4, r4, %[n]\n\t"
  94465. #else
  94466. "lsl r4, r4, %[n]\n\t"
  94467. #endif
  94468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94469. "lsrs r6, r6, r7\n\t"
  94470. #else
  94471. "lsr r6, r6, r7\n\t"
  94472. #endif
  94473. #ifdef WOLFSSL_KEIL
  94474. "orrs r5, r5, r6\n\t"
  94475. #elif defined(__clang__)
  94476. "orrs r5, r6\n\t"
  94477. #else
  94478. "orr r5, r6\n\t"
  94479. #endif
  94480. "ldr r3, [%[a], #36]\n\t"
  94481. "str r5, [%[r], #44]\n\t"
  94482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94483. "lsrs r6, r3, #1\n\t"
  94484. #else
  94485. "lsr r6, r3, #1\n\t"
  94486. #endif
  94487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94488. "lsls r3, r3, %[n]\n\t"
  94489. #else
  94490. "lsl r3, r3, %[n]\n\t"
  94491. #endif
  94492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94493. "lsrs r6, r6, r7\n\t"
  94494. #else
  94495. "lsr r6, r6, r7\n\t"
  94496. #endif
  94497. #ifdef WOLFSSL_KEIL
  94498. "orrs r4, r4, r6\n\t"
  94499. #elif defined(__clang__)
  94500. "orrs r4, r6\n\t"
  94501. #else
  94502. "orr r4, r6\n\t"
  94503. #endif
  94504. "ldr r5, [%[a], #32]\n\t"
  94505. "str r4, [%[r], #40]\n\t"
  94506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94507. "lsrs r6, r5, #1\n\t"
  94508. #else
  94509. "lsr r6, r5, #1\n\t"
  94510. #endif
  94511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94512. "lsls r5, r5, %[n]\n\t"
  94513. #else
  94514. "lsl r5, r5, %[n]\n\t"
  94515. #endif
  94516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94517. "lsrs r6, r6, r7\n\t"
  94518. #else
  94519. "lsr r6, r6, r7\n\t"
  94520. #endif
  94521. #ifdef WOLFSSL_KEIL
  94522. "orrs r3, r3, r6\n\t"
  94523. #elif defined(__clang__)
  94524. "orrs r3, r6\n\t"
  94525. #else
  94526. "orr r3, r6\n\t"
  94527. #endif
  94528. "ldr r4, [%[a], #28]\n\t"
  94529. "str r3, [%[r], #36]\n\t"
  94530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94531. "lsrs r6, r4, #1\n\t"
  94532. #else
  94533. "lsr r6, r4, #1\n\t"
  94534. #endif
  94535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94536. "lsls r4, r4, %[n]\n\t"
  94537. #else
  94538. "lsl r4, r4, %[n]\n\t"
  94539. #endif
  94540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94541. "lsrs r6, r6, r7\n\t"
  94542. #else
  94543. "lsr r6, r6, r7\n\t"
  94544. #endif
  94545. #ifdef WOLFSSL_KEIL
  94546. "orrs r5, r5, r6\n\t"
  94547. #elif defined(__clang__)
  94548. "orrs r5, r6\n\t"
  94549. #else
  94550. "orr r5, r6\n\t"
  94551. #endif
  94552. "ldr r3, [%[a], #24]\n\t"
  94553. "str r5, [%[r], #32]\n\t"
  94554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94555. "lsrs r6, r3, #1\n\t"
  94556. #else
  94557. "lsr r6, r3, #1\n\t"
  94558. #endif
  94559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94560. "lsls r3, r3, %[n]\n\t"
  94561. #else
  94562. "lsl r3, r3, %[n]\n\t"
  94563. #endif
  94564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94565. "lsrs r6, r6, r7\n\t"
  94566. #else
  94567. "lsr r6, r6, r7\n\t"
  94568. #endif
  94569. #ifdef WOLFSSL_KEIL
  94570. "orrs r4, r4, r6\n\t"
  94571. #elif defined(__clang__)
  94572. "orrs r4, r6\n\t"
  94573. #else
  94574. "orr r4, r6\n\t"
  94575. #endif
  94576. "ldr r5, [%[a], #20]\n\t"
  94577. "str r4, [%[r], #28]\n\t"
  94578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94579. "lsrs r6, r5, #1\n\t"
  94580. #else
  94581. "lsr r6, r5, #1\n\t"
  94582. #endif
  94583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94584. "lsls r5, r5, %[n]\n\t"
  94585. #else
  94586. "lsl r5, r5, %[n]\n\t"
  94587. #endif
  94588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94589. "lsrs r6, r6, r7\n\t"
  94590. #else
  94591. "lsr r6, r6, r7\n\t"
  94592. #endif
  94593. #ifdef WOLFSSL_KEIL
  94594. "orrs r3, r3, r6\n\t"
  94595. #elif defined(__clang__)
  94596. "orrs r3, r6\n\t"
  94597. #else
  94598. "orr r3, r6\n\t"
  94599. #endif
  94600. "ldr r4, [%[a], #16]\n\t"
  94601. "str r3, [%[r], #24]\n\t"
  94602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94603. "lsrs r6, r4, #1\n\t"
  94604. #else
  94605. "lsr r6, r4, #1\n\t"
  94606. #endif
  94607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94608. "lsls r4, r4, %[n]\n\t"
  94609. #else
  94610. "lsl r4, r4, %[n]\n\t"
  94611. #endif
  94612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94613. "lsrs r6, r6, r7\n\t"
  94614. #else
  94615. "lsr r6, r6, r7\n\t"
  94616. #endif
  94617. #ifdef WOLFSSL_KEIL
  94618. "orrs r5, r5, r6\n\t"
  94619. #elif defined(__clang__)
  94620. "orrs r5, r6\n\t"
  94621. #else
  94622. "orr r5, r6\n\t"
  94623. #endif
  94624. "ldr r3, [%[a], #12]\n\t"
  94625. "str r5, [%[r], #20]\n\t"
  94626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94627. "lsrs r6, r3, #1\n\t"
  94628. #else
  94629. "lsr r6, r3, #1\n\t"
  94630. #endif
  94631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94632. "lsls r3, r3, %[n]\n\t"
  94633. #else
  94634. "lsl r3, r3, %[n]\n\t"
  94635. #endif
  94636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94637. "lsrs r6, r6, r7\n\t"
  94638. #else
  94639. "lsr r6, r6, r7\n\t"
  94640. #endif
  94641. #ifdef WOLFSSL_KEIL
  94642. "orrs r4, r4, r6\n\t"
  94643. #elif defined(__clang__)
  94644. "orrs r4, r6\n\t"
  94645. #else
  94646. "orr r4, r6\n\t"
  94647. #endif
  94648. "ldr r5, [%[a], #8]\n\t"
  94649. "str r4, [%[r], #16]\n\t"
  94650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94651. "lsrs r6, r5, #1\n\t"
  94652. #else
  94653. "lsr r6, r5, #1\n\t"
  94654. #endif
  94655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94656. "lsls r5, r5, %[n]\n\t"
  94657. #else
  94658. "lsl r5, r5, %[n]\n\t"
  94659. #endif
  94660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94661. "lsrs r6, r6, r7\n\t"
  94662. #else
  94663. "lsr r6, r6, r7\n\t"
  94664. #endif
  94665. #ifdef WOLFSSL_KEIL
  94666. "orrs r3, r3, r6\n\t"
  94667. #elif defined(__clang__)
  94668. "orrs r3, r6\n\t"
  94669. #else
  94670. "orr r3, r6\n\t"
  94671. #endif
  94672. "ldr r4, [%[a], #4]\n\t"
  94673. "str r3, [%[r], #12]\n\t"
  94674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94675. "lsrs r6, r4, #1\n\t"
  94676. #else
  94677. "lsr r6, r4, #1\n\t"
  94678. #endif
  94679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94680. "lsls r4, r4, %[n]\n\t"
  94681. #else
  94682. "lsl r4, r4, %[n]\n\t"
  94683. #endif
  94684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94685. "lsrs r6, r6, r7\n\t"
  94686. #else
  94687. "lsr r6, r6, r7\n\t"
  94688. #endif
  94689. #ifdef WOLFSSL_KEIL
  94690. "orrs r5, r5, r6\n\t"
  94691. #elif defined(__clang__)
  94692. "orrs r5, r6\n\t"
  94693. #else
  94694. "orr r5, r6\n\t"
  94695. #endif
  94696. "ldr r3, [%[a]]\n\t"
  94697. "str r5, [%[r], #8]\n\t"
  94698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94699. "lsrs r6, r3, #1\n\t"
  94700. #else
  94701. "lsr r6, r3, #1\n\t"
  94702. #endif
  94703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94704. "lsls r3, r3, %[n]\n\t"
  94705. #else
  94706. "lsl r3, r3, %[n]\n\t"
  94707. #endif
  94708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94709. "lsrs r6, r6, r7\n\t"
  94710. #else
  94711. "lsr r6, r6, r7\n\t"
  94712. #endif
  94713. #ifdef WOLFSSL_KEIL
  94714. "orrs r4, r4, r6\n\t"
  94715. #elif defined(__clang__)
  94716. "orrs r4, r6\n\t"
  94717. #else
  94718. "orr r4, r6\n\t"
  94719. #endif
  94720. "str r3, [%[r]]\n\t"
  94721. "str r4, [%[r], #4]\n\t"
  94722. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  94723. :
  94724. : "memory", "r3", "r4", "r5", "r6", "r7"
  94725. );
  94726. }
  94727. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  94728. *
  94729. * r A single precision number that is the result of the operation.
  94730. * e A single precision number that is the exponent.
  94731. * bits The number of bits in the exponent.
  94732. * m A single precision number that is the modulus.
  94733. * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
  94734. */
  94735. static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits,
  94736. const sp_digit* m)
  94737. {
  94738. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  94739. sp_digit* td = NULL;
  94740. #else
  94741. sp_digit td[385];
  94742. #endif
  94743. sp_digit* norm = NULL;
  94744. sp_digit* tmp = NULL;
  94745. sp_digit mp = 1;
  94746. sp_digit n;
  94747. sp_digit o;
  94748. sp_digit mask;
  94749. int i;
  94750. int c;
  94751. byte y;
  94752. int err = MP_OKAY;
  94753. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  94754. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 385, NULL,
  94755. DYNAMIC_TYPE_TMP_BUFFER);
  94756. if (td == NULL)
  94757. err = MEMORY_E;
  94758. #endif
  94759. if (err == MP_OKAY) {
  94760. norm = td;
  94761. tmp = td + 256;
  94762. sp_4096_mont_setup(m, &mp);
  94763. sp_4096_mont_norm_128(norm, m);
  94764. i = (bits - 1) / 32;
  94765. n = e[i--];
  94766. c = bits & 31;
  94767. if (c == 0) {
  94768. c = 32;
  94769. }
  94770. c -= bits % 5;
  94771. if (c == 32) {
  94772. c = 27;
  94773. }
  94774. if (c < 0) {
  94775. /* Number of bits in top word is less than number needed. */
  94776. c = -c;
  94777. y = (byte)(n << c);
  94778. n = e[i--];
  94779. y |= (byte)(n >> (64 - c));
  94780. n <<= c;
  94781. c = 64 - c;
  94782. }
  94783. else {
  94784. y = (byte)(n >> c);
  94785. n <<= 32 - c;
  94786. }
  94787. sp_4096_lshift_128(r, norm, y);
  94788. for (; i>=0 || c>=5; ) {
  94789. if (c == 0) {
  94790. n = e[i--];
  94791. y = (byte)(n >> 27);
  94792. n <<= 5;
  94793. c = 27;
  94794. }
  94795. else if (c < 5) {
  94796. y = (byte)(n >> 27);
  94797. n = e[i--];
  94798. c = 5 - c;
  94799. y |= (byte)(n >> (32 - c));
  94800. n <<= c;
  94801. c = 32 - c;
  94802. }
  94803. else {
  94804. y = (byte)((n >> 27) & 0x1f);
  94805. n <<= 5;
  94806. c -= 5;
  94807. }
  94808. sp_4096_mont_sqr_128(r, r, m, mp);
  94809. sp_4096_mont_sqr_128(r, r, m, mp);
  94810. sp_4096_mont_sqr_128(r, r, m, mp);
  94811. sp_4096_mont_sqr_128(r, r, m, mp);
  94812. sp_4096_mont_sqr_128(r, r, m, mp);
  94813. sp_4096_lshift_128(r, r, y);
  94814. sp_4096_mul_d_128(tmp, norm, r[128]);
  94815. r[128] = 0;
  94816. o = sp_4096_add_128(r, r, tmp);
  94817. sp_4096_cond_sub_128(r, r, m, (sp_digit)0 - o);
  94818. }
  94819. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  94820. sp_4096_mont_reduce_128(r, m, mp);
  94821. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  94822. sp_4096_cond_sub_128(r, r, m, mask);
  94823. }
  94824. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  94825. if (td != NULL)
  94826. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  94827. #endif
  94828. return err;
  94829. }
  94830. #endif /* HAVE_FFDHE_4096 */
  94831. /* Perform the modular exponentiation for Diffie-Hellman.
  94832. *
  94833. * base Base.
  94834. * exp Array of bytes that is the exponent.
  94835. * expLen Length of data, in bytes, in exponent.
  94836. * mod Modulus.
  94837. * out Buffer to hold big-endian bytes of exponentiation result.
  94838. * Must be at least 512 bytes long.
  94839. * outLen Length, in bytes, of exponentiation result.
  94840. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  94841. * and MEMORY_E if memory allocation fails.
  94842. */
  94843. int sp_DhExp_4096(const mp_int* base, const byte* exp, word32 expLen,
  94844. const mp_int* mod, byte* out, word32* outLen)
  94845. {
  94846. int err = MP_OKAY;
  94847. sp_digit b[256];
  94848. sp_digit e[128];
  94849. sp_digit m[128];
  94850. sp_digit* r = b;
  94851. word32 i;
  94852. if (mp_count_bits(base) > 4096) {
  94853. err = MP_READ_E;
  94854. }
  94855. else if (expLen > 512) {
  94856. err = MP_READ_E;
  94857. }
  94858. else if (mp_count_bits(mod) != 4096) {
  94859. err = MP_READ_E;
  94860. }
  94861. else if (mp_iseven(mod)) {
  94862. err = MP_VAL;
  94863. }
  94864. if (err == MP_OKAY) {
  94865. sp_4096_from_mp(b, 128, base);
  94866. sp_4096_from_bin(e, 128, exp, expLen);
  94867. sp_4096_from_mp(m, 128, mod);
  94868. #ifdef HAVE_FFDHE_4096
  94869. if (base->used == 1 && base->dp[0] == 2 && m[127] == (sp_digit)-1)
  94870. err = sp_4096_mod_exp_2_128(r, e, expLen * 8, m);
  94871. else
  94872. #endif
  94873. err = sp_4096_mod_exp_128(r, b, e, expLen * 8, m, 0);
  94874. }
  94875. if (err == MP_OKAY) {
  94876. sp_4096_to_bin_128(r, out);
  94877. *outLen = 512;
  94878. for (i=0; i<512 && out[i] == 0; i++) {
  94879. /* Search for first non-zero. */
  94880. }
  94881. *outLen -= i;
  94882. XMEMMOVE(out, out + i, *outLen);
  94883. }
  94884. XMEMSET(e, 0, sizeof(e));
  94885. return err;
  94886. }
  94887. #endif /* WOLFSSL_HAVE_SP_DH */
  94888. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  94889. #endif /* WOLFSSL_SP_4096 */
  94890. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH */
  94891. #ifdef WOLFSSL_HAVE_SP_ECC
  94892. #ifndef WOLFSSL_SP_NO_256
  94893. /* Point structure to use. */
  94894. typedef struct sp_point_256 {
  94895. /* X ordinate of point. */
  94896. sp_digit x[2 * 8];
  94897. /* Y ordinate of point. */
  94898. sp_digit y[2 * 8];
  94899. /* Z ordinate of point. */
  94900. sp_digit z[2 * 8];
  94901. /* Indicates point is at infinity. */
  94902. int infinity;
  94903. } sp_point_256;
  94904. /* The modulus (prime) of the curve P256. */
  94905. static const sp_digit p256_mod[8] = {
  94906. 0xffffffff,0xffffffff,0xffffffff,0x00000000,0x00000000,0x00000000,
  94907. 0x00000001,0xffffffff
  94908. };
  94909. /* The Montgomery normalizer for modulus of the curve P256. */
  94910. static const sp_digit p256_norm_mod[8] = {
  94911. 0x00000001,0x00000000,0x00000000,0xffffffff,0xffffffff,0xffffffff,
  94912. 0xfffffffe,0x00000000
  94913. };
  94914. /* The Montgomery multiplier for modulus of the curve P256. */
  94915. static const sp_digit p256_mp_mod = 0x00000001;
  94916. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  94917. defined(HAVE_ECC_VERIFY)
  94918. /* The order of the curve P256. */
  94919. static const sp_digit p256_order[8] = {
  94920. 0xfc632551,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  94921. 0x00000000,0xffffffff
  94922. };
  94923. #endif
  94924. /* The order of the curve P256 minus 2. */
  94925. static const sp_digit p256_order2[8] = {
  94926. 0xfc63254f,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  94927. 0x00000000,0xffffffff
  94928. };
  94929. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  94930. /* The Montgomery normalizer for order of the curve P256. */
  94931. static const sp_digit p256_norm_order[8] = {
  94932. 0x039cdaaf,0x0c46353d,0x58e8617b,0x43190552,0x00000000,0x00000000,
  94933. 0xffffffff,0x00000000
  94934. };
  94935. #endif
  94936. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  94937. /* The Montgomery multiplier for order of the curve P256. */
  94938. static const sp_digit p256_mp_order = 0xee00bc4f;
  94939. #endif
  94940. /* The base point of curve P256. */
  94941. static const sp_point_256 p256_base = {
  94942. /* X ordinate */
  94943. {
  94944. 0xd898c296,0xf4a13945,0x2deb33a0,0x77037d81,0x63a440f2,0xf8bce6e5,
  94945. 0xe12c4247,0x6b17d1f2,
  94946. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  94947. (sp_digit)0, (sp_digit)0, (sp_digit)0
  94948. },
  94949. /* Y ordinate */
  94950. {
  94951. 0x37bf51f5,0xcbb64068,0x6b315ece,0x2bce3357,0x7c0f9e16,0x8ee7eb4a,
  94952. 0xfe1a7f9b,0x4fe342e2,
  94953. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  94954. (sp_digit)0, (sp_digit)0, (sp_digit)0
  94955. },
  94956. /* Z ordinate */
  94957. {
  94958. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  94959. 0x00000000,0x00000000,
  94960. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  94961. (sp_digit)0, (sp_digit)0, (sp_digit)0
  94962. },
  94963. /* infinity */
  94964. 0
  94965. };
  94966. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  94967. static const sp_digit p256_b[8] = {
  94968. 0x27d2604b,0x3bce3c3e,0xcc53b0f6,0x651d06b0,0x769886bc,0xb3ebbd55,
  94969. 0xaa3a93e7,0x5ac635d8
  94970. };
  94971. #endif
  94972. /* Multiply a and b into r. (r = a * b)
  94973. *
  94974. * r A single precision integer.
  94975. * a A single precision integer.
  94976. * b A single precision integer.
  94977. */
  94978. SP_NOINLINE static void sp_256_mul_8(sp_digit* r, const sp_digit* a,
  94979. const sp_digit* b)
  94980. {
  94981. sp_digit t[8 * 2];
  94982. sp_digit* tmp = t;
  94983. __asm__ __volatile__ (
  94984. "movs r3, #0\n\t"
  94985. "movs r4, #0\n\t"
  94986. "mov r8, r3\n\t"
  94987. "mov r11, %[tmp]\n\t"
  94988. "mov r9, %[a]\n\t"
  94989. "mov r10, %[b]\n\t"
  94990. "movs r6, #32\n\t"
  94991. "add r6, r6, r9\n\t"
  94992. "mov r12, r6\n\t"
  94993. "\n"
  94994. "L_sp_256_mul_8_words_%=:\n\t"
  94995. "movs %[tmp], #0\n\t"
  94996. "movs r5, #0\n\t"
  94997. "movs r6, #28\n\t"
  94998. "mov %[a], r8\n\t"
  94999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95000. "subs %[a], %[a], r6\n\t"
  95001. #else
  95002. "sub %[a], %[a], r6\n\t"
  95003. #endif
  95004. #ifdef WOLFSSL_KEIL
  95005. "sbcs r6, r6, r6\n\t"
  95006. #elif defined(__clang__)
  95007. "sbcs r6, r6\n\t"
  95008. #else
  95009. "sbc r6, r6\n\t"
  95010. #endif
  95011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95012. "mvns r6, r6\n\t"
  95013. #else
  95014. "mvn r6, r6\n\t"
  95015. #endif
  95016. #ifdef WOLFSSL_KEIL
  95017. "ands %[a], %[a], r6\n\t"
  95018. #elif defined(__clang__)
  95019. "ands %[a], r6\n\t"
  95020. #else
  95021. "and %[a], r6\n\t"
  95022. #endif
  95023. "mov %[b], r8\n\t"
  95024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95025. "subs %[b], %[b], %[a]\n\t"
  95026. #else
  95027. "sub %[b], %[b], %[a]\n\t"
  95028. #endif
  95029. "add %[a], %[a], r9\n\t"
  95030. "add %[b], %[b], r10\n\t"
  95031. "\n"
  95032. "L_sp_256_mul_8_mul_%=:\n\t"
  95033. "# Multiply Start\n\t"
  95034. "ldrh r6, [%[a]]\n\t"
  95035. "ldrh r7, [%[b]]\n\t"
  95036. #ifdef WOLFSSL_KEIL
  95037. "muls r7, r6, r7\n\t"
  95038. #elif defined(__clang__)
  95039. "muls r7, r6\n\t"
  95040. #else
  95041. "mul r7, r6\n\t"
  95042. #endif
  95043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95044. "adds r3, r3, r7\n\t"
  95045. #else
  95046. "add r3, r3, r7\n\t"
  95047. #endif
  95048. #ifdef WOLFSSL_KEIL
  95049. "adcs r4, r4, %[tmp]\n\t"
  95050. #elif defined(__clang__)
  95051. "adcs r4, %[tmp]\n\t"
  95052. #else
  95053. "adc r4, %[tmp]\n\t"
  95054. #endif
  95055. #ifdef WOLFSSL_KEIL
  95056. "adcs r5, r5, %[tmp]\n\t"
  95057. #elif defined(__clang__)
  95058. "adcs r5, %[tmp]\n\t"
  95059. #else
  95060. "adc r5, %[tmp]\n\t"
  95061. #endif
  95062. "ldr r7, [%[b]]\n\t"
  95063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95064. "lsrs r7, r7, #16\n\t"
  95065. #else
  95066. "lsr r7, r7, #16\n\t"
  95067. #endif
  95068. #ifdef WOLFSSL_KEIL
  95069. "muls r6, r7, r6\n\t"
  95070. #elif defined(__clang__)
  95071. "muls r6, r7\n\t"
  95072. #else
  95073. "mul r6, r7\n\t"
  95074. #endif
  95075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95076. "lsrs r7, r6, #16\n\t"
  95077. #else
  95078. "lsr r7, r6, #16\n\t"
  95079. #endif
  95080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95081. "lsls r6, r6, #16\n\t"
  95082. #else
  95083. "lsl r6, r6, #16\n\t"
  95084. #endif
  95085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95086. "adds r3, r3, r6\n\t"
  95087. #else
  95088. "add r3, r3, r6\n\t"
  95089. #endif
  95090. #ifdef WOLFSSL_KEIL
  95091. "adcs r4, r4, r7\n\t"
  95092. #elif defined(__clang__)
  95093. "adcs r4, r7\n\t"
  95094. #else
  95095. "adc r4, r7\n\t"
  95096. #endif
  95097. #ifdef WOLFSSL_KEIL
  95098. "adcs r5, r5, %[tmp]\n\t"
  95099. #elif defined(__clang__)
  95100. "adcs r5, %[tmp]\n\t"
  95101. #else
  95102. "adc r5, %[tmp]\n\t"
  95103. #endif
  95104. "ldr r6, [%[a]]\n\t"
  95105. "ldr r7, [%[b]]\n\t"
  95106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95107. "lsrs r6, r6, #16\n\t"
  95108. #else
  95109. "lsr r6, r6, #16\n\t"
  95110. #endif
  95111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95112. "lsrs r7, r7, #16\n\t"
  95113. #else
  95114. "lsr r7, r7, #16\n\t"
  95115. #endif
  95116. #ifdef WOLFSSL_KEIL
  95117. "muls r7, r6, r7\n\t"
  95118. #elif defined(__clang__)
  95119. "muls r7, r6\n\t"
  95120. #else
  95121. "mul r7, r6\n\t"
  95122. #endif
  95123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95124. "adds r4, r4, r7\n\t"
  95125. #else
  95126. "add r4, r4, r7\n\t"
  95127. #endif
  95128. #ifdef WOLFSSL_KEIL
  95129. "adcs r5, r5, %[tmp]\n\t"
  95130. #elif defined(__clang__)
  95131. "adcs r5, %[tmp]\n\t"
  95132. #else
  95133. "adc r5, %[tmp]\n\t"
  95134. #endif
  95135. "ldrh r7, [%[b]]\n\t"
  95136. #ifdef WOLFSSL_KEIL
  95137. "muls r6, r7, r6\n\t"
  95138. #elif defined(__clang__)
  95139. "muls r6, r7\n\t"
  95140. #else
  95141. "mul r6, r7\n\t"
  95142. #endif
  95143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95144. "lsrs r7, r6, #16\n\t"
  95145. #else
  95146. "lsr r7, r6, #16\n\t"
  95147. #endif
  95148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95149. "lsls r6, r6, #16\n\t"
  95150. #else
  95151. "lsl r6, r6, #16\n\t"
  95152. #endif
  95153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95154. "adds r3, r3, r6\n\t"
  95155. #else
  95156. "add r3, r3, r6\n\t"
  95157. #endif
  95158. #ifdef WOLFSSL_KEIL
  95159. "adcs r4, r4, r7\n\t"
  95160. #elif defined(__clang__)
  95161. "adcs r4, r7\n\t"
  95162. #else
  95163. "adc r4, r7\n\t"
  95164. #endif
  95165. #ifdef WOLFSSL_KEIL
  95166. "adcs r5, r5, %[tmp]\n\t"
  95167. #elif defined(__clang__)
  95168. "adcs r5, %[tmp]\n\t"
  95169. #else
  95170. "adc r5, %[tmp]\n\t"
  95171. #endif
  95172. "# Multiply Done\n\t"
  95173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95174. "adds %[a], %[a], #4\n\t"
  95175. #else
  95176. "add %[a], %[a], #4\n\t"
  95177. #endif
  95178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95179. "subs %[b], %[b], #4\n\t"
  95180. #else
  95181. "sub %[b], %[b], #4\n\t"
  95182. #endif
  95183. "cmp %[a], r12\n\t"
  95184. "beq L_sp_256_mul_8_done_mul_%=\n\t"
  95185. "mov r6, r8\n\t"
  95186. "add r6, r6, r9\n\t"
  95187. "cmp %[a], r6\n\t"
  95188. "ble L_sp_256_mul_8_mul_%=\n\t"
  95189. "\n"
  95190. "L_sp_256_mul_8_done_mul_%=:\n\t"
  95191. "mov %[tmp], r11\n\t"
  95192. "mov r7, r8\n\t"
  95193. "str r3, [%[tmp], r7]\n\t"
  95194. "movs r3, r4\n\t"
  95195. "movs r4, r5\n\t"
  95196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95197. "adds r7, r7, #4\n\t"
  95198. #else
  95199. "add r7, r7, #4\n\t"
  95200. #endif
  95201. "mov r8, r7\n\t"
  95202. "movs r6, #56\n\t"
  95203. "cmp r7, r6\n\t"
  95204. "ble L_sp_256_mul_8_words_%=\n\t"
  95205. "str r3, [%[tmp], r7]\n\t"
  95206. "mov %[a], r9\n\t"
  95207. "mov %[b], r10\n\t"
  95208. : [a] "+r" (a), [b] "+r" (b), [tmp] "+r" (tmp)
  95209. :
  95210. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  95211. );
  95212. XMEMCPY(r, t, sizeof(t));
  95213. }
  95214. /* Square a and put result in r. (r = a * a)
  95215. *
  95216. * r A single precision integer.
  95217. * a A single precision integer.
  95218. */
  95219. SP_NOINLINE static void sp_256_sqr_8(sp_digit* r, const sp_digit* a)
  95220. {
  95221. __asm__ __volatile__ (
  95222. "movs r3, #0\n\t"
  95223. "movs r4, #0\n\t"
  95224. "movs r5, #0\n\t"
  95225. "mov r8, r3\n\t"
  95226. "mov r11, %[r]\n\t"
  95227. "movs r6, #0x40\n\t"
  95228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95229. "negs r6, r6\n\t"
  95230. #else
  95231. "neg r6, r6\n\t"
  95232. #endif
  95233. "add sp, sp, r6\n\t"
  95234. "mov r10, sp\n\t"
  95235. "mov r9, %[a]\n\t"
  95236. "\n"
  95237. "L_sp_256_sqr_8_words_%=:\n\t"
  95238. "movs %[r], #0\n\t"
  95239. "movs r6, #28\n\t"
  95240. "mov %[a], r8\n\t"
  95241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95242. "subs %[a], %[a], r6\n\t"
  95243. #else
  95244. "sub %[a], %[a], r6\n\t"
  95245. #endif
  95246. #ifdef WOLFSSL_KEIL
  95247. "sbcs r6, r6, r6\n\t"
  95248. #elif defined(__clang__)
  95249. "sbcs r6, r6\n\t"
  95250. #else
  95251. "sbc r6, r6\n\t"
  95252. #endif
  95253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95254. "mvns r6, r6\n\t"
  95255. #else
  95256. "mvn r6, r6\n\t"
  95257. #endif
  95258. #ifdef WOLFSSL_KEIL
  95259. "ands %[a], %[a], r6\n\t"
  95260. #elif defined(__clang__)
  95261. "ands %[a], r6\n\t"
  95262. #else
  95263. "and %[a], r6\n\t"
  95264. #endif
  95265. "mov r2, r8\n\t"
  95266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95267. "subs r2, r2, %[a]\n\t"
  95268. #else
  95269. "sub r2, r2, %[a]\n\t"
  95270. #endif
  95271. "add %[a], %[a], r9\n\t"
  95272. "add r2, r2, r9\n\t"
  95273. "\n"
  95274. "L_sp_256_sqr_8_mul_%=:\n\t"
  95275. "cmp r2, %[a]\n\t"
  95276. "beq L_sp_256_sqr_8_sqr_%=\n\t"
  95277. "# Multiply * 2: Start\n\t"
  95278. "ldrh r6, [%[a]]\n\t"
  95279. "ldrh r7, [r2]\n\t"
  95280. #ifdef WOLFSSL_KEIL
  95281. "muls r7, r6, r7\n\t"
  95282. #elif defined(__clang__)
  95283. "muls r7, r6\n\t"
  95284. #else
  95285. "mul r7, r6\n\t"
  95286. #endif
  95287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95288. "adds r3, r3, r7\n\t"
  95289. #else
  95290. "add r3, r3, r7\n\t"
  95291. #endif
  95292. #ifdef WOLFSSL_KEIL
  95293. "adcs r4, r4, %[r]\n\t"
  95294. #elif defined(__clang__)
  95295. "adcs r4, %[r]\n\t"
  95296. #else
  95297. "adc r4, %[r]\n\t"
  95298. #endif
  95299. #ifdef WOLFSSL_KEIL
  95300. "adcs r5, r5, %[r]\n\t"
  95301. #elif defined(__clang__)
  95302. "adcs r5, %[r]\n\t"
  95303. #else
  95304. "adc r5, %[r]\n\t"
  95305. #endif
  95306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95307. "adds r3, r3, r7\n\t"
  95308. #else
  95309. "add r3, r3, r7\n\t"
  95310. #endif
  95311. #ifdef WOLFSSL_KEIL
  95312. "adcs r4, r4, %[r]\n\t"
  95313. #elif defined(__clang__)
  95314. "adcs r4, %[r]\n\t"
  95315. #else
  95316. "adc r4, %[r]\n\t"
  95317. #endif
  95318. #ifdef WOLFSSL_KEIL
  95319. "adcs r5, r5, %[r]\n\t"
  95320. #elif defined(__clang__)
  95321. "adcs r5, %[r]\n\t"
  95322. #else
  95323. "adc r5, %[r]\n\t"
  95324. #endif
  95325. "ldr r7, [r2]\n\t"
  95326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95327. "lsrs r7, r7, #16\n\t"
  95328. #else
  95329. "lsr r7, r7, #16\n\t"
  95330. #endif
  95331. #ifdef WOLFSSL_KEIL
  95332. "muls r6, r7, r6\n\t"
  95333. #elif defined(__clang__)
  95334. "muls r6, r7\n\t"
  95335. #else
  95336. "mul r6, r7\n\t"
  95337. #endif
  95338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95339. "lsrs r7, r6, #16\n\t"
  95340. #else
  95341. "lsr r7, r6, #16\n\t"
  95342. #endif
  95343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95344. "lsls r6, r6, #16\n\t"
  95345. #else
  95346. "lsl r6, r6, #16\n\t"
  95347. #endif
  95348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95349. "adds r3, r3, r6\n\t"
  95350. #else
  95351. "add r3, r3, r6\n\t"
  95352. #endif
  95353. #ifdef WOLFSSL_KEIL
  95354. "adcs r4, r4, r7\n\t"
  95355. #elif defined(__clang__)
  95356. "adcs r4, r7\n\t"
  95357. #else
  95358. "adc r4, r7\n\t"
  95359. #endif
  95360. #ifdef WOLFSSL_KEIL
  95361. "adcs r5, r5, %[r]\n\t"
  95362. #elif defined(__clang__)
  95363. "adcs r5, %[r]\n\t"
  95364. #else
  95365. "adc r5, %[r]\n\t"
  95366. #endif
  95367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95368. "adds r3, r3, r6\n\t"
  95369. #else
  95370. "add r3, r3, r6\n\t"
  95371. #endif
  95372. #ifdef WOLFSSL_KEIL
  95373. "adcs r4, r4, r7\n\t"
  95374. #elif defined(__clang__)
  95375. "adcs r4, r7\n\t"
  95376. #else
  95377. "adc r4, r7\n\t"
  95378. #endif
  95379. #ifdef WOLFSSL_KEIL
  95380. "adcs r5, r5, %[r]\n\t"
  95381. #elif defined(__clang__)
  95382. "adcs r5, %[r]\n\t"
  95383. #else
  95384. "adc r5, %[r]\n\t"
  95385. #endif
  95386. "ldr r6, [%[a]]\n\t"
  95387. "ldr r7, [r2]\n\t"
  95388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95389. "lsrs r6, r6, #16\n\t"
  95390. #else
  95391. "lsr r6, r6, #16\n\t"
  95392. #endif
  95393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95394. "lsrs r7, r7, #16\n\t"
  95395. #else
  95396. "lsr r7, r7, #16\n\t"
  95397. #endif
  95398. #ifdef WOLFSSL_KEIL
  95399. "muls r7, r6, r7\n\t"
  95400. #elif defined(__clang__)
  95401. "muls r7, r6\n\t"
  95402. #else
  95403. "mul r7, r6\n\t"
  95404. #endif
  95405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95406. "adds r4, r4, r7\n\t"
  95407. #else
  95408. "add r4, r4, r7\n\t"
  95409. #endif
  95410. #ifdef WOLFSSL_KEIL
  95411. "adcs r5, r5, %[r]\n\t"
  95412. #elif defined(__clang__)
  95413. "adcs r5, %[r]\n\t"
  95414. #else
  95415. "adc r5, %[r]\n\t"
  95416. #endif
  95417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95418. "adds r4, r4, r7\n\t"
  95419. #else
  95420. "add r4, r4, r7\n\t"
  95421. #endif
  95422. #ifdef WOLFSSL_KEIL
  95423. "adcs r5, r5, %[r]\n\t"
  95424. #elif defined(__clang__)
  95425. "adcs r5, %[r]\n\t"
  95426. #else
  95427. "adc r5, %[r]\n\t"
  95428. #endif
  95429. "ldrh r7, [r2]\n\t"
  95430. #ifdef WOLFSSL_KEIL
  95431. "muls r6, r7, r6\n\t"
  95432. #elif defined(__clang__)
  95433. "muls r6, r7\n\t"
  95434. #else
  95435. "mul r6, r7\n\t"
  95436. #endif
  95437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95438. "lsrs r7, r6, #16\n\t"
  95439. #else
  95440. "lsr r7, r6, #16\n\t"
  95441. #endif
  95442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95443. "lsls r6, r6, #16\n\t"
  95444. #else
  95445. "lsl r6, r6, #16\n\t"
  95446. #endif
  95447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95448. "adds r3, r3, r6\n\t"
  95449. #else
  95450. "add r3, r3, r6\n\t"
  95451. #endif
  95452. #ifdef WOLFSSL_KEIL
  95453. "adcs r4, r4, r7\n\t"
  95454. #elif defined(__clang__)
  95455. "adcs r4, r7\n\t"
  95456. #else
  95457. "adc r4, r7\n\t"
  95458. #endif
  95459. #ifdef WOLFSSL_KEIL
  95460. "adcs r5, r5, %[r]\n\t"
  95461. #elif defined(__clang__)
  95462. "adcs r5, %[r]\n\t"
  95463. #else
  95464. "adc r5, %[r]\n\t"
  95465. #endif
  95466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95467. "adds r3, r3, r6\n\t"
  95468. #else
  95469. "add r3, r3, r6\n\t"
  95470. #endif
  95471. #ifdef WOLFSSL_KEIL
  95472. "adcs r4, r4, r7\n\t"
  95473. #elif defined(__clang__)
  95474. "adcs r4, r7\n\t"
  95475. #else
  95476. "adc r4, r7\n\t"
  95477. #endif
  95478. #ifdef WOLFSSL_KEIL
  95479. "adcs r5, r5, %[r]\n\t"
  95480. #elif defined(__clang__)
  95481. "adcs r5, %[r]\n\t"
  95482. #else
  95483. "adc r5, %[r]\n\t"
  95484. #endif
  95485. "# Multiply * 2: Done\n\t"
  95486. "bal L_sp_256_sqr_8_done_sqr_%=\n\t"
  95487. "\n"
  95488. "L_sp_256_sqr_8_sqr_%=:\n\t"
  95489. "mov r12, r2\n\t"
  95490. "ldr r2, [%[a]]\n\t"
  95491. "# Square: Start\n\t"
  95492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95493. "lsrs r7, r2, #16\n\t"
  95494. #else
  95495. "lsr r7, r2, #16\n\t"
  95496. #endif
  95497. "uxth r6, r2\n\t"
  95498. #ifdef WOLFSSL_KEIL
  95499. "muls r6, r6, r6\n\t"
  95500. #elif defined(__clang__)
  95501. "muls r6, r6\n\t"
  95502. #else
  95503. "mul r6, r6\n\t"
  95504. #endif
  95505. #ifdef WOLFSSL_KEIL
  95506. "muls r7, r7, r7\n\t"
  95507. #elif defined(__clang__)
  95508. "muls r7, r7\n\t"
  95509. #else
  95510. "mul r7, r7\n\t"
  95511. #endif
  95512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95513. "adds r3, r3, r6\n\t"
  95514. #else
  95515. "add r3, r3, r6\n\t"
  95516. #endif
  95517. #ifdef WOLFSSL_KEIL
  95518. "adcs r4, r4, r7\n\t"
  95519. #elif defined(__clang__)
  95520. "adcs r4, r7\n\t"
  95521. #else
  95522. "adc r4, r7\n\t"
  95523. #endif
  95524. #ifdef WOLFSSL_KEIL
  95525. "adcs r5, r5, %[r]\n\t"
  95526. #elif defined(__clang__)
  95527. "adcs r5, %[r]\n\t"
  95528. #else
  95529. "adc r5, %[r]\n\t"
  95530. #endif
  95531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95532. "lsrs r7, r2, #16\n\t"
  95533. #else
  95534. "lsr r7, r2, #16\n\t"
  95535. #endif
  95536. "uxth r6, r2\n\t"
  95537. #ifdef WOLFSSL_KEIL
  95538. "muls r6, r7, r6\n\t"
  95539. #elif defined(__clang__)
  95540. "muls r6, r7\n\t"
  95541. #else
  95542. "mul r6, r7\n\t"
  95543. #endif
  95544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95545. "lsrs r7, r6, #15\n\t"
  95546. #else
  95547. "lsr r7, r6, #15\n\t"
  95548. #endif
  95549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95550. "lsls r6, r6, #17\n\t"
  95551. #else
  95552. "lsl r6, r6, #17\n\t"
  95553. #endif
  95554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95555. "adds r3, r3, r6\n\t"
  95556. #else
  95557. "add r3, r3, r6\n\t"
  95558. #endif
  95559. #ifdef WOLFSSL_KEIL
  95560. "adcs r4, r4, r7\n\t"
  95561. #elif defined(__clang__)
  95562. "adcs r4, r7\n\t"
  95563. #else
  95564. "adc r4, r7\n\t"
  95565. #endif
  95566. #ifdef WOLFSSL_KEIL
  95567. "adcs r5, r5, %[r]\n\t"
  95568. #elif defined(__clang__)
  95569. "adcs r5, %[r]\n\t"
  95570. #else
  95571. "adc r5, %[r]\n\t"
  95572. #endif
  95573. "# Square: Done\n\t"
  95574. "mov r2, r12\n\t"
  95575. "\n"
  95576. "L_sp_256_sqr_8_done_sqr_%=:\n\t"
  95577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95578. "adds %[a], %[a], #4\n\t"
  95579. #else
  95580. "add %[a], %[a], #4\n\t"
  95581. #endif
  95582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95583. "subs r2, r2, #4\n\t"
  95584. #else
  95585. "sub r2, r2, #4\n\t"
  95586. #endif
  95587. "movs r6, #32\n\t"
  95588. "add r6, r6, r9\n\t"
  95589. "cmp %[a], r6\n\t"
  95590. "beq L_sp_256_sqr_8_done_mul_%=\n\t"
  95591. "cmp %[a], r2\n\t"
  95592. "bgt L_sp_256_sqr_8_done_mul_%=\n\t"
  95593. "mov r7, r8\n\t"
  95594. "add r7, r7, r9\n\t"
  95595. "cmp %[a], r7\n\t"
  95596. "ble L_sp_256_sqr_8_mul_%=\n\t"
  95597. "\n"
  95598. "L_sp_256_sqr_8_done_mul_%=:\n\t"
  95599. "mov %[r], r10\n\t"
  95600. "mov r7, r8\n\t"
  95601. "str r3, [%[r], r7]\n\t"
  95602. "movs r3, r4\n\t"
  95603. "movs r4, r5\n\t"
  95604. "movs r5, #0\n\t"
  95605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95606. "adds r7, r7, #4\n\t"
  95607. #else
  95608. "add r7, r7, #4\n\t"
  95609. #endif
  95610. "mov r8, r7\n\t"
  95611. "movs r6, #56\n\t"
  95612. "cmp r7, r6\n\t"
  95613. "ble L_sp_256_sqr_8_words_%=\n\t"
  95614. "mov %[a], r9\n\t"
  95615. "str r3, [%[r], r7]\n\t"
  95616. "mov %[r], r11\n\t"
  95617. "mov %[a], r10\n\t"
  95618. "movs r3, #60\n\t"
  95619. "\n"
  95620. "L_sp_256_sqr_8_store_%=:\n\t"
  95621. "ldr r6, [%[a], r3]\n\t"
  95622. "str r6, [%[r], r3]\n\t"
  95623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95624. "subs r3, r3, #4\n\t"
  95625. #else
  95626. "sub r3, r3, #4\n\t"
  95627. #endif
  95628. "bge L_sp_256_sqr_8_store_%=\n\t"
  95629. "movs r6, #0x40\n\t"
  95630. "add sp, sp, r6\n\t"
  95631. : [r] "+r" (r), [a] "+r" (a)
  95632. :
  95633. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  95634. );
  95635. }
  95636. #ifdef WOLFSSL_SP_SMALL
  95637. /* Add b to a into r. (r = a + b)
  95638. *
  95639. * r A single precision integer.
  95640. * a A single precision integer.
  95641. * b A single precision integer.
  95642. */
  95643. SP_NOINLINE static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a,
  95644. const sp_digit* b)
  95645. {
  95646. __asm__ __volatile__ (
  95647. "movs r6, %[a]\n\t"
  95648. "movs r7, #0\n\t"
  95649. "movs r3, #0\n\t"
  95650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95651. "adds r6, r6, #32\n\t"
  95652. #else
  95653. "add r6, r6, #32\n\t"
  95654. #endif
  95655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95656. "subs r7, r7, #1\n\t"
  95657. #else
  95658. "sub r7, r7, #1\n\t"
  95659. #endif
  95660. "\n"
  95661. "L_sp_256_add_8_word_%=:\n\t"
  95662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95663. "adds r3, r3, r7\n\t"
  95664. #else
  95665. "add r3, r3, r7\n\t"
  95666. #endif
  95667. "ldr r4, [%[a]]\n\t"
  95668. "ldr r5, [%[b]]\n\t"
  95669. #ifdef WOLFSSL_KEIL
  95670. "adcs r4, r4, r5\n\t"
  95671. #elif defined(__clang__)
  95672. "adcs r4, r5\n\t"
  95673. #else
  95674. "adc r4, r5\n\t"
  95675. #endif
  95676. "str r4, [%[r]]\n\t"
  95677. "movs r3, #0\n\t"
  95678. #ifdef WOLFSSL_KEIL
  95679. "adcs r3, r3, r3\n\t"
  95680. #elif defined(__clang__)
  95681. "adcs r3, r3\n\t"
  95682. #else
  95683. "adc r3, r3\n\t"
  95684. #endif
  95685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95686. "adds %[a], %[a], #4\n\t"
  95687. #else
  95688. "add %[a], %[a], #4\n\t"
  95689. #endif
  95690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95691. "adds %[b], %[b], #4\n\t"
  95692. #else
  95693. "add %[b], %[b], #4\n\t"
  95694. #endif
  95695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95696. "adds %[r], %[r], #4\n\t"
  95697. #else
  95698. "add %[r], %[r], #4\n\t"
  95699. #endif
  95700. "cmp %[a], r6\n\t"
  95701. "bne L_sp_256_add_8_word_%=\n\t"
  95702. "movs %[r], r3\n\t"
  95703. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  95704. :
  95705. : "memory", "r3", "r4", "r5", "r6", "r7"
  95706. );
  95707. return (uint32_t)(size_t)r;
  95708. }
  95709. #else
  95710. /* Add b to a into r. (r = a + b)
  95711. *
  95712. * r A single precision integer.
  95713. * a A single precision integer.
  95714. * b A single precision integer.
  95715. */
  95716. SP_NOINLINE static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a,
  95717. const sp_digit* b)
  95718. {
  95719. __asm__ __volatile__ (
  95720. "ldm %[b]!, {r5, r6}\n\t"
  95721. "ldm %[a]!, {r3, r4}\n\t"
  95722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95723. "adds r3, r3, r5\n\t"
  95724. #else
  95725. "add r3, r3, r5\n\t"
  95726. #endif
  95727. #ifdef WOLFSSL_KEIL
  95728. "adcs r4, r4, r6\n\t"
  95729. #elif defined(__clang__)
  95730. "adcs r4, r6\n\t"
  95731. #else
  95732. "adc r4, r6\n\t"
  95733. #endif
  95734. "stm %[r]!, {r3, r4}\n\t"
  95735. "ldm %[b]!, {r5, r6}\n\t"
  95736. "ldm %[a]!, {r3, r4}\n\t"
  95737. #ifdef WOLFSSL_KEIL
  95738. "adcs r3, r3, r5\n\t"
  95739. #elif defined(__clang__)
  95740. "adcs r3, r5\n\t"
  95741. #else
  95742. "adc r3, r5\n\t"
  95743. #endif
  95744. #ifdef WOLFSSL_KEIL
  95745. "adcs r4, r4, r6\n\t"
  95746. #elif defined(__clang__)
  95747. "adcs r4, r6\n\t"
  95748. #else
  95749. "adc r4, r6\n\t"
  95750. #endif
  95751. "stm %[r]!, {r3, r4}\n\t"
  95752. "ldm %[b]!, {r5, r6}\n\t"
  95753. "ldm %[a]!, {r3, r4}\n\t"
  95754. #ifdef WOLFSSL_KEIL
  95755. "adcs r3, r3, r5\n\t"
  95756. #elif defined(__clang__)
  95757. "adcs r3, r5\n\t"
  95758. #else
  95759. "adc r3, r5\n\t"
  95760. #endif
  95761. #ifdef WOLFSSL_KEIL
  95762. "adcs r4, r4, r6\n\t"
  95763. #elif defined(__clang__)
  95764. "adcs r4, r6\n\t"
  95765. #else
  95766. "adc r4, r6\n\t"
  95767. #endif
  95768. "stm %[r]!, {r3, r4}\n\t"
  95769. "ldm %[b]!, {r5, r6}\n\t"
  95770. "ldm %[a]!, {r3, r4}\n\t"
  95771. #ifdef WOLFSSL_KEIL
  95772. "adcs r3, r3, r5\n\t"
  95773. #elif defined(__clang__)
  95774. "adcs r3, r5\n\t"
  95775. #else
  95776. "adc r3, r5\n\t"
  95777. #endif
  95778. #ifdef WOLFSSL_KEIL
  95779. "adcs r4, r4, r6\n\t"
  95780. #elif defined(__clang__)
  95781. "adcs r4, r6\n\t"
  95782. #else
  95783. "adc r4, r6\n\t"
  95784. #endif
  95785. "stm %[r]!, {r3, r4}\n\t"
  95786. "movs %[r], #0\n\t"
  95787. #ifdef WOLFSSL_KEIL
  95788. "adcs %[r], %[r], %[r]\n\t"
  95789. #elif defined(__clang__)
  95790. "adcs %[r], %[r]\n\t"
  95791. #else
  95792. "adc %[r], %[r]\n\t"
  95793. #endif
  95794. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  95795. :
  95796. : "memory", "r3", "r4", "r5", "r6"
  95797. );
  95798. return (uint32_t)(size_t)r;
  95799. }
  95800. #endif /* WOLFSSL_SP_SMALL */
  95801. #ifdef WOLFSSL_SP_SMALL
  95802. /* Sub b from a into r. (r = a - b)
  95803. *
  95804. * r A single precision integer.
  95805. * a A single precision integer.
  95806. * b A single precision integer.
  95807. */
  95808. SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a,
  95809. const sp_digit* b)
  95810. {
  95811. __asm__ __volatile__ (
  95812. "movs r6, %[a]\n\t"
  95813. "movs r3, #0\n\t"
  95814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95815. "adds r6, r6, #32\n\t"
  95816. #else
  95817. "add r6, r6, #32\n\t"
  95818. #endif
  95819. "\n"
  95820. "L_sp_256_sub_8_word_%=:\n\t"
  95821. "movs r5, #0\n\t"
  95822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95823. "subs r5, r5, r3\n\t"
  95824. #else
  95825. "sub r5, r5, r3\n\t"
  95826. #endif
  95827. "ldr r4, [%[a]]\n\t"
  95828. "ldr r5, [%[b]]\n\t"
  95829. #ifdef WOLFSSL_KEIL
  95830. "sbcs r4, r4, r5\n\t"
  95831. #elif defined(__clang__)
  95832. "sbcs r4, r5\n\t"
  95833. #else
  95834. "sbc r4, r5\n\t"
  95835. #endif
  95836. "str r4, [%[r]]\n\t"
  95837. #ifdef WOLFSSL_KEIL
  95838. "sbcs r3, r3, r3\n\t"
  95839. #elif defined(__clang__)
  95840. "sbcs r3, r3\n\t"
  95841. #else
  95842. "sbc r3, r3\n\t"
  95843. #endif
  95844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95845. "adds %[a], %[a], #4\n\t"
  95846. #else
  95847. "add %[a], %[a], #4\n\t"
  95848. #endif
  95849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95850. "adds %[b], %[b], #4\n\t"
  95851. #else
  95852. "add %[b], %[b], #4\n\t"
  95853. #endif
  95854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95855. "adds %[r], %[r], #4\n\t"
  95856. #else
  95857. "add %[r], %[r], #4\n\t"
  95858. #endif
  95859. "cmp %[a], r6\n\t"
  95860. "bne L_sp_256_sub_8_word_%=\n\t"
  95861. "movs %[r], r3\n\t"
  95862. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  95863. :
  95864. : "memory", "r3", "r4", "r5", "r6"
  95865. );
  95866. return (uint32_t)(size_t)r;
  95867. }
  95868. #else
  95869. /* Sub b from a into r. (r = a - b)
  95870. *
  95871. * r A single precision integer.
  95872. * a A single precision integer.
  95873. * b A single precision integer.
  95874. */
  95875. SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a,
  95876. const sp_digit* b)
  95877. {
  95878. __asm__ __volatile__ (
  95879. "ldm %[b]!, {r5, r6}\n\t"
  95880. "ldm %[a]!, {r3, r4}\n\t"
  95881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95882. "subs r3, r3, r5\n\t"
  95883. #else
  95884. "sub r3, r3, r5\n\t"
  95885. #endif
  95886. #ifdef WOLFSSL_KEIL
  95887. "sbcs r4, r4, r6\n\t"
  95888. #elif defined(__clang__)
  95889. "sbcs r4, r6\n\t"
  95890. #else
  95891. "sbc r4, r6\n\t"
  95892. #endif
  95893. "stm %[r]!, {r3, r4}\n\t"
  95894. "ldm %[b]!, {r5, r6}\n\t"
  95895. "ldm %[a]!, {r3, r4}\n\t"
  95896. #ifdef WOLFSSL_KEIL
  95897. "sbcs r3, r3, r5\n\t"
  95898. #elif defined(__clang__)
  95899. "sbcs r3, r5\n\t"
  95900. #else
  95901. "sbc r3, r5\n\t"
  95902. #endif
  95903. #ifdef WOLFSSL_KEIL
  95904. "sbcs r4, r4, r6\n\t"
  95905. #elif defined(__clang__)
  95906. "sbcs r4, r6\n\t"
  95907. #else
  95908. "sbc r4, r6\n\t"
  95909. #endif
  95910. "stm %[r]!, {r3, r4}\n\t"
  95911. "ldm %[b]!, {r5, r6}\n\t"
  95912. "ldm %[a]!, {r3, r4}\n\t"
  95913. #ifdef WOLFSSL_KEIL
  95914. "sbcs r3, r3, r5\n\t"
  95915. #elif defined(__clang__)
  95916. "sbcs r3, r5\n\t"
  95917. #else
  95918. "sbc r3, r5\n\t"
  95919. #endif
  95920. #ifdef WOLFSSL_KEIL
  95921. "sbcs r4, r4, r6\n\t"
  95922. #elif defined(__clang__)
  95923. "sbcs r4, r6\n\t"
  95924. #else
  95925. "sbc r4, r6\n\t"
  95926. #endif
  95927. "stm %[r]!, {r3, r4}\n\t"
  95928. "ldm %[b]!, {r5, r6}\n\t"
  95929. "ldm %[a]!, {r3, r4}\n\t"
  95930. #ifdef WOLFSSL_KEIL
  95931. "sbcs r3, r3, r5\n\t"
  95932. #elif defined(__clang__)
  95933. "sbcs r3, r5\n\t"
  95934. #else
  95935. "sbc r3, r5\n\t"
  95936. #endif
  95937. #ifdef WOLFSSL_KEIL
  95938. "sbcs r4, r4, r6\n\t"
  95939. #elif defined(__clang__)
  95940. "sbcs r4, r6\n\t"
  95941. #else
  95942. "sbc r4, r6\n\t"
  95943. #endif
  95944. "stm %[r]!, {r3, r4}\n\t"
  95945. #ifdef WOLFSSL_KEIL
  95946. "sbcs %[r], %[r], %[r]\n\t"
  95947. #elif defined(__clang__)
  95948. "sbcs %[r], %[r]\n\t"
  95949. #else
  95950. "sbc %[r], %[r]\n\t"
  95951. #endif
  95952. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  95953. :
  95954. : "memory", "r3", "r4", "r5", "r6"
  95955. );
  95956. return (uint32_t)(size_t)r;
  95957. }
  95958. #endif /* WOLFSSL_SP_SMALL */
  95959. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  95960. *
  95961. * r The resulting Montgomery form number.
  95962. * a The number to convert.
  95963. * m The modulus (prime).
  95964. */
  95965. static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  95966. {
  95967. int64_t t[8];
  95968. int64_t a64[8];
  95969. int64_t o;
  95970. (void)m;
  95971. a64[0] = a[0];
  95972. a64[1] = a[1];
  95973. a64[2] = a[2];
  95974. a64[3] = a[3];
  95975. a64[4] = a[4];
  95976. a64[5] = a[5];
  95977. a64[6] = a[6];
  95978. a64[7] = a[7];
  95979. /* 1 1 0 -1 -1 -1 -1 0 */
  95980. t[0] = 0 + a64[0] + a64[1] - a64[3] - a64[4] - a64[5] - a64[6];
  95981. /* 0 1 1 0 -1 -1 -1 -1 */
  95982. t[1] = 0 + a64[1] + a64[2] - a64[4] - a64[5] - a64[6] - a64[7];
  95983. /* 0 0 1 1 0 -1 -1 -1 */
  95984. t[2] = 0 + a64[2] + a64[3] - a64[5] - a64[6] - a64[7];
  95985. /* -1 -1 0 2 2 1 0 -1 */
  95986. t[3] = 0 - a64[0] - a64[1] + 2 * a64[3] + 2 * a64[4] + a64[5] - a64[7];
  95987. /* 0 -1 -1 0 2 2 1 0 */
  95988. t[4] = 0 - a64[1] - a64[2] + 2 * a64[4] + 2 * a64[5] + a64[6];
  95989. /* 0 0 -1 -1 0 2 2 1 */
  95990. t[5] = 0 - a64[2] - a64[3] + 2 * a64[5] + 2 * a64[6] + a64[7];
  95991. /* -1 -1 0 0 0 1 3 2 */
  95992. t[6] = 0 - a64[0] - a64[1] + a64[5] + 3 * a64[6] + 2 * a64[7];
  95993. /* 1 0 -1 -1 -1 -1 0 3 */
  95994. t[7] = 0 + a64[0] - a64[2] - a64[3] - a64[4] - a64[5] + 3 * a64[7];
  95995. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  95996. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  95997. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  95998. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  95999. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  96000. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  96001. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  96002. o = t[7] >> 32; t[7] &= 0xffffffff;
  96003. t[0] += o;
  96004. t[3] -= o;
  96005. t[6] -= o;
  96006. t[7] += o;
  96007. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  96008. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  96009. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  96010. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  96011. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  96012. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  96013. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  96014. r[0] = (sp_digit)t[0];
  96015. r[1] = (sp_digit)t[1];
  96016. r[2] = (sp_digit)t[2];
  96017. r[3] = (sp_digit)t[3];
  96018. r[4] = (sp_digit)t[4];
  96019. r[5] = (sp_digit)t[5];
  96020. r[6] = (sp_digit)t[6];
  96021. r[7] = (sp_digit)t[7];
  96022. return MP_OKAY;
  96023. }
  96024. /* Convert an mp_int to an array of sp_digit.
  96025. *
  96026. * r A single precision integer.
  96027. * size Maximum number of bytes to convert
  96028. * a A multi-precision integer.
  96029. */
  96030. static void sp_256_from_mp(sp_digit* r, int size, const mp_int* a)
  96031. {
  96032. #if DIGIT_BIT == 32
  96033. int j;
  96034. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  96035. for (j = a->used; j < size; j++) {
  96036. r[j] = 0;
  96037. }
  96038. #elif DIGIT_BIT > 32
  96039. int i;
  96040. int j = 0;
  96041. word32 s = 0;
  96042. r[0] = 0;
  96043. for (i = 0; i < a->used && j < size; i++) {
  96044. r[j] |= ((sp_digit)a->dp[i] << s);
  96045. r[j] &= 0xffffffff;
  96046. s = 32U - s;
  96047. if (j + 1 >= size) {
  96048. break;
  96049. }
  96050. /* lint allow cast of mismatch word32 and mp_digit */
  96051. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  96052. while ((s + 32U) <= (word32)DIGIT_BIT) {
  96053. s += 32U;
  96054. r[j] &= 0xffffffff;
  96055. if (j + 1 >= size) {
  96056. break;
  96057. }
  96058. if (s < (word32)DIGIT_BIT) {
  96059. /* lint allow cast of mismatch word32 and mp_digit */
  96060. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  96061. }
  96062. else {
  96063. r[++j] = (sp_digit)0;
  96064. }
  96065. }
  96066. s = (word32)DIGIT_BIT - s;
  96067. }
  96068. for (j++; j < size; j++) {
  96069. r[j] = 0;
  96070. }
  96071. #else
  96072. int i;
  96073. int j = 0;
  96074. int s = 0;
  96075. r[0] = 0;
  96076. for (i = 0; i < a->used && j < size; i++) {
  96077. r[j] |= ((sp_digit)a->dp[i]) << s;
  96078. if (s + DIGIT_BIT >= 32) {
  96079. r[j] &= 0xffffffff;
  96080. if (j + 1 >= size) {
  96081. break;
  96082. }
  96083. s = 32 - s;
  96084. if (s == DIGIT_BIT) {
  96085. r[++j] = 0;
  96086. s = 0;
  96087. }
  96088. else {
  96089. r[++j] = a->dp[i] >> s;
  96090. s = DIGIT_BIT - s;
  96091. }
  96092. }
  96093. else {
  96094. s += DIGIT_BIT;
  96095. }
  96096. }
  96097. for (j++; j < size; j++) {
  96098. r[j] = 0;
  96099. }
  96100. #endif
  96101. }
  96102. /* Convert a point of type ecc_point to type sp_point_256.
  96103. *
  96104. * p Point of type sp_point_256 (result).
  96105. * pm Point of type ecc_point.
  96106. */
  96107. static void sp_256_point_from_ecc_point_8(sp_point_256* p,
  96108. const ecc_point* pm)
  96109. {
  96110. XMEMSET(p->x, 0, sizeof(p->x));
  96111. XMEMSET(p->y, 0, sizeof(p->y));
  96112. XMEMSET(p->z, 0, sizeof(p->z));
  96113. sp_256_from_mp(p->x, 8, pm->x);
  96114. sp_256_from_mp(p->y, 8, pm->y);
  96115. sp_256_from_mp(p->z, 8, pm->z);
  96116. p->infinity = 0;
  96117. }
  96118. /* Convert an array of sp_digit to an mp_int.
  96119. *
  96120. * a A single precision integer.
  96121. * r A multi-precision integer.
  96122. */
  96123. static int sp_256_to_mp(const sp_digit* a, mp_int* r)
  96124. {
  96125. int err;
  96126. err = mp_grow(r, (256 + DIGIT_BIT - 1) / DIGIT_BIT);
  96127. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  96128. #if DIGIT_BIT == 32
  96129. XMEMCPY(r->dp, a, sizeof(sp_digit) * 8);
  96130. r->used = 8;
  96131. mp_clamp(r);
  96132. #elif DIGIT_BIT < 32
  96133. int i;
  96134. int j = 0;
  96135. int s = 0;
  96136. r->dp[0] = 0;
  96137. for (i = 0; i < 8; i++) {
  96138. r->dp[j] |= (mp_digit)(a[i] << s);
  96139. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  96140. s = DIGIT_BIT - s;
  96141. r->dp[++j] = (mp_digit)(a[i] >> s);
  96142. while (s + DIGIT_BIT <= 32) {
  96143. s += DIGIT_BIT;
  96144. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  96145. if (s == SP_WORD_SIZE) {
  96146. r->dp[j] = 0;
  96147. }
  96148. else {
  96149. r->dp[j] = (mp_digit)(a[i] >> s);
  96150. }
  96151. }
  96152. s = 32 - s;
  96153. }
  96154. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  96155. mp_clamp(r);
  96156. #else
  96157. int i;
  96158. int j = 0;
  96159. int s = 0;
  96160. r->dp[0] = 0;
  96161. for (i = 0; i < 8; i++) {
  96162. r->dp[j] |= ((mp_digit)a[i]) << s;
  96163. if (s + 32 >= DIGIT_BIT) {
  96164. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  96165. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  96166. #endif
  96167. s = DIGIT_BIT - s;
  96168. r->dp[++j] = a[i] >> s;
  96169. s = 32 - s;
  96170. }
  96171. else {
  96172. s += 32;
  96173. }
  96174. }
  96175. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  96176. mp_clamp(r);
  96177. #endif
  96178. }
  96179. return err;
  96180. }
  96181. /* Convert a point of type sp_point_256 to type ecc_point.
  96182. *
  96183. * p Point of type sp_point_256.
  96184. * pm Point of type ecc_point (result).
  96185. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  96186. * MP_OKAY.
  96187. */
  96188. static int sp_256_point_to_ecc_point_8(const sp_point_256* p, ecc_point* pm)
  96189. {
  96190. int err;
  96191. err = sp_256_to_mp(p->x, pm->x);
  96192. if (err == MP_OKAY) {
  96193. err = sp_256_to_mp(p->y, pm->y);
  96194. }
  96195. if (err == MP_OKAY) {
  96196. err = sp_256_to_mp(p->z, pm->z);
  96197. }
  96198. return err;
  96199. }
  96200. /* Conditionally subtract b from a using the mask m.
  96201. * m is -1 to subtract and 0 when not copying.
  96202. *
  96203. * r A single precision number representing condition subtract result.
  96204. * a A single precision number to subtract from.
  96205. * b A single precision number to subtract.
  96206. * m Mask value to apply.
  96207. */
  96208. SP_NOINLINE static sp_digit sp_256_cond_sub_8(sp_digit* r, const sp_digit* a,
  96209. const sp_digit* b, sp_digit m)
  96210. {
  96211. __asm__ __volatile__ (
  96212. "movs r4, #0\n\t"
  96213. "movs r5, #32\n\t"
  96214. "mov r8, r5\n\t"
  96215. "movs r7, #0\n\t"
  96216. "\n"
  96217. "L_sp_256_cond_sub_8_words_%=:\n\t"
  96218. "ldr r6, [%[b], r7]\n\t"
  96219. #ifdef WOLFSSL_KEIL
  96220. "ands r6, r6, %[m]\n\t"
  96221. #elif defined(__clang__)
  96222. "ands r6, %[m]\n\t"
  96223. #else
  96224. "and r6, %[m]\n\t"
  96225. #endif
  96226. "movs r5, #0\n\t"
  96227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96228. "subs r5, r5, r4\n\t"
  96229. #else
  96230. "sub r5, r5, r4\n\t"
  96231. #endif
  96232. "ldr r5, [%[a], r7]\n\t"
  96233. #ifdef WOLFSSL_KEIL
  96234. "sbcs r5, r5, r6\n\t"
  96235. #elif defined(__clang__)
  96236. "sbcs r5, r6\n\t"
  96237. #else
  96238. "sbc r5, r6\n\t"
  96239. #endif
  96240. #ifdef WOLFSSL_KEIL
  96241. "sbcs r4, r4, r4\n\t"
  96242. #elif defined(__clang__)
  96243. "sbcs r4, r4\n\t"
  96244. #else
  96245. "sbc r4, r4\n\t"
  96246. #endif
  96247. "str r5, [%[r], r7]\n\t"
  96248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96249. "adds r7, r7, #4\n\t"
  96250. #else
  96251. "add r7, r7, #4\n\t"
  96252. #endif
  96253. "cmp r7, r8\n\t"
  96254. "blt L_sp_256_cond_sub_8_words_%=\n\t"
  96255. "movs %[r], r4\n\t"
  96256. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  96257. :
  96258. : "memory", "r4", "r5", "r6", "r7", "r8"
  96259. );
  96260. return (uint32_t)(size_t)r;
  96261. }
  96262. /* Reduce the number back to 256 bits using Montgomery reduction.
  96263. *
  96264. * a A single precision number to reduce in place.
  96265. * m The single precision number representing the modulus.
  96266. * mp The digit representing the negative inverse of m mod 2^n.
  96267. */
  96268. SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a, const sp_digit* m,
  96269. sp_digit mp)
  96270. {
  96271. (void)mp;
  96272. (void)m;
  96273. __asm__ __volatile__ (
  96274. "movs r2, #0\n\t"
  96275. "movs r1, #0\n\t"
  96276. "# i = 0\n\t"
  96277. "mov r8, r2\n\t"
  96278. "\n"
  96279. "L_sp_256_mont_reduce_8_mod_%=:\n\t"
  96280. "movs r4, #0\n\t"
  96281. "# mu = a[i] * 1 (mp) = a[i]\n\t"
  96282. "ldr r3, [%[a]]\n\t"
  96283. "# a[i+0] += -1 * mu\n\t"
  96284. "movs r5, r3\n\t"
  96285. "str r4, [%[a]]\n\t"
  96286. "# a[i+1] += -1 * mu\n\t"
  96287. "ldr r6, [%[a], #4]\n\t"
  96288. "movs r4, r3\n\t"
  96289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96290. "subs r5, r5, r3\n\t"
  96291. #else
  96292. "sub r5, r5, r3\n\t"
  96293. #endif
  96294. #ifdef WOLFSSL_KEIL
  96295. "sbcs r4, r4, r2\n\t"
  96296. #elif defined(__clang__)
  96297. "sbcs r4, r2\n\t"
  96298. #else
  96299. "sbc r4, r2\n\t"
  96300. #endif
  96301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96302. "adds r5, r5, r6\n\t"
  96303. #else
  96304. "add r5, r5, r6\n\t"
  96305. #endif
  96306. #ifdef WOLFSSL_KEIL
  96307. "adcs r4, r4, r2\n\t"
  96308. #elif defined(__clang__)
  96309. "adcs r4, r2\n\t"
  96310. #else
  96311. "adc r4, r2\n\t"
  96312. #endif
  96313. "str r5, [%[a], #4]\n\t"
  96314. "# a[i+2] += -1 * mu\n\t"
  96315. "ldr r6, [%[a], #8]\n\t"
  96316. "movs r5, r3\n\t"
  96317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96318. "subs r4, r4, r3\n\t"
  96319. #else
  96320. "sub r4, r4, r3\n\t"
  96321. #endif
  96322. #ifdef WOLFSSL_KEIL
  96323. "sbcs r5, r5, r2\n\t"
  96324. #elif defined(__clang__)
  96325. "sbcs r5, r2\n\t"
  96326. #else
  96327. "sbc r5, r2\n\t"
  96328. #endif
  96329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96330. "adds r4, r4, r6\n\t"
  96331. #else
  96332. "add r4, r4, r6\n\t"
  96333. #endif
  96334. #ifdef WOLFSSL_KEIL
  96335. "adcs r5, r5, r2\n\t"
  96336. #elif defined(__clang__)
  96337. "adcs r5, r2\n\t"
  96338. #else
  96339. "adc r5, r2\n\t"
  96340. #endif
  96341. "str r4, [%[a], #8]\n\t"
  96342. "# a[i+3] += 0 * mu\n\t"
  96343. "ldr r6, [%[a], #12]\n\t"
  96344. "movs r4, #0\n\t"
  96345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96346. "adds r5, r5, r6\n\t"
  96347. #else
  96348. "add r5, r5, r6\n\t"
  96349. #endif
  96350. #ifdef WOLFSSL_KEIL
  96351. "adcs r4, r4, r2\n\t"
  96352. #elif defined(__clang__)
  96353. "adcs r4, r2\n\t"
  96354. #else
  96355. "adc r4, r2\n\t"
  96356. #endif
  96357. "str r5, [%[a], #12]\n\t"
  96358. "# a[i+4] += 0 * mu\n\t"
  96359. "ldr r6, [%[a], #16]\n\t"
  96360. "movs r5, #0\n\t"
  96361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96362. "adds r4, r4, r6\n\t"
  96363. #else
  96364. "add r4, r4, r6\n\t"
  96365. #endif
  96366. #ifdef WOLFSSL_KEIL
  96367. "adcs r5, r5, r2\n\t"
  96368. #elif defined(__clang__)
  96369. "adcs r5, r2\n\t"
  96370. #else
  96371. "adc r5, r2\n\t"
  96372. #endif
  96373. "str r4, [%[a], #16]\n\t"
  96374. "# a[i+5] += 0 * mu\n\t"
  96375. "ldr r6, [%[a], #20]\n\t"
  96376. "movs r4, #0\n\t"
  96377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96378. "adds r5, r5, r6\n\t"
  96379. #else
  96380. "add r5, r5, r6\n\t"
  96381. #endif
  96382. #ifdef WOLFSSL_KEIL
  96383. "adcs r4, r4, r2\n\t"
  96384. #elif defined(__clang__)
  96385. "adcs r4, r2\n\t"
  96386. #else
  96387. "adc r4, r2\n\t"
  96388. #endif
  96389. "str r5, [%[a], #20]\n\t"
  96390. "# a[i+6] += 1 * mu\n\t"
  96391. "ldr r6, [%[a], #24]\n\t"
  96392. "movs r5, #0\n\t"
  96393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96394. "adds r4, r4, r3\n\t"
  96395. #else
  96396. "add r4, r4, r3\n\t"
  96397. #endif
  96398. #ifdef WOLFSSL_KEIL
  96399. "adcs r5, r5, r2\n\t"
  96400. #elif defined(__clang__)
  96401. "adcs r5, r2\n\t"
  96402. #else
  96403. "adc r5, r2\n\t"
  96404. #endif
  96405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96406. "adds r4, r4, r6\n\t"
  96407. #else
  96408. "add r4, r4, r6\n\t"
  96409. #endif
  96410. #ifdef WOLFSSL_KEIL
  96411. "adcs r5, r5, r2\n\t"
  96412. #elif defined(__clang__)
  96413. "adcs r5, r2\n\t"
  96414. #else
  96415. "adc r5, r2\n\t"
  96416. #endif
  96417. "str r4, [%[a], #24]\n\t"
  96418. "# a[i+7] += -1 * mu\n\t"
  96419. "ldr r6, [%[a], #28]\n\t"
  96420. "ldr r7, [%[a], #32]\n\t"
  96421. #ifdef WOLFSSL_KEIL
  96422. "adds r4, r1, r3\n\t"
  96423. #else
  96424. #ifdef __clang__
  96425. "adds r4, r1, r3\n\t"
  96426. #else
  96427. "add r4, r1, r3\n\t"
  96428. #endif
  96429. #endif
  96430. "movs r1, #0\n\t"
  96431. #ifdef WOLFSSL_KEIL
  96432. "adcs r1, r1, r2\n\t"
  96433. #elif defined(__clang__)
  96434. "adcs r1, r2\n\t"
  96435. #else
  96436. "adc r1, r2\n\t"
  96437. #endif
  96438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96439. "subs r5, r5, r3\n\t"
  96440. #else
  96441. "sub r5, r5, r3\n\t"
  96442. #endif
  96443. #ifdef WOLFSSL_KEIL
  96444. "sbcs r4, r4, r2\n\t"
  96445. #elif defined(__clang__)
  96446. "sbcs r4, r2\n\t"
  96447. #else
  96448. "sbc r4, r2\n\t"
  96449. #endif
  96450. #ifdef WOLFSSL_KEIL
  96451. "sbcs r1, r1, r2\n\t"
  96452. #elif defined(__clang__)
  96453. "sbcs r1, r2\n\t"
  96454. #else
  96455. "sbc r1, r2\n\t"
  96456. #endif
  96457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96458. "adds r5, r5, r6\n\t"
  96459. #else
  96460. "add r5, r5, r6\n\t"
  96461. #endif
  96462. #ifdef WOLFSSL_KEIL
  96463. "adcs r4, r4, r7\n\t"
  96464. #elif defined(__clang__)
  96465. "adcs r4, r7\n\t"
  96466. #else
  96467. "adc r4, r7\n\t"
  96468. #endif
  96469. #ifdef WOLFSSL_KEIL
  96470. "adcs r1, r1, r2\n\t"
  96471. #elif defined(__clang__)
  96472. "adcs r1, r2\n\t"
  96473. #else
  96474. "adc r1, r2\n\t"
  96475. #endif
  96476. "str r5, [%[a], #28]\n\t"
  96477. "str r4, [%[a], #32]\n\t"
  96478. "# i += 1\n\t"
  96479. "movs r6, #4\n\t"
  96480. "add r8, r8, r6\n\t"
  96481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96482. "adds %[a], %[a], #4\n\t"
  96483. #else
  96484. "add %[a], %[a], #4\n\t"
  96485. #endif
  96486. "movs r6, #32\n\t"
  96487. "cmp r8, r6\n\t"
  96488. "blt L_sp_256_mont_reduce_8_mod_%=\n\t"
  96489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96490. "subs %[a], %[a], #32\n\t"
  96491. #else
  96492. "sub %[a], %[a], #32\n\t"
  96493. #endif
  96494. "movs r3, r1\n\t"
  96495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96496. "subs r1, r1, #1\n\t"
  96497. #else
  96498. "sub r1, r1, #1\n\t"
  96499. #endif
  96500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96501. "mvns r1, r1\n\t"
  96502. #else
  96503. "mvn r1, r1\n\t"
  96504. #endif
  96505. "ldr r5, [%[a], #32]\n\t"
  96506. "ldr r4, [%[a], #36]\n\t"
  96507. "ldr r6, [%[a], #40]\n\t"
  96508. "ldr r7, [%[a], #44]\n\t"
  96509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96510. "subs r5, r5, r1\n\t"
  96511. #else
  96512. "sub r5, r5, r1\n\t"
  96513. #endif
  96514. #ifdef WOLFSSL_KEIL
  96515. "sbcs r4, r4, r1\n\t"
  96516. #elif defined(__clang__)
  96517. "sbcs r4, r1\n\t"
  96518. #else
  96519. "sbc r4, r1\n\t"
  96520. #endif
  96521. #ifdef WOLFSSL_KEIL
  96522. "sbcs r6, r6, r1\n\t"
  96523. #elif defined(__clang__)
  96524. "sbcs r6, r1\n\t"
  96525. #else
  96526. "sbc r6, r1\n\t"
  96527. #endif
  96528. #ifdef WOLFSSL_KEIL
  96529. "sbcs r7, r7, r2\n\t"
  96530. #elif defined(__clang__)
  96531. "sbcs r7, r2\n\t"
  96532. #else
  96533. "sbc r7, r2\n\t"
  96534. #endif
  96535. "str r5, [%[a]]\n\t"
  96536. "str r4, [%[a], #4]\n\t"
  96537. "str r6, [%[a], #8]\n\t"
  96538. "str r7, [%[a], #12]\n\t"
  96539. "ldr r5, [%[a], #48]\n\t"
  96540. "ldr r4, [%[a], #52]\n\t"
  96541. "ldr r6, [%[a], #56]\n\t"
  96542. "ldr r7, [%[a], #60]\n\t"
  96543. #ifdef WOLFSSL_KEIL
  96544. "sbcs r5, r5, r2\n\t"
  96545. #elif defined(__clang__)
  96546. "sbcs r5, r2\n\t"
  96547. #else
  96548. "sbc r5, r2\n\t"
  96549. #endif
  96550. #ifdef WOLFSSL_KEIL
  96551. "sbcs r4, r4, r2\n\t"
  96552. #elif defined(__clang__)
  96553. "sbcs r4, r2\n\t"
  96554. #else
  96555. "sbc r4, r2\n\t"
  96556. #endif
  96557. #ifdef WOLFSSL_KEIL
  96558. "sbcs r6, r6, r3\n\t"
  96559. #elif defined(__clang__)
  96560. "sbcs r6, r3\n\t"
  96561. #else
  96562. "sbc r6, r3\n\t"
  96563. #endif
  96564. #ifdef WOLFSSL_KEIL
  96565. "sbcs r7, r7, r1\n\t"
  96566. #elif defined(__clang__)
  96567. "sbcs r7, r1\n\t"
  96568. #else
  96569. "sbc r7, r1\n\t"
  96570. #endif
  96571. "str r5, [%[a], #16]\n\t"
  96572. "str r4, [%[a], #20]\n\t"
  96573. "str r6, [%[a], #24]\n\t"
  96574. "str r7, [%[a], #28]\n\t"
  96575. : [a] "+r" (a)
  96576. :
  96577. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8"
  96578. );
  96579. }
  96580. /* Reduce the number back to 256 bits using Montgomery reduction.
  96581. *
  96582. * a A single precision number to reduce in place.
  96583. * m The single precision number representing the modulus.
  96584. * mp The digit representing the negative inverse of m mod 2^n.
  96585. */
  96586. SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a,
  96587. const sp_digit* m, sp_digit mp)
  96588. {
  96589. __asm__ __volatile__ (
  96590. "movs r7, #0\n\t"
  96591. "mov r8, %[mp]\n\t"
  96592. "mov r12, r7\n\t"
  96593. "mov lr, %[m]\n\t"
  96594. "mov r9, %[a]\n\t"
  96595. "mov r11, %[a]\n\t"
  96596. "movs r5, #28\n\t"
  96597. "movs r6, #32\n\t"
  96598. "add r9, r9, r5\n\t"
  96599. "add r11, r11, r6\n\t"
  96600. "\n"
  96601. "L_sp_256_mont_reduce_order_8_mod_%=:\n\t"
  96602. "movs r7, #0\n\t"
  96603. "movs r4, #0\n\t"
  96604. "# a[i] += m[0] * mu\n\t"
  96605. "ldm %[m]!, {%[mp]}\n\t"
  96606. "ldm %[a]!, {r3}\n\t"
  96607. "# mu = a[i] * mp\n\t"
  96608. "mov r5, r8\n\t"
  96609. #ifdef WOLFSSL_KEIL
  96610. "muls r5, r3, r5\n\t"
  96611. #elif defined(__clang__)
  96612. "muls r5, r3\n\t"
  96613. #else
  96614. "mul r5, r3\n\t"
  96615. #endif
  96616. "mov r10, r5\n\t"
  96617. "# Multiply m[0] and mu - Start\n\t"
  96618. "mov r5, r10\n\t"
  96619. "uxth r6, %[mp]\n\t"
  96620. "uxth r5, r5\n\t"
  96621. #ifdef WOLFSSL_KEIL
  96622. "muls r6, r5, r6\n\t"
  96623. #elif defined(__clang__)
  96624. "muls r6, r5\n\t"
  96625. #else
  96626. "mul r6, r5\n\t"
  96627. #endif
  96628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96629. "adds r3, r3, r6\n\t"
  96630. #else
  96631. "add r3, r3, r6\n\t"
  96632. #endif
  96633. #ifdef WOLFSSL_KEIL
  96634. "adcs r4, r4, r7\n\t"
  96635. #elif defined(__clang__)
  96636. "adcs r4, r7\n\t"
  96637. #else
  96638. "adc r4, r7\n\t"
  96639. #endif
  96640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96641. "lsrs r6, %[mp], #16\n\t"
  96642. #else
  96643. "lsr r6, %[mp], #16\n\t"
  96644. #endif
  96645. #ifdef WOLFSSL_KEIL
  96646. "muls r5, r6, r5\n\t"
  96647. #elif defined(__clang__)
  96648. "muls r5, r6\n\t"
  96649. #else
  96650. "mul r5, r6\n\t"
  96651. #endif
  96652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96653. "lsrs r6, r5, #16\n\t"
  96654. #else
  96655. "lsr r6, r5, #16\n\t"
  96656. #endif
  96657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96658. "lsls r5, r5, #16\n\t"
  96659. #else
  96660. "lsl r5, r5, #16\n\t"
  96661. #endif
  96662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96663. "adds r3, r3, r5\n\t"
  96664. #else
  96665. "add r3, r3, r5\n\t"
  96666. #endif
  96667. #ifdef WOLFSSL_KEIL
  96668. "adcs r4, r4, r6\n\t"
  96669. #elif defined(__clang__)
  96670. "adcs r4, r6\n\t"
  96671. #else
  96672. "adc r4, r6\n\t"
  96673. #endif
  96674. "mov r5, r10\n\t"
  96675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96676. "lsrs r6, %[mp], #16\n\t"
  96677. #else
  96678. "lsr r6, %[mp], #16\n\t"
  96679. #endif
  96680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96681. "lsrs r5, r5, #16\n\t"
  96682. #else
  96683. "lsr r5, r5, #16\n\t"
  96684. #endif
  96685. #ifdef WOLFSSL_KEIL
  96686. "muls r6, r5, r6\n\t"
  96687. #elif defined(__clang__)
  96688. "muls r6, r5\n\t"
  96689. #else
  96690. "mul r6, r5\n\t"
  96691. #endif
  96692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96693. "adds r4, r4, r6\n\t"
  96694. #else
  96695. "add r4, r4, r6\n\t"
  96696. #endif
  96697. "uxth r6, %[mp]\n\t"
  96698. #ifdef WOLFSSL_KEIL
  96699. "muls r5, r6, r5\n\t"
  96700. #elif defined(__clang__)
  96701. "muls r5, r6\n\t"
  96702. #else
  96703. "mul r5, r6\n\t"
  96704. #endif
  96705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96706. "lsrs r6, r5, #16\n\t"
  96707. #else
  96708. "lsr r6, r5, #16\n\t"
  96709. #endif
  96710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96711. "lsls r5, r5, #16\n\t"
  96712. #else
  96713. "lsl r5, r5, #16\n\t"
  96714. #endif
  96715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96716. "adds r3, r3, r5\n\t"
  96717. #else
  96718. "add r3, r3, r5\n\t"
  96719. #endif
  96720. #ifdef WOLFSSL_KEIL
  96721. "adcs r4, r4, r6\n\t"
  96722. #elif defined(__clang__)
  96723. "adcs r4, r6\n\t"
  96724. #else
  96725. "adc r4, r6\n\t"
  96726. #endif
  96727. "# Multiply m[0] and mu - Done\n\t"
  96728. "\n"
  96729. "L_sp_256_mont_reduce_order_8_word_%=:\n\t"
  96730. "# a[i+j] += m[j] * mu\n\t"
  96731. "ldr r3, [%[a]]\n\t"
  96732. "ldm %[m]!, {%[mp]}\n\t"
  96733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96734. "adds r3, r3, r4\n\t"
  96735. #else
  96736. "add r3, r3, r4\n\t"
  96737. #endif
  96738. "movs r4, #0\n\t"
  96739. #ifdef WOLFSSL_KEIL
  96740. "adcs r4, r4, r7\n\t"
  96741. #elif defined(__clang__)
  96742. "adcs r4, r7\n\t"
  96743. #else
  96744. "adc r4, r7\n\t"
  96745. #endif
  96746. "# Multiply m[j] and mu - Start\n\t"
  96747. "mov r5, r10\n\t"
  96748. "uxth r6, %[mp]\n\t"
  96749. "uxth r5, r5\n\t"
  96750. #ifdef WOLFSSL_KEIL
  96751. "muls r6, r5, r6\n\t"
  96752. #elif defined(__clang__)
  96753. "muls r6, r5\n\t"
  96754. #else
  96755. "mul r6, r5\n\t"
  96756. #endif
  96757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96758. "adds r3, r3, r6\n\t"
  96759. #else
  96760. "add r3, r3, r6\n\t"
  96761. #endif
  96762. #ifdef WOLFSSL_KEIL
  96763. "adcs r4, r4, r7\n\t"
  96764. #elif defined(__clang__)
  96765. "adcs r4, r7\n\t"
  96766. #else
  96767. "adc r4, r7\n\t"
  96768. #endif
  96769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96770. "lsrs r6, %[mp], #16\n\t"
  96771. #else
  96772. "lsr r6, %[mp], #16\n\t"
  96773. #endif
  96774. #ifdef WOLFSSL_KEIL
  96775. "muls r5, r6, r5\n\t"
  96776. #elif defined(__clang__)
  96777. "muls r5, r6\n\t"
  96778. #else
  96779. "mul r5, r6\n\t"
  96780. #endif
  96781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96782. "lsrs r6, r5, #16\n\t"
  96783. #else
  96784. "lsr r6, r5, #16\n\t"
  96785. #endif
  96786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96787. "lsls r5, r5, #16\n\t"
  96788. #else
  96789. "lsl r5, r5, #16\n\t"
  96790. #endif
  96791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96792. "adds r3, r3, r5\n\t"
  96793. #else
  96794. "add r3, r3, r5\n\t"
  96795. #endif
  96796. #ifdef WOLFSSL_KEIL
  96797. "adcs r4, r4, r6\n\t"
  96798. #elif defined(__clang__)
  96799. "adcs r4, r6\n\t"
  96800. #else
  96801. "adc r4, r6\n\t"
  96802. #endif
  96803. "mov r5, r10\n\t"
  96804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96805. "lsrs r6, %[mp], #16\n\t"
  96806. #else
  96807. "lsr r6, %[mp], #16\n\t"
  96808. #endif
  96809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96810. "lsrs r5, r5, #16\n\t"
  96811. #else
  96812. "lsr r5, r5, #16\n\t"
  96813. #endif
  96814. #ifdef WOLFSSL_KEIL
  96815. "muls r6, r5, r6\n\t"
  96816. #elif defined(__clang__)
  96817. "muls r6, r5\n\t"
  96818. #else
  96819. "mul r6, r5\n\t"
  96820. #endif
  96821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96822. "adds r4, r4, r6\n\t"
  96823. #else
  96824. "add r4, r4, r6\n\t"
  96825. #endif
  96826. "uxth r6, %[mp]\n\t"
  96827. #ifdef WOLFSSL_KEIL
  96828. "muls r5, r6, r5\n\t"
  96829. #elif defined(__clang__)
  96830. "muls r5, r6\n\t"
  96831. #else
  96832. "mul r5, r6\n\t"
  96833. #endif
  96834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96835. "lsrs r6, r5, #16\n\t"
  96836. #else
  96837. "lsr r6, r5, #16\n\t"
  96838. #endif
  96839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96840. "lsls r5, r5, #16\n\t"
  96841. #else
  96842. "lsl r5, r5, #16\n\t"
  96843. #endif
  96844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96845. "adds r3, r3, r5\n\t"
  96846. #else
  96847. "add r3, r3, r5\n\t"
  96848. #endif
  96849. #ifdef WOLFSSL_KEIL
  96850. "adcs r4, r4, r6\n\t"
  96851. #elif defined(__clang__)
  96852. "adcs r4, r6\n\t"
  96853. #else
  96854. "adc r4, r6\n\t"
  96855. #endif
  96856. "# Multiply m[j] and mu - Done\n\t"
  96857. "stm %[a]!, {r3}\n\t"
  96858. "cmp %[a], r9\n\t"
  96859. "blt L_sp_256_mont_reduce_order_8_word_%=\n\t"
  96860. "# a[i+7] += m[7] * mu\n\t"
  96861. "ldr %[mp], [%[m]]\n\t"
  96862. "mov r3, r12\n\t"
  96863. "# Multiply m[7] and mu - Start\n\t"
  96864. "mov r5, r10\n\t"
  96865. "uxth r6, %[mp]\n\t"
  96866. "uxth r5, r5\n\t"
  96867. #ifdef WOLFSSL_KEIL
  96868. "muls r6, r5, r6\n\t"
  96869. #elif defined(__clang__)
  96870. "muls r6, r5\n\t"
  96871. #else
  96872. "mul r6, r5\n\t"
  96873. #endif
  96874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96875. "adds r4, r4, r6\n\t"
  96876. #else
  96877. "add r4, r4, r6\n\t"
  96878. #endif
  96879. #ifdef WOLFSSL_KEIL
  96880. "adcs r3, r3, r7\n\t"
  96881. #elif defined(__clang__)
  96882. "adcs r3, r7\n\t"
  96883. #else
  96884. "adc r3, r7\n\t"
  96885. #endif
  96886. #ifdef WOLFSSL_KEIL
  96887. "adcs r7, r7, r7\n\t"
  96888. #elif defined(__clang__)
  96889. "adcs r7, r7\n\t"
  96890. #else
  96891. "adc r7, r7\n\t"
  96892. #endif
  96893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96894. "lsrs r6, %[mp], #16\n\t"
  96895. #else
  96896. "lsr r6, %[mp], #16\n\t"
  96897. #endif
  96898. #ifdef WOLFSSL_KEIL
  96899. "muls r5, r6, r5\n\t"
  96900. #elif defined(__clang__)
  96901. "muls r5, r6\n\t"
  96902. #else
  96903. "mul r5, r6\n\t"
  96904. #endif
  96905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96906. "lsrs r6, r5, #16\n\t"
  96907. #else
  96908. "lsr r6, r5, #16\n\t"
  96909. #endif
  96910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96911. "lsls r5, r5, #16\n\t"
  96912. #else
  96913. "lsl r5, r5, #16\n\t"
  96914. #endif
  96915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96916. "adds r4, r4, r5\n\t"
  96917. #else
  96918. "add r4, r4, r5\n\t"
  96919. #endif
  96920. #ifdef WOLFSSL_KEIL
  96921. "adcs r3, r3, r6\n\t"
  96922. #elif defined(__clang__)
  96923. "adcs r3, r6\n\t"
  96924. #else
  96925. "adc r3, r6\n\t"
  96926. #endif
  96927. #ifdef WOLFSSL_KEIL
  96928. "adcs r7, r7, r7\n\t"
  96929. #elif defined(__clang__)
  96930. "adcs r7, r7\n\t"
  96931. #else
  96932. "adc r7, r7\n\t"
  96933. #endif
  96934. "mov r5, r10\n\t"
  96935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96936. "lsrs r6, %[mp], #16\n\t"
  96937. #else
  96938. "lsr r6, %[mp], #16\n\t"
  96939. #endif
  96940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96941. "lsrs r5, r5, #16\n\t"
  96942. #else
  96943. "lsr r5, r5, #16\n\t"
  96944. #endif
  96945. #ifdef WOLFSSL_KEIL
  96946. "muls r6, r5, r6\n\t"
  96947. #elif defined(__clang__)
  96948. "muls r6, r5\n\t"
  96949. #else
  96950. "mul r6, r5\n\t"
  96951. #endif
  96952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96953. "adds r3, r3, r6\n\t"
  96954. #else
  96955. "add r3, r3, r6\n\t"
  96956. #endif
  96957. #ifdef WOLFSSL_KEIL
  96958. "adcs r7, r7, r7\n\t"
  96959. #elif defined(__clang__)
  96960. "adcs r7, r7\n\t"
  96961. #else
  96962. "adc r7, r7\n\t"
  96963. #endif
  96964. "uxth r6, %[mp]\n\t"
  96965. #ifdef WOLFSSL_KEIL
  96966. "muls r5, r6, r5\n\t"
  96967. #elif defined(__clang__)
  96968. "muls r5, r6\n\t"
  96969. #else
  96970. "mul r5, r6\n\t"
  96971. #endif
  96972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96973. "lsrs r6, r5, #16\n\t"
  96974. #else
  96975. "lsr r6, r5, #16\n\t"
  96976. #endif
  96977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96978. "lsls r5, r5, #16\n\t"
  96979. #else
  96980. "lsl r5, r5, #16\n\t"
  96981. #endif
  96982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96983. "adds r4, r4, r5\n\t"
  96984. #else
  96985. "add r4, r4, r5\n\t"
  96986. #endif
  96987. #ifdef WOLFSSL_KEIL
  96988. "adcs r3, r3, r6\n\t"
  96989. #elif defined(__clang__)
  96990. "adcs r3, r6\n\t"
  96991. #else
  96992. "adc r3, r6\n\t"
  96993. #endif
  96994. #ifdef WOLFSSL_KEIL
  96995. "adcs r7, r7, r7\n\t"
  96996. #elif defined(__clang__)
  96997. "adcs r7, r7\n\t"
  96998. #else
  96999. "adc r7, r7\n\t"
  97000. #endif
  97001. "# Multiply m[7] and mu - Done\n\t"
  97002. "ldr r5, [%[a]]\n\t"
  97003. "ldr r6, [%[a], #4]\n\t"
  97004. "movs %[mp], #0\n\t"
  97005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97006. "adds r5, r5, r4\n\t"
  97007. #else
  97008. "add r5, r5, r4\n\t"
  97009. #endif
  97010. #ifdef WOLFSSL_KEIL
  97011. "adcs r6, r6, r3\n\t"
  97012. #elif defined(__clang__)
  97013. "adcs r6, r3\n\t"
  97014. #else
  97015. "adc r6, r3\n\t"
  97016. #endif
  97017. #ifdef WOLFSSL_KEIL
  97018. "adcs r7, r7, %[mp]\n\t"
  97019. #elif defined(__clang__)
  97020. "adcs r7, %[mp]\n\t"
  97021. #else
  97022. "adc r7, %[mp]\n\t"
  97023. #endif
  97024. "stm %[a]!, {r5, r6}\n\t"
  97025. "# i += 1\n\t"
  97026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97027. "subs %[a], %[a], #4\n\t"
  97028. #else
  97029. "sub %[a], %[a], #4\n\t"
  97030. #endif
  97031. "movs r3, #28\n\t"
  97032. "mov r9, %[a]\n\t"
  97033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97034. "subs %[a], %[a], r3\n\t"
  97035. #else
  97036. "sub %[a], %[a], r3\n\t"
  97037. #endif
  97038. "mov r12, r7\n\t"
  97039. "mov %[m], lr\n\t"
  97040. "cmp r11, %[a]\n\t"
  97041. "bgt L_sp_256_mont_reduce_order_8_mod_%=\n\t"
  97042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97043. "negs r7, r7\n\t"
  97044. #else
  97045. "neg r7, r7\n\t"
  97046. #endif
  97047. "# Subtract masked modulus\n\t"
  97048. "movs r4, #32\n\t"
  97049. "movs %[mp], #0\n\t"
  97050. "movs r3, #0\n\t"
  97051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97052. "subs %[a], %[a], r4\n\t"
  97053. #else
  97054. "sub %[a], %[a], r4\n\t"
  97055. #endif
  97056. #ifndef WOLFSSL_SP_LARGE_CODE
  97057. "\n"
  97058. "L_sp_256_mont_reduce_order_8_sub_mask_%=:\n\t"
  97059. "ldm %[m]!, {r6}\n\t"
  97060. "movs r5, #0\n\t"
  97061. #ifdef WOLFSSL_KEIL
  97062. "ands r6, r6, r7\n\t"
  97063. #elif defined(__clang__)
  97064. "ands r6, r7\n\t"
  97065. #else
  97066. "and r6, r7\n\t"
  97067. #endif
  97068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97069. "subs r5, r5, %[mp]\n\t"
  97070. #else
  97071. "sub r5, r5, %[mp]\n\t"
  97072. #endif
  97073. "ldr r5, [%[a], r4]\n\t"
  97074. #ifdef WOLFSSL_KEIL
  97075. "sbcs r5, r5, r6\n\t"
  97076. #elif defined(__clang__)
  97077. "sbcs r5, r6\n\t"
  97078. #else
  97079. "sbc r5, r6\n\t"
  97080. #endif
  97081. #ifdef WOLFSSL_KEIL
  97082. "sbcs %[mp], %[mp], %[mp]\n\t"
  97083. #elif defined(__clang__)
  97084. "sbcs %[mp], %[mp]\n\t"
  97085. #else
  97086. "sbc %[mp], %[mp]\n\t"
  97087. #endif
  97088. "stm %[a]!, {r5}\n\t"
  97089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97090. "adds r3, r3, #4\n\t"
  97091. #else
  97092. "add r3, r3, #4\n\t"
  97093. #endif
  97094. "cmp r3, r4\n\t"
  97095. "blt L_sp_256_mont_reduce_order_8_sub_mask_%=\n\t"
  97096. #else /* WOLFSSL_SP_LARGE_CODE */
  97097. "ldm %[m]!, {r6}\n\t"
  97098. #ifdef WOLFSSL_KEIL
  97099. "ands r6, r6, r7\n\t"
  97100. #elif defined(__clang__)
  97101. "ands r6, r7\n\t"
  97102. #else
  97103. "and r6, r7\n\t"
  97104. #endif
  97105. "ldr r5, [%[a], r4]\n\t"
  97106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97107. "subs r5, r5, r6\n\t"
  97108. #else
  97109. "sub r5, r5, r6\n\t"
  97110. #endif
  97111. "stm %[a]!, {r5}\n\t"
  97112. "ldm %[m]!, {r6}\n\t"
  97113. #ifdef WOLFSSL_KEIL
  97114. "ands r6, r6, r7\n\t"
  97115. #elif defined(__clang__)
  97116. "ands r6, r7\n\t"
  97117. #else
  97118. "and r6, r7\n\t"
  97119. #endif
  97120. "ldr r5, [%[a], r4]\n\t"
  97121. #ifdef WOLFSSL_KEIL
  97122. "sbcs r5, r5, r6\n\t"
  97123. #elif defined(__clang__)
  97124. "sbcs r5, r6\n\t"
  97125. #else
  97126. "sbc r5, r6\n\t"
  97127. #endif
  97128. "stm %[a]!, {r5}\n\t"
  97129. "ldm %[m]!, {r6}\n\t"
  97130. #ifdef WOLFSSL_KEIL
  97131. "ands r6, r6, r7\n\t"
  97132. #elif defined(__clang__)
  97133. "ands r6, r7\n\t"
  97134. #else
  97135. "and r6, r7\n\t"
  97136. #endif
  97137. "ldr r5, [%[a], r4]\n\t"
  97138. #ifdef WOLFSSL_KEIL
  97139. "sbcs r5, r5, r6\n\t"
  97140. #elif defined(__clang__)
  97141. "sbcs r5, r6\n\t"
  97142. #else
  97143. "sbc r5, r6\n\t"
  97144. #endif
  97145. "stm %[a]!, {r5}\n\t"
  97146. "ldm %[m]!, {r6}\n\t"
  97147. #ifdef WOLFSSL_KEIL
  97148. "ands r6, r6, r7\n\t"
  97149. #elif defined(__clang__)
  97150. "ands r6, r7\n\t"
  97151. #else
  97152. "and r6, r7\n\t"
  97153. #endif
  97154. "ldr r5, [%[a], r4]\n\t"
  97155. #ifdef WOLFSSL_KEIL
  97156. "sbcs r5, r5, r6\n\t"
  97157. #elif defined(__clang__)
  97158. "sbcs r5, r6\n\t"
  97159. #else
  97160. "sbc r5, r6\n\t"
  97161. #endif
  97162. "stm %[a]!, {r5}\n\t"
  97163. "ldm %[m]!, {r6}\n\t"
  97164. #ifdef WOLFSSL_KEIL
  97165. "ands r6, r6, r7\n\t"
  97166. #elif defined(__clang__)
  97167. "ands r6, r7\n\t"
  97168. #else
  97169. "and r6, r7\n\t"
  97170. #endif
  97171. "ldr r5, [%[a], r4]\n\t"
  97172. #ifdef WOLFSSL_KEIL
  97173. "sbcs r5, r5, r6\n\t"
  97174. #elif defined(__clang__)
  97175. "sbcs r5, r6\n\t"
  97176. #else
  97177. "sbc r5, r6\n\t"
  97178. #endif
  97179. "stm %[a]!, {r5}\n\t"
  97180. "ldm %[m]!, {r6}\n\t"
  97181. #ifdef WOLFSSL_KEIL
  97182. "ands r6, r6, r7\n\t"
  97183. #elif defined(__clang__)
  97184. "ands r6, r7\n\t"
  97185. #else
  97186. "and r6, r7\n\t"
  97187. #endif
  97188. "ldr r5, [%[a], r4]\n\t"
  97189. #ifdef WOLFSSL_KEIL
  97190. "sbcs r5, r5, r6\n\t"
  97191. #elif defined(__clang__)
  97192. "sbcs r5, r6\n\t"
  97193. #else
  97194. "sbc r5, r6\n\t"
  97195. #endif
  97196. "stm %[a]!, {r5}\n\t"
  97197. "ldm %[m]!, {r6}\n\t"
  97198. #ifdef WOLFSSL_KEIL
  97199. "ands r6, r6, r7\n\t"
  97200. #elif defined(__clang__)
  97201. "ands r6, r7\n\t"
  97202. #else
  97203. "and r6, r7\n\t"
  97204. #endif
  97205. "ldr r5, [%[a], r4]\n\t"
  97206. #ifdef WOLFSSL_KEIL
  97207. "sbcs r5, r5, r6\n\t"
  97208. #elif defined(__clang__)
  97209. "sbcs r5, r6\n\t"
  97210. #else
  97211. "sbc r5, r6\n\t"
  97212. #endif
  97213. "stm %[a]!, {r5}\n\t"
  97214. "ldm %[m]!, {r6}\n\t"
  97215. #ifdef WOLFSSL_KEIL
  97216. "ands r6, r6, r7\n\t"
  97217. #elif defined(__clang__)
  97218. "ands r6, r7\n\t"
  97219. #else
  97220. "and r6, r7\n\t"
  97221. #endif
  97222. "ldr r5, [%[a], r4]\n\t"
  97223. #ifdef WOLFSSL_KEIL
  97224. "sbcs r5, r5, r6\n\t"
  97225. #elif defined(__clang__)
  97226. "sbcs r5, r6\n\t"
  97227. #else
  97228. "sbc r5, r6\n\t"
  97229. #endif
  97230. "stm %[a]!, {r5}\n\t"
  97231. #endif /* WOLFSSL_SP_LARGE_CODE */
  97232. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  97233. :
  97234. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  97235. );
  97236. }
  97237. /* Multiply two Montgomery form numbers mod the modulus (prime).
  97238. * (r = a * b mod m)
  97239. *
  97240. * r Result of multiplication.
  97241. * a First number to multiply in Montgomery form.
  97242. * b Second number to multiply in Montgomery form.
  97243. * m Modulus (prime).
  97244. * mp Montgomery mulitplier.
  97245. */
  97246. static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a,
  97247. const sp_digit* b, const sp_digit* m, sp_digit mp)
  97248. {
  97249. sp_256_mul_8(r, a, b);
  97250. sp_256_mont_reduce_8(r, m, mp);
  97251. }
  97252. /* Square the Montgomery form number. (r = a * a mod m)
  97253. *
  97254. * r Result of squaring.
  97255. * a Number to square in Montgomery form.
  97256. * m Modulus (prime).
  97257. * mp Montgomery mulitplier.
  97258. */
  97259. static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a,
  97260. const sp_digit* m, sp_digit mp)
  97261. {
  97262. sp_256_sqr_8(r, a);
  97263. sp_256_mont_reduce_8(r, m, mp);
  97264. }
  97265. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  97266. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  97267. *
  97268. * r Result of squaring.
  97269. * a Number to square in Montgomery form.
  97270. * n Number of times to square.
  97271. * m Modulus (prime).
  97272. * mp Montgomery mulitplier.
  97273. */
  97274. static void sp_256_mont_sqr_n_8(sp_digit* r, const sp_digit* a, int n,
  97275. const sp_digit* m, sp_digit mp)
  97276. {
  97277. sp_256_mont_sqr_8(r, a, m, mp);
  97278. for (; n > 1; n--) {
  97279. sp_256_mont_sqr_8(r, r, m, mp);
  97280. }
  97281. }
  97282. #endif /* !WOLFSSL_SP_SMALL | HAVE_COMP_KEY */
  97283. #ifdef WOLFSSL_SP_SMALL
  97284. /* Mod-2 for the P256 curve. */
  97285. static const uint32_t p256_mod_minus_2[8] = {
  97286. 0xfffffffdU,0xffffffffU,0xffffffffU,0x00000000U,0x00000000U,0x00000000U,
  97287. 0x00000001U,0xffffffffU
  97288. };
  97289. #endif /* !WOLFSSL_SP_SMALL */
  97290. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  97291. * P256 curve. (r = 1 / a mod m)
  97292. *
  97293. * r Inverse result.
  97294. * a Number to invert.
  97295. * td Temporary data.
  97296. */
  97297. static void sp_256_mont_inv_8(sp_digit* r, const sp_digit* a, sp_digit* td)
  97298. {
  97299. #ifdef WOLFSSL_SP_SMALL
  97300. sp_digit* t = td;
  97301. int i;
  97302. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  97303. for (i=254; i>=0; i--) {
  97304. sp_256_mont_sqr_8(t, t, p256_mod, p256_mp_mod);
  97305. if (p256_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  97306. sp_256_mont_mul_8(t, t, a, p256_mod, p256_mp_mod);
  97307. }
  97308. XMEMCPY(r, t, sizeof(sp_digit) * 8);
  97309. #else
  97310. sp_digit* t1 = td;
  97311. sp_digit* t2 = td + 2 * 8;
  97312. sp_digit* t3 = td + 4 * 8;
  97313. /* 0x2 */
  97314. sp_256_mont_sqr_8(t1, a, p256_mod, p256_mp_mod);
  97315. /* 0x3 */
  97316. sp_256_mont_mul_8(t2, t1, a, p256_mod, p256_mp_mod);
  97317. /* 0xc */
  97318. sp_256_mont_sqr_n_8(t1, t2, 2, p256_mod, p256_mp_mod);
  97319. /* 0xd */
  97320. sp_256_mont_mul_8(t3, t1, a, p256_mod, p256_mp_mod);
  97321. /* 0xf */
  97322. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  97323. /* 0xf0 */
  97324. sp_256_mont_sqr_n_8(t1, t2, 4, p256_mod, p256_mp_mod);
  97325. /* 0xfd */
  97326. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  97327. /* 0xff */
  97328. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  97329. /* 0xff00 */
  97330. sp_256_mont_sqr_n_8(t1, t2, 8, p256_mod, p256_mp_mod);
  97331. /* 0xfffd */
  97332. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  97333. /* 0xffff */
  97334. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  97335. /* 0xffff0000 */
  97336. sp_256_mont_sqr_n_8(t1, t2, 16, p256_mod, p256_mp_mod);
  97337. /* 0xfffffffd */
  97338. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  97339. /* 0xffffffff */
  97340. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  97341. /* 0xffffffff00000000 */
  97342. sp_256_mont_sqr_n_8(t1, t2, 32, p256_mod, p256_mp_mod);
  97343. /* 0xffffffffffffffff */
  97344. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  97345. /* 0xffffffff00000001 */
  97346. sp_256_mont_mul_8(r, t1, a, p256_mod, p256_mp_mod);
  97347. /* 0xffffffff000000010000000000000000000000000000000000000000 */
  97348. sp_256_mont_sqr_n_8(r, r, 160, p256_mod, p256_mp_mod);
  97349. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff */
  97350. sp_256_mont_mul_8(r, r, t2, p256_mod, p256_mp_mod);
  97351. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff00000000 */
  97352. sp_256_mont_sqr_n_8(r, r, 32, p256_mod, p256_mp_mod);
  97353. /* 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffd */
  97354. sp_256_mont_mul_8(r, r, t3, p256_mod, p256_mp_mod);
  97355. #endif /* WOLFSSL_SP_SMALL */
  97356. }
  97357. /* Compare a with b in constant time.
  97358. *
  97359. * a A single precision integer.
  97360. * b A single precision integer.
  97361. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  97362. * respectively.
  97363. */
  97364. SP_NOINLINE static sp_int32 sp_256_cmp_8(const sp_digit* a, const sp_digit* b)
  97365. {
  97366. __asm__ __volatile__ (
  97367. "movs r2, #0\n\t"
  97368. "movs r3, #0\n\t"
  97369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97370. "mvns r3, r3\n\t"
  97371. #else
  97372. "mvn r3, r3\n\t"
  97373. #endif
  97374. "movs r6, #28\n\t"
  97375. "\n"
  97376. "L_sp_256_cmp_8_words_%=:\n\t"
  97377. "ldr r7, [%[a], r6]\n\t"
  97378. "ldr r5, [%[b], r6]\n\t"
  97379. #ifdef WOLFSSL_KEIL
  97380. "ands r7, r7, r3\n\t"
  97381. #elif defined(__clang__)
  97382. "ands r7, r3\n\t"
  97383. #else
  97384. "and r7, r3\n\t"
  97385. #endif
  97386. #ifdef WOLFSSL_KEIL
  97387. "ands r5, r5, r3\n\t"
  97388. #elif defined(__clang__)
  97389. "ands r5, r3\n\t"
  97390. #else
  97391. "and r5, r3\n\t"
  97392. #endif
  97393. "movs r4, r7\n\t"
  97394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97395. "subs r7, r7, r5\n\t"
  97396. #else
  97397. "sub r7, r7, r5\n\t"
  97398. #endif
  97399. #ifdef WOLFSSL_KEIL
  97400. "sbcs r7, r7, r7\n\t"
  97401. #elif defined(__clang__)
  97402. "sbcs r7, r7\n\t"
  97403. #else
  97404. "sbc r7, r7\n\t"
  97405. #endif
  97406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97407. "adds r2, r2, r7\n\t"
  97408. #else
  97409. "add r2, r2, r7\n\t"
  97410. #endif
  97411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97412. "mvns r7, r7\n\t"
  97413. #else
  97414. "mvn r7, r7\n\t"
  97415. #endif
  97416. #ifdef WOLFSSL_KEIL
  97417. "ands r3, r3, r7\n\t"
  97418. #elif defined(__clang__)
  97419. "ands r3, r7\n\t"
  97420. #else
  97421. "and r3, r7\n\t"
  97422. #endif
  97423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97424. "subs r5, r5, r4\n\t"
  97425. #else
  97426. "sub r5, r5, r4\n\t"
  97427. #endif
  97428. #ifdef WOLFSSL_KEIL
  97429. "sbcs r7, r7, r7\n\t"
  97430. #elif defined(__clang__)
  97431. "sbcs r7, r7\n\t"
  97432. #else
  97433. "sbc r7, r7\n\t"
  97434. #endif
  97435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97436. "subs r2, r2, r7\n\t"
  97437. #else
  97438. "sub r2, r2, r7\n\t"
  97439. #endif
  97440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97441. "mvns r7, r7\n\t"
  97442. #else
  97443. "mvn r7, r7\n\t"
  97444. #endif
  97445. #ifdef WOLFSSL_KEIL
  97446. "ands r3, r3, r7\n\t"
  97447. #elif defined(__clang__)
  97448. "ands r3, r7\n\t"
  97449. #else
  97450. "and r3, r7\n\t"
  97451. #endif
  97452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97453. "subs r6, r6, #4\n\t"
  97454. #else
  97455. "sub r6, r6, #4\n\t"
  97456. #endif
  97457. "cmp r6, #0\n\t"
  97458. "bge L_sp_256_cmp_8_words_%=\n\t"
  97459. "movs %[a], r2\n\t"
  97460. : [a] "+r" (a), [b] "+r" (b)
  97461. :
  97462. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  97463. );
  97464. return (uint32_t)(size_t)a;
  97465. }
  97466. /* Normalize the values in each word to 32.
  97467. *
  97468. * a Array of sp_digit to normalize.
  97469. */
  97470. #define sp_256_norm_8(a)
  97471. /* Map the Montgomery form projective coordinate point to an affine point.
  97472. *
  97473. * r Resulting affine coordinate point.
  97474. * p Montgomery form projective coordinate point.
  97475. * t Temporary ordinate data.
  97476. */
  97477. static void sp_256_map_8(sp_point_256* r, const sp_point_256* p,
  97478. sp_digit* t)
  97479. {
  97480. sp_digit* t1 = t;
  97481. sp_digit* t2 = t + 2*8;
  97482. sp_int32 n;
  97483. sp_256_mont_inv_8(t1, p->z, t + 2*8);
  97484. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  97485. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  97486. /* x /= z^2 */
  97487. sp_256_mont_mul_8(r->x, p->x, t2, p256_mod, p256_mp_mod);
  97488. XMEMSET(r->x + 8, 0, sizeof(r->x) / 2U);
  97489. sp_256_mont_reduce_8(r->x, p256_mod, p256_mp_mod);
  97490. /* Reduce x to less than modulus */
  97491. n = sp_256_cmp_8(r->x, p256_mod);
  97492. sp_256_cond_sub_8(r->x, r->x, p256_mod, 0 - ((n >= 0) ?
  97493. (sp_digit)1 : (sp_digit)0));
  97494. sp_256_norm_8(r->x);
  97495. /* y /= z^3 */
  97496. sp_256_mont_mul_8(r->y, p->y, t1, p256_mod, p256_mp_mod);
  97497. XMEMSET(r->y + 8, 0, sizeof(r->y) / 2U);
  97498. sp_256_mont_reduce_8(r->y, p256_mod, p256_mp_mod);
  97499. /* Reduce y to less than modulus */
  97500. n = sp_256_cmp_8(r->y, p256_mod);
  97501. sp_256_cond_sub_8(r->y, r->y, p256_mod, 0 - ((n >= 0) ?
  97502. (sp_digit)1 : (sp_digit)0));
  97503. sp_256_norm_8(r->y);
  97504. XMEMSET(r->z, 0, sizeof(r->z));
  97505. r->z[0] = 1;
  97506. }
  97507. /* Add two Montgomery form numbers (r = a + b % m).
  97508. *
  97509. * r Result of addition.
  97510. * a First number to add in Montgomery form.
  97511. * b Second number to add in Montgomery form.
  97512. * m Modulus (prime).
  97513. */
  97514. SP_NOINLINE static void sp_256_mont_add_8(sp_digit* r, const sp_digit* a,
  97515. const sp_digit* b, const sp_digit* m)
  97516. {
  97517. (void)m;
  97518. __asm__ __volatile__ (
  97519. "movs r3, #0\n\t"
  97520. "ldr r4, [%[a]]\n\t"
  97521. "ldr r5, [%[a], #4]\n\t"
  97522. "ldr r6, [%[b]]\n\t"
  97523. "ldr r7, [%[b], #4]\n\t"
  97524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97525. "adds r4, r4, r6\n\t"
  97526. #else
  97527. "add r4, r4, r6\n\t"
  97528. #endif
  97529. #ifdef WOLFSSL_KEIL
  97530. "adcs r5, r5, r7\n\t"
  97531. #elif defined(__clang__)
  97532. "adcs r5, r7\n\t"
  97533. #else
  97534. "adc r5, r7\n\t"
  97535. #endif
  97536. "str r4, [%[r]]\n\t"
  97537. "str r5, [%[r], #4]\n\t"
  97538. "ldr r4, [%[a], #8]\n\t"
  97539. "ldr r5, [%[a], #12]\n\t"
  97540. "ldr r6, [%[b], #8]\n\t"
  97541. "ldr r7, [%[b], #12]\n\t"
  97542. #ifdef WOLFSSL_KEIL
  97543. "adcs r4, r4, r6\n\t"
  97544. #elif defined(__clang__)
  97545. "adcs r4, r6\n\t"
  97546. #else
  97547. "adc r4, r6\n\t"
  97548. #endif
  97549. #ifdef WOLFSSL_KEIL
  97550. "adcs r5, r5, r7\n\t"
  97551. #elif defined(__clang__)
  97552. "adcs r5, r7\n\t"
  97553. #else
  97554. "adc r5, r7\n\t"
  97555. #endif
  97556. "str r4, [%[r], #8]\n\t"
  97557. "str r5, [%[r], #12]\n\t"
  97558. "ldr r4, [%[a], #16]\n\t"
  97559. "ldr r5, [%[a], #20]\n\t"
  97560. "ldr r6, [%[b], #16]\n\t"
  97561. "ldr r7, [%[b], #20]\n\t"
  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. #ifdef WOLFSSL_KEIL
  97570. "adcs r5, r5, r7\n\t"
  97571. #elif defined(__clang__)
  97572. "adcs r5, r7\n\t"
  97573. #else
  97574. "adc r5, r7\n\t"
  97575. #endif
  97576. "mov r8, r4\n\t"
  97577. "mov r9, r5\n\t"
  97578. "ldr r4, [%[a], #24]\n\t"
  97579. "ldr r5, [%[a], #28]\n\t"
  97580. "ldr r6, [%[b], #24]\n\t"
  97581. "ldr r7, [%[b], #28]\n\t"
  97582. #ifdef WOLFSSL_KEIL
  97583. "adcs r4, r4, r6\n\t"
  97584. #elif defined(__clang__)
  97585. "adcs r4, r6\n\t"
  97586. #else
  97587. "adc r4, r6\n\t"
  97588. #endif
  97589. #ifdef WOLFSSL_KEIL
  97590. "adcs r5, r5, r7\n\t"
  97591. #elif defined(__clang__)
  97592. "adcs r5, r7\n\t"
  97593. #else
  97594. "adc r5, r7\n\t"
  97595. #endif
  97596. "mov r10, r4\n\t"
  97597. "mov r11, r5\n\t"
  97598. #ifdef WOLFSSL_KEIL
  97599. "adcs r3, r3, r3\n\t"
  97600. #elif defined(__clang__)
  97601. "adcs r3, r3\n\t"
  97602. #else
  97603. "adc r3, r3\n\t"
  97604. #endif
  97605. "movs r6, r3\n\t"
  97606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97607. "subs r3, r3, #1\n\t"
  97608. #else
  97609. "sub r3, r3, #1\n\t"
  97610. #endif
  97611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97612. "mvns r3, r3\n\t"
  97613. #else
  97614. "mvn r3, r3\n\t"
  97615. #endif
  97616. "movs r7, #0\n\t"
  97617. "ldr r4, [%[r]]\n\t"
  97618. "ldr r5, [%[r], #4]\n\t"
  97619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97620. "subs r4, r4, r3\n\t"
  97621. #else
  97622. "sub r4, r4, r3\n\t"
  97623. #endif
  97624. #ifdef WOLFSSL_KEIL
  97625. "sbcs r5, r5, r3\n\t"
  97626. #elif defined(__clang__)
  97627. "sbcs r5, r3\n\t"
  97628. #else
  97629. "sbc r5, r3\n\t"
  97630. #endif
  97631. "str r4, [%[r]]\n\t"
  97632. "str r5, [%[r], #4]\n\t"
  97633. "ldr r4, [%[r], #8]\n\t"
  97634. "ldr r5, [%[r], #12]\n\t"
  97635. #ifdef WOLFSSL_KEIL
  97636. "sbcs r4, r4, r3\n\t"
  97637. #elif defined(__clang__)
  97638. "sbcs r4, r3\n\t"
  97639. #else
  97640. "sbc r4, r3\n\t"
  97641. #endif
  97642. #ifdef WOLFSSL_KEIL
  97643. "sbcs r5, r5, r7\n\t"
  97644. #elif defined(__clang__)
  97645. "sbcs r5, r7\n\t"
  97646. #else
  97647. "sbc r5, r7\n\t"
  97648. #endif
  97649. "str r4, [%[r], #8]\n\t"
  97650. "str r5, [%[r], #12]\n\t"
  97651. "mov r4, r8\n\t"
  97652. "mov r5, r9\n\t"
  97653. #ifdef WOLFSSL_KEIL
  97654. "sbcs r4, r4, r7\n\t"
  97655. #elif defined(__clang__)
  97656. "sbcs r4, r7\n\t"
  97657. #else
  97658. "sbc r4, r7\n\t"
  97659. #endif
  97660. #ifdef WOLFSSL_KEIL
  97661. "sbcs r5, r5, r7\n\t"
  97662. #elif defined(__clang__)
  97663. "sbcs r5, r7\n\t"
  97664. #else
  97665. "sbc r5, r7\n\t"
  97666. #endif
  97667. "str r4, [%[r], #16]\n\t"
  97668. "str r5, [%[r], #20]\n\t"
  97669. "mov r4, r10\n\t"
  97670. "mov r5, r11\n\t"
  97671. #ifdef WOLFSSL_KEIL
  97672. "sbcs r4, r4, r6\n\t"
  97673. #elif defined(__clang__)
  97674. "sbcs r4, r6\n\t"
  97675. #else
  97676. "sbc r4, r6\n\t"
  97677. #endif
  97678. #ifdef WOLFSSL_KEIL
  97679. "sbcs r5, r5, r3\n\t"
  97680. #elif defined(__clang__)
  97681. "sbcs r5, r3\n\t"
  97682. #else
  97683. "sbc r5, r3\n\t"
  97684. #endif
  97685. "str r4, [%[r], #24]\n\t"
  97686. "str r5, [%[r], #28]\n\t"
  97687. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  97688. :
  97689. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  97690. );
  97691. }
  97692. /* Double a Montgomery form number (r = a + a % m).
  97693. *
  97694. * r Result of doubling.
  97695. * a Number to double in Montgomery form.
  97696. * m Modulus (prime).
  97697. */
  97698. SP_NOINLINE static void sp_256_mont_dbl_8(sp_digit* r, const sp_digit* a,
  97699. const sp_digit* m)
  97700. {
  97701. (void)m;
  97702. __asm__ __volatile__ (
  97703. "ldr r4, [%[a]]\n\t"
  97704. "ldr r5, [%[a], #4]\n\t"
  97705. "ldr r6, [%[a], #8]\n\t"
  97706. "ldr r7, [%[a], #12]\n\t"
  97707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97708. "adds r4, r4, r4\n\t"
  97709. #else
  97710. "add r4, r4, r4\n\t"
  97711. #endif
  97712. #ifdef WOLFSSL_KEIL
  97713. "adcs r5, r5, r5\n\t"
  97714. #elif defined(__clang__)
  97715. "adcs r5, r5\n\t"
  97716. #else
  97717. "adc r5, r5\n\t"
  97718. #endif
  97719. #ifdef WOLFSSL_KEIL
  97720. "adcs r6, r6, r6\n\t"
  97721. #elif defined(__clang__)
  97722. "adcs r6, r6\n\t"
  97723. #else
  97724. "adc r6, r6\n\t"
  97725. #endif
  97726. #ifdef WOLFSSL_KEIL
  97727. "adcs r7, r7, r7\n\t"
  97728. #elif defined(__clang__)
  97729. "adcs r7, r7\n\t"
  97730. #else
  97731. "adc r7, r7\n\t"
  97732. #endif
  97733. "str r4, [%[r]]\n\t"
  97734. "str r5, [%[r], #4]\n\t"
  97735. "str r6, [%[r], #8]\n\t"
  97736. "str r7, [%[r], #12]\n\t"
  97737. "ldr r4, [%[a], #16]\n\t"
  97738. "ldr r5, [%[a], #20]\n\t"
  97739. "ldr r6, [%[a], #24]\n\t"
  97740. "ldr r7, [%[a], #28]\n\t"
  97741. #ifdef WOLFSSL_KEIL
  97742. "adcs r4, r4, r4\n\t"
  97743. #elif defined(__clang__)
  97744. "adcs r4, r4\n\t"
  97745. #else
  97746. "adc r4, r4\n\t"
  97747. #endif
  97748. #ifdef WOLFSSL_KEIL
  97749. "adcs r5, r5, r5\n\t"
  97750. #elif defined(__clang__)
  97751. "adcs r5, r5\n\t"
  97752. #else
  97753. "adc r5, r5\n\t"
  97754. #endif
  97755. #ifdef WOLFSSL_KEIL
  97756. "adcs r6, r6, r6\n\t"
  97757. #elif defined(__clang__)
  97758. "adcs r6, r6\n\t"
  97759. #else
  97760. "adc r6, r6\n\t"
  97761. #endif
  97762. #ifdef WOLFSSL_KEIL
  97763. "adcs r7, r7, r7\n\t"
  97764. #elif defined(__clang__)
  97765. "adcs r7, r7\n\t"
  97766. #else
  97767. "adc r7, r7\n\t"
  97768. #endif
  97769. "mov r8, r4\n\t"
  97770. "mov r9, r5\n\t"
  97771. "mov r10, r6\n\t"
  97772. "mov r11, r7\n\t"
  97773. "movs r3, #0\n\t"
  97774. "movs r7, #0\n\t"
  97775. #ifdef WOLFSSL_KEIL
  97776. "adcs r3, r3, r3\n\t"
  97777. #elif defined(__clang__)
  97778. "adcs r3, r3\n\t"
  97779. #else
  97780. "adc r3, r3\n\t"
  97781. #endif
  97782. "movs r2, r3\n\t"
  97783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97784. "subs r3, r3, #1\n\t"
  97785. #else
  97786. "sub r3, r3, #1\n\t"
  97787. #endif
  97788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97789. "mvns r3, r3\n\t"
  97790. #else
  97791. "mvn r3, r3\n\t"
  97792. #endif
  97793. "ldr r4, [%[r]]\n\t"
  97794. "ldr r5, [%[r], #4]\n\t"
  97795. "ldr r6, [%[r], #8]\n\t"
  97796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97797. "subs r4, r4, r3\n\t"
  97798. #else
  97799. "sub r4, r4, r3\n\t"
  97800. #endif
  97801. #ifdef WOLFSSL_KEIL
  97802. "sbcs r5, r5, r3\n\t"
  97803. #elif defined(__clang__)
  97804. "sbcs r5, r3\n\t"
  97805. #else
  97806. "sbc r5, r3\n\t"
  97807. #endif
  97808. #ifdef WOLFSSL_KEIL
  97809. "sbcs r6, r6, r3\n\t"
  97810. #elif defined(__clang__)
  97811. "sbcs r6, r3\n\t"
  97812. #else
  97813. "sbc r6, r3\n\t"
  97814. #endif
  97815. "str r4, [%[r]]\n\t"
  97816. "str r5, [%[r], #4]\n\t"
  97817. "str r6, [%[r], #8]\n\t"
  97818. "ldr r4, [%[r], #12]\n\t"
  97819. "mov r5, r8\n\t"
  97820. "mov r6, r9\n\t"
  97821. #ifdef WOLFSSL_KEIL
  97822. "sbcs r4, r4, r7\n\t"
  97823. #elif defined(__clang__)
  97824. "sbcs r4, r7\n\t"
  97825. #else
  97826. "sbc r4, r7\n\t"
  97827. #endif
  97828. #ifdef WOLFSSL_KEIL
  97829. "sbcs r5, r5, r7\n\t"
  97830. #elif defined(__clang__)
  97831. "sbcs r5, r7\n\t"
  97832. #else
  97833. "sbc r5, r7\n\t"
  97834. #endif
  97835. #ifdef WOLFSSL_KEIL
  97836. "sbcs r6, r6, r7\n\t"
  97837. #elif defined(__clang__)
  97838. "sbcs r6, r7\n\t"
  97839. #else
  97840. "sbc r6, r7\n\t"
  97841. #endif
  97842. "str r4, [%[r], #12]\n\t"
  97843. "str r5, [%[r], #16]\n\t"
  97844. "str r6, [%[r], #20]\n\t"
  97845. "mov r4, r10\n\t"
  97846. "mov r5, r11\n\t"
  97847. #ifdef WOLFSSL_KEIL
  97848. "sbcs r4, r4, r2\n\t"
  97849. #elif defined(__clang__)
  97850. "sbcs r4, r2\n\t"
  97851. #else
  97852. "sbc r4, r2\n\t"
  97853. #endif
  97854. #ifdef WOLFSSL_KEIL
  97855. "sbcs r5, r5, r3\n\t"
  97856. #elif defined(__clang__)
  97857. "sbcs r5, r3\n\t"
  97858. #else
  97859. "sbc r5, r3\n\t"
  97860. #endif
  97861. "str r4, [%[r], #24]\n\t"
  97862. "str r5, [%[r], #28]\n\t"
  97863. : [r] "+r" (r), [a] "+r" (a)
  97864. :
  97865. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  97866. );
  97867. }
  97868. /* Triple a Montgomery form number (r = a + a + a % m).
  97869. *
  97870. * r Result of Tripling.
  97871. * a Number to triple in Montgomery form.
  97872. * m Modulus (prime).
  97873. */
  97874. SP_NOINLINE static void sp_256_mont_tpl_8(sp_digit* r, const sp_digit* a,
  97875. const sp_digit* m)
  97876. {
  97877. (void)m;
  97878. __asm__ __volatile__ (
  97879. "ldr r6, [%[a]]\n\t"
  97880. "ldr r7, [%[a], #4]\n\t"
  97881. "ldr r4, [%[a], #8]\n\t"
  97882. "ldr r5, [%[a], #12]\n\t"
  97883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97884. "adds r6, r6, r6\n\t"
  97885. #else
  97886. "add r6, r6, r6\n\t"
  97887. #endif
  97888. #ifdef WOLFSSL_KEIL
  97889. "adcs r7, r7, r7\n\t"
  97890. #elif defined(__clang__)
  97891. "adcs r7, r7\n\t"
  97892. #else
  97893. "adc r7, r7\n\t"
  97894. #endif
  97895. #ifdef WOLFSSL_KEIL
  97896. "adcs r4, r4, r4\n\t"
  97897. #elif defined(__clang__)
  97898. "adcs r4, r4\n\t"
  97899. #else
  97900. "adc r4, r4\n\t"
  97901. #endif
  97902. #ifdef WOLFSSL_KEIL
  97903. "adcs r5, r5, r5\n\t"
  97904. #elif defined(__clang__)
  97905. "adcs r5, r5\n\t"
  97906. #else
  97907. "adc r5, r5\n\t"
  97908. #endif
  97909. "mov r8, r4\n\t"
  97910. "mov r9, r5\n\t"
  97911. "ldr r2, [%[a], #16]\n\t"
  97912. "ldr r3, [%[a], #20]\n\t"
  97913. "ldr r4, [%[a], #24]\n\t"
  97914. "ldr r5, [%[a], #28]\n\t"
  97915. #ifdef WOLFSSL_KEIL
  97916. "adcs r2, r2, r2\n\t"
  97917. #elif defined(__clang__)
  97918. "adcs r2, r2\n\t"
  97919. #else
  97920. "adc r2, r2\n\t"
  97921. #endif
  97922. #ifdef WOLFSSL_KEIL
  97923. "adcs r3, r3, r3\n\t"
  97924. #elif defined(__clang__)
  97925. "adcs r3, r3\n\t"
  97926. #else
  97927. "adc r3, r3\n\t"
  97928. #endif
  97929. #ifdef WOLFSSL_KEIL
  97930. "adcs r4, r4, r4\n\t"
  97931. #elif defined(__clang__)
  97932. "adcs r4, r4\n\t"
  97933. #else
  97934. "adc r4, r4\n\t"
  97935. #endif
  97936. #ifdef WOLFSSL_KEIL
  97937. "adcs r5, r5, r5\n\t"
  97938. #elif defined(__clang__)
  97939. "adcs r5, r5\n\t"
  97940. #else
  97941. "adc r5, r5\n\t"
  97942. #endif
  97943. "mov r10, r2\n\t"
  97944. "mov r11, r3\n\t"
  97945. "mov r12, r4\n\t"
  97946. "mov lr, r5\n\t"
  97947. "movs r3, #0\n\t"
  97948. "movs r5, #0\n\t"
  97949. #ifdef WOLFSSL_KEIL
  97950. "adcs r3, r3, r3\n\t"
  97951. #elif defined(__clang__)
  97952. "adcs r3, r3\n\t"
  97953. #else
  97954. "adc r3, r3\n\t"
  97955. #endif
  97956. "movs r4, r3\n\t"
  97957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97958. "subs r3, r3, #1\n\t"
  97959. #else
  97960. "sub r3, r3, #1\n\t"
  97961. #endif
  97962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97963. "mvns r3, r3\n\t"
  97964. #else
  97965. "mvn r3, r3\n\t"
  97966. #endif
  97967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97968. "subs r6, r6, r3\n\t"
  97969. #else
  97970. "sub r6, r6, r3\n\t"
  97971. #endif
  97972. #ifdef WOLFSSL_KEIL
  97973. "sbcs r7, r7, r3\n\t"
  97974. #elif defined(__clang__)
  97975. "sbcs r7, r3\n\t"
  97976. #else
  97977. "sbc r7, r3\n\t"
  97978. #endif
  97979. "mov r2, r8\n\t"
  97980. #ifdef WOLFSSL_KEIL
  97981. "sbcs r2, r2, r3\n\t"
  97982. #elif defined(__clang__)
  97983. "sbcs r2, r3\n\t"
  97984. #else
  97985. "sbc r2, r3\n\t"
  97986. #endif
  97987. "mov r8, r2\n\t"
  97988. "mov r2, r9\n\t"
  97989. #ifdef WOLFSSL_KEIL
  97990. "sbcs r2, r2, r5\n\t"
  97991. #elif defined(__clang__)
  97992. "sbcs r2, r5\n\t"
  97993. #else
  97994. "sbc r2, r5\n\t"
  97995. #endif
  97996. "mov r9, r2\n\t"
  97997. "mov r2, r10\n\t"
  97998. #ifdef WOLFSSL_KEIL
  97999. "sbcs r2, r2, r5\n\t"
  98000. #elif defined(__clang__)
  98001. "sbcs r2, r5\n\t"
  98002. #else
  98003. "sbc r2, r5\n\t"
  98004. #endif
  98005. "mov r10, r2\n\t"
  98006. "mov r2, r11\n\t"
  98007. #ifdef WOLFSSL_KEIL
  98008. "sbcs r2, r2, r5\n\t"
  98009. #elif defined(__clang__)
  98010. "sbcs r2, r5\n\t"
  98011. #else
  98012. "sbc r2, r5\n\t"
  98013. #endif
  98014. "mov r11, r2\n\t"
  98015. "mov r2, r12\n\t"
  98016. #ifdef WOLFSSL_KEIL
  98017. "sbcs r2, r2, r4\n\t"
  98018. #elif defined(__clang__)
  98019. "sbcs r2, r4\n\t"
  98020. #else
  98021. "sbc r2, r4\n\t"
  98022. #endif
  98023. "mov r12, r2\n\t"
  98024. "mov r2, lr\n\t"
  98025. #ifdef WOLFSSL_KEIL
  98026. "sbcs r2, r2, r3\n\t"
  98027. #elif defined(__clang__)
  98028. "sbcs r2, r3\n\t"
  98029. #else
  98030. "sbc r2, r3\n\t"
  98031. #endif
  98032. "mov lr, r2\n\t"
  98033. "ldr r2, [%[a]]\n\t"
  98034. "ldr r3, [%[a], #4]\n\t"
  98035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98036. "adds r6, r6, r2\n\t"
  98037. #else
  98038. "add r6, r6, r2\n\t"
  98039. #endif
  98040. #ifdef WOLFSSL_KEIL
  98041. "adcs r7, r7, r3\n\t"
  98042. #elif defined(__clang__)
  98043. "adcs r7, r3\n\t"
  98044. #else
  98045. "adc r7, r3\n\t"
  98046. #endif
  98047. "ldr r2, [%[a], #8]\n\t"
  98048. "ldr r3, [%[a], #12]\n\t"
  98049. "mov r4, r8\n\t"
  98050. "mov r5, r9\n\t"
  98051. #ifdef WOLFSSL_KEIL
  98052. "adcs r2, r2, r4\n\t"
  98053. #elif defined(__clang__)
  98054. "adcs r2, r4\n\t"
  98055. #else
  98056. "adc r2, r4\n\t"
  98057. #endif
  98058. #ifdef WOLFSSL_KEIL
  98059. "adcs r3, r3, r5\n\t"
  98060. #elif defined(__clang__)
  98061. "adcs r3, r5\n\t"
  98062. #else
  98063. "adc r3, r5\n\t"
  98064. #endif
  98065. "mov r8, r2\n\t"
  98066. "mov r9, r3\n\t"
  98067. "ldr r2, [%[a], #16]\n\t"
  98068. "ldr r3, [%[a], #20]\n\t"
  98069. "mov r4, r10\n\t"
  98070. "mov r5, r11\n\t"
  98071. #ifdef WOLFSSL_KEIL
  98072. "adcs r2, r2, r4\n\t"
  98073. #elif defined(__clang__)
  98074. "adcs r2, r4\n\t"
  98075. #else
  98076. "adc r2, r4\n\t"
  98077. #endif
  98078. #ifdef WOLFSSL_KEIL
  98079. "adcs r3, r3, r5\n\t"
  98080. #elif defined(__clang__)
  98081. "adcs r3, r5\n\t"
  98082. #else
  98083. "adc r3, r5\n\t"
  98084. #endif
  98085. "mov r10, r2\n\t"
  98086. "mov r11, r3\n\t"
  98087. "ldr r2, [%[a], #24]\n\t"
  98088. "ldr r3, [%[a], #28]\n\t"
  98089. "mov r4, r12\n\t"
  98090. "mov r5, lr\n\t"
  98091. #ifdef WOLFSSL_KEIL
  98092. "adcs r2, r2, r4\n\t"
  98093. #elif defined(__clang__)
  98094. "adcs r2, r4\n\t"
  98095. #else
  98096. "adc r2, r4\n\t"
  98097. #endif
  98098. #ifdef WOLFSSL_KEIL
  98099. "adcs r3, r3, r5\n\t"
  98100. #elif defined(__clang__)
  98101. "adcs r3, r5\n\t"
  98102. #else
  98103. "adc r3, r5\n\t"
  98104. #endif
  98105. "mov r12, r2\n\t"
  98106. "mov lr, r3\n\t"
  98107. "movs r3, #0\n\t"
  98108. "movs r5, #0\n\t"
  98109. #ifdef WOLFSSL_KEIL
  98110. "adcs r3, r3, r3\n\t"
  98111. #elif defined(__clang__)
  98112. "adcs r3, r3\n\t"
  98113. #else
  98114. "adc r3, r3\n\t"
  98115. #endif
  98116. "movs r4, r3\n\t"
  98117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98118. "subs r3, r3, #1\n\t"
  98119. #else
  98120. "sub r3, r3, #1\n\t"
  98121. #endif
  98122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98123. "mvns r3, r3\n\t"
  98124. #else
  98125. "mvn r3, r3\n\t"
  98126. #endif
  98127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98128. "subs r6, r6, r3\n\t"
  98129. #else
  98130. "sub r6, r6, r3\n\t"
  98131. #endif
  98132. "str r6, [%[r]]\n\t"
  98133. #ifdef WOLFSSL_KEIL
  98134. "sbcs r7, r7, r3\n\t"
  98135. #elif defined(__clang__)
  98136. "sbcs r7, r3\n\t"
  98137. #else
  98138. "sbc r7, r3\n\t"
  98139. #endif
  98140. "str r7, [%[r], #4]\n\t"
  98141. "mov r2, r8\n\t"
  98142. #ifdef WOLFSSL_KEIL
  98143. "sbcs r2, r2, r3\n\t"
  98144. #elif defined(__clang__)
  98145. "sbcs r2, r3\n\t"
  98146. #else
  98147. "sbc r2, r3\n\t"
  98148. #endif
  98149. "str r2, [%[r], #8]\n\t"
  98150. "mov r2, r9\n\t"
  98151. #ifdef WOLFSSL_KEIL
  98152. "sbcs r2, r2, r5\n\t"
  98153. #elif defined(__clang__)
  98154. "sbcs r2, r5\n\t"
  98155. #else
  98156. "sbc r2, r5\n\t"
  98157. #endif
  98158. "str r2, [%[r], #12]\n\t"
  98159. "mov r2, r10\n\t"
  98160. #ifdef WOLFSSL_KEIL
  98161. "sbcs r2, r2, r5\n\t"
  98162. #elif defined(__clang__)
  98163. "sbcs r2, r5\n\t"
  98164. #else
  98165. "sbc r2, r5\n\t"
  98166. #endif
  98167. "str r2, [%[r], #16]\n\t"
  98168. "mov r2, r11\n\t"
  98169. #ifdef WOLFSSL_KEIL
  98170. "sbcs r2, r2, r5\n\t"
  98171. #elif defined(__clang__)
  98172. "sbcs r2, r5\n\t"
  98173. #else
  98174. "sbc r2, r5\n\t"
  98175. #endif
  98176. "str r2, [%[r], #20]\n\t"
  98177. "mov r2, r12\n\t"
  98178. #ifdef WOLFSSL_KEIL
  98179. "sbcs r2, r2, r4\n\t"
  98180. #elif defined(__clang__)
  98181. "sbcs r2, r4\n\t"
  98182. #else
  98183. "sbc r2, r4\n\t"
  98184. #endif
  98185. "str r2, [%[r], #24]\n\t"
  98186. "mov r2, lr\n\t"
  98187. #ifdef WOLFSSL_KEIL
  98188. "sbcs r2, r2, r3\n\t"
  98189. #elif defined(__clang__)
  98190. "sbcs r2, r3\n\t"
  98191. #else
  98192. "sbc r2, r3\n\t"
  98193. #endif
  98194. "str r2, [%[r], #28]\n\t"
  98195. : [r] "+r" (r), [a] "+r" (a)
  98196. :
  98197. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  98198. );
  98199. }
  98200. /* Subtract two Montgomery form numbers (r = a - b % m).
  98201. *
  98202. * r Result of subtration.
  98203. * a Number to subtract from in Montgomery form.
  98204. * b Number to subtract with in Montgomery form.
  98205. * m Modulus (prime).
  98206. */
  98207. SP_NOINLINE static void sp_256_mont_sub_8(sp_digit* r, const sp_digit* a,
  98208. const sp_digit* b, const sp_digit* m)
  98209. {
  98210. (void)m;
  98211. __asm__ __volatile__ (
  98212. "ldr r4, [%[a]]\n\t"
  98213. "ldr r5, [%[a], #4]\n\t"
  98214. "ldr r6, [%[b]]\n\t"
  98215. "ldr r7, [%[b], #4]\n\t"
  98216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98217. "subs r4, r4, r6\n\t"
  98218. #else
  98219. "sub r4, r4, r6\n\t"
  98220. #endif
  98221. #ifdef WOLFSSL_KEIL
  98222. "sbcs r5, r5, r7\n\t"
  98223. #elif defined(__clang__)
  98224. "sbcs r5, r7\n\t"
  98225. #else
  98226. "sbc r5, r7\n\t"
  98227. #endif
  98228. "str r4, [%[r]]\n\t"
  98229. "str r5, [%[r], #4]\n\t"
  98230. "ldr r4, [%[a], #8]\n\t"
  98231. "ldr r5, [%[a], #12]\n\t"
  98232. "ldr r6, [%[b], #8]\n\t"
  98233. "ldr r7, [%[b], #12]\n\t"
  98234. #ifdef WOLFSSL_KEIL
  98235. "sbcs r4, r4, r6\n\t"
  98236. #elif defined(__clang__)
  98237. "sbcs r4, r6\n\t"
  98238. #else
  98239. "sbc r4, r6\n\t"
  98240. #endif
  98241. #ifdef WOLFSSL_KEIL
  98242. "sbcs r5, r5, r7\n\t"
  98243. #elif defined(__clang__)
  98244. "sbcs r5, r7\n\t"
  98245. #else
  98246. "sbc r5, r7\n\t"
  98247. #endif
  98248. "str r4, [%[r], #8]\n\t"
  98249. "str r5, [%[r], #12]\n\t"
  98250. "ldr r4, [%[a], #16]\n\t"
  98251. "ldr r5, [%[a], #20]\n\t"
  98252. "ldr r6, [%[b], #16]\n\t"
  98253. "ldr r7, [%[b], #20]\n\t"
  98254. #ifdef WOLFSSL_KEIL
  98255. "sbcs r4, r4, r6\n\t"
  98256. #elif defined(__clang__)
  98257. "sbcs r4, r6\n\t"
  98258. #else
  98259. "sbc r4, r6\n\t"
  98260. #endif
  98261. #ifdef WOLFSSL_KEIL
  98262. "sbcs r5, r5, r7\n\t"
  98263. #elif defined(__clang__)
  98264. "sbcs r5, r7\n\t"
  98265. #else
  98266. "sbc r5, r7\n\t"
  98267. #endif
  98268. "mov r8, r4\n\t"
  98269. "mov r9, r5\n\t"
  98270. "ldr r4, [%[a], #24]\n\t"
  98271. "ldr r5, [%[a], #28]\n\t"
  98272. "ldr r6, [%[b], #24]\n\t"
  98273. "ldr r7, [%[b], #28]\n\t"
  98274. #ifdef WOLFSSL_KEIL
  98275. "sbcs r4, r4, r6\n\t"
  98276. #elif defined(__clang__)
  98277. "sbcs r4, r6\n\t"
  98278. #else
  98279. "sbc r4, r6\n\t"
  98280. #endif
  98281. #ifdef WOLFSSL_KEIL
  98282. "sbcs r5, r5, r7\n\t"
  98283. #elif defined(__clang__)
  98284. "sbcs r5, r7\n\t"
  98285. #else
  98286. "sbc r5, r7\n\t"
  98287. #endif
  98288. "mov r10, r4\n\t"
  98289. "mov r11, r5\n\t"
  98290. #ifdef WOLFSSL_KEIL
  98291. "sbcs r3, r3, r3\n\t"
  98292. #elif defined(__clang__)
  98293. "sbcs r3, r3\n\t"
  98294. #else
  98295. "sbc r3, r3\n\t"
  98296. #endif
  98297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98298. "lsrs r7, r3, #31\n\t"
  98299. #else
  98300. "lsr r7, r3, #31\n\t"
  98301. #endif
  98302. "movs r6, #0\n\t"
  98303. "ldr r4, [%[r]]\n\t"
  98304. "ldr r5, [%[r], #4]\n\t"
  98305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98306. "adds r4, r4, r3\n\t"
  98307. #else
  98308. "add r4, r4, r3\n\t"
  98309. #endif
  98310. #ifdef WOLFSSL_KEIL
  98311. "adcs r5, r5, r3\n\t"
  98312. #elif defined(__clang__)
  98313. "adcs r5, r3\n\t"
  98314. #else
  98315. "adc r5, r3\n\t"
  98316. #endif
  98317. "str r4, [%[r]]\n\t"
  98318. "str r5, [%[r], #4]\n\t"
  98319. "ldr r4, [%[r], #8]\n\t"
  98320. "ldr r5, [%[r], #12]\n\t"
  98321. #ifdef WOLFSSL_KEIL
  98322. "adcs r4, r4, r3\n\t"
  98323. #elif defined(__clang__)
  98324. "adcs r4, r3\n\t"
  98325. #else
  98326. "adc r4, r3\n\t"
  98327. #endif
  98328. #ifdef WOLFSSL_KEIL
  98329. "adcs r5, r5, r6\n\t"
  98330. #elif defined(__clang__)
  98331. "adcs r5, r6\n\t"
  98332. #else
  98333. "adc r5, r6\n\t"
  98334. #endif
  98335. "str r4, [%[r], #8]\n\t"
  98336. "str r5, [%[r], #12]\n\t"
  98337. "mov r4, r8\n\t"
  98338. "mov r5, r9\n\t"
  98339. #ifdef WOLFSSL_KEIL
  98340. "adcs r4, r4, r6\n\t"
  98341. #elif defined(__clang__)
  98342. "adcs r4, r6\n\t"
  98343. #else
  98344. "adc r4, r6\n\t"
  98345. #endif
  98346. #ifdef WOLFSSL_KEIL
  98347. "adcs r5, r5, r6\n\t"
  98348. #elif defined(__clang__)
  98349. "adcs r5, r6\n\t"
  98350. #else
  98351. "adc r5, r6\n\t"
  98352. #endif
  98353. "str r4, [%[r], #16]\n\t"
  98354. "str r5, [%[r], #20]\n\t"
  98355. "mov r4, r10\n\t"
  98356. "mov r5, r11\n\t"
  98357. #ifdef WOLFSSL_KEIL
  98358. "adcs r4, r4, r7\n\t"
  98359. #elif defined(__clang__)
  98360. "adcs r4, r7\n\t"
  98361. #else
  98362. "adc r4, r7\n\t"
  98363. #endif
  98364. #ifdef WOLFSSL_KEIL
  98365. "adcs r5, r5, r3\n\t"
  98366. #elif defined(__clang__)
  98367. "adcs r5, r3\n\t"
  98368. #else
  98369. "adc r5, r3\n\t"
  98370. #endif
  98371. "str r4, [%[r], #24]\n\t"
  98372. "str r5, [%[r], #28]\n\t"
  98373. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  98374. :
  98375. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  98376. );
  98377. }
  98378. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  98379. *
  98380. * r Result of division by 2.
  98381. * a Number to divide.
  98382. * m Modulus (prime).
  98383. */
  98384. SP_NOINLINE static void sp_256_div2_8(sp_digit* r, const sp_digit* a,
  98385. const sp_digit* m)
  98386. {
  98387. (void)m;
  98388. __asm__ __volatile__ (
  98389. "ldr r6, [%[a]]\n\t"
  98390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98391. "lsls r6, r6, #31\n\t"
  98392. #else
  98393. "lsl r6, r6, #31\n\t"
  98394. #endif
  98395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98396. "lsrs r6, r6, #31\n\t"
  98397. #else
  98398. "lsr r6, r6, #31\n\t"
  98399. #endif
  98400. "movs r4, #0\n\t"
  98401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98402. "subs r4, r4, r6\n\t"
  98403. #else
  98404. "sub r4, r4, r6\n\t"
  98405. #endif
  98406. "movs r6, #0\n\t"
  98407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98408. "lsls r5, r4, #31\n\t"
  98409. #else
  98410. "lsl r5, r4, #31\n\t"
  98411. #endif
  98412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98413. "lsrs r5, r5, #31\n\t"
  98414. #else
  98415. "lsr r5, r5, #31\n\t"
  98416. #endif
  98417. "ldr r2, [%[a]]\n\t"
  98418. "ldr r3, [%[a], #4]\n\t"
  98419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98420. "adds r2, r2, r4\n\t"
  98421. #else
  98422. "add r2, r2, r4\n\t"
  98423. #endif
  98424. #ifdef WOLFSSL_KEIL
  98425. "adcs r3, r3, r4\n\t"
  98426. #elif defined(__clang__)
  98427. "adcs r3, r4\n\t"
  98428. #else
  98429. "adc r3, r4\n\t"
  98430. #endif
  98431. "str r2, [%[r]]\n\t"
  98432. "str r3, [%[r], #4]\n\t"
  98433. "ldr r2, [%[a], #8]\n\t"
  98434. "ldr r3, [%[a], #12]\n\t"
  98435. #ifdef WOLFSSL_KEIL
  98436. "adcs r2, r2, r4\n\t"
  98437. #elif defined(__clang__)
  98438. "adcs r2, r4\n\t"
  98439. #else
  98440. "adc r2, r4\n\t"
  98441. #endif
  98442. #ifdef WOLFSSL_KEIL
  98443. "adcs r3, r3, r6\n\t"
  98444. #elif defined(__clang__)
  98445. "adcs r3, r6\n\t"
  98446. #else
  98447. "adc r3, r6\n\t"
  98448. #endif
  98449. "str r2, [%[r], #8]\n\t"
  98450. "str r3, [%[r], #12]\n\t"
  98451. "ldr r2, [%[a], #16]\n\t"
  98452. "ldr r3, [%[a], #20]\n\t"
  98453. #ifdef WOLFSSL_KEIL
  98454. "adcs r2, r2, r6\n\t"
  98455. #elif defined(__clang__)
  98456. "adcs r2, r6\n\t"
  98457. #else
  98458. "adc r2, r6\n\t"
  98459. #endif
  98460. #ifdef WOLFSSL_KEIL
  98461. "adcs r3, r3, r6\n\t"
  98462. #elif defined(__clang__)
  98463. "adcs r3, r6\n\t"
  98464. #else
  98465. "adc r3, r6\n\t"
  98466. #endif
  98467. "str r2, [%[r], #16]\n\t"
  98468. "str r3, [%[r], #20]\n\t"
  98469. "ldr r2, [%[a], #24]\n\t"
  98470. "ldr r3, [%[a], #28]\n\t"
  98471. #ifdef WOLFSSL_KEIL
  98472. "adcs r2, r2, r5\n\t"
  98473. #elif defined(__clang__)
  98474. "adcs r2, r5\n\t"
  98475. #else
  98476. "adc r2, r5\n\t"
  98477. #endif
  98478. #ifdef WOLFSSL_KEIL
  98479. "adcs r3, r3, r4\n\t"
  98480. #elif defined(__clang__)
  98481. "adcs r3, r4\n\t"
  98482. #else
  98483. "adc r3, r4\n\t"
  98484. #endif
  98485. #ifdef WOLFSSL_KEIL
  98486. "adcs r6, r6, r6\n\t"
  98487. #elif defined(__clang__)
  98488. "adcs r6, r6\n\t"
  98489. #else
  98490. "adc r6, r6\n\t"
  98491. #endif
  98492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98493. "lsls r6, r6, #31\n\t"
  98494. #else
  98495. "lsl r6, r6, #31\n\t"
  98496. #endif
  98497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98498. "lsrs r4, r2, #1\n\t"
  98499. #else
  98500. "lsr r4, r2, #1\n\t"
  98501. #endif
  98502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98503. "lsls r2, r2, #31\n\t"
  98504. #else
  98505. "lsl r2, r2, #31\n\t"
  98506. #endif
  98507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98508. "lsrs r5, r3, #1\n\t"
  98509. #else
  98510. "lsr r5, r3, #1\n\t"
  98511. #endif
  98512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98513. "lsls r3, r3, #31\n\t"
  98514. #else
  98515. "lsl r3, r3, #31\n\t"
  98516. #endif
  98517. #ifdef WOLFSSL_KEIL
  98518. "orrs r4, r4, r3\n\t"
  98519. #elif defined(__clang__)
  98520. "orrs r4, r3\n\t"
  98521. #else
  98522. "orr r4, r3\n\t"
  98523. #endif
  98524. #ifdef WOLFSSL_KEIL
  98525. "orrs r5, r5, r6\n\t"
  98526. #elif defined(__clang__)
  98527. "orrs r5, r6\n\t"
  98528. #else
  98529. "orr r5, r6\n\t"
  98530. #endif
  98531. "movs r6, r2\n\t"
  98532. "str r4, [%[r], #24]\n\t"
  98533. "str r5, [%[r], #28]\n\t"
  98534. "ldr r2, [%[r], #16]\n\t"
  98535. "ldr r3, [%[r], #20]\n\t"
  98536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98537. "lsrs r4, r2, #1\n\t"
  98538. #else
  98539. "lsr r4, r2, #1\n\t"
  98540. #endif
  98541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98542. "lsls r2, r2, #31\n\t"
  98543. #else
  98544. "lsl r2, r2, #31\n\t"
  98545. #endif
  98546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98547. "lsrs r5, r3, #1\n\t"
  98548. #else
  98549. "lsr r5, r3, #1\n\t"
  98550. #endif
  98551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98552. "lsls r3, r3, #31\n\t"
  98553. #else
  98554. "lsl r3, r3, #31\n\t"
  98555. #endif
  98556. #ifdef WOLFSSL_KEIL
  98557. "orrs r4, r4, r3\n\t"
  98558. #elif defined(__clang__)
  98559. "orrs r4, r3\n\t"
  98560. #else
  98561. "orr r4, r3\n\t"
  98562. #endif
  98563. #ifdef WOLFSSL_KEIL
  98564. "orrs r5, r5, r6\n\t"
  98565. #elif defined(__clang__)
  98566. "orrs r5, r6\n\t"
  98567. #else
  98568. "orr r5, r6\n\t"
  98569. #endif
  98570. "movs r6, r2\n\t"
  98571. "str r4, [%[r], #16]\n\t"
  98572. "str r5, [%[r], #20]\n\t"
  98573. "ldr r2, [%[r], #8]\n\t"
  98574. "ldr r3, [%[r], #12]\n\t"
  98575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98576. "lsrs r4, r2, #1\n\t"
  98577. #else
  98578. "lsr r4, r2, #1\n\t"
  98579. #endif
  98580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98581. "lsls r2, r2, #31\n\t"
  98582. #else
  98583. "lsl r2, r2, #31\n\t"
  98584. #endif
  98585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98586. "lsrs r5, r3, #1\n\t"
  98587. #else
  98588. "lsr r5, r3, #1\n\t"
  98589. #endif
  98590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98591. "lsls r3, r3, #31\n\t"
  98592. #else
  98593. "lsl r3, r3, #31\n\t"
  98594. #endif
  98595. #ifdef WOLFSSL_KEIL
  98596. "orrs r4, r4, r3\n\t"
  98597. #elif defined(__clang__)
  98598. "orrs r4, r3\n\t"
  98599. #else
  98600. "orr r4, r3\n\t"
  98601. #endif
  98602. #ifdef WOLFSSL_KEIL
  98603. "orrs r5, r5, r6\n\t"
  98604. #elif defined(__clang__)
  98605. "orrs r5, r6\n\t"
  98606. #else
  98607. "orr r5, r6\n\t"
  98608. #endif
  98609. "movs r6, r2\n\t"
  98610. "str r4, [%[r], #8]\n\t"
  98611. "str r5, [%[r], #12]\n\t"
  98612. "ldr r2, [%[r]]\n\t"
  98613. "ldr r3, [%[r], #4]\n\t"
  98614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98615. "lsrs r4, r2, #1\n\t"
  98616. #else
  98617. "lsr r4, r2, #1\n\t"
  98618. #endif
  98619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98620. "lsrs r5, r3, #1\n\t"
  98621. #else
  98622. "lsr r5, r3, #1\n\t"
  98623. #endif
  98624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98625. "lsls r3, r3, #31\n\t"
  98626. #else
  98627. "lsl r3, r3, #31\n\t"
  98628. #endif
  98629. #ifdef WOLFSSL_KEIL
  98630. "orrs r4, r4, r3\n\t"
  98631. #elif defined(__clang__)
  98632. "orrs r4, r3\n\t"
  98633. #else
  98634. "orr r4, r3\n\t"
  98635. #endif
  98636. #ifdef WOLFSSL_KEIL
  98637. "orrs r5, r5, r6\n\t"
  98638. #elif defined(__clang__)
  98639. "orrs r5, r6\n\t"
  98640. #else
  98641. "orr r5, r6\n\t"
  98642. #endif
  98643. "str r4, [%[r]]\n\t"
  98644. "str r5, [%[r], #4]\n\t"
  98645. : [r] "+r" (r), [a] "+r" (a)
  98646. :
  98647. : "memory", "r2", "r3", "r4", "r5", "r6"
  98648. );
  98649. }
  98650. /* Double the Montgomery form projective point p.
  98651. *
  98652. * r Result of doubling point.
  98653. * p Point to double.
  98654. * t Temporary ordinate data.
  98655. */
  98656. #ifdef WOLFSSL_SP_NONBLOCK
  98657. typedef struct sp_256_proj_point_dbl_8_ctx {
  98658. int state;
  98659. sp_digit* t1;
  98660. sp_digit* t2;
  98661. sp_digit* x;
  98662. sp_digit* y;
  98663. sp_digit* z;
  98664. } sp_256_proj_point_dbl_8_ctx;
  98665. static int sp_256_proj_point_dbl_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, const sp_point_256* p, sp_digit* t)
  98666. {
  98667. int err = FP_WOULDBLOCK;
  98668. sp_256_proj_point_dbl_8_ctx* ctx = (sp_256_proj_point_dbl_8_ctx*)sp_ctx->data;
  98669. typedef char ctx_size_test[sizeof(sp_256_proj_point_dbl_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  98670. (void)sizeof(ctx_size_test);
  98671. switch (ctx->state) {
  98672. case 0:
  98673. ctx->t1 = t;
  98674. ctx->t2 = t + 2*8;
  98675. ctx->x = r->x;
  98676. ctx->y = r->y;
  98677. ctx->z = r->z;
  98678. /* Put infinity into result. */
  98679. if (r != p) {
  98680. r->infinity = p->infinity;
  98681. }
  98682. ctx->state = 1;
  98683. break;
  98684. case 1:
  98685. /* T1 = Z * Z */
  98686. sp_256_mont_sqr_8(ctx->t1, p->z, p256_mod, p256_mp_mod);
  98687. ctx->state = 2;
  98688. break;
  98689. case 2:
  98690. /* Z = Y * Z */
  98691. sp_256_mont_mul_8(ctx->z, p->y, p->z, p256_mod, p256_mp_mod);
  98692. ctx->state = 3;
  98693. break;
  98694. case 3:
  98695. /* Z = 2Z */
  98696. sp_256_mont_dbl_8(ctx->z, ctx->z, p256_mod);
  98697. ctx->state = 4;
  98698. break;
  98699. case 4:
  98700. /* T2 = X - T1 */
  98701. sp_256_mont_sub_8(ctx->t2, p->x, ctx->t1, p256_mod);
  98702. ctx->state = 5;
  98703. break;
  98704. case 5:
  98705. /* T1 = X + T1 */
  98706. sp_256_mont_add_8(ctx->t1, p->x, ctx->t1, p256_mod);
  98707. ctx->state = 6;
  98708. break;
  98709. case 6:
  98710. /* T2 = T1 * T2 */
  98711. sp_256_mont_mul_8(ctx->t2, ctx->t1, ctx->t2, p256_mod, p256_mp_mod);
  98712. ctx->state = 7;
  98713. break;
  98714. case 7:
  98715. /* T1 = 3T2 */
  98716. sp_256_mont_tpl_8(ctx->t1, ctx->t2, p256_mod);
  98717. ctx->state = 8;
  98718. break;
  98719. case 8:
  98720. /* Y = 2Y */
  98721. sp_256_mont_dbl_8(ctx->y, p->y, p256_mod);
  98722. ctx->state = 9;
  98723. break;
  98724. case 9:
  98725. /* Y = Y * Y */
  98726. sp_256_mont_sqr_8(ctx->y, ctx->y, p256_mod, p256_mp_mod);
  98727. ctx->state = 10;
  98728. break;
  98729. case 10:
  98730. /* T2 = Y * Y */
  98731. sp_256_mont_sqr_8(ctx->t2, ctx->y, p256_mod, p256_mp_mod);
  98732. ctx->state = 11;
  98733. break;
  98734. case 11:
  98735. /* T2 = T2/2 */
  98736. sp_256_div2_8(ctx->t2, ctx->t2, p256_mod);
  98737. ctx->state = 12;
  98738. break;
  98739. case 12:
  98740. /* Y = Y * X */
  98741. sp_256_mont_mul_8(ctx->y, ctx->y, p->x, p256_mod, p256_mp_mod);
  98742. ctx->state = 13;
  98743. break;
  98744. case 13:
  98745. /* X = T1 * T1 */
  98746. sp_256_mont_sqr_8(ctx->x, ctx->t1, p256_mod, p256_mp_mod);
  98747. ctx->state = 14;
  98748. break;
  98749. case 14:
  98750. /* X = X - Y */
  98751. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  98752. ctx->state = 15;
  98753. break;
  98754. case 15:
  98755. /* X = X - Y */
  98756. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  98757. ctx->state = 16;
  98758. break;
  98759. case 16:
  98760. /* Y = Y - X */
  98761. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod);
  98762. ctx->state = 17;
  98763. break;
  98764. case 17:
  98765. /* Y = Y * T1 */
  98766. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t1, p256_mod, p256_mp_mod);
  98767. ctx->state = 18;
  98768. break;
  98769. case 18:
  98770. /* Y = Y - T2 */
  98771. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t2, p256_mod);
  98772. ctx->state = 19;
  98773. /* fall-through */
  98774. case 19:
  98775. err = MP_OKAY;
  98776. break;
  98777. }
  98778. if (err == MP_OKAY && ctx->state != 19) {
  98779. err = FP_WOULDBLOCK;
  98780. }
  98781. return err;
  98782. }
  98783. #endif /* WOLFSSL_SP_NONBLOCK */
  98784. static void sp_256_proj_point_dbl_8(sp_point_256* r, const sp_point_256* p, sp_digit* t)
  98785. {
  98786. sp_digit* t1 = t;
  98787. sp_digit* t2 = t + 2*8;
  98788. sp_digit* x;
  98789. sp_digit* y;
  98790. sp_digit* z;
  98791. x = r->x;
  98792. y = r->y;
  98793. z = r->z;
  98794. /* Put infinity into result. */
  98795. if (r != p) {
  98796. r->infinity = p->infinity;
  98797. }
  98798. /* T1 = Z * Z */
  98799. sp_256_mont_sqr_8(t1, p->z, p256_mod, p256_mp_mod);
  98800. /* Z = Y * Z */
  98801. sp_256_mont_mul_8(z, p->y, p->z, p256_mod, p256_mp_mod);
  98802. /* Z = 2Z */
  98803. sp_256_mont_dbl_8(z, z, p256_mod);
  98804. /* T2 = X - T1 */
  98805. sp_256_mont_sub_8(t2, p->x, t1, p256_mod);
  98806. /* T1 = X + T1 */
  98807. sp_256_mont_add_8(t1, p->x, t1, p256_mod);
  98808. /* T2 = T1 * T2 */
  98809. sp_256_mont_mul_8(t2, t1, t2, p256_mod, p256_mp_mod);
  98810. /* T1 = 3T2 */
  98811. sp_256_mont_tpl_8(t1, t2, p256_mod);
  98812. /* Y = 2Y */
  98813. sp_256_mont_dbl_8(y, p->y, p256_mod);
  98814. /* Y = Y * Y */
  98815. sp_256_mont_sqr_8(y, y, p256_mod, p256_mp_mod);
  98816. /* T2 = Y * Y */
  98817. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  98818. /* T2 = T2/2 */
  98819. sp_256_div2_8(t2, t2, p256_mod);
  98820. /* Y = Y * X */
  98821. sp_256_mont_mul_8(y, y, p->x, p256_mod, p256_mp_mod);
  98822. /* X = T1 * T1 */
  98823. sp_256_mont_sqr_8(x, t1, p256_mod, p256_mp_mod);
  98824. /* X = X - Y */
  98825. sp_256_mont_sub_8(x, x, y, p256_mod);
  98826. /* X = X - Y */
  98827. sp_256_mont_sub_8(x, x, y, p256_mod);
  98828. /* Y = Y - X */
  98829. sp_256_mont_sub_8(y, y, x, p256_mod);
  98830. /* Y = Y * T1 */
  98831. sp_256_mont_mul_8(y, y, t1, p256_mod, p256_mp_mod);
  98832. /* Y = Y - T2 */
  98833. sp_256_mont_sub_8(y, y, t2, p256_mod);
  98834. }
  98835. /* Compare two numbers to determine if they are equal.
  98836. * Constant time implementation.
  98837. *
  98838. * a First number to compare.
  98839. * b Second number to compare.
  98840. * returns 1 when equal and 0 otherwise.
  98841. */
  98842. static int sp_256_cmp_equal_8(const sp_digit* a, const sp_digit* b)
  98843. {
  98844. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  98845. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  98846. (a[6] ^ b[6]) | (a[7] ^ b[7])) == 0;
  98847. }
  98848. /* Add two Montgomery form projective points.
  98849. *
  98850. * r Result of addition.
  98851. * p First point to add.
  98852. * q Second point to add.
  98853. * t Temporary ordinate data.
  98854. */
  98855. #ifdef WOLFSSL_SP_NONBLOCK
  98856. typedef struct sp_256_proj_point_add_8_ctx {
  98857. int state;
  98858. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  98859. const sp_point_256* ap[2];
  98860. sp_point_256* rp[2];
  98861. sp_digit* t1;
  98862. sp_digit* t2;
  98863. sp_digit* t3;
  98864. sp_digit* t4;
  98865. sp_digit* t5;
  98866. sp_digit* x;
  98867. sp_digit* y;
  98868. sp_digit* z;
  98869. } sp_256_proj_point_add_8_ctx;
  98870. static int sp_256_proj_point_add_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r,
  98871. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  98872. {
  98873. int err = FP_WOULDBLOCK;
  98874. sp_256_proj_point_add_8_ctx* ctx = (sp_256_proj_point_add_8_ctx*)sp_ctx->data;
  98875. /* Ensure only the first point is the same as the result. */
  98876. if (q == r) {
  98877. const sp_point_256* a = p;
  98878. p = q;
  98879. q = a;
  98880. }
  98881. typedef char ctx_size_test[sizeof(sp_256_proj_point_add_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  98882. (void)sizeof(ctx_size_test);
  98883. switch (ctx->state) {
  98884. case 0: /* INIT */
  98885. ctx->t1 = t;
  98886. ctx->t2 = t + 2*8;
  98887. ctx->t3 = t + 4*8;
  98888. ctx->t4 = t + 6*8;
  98889. ctx->t5 = t + 8*8;
  98890. ctx->state = 1;
  98891. break;
  98892. case 1:
  98893. /* Check double */
  98894. (void)sp_256_sub_8(ctx->t1, p256_mod, q->y);
  98895. sp_256_norm_8(ctx->t1);
  98896. if ((sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  98897. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, ctx->t1))) != 0)
  98898. {
  98899. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  98900. ctx->state = 2;
  98901. }
  98902. else {
  98903. ctx->state = 3;
  98904. }
  98905. break;
  98906. case 2:
  98907. err = sp_256_proj_point_dbl_8_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  98908. if (err == MP_OKAY)
  98909. ctx->state = 27; /* done */
  98910. break;
  98911. case 3:
  98912. {
  98913. int i;
  98914. ctx->rp[0] = r;
  98915. /*lint allow cast to different type of pointer*/
  98916. ctx->rp[1] = (sp_point_256*)t; /*lint !e9087 !e740*/
  98917. XMEMSET(ctx->rp[1], 0, sizeof(sp_point_256));
  98918. ctx->x = ctx->rp[p->infinity | q->infinity]->x;
  98919. ctx->y = ctx->rp[p->infinity | q->infinity]->y;
  98920. ctx->z = ctx->rp[p->infinity | q->infinity]->z;
  98921. ctx->ap[0] = p;
  98922. ctx->ap[1] = q;
  98923. for (i=0; i<8; i++) {
  98924. r->x[i] = ctx->ap[p->infinity]->x[i];
  98925. }
  98926. for (i=0; i<8; i++) {
  98927. r->y[i] = ctx->ap[p->infinity]->y[i];
  98928. }
  98929. for (i=0; i<8; i++) {
  98930. r->z[i] = ctx->ap[p->infinity]->z[i];
  98931. }
  98932. r->infinity = ctx->ap[p->infinity]->infinity;
  98933. ctx->state = 4;
  98934. break;
  98935. }
  98936. case 4:
  98937. /* U1 = X1*Z2^2 */
  98938. sp_256_mont_sqr_8(ctx->t1, q->z, p256_mod, p256_mp_mod);
  98939. ctx->state = 5;
  98940. break;
  98941. case 5:
  98942. sp_256_mont_mul_8(ctx->t3, ctx->t1, q->z, p256_mod, p256_mp_mod);
  98943. ctx->state = 6;
  98944. break;
  98945. case 6:
  98946. sp_256_mont_mul_8(ctx->t1, ctx->t1, ctx->x, p256_mod, p256_mp_mod);
  98947. ctx->state = 7;
  98948. break;
  98949. case 7:
  98950. /* U2 = X2*Z1^2 */
  98951. sp_256_mont_sqr_8(ctx->t2, ctx->z, p256_mod, p256_mp_mod);
  98952. ctx->state = 8;
  98953. break;
  98954. case 8:
  98955. sp_256_mont_mul_8(ctx->t4, ctx->t2, ctx->z, p256_mod, p256_mp_mod);
  98956. ctx->state = 9;
  98957. break;
  98958. case 9:
  98959. sp_256_mont_mul_8(ctx->t2, ctx->t2, q->x, p256_mod, p256_mp_mod);
  98960. ctx->state = 10;
  98961. break;
  98962. case 10:
  98963. /* S1 = Y1*Z2^3 */
  98964. sp_256_mont_mul_8(ctx->t3, ctx->t3, ctx->y, p256_mod, p256_mp_mod);
  98965. ctx->state = 11;
  98966. break;
  98967. case 11:
  98968. /* S2 = Y2*Z1^3 */
  98969. sp_256_mont_mul_8(ctx->t4, ctx->t4, q->y, p256_mod, p256_mp_mod);
  98970. ctx->state = 12;
  98971. break;
  98972. case 12:
  98973. /* H = U2 - U1 */
  98974. sp_256_mont_sub_8(ctx->t2, ctx->t2, ctx->t1, p256_mod);
  98975. ctx->state = 13;
  98976. break;
  98977. case 13:
  98978. /* R = S2 - S1 */
  98979. sp_256_mont_sub_8(ctx->t4, ctx->t4, ctx->t3, p256_mod);
  98980. ctx->state = 14;
  98981. break;
  98982. case 14:
  98983. /* Z3 = H*Z1*Z2 */
  98984. sp_256_mont_mul_8(ctx->z, ctx->z, q->z, p256_mod, p256_mp_mod);
  98985. ctx->state = 15;
  98986. break;
  98987. case 15:
  98988. sp_256_mont_mul_8(ctx->z, ctx->z, ctx->t2, p256_mod, p256_mp_mod);
  98989. ctx->state = 16;
  98990. break;
  98991. case 16:
  98992. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  98993. sp_256_mont_sqr_8(ctx->x, ctx->t4, p256_mod, p256_mp_mod);
  98994. ctx->state = 17;
  98995. break;
  98996. case 17:
  98997. sp_256_mont_sqr_8(ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  98998. ctx->state = 18;
  98999. break;
  99000. case 18:
  99001. sp_256_mont_mul_8(ctx->y, ctx->t1, ctx->t5, p256_mod, p256_mp_mod);
  99002. ctx->state = 19;
  99003. break;
  99004. case 19:
  99005. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  99006. ctx->state = 20;
  99007. break;
  99008. case 20:
  99009. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t5, p256_mod);
  99010. ctx->state = 21;
  99011. break;
  99012. case 21:
  99013. sp_256_mont_dbl_8(ctx->t1, ctx->y, p256_mod);
  99014. ctx->state = 22;
  99015. break;
  99016. case 22:
  99017. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t1, p256_mod);
  99018. ctx->state = 23;
  99019. break;
  99020. case 23:
  99021. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  99022. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod);
  99023. ctx->state = 24;
  99024. break;
  99025. case 24:
  99026. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t4, p256_mod, p256_mp_mod);
  99027. ctx->state = 25;
  99028. break;
  99029. case 25:
  99030. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t3, p256_mod, p256_mp_mod);
  99031. ctx->state = 26;
  99032. break;
  99033. case 26:
  99034. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t5, p256_mod);
  99035. ctx->state = 27;
  99036. /* fall-through */
  99037. case 27:
  99038. err = MP_OKAY;
  99039. break;
  99040. }
  99041. if (err == MP_OKAY && ctx->state != 27) {
  99042. err = FP_WOULDBLOCK;
  99043. }
  99044. return err;
  99045. }
  99046. #endif /* WOLFSSL_SP_NONBLOCK */
  99047. static void sp_256_proj_point_add_8(sp_point_256* r,
  99048. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  99049. {
  99050. const sp_point_256* ap[2];
  99051. sp_point_256* rp[2];
  99052. sp_digit* t1 = t;
  99053. sp_digit* t2 = t + 2*8;
  99054. sp_digit* t3 = t + 4*8;
  99055. sp_digit* t4 = t + 6*8;
  99056. sp_digit* t5 = t + 8*8;
  99057. sp_digit* x;
  99058. sp_digit* y;
  99059. sp_digit* z;
  99060. int i;
  99061. /* Ensure only the first point is the same as the result. */
  99062. if (q == r) {
  99063. const sp_point_256* a = p;
  99064. p = q;
  99065. q = a;
  99066. }
  99067. /* Check double */
  99068. (void)sp_256_sub_8(t1, p256_mod, q->y);
  99069. sp_256_norm_8(t1);
  99070. if ((sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  99071. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, t1))) != 0) {
  99072. sp_256_proj_point_dbl_8(r, p, t);
  99073. }
  99074. else {
  99075. rp[0] = r;
  99076. /*lint allow cast to different type of pointer*/
  99077. rp[1] = (sp_point_256*)t; /*lint !e9087 !e740*/
  99078. XMEMSET(rp[1], 0, sizeof(sp_point_256));
  99079. x = rp[p->infinity | q->infinity]->x;
  99080. y = rp[p->infinity | q->infinity]->y;
  99081. z = rp[p->infinity | q->infinity]->z;
  99082. ap[0] = p;
  99083. ap[1] = q;
  99084. for (i=0; i<8; i++) {
  99085. r->x[i] = ap[p->infinity]->x[i];
  99086. }
  99087. for (i=0; i<8; i++) {
  99088. r->y[i] = ap[p->infinity]->y[i];
  99089. }
  99090. for (i=0; i<8; i++) {
  99091. r->z[i] = ap[p->infinity]->z[i];
  99092. }
  99093. r->infinity = ap[p->infinity]->infinity;
  99094. /* U1 = X1*Z2^2 */
  99095. sp_256_mont_sqr_8(t1, q->z, p256_mod, p256_mp_mod);
  99096. sp_256_mont_mul_8(t3, t1, q->z, p256_mod, p256_mp_mod);
  99097. sp_256_mont_mul_8(t1, t1, x, p256_mod, p256_mp_mod);
  99098. /* U2 = X2*Z1^2 */
  99099. sp_256_mont_sqr_8(t2, z, p256_mod, p256_mp_mod);
  99100. sp_256_mont_mul_8(t4, t2, z, p256_mod, p256_mp_mod);
  99101. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  99102. /* S1 = Y1*Z2^3 */
  99103. sp_256_mont_mul_8(t3, t3, y, p256_mod, p256_mp_mod);
  99104. /* S2 = Y2*Z1^3 */
  99105. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  99106. /* H = U2 - U1 */
  99107. sp_256_mont_sub_8(t2, t2, t1, p256_mod);
  99108. /* R = S2 - S1 */
  99109. sp_256_mont_sub_8(t4, t4, t3, p256_mod);
  99110. /* Z3 = H*Z1*Z2 */
  99111. sp_256_mont_mul_8(z, z, q->z, p256_mod, p256_mp_mod);
  99112. sp_256_mont_mul_8(z, z, t2, p256_mod, p256_mp_mod);
  99113. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  99114. sp_256_mont_sqr_8(x, t4, p256_mod, p256_mp_mod);
  99115. sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod);
  99116. sp_256_mont_mul_8(y, t1, t5, p256_mod, p256_mp_mod);
  99117. sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod);
  99118. sp_256_mont_sub_8(x, x, t5, p256_mod);
  99119. sp_256_mont_dbl_8(t1, y, p256_mod);
  99120. sp_256_mont_sub_8(x, x, t1, p256_mod);
  99121. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  99122. sp_256_mont_sub_8(y, y, x, p256_mod);
  99123. sp_256_mont_mul_8(y, y, t4, p256_mod, p256_mp_mod);
  99124. sp_256_mont_mul_8(t5, t5, t3, p256_mod, p256_mp_mod);
  99125. sp_256_mont_sub_8(y, y, t5, p256_mod);
  99126. }
  99127. }
  99128. #ifndef WC_NO_CACHE_RESISTANT
  99129. /* Touch each possible point that could be being copied.
  99130. *
  99131. * r Point to copy into.
  99132. * table Table - start of the entires to access
  99133. * idx Index of entry to retrieve.
  99134. */
  99135. static void sp_256_get_point_16_8(sp_point_256* r, const sp_point_256* table,
  99136. int idx)
  99137. {
  99138. int i;
  99139. sp_digit mask;
  99140. r->x[0] = 0;
  99141. r->x[1] = 0;
  99142. r->x[2] = 0;
  99143. r->x[3] = 0;
  99144. r->x[4] = 0;
  99145. r->x[5] = 0;
  99146. r->x[6] = 0;
  99147. r->x[7] = 0;
  99148. r->y[0] = 0;
  99149. r->y[1] = 0;
  99150. r->y[2] = 0;
  99151. r->y[3] = 0;
  99152. r->y[4] = 0;
  99153. r->y[5] = 0;
  99154. r->y[6] = 0;
  99155. r->y[7] = 0;
  99156. r->z[0] = 0;
  99157. r->z[1] = 0;
  99158. r->z[2] = 0;
  99159. r->z[3] = 0;
  99160. r->z[4] = 0;
  99161. r->z[5] = 0;
  99162. r->z[6] = 0;
  99163. r->z[7] = 0;
  99164. for (i = 1; i < 16; i++) {
  99165. mask = 0 - (i == idx);
  99166. r->x[0] |= mask & table[i].x[0];
  99167. r->x[1] |= mask & table[i].x[1];
  99168. r->x[2] |= mask & table[i].x[2];
  99169. r->x[3] |= mask & table[i].x[3];
  99170. r->x[4] |= mask & table[i].x[4];
  99171. r->x[5] |= mask & table[i].x[5];
  99172. r->x[6] |= mask & table[i].x[6];
  99173. r->x[7] |= mask & table[i].x[7];
  99174. r->y[0] |= mask & table[i].y[0];
  99175. r->y[1] |= mask & table[i].y[1];
  99176. r->y[2] |= mask & table[i].y[2];
  99177. r->y[3] |= mask & table[i].y[3];
  99178. r->y[4] |= mask & table[i].y[4];
  99179. r->y[5] |= mask & table[i].y[5];
  99180. r->y[6] |= mask & table[i].y[6];
  99181. r->y[7] |= mask & table[i].y[7];
  99182. r->z[0] |= mask & table[i].z[0];
  99183. r->z[1] |= mask & table[i].z[1];
  99184. r->z[2] |= mask & table[i].z[2];
  99185. r->z[3] |= mask & table[i].z[3];
  99186. r->z[4] |= mask & table[i].z[4];
  99187. r->z[5] |= mask & table[i].z[5];
  99188. r->z[6] |= mask & table[i].z[6];
  99189. r->z[7] |= mask & table[i].z[7];
  99190. }
  99191. }
  99192. #endif /* !WC_NO_CACHE_RESISTANT */
  99193. /* Multiply the point by the scalar and return the result.
  99194. * If map is true then convert result to affine coordinates.
  99195. *
  99196. * Fast implementation that generates a pre-computation table.
  99197. * 4 bits of window (no sliding!).
  99198. * Uses add and double for calculating table.
  99199. * 256 doubles.
  99200. * 76 adds.
  99201. *
  99202. * r Resulting point.
  99203. * g Point to multiply.
  99204. * k Scalar to multiply by.
  99205. * map Indicates whether to convert result to affine.
  99206. * ct Constant time required.
  99207. * heap Heap to use for allocation.
  99208. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  99209. */
  99210. static int sp_256_ecc_mulmod_fast_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  99211. int map, int ct, void* heap)
  99212. {
  99213. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99214. sp_point_256* t = NULL;
  99215. sp_digit* tmp = NULL;
  99216. #else
  99217. sp_point_256 t[16 + 1];
  99218. sp_digit tmp[2 * 8 * 5];
  99219. #endif
  99220. sp_point_256* rt = NULL;
  99221. #ifndef WC_NO_CACHE_RESISTANT
  99222. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99223. sp_point_256* p = NULL;
  99224. #else
  99225. sp_point_256 p[1];
  99226. #endif
  99227. #endif /* !WC_NO_CACHE_RESISTANT */
  99228. sp_digit n;
  99229. int i;
  99230. int c;
  99231. int y;
  99232. int err = MP_OKAY;
  99233. /* Constant time used for cache attack resistance implementation. */
  99234. (void)ct;
  99235. (void)heap;
  99236. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99237. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (16 + 1),
  99238. heap, DYNAMIC_TYPE_ECC);
  99239. if (t == NULL)
  99240. err = MEMORY_E;
  99241. #ifndef WC_NO_CACHE_RESISTANT
  99242. if (err == MP_OKAY) {
  99243. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256),
  99244. heap, DYNAMIC_TYPE_ECC);
  99245. if (p == NULL)
  99246. err = MEMORY_E;
  99247. }
  99248. #endif
  99249. if (err == MP_OKAY) {
  99250. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 5, heap,
  99251. DYNAMIC_TYPE_ECC);
  99252. if (tmp == NULL)
  99253. err = MEMORY_E;
  99254. }
  99255. #endif
  99256. if (err == MP_OKAY) {
  99257. rt = t + 16;
  99258. /* t[0] = {0, 0, 1} * norm */
  99259. XMEMSET(&t[0], 0, sizeof(t[0]));
  99260. t[0].infinity = 1;
  99261. /* t[1] = {g->x, g->y, g->z} * norm */
  99262. (void)sp_256_mod_mul_norm_8(t[1].x, g->x, p256_mod);
  99263. (void)sp_256_mod_mul_norm_8(t[1].y, g->y, p256_mod);
  99264. (void)sp_256_mod_mul_norm_8(t[1].z, g->z, p256_mod);
  99265. t[1].infinity = 0;
  99266. sp_256_proj_point_dbl_8(&t[ 2], &t[ 1], tmp);
  99267. t[ 2].infinity = 0;
  99268. sp_256_proj_point_add_8(&t[ 3], &t[ 2], &t[ 1], tmp);
  99269. t[ 3].infinity = 0;
  99270. sp_256_proj_point_dbl_8(&t[ 4], &t[ 2], tmp);
  99271. t[ 4].infinity = 0;
  99272. sp_256_proj_point_add_8(&t[ 5], &t[ 3], &t[ 2], tmp);
  99273. t[ 5].infinity = 0;
  99274. sp_256_proj_point_dbl_8(&t[ 6], &t[ 3], tmp);
  99275. t[ 6].infinity = 0;
  99276. sp_256_proj_point_add_8(&t[ 7], &t[ 4], &t[ 3], tmp);
  99277. t[ 7].infinity = 0;
  99278. sp_256_proj_point_dbl_8(&t[ 8], &t[ 4], tmp);
  99279. t[ 8].infinity = 0;
  99280. sp_256_proj_point_add_8(&t[ 9], &t[ 5], &t[ 4], tmp);
  99281. t[ 9].infinity = 0;
  99282. sp_256_proj_point_dbl_8(&t[10], &t[ 5], tmp);
  99283. t[10].infinity = 0;
  99284. sp_256_proj_point_add_8(&t[11], &t[ 6], &t[ 5], tmp);
  99285. t[11].infinity = 0;
  99286. sp_256_proj_point_dbl_8(&t[12], &t[ 6], tmp);
  99287. t[12].infinity = 0;
  99288. sp_256_proj_point_add_8(&t[13], &t[ 7], &t[ 6], tmp);
  99289. t[13].infinity = 0;
  99290. sp_256_proj_point_dbl_8(&t[14], &t[ 7], tmp);
  99291. t[14].infinity = 0;
  99292. sp_256_proj_point_add_8(&t[15], &t[ 8], &t[ 7], tmp);
  99293. t[15].infinity = 0;
  99294. i = 6;
  99295. n = k[i+1] << 0;
  99296. c = 28;
  99297. y = (int)(n >> 28);
  99298. #ifndef WC_NO_CACHE_RESISTANT
  99299. if (ct) {
  99300. sp_256_get_point_16_8(rt, t, y);
  99301. rt->infinity = !y;
  99302. }
  99303. else
  99304. #endif
  99305. {
  99306. XMEMCPY(rt, &t[y], sizeof(sp_point_256));
  99307. }
  99308. n <<= 4;
  99309. for (; i>=0 || c>=4; ) {
  99310. if (c < 4) {
  99311. n |= k[i--];
  99312. c += 32;
  99313. }
  99314. y = (n >> 28) & 0xf;
  99315. n <<= 4;
  99316. c -= 4;
  99317. sp_256_proj_point_dbl_8(rt, rt, tmp);
  99318. sp_256_proj_point_dbl_8(rt, rt, tmp);
  99319. sp_256_proj_point_dbl_8(rt, rt, tmp);
  99320. sp_256_proj_point_dbl_8(rt, rt, tmp);
  99321. #ifndef WC_NO_CACHE_RESISTANT
  99322. if (ct) {
  99323. sp_256_get_point_16_8(p, t, y);
  99324. p->infinity = !y;
  99325. sp_256_proj_point_add_8(rt, rt, p, tmp);
  99326. }
  99327. else
  99328. #endif
  99329. {
  99330. sp_256_proj_point_add_8(rt, rt, &t[y], tmp);
  99331. }
  99332. }
  99333. if (map != 0) {
  99334. sp_256_map_8(r, rt, tmp);
  99335. }
  99336. else {
  99337. XMEMCPY(r, rt, sizeof(sp_point_256));
  99338. }
  99339. }
  99340. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99341. if (tmp != NULL)
  99342. #endif
  99343. {
  99344. ForceZero(tmp, sizeof(sp_digit) * 2 * 8 * 5);
  99345. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99346. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  99347. #endif
  99348. }
  99349. #ifndef WC_NO_CACHE_RESISTANT
  99350. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99351. if (p != NULL)
  99352. #endif
  99353. {
  99354. ForceZero(p, sizeof(sp_point_256));
  99355. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99356. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  99357. #endif
  99358. }
  99359. #endif /* !WC_NO_CACHE_RESISTANT */
  99360. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99361. if (t != NULL)
  99362. #endif
  99363. {
  99364. ForceZero(t, sizeof(sp_point_256) * 17);
  99365. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99366. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  99367. #endif
  99368. }
  99369. return err;
  99370. }
  99371. #ifdef FP_ECC
  99372. /* Double the Montgomery form projective point p a number of times.
  99373. *
  99374. * r Result of repeated doubling of point.
  99375. * p Point to double.
  99376. * n Number of times to double
  99377. * t Temporary ordinate data.
  99378. */
  99379. static void sp_256_proj_point_dbl_n_8(sp_point_256* p, int n,
  99380. sp_digit* t)
  99381. {
  99382. sp_digit* w = t;
  99383. sp_digit* a = t + 2*8;
  99384. sp_digit* b = t + 4*8;
  99385. sp_digit* t1 = t + 6*8;
  99386. sp_digit* t2 = t + 8*8;
  99387. sp_digit* x;
  99388. sp_digit* y;
  99389. sp_digit* z;
  99390. x = p->x;
  99391. y = p->y;
  99392. z = p->z;
  99393. /* Y = 2*Y */
  99394. sp_256_mont_dbl_8(y, y, p256_mod);
  99395. /* W = Z^4 */
  99396. sp_256_mont_sqr_8(w, z, p256_mod, p256_mp_mod);
  99397. sp_256_mont_sqr_8(w, w, p256_mod, p256_mp_mod);
  99398. #ifndef WOLFSSL_SP_SMALL
  99399. while (--n > 0)
  99400. #else
  99401. while (--n >= 0)
  99402. #endif
  99403. {
  99404. /* A = 3*(X^2 - W) */
  99405. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  99406. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  99407. sp_256_mont_tpl_8(a, t1, p256_mod);
  99408. /* B = X*Y^2 */
  99409. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  99410. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  99411. /* X = A^2 - 2B */
  99412. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  99413. sp_256_mont_dbl_8(t2, b, p256_mod);
  99414. sp_256_mont_sub_8(x, x, t2, p256_mod);
  99415. /* Z = Z*Y */
  99416. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  99417. /* t2 = Y^4 */
  99418. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  99419. #ifdef WOLFSSL_SP_SMALL
  99420. if (n != 0)
  99421. #endif
  99422. {
  99423. /* W = W*Y^4 */
  99424. sp_256_mont_mul_8(w, w, t1, p256_mod, p256_mp_mod);
  99425. }
  99426. /* y = 2*A*(B - X) - Y^4 */
  99427. sp_256_mont_sub_8(y, b, x, p256_mod);
  99428. sp_256_mont_mul_8(y, y, a, p256_mod, p256_mp_mod);
  99429. sp_256_mont_dbl_8(y, y, p256_mod);
  99430. sp_256_mont_sub_8(y, y, t1, p256_mod);
  99431. }
  99432. #ifndef WOLFSSL_SP_SMALL
  99433. /* A = 3*(X^2 - W) */
  99434. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  99435. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  99436. sp_256_mont_tpl_8(a, t1, p256_mod);
  99437. /* B = X*Y^2 */
  99438. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  99439. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  99440. /* X = A^2 - 2B */
  99441. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  99442. sp_256_mont_dbl_8(t2, b, p256_mod);
  99443. sp_256_mont_sub_8(x, x, t2, p256_mod);
  99444. /* Z = Z*Y */
  99445. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  99446. /* t2 = Y^4 */
  99447. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  99448. /* y = 2*A*(B - X) - Y^4 */
  99449. sp_256_mont_sub_8(y, b, x, p256_mod);
  99450. sp_256_mont_mul_8(y, y, a, p256_mod, p256_mp_mod);
  99451. sp_256_mont_dbl_8(y, y, p256_mod);
  99452. sp_256_mont_sub_8(y, y, t1, p256_mod);
  99453. #endif
  99454. /* Y = Y/2 */
  99455. sp_256_div2_8(y, y, p256_mod);
  99456. }
  99457. /* Convert the projective point to affine.
  99458. * Ordinates are in Montgomery form.
  99459. *
  99460. * a Point to convert.
  99461. * t Temporary data.
  99462. */
  99463. static void sp_256_proj_to_affine_8(sp_point_256* a, sp_digit* t)
  99464. {
  99465. sp_digit* t1 = t;
  99466. sp_digit* t2 = t + 2 * 8;
  99467. sp_digit* tmp = t + 4 * 8;
  99468. sp_256_mont_inv_8(t1, a->z, tmp);
  99469. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  99470. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  99471. sp_256_mont_mul_8(a->x, a->x, t2, p256_mod, p256_mp_mod);
  99472. sp_256_mont_mul_8(a->y, a->y, t1, p256_mod, p256_mp_mod);
  99473. XMEMCPY(a->z, p256_norm_mod, sizeof(p256_norm_mod));
  99474. }
  99475. #endif /* FP_ECC */
  99476. /* A table entry for pre-computed points. */
  99477. typedef struct sp_table_entry_256 {
  99478. sp_digit x[8];
  99479. sp_digit y[8];
  99480. } sp_table_entry_256;
  99481. #ifdef FP_ECC
  99482. #endif /* FP_ECC */
  99483. /* Add two Montgomery form projective points. The second point has a q value of
  99484. * one.
  99485. * Only the first point can be the same pointer as the result point.
  99486. *
  99487. * r Result of addition.
  99488. * p First point to add.
  99489. * q Second point to add.
  99490. * t Temporary ordinate data.
  99491. */
  99492. static void sp_256_proj_point_add_qz1_8(sp_point_256* r, const sp_point_256* p,
  99493. const sp_point_256* q, sp_digit* t)
  99494. {
  99495. const sp_point_256* ap[2];
  99496. sp_point_256* rp[2];
  99497. sp_digit* t1 = t;
  99498. sp_digit* t2 = t + 2*8;
  99499. sp_digit* t3 = t + 4*8;
  99500. sp_digit* t4 = t + 6*8;
  99501. sp_digit* t5 = t + 8*8;
  99502. sp_digit* x;
  99503. sp_digit* y;
  99504. sp_digit* z;
  99505. int i;
  99506. /* Check double */
  99507. (void)sp_256_sub_8(t1, p256_mod, q->y);
  99508. sp_256_norm_8(t1);
  99509. if ((sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  99510. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, t1))) != 0) {
  99511. sp_256_proj_point_dbl_8(r, p, t);
  99512. }
  99513. else {
  99514. rp[0] = r;
  99515. /*lint allow cast to different type of pointer*/
  99516. rp[1] = (sp_point_256*)t; /*lint !e9087 !e740*/
  99517. XMEMSET(rp[1], 0, sizeof(sp_point_256));
  99518. x = rp[p->infinity | q->infinity]->x;
  99519. y = rp[p->infinity | q->infinity]->y;
  99520. z = rp[p->infinity | q->infinity]->z;
  99521. ap[0] = p;
  99522. ap[1] = q;
  99523. for (i=0; i<8; i++) {
  99524. r->x[i] = ap[p->infinity]->x[i];
  99525. }
  99526. for (i=0; i<8; i++) {
  99527. r->y[i] = ap[p->infinity]->y[i];
  99528. }
  99529. for (i=0; i<8; i++) {
  99530. r->z[i] = ap[p->infinity]->z[i];
  99531. }
  99532. r->infinity = ap[p->infinity]->infinity;
  99533. /* U2 = X2*Z1^2 */
  99534. sp_256_mont_sqr_8(t2, z, p256_mod, p256_mp_mod);
  99535. sp_256_mont_mul_8(t4, t2, z, p256_mod, p256_mp_mod);
  99536. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  99537. /* S2 = Y2*Z1^3 */
  99538. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  99539. /* H = U2 - X1 */
  99540. sp_256_mont_sub_8(t2, t2, x, p256_mod);
  99541. /* R = S2 - Y1 */
  99542. sp_256_mont_sub_8(t4, t4, y, p256_mod);
  99543. /* Z3 = H*Z1 */
  99544. sp_256_mont_mul_8(z, z, t2, p256_mod, p256_mp_mod);
  99545. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  99546. sp_256_mont_sqr_8(t1, t4, p256_mod, p256_mp_mod);
  99547. sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod);
  99548. sp_256_mont_mul_8(t3, x, t5, p256_mod, p256_mp_mod);
  99549. sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod);
  99550. sp_256_mont_sub_8(x, t1, t5, p256_mod);
  99551. sp_256_mont_dbl_8(t1, t3, p256_mod);
  99552. sp_256_mont_sub_8(x, x, t1, p256_mod);
  99553. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  99554. sp_256_mont_sub_8(t3, t3, x, p256_mod);
  99555. sp_256_mont_mul_8(t3, t3, t4, p256_mod, p256_mp_mod);
  99556. sp_256_mont_mul_8(t5, t5, y, p256_mod, p256_mp_mod);
  99557. sp_256_mont_sub_8(y, t3, t5, p256_mod);
  99558. }
  99559. }
  99560. #ifdef WOLFSSL_SP_SMALL
  99561. #ifdef FP_ECC
  99562. /* Generate the pre-computed table of points for the base point.
  99563. *
  99564. * width = 4
  99565. * 16 entries
  99566. * 64 bits between
  99567. *
  99568. * a The base point.
  99569. * table Place to store generated point data.
  99570. * tmp Temporary data.
  99571. * heap Heap to use for allocation.
  99572. */
  99573. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  99574. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  99575. {
  99576. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99577. sp_point_256* t = NULL;
  99578. #else
  99579. sp_point_256 t[3];
  99580. #endif
  99581. sp_point_256* s1 = NULL;
  99582. sp_point_256* s2 = NULL;
  99583. int i;
  99584. int j;
  99585. int err = MP_OKAY;
  99586. (void)heap;
  99587. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99588. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  99589. DYNAMIC_TYPE_ECC);
  99590. if (t == NULL)
  99591. err = MEMORY_E;
  99592. #endif
  99593. if (err == MP_OKAY) {
  99594. s1 = t + 1;
  99595. s2 = t + 2;
  99596. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  99597. }
  99598. if (err == MP_OKAY) {
  99599. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  99600. }
  99601. if (err == MP_OKAY) {
  99602. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  99603. }
  99604. if (err == MP_OKAY) {
  99605. t->infinity = 0;
  99606. sp_256_proj_to_affine_8(t, tmp);
  99607. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  99608. s1->infinity = 0;
  99609. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  99610. s2->infinity = 0;
  99611. /* table[0] = {0, 0, infinity} */
  99612. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  99613. /* table[1] = Affine version of 'a' in Montgomery form */
  99614. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  99615. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  99616. for (i=1; i<4; i++) {
  99617. sp_256_proj_point_dbl_n_8(t, 64, tmp);
  99618. sp_256_proj_to_affine_8(t, tmp);
  99619. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  99620. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  99621. }
  99622. for (i=1; i<4; i++) {
  99623. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  99624. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  99625. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  99626. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  99627. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  99628. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  99629. sp_256_proj_to_affine_8(t, tmp);
  99630. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  99631. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  99632. }
  99633. }
  99634. }
  99635. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99636. if (t != NULL)
  99637. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  99638. #endif
  99639. return err;
  99640. }
  99641. #endif /* FP_ECC */
  99642. #ifndef WC_NO_CACHE_RESISTANT
  99643. /* Touch each possible entry that could be being copied.
  99644. *
  99645. * r Point to copy into.
  99646. * table Table - start of the entires to access
  99647. * idx Index of entry to retrieve.
  99648. */
  99649. static void sp_256_get_entry_16_8(sp_point_256* r,
  99650. const sp_table_entry_256* table, int idx)
  99651. {
  99652. int i;
  99653. sp_digit mask;
  99654. r->x[0] = 0;
  99655. r->x[1] = 0;
  99656. r->x[2] = 0;
  99657. r->x[3] = 0;
  99658. r->x[4] = 0;
  99659. r->x[5] = 0;
  99660. r->x[6] = 0;
  99661. r->x[7] = 0;
  99662. r->y[0] = 0;
  99663. r->y[1] = 0;
  99664. r->y[2] = 0;
  99665. r->y[3] = 0;
  99666. r->y[4] = 0;
  99667. r->y[5] = 0;
  99668. r->y[6] = 0;
  99669. r->y[7] = 0;
  99670. for (i = 1; i < 16; i++) {
  99671. mask = 0 - (i == idx);
  99672. r->x[0] |= mask & table[i].x[0];
  99673. r->x[1] |= mask & table[i].x[1];
  99674. r->x[2] |= mask & table[i].x[2];
  99675. r->x[3] |= mask & table[i].x[3];
  99676. r->x[4] |= mask & table[i].x[4];
  99677. r->x[5] |= mask & table[i].x[5];
  99678. r->x[6] |= mask & table[i].x[6];
  99679. r->x[7] |= mask & table[i].x[7];
  99680. r->y[0] |= mask & table[i].y[0];
  99681. r->y[1] |= mask & table[i].y[1];
  99682. r->y[2] |= mask & table[i].y[2];
  99683. r->y[3] |= mask & table[i].y[3];
  99684. r->y[4] |= mask & table[i].y[4];
  99685. r->y[5] |= mask & table[i].y[5];
  99686. r->y[6] |= mask & table[i].y[6];
  99687. r->y[7] |= mask & table[i].y[7];
  99688. }
  99689. }
  99690. #endif /* !WC_NO_CACHE_RESISTANT */
  99691. /* Multiply the point by the scalar and return the result.
  99692. * If map is true then convert result to affine coordinates.
  99693. *
  99694. * Stripe implementation.
  99695. * Pre-generated: 2^0, 2^64, ...
  99696. * Pre-generated: products of all combinations of above.
  99697. * 4 doubles and adds (with qz=1)
  99698. *
  99699. * r Resulting point.
  99700. * k Scalar to multiply by.
  99701. * table Pre-computed table.
  99702. * map Indicates whether to convert result to affine.
  99703. * ct Constant time required.
  99704. * heap Heap to use for allocation.
  99705. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  99706. */
  99707. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  99708. const sp_table_entry_256* table, const sp_digit* k, int map,
  99709. int ct, void* heap)
  99710. {
  99711. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99712. sp_point_256* rt = NULL;
  99713. sp_digit* t = NULL;
  99714. #else
  99715. sp_point_256 rt[2];
  99716. sp_digit t[2 * 8 * 5];
  99717. #endif
  99718. sp_point_256* p = NULL;
  99719. int i;
  99720. int j;
  99721. int y;
  99722. int x;
  99723. int err = MP_OKAY;
  99724. (void)g;
  99725. /* Constant time used for cache attack resistance implementation. */
  99726. (void)ct;
  99727. (void)heap;
  99728. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99729. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  99730. DYNAMIC_TYPE_ECC);
  99731. if (rt == NULL)
  99732. err = MEMORY_E;
  99733. if (err == MP_OKAY) {
  99734. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 5, heap,
  99735. DYNAMIC_TYPE_ECC);
  99736. if (t == NULL)
  99737. err = MEMORY_E;
  99738. }
  99739. #endif
  99740. if (err == MP_OKAY) {
  99741. p = rt + 1;
  99742. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  99743. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  99744. y = 0;
  99745. x = 63;
  99746. for (j=0; j<4; j++) {
  99747. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  99748. x += 64;
  99749. }
  99750. #ifndef WC_NO_CACHE_RESISTANT
  99751. if (ct) {
  99752. sp_256_get_entry_16_8(rt, table, y);
  99753. } else
  99754. #endif
  99755. {
  99756. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  99757. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  99758. }
  99759. rt->infinity = !y;
  99760. for (i=62; i>=0; i--) {
  99761. y = 0;
  99762. x = i;
  99763. for (j=0; j<4; j++) {
  99764. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  99765. x += 64;
  99766. }
  99767. sp_256_proj_point_dbl_8(rt, rt, t);
  99768. #ifndef WC_NO_CACHE_RESISTANT
  99769. if (ct) {
  99770. sp_256_get_entry_16_8(p, table, y);
  99771. }
  99772. else
  99773. #endif
  99774. {
  99775. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  99776. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  99777. }
  99778. p->infinity = !y;
  99779. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  99780. }
  99781. if (map != 0) {
  99782. sp_256_map_8(r, rt, t);
  99783. }
  99784. else {
  99785. XMEMCPY(r, rt, sizeof(sp_point_256));
  99786. }
  99787. }
  99788. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99789. if (t != NULL)
  99790. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  99791. if (rt != NULL)
  99792. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  99793. #endif
  99794. return err;
  99795. }
  99796. #ifdef FP_ECC
  99797. #ifndef FP_ENTRIES
  99798. #define FP_ENTRIES 16
  99799. #endif
  99800. /* Cache entry - holds precomputation tables for a point. */
  99801. typedef struct sp_cache_256_t {
  99802. /* X ordinate of point that table was generated from. */
  99803. sp_digit x[8];
  99804. /* Y ordinate of point that table was generated from. */
  99805. sp_digit y[8];
  99806. /* Precomputation table for point. */
  99807. sp_table_entry_256 table[16];
  99808. /* Count of entries in table. */
  99809. uint32_t cnt;
  99810. /* Point and table set in entry. */
  99811. int set;
  99812. } sp_cache_256_t;
  99813. /* Cache of tables. */
  99814. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  99815. /* Index of last entry in cache. */
  99816. static THREAD_LS_T int sp_cache_256_last = -1;
  99817. /* Cache has been initialized. */
  99818. static THREAD_LS_T int sp_cache_256_inited = 0;
  99819. #ifndef HAVE_THREAD_LS
  99820. static volatile int initCacheMutex_256 = 0;
  99821. static wolfSSL_Mutex sp_cache_256_lock;
  99822. #endif
  99823. /* Get the cache entry for the point.
  99824. *
  99825. * g [in] Point scalar multipling.
  99826. * cache [out] Cache table to use.
  99827. */
  99828. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  99829. {
  99830. int i;
  99831. int j;
  99832. uint32_t least;
  99833. if (sp_cache_256_inited == 0) {
  99834. for (i=0; i<FP_ENTRIES; i++) {
  99835. sp_cache_256[i].set = 0;
  99836. }
  99837. sp_cache_256_inited = 1;
  99838. }
  99839. /* Compare point with those in cache. */
  99840. for (i=0; i<FP_ENTRIES; i++) {
  99841. if (!sp_cache_256[i].set)
  99842. continue;
  99843. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  99844. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  99845. sp_cache_256[i].cnt++;
  99846. break;
  99847. }
  99848. }
  99849. /* No match. */
  99850. if (i == FP_ENTRIES) {
  99851. /* Find empty entry. */
  99852. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  99853. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  99854. if (!sp_cache_256[i].set) {
  99855. break;
  99856. }
  99857. }
  99858. /* Evict least used. */
  99859. if (i == sp_cache_256_last) {
  99860. least = sp_cache_256[0].cnt;
  99861. for (j=1; j<FP_ENTRIES; j++) {
  99862. if (sp_cache_256[j].cnt < least) {
  99863. i = j;
  99864. least = sp_cache_256[i].cnt;
  99865. }
  99866. }
  99867. }
  99868. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  99869. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  99870. sp_cache_256[i].set = 1;
  99871. sp_cache_256[i].cnt = 1;
  99872. }
  99873. *cache = &sp_cache_256[i];
  99874. sp_cache_256_last = i;
  99875. }
  99876. #endif /* FP_ECC */
  99877. /* Multiply the base point of P256 by the scalar and return the result.
  99878. * If map is true then convert result to affine coordinates.
  99879. *
  99880. * r Resulting point.
  99881. * g Point to multiply.
  99882. * k Scalar to multiply by.
  99883. * map Indicates whether to convert result to affine.
  99884. * ct Constant time required.
  99885. * heap Heap to use for allocation.
  99886. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  99887. */
  99888. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  99889. int map, int ct, void* heap)
  99890. {
  99891. #ifndef FP_ECC
  99892. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  99893. #else
  99894. sp_digit tmp[2 * 8 * 5];
  99895. sp_cache_256_t* cache;
  99896. int err = MP_OKAY;
  99897. #ifndef HAVE_THREAD_LS
  99898. if (initCacheMutex_256 == 0) {
  99899. wc_InitMutex(&sp_cache_256_lock);
  99900. initCacheMutex_256 = 1;
  99901. }
  99902. if (wc_LockMutex(&sp_cache_256_lock) != 0)
  99903. err = BAD_MUTEX_E;
  99904. #endif /* HAVE_THREAD_LS */
  99905. if (err == MP_OKAY) {
  99906. sp_ecc_get_cache_256(g, &cache);
  99907. if (cache->cnt == 2)
  99908. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  99909. #ifndef HAVE_THREAD_LS
  99910. wc_UnLockMutex(&sp_cache_256_lock);
  99911. #endif /* HAVE_THREAD_LS */
  99912. if (cache->cnt < 2) {
  99913. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  99914. }
  99915. else {
  99916. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  99917. map, ct, heap);
  99918. }
  99919. }
  99920. return err;
  99921. #endif
  99922. }
  99923. #else
  99924. #ifdef FP_ECC
  99925. /* Generate the pre-computed table of points for the base point.
  99926. *
  99927. * width = 8
  99928. * 256 entries
  99929. * 32 bits between
  99930. *
  99931. * a The base point.
  99932. * table Place to store generated point data.
  99933. * tmp Temporary data.
  99934. * heap Heap to use for allocation.
  99935. */
  99936. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  99937. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  99938. {
  99939. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99940. sp_point_256* t = NULL;
  99941. #else
  99942. sp_point_256 t[3];
  99943. #endif
  99944. sp_point_256* s1 = NULL;
  99945. sp_point_256* s2 = NULL;
  99946. int i;
  99947. int j;
  99948. int err = MP_OKAY;
  99949. (void)heap;
  99950. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99951. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  99952. DYNAMIC_TYPE_ECC);
  99953. if (t == NULL)
  99954. err = MEMORY_E;
  99955. #endif
  99956. if (err == MP_OKAY) {
  99957. s1 = t + 1;
  99958. s2 = t + 2;
  99959. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  99960. }
  99961. if (err == MP_OKAY) {
  99962. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  99963. }
  99964. if (err == MP_OKAY) {
  99965. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  99966. }
  99967. if (err == MP_OKAY) {
  99968. t->infinity = 0;
  99969. sp_256_proj_to_affine_8(t, tmp);
  99970. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  99971. s1->infinity = 0;
  99972. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  99973. s2->infinity = 0;
  99974. /* table[0] = {0, 0, infinity} */
  99975. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  99976. /* table[1] = Affine version of 'a' in Montgomery form */
  99977. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  99978. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  99979. for (i=1; i<8; i++) {
  99980. sp_256_proj_point_dbl_n_8(t, 32, tmp);
  99981. sp_256_proj_to_affine_8(t, tmp);
  99982. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  99983. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  99984. }
  99985. for (i=1; i<8; i++) {
  99986. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  99987. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  99988. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  99989. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  99990. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  99991. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  99992. sp_256_proj_to_affine_8(t, tmp);
  99993. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  99994. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  99995. }
  99996. }
  99997. }
  99998. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  99999. if (t != NULL)
  100000. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100001. #endif
  100002. return err;
  100003. }
  100004. #endif /* FP_ECC */
  100005. #ifndef WC_NO_CACHE_RESISTANT
  100006. /* Touch each possible entry that could be being copied.
  100007. *
  100008. * r Point to copy into.
  100009. * table Table - start of the entires to access
  100010. * idx Index of entry to retrieve.
  100011. */
  100012. static void sp_256_get_entry_256_8(sp_point_256* r,
  100013. const sp_table_entry_256* table, int idx)
  100014. {
  100015. int i;
  100016. sp_digit mask;
  100017. r->x[0] = 0;
  100018. r->x[1] = 0;
  100019. r->x[2] = 0;
  100020. r->x[3] = 0;
  100021. r->x[4] = 0;
  100022. r->x[5] = 0;
  100023. r->x[6] = 0;
  100024. r->x[7] = 0;
  100025. r->y[0] = 0;
  100026. r->y[1] = 0;
  100027. r->y[2] = 0;
  100028. r->y[3] = 0;
  100029. r->y[4] = 0;
  100030. r->y[5] = 0;
  100031. r->y[6] = 0;
  100032. r->y[7] = 0;
  100033. for (i = 1; i < 256; i++) {
  100034. mask = 0 - (i == idx);
  100035. r->x[0] |= mask & table[i].x[0];
  100036. r->x[1] |= mask & table[i].x[1];
  100037. r->x[2] |= mask & table[i].x[2];
  100038. r->x[3] |= mask & table[i].x[3];
  100039. r->x[4] |= mask & table[i].x[4];
  100040. r->x[5] |= mask & table[i].x[5];
  100041. r->x[6] |= mask & table[i].x[6];
  100042. r->x[7] |= mask & table[i].x[7];
  100043. r->y[0] |= mask & table[i].y[0];
  100044. r->y[1] |= mask & table[i].y[1];
  100045. r->y[2] |= mask & table[i].y[2];
  100046. r->y[3] |= mask & table[i].y[3];
  100047. r->y[4] |= mask & table[i].y[4];
  100048. r->y[5] |= mask & table[i].y[5];
  100049. r->y[6] |= mask & table[i].y[6];
  100050. r->y[7] |= mask & table[i].y[7];
  100051. }
  100052. }
  100053. #endif /* !WC_NO_CACHE_RESISTANT */
  100054. /* Multiply the point by the scalar and return the result.
  100055. * If map is true then convert result to affine coordinates.
  100056. *
  100057. * Stripe implementation.
  100058. * Pre-generated: 2^0, 2^32, ...
  100059. * Pre-generated: products of all combinations of above.
  100060. * 8 doubles and adds (with qz=1)
  100061. *
  100062. * r Resulting point.
  100063. * k Scalar to multiply by.
  100064. * table Pre-computed table.
  100065. * map Indicates whether to convert result to affine.
  100066. * ct Constant time required.
  100067. * heap Heap to use for allocation.
  100068. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100069. */
  100070. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  100071. const sp_table_entry_256* table, const sp_digit* k, int map,
  100072. int ct, void* heap)
  100073. {
  100074. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100075. sp_point_256* rt = NULL;
  100076. sp_digit* t = NULL;
  100077. #else
  100078. sp_point_256 rt[2];
  100079. sp_digit t[2 * 8 * 5];
  100080. #endif
  100081. sp_point_256* p = NULL;
  100082. int i;
  100083. int j;
  100084. int y;
  100085. int x;
  100086. int err = MP_OKAY;
  100087. (void)g;
  100088. /* Constant time used for cache attack resistance implementation. */
  100089. (void)ct;
  100090. (void)heap;
  100091. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100092. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  100093. DYNAMIC_TYPE_ECC);
  100094. if (rt == NULL)
  100095. err = MEMORY_E;
  100096. if (err == MP_OKAY) {
  100097. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 5, heap,
  100098. DYNAMIC_TYPE_ECC);
  100099. if (t == NULL)
  100100. err = MEMORY_E;
  100101. }
  100102. #endif
  100103. if (err == MP_OKAY) {
  100104. p = rt + 1;
  100105. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  100106. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  100107. y = 0;
  100108. x = 31;
  100109. for (j=0; j<8; j++) {
  100110. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  100111. x += 32;
  100112. }
  100113. #ifndef WC_NO_CACHE_RESISTANT
  100114. if (ct) {
  100115. sp_256_get_entry_256_8(rt, table, y);
  100116. } else
  100117. #endif
  100118. {
  100119. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  100120. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  100121. }
  100122. rt->infinity = !y;
  100123. for (i=30; i>=0; i--) {
  100124. y = 0;
  100125. x = i;
  100126. for (j=0; j<8; j++) {
  100127. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  100128. x += 32;
  100129. }
  100130. sp_256_proj_point_dbl_8(rt, rt, t);
  100131. #ifndef WC_NO_CACHE_RESISTANT
  100132. if (ct) {
  100133. sp_256_get_entry_256_8(p, table, y);
  100134. }
  100135. else
  100136. #endif
  100137. {
  100138. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  100139. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  100140. }
  100141. p->infinity = !y;
  100142. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  100143. }
  100144. if (map != 0) {
  100145. sp_256_map_8(r, rt, t);
  100146. }
  100147. else {
  100148. XMEMCPY(r, rt, sizeof(sp_point_256));
  100149. }
  100150. }
  100151. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100152. if (t != NULL)
  100153. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100154. if (rt != NULL)
  100155. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  100156. #endif
  100157. return err;
  100158. }
  100159. #ifdef FP_ECC
  100160. #ifndef FP_ENTRIES
  100161. #define FP_ENTRIES 16
  100162. #endif
  100163. /* Cache entry - holds precomputation tables for a point. */
  100164. typedef struct sp_cache_256_t {
  100165. /* X ordinate of point that table was generated from. */
  100166. sp_digit x[8];
  100167. /* Y ordinate of point that table was generated from. */
  100168. sp_digit y[8];
  100169. /* Precomputation table for point. */
  100170. sp_table_entry_256 table[256];
  100171. /* Count of entries in table. */
  100172. uint32_t cnt;
  100173. /* Point and table set in entry. */
  100174. int set;
  100175. } sp_cache_256_t;
  100176. /* Cache of tables. */
  100177. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  100178. /* Index of last entry in cache. */
  100179. static THREAD_LS_T int sp_cache_256_last = -1;
  100180. /* Cache has been initialized. */
  100181. static THREAD_LS_T int sp_cache_256_inited = 0;
  100182. #ifndef HAVE_THREAD_LS
  100183. static volatile int initCacheMutex_256 = 0;
  100184. static wolfSSL_Mutex sp_cache_256_lock;
  100185. #endif
  100186. /* Get the cache entry for the point.
  100187. *
  100188. * g [in] Point scalar multipling.
  100189. * cache [out] Cache table to use.
  100190. */
  100191. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  100192. {
  100193. int i;
  100194. int j;
  100195. uint32_t least;
  100196. if (sp_cache_256_inited == 0) {
  100197. for (i=0; i<FP_ENTRIES; i++) {
  100198. sp_cache_256[i].set = 0;
  100199. }
  100200. sp_cache_256_inited = 1;
  100201. }
  100202. /* Compare point with those in cache. */
  100203. for (i=0; i<FP_ENTRIES; i++) {
  100204. if (!sp_cache_256[i].set)
  100205. continue;
  100206. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  100207. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  100208. sp_cache_256[i].cnt++;
  100209. break;
  100210. }
  100211. }
  100212. /* No match. */
  100213. if (i == FP_ENTRIES) {
  100214. /* Find empty entry. */
  100215. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  100216. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  100217. if (!sp_cache_256[i].set) {
  100218. break;
  100219. }
  100220. }
  100221. /* Evict least used. */
  100222. if (i == sp_cache_256_last) {
  100223. least = sp_cache_256[0].cnt;
  100224. for (j=1; j<FP_ENTRIES; j++) {
  100225. if (sp_cache_256[j].cnt < least) {
  100226. i = j;
  100227. least = sp_cache_256[i].cnt;
  100228. }
  100229. }
  100230. }
  100231. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  100232. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  100233. sp_cache_256[i].set = 1;
  100234. sp_cache_256[i].cnt = 1;
  100235. }
  100236. *cache = &sp_cache_256[i];
  100237. sp_cache_256_last = i;
  100238. }
  100239. #endif /* FP_ECC */
  100240. /* Multiply the base point of P256 by the scalar and return the result.
  100241. * If map is true then convert result to affine coordinates.
  100242. *
  100243. * r Resulting point.
  100244. * g Point to multiply.
  100245. * k Scalar to multiply by.
  100246. * map Indicates whether to convert result to affine.
  100247. * ct Constant time required.
  100248. * heap Heap to use for allocation.
  100249. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100250. */
  100251. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  100252. int map, int ct, void* heap)
  100253. {
  100254. #ifndef FP_ECC
  100255. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  100256. #else
  100257. sp_digit tmp[2 * 8 * 5];
  100258. sp_cache_256_t* cache;
  100259. int err = MP_OKAY;
  100260. #ifndef HAVE_THREAD_LS
  100261. if (initCacheMutex_256 == 0) {
  100262. wc_InitMutex(&sp_cache_256_lock);
  100263. initCacheMutex_256 = 1;
  100264. }
  100265. if (wc_LockMutex(&sp_cache_256_lock) != 0)
  100266. err = BAD_MUTEX_E;
  100267. #endif /* HAVE_THREAD_LS */
  100268. if (err == MP_OKAY) {
  100269. sp_ecc_get_cache_256(g, &cache);
  100270. if (cache->cnt == 2)
  100271. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  100272. #ifndef HAVE_THREAD_LS
  100273. wc_UnLockMutex(&sp_cache_256_lock);
  100274. #endif /* HAVE_THREAD_LS */
  100275. if (cache->cnt < 2) {
  100276. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  100277. }
  100278. else {
  100279. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  100280. map, ct, heap);
  100281. }
  100282. }
  100283. return err;
  100284. #endif
  100285. }
  100286. #endif /* WOLFSSL_SP_SMALL */
  100287. /* Multiply the point by the scalar and return the result.
  100288. * If map is true then convert result to affine coordinates.
  100289. *
  100290. * km Scalar to multiply by.
  100291. * p Point to multiply.
  100292. * r Resulting point.
  100293. * map Indicates whether to convert result to affine.
  100294. * heap Heap to use for allocation.
  100295. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100296. */
  100297. int sp_ecc_mulmod_256(const mp_int* km, const ecc_point* gm, ecc_point* r,
  100298. int map, void* heap)
  100299. {
  100300. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100301. sp_point_256* point = NULL;
  100302. sp_digit* k = NULL;
  100303. #else
  100304. sp_point_256 point[1];
  100305. sp_digit k[8];
  100306. #endif
  100307. int err = MP_OKAY;
  100308. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100309. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  100310. DYNAMIC_TYPE_ECC);
  100311. if (point == NULL)
  100312. err = MEMORY_E;
  100313. if (err == MP_OKAY) {
  100314. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  100315. DYNAMIC_TYPE_ECC);
  100316. if (k == NULL)
  100317. err = MEMORY_E;
  100318. }
  100319. #endif
  100320. if (err == MP_OKAY) {
  100321. sp_256_from_mp(k, 8, km);
  100322. sp_256_point_from_ecc_point_8(point, gm);
  100323. err = sp_256_ecc_mulmod_8(point, point, k, map, 1, heap);
  100324. }
  100325. if (err == MP_OKAY) {
  100326. err = sp_256_point_to_ecc_point_8(point, r);
  100327. }
  100328. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100329. if (k != NULL)
  100330. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  100331. if (point != NULL)
  100332. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  100333. #endif
  100334. return err;
  100335. }
  100336. /* Multiply the point by the scalar, add point a and return the result.
  100337. * If map is true then convert result to affine coordinates.
  100338. *
  100339. * km Scalar to multiply by.
  100340. * p Point to multiply.
  100341. * am Point to add to scalar mulitply result.
  100342. * inMont Point to add is in montgomery form.
  100343. * r Resulting point.
  100344. * map Indicates whether to convert result to affine.
  100345. * heap Heap to use for allocation.
  100346. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100347. */
  100348. int sp_ecc_mulmod_add_256(const mp_int* km, const ecc_point* gm,
  100349. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  100350. {
  100351. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100352. sp_point_256* point = NULL;
  100353. sp_digit* k = NULL;
  100354. #else
  100355. sp_point_256 point[2];
  100356. sp_digit k[8 + 8 * 2 * 5];
  100357. #endif
  100358. sp_point_256* addP = NULL;
  100359. sp_digit* tmp = NULL;
  100360. int err = MP_OKAY;
  100361. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100362. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  100363. DYNAMIC_TYPE_ECC);
  100364. if (point == NULL)
  100365. err = MEMORY_E;
  100366. if (err == MP_OKAY) {
  100367. k = (sp_digit*)XMALLOC(
  100368. sizeof(sp_digit) * (8 + 8 * 2 * 5), heap,
  100369. DYNAMIC_TYPE_ECC);
  100370. if (k == NULL)
  100371. err = MEMORY_E;
  100372. }
  100373. #endif
  100374. if (err == MP_OKAY) {
  100375. addP = point + 1;
  100376. tmp = k + 8;
  100377. sp_256_from_mp(k, 8, km);
  100378. sp_256_point_from_ecc_point_8(point, gm);
  100379. sp_256_point_from_ecc_point_8(addP, am);
  100380. }
  100381. if ((err == MP_OKAY) && (!inMont)) {
  100382. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  100383. }
  100384. if ((err == MP_OKAY) && (!inMont)) {
  100385. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  100386. }
  100387. if ((err == MP_OKAY) && (!inMont)) {
  100388. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  100389. }
  100390. if (err == MP_OKAY) {
  100391. err = sp_256_ecc_mulmod_8(point, point, k, 0, 0, heap);
  100392. }
  100393. if (err == MP_OKAY) {
  100394. sp_256_proj_point_add_8(point, point, addP, tmp);
  100395. if (map) {
  100396. sp_256_map_8(point, point, tmp);
  100397. }
  100398. err = sp_256_point_to_ecc_point_8(point, r);
  100399. }
  100400. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100401. if (k != NULL)
  100402. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  100403. if (point != NULL)
  100404. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  100405. #endif
  100406. return err;
  100407. }
  100408. #ifdef WOLFSSL_SP_SMALL
  100409. /* Striping precomputation table.
  100410. * 4 points combined into a table of 16 points.
  100411. * Distance of 64 between points.
  100412. */
  100413. static const sp_table_entry_256 p256_table[16] = {
  100414. /* 0 */
  100415. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  100416. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  100417. /* 1 */
  100418. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  100419. 0xa53755c6,0x18905f76 },
  100420. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  100421. 0x25885d85,0x8571ff18 } },
  100422. /* 2 */
  100423. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  100424. 0xfd1b667f,0x2f5e6961 },
  100425. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  100426. 0x8d6f0f7b,0xf648f916 } },
  100427. /* 3 */
  100428. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  100429. 0x133d0015,0x5abe0285 },
  100430. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  100431. 0x6b6f7383,0x94bb725b } },
  100432. /* 4 */
  100433. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  100434. 0x21d324f6,0x61d587d4 },
  100435. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  100436. 0x4621efbe,0xfa11fe12 } },
  100437. /* 5 */
  100438. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  100439. 0x1f13bedc,0x586eb04c },
  100440. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  100441. 0x70864f11,0x19d5ac08 } },
  100442. /* 6 */
  100443. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  100444. 0xc3b266b1,0xbb6de651 },
  100445. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  100446. 0x5d18b99b,0x60b4619a } },
  100447. /* 7 */
  100448. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  100449. 0xaeebffcd,0x9d0f27b2 },
  100450. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  100451. 0x356ec48d,0x244a566d } },
  100452. /* 8 */
  100453. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  100454. 0xcd42ab1b,0x803f3e02 },
  100455. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  100456. 0x5067adc1,0xc097440e } },
  100457. /* 9 */
  100458. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  100459. 0x915f1f30,0xf1af32d5 },
  100460. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  100461. 0xe2d41c8b,0x23d0f130 } },
  100462. /* 10 */
  100463. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  100464. 0x7990216a,0x50bbb4d9 },
  100465. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  100466. 0x01fe49c3,0x2b100118 } },
  100467. /* 11 */
  100468. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  100469. 0x83fbae0c,0xdd558999 },
  100470. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  100471. 0x149d6041,0xe6e4c551 } },
  100472. /* 12 */
  100473. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  100474. 0xdb7e63af,0xfad27148 },
  100475. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  100476. 0x9f0e1a84,0x77387de3 } },
  100477. /* 13 */
  100478. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  100479. 0xbef0c47e,0xb37b85c0 },
  100480. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  100481. 0xf9f628d5,0x9c135ac8 } },
  100482. /* 14 */
  100483. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  100484. 0x91ece900,0xc109f9cb },
  100485. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  100486. 0x2eee1ee1,0x9bc3344f } },
  100487. /* 15 */
  100488. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  100489. 0x5f1a4cc1,0x29591d52 },
  100490. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  100491. 0x18ef332c,0x6376551f } },
  100492. };
  100493. /* Multiply the base point of P256 by the scalar and return the result.
  100494. * If map is true then convert result to affine coordinates.
  100495. *
  100496. * Stripe implementation.
  100497. * Pre-generated: 2^0, 2^64, ...
  100498. * Pre-generated: products of all combinations of above.
  100499. * 4 doubles and adds (with qz=1)
  100500. *
  100501. * r Resulting point.
  100502. * k Scalar to multiply by.
  100503. * map Indicates whether to convert result to affine.
  100504. * ct Constant time required.
  100505. * heap Heap to use for allocation.
  100506. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100507. */
  100508. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  100509. int map, int ct, void* heap)
  100510. {
  100511. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  100512. k, map, ct, heap);
  100513. }
  100514. #else
  100515. /* Striping precomputation table.
  100516. * 8 points combined into a table of 256 points.
  100517. * Distance of 32 between points.
  100518. */
  100519. static const sp_table_entry_256 p256_table[256] = {
  100520. /* 0 */
  100521. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  100522. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  100523. /* 1 */
  100524. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  100525. 0xa53755c6,0x18905f76 },
  100526. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  100527. 0x25885d85,0x8571ff18 } },
  100528. /* 2 */
  100529. { { 0x4147519a,0x20288602,0x26b372f0,0xd0981eac,0xa785ebc8,0xa9d4a7ca,
  100530. 0xdbdf58e9,0xd953c50d },
  100531. { 0xfd590f8f,0x9d6361cc,0x44e6c917,0x72e9626b,0x22eb64cf,0x7fd96110,
  100532. 0x9eb288f3,0x863ebb7e } },
  100533. /* 3 */
  100534. { { 0x5cdb6485,0x7856b623,0x2f0a2f97,0x808f0ea2,0x4f7e300b,0x3e68d954,
  100535. 0xb5ff80a0,0x00076055 },
  100536. { 0x838d2010,0x7634eb9b,0x3243708a,0x54014fbb,0x842a6606,0xe0e47d39,
  100537. 0x34373ee0,0x83087761 } },
  100538. /* 4 */
  100539. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  100540. 0xfd1b667f,0x2f5e6961 },
  100541. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  100542. 0x8d6f0f7b,0xf648f916 } },
  100543. /* 5 */
  100544. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  100545. 0x133d0015,0x5abe0285 },
  100546. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  100547. 0x6b6f7383,0x94bb725b } },
  100548. /* 6 */
  100549. { { 0x720f141c,0xbbf9b48f,0x2df5bc74,0x6199b3cd,0x411045c4,0xdc3f6129,
  100550. 0x2f7dc4ef,0xcdd6bbcb },
  100551. { 0xeaf436fd,0xcca6700b,0xb99326be,0x6f647f6d,0x014f2522,0x0c0fa792,
  100552. 0x4bdae5f6,0xa361bebd } },
  100553. /* 7 */
  100554. { { 0x597c13c7,0x28aa2558,0x50b7c3e1,0xc38d635f,0xf3c09d1d,0x07039aec,
  100555. 0xc4b5292c,0xba12ca09 },
  100556. { 0x59f91dfd,0x9e408fa4,0xceea07fb,0x3af43b66,0x9d780b29,0x1eceb089,
  100557. 0x701fef4b,0x53ebb99d } },
  100558. /* 8 */
  100559. { { 0xb0e63d34,0x4fe7ee31,0xa9e54fab,0xf4600572,0xd5e7b5a4,0xc0493334,
  100560. 0x06d54831,0x8589fb92 },
  100561. { 0x6583553a,0xaa70f5cc,0xe25649e5,0x0879094a,0x10044652,0xcc904507,
  100562. 0x02541c4f,0xebb0696d } },
  100563. /* 9 */
  100564. { { 0xac1647c5,0x4616ca15,0xc4cf5799,0xb8127d47,0x764dfbac,0xdc666aa3,
  100565. 0xd1b27da3,0xeb2820cb },
  100566. { 0x6a87e008,0x9406f8d8,0x922378f3,0xd87dfa9d,0x80ccecb2,0x56ed2e42,
  100567. 0x55a7da1d,0x1f28289b } },
  100568. /* 10 */
  100569. { { 0x3b89da99,0xabbaa0c0,0xb8284022,0xa6f2d79e,0xb81c05e8,0x27847862,
  100570. 0x05e54d63,0x337a4b59 },
  100571. { 0x21f7794a,0x3c67500d,0x7d6d7f61,0x207005b7,0x04cfd6e8,0x0a5a3781,
  100572. 0xf4c2fbd6,0x0d65e0d5 } },
  100573. /* 11 */
  100574. { { 0xb5275d38,0xd9d09bbe,0x0be0a358,0x4268a745,0x973eb265,0xf0762ff4,
  100575. 0x52f4a232,0xc23da242 },
  100576. { 0x0b94520c,0x5da1b84f,0xb05bd78e,0x09666763,0x94d29ea1,0x3a4dcb86,
  100577. 0xc790cff1,0x19de3b8c } },
  100578. /* 12 */
  100579. { { 0x26c5fe04,0x183a716c,0x3bba1bdb,0x3b28de0b,0xa4cb712c,0x7432c586,
  100580. 0x91fccbfd,0xe34dcbd4 },
  100581. { 0xaaa58403,0xb408d46b,0x82e97a53,0x9a697486,0x36aaa8af,0x9e390127,
  100582. 0x7b4e0f7f,0xe7641f44 } },
  100583. /* 13 */
  100584. { { 0xdf64ba59,0x7d753941,0x0b0242fc,0xd33f10ec,0xa1581859,0x4f06dfc6,
  100585. 0x052a57bf,0x4a12df57 },
  100586. { 0x9439dbd0,0xbfa6338f,0xbde53e1f,0xd3c24bd4,0x21f1b314,0xfd5e4ffa,
  100587. 0xbb5bea46,0x6af5aa93 } },
  100588. /* 14 */
  100589. { { 0x10c91999,0xda10b699,0x2a580491,0x0a24b440,0xb8cc2090,0x3e0094b4,
  100590. 0x66a44013,0x5fe3475a },
  100591. { 0xf93e7b4b,0xb0f8cabd,0x7c23f91a,0x292b501a,0xcd1e6263,0x42e889ae,
  100592. 0xecfea916,0xb544e308 } },
  100593. /* 15 */
  100594. { { 0x16ddfdce,0x6478c6e9,0xf89179e6,0x2c329166,0x4d4e67e1,0x4e8d6e76,
  100595. 0xa6b0c20b,0xe0b6b2bd },
  100596. { 0xbb7efb57,0x0d312df2,0x790c4007,0x1aac0dde,0x679bc944,0xf90336ad,
  100597. 0x25a63774,0x71c023de } },
  100598. /* 16 */
  100599. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  100600. 0x21d324f6,0x61d587d4 },
  100601. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  100602. 0x4621efbe,0xfa11fe12 } },
  100603. /* 17 */
  100604. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  100605. 0x1f13bedc,0x586eb04c },
  100606. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  100607. 0x70864f11,0x19d5ac08 } },
  100608. /* 18 */
  100609. { { 0x309a4e1f,0x1e99f581,0xe9270074,0xab7de71b,0xefd28d20,0x26a5ef0b,
  100610. 0x7f9c563f,0xe7c0073f },
  100611. { 0x0ef59f76,0x1f6d663a,0x20fcb050,0x669b3b54,0x7a6602d4,0xc08c1f7a,
  100612. 0xc65b3c0a,0xe08504fe } },
  100613. /* 19 */
  100614. { { 0xa031b3ca,0xf098f68d,0xe6da6d66,0x6d1cab9e,0x94f246e8,0x5bfd81fa,
  100615. 0x5b0996b4,0x78f01882 },
  100616. { 0x3a25787f,0xb7eefde4,0x1dccac9b,0x8016f80d,0xb35bfc36,0x0cea4877,
  100617. 0x7e94747a,0x43a773b8 } },
  100618. /* 20 */
  100619. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  100620. 0xc3b266b1,0xbb6de651 },
  100621. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  100622. 0x5d18b99b,0x60b4619a } },
  100623. /* 21 */
  100624. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  100625. 0xaeebffcd,0x9d0f27b2 },
  100626. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  100627. 0x356ec48d,0x244a566d } },
  100628. /* 22 */
  100629. { { 0xeacf1f96,0x6db0394a,0x024c271c,0x9f2122a9,0x82cbd3b9,0x2626ac1b,
  100630. 0x3581ef69,0x45e58c87 },
  100631. { 0xa38f9dbc,0xd3ff479d,0xe888a040,0xa8aaf146,0x46e0bed7,0x945adfb2,
  100632. 0xc1e4b7a4,0xc040e21c } },
  100633. /* 23 */
  100634. { { 0x6f8117b6,0x847af000,0x73a35433,0x651969ff,0x1d9475eb,0x482b3576,
  100635. 0x682c6ec7,0x1cdf5c97 },
  100636. { 0x11f04839,0x7db775b4,0x48de1698,0x7dbeacf4,0xb70b3219,0xb2921dd1,
  100637. 0xa92dff3d,0x046755f8 } },
  100638. /* 24 */
  100639. { { 0xbce8ffcd,0xcc8ac5d2,0x2fe61a82,0x0d53c48b,0x7202d6c7,0xf6f16172,
  100640. 0x3b83a5f3,0x046e5e11 },
  100641. { 0xd8007f01,0xe7b8ff64,0x5af43183,0x7fb1ef12,0x35e1a03c,0x045c5ea6,
  100642. 0x303d005b,0x6e0106c3 } },
  100643. /* 25 */
  100644. { { 0x88dd73b1,0x48c73584,0x995ed0d9,0x7670708f,0xc56a2ab7,0x38385ea8,
  100645. 0xe901cf1f,0x442594ed },
  100646. { 0x12d4b65b,0xf8faa2c9,0x96c90c37,0x94c2343b,0x5e978d1f,0xd326e4a1,
  100647. 0x4c2ee68e,0xa796fa51 } },
  100648. /* 26 */
  100649. { { 0x823addd7,0x359fb604,0xe56693b3,0x9e2a6183,0x3cbf3c80,0xf885b78e,
  100650. 0xc69766e9,0xe4ad2da9 },
  100651. { 0x8e048a61,0x357f7f42,0xc092d9a0,0x082d198c,0xc03ed8ef,0xfc3a1af4,
  100652. 0xc37b5143,0xc5e94046 } },
  100653. /* 27 */
  100654. { { 0x2be75f9e,0x476a538c,0xcb123a78,0x6fd1a9e8,0xb109c04b,0xd85e4df0,
  100655. 0xdb464747,0x63283daf },
  100656. { 0xbaf2df15,0xce728cf7,0x0ad9a7f4,0xe592c455,0xe834bcc3,0xfab226ad,
  100657. 0x1981a938,0x68bd19ab } },
  100658. /* 28 */
  100659. { { 0x1887d659,0xc08ead51,0xb359305a,0x3374d5f4,0xcfe74fe3,0x96986981,
  100660. 0x3c6fdfd6,0x495292f5 },
  100661. { 0x1acec896,0x4a878c9e,0xec5b4484,0xd964b210,0x664d60a7,0x6696f7e2,
  100662. 0x26036837,0x0ec7530d } },
  100663. /* 29 */
  100664. { { 0xad2687bb,0x2da13a05,0xf32e21fa,0xa1f83b6a,0x1dd4607b,0x390f5ef5,
  100665. 0x64863f0b,0x0f6207a6 },
  100666. { 0x0f138233,0xbd67e3bb,0x272aa718,0xdd66b96c,0x26ec88ae,0x8ed00407,
  100667. 0x08ed6dcf,0xff0db072 } },
  100668. /* 30 */
  100669. { { 0x4c95d553,0x749fa101,0x5d680a8a,0xa44052fd,0xff3b566f,0x183b4317,
  100670. 0x88740ea3,0x313b513c },
  100671. { 0x08d11549,0xb402e2ac,0xb4dee21c,0x071ee10b,0x47f2320e,0x26b987dd,
  100672. 0x86f19f81,0x2d3abcf9 } },
  100673. /* 31 */
  100674. { { 0x815581a2,0x4c288501,0x632211af,0x9a0a6d56,0x0cab2e99,0x19ba7a0f,
  100675. 0xded98cdf,0xc036fa10 },
  100676. { 0xc1fbd009,0x29ae08ba,0x06d15816,0x0b68b190,0x9b9e0d8f,0xc2eb3277,
  100677. 0xb6d40194,0xa6b2a2c4 } },
  100678. /* 32 */
  100679. { { 0x6d3549cf,0xd433e50f,0xfacd665e,0x6f33696f,0xce11fcb4,0x695bfdac,
  100680. 0xaf7c9860,0x810ee252 },
  100681. { 0x7159bb2c,0x65450fe1,0x758b357b,0xf7dfbebe,0xd69fea72,0x2b057e74,
  100682. 0x92731745,0xd485717a } },
  100683. /* 33 */
  100684. { { 0xf0cb5a98,0x11741a8a,0x1f3110bf,0xd3da8f93,0xab382adf,0x1994e2cb,
  100685. 0x2f9a604e,0x6a6045a7 },
  100686. { 0xa2b2411d,0x170c0d3f,0x510e96e0,0xbe0eb83e,0x8865b3cc,0x3bcc9f73,
  100687. 0xf9e15790,0xd3e45cfa } },
  100688. /* 34 */
  100689. { { 0xe83f7669,0xce1f69bb,0x72877d6b,0x09f8ae82,0x3244278d,0x9548ae54,
  100690. 0xe3c2c19c,0x207755de },
  100691. { 0x6fef1945,0x87bd61d9,0xb12d28c3,0x18813cef,0x72df64aa,0x9fbcd1d6,
  100692. 0x7154b00d,0x48dc5ee5 } },
  100693. /* 35 */
  100694. { { 0xf7e5a199,0x123790bf,0x989ccbb7,0xe0efb8cf,0x0a519c79,0xc27a2bfe,
  100695. 0xdff6f445,0xf2fb0aed },
  100696. { 0xf0b5025f,0x41c09575,0x40fa9f22,0x550543d7,0x380bfbd0,0x8fa3c8ad,
  100697. 0xdb28d525,0xa13e9015 } },
  100698. /* 36 */
  100699. { { 0xa2b65cbc,0xf9f7a350,0x2a464226,0x0b04b972,0xe23f07a1,0x265ce241,
  100700. 0x1497526f,0x2bf0d6b0 },
  100701. { 0x4b216fb7,0xd3d4dd3f,0xfbdda26a,0xf7d7b867,0x6708505c,0xaeb7b83f,
  100702. 0x162fe89f,0x42a94a5a } },
  100703. /* 37 */
  100704. { { 0xeaadf191,0x5846ad0b,0x25a268d7,0x0f8a4890,0x494dc1f6,0xe8603050,
  100705. 0xc65ede3d,0x2c2dd969 },
  100706. { 0x93849c17,0x6d02171d,0x1da250dd,0x460488ba,0x3c3a5485,0x4810c706,
  100707. 0x42c56dbc,0xf437fa1f } },
  100708. /* 38 */
  100709. { { 0x4a0f7dab,0x6aa0d714,0x1776e9ac,0x0f049793,0xf5f39786,0x52c0a050,
  100710. 0x54707aa8,0xaaf45b33 },
  100711. { 0xc18d364a,0x85e37c33,0x3e497165,0xd40b9b06,0x15ec5444,0xf4171681,
  100712. 0xf4f272bc,0xcdf6310d } },
  100713. /* 39 */
  100714. { { 0x8ea8b7ef,0x7473c623,0x85bc2287,0x08e93518,0x2bda8e34,0x41956772,
  100715. 0xda9e2ff2,0xf0d008ba },
  100716. { 0x2414d3b1,0x2912671d,0xb019ea76,0xb3754985,0x453bcbdb,0x5c61b96d,
  100717. 0xca887b8b,0x5bd5c2f5 } },
  100718. /* 40 */
  100719. { { 0xf49a3154,0xef0f469e,0x6e2b2e9a,0x3e85a595,0xaa924a9c,0x45aaec1e,
  100720. 0xa09e4719,0xaa12dfc8 },
  100721. { 0x4df69f1d,0x26f27227,0xa2ff5e73,0xe0e4c82c,0xb7a9dd44,0xb9d8ce73,
  100722. 0xe48ca901,0x6c036e73 } },
  100723. /* 41 */
  100724. { { 0x0f6e3138,0x5cfae12a,0x25ad345a,0x6966ef00,0x45672bc5,0x8993c64b,
  100725. 0x96afbe24,0x292ff658 },
  100726. { 0x5e213402,0xd5250d44,0x4392c9fe,0xf6580e27,0xda1c72e8,0x097b397f,
  100727. 0x311b7276,0x644e0c90 } },
  100728. /* 42 */
  100729. { { 0xa47153f0,0xe1e421e1,0x920418c9,0xb86c3b79,0x705d7672,0x93bdce87,
  100730. 0xcab79a77,0xf25ae793 },
  100731. { 0x6d869d0c,0x1f3194a3,0x4986c264,0x9d55c882,0x096e945e,0x49fb5ea3,
  100732. 0x13db0a3e,0x39b8e653 } },
  100733. /* 43 */
  100734. { { 0xb6fd2e59,0x37754200,0x9255c98f,0x35e2c066,0x0e2a5739,0xd9dab21a,
  100735. 0x0f19db06,0x39122f2f },
  100736. { 0x03cad53c,0xcfbce1e0,0xe65c17e3,0x225b2c0f,0x9aa13877,0x72baf1d2,
  100737. 0xce80ff8d,0x8de80af8 } },
  100738. /* 44 */
  100739. { { 0x207bbb76,0xafbea8d9,0x21782758,0x921c7e7c,0x1c0436b1,0xdfa2b74b,
  100740. 0x2e368c04,0x87194906 },
  100741. { 0xa3993df5,0xb5f928bb,0xf3b3d26a,0x639d75b5,0x85b55050,0x011aa78a,
  100742. 0x5b74fde1,0xfc315e6a } },
  100743. /* 45 */
  100744. { { 0xe8d6ecfa,0x561fd41a,0x1aec7f86,0x5f8c44f6,0x4924741d,0x98452a7b,
  100745. 0xee389088,0xe6d4a7ad },
  100746. { 0x4593c75d,0x60552ed1,0xdd271162,0x70a70da4,0x7ba2c7db,0xd2aede93,
  100747. 0x9be2ae57,0x35dfaf9a } },
  100748. /* 46 */
  100749. { { 0xaa736636,0x6b956fcd,0xae2cab7e,0x09f51d97,0x0f349966,0xfb10bf41,
  100750. 0x1c830d2b,0x1da5c7d7 },
  100751. { 0x3cce6825,0x5c41e483,0xf9573c3b,0x15ad118f,0xf23036b8,0xa28552c7,
  100752. 0xdbf4b9d6,0x7077c0fd } },
  100753. /* 47 */
  100754. { { 0x46b9661c,0xbf63ff8d,0x0d2cfd71,0xa1dfd36b,0xa847f8f7,0x0373e140,
  100755. 0xe50efe44,0x53a8632e },
  100756. { 0x696d8051,0x0976ff68,0xc74f468a,0xdaec0c95,0x5e4e26bd,0x62994dc3,
  100757. 0x34e1fcc1,0x028ca76d } },
  100758. /* 48 */
  100759. { { 0xfc9877ee,0xd11d47dc,0x801d0002,0xc8b36210,0x54c260b6,0xd002c117,
  100760. 0x6962f046,0x04c17cd8 },
  100761. { 0xb0daddf5,0x6d9bd094,0x24ce55c0,0xbea23575,0x72da03b5,0x663356e6,
  100762. 0xfed97474,0xf7ba4de9 } },
  100763. /* 49 */
  100764. { { 0xebe1263f,0xd0dbfa34,0x71ae7ce6,0x55763735,0x82a6f523,0xd2440553,
  100765. 0x52131c41,0xe31f9600 },
  100766. { 0xea6b6ec6,0xd1bb9216,0x73c2fc44,0x37a1d12e,0x89d0a294,0xc10e7eac,
  100767. 0xce34d47b,0xaa3a6259 } },
  100768. /* 50 */
  100769. { { 0x36f3dcd3,0xfbcf9df5,0xd2bf7360,0x6ceded50,0xdf504f5b,0x491710fa,
  100770. 0x7e79daee,0x2398dd62 },
  100771. { 0x6d09569e,0xcf4705a3,0x5149f769,0xea0619bb,0x35f6034c,0xff9c0377,
  100772. 0x1c046210,0x5717f5b2 } },
  100773. /* 51 */
  100774. { { 0x21dd895e,0x9fe229c9,0x40c28451,0x8e518500,0x1d637ecd,0xfa13d239,
  100775. 0x0e3c28de,0x660a2c56 },
  100776. { 0xd67fcbd0,0x9cca88ae,0x0ea9f096,0xc8472478,0x72e92b4d,0x32b2f481,
  100777. 0x4f522453,0x624ee54c } },
  100778. /* 52 */
  100779. { { 0xd897eccc,0x09549ce4,0x3f9880aa,0x4d49d1d9,0x043a7c20,0x723c2423,
  100780. 0x92bdfbc0,0x4f392afb },
  100781. { 0x7de44fd9,0x6969f8fa,0x57b32156,0xb66cfbe4,0x368ebc3c,0xdb2fa803,
  100782. 0xccdb399c,0x8a3e7977 } },
  100783. /* 53 */
  100784. { { 0x06c4b125,0xdde1881f,0xf6e3ca8c,0xae34e300,0x5c7a13e9,0xef6999de,
  100785. 0x70c24404,0x3888d023 },
  100786. { 0x44f91081,0x76280356,0x5f015504,0x3d9fcf61,0x632cd36e,0x1827edc8,
  100787. 0x18102336,0xa5e62e47 } },
  100788. /* 54 */
  100789. { { 0x2facd6c8,0x1a825ee3,0x54bcbc66,0x699c6354,0x98df9931,0x0ce3edf7,
  100790. 0x466a5adc,0x2c4768e6 },
  100791. { 0x90a64bc9,0xb346ff8c,0xe4779f5c,0x630a6020,0xbc05e884,0xd949d064,
  100792. 0xf9e652a0,0x7b5e6441 } },
  100793. /* 55 */
  100794. { { 0x1d28444a,0x2169422c,0xbe136a39,0xe996c5d8,0xfb0c7fce,0x2387afe5,
  100795. 0x0c8d744a,0xb8af73cb },
  100796. { 0x338b86fd,0x5fde83aa,0xa58a5cff,0xfee3f158,0x20ac9433,0xc9ee8f6f,
  100797. 0x7f3f0895,0xa036395f } },
  100798. /* 56 */
  100799. { { 0xa10f7770,0x8c73c6bb,0xa12a0e24,0xa6f16d81,0x51bc2b9f,0x100df682,
  100800. 0x875fb533,0x4be36b01 },
  100801. { 0x9fb56dbb,0x9226086e,0x07e7a4f8,0x306fef8b,0x66d52f20,0xeeaccc05,
  100802. 0x1bdc00c0,0x8cbc9a87 } },
  100803. /* 57 */
  100804. { { 0xc0dac4ab,0xe131895c,0x712ff112,0xa874a440,0x6a1cee57,0x6332ae7c,
  100805. 0x0c0835f8,0x44e7553e },
  100806. { 0x7734002d,0x6d503fff,0x0b34425c,0x9d35cb8b,0x0e8738b5,0x95f70276,
  100807. 0x5eb8fc18,0x470a683a } },
  100808. /* 58 */
  100809. { { 0x90513482,0x81b761dc,0x01e9276a,0x0287202a,0x0ce73083,0xcda441ee,
  100810. 0xc63dc6ef,0x16410690 },
  100811. { 0x6d06a2ed,0xf5034a06,0x189b100b,0xdd4d7745,0xab8218c9,0xd914ae72,
  100812. 0x7abcbb4f,0xd73479fd } },
  100813. /* 59 */
  100814. { { 0x5ad4c6e5,0x7edefb16,0x5b06d04d,0x262cf08f,0x8575cb14,0x12ed5bb1,
  100815. 0x0771666b,0x816469e3 },
  100816. { 0x561e291e,0xd7ab9d79,0xc1de1661,0xeb9daf22,0x135e0513,0xf49827eb,
  100817. 0xf0dd3f9c,0x0a36dd23 } },
  100818. /* 60 */
  100819. { { 0x41d5533c,0x098d32c7,0x8684628f,0x7c5f5a9e,0xe349bd11,0x39a228ad,
  100820. 0xfdbab118,0xe331dfd6 },
  100821. { 0x6bcc6ed8,0x5100ab68,0xef7a260e,0x7160c3bd,0xbce850d7,0x9063d9a7,
  100822. 0x492e3389,0xd3b4782a } },
  100823. /* 61 */
  100824. { { 0xf3821f90,0xa149b6e8,0x66eb7aad,0x92edd9ed,0x1a013116,0x0bb66953,
  100825. 0x4c86a5bd,0x7281275a },
  100826. { 0xd3ff47e5,0x503858f7,0x61016441,0x5e1616bc,0x7dfd9bb1,0x62b0f11a,
  100827. 0xce145059,0x2c062e7e } },
  100828. /* 62 */
  100829. { { 0x0159ac2e,0xa76f996f,0xcbdb2713,0x281e7736,0x08e46047,0x2ad6d288,
  100830. 0x2c4e7ef1,0x282a35f9 },
  100831. { 0xc0ce5cd2,0x9c354b1e,0x1379c229,0xcf99efc9,0x3e82c11e,0x992caf38,
  100832. 0x554d2abd,0xc71cd513 } },
  100833. /* 63 */
  100834. { { 0x09b578f4,0x4885de9c,0xe3affa7a,0x1884e258,0x59182f1f,0x8f76b1b7,
  100835. 0xcf47f3a3,0xc50f6740 },
  100836. { 0x374b68ea,0xa9c4adf3,0x69965fe2,0xa406f323,0x85a53050,0x2f86a222,
  100837. 0x212958dc,0xb9ecb3a7 } },
  100838. /* 64 */
  100839. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  100840. 0xcd42ab1b,0x803f3e02 },
  100841. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  100842. 0x5067adc1,0xc097440e } },
  100843. /* 65 */
  100844. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  100845. 0x915f1f30,0xf1af32d5 },
  100846. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  100847. 0xe2d41c8b,0x23d0f130 } },
  100848. /* 66 */
  100849. { { 0xf41500d9,0x857ab6ed,0xfcbeada8,0x0d890ae5,0x89725951,0x52fe8648,
  100850. 0xc0a3fadd,0xb0288dd6 },
  100851. { 0x650bcb08,0x85320f30,0x695d6e16,0x71af6313,0xb989aa76,0x31f520a7,
  100852. 0xf408c8d2,0xffd3724f } },
  100853. /* 67 */
  100854. { { 0xb458e6cb,0x53968e64,0x317a5d28,0x992dad20,0x7aa75f56,0x3814ae0b,
  100855. 0xd78c26df,0xf5590f4a },
  100856. { 0xcf0ba55a,0x0fc24bd3,0x0c778bae,0x0fc4724a,0x683b674a,0x1ce9864f,
  100857. 0xf6f74a20,0x18d6da54 } },
  100858. /* 68 */
  100859. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  100860. 0x7990216a,0x50bbb4d9 },
  100861. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  100862. 0x01fe49c3,0x2b100118 } },
  100863. /* 69 */
  100864. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  100865. 0x83fbae0c,0xdd558999 },
  100866. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  100867. 0x149d6041,0xe6e4c551 } },
  100868. /* 70 */
  100869. { { 0x1e9af288,0x55f655bb,0xf7ada931,0x647e1a64,0xcb2820e5,0x43697e4b,
  100870. 0x07ed56ff,0x51e00db1 },
  100871. { 0x771c327e,0x43d169b8,0x4a96c2ad,0x29cdb20b,0x3deb4779,0xc07d51f5,
  100872. 0x49829177,0xe22f4241 } },
  100873. /* 71 */
  100874. { { 0x635f1abb,0xcd45e8f4,0x68538874,0x7edc0cb5,0xb5a8034d,0xc9472c1f,
  100875. 0x52dc48c9,0xf709373d },
  100876. { 0xa8af30d6,0x401966bb,0xf137b69c,0x95bf5f4a,0x9361c47e,0x3966162a,
  100877. 0xe7275b11,0xbd52d288 } },
  100878. /* 72 */
  100879. { { 0x9c5fa877,0xab155c7a,0x7d3a3d48,0x17dad672,0x73d189d8,0x43f43f9e,
  100880. 0xc8aa77a6,0xa0d0f8e4 },
  100881. { 0xcc94f92d,0x0bbeafd8,0x0c4ddb3a,0xd818c8be,0xb82eba14,0x22cc65f8,
  100882. 0x946d6a00,0xa56c78c7 } },
  100883. /* 73 */
  100884. { { 0x0dd09529,0x2962391b,0x3daddfcf,0x803e0ea6,0x5b5bf481,0x2c77351f,
  100885. 0x731a367a,0xd8befdf8 },
  100886. { 0xfc0157f4,0xab919d42,0xfec8e650,0xf51caed7,0x02d48b0a,0xcdf9cb40,
  100887. 0xce9f6478,0x854a68a5 } },
  100888. /* 74 */
  100889. { { 0x63506ea5,0xdc35f67b,0xa4fe0d66,0x9286c489,0xfe95cd4d,0x3f101d3b,
  100890. 0x98846a95,0x5cacea0b },
  100891. { 0x9ceac44d,0xa90df60c,0x354d1c3a,0x3db29af4,0xad5dbabe,0x08dd3de8,
  100892. 0x35e4efa9,0xe4982d12 } },
  100893. /* 75 */
  100894. { { 0xc34cd55e,0x23104a22,0x2680d132,0x58695bb3,0x1fa1d943,0xfb345afa,
  100895. 0x16b20499,0x8046b7f6 },
  100896. { 0x38e7d098,0xb533581e,0xf46f0b70,0xd7f61e8d,0x44cb78c4,0x30dea9ea,
  100897. 0x9082af55,0xeb17ca7b } },
  100898. /* 76 */
  100899. { { 0x76a145b9,0x1751b598,0xc1bc71ec,0xa5cf6b0f,0x392715bb,0xd3e03565,
  100900. 0xfab5e131,0x097b00ba },
  100901. { 0x565f69e1,0xaa66c8e9,0xb5be5199,0x77e8f75a,0xda4fd984,0x6033ba11,
  100902. 0xafdbcc9e,0xf95c747b } },
  100903. /* 77 */
  100904. { { 0xbebae45e,0x558f01d3,0xc4bc6955,0xa8ebe9f0,0xdbc64fc6,0xaeb705b1,
  100905. 0x566ed837,0x3512601e },
  100906. { 0xfa1161cd,0x9336f1e1,0x4c65ef87,0x328ab8d5,0x724f21e5,0x4757eee2,
  100907. 0x6068ab6b,0x0ef97123 } },
  100908. /* 78 */
  100909. { { 0x54ca4226,0x02598cf7,0xf8642c8e,0x5eede138,0x468e1790,0x48963f74,
  100910. 0x3b4fbc95,0xfc16d933 },
  100911. { 0xe7c800ca,0xbe96fb31,0x2678adaa,0x13806331,0x6ff3e8b5,0x3d624497,
  100912. 0xb95d7a17,0x14ca4af1 } },
  100913. /* 79 */
  100914. { { 0xbd2f81d5,0x7a4771ba,0x01f7d196,0x1a5f9d69,0xcad9c907,0xd898bef7,
  100915. 0xf59c231d,0x4057b063 },
  100916. { 0x89c05c0a,0xbffd82fe,0x1dc0df85,0xe4911c6f,0xa35a16db,0x3befccae,
  100917. 0xf1330b13,0x1c3b5d64 } },
  100918. /* 80 */
  100919. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  100920. 0xdb7e63af,0xfad27148 },
  100921. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  100922. 0x9f0e1a84,0x77387de3 } },
  100923. /* 81 */
  100924. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  100925. 0xbef0c47e,0xb37b85c0 },
  100926. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  100927. 0xf9f628d5,0x9c135ac8 } },
  100928. /* 82 */
  100929. { { 0x84e35743,0x32aa3202,0x85a3cdef,0x320d6ab1,0x1df19819,0xb821b176,
  100930. 0xc433851f,0x5721361f },
  100931. { 0x71fc9168,0x1f0db36a,0x5e5c403c,0x5f98ba73,0x37bcd8f5,0xf64ca87e,
  100932. 0xe6bb11bd,0xdcbac3c9 } },
  100933. /* 83 */
  100934. { { 0x4518cbe2,0xf01d9968,0x9c9eb04e,0xd242fc18,0xe47feebf,0x727663c7,
  100935. 0x2d626862,0xb8c1c89e },
  100936. { 0xc8e1d569,0x51a58bdd,0xb7d88cd0,0x563809c8,0xf11f31eb,0x26c27fd9,
  100937. 0x2f9422d4,0x5d23bbda } },
  100938. /* 84 */
  100939. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  100940. 0x91ece900,0xc109f9cb },
  100941. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  100942. 0x2eee1ee1,0x9bc3344f } },
  100943. /* 85 */
  100944. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  100945. 0x5f1a4cc1,0x29591d52 },
  100946. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  100947. 0x18ef332c,0x6376551f } },
  100948. /* 86 */
  100949. { { 0x562976cc,0xbda5f14e,0x0ef12c38,0x22bca3e6,0x6cca9852,0xbbfa3064,
  100950. 0x08e2987a,0xbdb79dc8 },
  100951. { 0xcb06a772,0xfd2cb5c9,0xfe536dce,0x38f475aa,0x7c2b5db8,0xc2a3e022,
  100952. 0xadd3c14a,0x8ee86001 } },
  100953. /* 87 */
  100954. { { 0xa4ade873,0xcbe96981,0xc4fba48c,0x7ee9aa4d,0x5a054ba5,0x2cee2899,
  100955. 0x6f77aa4b,0x92e51d7a },
  100956. { 0x7190a34d,0x948bafa8,0xf6bd1ed1,0xd698f75b,0x0caf1144,0xd00ee6e3,
  100957. 0x0a56aaaa,0x5182f86f } },
  100958. /* 88 */
  100959. { { 0x7a4cc99c,0xfba6212c,0x3e6d9ca1,0xff609b68,0x5ac98c5a,0x5dbb27cb,
  100960. 0x4073a6f2,0x91dcab5d },
  100961. { 0x5f575a70,0x01b6cc3d,0x6f8d87fa,0x0cb36139,0x89981736,0x165d4e8c,
  100962. 0x97974f2b,0x17a0cedb } },
  100963. /* 89 */
  100964. { { 0x076c8d3a,0x38861e2a,0x210f924b,0x701aad39,0x13a835d9,0x94d0eae4,
  100965. 0x7f4cdf41,0x2e8ce36c },
  100966. { 0x037a862b,0x91273dab,0x60e4c8fa,0x01ba9bb7,0x33baf2dd,0xf9645388,
  100967. 0x34f668f3,0xf4ccc6cb } },
  100968. /* 90 */
  100969. { { 0xf1f79687,0x44ef525c,0x92efa815,0x7c595495,0xa5c78d29,0xe1231741,
  100970. 0x9a0df3c9,0xac0db488 },
  100971. { 0xdf01747f,0x86bfc711,0xef17df13,0x592b9358,0x5ccb6bb5,0xe5880e4f,
  100972. 0x94c974a2,0x95a64a61 } },
  100973. /* 91 */
  100974. { { 0xc15a4c93,0x72c1efda,0x82585141,0x40269b73,0x16cb0bad,0x6a8dfb1c,
  100975. 0x29210677,0x231e54ba },
  100976. { 0x8ae6d2dc,0xa70df917,0x39112918,0x4d6aa63f,0x5e5b7223,0xf627726b,
  100977. 0xd8a731e1,0xab0be032 } },
  100978. /* 92 */
  100979. { { 0x8d131f2d,0x097ad0e9,0x3b04f101,0x637f09e3,0xd5e9a748,0x1ac86196,
  100980. 0x2cf6a679,0xf1bcc880 },
  100981. { 0xe8daacb4,0x25c69140,0x60f65009,0x3c4e4055,0x477937a6,0x591cc8fc,
  100982. 0x5aebb271,0x85169469 } },
  100983. /* 93 */
  100984. { { 0xf1dcf593,0xde35c143,0xb018be3b,0x78202b29,0x9bdd9d3d,0xe9cdadc2,
  100985. 0xdaad55d8,0x8f67d9d2 },
  100986. { 0x7481ea5f,0x84111656,0xe34c590c,0xe7d2dde9,0x05053fa8,0xffdd43f4,
  100987. 0xc0728b5d,0xf84572b9 } },
  100988. /* 94 */
  100989. { { 0x97af71c9,0x5e1a7a71,0x7a736565,0xa1449444,0x0e1d5063,0xa1b4ae07,
  100990. 0x616b2c19,0xedee2710 },
  100991. { 0x11734121,0xb2f034f5,0x4a25e9f0,0x1cac6e55,0xa40c2ecf,0x8dc148f3,
  100992. 0x44ebd7f4,0x9fd27e9b } },
  100993. /* 95 */
  100994. { { 0xf6e2cb16,0x3cc7658a,0xfe5919b6,0xe3eb7d2c,0x168d5583,0x5a8c5816,
  100995. 0x958ff387,0xa40c2fb6 },
  100996. { 0xfedcc158,0x8c9ec560,0x55f23056,0x7ad804c6,0x9a307e12,0xd9396704,
  100997. 0x7dc6decf,0x99bc9bb8 } },
  100998. /* 96 */
  100999. { { 0x927dafc6,0x84a9521d,0x5c09cd19,0x52c1fb69,0xf9366dde,0x9d9581a0,
  101000. 0xa16d7e64,0x9abe210b },
  101001. { 0x48915220,0x480af84a,0x4dd816c6,0xfa73176a,0x1681ca5a,0xc7d53987,
  101002. 0x87f344b0,0x7881c257 } },
  101003. /* 97 */
  101004. { { 0xe0bcf3ff,0x93399b51,0x127f74f6,0x0d02cbc5,0xdd01d968,0x8fb465a2,
  101005. 0xa30e8940,0x15e6e319 },
  101006. { 0x3e0e05f4,0x646d6e0d,0x43588404,0xfad7bddc,0xc4f850d3,0xbe61c7d1,
  101007. 0x191172ce,0x0e55facf } },
  101008. /* 98 */
  101009. { { 0xf8787564,0x7e9d9806,0x31e85ce6,0x1a331721,0xb819e8d6,0x6b0158ca,
  101010. 0x6fe96577,0xd73d0976 },
  101011. { 0x1eb7206e,0x42483425,0xc618bb42,0xa519290f,0x5e30a520,0x5dcbb859,
  101012. 0x8f15a50b,0x9250a374 } },
  101013. /* 99 */
  101014. { { 0xbe577410,0xcaff08f8,0x5077a8c6,0xfd408a03,0xec0a63a4,0xf1f63289,
  101015. 0xc1cc8c0b,0x77414082 },
  101016. { 0xeb0991cd,0x05a40fa6,0x49fdc296,0xc1ca0866,0xb324fd40,0x3a68a3c7,
  101017. 0x12eb20b9,0x8cb04f4d } },
  101018. /* 100 */
  101019. { { 0x6906171c,0xb1c2d055,0xb0240c3f,0x9073e9cd,0xd8906841,0xdb8e6b4f,
  101020. 0x47123b51,0xe4e429ef },
  101021. { 0x38ec36f4,0x0b8dd53c,0xff4b6a27,0xf9d2dc01,0x879a9a48,0x5d066e07,
  101022. 0x3c6e6552,0x37bca2ff } },
  101023. /* 101 */
  101024. { { 0xdf562470,0x4cd2e3c7,0xc0964ac9,0x44f272a2,0x80c793be,0x7c6d5df9,
  101025. 0x3002b22a,0x59913edc },
  101026. { 0x5750592a,0x7a139a83,0xe783de02,0x99e01d80,0xea05d64f,0xcf8c0375,
  101027. 0xb013e226,0x43786e4a } },
  101028. /* 102 */
  101029. { { 0x9e56b5a6,0xff32b0ed,0xd9fc68f9,0x0750d9a6,0x597846a7,0xec15e845,
  101030. 0xb7e79e7a,0x8638ca98 },
  101031. { 0x0afc24b2,0x2f5ae096,0x4dace8f2,0x05398eaf,0xaecba78f,0x3b765dd0,
  101032. 0x7b3aa6f0,0x1ecdd36a } },
  101033. /* 103 */
  101034. { { 0x6c5ff2f3,0x5d3acd62,0x2873a978,0xa2d516c0,0xd2110d54,0xad94c9fa,
  101035. 0xd459f32d,0xd85d0f85 },
  101036. { 0x10b11da3,0x9f700b8d,0xa78318c4,0xd2c22c30,0x9208decd,0x556988f4,
  101037. 0xb4ed3c62,0xa04f19c3 } },
  101038. /* 104 */
  101039. { { 0xed7f93bd,0x087924c8,0x392f51f6,0xcb64ac5d,0x821b71af,0x7cae330a,
  101040. 0x5c0950b0,0x92b2eeea },
  101041. { 0x85b6e235,0x85ac4c94,0x2936c0f0,0xab2ca4a9,0xe0508891,0x80faa6b3,
  101042. 0x5834276c,0x1ee78221 } },
  101043. /* 105 */
  101044. { { 0xe63e79f7,0xa60a2e00,0xf399d906,0xf590e7b2,0x6607c09d,0x9021054a,
  101045. 0x57a6e150,0xf3f2ced8 },
  101046. { 0xf10d9b55,0x200510f3,0xd8642648,0x9d2fcfac,0xe8bd0e7c,0xe5631aa7,
  101047. 0x3da3e210,0x0f56a454 } },
  101048. /* 106 */
  101049. { { 0x1043e0df,0x5b21bffa,0x9c007e6d,0x6c74b6cc,0xd4a8517a,0x1a656ec0,
  101050. 0x1969e263,0xbd8f1741 },
  101051. { 0xbeb7494a,0x8a9bbb86,0x45f3b838,0x1567d46f,0xa4e5a79a,0xdf7a12a7,
  101052. 0x30ccfa09,0x2d1a1c35 } },
  101053. /* 107 */
  101054. { { 0x506508da,0x192e3813,0xa1d795a7,0x336180c4,0x7a9944b3,0xcddb5949,
  101055. 0xb91fba46,0xa107a65e },
  101056. { 0x0f94d639,0xe6d1d1c5,0x8a58b7d7,0x8b4af375,0xbd37ca1c,0x1a7c5584,
  101057. 0xf87a9af2,0x183d760a } },
  101058. /* 108 */
  101059. { { 0x0dde59a4,0x29d69711,0x0e8bef87,0xf1ad8d07,0x4f2ebe78,0x229b4963,
  101060. 0xc269d754,0x1d44179d },
  101061. { 0x8390d30e,0xb32dc0cf,0x0de8110c,0x0a3b2753,0x2bc0339a,0x31af1dc5,
  101062. 0x9606d262,0x771f9cc2 } },
  101063. /* 109 */
  101064. { { 0x85040739,0x99993e77,0x8026a939,0x44539db9,0xf5f8fc26,0xcf40f6f2,
  101065. 0x0362718e,0x64427a31 },
  101066. { 0x85428aa8,0x4f4f2d87,0xebfb49a8,0x7b7adc3f,0xf23d01ac,0x201b2c6d,
  101067. 0x6ae90d6d,0x49d9b749 } },
  101068. /* 110 */
  101069. { { 0x435d1099,0xcc78d8bc,0x8e8d1a08,0x2adbcd4e,0x2cb68a41,0x02c2e2a0,
  101070. 0x3f605445,0x9037d81b },
  101071. { 0x074c7b61,0x7cdbac27,0x57bfd72e,0xfe2031ab,0x596d5352,0x61ccec96,
  101072. 0x7cc0639c,0x08c3de6a } },
  101073. /* 111 */
  101074. { { 0xf6d552ab,0x20fdd020,0x05cd81f1,0x56baff98,0x91351291,0x06fb7c3e,
  101075. 0x45796b2f,0xc6909442 },
  101076. { 0x41231bd1,0x17b3ae9c,0x5cc58205,0x1eac6e87,0xf9d6a122,0x208837ab,
  101077. 0xcafe3ac0,0x3fa3db02 } },
  101078. /* 112 */
  101079. { { 0x05058880,0xd75a3e65,0x643943f2,0x7da365ef,0xfab24925,0x4147861c,
  101080. 0xfdb808ff,0xc5c4bdb0 },
  101081. { 0xb272b56b,0x73513e34,0x11b9043a,0xc8327e95,0xf8844969,0xfd8ce37d,
  101082. 0x46c2b6b5,0x2d56db94 } },
  101083. /* 113 */
  101084. { { 0xff46ac6b,0x2461782f,0x07a2e425,0xd19f7926,0x09a48de1,0xfafea3c4,
  101085. 0xe503ba42,0x0f56bd9d },
  101086. { 0x345cda49,0x137d4ed1,0x816f299d,0x821158fc,0xaeb43402,0xe7c6a54a,
  101087. 0x1173b5f1,0x4003bb9d } },
  101088. /* 114 */
  101089. { { 0xa0803387,0x3b8e8189,0x39cbd404,0xece115f5,0xd2877f21,0x4297208d,
  101090. 0xa07f2f9e,0x53765522 },
  101091. { 0xa8a4182d,0xa4980a21,0x3219df79,0xa2bbd07a,0x1a19a2d4,0x674d0a2e,
  101092. 0x6c5d4549,0x7a056f58 } },
  101093. /* 115 */
  101094. { { 0x9d8a2a47,0x646b2558,0xc3df2773,0x5b582948,0xabf0d539,0x51ec000e,
  101095. 0x7a1a2675,0x77d482f1 },
  101096. { 0x87853948,0xb8a1bd95,0x6cfbffee,0xa6f817bd,0x80681e47,0xab6ec057,
  101097. 0x2b38b0e4,0x4115012b } },
  101098. /* 116 */
  101099. { { 0x6de28ced,0x3c73f0f4,0x9b13ec47,0x1d5da760,0x6e5c6392,0x61b8ce9e,
  101100. 0xfbea0946,0xcdf04572 },
  101101. { 0x6c53c3b0,0x1cb3c58b,0x447b843c,0x97fe3c10,0x2cb9780e,0xfb2b8ae1,
  101102. 0x97383109,0xee703dda } },
  101103. /* 117 */
  101104. { { 0xff57e43a,0x34515140,0xb1b811b8,0xd44660d3,0x8f42b986,0x2b3b5dff,
  101105. 0xa162ce21,0x2a0ad89d },
  101106. { 0x6bc277ba,0x64e4a694,0xc141c276,0xc788c954,0xcabf6274,0x141aa64c,
  101107. 0xac2b4659,0xd62d0b67 } },
  101108. /* 118 */
  101109. { { 0x2c054ac4,0x39c5d87b,0xf27df788,0x57005859,0xb18128d6,0xedf7cbf3,
  101110. 0x991c2426,0xb39a23f2 },
  101111. { 0xf0b16ae5,0x95284a15,0xa136f51b,0x0c6a05b1,0xf2700783,0x1d63c137,
  101112. 0xc0674cc5,0x04ed0092 } },
  101113. /* 119 */
  101114. { { 0x9ae90393,0x1f4185d1,0x4a3d64e6,0x3047b429,0x9854fc14,0xae0001a6,
  101115. 0x0177c387,0xa0a91fc1 },
  101116. { 0xae2c831e,0xff0a3f01,0x2b727e16,0xbb76ae82,0x5a3075b4,0x8f12c8a1,
  101117. 0x9ed20c41,0x084cf988 } },
  101118. /* 120 */
  101119. { { 0xfca6becf,0xd98509de,0x7dffb328,0x2fceae80,0x4778e8b9,0x5d8a15c4,
  101120. 0x73abf77e,0xd57955b2 },
  101121. { 0x31b5d4f1,0x210da79e,0x3cfa7a1c,0xaa52f04b,0xdc27c20b,0xd4d12089,
  101122. 0x02d141f1,0x8e14ea42 } },
  101123. /* 121 */
  101124. { { 0xf2897042,0xeed50345,0x43402c4a,0x8d05331f,0xc8bdfb21,0xc8d9c194,
  101125. 0x2aa4d158,0x597e1a37 },
  101126. { 0xcf0bd68c,0x0327ec1a,0xab024945,0x6d4be0dc,0xc9fe3e84,0x5b9c8d7a,
  101127. 0x199b4dea,0xca3f0236 } },
  101128. /* 122 */
  101129. { { 0x6170bd20,0x592a10b5,0x6d3f5de7,0x0ea897f1,0x44b2ade2,0xa3363ff1,
  101130. 0x309c07e4,0xbde7fd7e },
  101131. { 0xb8f5432c,0x516bb6d2,0xe043444b,0x210dc1cb,0xf8f95b5a,0x3db01e6f,
  101132. 0x0a7dd198,0xb623ad0e } },
  101133. /* 123 */
  101134. { { 0x60c7b65b,0xa75bd675,0x23a4a289,0xab8c5590,0xd7b26795,0xf8220fd0,
  101135. 0x58ec137b,0xd6aa2e46 },
  101136. { 0x5138bb85,0x10abc00b,0xd833a95c,0x8c31d121,0x1702a32e,0xb24ff00b,
  101137. 0x2dcc513a,0x111662e0 } },
  101138. /* 124 */
  101139. { { 0xefb42b87,0x78114015,0x1b6c4dff,0xbd9f5d70,0xa7d7c129,0x66ecccd7,
  101140. 0x94b750f8,0xdb3ee1cb },
  101141. { 0xf34837cf,0xb26f3db0,0xb9578d4f,0xe7eed18b,0x7c56657d,0x5d2cdf93,
  101142. 0x52206a59,0x886a6442 } },
  101143. /* 125 */
  101144. { { 0x65b569ea,0x3c234cfb,0xf72119c1,0x20011141,0xa15a619e,0x8badc85d,
  101145. 0x018a17bc,0xa70cf4eb },
  101146. { 0x8c4a6a65,0x224f97ae,0x0134378f,0x36e5cf27,0x4f7e0960,0xbe3a609e,
  101147. 0xd1747b77,0xaa4772ab } },
  101148. /* 126 */
  101149. { { 0x7aa60cc0,0x67676131,0x0368115f,0xc7916361,0xbbc1bb5a,0xded98bb4,
  101150. 0x30faf974,0x611a6ddc },
  101151. { 0xc15ee47a,0x30e78cbc,0x4e0d96a5,0x2e896282,0x3dd9ed88,0x36f35adf,
  101152. 0x16429c88,0x5cfffaf8 } },
  101153. /* 127 */
  101154. { { 0x9b7a99cd,0xc0d54cff,0x843c45a1,0x7bf3b99d,0x62c739e1,0x038a908f,
  101155. 0x7dc1994c,0x6e5a6b23 },
  101156. { 0x0ba5db77,0xef8b454e,0xacf60d63,0xb7b8807f,0x76608378,0xe591c0c6,
  101157. 0x242dabcc,0x481a238d } },
  101158. /* 128 */
  101159. { { 0x35d0b34a,0xe3417bc0,0x8327c0a7,0x440b386b,0xac0362d1,0x8fb7262d,
  101160. 0xe0cdf943,0x2c41114c },
  101161. { 0xad95a0b1,0x2ba5cef1,0x67d54362,0xc09b37a8,0x01e486c9,0x26d6cdd2,
  101162. 0x42ff9297,0x20477abf } },
  101163. /* 129 */
  101164. { { 0x18d65dbf,0x2f75173c,0x339edad8,0x77bf940e,0xdcf1001c,0x7022d26b,
  101165. 0xc77396b6,0xac66409a },
  101166. { 0xc6261cc3,0x8b0bb36f,0x190e7e90,0x213f7bc9,0xa45e6c10,0x6541ceba,
  101167. 0xcc122f85,0xce8e6975 } },
  101168. /* 130 */
  101169. { { 0xbc0a67d2,0x0f121b41,0x444d248a,0x62d4760a,0x659b4737,0x0e044f1d,
  101170. 0x250bb4a8,0x08fde365 },
  101171. { 0x848bf287,0xaceec3da,0xd3369d6e,0xc2a62182,0x92449482,0x3582dfdc,
  101172. 0x565d6cd7,0x2f7e2fd2 } },
  101173. /* 131 */
  101174. { { 0xc3770fa7,0xae4b92db,0x379043f9,0x095e8d5c,0x17761171,0x54f34e9d,
  101175. 0x907702ae,0xc65be92e },
  101176. { 0xf6fd0a40,0x2758a303,0xbcce784b,0xe7d822e3,0x4f9767bf,0x7ae4f585,
  101177. 0xd1193b3a,0x4bff8e47 } },
  101178. /* 132 */
  101179. { { 0x00ff1480,0xcd41d21f,0x0754db16,0x2ab8fb7d,0xbbe0f3ea,0xac81d2ef,
  101180. 0x5772967d,0x3e4e4ae6 },
  101181. { 0x3c5303e6,0x7e18f36d,0x92262397,0x3bd9994b,0x1324c3c0,0x9ed70e26,
  101182. 0x58ec6028,0x5388aefd } },
  101183. /* 133 */
  101184. { { 0x5e5d7713,0xad1317eb,0x75de49da,0x09b985ee,0xc74fb261,0x32f5bc4f,
  101185. 0x4f75be0e,0x5cf908d1 },
  101186. { 0x8e657b12,0x76043510,0xb96ed9e6,0xbfd421a5,0x8970ccc2,0x0e29f51f,
  101187. 0x60f00ce2,0xa698ba40 } },
  101188. /* 134 */
  101189. { { 0xef748fec,0x73db1686,0x7e9d2cf9,0xe6e755a2,0xce265eff,0x630b6544,
  101190. 0x7aebad8d,0xb142ef8a },
  101191. { 0x17d5770a,0xad31af9f,0x2cb3412f,0x66af3b67,0xdf3359de,0x6bd60d1b,
  101192. 0x58515075,0xd1896a96 } },
  101193. /* 135 */
  101194. { { 0x33c41c08,0xec5957ab,0x5468e2e1,0x87de94ac,0xac472f6c,0x18816b73,
  101195. 0x7981da39,0x267b0e0b },
  101196. { 0x8e62b988,0x6e554e5d,0x116d21e7,0xd8ddc755,0x3d2a6f99,0x4610faf0,
  101197. 0xa1119393,0xb54e287a } },
  101198. /* 136 */
  101199. { { 0x178a876b,0x0a0122b5,0x085104b4,0x51ff96ff,0x14f29f76,0x050b31ab,
  101200. 0x5f87d4e6,0x84abb28b },
  101201. { 0x8270790a,0xd5ed439f,0x85e3f46b,0x2d6cb59d,0x6c1e2212,0x75f55c1b,
  101202. 0x17655640,0xe5436f67 } },
  101203. /* 137 */
  101204. { { 0x2286e8d5,0x53f9025e,0x864453be,0x353c95b4,0xe408e3a0,0xd832f5bd,
  101205. 0x5b9ce99e,0x0404f68b },
  101206. { 0xa781e8e5,0xcad33bde,0x163c2f5b,0x3cdf5018,0x0119caa3,0x57576960,
  101207. 0x0ac1c701,0x3a4263df } },
  101208. /* 138 */
  101209. { { 0x9aeb596d,0xc2965ecc,0x023c92b4,0x01ea03e7,0x2e013961,0x4704b4b6,
  101210. 0x905ea367,0x0ca8fd3f },
  101211. { 0x551b2b61,0x92523a42,0x390fcd06,0x1eb7a89c,0x0392a63e,0xe7f1d2be,
  101212. 0x4ddb0c33,0x96dca264 } },
  101213. /* 139 */
  101214. { { 0x387510af,0x203bb43a,0xa9a36a01,0x846feaa8,0x2f950378,0xd23a5770,
  101215. 0x3aad59dc,0x4363e212 },
  101216. { 0x40246a47,0xca43a1c7,0xe55dd24d,0xb362b8d2,0x5d8faf96,0xf9b08604,
  101217. 0xd8bb98c4,0x840e115c } },
  101218. /* 140 */
  101219. { { 0x1023e8a7,0xf12205e2,0xd8dc7a0b,0xc808a8cd,0x163a5ddf,0xe292a272,
  101220. 0x30ded6d4,0x5e0d6abd },
  101221. { 0x7cfc0f64,0x07a721c2,0x0e55ed88,0x42eec01d,0x1d1f9db2,0x26a7bef9,
  101222. 0x2945a25a,0x7dea48f4 } },
  101223. /* 141 */
  101224. { { 0xe5060a81,0xabdf6f1c,0xf8f95615,0xe79f9c72,0x06ac268b,0xcfd36c54,
  101225. 0xebfd16d1,0xabc2a2be },
  101226. { 0xd3e2eac7,0x8ac66f91,0xd2dd0466,0x6f10ba63,0x0282d31b,0x6790e377,
  101227. 0x6c7eefc1,0x4ea35394 } },
  101228. /* 142 */
  101229. { { 0x5266309d,0xed8a2f8d,0x81945a3e,0x0a51c6c0,0x578c5dc1,0xcecaf45a,
  101230. 0x1c94ffc3,0x3a76e689 },
  101231. { 0x7d7b0d0f,0x9aace8a4,0x8f584a5f,0x963ace96,0x4e697fbe,0x51a30c72,
  101232. 0x465e6464,0x8212a10a } },
  101233. /* 143 */
  101234. { { 0xcfab8caa,0xef7c61c3,0x0e142390,0x18eb8e84,0x7e9733ca,0xcd1dff67,
  101235. 0x599cb164,0xaa7cab71 },
  101236. { 0xbc837bd1,0x02fc9273,0xc36af5d7,0xc06407d0,0xf423da49,0x17621292,
  101237. 0xfe0617c3,0x40e38073 } },
  101238. /* 144 */
  101239. { { 0xa7bf9b7c,0xf4f80824,0x3fbe30d0,0x365d2320,0x97cf9ce3,0xbfbe5320,
  101240. 0xb3055526,0xe3604700 },
  101241. { 0x6cc6c2c7,0x4dcb9911,0xba4cbee6,0x72683708,0x637ad9ec,0xdcded434,
  101242. 0xa3dee15f,0x6542d677 } },
  101243. /* 145 */
  101244. { { 0x7b6c377a,0x3f32b6d0,0x903448be,0x6cb03847,0x20da8af7,0xd6fdd3a8,
  101245. 0x09bb6f21,0xa6534aee },
  101246. { 0x1035facf,0x30a1780d,0x9dcb47e6,0x35e55a33,0xc447f393,0x6ea50fe1,
  101247. 0xdc9aef22,0xf3cb672f } },
  101248. /* 146 */
  101249. { { 0x3b55fd83,0xeb3719fe,0x875ddd10,0xe0d7a46c,0x05cea784,0x33ac9fa9,
  101250. 0xaae870e7,0x7cafaa2e },
  101251. { 0x1d53b338,0x9b814d04,0xef87e6c6,0xe0acc0a0,0x11672b0f,0xfb93d108,
  101252. 0xb9bd522e,0x0aab13c1 } },
  101253. /* 147 */
  101254. { { 0xd2681297,0xddcce278,0xb509546a,0xcb350eb1,0x7661aaf2,0x2dc43173,
  101255. 0x847012e9,0x4b91a602 },
  101256. { 0x72f8ddcf,0xdcff1095,0x9a911af4,0x08ebf61e,0xc372430e,0x48f4360a,
  101257. 0x72321cab,0x49534c53 } },
  101258. /* 148 */
  101259. { { 0xf07b7e9d,0x83df7d71,0x13cd516f,0xa478efa3,0x6c047ee3,0x78ef264b,
  101260. 0xd65ac5ee,0xcaf46c4f },
  101261. { 0x92aa8266,0xa04d0c77,0x913684bb,0xedf45466,0xae4b16b0,0x56e65168,
  101262. 0x04c6770f,0x14ce9e57 } },
  101263. /* 149 */
  101264. { { 0x965e8f91,0x99445e3e,0xcb0f2492,0xd3aca1ba,0x90c8a0a0,0xd31cc70f,
  101265. 0x3e4c9a71,0x1bb708a5 },
  101266. { 0x558bdd7a,0xd5ca9e69,0x018a26b1,0x734a0508,0x4c9cf1ec,0xb093aa71,
  101267. 0xda300102,0xf9d126f2 } },
  101268. /* 150 */
  101269. { { 0xaff9563e,0x749bca7a,0xb49914a0,0xdd077afe,0xbf5f1671,0xe27a0311,
  101270. 0x729ecc69,0x807afcb9 },
  101271. { 0xc9b08b77,0x7f8a9337,0x443c7e38,0x86c3a785,0x476fd8ba,0x85fafa59,
  101272. 0x6568cd8c,0x751adcd1 } },
  101273. /* 151 */
  101274. { { 0x10715c0d,0x8aea38b4,0x8f7697f7,0xd113ea71,0x93fbf06d,0x665eab14,
  101275. 0x2537743f,0x29ec4468 },
  101276. { 0xb50bebbc,0x3d94719c,0xe4505422,0x399ee5bf,0x8d2dedb1,0x90cd5b3a,
  101277. 0x92a4077d,0xff9370e3 } },
  101278. /* 152 */
  101279. { { 0xc6b75b65,0x59a2d69b,0x266651c5,0x4188f8d5,0x3de9d7d2,0x28a9f33e,
  101280. 0xa2a9d01a,0x9776478b },
  101281. { 0x929af2c7,0x8852622d,0x4e690923,0x334f5d6d,0xa89a51e9,0xce6cc7e5,
  101282. 0xac2f82fa,0x74a6313f } },
  101283. /* 153 */
  101284. { { 0xb75f079c,0xb2f4dfdd,0x18e36fbb,0x85b07c95,0xe7cd36dd,0x1b6cfcf0,
  101285. 0x0ff4863d,0xab75be15 },
  101286. { 0x173fc9b7,0x81b367c0,0xd2594fd0,0xb90a7420,0xc4091236,0x15fdbf03,
  101287. 0x0b4459f6,0x4ebeac2e } },
  101288. /* 154 */
  101289. { { 0x5c9f2c53,0xeb6c5fe7,0x8eae9411,0xd2522011,0xf95ac5d8,0xc8887633,
  101290. 0x2c1baffc,0xdf99887b },
  101291. { 0x850aaecb,0xbb78eed2,0x01d6a272,0x9d49181b,0xb1cdbcac,0x978dd511,
  101292. 0x779f4058,0x27b040a7 } },
  101293. /* 155 */
  101294. { { 0xf73b2eb2,0x90405db7,0x8e1b2118,0xe0df8508,0x5962327e,0x501b7152,
  101295. 0xe4cfa3f5,0xb393dd37 },
  101296. { 0x3fd75165,0xa1230e7b,0xbcd33554,0xd66344c2,0x0f7b5022,0x6c36f1be,
  101297. 0xd0463419,0x09588c12 } },
  101298. /* 156 */
  101299. { { 0x02601c3b,0xe086093f,0xcf5c335f,0xfb0252f8,0x894aff28,0x955cf280,
  101300. 0xdb9f648b,0x81c879a9 },
  101301. { 0xc6f56c51,0x040e687c,0x3f17618c,0xfed47169,0x9059353b,0x44f88a41,
  101302. 0x5fc11bc4,0xfa0d48f5 } },
  101303. /* 157 */
  101304. { { 0xe1608e4d,0xbc6e1c9d,0x3582822c,0x010dda11,0x157ec2d7,0xf6b7ddc1,
  101305. 0xb6a367d6,0x8ea0e156 },
  101306. { 0x2383b3b4,0xa354e02f,0x3f01f53c,0x69966b94,0x2de03ca5,0x4ff6632b,
  101307. 0xfa00b5ac,0x3f5ab924 } },
  101308. /* 158 */
  101309. { { 0x59739efb,0x337bb0d9,0xe7ebec0d,0xc751b0f4,0x411a67d1,0x2da52dd6,
  101310. 0x2b74256e,0x8bc76887 },
  101311. { 0x82d3d253,0xa5be3b72,0xf58d779f,0xa9f679a1,0xe16767bb,0xa1cac168,
  101312. 0x60fcf34f,0xb386f190 } },
  101313. /* 159 */
  101314. { { 0x2fedcfc2,0x31f3c135,0x62f8af0d,0x5396bf62,0xe57288c2,0x9a02b4ea,
  101315. 0x1b069c4d,0x4cb460f7 },
  101316. { 0x5b8095ea,0xae67b4d3,0x6fc07603,0x92bbf859,0xb614a165,0xe1475f66,
  101317. 0x95ef5223,0x52c0d508 } },
  101318. /* 160 */
  101319. { { 0x15339848,0x231c210e,0x70778c8d,0xe87a28e8,0x6956e170,0x9d1de661,
  101320. 0x2bb09c0b,0x4ac3c938 },
  101321. { 0x6998987d,0x19be0551,0xae09f4d6,0x8b2376c4,0x1a3f933d,0x1de0b765,
  101322. 0xe39705f4,0x380d94c7 } },
  101323. /* 161 */
  101324. { { 0x81542e75,0x01a355aa,0xee01b9b7,0x96c724a1,0x624d7087,0x6b3a2977,
  101325. 0xde2637af,0x2ce3e171 },
  101326. { 0xf5d5bc1a,0xcfefeb49,0x2777e2b5,0xa655607e,0x9513756c,0x4feaac2f,
  101327. 0x0b624e4d,0x2e6cd852 } },
  101328. /* 162 */
  101329. { { 0x8c31c31d,0x3685954b,0x5bf21a0c,0x68533d00,0x75c79ec9,0x0bd7626e,
  101330. 0x42c69d54,0xca177547 },
  101331. { 0xf6d2dbb2,0xcc6edaff,0x174a9d18,0xfd0d8cbd,0xaa4578e8,0x875e8793,
  101332. 0x9cab2ce6,0xa976a713 } },
  101333. /* 163 */
  101334. { { 0x93fb353d,0x0a651f1b,0x57fcfa72,0xd75cab8b,0x31b15281,0xaa88cfa7,
  101335. 0x0a1f4999,0x8720a717 },
  101336. { 0x693e1b90,0x8c3e8d37,0x16f6dfc3,0xd345dc0b,0xb52a8742,0x8ea8d00a,
  101337. 0xc769893c,0x9719ef29 } },
  101338. /* 164 */
  101339. { { 0x58e35909,0x820eed8d,0x33ddc116,0x9366d8dc,0x6e205026,0xd7f999d0,
  101340. 0xe15704c1,0xa5072976 },
  101341. { 0xc4e70b2e,0x002a37ea,0x6890aa8a,0x84dcf657,0x645b2a5c,0xcd71bf18,
  101342. 0xf7b77725,0x99389c9d } },
  101343. /* 165 */
  101344. { { 0x7ada7a4b,0x238c08f2,0xfd389366,0x3abe9d03,0x766f512c,0x6b672e89,
  101345. 0x202c82e4,0xa88806aa },
  101346. { 0xd380184e,0x6602044a,0x126a8b85,0xa8cb78c4,0xad844f17,0x79d670c0,
  101347. 0x4738dcfe,0x0043bffb } },
  101348. /* 166 */
  101349. { { 0x36d5192e,0x8d59b5dc,0x4590b2af,0xacf885d3,0x11601781,0x83566d0a,
  101350. 0xba6c4866,0x52f3ef01 },
  101351. { 0x0edcb64d,0x3986732a,0x8068379f,0x0a482c23,0x7040f309,0x16cbe5fa,
  101352. 0x9ef27e75,0x3296bd89 } },
  101353. /* 167 */
  101354. { { 0x454d81d7,0x476aba89,0x51eb9b3c,0x9eade7ef,0x81c57986,0x619a21cd,
  101355. 0xaee571e9,0x3b90febf },
  101356. { 0x5496f7cb,0x9393023e,0x7fb51bc4,0x55be41d8,0x99beb5ce,0x03f1dd48,
  101357. 0x9f810b18,0x6e88069d } },
  101358. /* 168 */
  101359. { { 0xb43ea1db,0xce37ab11,0x5259d292,0x0a7ff1a9,0x8f84f186,0x851b0221,
  101360. 0xdefaad13,0xa7222bea },
  101361. { 0x2b0a9144,0xa2ac78ec,0xf2fa59c5,0x5a024051,0x6147ce38,0x91d1eca5,
  101362. 0xbc2ac690,0xbe94d523 } },
  101363. /* 169 */
  101364. { { 0x0b226ce7,0x72f4945e,0x967e8b70,0xb8afd747,0x85a6c63e,0xedea46f1,
  101365. 0x9be8c766,0x7782defe },
  101366. { 0x3db38626,0x760d2aa4,0x76f67ad1,0x460ae787,0x54499cdb,0x341b86fc,
  101367. 0xa2892e4b,0x03838567 } },
  101368. /* 170 */
  101369. { { 0x79ec1a0f,0x2d8daefd,0xceb39c97,0x3bbcd6fd,0x58f61a95,0xf5575ffc,
  101370. 0xadf7b420,0xdbd986c4 },
  101371. { 0x15f39eb7,0x81aa8814,0xb98d976c,0x6ee2fcf5,0xcf2f717d,0x5465475d,
  101372. 0x6860bbd0,0x8e24d3c4 } },
  101373. /* 171 */
  101374. { { 0x9a587390,0x749d8e54,0x0cbec588,0x12bb194f,0xb25983c6,0x46e07da4,
  101375. 0x407bafc8,0x541a99c4 },
  101376. { 0x624c8842,0xdb241692,0xd86c05ff,0x6044c12a,0x4f7fcf62,0xc59d14b4,
  101377. 0xf57d35d1,0xc0092c49 } },
  101378. /* 172 */
  101379. { { 0xdf2e61ef,0xd3cc75c3,0x2e1b35ca,0x7e8841c8,0x909f29f4,0xc62d30d1,
  101380. 0x7286944d,0x75e40634 },
  101381. { 0xbbc237d0,0xe7d41fc5,0xec4f01c9,0xc9537bf0,0x282bd534,0x91c51a16,
  101382. 0xc7848586,0x5b7cb658 } },
  101383. /* 173 */
  101384. { { 0x8a28ead1,0x964a7084,0xfd3b47f6,0x802dc508,0x767e5b39,0x9ae4bfd1,
  101385. 0x8df097a1,0x7ae13eba },
  101386. { 0xeadd384e,0xfd216ef8,0xb6b2ff06,0x0361a2d9,0x4bcdb5f3,0x204b9878,
  101387. 0xe2a8e3fd,0x787d8074 } },
  101388. /* 174 */
  101389. { { 0x757fbb1c,0xc5e25d6b,0xca201deb,0xe47bddb2,0x6d2233ff,0x4a55e9a3,
  101390. 0x9ef28484,0x5c222819 },
  101391. { 0x88315250,0x773d4a85,0x827097c1,0x21b21a2b,0xdef5d33f,0xab7c4ea1,
  101392. 0xbaf0f2b0,0xe45d37ab } },
  101393. /* 175 */
  101394. { { 0x28511c8a,0xd2df1e34,0xbdca6cd3,0xebb229c8,0x627c39a7,0x578a71a7,
  101395. 0x84dfb9d3,0xed7bc122 },
  101396. { 0x93dea561,0xcf22a6df,0xd48f0ed1,0x5443f18d,0x5bad23e8,0xd8b86140,
  101397. 0x45ca6d27,0xaac97cc9 } },
  101398. /* 176 */
  101399. { { 0xa16bd00a,0xeb54ea74,0xf5c0bcc1,0xd839e9ad,0x1f9bfc06,0x092bb7f1,
  101400. 0x1163dc4e,0x318f97b3 },
  101401. { 0xc30d7138,0xecc0c5be,0xabc30220,0x44e8df23,0xb0223606,0x2bb7972f,
  101402. 0x9a84ff4d,0xfa41faa1 } },
  101403. /* 177 */
  101404. { { 0xa6642269,0x4402d974,0x9bb783bd,0xc81814ce,0x7941e60b,0x398d38e4,
  101405. 0x1d26e9e2,0x38bb6b2c },
  101406. { 0x6a577f87,0xc64e4a25,0xdc11fe1c,0x8b52d253,0x62280728,0xff336abf,
  101407. 0xce7601a5,0x94dd0905 } },
  101408. /* 178 */
  101409. { { 0xde93f92a,0x156cf7dc,0x89b5f315,0xa01333cb,0xc995e750,0x02404df9,
  101410. 0xd25c2ae9,0x92077867 },
  101411. { 0x0bf39d44,0xe2471e01,0x96bb53d7,0x5f2c9020,0x5c9c3d8f,0x4c44b7b3,
  101412. 0xd29beb51,0x81e8428b } },
  101413. /* 179 */
  101414. { { 0xc477199f,0x6dd9c2ba,0x6b5ecdd9,0x8cb8eeee,0xee40fd0e,0x8af7db3f,
  101415. 0xdbbfa4b1,0x1b94ab62 },
  101416. { 0xce47f143,0x44f0d8b3,0x63f46163,0x51e623fc,0xcc599383,0xf18f270f,
  101417. 0x055590ee,0x06a38e28 } },
  101418. /* 180 */
  101419. { { 0xb3355b49,0x2e5b0139,0xb4ebf99b,0x20e26560,0xd269f3dc,0xc08ffa6b,
  101420. 0x83d9d4f8,0xa7b36c20 },
  101421. { 0x1b3e8830,0x64d15c3a,0xa89f9c0b,0xd5fceae1,0xe2d16930,0xcfeee4a2,
  101422. 0xa2822a20,0xbe54c6b4 } },
  101423. /* 181 */
  101424. { { 0x8d91167c,0xd6cdb3df,0xe7a6625e,0x517c3f79,0x346ac7f4,0x7105648f,
  101425. 0xeae022bb,0xbf30a5ab },
  101426. { 0x93828a68,0x8e7785be,0x7f3ef036,0x5161c332,0x592146b2,0xe11b5feb,
  101427. 0x2732d13a,0xd1c820de } },
  101428. /* 182 */
  101429. { { 0x9038b363,0x043e1347,0x6b05e519,0x58c11f54,0x6026cad1,0x4fe57abe,
  101430. 0x68a18da3,0xb7d17bed },
  101431. { 0xe29c2559,0x44ca5891,0x5bfffd84,0x4f7a0376,0x74e46948,0x498de4af,
  101432. 0x6412cc64,0x3997fd5e } },
  101433. /* 183 */
  101434. { { 0x8bd61507,0xf2074682,0x34a64d2a,0x29e132d5,0x8a8a15e3,0xffeddfb0,
  101435. 0x3c6c13e8,0x0eeb8929 },
  101436. { 0xa7e259f8,0xe9b69a3e,0xd13e7e67,0xce1db7e6,0xad1fa685,0x277318f6,
  101437. 0xc922b6ef,0x228916f8 } },
  101438. /* 184 */
  101439. { { 0x0a12ab5b,0x959ae25b,0x957bc136,0xcc11171f,0xd16e2b0c,0x8058429e,
  101440. 0x6e93097e,0xec05ad1d },
  101441. { 0xac3f3708,0x157ba5be,0x30b59d77,0x31baf935,0x118234e5,0x47b55237,
  101442. 0x7ff11b37,0x7d314156 } },
  101443. /* 185 */
  101444. { { 0xf6dfefab,0x7bd9c05c,0xdcb37707,0xbe2f2268,0x3a38bb95,0xe53ead97,
  101445. 0x9bc1d7a3,0xe9ce66fc },
  101446. { 0x6f6a02a1,0x75aa1576,0x60e600ed,0x38c087df,0x68cdc1b9,0xf8947f34,
  101447. 0x72280651,0xd9650b01 } },
  101448. /* 186 */
  101449. { { 0x5a057e60,0x504b4c4a,0x8def25e4,0xcbccc3be,0x17c1ccbd,0xa6353208,
  101450. 0x804eb7a2,0x14d6699a },
  101451. { 0xdb1f411a,0x2c8a8415,0xf80d769c,0x09fbaf0b,0x1c2f77ad,0xb4deef90,
  101452. 0x0d43598a,0x6f4c6841 } },
  101453. /* 187 */
  101454. { { 0x96c24a96,0x8726df4e,0xfcbd99a3,0x534dbc85,0x8b2ae30a,0x3c466ef2,
  101455. 0x61189abb,0x4c4350fd },
  101456. { 0xf855b8da,0x2967f716,0x463c38a1,0x41a42394,0xeae93343,0xc37e1413,
  101457. 0x5a3118b5,0xa726d242 } },
  101458. /* 188 */
  101459. { { 0x948c1086,0xdae6b3ee,0xcbd3a2e1,0xf1de503d,0x03d022f3,0x3f35ed3f,
  101460. 0xcc6cf392,0x13639e82 },
  101461. { 0xcdafaa86,0x9ac938fb,0x2654a258,0xf45bc5fb,0x45051329,0x1963b26e,
  101462. 0xc1a335a3,0xca9365e1 } },
  101463. /* 189 */
  101464. { { 0x4c3b2d20,0x3615ac75,0x904e241b,0x742a5417,0xcc9d071d,0xb08521c4,
  101465. 0x970b72a5,0x9ce29c34 },
  101466. { 0x6d3e0ad6,0x8cc81f73,0xf2f8434c,0x8060da9e,0x6ce862d9,0x35ed1d1a,
  101467. 0xab42af98,0x48c4abd7 } },
  101468. /* 190 */
  101469. { { 0x40c7485a,0xd221b0cc,0xe5274dbf,0xead455bb,0x9263d2e8,0x493c7698,
  101470. 0xf67b33cb,0x78017c32 },
  101471. { 0x930cb5ee,0xb9d35769,0x0c408ed2,0xc0d14e94,0x272f1a4d,0xf8b7bf55,
  101472. 0xde5c1c04,0x53cd0454 } },
  101473. /* 191 */
  101474. { { 0x5d28ccac,0xbcd585fa,0x005b746e,0x5f823e56,0xcd0123aa,0x7c79f0a1,
  101475. 0xd3d7fa8f,0xeea465c1 },
  101476. { 0x0551803b,0x7810659f,0x7ce6af70,0x6c0b599f,0x29288e70,0x4195a770,
  101477. 0x7ae69193,0x1b6e42a4 } },
  101478. /* 192 */
  101479. { { 0xf67d04c3,0x2e80937c,0x89eeb811,0x1e312be2,0x92594d60,0x56b5d887,
  101480. 0x187fbd3d,0x0224da14 },
  101481. { 0x0c5fe36f,0x87abb863,0x4ef51f5f,0x580f3c60,0xb3b429ec,0x964fb1bf,
  101482. 0x42bfff33,0x60838ef0 } },
  101483. /* 193 */
  101484. { { 0x7e0bbe99,0x432cb2f2,0x04aa39ee,0x7bda44f3,0x9fa93903,0x5f497c7a,
  101485. 0x2d331643,0x636eb202 },
  101486. { 0x93ae00aa,0xfcfd0e61,0x31ae6d2f,0x875a00fe,0x9f93901c,0xf43658a2,
  101487. 0x39218bac,0x8844eeb6 } },
  101488. /* 194 */
  101489. { { 0x6b3bae58,0x114171d2,0x17e39f3e,0x7db3df71,0x81a8eada,0xcd37bc7f,
  101490. 0x51fb789e,0x27ba83dc },
  101491. { 0xfbf54de5,0xa7df439f,0xb5fe1a71,0x7277030b,0xdb297a48,0x42ee8e35,
  101492. 0x87f3a4ab,0xadb62d34 } },
  101493. /* 195 */
  101494. { { 0xa175df2a,0x9b1168a2,0x618c32e9,0x082aa04f,0x146b0916,0xc9e4f2e7,
  101495. 0x75e7c8b2,0xb990fd76 },
  101496. { 0x4df37313,0x0829d96b,0xd0b40789,0x1c205579,0x78087711,0x66c9ae4a,
  101497. 0x4d10d18d,0x81707ef9 } },
  101498. /* 196 */
  101499. { { 0x03d6ff96,0x97d7cab2,0x0d843360,0x5b851bfc,0xd042db4b,0x268823c4,
  101500. 0xd5a8aa5c,0x3792daea },
  101501. { 0x941afa0b,0x52818865,0x42d83671,0xf3e9e741,0x5be4e0a7,0x17c82527,
  101502. 0x94b001ba,0x5abd635e } },
  101503. /* 197 */
  101504. { { 0x0ac4927c,0x727fa84e,0xa7c8cf23,0xe3886035,0x4adca0df,0xa4bcd5ea,
  101505. 0x846ab610,0x5995bf21 },
  101506. { 0x829dfa33,0xe90f860b,0x958fc18b,0xcaafe2ae,0x78630366,0x9b3baf44,
  101507. 0xd483411e,0x44c32ca2 } },
  101508. /* 198 */
  101509. { { 0xe40ed80c,0xa74a97f1,0x31d2ca82,0x5f938cb1,0x7c2d6ad9,0x53f2124b,
  101510. 0x8082a54c,0x1f2162fb },
  101511. { 0x720b173e,0x7e467cc5,0x085f12f9,0x40e8a666,0x4c9d65dc,0x8cebc20e,
  101512. 0xc3e907c9,0x8f1d402b } },
  101513. /* 199 */
  101514. { { 0xfbc4058a,0x4f592f9c,0x292f5670,0xb15e14b6,0xbc1d8c57,0xc55cfe37,
  101515. 0x926edbf9,0xb1980f43 },
  101516. { 0x32c76b09,0x98c33e09,0x33b07f78,0x1df5279d,0x863bb461,0x6f08ead4,
  101517. 0x37448e45,0x2828ad9b } },
  101518. /* 200 */
  101519. { { 0xc4cf4ac5,0x696722c4,0xdde64afb,0xf5ac1a3f,0xe0890832,0x0551baa2,
  101520. 0x5a14b390,0x4973f127 },
  101521. { 0x322eac5d,0xe59d8335,0x0bd9b568,0x5e07eef5,0xa2588393,0xab36720f,
  101522. 0xdb168ac7,0x6dac8ed0 } },
  101523. /* 201 */
  101524. { { 0xeda835ef,0xf7b545ae,0x1d10ed51,0x4aa113d2,0x13741b09,0x035a65e0,
  101525. 0x20b9de4c,0x4b23ef59 },
  101526. { 0x3c4c7341,0xe82bb680,0x3f58bc37,0xd457706d,0xa51e3ee8,0x73527863,
  101527. 0xddf49a4e,0x4dd71534 } },
  101528. /* 202 */
  101529. { { 0x95476cd9,0xbf944672,0xe31a725b,0x648d072f,0xfc4b67e0,0x1441c8b8,
  101530. 0x2f4a4dbb,0xfd317000 },
  101531. { 0x8995d0e1,0x1cb43ff4,0x0ef729aa,0x76e695d1,0x41798982,0xe0d5f976,
  101532. 0x9569f365,0x14fac58c } },
  101533. /* 203 */
  101534. { { 0xf312ae18,0xad9a0065,0xfcc93fc9,0x51958dc0,0x8a7d2846,0xd9a14240,
  101535. 0x36abda50,0xed7c7651 },
  101536. { 0x25d4abbc,0x46270f1a,0xf1a113ea,0x9b5dd8f3,0x5b51952f,0xc609b075,
  101537. 0x4d2e9f53,0xfefcb7f7 } },
  101538. /* 204 */
  101539. { { 0xba119185,0xbd09497a,0xaac45ba4,0xd54e8c30,0xaa521179,0x492479de,
  101540. 0x87e0d80b,0x1801a57e },
  101541. { 0xfcafffb0,0x073d3f8d,0xae255240,0x6cf33c0b,0x5b5fdfbc,0x781d763b,
  101542. 0x1ead1064,0x9f8fc11e } },
  101543. /* 205 */
  101544. { { 0x5e69544c,0x1583a171,0xf04b7813,0x0eaf8567,0x278a4c32,0x1e22a8fd,
  101545. 0x3d3a69a9,0xa9d3809d },
  101546. { 0x59a2da3b,0x936c2c2c,0x1895c847,0x38ccbcf6,0x63d50869,0x5e65244e,
  101547. 0xe1178ef7,0x3006b9ae } },
  101548. /* 206 */
  101549. { { 0xc9eead28,0x0bb1f2b0,0x89f4dfbc,0x7eef635d,0xb2ce8939,0x074757fd,
  101550. 0x45f8f761,0x0ab85fd7 },
  101551. { 0x3e5b4549,0xecda7c93,0x97922f21,0x4be2bb5c,0xb43b8040,0x261a1274,
  101552. 0x11e942c2,0xb122d675 } },
  101553. /* 207 */
  101554. { { 0x66a5ae7a,0x3be607be,0x76adcbe3,0x01e703fa,0x4eb6e5c5,0xaf904301,
  101555. 0x097dbaec,0x9f599dc1 },
  101556. { 0x0ff250ed,0x6d75b718,0x349a20dc,0x8eb91574,0x10b227a3,0x425605a4,
  101557. 0x8a294b78,0x7d5528e0 } },
  101558. /* 208 */
  101559. { { 0x20c26def,0xf0f58f66,0x582b2d1e,0x025585ea,0x01ce3881,0xfbe7d79b,
  101560. 0x303f1730,0x28ccea01 },
  101561. { 0x79644ba5,0xd1dabcd1,0x06fff0b8,0x1fc643e8,0x66b3e17b,0xa60a76fc,
  101562. 0xa1d013bf,0xc18baf48 } },
  101563. /* 209 */
  101564. { { 0x5dc4216d,0x34e638c8,0x206142ac,0x00c01067,0x95f5064a,0xd453a171,
  101565. 0xb7a9596b,0x9def809d },
  101566. { 0x67ab8d2c,0x41e8642e,0x6237a2b6,0xb4240433,0x64c4218b,0x7d506a6d,
  101567. 0x68808ce5,0x0357f8b0 } },
  101568. /* 210 */
  101569. { { 0x4cd2cc88,0x8e9dbe64,0xf0b8f39d,0xcc61c28d,0xcd30a0c8,0x4a309874,
  101570. 0x1b489887,0xe4a01add },
  101571. { 0xf57cd8f9,0x2ed1eeac,0xbd594c48,0x1b767d3e,0x7bd2f787,0xa7295c71,
  101572. 0xce10cc30,0x466d7d79 } },
  101573. /* 211 */
  101574. { { 0x9dada2c7,0x47d31892,0x8f9aa27d,0x4fa0a6c3,0x820a59e1,0x90e4fd28,
  101575. 0x451ead1a,0xc672a522 },
  101576. { 0x5d86b655,0x30607cc8,0xf9ad4af1,0xf0235d3b,0x571172a6,0x99a08680,
  101577. 0xf2a67513,0x5e3d64fa } },
  101578. /* 212 */
  101579. { { 0x9b3b4416,0xaa6410c7,0xeab26d99,0xcd8fcf85,0xdb656a74,0x5ebff74a,
  101580. 0xeb8e42fc,0x6c8a7a95 },
  101581. { 0xb02a63bd,0x10c60ba7,0x8b8f0047,0x6b2f2303,0x312d90b0,0x8c6c3738,
  101582. 0xad82ca91,0x348ae422 } },
  101583. /* 213 */
  101584. { { 0x5ccda2fb,0x7f474663,0x8e0726d2,0x22accaa1,0x492b1f20,0x85adf782,
  101585. 0xd9ef2d2e,0xc1074de0 },
  101586. { 0xae9a65b3,0xfcf3ce44,0x05d7151b,0xfd71e4ac,0xce6a9788,0xd4711f50,
  101587. 0xc9e54ffc,0xfbadfbdb } },
  101588. /* 214 */
  101589. { { 0x20a99363,0x1713f1cd,0x6cf22775,0xb915658f,0x24d359b2,0x968175cd,
  101590. 0x83716fcd,0xb7f976b4 },
  101591. { 0x5d6dbf74,0x5758e24d,0x71c3af36,0x8d23bafd,0x0243dfe3,0x48f47760,
  101592. 0xcafcc805,0xf4d41b2e } },
  101593. /* 215 */
  101594. { { 0xfdabd48d,0x51f1cf28,0x32c078a4,0xce81be36,0x117146e9,0x6ace2974,
  101595. 0xe0160f10,0x180824ea },
  101596. { 0x66e58358,0x0387698b,0xce6ca358,0x63568752,0x5e41e6c5,0x82380e34,
  101597. 0x83cf6d25,0x67e5f639 } },
  101598. /* 216 */
  101599. { { 0xcf4899ef,0xf89ccb8d,0x9ebb44c0,0x949015f0,0xb2598ec9,0x546f9276,
  101600. 0x04c11fc6,0x9fef789a },
  101601. { 0x53d2a071,0x6d367ecf,0xa4519b09,0xb10e1a7f,0x611e2eef,0xca6b3fb0,
  101602. 0xa99c4e20,0xbc80c181 } },
  101603. /* 217 */
  101604. { { 0xe5eb82e6,0x972536f8,0xf56cb920,0x1a484fc7,0x50b5da5e,0xc78e2171,
  101605. 0x9f8cdf10,0x49270e62 },
  101606. { 0xea6b50ad,0x1a39b7bb,0xa2388ffc,0x9a0284c1,0x8107197b,0x5403eb17,
  101607. 0x61372f7f,0xd2ee52f9 } },
  101608. /* 218 */
  101609. { { 0x88e0362a,0xd37cd285,0x8fa5d94d,0x442fa8a7,0xa434a526,0xaff836e5,
  101610. 0xe5abb733,0xdfb478be },
  101611. { 0x673eede6,0xa91f1ce7,0x2b5b2f04,0xa5390ad4,0x5530da2f,0x5e66f7bf,
  101612. 0x08df473a,0xd9a140b4 } },
  101613. /* 219 */
  101614. { { 0x6e8ea498,0x0e0221b5,0x3563ee09,0x62347829,0x335d2ade,0xe06b8391,
  101615. 0x623f4b1a,0x760c058d },
  101616. { 0xc198aa79,0x0b89b58c,0xf07aba7f,0xf74890d2,0xfde2556a,0x4e204110,
  101617. 0x8f190409,0x7141982d } },
  101618. /* 220 */
  101619. { { 0x4d4b0f45,0x6f0a0e33,0x392a94e1,0xd9280b38,0xb3c61d5e,0x3af324c6,
  101620. 0x89d54e47,0x3af9d1ce },
  101621. { 0x20930371,0xfd8f7981,0x21c17097,0xeda2664c,0xdc42309b,0x0e9545dc,
  101622. 0x73957dd6,0xb1f815c3 } },
  101623. /* 221 */
  101624. { { 0x89fec44a,0x84faa78e,0x3caa4caf,0xc8c2ae47,0xc1b6a624,0x691c807d,
  101625. 0x1543f052,0xa41aed14 },
  101626. { 0x7d5ffe04,0x42435399,0x625b6e20,0x8bacb2df,0x87817775,0x85d660be,
  101627. 0x86fb60ef,0xd6e9c1dd } },
  101628. /* 222 */
  101629. { { 0xc6853264,0x3aa2e97e,0xe2304a0b,0x771533b7,0xb8eae9be,0x1b912bb7,
  101630. 0xae9bf8c2,0x9c9c6e10 },
  101631. { 0xe030b74c,0xa2309a59,0x6a631e90,0x4ed7494d,0xa49b79f2,0x89f44b23,
  101632. 0x40fa61b6,0x566bd596 } },
  101633. /* 223 */
  101634. { { 0xc18061f3,0x066c0118,0x7c83fc70,0x190b25d3,0x27273245,0xf05fc8e0,
  101635. 0xf525345e,0xcf2c7390 },
  101636. { 0x10eb30cf,0xa09bceb4,0x0d77703a,0xcfd2ebba,0x150ff255,0xe842c43a,
  101637. 0x8aa20979,0x02f51755 } },
  101638. /* 224 */
  101639. { { 0xaddb7d07,0x396ef794,0x24455500,0x0b4fc742,0xc78aa3ce,0xfaff8eac,
  101640. 0xe8d4d97d,0x14e9ada5 },
  101641. { 0x2f7079e2,0xdaa480a1,0xe4b0800e,0x45baa3cd,0x7838157d,0x01765e2d,
  101642. 0x8e9d9ae8,0xa0ad4fab } },
  101643. /* 225 */
  101644. { { 0x4a653618,0x0bfb7621,0x31eaaa5f,0x1872813c,0x44949d5e,0x1553e737,
  101645. 0x6e56ed1e,0xbcd530b8 },
  101646. { 0x32e9c47b,0x169be853,0xb50059ab,0xdc2776fe,0x192bfbb4,0xcdba9761,
  101647. 0x6979341d,0x909283cf } },
  101648. /* 226 */
  101649. { { 0x76e81a13,0x67b00324,0x62171239,0x9bee1a99,0xd32e19d6,0x08ed361b,
  101650. 0xace1549a,0x35eeb7c9 },
  101651. { 0x7e4e5bdc,0x1280ae5a,0xb6ceec6e,0x2dcd2cd3,0x6e266bc1,0x52e4224c,
  101652. 0x448ae864,0x9a8b2cf4 } },
  101653. /* 227 */
  101654. { { 0x09d03b59,0xf6471bf2,0xb65af2ab,0xc90e62a3,0xebd5eec9,0xff7ff168,
  101655. 0xd4491379,0x6bdb60f4 },
  101656. { 0x8a55bc30,0xdadafebc,0x10097fe0,0xc79ead16,0x4c1e3bdd,0x42e19741,
  101657. 0x94ba08a9,0x01ec3cfd } },
  101658. /* 228 */
  101659. { { 0xdc9485c2,0xba6277eb,0x22fb10c7,0x48cc9a79,0x70a28d8a,0x4f61d60f,
  101660. 0x475464f6,0xd1acb1c0 },
  101661. { 0x26f36612,0xd26902b1,0xe0618d8b,0x59c3a44e,0x308357ee,0x4df8a813,
  101662. 0x405626c2,0x7dcd079d } },
  101663. /* 229 */
  101664. { { 0xf05a4b48,0x5ce7d4d3,0x37230772,0xadcd2952,0x812a915a,0xd18f7971,
  101665. 0x377d19b8,0x0bf53589 },
  101666. { 0x6c68ea73,0x35ecd95a,0x823a584d,0xc7f3bbca,0xf473a723,0x9fb674c6,
  101667. 0xe16686fc,0xd28be4d9 } },
  101668. /* 230 */
  101669. { { 0x38fa8e4b,0x5d2b9906,0x893fd8fc,0x559f186e,0x436fb6fc,0x3a6de2aa,
  101670. 0x510f88ce,0xd76007aa },
  101671. { 0x523a4988,0x2d10aab6,0x74dd0273,0xb455cf44,0xa3407278,0x7f467082,
  101672. 0xb303bb01,0xf2b52f68 } },
  101673. /* 231 */
  101674. { { 0x9835b4ca,0x0d57eafa,0xbb669cbc,0x2d2232fc,0xc6643198,0x8eeeb680,
  101675. 0xcc5aed3a,0xd8dbe98e },
  101676. { 0xc5a02709,0xcba9be3f,0xf5ba1fa8,0x30be68e5,0xf10ea852,0xfebd43cd,
  101677. 0xee559705,0xe01593a3 } },
  101678. /* 232 */
  101679. { { 0xea75a0a6,0xd3e5af50,0x57858033,0x512226ac,0xd0176406,0x6fe6d50f,
  101680. 0xaeb8ef06,0xafec07b1 },
  101681. { 0x80bb0a31,0x7fb99567,0x37309aae,0x6f1af3cc,0x01abf389,0x9153a15a,
  101682. 0x6e2dbfdd,0xa71b9354 } },
  101683. /* 233 */
  101684. { { 0x18f593d2,0xbf8e12e0,0xa078122b,0xd1a90428,0x0ba4f2ad,0x150505db,
  101685. 0x628523d9,0x53a2005c },
  101686. { 0xe7f2b935,0x07c8b639,0xc182961a,0x2bff975a,0x7518ca2c,0x86bceea7,
  101687. 0x3d588e3d,0xbf47d19b } },
  101688. /* 234 */
  101689. { { 0xdd7665d5,0x672967a7,0x2f2f4de5,0x4e303057,0x80d4903f,0x144005ae,
  101690. 0x39c9a1b6,0x001c2c7f },
  101691. { 0x69efc6d6,0x143a8014,0x7bc7a724,0xc810bdaa,0xa78150a4,0x5f65670b,
  101692. 0x86ffb99b,0xfdadf8e7 } },
  101693. /* 235 */
  101694. { { 0xffc00785,0xfd38cb88,0x3b48eb67,0x77fa7591,0xbf368fbc,0x0454d055,
  101695. 0x5aa43c94,0x3a838e4d },
  101696. { 0x3e97bb9a,0x56166329,0x441d94d9,0x9eb93363,0x0adb2a83,0x515591a6,
  101697. 0x873e1da3,0x3cdb8257 } },
  101698. /* 236 */
  101699. { { 0x7de77eab,0x137140a9,0x41648109,0xf7e1c50d,0xceb1d0df,0x762dcad2,
  101700. 0xf1f57fba,0x5a60cc89 },
  101701. { 0x40d45673,0x80b36382,0x5913c655,0x1b82be19,0xdd64b741,0x057284b8,
  101702. 0xdbfd8fc0,0x922ff56f } },
  101703. /* 237 */
  101704. { { 0xc9a129a1,0x1b265dee,0xcc284e04,0xa5b1ce57,0xcebfbe3c,0x04380c46,
  101705. 0xf6c5cd62,0x72919a7d },
  101706. { 0x8fb90f9a,0x298f453a,0x88e4031b,0xd719c00b,0x796f1856,0xe32c0e77,
  101707. 0x3624089a,0x5e791780 } },
  101708. /* 238 */
  101709. { { 0x7f63cdfb,0x5c16ec55,0xf1cae4fd,0x8e6a3571,0x560597ca,0xfce26bea,
  101710. 0xe24c2fab,0x4e0a5371 },
  101711. { 0xa5765357,0x276a40d3,0x0d73a2b4,0x3c89af44,0x41d11a32,0xb8f370ae,
  101712. 0xd56604ee,0xf5ff7818 } },
  101713. /* 239 */
  101714. { { 0x1a09df21,0xfbf3e3fe,0xe66e8e47,0x26d5d28e,0x29c89015,0x2096bd0a,
  101715. 0x533f5e64,0xe41df0e9 },
  101716. { 0xb3ba9e3f,0x305fda40,0x2604d895,0xf2340ceb,0x7f0367c7,0x0866e192,
  101717. 0xac4f155f,0x8edd7d6e } },
  101718. /* 240 */
  101719. { { 0x0bfc8ff3,0xc9a1dc0e,0xe936f42f,0x14efd82b,0xcca381ef,0x67016f7c,
  101720. 0xed8aee96,0x1432c1ca },
  101721. { 0x70b23c26,0xec684829,0x0735b273,0xa64fe873,0xeaef0f5a,0xe389f6e5,
  101722. 0x5ac8d2c6,0xcaef480b } },
  101723. /* 241 */
  101724. { { 0x75315922,0x5245c978,0x3063cca5,0xd8295171,0xb64ef2cb,0xf3ce60d0,
  101725. 0x8efae236,0xd0ba177e },
  101726. { 0xb1b3af60,0x53a9ae8f,0x3d2da20e,0x1a796ae5,0xdf9eef28,0x01d63605,
  101727. 0x1c54ae16,0xf31c957c } },
  101728. /* 242 */
  101729. { { 0x49cc4597,0xc0f58d52,0xbae0a028,0xdc5015b0,0x734a814a,0xefc5fc55,
  101730. 0x96e17c3a,0x013404cb },
  101731. { 0xc9a824bf,0xb29e2585,0x001eaed7,0xd593185e,0x61ef68ac,0x8d6ee682,
  101732. 0x91933e6c,0x6f377c4b } },
  101733. /* 243 */
  101734. { { 0xa8333fd2,0x9f93bad1,0x5a2a95b8,0xa8930202,0xeaf75ace,0x211e5037,
  101735. 0xd2d09506,0x6dba3e4e },
  101736. { 0xd04399cd,0xa48ef98c,0xe6b73ade,0x1811c66e,0xc17ecaf3,0x72f60752,
  101737. 0x3becf4a7,0xf13cf342 } },
  101738. /* 244 */
  101739. { { 0xa919e2eb,0xceeb9ec0,0xf62c0f68,0x83a9a195,0x7aba2299,0xcfba3bb6,
  101740. 0x274bbad3,0xc83fa9a9 },
  101741. { 0x62fa1ce0,0x0d7d1b0b,0x3418efbf,0xe58b60f5,0x52706f04,0xbfa8ef9e,
  101742. 0x5d702683,0xb49d70f4 } },
  101743. /* 245 */
  101744. { { 0xfad5513b,0x914c7510,0xb1751e2d,0x05f32eec,0xd9fb9d59,0x6d850418,
  101745. 0x0c30f1cf,0x59cfadbb },
  101746. { 0x55cb7fd6,0xe167ac23,0x820426a3,0x249367b8,0x90a78864,0xeaeec58c,
  101747. 0x354a4b67,0x5babf362 } },
  101748. /* 246 */
  101749. { { 0xee424865,0x37c981d1,0xf2e5577f,0x8b002878,0xb9e0c058,0x702970f1,
  101750. 0x9026c8f0,0x6188c6a7 },
  101751. { 0xd0f244da,0x06f9a19b,0xfb080873,0x1ecced5c,0x9f213637,0x35470f9b,
  101752. 0xdf50b9d9,0x993fe475 } },
  101753. /* 247 */
  101754. { { 0x9b2c3609,0x68e31cdf,0x2c46d4ea,0x84eb19c0,0x9a775101,0x7ac9ec1a,
  101755. 0x4c80616b,0x81f76466 },
  101756. { 0x75fbe978,0x1d7c2a5a,0xf183b356,0x6743fed3,0x501dd2bf,0x838d1f04,
  101757. 0x5fe9060d,0x564a812a } },
  101758. /* 248 */
  101759. { { 0xfa817d1d,0x7a5a64f4,0xbea82e0f,0x55f96844,0xcd57f9aa,0xb5ff5a0f,
  101760. 0x00e51d6c,0x226bf3cf },
  101761. { 0x2f2833cf,0xd6d1a9f9,0x4f4f89a8,0x20a0a35a,0x8f3f7f77,0x11536c49,
  101762. 0xff257836,0x68779f47 } },
  101763. /* 249 */
  101764. { { 0x73043d08,0x79b0c1c1,0x1fc020fa,0xa5446774,0x9a6d26d0,0xd3767e28,
  101765. 0xeb092e0b,0x97bcb0d1 },
  101766. { 0xf32ed3c3,0x2ab6eaa8,0xb281bc48,0xc8a4f151,0xbfa178f3,0x4d1bf4f3,
  101767. 0x0a784655,0xa872ffe8 } },
  101768. /* 250 */
  101769. { { 0xa32b2086,0xb1ab7935,0x8160f486,0xe1eb710e,0x3b6ae6be,0x9bd0cd91,
  101770. 0xb732a36a,0x02812bfc },
  101771. { 0xcf605318,0xa63fd7ca,0xfdfd6d1d,0x646e5d50,0x2102d619,0xa1d68398,
  101772. 0xfe5396af,0x07391cc9 } },
  101773. /* 251 */
  101774. { { 0x8b80d02b,0xc50157f0,0x62877f7f,0x6b8333d1,0x78d542ae,0x7aca1af8,
  101775. 0x7e6d2a08,0x355d2adc },
  101776. { 0x287386e1,0xb41f335a,0xf8e43275,0xfd272a94,0xe79989ea,0x286ca2cd,
  101777. 0x7c2a3a79,0x3dc2b1e3 } },
  101778. /* 252 */
  101779. { { 0x04581352,0xd689d21c,0x376782be,0x0a00c825,0x9fed701f,0x203bd590,
  101780. 0x3ccd846b,0xc4786910 },
  101781. { 0x24c768ed,0x5dba7708,0x6841f657,0x72feea02,0x6accce0e,0x73313ed5,
  101782. 0xd5bb4d32,0xccc42968 } },
  101783. /* 253 */
  101784. { { 0x3d7620b9,0x94e50de1,0x5992a56a,0xd89a5c8a,0x675487c9,0xdc007640,
  101785. 0xaa4871cf,0xe147eb42 },
  101786. { 0xacf3ae46,0x274ab4ee,0x50350fbe,0xfd4936fb,0x48c840ea,0xdf2afe47,
  101787. 0x080e96e3,0x239ac047 } },
  101788. /* 254 */
  101789. { { 0x2bfee8d4,0x481d1f35,0xfa7b0fec,0xce80b5cf,0x2ce9af3c,0x105c4c9e,
  101790. 0xf5f7e59d,0xc55fa1a3 },
  101791. { 0x8257c227,0x3186f14e,0x342be00b,0xc5b1653f,0xaa904fb2,0x09afc998,
  101792. 0xd4f4b699,0x094cd99c } },
  101793. /* 255 */
  101794. { { 0xd703beba,0x8a981c84,0x32ceb291,0x8631d150,0xe3bd49ec,0xa445f2c9,
  101795. 0x42abad33,0xb90a30b6 },
  101796. { 0xb4a5abf9,0xb465404f,0x75db7603,0x004750c3,0xca35d89f,0x6f9a42cc,
  101797. 0x1b7924f7,0x019f8b9a } },
  101798. };
  101799. /* Multiply the base point of P256 by the scalar and return the result.
  101800. * If map is true then convert result to affine coordinates.
  101801. *
  101802. * Stripe implementation.
  101803. * Pre-generated: 2^0, 2^32, ...
  101804. * Pre-generated: products of all combinations of above.
  101805. * 8 doubles and adds (with qz=1)
  101806. *
  101807. * r Resulting point.
  101808. * k Scalar to multiply by.
  101809. * map Indicates whether to convert result to affine.
  101810. * ct Constant time required.
  101811. * heap Heap to use for allocation.
  101812. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101813. */
  101814. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  101815. int map, int ct, void* heap)
  101816. {
  101817. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  101818. k, map, ct, heap);
  101819. }
  101820. #endif
  101821. /* Multiply the base point of P256 by the scalar and return the result.
  101822. * If map is true then convert result to affine coordinates.
  101823. *
  101824. * km Scalar to multiply by.
  101825. * r Resulting point.
  101826. * map Indicates whether to convert result to affine.
  101827. * heap Heap to use for allocation.
  101828. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101829. */
  101830. int sp_ecc_mulmod_base_256(const mp_int* km, ecc_point* r, int map, void* heap)
  101831. {
  101832. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101833. sp_point_256* point = NULL;
  101834. sp_digit* k = NULL;
  101835. #else
  101836. sp_point_256 point[1];
  101837. sp_digit k[8];
  101838. #endif
  101839. int err = MP_OKAY;
  101840. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101841. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  101842. DYNAMIC_TYPE_ECC);
  101843. if (point == NULL)
  101844. err = MEMORY_E;
  101845. if (err == MP_OKAY) {
  101846. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  101847. DYNAMIC_TYPE_ECC);
  101848. if (k == NULL)
  101849. err = MEMORY_E;
  101850. }
  101851. #endif
  101852. if (err == MP_OKAY) {
  101853. sp_256_from_mp(k, 8, km);
  101854. err = sp_256_ecc_mulmod_base_8(point, k, map, 1, heap);
  101855. }
  101856. if (err == MP_OKAY) {
  101857. err = sp_256_point_to_ecc_point_8(point, r);
  101858. }
  101859. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101860. if (k != NULL)
  101861. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  101862. if (point != NULL)
  101863. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  101864. #endif
  101865. return err;
  101866. }
  101867. /* Multiply the base point of P256 by the scalar, add point a and return
  101868. * the result. If map is true then convert result to affine coordinates.
  101869. *
  101870. * km Scalar to multiply by.
  101871. * am Point to add to scalar mulitply result.
  101872. * inMont Point to add is in montgomery form.
  101873. * r Resulting point.
  101874. * map Indicates whether to convert result to affine.
  101875. * heap Heap to use for allocation.
  101876. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101877. */
  101878. int sp_ecc_mulmod_base_add_256(const mp_int* km, const ecc_point* am,
  101879. int inMont, ecc_point* r, int map, void* heap)
  101880. {
  101881. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101882. sp_point_256* point = NULL;
  101883. sp_digit* k = NULL;
  101884. #else
  101885. sp_point_256 point[2];
  101886. sp_digit k[8 + 8 * 2 * 5];
  101887. #endif
  101888. sp_point_256* addP = NULL;
  101889. sp_digit* tmp = NULL;
  101890. int err = MP_OKAY;
  101891. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101892. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  101893. DYNAMIC_TYPE_ECC);
  101894. if (point == NULL)
  101895. err = MEMORY_E;
  101896. if (err == MP_OKAY) {
  101897. k = (sp_digit*)XMALLOC(
  101898. sizeof(sp_digit) * (8 + 8 * 2 * 5),
  101899. heap, DYNAMIC_TYPE_ECC);
  101900. if (k == NULL)
  101901. err = MEMORY_E;
  101902. }
  101903. #endif
  101904. if (err == MP_OKAY) {
  101905. addP = point + 1;
  101906. tmp = k + 8;
  101907. sp_256_from_mp(k, 8, km);
  101908. sp_256_point_from_ecc_point_8(addP, am);
  101909. }
  101910. if ((err == MP_OKAY) && (!inMont)) {
  101911. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  101912. }
  101913. if ((err == MP_OKAY) && (!inMont)) {
  101914. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  101915. }
  101916. if ((err == MP_OKAY) && (!inMont)) {
  101917. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  101918. }
  101919. if (err == MP_OKAY) {
  101920. err = sp_256_ecc_mulmod_base_8(point, k, 0, 0, heap);
  101921. }
  101922. if (err == MP_OKAY) {
  101923. sp_256_proj_point_add_8(point, point, addP, tmp);
  101924. if (map) {
  101925. sp_256_map_8(point, point, tmp);
  101926. }
  101927. err = sp_256_point_to_ecc_point_8(point, r);
  101928. }
  101929. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101930. if (k != NULL)
  101931. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  101932. if (point)
  101933. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  101934. #endif
  101935. return err;
  101936. }
  101937. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  101938. defined(HAVE_ECC_VERIFY)
  101939. /* Returns 1 if the number of zero.
  101940. * Implementation is constant time.
  101941. *
  101942. * a Number to check.
  101943. * returns 1 if the number is zero and 0 otherwise.
  101944. */
  101945. static int sp_256_iszero_8(const sp_digit* a)
  101946. {
  101947. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7]) == 0;
  101948. }
  101949. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  101950. /* Add 1 to a. (a = a + 1)
  101951. *
  101952. * a A single precision integer.
  101953. */
  101954. SP_NOINLINE static void sp_256_add_one_8(sp_digit* a)
  101955. {
  101956. __asm__ __volatile__ (
  101957. "movs r2, #1\n\t"
  101958. "ldr r1, [%[a]]\n\t"
  101959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  101960. "adds r1, r1, r2\n\t"
  101961. #else
  101962. "add r1, r1, r2\n\t"
  101963. #endif
  101964. "movs r2, #0\n\t"
  101965. "str r1, [%[a]]\n\t"
  101966. "ldr r1, [%[a], #4]\n\t"
  101967. #ifdef WOLFSSL_KEIL
  101968. "adcs r1, r1, r2\n\t"
  101969. #elif defined(__clang__)
  101970. "adcs r1, r2\n\t"
  101971. #else
  101972. "adc r1, r2\n\t"
  101973. #endif
  101974. "str r1, [%[a], #4]\n\t"
  101975. "ldr r1, [%[a], #8]\n\t"
  101976. #ifdef WOLFSSL_KEIL
  101977. "adcs r1, r1, r2\n\t"
  101978. #elif defined(__clang__)
  101979. "adcs r1, r2\n\t"
  101980. #else
  101981. "adc r1, r2\n\t"
  101982. #endif
  101983. "str r1, [%[a], #8]\n\t"
  101984. "ldr r1, [%[a], #12]\n\t"
  101985. #ifdef WOLFSSL_KEIL
  101986. "adcs r1, r1, r2\n\t"
  101987. #elif defined(__clang__)
  101988. "adcs r1, r2\n\t"
  101989. #else
  101990. "adc r1, r2\n\t"
  101991. #endif
  101992. "str r1, [%[a], #12]\n\t"
  101993. "ldr r1, [%[a], #16]\n\t"
  101994. #ifdef WOLFSSL_KEIL
  101995. "adcs r1, r1, r2\n\t"
  101996. #elif defined(__clang__)
  101997. "adcs r1, r2\n\t"
  101998. #else
  101999. "adc r1, r2\n\t"
  102000. #endif
  102001. "str r1, [%[a], #16]\n\t"
  102002. "ldr r1, [%[a], #20]\n\t"
  102003. #ifdef WOLFSSL_KEIL
  102004. "adcs r1, r1, r2\n\t"
  102005. #elif defined(__clang__)
  102006. "adcs r1, r2\n\t"
  102007. #else
  102008. "adc r1, r2\n\t"
  102009. #endif
  102010. "str r1, [%[a], #20]\n\t"
  102011. "ldr r1, [%[a], #24]\n\t"
  102012. #ifdef WOLFSSL_KEIL
  102013. "adcs r1, r1, r2\n\t"
  102014. #elif defined(__clang__)
  102015. "adcs r1, r2\n\t"
  102016. #else
  102017. "adc r1, r2\n\t"
  102018. #endif
  102019. "str r1, [%[a], #24]\n\t"
  102020. "ldr r1, [%[a], #28]\n\t"
  102021. #ifdef WOLFSSL_KEIL
  102022. "adcs r1, r1, r2\n\t"
  102023. #elif defined(__clang__)
  102024. "adcs r1, r2\n\t"
  102025. #else
  102026. "adc r1, r2\n\t"
  102027. #endif
  102028. "str r1, [%[a], #28]\n\t"
  102029. : [a] "+r" (a)
  102030. :
  102031. : "memory", "r1", "r2"
  102032. );
  102033. }
  102034. /* Read big endian unsigned byte array into r.
  102035. *
  102036. * r A single precision integer.
  102037. * size Maximum number of bytes to convert
  102038. * a Byte array.
  102039. * n Number of bytes in array to read.
  102040. */
  102041. static void sp_256_from_bin(sp_digit* r, int size, const byte* a, int n)
  102042. {
  102043. int i;
  102044. int j = 0;
  102045. word32 s = 0;
  102046. r[0] = 0;
  102047. for (i = n-1; i >= 0; i--) {
  102048. r[j] |= (((sp_digit)a[i]) << s);
  102049. if (s >= 24U) {
  102050. r[j] &= 0xffffffff;
  102051. s = 32U - s;
  102052. if (j + 1 >= size) {
  102053. break;
  102054. }
  102055. r[++j] = (sp_digit)a[i] >> s;
  102056. s = 8U - s;
  102057. }
  102058. else {
  102059. s += 8U;
  102060. }
  102061. }
  102062. for (j++; j < size; j++) {
  102063. r[j] = 0;
  102064. }
  102065. }
  102066. /* Generates a scalar that is in the range 1..order-1.
  102067. *
  102068. * rng Random number generator.
  102069. * k Scalar value.
  102070. * returns RNG failures, MEMORY_E when memory allocation fails and
  102071. * MP_OKAY on success.
  102072. */
  102073. static int sp_256_ecc_gen_k_8(WC_RNG* rng, sp_digit* k)
  102074. {
  102075. int err;
  102076. byte buf[32];
  102077. do {
  102078. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  102079. if (err == 0) {
  102080. sp_256_from_bin(k, 8, buf, (int)sizeof(buf));
  102081. if (sp_256_cmp_8(k, p256_order2) < 0) {
  102082. sp_256_add_one_8(k);
  102083. break;
  102084. }
  102085. }
  102086. }
  102087. while (err == 0);
  102088. return err;
  102089. }
  102090. /* Makes a random EC key pair.
  102091. *
  102092. * rng Random number generator.
  102093. * priv Generated private value.
  102094. * pub Generated public point.
  102095. * heap Heap to use for allocation.
  102096. * returns ECC_INF_E when the point does not have the correct order, RNG
  102097. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  102098. */
  102099. int sp_ecc_make_key_256(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  102100. {
  102101. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102102. sp_point_256* point = NULL;
  102103. sp_digit* k = NULL;
  102104. #else
  102105. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  102106. sp_point_256 point[2];
  102107. #else
  102108. sp_point_256 point[1];
  102109. #endif
  102110. sp_digit k[8];
  102111. #endif
  102112. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  102113. sp_point_256* infinity = NULL;
  102114. #endif
  102115. int err = MP_OKAY;
  102116. (void)heap;
  102117. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102118. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  102119. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC);
  102120. #else
  102121. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC);
  102122. #endif
  102123. if (point == NULL)
  102124. err = MEMORY_E;
  102125. if (err == MP_OKAY) {
  102126. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  102127. DYNAMIC_TYPE_ECC);
  102128. if (k == NULL)
  102129. err = MEMORY_E;
  102130. }
  102131. #endif
  102132. if (err == MP_OKAY) {
  102133. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  102134. infinity = point + 1;
  102135. #endif
  102136. err = sp_256_ecc_gen_k_8(rng, k);
  102137. }
  102138. if (err == MP_OKAY) {
  102139. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, NULL);
  102140. }
  102141. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  102142. if (err == MP_OKAY) {
  102143. err = sp_256_ecc_mulmod_8(infinity, point, p256_order, 1, 1, NULL);
  102144. }
  102145. if (err == MP_OKAY) {
  102146. if (sp_256_iszero_8(point->x) || sp_256_iszero_8(point->y)) {
  102147. err = ECC_INF_E;
  102148. }
  102149. }
  102150. #endif
  102151. if (err == MP_OKAY) {
  102152. err = sp_256_to_mp(k, priv);
  102153. }
  102154. if (err == MP_OKAY) {
  102155. err = sp_256_point_to_ecc_point_8(point, pub);
  102156. }
  102157. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102158. if (k != NULL)
  102159. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  102160. if (point != NULL) {
  102161. /* point is not sensitive, so no need to zeroize */
  102162. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  102163. }
  102164. #endif
  102165. return err;
  102166. }
  102167. #ifdef HAVE_ECC_DHE
  102168. /* Write r as big endian to byte array.
  102169. * Fixed length number of bytes written: 32
  102170. *
  102171. * r A single precision integer.
  102172. * a Byte array.
  102173. */
  102174. static void sp_256_to_bin_8(sp_digit* r, byte* a)
  102175. {
  102176. int i;
  102177. int j;
  102178. int s = 0;
  102179. int b;
  102180. j = 256 / 8 - 1;
  102181. a[j] = 0;
  102182. for (i=0; i<8 && j>=0; i++) {
  102183. b = 0;
  102184. /* lint allow cast of mismatch sp_digit and int */
  102185. a[j--] |= (byte)(r[i] << s); /*lint !e9033*/
  102186. b += 8 - s;
  102187. if (j < 0) {
  102188. break;
  102189. }
  102190. while (b < 32) {
  102191. a[j--] = (byte)(r[i] >> b);
  102192. b += 8;
  102193. if (j < 0) {
  102194. break;
  102195. }
  102196. }
  102197. s = 8 - (b - 32);
  102198. if (j >= 0) {
  102199. a[j] = 0;
  102200. }
  102201. if (s != 0) {
  102202. j++;
  102203. }
  102204. }
  102205. }
  102206. /* Multiply the point by the scalar and serialize the X ordinate.
  102207. * The number is 0 padded to maximum size on output.
  102208. *
  102209. * priv Scalar to multiply the point by.
  102210. * pub Point to multiply.
  102211. * out Buffer to hold X ordinate.
  102212. * outLen On entry, size of the buffer in bytes.
  102213. * On exit, length of data in buffer in bytes.
  102214. * heap Heap to use for allocation.
  102215. * returns BUFFER_E if the buffer is to small for output size,
  102216. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  102217. */
  102218. int sp_ecc_secret_gen_256(const mp_int* priv, const ecc_point* pub, byte* out,
  102219. word32* outLen, void* heap)
  102220. {
  102221. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102222. sp_point_256* point = NULL;
  102223. sp_digit* k = NULL;
  102224. #else
  102225. sp_point_256 point[1];
  102226. sp_digit k[8];
  102227. #endif
  102228. int err = MP_OKAY;
  102229. if (*outLen < 32U) {
  102230. err = BUFFER_E;
  102231. }
  102232. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102233. if (err == MP_OKAY) {
  102234. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  102235. DYNAMIC_TYPE_ECC);
  102236. if (point == NULL)
  102237. err = MEMORY_E;
  102238. }
  102239. if (err == MP_OKAY) {
  102240. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  102241. DYNAMIC_TYPE_ECC);
  102242. if (k == NULL)
  102243. err = MEMORY_E;
  102244. }
  102245. #endif
  102246. if (err == MP_OKAY) {
  102247. sp_256_from_mp(k, 8, priv);
  102248. sp_256_point_from_ecc_point_8(point, pub);
  102249. err = sp_256_ecc_mulmod_8(point, point, k, 1, 1, heap);
  102250. }
  102251. if (err == MP_OKAY) {
  102252. sp_256_to_bin_8(point->x, out);
  102253. *outLen = 32;
  102254. }
  102255. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102256. if (k != NULL)
  102257. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  102258. if (point != NULL)
  102259. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  102260. #endif
  102261. return err;
  102262. }
  102263. #endif /* HAVE_ECC_DHE */
  102264. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  102265. #endif
  102266. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  102267. #ifdef WOLFSSL_SP_SMALL
  102268. /* Sub b from a into a. (a -= b)
  102269. *
  102270. * a A single precision integer.
  102271. * b A single precision integer.
  102272. */
  102273. SP_NOINLINE static sp_digit sp_256_sub_in_place_8(sp_digit* a,
  102274. const sp_digit* b)
  102275. {
  102276. __asm__ __volatile__ (
  102277. "movs r7, %[a]\n\t"
  102278. "movs r2, #0\n\t"
  102279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102280. "adds r7, r7, #32\n\t"
  102281. #else
  102282. "add r7, r7, #32\n\t"
  102283. #endif
  102284. "\n"
  102285. "L_sp_256_sub_in_place_8_words_%=:\n\t"
  102286. "movs r5, #0\n\t"
  102287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102288. "subs r5, r5, r2\n\t"
  102289. #else
  102290. "sub r5, r5, r2\n\t"
  102291. #endif
  102292. "ldr r3, [%[a]]\n\t"
  102293. "ldr r4, [%[a], #4]\n\t"
  102294. "ldr r5, [%[b]]\n\t"
  102295. "ldr r6, [%[b], #4]\n\t"
  102296. #ifdef WOLFSSL_KEIL
  102297. "sbcs r3, r3, r5\n\t"
  102298. #elif defined(__clang__)
  102299. "sbcs r3, r5\n\t"
  102300. #else
  102301. "sbc r3, r5\n\t"
  102302. #endif
  102303. #ifdef WOLFSSL_KEIL
  102304. "sbcs r4, r4, r6\n\t"
  102305. #elif defined(__clang__)
  102306. "sbcs r4, r6\n\t"
  102307. #else
  102308. "sbc r4, r6\n\t"
  102309. #endif
  102310. "str r3, [%[a]]\n\t"
  102311. "str r4, [%[a], #4]\n\t"
  102312. #ifdef WOLFSSL_KEIL
  102313. "sbcs r2, r2, r2\n\t"
  102314. #elif defined(__clang__)
  102315. "sbcs r2, r2\n\t"
  102316. #else
  102317. "sbc r2, r2\n\t"
  102318. #endif
  102319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102320. "adds %[a], %[a], #8\n\t"
  102321. #else
  102322. "add %[a], %[a], #8\n\t"
  102323. #endif
  102324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102325. "adds %[b], %[b], #8\n\t"
  102326. #else
  102327. "add %[b], %[b], #8\n\t"
  102328. #endif
  102329. "cmp %[a], r7\n\t"
  102330. "bne L_sp_256_sub_in_place_8_words_%=\n\t"
  102331. "movs %[a], r2\n\t"
  102332. : [a] "+r" (a), [b] "+r" (b)
  102333. :
  102334. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  102335. );
  102336. return (uint32_t)(size_t)a;
  102337. }
  102338. #else
  102339. /* Sub b from a into a. (a -= b)
  102340. *
  102341. * a A single precision integer.
  102342. * b A single precision integer.
  102343. */
  102344. SP_NOINLINE static sp_digit sp_256_sub_in_place_8(sp_digit* a,
  102345. const sp_digit* b)
  102346. {
  102347. __asm__ __volatile__ (
  102348. "ldm %[b]!, {r4, r5}\n\t"
  102349. "ldr r2, [%[a]]\n\t"
  102350. "ldr r3, [%[a], #4]\n\t"
  102351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102352. "subs r2, r2, r4\n\t"
  102353. #else
  102354. "sub r2, r2, r4\n\t"
  102355. #endif
  102356. #ifdef WOLFSSL_KEIL
  102357. "sbcs r3, r3, r5\n\t"
  102358. #elif defined(__clang__)
  102359. "sbcs r3, r5\n\t"
  102360. #else
  102361. "sbc r3, r5\n\t"
  102362. #endif
  102363. "stm %[a]!, {r2, r3}\n\t"
  102364. "ldm %[b]!, {r4, r5}\n\t"
  102365. "ldr r2, [%[a]]\n\t"
  102366. "ldr r3, [%[a], #4]\n\t"
  102367. #ifdef WOLFSSL_KEIL
  102368. "sbcs r2, r2, r4\n\t"
  102369. #elif defined(__clang__)
  102370. "sbcs r2, r4\n\t"
  102371. #else
  102372. "sbc r2, r4\n\t"
  102373. #endif
  102374. #ifdef WOLFSSL_KEIL
  102375. "sbcs r3, r3, r5\n\t"
  102376. #elif defined(__clang__)
  102377. "sbcs r3, r5\n\t"
  102378. #else
  102379. "sbc r3, r5\n\t"
  102380. #endif
  102381. "stm %[a]!, {r2, r3}\n\t"
  102382. "ldm %[b]!, {r4, r5}\n\t"
  102383. "ldr r2, [%[a]]\n\t"
  102384. "ldr r3, [%[a], #4]\n\t"
  102385. #ifdef WOLFSSL_KEIL
  102386. "sbcs r2, r2, r4\n\t"
  102387. #elif defined(__clang__)
  102388. "sbcs r2, r4\n\t"
  102389. #else
  102390. "sbc r2, r4\n\t"
  102391. #endif
  102392. #ifdef WOLFSSL_KEIL
  102393. "sbcs r3, r3, r5\n\t"
  102394. #elif defined(__clang__)
  102395. "sbcs r3, r5\n\t"
  102396. #else
  102397. "sbc r3, r5\n\t"
  102398. #endif
  102399. "stm %[a]!, {r2, r3}\n\t"
  102400. "ldm %[b]!, {r4, r5}\n\t"
  102401. "ldr r2, [%[a]]\n\t"
  102402. "ldr r3, [%[a], #4]\n\t"
  102403. #ifdef WOLFSSL_KEIL
  102404. "sbcs r2, r2, r4\n\t"
  102405. #elif defined(__clang__)
  102406. "sbcs r2, r4\n\t"
  102407. #else
  102408. "sbc r2, r4\n\t"
  102409. #endif
  102410. #ifdef WOLFSSL_KEIL
  102411. "sbcs r3, r3, r5\n\t"
  102412. #elif defined(__clang__)
  102413. "sbcs r3, r5\n\t"
  102414. #else
  102415. "sbc r3, r5\n\t"
  102416. #endif
  102417. "stm %[a]!, {r2, r3}\n\t"
  102418. #ifdef WOLFSSL_KEIL
  102419. "sbcs %[a], %[a], %[a]\n\t"
  102420. #elif defined(__clang__)
  102421. "sbcs %[a], %[a]\n\t"
  102422. #else
  102423. "sbc %[a], %[a]\n\t"
  102424. #endif
  102425. : [a] "+r" (a), [b] "+r" (b)
  102426. :
  102427. : "memory", "r2", "r3", "r4", "r5"
  102428. );
  102429. return (uint32_t)(size_t)a;
  102430. }
  102431. #endif /* WOLFSSL_SP_SMALL */
  102432. /* Mul a by digit b into r. (r = a * b)
  102433. *
  102434. * r A single precision integer.
  102435. * a A single precision integer.
  102436. * b A single precision digit.
  102437. */
  102438. SP_NOINLINE static void sp_256_mul_d_8(sp_digit* r, const sp_digit* a,
  102439. sp_digit b)
  102440. {
  102441. __asm__ __volatile__ (
  102442. "movs r6, #32\n\t"
  102443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102444. "adds r6, r6, %[a]\n\t"
  102445. #else
  102446. "add r6, r6, %[a]\n\t"
  102447. #endif
  102448. "mov r8, %[r]\n\t"
  102449. "mov r9, r6\n\t"
  102450. "movs r3, #0\n\t"
  102451. "movs r4, #0\n\t"
  102452. "\n"
  102453. "L_sp_256_mul_d_8_%=:\n\t"
  102454. "movs %[r], #0\n\t"
  102455. "movs r5, #0\n\t"
  102456. "# A[] * B\n\t"
  102457. "ldrh r6, [%[a]]\n\t"
  102458. "uxth r7, %[b]\n\t"
  102459. #ifdef WOLFSSL_KEIL
  102460. "muls r7, r6, r7\n\t"
  102461. #elif defined(__clang__)
  102462. "muls r7, r6\n\t"
  102463. #else
  102464. "mul r7, r6\n\t"
  102465. #endif
  102466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102467. "adds r3, r3, r7\n\t"
  102468. #else
  102469. "add r3, r3, r7\n\t"
  102470. #endif
  102471. #ifdef WOLFSSL_KEIL
  102472. "adcs r4, r4, %[r]\n\t"
  102473. #elif defined(__clang__)
  102474. "adcs r4, %[r]\n\t"
  102475. #else
  102476. "adc r4, %[r]\n\t"
  102477. #endif
  102478. #ifdef WOLFSSL_KEIL
  102479. "adcs r5, r5, %[r]\n\t"
  102480. #elif defined(__clang__)
  102481. "adcs r5, %[r]\n\t"
  102482. #else
  102483. "adc r5, %[r]\n\t"
  102484. #endif
  102485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102486. "lsrs r7, %[b], #16\n\t"
  102487. #else
  102488. "lsr r7, %[b], #16\n\t"
  102489. #endif
  102490. #ifdef WOLFSSL_KEIL
  102491. "muls r6, r7, r6\n\t"
  102492. #elif defined(__clang__)
  102493. "muls r6, r7\n\t"
  102494. #else
  102495. "mul r6, r7\n\t"
  102496. #endif
  102497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102498. "lsrs r7, r6, #16\n\t"
  102499. #else
  102500. "lsr r7, r6, #16\n\t"
  102501. #endif
  102502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102503. "lsls r6, r6, #16\n\t"
  102504. #else
  102505. "lsl r6, r6, #16\n\t"
  102506. #endif
  102507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102508. "adds r3, r3, r6\n\t"
  102509. #else
  102510. "add r3, r3, r6\n\t"
  102511. #endif
  102512. #ifdef WOLFSSL_KEIL
  102513. "adcs r4, r4, r7\n\t"
  102514. #elif defined(__clang__)
  102515. "adcs r4, r7\n\t"
  102516. #else
  102517. "adc r4, r7\n\t"
  102518. #endif
  102519. #ifdef WOLFSSL_KEIL
  102520. "adcs r5, r5, %[r]\n\t"
  102521. #elif defined(__clang__)
  102522. "adcs r5, %[r]\n\t"
  102523. #else
  102524. "adc r5, %[r]\n\t"
  102525. #endif
  102526. "ldr r6, [%[a]]\n\t"
  102527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102528. "lsrs r6, r6, #16\n\t"
  102529. #else
  102530. "lsr r6, r6, #16\n\t"
  102531. #endif
  102532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102533. "lsrs r7, %[b], #16\n\t"
  102534. #else
  102535. "lsr r7, %[b], #16\n\t"
  102536. #endif
  102537. #ifdef WOLFSSL_KEIL
  102538. "muls r7, r6, r7\n\t"
  102539. #elif defined(__clang__)
  102540. "muls r7, r6\n\t"
  102541. #else
  102542. "mul r7, r6\n\t"
  102543. #endif
  102544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102545. "adds r4, r4, r7\n\t"
  102546. #else
  102547. "add r4, r4, r7\n\t"
  102548. #endif
  102549. #ifdef WOLFSSL_KEIL
  102550. "adcs r5, r5, %[r]\n\t"
  102551. #elif defined(__clang__)
  102552. "adcs r5, %[r]\n\t"
  102553. #else
  102554. "adc r5, %[r]\n\t"
  102555. #endif
  102556. "uxth r7, %[b]\n\t"
  102557. #ifdef WOLFSSL_KEIL
  102558. "muls r6, r7, r6\n\t"
  102559. #elif defined(__clang__)
  102560. "muls r6, r7\n\t"
  102561. #else
  102562. "mul r6, r7\n\t"
  102563. #endif
  102564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102565. "lsrs r7, r6, #16\n\t"
  102566. #else
  102567. "lsr r7, r6, #16\n\t"
  102568. #endif
  102569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102570. "lsls r6, r6, #16\n\t"
  102571. #else
  102572. "lsl r6, r6, #16\n\t"
  102573. #endif
  102574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102575. "adds r3, r3, r6\n\t"
  102576. #else
  102577. "add r3, r3, r6\n\t"
  102578. #endif
  102579. #ifdef WOLFSSL_KEIL
  102580. "adcs r4, r4, r7\n\t"
  102581. #elif defined(__clang__)
  102582. "adcs r4, r7\n\t"
  102583. #else
  102584. "adc r4, r7\n\t"
  102585. #endif
  102586. #ifdef WOLFSSL_KEIL
  102587. "adcs r5, r5, %[r]\n\t"
  102588. #elif defined(__clang__)
  102589. "adcs r5, %[r]\n\t"
  102590. #else
  102591. "adc r5, %[r]\n\t"
  102592. #endif
  102593. "# A[] * B - Done\n\t"
  102594. "mov %[r], r8\n\t"
  102595. "str r3, [%[r]]\n\t"
  102596. "movs r3, r4\n\t"
  102597. "movs r4, r5\n\t"
  102598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102599. "adds %[r], %[r], #4\n\t"
  102600. #else
  102601. "add %[r], %[r], #4\n\t"
  102602. #endif
  102603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102604. "adds %[a], %[a], #4\n\t"
  102605. #else
  102606. "add %[a], %[a], #4\n\t"
  102607. #endif
  102608. "mov r8, %[r]\n\t"
  102609. "cmp %[a], r9\n\t"
  102610. "blt L_sp_256_mul_d_8_%=\n\t"
  102611. "str r3, [%[r]]\n\t"
  102612. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  102613. :
  102614. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  102615. );
  102616. }
  102617. /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
  102618. *
  102619. * d1 The high order half of the number to divide.
  102620. * d0 The low order half of the number to divide.
  102621. * div The dividend.
  102622. * returns the result of the division.
  102623. *
  102624. * Note that this is an approximate div. It may give an answer 1 larger.
  102625. */
  102626. SP_NOINLINE static sp_digit div_256_word_8(sp_digit d1, sp_digit d0,
  102627. sp_digit div)
  102628. {
  102629. __asm__ __volatile__ (
  102630. "movs r3, #0\n\t"
  102631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102632. "lsrs r5, %[div], #1\n\t"
  102633. #else
  102634. "lsr r5, %[div], #1\n\t"
  102635. #endif
  102636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102637. "adds r5, r5, #1\n\t"
  102638. #else
  102639. "add r5, r5, #1\n\t"
  102640. #endif
  102641. "mov r8, %[d0]\n\t"
  102642. "mov r9, %[d1]\n\t"
  102643. "# Do top 32\n\t"
  102644. "movs r6, r5\n\t"
  102645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102646. "subs r6, r6, %[d1]\n\t"
  102647. #else
  102648. "sub r6, r6, %[d1]\n\t"
  102649. #endif
  102650. #ifdef WOLFSSL_KEIL
  102651. "sbcs r6, r6, r6\n\t"
  102652. #elif defined(__clang__)
  102653. "sbcs r6, r6\n\t"
  102654. #else
  102655. "sbc r6, r6\n\t"
  102656. #endif
  102657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102658. "adds r3, r3, r3\n\t"
  102659. #else
  102660. "add r3, r3, r3\n\t"
  102661. #endif
  102662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102663. "subs r3, r3, r6\n\t"
  102664. #else
  102665. "sub r3, r3, r6\n\t"
  102666. #endif
  102667. #ifdef WOLFSSL_KEIL
  102668. "ands r6, r6, r5\n\t"
  102669. #elif defined(__clang__)
  102670. "ands r6, r5\n\t"
  102671. #else
  102672. "and r6, r5\n\t"
  102673. #endif
  102674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102675. "subs %[d1], %[d1], r6\n\t"
  102676. #else
  102677. "sub %[d1], %[d1], r6\n\t"
  102678. #endif
  102679. "movs r4, #29\n\t"
  102680. "\n"
  102681. "L_div_256_word_8_loop_%=:\n\t"
  102682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102683. "lsls %[d0], %[d0], #1\n\t"
  102684. #else
  102685. "lsl %[d0], %[d0], #1\n\t"
  102686. #endif
  102687. #ifdef WOLFSSL_KEIL
  102688. "adcs %[d1], %[d1], %[d1]\n\t"
  102689. #elif defined(__clang__)
  102690. "adcs %[d1], %[d1]\n\t"
  102691. #else
  102692. "adc %[d1], %[d1]\n\t"
  102693. #endif
  102694. "movs r6, r5\n\t"
  102695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102696. "subs r6, r6, %[d1]\n\t"
  102697. #else
  102698. "sub r6, r6, %[d1]\n\t"
  102699. #endif
  102700. #ifdef WOLFSSL_KEIL
  102701. "sbcs r6, r6, r6\n\t"
  102702. #elif defined(__clang__)
  102703. "sbcs r6, r6\n\t"
  102704. #else
  102705. "sbc r6, r6\n\t"
  102706. #endif
  102707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102708. "adds r3, r3, r3\n\t"
  102709. #else
  102710. "add r3, r3, r3\n\t"
  102711. #endif
  102712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102713. "subs r3, r3, r6\n\t"
  102714. #else
  102715. "sub r3, r3, r6\n\t"
  102716. #endif
  102717. #ifdef WOLFSSL_KEIL
  102718. "ands r6, r6, r5\n\t"
  102719. #elif defined(__clang__)
  102720. "ands r6, r5\n\t"
  102721. #else
  102722. "and r6, r5\n\t"
  102723. #endif
  102724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102725. "subs %[d1], %[d1], r6\n\t"
  102726. #else
  102727. "sub %[d1], %[d1], r6\n\t"
  102728. #endif
  102729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102730. "subs r4, r4, #1\n\t"
  102731. #else
  102732. "sub r4, r4, #1\n\t"
  102733. #endif
  102734. "bpl L_div_256_word_8_loop_%=\n\t"
  102735. "movs r7, #0\n\t"
  102736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102737. "adds r3, r3, r3\n\t"
  102738. #else
  102739. "add r3, r3, r3\n\t"
  102740. #endif
  102741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102742. "adds r3, r3, #1\n\t"
  102743. #else
  102744. "add r3, r3, #1\n\t"
  102745. #endif
  102746. "# r * div - Start\n\t"
  102747. "uxth %[d1], r3\n\t"
  102748. "uxth r4, %[div]\n\t"
  102749. #ifdef WOLFSSL_KEIL
  102750. "muls r4, %[d1], r4\n\t"
  102751. #elif defined(__clang__)
  102752. "muls r4, %[d1]\n\t"
  102753. #else
  102754. "mul r4, %[d1]\n\t"
  102755. #endif
  102756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102757. "lsrs r6, %[div], #16\n\t"
  102758. #else
  102759. "lsr r6, %[div], #16\n\t"
  102760. #endif
  102761. #ifdef WOLFSSL_KEIL
  102762. "muls %[d1], r6, %[d1]\n\t"
  102763. #elif defined(__clang__)
  102764. "muls %[d1], r6\n\t"
  102765. #else
  102766. "mul %[d1], r6\n\t"
  102767. #endif
  102768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102769. "lsrs r5, %[d1], #16\n\t"
  102770. #else
  102771. "lsr r5, %[d1], #16\n\t"
  102772. #endif
  102773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102774. "lsls %[d1], %[d1], #16\n\t"
  102775. #else
  102776. "lsl %[d1], %[d1], #16\n\t"
  102777. #endif
  102778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102779. "adds r4, r4, %[d1]\n\t"
  102780. #else
  102781. "add r4, r4, %[d1]\n\t"
  102782. #endif
  102783. #ifdef WOLFSSL_KEIL
  102784. "adcs r5, r5, r7\n\t"
  102785. #elif defined(__clang__)
  102786. "adcs r5, r7\n\t"
  102787. #else
  102788. "adc r5, r7\n\t"
  102789. #endif
  102790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102791. "lsrs %[d1], r3, #16\n\t"
  102792. #else
  102793. "lsr %[d1], r3, #16\n\t"
  102794. #endif
  102795. #ifdef WOLFSSL_KEIL
  102796. "muls r6, %[d1], r6\n\t"
  102797. #elif defined(__clang__)
  102798. "muls r6, %[d1]\n\t"
  102799. #else
  102800. "mul r6, %[d1]\n\t"
  102801. #endif
  102802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102803. "adds r5, r5, r6\n\t"
  102804. #else
  102805. "add r5, r5, r6\n\t"
  102806. #endif
  102807. "uxth r6, %[div]\n\t"
  102808. #ifdef WOLFSSL_KEIL
  102809. "muls %[d1], r6, %[d1]\n\t"
  102810. #elif defined(__clang__)
  102811. "muls %[d1], r6\n\t"
  102812. #else
  102813. "mul %[d1], r6\n\t"
  102814. #endif
  102815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102816. "lsrs r6, %[d1], #16\n\t"
  102817. #else
  102818. "lsr r6, %[d1], #16\n\t"
  102819. #endif
  102820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102821. "lsls %[d1], %[d1], #16\n\t"
  102822. #else
  102823. "lsl %[d1], %[d1], #16\n\t"
  102824. #endif
  102825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102826. "adds r4, r4, %[d1]\n\t"
  102827. #else
  102828. "add r4, r4, %[d1]\n\t"
  102829. #endif
  102830. #ifdef WOLFSSL_KEIL
  102831. "adcs r5, r5, r6\n\t"
  102832. #elif defined(__clang__)
  102833. "adcs r5, r6\n\t"
  102834. #else
  102835. "adc r5, r6\n\t"
  102836. #endif
  102837. "# r * div - Done\n\t"
  102838. "mov %[d1], r8\n\t"
  102839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102840. "subs %[d1], %[d1], r4\n\t"
  102841. #else
  102842. "sub %[d1], %[d1], r4\n\t"
  102843. #endif
  102844. "movs r4, %[d1]\n\t"
  102845. "mov %[d1], r9\n\t"
  102846. #ifdef WOLFSSL_KEIL
  102847. "sbcs %[d1], %[d1], r5\n\t"
  102848. #elif defined(__clang__)
  102849. "sbcs %[d1], r5\n\t"
  102850. #else
  102851. "sbc %[d1], r5\n\t"
  102852. #endif
  102853. "movs r5, %[d1]\n\t"
  102854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102855. "adds r3, r3, r5\n\t"
  102856. #else
  102857. "add r3, r3, r5\n\t"
  102858. #endif
  102859. "# r * div - Start\n\t"
  102860. "uxth %[d1], r3\n\t"
  102861. "uxth r4, %[div]\n\t"
  102862. #ifdef WOLFSSL_KEIL
  102863. "muls r4, %[d1], r4\n\t"
  102864. #elif defined(__clang__)
  102865. "muls r4, %[d1]\n\t"
  102866. #else
  102867. "mul r4, %[d1]\n\t"
  102868. #endif
  102869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102870. "lsrs r6, %[div], #16\n\t"
  102871. #else
  102872. "lsr r6, %[div], #16\n\t"
  102873. #endif
  102874. #ifdef WOLFSSL_KEIL
  102875. "muls %[d1], r6, %[d1]\n\t"
  102876. #elif defined(__clang__)
  102877. "muls %[d1], r6\n\t"
  102878. #else
  102879. "mul %[d1], r6\n\t"
  102880. #endif
  102881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102882. "lsrs r5, %[d1], #16\n\t"
  102883. #else
  102884. "lsr r5, %[d1], #16\n\t"
  102885. #endif
  102886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102887. "lsls %[d1], %[d1], #16\n\t"
  102888. #else
  102889. "lsl %[d1], %[d1], #16\n\t"
  102890. #endif
  102891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102892. "adds r4, r4, %[d1]\n\t"
  102893. #else
  102894. "add r4, r4, %[d1]\n\t"
  102895. #endif
  102896. #ifdef WOLFSSL_KEIL
  102897. "adcs r5, r5, r7\n\t"
  102898. #elif defined(__clang__)
  102899. "adcs r5, r7\n\t"
  102900. #else
  102901. "adc r5, r7\n\t"
  102902. #endif
  102903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102904. "lsrs %[d1], r3, #16\n\t"
  102905. #else
  102906. "lsr %[d1], r3, #16\n\t"
  102907. #endif
  102908. #ifdef WOLFSSL_KEIL
  102909. "muls r6, %[d1], r6\n\t"
  102910. #elif defined(__clang__)
  102911. "muls r6, %[d1]\n\t"
  102912. #else
  102913. "mul r6, %[d1]\n\t"
  102914. #endif
  102915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102916. "adds r5, r5, r6\n\t"
  102917. #else
  102918. "add r5, r5, r6\n\t"
  102919. #endif
  102920. "uxth r6, %[div]\n\t"
  102921. #ifdef WOLFSSL_KEIL
  102922. "muls %[d1], r6, %[d1]\n\t"
  102923. #elif defined(__clang__)
  102924. "muls %[d1], r6\n\t"
  102925. #else
  102926. "mul %[d1], r6\n\t"
  102927. #endif
  102928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102929. "lsrs r6, %[d1], #16\n\t"
  102930. #else
  102931. "lsr r6, %[d1], #16\n\t"
  102932. #endif
  102933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102934. "lsls %[d1], %[d1], #16\n\t"
  102935. #else
  102936. "lsl %[d1], %[d1], #16\n\t"
  102937. #endif
  102938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102939. "adds r4, r4, %[d1]\n\t"
  102940. #else
  102941. "add r4, r4, %[d1]\n\t"
  102942. #endif
  102943. #ifdef WOLFSSL_KEIL
  102944. "adcs r5, r5, r6\n\t"
  102945. #elif defined(__clang__)
  102946. "adcs r5, r6\n\t"
  102947. #else
  102948. "adc r5, r6\n\t"
  102949. #endif
  102950. "# r * div - Done\n\t"
  102951. "mov %[d1], r8\n\t"
  102952. "mov r6, r9\n\t"
  102953. #ifdef WOLFSSL_KEIL
  102954. "subs r4, %[d1], r4\n\t"
  102955. #else
  102956. #ifdef __clang__
  102957. "subs r4, %[d1], r4\n\t"
  102958. #else
  102959. "sub r4, %[d1], r4\n\t"
  102960. #endif
  102961. #endif
  102962. #ifdef WOLFSSL_KEIL
  102963. "sbcs r6, r6, r5\n\t"
  102964. #elif defined(__clang__)
  102965. "sbcs r6, r5\n\t"
  102966. #else
  102967. "sbc r6, r5\n\t"
  102968. #endif
  102969. "movs r5, r6\n\t"
  102970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102971. "adds r3, r3, r5\n\t"
  102972. #else
  102973. "add r3, r3, r5\n\t"
  102974. #endif
  102975. "# r * div - Start\n\t"
  102976. "uxth %[d1], r3\n\t"
  102977. "uxth r4, %[div]\n\t"
  102978. #ifdef WOLFSSL_KEIL
  102979. "muls r4, %[d1], r4\n\t"
  102980. #elif defined(__clang__)
  102981. "muls r4, %[d1]\n\t"
  102982. #else
  102983. "mul r4, %[d1]\n\t"
  102984. #endif
  102985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102986. "lsrs r6, %[div], #16\n\t"
  102987. #else
  102988. "lsr r6, %[div], #16\n\t"
  102989. #endif
  102990. #ifdef WOLFSSL_KEIL
  102991. "muls %[d1], r6, %[d1]\n\t"
  102992. #elif defined(__clang__)
  102993. "muls %[d1], r6\n\t"
  102994. #else
  102995. "mul %[d1], r6\n\t"
  102996. #endif
  102997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102998. "lsrs r5, %[d1], #16\n\t"
  102999. #else
  103000. "lsr r5, %[d1], #16\n\t"
  103001. #endif
  103002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103003. "lsls %[d1], %[d1], #16\n\t"
  103004. #else
  103005. "lsl %[d1], %[d1], #16\n\t"
  103006. #endif
  103007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103008. "adds r4, r4, %[d1]\n\t"
  103009. #else
  103010. "add r4, r4, %[d1]\n\t"
  103011. #endif
  103012. #ifdef WOLFSSL_KEIL
  103013. "adcs r5, r5, r7\n\t"
  103014. #elif defined(__clang__)
  103015. "adcs r5, r7\n\t"
  103016. #else
  103017. "adc r5, r7\n\t"
  103018. #endif
  103019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103020. "lsrs %[d1], r3, #16\n\t"
  103021. #else
  103022. "lsr %[d1], r3, #16\n\t"
  103023. #endif
  103024. #ifdef WOLFSSL_KEIL
  103025. "muls r6, %[d1], r6\n\t"
  103026. #elif defined(__clang__)
  103027. "muls r6, %[d1]\n\t"
  103028. #else
  103029. "mul r6, %[d1]\n\t"
  103030. #endif
  103031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103032. "adds r5, r5, r6\n\t"
  103033. #else
  103034. "add r5, r5, r6\n\t"
  103035. #endif
  103036. "uxth r6, %[div]\n\t"
  103037. #ifdef WOLFSSL_KEIL
  103038. "muls %[d1], r6, %[d1]\n\t"
  103039. #elif defined(__clang__)
  103040. "muls %[d1], r6\n\t"
  103041. #else
  103042. "mul %[d1], r6\n\t"
  103043. #endif
  103044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103045. "lsrs r6, %[d1], #16\n\t"
  103046. #else
  103047. "lsr r6, %[d1], #16\n\t"
  103048. #endif
  103049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103050. "lsls %[d1], %[d1], #16\n\t"
  103051. #else
  103052. "lsl %[d1], %[d1], #16\n\t"
  103053. #endif
  103054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103055. "adds r4, r4, %[d1]\n\t"
  103056. #else
  103057. "add r4, r4, %[d1]\n\t"
  103058. #endif
  103059. #ifdef WOLFSSL_KEIL
  103060. "adcs r5, r5, r6\n\t"
  103061. #elif defined(__clang__)
  103062. "adcs r5, r6\n\t"
  103063. #else
  103064. "adc r5, r6\n\t"
  103065. #endif
  103066. "# r * div - Done\n\t"
  103067. "mov %[d1], r8\n\t"
  103068. "mov r6, r9\n\t"
  103069. #ifdef WOLFSSL_KEIL
  103070. "subs r4, %[d1], r4\n\t"
  103071. #else
  103072. #ifdef __clang__
  103073. "subs r4, %[d1], r4\n\t"
  103074. #else
  103075. "sub r4, %[d1], r4\n\t"
  103076. #endif
  103077. #endif
  103078. #ifdef WOLFSSL_KEIL
  103079. "sbcs r6, r6, r5\n\t"
  103080. #elif defined(__clang__)
  103081. "sbcs r6, r5\n\t"
  103082. #else
  103083. "sbc r6, r5\n\t"
  103084. #endif
  103085. "movs r5, r6\n\t"
  103086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103087. "adds r3, r3, r5\n\t"
  103088. #else
  103089. "add r3, r3, r5\n\t"
  103090. #endif
  103091. "movs r6, %[div]\n\t"
  103092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103093. "subs r6, r6, r4\n\t"
  103094. #else
  103095. "sub r6, r6, r4\n\t"
  103096. #endif
  103097. #ifdef WOLFSSL_KEIL
  103098. "sbcs r6, r6, r6\n\t"
  103099. #elif defined(__clang__)
  103100. "sbcs r6, r6\n\t"
  103101. #else
  103102. "sbc r6, r6\n\t"
  103103. #endif
  103104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103105. "subs r3, r3, r6\n\t"
  103106. #else
  103107. "sub r3, r3, r6\n\t"
  103108. #endif
  103109. "movs %[d1], r3\n\t"
  103110. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  103111. :
  103112. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  103113. );
  103114. return (uint32_t)(size_t)d1;
  103115. }
  103116. /* AND m into each word of a and store in r.
  103117. *
  103118. * r A single precision integer.
  103119. * a A single precision integer.
  103120. * m Mask to AND against each digit.
  103121. */
  103122. static void sp_256_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  103123. {
  103124. #ifdef WOLFSSL_SP_SMALL
  103125. int i;
  103126. for (i=0; i<8; i++) {
  103127. r[i] = a[i] & m;
  103128. }
  103129. #else
  103130. r[0] = a[0] & m;
  103131. r[1] = a[1] & m;
  103132. r[2] = a[2] & m;
  103133. r[3] = a[3] & m;
  103134. r[4] = a[4] & m;
  103135. r[5] = a[5] & m;
  103136. r[6] = a[6] & m;
  103137. r[7] = a[7] & m;
  103138. #endif
  103139. }
  103140. /* Divide d in a and put remainder into r (m*d + r = a)
  103141. * m is not calculated as it is not needed at this time.
  103142. *
  103143. * a Number to be divided.
  103144. * d Number to divide with.
  103145. * m Multiplier result.
  103146. * r Remainder from the division.
  103147. * returns MP_OKAY indicating success.
  103148. */
  103149. static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d, sp_digit* m,
  103150. sp_digit* r)
  103151. {
  103152. sp_digit t1[16], t2[9];
  103153. sp_digit div, r1;
  103154. int i;
  103155. (void)m;
  103156. div = d[7];
  103157. XMEMCPY(t1, a, sizeof(*t1) * 2 * 8);
  103158. for (i=7; i>=0; i--) {
  103159. sp_digit hi = t1[8 + i] - (t1[8 + i] == div);
  103160. r1 = div_256_word_8(hi, t1[8 + i - 1], div);
  103161. sp_256_mul_d_8(t2, d, r1);
  103162. t1[8 + i] += sp_256_sub_in_place_8(&t1[i], t2);
  103163. t1[8 + i] -= t2[8];
  103164. sp_256_mask_8(t2, d, t1[8 + i]);
  103165. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  103166. sp_256_mask_8(t2, d, t1[8 + i]);
  103167. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  103168. }
  103169. r1 = sp_256_cmp_8(t1, d) >= 0;
  103170. sp_256_cond_sub_8(r, t1, d, (sp_digit)0 - r1);
  103171. return MP_OKAY;
  103172. }
  103173. /* Reduce a modulo m into r. (r = a mod m)
  103174. *
  103175. * r A single precision number that is the reduced result.
  103176. * a A single precision number that is to be reduced.
  103177. * m A single precision number that is the modulus to reduce with.
  103178. * returns MP_OKAY indicating success.
  103179. */
  103180. static WC_INLINE int sp_256_mod_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  103181. {
  103182. return sp_256_div_8(a, m, NULL, r);
  103183. }
  103184. #endif
  103185. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  103186. #ifdef WOLFSSL_SP_SMALL
  103187. /* Order-2 for the P256 curve. */
  103188. static const uint32_t p256_order_minus_2[8] = {
  103189. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU,0xffffffffU,0xffffffffU,
  103190. 0x00000000U,0xffffffffU
  103191. };
  103192. #else
  103193. /* The low half of the order-2 of the P256 curve. */
  103194. static const sp_int_digit p256_order_low[4] = {
  103195. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU
  103196. };
  103197. #endif /* WOLFSSL_SP_SMALL */
  103198. /* Multiply two number mod the order of P256 curve. (r = a * b mod order)
  103199. *
  103200. * r Result of the multiplication.
  103201. * a First operand of the multiplication.
  103202. * b Second operand of the multiplication.
  103203. */
  103204. static void sp_256_mont_mul_order_8(sp_digit* r, const sp_digit* a, const sp_digit* b)
  103205. {
  103206. sp_256_mul_8(r, a, b);
  103207. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  103208. }
  103209. /* Square number mod the order of P256 curve. (r = a * a mod order)
  103210. *
  103211. * r Result of the squaring.
  103212. * a Number to square.
  103213. */
  103214. static void sp_256_mont_sqr_order_8(sp_digit* r, const sp_digit* a)
  103215. {
  103216. sp_256_sqr_8(r, a);
  103217. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  103218. }
  103219. #ifndef WOLFSSL_SP_SMALL
  103220. /* Square number mod the order of P256 curve a number of times.
  103221. * (r = a ^ n mod order)
  103222. *
  103223. * r Result of the squaring.
  103224. * a Number to square.
  103225. */
  103226. static void sp_256_mont_sqr_n_order_8(sp_digit* r, const sp_digit* a, int n)
  103227. {
  103228. int i;
  103229. sp_256_mont_sqr_order_8(r, a);
  103230. for (i=1; i<n; i++) {
  103231. sp_256_mont_sqr_order_8(r, r);
  103232. }
  103233. }
  103234. #endif /* !WOLFSSL_SP_SMALL */
  103235. /* Invert the number, in Montgomery form, modulo the order of the P256 curve.
  103236. * (r = 1 / a mod order)
  103237. *
  103238. * r Inverse result.
  103239. * a Number to invert.
  103240. * td Temporary data.
  103241. */
  103242. #ifdef WOLFSSL_SP_NONBLOCK
  103243. typedef struct sp_256_mont_inv_order_8_ctx {
  103244. int state;
  103245. int i;
  103246. } sp_256_mont_inv_order_8_ctx;
  103247. static int sp_256_mont_inv_order_8_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  103248. sp_digit* t)
  103249. {
  103250. int err = FP_WOULDBLOCK;
  103251. sp_256_mont_inv_order_8_ctx* ctx = (sp_256_mont_inv_order_8_ctx*)sp_ctx;
  103252. typedef char ctx_size_test[sizeof(sp_256_mont_inv_order_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  103253. (void)sizeof(ctx_size_test);
  103254. switch (ctx->state) {
  103255. case 0:
  103256. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  103257. ctx->i = 254;
  103258. ctx->state = 1;
  103259. break;
  103260. case 1:
  103261. sp_256_mont_sqr_order_8(t, t);
  103262. ctx->state = 2;
  103263. break;
  103264. case 2:
  103265. if ((p256_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  103266. sp_256_mont_mul_order_8(t, t, a);
  103267. }
  103268. ctx->i--;
  103269. ctx->state = (ctx->i == 0) ? 3 : 1;
  103270. break;
  103271. case 3:
  103272. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  103273. err = MP_OKAY;
  103274. break;
  103275. }
  103276. return err;
  103277. }
  103278. #endif /* WOLFSSL_SP_NONBLOCK */
  103279. static void sp_256_mont_inv_order_8(sp_digit* r, const sp_digit* a,
  103280. sp_digit* td)
  103281. {
  103282. #ifdef WOLFSSL_SP_SMALL
  103283. sp_digit* t = td;
  103284. int i;
  103285. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  103286. for (i=254; i>=0; i--) {
  103287. sp_256_mont_sqr_order_8(t, t);
  103288. if ((p256_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  103289. sp_256_mont_mul_order_8(t, t, a);
  103290. }
  103291. }
  103292. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  103293. #else
  103294. sp_digit* t = td;
  103295. sp_digit* t2 = td + 2 * 8;
  103296. sp_digit* t3 = td + 4 * 8;
  103297. int i;
  103298. /* t = a^2 */
  103299. sp_256_mont_sqr_order_8(t, a);
  103300. /* t = a^3 = t * a */
  103301. sp_256_mont_mul_order_8(t, t, a);
  103302. /* t2= a^c = t ^ 2 ^ 2 */
  103303. sp_256_mont_sqr_n_order_8(t2, t, 2);
  103304. /* t3= a^f = t2 * t */
  103305. sp_256_mont_mul_order_8(t3, t2, t);
  103306. /* t2= a^f0 = t3 ^ 2 ^ 4 */
  103307. sp_256_mont_sqr_n_order_8(t2, t3, 4);
  103308. /* t = a^ff = t2 * t3 */
  103309. sp_256_mont_mul_order_8(t, t2, t3);
  103310. /* t3= a^ff00 = t ^ 2 ^ 8 */
  103311. sp_256_mont_sqr_n_order_8(t2, t, 8);
  103312. /* t = a^ffff = t2 * t */
  103313. sp_256_mont_mul_order_8(t, t2, t);
  103314. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  103315. sp_256_mont_sqr_n_order_8(t2, t, 16);
  103316. /* t = a^ffffffff = t2 * t */
  103317. sp_256_mont_mul_order_8(t, t2, t);
  103318. /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64 */
  103319. sp_256_mont_sqr_n_order_8(t2, t, 64);
  103320. /* t2= a^ffffffff00000000ffffffff = t2 * t */
  103321. sp_256_mont_mul_order_8(t2, t2, t);
  103322. /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32 */
  103323. sp_256_mont_sqr_n_order_8(t2, t2, 32);
  103324. /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */
  103325. sp_256_mont_mul_order_8(t2, t2, t);
  103326. /* t2= a^ffffffff00000000ffffffffffffffffbce6 */
  103327. for (i=127; i>=112; i--) {
  103328. sp_256_mont_sqr_order_8(t2, t2);
  103329. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  103330. sp_256_mont_mul_order_8(t2, t2, a);
  103331. }
  103332. }
  103333. /* t2= a^ffffffff00000000ffffffffffffffffbce6f */
  103334. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  103335. sp_256_mont_mul_order_8(t2, t2, t3);
  103336. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */
  103337. for (i=107; i>=64; i--) {
  103338. sp_256_mont_sqr_order_8(t2, t2);
  103339. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  103340. sp_256_mont_mul_order_8(t2, t2, a);
  103341. }
  103342. }
  103343. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */
  103344. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  103345. sp_256_mont_mul_order_8(t2, t2, t3);
  103346. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */
  103347. for (i=59; i>=32; i--) {
  103348. sp_256_mont_sqr_order_8(t2, t2);
  103349. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  103350. sp_256_mont_mul_order_8(t2, t2, a);
  103351. }
  103352. }
  103353. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */
  103354. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  103355. sp_256_mont_mul_order_8(t2, t2, t3);
  103356. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */
  103357. for (i=27; i>=0; i--) {
  103358. sp_256_mont_sqr_order_8(t2, t2);
  103359. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  103360. sp_256_mont_mul_order_8(t2, t2, a);
  103361. }
  103362. }
  103363. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */
  103364. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  103365. /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */
  103366. sp_256_mont_mul_order_8(r, t2, t3);
  103367. #endif /* WOLFSSL_SP_SMALL */
  103368. }
  103369. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  103370. #ifdef HAVE_ECC_SIGN
  103371. #ifndef SP_ECC_MAX_SIG_GEN
  103372. #define SP_ECC_MAX_SIG_GEN 64
  103373. #endif
  103374. /* Calculate second signature value S from R, k and private value.
  103375. *
  103376. * s = (r * x + e) / k
  103377. *
  103378. * s Signature value.
  103379. * r First signature value.
  103380. * k Ephemeral private key.
  103381. * x Private key as a number.
  103382. * e Hash of message as a number.
  103383. * tmp Temporary storage for intermediate numbers.
  103384. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  103385. */
  103386. static int sp_256_calc_s_8(sp_digit* s, const sp_digit* r, sp_digit* k,
  103387. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  103388. {
  103389. int err;
  103390. sp_digit carry;
  103391. sp_int32 c;
  103392. sp_digit* kInv = k;
  103393. /* Conv k to Montgomery form (mod order) */
  103394. sp_256_mul_8(k, k, p256_norm_order);
  103395. err = sp_256_mod_8(k, k, p256_order);
  103396. if (err == MP_OKAY) {
  103397. sp_256_norm_8(k);
  103398. /* kInv = 1/k mod order */
  103399. sp_256_mont_inv_order_8(kInv, k, tmp);
  103400. sp_256_norm_8(kInv);
  103401. /* s = r * x + e */
  103402. sp_256_mul_8(x, x, r);
  103403. err = sp_256_mod_8(x, x, p256_order);
  103404. }
  103405. if (err == MP_OKAY) {
  103406. sp_256_norm_8(x);
  103407. carry = sp_256_add_8(s, e, x);
  103408. sp_256_cond_sub_8(s, s, p256_order, 0 - carry);
  103409. sp_256_norm_8(s);
  103410. c = sp_256_cmp_8(s, p256_order);
  103411. sp_256_cond_sub_8(s, s, p256_order,
  103412. (sp_digit)0 - (sp_digit)(c >= 0));
  103413. sp_256_norm_8(s);
  103414. /* s = s * k^-1 mod order */
  103415. sp_256_mont_mul_order_8(s, s, kInv);
  103416. sp_256_norm_8(s);
  103417. }
  103418. return err;
  103419. }
  103420. /* Sign the hash using the private key.
  103421. * e = [hash, 256 bits] from binary
  103422. * r = (k.G)->x mod order
  103423. * s = (r * x + e) / k mod order
  103424. * The hash is truncated to the first 256 bits.
  103425. *
  103426. * hash Hash to sign.
  103427. * hashLen Length of the hash data.
  103428. * rng Random number generator.
  103429. * priv Private part of key - scalar.
  103430. * rm First part of result as an mp_int.
  103431. * sm Sirst part of result as an mp_int.
  103432. * heap Heap to use for allocation.
  103433. * returns RNG failures, MEMORY_E when memory allocation fails and
  103434. * MP_OKAY on success.
  103435. */
  103436. #ifdef WOLFSSL_SP_NONBLOCK
  103437. typedef struct sp_ecc_sign_256_ctx {
  103438. int state;
  103439. union {
  103440. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  103441. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  103442. };
  103443. sp_digit e[2*8];
  103444. sp_digit x[2*8];
  103445. sp_digit k[2*8];
  103446. sp_digit r[2*8];
  103447. sp_digit tmp[3 * 2*8];
  103448. sp_point_256 point;
  103449. sp_digit* s;
  103450. sp_digit* kInv;
  103451. int i;
  103452. } sp_ecc_sign_256_ctx;
  103453. int sp_ecc_sign_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  103454. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  103455. {
  103456. int err = FP_WOULDBLOCK;
  103457. sp_ecc_sign_256_ctx* ctx = (sp_ecc_sign_256_ctx*)sp_ctx->data;
  103458. typedef char ctx_size_test[sizeof(sp_ecc_sign_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  103459. (void)sizeof(ctx_size_test);
  103460. (void)heap;
  103461. switch (ctx->state) {
  103462. case 0: /* INIT */
  103463. ctx->s = ctx->e;
  103464. ctx->kInv = ctx->k;
  103465. if (hashLen > 32U) {
  103466. hashLen = 32U;
  103467. }
  103468. ctx->i = SP_ECC_MAX_SIG_GEN;
  103469. ctx->state = 1;
  103470. break;
  103471. case 1: /* GEN */
  103472. /* New random point. */
  103473. if (km == NULL || mp_iszero(km)) {
  103474. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  103475. }
  103476. else {
  103477. sp_256_from_mp(ctx->k, 8, km);
  103478. mp_zero(km);
  103479. }
  103480. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  103481. ctx->state = 2;
  103482. break;
  103483. case 2: /* MULMOD */
  103484. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  103485. &ctx->point, &p256_base, ctx->k, 1, 1, heap);
  103486. if (err == MP_OKAY) {
  103487. ctx->state = 3;
  103488. }
  103489. break;
  103490. case 3: /* MODORDER */
  103491. {
  103492. sp_int32 c;
  103493. /* r = point->x mod order */
  103494. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 8U);
  103495. sp_256_norm_8(ctx->r);
  103496. c = sp_256_cmp_8(ctx->r, p256_order);
  103497. sp_256_cond_sub_8(ctx->r, ctx->r, p256_order,
  103498. (sp_digit)0 - (sp_digit)(c >= 0));
  103499. sp_256_norm_8(ctx->r);
  103500. sp_256_from_mp(ctx->x, 8, priv);
  103501. sp_256_from_bin(ctx->e, 8, hash, (int)hashLen);
  103502. ctx->state = 4;
  103503. break;
  103504. }
  103505. case 4: /* KMODORDER */
  103506. /* Conv k to Montgomery form (mod order) */
  103507. sp_256_mul_8(ctx->k, ctx->k, p256_norm_order);
  103508. err = sp_256_mod_8(ctx->k, ctx->k, p256_order);
  103509. if (err == MP_OKAY) {
  103510. sp_256_norm_8(ctx->k);
  103511. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  103512. ctx->state = 5;
  103513. }
  103514. break;
  103515. case 5: /* KINV */
  103516. /* kInv = 1/k mod order */
  103517. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  103518. if (err == MP_OKAY) {
  103519. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  103520. ctx->state = 6;
  103521. }
  103522. break;
  103523. case 6: /* KINVNORM */
  103524. sp_256_norm_8(ctx->kInv);
  103525. ctx->state = 7;
  103526. break;
  103527. case 7: /* R */
  103528. /* s = r * x + e */
  103529. sp_256_mul_8(ctx->x, ctx->x, ctx->r);
  103530. ctx->state = 8;
  103531. break;
  103532. case 8: /* S1 */
  103533. err = sp_256_mod_8(ctx->x, ctx->x, p256_order);
  103534. if (err == MP_OKAY)
  103535. ctx->state = 9;
  103536. break;
  103537. case 9: /* S2 */
  103538. {
  103539. sp_digit carry;
  103540. sp_int32 c;
  103541. sp_256_norm_8(ctx->x);
  103542. carry = sp_256_add_8(ctx->s, ctx->e, ctx->x);
  103543. sp_256_cond_sub_8(ctx->s, ctx->s,
  103544. p256_order, 0 - carry);
  103545. sp_256_norm_8(ctx->s);
  103546. c = sp_256_cmp_8(ctx->s, p256_order);
  103547. sp_256_cond_sub_8(ctx->s, ctx->s, p256_order,
  103548. (sp_digit)0 - (sp_digit)(c >= 0));
  103549. sp_256_norm_8(ctx->s);
  103550. /* s = s * k^-1 mod order */
  103551. sp_256_mont_mul_order_8(ctx->s, ctx->s, ctx->kInv);
  103552. sp_256_norm_8(ctx->s);
  103553. /* Check that signature is usable. */
  103554. if (sp_256_iszero_8(ctx->s) == 0) {
  103555. ctx->state = 10;
  103556. break;
  103557. }
  103558. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  103559. ctx->i = 1;
  103560. #endif
  103561. /* not usable gen, try again */
  103562. ctx->i--;
  103563. if (ctx->i == 0) {
  103564. err = RNG_FAILURE_E;
  103565. }
  103566. ctx->state = 1;
  103567. break;
  103568. }
  103569. case 10: /* RES */
  103570. err = sp_256_to_mp(ctx->r, rm);
  103571. if (err == MP_OKAY) {
  103572. err = sp_256_to_mp(ctx->s, sm);
  103573. }
  103574. break;
  103575. }
  103576. if (err == MP_OKAY && ctx->state != 10) {
  103577. err = FP_WOULDBLOCK;
  103578. }
  103579. if (err != FP_WOULDBLOCK) {
  103580. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 8U);
  103581. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 8U);
  103582. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 8U);
  103583. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 8U);
  103584. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 8U);
  103585. }
  103586. return err;
  103587. }
  103588. #endif /* WOLFSSL_SP_NONBLOCK */
  103589. int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng,
  103590. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  103591. {
  103592. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103593. sp_digit* e = NULL;
  103594. sp_point_256* point = NULL;
  103595. #else
  103596. sp_digit e[7 * 2 * 8];
  103597. sp_point_256 point[1];
  103598. #endif
  103599. sp_digit* x = NULL;
  103600. sp_digit* k = NULL;
  103601. sp_digit* r = NULL;
  103602. sp_digit* tmp = NULL;
  103603. sp_digit* s = NULL;
  103604. sp_int32 c;
  103605. int err = MP_OKAY;
  103606. int i;
  103607. (void)heap;
  103608. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103609. if (err == MP_OKAY) {
  103610. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  103611. DYNAMIC_TYPE_ECC);
  103612. if (point == NULL)
  103613. err = MEMORY_E;
  103614. }
  103615. if (err == MP_OKAY) {
  103616. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 8, heap,
  103617. DYNAMIC_TYPE_ECC);
  103618. if (e == NULL)
  103619. err = MEMORY_E;
  103620. }
  103621. #endif
  103622. if (err == MP_OKAY) {
  103623. x = e + 2 * 8;
  103624. k = e + 4 * 8;
  103625. r = e + 6 * 8;
  103626. tmp = e + 8 * 8;
  103627. s = e;
  103628. if (hashLen > 32U) {
  103629. hashLen = 32U;
  103630. }
  103631. }
  103632. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  103633. /* New random point. */
  103634. if (km == NULL || mp_iszero(km)) {
  103635. err = sp_256_ecc_gen_k_8(rng, k);
  103636. }
  103637. else {
  103638. sp_256_from_mp(k, 8, km);
  103639. mp_zero(km);
  103640. }
  103641. if (err == MP_OKAY) {
  103642. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, heap);
  103643. }
  103644. if (err == MP_OKAY) {
  103645. /* r = point->x mod order */
  103646. XMEMCPY(r, point->x, sizeof(sp_digit) * 8U);
  103647. sp_256_norm_8(r);
  103648. c = sp_256_cmp_8(r, p256_order);
  103649. sp_256_cond_sub_8(r, r, p256_order,
  103650. (sp_digit)0 - (sp_digit)(c >= 0));
  103651. sp_256_norm_8(r);
  103652. sp_256_from_mp(x, 8, priv);
  103653. sp_256_from_bin(e, 8, hash, (int)hashLen);
  103654. err = sp_256_calc_s_8(s, r, k, x, e, tmp);
  103655. }
  103656. /* Check that signature is usable. */
  103657. if ((err == MP_OKAY) && (sp_256_iszero_8(s) == 0)) {
  103658. break;
  103659. }
  103660. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  103661. i = 1;
  103662. #endif
  103663. }
  103664. if (i == 0) {
  103665. err = RNG_FAILURE_E;
  103666. }
  103667. if (err == MP_OKAY) {
  103668. err = sp_256_to_mp(r, rm);
  103669. }
  103670. if (err == MP_OKAY) {
  103671. err = sp_256_to_mp(s, sm);
  103672. }
  103673. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103674. if (e != NULL)
  103675. #endif
  103676. {
  103677. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 8);
  103678. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103679. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  103680. #endif
  103681. }
  103682. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103683. if (point != NULL)
  103684. #endif
  103685. {
  103686. ForceZero(point, sizeof(sp_point_256));
  103687. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103688. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  103689. #endif
  103690. }
  103691. return err;
  103692. }
  103693. #endif /* HAVE_ECC_SIGN */
  103694. #ifndef WOLFSSL_SP_SMALL
  103695. /* Right shift a by 1 bit into r. (r = a >> 1)
  103696. *
  103697. * r A single precision integer.
  103698. * a A single precision integer.
  103699. */
  103700. static void sp_256_rshift1_8(sp_digit* r, const sp_digit* a)
  103701. {
  103702. __asm__ __volatile__ (
  103703. "ldr r2, [%[a]]\n\t"
  103704. "ldr r3, [%[a], #4]\n\t"
  103705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103706. "lsrs r2, r2, #1\n\t"
  103707. #else
  103708. "lsr r2, r2, #1\n\t"
  103709. #endif
  103710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103711. "lsls r5, r3, #31\n\t"
  103712. #else
  103713. "lsl r5, r3, #31\n\t"
  103714. #endif
  103715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103716. "lsrs r3, r3, #1\n\t"
  103717. #else
  103718. "lsr r3, r3, #1\n\t"
  103719. #endif
  103720. #ifdef WOLFSSL_KEIL
  103721. "orrs r2, r2, r5\n\t"
  103722. #elif defined(__clang__)
  103723. "orrs r2, r5\n\t"
  103724. #else
  103725. "orr r2, r5\n\t"
  103726. #endif
  103727. "ldr r4, [%[a], #8]\n\t"
  103728. "str r2, [%[r]]\n\t"
  103729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103730. "lsls r5, r4, #31\n\t"
  103731. #else
  103732. "lsl r5, r4, #31\n\t"
  103733. #endif
  103734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103735. "lsrs r4, r4, #1\n\t"
  103736. #else
  103737. "lsr r4, r4, #1\n\t"
  103738. #endif
  103739. #ifdef WOLFSSL_KEIL
  103740. "orrs r3, r3, r5\n\t"
  103741. #elif defined(__clang__)
  103742. "orrs r3, r5\n\t"
  103743. #else
  103744. "orr r3, r5\n\t"
  103745. #endif
  103746. "ldr r2, [%[a], #12]\n\t"
  103747. "str r3, [%[r], #4]\n\t"
  103748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103749. "lsls r5, r2, #31\n\t"
  103750. #else
  103751. "lsl r5, r2, #31\n\t"
  103752. #endif
  103753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103754. "lsrs r2, r2, #1\n\t"
  103755. #else
  103756. "lsr r2, r2, #1\n\t"
  103757. #endif
  103758. #ifdef WOLFSSL_KEIL
  103759. "orrs r4, r4, r5\n\t"
  103760. #elif defined(__clang__)
  103761. "orrs r4, r5\n\t"
  103762. #else
  103763. "orr r4, r5\n\t"
  103764. #endif
  103765. "ldr r3, [%[a], #16]\n\t"
  103766. "str r4, [%[r], #8]\n\t"
  103767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103768. "lsls r5, r3, #31\n\t"
  103769. #else
  103770. "lsl r5, r3, #31\n\t"
  103771. #endif
  103772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103773. "lsrs r3, r3, #1\n\t"
  103774. #else
  103775. "lsr r3, r3, #1\n\t"
  103776. #endif
  103777. #ifdef WOLFSSL_KEIL
  103778. "orrs r2, r2, r5\n\t"
  103779. #elif defined(__clang__)
  103780. "orrs r2, r5\n\t"
  103781. #else
  103782. "orr r2, r5\n\t"
  103783. #endif
  103784. "ldr r4, [%[a], #20]\n\t"
  103785. "str r2, [%[r], #12]\n\t"
  103786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103787. "lsls r5, r4, #31\n\t"
  103788. #else
  103789. "lsl r5, r4, #31\n\t"
  103790. #endif
  103791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103792. "lsrs r4, r4, #1\n\t"
  103793. #else
  103794. "lsr r4, r4, #1\n\t"
  103795. #endif
  103796. #ifdef WOLFSSL_KEIL
  103797. "orrs r3, r3, r5\n\t"
  103798. #elif defined(__clang__)
  103799. "orrs r3, r5\n\t"
  103800. #else
  103801. "orr r3, r5\n\t"
  103802. #endif
  103803. "ldr r2, [%[a], #24]\n\t"
  103804. "str r3, [%[r], #16]\n\t"
  103805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103806. "lsls r5, r2, #31\n\t"
  103807. #else
  103808. "lsl r5, r2, #31\n\t"
  103809. #endif
  103810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103811. "lsrs r2, r2, #1\n\t"
  103812. #else
  103813. "lsr r2, r2, #1\n\t"
  103814. #endif
  103815. #ifdef WOLFSSL_KEIL
  103816. "orrs r4, r4, r5\n\t"
  103817. #elif defined(__clang__)
  103818. "orrs r4, r5\n\t"
  103819. #else
  103820. "orr r4, r5\n\t"
  103821. #endif
  103822. "ldr r3, [%[a], #28]\n\t"
  103823. "str r4, [%[r], #20]\n\t"
  103824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103825. "lsls r5, r3, #31\n\t"
  103826. #else
  103827. "lsl r5, r3, #31\n\t"
  103828. #endif
  103829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103830. "lsrs r3, r3, #1\n\t"
  103831. #else
  103832. "lsr r3, r3, #1\n\t"
  103833. #endif
  103834. #ifdef WOLFSSL_KEIL
  103835. "orrs r2, r2, r5\n\t"
  103836. #elif defined(__clang__)
  103837. "orrs r2, r5\n\t"
  103838. #else
  103839. "orr r2, r5\n\t"
  103840. #endif
  103841. "str r2, [%[r], #24]\n\t"
  103842. "str r3, [%[r], #28]\n\t"
  103843. : [r] "+r" (r), [a] "+r" (a)
  103844. :
  103845. : "memory", "r2", "r3", "r4", "r5"
  103846. );
  103847. }
  103848. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  103849. *
  103850. * r Result of division by 2.
  103851. * a Number to divide.
  103852. * m Modulus.
  103853. */
  103854. static void sp_256_div2_mod_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  103855. {
  103856. __asm__ __volatile__ (
  103857. "ldr r7, [%[a]]\n\t"
  103858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103859. "lsls r7, r7, #31\n\t"
  103860. #else
  103861. "lsl r7, r7, #31\n\t"
  103862. #endif
  103863. "beq L_sp_256_div2_mod_8_no_add_%=\n\t"
  103864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103865. "lsrs r7, r7, #31\n\t"
  103866. #else
  103867. "lsr r7, r7, #31\n\t"
  103868. #endif
  103869. "ldr r5, [%[m]]\n\t"
  103870. "ldr r6, [%[m], #4]\n\t"
  103871. "ldr r3, [%[a]]\n\t"
  103872. "ldr r4, [%[a], #4]\n\t"
  103873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103874. "adds r3, r3, r5\n\t"
  103875. #else
  103876. "add r3, r3, r5\n\t"
  103877. #endif
  103878. #ifdef WOLFSSL_KEIL
  103879. "adcs r4, r4, r6\n\t"
  103880. #elif defined(__clang__)
  103881. "adcs r4, r6\n\t"
  103882. #else
  103883. "adc r4, r6\n\t"
  103884. #endif
  103885. "str r3, [%[r]]\n\t"
  103886. "str r4, [%[r], #4]\n\t"
  103887. "ldr r5, [%[m], #8]\n\t"
  103888. "ldr r6, [%[m], #12]\n\t"
  103889. "ldr r3, [%[a], #8]\n\t"
  103890. "ldr r4, [%[a], #12]\n\t"
  103891. #ifdef WOLFSSL_KEIL
  103892. "adcs r3, r3, r5\n\t"
  103893. #elif defined(__clang__)
  103894. "adcs r3, r5\n\t"
  103895. #else
  103896. "adc r3, r5\n\t"
  103897. #endif
  103898. #ifdef WOLFSSL_KEIL
  103899. "adcs r4, r4, r6\n\t"
  103900. #elif defined(__clang__)
  103901. "adcs r4, r6\n\t"
  103902. #else
  103903. "adc r4, r6\n\t"
  103904. #endif
  103905. "str r3, [%[r], #8]\n\t"
  103906. "str r4, [%[r], #12]\n\t"
  103907. "ldr r5, [%[m], #16]\n\t"
  103908. "ldr r6, [%[m], #20]\n\t"
  103909. "ldr r3, [%[a], #16]\n\t"
  103910. "ldr r4, [%[a], #20]\n\t"
  103911. #ifdef WOLFSSL_KEIL
  103912. "adcs r3, r3, r5\n\t"
  103913. #elif defined(__clang__)
  103914. "adcs r3, r5\n\t"
  103915. #else
  103916. "adc r3, r5\n\t"
  103917. #endif
  103918. #ifdef WOLFSSL_KEIL
  103919. "adcs r4, r4, r6\n\t"
  103920. #elif defined(__clang__)
  103921. "adcs r4, r6\n\t"
  103922. #else
  103923. "adc r4, r6\n\t"
  103924. #endif
  103925. "str r3, [%[r], #16]\n\t"
  103926. "str r4, [%[r], #20]\n\t"
  103927. "ldr r5, [%[m], #24]\n\t"
  103928. "ldr r6, [%[m], #28]\n\t"
  103929. "ldr r3, [%[a], #24]\n\t"
  103930. "ldr r4, [%[a], #28]\n\t"
  103931. #ifdef WOLFSSL_KEIL
  103932. "adcs r3, r3, r5\n\t"
  103933. #elif defined(__clang__)
  103934. "adcs r3, r5\n\t"
  103935. #else
  103936. "adc r3, r5\n\t"
  103937. #endif
  103938. #ifdef WOLFSSL_KEIL
  103939. "adcs r4, r4, r6\n\t"
  103940. #elif defined(__clang__)
  103941. "adcs r4, r6\n\t"
  103942. #else
  103943. "adc r4, r6\n\t"
  103944. #endif
  103945. "movs r7, #0\n\t"
  103946. #ifdef WOLFSSL_KEIL
  103947. "adcs r7, r7, r7\n\t"
  103948. #elif defined(__clang__)
  103949. "adcs r7, r7\n\t"
  103950. #else
  103951. "adc r7, r7\n\t"
  103952. #endif
  103953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103954. "lsls r7, r7, #31\n\t"
  103955. #else
  103956. "lsl r7, r7, #31\n\t"
  103957. #endif
  103958. "b L_sp_256_div2_mod_8_div2_%=\n\t"
  103959. "\n"
  103960. "L_sp_256_div2_mod_8_no_add_%=:\n\t"
  103961. "ldr r3, [%[a], #24]\n\t"
  103962. "ldr r4, [%[a], #28]\n\t"
  103963. "\n"
  103964. "L_sp_256_div2_mod_8_div2_%=:\n\t"
  103965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103966. "lsrs r5, r3, #1\n\t"
  103967. #else
  103968. "lsr r5, r3, #1\n\t"
  103969. #endif
  103970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103971. "lsls r3, r3, #31\n\t"
  103972. #else
  103973. "lsl r3, r3, #31\n\t"
  103974. #endif
  103975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103976. "lsrs r6, r4, #1\n\t"
  103977. #else
  103978. "lsr r6, r4, #1\n\t"
  103979. #endif
  103980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103981. "lsls r4, r4, #31\n\t"
  103982. #else
  103983. "lsl r4, r4, #31\n\t"
  103984. #endif
  103985. #ifdef WOLFSSL_KEIL
  103986. "orrs r5, r5, r4\n\t"
  103987. #elif defined(__clang__)
  103988. "orrs r5, r4\n\t"
  103989. #else
  103990. "orr r5, r4\n\t"
  103991. #endif
  103992. #ifdef WOLFSSL_KEIL
  103993. "orrs r6, r6, r7\n\t"
  103994. #elif defined(__clang__)
  103995. "orrs r6, r7\n\t"
  103996. #else
  103997. "orr r6, r7\n\t"
  103998. #endif
  103999. "movs r7, r3\n\t"
  104000. "str r5, [%[r], #24]\n\t"
  104001. "str r6, [%[r], #28]\n\t"
  104002. "ldr r3, [%[a], #16]\n\t"
  104003. "ldr r4, [%[a], #20]\n\t"
  104004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104005. "lsrs r5, r3, #1\n\t"
  104006. #else
  104007. "lsr r5, r3, #1\n\t"
  104008. #endif
  104009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104010. "lsls r3, r3, #31\n\t"
  104011. #else
  104012. "lsl r3, r3, #31\n\t"
  104013. #endif
  104014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104015. "lsrs r6, r4, #1\n\t"
  104016. #else
  104017. "lsr r6, r4, #1\n\t"
  104018. #endif
  104019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104020. "lsls r4, r4, #31\n\t"
  104021. #else
  104022. "lsl r4, r4, #31\n\t"
  104023. #endif
  104024. #ifdef WOLFSSL_KEIL
  104025. "orrs r5, r5, r4\n\t"
  104026. #elif defined(__clang__)
  104027. "orrs r5, r4\n\t"
  104028. #else
  104029. "orr r5, r4\n\t"
  104030. #endif
  104031. #ifdef WOLFSSL_KEIL
  104032. "orrs r6, r6, r7\n\t"
  104033. #elif defined(__clang__)
  104034. "orrs r6, r7\n\t"
  104035. #else
  104036. "orr r6, r7\n\t"
  104037. #endif
  104038. "movs r7, r3\n\t"
  104039. "str r5, [%[r], #16]\n\t"
  104040. "str r6, [%[r], #20]\n\t"
  104041. "ldr r3, [%[a], #8]\n\t"
  104042. "ldr r4, [%[a], #12]\n\t"
  104043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104044. "lsrs r5, r3, #1\n\t"
  104045. #else
  104046. "lsr r5, r3, #1\n\t"
  104047. #endif
  104048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104049. "lsls r3, r3, #31\n\t"
  104050. #else
  104051. "lsl r3, r3, #31\n\t"
  104052. #endif
  104053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104054. "lsrs r6, r4, #1\n\t"
  104055. #else
  104056. "lsr r6, r4, #1\n\t"
  104057. #endif
  104058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104059. "lsls r4, r4, #31\n\t"
  104060. #else
  104061. "lsl r4, r4, #31\n\t"
  104062. #endif
  104063. #ifdef WOLFSSL_KEIL
  104064. "orrs r5, r5, r4\n\t"
  104065. #elif defined(__clang__)
  104066. "orrs r5, r4\n\t"
  104067. #else
  104068. "orr r5, r4\n\t"
  104069. #endif
  104070. #ifdef WOLFSSL_KEIL
  104071. "orrs r6, r6, r7\n\t"
  104072. #elif defined(__clang__)
  104073. "orrs r6, r7\n\t"
  104074. #else
  104075. "orr r6, r7\n\t"
  104076. #endif
  104077. "movs r7, r3\n\t"
  104078. "str r5, [%[r], #8]\n\t"
  104079. "str r6, [%[r], #12]\n\t"
  104080. "ldr r3, [%[r]]\n\t"
  104081. "ldr r4, [%[r], #4]\n\t"
  104082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104083. "lsrs r5, r3, #1\n\t"
  104084. #else
  104085. "lsr r5, r3, #1\n\t"
  104086. #endif
  104087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104088. "lsrs r6, r4, #1\n\t"
  104089. #else
  104090. "lsr r6, r4, #1\n\t"
  104091. #endif
  104092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104093. "lsls r4, r4, #31\n\t"
  104094. #else
  104095. "lsl r4, r4, #31\n\t"
  104096. #endif
  104097. #ifdef WOLFSSL_KEIL
  104098. "orrs r5, r5, r4\n\t"
  104099. #elif defined(__clang__)
  104100. "orrs r5, r4\n\t"
  104101. #else
  104102. "orr r5, r4\n\t"
  104103. #endif
  104104. #ifdef WOLFSSL_KEIL
  104105. "orrs r6, r6, r7\n\t"
  104106. #elif defined(__clang__)
  104107. "orrs r6, r7\n\t"
  104108. #else
  104109. "orr r6, r7\n\t"
  104110. #endif
  104111. "str r5, [%[r]]\n\t"
  104112. "str r6, [%[r], #4]\n\t"
  104113. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  104114. :
  104115. : "memory", "r3", "r4", "r5", "r6", "r7", "r8"
  104116. );
  104117. }
  104118. static int sp_256_num_bits_8(sp_digit* a)
  104119. {
  104120. static const byte sp_num_bits_table[256] = {
  104121. 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  104122. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  104123. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  104124. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  104125. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  104126. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  104127. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  104128. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  104129. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  104130. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  104131. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  104132. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  104133. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  104134. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  104135. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  104136. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  104137. };
  104138. const byte* table = sp_num_bits_table;
  104139. __asm__ __volatile__ (
  104140. "movs r6, #0xff\n\t"
  104141. "ldr r3, [%[a], #28]\n\t"
  104142. "cmp r3, #0\n\t"
  104143. "beq L_sp_256_num_bits_8_7_%=\n\t"
  104144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104145. "lsrs r5, r3, #24\n\t"
  104146. #else
  104147. "lsr r5, r3, #24\n\t"
  104148. #endif
  104149. "cmp r5, #0\n\t"
  104150. "beq L_sp_256_num_bits_8_93_%=\n\t"
  104151. "movs r2, #0xf8\n\t"
  104152. "ldrb r4, [%[table], r5]\n\t"
  104153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104154. "adds r2, r2, r4\n\t"
  104155. #else
  104156. "add r2, r2, r4\n\t"
  104157. #endif
  104158. "b L_sp_256_num_bits_8_9_%=\n\t"
  104159. "\n"
  104160. "L_sp_256_num_bits_8_93_%=:\n\t"
  104161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104162. "lsrs r5, r3, #16\n\t"
  104163. #else
  104164. "lsr r5, r3, #16\n\t"
  104165. #endif
  104166. #ifdef WOLFSSL_KEIL
  104167. "ands r5, r5, r6\n\t"
  104168. #elif defined(__clang__)
  104169. "ands r5, r6\n\t"
  104170. #else
  104171. "and r5, r6\n\t"
  104172. #endif
  104173. "cmp r5, #0\n\t"
  104174. "beq L_sp_256_num_bits_8_92_%=\n\t"
  104175. "movs r2, #0xf0\n\t"
  104176. "ldrb r4, [%[table], r5]\n\t"
  104177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104178. "adds r2, r2, r4\n\t"
  104179. #else
  104180. "add r2, r2, r4\n\t"
  104181. #endif
  104182. "b L_sp_256_num_bits_8_9_%=\n\t"
  104183. "\n"
  104184. "L_sp_256_num_bits_8_92_%=:\n\t"
  104185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104186. "lsrs r5, r3, #8\n\t"
  104187. #else
  104188. "lsr r5, r3, #8\n\t"
  104189. #endif
  104190. #ifdef WOLFSSL_KEIL
  104191. "ands r5, r5, r6\n\t"
  104192. #elif defined(__clang__)
  104193. "ands r5, r6\n\t"
  104194. #else
  104195. "and r5, r6\n\t"
  104196. #endif
  104197. "cmp r5, #0\n\t"
  104198. "beq L_sp_256_num_bits_8_91_%=\n\t"
  104199. "movs r2, #0xe8\n\t"
  104200. "ldrb r4, [%[table], r5]\n\t"
  104201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104202. "adds r2, r2, r4\n\t"
  104203. #else
  104204. "add r2, r2, r4\n\t"
  104205. #endif
  104206. "b L_sp_256_num_bits_8_9_%=\n\t"
  104207. "\n"
  104208. "L_sp_256_num_bits_8_91_%=:\n\t"
  104209. "movs r5, r3\n\t"
  104210. #ifdef WOLFSSL_KEIL
  104211. "ands r5, r5, r6\n\t"
  104212. #elif defined(__clang__)
  104213. "ands r5, r6\n\t"
  104214. #else
  104215. "and r5, r6\n\t"
  104216. #endif
  104217. "cmp r5, #0\n\t"
  104218. "beq L_sp_256_num_bits_8_90_%=\n\t"
  104219. "movs r2, #0xe0\n\t"
  104220. "ldrb r4, [%[table], r5]\n\t"
  104221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104222. "adds r2, r2, r4\n\t"
  104223. #else
  104224. "add r2, r2, r4\n\t"
  104225. #endif
  104226. "b L_sp_256_num_bits_8_9_%=\n\t"
  104227. "\n"
  104228. "L_sp_256_num_bits_8_90_%=:\n\t"
  104229. "b L_sp_256_num_bits_8_9_%=\n\t"
  104230. "\n"
  104231. "L_sp_256_num_bits_8_7_%=:\n\t"
  104232. "ldr r3, [%[a], #24]\n\t"
  104233. "cmp r3, #0\n\t"
  104234. "beq L_sp_256_num_bits_8_6_%=\n\t"
  104235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104236. "lsrs r5, r3, #24\n\t"
  104237. #else
  104238. "lsr r5, r3, #24\n\t"
  104239. #endif
  104240. "cmp r5, #0\n\t"
  104241. "beq L_sp_256_num_bits_8_83_%=\n\t"
  104242. "movs r2, #0xd8\n\t"
  104243. "ldrb r4, [%[table], r5]\n\t"
  104244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104245. "adds r2, r2, r4\n\t"
  104246. #else
  104247. "add r2, r2, r4\n\t"
  104248. #endif
  104249. "b L_sp_256_num_bits_8_9_%=\n\t"
  104250. "\n"
  104251. "L_sp_256_num_bits_8_83_%=:\n\t"
  104252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104253. "lsrs r5, r3, #16\n\t"
  104254. #else
  104255. "lsr r5, r3, #16\n\t"
  104256. #endif
  104257. #ifdef WOLFSSL_KEIL
  104258. "ands r5, r5, r6\n\t"
  104259. #elif defined(__clang__)
  104260. "ands r5, r6\n\t"
  104261. #else
  104262. "and r5, r6\n\t"
  104263. #endif
  104264. "cmp r5, #0\n\t"
  104265. "beq L_sp_256_num_bits_8_82_%=\n\t"
  104266. "movs r2, #0xd0\n\t"
  104267. "ldrb r4, [%[table], r5]\n\t"
  104268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104269. "adds r2, r2, r4\n\t"
  104270. #else
  104271. "add r2, r2, r4\n\t"
  104272. #endif
  104273. "b L_sp_256_num_bits_8_9_%=\n\t"
  104274. "\n"
  104275. "L_sp_256_num_bits_8_82_%=:\n\t"
  104276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104277. "lsrs r5, r3, #8\n\t"
  104278. #else
  104279. "lsr r5, r3, #8\n\t"
  104280. #endif
  104281. #ifdef WOLFSSL_KEIL
  104282. "ands r5, r5, r6\n\t"
  104283. #elif defined(__clang__)
  104284. "ands r5, r6\n\t"
  104285. #else
  104286. "and r5, r6\n\t"
  104287. #endif
  104288. "cmp r5, #0\n\t"
  104289. "beq L_sp_256_num_bits_8_81_%=\n\t"
  104290. "movs r2, #0xc8\n\t"
  104291. "ldrb r4, [%[table], r5]\n\t"
  104292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104293. "adds r2, r2, r4\n\t"
  104294. #else
  104295. "add r2, r2, r4\n\t"
  104296. #endif
  104297. "b L_sp_256_num_bits_8_9_%=\n\t"
  104298. "\n"
  104299. "L_sp_256_num_bits_8_81_%=:\n\t"
  104300. "movs r5, r3\n\t"
  104301. #ifdef WOLFSSL_KEIL
  104302. "ands r5, r5, r6\n\t"
  104303. #elif defined(__clang__)
  104304. "ands r5, r6\n\t"
  104305. #else
  104306. "and r5, r6\n\t"
  104307. #endif
  104308. "cmp r5, #0\n\t"
  104309. "beq L_sp_256_num_bits_8_80_%=\n\t"
  104310. "movs r2, #0xc0\n\t"
  104311. "ldrb r4, [%[table], r5]\n\t"
  104312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104313. "adds r2, r2, r4\n\t"
  104314. #else
  104315. "add r2, r2, r4\n\t"
  104316. #endif
  104317. "b L_sp_256_num_bits_8_9_%=\n\t"
  104318. "\n"
  104319. "L_sp_256_num_bits_8_80_%=:\n\t"
  104320. "b L_sp_256_num_bits_8_9_%=\n\t"
  104321. "\n"
  104322. "L_sp_256_num_bits_8_6_%=:\n\t"
  104323. "ldr r3, [%[a], #20]\n\t"
  104324. "cmp r3, #0\n\t"
  104325. "beq L_sp_256_num_bits_8_5_%=\n\t"
  104326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104327. "lsrs r5, r3, #24\n\t"
  104328. #else
  104329. "lsr r5, r3, #24\n\t"
  104330. #endif
  104331. "cmp r5, #0\n\t"
  104332. "beq L_sp_256_num_bits_8_73_%=\n\t"
  104333. "movs r2, #0xb8\n\t"
  104334. "ldrb r4, [%[table], r5]\n\t"
  104335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104336. "adds r2, r2, r4\n\t"
  104337. #else
  104338. "add r2, r2, r4\n\t"
  104339. #endif
  104340. "b L_sp_256_num_bits_8_9_%=\n\t"
  104341. "\n"
  104342. "L_sp_256_num_bits_8_73_%=:\n\t"
  104343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104344. "lsrs r5, r3, #16\n\t"
  104345. #else
  104346. "lsr r5, r3, #16\n\t"
  104347. #endif
  104348. #ifdef WOLFSSL_KEIL
  104349. "ands r5, r5, r6\n\t"
  104350. #elif defined(__clang__)
  104351. "ands r5, r6\n\t"
  104352. #else
  104353. "and r5, r6\n\t"
  104354. #endif
  104355. "cmp r5, #0\n\t"
  104356. "beq L_sp_256_num_bits_8_72_%=\n\t"
  104357. "movs r2, #0xb0\n\t"
  104358. "ldrb r4, [%[table], r5]\n\t"
  104359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104360. "adds r2, r2, r4\n\t"
  104361. #else
  104362. "add r2, r2, r4\n\t"
  104363. #endif
  104364. "b L_sp_256_num_bits_8_9_%=\n\t"
  104365. "\n"
  104366. "L_sp_256_num_bits_8_72_%=:\n\t"
  104367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104368. "lsrs r5, r3, #8\n\t"
  104369. #else
  104370. "lsr r5, r3, #8\n\t"
  104371. #endif
  104372. #ifdef WOLFSSL_KEIL
  104373. "ands r5, r5, r6\n\t"
  104374. #elif defined(__clang__)
  104375. "ands r5, r6\n\t"
  104376. #else
  104377. "and r5, r6\n\t"
  104378. #endif
  104379. "cmp r5, #0\n\t"
  104380. "beq L_sp_256_num_bits_8_71_%=\n\t"
  104381. "movs r2, #0xa8\n\t"
  104382. "ldrb r4, [%[table], r5]\n\t"
  104383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104384. "adds r2, r2, r4\n\t"
  104385. #else
  104386. "add r2, r2, r4\n\t"
  104387. #endif
  104388. "b L_sp_256_num_bits_8_9_%=\n\t"
  104389. "\n"
  104390. "L_sp_256_num_bits_8_71_%=:\n\t"
  104391. "movs r5, r3\n\t"
  104392. #ifdef WOLFSSL_KEIL
  104393. "ands r5, r5, r6\n\t"
  104394. #elif defined(__clang__)
  104395. "ands r5, r6\n\t"
  104396. #else
  104397. "and r5, r6\n\t"
  104398. #endif
  104399. "cmp r5, #0\n\t"
  104400. "beq L_sp_256_num_bits_8_70_%=\n\t"
  104401. "movs r2, #0xa0\n\t"
  104402. "ldrb r4, [%[table], r5]\n\t"
  104403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104404. "adds r2, r2, r4\n\t"
  104405. #else
  104406. "add r2, r2, r4\n\t"
  104407. #endif
  104408. "b L_sp_256_num_bits_8_9_%=\n\t"
  104409. "\n"
  104410. "L_sp_256_num_bits_8_70_%=:\n\t"
  104411. "b L_sp_256_num_bits_8_9_%=\n\t"
  104412. "\n"
  104413. "L_sp_256_num_bits_8_5_%=:\n\t"
  104414. "ldr r3, [%[a], #16]\n\t"
  104415. "cmp r3, #0\n\t"
  104416. "beq L_sp_256_num_bits_8_4_%=\n\t"
  104417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104418. "lsrs r5, r3, #24\n\t"
  104419. #else
  104420. "lsr r5, r3, #24\n\t"
  104421. #endif
  104422. "cmp r5, #0\n\t"
  104423. "beq L_sp_256_num_bits_8_63_%=\n\t"
  104424. "movs r2, #0x98\n\t"
  104425. "ldrb r4, [%[table], r5]\n\t"
  104426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104427. "adds r2, r2, r4\n\t"
  104428. #else
  104429. "add r2, r2, r4\n\t"
  104430. #endif
  104431. "b L_sp_256_num_bits_8_9_%=\n\t"
  104432. "\n"
  104433. "L_sp_256_num_bits_8_63_%=:\n\t"
  104434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104435. "lsrs r5, r3, #16\n\t"
  104436. #else
  104437. "lsr r5, r3, #16\n\t"
  104438. #endif
  104439. #ifdef WOLFSSL_KEIL
  104440. "ands r5, r5, r6\n\t"
  104441. #elif defined(__clang__)
  104442. "ands r5, r6\n\t"
  104443. #else
  104444. "and r5, r6\n\t"
  104445. #endif
  104446. "cmp r5, #0\n\t"
  104447. "beq L_sp_256_num_bits_8_62_%=\n\t"
  104448. "movs r2, #0x90\n\t"
  104449. "ldrb r4, [%[table], r5]\n\t"
  104450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104451. "adds r2, r2, r4\n\t"
  104452. #else
  104453. "add r2, r2, r4\n\t"
  104454. #endif
  104455. "b L_sp_256_num_bits_8_9_%=\n\t"
  104456. "\n"
  104457. "L_sp_256_num_bits_8_62_%=:\n\t"
  104458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104459. "lsrs r5, r3, #8\n\t"
  104460. #else
  104461. "lsr r5, r3, #8\n\t"
  104462. #endif
  104463. #ifdef WOLFSSL_KEIL
  104464. "ands r5, r5, r6\n\t"
  104465. #elif defined(__clang__)
  104466. "ands r5, r6\n\t"
  104467. #else
  104468. "and r5, r6\n\t"
  104469. #endif
  104470. "cmp r5, #0\n\t"
  104471. "beq L_sp_256_num_bits_8_61_%=\n\t"
  104472. "movs r2, #0x88\n\t"
  104473. "ldrb r4, [%[table], r5]\n\t"
  104474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104475. "adds r2, r2, r4\n\t"
  104476. #else
  104477. "add r2, r2, r4\n\t"
  104478. #endif
  104479. "b L_sp_256_num_bits_8_9_%=\n\t"
  104480. "\n"
  104481. "L_sp_256_num_bits_8_61_%=:\n\t"
  104482. "movs r5, r3\n\t"
  104483. #ifdef WOLFSSL_KEIL
  104484. "ands r5, r5, r6\n\t"
  104485. #elif defined(__clang__)
  104486. "ands r5, r6\n\t"
  104487. #else
  104488. "and r5, r6\n\t"
  104489. #endif
  104490. "cmp r5, #0\n\t"
  104491. "beq L_sp_256_num_bits_8_60_%=\n\t"
  104492. "movs r2, #0x80\n\t"
  104493. "ldrb r4, [%[table], r5]\n\t"
  104494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104495. "adds r2, r2, r4\n\t"
  104496. #else
  104497. "add r2, r2, r4\n\t"
  104498. #endif
  104499. "b L_sp_256_num_bits_8_9_%=\n\t"
  104500. "\n"
  104501. "L_sp_256_num_bits_8_60_%=:\n\t"
  104502. "b L_sp_256_num_bits_8_9_%=\n\t"
  104503. "\n"
  104504. "L_sp_256_num_bits_8_4_%=:\n\t"
  104505. "ldr r3, [%[a], #12]\n\t"
  104506. "cmp r3, #0\n\t"
  104507. "beq L_sp_256_num_bits_8_3_%=\n\t"
  104508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104509. "lsrs r5, r3, #24\n\t"
  104510. #else
  104511. "lsr r5, r3, #24\n\t"
  104512. #endif
  104513. "cmp r5, #0\n\t"
  104514. "beq L_sp_256_num_bits_8_53_%=\n\t"
  104515. "movs r2, #0x78\n\t"
  104516. "ldrb r4, [%[table], r5]\n\t"
  104517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104518. "adds r2, r2, r4\n\t"
  104519. #else
  104520. "add r2, r2, r4\n\t"
  104521. #endif
  104522. "b L_sp_256_num_bits_8_9_%=\n\t"
  104523. "\n"
  104524. "L_sp_256_num_bits_8_53_%=:\n\t"
  104525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104526. "lsrs r5, r3, #16\n\t"
  104527. #else
  104528. "lsr r5, r3, #16\n\t"
  104529. #endif
  104530. #ifdef WOLFSSL_KEIL
  104531. "ands r5, r5, r6\n\t"
  104532. #elif defined(__clang__)
  104533. "ands r5, r6\n\t"
  104534. #else
  104535. "and r5, r6\n\t"
  104536. #endif
  104537. "cmp r5, #0\n\t"
  104538. "beq L_sp_256_num_bits_8_52_%=\n\t"
  104539. "movs r2, #0x70\n\t"
  104540. "ldrb r4, [%[table], r5]\n\t"
  104541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104542. "adds r2, r2, r4\n\t"
  104543. #else
  104544. "add r2, r2, r4\n\t"
  104545. #endif
  104546. "b L_sp_256_num_bits_8_9_%=\n\t"
  104547. "\n"
  104548. "L_sp_256_num_bits_8_52_%=:\n\t"
  104549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104550. "lsrs r5, r3, #8\n\t"
  104551. #else
  104552. "lsr r5, r3, #8\n\t"
  104553. #endif
  104554. #ifdef WOLFSSL_KEIL
  104555. "ands r5, r5, r6\n\t"
  104556. #elif defined(__clang__)
  104557. "ands r5, r6\n\t"
  104558. #else
  104559. "and r5, r6\n\t"
  104560. #endif
  104561. "cmp r5, #0\n\t"
  104562. "beq L_sp_256_num_bits_8_51_%=\n\t"
  104563. "movs r2, #0x68\n\t"
  104564. "ldrb r4, [%[table], r5]\n\t"
  104565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104566. "adds r2, r2, r4\n\t"
  104567. #else
  104568. "add r2, r2, r4\n\t"
  104569. #endif
  104570. "b L_sp_256_num_bits_8_9_%=\n\t"
  104571. "\n"
  104572. "L_sp_256_num_bits_8_51_%=:\n\t"
  104573. "movs r5, r3\n\t"
  104574. #ifdef WOLFSSL_KEIL
  104575. "ands r5, r5, r6\n\t"
  104576. #elif defined(__clang__)
  104577. "ands r5, r6\n\t"
  104578. #else
  104579. "and r5, r6\n\t"
  104580. #endif
  104581. "cmp r5, #0\n\t"
  104582. "beq L_sp_256_num_bits_8_50_%=\n\t"
  104583. "movs r2, #0x60\n\t"
  104584. "ldrb r4, [%[table], r5]\n\t"
  104585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104586. "adds r2, r2, r4\n\t"
  104587. #else
  104588. "add r2, r2, r4\n\t"
  104589. #endif
  104590. "b L_sp_256_num_bits_8_9_%=\n\t"
  104591. "\n"
  104592. "L_sp_256_num_bits_8_50_%=:\n\t"
  104593. "b L_sp_256_num_bits_8_9_%=\n\t"
  104594. "\n"
  104595. "L_sp_256_num_bits_8_3_%=:\n\t"
  104596. "ldr r3, [%[a], #8]\n\t"
  104597. "cmp r3, #0\n\t"
  104598. "beq L_sp_256_num_bits_8_2_%=\n\t"
  104599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104600. "lsrs r5, r3, #24\n\t"
  104601. #else
  104602. "lsr r5, r3, #24\n\t"
  104603. #endif
  104604. "cmp r5, #0\n\t"
  104605. "beq L_sp_256_num_bits_8_43_%=\n\t"
  104606. "movs r2, #0x58\n\t"
  104607. "ldrb r4, [%[table], r5]\n\t"
  104608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104609. "adds r2, r2, r4\n\t"
  104610. #else
  104611. "add r2, r2, r4\n\t"
  104612. #endif
  104613. "b L_sp_256_num_bits_8_9_%=\n\t"
  104614. "\n"
  104615. "L_sp_256_num_bits_8_43_%=:\n\t"
  104616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104617. "lsrs r5, r3, #16\n\t"
  104618. #else
  104619. "lsr r5, r3, #16\n\t"
  104620. #endif
  104621. #ifdef WOLFSSL_KEIL
  104622. "ands r5, r5, r6\n\t"
  104623. #elif defined(__clang__)
  104624. "ands r5, r6\n\t"
  104625. #else
  104626. "and r5, r6\n\t"
  104627. #endif
  104628. "cmp r5, #0\n\t"
  104629. "beq L_sp_256_num_bits_8_42_%=\n\t"
  104630. "movs r2, #0x50\n\t"
  104631. "ldrb r4, [%[table], r5]\n\t"
  104632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104633. "adds r2, r2, r4\n\t"
  104634. #else
  104635. "add r2, r2, r4\n\t"
  104636. #endif
  104637. "b L_sp_256_num_bits_8_9_%=\n\t"
  104638. "\n"
  104639. "L_sp_256_num_bits_8_42_%=:\n\t"
  104640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104641. "lsrs r5, r3, #8\n\t"
  104642. #else
  104643. "lsr r5, r3, #8\n\t"
  104644. #endif
  104645. #ifdef WOLFSSL_KEIL
  104646. "ands r5, r5, r6\n\t"
  104647. #elif defined(__clang__)
  104648. "ands r5, r6\n\t"
  104649. #else
  104650. "and r5, r6\n\t"
  104651. #endif
  104652. "cmp r5, #0\n\t"
  104653. "beq L_sp_256_num_bits_8_41_%=\n\t"
  104654. "movs r2, #0x48\n\t"
  104655. "ldrb r4, [%[table], r5]\n\t"
  104656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104657. "adds r2, r2, r4\n\t"
  104658. #else
  104659. "add r2, r2, r4\n\t"
  104660. #endif
  104661. "b L_sp_256_num_bits_8_9_%=\n\t"
  104662. "\n"
  104663. "L_sp_256_num_bits_8_41_%=:\n\t"
  104664. "movs r5, r3\n\t"
  104665. #ifdef WOLFSSL_KEIL
  104666. "ands r5, r5, r6\n\t"
  104667. #elif defined(__clang__)
  104668. "ands r5, r6\n\t"
  104669. #else
  104670. "and r5, r6\n\t"
  104671. #endif
  104672. "cmp r5, #0\n\t"
  104673. "beq L_sp_256_num_bits_8_40_%=\n\t"
  104674. "movs r2, #0x40\n\t"
  104675. "ldrb r4, [%[table], r5]\n\t"
  104676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104677. "adds r2, r2, r4\n\t"
  104678. #else
  104679. "add r2, r2, r4\n\t"
  104680. #endif
  104681. "b L_sp_256_num_bits_8_9_%=\n\t"
  104682. "\n"
  104683. "L_sp_256_num_bits_8_40_%=:\n\t"
  104684. "b L_sp_256_num_bits_8_9_%=\n\t"
  104685. "\n"
  104686. "L_sp_256_num_bits_8_2_%=:\n\t"
  104687. "ldr r3, [%[a], #4]\n\t"
  104688. "cmp r3, #0\n\t"
  104689. "beq L_sp_256_num_bits_8_1_%=\n\t"
  104690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104691. "lsrs r5, r3, #24\n\t"
  104692. #else
  104693. "lsr r5, r3, #24\n\t"
  104694. #endif
  104695. "cmp r5, #0\n\t"
  104696. "beq L_sp_256_num_bits_8_33_%=\n\t"
  104697. "movs r2, #56\n\t"
  104698. "ldrb r4, [%[table], r5]\n\t"
  104699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104700. "adds r2, r2, r4\n\t"
  104701. #else
  104702. "add r2, r2, r4\n\t"
  104703. #endif
  104704. "b L_sp_256_num_bits_8_9_%=\n\t"
  104705. "\n"
  104706. "L_sp_256_num_bits_8_33_%=:\n\t"
  104707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104708. "lsrs r5, r3, #16\n\t"
  104709. #else
  104710. "lsr r5, r3, #16\n\t"
  104711. #endif
  104712. #ifdef WOLFSSL_KEIL
  104713. "ands r5, r5, r6\n\t"
  104714. #elif defined(__clang__)
  104715. "ands r5, r6\n\t"
  104716. #else
  104717. "and r5, r6\n\t"
  104718. #endif
  104719. "cmp r5, #0\n\t"
  104720. "beq L_sp_256_num_bits_8_32_%=\n\t"
  104721. "movs r2, #48\n\t"
  104722. "ldrb r4, [%[table], r5]\n\t"
  104723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104724. "adds r2, r2, r4\n\t"
  104725. #else
  104726. "add r2, r2, r4\n\t"
  104727. #endif
  104728. "b L_sp_256_num_bits_8_9_%=\n\t"
  104729. "\n"
  104730. "L_sp_256_num_bits_8_32_%=:\n\t"
  104731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104732. "lsrs r5, r3, #8\n\t"
  104733. #else
  104734. "lsr r5, r3, #8\n\t"
  104735. #endif
  104736. #ifdef WOLFSSL_KEIL
  104737. "ands r5, r5, r6\n\t"
  104738. #elif defined(__clang__)
  104739. "ands r5, r6\n\t"
  104740. #else
  104741. "and r5, r6\n\t"
  104742. #endif
  104743. "cmp r5, #0\n\t"
  104744. "beq L_sp_256_num_bits_8_31_%=\n\t"
  104745. "movs r2, #40\n\t"
  104746. "ldrb r4, [%[table], r5]\n\t"
  104747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104748. "adds r2, r2, r4\n\t"
  104749. #else
  104750. "add r2, r2, r4\n\t"
  104751. #endif
  104752. "b L_sp_256_num_bits_8_9_%=\n\t"
  104753. "\n"
  104754. "L_sp_256_num_bits_8_31_%=:\n\t"
  104755. "movs r5, r3\n\t"
  104756. #ifdef WOLFSSL_KEIL
  104757. "ands r5, r5, r6\n\t"
  104758. #elif defined(__clang__)
  104759. "ands r5, r6\n\t"
  104760. #else
  104761. "and r5, r6\n\t"
  104762. #endif
  104763. "cmp r5, #0\n\t"
  104764. "beq L_sp_256_num_bits_8_30_%=\n\t"
  104765. "movs r2, #32\n\t"
  104766. "ldrb r4, [%[table], r5]\n\t"
  104767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104768. "adds r2, r2, r4\n\t"
  104769. #else
  104770. "add r2, r2, r4\n\t"
  104771. #endif
  104772. "b L_sp_256_num_bits_8_9_%=\n\t"
  104773. "\n"
  104774. "L_sp_256_num_bits_8_30_%=:\n\t"
  104775. "b L_sp_256_num_bits_8_9_%=\n\t"
  104776. "\n"
  104777. "L_sp_256_num_bits_8_1_%=:\n\t"
  104778. "ldr r3, [%[a]]\n\t"
  104779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104780. "lsrs r5, r3, #24\n\t"
  104781. #else
  104782. "lsr r5, r3, #24\n\t"
  104783. #endif
  104784. "cmp r5, #0\n\t"
  104785. "beq L_sp_256_num_bits_8_23_%=\n\t"
  104786. "movs r2, #24\n\t"
  104787. "ldrb r4, [%[table], r5]\n\t"
  104788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104789. "adds r2, r2, r4\n\t"
  104790. #else
  104791. "add r2, r2, r4\n\t"
  104792. #endif
  104793. "b L_sp_256_num_bits_8_9_%=\n\t"
  104794. "\n"
  104795. "L_sp_256_num_bits_8_23_%=:\n\t"
  104796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104797. "lsrs r5, r3, #16\n\t"
  104798. #else
  104799. "lsr r5, r3, #16\n\t"
  104800. #endif
  104801. #ifdef WOLFSSL_KEIL
  104802. "ands r5, r5, r6\n\t"
  104803. #elif defined(__clang__)
  104804. "ands r5, r6\n\t"
  104805. #else
  104806. "and r5, r6\n\t"
  104807. #endif
  104808. "cmp r5, #0\n\t"
  104809. "beq L_sp_256_num_bits_8_22_%=\n\t"
  104810. "movs r2, #16\n\t"
  104811. "ldrb r4, [%[table], r5]\n\t"
  104812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104813. "adds r2, r2, r4\n\t"
  104814. #else
  104815. "add r2, r2, r4\n\t"
  104816. #endif
  104817. "b L_sp_256_num_bits_8_9_%=\n\t"
  104818. "\n"
  104819. "L_sp_256_num_bits_8_22_%=:\n\t"
  104820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104821. "lsrs r5, r3, #8\n\t"
  104822. #else
  104823. "lsr r5, r3, #8\n\t"
  104824. #endif
  104825. #ifdef WOLFSSL_KEIL
  104826. "ands r5, r5, r6\n\t"
  104827. #elif defined(__clang__)
  104828. "ands r5, r6\n\t"
  104829. #else
  104830. "and r5, r6\n\t"
  104831. #endif
  104832. "cmp r5, #0\n\t"
  104833. "beq L_sp_256_num_bits_8_21_%=\n\t"
  104834. "movs r2, #8\n\t"
  104835. "ldrb r4, [%[table], r5]\n\t"
  104836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104837. "adds r2, r2, r4\n\t"
  104838. #else
  104839. "add r2, r2, r4\n\t"
  104840. #endif
  104841. "b L_sp_256_num_bits_8_9_%=\n\t"
  104842. "\n"
  104843. "L_sp_256_num_bits_8_21_%=:\n\t"
  104844. "movs r5, r3\n\t"
  104845. #ifdef WOLFSSL_KEIL
  104846. "ands r5, r5, r6\n\t"
  104847. #elif defined(__clang__)
  104848. "ands r5, r6\n\t"
  104849. #else
  104850. "and r5, r6\n\t"
  104851. #endif
  104852. "cmp r5, #0\n\t"
  104853. "beq L_sp_256_num_bits_8_20_%=\n\t"
  104854. "movs r2, #0\n\t"
  104855. "ldrb r4, [%[table], r5]\n\t"
  104856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104857. "adds r2, r2, r4\n\t"
  104858. #else
  104859. "add r2, r2, r4\n\t"
  104860. #endif
  104861. "b L_sp_256_num_bits_8_9_%=\n\t"
  104862. "\n"
  104863. "L_sp_256_num_bits_8_20_%=:\n\t"
  104864. "\n"
  104865. "L_sp_256_num_bits_8_9_%=:\n\t"
  104866. "movs %[a], r2\n\t"
  104867. : [a] "+r" (a), [table] "+r" (table)
  104868. :
  104869. : "memory", "r2", "r3", "r4", "r5", "r6"
  104870. );
  104871. return (uint32_t)(size_t)a;
  104872. }
  104873. /* Non-constant time modular inversion.
  104874. *
  104875. * @param [out] r Resulting number.
  104876. * @param [in] a Number to invert.
  104877. * @param [in] m Modulus.
  104878. * @return MP_OKAY on success.
  104879. */
  104880. static int sp_256_mod_inv_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  104881. {
  104882. sp_digit u[8];
  104883. sp_digit v[8];
  104884. sp_digit b[8];
  104885. sp_digit d[8];
  104886. int ut, vt;
  104887. sp_digit o;
  104888. XMEMCPY(u, m, sizeof(u));
  104889. XMEMCPY(v, a, sizeof(v));
  104890. ut = sp_256_num_bits_8(u);
  104891. vt = sp_256_num_bits_8(v);
  104892. XMEMSET(b, 0, sizeof(b));
  104893. if ((v[0] & 1) == 0) {
  104894. sp_256_rshift1_8(v, v);
  104895. XMEMCPY(d, m, sizeof(u));
  104896. d[0] += 1;
  104897. sp_256_rshift1_8(d, d);
  104898. vt--;
  104899. while ((v[0] & 1) == 0) {
  104900. sp_256_rshift1_8(v, v);
  104901. sp_256_div2_mod_8(d, d, m);
  104902. vt--;
  104903. }
  104904. }
  104905. else {
  104906. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  104907. d[0] = 1;
  104908. }
  104909. while (ut > 1 && vt > 1) {
  104910. if (ut > vt || (ut == vt && sp_256_cmp_8(u, v) >= 0)) {
  104911. sp_256_sub_8(u, u, v);
  104912. o = sp_256_sub_8(b, b, d);
  104913. if (o != 0)
  104914. sp_256_add_8(b, b, m);
  104915. ut = sp_256_num_bits_8(u);
  104916. do {
  104917. sp_256_rshift1_8(u, u);
  104918. sp_256_div2_mod_8(b, b, m);
  104919. ut--;
  104920. }
  104921. while (ut > 0 && (u[0] & 1) == 0);
  104922. }
  104923. else {
  104924. sp_256_sub_8(v, v, u);
  104925. o = sp_256_sub_8(d, d, b);
  104926. if (o != 0)
  104927. sp_256_add_8(d, d, m);
  104928. vt = sp_256_num_bits_8(v);
  104929. do {
  104930. sp_256_rshift1_8(v, v);
  104931. sp_256_div2_mod_8(d, d, m);
  104932. vt--;
  104933. }
  104934. while (vt > 0 && (v[0] & 1) == 0);
  104935. }
  104936. }
  104937. if (ut == 1)
  104938. XMEMCPY(r, b, sizeof(b));
  104939. else
  104940. XMEMCPY(r, d, sizeof(d));
  104941. return MP_OKAY;
  104942. }
  104943. #endif /* WOLFSSL_SP_SMALL */
  104944. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  104945. *
  104946. * p1 First point to add and holds result.
  104947. * p2 Second point to add.
  104948. * tmp Temporary storage for intermediate numbers.
  104949. */
  104950. static void sp_256_add_points_8(sp_point_256* p1, const sp_point_256* p2,
  104951. sp_digit* tmp)
  104952. {
  104953. sp_256_proj_point_add_8(p1, p1, p2, tmp);
  104954. if (sp_256_iszero_8(p1->z)) {
  104955. if (sp_256_iszero_8(p1->x) && sp_256_iszero_8(p1->y)) {
  104956. sp_256_proj_point_dbl_8(p1, p2, tmp);
  104957. }
  104958. else {
  104959. /* Y ordinate is not used from here - don't set. */
  104960. p1->x[0] = 0;
  104961. p1->x[1] = 0;
  104962. p1->x[2] = 0;
  104963. p1->x[3] = 0;
  104964. p1->x[4] = 0;
  104965. p1->x[5] = 0;
  104966. p1->x[6] = 0;
  104967. p1->x[7] = 0;
  104968. XMEMCPY(p1->z, p256_norm_mod, sizeof(p256_norm_mod));
  104969. }
  104970. }
  104971. }
  104972. /* Calculate the verification point: [e/s]G + [r/s]Q
  104973. *
  104974. * p1 Calculated point.
  104975. * p2 Public point and temporary.
  104976. * s Second part of signature as a number.
  104977. * u1 Temporary number.
  104978. * u2 Temproray number.
  104979. * heap Heap to use for allocation.
  104980. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  104981. */
  104982. static int sp_256_calc_vfy_point_8(sp_point_256* p1, sp_point_256* p2,
  104983. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  104984. {
  104985. int err;
  104986. #ifndef WOLFSSL_SP_SMALL
  104987. err = sp_256_mod_inv_8(s, s, p256_order);
  104988. if (err == MP_OKAY)
  104989. #endif /* !WOLFSSL_SP_SMALL */
  104990. {
  104991. sp_256_mul_8(s, s, p256_norm_order);
  104992. err = sp_256_mod_8(s, s, p256_order);
  104993. }
  104994. if (err == MP_OKAY) {
  104995. sp_256_norm_8(s);
  104996. #ifdef WOLFSSL_SP_SMALL
  104997. {
  104998. sp_256_mont_inv_order_8(s, s, tmp);
  104999. sp_256_mont_mul_order_8(u1, u1, s);
  105000. sp_256_mont_mul_order_8(u2, u2, s);
  105001. }
  105002. #else
  105003. {
  105004. sp_256_mont_mul_order_8(u1, u1, s);
  105005. sp_256_mont_mul_order_8(u2, u2, s);
  105006. }
  105007. #endif /* WOLFSSL_SP_SMALL */
  105008. {
  105009. err = sp_256_ecc_mulmod_base_8(p1, u1, 0, 0, heap);
  105010. }
  105011. }
  105012. if ((err == MP_OKAY) && sp_256_iszero_8(p1->z)) {
  105013. p1->infinity = 1;
  105014. }
  105015. if (err == MP_OKAY) {
  105016. err = sp_256_ecc_mulmod_8(p2, p2, u2, 0, 0, heap);
  105017. }
  105018. if ((err == MP_OKAY) && sp_256_iszero_8(p2->z)) {
  105019. p2->infinity = 1;
  105020. }
  105021. if (err == MP_OKAY) {
  105022. sp_256_add_points_8(p1, p2, tmp);
  105023. }
  105024. return err;
  105025. }
  105026. #ifdef HAVE_ECC_VERIFY
  105027. /* Verify the signature values with the hash and public key.
  105028. * e = Truncate(hash, 256)
  105029. * u1 = e/s mod order
  105030. * u2 = r/s mod order
  105031. * r == (u1.G + u2.Q)->x mod order
  105032. * Optimization: Leave point in projective form.
  105033. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  105034. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  105035. * The hash is truncated to the first 256 bits.
  105036. *
  105037. * hash Hash to sign.
  105038. * hashLen Length of the hash data.
  105039. * rng Random number generator.
  105040. * priv Private part of key - scalar.
  105041. * rm First part of result as an mp_int.
  105042. * sm Sirst part of result as an mp_int.
  105043. * heap Heap to use for allocation.
  105044. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  105045. */
  105046. #ifdef WOLFSSL_SP_NONBLOCK
  105047. typedef struct sp_ecc_verify_256_ctx {
  105048. int state;
  105049. union {
  105050. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  105051. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  105052. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  105053. sp_256_proj_point_add_8_ctx add_ctx;
  105054. };
  105055. sp_digit u1[2*8];
  105056. sp_digit u2[2*8];
  105057. sp_digit s[2*8];
  105058. sp_digit tmp[2*8 * 5];
  105059. sp_point_256 p1;
  105060. sp_point_256 p2;
  105061. } sp_ecc_verify_256_ctx;
  105062. int sp_ecc_verify_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  105063. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  105064. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  105065. {
  105066. int err = FP_WOULDBLOCK;
  105067. sp_ecc_verify_256_ctx* ctx = (sp_ecc_verify_256_ctx*)sp_ctx->data;
  105068. typedef char ctx_size_test[sizeof(sp_ecc_verify_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  105069. (void)sizeof(ctx_size_test);
  105070. switch (ctx->state) {
  105071. case 0: /* INIT */
  105072. if (hashLen > 32U) {
  105073. hashLen = 32U;
  105074. }
  105075. sp_256_from_bin(ctx->u1, 8, hash, (int)hashLen);
  105076. sp_256_from_mp(ctx->u2, 8, rm);
  105077. sp_256_from_mp(ctx->s, 8, sm);
  105078. sp_256_from_mp(ctx->p2.x, 8, pX);
  105079. sp_256_from_mp(ctx->p2.y, 8, pY);
  105080. sp_256_from_mp(ctx->p2.z, 8, pZ);
  105081. ctx->state = 1;
  105082. break;
  105083. case 1: /* NORMS0 */
  105084. sp_256_mul_8(ctx->s, ctx->s, p256_norm_order);
  105085. err = sp_256_mod_8(ctx->s, ctx->s, p256_order);
  105086. if (err == MP_OKAY)
  105087. ctx->state = 2;
  105088. break;
  105089. case 2: /* NORMS1 */
  105090. sp_256_norm_8(ctx->s);
  105091. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  105092. ctx->state = 3;
  105093. break;
  105094. case 3: /* NORMS2 */
  105095. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  105096. if (err == MP_OKAY) {
  105097. ctx->state = 4;
  105098. }
  105099. break;
  105100. case 4: /* NORMS3 */
  105101. sp_256_mont_mul_order_8(ctx->u1, ctx->u1, ctx->s);
  105102. ctx->state = 5;
  105103. break;
  105104. case 5: /* NORMS4 */
  105105. sp_256_mont_mul_order_8(ctx->u2, ctx->u2, ctx->s);
  105106. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  105107. ctx->state = 6;
  105108. break;
  105109. case 6: /* MULBASE */
  105110. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p256_base, ctx->u1, 0, 0, heap);
  105111. if (err == MP_OKAY) {
  105112. if (sp_256_iszero_8(ctx->p1.z)) {
  105113. ctx->p1.infinity = 1;
  105114. }
  105115. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  105116. ctx->state = 7;
  105117. }
  105118. break;
  105119. case 7: /* MULMOD */
  105120. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  105121. if (err == MP_OKAY) {
  105122. if (sp_256_iszero_8(ctx->p2.z)) {
  105123. ctx->p2.infinity = 1;
  105124. }
  105125. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  105126. ctx->state = 8;
  105127. }
  105128. break;
  105129. case 8: /* ADD */
  105130. err = sp_256_proj_point_add_8_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  105131. if (err == MP_OKAY)
  105132. ctx->state = 9;
  105133. break;
  105134. case 9: /* MONT */
  105135. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  105136. /* Reload r and convert to Montgomery form. */
  105137. sp_256_from_mp(ctx->u2, 8, rm);
  105138. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  105139. if (err == MP_OKAY)
  105140. ctx->state = 10;
  105141. break;
  105142. case 10: /* SQR */
  105143. /* u1 = r.z'.z' mod prime */
  105144. sp_256_mont_sqr_8(ctx->p1.z, ctx->p1.z, p256_mod, p256_mp_mod);
  105145. ctx->state = 11;
  105146. break;
  105147. case 11: /* MUL */
  105148. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod, p256_mp_mod);
  105149. ctx->state = 12;
  105150. break;
  105151. case 12: /* RES */
  105152. {
  105153. sp_int32 c = 0;
  105154. err = MP_OKAY; /* math okay, now check result */
  105155. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  105156. if (*res == 0) {
  105157. sp_digit carry;
  105158. /* Reload r and add order. */
  105159. sp_256_from_mp(ctx->u2, 8, rm);
  105160. carry = sp_256_add_8(ctx->u2, ctx->u2, p256_order);
  105161. /* Carry means result is greater than mod and is not valid. */
  105162. if (carry == 0) {
  105163. sp_256_norm_8(ctx->u2);
  105164. /* Compare with mod and if greater or equal then not valid. */
  105165. c = sp_256_cmp_8(ctx->u2, p256_mod);
  105166. }
  105167. }
  105168. if ((*res == 0) && (c < 0)) {
  105169. /* Convert to Montogomery form */
  105170. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  105171. if (err == MP_OKAY) {
  105172. /* u1 = (r + 1*order).z'.z' mod prime */
  105173. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod,
  105174. p256_mp_mod);
  105175. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  105176. }
  105177. }
  105178. break;
  105179. }
  105180. } /* switch */
  105181. if (err == MP_OKAY && ctx->state != 12) {
  105182. err = FP_WOULDBLOCK;
  105183. }
  105184. return err;
  105185. }
  105186. #endif /* WOLFSSL_SP_NONBLOCK */
  105187. int sp_ecc_verify_256(const byte* hash, word32 hashLen, const mp_int* pX,
  105188. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  105189. int* res, void* heap)
  105190. {
  105191. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105192. sp_digit* u1 = NULL;
  105193. sp_point_256* p1 = NULL;
  105194. #else
  105195. sp_digit u1[16 * 8];
  105196. sp_point_256 p1[2];
  105197. #endif
  105198. sp_digit* u2 = NULL;
  105199. sp_digit* s = NULL;
  105200. sp_digit* tmp = NULL;
  105201. sp_point_256* p2 = NULL;
  105202. sp_digit carry;
  105203. sp_int32 c = 0;
  105204. int err = MP_OKAY;
  105205. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105206. if (err == MP_OKAY) {
  105207. p1 = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  105208. DYNAMIC_TYPE_ECC);
  105209. if (p1 == NULL)
  105210. err = MEMORY_E;
  105211. }
  105212. if (err == MP_OKAY) {
  105213. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 8, heap,
  105214. DYNAMIC_TYPE_ECC);
  105215. if (u1 == NULL)
  105216. err = MEMORY_E;
  105217. }
  105218. #endif
  105219. if (err == MP_OKAY) {
  105220. u2 = u1 + 2 * 8;
  105221. s = u1 + 4 * 8;
  105222. tmp = u1 + 6 * 8;
  105223. p2 = p1 + 1;
  105224. if (hashLen > 32U) {
  105225. hashLen = 32U;
  105226. }
  105227. sp_256_from_bin(u1, 8, hash, (int)hashLen);
  105228. sp_256_from_mp(u2, 8, rm);
  105229. sp_256_from_mp(s, 8, sm);
  105230. sp_256_from_mp(p2->x, 8, pX);
  105231. sp_256_from_mp(p2->y, 8, pY);
  105232. sp_256_from_mp(p2->z, 8, pZ);
  105233. err = sp_256_calc_vfy_point_8(p1, p2, s, u1, u2, tmp, heap);
  105234. }
  105235. if (err == MP_OKAY) {
  105236. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  105237. /* Reload r and convert to Montgomery form. */
  105238. sp_256_from_mp(u2, 8, rm);
  105239. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  105240. }
  105241. if (err == MP_OKAY) {
  105242. /* u1 = r.z'.z' mod prime */
  105243. sp_256_mont_sqr_8(p1->z, p1->z, p256_mod, p256_mp_mod);
  105244. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  105245. *res = (int)(sp_256_cmp_8(p1->x, u1) == 0);
  105246. if (*res == 0) {
  105247. /* Reload r and add order. */
  105248. sp_256_from_mp(u2, 8, rm);
  105249. carry = sp_256_add_8(u2, u2, p256_order);
  105250. /* Carry means result is greater than mod and is not valid. */
  105251. if (carry == 0) {
  105252. sp_256_norm_8(u2);
  105253. /* Compare with mod and if greater or equal then not valid. */
  105254. c = sp_256_cmp_8(u2, p256_mod);
  105255. }
  105256. }
  105257. if ((*res == 0) && (c < 0)) {
  105258. /* Convert to Montogomery form */
  105259. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  105260. if (err == MP_OKAY) {
  105261. /* u1 = (r + 1*order).z'.z' mod prime */
  105262. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod,
  105263. p256_mp_mod);
  105264. *res = (sp_256_cmp_8(p1->x, u1) == 0);
  105265. }
  105266. }
  105267. }
  105268. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105269. if (u1 != NULL)
  105270. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  105271. if (p1 != NULL)
  105272. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  105273. #endif
  105274. return err;
  105275. }
  105276. #endif /* HAVE_ECC_VERIFY */
  105277. #ifdef HAVE_ECC_CHECK_KEY
  105278. /* Check that the x and y oridinates are a valid point on the curve.
  105279. *
  105280. * point EC point.
  105281. * heap Heap to use if dynamically allocating.
  105282. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  105283. * not on the curve and MP_OKAY otherwise.
  105284. */
  105285. static int sp_256_ecc_is_point_8(const sp_point_256* point,
  105286. void* heap)
  105287. {
  105288. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105289. sp_digit* t1 = NULL;
  105290. #else
  105291. sp_digit t1[8 * 4];
  105292. #endif
  105293. sp_digit* t2 = NULL;
  105294. int err = MP_OKAY;
  105295. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105296. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 4, heap, DYNAMIC_TYPE_ECC);
  105297. if (t1 == NULL)
  105298. err = MEMORY_E;
  105299. #endif
  105300. (void)heap;
  105301. if (err == MP_OKAY) {
  105302. t2 = t1 + 2 * 8;
  105303. sp_256_sqr_8(t1, point->y);
  105304. (void)sp_256_mod_8(t1, t1, p256_mod);
  105305. sp_256_sqr_8(t2, point->x);
  105306. (void)sp_256_mod_8(t2, t2, p256_mod);
  105307. sp_256_mul_8(t2, t2, point->x);
  105308. (void)sp_256_mod_8(t2, t2, p256_mod);
  105309. (void)sp_256_sub_8(t2, p256_mod, t2);
  105310. sp_256_mont_add_8(t1, t1, t2, p256_mod);
  105311. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  105312. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  105313. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  105314. if (sp_256_cmp_8(t1, p256_b) != 0) {
  105315. err = MP_VAL;
  105316. }
  105317. }
  105318. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105319. if (t1 != NULL)
  105320. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  105321. #endif
  105322. return err;
  105323. }
  105324. /* Check that the x and y oridinates are a valid point on the curve.
  105325. *
  105326. * pX X ordinate of EC point.
  105327. * pY Y ordinate of EC point.
  105328. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  105329. * not on the curve and MP_OKAY otherwise.
  105330. */
  105331. int sp_ecc_is_point_256(const mp_int* pX, const mp_int* pY)
  105332. {
  105333. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105334. sp_point_256* pub = NULL;
  105335. #else
  105336. sp_point_256 pub[1];
  105337. #endif
  105338. const byte one[1] = { 1 };
  105339. int err = MP_OKAY;
  105340. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105341. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  105342. DYNAMIC_TYPE_ECC);
  105343. if (pub == NULL)
  105344. err = MEMORY_E;
  105345. #endif
  105346. if (err == MP_OKAY) {
  105347. sp_256_from_mp(pub->x, 8, pX);
  105348. sp_256_from_mp(pub->y, 8, pY);
  105349. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  105350. err = sp_256_ecc_is_point_8(pub, NULL);
  105351. }
  105352. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105353. if (pub != NULL)
  105354. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  105355. #endif
  105356. return err;
  105357. }
  105358. /* Check that the private scalar generates the EC point (px, py), the point is
  105359. * on the curve and the point has the correct order.
  105360. *
  105361. * pX X ordinate of EC point.
  105362. * pY Y ordinate of EC point.
  105363. * privm Private scalar that generates EC point.
  105364. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  105365. * not on the curve, ECC_INF_E if the point does not have the correct order,
  105366. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  105367. * MP_OKAY otherwise.
  105368. */
  105369. int sp_ecc_check_key_256(const mp_int* pX, const mp_int* pY,
  105370. const mp_int* privm, void* heap)
  105371. {
  105372. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105373. sp_digit* priv = NULL;
  105374. sp_point_256* pub = NULL;
  105375. #else
  105376. sp_digit priv[8];
  105377. sp_point_256 pub[2];
  105378. #endif
  105379. sp_point_256* p = NULL;
  105380. const byte one[1] = { 1 };
  105381. int err = MP_OKAY;
  105382. /* Quick check the lengs of public key ordinates and private key are in
  105383. * range. Proper check later.
  105384. */
  105385. if (((mp_count_bits(pX) > 256) ||
  105386. (mp_count_bits(pY) > 256) ||
  105387. ((privm != NULL) && (mp_count_bits(privm) > 256)))) {
  105388. err = ECC_OUT_OF_RANGE_E;
  105389. }
  105390. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105391. if (err == MP_OKAY) {
  105392. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  105393. DYNAMIC_TYPE_ECC);
  105394. if (pub == NULL)
  105395. err = MEMORY_E;
  105396. }
  105397. if (err == MP_OKAY && privm) {
  105398. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  105399. DYNAMIC_TYPE_ECC);
  105400. if (priv == NULL)
  105401. err = MEMORY_E;
  105402. }
  105403. #endif
  105404. if (err == MP_OKAY) {
  105405. p = pub + 1;
  105406. sp_256_from_mp(pub->x, 8, pX);
  105407. sp_256_from_mp(pub->y, 8, pY);
  105408. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  105409. if (privm)
  105410. sp_256_from_mp(priv, 8, privm);
  105411. /* Check point at infinitiy. */
  105412. if ((sp_256_iszero_8(pub->x) != 0) &&
  105413. (sp_256_iszero_8(pub->y) != 0)) {
  105414. err = ECC_INF_E;
  105415. }
  105416. }
  105417. /* Check range of X and Y */
  105418. if ((err == MP_OKAY) &&
  105419. ((sp_256_cmp_8(pub->x, p256_mod) >= 0) ||
  105420. (sp_256_cmp_8(pub->y, p256_mod) >= 0))) {
  105421. err = ECC_OUT_OF_RANGE_E;
  105422. }
  105423. if (err == MP_OKAY) {
  105424. /* Check point is on curve */
  105425. err = sp_256_ecc_is_point_8(pub, heap);
  105426. }
  105427. if (err == MP_OKAY) {
  105428. /* Point * order = infinity */
  105429. err = sp_256_ecc_mulmod_8(p, pub, p256_order, 1, 1, heap);
  105430. }
  105431. /* Check result is infinity */
  105432. if ((err == MP_OKAY) && ((sp_256_iszero_8(p->x) == 0) ||
  105433. (sp_256_iszero_8(p->y) == 0))) {
  105434. err = ECC_INF_E;
  105435. }
  105436. if (privm) {
  105437. if (err == MP_OKAY) {
  105438. /* Base * private = point */
  105439. err = sp_256_ecc_mulmod_base_8(p, priv, 1, 1, heap);
  105440. }
  105441. /* Check result is public key */
  105442. if ((err == MP_OKAY) &&
  105443. ((sp_256_cmp_8(p->x, pub->x) != 0) ||
  105444. (sp_256_cmp_8(p->y, pub->y) != 0))) {
  105445. err = ECC_PRIV_KEY_E;
  105446. }
  105447. }
  105448. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105449. if (pub != NULL)
  105450. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  105451. if (priv != NULL)
  105452. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  105453. #endif
  105454. return err;
  105455. }
  105456. #endif
  105457. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  105458. /* Add two projective EC points together.
  105459. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  105460. *
  105461. * pX First EC point's X ordinate.
  105462. * pY First EC point's Y ordinate.
  105463. * pZ First EC point's Z ordinate.
  105464. * qX Second EC point's X ordinate.
  105465. * qY Second EC point's Y ordinate.
  105466. * qZ Second EC point's Z ordinate.
  105467. * rX Resultant EC point's X ordinate.
  105468. * rY Resultant EC point's Y ordinate.
  105469. * rZ Resultant EC point's Z ordinate.
  105470. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  105471. */
  105472. int sp_ecc_proj_add_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  105473. mp_int* qX, mp_int* qY, mp_int* qZ,
  105474. mp_int* rX, mp_int* rY, mp_int* rZ)
  105475. {
  105476. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105477. sp_digit* tmp = NULL;
  105478. sp_point_256* p = NULL;
  105479. #else
  105480. sp_digit tmp[2 * 8 * 5];
  105481. sp_point_256 p[2];
  105482. #endif
  105483. sp_point_256* q = NULL;
  105484. int err = MP_OKAY;
  105485. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105486. if (err == MP_OKAY) {
  105487. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, NULL,
  105488. DYNAMIC_TYPE_ECC);
  105489. if (p == NULL)
  105490. err = MEMORY_E;
  105491. }
  105492. if (err == MP_OKAY) {
  105493. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 5, NULL,
  105494. DYNAMIC_TYPE_ECC);
  105495. if (tmp == NULL) {
  105496. err = MEMORY_E;
  105497. }
  105498. }
  105499. #endif
  105500. if (err == MP_OKAY) {
  105501. q = p + 1;
  105502. sp_256_from_mp(p->x, 8, pX);
  105503. sp_256_from_mp(p->y, 8, pY);
  105504. sp_256_from_mp(p->z, 8, pZ);
  105505. sp_256_from_mp(q->x, 8, qX);
  105506. sp_256_from_mp(q->y, 8, qY);
  105507. sp_256_from_mp(q->z, 8, qZ);
  105508. p->infinity = sp_256_iszero_8(p->x) &
  105509. sp_256_iszero_8(p->y);
  105510. q->infinity = sp_256_iszero_8(q->x) &
  105511. sp_256_iszero_8(q->y);
  105512. sp_256_proj_point_add_8(p, p, q, tmp);
  105513. }
  105514. if (err == MP_OKAY) {
  105515. err = sp_256_to_mp(p->x, rX);
  105516. }
  105517. if (err == MP_OKAY) {
  105518. err = sp_256_to_mp(p->y, rY);
  105519. }
  105520. if (err == MP_OKAY) {
  105521. err = sp_256_to_mp(p->z, rZ);
  105522. }
  105523. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105524. if (tmp != NULL)
  105525. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  105526. if (p != NULL)
  105527. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  105528. #endif
  105529. return err;
  105530. }
  105531. /* Double a projective EC point.
  105532. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  105533. *
  105534. * pX EC point's X ordinate.
  105535. * pY EC point's Y ordinate.
  105536. * pZ EC point's Z ordinate.
  105537. * rX Resultant EC point's X ordinate.
  105538. * rY Resultant EC point's Y ordinate.
  105539. * rZ Resultant EC point's Z ordinate.
  105540. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  105541. */
  105542. int sp_ecc_proj_dbl_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  105543. mp_int* rX, mp_int* rY, mp_int* rZ)
  105544. {
  105545. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105546. sp_digit* tmp = NULL;
  105547. sp_point_256* p = NULL;
  105548. #else
  105549. sp_digit tmp[2 * 8 * 2];
  105550. sp_point_256 p[1];
  105551. #endif
  105552. int err = MP_OKAY;
  105553. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105554. if (err == MP_OKAY) {
  105555. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  105556. DYNAMIC_TYPE_ECC);
  105557. if (p == NULL)
  105558. err = MEMORY_E;
  105559. }
  105560. if (err == MP_OKAY) {
  105561. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 2, NULL,
  105562. DYNAMIC_TYPE_ECC);
  105563. if (tmp == NULL)
  105564. err = MEMORY_E;
  105565. }
  105566. #endif
  105567. if (err == MP_OKAY) {
  105568. sp_256_from_mp(p->x, 8, pX);
  105569. sp_256_from_mp(p->y, 8, pY);
  105570. sp_256_from_mp(p->z, 8, pZ);
  105571. p->infinity = sp_256_iszero_8(p->x) &
  105572. sp_256_iszero_8(p->y);
  105573. sp_256_proj_point_dbl_8(p, p, tmp);
  105574. }
  105575. if (err == MP_OKAY) {
  105576. err = sp_256_to_mp(p->x, rX);
  105577. }
  105578. if (err == MP_OKAY) {
  105579. err = sp_256_to_mp(p->y, rY);
  105580. }
  105581. if (err == MP_OKAY) {
  105582. err = sp_256_to_mp(p->z, rZ);
  105583. }
  105584. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105585. if (tmp != NULL)
  105586. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  105587. if (p != NULL)
  105588. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  105589. #endif
  105590. return err;
  105591. }
  105592. /* Map a projective EC point to affine in place.
  105593. * pZ will be one.
  105594. *
  105595. * pX EC point's X ordinate.
  105596. * pY EC point's Y ordinate.
  105597. * pZ EC point's Z ordinate.
  105598. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  105599. */
  105600. int sp_ecc_map_256(mp_int* pX, mp_int* pY, mp_int* pZ)
  105601. {
  105602. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105603. sp_digit* tmp = NULL;
  105604. sp_point_256* p = NULL;
  105605. #else
  105606. sp_digit tmp[2 * 8 * 4];
  105607. sp_point_256 p[1];
  105608. #endif
  105609. int err = MP_OKAY;
  105610. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105611. if (err == MP_OKAY) {
  105612. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  105613. DYNAMIC_TYPE_ECC);
  105614. if (p == NULL)
  105615. err = MEMORY_E;
  105616. }
  105617. if (err == MP_OKAY) {
  105618. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 4, NULL,
  105619. DYNAMIC_TYPE_ECC);
  105620. if (tmp == NULL)
  105621. err = MEMORY_E;
  105622. }
  105623. #endif
  105624. if (err == MP_OKAY) {
  105625. sp_256_from_mp(p->x, 8, pX);
  105626. sp_256_from_mp(p->y, 8, pY);
  105627. sp_256_from_mp(p->z, 8, pZ);
  105628. p->infinity = sp_256_iszero_8(p->x) &
  105629. sp_256_iszero_8(p->y);
  105630. sp_256_map_8(p, p, tmp);
  105631. }
  105632. if (err == MP_OKAY) {
  105633. err = sp_256_to_mp(p->x, pX);
  105634. }
  105635. if (err == MP_OKAY) {
  105636. err = sp_256_to_mp(p->y, pY);
  105637. }
  105638. if (err == MP_OKAY) {
  105639. err = sp_256_to_mp(p->z, pZ);
  105640. }
  105641. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105642. if (tmp != NULL)
  105643. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  105644. if (p != NULL)
  105645. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  105646. #endif
  105647. return err;
  105648. }
  105649. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  105650. #ifdef HAVE_COMP_KEY
  105651. /* Find the square root of a number mod the prime of the curve.
  105652. *
  105653. * y The number to operate on and the result.
  105654. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  105655. */
  105656. static int sp_256_mont_sqrt_8(sp_digit* y)
  105657. {
  105658. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105659. sp_digit* t1 = NULL;
  105660. #else
  105661. sp_digit t1[4 * 8];
  105662. #endif
  105663. sp_digit* t2 = NULL;
  105664. int err = MP_OKAY;
  105665. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105666. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  105667. if (t1 == NULL) {
  105668. err = MEMORY_E;
  105669. }
  105670. #endif
  105671. if (err == MP_OKAY) {
  105672. t2 = t1 + 2 * 8;
  105673. {
  105674. /* t2 = y ^ 0x2 */
  105675. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  105676. /* t1 = y ^ 0x3 */
  105677. sp_256_mont_mul_8(t1, t2, y, p256_mod, p256_mp_mod);
  105678. /* t2 = y ^ 0xc */
  105679. sp_256_mont_sqr_n_8(t2, t1, 2, p256_mod, p256_mp_mod);
  105680. /* t1 = y ^ 0xf */
  105681. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  105682. /* t2 = y ^ 0xf0 */
  105683. sp_256_mont_sqr_n_8(t2, t1, 4, p256_mod, p256_mp_mod);
  105684. /* t1 = y ^ 0xff */
  105685. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  105686. /* t2 = y ^ 0xff00 */
  105687. sp_256_mont_sqr_n_8(t2, t1, 8, p256_mod, p256_mp_mod);
  105688. /* t1 = y ^ 0xffff */
  105689. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  105690. /* t2 = y ^ 0xffff0000 */
  105691. sp_256_mont_sqr_n_8(t2, t1, 16, p256_mod, p256_mp_mod);
  105692. /* t1 = y ^ 0xffffffff */
  105693. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  105694. /* t1 = y ^ 0xffffffff00000000 */
  105695. sp_256_mont_sqr_n_8(t1, t1, 32, p256_mod, p256_mp_mod);
  105696. /* t1 = y ^ 0xffffffff00000001 */
  105697. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  105698. /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */
  105699. sp_256_mont_sqr_n_8(t1, t1, 96, p256_mod, p256_mp_mod);
  105700. /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */
  105701. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  105702. sp_256_mont_sqr_n_8(y, t1, 94, p256_mod, p256_mp_mod);
  105703. }
  105704. }
  105705. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105706. if (t1 != NULL)
  105707. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  105708. #endif
  105709. return err;
  105710. }
  105711. /* Uncompress the point given the X ordinate.
  105712. *
  105713. * xm X ordinate.
  105714. * odd Whether the Y ordinate is odd.
  105715. * ym Calculated Y ordinate.
  105716. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  105717. */
  105718. int sp_ecc_uncompress_256(mp_int* xm, int odd, mp_int* ym)
  105719. {
  105720. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105721. sp_digit* x = NULL;
  105722. #else
  105723. sp_digit x[4 * 8];
  105724. #endif
  105725. sp_digit* y = NULL;
  105726. int err = MP_OKAY;
  105727. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105728. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  105729. if (x == NULL)
  105730. err = MEMORY_E;
  105731. #endif
  105732. if (err == MP_OKAY) {
  105733. y = x + 2 * 8;
  105734. sp_256_from_mp(x, 8, xm);
  105735. err = sp_256_mod_mul_norm_8(x, x, p256_mod);
  105736. }
  105737. if (err == MP_OKAY) {
  105738. /* y = x^3 */
  105739. {
  105740. sp_256_mont_sqr_8(y, x, p256_mod, p256_mp_mod);
  105741. sp_256_mont_mul_8(y, y, x, p256_mod, p256_mp_mod);
  105742. }
  105743. /* y = x^3 - 3x */
  105744. sp_256_mont_sub_8(y, y, x, p256_mod);
  105745. sp_256_mont_sub_8(y, y, x, p256_mod);
  105746. sp_256_mont_sub_8(y, y, x, p256_mod);
  105747. /* y = x^3 - 3x + b */
  105748. err = sp_256_mod_mul_norm_8(x, p256_b, p256_mod);
  105749. }
  105750. if (err == MP_OKAY) {
  105751. sp_256_mont_add_8(y, y, x, p256_mod);
  105752. /* y = sqrt(x^3 - 3x + b) */
  105753. err = sp_256_mont_sqrt_8(y);
  105754. }
  105755. if (err == MP_OKAY) {
  105756. XMEMSET(y + 8, 0, 8U * sizeof(sp_digit));
  105757. sp_256_mont_reduce_8(y, p256_mod, p256_mp_mod);
  105758. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  105759. sp_256_mont_sub_8(y, p256_mod, y, p256_mod);
  105760. }
  105761. err = sp_256_to_mp(y, ym);
  105762. }
  105763. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  105764. if (x != NULL)
  105765. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  105766. #endif
  105767. return err;
  105768. }
  105769. #endif
  105770. #endif /* !WOLFSSL_SP_NO_256 */
  105771. #ifdef WOLFSSL_SP_384
  105772. /* Point structure to use. */
  105773. typedef struct sp_point_384 {
  105774. /* X ordinate of point. */
  105775. sp_digit x[2 * 12];
  105776. /* Y ordinate of point. */
  105777. sp_digit y[2 * 12];
  105778. /* Z ordinate of point. */
  105779. sp_digit z[2 * 12];
  105780. /* Indicates point is at infinity. */
  105781. int infinity;
  105782. } sp_point_384;
  105783. /* The modulus (prime) of the curve P384. */
  105784. static const sp_digit p384_mod[12] = {
  105785. 0xffffffff,0x00000000,0x00000000,0xffffffff,0xfffffffe,0xffffffff,
  105786. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  105787. };
  105788. /* The Montgomery normalizer for modulus of the curve P384. */
  105789. static const sp_digit p384_norm_mod[12] = {
  105790. 0x00000001,0xffffffff,0xffffffff,0x00000000,0x00000001,0x00000000,
  105791. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  105792. };
  105793. /* The Montgomery multiplier for modulus of the curve P384. */
  105794. static sp_digit p384_mp_mod = 0x00000001;
  105795. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  105796. defined(HAVE_ECC_VERIFY)
  105797. /* The order of the curve P384. */
  105798. static const sp_digit p384_order[12] = {
  105799. 0xccc52973,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  105800. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  105801. };
  105802. #endif
  105803. /* The order of the curve P384 minus 2. */
  105804. static const sp_digit p384_order2[12] = {
  105805. 0xccc52971,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  105806. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  105807. };
  105808. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  105809. /* The Montgomery normalizer for order of the curve P384. */
  105810. static const sp_digit p384_norm_order[12] = {
  105811. 0x333ad68d,0x1313e695,0xb74f5885,0xa7e5f24d,0x0bc8d220,0x389cb27e,
  105812. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  105813. };
  105814. #endif
  105815. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  105816. /* The Montgomery multiplier for order of the curve P384. */
  105817. static sp_digit p384_mp_order = 0xe88fdc45;
  105818. #endif
  105819. /* The base point of curve P384. */
  105820. static const sp_point_384 p384_base = {
  105821. /* X ordinate */
  105822. {
  105823. 0x72760ab7,0x3a545e38,0xbf55296c,0x5502f25d,0x82542a38,0x59f741e0,
  105824. 0x8ba79b98,0x6e1d3b62,0xf320ad74,0x8eb1c71e,0xbe8b0537,0xaa87ca22,
  105825. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  105826. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  105827. (sp_digit)0, (sp_digit)0
  105828. },
  105829. /* Y ordinate */
  105830. {
  105831. 0x90ea0e5f,0x7a431d7c,0x1d7e819d,0x0a60b1ce,0xb5f0b8c0,0xe9da3113,
  105832. 0x289a147c,0xf8f41dbd,0x9292dc29,0x5d9e98bf,0x96262c6f,0x3617de4a,
  105833. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  105834. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  105835. (sp_digit)0, (sp_digit)0
  105836. },
  105837. /* Z ordinate */
  105838. {
  105839. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  105840. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  105841. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  105842. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  105843. (sp_digit)0, (sp_digit)0
  105844. },
  105845. /* infinity */
  105846. 0
  105847. };
  105848. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  105849. static const sp_digit p384_b[12] = {
  105850. 0xd3ec2aef,0x2a85c8ed,0x8a2ed19d,0xc656398d,0x5013875a,0x0314088f,
  105851. 0xfe814112,0x181d9c6e,0xe3f82d19,0x988e056b,0xe23ee7e4,0xb3312fa7
  105852. };
  105853. #endif
  105854. /* Multiply a and b into r. (r = a * b)
  105855. *
  105856. * r A single precision integer.
  105857. * a A single precision integer.
  105858. * b A single precision integer.
  105859. */
  105860. SP_NOINLINE static void sp_384_mul_12(sp_digit* r, const sp_digit* a,
  105861. const sp_digit* b)
  105862. {
  105863. sp_digit t[12 * 2];
  105864. sp_digit* tmp = t;
  105865. __asm__ __volatile__ (
  105866. "movs r3, #0\n\t"
  105867. "movs r4, #0\n\t"
  105868. "mov r8, r3\n\t"
  105869. "mov r11, %[tmp]\n\t"
  105870. "mov r9, %[a]\n\t"
  105871. "mov r10, %[b]\n\t"
  105872. "movs r6, #48\n\t"
  105873. "add r6, r6, r9\n\t"
  105874. "mov r12, r6\n\t"
  105875. "\n"
  105876. "L_sp_384_mul_12_words_%=:\n\t"
  105877. "movs %[tmp], #0\n\t"
  105878. "movs r5, #0\n\t"
  105879. "movs r6, #44\n\t"
  105880. "mov %[a], r8\n\t"
  105881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105882. "subs %[a], %[a], r6\n\t"
  105883. #else
  105884. "sub %[a], %[a], r6\n\t"
  105885. #endif
  105886. #ifdef WOLFSSL_KEIL
  105887. "sbcs r6, r6, r6\n\t"
  105888. #elif defined(__clang__)
  105889. "sbcs r6, r6\n\t"
  105890. #else
  105891. "sbc r6, r6\n\t"
  105892. #endif
  105893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105894. "mvns r6, r6\n\t"
  105895. #else
  105896. "mvn r6, r6\n\t"
  105897. #endif
  105898. #ifdef WOLFSSL_KEIL
  105899. "ands %[a], %[a], r6\n\t"
  105900. #elif defined(__clang__)
  105901. "ands %[a], r6\n\t"
  105902. #else
  105903. "and %[a], r6\n\t"
  105904. #endif
  105905. "mov %[b], r8\n\t"
  105906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105907. "subs %[b], %[b], %[a]\n\t"
  105908. #else
  105909. "sub %[b], %[b], %[a]\n\t"
  105910. #endif
  105911. "add %[a], %[a], r9\n\t"
  105912. "add %[b], %[b], r10\n\t"
  105913. "\n"
  105914. "L_sp_384_mul_12_mul_%=:\n\t"
  105915. "# Multiply Start\n\t"
  105916. "ldrh r6, [%[a]]\n\t"
  105917. "ldrh r7, [%[b]]\n\t"
  105918. #ifdef WOLFSSL_KEIL
  105919. "muls r7, r6, r7\n\t"
  105920. #elif defined(__clang__)
  105921. "muls r7, r6\n\t"
  105922. #else
  105923. "mul r7, r6\n\t"
  105924. #endif
  105925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105926. "adds r3, r3, r7\n\t"
  105927. #else
  105928. "add r3, r3, r7\n\t"
  105929. #endif
  105930. #ifdef WOLFSSL_KEIL
  105931. "adcs r4, r4, %[tmp]\n\t"
  105932. #elif defined(__clang__)
  105933. "adcs r4, %[tmp]\n\t"
  105934. #else
  105935. "adc r4, %[tmp]\n\t"
  105936. #endif
  105937. #ifdef WOLFSSL_KEIL
  105938. "adcs r5, r5, %[tmp]\n\t"
  105939. #elif defined(__clang__)
  105940. "adcs r5, %[tmp]\n\t"
  105941. #else
  105942. "adc r5, %[tmp]\n\t"
  105943. #endif
  105944. "ldr r7, [%[b]]\n\t"
  105945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105946. "lsrs r7, r7, #16\n\t"
  105947. #else
  105948. "lsr r7, r7, #16\n\t"
  105949. #endif
  105950. #ifdef WOLFSSL_KEIL
  105951. "muls r6, r7, r6\n\t"
  105952. #elif defined(__clang__)
  105953. "muls r6, r7\n\t"
  105954. #else
  105955. "mul r6, r7\n\t"
  105956. #endif
  105957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105958. "lsrs r7, r6, #16\n\t"
  105959. #else
  105960. "lsr r7, r6, #16\n\t"
  105961. #endif
  105962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105963. "lsls r6, r6, #16\n\t"
  105964. #else
  105965. "lsl r6, r6, #16\n\t"
  105966. #endif
  105967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105968. "adds r3, r3, r6\n\t"
  105969. #else
  105970. "add r3, r3, r6\n\t"
  105971. #endif
  105972. #ifdef WOLFSSL_KEIL
  105973. "adcs r4, r4, r7\n\t"
  105974. #elif defined(__clang__)
  105975. "adcs r4, r7\n\t"
  105976. #else
  105977. "adc r4, r7\n\t"
  105978. #endif
  105979. #ifdef WOLFSSL_KEIL
  105980. "adcs r5, r5, %[tmp]\n\t"
  105981. #elif defined(__clang__)
  105982. "adcs r5, %[tmp]\n\t"
  105983. #else
  105984. "adc r5, %[tmp]\n\t"
  105985. #endif
  105986. "ldr r6, [%[a]]\n\t"
  105987. "ldr r7, [%[b]]\n\t"
  105988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105989. "lsrs r6, r6, #16\n\t"
  105990. #else
  105991. "lsr r6, r6, #16\n\t"
  105992. #endif
  105993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105994. "lsrs r7, r7, #16\n\t"
  105995. #else
  105996. "lsr r7, r7, #16\n\t"
  105997. #endif
  105998. #ifdef WOLFSSL_KEIL
  105999. "muls r7, r6, r7\n\t"
  106000. #elif defined(__clang__)
  106001. "muls r7, r6\n\t"
  106002. #else
  106003. "mul r7, r6\n\t"
  106004. #endif
  106005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106006. "adds r4, r4, r7\n\t"
  106007. #else
  106008. "add r4, r4, r7\n\t"
  106009. #endif
  106010. #ifdef WOLFSSL_KEIL
  106011. "adcs r5, r5, %[tmp]\n\t"
  106012. #elif defined(__clang__)
  106013. "adcs r5, %[tmp]\n\t"
  106014. #else
  106015. "adc r5, %[tmp]\n\t"
  106016. #endif
  106017. "ldrh r7, [%[b]]\n\t"
  106018. #ifdef WOLFSSL_KEIL
  106019. "muls r6, r7, r6\n\t"
  106020. #elif defined(__clang__)
  106021. "muls r6, r7\n\t"
  106022. #else
  106023. "mul r6, r7\n\t"
  106024. #endif
  106025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106026. "lsrs r7, r6, #16\n\t"
  106027. #else
  106028. "lsr r7, r6, #16\n\t"
  106029. #endif
  106030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106031. "lsls r6, r6, #16\n\t"
  106032. #else
  106033. "lsl r6, r6, #16\n\t"
  106034. #endif
  106035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106036. "adds r3, r3, r6\n\t"
  106037. #else
  106038. "add r3, r3, r6\n\t"
  106039. #endif
  106040. #ifdef WOLFSSL_KEIL
  106041. "adcs r4, r4, r7\n\t"
  106042. #elif defined(__clang__)
  106043. "adcs r4, r7\n\t"
  106044. #else
  106045. "adc r4, r7\n\t"
  106046. #endif
  106047. #ifdef WOLFSSL_KEIL
  106048. "adcs r5, r5, %[tmp]\n\t"
  106049. #elif defined(__clang__)
  106050. "adcs r5, %[tmp]\n\t"
  106051. #else
  106052. "adc r5, %[tmp]\n\t"
  106053. #endif
  106054. "# Multiply Done\n\t"
  106055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106056. "adds %[a], %[a], #4\n\t"
  106057. #else
  106058. "add %[a], %[a], #4\n\t"
  106059. #endif
  106060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106061. "subs %[b], %[b], #4\n\t"
  106062. #else
  106063. "sub %[b], %[b], #4\n\t"
  106064. #endif
  106065. "cmp %[a], r12\n\t"
  106066. "beq L_sp_384_mul_12_done_mul_%=\n\t"
  106067. "mov r6, r8\n\t"
  106068. "add r6, r6, r9\n\t"
  106069. "cmp %[a], r6\n\t"
  106070. "ble L_sp_384_mul_12_mul_%=\n\t"
  106071. "\n"
  106072. "L_sp_384_mul_12_done_mul_%=:\n\t"
  106073. "mov %[tmp], r11\n\t"
  106074. "mov r7, r8\n\t"
  106075. "str r3, [%[tmp], r7]\n\t"
  106076. "movs r3, r4\n\t"
  106077. "movs r4, r5\n\t"
  106078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106079. "adds r7, r7, #4\n\t"
  106080. #else
  106081. "add r7, r7, #4\n\t"
  106082. #endif
  106083. "mov r8, r7\n\t"
  106084. "movs r6, #0x58\n\t"
  106085. "cmp r7, r6\n\t"
  106086. "ble L_sp_384_mul_12_words_%=\n\t"
  106087. "str r3, [%[tmp], r7]\n\t"
  106088. "mov %[a], r9\n\t"
  106089. "mov %[b], r10\n\t"
  106090. : [a] "+r" (a), [b] "+r" (b), [tmp] "+r" (tmp)
  106091. :
  106092. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  106093. );
  106094. XMEMCPY(r, t, sizeof(t));
  106095. }
  106096. /* Square a and put result in r. (r = a * a)
  106097. *
  106098. * r A single precision integer.
  106099. * a A single precision integer.
  106100. */
  106101. SP_NOINLINE static void sp_384_sqr_12(sp_digit* r, const sp_digit* a)
  106102. {
  106103. __asm__ __volatile__ (
  106104. "movs r3, #0\n\t"
  106105. "movs r4, #0\n\t"
  106106. "movs r5, #0\n\t"
  106107. "mov r8, r3\n\t"
  106108. "mov r11, %[r]\n\t"
  106109. "movs r6, #0x60\n\t"
  106110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106111. "negs r6, r6\n\t"
  106112. #else
  106113. "neg r6, r6\n\t"
  106114. #endif
  106115. "add sp, sp, r6\n\t"
  106116. "mov r10, sp\n\t"
  106117. "mov r9, %[a]\n\t"
  106118. "\n"
  106119. "L_sp_384_sqr_12_words_%=:\n\t"
  106120. "movs %[r], #0\n\t"
  106121. "movs r6, #44\n\t"
  106122. "mov %[a], r8\n\t"
  106123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106124. "subs %[a], %[a], r6\n\t"
  106125. #else
  106126. "sub %[a], %[a], r6\n\t"
  106127. #endif
  106128. #ifdef WOLFSSL_KEIL
  106129. "sbcs r6, r6, r6\n\t"
  106130. #elif defined(__clang__)
  106131. "sbcs r6, r6\n\t"
  106132. #else
  106133. "sbc r6, r6\n\t"
  106134. #endif
  106135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106136. "mvns r6, r6\n\t"
  106137. #else
  106138. "mvn r6, r6\n\t"
  106139. #endif
  106140. #ifdef WOLFSSL_KEIL
  106141. "ands %[a], %[a], r6\n\t"
  106142. #elif defined(__clang__)
  106143. "ands %[a], r6\n\t"
  106144. #else
  106145. "and %[a], r6\n\t"
  106146. #endif
  106147. "mov r2, r8\n\t"
  106148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106149. "subs r2, r2, %[a]\n\t"
  106150. #else
  106151. "sub r2, r2, %[a]\n\t"
  106152. #endif
  106153. "add %[a], %[a], r9\n\t"
  106154. "add r2, r2, r9\n\t"
  106155. "\n"
  106156. "L_sp_384_sqr_12_mul_%=:\n\t"
  106157. "cmp r2, %[a]\n\t"
  106158. "beq L_sp_384_sqr_12_sqr_%=\n\t"
  106159. "# Multiply * 2: Start\n\t"
  106160. "ldrh r6, [%[a]]\n\t"
  106161. "ldrh r7, [r2]\n\t"
  106162. #ifdef WOLFSSL_KEIL
  106163. "muls r7, r6, r7\n\t"
  106164. #elif defined(__clang__)
  106165. "muls r7, r6\n\t"
  106166. #else
  106167. "mul r7, r6\n\t"
  106168. #endif
  106169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106170. "adds r3, r3, r7\n\t"
  106171. #else
  106172. "add r3, r3, r7\n\t"
  106173. #endif
  106174. #ifdef WOLFSSL_KEIL
  106175. "adcs r4, r4, %[r]\n\t"
  106176. #elif defined(__clang__)
  106177. "adcs r4, %[r]\n\t"
  106178. #else
  106179. "adc r4, %[r]\n\t"
  106180. #endif
  106181. #ifdef WOLFSSL_KEIL
  106182. "adcs r5, r5, %[r]\n\t"
  106183. #elif defined(__clang__)
  106184. "adcs r5, %[r]\n\t"
  106185. #else
  106186. "adc r5, %[r]\n\t"
  106187. #endif
  106188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106189. "adds r3, r3, r7\n\t"
  106190. #else
  106191. "add r3, r3, r7\n\t"
  106192. #endif
  106193. #ifdef WOLFSSL_KEIL
  106194. "adcs r4, r4, %[r]\n\t"
  106195. #elif defined(__clang__)
  106196. "adcs r4, %[r]\n\t"
  106197. #else
  106198. "adc r4, %[r]\n\t"
  106199. #endif
  106200. #ifdef WOLFSSL_KEIL
  106201. "adcs r5, r5, %[r]\n\t"
  106202. #elif defined(__clang__)
  106203. "adcs r5, %[r]\n\t"
  106204. #else
  106205. "adc r5, %[r]\n\t"
  106206. #endif
  106207. "ldr r7, [r2]\n\t"
  106208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106209. "lsrs r7, r7, #16\n\t"
  106210. #else
  106211. "lsr r7, r7, #16\n\t"
  106212. #endif
  106213. #ifdef WOLFSSL_KEIL
  106214. "muls r6, r7, r6\n\t"
  106215. #elif defined(__clang__)
  106216. "muls r6, r7\n\t"
  106217. #else
  106218. "mul r6, r7\n\t"
  106219. #endif
  106220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106221. "lsrs r7, r6, #16\n\t"
  106222. #else
  106223. "lsr r7, r6, #16\n\t"
  106224. #endif
  106225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106226. "lsls r6, r6, #16\n\t"
  106227. #else
  106228. "lsl r6, r6, #16\n\t"
  106229. #endif
  106230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106231. "adds r3, r3, r6\n\t"
  106232. #else
  106233. "add r3, r3, r6\n\t"
  106234. #endif
  106235. #ifdef WOLFSSL_KEIL
  106236. "adcs r4, r4, r7\n\t"
  106237. #elif defined(__clang__)
  106238. "adcs r4, r7\n\t"
  106239. #else
  106240. "adc r4, r7\n\t"
  106241. #endif
  106242. #ifdef WOLFSSL_KEIL
  106243. "adcs r5, r5, %[r]\n\t"
  106244. #elif defined(__clang__)
  106245. "adcs r5, %[r]\n\t"
  106246. #else
  106247. "adc r5, %[r]\n\t"
  106248. #endif
  106249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106250. "adds r3, r3, r6\n\t"
  106251. #else
  106252. "add r3, r3, r6\n\t"
  106253. #endif
  106254. #ifdef WOLFSSL_KEIL
  106255. "adcs r4, r4, r7\n\t"
  106256. #elif defined(__clang__)
  106257. "adcs r4, r7\n\t"
  106258. #else
  106259. "adc r4, r7\n\t"
  106260. #endif
  106261. #ifdef WOLFSSL_KEIL
  106262. "adcs r5, r5, %[r]\n\t"
  106263. #elif defined(__clang__)
  106264. "adcs r5, %[r]\n\t"
  106265. #else
  106266. "adc r5, %[r]\n\t"
  106267. #endif
  106268. "ldr r6, [%[a]]\n\t"
  106269. "ldr r7, [r2]\n\t"
  106270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106271. "lsrs r6, r6, #16\n\t"
  106272. #else
  106273. "lsr r6, r6, #16\n\t"
  106274. #endif
  106275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106276. "lsrs r7, r7, #16\n\t"
  106277. #else
  106278. "lsr r7, r7, #16\n\t"
  106279. #endif
  106280. #ifdef WOLFSSL_KEIL
  106281. "muls r7, r6, r7\n\t"
  106282. #elif defined(__clang__)
  106283. "muls r7, r6\n\t"
  106284. #else
  106285. "mul r7, r6\n\t"
  106286. #endif
  106287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106288. "adds r4, r4, r7\n\t"
  106289. #else
  106290. "add r4, r4, r7\n\t"
  106291. #endif
  106292. #ifdef WOLFSSL_KEIL
  106293. "adcs r5, r5, %[r]\n\t"
  106294. #elif defined(__clang__)
  106295. "adcs r5, %[r]\n\t"
  106296. #else
  106297. "adc r5, %[r]\n\t"
  106298. #endif
  106299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106300. "adds r4, r4, r7\n\t"
  106301. #else
  106302. "add r4, r4, r7\n\t"
  106303. #endif
  106304. #ifdef WOLFSSL_KEIL
  106305. "adcs r5, r5, %[r]\n\t"
  106306. #elif defined(__clang__)
  106307. "adcs r5, %[r]\n\t"
  106308. #else
  106309. "adc r5, %[r]\n\t"
  106310. #endif
  106311. "ldrh r7, [r2]\n\t"
  106312. #ifdef WOLFSSL_KEIL
  106313. "muls r6, r7, r6\n\t"
  106314. #elif defined(__clang__)
  106315. "muls r6, r7\n\t"
  106316. #else
  106317. "mul r6, r7\n\t"
  106318. #endif
  106319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106320. "lsrs r7, r6, #16\n\t"
  106321. #else
  106322. "lsr r7, r6, #16\n\t"
  106323. #endif
  106324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106325. "lsls r6, r6, #16\n\t"
  106326. #else
  106327. "lsl r6, r6, #16\n\t"
  106328. #endif
  106329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106330. "adds r3, r3, r6\n\t"
  106331. #else
  106332. "add r3, r3, r6\n\t"
  106333. #endif
  106334. #ifdef WOLFSSL_KEIL
  106335. "adcs r4, r4, r7\n\t"
  106336. #elif defined(__clang__)
  106337. "adcs r4, r7\n\t"
  106338. #else
  106339. "adc r4, r7\n\t"
  106340. #endif
  106341. #ifdef WOLFSSL_KEIL
  106342. "adcs r5, r5, %[r]\n\t"
  106343. #elif defined(__clang__)
  106344. "adcs r5, %[r]\n\t"
  106345. #else
  106346. "adc r5, %[r]\n\t"
  106347. #endif
  106348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106349. "adds r3, r3, r6\n\t"
  106350. #else
  106351. "add r3, r3, r6\n\t"
  106352. #endif
  106353. #ifdef WOLFSSL_KEIL
  106354. "adcs r4, r4, r7\n\t"
  106355. #elif defined(__clang__)
  106356. "adcs r4, r7\n\t"
  106357. #else
  106358. "adc r4, r7\n\t"
  106359. #endif
  106360. #ifdef WOLFSSL_KEIL
  106361. "adcs r5, r5, %[r]\n\t"
  106362. #elif defined(__clang__)
  106363. "adcs r5, %[r]\n\t"
  106364. #else
  106365. "adc r5, %[r]\n\t"
  106366. #endif
  106367. "# Multiply * 2: Done\n\t"
  106368. "bal L_sp_384_sqr_12_done_sqr_%=\n\t"
  106369. "\n"
  106370. "L_sp_384_sqr_12_sqr_%=:\n\t"
  106371. "mov r12, r2\n\t"
  106372. "ldr r2, [%[a]]\n\t"
  106373. "# Square: Start\n\t"
  106374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106375. "lsrs r7, r2, #16\n\t"
  106376. #else
  106377. "lsr r7, r2, #16\n\t"
  106378. #endif
  106379. "uxth r6, r2\n\t"
  106380. #ifdef WOLFSSL_KEIL
  106381. "muls r6, r6, r6\n\t"
  106382. #elif defined(__clang__)
  106383. "muls r6, r6\n\t"
  106384. #else
  106385. "mul r6, r6\n\t"
  106386. #endif
  106387. #ifdef WOLFSSL_KEIL
  106388. "muls r7, r7, r7\n\t"
  106389. #elif defined(__clang__)
  106390. "muls r7, r7\n\t"
  106391. #else
  106392. "mul r7, r7\n\t"
  106393. #endif
  106394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106395. "adds r3, r3, r6\n\t"
  106396. #else
  106397. "add r3, r3, r6\n\t"
  106398. #endif
  106399. #ifdef WOLFSSL_KEIL
  106400. "adcs r4, r4, r7\n\t"
  106401. #elif defined(__clang__)
  106402. "adcs r4, r7\n\t"
  106403. #else
  106404. "adc r4, r7\n\t"
  106405. #endif
  106406. #ifdef WOLFSSL_KEIL
  106407. "adcs r5, r5, %[r]\n\t"
  106408. #elif defined(__clang__)
  106409. "adcs r5, %[r]\n\t"
  106410. #else
  106411. "adc r5, %[r]\n\t"
  106412. #endif
  106413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106414. "lsrs r7, r2, #16\n\t"
  106415. #else
  106416. "lsr r7, r2, #16\n\t"
  106417. #endif
  106418. "uxth r6, r2\n\t"
  106419. #ifdef WOLFSSL_KEIL
  106420. "muls r6, r7, r6\n\t"
  106421. #elif defined(__clang__)
  106422. "muls r6, r7\n\t"
  106423. #else
  106424. "mul r6, r7\n\t"
  106425. #endif
  106426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106427. "lsrs r7, r6, #15\n\t"
  106428. #else
  106429. "lsr r7, r6, #15\n\t"
  106430. #endif
  106431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106432. "lsls r6, r6, #17\n\t"
  106433. #else
  106434. "lsl r6, r6, #17\n\t"
  106435. #endif
  106436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106437. "adds r3, r3, r6\n\t"
  106438. #else
  106439. "add r3, r3, r6\n\t"
  106440. #endif
  106441. #ifdef WOLFSSL_KEIL
  106442. "adcs r4, r4, r7\n\t"
  106443. #elif defined(__clang__)
  106444. "adcs r4, r7\n\t"
  106445. #else
  106446. "adc r4, r7\n\t"
  106447. #endif
  106448. #ifdef WOLFSSL_KEIL
  106449. "adcs r5, r5, %[r]\n\t"
  106450. #elif defined(__clang__)
  106451. "adcs r5, %[r]\n\t"
  106452. #else
  106453. "adc r5, %[r]\n\t"
  106454. #endif
  106455. "# Square: Done\n\t"
  106456. "mov r2, r12\n\t"
  106457. "\n"
  106458. "L_sp_384_sqr_12_done_sqr_%=:\n\t"
  106459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106460. "adds %[a], %[a], #4\n\t"
  106461. #else
  106462. "add %[a], %[a], #4\n\t"
  106463. #endif
  106464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106465. "subs r2, r2, #4\n\t"
  106466. #else
  106467. "sub r2, r2, #4\n\t"
  106468. #endif
  106469. "movs r6, #48\n\t"
  106470. "add r6, r6, r9\n\t"
  106471. "cmp %[a], r6\n\t"
  106472. "beq L_sp_384_sqr_12_done_mul_%=\n\t"
  106473. "cmp %[a], r2\n\t"
  106474. "bgt L_sp_384_sqr_12_done_mul_%=\n\t"
  106475. "mov r7, r8\n\t"
  106476. "add r7, r7, r9\n\t"
  106477. "cmp %[a], r7\n\t"
  106478. "ble L_sp_384_sqr_12_mul_%=\n\t"
  106479. "\n"
  106480. "L_sp_384_sqr_12_done_mul_%=:\n\t"
  106481. "mov %[r], r10\n\t"
  106482. "mov r7, r8\n\t"
  106483. "str r3, [%[r], r7]\n\t"
  106484. "movs r3, r4\n\t"
  106485. "movs r4, r5\n\t"
  106486. "movs r5, #0\n\t"
  106487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106488. "adds r7, r7, #4\n\t"
  106489. #else
  106490. "add r7, r7, #4\n\t"
  106491. #endif
  106492. "mov r8, r7\n\t"
  106493. "movs r6, #0x58\n\t"
  106494. "cmp r7, r6\n\t"
  106495. "ble L_sp_384_sqr_12_words_%=\n\t"
  106496. "mov %[a], r9\n\t"
  106497. "str r3, [%[r], r7]\n\t"
  106498. "mov %[r], r11\n\t"
  106499. "mov %[a], r10\n\t"
  106500. "movs r3, #0x5c\n\t"
  106501. "\n"
  106502. "L_sp_384_sqr_12_store_%=:\n\t"
  106503. "ldr r6, [%[a], r3]\n\t"
  106504. "str r6, [%[r], r3]\n\t"
  106505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106506. "subs r3, r3, #4\n\t"
  106507. #else
  106508. "sub r3, r3, #4\n\t"
  106509. #endif
  106510. "bge L_sp_384_sqr_12_store_%=\n\t"
  106511. "movs r6, #0x60\n\t"
  106512. "add sp, sp, r6\n\t"
  106513. : [r] "+r" (r), [a] "+r" (a)
  106514. :
  106515. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  106516. );
  106517. }
  106518. #ifdef WOLFSSL_SP_SMALL
  106519. /* Add b to a into r. (r = a + b)
  106520. *
  106521. * r A single precision integer.
  106522. * a A single precision integer.
  106523. * b A single precision integer.
  106524. */
  106525. SP_NOINLINE static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a,
  106526. const sp_digit* b)
  106527. {
  106528. __asm__ __volatile__ (
  106529. "movs r6, %[a]\n\t"
  106530. "movs r7, #0\n\t"
  106531. "movs r3, #0\n\t"
  106532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106533. "adds r6, r6, #48\n\t"
  106534. #else
  106535. "add r6, r6, #48\n\t"
  106536. #endif
  106537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106538. "subs r7, r7, #1\n\t"
  106539. #else
  106540. "sub r7, r7, #1\n\t"
  106541. #endif
  106542. "\n"
  106543. "L_sp_384_add_12_word_%=:\n\t"
  106544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106545. "adds r3, r3, r7\n\t"
  106546. #else
  106547. "add r3, r3, r7\n\t"
  106548. #endif
  106549. "ldr r4, [%[a]]\n\t"
  106550. "ldr r5, [%[b]]\n\t"
  106551. #ifdef WOLFSSL_KEIL
  106552. "adcs r4, r4, r5\n\t"
  106553. #elif defined(__clang__)
  106554. "adcs r4, r5\n\t"
  106555. #else
  106556. "adc r4, r5\n\t"
  106557. #endif
  106558. "str r4, [%[r]]\n\t"
  106559. "movs r3, #0\n\t"
  106560. #ifdef WOLFSSL_KEIL
  106561. "adcs r3, r3, r3\n\t"
  106562. #elif defined(__clang__)
  106563. "adcs r3, r3\n\t"
  106564. #else
  106565. "adc r3, r3\n\t"
  106566. #endif
  106567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106568. "adds %[a], %[a], #4\n\t"
  106569. #else
  106570. "add %[a], %[a], #4\n\t"
  106571. #endif
  106572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106573. "adds %[b], %[b], #4\n\t"
  106574. #else
  106575. "add %[b], %[b], #4\n\t"
  106576. #endif
  106577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106578. "adds %[r], %[r], #4\n\t"
  106579. #else
  106580. "add %[r], %[r], #4\n\t"
  106581. #endif
  106582. "cmp %[a], r6\n\t"
  106583. "bne L_sp_384_add_12_word_%=\n\t"
  106584. "movs %[r], r3\n\t"
  106585. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  106586. :
  106587. : "memory", "r3", "r4", "r5", "r6", "r7"
  106588. );
  106589. return (uint32_t)(size_t)r;
  106590. }
  106591. #else
  106592. /* Add b to a into r. (r = a + b)
  106593. *
  106594. * r A single precision integer.
  106595. * a A single precision integer.
  106596. * b A single precision integer.
  106597. */
  106598. SP_NOINLINE static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a,
  106599. const sp_digit* b)
  106600. {
  106601. __asm__ __volatile__ (
  106602. "ldm %[b]!, {r5, r6}\n\t"
  106603. "ldm %[a]!, {r3, r4}\n\t"
  106604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106605. "adds r3, r3, r5\n\t"
  106606. #else
  106607. "add r3, r3, r5\n\t"
  106608. #endif
  106609. #ifdef WOLFSSL_KEIL
  106610. "adcs r4, r4, r6\n\t"
  106611. #elif defined(__clang__)
  106612. "adcs r4, r6\n\t"
  106613. #else
  106614. "adc r4, r6\n\t"
  106615. #endif
  106616. "stm %[r]!, {r3, r4}\n\t"
  106617. "ldm %[b]!, {r5, r6}\n\t"
  106618. "ldm %[a]!, {r3, r4}\n\t"
  106619. #ifdef WOLFSSL_KEIL
  106620. "adcs r3, r3, r5\n\t"
  106621. #elif defined(__clang__)
  106622. "adcs r3, r5\n\t"
  106623. #else
  106624. "adc r3, r5\n\t"
  106625. #endif
  106626. #ifdef WOLFSSL_KEIL
  106627. "adcs r4, r4, r6\n\t"
  106628. #elif defined(__clang__)
  106629. "adcs r4, r6\n\t"
  106630. #else
  106631. "adc r4, r6\n\t"
  106632. #endif
  106633. "stm %[r]!, {r3, r4}\n\t"
  106634. "ldm %[b]!, {r5, r6}\n\t"
  106635. "ldm %[a]!, {r3, r4}\n\t"
  106636. #ifdef WOLFSSL_KEIL
  106637. "adcs r3, r3, r5\n\t"
  106638. #elif defined(__clang__)
  106639. "adcs r3, r5\n\t"
  106640. #else
  106641. "adc r3, r5\n\t"
  106642. #endif
  106643. #ifdef WOLFSSL_KEIL
  106644. "adcs r4, r4, r6\n\t"
  106645. #elif defined(__clang__)
  106646. "adcs r4, r6\n\t"
  106647. #else
  106648. "adc r4, r6\n\t"
  106649. #endif
  106650. "stm %[r]!, {r3, r4}\n\t"
  106651. "ldm %[b]!, {r5, r6}\n\t"
  106652. "ldm %[a]!, {r3, r4}\n\t"
  106653. #ifdef WOLFSSL_KEIL
  106654. "adcs r3, r3, r5\n\t"
  106655. #elif defined(__clang__)
  106656. "adcs r3, r5\n\t"
  106657. #else
  106658. "adc r3, r5\n\t"
  106659. #endif
  106660. #ifdef WOLFSSL_KEIL
  106661. "adcs r4, r4, r6\n\t"
  106662. #elif defined(__clang__)
  106663. "adcs r4, r6\n\t"
  106664. #else
  106665. "adc r4, r6\n\t"
  106666. #endif
  106667. "stm %[r]!, {r3, r4}\n\t"
  106668. "ldm %[b]!, {r5, r6}\n\t"
  106669. "ldm %[a]!, {r3, r4}\n\t"
  106670. #ifdef WOLFSSL_KEIL
  106671. "adcs r3, r3, r5\n\t"
  106672. #elif defined(__clang__)
  106673. "adcs r3, r5\n\t"
  106674. #else
  106675. "adc r3, r5\n\t"
  106676. #endif
  106677. #ifdef WOLFSSL_KEIL
  106678. "adcs r4, r4, r6\n\t"
  106679. #elif defined(__clang__)
  106680. "adcs r4, r6\n\t"
  106681. #else
  106682. "adc r4, r6\n\t"
  106683. #endif
  106684. "stm %[r]!, {r3, r4}\n\t"
  106685. "ldm %[b]!, {r5, r6}\n\t"
  106686. "ldm %[a]!, {r3, r4}\n\t"
  106687. #ifdef WOLFSSL_KEIL
  106688. "adcs r3, r3, r5\n\t"
  106689. #elif defined(__clang__)
  106690. "adcs r3, r5\n\t"
  106691. #else
  106692. "adc r3, r5\n\t"
  106693. #endif
  106694. #ifdef WOLFSSL_KEIL
  106695. "adcs r4, r4, r6\n\t"
  106696. #elif defined(__clang__)
  106697. "adcs r4, r6\n\t"
  106698. #else
  106699. "adc r4, r6\n\t"
  106700. #endif
  106701. "stm %[r]!, {r3, r4}\n\t"
  106702. "movs %[r], #0\n\t"
  106703. #ifdef WOLFSSL_KEIL
  106704. "adcs %[r], %[r], %[r]\n\t"
  106705. #elif defined(__clang__)
  106706. "adcs %[r], %[r]\n\t"
  106707. #else
  106708. "adc %[r], %[r]\n\t"
  106709. #endif
  106710. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  106711. :
  106712. : "memory", "r3", "r4", "r5", "r6"
  106713. );
  106714. return (uint32_t)(size_t)r;
  106715. }
  106716. #endif /* WOLFSSL_SP_SMALL */
  106717. #ifdef WOLFSSL_SP_SMALL
  106718. /* Sub b from a into r. (r = a - b)
  106719. *
  106720. * r A single precision integer.
  106721. * a A single precision integer.
  106722. * b A single precision integer.
  106723. */
  106724. SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a,
  106725. const sp_digit* b)
  106726. {
  106727. __asm__ __volatile__ (
  106728. "movs r6, %[a]\n\t"
  106729. "movs r3, #0\n\t"
  106730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106731. "adds r6, r6, #48\n\t"
  106732. #else
  106733. "add r6, r6, #48\n\t"
  106734. #endif
  106735. "\n"
  106736. "L_sp_384_sub_12_word_%=:\n\t"
  106737. "movs r5, #0\n\t"
  106738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106739. "subs r5, r5, r3\n\t"
  106740. #else
  106741. "sub r5, r5, r3\n\t"
  106742. #endif
  106743. "ldr r4, [%[a]]\n\t"
  106744. "ldr r5, [%[b]]\n\t"
  106745. #ifdef WOLFSSL_KEIL
  106746. "sbcs r4, r4, r5\n\t"
  106747. #elif defined(__clang__)
  106748. "sbcs r4, r5\n\t"
  106749. #else
  106750. "sbc r4, r5\n\t"
  106751. #endif
  106752. "str r4, [%[r]]\n\t"
  106753. #ifdef WOLFSSL_KEIL
  106754. "sbcs r3, r3, r3\n\t"
  106755. #elif defined(__clang__)
  106756. "sbcs r3, r3\n\t"
  106757. #else
  106758. "sbc r3, r3\n\t"
  106759. #endif
  106760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106761. "adds %[a], %[a], #4\n\t"
  106762. #else
  106763. "add %[a], %[a], #4\n\t"
  106764. #endif
  106765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106766. "adds %[b], %[b], #4\n\t"
  106767. #else
  106768. "add %[b], %[b], #4\n\t"
  106769. #endif
  106770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106771. "adds %[r], %[r], #4\n\t"
  106772. #else
  106773. "add %[r], %[r], #4\n\t"
  106774. #endif
  106775. "cmp %[a], r6\n\t"
  106776. "bne L_sp_384_sub_12_word_%=\n\t"
  106777. "movs %[r], r3\n\t"
  106778. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  106779. :
  106780. : "memory", "r3", "r4", "r5", "r6"
  106781. );
  106782. return (uint32_t)(size_t)r;
  106783. }
  106784. #else
  106785. /* Sub b from a into r. (r = a - b)
  106786. *
  106787. * r A single precision integer.
  106788. * a A single precision integer.
  106789. * b A single precision integer.
  106790. */
  106791. SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a,
  106792. const sp_digit* b)
  106793. {
  106794. __asm__ __volatile__ (
  106795. "ldm %[b]!, {r5, r6}\n\t"
  106796. "ldm %[a]!, {r3, r4}\n\t"
  106797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106798. "subs r3, r3, r5\n\t"
  106799. #else
  106800. "sub r3, r3, r5\n\t"
  106801. #endif
  106802. #ifdef WOLFSSL_KEIL
  106803. "sbcs r4, r4, r6\n\t"
  106804. #elif defined(__clang__)
  106805. "sbcs r4, r6\n\t"
  106806. #else
  106807. "sbc r4, r6\n\t"
  106808. #endif
  106809. "stm %[r]!, {r3, r4}\n\t"
  106810. "ldm %[b]!, {r5, r6}\n\t"
  106811. "ldm %[a]!, {r3, r4}\n\t"
  106812. #ifdef WOLFSSL_KEIL
  106813. "sbcs r3, r3, r5\n\t"
  106814. #elif defined(__clang__)
  106815. "sbcs r3, r5\n\t"
  106816. #else
  106817. "sbc r3, r5\n\t"
  106818. #endif
  106819. #ifdef WOLFSSL_KEIL
  106820. "sbcs r4, r4, r6\n\t"
  106821. #elif defined(__clang__)
  106822. "sbcs r4, r6\n\t"
  106823. #else
  106824. "sbc r4, r6\n\t"
  106825. #endif
  106826. "stm %[r]!, {r3, r4}\n\t"
  106827. "ldm %[b]!, {r5, r6}\n\t"
  106828. "ldm %[a]!, {r3, r4}\n\t"
  106829. #ifdef WOLFSSL_KEIL
  106830. "sbcs r3, r3, r5\n\t"
  106831. #elif defined(__clang__)
  106832. "sbcs r3, r5\n\t"
  106833. #else
  106834. "sbc r3, r5\n\t"
  106835. #endif
  106836. #ifdef WOLFSSL_KEIL
  106837. "sbcs r4, r4, r6\n\t"
  106838. #elif defined(__clang__)
  106839. "sbcs r4, r6\n\t"
  106840. #else
  106841. "sbc r4, r6\n\t"
  106842. #endif
  106843. "stm %[r]!, {r3, r4}\n\t"
  106844. "ldm %[b]!, {r5, r6}\n\t"
  106845. "ldm %[a]!, {r3, r4}\n\t"
  106846. #ifdef WOLFSSL_KEIL
  106847. "sbcs r3, r3, r5\n\t"
  106848. #elif defined(__clang__)
  106849. "sbcs r3, r5\n\t"
  106850. #else
  106851. "sbc r3, r5\n\t"
  106852. #endif
  106853. #ifdef WOLFSSL_KEIL
  106854. "sbcs r4, r4, r6\n\t"
  106855. #elif defined(__clang__)
  106856. "sbcs r4, r6\n\t"
  106857. #else
  106858. "sbc r4, r6\n\t"
  106859. #endif
  106860. "stm %[r]!, {r3, r4}\n\t"
  106861. "ldm %[b]!, {r5, r6}\n\t"
  106862. "ldm %[a]!, {r3, r4}\n\t"
  106863. #ifdef WOLFSSL_KEIL
  106864. "sbcs r3, r3, r5\n\t"
  106865. #elif defined(__clang__)
  106866. "sbcs r3, r5\n\t"
  106867. #else
  106868. "sbc r3, r5\n\t"
  106869. #endif
  106870. #ifdef WOLFSSL_KEIL
  106871. "sbcs r4, r4, r6\n\t"
  106872. #elif defined(__clang__)
  106873. "sbcs r4, r6\n\t"
  106874. #else
  106875. "sbc r4, r6\n\t"
  106876. #endif
  106877. "stm %[r]!, {r3, r4}\n\t"
  106878. "ldm %[b]!, {r5, r6}\n\t"
  106879. "ldm %[a]!, {r3, r4}\n\t"
  106880. #ifdef WOLFSSL_KEIL
  106881. "sbcs r3, r3, r5\n\t"
  106882. #elif defined(__clang__)
  106883. "sbcs r3, r5\n\t"
  106884. #else
  106885. "sbc r3, r5\n\t"
  106886. #endif
  106887. #ifdef WOLFSSL_KEIL
  106888. "sbcs r4, r4, r6\n\t"
  106889. #elif defined(__clang__)
  106890. "sbcs r4, r6\n\t"
  106891. #else
  106892. "sbc r4, r6\n\t"
  106893. #endif
  106894. "stm %[r]!, {r3, r4}\n\t"
  106895. #ifdef WOLFSSL_KEIL
  106896. "sbcs %[r], %[r], %[r]\n\t"
  106897. #elif defined(__clang__)
  106898. "sbcs %[r], %[r]\n\t"
  106899. #else
  106900. "sbc %[r], %[r]\n\t"
  106901. #endif
  106902. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  106903. :
  106904. : "memory", "r3", "r4", "r5", "r6"
  106905. );
  106906. return (uint32_t)(size_t)r;
  106907. }
  106908. #endif /* WOLFSSL_SP_SMALL */
  106909. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  106910. *
  106911. * r The resulting Montgomery form number.
  106912. * a The number to convert.
  106913. * m The modulus (prime).
  106914. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  106915. */
  106916. static int sp_384_mod_mul_norm_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  106917. {
  106918. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106919. int64_t* t = NULL;
  106920. #else
  106921. int64_t t[12];
  106922. #endif
  106923. int64_t o;
  106924. int err = MP_OKAY;
  106925. (void)m;
  106926. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106927. t = (int64_t*)XMALLOC(sizeof(int64_t) * 12, NULL, DYNAMIC_TYPE_ECC);
  106928. if (t == NULL) {
  106929. err = MEMORY_E;
  106930. }
  106931. #endif
  106932. if (err == MP_OKAY) {
  106933. /* 1 0 0 0 0 0 0 0 1 1 0 -1 */
  106934. t[0] = 0 + (int64_t)a[0] + (int64_t)a[8] + (int64_t)a[9] - (int64_t)a[11];
  106935. /* -1 1 0 0 0 0 0 0 -1 0 1 1 */
  106936. t[1] = 0 - (int64_t)a[0] + (int64_t)a[1] - (int64_t)a[8] + (int64_t)a[10] + (int64_t)a[11];
  106937. /* 0 -1 1 0 0 0 0 0 0 -1 0 1 */
  106938. t[2] = 0 - (int64_t)a[1] + (int64_t)a[2] - (int64_t)a[9] + (int64_t)a[11];
  106939. /* 1 0 -1 1 0 0 0 0 1 1 -1 -1 */
  106940. 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];
  106941. /* 1 1 0 -1 1 0 0 0 1 2 1 -2 */
  106942. 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];
  106943. /* 0 1 1 0 -1 1 0 0 0 1 2 1 */
  106944. 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];
  106945. /* 0 0 1 1 0 -1 1 0 0 0 1 2 */
  106946. 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];
  106947. /* 0 0 0 1 1 0 -1 1 0 0 0 1 */
  106948. t[7] = 0 + (int64_t)a[3] + (int64_t)a[4] - (int64_t)a[6] + (int64_t)a[7] + (int64_t)a[11];
  106949. /* 0 0 0 0 1 1 0 -1 1 0 0 0 */
  106950. t[8] = 0 + (int64_t)a[4] + (int64_t)a[5] - (int64_t)a[7] + (int64_t)a[8];
  106951. /* 0 0 0 0 0 1 1 0 -1 1 0 0 */
  106952. t[9] = 0 + (int64_t)a[5] + (int64_t)a[6] - (int64_t)a[8] + (int64_t)a[9];
  106953. /* 0 0 0 0 0 0 1 1 0 -1 1 0 */
  106954. t[10] = 0 + (int64_t)a[6] + (int64_t)a[7] - (int64_t)a[9] + (int64_t)a[10];
  106955. /* 0 0 0 0 0 0 0 1 1 0 -1 1 */
  106956. t[11] = 0 + (int64_t)a[7] + (int64_t)a[8] - (int64_t)a[10] + (int64_t)a[11];
  106957. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  106958. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  106959. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  106960. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  106961. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  106962. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  106963. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  106964. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  106965. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  106966. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  106967. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  106968. o = t[11] >> 32; t[11] &= 0xffffffff;
  106969. t[0] += o;
  106970. t[1] -= o;
  106971. t[3] += o;
  106972. t[4] += o;
  106973. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  106974. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  106975. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  106976. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  106977. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  106978. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  106979. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  106980. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  106981. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  106982. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  106983. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  106984. r[0] = t[0];
  106985. r[1] = t[1];
  106986. r[2] = t[2];
  106987. r[3] = t[3];
  106988. r[4] = t[4];
  106989. r[5] = t[5];
  106990. r[6] = t[6];
  106991. r[7] = t[7];
  106992. r[8] = t[8];
  106993. r[9] = t[9];
  106994. r[10] = t[10];
  106995. r[11] = t[11];
  106996. }
  106997. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106998. if (t != NULL)
  106999. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  107000. #endif
  107001. return err;
  107002. }
  107003. /* Convert an mp_int to an array of sp_digit.
  107004. *
  107005. * r A single precision integer.
  107006. * size Maximum number of bytes to convert
  107007. * a A multi-precision integer.
  107008. */
  107009. static void sp_384_from_mp(sp_digit* r, int size, const mp_int* a)
  107010. {
  107011. #if DIGIT_BIT == 32
  107012. int j;
  107013. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  107014. for (j = a->used; j < size; j++) {
  107015. r[j] = 0;
  107016. }
  107017. #elif DIGIT_BIT > 32
  107018. int i;
  107019. int j = 0;
  107020. word32 s = 0;
  107021. r[0] = 0;
  107022. for (i = 0; i < a->used && j < size; i++) {
  107023. r[j] |= ((sp_digit)a->dp[i] << s);
  107024. r[j] &= 0xffffffff;
  107025. s = 32U - s;
  107026. if (j + 1 >= size) {
  107027. break;
  107028. }
  107029. /* lint allow cast of mismatch word32 and mp_digit */
  107030. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  107031. while ((s + 32U) <= (word32)DIGIT_BIT) {
  107032. s += 32U;
  107033. r[j] &= 0xffffffff;
  107034. if (j + 1 >= size) {
  107035. break;
  107036. }
  107037. if (s < (word32)DIGIT_BIT) {
  107038. /* lint allow cast of mismatch word32 and mp_digit */
  107039. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  107040. }
  107041. else {
  107042. r[++j] = (sp_digit)0;
  107043. }
  107044. }
  107045. s = (word32)DIGIT_BIT - s;
  107046. }
  107047. for (j++; j < size; j++) {
  107048. r[j] = 0;
  107049. }
  107050. #else
  107051. int i;
  107052. int j = 0;
  107053. int s = 0;
  107054. r[0] = 0;
  107055. for (i = 0; i < a->used && j < size; i++) {
  107056. r[j] |= ((sp_digit)a->dp[i]) << s;
  107057. if (s + DIGIT_BIT >= 32) {
  107058. r[j] &= 0xffffffff;
  107059. if (j + 1 >= size) {
  107060. break;
  107061. }
  107062. s = 32 - s;
  107063. if (s == DIGIT_BIT) {
  107064. r[++j] = 0;
  107065. s = 0;
  107066. }
  107067. else {
  107068. r[++j] = a->dp[i] >> s;
  107069. s = DIGIT_BIT - s;
  107070. }
  107071. }
  107072. else {
  107073. s += DIGIT_BIT;
  107074. }
  107075. }
  107076. for (j++; j < size; j++) {
  107077. r[j] = 0;
  107078. }
  107079. #endif
  107080. }
  107081. /* Convert a point of type ecc_point to type sp_point_384.
  107082. *
  107083. * p Point of type sp_point_384 (result).
  107084. * pm Point of type ecc_point.
  107085. */
  107086. static void sp_384_point_from_ecc_point_12(sp_point_384* p,
  107087. const ecc_point* pm)
  107088. {
  107089. XMEMSET(p->x, 0, sizeof(p->x));
  107090. XMEMSET(p->y, 0, sizeof(p->y));
  107091. XMEMSET(p->z, 0, sizeof(p->z));
  107092. sp_384_from_mp(p->x, 12, pm->x);
  107093. sp_384_from_mp(p->y, 12, pm->y);
  107094. sp_384_from_mp(p->z, 12, pm->z);
  107095. p->infinity = 0;
  107096. }
  107097. /* Convert an array of sp_digit to an mp_int.
  107098. *
  107099. * a A single precision integer.
  107100. * r A multi-precision integer.
  107101. */
  107102. static int sp_384_to_mp(const sp_digit* a, mp_int* r)
  107103. {
  107104. int err;
  107105. err = mp_grow(r, (384 + DIGIT_BIT - 1) / DIGIT_BIT);
  107106. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  107107. #if DIGIT_BIT == 32
  107108. XMEMCPY(r->dp, a, sizeof(sp_digit) * 12);
  107109. r->used = 12;
  107110. mp_clamp(r);
  107111. #elif DIGIT_BIT < 32
  107112. int i;
  107113. int j = 0;
  107114. int s = 0;
  107115. r->dp[0] = 0;
  107116. for (i = 0; i < 12; i++) {
  107117. r->dp[j] |= (mp_digit)(a[i] << s);
  107118. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  107119. s = DIGIT_BIT - s;
  107120. r->dp[++j] = (mp_digit)(a[i] >> s);
  107121. while (s + DIGIT_BIT <= 32) {
  107122. s += DIGIT_BIT;
  107123. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  107124. if (s == SP_WORD_SIZE) {
  107125. r->dp[j] = 0;
  107126. }
  107127. else {
  107128. r->dp[j] = (mp_digit)(a[i] >> s);
  107129. }
  107130. }
  107131. s = 32 - s;
  107132. }
  107133. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  107134. mp_clamp(r);
  107135. #else
  107136. int i;
  107137. int j = 0;
  107138. int s = 0;
  107139. r->dp[0] = 0;
  107140. for (i = 0; i < 12; i++) {
  107141. r->dp[j] |= ((mp_digit)a[i]) << s;
  107142. if (s + 32 >= DIGIT_BIT) {
  107143. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  107144. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  107145. #endif
  107146. s = DIGIT_BIT - s;
  107147. r->dp[++j] = a[i] >> s;
  107148. s = 32 - s;
  107149. }
  107150. else {
  107151. s += 32;
  107152. }
  107153. }
  107154. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  107155. mp_clamp(r);
  107156. #endif
  107157. }
  107158. return err;
  107159. }
  107160. /* Convert a point of type sp_point_384 to type ecc_point.
  107161. *
  107162. * p Point of type sp_point_384.
  107163. * pm Point of type ecc_point (result).
  107164. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  107165. * MP_OKAY.
  107166. */
  107167. static int sp_384_point_to_ecc_point_12(const sp_point_384* p, ecc_point* pm)
  107168. {
  107169. int err;
  107170. err = sp_384_to_mp(p->x, pm->x);
  107171. if (err == MP_OKAY) {
  107172. err = sp_384_to_mp(p->y, pm->y);
  107173. }
  107174. if (err == MP_OKAY) {
  107175. err = sp_384_to_mp(p->z, pm->z);
  107176. }
  107177. return err;
  107178. }
  107179. /* Conditionally subtract b from a using the mask m.
  107180. * m is -1 to subtract and 0 when not copying.
  107181. *
  107182. * r A single precision number representing condition subtract result.
  107183. * a A single precision number to subtract from.
  107184. * b A single precision number to subtract.
  107185. * m Mask value to apply.
  107186. */
  107187. SP_NOINLINE static sp_digit sp_384_cond_sub_12(sp_digit* r, const sp_digit* a,
  107188. const sp_digit* b, sp_digit m)
  107189. {
  107190. __asm__ __volatile__ (
  107191. "movs r4, #0\n\t"
  107192. "movs r5, #48\n\t"
  107193. "mov r8, r5\n\t"
  107194. "movs r7, #0\n\t"
  107195. "\n"
  107196. "L_sp_384_cond_sub_12_words_%=:\n\t"
  107197. "ldr r6, [%[b], r7]\n\t"
  107198. #ifdef WOLFSSL_KEIL
  107199. "ands r6, r6, %[m]\n\t"
  107200. #elif defined(__clang__)
  107201. "ands r6, %[m]\n\t"
  107202. #else
  107203. "and r6, %[m]\n\t"
  107204. #endif
  107205. "movs r5, #0\n\t"
  107206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107207. "subs r5, r5, r4\n\t"
  107208. #else
  107209. "sub r5, r5, r4\n\t"
  107210. #endif
  107211. "ldr r5, [%[a], r7]\n\t"
  107212. #ifdef WOLFSSL_KEIL
  107213. "sbcs r5, r5, r6\n\t"
  107214. #elif defined(__clang__)
  107215. "sbcs r5, r6\n\t"
  107216. #else
  107217. "sbc r5, r6\n\t"
  107218. #endif
  107219. #ifdef WOLFSSL_KEIL
  107220. "sbcs r4, r4, r4\n\t"
  107221. #elif defined(__clang__)
  107222. "sbcs r4, r4\n\t"
  107223. #else
  107224. "sbc r4, r4\n\t"
  107225. #endif
  107226. "str r5, [%[r], r7]\n\t"
  107227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107228. "adds r7, r7, #4\n\t"
  107229. #else
  107230. "add r7, r7, #4\n\t"
  107231. #endif
  107232. "cmp r7, r8\n\t"
  107233. "blt L_sp_384_cond_sub_12_words_%=\n\t"
  107234. "movs %[r], r4\n\t"
  107235. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  107236. :
  107237. : "memory", "r4", "r5", "r6", "r7", "r8"
  107238. );
  107239. return (uint32_t)(size_t)r;
  107240. }
  107241. #define sp_384_mont_reduce_order_12 sp_384_mont_reduce_12
  107242. /* Reduce the number back to 384 bits using Montgomery reduction.
  107243. *
  107244. * a A single precision number to reduce in place.
  107245. * m The single precision number representing the modulus.
  107246. * mp The digit representing the negative inverse of m mod 2^n.
  107247. */
  107248. SP_NOINLINE static void sp_384_mont_reduce_12(sp_digit* a, const sp_digit* m,
  107249. sp_digit mp)
  107250. {
  107251. __asm__ __volatile__ (
  107252. "movs r7, #0\n\t"
  107253. "mov r8, %[mp]\n\t"
  107254. "mov r12, r7\n\t"
  107255. "mov lr, %[m]\n\t"
  107256. "mov r9, %[a]\n\t"
  107257. "mov r11, %[a]\n\t"
  107258. "movs r5, #44\n\t"
  107259. "movs r6, #48\n\t"
  107260. "add r9, r9, r5\n\t"
  107261. "add r11, r11, r6\n\t"
  107262. "\n"
  107263. "L_sp_384_mont_reduce_12_mod_%=:\n\t"
  107264. "movs r7, #0\n\t"
  107265. "movs r4, #0\n\t"
  107266. "# a[i] += m[0] * mu\n\t"
  107267. "ldm %[m]!, {%[mp]}\n\t"
  107268. "ldm %[a]!, {r3}\n\t"
  107269. "# mu = a[i] * mp\n\t"
  107270. "mov r5, r8\n\t"
  107271. #ifdef WOLFSSL_KEIL
  107272. "muls r5, r3, r5\n\t"
  107273. #elif defined(__clang__)
  107274. "muls r5, r3\n\t"
  107275. #else
  107276. "mul r5, r3\n\t"
  107277. #endif
  107278. "mov r10, r5\n\t"
  107279. "# Multiply m[0] and mu - Start\n\t"
  107280. "mov r5, r10\n\t"
  107281. "uxth r6, %[mp]\n\t"
  107282. "uxth r5, r5\n\t"
  107283. #ifdef WOLFSSL_KEIL
  107284. "muls r6, r5, r6\n\t"
  107285. #elif defined(__clang__)
  107286. "muls r6, r5\n\t"
  107287. #else
  107288. "mul r6, r5\n\t"
  107289. #endif
  107290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107291. "adds r3, r3, r6\n\t"
  107292. #else
  107293. "add r3, r3, r6\n\t"
  107294. #endif
  107295. #ifdef WOLFSSL_KEIL
  107296. "adcs r4, r4, r7\n\t"
  107297. #elif defined(__clang__)
  107298. "adcs r4, r7\n\t"
  107299. #else
  107300. "adc r4, r7\n\t"
  107301. #endif
  107302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107303. "lsrs r6, %[mp], #16\n\t"
  107304. #else
  107305. "lsr r6, %[mp], #16\n\t"
  107306. #endif
  107307. #ifdef WOLFSSL_KEIL
  107308. "muls r5, r6, r5\n\t"
  107309. #elif defined(__clang__)
  107310. "muls r5, r6\n\t"
  107311. #else
  107312. "mul r5, r6\n\t"
  107313. #endif
  107314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107315. "lsrs r6, r5, #16\n\t"
  107316. #else
  107317. "lsr r6, r5, #16\n\t"
  107318. #endif
  107319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107320. "lsls r5, r5, #16\n\t"
  107321. #else
  107322. "lsl r5, r5, #16\n\t"
  107323. #endif
  107324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107325. "adds r3, r3, r5\n\t"
  107326. #else
  107327. "add r3, r3, r5\n\t"
  107328. #endif
  107329. #ifdef WOLFSSL_KEIL
  107330. "adcs r4, r4, r6\n\t"
  107331. #elif defined(__clang__)
  107332. "adcs r4, r6\n\t"
  107333. #else
  107334. "adc r4, r6\n\t"
  107335. #endif
  107336. "mov r5, r10\n\t"
  107337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107338. "lsrs r6, %[mp], #16\n\t"
  107339. #else
  107340. "lsr r6, %[mp], #16\n\t"
  107341. #endif
  107342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107343. "lsrs r5, r5, #16\n\t"
  107344. #else
  107345. "lsr r5, r5, #16\n\t"
  107346. #endif
  107347. #ifdef WOLFSSL_KEIL
  107348. "muls r6, r5, r6\n\t"
  107349. #elif defined(__clang__)
  107350. "muls r6, r5\n\t"
  107351. #else
  107352. "mul r6, r5\n\t"
  107353. #endif
  107354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107355. "adds r4, r4, r6\n\t"
  107356. #else
  107357. "add r4, r4, r6\n\t"
  107358. #endif
  107359. "uxth r6, %[mp]\n\t"
  107360. #ifdef WOLFSSL_KEIL
  107361. "muls r5, r6, r5\n\t"
  107362. #elif defined(__clang__)
  107363. "muls r5, r6\n\t"
  107364. #else
  107365. "mul r5, r6\n\t"
  107366. #endif
  107367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107368. "lsrs r6, r5, #16\n\t"
  107369. #else
  107370. "lsr r6, r5, #16\n\t"
  107371. #endif
  107372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107373. "lsls r5, r5, #16\n\t"
  107374. #else
  107375. "lsl r5, r5, #16\n\t"
  107376. #endif
  107377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107378. "adds r3, r3, r5\n\t"
  107379. #else
  107380. "add r3, r3, r5\n\t"
  107381. #endif
  107382. #ifdef WOLFSSL_KEIL
  107383. "adcs r4, r4, r6\n\t"
  107384. #elif defined(__clang__)
  107385. "adcs r4, r6\n\t"
  107386. #else
  107387. "adc r4, r6\n\t"
  107388. #endif
  107389. "# Multiply m[0] and mu - Done\n\t"
  107390. "\n"
  107391. "L_sp_384_mont_reduce_12_word_%=:\n\t"
  107392. "# a[i+j] += m[j] * mu\n\t"
  107393. "ldr r3, [%[a]]\n\t"
  107394. "ldm %[m]!, {%[mp]}\n\t"
  107395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107396. "adds r3, r3, r4\n\t"
  107397. #else
  107398. "add r3, r3, r4\n\t"
  107399. #endif
  107400. "movs r4, #0\n\t"
  107401. #ifdef WOLFSSL_KEIL
  107402. "adcs r4, r4, r7\n\t"
  107403. #elif defined(__clang__)
  107404. "adcs r4, r7\n\t"
  107405. #else
  107406. "adc r4, r7\n\t"
  107407. #endif
  107408. "# Multiply m[j] and mu - Start\n\t"
  107409. "mov r5, r10\n\t"
  107410. "uxth r6, %[mp]\n\t"
  107411. "uxth r5, r5\n\t"
  107412. #ifdef WOLFSSL_KEIL
  107413. "muls r6, r5, r6\n\t"
  107414. #elif defined(__clang__)
  107415. "muls r6, r5\n\t"
  107416. #else
  107417. "mul r6, r5\n\t"
  107418. #endif
  107419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107420. "adds r3, r3, r6\n\t"
  107421. #else
  107422. "add r3, r3, r6\n\t"
  107423. #endif
  107424. #ifdef WOLFSSL_KEIL
  107425. "adcs r4, r4, r7\n\t"
  107426. #elif defined(__clang__)
  107427. "adcs r4, r7\n\t"
  107428. #else
  107429. "adc r4, r7\n\t"
  107430. #endif
  107431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107432. "lsrs r6, %[mp], #16\n\t"
  107433. #else
  107434. "lsr r6, %[mp], #16\n\t"
  107435. #endif
  107436. #ifdef WOLFSSL_KEIL
  107437. "muls r5, r6, r5\n\t"
  107438. #elif defined(__clang__)
  107439. "muls r5, r6\n\t"
  107440. #else
  107441. "mul r5, r6\n\t"
  107442. #endif
  107443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107444. "lsrs r6, r5, #16\n\t"
  107445. #else
  107446. "lsr r6, r5, #16\n\t"
  107447. #endif
  107448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107449. "lsls r5, r5, #16\n\t"
  107450. #else
  107451. "lsl r5, r5, #16\n\t"
  107452. #endif
  107453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107454. "adds r3, r3, r5\n\t"
  107455. #else
  107456. "add r3, r3, r5\n\t"
  107457. #endif
  107458. #ifdef WOLFSSL_KEIL
  107459. "adcs r4, r4, r6\n\t"
  107460. #elif defined(__clang__)
  107461. "adcs r4, r6\n\t"
  107462. #else
  107463. "adc r4, r6\n\t"
  107464. #endif
  107465. "mov r5, r10\n\t"
  107466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107467. "lsrs r6, %[mp], #16\n\t"
  107468. #else
  107469. "lsr r6, %[mp], #16\n\t"
  107470. #endif
  107471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107472. "lsrs r5, r5, #16\n\t"
  107473. #else
  107474. "lsr r5, r5, #16\n\t"
  107475. #endif
  107476. #ifdef WOLFSSL_KEIL
  107477. "muls r6, r5, r6\n\t"
  107478. #elif defined(__clang__)
  107479. "muls r6, r5\n\t"
  107480. #else
  107481. "mul r6, r5\n\t"
  107482. #endif
  107483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107484. "adds r4, r4, r6\n\t"
  107485. #else
  107486. "add r4, r4, r6\n\t"
  107487. #endif
  107488. "uxth r6, %[mp]\n\t"
  107489. #ifdef WOLFSSL_KEIL
  107490. "muls r5, r6, r5\n\t"
  107491. #elif defined(__clang__)
  107492. "muls r5, r6\n\t"
  107493. #else
  107494. "mul r5, r6\n\t"
  107495. #endif
  107496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107497. "lsrs r6, r5, #16\n\t"
  107498. #else
  107499. "lsr r6, r5, #16\n\t"
  107500. #endif
  107501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107502. "lsls r5, r5, #16\n\t"
  107503. #else
  107504. "lsl r5, r5, #16\n\t"
  107505. #endif
  107506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107507. "adds r3, r3, r5\n\t"
  107508. #else
  107509. "add r3, r3, r5\n\t"
  107510. #endif
  107511. #ifdef WOLFSSL_KEIL
  107512. "adcs r4, r4, r6\n\t"
  107513. #elif defined(__clang__)
  107514. "adcs r4, r6\n\t"
  107515. #else
  107516. "adc r4, r6\n\t"
  107517. #endif
  107518. "# Multiply m[j] and mu - Done\n\t"
  107519. "stm %[a]!, {r3}\n\t"
  107520. "cmp %[a], r9\n\t"
  107521. "blt L_sp_384_mont_reduce_12_word_%=\n\t"
  107522. "# a[i+11] += m[11] * mu\n\t"
  107523. "ldr %[mp], [%[m]]\n\t"
  107524. "mov r3, r12\n\t"
  107525. "# Multiply m[11] and mu - Start\n\t"
  107526. "mov r5, r10\n\t"
  107527. "uxth r6, %[mp]\n\t"
  107528. "uxth r5, r5\n\t"
  107529. #ifdef WOLFSSL_KEIL
  107530. "muls r6, r5, r6\n\t"
  107531. #elif defined(__clang__)
  107532. "muls r6, r5\n\t"
  107533. #else
  107534. "mul r6, r5\n\t"
  107535. #endif
  107536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107537. "adds r4, r4, r6\n\t"
  107538. #else
  107539. "add r4, r4, r6\n\t"
  107540. #endif
  107541. #ifdef WOLFSSL_KEIL
  107542. "adcs r3, r3, r7\n\t"
  107543. #elif defined(__clang__)
  107544. "adcs r3, r7\n\t"
  107545. #else
  107546. "adc r3, r7\n\t"
  107547. #endif
  107548. #ifdef WOLFSSL_KEIL
  107549. "adcs r7, r7, r7\n\t"
  107550. #elif defined(__clang__)
  107551. "adcs r7, r7\n\t"
  107552. #else
  107553. "adc r7, r7\n\t"
  107554. #endif
  107555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107556. "lsrs r6, %[mp], #16\n\t"
  107557. #else
  107558. "lsr r6, %[mp], #16\n\t"
  107559. #endif
  107560. #ifdef WOLFSSL_KEIL
  107561. "muls r5, r6, r5\n\t"
  107562. #elif defined(__clang__)
  107563. "muls r5, r6\n\t"
  107564. #else
  107565. "mul r5, r6\n\t"
  107566. #endif
  107567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107568. "lsrs r6, r5, #16\n\t"
  107569. #else
  107570. "lsr r6, r5, #16\n\t"
  107571. #endif
  107572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107573. "lsls r5, r5, #16\n\t"
  107574. #else
  107575. "lsl r5, r5, #16\n\t"
  107576. #endif
  107577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107578. "adds r4, r4, r5\n\t"
  107579. #else
  107580. "add r4, r4, r5\n\t"
  107581. #endif
  107582. #ifdef WOLFSSL_KEIL
  107583. "adcs r3, r3, r6\n\t"
  107584. #elif defined(__clang__)
  107585. "adcs r3, r6\n\t"
  107586. #else
  107587. "adc r3, r6\n\t"
  107588. #endif
  107589. #ifdef WOLFSSL_KEIL
  107590. "adcs r7, r7, r7\n\t"
  107591. #elif defined(__clang__)
  107592. "adcs r7, r7\n\t"
  107593. #else
  107594. "adc r7, r7\n\t"
  107595. #endif
  107596. "mov r5, r10\n\t"
  107597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107598. "lsrs r6, %[mp], #16\n\t"
  107599. #else
  107600. "lsr r6, %[mp], #16\n\t"
  107601. #endif
  107602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107603. "lsrs r5, r5, #16\n\t"
  107604. #else
  107605. "lsr r5, r5, #16\n\t"
  107606. #endif
  107607. #ifdef WOLFSSL_KEIL
  107608. "muls r6, r5, r6\n\t"
  107609. #elif defined(__clang__)
  107610. "muls r6, r5\n\t"
  107611. #else
  107612. "mul r6, r5\n\t"
  107613. #endif
  107614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107615. "adds r3, r3, r6\n\t"
  107616. #else
  107617. "add r3, r3, r6\n\t"
  107618. #endif
  107619. #ifdef WOLFSSL_KEIL
  107620. "adcs r7, r7, r7\n\t"
  107621. #elif defined(__clang__)
  107622. "adcs r7, r7\n\t"
  107623. #else
  107624. "adc r7, r7\n\t"
  107625. #endif
  107626. "uxth r6, %[mp]\n\t"
  107627. #ifdef WOLFSSL_KEIL
  107628. "muls r5, r6, r5\n\t"
  107629. #elif defined(__clang__)
  107630. "muls r5, r6\n\t"
  107631. #else
  107632. "mul r5, r6\n\t"
  107633. #endif
  107634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107635. "lsrs r6, r5, #16\n\t"
  107636. #else
  107637. "lsr r6, r5, #16\n\t"
  107638. #endif
  107639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107640. "lsls r5, r5, #16\n\t"
  107641. #else
  107642. "lsl r5, r5, #16\n\t"
  107643. #endif
  107644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107645. "adds r4, r4, r5\n\t"
  107646. #else
  107647. "add r4, r4, r5\n\t"
  107648. #endif
  107649. #ifdef WOLFSSL_KEIL
  107650. "adcs r3, r3, r6\n\t"
  107651. #elif defined(__clang__)
  107652. "adcs r3, r6\n\t"
  107653. #else
  107654. "adc r3, r6\n\t"
  107655. #endif
  107656. #ifdef WOLFSSL_KEIL
  107657. "adcs r7, r7, r7\n\t"
  107658. #elif defined(__clang__)
  107659. "adcs r7, r7\n\t"
  107660. #else
  107661. "adc r7, r7\n\t"
  107662. #endif
  107663. "# Multiply m[11] and mu - Done\n\t"
  107664. "ldr r5, [%[a]]\n\t"
  107665. "ldr r6, [%[a], #4]\n\t"
  107666. "movs %[mp], #0\n\t"
  107667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107668. "adds r5, r5, r4\n\t"
  107669. #else
  107670. "add r5, r5, r4\n\t"
  107671. #endif
  107672. #ifdef WOLFSSL_KEIL
  107673. "adcs r6, r6, r3\n\t"
  107674. #elif defined(__clang__)
  107675. "adcs r6, r3\n\t"
  107676. #else
  107677. "adc r6, r3\n\t"
  107678. #endif
  107679. #ifdef WOLFSSL_KEIL
  107680. "adcs r7, r7, %[mp]\n\t"
  107681. #elif defined(__clang__)
  107682. "adcs r7, %[mp]\n\t"
  107683. #else
  107684. "adc r7, %[mp]\n\t"
  107685. #endif
  107686. "stm %[a]!, {r5, r6}\n\t"
  107687. "# i += 1\n\t"
  107688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107689. "subs %[a], %[a], #4\n\t"
  107690. #else
  107691. "sub %[a], %[a], #4\n\t"
  107692. #endif
  107693. "movs r3, #44\n\t"
  107694. "mov r9, %[a]\n\t"
  107695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107696. "subs %[a], %[a], r3\n\t"
  107697. #else
  107698. "sub %[a], %[a], r3\n\t"
  107699. #endif
  107700. "mov r12, r7\n\t"
  107701. "mov %[m], lr\n\t"
  107702. "cmp r11, %[a]\n\t"
  107703. "bgt L_sp_384_mont_reduce_12_mod_%=\n\t"
  107704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107705. "negs r7, r7\n\t"
  107706. #else
  107707. "neg r7, r7\n\t"
  107708. #endif
  107709. "# Subtract masked modulus\n\t"
  107710. "movs r4, #48\n\t"
  107711. "movs %[mp], #0\n\t"
  107712. "movs r3, #0\n\t"
  107713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107714. "subs %[a], %[a], r4\n\t"
  107715. #else
  107716. "sub %[a], %[a], r4\n\t"
  107717. #endif
  107718. #ifndef WOLFSSL_SP_LARGE_CODE
  107719. "\n"
  107720. "L_sp_384_mont_reduce_12_sub_mask_%=:\n\t"
  107721. "ldm %[m]!, {r6}\n\t"
  107722. "movs r5, #0\n\t"
  107723. #ifdef WOLFSSL_KEIL
  107724. "ands r6, r6, r7\n\t"
  107725. #elif defined(__clang__)
  107726. "ands r6, r7\n\t"
  107727. #else
  107728. "and r6, r7\n\t"
  107729. #endif
  107730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107731. "subs r5, r5, %[mp]\n\t"
  107732. #else
  107733. "sub r5, r5, %[mp]\n\t"
  107734. #endif
  107735. "ldr r5, [%[a], r4]\n\t"
  107736. #ifdef WOLFSSL_KEIL
  107737. "sbcs r5, r5, r6\n\t"
  107738. #elif defined(__clang__)
  107739. "sbcs r5, r6\n\t"
  107740. #else
  107741. "sbc r5, r6\n\t"
  107742. #endif
  107743. #ifdef WOLFSSL_KEIL
  107744. "sbcs %[mp], %[mp], %[mp]\n\t"
  107745. #elif defined(__clang__)
  107746. "sbcs %[mp], %[mp]\n\t"
  107747. #else
  107748. "sbc %[mp], %[mp]\n\t"
  107749. #endif
  107750. "stm %[a]!, {r5}\n\t"
  107751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107752. "adds r3, r3, #4\n\t"
  107753. #else
  107754. "add r3, r3, #4\n\t"
  107755. #endif
  107756. "cmp r3, r4\n\t"
  107757. "blt L_sp_384_mont_reduce_12_sub_mask_%=\n\t"
  107758. #else /* WOLFSSL_SP_LARGE_CODE */
  107759. "ldm %[m]!, {r6}\n\t"
  107760. #ifdef WOLFSSL_KEIL
  107761. "ands r6, r6, r7\n\t"
  107762. #elif defined(__clang__)
  107763. "ands r6, r7\n\t"
  107764. #else
  107765. "and r6, r7\n\t"
  107766. #endif
  107767. "ldr r5, [%[a], r4]\n\t"
  107768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107769. "subs r5, r5, r6\n\t"
  107770. #else
  107771. "sub r5, r5, r6\n\t"
  107772. #endif
  107773. "stm %[a]!, {r5}\n\t"
  107774. "ldm %[m]!, {r6}\n\t"
  107775. #ifdef WOLFSSL_KEIL
  107776. "ands r6, r6, r7\n\t"
  107777. #elif defined(__clang__)
  107778. "ands r6, r7\n\t"
  107779. #else
  107780. "and r6, r7\n\t"
  107781. #endif
  107782. "ldr r5, [%[a], r4]\n\t"
  107783. #ifdef WOLFSSL_KEIL
  107784. "sbcs r5, r5, r6\n\t"
  107785. #elif defined(__clang__)
  107786. "sbcs r5, r6\n\t"
  107787. #else
  107788. "sbc r5, r6\n\t"
  107789. #endif
  107790. "stm %[a]!, {r5}\n\t"
  107791. "ldm %[m]!, {r6}\n\t"
  107792. #ifdef WOLFSSL_KEIL
  107793. "ands r6, r6, r7\n\t"
  107794. #elif defined(__clang__)
  107795. "ands r6, r7\n\t"
  107796. #else
  107797. "and r6, r7\n\t"
  107798. #endif
  107799. "ldr r5, [%[a], r4]\n\t"
  107800. #ifdef WOLFSSL_KEIL
  107801. "sbcs r5, r5, r6\n\t"
  107802. #elif defined(__clang__)
  107803. "sbcs r5, r6\n\t"
  107804. #else
  107805. "sbc r5, r6\n\t"
  107806. #endif
  107807. "stm %[a]!, {r5}\n\t"
  107808. "ldm %[m]!, {r6}\n\t"
  107809. #ifdef WOLFSSL_KEIL
  107810. "ands r6, r6, r7\n\t"
  107811. #elif defined(__clang__)
  107812. "ands r6, r7\n\t"
  107813. #else
  107814. "and r6, r7\n\t"
  107815. #endif
  107816. "ldr r5, [%[a], r4]\n\t"
  107817. #ifdef WOLFSSL_KEIL
  107818. "sbcs r5, r5, r6\n\t"
  107819. #elif defined(__clang__)
  107820. "sbcs r5, r6\n\t"
  107821. #else
  107822. "sbc r5, r6\n\t"
  107823. #endif
  107824. "stm %[a]!, {r5}\n\t"
  107825. "ldm %[m]!, {r6}\n\t"
  107826. #ifdef WOLFSSL_KEIL
  107827. "ands r6, r6, r7\n\t"
  107828. #elif defined(__clang__)
  107829. "ands r6, r7\n\t"
  107830. #else
  107831. "and r6, r7\n\t"
  107832. #endif
  107833. "ldr r5, [%[a], r4]\n\t"
  107834. #ifdef WOLFSSL_KEIL
  107835. "sbcs r5, r5, r6\n\t"
  107836. #elif defined(__clang__)
  107837. "sbcs r5, r6\n\t"
  107838. #else
  107839. "sbc r5, r6\n\t"
  107840. #endif
  107841. "stm %[a]!, {r5}\n\t"
  107842. "ldm %[m]!, {r6}\n\t"
  107843. #ifdef WOLFSSL_KEIL
  107844. "ands r6, r6, r7\n\t"
  107845. #elif defined(__clang__)
  107846. "ands r6, r7\n\t"
  107847. #else
  107848. "and r6, r7\n\t"
  107849. #endif
  107850. "ldr r5, [%[a], r4]\n\t"
  107851. #ifdef WOLFSSL_KEIL
  107852. "sbcs r5, r5, r6\n\t"
  107853. #elif defined(__clang__)
  107854. "sbcs r5, r6\n\t"
  107855. #else
  107856. "sbc r5, r6\n\t"
  107857. #endif
  107858. "stm %[a]!, {r5}\n\t"
  107859. "ldm %[m]!, {r6}\n\t"
  107860. #ifdef WOLFSSL_KEIL
  107861. "ands r6, r6, r7\n\t"
  107862. #elif defined(__clang__)
  107863. "ands r6, r7\n\t"
  107864. #else
  107865. "and r6, r7\n\t"
  107866. #endif
  107867. "ldr r5, [%[a], r4]\n\t"
  107868. #ifdef WOLFSSL_KEIL
  107869. "sbcs r5, r5, r6\n\t"
  107870. #elif defined(__clang__)
  107871. "sbcs r5, r6\n\t"
  107872. #else
  107873. "sbc r5, r6\n\t"
  107874. #endif
  107875. "stm %[a]!, {r5}\n\t"
  107876. "ldm %[m]!, {r6}\n\t"
  107877. #ifdef WOLFSSL_KEIL
  107878. "ands r6, r6, r7\n\t"
  107879. #elif defined(__clang__)
  107880. "ands r6, r7\n\t"
  107881. #else
  107882. "and r6, r7\n\t"
  107883. #endif
  107884. "ldr r5, [%[a], r4]\n\t"
  107885. #ifdef WOLFSSL_KEIL
  107886. "sbcs r5, r5, r6\n\t"
  107887. #elif defined(__clang__)
  107888. "sbcs r5, r6\n\t"
  107889. #else
  107890. "sbc r5, r6\n\t"
  107891. #endif
  107892. "stm %[a]!, {r5}\n\t"
  107893. "ldm %[m]!, {r6}\n\t"
  107894. #ifdef WOLFSSL_KEIL
  107895. "ands r6, r6, r7\n\t"
  107896. #elif defined(__clang__)
  107897. "ands r6, r7\n\t"
  107898. #else
  107899. "and r6, r7\n\t"
  107900. #endif
  107901. "ldr r5, [%[a], r4]\n\t"
  107902. #ifdef WOLFSSL_KEIL
  107903. "sbcs r5, r5, r6\n\t"
  107904. #elif defined(__clang__)
  107905. "sbcs r5, r6\n\t"
  107906. #else
  107907. "sbc r5, r6\n\t"
  107908. #endif
  107909. "stm %[a]!, {r5}\n\t"
  107910. "ldm %[m]!, {r6}\n\t"
  107911. #ifdef WOLFSSL_KEIL
  107912. "ands r6, r6, r7\n\t"
  107913. #elif defined(__clang__)
  107914. "ands r6, r7\n\t"
  107915. #else
  107916. "and r6, r7\n\t"
  107917. #endif
  107918. "ldr r5, [%[a], r4]\n\t"
  107919. #ifdef WOLFSSL_KEIL
  107920. "sbcs r5, r5, r6\n\t"
  107921. #elif defined(__clang__)
  107922. "sbcs r5, r6\n\t"
  107923. #else
  107924. "sbc r5, r6\n\t"
  107925. #endif
  107926. "stm %[a]!, {r5}\n\t"
  107927. "ldm %[m]!, {r6}\n\t"
  107928. #ifdef WOLFSSL_KEIL
  107929. "ands r6, r6, r7\n\t"
  107930. #elif defined(__clang__)
  107931. "ands r6, r7\n\t"
  107932. #else
  107933. "and r6, r7\n\t"
  107934. #endif
  107935. "ldr r5, [%[a], r4]\n\t"
  107936. #ifdef WOLFSSL_KEIL
  107937. "sbcs r5, r5, r6\n\t"
  107938. #elif defined(__clang__)
  107939. "sbcs r5, r6\n\t"
  107940. #else
  107941. "sbc r5, r6\n\t"
  107942. #endif
  107943. "stm %[a]!, {r5}\n\t"
  107944. "ldm %[m]!, {r6}\n\t"
  107945. #ifdef WOLFSSL_KEIL
  107946. "ands r6, r6, r7\n\t"
  107947. #elif defined(__clang__)
  107948. "ands r6, r7\n\t"
  107949. #else
  107950. "and r6, r7\n\t"
  107951. #endif
  107952. "ldr r5, [%[a], r4]\n\t"
  107953. #ifdef WOLFSSL_KEIL
  107954. "sbcs r5, r5, r6\n\t"
  107955. #elif defined(__clang__)
  107956. "sbcs r5, r6\n\t"
  107957. #else
  107958. "sbc r5, r6\n\t"
  107959. #endif
  107960. "stm %[a]!, {r5}\n\t"
  107961. #endif /* WOLFSSL_SP_LARGE_CODE */
  107962. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  107963. :
  107964. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  107965. );
  107966. }
  107967. /* Multiply two Montgomery form numbers mod the modulus (prime).
  107968. * (r = a * b mod m)
  107969. *
  107970. * r Result of multiplication.
  107971. * a First number to multiply in Montgomery form.
  107972. * b Second number to multiply in Montgomery form.
  107973. * m Modulus (prime).
  107974. * mp Montgomery mulitplier.
  107975. */
  107976. static void sp_384_mont_mul_12(sp_digit* r, const sp_digit* a,
  107977. const sp_digit* b, const sp_digit* m, sp_digit mp)
  107978. {
  107979. sp_384_mul_12(r, a, b);
  107980. sp_384_mont_reduce_12(r, m, mp);
  107981. }
  107982. /* Square the Montgomery form number. (r = a * a mod m)
  107983. *
  107984. * r Result of squaring.
  107985. * a Number to square in Montgomery form.
  107986. * m Modulus (prime).
  107987. * mp Montgomery mulitplier.
  107988. */
  107989. static void sp_384_mont_sqr_12(sp_digit* r, const sp_digit* a,
  107990. const sp_digit* m, sp_digit mp)
  107991. {
  107992. sp_384_sqr_12(r, a);
  107993. sp_384_mont_reduce_12(r, m, mp);
  107994. }
  107995. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  107996. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  107997. *
  107998. * r Result of squaring.
  107999. * a Number to square in Montgomery form.
  108000. * n Number of times to square.
  108001. * m Modulus (prime).
  108002. * mp Montgomery mulitplier.
  108003. */
  108004. static void sp_384_mont_sqr_n_12(sp_digit* r, const sp_digit* a, int n,
  108005. const sp_digit* m, sp_digit mp)
  108006. {
  108007. sp_384_mont_sqr_12(r, a, m, mp);
  108008. for (; n > 1; n--) {
  108009. sp_384_mont_sqr_12(r, r, m, mp);
  108010. }
  108011. }
  108012. #endif /* !WOLFSSL_SP_SMALL | HAVE_COMP_KEY */
  108013. #ifdef WOLFSSL_SP_SMALL
  108014. /* Mod-2 for the P384 curve. */
  108015. static const uint32_t p384_mod_minus_2[12] = {
  108016. 0xfffffffdU,0x00000000U,0x00000000U,0xffffffffU,0xfffffffeU,0xffffffffU,
  108017. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  108018. };
  108019. #endif /* !WOLFSSL_SP_SMALL */
  108020. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  108021. * P384 curve. (r = 1 / a mod m)
  108022. *
  108023. * r Inverse result.
  108024. * a Number to invert.
  108025. * td Temporary data.
  108026. */
  108027. static void sp_384_mont_inv_12(sp_digit* r, const sp_digit* a, sp_digit* td)
  108028. {
  108029. #ifdef WOLFSSL_SP_SMALL
  108030. sp_digit* t = td;
  108031. int i;
  108032. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  108033. for (i=382; i>=0; i--) {
  108034. sp_384_mont_sqr_12(t, t, p384_mod, p384_mp_mod);
  108035. if (p384_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  108036. sp_384_mont_mul_12(t, t, a, p384_mod, p384_mp_mod);
  108037. }
  108038. XMEMCPY(r, t, sizeof(sp_digit) * 12);
  108039. #else
  108040. sp_digit* t1 = td;
  108041. sp_digit* t2 = td + 2 * 12;
  108042. sp_digit* t3 = td + 4 * 12;
  108043. sp_digit* t4 = td + 6 * 12;
  108044. sp_digit* t5 = td + 8 * 12;
  108045. /* 0x2 */
  108046. sp_384_mont_sqr_12(t1, a, p384_mod, p384_mp_mod);
  108047. /* 0x3 */
  108048. sp_384_mont_mul_12(t5, t1, a, p384_mod, p384_mp_mod);
  108049. /* 0xc */
  108050. sp_384_mont_sqr_n_12(t1, t5, 2, p384_mod, p384_mp_mod);
  108051. /* 0xf */
  108052. sp_384_mont_mul_12(t2, t5, t1, p384_mod, p384_mp_mod);
  108053. /* 0x1e */
  108054. sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod);
  108055. /* 0x1f */
  108056. sp_384_mont_mul_12(t4, t1, a, p384_mod, p384_mp_mod);
  108057. /* 0x3e0 */
  108058. sp_384_mont_sqr_n_12(t1, t4, 5, p384_mod, p384_mp_mod);
  108059. /* 0x3ff */
  108060. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  108061. /* 0x7fe0 */
  108062. sp_384_mont_sqr_n_12(t1, t2, 5, p384_mod, p384_mp_mod);
  108063. /* 0x7fff */
  108064. sp_384_mont_mul_12(t4, t4, t1, p384_mod, p384_mp_mod);
  108065. /* 0x3fff8000 */
  108066. sp_384_mont_sqr_n_12(t1, t4, 15, p384_mod, p384_mp_mod);
  108067. /* 0x3fffffff */
  108068. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  108069. /* 0xfffffffc */
  108070. sp_384_mont_sqr_n_12(t3, t2, 2, p384_mod, p384_mp_mod);
  108071. /* 0xfffffffd */
  108072. sp_384_mont_mul_12(r, t3, a, p384_mod, p384_mp_mod);
  108073. /* 0xffffffff */
  108074. sp_384_mont_mul_12(t3, t5, t3, p384_mod, p384_mp_mod);
  108075. /* 0xfffffffc0000000 */
  108076. sp_384_mont_sqr_n_12(t1, t2, 30, p384_mod, p384_mp_mod);
  108077. /* 0xfffffffffffffff */
  108078. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  108079. /* 0xfffffffffffffff000000000000000 */
  108080. sp_384_mont_sqr_n_12(t1, t2, 60, p384_mod, p384_mp_mod);
  108081. /* 0xffffffffffffffffffffffffffffff */
  108082. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  108083. /* 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  108084. sp_384_mont_sqr_n_12(t1, t2, 120, p384_mod, p384_mp_mod);
  108085. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  108086. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  108087. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  108088. sp_384_mont_sqr_n_12(t1, t2, 15, p384_mod, p384_mp_mod);
  108089. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  108090. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  108091. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000 */
  108092. sp_384_mont_sqr_n_12(t1, t2, 33, p384_mod, p384_mp_mod);
  108093. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff */
  108094. sp_384_mont_mul_12(t2, t3, t1, p384_mod, p384_mp_mod);
  108095. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000000000000 */
  108096. sp_384_mont_sqr_n_12(t1, t2, 96, p384_mod, p384_mp_mod);
  108097. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffd */
  108098. sp_384_mont_mul_12(r, r, t1, p384_mod, p384_mp_mod);
  108099. #endif /* WOLFSSL_SP_SMALL */
  108100. }
  108101. /* Compare a with b in constant time.
  108102. *
  108103. * a A single precision integer.
  108104. * b A single precision integer.
  108105. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  108106. * respectively.
  108107. */
  108108. SP_NOINLINE static sp_int32 sp_384_cmp_12(const sp_digit* a, const sp_digit* b)
  108109. {
  108110. __asm__ __volatile__ (
  108111. "movs r2, #0\n\t"
  108112. "movs r3, #0\n\t"
  108113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108114. "mvns r3, r3\n\t"
  108115. #else
  108116. "mvn r3, r3\n\t"
  108117. #endif
  108118. "movs r6, #44\n\t"
  108119. "\n"
  108120. "L_sp_384_cmp_12_words_%=:\n\t"
  108121. "ldr r7, [%[a], r6]\n\t"
  108122. "ldr r5, [%[b], r6]\n\t"
  108123. #ifdef WOLFSSL_KEIL
  108124. "ands r7, r7, r3\n\t"
  108125. #elif defined(__clang__)
  108126. "ands r7, r3\n\t"
  108127. #else
  108128. "and r7, r3\n\t"
  108129. #endif
  108130. #ifdef WOLFSSL_KEIL
  108131. "ands r5, r5, r3\n\t"
  108132. #elif defined(__clang__)
  108133. "ands r5, r3\n\t"
  108134. #else
  108135. "and r5, r3\n\t"
  108136. #endif
  108137. "movs r4, r7\n\t"
  108138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108139. "subs r7, r7, r5\n\t"
  108140. #else
  108141. "sub r7, r7, r5\n\t"
  108142. #endif
  108143. #ifdef WOLFSSL_KEIL
  108144. "sbcs r7, r7, r7\n\t"
  108145. #elif defined(__clang__)
  108146. "sbcs r7, r7\n\t"
  108147. #else
  108148. "sbc r7, r7\n\t"
  108149. #endif
  108150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108151. "adds r2, r2, r7\n\t"
  108152. #else
  108153. "add r2, r2, r7\n\t"
  108154. #endif
  108155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108156. "mvns r7, r7\n\t"
  108157. #else
  108158. "mvn r7, r7\n\t"
  108159. #endif
  108160. #ifdef WOLFSSL_KEIL
  108161. "ands r3, r3, r7\n\t"
  108162. #elif defined(__clang__)
  108163. "ands r3, r7\n\t"
  108164. #else
  108165. "and r3, r7\n\t"
  108166. #endif
  108167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108168. "subs r5, r5, r4\n\t"
  108169. #else
  108170. "sub r5, r5, r4\n\t"
  108171. #endif
  108172. #ifdef WOLFSSL_KEIL
  108173. "sbcs r7, r7, r7\n\t"
  108174. #elif defined(__clang__)
  108175. "sbcs r7, r7\n\t"
  108176. #else
  108177. "sbc r7, r7\n\t"
  108178. #endif
  108179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108180. "subs r2, r2, r7\n\t"
  108181. #else
  108182. "sub r2, r2, r7\n\t"
  108183. #endif
  108184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108185. "mvns r7, r7\n\t"
  108186. #else
  108187. "mvn r7, r7\n\t"
  108188. #endif
  108189. #ifdef WOLFSSL_KEIL
  108190. "ands r3, r3, r7\n\t"
  108191. #elif defined(__clang__)
  108192. "ands r3, r7\n\t"
  108193. #else
  108194. "and r3, r7\n\t"
  108195. #endif
  108196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108197. "subs r6, r6, #4\n\t"
  108198. #else
  108199. "sub r6, r6, #4\n\t"
  108200. #endif
  108201. "cmp r6, #0\n\t"
  108202. "bge L_sp_384_cmp_12_words_%=\n\t"
  108203. "movs %[a], r2\n\t"
  108204. : [a] "+r" (a), [b] "+r" (b)
  108205. :
  108206. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  108207. );
  108208. return (uint32_t)(size_t)a;
  108209. }
  108210. /* Normalize the values in each word to 32.
  108211. *
  108212. * a Array of sp_digit to normalize.
  108213. */
  108214. #define sp_384_norm_12(a)
  108215. /* Map the Montgomery form projective coordinate point to an affine point.
  108216. *
  108217. * r Resulting affine coordinate point.
  108218. * p Montgomery form projective coordinate point.
  108219. * t Temporary ordinate data.
  108220. */
  108221. static void sp_384_map_12(sp_point_384* r, const sp_point_384* p,
  108222. sp_digit* t)
  108223. {
  108224. sp_digit* t1 = t;
  108225. sp_digit* t2 = t + 2*12;
  108226. sp_int32 n;
  108227. sp_384_mont_inv_12(t1, p->z, t + 2*12);
  108228. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  108229. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  108230. /* x /= z^2 */
  108231. sp_384_mont_mul_12(r->x, p->x, t2, p384_mod, p384_mp_mod);
  108232. XMEMSET(r->x + 12, 0, sizeof(r->x) / 2U);
  108233. sp_384_mont_reduce_12(r->x, p384_mod, p384_mp_mod);
  108234. /* Reduce x to less than modulus */
  108235. n = sp_384_cmp_12(r->x, p384_mod);
  108236. sp_384_cond_sub_12(r->x, r->x, p384_mod, 0 - ((n >= 0) ?
  108237. (sp_digit)1 : (sp_digit)0));
  108238. sp_384_norm_12(r->x);
  108239. /* y /= z^3 */
  108240. sp_384_mont_mul_12(r->y, p->y, t1, p384_mod, p384_mp_mod);
  108241. XMEMSET(r->y + 12, 0, sizeof(r->y) / 2U);
  108242. sp_384_mont_reduce_12(r->y, p384_mod, p384_mp_mod);
  108243. /* Reduce y to less than modulus */
  108244. n = sp_384_cmp_12(r->y, p384_mod);
  108245. sp_384_cond_sub_12(r->y, r->y, p384_mod, 0 - ((n >= 0) ?
  108246. (sp_digit)1 : (sp_digit)0));
  108247. sp_384_norm_12(r->y);
  108248. XMEMSET(r->z, 0, sizeof(r->z));
  108249. r->z[0] = 1;
  108250. }
  108251. /* Add two Montgomery form numbers (r = a + b % m).
  108252. *
  108253. * r Result of addition.
  108254. * a First number to add in Montgomery form.
  108255. * b Second number to add in Montgomery form.
  108256. * m Modulus (prime).
  108257. */
  108258. SP_NOINLINE static void sp_384_mont_add_12(sp_digit* r, const sp_digit* a,
  108259. const sp_digit* b, const sp_digit* m)
  108260. {
  108261. sp_digit o;
  108262. o = sp_384_add_12(r, a, b);
  108263. sp_384_cond_sub_12(r, r, m, 0 - o);
  108264. }
  108265. /* Double a Montgomery form number (r = a + a % m).
  108266. *
  108267. * r Result of doubling.
  108268. * a Number to double in Montgomery form.
  108269. * m Modulus (prime).
  108270. */
  108271. SP_NOINLINE static void sp_384_mont_dbl_12(sp_digit* r, const sp_digit* a,
  108272. const sp_digit* m)
  108273. {
  108274. sp_digit o;
  108275. o = sp_384_add_12(r, a, a);
  108276. sp_384_cond_sub_12(r, r, m, 0 - o);
  108277. }
  108278. /* Triple a Montgomery form number (r = a + a + a % m).
  108279. *
  108280. * r Result of Tripling.
  108281. * a Number to triple in Montgomery form.
  108282. * m Modulus (prime).
  108283. */
  108284. SP_NOINLINE static void sp_384_mont_tpl_12(sp_digit* r, const sp_digit* a,
  108285. const sp_digit* m)
  108286. {
  108287. sp_digit o;
  108288. o = sp_384_add_12(r, a, a);
  108289. sp_384_cond_sub_12(r, r, m, 0 - o);
  108290. o = sp_384_add_12(r, r, a);
  108291. sp_384_cond_sub_12(r, r, m, 0 - o);
  108292. }
  108293. /* Conditionally add a and b using the mask m.
  108294. * m is -1 to add and 0 when not.
  108295. *
  108296. * r A single precision number representing conditional add result.
  108297. * a A single precision number to add with.
  108298. * b A single precision number to add.
  108299. * m Mask value to apply.
  108300. */
  108301. SP_NOINLINE static sp_digit sp_384_cond_add_12(sp_digit* r, const sp_digit* a,
  108302. const sp_digit* b, sp_digit m)
  108303. {
  108304. __asm__ __volatile__ (
  108305. "movs r4, #0\n\t"
  108306. "movs r5, #48\n\t"
  108307. "mov r8, r5\n\t"
  108308. "movs r7, #0\n\t"
  108309. "\n"
  108310. "L_sp_384_cond_add_12_words_%=:\n\t"
  108311. "ldr r6, [%[b], r7]\n\t"
  108312. #ifdef WOLFSSL_KEIL
  108313. "ands r6, r6, %[m]\n\t"
  108314. #elif defined(__clang__)
  108315. "ands r6, %[m]\n\t"
  108316. #else
  108317. "and r6, %[m]\n\t"
  108318. #endif
  108319. "movs r5, #0\n\t"
  108320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108321. "subs r5, r5, #1\n\t"
  108322. #else
  108323. "sub r5, r5, #1\n\t"
  108324. #endif
  108325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108326. "adds r5, r5, r4\n\t"
  108327. #else
  108328. "add r5, r5, r4\n\t"
  108329. #endif
  108330. "ldr r5, [%[a], r7]\n\t"
  108331. #ifdef WOLFSSL_KEIL
  108332. "adcs r5, r5, r6\n\t"
  108333. #elif defined(__clang__)
  108334. "adcs r5, r6\n\t"
  108335. #else
  108336. "adc r5, r6\n\t"
  108337. #endif
  108338. "movs r4, #0\n\t"
  108339. #ifdef WOLFSSL_KEIL
  108340. "adcs r4, r4, r4\n\t"
  108341. #elif defined(__clang__)
  108342. "adcs r4, r4\n\t"
  108343. #else
  108344. "adc r4, r4\n\t"
  108345. #endif
  108346. "str r5, [%[r], r7]\n\t"
  108347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108348. "adds r7, r7, #4\n\t"
  108349. #else
  108350. "add r7, r7, #4\n\t"
  108351. #endif
  108352. "cmp r7, r8\n\t"
  108353. "blt L_sp_384_cond_add_12_words_%=\n\t"
  108354. "movs %[r], r4\n\t"
  108355. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  108356. :
  108357. : "memory", "r4", "r5", "r6", "r7", "r8"
  108358. );
  108359. return (uint32_t)(size_t)r;
  108360. }
  108361. /* Subtract two Montgomery form numbers (r = a - b % m).
  108362. *
  108363. * r Result of subtration.
  108364. * a Number to subtract from in Montgomery form.
  108365. * b Number to subtract with in Montgomery form.
  108366. * m Modulus (prime).
  108367. */
  108368. SP_NOINLINE static void sp_384_mont_sub_12(sp_digit* r, const sp_digit* a,
  108369. const sp_digit* b, const sp_digit* m)
  108370. {
  108371. sp_digit o;
  108372. o = sp_384_sub_12(r, a, b);
  108373. sp_384_cond_add_12(r, r, m, o);
  108374. }
  108375. /* Right shift a by 1 bit into r. (r = a >> 1)
  108376. *
  108377. * r A single precision integer.
  108378. * a A single precision integer.
  108379. */
  108380. static void sp_384_rshift1_12(sp_digit* r, const sp_digit* a)
  108381. {
  108382. __asm__ __volatile__ (
  108383. "ldr r2, [%[a]]\n\t"
  108384. "ldr r3, [%[a], #4]\n\t"
  108385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108386. "lsrs r2, r2, #1\n\t"
  108387. #else
  108388. "lsr r2, r2, #1\n\t"
  108389. #endif
  108390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108391. "lsls r5, r3, #31\n\t"
  108392. #else
  108393. "lsl r5, r3, #31\n\t"
  108394. #endif
  108395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108396. "lsrs r3, r3, #1\n\t"
  108397. #else
  108398. "lsr r3, r3, #1\n\t"
  108399. #endif
  108400. #ifdef WOLFSSL_KEIL
  108401. "orrs r2, r2, r5\n\t"
  108402. #elif defined(__clang__)
  108403. "orrs r2, r5\n\t"
  108404. #else
  108405. "orr r2, r5\n\t"
  108406. #endif
  108407. "ldr r4, [%[a], #8]\n\t"
  108408. "str r2, [%[r]]\n\t"
  108409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108410. "lsls r5, r4, #31\n\t"
  108411. #else
  108412. "lsl r5, r4, #31\n\t"
  108413. #endif
  108414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108415. "lsrs r4, r4, #1\n\t"
  108416. #else
  108417. "lsr r4, r4, #1\n\t"
  108418. #endif
  108419. #ifdef WOLFSSL_KEIL
  108420. "orrs r3, r3, r5\n\t"
  108421. #elif defined(__clang__)
  108422. "orrs r3, r5\n\t"
  108423. #else
  108424. "orr r3, r5\n\t"
  108425. #endif
  108426. "ldr r2, [%[a], #12]\n\t"
  108427. "str r3, [%[r], #4]\n\t"
  108428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108429. "lsls r5, r2, #31\n\t"
  108430. #else
  108431. "lsl r5, r2, #31\n\t"
  108432. #endif
  108433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108434. "lsrs r2, r2, #1\n\t"
  108435. #else
  108436. "lsr r2, r2, #1\n\t"
  108437. #endif
  108438. #ifdef WOLFSSL_KEIL
  108439. "orrs r4, r4, r5\n\t"
  108440. #elif defined(__clang__)
  108441. "orrs r4, r5\n\t"
  108442. #else
  108443. "orr r4, r5\n\t"
  108444. #endif
  108445. "ldr r3, [%[a], #16]\n\t"
  108446. "str r4, [%[r], #8]\n\t"
  108447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108448. "lsls r5, r3, #31\n\t"
  108449. #else
  108450. "lsl r5, r3, #31\n\t"
  108451. #endif
  108452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108453. "lsrs r3, r3, #1\n\t"
  108454. #else
  108455. "lsr r3, r3, #1\n\t"
  108456. #endif
  108457. #ifdef WOLFSSL_KEIL
  108458. "orrs r2, r2, r5\n\t"
  108459. #elif defined(__clang__)
  108460. "orrs r2, r5\n\t"
  108461. #else
  108462. "orr r2, r5\n\t"
  108463. #endif
  108464. "ldr r4, [%[a], #20]\n\t"
  108465. "str r2, [%[r], #12]\n\t"
  108466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108467. "lsls r5, r4, #31\n\t"
  108468. #else
  108469. "lsl r5, r4, #31\n\t"
  108470. #endif
  108471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108472. "lsrs r4, r4, #1\n\t"
  108473. #else
  108474. "lsr r4, r4, #1\n\t"
  108475. #endif
  108476. #ifdef WOLFSSL_KEIL
  108477. "orrs r3, r3, r5\n\t"
  108478. #elif defined(__clang__)
  108479. "orrs r3, r5\n\t"
  108480. #else
  108481. "orr r3, r5\n\t"
  108482. #endif
  108483. "ldr r2, [%[a], #24]\n\t"
  108484. "str r3, [%[r], #16]\n\t"
  108485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108486. "lsls r5, r2, #31\n\t"
  108487. #else
  108488. "lsl r5, r2, #31\n\t"
  108489. #endif
  108490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108491. "lsrs r2, r2, #1\n\t"
  108492. #else
  108493. "lsr r2, r2, #1\n\t"
  108494. #endif
  108495. #ifdef WOLFSSL_KEIL
  108496. "orrs r4, r4, r5\n\t"
  108497. #elif defined(__clang__)
  108498. "orrs r4, r5\n\t"
  108499. #else
  108500. "orr r4, r5\n\t"
  108501. #endif
  108502. "ldr r3, [%[a], #28]\n\t"
  108503. "str r4, [%[r], #20]\n\t"
  108504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108505. "lsls r5, r3, #31\n\t"
  108506. #else
  108507. "lsl r5, r3, #31\n\t"
  108508. #endif
  108509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108510. "lsrs r3, r3, #1\n\t"
  108511. #else
  108512. "lsr r3, r3, #1\n\t"
  108513. #endif
  108514. #ifdef WOLFSSL_KEIL
  108515. "orrs r2, r2, r5\n\t"
  108516. #elif defined(__clang__)
  108517. "orrs r2, r5\n\t"
  108518. #else
  108519. "orr r2, r5\n\t"
  108520. #endif
  108521. "ldr r4, [%[a], #32]\n\t"
  108522. "str r2, [%[r], #24]\n\t"
  108523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108524. "lsls r5, r4, #31\n\t"
  108525. #else
  108526. "lsl r5, r4, #31\n\t"
  108527. #endif
  108528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108529. "lsrs r4, r4, #1\n\t"
  108530. #else
  108531. "lsr r4, r4, #1\n\t"
  108532. #endif
  108533. #ifdef WOLFSSL_KEIL
  108534. "orrs r3, r3, r5\n\t"
  108535. #elif defined(__clang__)
  108536. "orrs r3, r5\n\t"
  108537. #else
  108538. "orr r3, r5\n\t"
  108539. #endif
  108540. "ldr r2, [%[a], #36]\n\t"
  108541. "str r3, [%[r], #28]\n\t"
  108542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108543. "lsls r5, r2, #31\n\t"
  108544. #else
  108545. "lsl r5, r2, #31\n\t"
  108546. #endif
  108547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108548. "lsrs r2, r2, #1\n\t"
  108549. #else
  108550. "lsr r2, r2, #1\n\t"
  108551. #endif
  108552. #ifdef WOLFSSL_KEIL
  108553. "orrs r4, r4, r5\n\t"
  108554. #elif defined(__clang__)
  108555. "orrs r4, r5\n\t"
  108556. #else
  108557. "orr r4, r5\n\t"
  108558. #endif
  108559. "ldr r3, [%[a], #40]\n\t"
  108560. "str r4, [%[r], #32]\n\t"
  108561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108562. "lsls r5, r3, #31\n\t"
  108563. #else
  108564. "lsl r5, r3, #31\n\t"
  108565. #endif
  108566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108567. "lsrs r3, r3, #1\n\t"
  108568. #else
  108569. "lsr r3, r3, #1\n\t"
  108570. #endif
  108571. #ifdef WOLFSSL_KEIL
  108572. "orrs r2, r2, r5\n\t"
  108573. #elif defined(__clang__)
  108574. "orrs r2, r5\n\t"
  108575. #else
  108576. "orr r2, r5\n\t"
  108577. #endif
  108578. "ldr r4, [%[a], #44]\n\t"
  108579. "str r2, [%[r], #36]\n\t"
  108580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108581. "lsls r5, r4, #31\n\t"
  108582. #else
  108583. "lsl r5, r4, #31\n\t"
  108584. #endif
  108585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108586. "lsrs r4, r4, #1\n\t"
  108587. #else
  108588. "lsr r4, r4, #1\n\t"
  108589. #endif
  108590. #ifdef WOLFSSL_KEIL
  108591. "orrs r3, r3, r5\n\t"
  108592. #elif defined(__clang__)
  108593. "orrs r3, r5\n\t"
  108594. #else
  108595. "orr r3, r5\n\t"
  108596. #endif
  108597. "str r3, [%[r], #40]\n\t"
  108598. "str r4, [%[r], #44]\n\t"
  108599. : [r] "+r" (r), [a] "+r" (a)
  108600. :
  108601. : "memory", "r2", "r3", "r4", "r5"
  108602. );
  108603. }
  108604. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  108605. *
  108606. * r Result of division by 2.
  108607. * a Number to divide.
  108608. * m Modulus (prime).
  108609. */
  108610. SP_NOINLINE static void sp_384_div2_12(sp_digit* r, const sp_digit* a,
  108611. const sp_digit* m)
  108612. {
  108613. sp_digit o;
  108614. o = sp_384_cond_add_12(r, a, m, 0 - (a[0] & 1));
  108615. sp_384_rshift1_12(r, r);
  108616. r[11] |= o << 31;
  108617. }
  108618. /* Double the Montgomery form projective point p.
  108619. *
  108620. * r Result of doubling point.
  108621. * p Point to double.
  108622. * t Temporary ordinate data.
  108623. */
  108624. #ifdef WOLFSSL_SP_NONBLOCK
  108625. typedef struct sp_384_proj_point_dbl_12_ctx {
  108626. int state;
  108627. sp_digit* t1;
  108628. sp_digit* t2;
  108629. sp_digit* x;
  108630. sp_digit* y;
  108631. sp_digit* z;
  108632. } sp_384_proj_point_dbl_12_ctx;
  108633. static int sp_384_proj_point_dbl_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, const sp_point_384* p, sp_digit* t)
  108634. {
  108635. int err = FP_WOULDBLOCK;
  108636. sp_384_proj_point_dbl_12_ctx* ctx = (sp_384_proj_point_dbl_12_ctx*)sp_ctx->data;
  108637. typedef char ctx_size_test[sizeof(sp_384_proj_point_dbl_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  108638. (void)sizeof(ctx_size_test);
  108639. switch (ctx->state) {
  108640. case 0:
  108641. ctx->t1 = t;
  108642. ctx->t2 = t + 2*12;
  108643. ctx->x = r->x;
  108644. ctx->y = r->y;
  108645. ctx->z = r->z;
  108646. /* Put infinity into result. */
  108647. if (r != p) {
  108648. r->infinity = p->infinity;
  108649. }
  108650. ctx->state = 1;
  108651. break;
  108652. case 1:
  108653. /* T1 = Z * Z */
  108654. sp_384_mont_sqr_12(ctx->t1, p->z, p384_mod, p384_mp_mod);
  108655. ctx->state = 2;
  108656. break;
  108657. case 2:
  108658. /* Z = Y * Z */
  108659. sp_384_mont_mul_12(ctx->z, p->y, p->z, p384_mod, p384_mp_mod);
  108660. ctx->state = 3;
  108661. break;
  108662. case 3:
  108663. /* Z = 2Z */
  108664. sp_384_mont_dbl_12(ctx->z, ctx->z, p384_mod);
  108665. ctx->state = 4;
  108666. break;
  108667. case 4:
  108668. /* T2 = X - T1 */
  108669. sp_384_mont_sub_12(ctx->t2, p->x, ctx->t1, p384_mod);
  108670. ctx->state = 5;
  108671. break;
  108672. case 5:
  108673. /* T1 = X + T1 */
  108674. sp_384_mont_add_12(ctx->t1, p->x, ctx->t1, p384_mod);
  108675. ctx->state = 6;
  108676. break;
  108677. case 6:
  108678. /* T2 = T1 * T2 */
  108679. sp_384_mont_mul_12(ctx->t2, ctx->t1, ctx->t2, p384_mod, p384_mp_mod);
  108680. ctx->state = 7;
  108681. break;
  108682. case 7:
  108683. /* T1 = 3T2 */
  108684. sp_384_mont_tpl_12(ctx->t1, ctx->t2, p384_mod);
  108685. ctx->state = 8;
  108686. break;
  108687. case 8:
  108688. /* Y = 2Y */
  108689. sp_384_mont_dbl_12(ctx->y, p->y, p384_mod);
  108690. ctx->state = 9;
  108691. break;
  108692. case 9:
  108693. /* Y = Y * Y */
  108694. sp_384_mont_sqr_12(ctx->y, ctx->y, p384_mod, p384_mp_mod);
  108695. ctx->state = 10;
  108696. break;
  108697. case 10:
  108698. /* T2 = Y * Y */
  108699. sp_384_mont_sqr_12(ctx->t2, ctx->y, p384_mod, p384_mp_mod);
  108700. ctx->state = 11;
  108701. break;
  108702. case 11:
  108703. /* T2 = T2/2 */
  108704. sp_384_div2_12(ctx->t2, ctx->t2, p384_mod);
  108705. ctx->state = 12;
  108706. break;
  108707. case 12:
  108708. /* Y = Y * X */
  108709. sp_384_mont_mul_12(ctx->y, ctx->y, p->x, p384_mod, p384_mp_mod);
  108710. ctx->state = 13;
  108711. break;
  108712. case 13:
  108713. /* X = T1 * T1 */
  108714. sp_384_mont_sqr_12(ctx->x, ctx->t1, p384_mod, p384_mp_mod);
  108715. ctx->state = 14;
  108716. break;
  108717. case 14:
  108718. /* X = X - Y */
  108719. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  108720. ctx->state = 15;
  108721. break;
  108722. case 15:
  108723. /* X = X - Y */
  108724. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  108725. ctx->state = 16;
  108726. break;
  108727. case 16:
  108728. /* Y = Y - X */
  108729. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod);
  108730. ctx->state = 17;
  108731. break;
  108732. case 17:
  108733. /* Y = Y * T1 */
  108734. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t1, p384_mod, p384_mp_mod);
  108735. ctx->state = 18;
  108736. break;
  108737. case 18:
  108738. /* Y = Y - T2 */
  108739. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t2, p384_mod);
  108740. ctx->state = 19;
  108741. /* fall-through */
  108742. case 19:
  108743. err = MP_OKAY;
  108744. break;
  108745. }
  108746. if (err == MP_OKAY && ctx->state != 19) {
  108747. err = FP_WOULDBLOCK;
  108748. }
  108749. return err;
  108750. }
  108751. #endif /* WOLFSSL_SP_NONBLOCK */
  108752. static void sp_384_proj_point_dbl_12(sp_point_384* r, const sp_point_384* p, sp_digit* t)
  108753. {
  108754. sp_digit* t1 = t;
  108755. sp_digit* t2 = t + 2*12;
  108756. sp_digit* x;
  108757. sp_digit* y;
  108758. sp_digit* z;
  108759. x = r->x;
  108760. y = r->y;
  108761. z = r->z;
  108762. /* Put infinity into result. */
  108763. if (r != p) {
  108764. r->infinity = p->infinity;
  108765. }
  108766. /* T1 = Z * Z */
  108767. sp_384_mont_sqr_12(t1, p->z, p384_mod, p384_mp_mod);
  108768. /* Z = Y * Z */
  108769. sp_384_mont_mul_12(z, p->y, p->z, p384_mod, p384_mp_mod);
  108770. /* Z = 2Z */
  108771. sp_384_mont_dbl_12(z, z, p384_mod);
  108772. /* T2 = X - T1 */
  108773. sp_384_mont_sub_12(t2, p->x, t1, p384_mod);
  108774. /* T1 = X + T1 */
  108775. sp_384_mont_add_12(t1, p->x, t1, p384_mod);
  108776. /* T2 = T1 * T2 */
  108777. sp_384_mont_mul_12(t2, t1, t2, p384_mod, p384_mp_mod);
  108778. /* T1 = 3T2 */
  108779. sp_384_mont_tpl_12(t1, t2, p384_mod);
  108780. /* Y = 2Y */
  108781. sp_384_mont_dbl_12(y, p->y, p384_mod);
  108782. /* Y = Y * Y */
  108783. sp_384_mont_sqr_12(y, y, p384_mod, p384_mp_mod);
  108784. /* T2 = Y * Y */
  108785. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  108786. /* T2 = T2/2 */
  108787. sp_384_div2_12(t2, t2, p384_mod);
  108788. /* Y = Y * X */
  108789. sp_384_mont_mul_12(y, y, p->x, p384_mod, p384_mp_mod);
  108790. /* X = T1 * T1 */
  108791. sp_384_mont_sqr_12(x, t1, p384_mod, p384_mp_mod);
  108792. /* X = X - Y */
  108793. sp_384_mont_sub_12(x, x, y, p384_mod);
  108794. /* X = X - Y */
  108795. sp_384_mont_sub_12(x, x, y, p384_mod);
  108796. /* Y = Y - X */
  108797. sp_384_mont_sub_12(y, y, x, p384_mod);
  108798. /* Y = Y * T1 */
  108799. sp_384_mont_mul_12(y, y, t1, p384_mod, p384_mp_mod);
  108800. /* Y = Y - T2 */
  108801. sp_384_mont_sub_12(y, y, t2, p384_mod);
  108802. }
  108803. /* Compare two numbers to determine if they are equal.
  108804. * Constant time implementation.
  108805. *
  108806. * a First number to compare.
  108807. * b Second number to compare.
  108808. * returns 1 when equal and 0 otherwise.
  108809. */
  108810. static int sp_384_cmp_equal_12(const sp_digit* a, const sp_digit* b)
  108811. {
  108812. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  108813. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  108814. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  108815. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11])) == 0;
  108816. }
  108817. /* Add two Montgomery form projective points.
  108818. *
  108819. * r Result of addition.
  108820. * p First point to add.
  108821. * q Second point to add.
  108822. * t Temporary ordinate data.
  108823. */
  108824. #ifdef WOLFSSL_SP_NONBLOCK
  108825. typedef struct sp_384_proj_point_add_12_ctx {
  108826. int state;
  108827. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  108828. const sp_point_384* ap[2];
  108829. sp_point_384* rp[2];
  108830. sp_digit* t1;
  108831. sp_digit* t2;
  108832. sp_digit* t3;
  108833. sp_digit* t4;
  108834. sp_digit* t5;
  108835. sp_digit* x;
  108836. sp_digit* y;
  108837. sp_digit* z;
  108838. } sp_384_proj_point_add_12_ctx;
  108839. static int sp_384_proj_point_add_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r,
  108840. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  108841. {
  108842. int err = FP_WOULDBLOCK;
  108843. sp_384_proj_point_add_12_ctx* ctx = (sp_384_proj_point_add_12_ctx*)sp_ctx->data;
  108844. /* Ensure only the first point is the same as the result. */
  108845. if (q == r) {
  108846. const sp_point_384* a = p;
  108847. p = q;
  108848. q = a;
  108849. }
  108850. typedef char ctx_size_test[sizeof(sp_384_proj_point_add_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  108851. (void)sizeof(ctx_size_test);
  108852. switch (ctx->state) {
  108853. case 0: /* INIT */
  108854. ctx->t1 = t;
  108855. ctx->t2 = t + 2*12;
  108856. ctx->t3 = t + 4*12;
  108857. ctx->t4 = t + 6*12;
  108858. ctx->t5 = t + 8*12;
  108859. ctx->state = 1;
  108860. break;
  108861. case 1:
  108862. /* Check double */
  108863. (void)sp_384_sub_12(ctx->t1, p384_mod, q->y);
  108864. sp_384_norm_12(ctx->t1);
  108865. if ((sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  108866. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, ctx->t1))) != 0)
  108867. {
  108868. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  108869. ctx->state = 2;
  108870. }
  108871. else {
  108872. ctx->state = 3;
  108873. }
  108874. break;
  108875. case 2:
  108876. err = sp_384_proj_point_dbl_12_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  108877. if (err == MP_OKAY)
  108878. ctx->state = 27; /* done */
  108879. break;
  108880. case 3:
  108881. {
  108882. int i;
  108883. ctx->rp[0] = r;
  108884. /*lint allow cast to different type of pointer*/
  108885. ctx->rp[1] = (sp_point_384*)t; /*lint !e9087 !e740*/
  108886. XMEMSET(ctx->rp[1], 0, sizeof(sp_point_384));
  108887. ctx->x = ctx->rp[p->infinity | q->infinity]->x;
  108888. ctx->y = ctx->rp[p->infinity | q->infinity]->y;
  108889. ctx->z = ctx->rp[p->infinity | q->infinity]->z;
  108890. ctx->ap[0] = p;
  108891. ctx->ap[1] = q;
  108892. for (i=0; i<12; i++) {
  108893. r->x[i] = ctx->ap[p->infinity]->x[i];
  108894. }
  108895. for (i=0; i<12; i++) {
  108896. r->y[i] = ctx->ap[p->infinity]->y[i];
  108897. }
  108898. for (i=0; i<12; i++) {
  108899. r->z[i] = ctx->ap[p->infinity]->z[i];
  108900. }
  108901. r->infinity = ctx->ap[p->infinity]->infinity;
  108902. ctx->state = 4;
  108903. break;
  108904. }
  108905. case 4:
  108906. /* U1 = X1*Z2^2 */
  108907. sp_384_mont_sqr_12(ctx->t1, q->z, p384_mod, p384_mp_mod);
  108908. ctx->state = 5;
  108909. break;
  108910. case 5:
  108911. sp_384_mont_mul_12(ctx->t3, ctx->t1, q->z, p384_mod, p384_mp_mod);
  108912. ctx->state = 6;
  108913. break;
  108914. case 6:
  108915. sp_384_mont_mul_12(ctx->t1, ctx->t1, ctx->x, p384_mod, p384_mp_mod);
  108916. ctx->state = 7;
  108917. break;
  108918. case 7:
  108919. /* U2 = X2*Z1^2 */
  108920. sp_384_mont_sqr_12(ctx->t2, ctx->z, p384_mod, p384_mp_mod);
  108921. ctx->state = 8;
  108922. break;
  108923. case 8:
  108924. sp_384_mont_mul_12(ctx->t4, ctx->t2, ctx->z, p384_mod, p384_mp_mod);
  108925. ctx->state = 9;
  108926. break;
  108927. case 9:
  108928. sp_384_mont_mul_12(ctx->t2, ctx->t2, q->x, p384_mod, p384_mp_mod);
  108929. ctx->state = 10;
  108930. break;
  108931. case 10:
  108932. /* S1 = Y1*Z2^3 */
  108933. sp_384_mont_mul_12(ctx->t3, ctx->t3, ctx->y, p384_mod, p384_mp_mod);
  108934. ctx->state = 11;
  108935. break;
  108936. case 11:
  108937. /* S2 = Y2*Z1^3 */
  108938. sp_384_mont_mul_12(ctx->t4, ctx->t4, q->y, p384_mod, p384_mp_mod);
  108939. ctx->state = 12;
  108940. break;
  108941. case 12:
  108942. /* H = U2 - U1 */
  108943. sp_384_mont_sub_12(ctx->t2, ctx->t2, ctx->t1, p384_mod);
  108944. ctx->state = 13;
  108945. break;
  108946. case 13:
  108947. /* R = S2 - S1 */
  108948. sp_384_mont_sub_12(ctx->t4, ctx->t4, ctx->t3, p384_mod);
  108949. ctx->state = 14;
  108950. break;
  108951. case 14:
  108952. /* Z3 = H*Z1*Z2 */
  108953. sp_384_mont_mul_12(ctx->z, ctx->z, q->z, p384_mod, p384_mp_mod);
  108954. ctx->state = 15;
  108955. break;
  108956. case 15:
  108957. sp_384_mont_mul_12(ctx->z, ctx->z, ctx->t2, p384_mod, p384_mp_mod);
  108958. ctx->state = 16;
  108959. break;
  108960. case 16:
  108961. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  108962. sp_384_mont_sqr_12(ctx->x, ctx->t4, p384_mod, p384_mp_mod);
  108963. ctx->state = 17;
  108964. break;
  108965. case 17:
  108966. sp_384_mont_sqr_12(ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  108967. ctx->state = 18;
  108968. break;
  108969. case 18:
  108970. sp_384_mont_mul_12(ctx->y, ctx->t1, ctx->t5, p384_mod, p384_mp_mod);
  108971. ctx->state = 19;
  108972. break;
  108973. case 19:
  108974. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  108975. ctx->state = 20;
  108976. break;
  108977. case 20:
  108978. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t5, p384_mod);
  108979. ctx->state = 21;
  108980. break;
  108981. case 21:
  108982. sp_384_mont_dbl_12(ctx->t1, ctx->y, p384_mod);
  108983. ctx->state = 22;
  108984. break;
  108985. case 22:
  108986. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t1, p384_mod);
  108987. ctx->state = 23;
  108988. break;
  108989. case 23:
  108990. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  108991. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod);
  108992. ctx->state = 24;
  108993. break;
  108994. case 24:
  108995. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t4, p384_mod, p384_mp_mod);
  108996. ctx->state = 25;
  108997. break;
  108998. case 25:
  108999. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t3, p384_mod, p384_mp_mod);
  109000. ctx->state = 26;
  109001. break;
  109002. case 26:
  109003. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t5, p384_mod);
  109004. ctx->state = 27;
  109005. /* fall-through */
  109006. case 27:
  109007. err = MP_OKAY;
  109008. break;
  109009. }
  109010. if (err == MP_OKAY && ctx->state != 27) {
  109011. err = FP_WOULDBLOCK;
  109012. }
  109013. return err;
  109014. }
  109015. #endif /* WOLFSSL_SP_NONBLOCK */
  109016. static void sp_384_proj_point_add_12(sp_point_384* r,
  109017. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  109018. {
  109019. const sp_point_384* ap[2];
  109020. sp_point_384* rp[2];
  109021. sp_digit* t1 = t;
  109022. sp_digit* t2 = t + 2*12;
  109023. sp_digit* t3 = t + 4*12;
  109024. sp_digit* t4 = t + 6*12;
  109025. sp_digit* t5 = t + 8*12;
  109026. sp_digit* x;
  109027. sp_digit* y;
  109028. sp_digit* z;
  109029. int i;
  109030. /* Ensure only the first point is the same as the result. */
  109031. if (q == r) {
  109032. const sp_point_384* a = p;
  109033. p = q;
  109034. q = a;
  109035. }
  109036. /* Check double */
  109037. (void)sp_384_sub_12(t1, p384_mod, q->y);
  109038. sp_384_norm_12(t1);
  109039. if ((sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  109040. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, t1))) != 0) {
  109041. sp_384_proj_point_dbl_12(r, p, t);
  109042. }
  109043. else {
  109044. rp[0] = r;
  109045. /*lint allow cast to different type of pointer*/
  109046. rp[1] = (sp_point_384*)t; /*lint !e9087 !e740*/
  109047. XMEMSET(rp[1], 0, sizeof(sp_point_384));
  109048. x = rp[p->infinity | q->infinity]->x;
  109049. y = rp[p->infinity | q->infinity]->y;
  109050. z = rp[p->infinity | q->infinity]->z;
  109051. ap[0] = p;
  109052. ap[1] = q;
  109053. for (i=0; i<12; i++) {
  109054. r->x[i] = ap[p->infinity]->x[i];
  109055. }
  109056. for (i=0; i<12; i++) {
  109057. r->y[i] = ap[p->infinity]->y[i];
  109058. }
  109059. for (i=0; i<12; i++) {
  109060. r->z[i] = ap[p->infinity]->z[i];
  109061. }
  109062. r->infinity = ap[p->infinity]->infinity;
  109063. /* U1 = X1*Z2^2 */
  109064. sp_384_mont_sqr_12(t1, q->z, p384_mod, p384_mp_mod);
  109065. sp_384_mont_mul_12(t3, t1, q->z, p384_mod, p384_mp_mod);
  109066. sp_384_mont_mul_12(t1, t1, x, p384_mod, p384_mp_mod);
  109067. /* U2 = X2*Z1^2 */
  109068. sp_384_mont_sqr_12(t2, z, p384_mod, p384_mp_mod);
  109069. sp_384_mont_mul_12(t4, t2, z, p384_mod, p384_mp_mod);
  109070. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  109071. /* S1 = Y1*Z2^3 */
  109072. sp_384_mont_mul_12(t3, t3, y, p384_mod, p384_mp_mod);
  109073. /* S2 = Y2*Z1^3 */
  109074. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  109075. /* H = U2 - U1 */
  109076. sp_384_mont_sub_12(t2, t2, t1, p384_mod);
  109077. /* R = S2 - S1 */
  109078. sp_384_mont_sub_12(t4, t4, t3, p384_mod);
  109079. /* Z3 = H*Z1*Z2 */
  109080. sp_384_mont_mul_12(z, z, q->z, p384_mod, p384_mp_mod);
  109081. sp_384_mont_mul_12(z, z, t2, p384_mod, p384_mp_mod);
  109082. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  109083. sp_384_mont_sqr_12(x, t4, p384_mod, p384_mp_mod);
  109084. sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod);
  109085. sp_384_mont_mul_12(y, t1, t5, p384_mod, p384_mp_mod);
  109086. sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod);
  109087. sp_384_mont_sub_12(x, x, t5, p384_mod);
  109088. sp_384_mont_dbl_12(t1, y, p384_mod);
  109089. sp_384_mont_sub_12(x, x, t1, p384_mod);
  109090. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  109091. sp_384_mont_sub_12(y, y, x, p384_mod);
  109092. sp_384_mont_mul_12(y, y, t4, p384_mod, p384_mp_mod);
  109093. sp_384_mont_mul_12(t5, t5, t3, p384_mod, p384_mp_mod);
  109094. sp_384_mont_sub_12(y, y, t5, p384_mod);
  109095. }
  109096. }
  109097. #ifndef WC_NO_CACHE_RESISTANT
  109098. /* Touch each possible point that could be being copied.
  109099. *
  109100. * r Point to copy into.
  109101. * table Table - start of the entires to access
  109102. * idx Index of entry to retrieve.
  109103. */
  109104. static void sp_384_get_point_16_12(sp_point_384* r, const sp_point_384* table,
  109105. int idx)
  109106. {
  109107. int i;
  109108. sp_digit mask;
  109109. r->x[0] = 0;
  109110. r->x[1] = 0;
  109111. r->x[2] = 0;
  109112. r->x[3] = 0;
  109113. r->x[4] = 0;
  109114. r->x[5] = 0;
  109115. r->x[6] = 0;
  109116. r->x[7] = 0;
  109117. r->x[8] = 0;
  109118. r->x[9] = 0;
  109119. r->x[10] = 0;
  109120. r->x[11] = 0;
  109121. r->y[0] = 0;
  109122. r->y[1] = 0;
  109123. r->y[2] = 0;
  109124. r->y[3] = 0;
  109125. r->y[4] = 0;
  109126. r->y[5] = 0;
  109127. r->y[6] = 0;
  109128. r->y[7] = 0;
  109129. r->y[8] = 0;
  109130. r->y[9] = 0;
  109131. r->y[10] = 0;
  109132. r->y[11] = 0;
  109133. r->z[0] = 0;
  109134. r->z[1] = 0;
  109135. r->z[2] = 0;
  109136. r->z[3] = 0;
  109137. r->z[4] = 0;
  109138. r->z[5] = 0;
  109139. r->z[6] = 0;
  109140. r->z[7] = 0;
  109141. r->z[8] = 0;
  109142. r->z[9] = 0;
  109143. r->z[10] = 0;
  109144. r->z[11] = 0;
  109145. for (i = 1; i < 16; i++) {
  109146. mask = 0 - (i == idx);
  109147. r->x[0] |= mask & table[i].x[0];
  109148. r->x[1] |= mask & table[i].x[1];
  109149. r->x[2] |= mask & table[i].x[2];
  109150. r->x[3] |= mask & table[i].x[3];
  109151. r->x[4] |= mask & table[i].x[4];
  109152. r->x[5] |= mask & table[i].x[5];
  109153. r->x[6] |= mask & table[i].x[6];
  109154. r->x[7] |= mask & table[i].x[7];
  109155. r->x[8] |= mask & table[i].x[8];
  109156. r->x[9] |= mask & table[i].x[9];
  109157. r->x[10] |= mask & table[i].x[10];
  109158. r->x[11] |= mask & table[i].x[11];
  109159. r->y[0] |= mask & table[i].y[0];
  109160. r->y[1] |= mask & table[i].y[1];
  109161. r->y[2] |= mask & table[i].y[2];
  109162. r->y[3] |= mask & table[i].y[3];
  109163. r->y[4] |= mask & table[i].y[4];
  109164. r->y[5] |= mask & table[i].y[5];
  109165. r->y[6] |= mask & table[i].y[6];
  109166. r->y[7] |= mask & table[i].y[7];
  109167. r->y[8] |= mask & table[i].y[8];
  109168. r->y[9] |= mask & table[i].y[9];
  109169. r->y[10] |= mask & table[i].y[10];
  109170. r->y[11] |= mask & table[i].y[11];
  109171. r->z[0] |= mask & table[i].z[0];
  109172. r->z[1] |= mask & table[i].z[1];
  109173. r->z[2] |= mask & table[i].z[2];
  109174. r->z[3] |= mask & table[i].z[3];
  109175. r->z[4] |= mask & table[i].z[4];
  109176. r->z[5] |= mask & table[i].z[5];
  109177. r->z[6] |= mask & table[i].z[6];
  109178. r->z[7] |= mask & table[i].z[7];
  109179. r->z[8] |= mask & table[i].z[8];
  109180. r->z[9] |= mask & table[i].z[9];
  109181. r->z[10] |= mask & table[i].z[10];
  109182. r->z[11] |= mask & table[i].z[11];
  109183. }
  109184. }
  109185. #endif /* !WC_NO_CACHE_RESISTANT */
  109186. /* Multiply the point by the scalar and return the result.
  109187. * If map is true then convert result to affine coordinates.
  109188. *
  109189. * Fast implementation that generates a pre-computation table.
  109190. * 4 bits of window (no sliding!).
  109191. * Uses add and double for calculating table.
  109192. * 384 doubles.
  109193. * 108 adds.
  109194. *
  109195. * r Resulting point.
  109196. * g Point to multiply.
  109197. * k Scalar to multiply by.
  109198. * map Indicates whether to convert result to affine.
  109199. * ct Constant time required.
  109200. * heap Heap to use for allocation.
  109201. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  109202. */
  109203. static int sp_384_ecc_mulmod_fast_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  109204. int map, int ct, void* heap)
  109205. {
  109206. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109207. sp_point_384* t = NULL;
  109208. sp_digit* tmp = NULL;
  109209. #else
  109210. sp_point_384 t[16 + 1];
  109211. sp_digit tmp[2 * 12 * 6];
  109212. #endif
  109213. sp_point_384* rt = NULL;
  109214. #ifndef WC_NO_CACHE_RESISTANT
  109215. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109216. sp_point_384* p = NULL;
  109217. #else
  109218. sp_point_384 p[1];
  109219. #endif
  109220. #endif /* !WC_NO_CACHE_RESISTANT */
  109221. sp_digit n;
  109222. int i;
  109223. int c;
  109224. int y;
  109225. int err = MP_OKAY;
  109226. /* Constant time used for cache attack resistance implementation. */
  109227. (void)ct;
  109228. (void)heap;
  109229. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109230. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (16 + 1),
  109231. heap, DYNAMIC_TYPE_ECC);
  109232. if (t == NULL)
  109233. err = MEMORY_E;
  109234. #ifndef WC_NO_CACHE_RESISTANT
  109235. if (err == MP_OKAY) {
  109236. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384),
  109237. heap, DYNAMIC_TYPE_ECC);
  109238. if (p == NULL)
  109239. err = MEMORY_E;
  109240. }
  109241. #endif
  109242. if (err == MP_OKAY) {
  109243. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  109244. DYNAMIC_TYPE_ECC);
  109245. if (tmp == NULL)
  109246. err = MEMORY_E;
  109247. }
  109248. #endif
  109249. if (err == MP_OKAY) {
  109250. rt = t + 16;
  109251. /* t[0] = {0, 0, 1} * norm */
  109252. XMEMSET(&t[0], 0, sizeof(t[0]));
  109253. t[0].infinity = 1;
  109254. /* t[1] = {g->x, g->y, g->z} * norm */
  109255. (void)sp_384_mod_mul_norm_12(t[1].x, g->x, p384_mod);
  109256. (void)sp_384_mod_mul_norm_12(t[1].y, g->y, p384_mod);
  109257. (void)sp_384_mod_mul_norm_12(t[1].z, g->z, p384_mod);
  109258. t[1].infinity = 0;
  109259. sp_384_proj_point_dbl_12(&t[ 2], &t[ 1], tmp);
  109260. t[ 2].infinity = 0;
  109261. sp_384_proj_point_add_12(&t[ 3], &t[ 2], &t[ 1], tmp);
  109262. t[ 3].infinity = 0;
  109263. sp_384_proj_point_dbl_12(&t[ 4], &t[ 2], tmp);
  109264. t[ 4].infinity = 0;
  109265. sp_384_proj_point_add_12(&t[ 5], &t[ 3], &t[ 2], tmp);
  109266. t[ 5].infinity = 0;
  109267. sp_384_proj_point_dbl_12(&t[ 6], &t[ 3], tmp);
  109268. t[ 6].infinity = 0;
  109269. sp_384_proj_point_add_12(&t[ 7], &t[ 4], &t[ 3], tmp);
  109270. t[ 7].infinity = 0;
  109271. sp_384_proj_point_dbl_12(&t[ 8], &t[ 4], tmp);
  109272. t[ 8].infinity = 0;
  109273. sp_384_proj_point_add_12(&t[ 9], &t[ 5], &t[ 4], tmp);
  109274. t[ 9].infinity = 0;
  109275. sp_384_proj_point_dbl_12(&t[10], &t[ 5], tmp);
  109276. t[10].infinity = 0;
  109277. sp_384_proj_point_add_12(&t[11], &t[ 6], &t[ 5], tmp);
  109278. t[11].infinity = 0;
  109279. sp_384_proj_point_dbl_12(&t[12], &t[ 6], tmp);
  109280. t[12].infinity = 0;
  109281. sp_384_proj_point_add_12(&t[13], &t[ 7], &t[ 6], tmp);
  109282. t[13].infinity = 0;
  109283. sp_384_proj_point_dbl_12(&t[14], &t[ 7], tmp);
  109284. t[14].infinity = 0;
  109285. sp_384_proj_point_add_12(&t[15], &t[ 8], &t[ 7], tmp);
  109286. t[15].infinity = 0;
  109287. i = 10;
  109288. n = k[i+1] << 0;
  109289. c = 28;
  109290. y = (int)(n >> 28);
  109291. #ifndef WC_NO_CACHE_RESISTANT
  109292. if (ct) {
  109293. sp_384_get_point_16_12(rt, t, y);
  109294. rt->infinity = !y;
  109295. }
  109296. else
  109297. #endif
  109298. {
  109299. XMEMCPY(rt, &t[y], sizeof(sp_point_384));
  109300. }
  109301. n <<= 4;
  109302. for (; i>=0 || c>=4; ) {
  109303. if (c < 4) {
  109304. n |= k[i--];
  109305. c += 32;
  109306. }
  109307. y = (n >> 28) & 0xf;
  109308. n <<= 4;
  109309. c -= 4;
  109310. sp_384_proj_point_dbl_12(rt, rt, tmp);
  109311. sp_384_proj_point_dbl_12(rt, rt, tmp);
  109312. sp_384_proj_point_dbl_12(rt, rt, tmp);
  109313. sp_384_proj_point_dbl_12(rt, rt, tmp);
  109314. #ifndef WC_NO_CACHE_RESISTANT
  109315. if (ct) {
  109316. sp_384_get_point_16_12(p, t, y);
  109317. p->infinity = !y;
  109318. sp_384_proj_point_add_12(rt, rt, p, tmp);
  109319. }
  109320. else
  109321. #endif
  109322. {
  109323. sp_384_proj_point_add_12(rt, rt, &t[y], tmp);
  109324. }
  109325. }
  109326. if (map != 0) {
  109327. sp_384_map_12(r, rt, tmp);
  109328. }
  109329. else {
  109330. XMEMCPY(r, rt, sizeof(sp_point_384));
  109331. }
  109332. }
  109333. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109334. if (tmp != NULL)
  109335. #endif
  109336. {
  109337. ForceZero(tmp, sizeof(sp_digit) * 2 * 12 * 6);
  109338. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109339. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  109340. #endif
  109341. }
  109342. #ifndef WC_NO_CACHE_RESISTANT
  109343. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109344. if (p != NULL)
  109345. #endif
  109346. {
  109347. ForceZero(p, sizeof(sp_point_384));
  109348. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109349. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  109350. #endif
  109351. }
  109352. #endif /* !WC_NO_CACHE_RESISTANT */
  109353. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109354. if (t != NULL)
  109355. #endif
  109356. {
  109357. ForceZero(t, sizeof(sp_point_384) * 17);
  109358. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109359. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  109360. #endif
  109361. }
  109362. return err;
  109363. }
  109364. #ifdef FP_ECC
  109365. /* Double the Montgomery form projective point p a number of times.
  109366. *
  109367. * r Result of repeated doubling of point.
  109368. * p Point to double.
  109369. * n Number of times to double
  109370. * t Temporary ordinate data.
  109371. */
  109372. static void sp_384_proj_point_dbl_n_12(sp_point_384* p, int n,
  109373. sp_digit* t)
  109374. {
  109375. sp_digit* w = t;
  109376. sp_digit* a = t + 2*12;
  109377. sp_digit* b = t + 4*12;
  109378. sp_digit* t1 = t + 6*12;
  109379. sp_digit* t2 = t + 8*12;
  109380. sp_digit* x;
  109381. sp_digit* y;
  109382. sp_digit* z;
  109383. x = p->x;
  109384. y = p->y;
  109385. z = p->z;
  109386. /* Y = 2*Y */
  109387. sp_384_mont_dbl_12(y, y, p384_mod);
  109388. /* W = Z^4 */
  109389. sp_384_mont_sqr_12(w, z, p384_mod, p384_mp_mod);
  109390. sp_384_mont_sqr_12(w, w, p384_mod, p384_mp_mod);
  109391. #ifndef WOLFSSL_SP_SMALL
  109392. while (--n > 0)
  109393. #else
  109394. while (--n >= 0)
  109395. #endif
  109396. {
  109397. /* A = 3*(X^2 - W) */
  109398. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  109399. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  109400. sp_384_mont_tpl_12(a, t1, p384_mod);
  109401. /* B = X*Y^2 */
  109402. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  109403. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  109404. /* X = A^2 - 2B */
  109405. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  109406. sp_384_mont_dbl_12(t2, b, p384_mod);
  109407. sp_384_mont_sub_12(x, x, t2, p384_mod);
  109408. /* Z = Z*Y */
  109409. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  109410. /* t2 = Y^4 */
  109411. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  109412. #ifdef WOLFSSL_SP_SMALL
  109413. if (n != 0)
  109414. #endif
  109415. {
  109416. /* W = W*Y^4 */
  109417. sp_384_mont_mul_12(w, w, t1, p384_mod, p384_mp_mod);
  109418. }
  109419. /* y = 2*A*(B - X) - Y^4 */
  109420. sp_384_mont_sub_12(y, b, x, p384_mod);
  109421. sp_384_mont_mul_12(y, y, a, p384_mod, p384_mp_mod);
  109422. sp_384_mont_dbl_12(y, y, p384_mod);
  109423. sp_384_mont_sub_12(y, y, t1, p384_mod);
  109424. }
  109425. #ifndef WOLFSSL_SP_SMALL
  109426. /* A = 3*(X^2 - W) */
  109427. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  109428. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  109429. sp_384_mont_tpl_12(a, t1, p384_mod);
  109430. /* B = X*Y^2 */
  109431. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  109432. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  109433. /* X = A^2 - 2B */
  109434. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  109435. sp_384_mont_dbl_12(t2, b, p384_mod);
  109436. sp_384_mont_sub_12(x, x, t2, p384_mod);
  109437. /* Z = Z*Y */
  109438. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  109439. /* t2 = Y^4 */
  109440. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  109441. /* y = 2*A*(B - X) - Y^4 */
  109442. sp_384_mont_sub_12(y, b, x, p384_mod);
  109443. sp_384_mont_mul_12(y, y, a, p384_mod, p384_mp_mod);
  109444. sp_384_mont_dbl_12(y, y, p384_mod);
  109445. sp_384_mont_sub_12(y, y, t1, p384_mod);
  109446. #endif
  109447. /* Y = Y/2 */
  109448. sp_384_div2_12(y, y, p384_mod);
  109449. }
  109450. /* Convert the projective point to affine.
  109451. * Ordinates are in Montgomery form.
  109452. *
  109453. * a Point to convert.
  109454. * t Temporary data.
  109455. */
  109456. static void sp_384_proj_to_affine_12(sp_point_384* a, sp_digit* t)
  109457. {
  109458. sp_digit* t1 = t;
  109459. sp_digit* t2 = t + 2 * 12;
  109460. sp_digit* tmp = t + 4 * 12;
  109461. sp_384_mont_inv_12(t1, a->z, tmp);
  109462. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  109463. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  109464. sp_384_mont_mul_12(a->x, a->x, t2, p384_mod, p384_mp_mod);
  109465. sp_384_mont_mul_12(a->y, a->y, t1, p384_mod, p384_mp_mod);
  109466. XMEMCPY(a->z, p384_norm_mod, sizeof(p384_norm_mod));
  109467. }
  109468. #endif /* FP_ECC */
  109469. /* A table entry for pre-computed points. */
  109470. typedef struct sp_table_entry_384 {
  109471. sp_digit x[12];
  109472. sp_digit y[12];
  109473. } sp_table_entry_384;
  109474. #ifdef FP_ECC
  109475. #endif /* FP_ECC */
  109476. /* Add two Montgomery form projective points. The second point has a q value of
  109477. * one.
  109478. * Only the first point can be the same pointer as the result point.
  109479. *
  109480. * r Result of addition.
  109481. * p First point to add.
  109482. * q Second point to add.
  109483. * t Temporary ordinate data.
  109484. */
  109485. static void sp_384_proj_point_add_qz1_12(sp_point_384* r, const sp_point_384* p,
  109486. const sp_point_384* q, sp_digit* t)
  109487. {
  109488. const sp_point_384* ap[2];
  109489. sp_point_384* rp[2];
  109490. sp_digit* t1 = t;
  109491. sp_digit* t2 = t + 2*12;
  109492. sp_digit* t3 = t + 4*12;
  109493. sp_digit* t4 = t + 6*12;
  109494. sp_digit* t5 = t + 8*12;
  109495. sp_digit* x;
  109496. sp_digit* y;
  109497. sp_digit* z;
  109498. int i;
  109499. /* Check double */
  109500. (void)sp_384_sub_12(t1, p384_mod, q->y);
  109501. sp_384_norm_12(t1);
  109502. if ((sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  109503. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, t1))) != 0) {
  109504. sp_384_proj_point_dbl_12(r, p, t);
  109505. }
  109506. else {
  109507. rp[0] = r;
  109508. /*lint allow cast to different type of pointer*/
  109509. rp[1] = (sp_point_384*)t; /*lint !e9087 !e740*/
  109510. XMEMSET(rp[1], 0, sizeof(sp_point_384));
  109511. x = rp[p->infinity | q->infinity]->x;
  109512. y = rp[p->infinity | q->infinity]->y;
  109513. z = rp[p->infinity | q->infinity]->z;
  109514. ap[0] = p;
  109515. ap[1] = q;
  109516. for (i=0; i<12; i++) {
  109517. r->x[i] = ap[p->infinity]->x[i];
  109518. }
  109519. for (i=0; i<12; i++) {
  109520. r->y[i] = ap[p->infinity]->y[i];
  109521. }
  109522. for (i=0; i<12; i++) {
  109523. r->z[i] = ap[p->infinity]->z[i];
  109524. }
  109525. r->infinity = ap[p->infinity]->infinity;
  109526. /* U2 = X2*Z1^2 */
  109527. sp_384_mont_sqr_12(t2, z, p384_mod, p384_mp_mod);
  109528. sp_384_mont_mul_12(t4, t2, z, p384_mod, p384_mp_mod);
  109529. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  109530. /* S2 = Y2*Z1^3 */
  109531. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  109532. /* H = U2 - X1 */
  109533. sp_384_mont_sub_12(t2, t2, x, p384_mod);
  109534. /* R = S2 - Y1 */
  109535. sp_384_mont_sub_12(t4, t4, y, p384_mod);
  109536. /* Z3 = H*Z1 */
  109537. sp_384_mont_mul_12(z, z, t2, p384_mod, p384_mp_mod);
  109538. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  109539. sp_384_mont_sqr_12(t1, t4, p384_mod, p384_mp_mod);
  109540. sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod);
  109541. sp_384_mont_mul_12(t3, x, t5, p384_mod, p384_mp_mod);
  109542. sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod);
  109543. sp_384_mont_sub_12(x, t1, t5, p384_mod);
  109544. sp_384_mont_dbl_12(t1, t3, p384_mod);
  109545. sp_384_mont_sub_12(x, x, t1, p384_mod);
  109546. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  109547. sp_384_mont_sub_12(t3, t3, x, p384_mod);
  109548. sp_384_mont_mul_12(t3, t3, t4, p384_mod, p384_mp_mod);
  109549. sp_384_mont_mul_12(t5, t5, y, p384_mod, p384_mp_mod);
  109550. sp_384_mont_sub_12(y, t3, t5, p384_mod);
  109551. }
  109552. }
  109553. #ifdef WOLFSSL_SP_SMALL
  109554. #ifdef FP_ECC
  109555. /* Generate the pre-computed table of points for the base point.
  109556. *
  109557. * width = 4
  109558. * 16 entries
  109559. * 96 bits between
  109560. *
  109561. * a The base point.
  109562. * table Place to store generated point data.
  109563. * tmp Temporary data.
  109564. * heap Heap to use for allocation.
  109565. */
  109566. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  109567. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  109568. {
  109569. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109570. sp_point_384* t = NULL;
  109571. #else
  109572. sp_point_384 t[3];
  109573. #endif
  109574. sp_point_384* s1 = NULL;
  109575. sp_point_384* s2 = NULL;
  109576. int i;
  109577. int j;
  109578. int err = MP_OKAY;
  109579. (void)heap;
  109580. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109581. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  109582. DYNAMIC_TYPE_ECC);
  109583. if (t == NULL)
  109584. err = MEMORY_E;
  109585. #endif
  109586. if (err == MP_OKAY) {
  109587. s1 = t + 1;
  109588. s2 = t + 2;
  109589. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  109590. }
  109591. if (err == MP_OKAY) {
  109592. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  109593. }
  109594. if (err == MP_OKAY) {
  109595. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  109596. }
  109597. if (err == MP_OKAY) {
  109598. t->infinity = 0;
  109599. sp_384_proj_to_affine_12(t, tmp);
  109600. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  109601. s1->infinity = 0;
  109602. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  109603. s2->infinity = 0;
  109604. /* table[0] = {0, 0, infinity} */
  109605. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  109606. /* table[1] = Affine version of 'a' in Montgomery form */
  109607. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  109608. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  109609. for (i=1; i<4; i++) {
  109610. sp_384_proj_point_dbl_n_12(t, 96, tmp);
  109611. sp_384_proj_to_affine_12(t, tmp);
  109612. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  109613. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  109614. }
  109615. for (i=1; i<4; i++) {
  109616. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  109617. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  109618. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  109619. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  109620. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  109621. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  109622. sp_384_proj_to_affine_12(t, tmp);
  109623. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  109624. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  109625. }
  109626. }
  109627. }
  109628. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109629. if (t != NULL)
  109630. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  109631. #endif
  109632. return err;
  109633. }
  109634. #endif /* FP_ECC */
  109635. #ifndef WC_NO_CACHE_RESISTANT
  109636. /* Touch each possible entry that could be being copied.
  109637. *
  109638. * r Point to copy into.
  109639. * table Table - start of the entires to access
  109640. * idx Index of entry to retrieve.
  109641. */
  109642. static void sp_384_get_entry_16_12(sp_point_384* r,
  109643. const sp_table_entry_384* table, int idx)
  109644. {
  109645. int i;
  109646. sp_digit mask;
  109647. r->x[0] = 0;
  109648. r->x[1] = 0;
  109649. r->x[2] = 0;
  109650. r->x[3] = 0;
  109651. r->x[4] = 0;
  109652. r->x[5] = 0;
  109653. r->x[6] = 0;
  109654. r->x[7] = 0;
  109655. r->x[8] = 0;
  109656. r->x[9] = 0;
  109657. r->x[10] = 0;
  109658. r->x[11] = 0;
  109659. r->y[0] = 0;
  109660. r->y[1] = 0;
  109661. r->y[2] = 0;
  109662. r->y[3] = 0;
  109663. r->y[4] = 0;
  109664. r->y[5] = 0;
  109665. r->y[6] = 0;
  109666. r->y[7] = 0;
  109667. r->y[8] = 0;
  109668. r->y[9] = 0;
  109669. r->y[10] = 0;
  109670. r->y[11] = 0;
  109671. for (i = 1; i < 16; i++) {
  109672. mask = 0 - (i == idx);
  109673. r->x[0] |= mask & table[i].x[0];
  109674. r->x[1] |= mask & table[i].x[1];
  109675. r->x[2] |= mask & table[i].x[2];
  109676. r->x[3] |= mask & table[i].x[3];
  109677. r->x[4] |= mask & table[i].x[4];
  109678. r->x[5] |= mask & table[i].x[5];
  109679. r->x[6] |= mask & table[i].x[6];
  109680. r->x[7] |= mask & table[i].x[7];
  109681. r->x[8] |= mask & table[i].x[8];
  109682. r->x[9] |= mask & table[i].x[9];
  109683. r->x[10] |= mask & table[i].x[10];
  109684. r->x[11] |= mask & table[i].x[11];
  109685. r->y[0] |= mask & table[i].y[0];
  109686. r->y[1] |= mask & table[i].y[1];
  109687. r->y[2] |= mask & table[i].y[2];
  109688. r->y[3] |= mask & table[i].y[3];
  109689. r->y[4] |= mask & table[i].y[4];
  109690. r->y[5] |= mask & table[i].y[5];
  109691. r->y[6] |= mask & table[i].y[6];
  109692. r->y[7] |= mask & table[i].y[7];
  109693. r->y[8] |= mask & table[i].y[8];
  109694. r->y[9] |= mask & table[i].y[9];
  109695. r->y[10] |= mask & table[i].y[10];
  109696. r->y[11] |= mask & table[i].y[11];
  109697. }
  109698. }
  109699. #endif /* !WC_NO_CACHE_RESISTANT */
  109700. /* Multiply the point by the scalar and return the result.
  109701. * If map is true then convert result to affine coordinates.
  109702. *
  109703. * Stripe implementation.
  109704. * Pre-generated: 2^0, 2^96, ...
  109705. * Pre-generated: products of all combinations of above.
  109706. * 4 doubles and adds (with qz=1)
  109707. *
  109708. * r Resulting point.
  109709. * k Scalar to multiply by.
  109710. * table Pre-computed table.
  109711. * map Indicates whether to convert result to affine.
  109712. * ct Constant time required.
  109713. * heap Heap to use for allocation.
  109714. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  109715. */
  109716. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  109717. const sp_table_entry_384* table, const sp_digit* k, int map,
  109718. int ct, void* heap)
  109719. {
  109720. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109721. sp_point_384* rt = NULL;
  109722. sp_digit* t = NULL;
  109723. #else
  109724. sp_point_384 rt[2];
  109725. sp_digit t[2 * 12 * 6];
  109726. #endif
  109727. sp_point_384* p = NULL;
  109728. int i;
  109729. int j;
  109730. int y;
  109731. int x;
  109732. int err = MP_OKAY;
  109733. (void)g;
  109734. /* Constant time used for cache attack resistance implementation. */
  109735. (void)ct;
  109736. (void)heap;
  109737. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109738. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  109739. DYNAMIC_TYPE_ECC);
  109740. if (rt == NULL)
  109741. err = MEMORY_E;
  109742. if (err == MP_OKAY) {
  109743. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  109744. DYNAMIC_TYPE_ECC);
  109745. if (t == NULL)
  109746. err = MEMORY_E;
  109747. }
  109748. #endif
  109749. if (err == MP_OKAY) {
  109750. p = rt + 1;
  109751. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  109752. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  109753. y = 0;
  109754. x = 95;
  109755. for (j=0; j<4; j++) {
  109756. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  109757. x += 96;
  109758. }
  109759. #ifndef WC_NO_CACHE_RESISTANT
  109760. if (ct) {
  109761. sp_384_get_entry_16_12(rt, table, y);
  109762. } else
  109763. #endif
  109764. {
  109765. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  109766. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  109767. }
  109768. rt->infinity = !y;
  109769. for (i=94; i>=0; i--) {
  109770. y = 0;
  109771. x = i;
  109772. for (j=0; j<4; j++) {
  109773. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  109774. x += 96;
  109775. }
  109776. sp_384_proj_point_dbl_12(rt, rt, t);
  109777. #ifndef WC_NO_CACHE_RESISTANT
  109778. if (ct) {
  109779. sp_384_get_entry_16_12(p, table, y);
  109780. }
  109781. else
  109782. #endif
  109783. {
  109784. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  109785. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  109786. }
  109787. p->infinity = !y;
  109788. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  109789. }
  109790. if (map != 0) {
  109791. sp_384_map_12(r, rt, t);
  109792. }
  109793. else {
  109794. XMEMCPY(r, rt, sizeof(sp_point_384));
  109795. }
  109796. }
  109797. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109798. if (t != NULL)
  109799. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  109800. if (rt != NULL)
  109801. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  109802. #endif
  109803. return err;
  109804. }
  109805. #ifdef FP_ECC
  109806. #ifndef FP_ENTRIES
  109807. #define FP_ENTRIES 16
  109808. #endif
  109809. /* Cache entry - holds precomputation tables for a point. */
  109810. typedef struct sp_cache_384_t {
  109811. /* X ordinate of point that table was generated from. */
  109812. sp_digit x[12];
  109813. /* Y ordinate of point that table was generated from. */
  109814. sp_digit y[12];
  109815. /* Precomputation table for point. */
  109816. sp_table_entry_384 table[16];
  109817. /* Count of entries in table. */
  109818. uint32_t cnt;
  109819. /* Point and table set in entry. */
  109820. int set;
  109821. } sp_cache_384_t;
  109822. /* Cache of tables. */
  109823. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  109824. /* Index of last entry in cache. */
  109825. static THREAD_LS_T int sp_cache_384_last = -1;
  109826. /* Cache has been initialized. */
  109827. static THREAD_LS_T int sp_cache_384_inited = 0;
  109828. #ifndef HAVE_THREAD_LS
  109829. static volatile int initCacheMutex_384 = 0;
  109830. static wolfSSL_Mutex sp_cache_384_lock;
  109831. #endif
  109832. /* Get the cache entry for the point.
  109833. *
  109834. * g [in] Point scalar multipling.
  109835. * cache [out] Cache table to use.
  109836. */
  109837. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  109838. {
  109839. int i;
  109840. int j;
  109841. uint32_t least;
  109842. if (sp_cache_384_inited == 0) {
  109843. for (i=0; i<FP_ENTRIES; i++) {
  109844. sp_cache_384[i].set = 0;
  109845. }
  109846. sp_cache_384_inited = 1;
  109847. }
  109848. /* Compare point with those in cache. */
  109849. for (i=0; i<FP_ENTRIES; i++) {
  109850. if (!sp_cache_384[i].set)
  109851. continue;
  109852. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  109853. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  109854. sp_cache_384[i].cnt++;
  109855. break;
  109856. }
  109857. }
  109858. /* No match. */
  109859. if (i == FP_ENTRIES) {
  109860. /* Find empty entry. */
  109861. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  109862. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  109863. if (!sp_cache_384[i].set) {
  109864. break;
  109865. }
  109866. }
  109867. /* Evict least used. */
  109868. if (i == sp_cache_384_last) {
  109869. least = sp_cache_384[0].cnt;
  109870. for (j=1; j<FP_ENTRIES; j++) {
  109871. if (sp_cache_384[j].cnt < least) {
  109872. i = j;
  109873. least = sp_cache_384[i].cnt;
  109874. }
  109875. }
  109876. }
  109877. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  109878. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  109879. sp_cache_384[i].set = 1;
  109880. sp_cache_384[i].cnt = 1;
  109881. }
  109882. *cache = &sp_cache_384[i];
  109883. sp_cache_384_last = i;
  109884. }
  109885. #endif /* FP_ECC */
  109886. /* Multiply the base point of P384 by the scalar and return the result.
  109887. * If map is true then convert result to affine coordinates.
  109888. *
  109889. * r Resulting point.
  109890. * g Point to multiply.
  109891. * k Scalar to multiply by.
  109892. * map Indicates whether to convert result to affine.
  109893. * ct Constant time required.
  109894. * heap Heap to use for allocation.
  109895. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  109896. */
  109897. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  109898. int map, int ct, void* heap)
  109899. {
  109900. #ifndef FP_ECC
  109901. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  109902. #else
  109903. sp_digit tmp[2 * 12 * 7];
  109904. sp_cache_384_t* cache;
  109905. int err = MP_OKAY;
  109906. #ifndef HAVE_THREAD_LS
  109907. if (initCacheMutex_384 == 0) {
  109908. wc_InitMutex(&sp_cache_384_lock);
  109909. initCacheMutex_384 = 1;
  109910. }
  109911. if (wc_LockMutex(&sp_cache_384_lock) != 0)
  109912. err = BAD_MUTEX_E;
  109913. #endif /* HAVE_THREAD_LS */
  109914. if (err == MP_OKAY) {
  109915. sp_ecc_get_cache_384(g, &cache);
  109916. if (cache->cnt == 2)
  109917. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  109918. #ifndef HAVE_THREAD_LS
  109919. wc_UnLockMutex(&sp_cache_384_lock);
  109920. #endif /* HAVE_THREAD_LS */
  109921. if (cache->cnt < 2) {
  109922. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  109923. }
  109924. else {
  109925. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  109926. map, ct, heap);
  109927. }
  109928. }
  109929. return err;
  109930. #endif
  109931. }
  109932. #else
  109933. #ifdef FP_ECC
  109934. /* Generate the pre-computed table of points for the base point.
  109935. *
  109936. * width = 8
  109937. * 256 entries
  109938. * 48 bits between
  109939. *
  109940. * a The base point.
  109941. * table Place to store generated point data.
  109942. * tmp Temporary data.
  109943. * heap Heap to use for allocation.
  109944. */
  109945. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  109946. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  109947. {
  109948. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109949. sp_point_384* t = NULL;
  109950. #else
  109951. sp_point_384 t[3];
  109952. #endif
  109953. sp_point_384* s1 = NULL;
  109954. sp_point_384* s2 = NULL;
  109955. int i;
  109956. int j;
  109957. int err = MP_OKAY;
  109958. (void)heap;
  109959. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  109960. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  109961. DYNAMIC_TYPE_ECC);
  109962. if (t == NULL)
  109963. err = MEMORY_E;
  109964. #endif
  109965. if (err == MP_OKAY) {
  109966. s1 = t + 1;
  109967. s2 = t + 2;
  109968. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  109969. }
  109970. if (err == MP_OKAY) {
  109971. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  109972. }
  109973. if (err == MP_OKAY) {
  109974. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  109975. }
  109976. if (err == MP_OKAY) {
  109977. t->infinity = 0;
  109978. sp_384_proj_to_affine_12(t, tmp);
  109979. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  109980. s1->infinity = 0;
  109981. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  109982. s2->infinity = 0;
  109983. /* table[0] = {0, 0, infinity} */
  109984. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  109985. /* table[1] = Affine version of 'a' in Montgomery form */
  109986. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  109987. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  109988. for (i=1; i<8; i++) {
  109989. sp_384_proj_point_dbl_n_12(t, 48, tmp);
  109990. sp_384_proj_to_affine_12(t, tmp);
  109991. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  109992. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  109993. }
  109994. for (i=1; i<8; i++) {
  109995. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  109996. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  109997. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  109998. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  109999. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  110000. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  110001. sp_384_proj_to_affine_12(t, tmp);
  110002. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  110003. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  110004. }
  110005. }
  110006. }
  110007. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110008. if (t != NULL)
  110009. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  110010. #endif
  110011. return err;
  110012. }
  110013. #endif /* FP_ECC */
  110014. #ifndef WC_NO_CACHE_RESISTANT
  110015. /* Touch each possible entry that could be being copied.
  110016. *
  110017. * r Point to copy into.
  110018. * table Table - start of the entires to access
  110019. * idx Index of entry to retrieve.
  110020. */
  110021. static void sp_384_get_entry_256_12(sp_point_384* r,
  110022. const sp_table_entry_384* table, int idx)
  110023. {
  110024. int i;
  110025. sp_digit mask;
  110026. r->x[0] = 0;
  110027. r->x[1] = 0;
  110028. r->x[2] = 0;
  110029. r->x[3] = 0;
  110030. r->x[4] = 0;
  110031. r->x[5] = 0;
  110032. r->x[6] = 0;
  110033. r->x[7] = 0;
  110034. r->x[8] = 0;
  110035. r->x[9] = 0;
  110036. r->x[10] = 0;
  110037. r->x[11] = 0;
  110038. r->y[0] = 0;
  110039. r->y[1] = 0;
  110040. r->y[2] = 0;
  110041. r->y[3] = 0;
  110042. r->y[4] = 0;
  110043. r->y[5] = 0;
  110044. r->y[6] = 0;
  110045. r->y[7] = 0;
  110046. r->y[8] = 0;
  110047. r->y[9] = 0;
  110048. r->y[10] = 0;
  110049. r->y[11] = 0;
  110050. for (i = 1; i < 256; i++) {
  110051. mask = 0 - (i == idx);
  110052. r->x[0] |= mask & table[i].x[0];
  110053. r->x[1] |= mask & table[i].x[1];
  110054. r->x[2] |= mask & table[i].x[2];
  110055. r->x[3] |= mask & table[i].x[3];
  110056. r->x[4] |= mask & table[i].x[4];
  110057. r->x[5] |= mask & table[i].x[5];
  110058. r->x[6] |= mask & table[i].x[6];
  110059. r->x[7] |= mask & table[i].x[7];
  110060. r->x[8] |= mask & table[i].x[8];
  110061. r->x[9] |= mask & table[i].x[9];
  110062. r->x[10] |= mask & table[i].x[10];
  110063. r->x[11] |= mask & table[i].x[11];
  110064. r->y[0] |= mask & table[i].y[0];
  110065. r->y[1] |= mask & table[i].y[1];
  110066. r->y[2] |= mask & table[i].y[2];
  110067. r->y[3] |= mask & table[i].y[3];
  110068. r->y[4] |= mask & table[i].y[4];
  110069. r->y[5] |= mask & table[i].y[5];
  110070. r->y[6] |= mask & table[i].y[6];
  110071. r->y[7] |= mask & table[i].y[7];
  110072. r->y[8] |= mask & table[i].y[8];
  110073. r->y[9] |= mask & table[i].y[9];
  110074. r->y[10] |= mask & table[i].y[10];
  110075. r->y[11] |= mask & table[i].y[11];
  110076. }
  110077. }
  110078. #endif /* !WC_NO_CACHE_RESISTANT */
  110079. /* Multiply the point by the scalar and return the result.
  110080. * If map is true then convert result to affine coordinates.
  110081. *
  110082. * Stripe implementation.
  110083. * Pre-generated: 2^0, 2^48, ...
  110084. * Pre-generated: products of all combinations of above.
  110085. * 8 doubles and adds (with qz=1)
  110086. *
  110087. * r Resulting point.
  110088. * k Scalar to multiply by.
  110089. * table Pre-computed table.
  110090. * map Indicates whether to convert result to affine.
  110091. * ct Constant time required.
  110092. * heap Heap to use for allocation.
  110093. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  110094. */
  110095. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  110096. const sp_table_entry_384* table, const sp_digit* k, int map,
  110097. int ct, void* heap)
  110098. {
  110099. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110100. sp_point_384* rt = NULL;
  110101. sp_digit* t = NULL;
  110102. #else
  110103. sp_point_384 rt[2];
  110104. sp_digit t[2 * 12 * 6];
  110105. #endif
  110106. sp_point_384* p = NULL;
  110107. int i;
  110108. int j;
  110109. int y;
  110110. int x;
  110111. int err = MP_OKAY;
  110112. (void)g;
  110113. /* Constant time used for cache attack resistance implementation. */
  110114. (void)ct;
  110115. (void)heap;
  110116. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110117. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  110118. DYNAMIC_TYPE_ECC);
  110119. if (rt == NULL)
  110120. err = MEMORY_E;
  110121. if (err == MP_OKAY) {
  110122. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  110123. DYNAMIC_TYPE_ECC);
  110124. if (t == NULL)
  110125. err = MEMORY_E;
  110126. }
  110127. #endif
  110128. if (err == MP_OKAY) {
  110129. p = rt + 1;
  110130. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  110131. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  110132. y = 0;
  110133. x = 47;
  110134. for (j=0; j<8; j++) {
  110135. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  110136. x += 48;
  110137. }
  110138. #ifndef WC_NO_CACHE_RESISTANT
  110139. if (ct) {
  110140. sp_384_get_entry_256_12(rt, table, y);
  110141. } else
  110142. #endif
  110143. {
  110144. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  110145. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  110146. }
  110147. rt->infinity = !y;
  110148. for (i=46; i>=0; i--) {
  110149. y = 0;
  110150. x = i;
  110151. for (j=0; j<8; j++) {
  110152. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  110153. x += 48;
  110154. }
  110155. sp_384_proj_point_dbl_12(rt, rt, t);
  110156. #ifndef WC_NO_CACHE_RESISTANT
  110157. if (ct) {
  110158. sp_384_get_entry_256_12(p, table, y);
  110159. }
  110160. else
  110161. #endif
  110162. {
  110163. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  110164. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  110165. }
  110166. p->infinity = !y;
  110167. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  110168. }
  110169. if (map != 0) {
  110170. sp_384_map_12(r, rt, t);
  110171. }
  110172. else {
  110173. XMEMCPY(r, rt, sizeof(sp_point_384));
  110174. }
  110175. }
  110176. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110177. if (t != NULL)
  110178. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  110179. if (rt != NULL)
  110180. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  110181. #endif
  110182. return err;
  110183. }
  110184. #ifdef FP_ECC
  110185. #ifndef FP_ENTRIES
  110186. #define FP_ENTRIES 16
  110187. #endif
  110188. /* Cache entry - holds precomputation tables for a point. */
  110189. typedef struct sp_cache_384_t {
  110190. /* X ordinate of point that table was generated from. */
  110191. sp_digit x[12];
  110192. /* Y ordinate of point that table was generated from. */
  110193. sp_digit y[12];
  110194. /* Precomputation table for point. */
  110195. sp_table_entry_384 table[256];
  110196. /* Count of entries in table. */
  110197. uint32_t cnt;
  110198. /* Point and table set in entry. */
  110199. int set;
  110200. } sp_cache_384_t;
  110201. /* Cache of tables. */
  110202. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  110203. /* Index of last entry in cache. */
  110204. static THREAD_LS_T int sp_cache_384_last = -1;
  110205. /* Cache has been initialized. */
  110206. static THREAD_LS_T int sp_cache_384_inited = 0;
  110207. #ifndef HAVE_THREAD_LS
  110208. static volatile int initCacheMutex_384 = 0;
  110209. static wolfSSL_Mutex sp_cache_384_lock;
  110210. #endif
  110211. /* Get the cache entry for the point.
  110212. *
  110213. * g [in] Point scalar multipling.
  110214. * cache [out] Cache table to use.
  110215. */
  110216. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  110217. {
  110218. int i;
  110219. int j;
  110220. uint32_t least;
  110221. if (sp_cache_384_inited == 0) {
  110222. for (i=0; i<FP_ENTRIES; i++) {
  110223. sp_cache_384[i].set = 0;
  110224. }
  110225. sp_cache_384_inited = 1;
  110226. }
  110227. /* Compare point with those in cache. */
  110228. for (i=0; i<FP_ENTRIES; i++) {
  110229. if (!sp_cache_384[i].set)
  110230. continue;
  110231. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  110232. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  110233. sp_cache_384[i].cnt++;
  110234. break;
  110235. }
  110236. }
  110237. /* No match. */
  110238. if (i == FP_ENTRIES) {
  110239. /* Find empty entry. */
  110240. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  110241. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  110242. if (!sp_cache_384[i].set) {
  110243. break;
  110244. }
  110245. }
  110246. /* Evict least used. */
  110247. if (i == sp_cache_384_last) {
  110248. least = sp_cache_384[0].cnt;
  110249. for (j=1; j<FP_ENTRIES; j++) {
  110250. if (sp_cache_384[j].cnt < least) {
  110251. i = j;
  110252. least = sp_cache_384[i].cnt;
  110253. }
  110254. }
  110255. }
  110256. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  110257. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  110258. sp_cache_384[i].set = 1;
  110259. sp_cache_384[i].cnt = 1;
  110260. }
  110261. *cache = &sp_cache_384[i];
  110262. sp_cache_384_last = i;
  110263. }
  110264. #endif /* FP_ECC */
  110265. /* Multiply the base point of P384 by the scalar and return the result.
  110266. * If map is true then convert result to affine coordinates.
  110267. *
  110268. * r Resulting point.
  110269. * g Point to multiply.
  110270. * k Scalar to multiply by.
  110271. * map Indicates whether to convert result to affine.
  110272. * ct Constant time required.
  110273. * heap Heap to use for allocation.
  110274. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  110275. */
  110276. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  110277. int map, int ct, void* heap)
  110278. {
  110279. #ifndef FP_ECC
  110280. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  110281. #else
  110282. sp_digit tmp[2 * 12 * 7];
  110283. sp_cache_384_t* cache;
  110284. int err = MP_OKAY;
  110285. #ifndef HAVE_THREAD_LS
  110286. if (initCacheMutex_384 == 0) {
  110287. wc_InitMutex(&sp_cache_384_lock);
  110288. initCacheMutex_384 = 1;
  110289. }
  110290. if (wc_LockMutex(&sp_cache_384_lock) != 0)
  110291. err = BAD_MUTEX_E;
  110292. #endif /* HAVE_THREAD_LS */
  110293. if (err == MP_OKAY) {
  110294. sp_ecc_get_cache_384(g, &cache);
  110295. if (cache->cnt == 2)
  110296. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  110297. #ifndef HAVE_THREAD_LS
  110298. wc_UnLockMutex(&sp_cache_384_lock);
  110299. #endif /* HAVE_THREAD_LS */
  110300. if (cache->cnt < 2) {
  110301. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  110302. }
  110303. else {
  110304. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  110305. map, ct, heap);
  110306. }
  110307. }
  110308. return err;
  110309. #endif
  110310. }
  110311. #endif /* WOLFSSL_SP_SMALL */
  110312. /* Multiply the point by the scalar and return the result.
  110313. * If map is true then convert result to affine coordinates.
  110314. *
  110315. * km Scalar to multiply by.
  110316. * p Point to multiply.
  110317. * r Resulting point.
  110318. * map Indicates whether to convert result to affine.
  110319. * heap Heap to use for allocation.
  110320. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  110321. */
  110322. int sp_ecc_mulmod_384(const mp_int* km, const ecc_point* gm, ecc_point* r,
  110323. int map, void* heap)
  110324. {
  110325. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110326. sp_point_384* point = NULL;
  110327. sp_digit* k = NULL;
  110328. #else
  110329. sp_point_384 point[1];
  110330. sp_digit k[12];
  110331. #endif
  110332. int err = MP_OKAY;
  110333. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110334. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  110335. DYNAMIC_TYPE_ECC);
  110336. if (point == NULL)
  110337. err = MEMORY_E;
  110338. if (err == MP_OKAY) {
  110339. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  110340. DYNAMIC_TYPE_ECC);
  110341. if (k == NULL)
  110342. err = MEMORY_E;
  110343. }
  110344. #endif
  110345. if (err == MP_OKAY) {
  110346. sp_384_from_mp(k, 12, km);
  110347. sp_384_point_from_ecc_point_12(point, gm);
  110348. err = sp_384_ecc_mulmod_12(point, point, k, map, 1, heap);
  110349. }
  110350. if (err == MP_OKAY) {
  110351. err = sp_384_point_to_ecc_point_12(point, r);
  110352. }
  110353. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110354. if (k != NULL)
  110355. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  110356. if (point != NULL)
  110357. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  110358. #endif
  110359. return err;
  110360. }
  110361. /* Multiply the point by the scalar, add point a and return the result.
  110362. * If map is true then convert result to affine coordinates.
  110363. *
  110364. * km Scalar to multiply by.
  110365. * p Point to multiply.
  110366. * am Point to add to scalar mulitply result.
  110367. * inMont Point to add is in montgomery form.
  110368. * r Resulting point.
  110369. * map Indicates whether to convert result to affine.
  110370. * heap Heap to use for allocation.
  110371. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  110372. */
  110373. int sp_ecc_mulmod_add_384(const mp_int* km, const ecc_point* gm,
  110374. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  110375. {
  110376. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110377. sp_point_384* point = NULL;
  110378. sp_digit* k = NULL;
  110379. #else
  110380. sp_point_384 point[2];
  110381. sp_digit k[12 + 12 * 2 * 6];
  110382. #endif
  110383. sp_point_384* addP = NULL;
  110384. sp_digit* tmp = NULL;
  110385. int err = MP_OKAY;
  110386. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110387. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  110388. DYNAMIC_TYPE_ECC);
  110389. if (point == NULL)
  110390. err = MEMORY_E;
  110391. if (err == MP_OKAY) {
  110392. k = (sp_digit*)XMALLOC(
  110393. sizeof(sp_digit) * (12 + 12 * 2 * 6), heap,
  110394. DYNAMIC_TYPE_ECC);
  110395. if (k == NULL)
  110396. err = MEMORY_E;
  110397. }
  110398. #endif
  110399. if (err == MP_OKAY) {
  110400. addP = point + 1;
  110401. tmp = k + 12;
  110402. sp_384_from_mp(k, 12, km);
  110403. sp_384_point_from_ecc_point_12(point, gm);
  110404. sp_384_point_from_ecc_point_12(addP, am);
  110405. }
  110406. if ((err == MP_OKAY) && (!inMont)) {
  110407. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  110408. }
  110409. if ((err == MP_OKAY) && (!inMont)) {
  110410. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  110411. }
  110412. if ((err == MP_OKAY) && (!inMont)) {
  110413. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  110414. }
  110415. if (err == MP_OKAY) {
  110416. err = sp_384_ecc_mulmod_12(point, point, k, 0, 0, heap);
  110417. }
  110418. if (err == MP_OKAY) {
  110419. sp_384_proj_point_add_12(point, point, addP, tmp);
  110420. if (map) {
  110421. sp_384_map_12(point, point, tmp);
  110422. }
  110423. err = sp_384_point_to_ecc_point_12(point, r);
  110424. }
  110425. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110426. if (k != NULL)
  110427. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  110428. if (point != NULL)
  110429. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  110430. #endif
  110431. return err;
  110432. }
  110433. #ifdef WOLFSSL_SP_SMALL
  110434. /* Striping precomputation table.
  110435. * 4 points combined into a table of 16 points.
  110436. * Distance of 96 between points.
  110437. */
  110438. static const sp_table_entry_384 p384_table[16] = {
  110439. /* 0 */
  110440. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  110441. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  110442. /* 1 */
  110443. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  110444. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  110445. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  110446. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  110447. /* 2 */
  110448. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  110449. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  110450. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  110451. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  110452. /* 3 */
  110453. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  110454. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  110455. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  110456. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  110457. /* 4 */
  110458. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  110459. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  110460. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  110461. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  110462. /* 5 */
  110463. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  110464. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  110465. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  110466. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  110467. /* 6 */
  110468. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  110469. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  110470. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  110471. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  110472. /* 7 */
  110473. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  110474. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  110475. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  110476. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  110477. /* 8 */
  110478. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  110479. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  110480. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  110481. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  110482. /* 9 */
  110483. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  110484. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  110485. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  110486. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  110487. /* 10 */
  110488. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  110489. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  110490. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  110491. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  110492. /* 11 */
  110493. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  110494. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  110495. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  110496. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  110497. /* 12 */
  110498. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  110499. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  110500. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  110501. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  110502. /* 13 */
  110503. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  110504. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  110505. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  110506. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  110507. /* 14 */
  110508. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  110509. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  110510. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  110511. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  110512. /* 15 */
  110513. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  110514. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  110515. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  110516. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  110517. };
  110518. /* Multiply the base point of P384 by the scalar and return the result.
  110519. * If map is true then convert result to affine coordinates.
  110520. *
  110521. * Stripe implementation.
  110522. * Pre-generated: 2^0, 2^96, ...
  110523. * Pre-generated: products of all combinations of above.
  110524. * 4 doubles and adds (with qz=1)
  110525. *
  110526. * r Resulting point.
  110527. * k Scalar to multiply by.
  110528. * map Indicates whether to convert result to affine.
  110529. * ct Constant time required.
  110530. * heap Heap to use for allocation.
  110531. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  110532. */
  110533. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  110534. int map, int ct, void* heap)
  110535. {
  110536. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  110537. k, map, ct, heap);
  110538. }
  110539. #else
  110540. /* Striping precomputation table.
  110541. * 8 points combined into a table of 256 points.
  110542. * Distance of 48 between points.
  110543. */
  110544. static const sp_table_entry_384 p384_table[256] = {
  110545. /* 0 */
  110546. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  110547. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  110548. /* 1 */
  110549. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  110550. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  110551. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  110552. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  110553. /* 2 */
  110554. { { 0x2b0c535b,0x29864753,0x70506296,0x90dd6953,0x216ab9ac,0x038cd6b4,
  110555. 0xbe12d76a,0x3df9b7b7,0x5f347bdb,0x13f4d978,0x13e94489,0x222c5c9c },
  110556. { 0x2680dc64,0x5f8e796f,0x58352417,0x120e7cb7,0xd10740b8,0x254b5d8a,
  110557. 0x5337dee6,0xc38b8efb,0x94f02247,0xf688c2e1,0x6c25bc4c,0x7b5c75f3 } },
  110558. /* 3 */
  110559. { { 0x9edffea5,0xe26a3cc3,0x37d7e9fc,0x35bbfd1c,0x9bde3ef6,0xf0e7700d,
  110560. 0x1a538f5a,0x0380eb47,0x05bf9eb3,0x2e9da8bb,0x1a460c3e,0xdbb93c73 },
  110561. { 0xf526b605,0x37dba260,0xfd785537,0x95d4978e,0xed72a04a,0x24ed793a,
  110562. 0x76005b1a,0x26948377,0x9e681f82,0x99f557b9,0xd64954ef,0xae5f9557 } },
  110563. /* 4 */
  110564. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  110565. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  110566. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  110567. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  110568. /* 5 */
  110569. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  110570. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  110571. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  110572. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  110573. /* 6 */
  110574. { { 0x4fc52870,0x28f9c07a,0x1a53a961,0xce0b3748,0x0e1828d9,0xd550fa18,
  110575. 0x6adb225a,0xa24abaf7,0x6e58a348,0xd11ed0a5,0x948acb62,0xf3d811e6 },
  110576. { 0x4c61ed22,0x8618dd77,0x80b47c9d,0x0bb747f9,0xde6b8559,0x22bf796f,
  110577. 0x680a21e9,0xfdfd1c6d,0x2af2c9dd,0xc0db1577,0xc1e90f3d,0xa09379e6 } },
  110578. /* 7 */
  110579. { { 0xe085c629,0x386c66ef,0x095bc89a,0x5fc2a461,0x203f4b41,0x1353d631,
  110580. 0x7e4bd8f5,0x7ca1972b,0xa7df8ce9,0xb077380a,0xee7e4ea3,0xd8a90389 },
  110581. { 0xe7b14461,0x1bc74dc7,0x0c9c4f78,0xdc2cb014,0x84ef0a10,0x52b4b3a6,
  110582. 0x20327fe2,0xbde6ea5d,0x660f9615,0xb71ec435,0xb8ad8173,0xeede5a04 } },
  110583. /* 8 */
  110584. { { 0x893b9a2d,0x5584cbb3,0x00850c5d,0x820c660b,0x7df2d43d,0x4126d826,
  110585. 0x0109e801,0xdd5bbbf0,0x38172f1c,0x85b92ee3,0xf31430d9,0x609d4f93 },
  110586. { 0xeadaf9d6,0x1e059a07,0x0f125fb0,0x70e6536c,0x560f20e7,0xd6220751,
  110587. 0x7aaf3a9a,0xa59489ae,0x64bae14e,0x7b70e2f6,0x76d08249,0x0dd03701 } },
  110588. /* 9 */
  110589. { { 0x8510521f,0x4cc13be8,0xf724cc17,0x87315ba9,0x353dc263,0xb49d83bb,
  110590. 0x0c279257,0x8b677efe,0xc93c9537,0x510a1c1c,0xa4702c99,0x33e30cd8 },
  110591. { 0x2208353f,0xf0ffc89d,0xced42b2b,0x0170fa8d,0x26e2a5f5,0x090851ed,
  110592. 0xecb52c96,0x81276455,0x7fe1adf4,0x0646c4e1,0xb0868eab,0x513f047e } },
  110593. /* 10 */
  110594. { { 0xdf5bdf53,0xc07611f4,0x58b11a6d,0x45d331a7,0x1c4ee394,0x58965daf,
  110595. 0x5a5878d1,0xba8bebe7,0x82dd3025,0xaecc0a18,0xa923eb8b,0xcf2a3899 },
  110596. { 0xd24fd048,0xf98c9281,0x8bbb025d,0x841bfb59,0xc9ab9d53,0xb8ddf8ce,
  110597. 0x7fef044e,0x538a4cb6,0x23236662,0x092ac21f,0x0b66f065,0xa919d385 } },
  110598. /* 11 */
  110599. { { 0x85d480d8,0x3db03b40,0x1b287a7d,0x8cd9f479,0x4a8f3bae,0x8f24dc75,
  110600. 0x3db41892,0x482eb800,0x9c56e0f5,0x38bf9eb3,0x9a91dc6f,0x8b977320 },
  110601. { 0x7209cfc2,0xa31b05b2,0x05b2db70,0x4c49bf85,0xd619527b,0x56462498,
  110602. 0x1fac51ba,0x3fe51039,0xab4b8342,0xfb04f55e,0x04c6eabf,0xc07c10dc } },
  110603. /* 12 */
  110604. { { 0xdb32f048,0xad22fe4c,0x475ed6df,0x5f23bf91,0xaa66b6cb,0xa50ce0c0,
  110605. 0xf03405c0,0xdf627a89,0xf95e2d6a,0x3674837d,0xba42e64e,0x081c95b6 },
  110606. { 0xe71d6ceb,0xeba3e036,0x6c6b0271,0xb45bcccf,0x0684701d,0x67b47e63,
  110607. 0xe712523f,0x60f8f942,0x5cd47adc,0x82423472,0x87649cbb,0x83027d79 } },
  110608. /* 13 */
  110609. { { 0x3615b0b8,0xb3929ea6,0xa54dac41,0xb41441fd,0xb5b6a368,0x8995d556,
  110610. 0x167ef05e,0xa80d4529,0x6d25a27f,0xf6bcb4a1,0x7bd55b68,0x210d6a4c },
  110611. { 0x25351130,0xf3804abb,0x903e37eb,0x1d2df699,0x084c25c8,0x5f201efc,
  110612. 0xa1c68e91,0x31a28c87,0x563f62a5,0x81dad253,0xd6c415d4,0x5dd6de70 } },
  110613. /* 14 */
  110614. { { 0x846612ce,0x29f470fd,0xda18d997,0x986f3eec,0x2f34af86,0x6b84c161,
  110615. 0x46ddaf8b,0x5ef0a408,0xe49e795f,0x14405a00,0xaa2f7a37,0x5f491b16 },
  110616. { 0xdb41b38d,0xc7f07ae4,0x18fbfcaa,0xef7d119e,0x14443b19,0x3a18e076,
  110617. 0x79a19926,0x4356841a,0xe2226fbe,0x91f4a91c,0x3cc88721,0xdc77248c } },
  110618. /* 15 */
  110619. { { 0xe4b1ec9d,0xd570ff1a,0xe7eef706,0x21d23e0e,0xca19e086,0x3cde40f4,
  110620. 0xcd4bb270,0x7d6523c4,0xbf13aa6c,0x16c1f06c,0xd14c4b60,0x5aa7245a },
  110621. { 0x44b74de8,0x37f81467,0x620a934e,0x839e7a17,0xde8b1aa1,0xf74d14e8,
  110622. 0xf30d75e2,0x8789fa51,0xc81c261e,0x09b24052,0x33c565ee,0x654e2678 } },
  110623. /* 16 */
  110624. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  110625. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  110626. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  110627. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  110628. /* 17 */
  110629. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  110630. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  110631. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  110632. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  110633. /* 18 */
  110634. { { 0x7d8c1bba,0x7ecbac01,0x90b0f3d5,0x6058f9c3,0xf6197d0f,0xaee116e3,
  110635. 0x4033b128,0xc4dd7068,0xc209b983,0xf084dba6,0x831dbc4a,0x97c7c2cf },
  110636. { 0xf96010e8,0x2f4e61dd,0x529faa17,0xd97e4e20,0x69d37f20,0x4ee66660,
  110637. 0x3d366d72,0xccc139ed,0x13488e0f,0x690b6ee2,0xf3a6d533,0x7cad1dc5 } },
  110638. /* 19 */
  110639. { { 0xda57a41f,0x660a9a81,0xec0039b6,0xe74a0412,0x5e1dad15,0x42343c6b,
  110640. 0x46681d4c,0x284f3ff5,0x63749e89,0xb51087f1,0x6f9f2f13,0x070f23cc },
  110641. { 0x5d186e14,0x542211da,0xfddb0dff,0x84748f37,0xdb1f4180,0x41a3aab4,
  110642. 0xa6402d0e,0x25ed667b,0x02f58355,0x2f2924a9,0xfa44a689,0x5844ee7c } },
  110643. /* 20 */
  110644. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  110645. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  110646. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  110647. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  110648. /* 21 */
  110649. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  110650. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  110651. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  110652. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  110653. /* 22 */
  110654. { { 0x104cbba5,0xc023780d,0xfa35dd4c,0x6207e747,0x1ca9b6a3,0x35c23928,
  110655. 0x97987b10,0x4ff19be8,0x8022eee8,0xb8476bbf,0xd3bbe74d,0xaa0a4a14 },
  110656. { 0x187d4543,0x20f94331,0x79f6e066,0x32153870,0xac7e82e1,0x83b0f74e,
  110657. 0x828f06ab,0xa7748ba2,0xc26ef35f,0xc5f0298a,0x8e9a7dbd,0x0f0c5070 } },
  110658. /* 23 */
  110659. { { 0xdef029dd,0x0c5c244c,0x850661b8,0x3dabc687,0xfe11d981,0x9992b865,
  110660. 0x6274dbad,0xe9801b8f,0x098da242,0xe54e6319,0x91a53d08,0x9929a91a },
  110661. { 0x35285887,0x37bffd72,0xf1418102,0xbc759425,0xfd2e6e20,0x9280cc35,
  110662. 0xfbc42ee5,0x735c600c,0x8837619a,0xb7ad2864,0xa778c57b,0xa3627231 } },
  110663. /* 24 */
  110664. { { 0x91361ed8,0xae799b5c,0x6c63366c,0x47d71b75,0x1b265a6a,0x54cdd521,
  110665. 0x98d77b74,0xe0215a59,0xbab29db0,0x4424d9b7,0x7fd9e536,0x8b0ffacc },
  110666. { 0x37b5d9ef,0x46d85d12,0xbfa91747,0x5b106d62,0x5f99ba2d,0xed0479f8,
  110667. 0x1d104de4,0x0e6f3923,0x25e8983f,0x83a84c84,0xf8105a70,0xa9507e0a } },
  110668. /* 25 */
  110669. { { 0x14cf381c,0xf6c68a6e,0xc22e31cc,0xaf9d27bd,0xaa8a5ccb,0x23568d4d,
  110670. 0xe338e4d2,0xe431eec0,0x8f52ad1f,0xf1a828fe,0xe86acd80,0xdb6a0579 },
  110671. { 0x4507832a,0x2885672e,0x887e5289,0x73fc275f,0x05610d08,0x65f80278,
  110672. 0x075ff5b0,0x8d9b4554,0x09f712b5,0x3a8e8fb1,0x2ebe9cf2,0x39f0ac86 } },
  110673. /* 26 */
  110674. { { 0x4c52edf5,0xd8fabf78,0xa589ae53,0xdcd737e5,0xd791ab17,0x94918bf0,
  110675. 0xbcff06c9,0xb5fbd956,0xdca46d45,0xf6d3032e,0x41a3e486,0x2cdff7e1 },
  110676. { 0x61f47ec8,0x6674b3ba,0xeef84608,0x8a882163,0x4c687f90,0xa257c705,
  110677. 0xf6cdf227,0xe30cb2ed,0x7f6ea846,0x2c4c64ca,0xcc6bcd3c,0x186fa17c } },
  110678. /* 27 */
  110679. { { 0x1dfcb91e,0x48a3f536,0x646d358a,0x83595e13,0x91128798,0xbd15827b,
  110680. 0x2187757a,0x3ce612b8,0x61bd7372,0x873150a1,0xb662f568,0xf4684530 },
  110681. { 0x401896f6,0x8833950b,0x77f3e090,0xe11cb89a,0x48e7f4a5,0xb2f12cac,
  110682. 0xf606677e,0x313dd769,0x16579f93,0xfdcf08b3,0x46b8f22b,0x6429cec9 } },
  110683. /* 28 */
  110684. { { 0xbb75f9a4,0x4984dd54,0x29d3b570,0x4aef06b9,0x3d6e4c1e,0xb5f84ca2,
  110685. 0xb083ef35,0x24c61c11,0x392ca9ff,0xce4a7392,0x6730a800,0x865d6517 },
  110686. { 0x722b4a2b,0xca3dfe76,0x7b083e0e,0x12c04bf9,0x1b86b8a5,0x803ce5b5,
  110687. 0x6a7e3e0c,0x3fc7632d,0xc81adbe4,0xc89970c2,0x120e16b1,0x3cbcd3ad } },
  110688. /* 29 */
  110689. { { 0xec30ce93,0xfbfb4cc7,0xb72720a2,0x10ed6c7d,0x47b55500,0xec675bf7,
  110690. 0x333ff7c3,0x90725903,0x5075bfc0,0xc7c3973e,0x07acf31b,0xb049ecb0 },
  110691. { 0x4f58839c,0xb4076eaf,0xa2b05e4f,0x101896da,0xab40c66e,0x3f6033b0,
  110692. 0xc8d864ba,0x19ee9eeb,0x47bf6d2a,0xeb6cf155,0xf826477d,0x8e5a9663 } },
  110693. /* 30 */
  110694. { { 0xf7fbd5e1,0x69e62fdd,0x76912b1d,0x38ecfe54,0xd1da3bfb,0x845a3d56,
  110695. 0x1c86f0d4,0x0494950e,0x3bc36ce8,0x83cadbf9,0x4fccc8d1,0x41fce572 },
  110696. { 0x8332c144,0x05f939c2,0x0871e46e,0xb17f248b,0x66e8aff6,0x3d8534e2,
  110697. 0x3b85c629,0x1d06f1dc,0xa3131b73,0xdb06a32e,0x8b3f64e5,0xf295184d } },
  110698. /* 31 */
  110699. { { 0x36ddc103,0xd9653ff7,0x95ef606f,0x25f43e37,0xfe06dce8,0x09e301fc,
  110700. 0x30b6eebf,0x85af2341,0x0ff56b20,0x79b12b53,0xfe9a3c6b,0x9b4fb499 },
  110701. { 0x51d27ac2,0x0154f892,0x56ca5389,0xd33167e3,0xafc065a6,0x7828ec1f,
  110702. 0x7f746c9b,0x0959a258,0x0c44f837,0xb18f1be3,0xc4132fdb,0xa7946117 } },
  110703. /* 32 */
  110704. { { 0x5e3c647b,0xc0426b77,0x8cf05348,0xbfcbd939,0x172c0d3d,0x31d312e3,
  110705. 0xee754737,0x5f49fde6,0x6da7ee61,0x895530f0,0xe8b3a5fb,0xcf281b0a },
  110706. { 0x41b8a543,0xfd149735,0x3080dd30,0x41a625a7,0x653908cf,0xe2baae07,
  110707. 0xba02a278,0xc3d01436,0x7b21b8f8,0xa0d0222e,0xd7ec1297,0xfdc270e9 } },
  110708. /* 33 */
  110709. { { 0xbc7f41d6,0x00873c0c,0x1b7ad641,0xd976113e,0x238443fb,0x2a536ff4,
  110710. 0x41e62e45,0x030d00e2,0x5f545fc6,0x532e9867,0x8e91208c,0xcd033108 },
  110711. { 0x9797612c,0xd1a04c99,0xeea674e2,0xd4393e02,0xe19742a1,0xd56fa69e,
  110712. 0x85f0590e,0xdd2ab480,0x48a2243d,0xa5cefc52,0x54383f41,0x48cc67b6 } },
  110713. /* 34 */
  110714. { { 0xfc14ab48,0x4e50430e,0x26706a74,0x195b7f4f,0xcc881ff6,0x2fe8a228,
  110715. 0xd945013d,0xb1b968e2,0x4b92162b,0x936aa579,0x364e754a,0x4fb766b7 },
  110716. { 0x31e1ff7f,0x13f93bca,0xce4f2691,0x696eb5ca,0xa2b09e02,0xff754bf8,
  110717. 0xe58e3ff8,0x58f13c9c,0x1678c0b0,0xb757346f,0xa86692b3,0xd54200db } },
  110718. /* 35 */
  110719. { { 0x6dda1265,0x9a030bbd,0xe89718dd,0xf7b4f3fc,0x936065b8,0xa6a4931f,
  110720. 0x5f72241c,0xbce72d87,0x65775857,0x6cbb51cb,0x4e993675,0xc7161815 },
  110721. { 0x2ee32189,0xe81a0f79,0x277dc0b2,0xef2fab26,0xb71f469f,0x9e64f6fe,
  110722. 0xdfdaf859,0xb448ce33,0xbe6b5df1,0x3f5c1c4c,0x1de45f7b,0xfb8dfb00 } },
  110723. /* 36 */
  110724. { { 0x4d5bb921,0xc7345fa7,0x4d2b667e,0x5c7e04be,0x282d7a3e,0x47ed3a80,
  110725. 0x7e47b2a4,0x5c2777f8,0x08488e2e,0x89b3b100,0xb2eb5b45,0x9aad77c2 },
  110726. { 0xdaac34ae,0xd681bca7,0x26afb326,0x2452e4e5,0x41a1ee14,0x0c887924,
  110727. 0xc2407ade,0x743b04d4,0xfc17a2ac,0xcb5e999b,0x4a701a06,0x4dca2f82 } },
  110728. /* 37 */
  110729. { { 0x1127bc1a,0x68e31ca6,0x17ead3be,0xa3edd59b,0xe25f5a15,0x67b6b645,
  110730. 0xa420e15e,0x76221794,0x4b1e872e,0x794fd83b,0xb2dece1b,0x7cab3f03 },
  110731. { 0xca9b3586,0x7119bf15,0x4d250bd7,0xa5545924,0xcc6bcf24,0x173633ea,
  110732. 0xb1b6f884,0x9bd308c2,0x447d38c3,0x3bae06f5,0xf341fe1c,0x54dcc135 } },
  110733. /* 38 */
  110734. { { 0x943caf0d,0x56d3598d,0x225ff133,0xce044ea9,0x563fadea,0x9edf6a7c,
  110735. 0x73e8dc27,0x632eb944,0x3190dcab,0x814b467e,0x6dbb1e31,0x2d4f4f31 },
  110736. { 0xa143b7ca,0x8d69811c,0xde7cf950,0x4ec1ac32,0x37b5fe82,0x223ab5fd,
  110737. 0x9390f1d9,0xe82616e4,0x75804610,0xabff4b20,0x875b08f0,0x11b9be15 } },
  110738. /* 39 */
  110739. { { 0x3bbe682c,0x4ae31a3d,0x74eef2dd,0xbc7c5d26,0x3c47dd40,0x92afd10a,
  110740. 0xc14ab9e1,0xec7e0a3b,0xb2e495e4,0x6a6c3dd1,0x309bcd85,0x085ee5e9 },
  110741. { 0x8c2e67fd,0xf381a908,0xe261eaf2,0x32083a80,0x96deee15,0x0fcd6a49,
  110742. 0x5e524c79,0xe3b8fb03,0x1d5b08b9,0x8dc360d9,0x7f26719f,0x3a06e2c8 } },
  110743. /* 40 */
  110744. { { 0x7237cac0,0x5cd9f5a8,0x43586794,0x93f0b59d,0xe94f6c4e,0x4384a764,
  110745. 0xb62782d3,0x8304ed2b,0xcde06015,0x0b8db8b3,0x5dbe190f,0x4336dd53 },
  110746. { 0x92ab473a,0x57443553,0xbe5ed046,0x031c7275,0x21909aa4,0x3e78678c,
  110747. 0x99202ddb,0x4ab7e04f,0x6977e635,0x2648d206,0x093198be,0xd427d184 } },
  110748. /* 41 */
  110749. { { 0x0f9b5a31,0x822848f5,0xbaadb62a,0xbb003468,0x3357559c,0x233a0472,
  110750. 0x79aee843,0x49ef6880,0xaeb9e1e3,0xa89867a0,0x1f6f9a55,0xc151931b },
  110751. { 0xad74251e,0xd264eb0b,0x4abf295e,0x37b9b263,0x04960d10,0xb600921b,
  110752. 0x4da77dc0,0x0de53dbc,0xd2b18697,0x01d9bab3,0xf7156ddf,0xad54ec7a } },
  110753. /* 42 */
  110754. { { 0x79efdc58,0x8e74dc35,0x4ff68ddb,0x456bd369,0xd32096a5,0x724e74cc,
  110755. 0x386783d0,0xe41cff42,0x7c70d8a4,0xa04c7f21,0xe61a19a2,0x41199d2f },
  110756. { 0x29c05dd2,0xd389a3e0,0xe7e3fda9,0x535f2a6b,0x7c2b4df8,0x26ecf72d,
  110757. 0xfe745294,0x678275f4,0x9d23f519,0x6319c9cc,0x88048fc4,0x1e05a02d } },
  110758. /* 43 */
  110759. { { 0xd4d5ffe8,0x75cc8e2e,0xdbea17f2,0xf8bb4896,0xcee3cb4a,0x35059790,
  110760. 0xa47c6165,0x4c06ee85,0x92935d2f,0xf98fff25,0x32ffd7c7,0x34c4a572 },
  110761. { 0xea0376a2,0xc4b14806,0x4f115e02,0x2ea5e750,0x1e55d7c0,0x532d76e2,
  110762. 0xf31044da,0x68dc9411,0x71b77993,0x9272e465,0x93a8cfd5,0xadaa38bb } },
  110763. /* 44 */
  110764. { { 0x7d4ed72a,0x4bf0c712,0xba1f79a3,0xda0e9264,0xf4c39ea4,0x48c0258b,
  110765. 0x2a715138,0xa5394ed8,0xbf06c660,0x4af511ce,0xec5c37cd,0xfcebceef },
  110766. { 0x779ae8c1,0xf23b75aa,0xad1e606e,0xdeff59cc,0x22755c82,0xf3f526fd,
  110767. 0xbb32cefd,0x64c5ab44,0x915bdefd,0xa96e11a2,0x1143813e,0xab19746a } },
  110768. /* 45 */
  110769. { { 0xec837d7d,0x43c78585,0xb8ee0ba4,0xca5b6fbc,0xd5dbb5ee,0x34e924d9,
  110770. 0xbb4f1ca5,0x3f4fa104,0x398640f7,0x15458b72,0xd7f407ea,0x4231faa9 },
  110771. { 0xf96e6896,0x53e0661e,0xd03b0f9d,0x554e4c69,0x9c7858d1,0xd4fcb07b,
  110772. 0x52cb04fa,0x7e952793,0x8974e7f7,0x5f5f1574,0x6b6d57c8,0x2e3fa558 } },
  110773. /* 46 */
  110774. { { 0x6a9951a8,0x42cd4803,0x42792ad0,0xa8b15b88,0xabb29a73,0x18e8bcf9,
  110775. 0x409933e8,0xbfd9a092,0xefb88dc4,0x760a3594,0x40724458,0x14418863 },
  110776. { 0x99caedc7,0x162a56ee,0x91d101c9,0x8fb12ecd,0x393202da,0xea671967,
  110777. 0xa4ccd796,0x1aac8c4a,0x1cf185a8,0x7db05036,0x8cfd095a,0x0c9f86cd } },
  110778. /* 47 */
  110779. { { 0x10b2a556,0x9a728147,0x327b70b2,0x767ca964,0x5e3799b7,0x04ed9e12,
  110780. 0x22a3eb2a,0x6781d2dc,0x0d9450ac,0x5bd116eb,0xa7ebe08a,0xeccac1fc },
  110781. { 0xdc2d6e94,0xde68444f,0x35ecf21b,0x3621f429,0x29e03a2c,0x14e2d543,
  110782. 0x7d3e7f0a,0x53e42cd5,0x73ed00b9,0xbba26c09,0xc57d2272,0x00297c39 } },
  110783. /* 48 */
  110784. { { 0xb8243a7d,0x3aaaab10,0x8fa58c5b,0x6eeef93e,0x9ae7f764,0xf866fca3,
  110785. 0x61ab04d3,0x64105a26,0x03945d66,0xa3578d8a,0x791b848c,0xb08cd3e4 },
  110786. { 0x756d2411,0x45edc5f8,0xa755128c,0xd4a790d9,0x49e5f6a0,0xc2cf0963,
  110787. 0xf649beaa,0xc66d267d,0x8467039e,0x3ce6d968,0x42f7816f,0x50046c6b } },
  110788. /* 49 */
  110789. { { 0x66425043,0x92ae1602,0xf08db890,0x1ff66afd,0x8f162ce5,0x386f5a7f,
  110790. 0xfcf5598f,0x18d2dea0,0x1a8ca18e,0x78372b3a,0x8cd0e6f7,0xdf0d20eb },
  110791. { 0x75bb4045,0x7edd5e1d,0xb96d94b7,0x252a47ce,0x2c626776,0xbdb29358,
  110792. 0x40dd1031,0x853c3943,0x7d5f47fd,0x9dc9becf,0xbae4044a,0x27c2302f } },
  110793. /* 50 */
  110794. { { 0x8f2d49ce,0x2d1d208a,0x162df0a2,0x0d91aa02,0x09a07f65,0x9c5cce87,
  110795. 0x84339012,0xdf07238b,0x419442cd,0x5028e2c8,0x72062aba,0x2dcbd358 },
  110796. { 0xe4680967,0xb5fbc3cb,0x9f92d72c,0x2a7bc645,0x116c369d,0x806c76e1,
  110797. 0x3177e8d8,0x5c50677a,0x4569df57,0x753739eb,0x36c3f40b,0x2d481ef6 } },
  110798. /* 51 */
  110799. { { 0xfea1103e,0x1a2d39fd,0x95f81b17,0xeaae5592,0xf59b264a,0xdbd0aa18,
  110800. 0xcb592ee0,0x90c39c1a,0x9750cca3,0xdf62f80d,0xdf97cc6c,0xda4d8283 },
  110801. { 0x1e201067,0x0a6dd346,0x69fb1f6b,0x1531f859,0x1d60121f,0x4895e552,
  110802. 0x4c041c91,0x0b21aab0,0xbcc1ccf8,0x9d896c46,0x3141bde7,0xd24da3b3 } },
  110803. /* 52 */
  110804. { { 0x53b0a354,0x575a0537,0x0c6ddcd8,0x392ff2f4,0x56157b94,0x0b8e8cff,
  110805. 0x3b1b80d1,0x073e57bd,0x3fedee15,0x2a75e0f0,0xaa8e6f19,0x752380e4 },
  110806. { 0x6558ffe9,0x1f4e227c,0x19ec5415,0x3a348618,0xf7997085,0xab382d5e,
  110807. 0xddc46ac2,0x5e6deaff,0xfc8d094c,0xe5144078,0xf60e37c6,0xf674fe51 } },
  110808. /* 53 */
  110809. { { 0xaf63408f,0x6fb87ae5,0xcd75a737,0xa39c36a9,0xcf4c618d,0x7833313f,
  110810. 0xf034c88d,0xfbcd4482,0x39b35288,0x4469a761,0x66b5d9c9,0x77a711c5 },
  110811. { 0x944f8d65,0x4a695dc7,0x161aaba8,0xe6da5f65,0x24601669,0x8654e9c3,
  110812. 0x28ae7491,0xbc8b93f5,0x8f5580d8,0x5f1d1e83,0xcea32cc8,0x8ccf9a1a } },
  110813. /* 54 */
  110814. { { 0x7196fee2,0x28ab110c,0x874c8945,0x75799d63,0x29aedadd,0xa2629348,
  110815. 0x2be88ff4,0x9714cc7b,0xd58d60d6,0xf71293cf,0x32a564e9,0xda6b6cb3 },
  110816. { 0x3dd821c2,0xf43fddb1,0x90dd323d,0xf2f2785f,0x048489f8,0x91246419,
  110817. 0xd24c6749,0x61660f26,0xc803c15c,0x961d9e8c,0xfaadc4c9,0x631c6158 } },
  110818. /* 55 */
  110819. { { 0xfd752366,0xacf2ebe0,0x139be88b,0xb93c340e,0x0f20179e,0x98f66485,
  110820. 0xff1da785,0x14820254,0x4f85c16e,0x5278e276,0x7aab1913,0xa246ee45 },
  110821. { 0x53763b33,0x43861eb4,0x45c0bc0d,0xc49f03fc,0xad6b1ea1,0xafff16bc,
  110822. 0x6fd49c99,0xce33908b,0xf7fde8c3,0x5c51e9bf,0xff142c5e,0x076a7a39 } },
  110823. /* 56 */
  110824. { { 0x9e338d10,0x04639dfe,0xf42b411b,0x8ee6996f,0xa875cef2,0x960461d1,
  110825. 0x95b4d0ba,0x1057b6d6,0xa906e0bc,0x27639252,0xe1c20f8a,0x2c19f09a },
  110826. { 0xeef4c43d,0x5b8fc3f0,0x07a84aa9,0xe2e1b1a8,0x835d2bdb,0x5f455528,
  110827. 0x207132dd,0x0f4aee4d,0x3907f675,0xe9f8338c,0x0e0531f0,0x7a874dc9 } },
  110828. /* 57 */
  110829. { { 0x97c27050,0x84b22d45,0x59e70bf8,0xbd0b8df7,0x79738b9b,0xb4d67405,
  110830. 0xcd917c4f,0x47f4d5f5,0x13ce6e33,0x9099c4ce,0x521d0f8b,0x942bfd39 },
  110831. { 0xa43b566d,0x5028f0f6,0x21bff7de,0xaf6e8669,0xc44232cd,0x83f6f856,
  110832. 0xf915069a,0x65680579,0xecfecb85,0xd12095a2,0xdb01ba16,0xcf7f06ae } },
  110833. /* 58 */
  110834. { { 0x8ef96c80,0x0f56e3c4,0x3ddb609c,0xd521f2b3,0x7dc1450d,0x2be94102,
  110835. 0x02a91fe2,0x2d21a071,0x1efa37de,0x2e6f74fa,0x156c28a1,0x9a9a90b8 },
  110836. { 0x9dc7dfcb,0xc54ea9ea,0x2c2c1d62,0xc74e66fc,0x49d3e067,0x9f23f967,
  110837. 0x54dd38ad,0x1c7c3a46,0x5946cee3,0xc7005884,0x45cc045d,0x89856368 } },
  110838. /* 59 */
  110839. { { 0xfce73946,0x29da7cd4,0x23168563,0x8f697db5,0xcba92ec6,0x8e235e9c,
  110840. 0x9f91d3ea,0x55d4655f,0xaa50a6cd,0xf3689f23,0x21e6a1a0,0xdcf21c26 },
  110841. { 0x61b818bf,0xcffbc82e,0xda47a243,0xc74a2f96,0x8bc1a0cf,0x234e980a,
  110842. 0x7929cb6d,0xf35fd6b5,0xefe17d6c,0x81468e12,0x58b2dafb,0xddea6ae5 } },
  110843. /* 60 */
  110844. { { 0x7e787b2e,0x294de887,0x39a9310d,0x258acc1f,0xac14265d,0x92d9714a,
  110845. 0x708b48a0,0x18b5591c,0xe1abbf71,0x27cc6bb0,0x568307b9,0xc0581fa3 },
  110846. { 0xf24d4d58,0x9e0f58a3,0xe0ce2327,0xfebe9bb8,0x9d1be702,0x91fd6a41,
  110847. 0xfacac993,0x9a7d8a45,0x9e50d66d,0xabc0a08c,0x06498201,0x02c342f7 } },
  110848. /* 61 */
  110849. { { 0x157bdbc2,0xccd71407,0xad0e1605,0x72fa89c6,0xb92a015f,0xb1d3da2b,
  110850. 0xa0a3fe56,0x8ad9e7cd,0x24f06737,0x160edcbd,0x61275be6,0x79d4db33 },
  110851. { 0x5f3497c4,0xd3d31fd9,0x04192fb0,0x8cafeaee,0x13a50af3,0xe13ca745,
  110852. 0x8c85aae5,0x18826167,0x9eb556ff,0xce06cea8,0xbdb549f3,0x2eef1995 } },
  110853. /* 62 */
  110854. { { 0x50596edc,0x8ed7d3eb,0x905243a2,0xaa359362,0xa4b6d02b,0xa212c2c2,
  110855. 0xc4fbec68,0x611fd727,0xb84f733d,0x8a0b8ff7,0x5f0daf0e,0xd85a6b90 },
  110856. { 0xd4091cf7,0x60e899f5,0x2eff2768,0x4fef2b67,0x10c33964,0xc1f195cb,
  110857. 0x93626a8f,0x8275d369,0x0d6c840a,0xc77904f4,0x7a868acd,0x88d8b7fd } },
  110858. /* 63 */
  110859. { { 0x7bd98425,0x85f23723,0xc70b154e,0xd4463992,0x96687a2e,0xcbb00ee2,
  110860. 0xc83214fd,0x905fdbf7,0x13593684,0x2019d293,0xef51218e,0x0428c393 },
  110861. { 0x981e909a,0x40c7623f,0x7be192da,0x92513385,0x4010907e,0x48fe480f,
  110862. 0x3120b459,0xdd7a187c,0xa1fd8f3c,0xc9d7702d,0xe358efc5,0x66e4753b } },
  110863. /* 64 */
  110864. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  110865. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  110866. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  110867. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  110868. /* 65 */
  110869. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  110870. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  110871. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  110872. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  110873. /* 66 */
  110874. { { 0xc6a2123f,0xb1a358f5,0xfe28df6d,0x927b2d95,0xf199d2f9,0x89702753,
  110875. 0x1a3f82dc,0x0a73754c,0x777affe1,0x063d029d,0xdae6d34d,0x5439817e },
  110876. { 0x6b8b83c4,0xf7979eef,0x9d945682,0x615cb214,0xc5e57eae,0x8f0e4fac,
  110877. 0x113047dd,0x042b89b8,0x93f36508,0x888356dc,0x5fd1f32f,0xbf008d18 } },
  110878. /* 67 */
  110879. { { 0x4e8068db,0x8012aa24,0xa5729a47,0xc72cc641,0x43f0691d,0x3c33df2c,
  110880. 0x1d92145f,0xfa057347,0xb97f7946,0xaefc0f2f,0x2f8121bf,0x813d75cb },
  110881. { 0x4383bba6,0x05613c72,0xa4224b3f,0xa924ce70,0x5f2179a6,0xe59cecbe,
  110882. 0x79f62b61,0x78e2e8aa,0x53ad8079,0x3ac2cc3b,0xd8f4fa96,0x55518d71 } },
  110883. /* 68 */
  110884. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  110885. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  110886. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  110887. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  110888. /* 69 */
  110889. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  110890. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  110891. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  110892. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  110893. /* 70 */
  110894. { { 0xb0ab9645,0xb5e405d3,0xd5f1f711,0xaeec7f98,0x585c2a6e,0x8ad42311,
  110895. 0x512c6944,0x045acb9e,0xa90db1c6,0xae106c4e,0x898e6563,0xb89f33d5 },
  110896. { 0x7fed2ce4,0x43b07cd9,0xdd815b20,0xf9934e17,0x0a81a349,0x6778d4d5,
  110897. 0x52918061,0x9e616ade,0xd7e67112,0xfa06db06,0x88488091,0x1da23cf1 } },
  110898. /* 71 */
  110899. { { 0x42f2c4b5,0x821c46b3,0x66059e47,0x931513ef,0x66f50cd1,0x7030ae43,
  110900. 0x43e7b127,0x43b536c9,0x5fca5360,0x006258cf,0x6b557abf,0xe4e3ee79 },
  110901. { 0x24c8b22f,0xbb6b3900,0xfcbf1054,0x2eb5e2c1,0x567492af,0x937b18c9,
  110902. 0xacf53957,0xf09432e4,0x1dbf3a56,0x585f5a9d,0xbe0887cf,0xf86751fd } },
  110903. /* 72 */
  110904. { { 0x9d10e0b2,0x157399cb,0x60dc51b7,0x1c0d5956,0x1f583090,0x1d496b8a,
  110905. 0x88590484,0x6658bc26,0x03213f28,0x88c08ab7,0x7ae58de4,0x8d2e0f73 },
  110906. { 0x486cfee6,0x9b79bc95,0xe9e5bc57,0x036a26c7,0xcd8ae97a,0x1ad03601,
  110907. 0xff3a0494,0x06907f87,0x2c7eb584,0x078f4bbf,0x7e8d0a5a,0xe3731bf5 } },
  110908. /* 73 */
  110909. { { 0xe1cd0abe,0x72f2282b,0x87efefa2,0xd4f9015e,0x6c3834bd,0x9d189806,
  110910. 0xb8a29ced,0x9c8cdcc1,0xfee82ebc,0x0601b9f4,0x7206a756,0x371052bc },
  110911. { 0x46f32562,0x76fa1092,0x17351bb4,0xdaad534c,0xb3636bb5,0xc3d64c37,
  110912. 0x45d54e00,0x038a8c51,0x32c09e7c,0x301e6180,0x95735151,0x9764eae7 } },
  110913. /* 74 */
  110914. { { 0xcbd5256a,0x8791b19f,0x6ca13a3b,0x4007e0f2,0x4cf06904,0x03b79460,
  110915. 0xb6c17589,0xb18a9c22,0x81d45908,0xa1cb7d7d,0x21bb68f1,0x6e13fa9d },
  110916. { 0xa71e6e16,0x47183c62,0xe18749ed,0x5cf0ef8e,0x2e5ed409,0x2c9c7f9b,
  110917. 0xe6e117e1,0x042eeacc,0x13fb5a7f,0xb86d4816,0xc9e5feb1,0xea1cf0ed } },
  110918. /* 75 */
  110919. { { 0xcea4cc9b,0x6e6573c9,0xafcec8f3,0x5417961d,0xa438b6f6,0x804bf02a,
  110920. 0xdcd4ea88,0xb894b03c,0x3799571f,0xd0f807e9,0x862156e8,0x3466a7f5 },
  110921. { 0x56515664,0x51e59acd,0xa3c5eb0b,0x55b0f93c,0x6a4279db,0x84a06b02,
  110922. 0xc5fae08e,0x5c850579,0xa663a1a2,0xcf07b8db,0xf46ffc8d,0x49a36bbc } },
  110923. /* 76 */
  110924. { { 0x46d93106,0xe47f5acc,0xaa897c9c,0x65b7ade0,0x12d7e4be,0x37cf4c94,
  110925. 0xd4b2caa9,0xa2ae9b80,0xe60357a3,0x5e7ce09c,0xc8ecd5f9,0x29f77667 },
  110926. { 0xa8a0b1c5,0xdf6868f5,0x62978ad8,0x240858cf,0xdc0002a1,0x0f7ac101,
  110927. 0xffe9aa05,0x1d28a9d7,0x5b962c97,0x744984d6,0x3d28c8b2,0xa8a7c00b } },
  110928. /* 77 */
  110929. { { 0xae11a338,0x7c58a852,0xd1af96e7,0xa78613f1,0x5355cc73,0x7e9767d2,
  110930. 0x792a2de6,0x6ba37009,0x124386b2,0x7d60f618,0x11157674,0xab09b531 },
  110931. { 0x98eb9dd0,0x95a04841,0x15070328,0xe6c17acc,0x489c6e49,0xafc6da45,
  110932. 0xbb211530,0xab45a60a,0x7d7ea933,0xc58d6592,0x095642c6,0xa3ef3c65 } },
  110933. /* 78 */
  110934. { { 0xdf010879,0x89d420e9,0x39576179,0x9d25255d,0xe39513b6,0x9cdefd50,
  110935. 0xd5d1c313,0xe4efe45b,0x3f7af771,0xc0149de7,0x340ab06b,0x55a6b4f4 },
  110936. { 0xebeaf771,0xf1325251,0x878d4288,0x2ab44128,0x18e05afe,0xfcd5832e,
  110937. 0xcc1fb62b,0xef52a348,0xc1c4792a,0x2bd08274,0x877c6dc7,0x345c5846 } },
  110938. /* 79 */
  110939. { { 0xbea65e90,0xde15ceb0,0x2416d99c,0x0987f72b,0xfd863dec,0x44db578d,
  110940. 0xac6a3578,0xf617b74b,0xdb48e999,0x9e62bd7a,0xeab1a1be,0x877cae61 },
  110941. { 0x3a358610,0x23adddaa,0x325e2b07,0x2fc4d6d1,0x1585754e,0x897198f5,
  110942. 0xb392b584,0xf741852c,0xb55f7de1,0x9927804c,0x1aa8efae,0xe9e6c4ed } },
  110943. /* 80 */
  110944. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  110945. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  110946. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  110947. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  110948. /* 81 */
  110949. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  110950. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  110951. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  110952. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  110953. /* 82 */
  110954. { { 0xf8e60f5b,0x511188b4,0x48aa2ada,0x7fe67015,0x381abca2,0xdb333cb8,
  110955. 0xdaf3fc97,0xb15e6d9d,0x36aabc03,0x4b24f6eb,0x72a748b4,0xc59789df },
  110956. { 0x29cf5279,0x26fcb8a5,0x01ad9a6c,0x7a3c6bfc,0x4b8bac9b,0x866cf88d,
  110957. 0x9c80d041,0xf4c89989,0x70add148,0xf0a04241,0x45d81a41,0x5a02f479 } },
  110958. /* 83 */
  110959. { { 0xc1c90202,0xfa5c877c,0xf8ac7570,0xd099d440,0xd17881f7,0x428a5b1b,
  110960. 0x5b2501d7,0x61e267db,0xf2e4465b,0xf889bf04,0x76aa4cb8,0x4da3ae08 },
  110961. { 0xe3e66861,0x3ef0fe26,0x3318b86d,0x5e772953,0x747396df,0xc3c35fbc,
  110962. 0x439ffd37,0x5115a29c,0xb2d70374,0xbfc4bd97,0x56246b9d,0x088630ea } },
  110963. /* 84 */
  110964. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  110965. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  110966. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  110967. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  110968. /* 85 */
  110969. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  110970. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  110971. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  110972. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  110973. /* 86 */
  110974. { { 0xfecf5b9b,0x34e0f9d1,0xf206966a,0xa115b12b,0x1eaa0534,0x5591cf3b,
  110975. 0xfb1558f9,0x5f0293cb,0x1bc703a5,0x1c8507a4,0x862c1f81,0x92e6b81c },
  110976. { 0xcdaf24e3,0xcc9ebc66,0x72fcfc70,0x68917ecd,0x8157ba48,0x6dc9a930,
  110977. 0xb06ab2b2,0x5d425c08,0x36e929c4,0x362f8ce7,0x62e89324,0x09f6f57c } },
  110978. /* 87 */
  110979. { { 0xd29375fb,0x1c7d6b78,0xe35d1157,0xfabd851e,0x4243ea47,0xf6f62dcd,
  110980. 0x8fe30b0f,0x1dd92460,0xffc6e709,0x08166dfa,0x0881e6a7,0xc6c4c693 },
  110981. { 0xd6a53fb0,0x20368f87,0x9eb4d1f9,0x38718e9f,0xafd7e790,0x03f08acd,
  110982. 0x72fe2a1c,0x0835eb44,0x88076e5d,0x7e050903,0xa638e731,0x538f765e } },
  110983. /* 88 */
  110984. { { 0xc2663b4b,0x0e0249d9,0x47cd38dd,0xe700ab5b,0x2c46559f,0xb192559d,
  110985. 0x4bcde66d,0x8f9f74a8,0x3e2aced5,0xad161523,0x3dd03a5b,0xc155c047 },
  110986. { 0x3be454eb,0x346a8799,0x83b7dccd,0x66ee94db,0xab9d2abe,0x1f6d8378,
  110987. 0x7733f355,0x4a396dd2,0xf53553c2,0x419bd40a,0x731dd943,0xd0ead98d } },
  110988. /* 89 */
  110989. { { 0xec142408,0x908e0b0e,0x4114b310,0x98943cb9,0x1742b1d7,0x03dbf7d8,
  110990. 0x693412f4,0xd270df6b,0x8f69e20c,0xc5065494,0x697e43a1,0xa76a90c3 },
  110991. { 0x4624825a,0xe0fa3384,0x8acc34c2,0x82e48c0b,0xe9a14f2b,0x7b24bd14,
  110992. 0x4db30803,0x4f5dd5e2,0x932da0a3,0x0c77a9e7,0x74c653dc,0x20db90f2 } },
  110993. /* 90 */
  110994. { { 0x0e6c5fd9,0x261179b7,0x6c982eea,0xf8bec123,0xd4957b7e,0x47683338,
  110995. 0x0a72f66a,0xcc47e664,0x1bad9350,0xbd54bf6a,0xf454e95a,0xdfbf4c6a },
  110996. { 0x6907f4fa,0x3f7a7afa,0x865ca735,0x7311fae0,0x2a496ada,0x24737ab8,
  110997. 0x15feb79b,0x13e425f1,0xa1b93c21,0xe9e97c50,0x4ddd3eb5,0xb26b6eac } },
  110998. /* 91 */
  110999. { { 0x2a2e5f2b,0x81cab9f5,0xbf385ac4,0xf93caf29,0xc909963a,0xf4bf35c3,
  111000. 0x74c9143c,0x081e7300,0xc281b4c5,0x3ea57fa8,0x9b340741,0xe497905c },
  111001. { 0x55ab3cfb,0xf556dd8a,0x518db6ad,0xd444b96b,0x5ef4b955,0x34f5425a,
  111002. 0xecd26aa3,0xdda7a3ac,0xda655e97,0xb57da11b,0xc2024c70,0x02da3eff } },
  111003. /* 92 */
  111004. { { 0x6481d0d9,0xe24b0036,0x818fdfe2,0x3740dbe5,0x190fda00,0xc1fc1f45,
  111005. 0x3cf27fde,0x329c9280,0x6934f43e,0x7435cb53,0x7884e8fe,0x2b505a5d },
  111006. { 0x711adcc9,0x6cfcc6a6,0x531e21e1,0xf034325c,0x9b2a8a99,0xa2f4a967,
  111007. 0x3c21bdff,0x9d5f3842,0x31b57d66,0xb25c7811,0x0b8093b9,0xdb5344d8 } },
  111008. /* 93 */
  111009. { { 0xae50a2f5,0x0d72e667,0xe4a861d1,0x9b7f8d8a,0x330df1cb,0xa129f70f,
  111010. 0xe04fefc3,0xe90aa5d7,0xe72c3ae1,0xff561ecb,0xcdb955fa,0x0d8fb428 },
  111011. { 0xd7663784,0xd2235f73,0x7e2c456a,0xc05baec6,0x2adbfccc,0xe5c292e4,
  111012. 0xefb110d5,0x4fd17988,0xd19d49f3,0x27e57734,0x84f679fe,0x188ac4ce } },
  111013. /* 94 */
  111014. { { 0xa796c53e,0x7ee344cf,0x0868009b,0xbbf6074d,0x474a1295,0x1f1594f7,
  111015. 0xac11632d,0x66776edc,0x04e2fa5a,0x1862278b,0xc854a89a,0x52665cf2 },
  111016. { 0x8104ab58,0x7e376464,0x7204fd6d,0x16775913,0x44ea1199,0x86ca06a5,
  111017. 0x1c9240dd,0xaa3f765b,0x24746149,0x5f8501a9,0xdcd251d7,0x7b982e30 } },
  111018. /* 95 */
  111019. { { 0xc15f3060,0xe44e9efc,0xa87ebbe6,0x5ad62f2e,0xc79500d4,0x36499d41,
  111020. 0x336fa9d1,0xa66d6dc0,0x5afd3b1f,0xf8afc495,0xe5c9822b,0x1d8ccb24 },
  111021. { 0x79d7584b,0x4031422b,0xea3f20dd,0xc54a0580,0x958468c5,0x3f837c8f,
  111022. 0xfbea7735,0x3d82f110,0x7dffe2fc,0x679a8778,0x20704803,0x48eba63b } },
  111023. /* 96 */
  111024. { { 0xdf46e2f6,0x89b10d41,0x19514367,0x13ab57f8,0x1d469c87,0x067372b9,
  111025. 0x4f6c5798,0x0c195afa,0x272c9acf,0xea43a12a,0x678abdac,0x9dadd8cb },
  111026. { 0xe182579a,0xcce56c6b,0x2d26c2d8,0x86febadb,0x2a44745c,0x1c668ee1,
  111027. 0x98dc047a,0x580acd86,0x51b9ec2d,0x5a2b79cc,0x4054f6a0,0x007da608 } },
  111028. /* 97 */
  111029. { { 0x17b00dd0,0x9e3ca352,0x0e81a7a6,0x046779cb,0xd482d871,0xb999fef3,
  111030. 0xd9233fbc,0xe6f38134,0xf48cd0e0,0x112c3001,0x3c6c66ae,0x934e7576 },
  111031. { 0xd73234dc,0xb44d4fc3,0x864eafc1,0xfcae2062,0x26bef21a,0x843afe25,
  111032. 0xf3b75fdf,0x61355107,0x794c2e6b,0x8367a5aa,0x8548a372,0x3d2629b1 } },
  111033. /* 98 */
  111034. { { 0x437cfaf8,0x6230618f,0x2032c299,0x5b8742cb,0x2293643a,0x949f7247,
  111035. 0x09464f79,0xb8040f1a,0x4f254143,0x049462d2,0x366c7e76,0xabd6b522 },
  111036. { 0xd5338f55,0x119b392b,0x01495a0c,0x1a80a9ce,0xf8d7537e,0xf3118ca7,
  111037. 0x6bf4b762,0xb715adc2,0xa8482b6c,0x24506165,0x96a7c84d,0xd958d7c6 } },
  111038. /* 99 */
  111039. { { 0xbdc21f31,0x9ad8aa87,0x8063e58c,0xadb3cab4,0xb07dd7b8,0xefd86283,
  111040. 0x1be7c6b4,0xc7b9b762,0x015582de,0x2ef58741,0x299addf3,0xc970c52e },
  111041. { 0x22f24d66,0x78f02e2a,0x74cc100a,0xefec1d10,0x09316e1a,0xaf2a6a39,
  111042. 0x5849dd49,0xce7c2205,0x96bffc4c,0x9c1fe75c,0x7ba06ec0,0xcad98fd2 } },
  111043. /* 100 */
  111044. { { 0xb648b73e,0xed76e2d0,0x1cfd285e,0xa9f92ce5,0x2ed13de1,0xa8c86c06,
  111045. 0xa5191a93,0x1d3a574e,0x1ad1b8bf,0x385cdf8b,0x47d2cfe3,0xbbecc28a },
  111046. { 0x69cec548,0x98d326c0,0xf240a0b2,0x4f5bc1dd,0x29057236,0x241a7062,
  111047. 0xc68294a4,0x0fc6e9c5,0xa319f17a,0x4d04838b,0x9ffc1c6f,0x8b612cf1 } },
  111048. /* 101 */
  111049. { { 0x4c3830eb,0x9bb0b501,0x8ee0d0c5,0x3d08f83c,0x79ba9389,0xa4a62642,
  111050. 0x9cbc2914,0x5d5d4044,0x074c46f0,0xae9eb83e,0x74ead7d6,0x63bb758f },
  111051. { 0xc6bb29e0,0x1c40d2ea,0x4b02f41e,0x95aa2d87,0x53cb199a,0x92989175,
  111052. 0x51584f6d,0xdd91bafe,0x31a1aaec,0x3715efb9,0x46780f9e,0xc1b6ae5b } },
  111053. /* 102 */
  111054. { { 0x42772f41,0xcded3e4b,0x3bcb79d1,0x3a700d5d,0x80feee60,0x4430d50e,
  111055. 0xf5e5d4bb,0x444ef1fc,0xe6e358ff,0xc660194f,0x6a91b43c,0xe68a2f32 },
  111056. { 0x977fe4d2,0x5842775c,0x7e2a41eb,0x78fdef5c,0xff8df00e,0x5f3bec02,
  111057. 0x5852525d,0xf4b840cd,0x4e6988bd,0x0870483a,0xcc64b837,0x39499e39 } },
  111058. /* 103 */
  111059. { { 0xb08df5fe,0xfc05de80,0x63ba0362,0x0c12957c,0xd5cf1428,0xea379414,
  111060. 0x54ef6216,0xc559132a,0xb9e65cf8,0x33d5f12f,0x1695d663,0x09c60278 },
  111061. { 0x61f7a2fb,0x3ac1ced4,0xd4f5eeb8,0xdd838444,0x8318fcad,0x82a38c6c,
  111062. 0xe9f1a864,0x315be2e5,0x442daf47,0x317b5771,0x95aa5f9e,0x81b5904a } },
  111063. /* 104 */
  111064. { { 0x8b21d232,0x6b6b1c50,0x8c2cba75,0x87f3dbc0,0xae9f0faf,0xa7e74b46,
  111065. 0xbb7b8079,0x036a0985,0x8d974a25,0x4f185b90,0xd9af5ec9,0x5aa7cef0 },
  111066. { 0x57dcfffc,0xe0566a70,0xb8453225,0x6ea311da,0x23368aa9,0x72ea1a8d,
  111067. 0x48cd552d,0xed9b2083,0xc80ea435,0xb987967c,0x6c104173,0xad735c75 } },
  111068. /* 105 */
  111069. { { 0xcee76ef4,0xaea85ab3,0xaf1d2b93,0x44997444,0xeacb923f,0x0851929b,
  111070. 0x51e3bc0c,0xb080b590,0x59be68a2,0xc4ee1d86,0x64b26cda,0xf00de219 },
  111071. { 0xf2e90d4d,0x8d7fb5c0,0x77d9ec64,0x00e219a7,0x5d1c491c,0xc4e6febd,
  111072. 0x1a8f4585,0x080e3754,0x48d2af9c,0x4a9b86c8,0xb6679851,0x2ed70db6 } },
  111073. /* 106 */
  111074. { { 0x586f25cb,0xaee44116,0xa0fcf70f,0xf7b6861f,0x18a350e8,0x55d2cd20,
  111075. 0x92dc286f,0x861bf3e5,0x6226aba7,0x9ab18ffa,0xa9857b03,0xd15827be },
  111076. { 0x92e6acef,0x26c1f547,0xac1fbac3,0x422c63c8,0xfcbfd71d,0xa2d8760d,
  111077. 0xb2511224,0x35f6a539,0x048d1a21,0xbaa88fa1,0xebf999db,0x49f1abe9 } },
  111078. /* 107 */
  111079. { { 0xf7492b73,0x16f9f4f4,0xcb392b1a,0xcf28ec1e,0x69ca6ffc,0x45b130d4,
  111080. 0xb72efa58,0x28ba8d40,0x5ca066f5,0xace987c7,0x4ad022eb,0x3e399246 },
  111081. { 0x752555bb,0x63a2d84e,0x9c2ae394,0xaaa93b4a,0xc89539ca,0xcd80424e,
  111082. 0xaa119a99,0x6d6b5a6d,0x379f2629,0xbd50334c,0xef3cc7d3,0x899e925e } },
  111083. /* 108 */
  111084. { { 0xbf825dc4,0xb7ff3651,0x40b9c462,0x0f741cc4,0x5cc4fb5b,0x771ff5a9,
  111085. 0x47fd56fe,0xcb9e9c9b,0x5626c0d3,0xbdf053db,0xf7e14098,0xa97ce675 },
  111086. { 0x6c934f5e,0x68afe5a3,0xccefc46f,0x6cd5e148,0xd7a88586,0xc7758570,
  111087. 0xdd558d40,0x49978f5e,0x64ae00c1,0xa1d5088a,0xf1d65bb2,0x58f2a720 } },
  111088. /* 109 */
  111089. { { 0x3e4daedb,0x66fdda4a,0x65d1b052,0x38318c12,0x4c4bbf5c,0x28d910a2,
  111090. 0x78a9cd14,0x762fe5c4,0xd2cc0aee,0x08e5ebaa,0xca0c654c,0xd2cdf257 },
  111091. { 0x08b717d2,0x48f7c58b,0x386cd07a,0x3807184a,0xae7d0112,0x3240f626,
  111092. 0xc43917b0,0x03e9361b,0x20aea018,0xf261a876,0x7e1e6372,0x53f556a4 } },
  111093. /* 110 */
  111094. { { 0x2f512a90,0xc84cee56,0x1b0ea9f1,0x24b3c004,0xe26cc1ea,0x0ee15d2d,
  111095. 0xf0c9ef7d,0xd848762c,0xd5341435,0x1026e9c5,0xfdb16b31,0x8f5b73dc },
  111096. { 0xd2c75d95,0x1f69bef2,0xbe064dda,0x8d33d581,0x57ed35e6,0x8c024c12,
  111097. 0xc309c281,0xf8d435f9,0xd6960193,0xfd295061,0xe9e49541,0x66618d78 } },
  111098. /* 111 */
  111099. { { 0x8ce382de,0x571cfd45,0xde900dde,0x175806ee,0x34aba3b5,0x61849965,
  111100. 0xde7aec95,0xe899778a,0xff4aa97f,0xe8f00f6e,0x010b0c6d,0xae971cb5 },
  111101. { 0x3af788f1,0x1827eebc,0xe413fe2d,0xd46229ff,0x4741c9b4,0x8a15455b,
  111102. 0xf8e424eb,0x5f02e690,0xdae87712,0x40a1202e,0x64944f6d,0x49b3bda2 } },
  111103. /* 112 */
  111104. { { 0x035b2d69,0xd63c6067,0x6bed91b0,0xb507150d,0x7afb39b2,0x1f35f82f,
  111105. 0x16012b66,0xb9bd9c01,0xed0a5f50,0x00d97960,0x2716f7c9,0xed705451 },
  111106. { 0x127abdb4,0x1576eff4,0xf01e701c,0x6850d698,0x3fc87e2f,0x9fa7d749,
  111107. 0xb0ce3e48,0x0b6bcc6f,0xf7d8c1c0,0xf4fbe1f5,0x02719cc6,0xcf75230e } },
  111108. /* 113 */
  111109. { { 0x722d94ed,0x6761d6c2,0x3718820e,0xd1ec3f21,0x25d0e7c6,0x65a40b70,
  111110. 0xbaf3cf31,0xd67f830e,0xb93ea430,0x633b3807,0x0bc96c69,0x17faa0ea },
  111111. { 0xdf866b98,0xe6bf3482,0xa9db52d4,0x205c1ee9,0xff9ab869,0x51ef9bbd,
  111112. 0x75eeb985,0x3863dad1,0xd3cf442a,0xef216c3b,0xf9c8e321,0x3fb228e3 } },
  111113. /* 114 */
  111114. { { 0x0760ac07,0x94f9b70c,0x9d79bf4d,0xf3c9ccae,0xc5ffc83d,0x73cea084,
  111115. 0xdc49c38e,0xef50f943,0xbc9e7330,0xf467a2ae,0x44ea7fba,0x5ee534b6 },
  111116. { 0x03609e7f,0x20cb6272,0x62fdc9f0,0x09844355,0x0f1457f7,0xaf5c8e58,
  111117. 0xb4b25941,0xd1f50a6c,0x2ec82395,0x77cb247c,0xda3dca33,0xa5f3e1e5 } },
  111118. /* 115 */
  111119. { { 0x7d85fa94,0x023489d6,0x2db9ce47,0x0ba40537,0xaed7aad1,0x0fdf7a1f,
  111120. 0x9a4ccb40,0xa57b0d73,0x5b18967c,0x48fcec99,0xb7274d24,0xf30b5b6e },
  111121. { 0xc81c5338,0x7ccb4773,0xa3ed6bd0,0xb85639e6,0x1d56eada,0x7d9df95f,
  111122. 0x0a1607ad,0xe256d57f,0x957574d6,0x6da7ffdc,0x01c7a8c4,0x65f84046 } },
  111123. /* 116 */
  111124. { { 0xcba1e7f1,0x8d45d0cb,0x02b55f64,0xef0a08c0,0x17e19892,0x771ca31b,
  111125. 0x4885907e,0xe1843ecb,0x364ce16a,0x67797ebc,0x8df4b338,0x816d2b2d },
  111126. { 0x39aa8671,0xe870b0e5,0xc102b5f5,0x9f0db3e4,0x1720c697,0x34296659,
  111127. 0x613c0d2a,0x0ad4c89e,0x418ddd61,0x1af900b2,0xd336e20e,0xe087ca72 } },
  111128. /* 117 */
  111129. { { 0xaba10079,0x222831ff,0x6d64fff2,0x0dc5f87b,0x3e8cb330,0x44547907,
  111130. 0x702a33fb,0xe815aaa2,0x5fba3215,0x338d6b2e,0x79f549c8,0x0f7535cb },
  111131. { 0x2ee95923,0x471ecd97,0xc6d1c09f,0x1e868b37,0xc666ef4e,0x2bc7b8ec,
  111132. 0x808a4bfc,0xf5416589,0x3fbc4d2e,0xf23e9ee2,0x2d75125b,0x4357236c } },
  111133. /* 118 */
  111134. { { 0xba9cdb1b,0xfe176d95,0x2f82791e,0x45a1ca01,0x4de4cca2,0x97654af2,
  111135. 0x5cc4bcb9,0xbdbf9d0e,0xad97ac0a,0xf6a7df50,0x61359fd6,0xc52112b0 },
  111136. { 0x4f05eae3,0x696d9ce3,0xe943ac2b,0x903adc02,0x0848be17,0xa9075347,
  111137. 0x2a3973e5,0x1e20f170,0x6feb67e9,0xe1aacc1c,0xe16bc6b9,0x2ca0ac32 } },
  111138. /* 119 */
  111139. { { 0xef871eb5,0xffea12e4,0xa8bf0a7a,0x94c2f25d,0x78134eaa,0x4d1e4c2a,
  111140. 0x0360fb10,0x11ed16fb,0x85fc11be,0x4029b6db,0xf4d390fa,0x5e9f7ab7 },
  111141. { 0x30646612,0x5076d72f,0xdda1d0d8,0xa0afed1d,0x85a1d103,0x29022257,
  111142. 0x4e276bcd,0xcb499e17,0x51246c3d,0x16d1da71,0x589a0443,0xc72d56d3 } },
  111143. /* 120 */
  111144. { { 0xdae5bb45,0xdf5ffc74,0x261bd6dc,0x99068c4a,0xaa98ec7b,0xdc0afa7a,
  111145. 0xf121e96d,0xedd2ee00,0x1414045c,0x163cc7be,0x335af50e,0xb0b1bbce },
  111146. { 0x01a06293,0xd440d785,0x6552e644,0xcdebab7c,0x8c757e46,0x48cb8dbc,
  111147. 0x3cabe3cb,0x81f9cf78,0xb123f59a,0xddd02611,0xeeb3784d,0x3dc7b88e } },
  111148. /* 121 */
  111149. { { 0xc4741456,0xe1b8d398,0x6032a121,0xa9dfa902,0x1263245b,0x1cbfc86d,
  111150. 0x5244718c,0xf411c762,0x05b0fc54,0x96521d54,0xdbaa4985,0x1afab46e },
  111151. { 0x8674b4ad,0xa75902ba,0x5ad87d12,0x486b43ad,0x36e0d099,0x72b1c736,
  111152. 0xbb6cd6d6,0x39890e07,0x59bace4e,0x8128999c,0x7b535e33,0xd8da430b } },
  111153. /* 122 */
  111154. { { 0xc6b75791,0x39f65642,0x21806bfb,0x050947a6,0x1362ef84,0x0ca3e370,
  111155. 0x8c3d2391,0x9bc60aed,0x732e1ddc,0x9b488671,0xa98ee077,0x12d10d9e },
  111156. { 0x3651b7dc,0xb6f2822d,0x80abd138,0x6345a5ba,0x472d3c84,0x62033262,
  111157. 0xacc57527,0xd54a1d40,0x424447cb,0x6ea46b3a,0x2fb1a496,0x5bc41057 } },
  111158. /* 123 */
  111159. { { 0xa751cd0e,0xe70c57a3,0xeba3c7d6,0x190d8419,0x9d47d55a,0xb1c3bee7,
  111160. 0xf912c6d8,0xda941266,0x407a6ad6,0x12e9aacc,0x6e838911,0xd6ce5f11 },
  111161. { 0x70e1f2ce,0x063ca97b,0x8213d434,0xa3e47c72,0x84df810a,0xa016e241,
  111162. 0xdfd881a4,0x688ad7b0,0xa89bf0ad,0xa37d99fc,0xa23c2d23,0xd8e3f339 } },
  111163. /* 124 */
  111164. { { 0x750bed6f,0xbdf53163,0x83e68b0a,0x808abc32,0x5bb08a33,0x85a36627,
  111165. 0x6b0e4abe,0xf72a3a0f,0xfaf0c6ad,0xf7716d19,0x5379b25f,0x22dcc020 },
  111166. { 0xf9a56e11,0x7400bf8d,0x56a47f21,0x6cb8bad7,0x7a6eb644,0x7c97176f,
  111167. 0xd1f5b646,0xe8fd84f7,0x44ddb054,0x98320a94,0x1dde86f5,0x07071ba3 } },
  111168. /* 125 */
  111169. { { 0x98f8fcb9,0x6fdfa0e5,0x94d0d70c,0x89cec8e0,0x106d20a8,0xa0899397,
  111170. 0xba8acc9c,0x915bfb9a,0x5507e01c,0x1370c94b,0x8a821ffb,0x83246a60 },
  111171. { 0xbe3c378f,0xa8273a9f,0x35a25be9,0x7e544789,0x4dd929d7,0x6cfa4972,
  111172. 0x365bd878,0x987fed9d,0x5c29a7ae,0x4982ac94,0x5ddd7ec5,0x4589a5d7 } },
  111173. /* 126 */
  111174. { { 0xa95540a9,0x9fabb174,0x0162c5b0,0x7cfb886f,0xea3dee18,0x17be766b,
  111175. 0xe88e624c,0xff7da41f,0x8b919c38,0xad0b71eb,0xf31ff9a9,0x86a522e0 },
  111176. { 0x868bc259,0xbc8e6f72,0x3ccef9e4,0x6130c638,0x9a466555,0x09f1f454,
  111177. 0x19b2bfb4,0x8e6c0f09,0x0ca7bb22,0x945c46c9,0x4dafb67b,0xacd87168 } },
  111178. /* 127 */
  111179. { { 0x10c53841,0x090c72ca,0x55a4fced,0xc20ae01b,0xe10234ad,0x03f7ebd5,
  111180. 0x85892064,0xb3f42a6a,0xb4a14722,0xbdbc30c0,0x8ca124cc,0x971bc437 },
  111181. { 0x517ff2ff,0x6f79f46d,0xecba947b,0x6a9c96e2,0x62925122,0x5e79f2f4,
  111182. 0x6a4e91f1,0x30a96bb1,0x2d4c72da,0x1147c923,0x5811e4df,0x65bc311f } },
  111183. /* 128 */
  111184. { { 0x139b3239,0x87c7dd7d,0x4d833bae,0x8b57824e,0x9fff0015,0xbcbc4878,
  111185. 0x909eaf1a,0x8ffcef8b,0xf1443a78,0x9905f4ee,0xe15cbfed,0x020dd4a2 },
  111186. { 0xa306d695,0xca2969ec,0xb93caf60,0xdf940cad,0x87ea6e39,0x67f7fab7,
  111187. 0xf98c4fe5,0x0d0ee10f,0xc19cb91e,0xc646879a,0x7d1d7ab4,0x4b4ea50c } },
  111188. /* 129 */
  111189. { { 0x7a0db57e,0x19e40945,0x9a8c9702,0xe6017cad,0x1be5cff9,0xdbf739e5,
  111190. 0xa7a938a2,0x3646b3cd,0x68350dfc,0x04511085,0x56e098b5,0xad3bd6f3 },
  111191. { 0xee2e3e3e,0x935ebabf,0x473926cb,0xfbd01702,0x9e9fb5aa,0x7c735b02,
  111192. 0x2e3feff0,0xc52a1b85,0x046b405a,0x9199abd3,0x39039971,0xe306fcec } },
  111193. /* 130 */
  111194. { { 0x23e4712c,0xd6d9aec8,0xc3c198ee,0x7ca8376c,0x31bebd8a,0xe6d83187,
  111195. 0xd88bfef3,0xed57aff3,0xcf44edc7,0x72a645ee,0x5cbb1517,0xd4e63d0b },
  111196. { 0xceee0ecf,0x98ce7a1c,0x5383ee8e,0x8f012633,0xa6b455e8,0x3b879078,
  111197. 0xc7658c06,0xcbcd3d96,0x0783336a,0x721d6fe7,0x5a677136,0xf21a7263 } },
  111198. /* 131 */
  111199. { { 0x9586ba11,0x19d8b3cd,0x8a5c0480,0xd9e0aeb2,0x2230ef5c,0xe4261dbf,
  111200. 0x02e6bf09,0x095a9dee,0x80dc7784,0x8963723c,0x145157b1,0x5c97dbaf },
  111201. { 0x4bc4503e,0x97e74434,0x85a6b370,0x0fb1cb31,0xcd205d4b,0x3e8df2be,
  111202. 0xf8f765da,0x497dd1bc,0x6c988a1a,0x92ef95c7,0x64dc4cfa,0x3f924baa } },
  111203. /* 132 */
  111204. { { 0x7268b448,0x6bf1b8dd,0xefd79b94,0xd4c28ba1,0xe4e3551f,0x2fa1f8c8,
  111205. 0x5c9187a9,0x769e3ad4,0x40326c0d,0x28843b4d,0x50d5d669,0xfefc8094 },
  111206. { 0x90339366,0x30c85bfd,0x5ccf6c3a,0x4eeb56f1,0x28ccd1dc,0x0e72b149,
  111207. 0xf2ce978e,0x73ee85b5,0x3165bb23,0xcdeb2bf3,0x4e410abf,0x8106c923 } },
  111208. /* 133 */
  111209. { { 0x7d02f4ee,0xc8df0161,0x18e21225,0x8a781547,0x6acf9e40,0x4ea895eb,
  111210. 0x6e5a633d,0x8b000cb5,0x7e981ffb,0xf31d86d5,0x4475bc32,0xf5c8029c },
  111211. { 0x1b568973,0x764561ce,0xa62996ec,0x2f809b81,0xda085408,0x9e513d64,
  111212. 0xe61ce309,0xc27d815d,0x272999e0,0x0da6ff99,0xfead73f7,0xbd284779 } },
  111213. /* 134 */
  111214. { { 0x9b1cdf2b,0x6033c2f9,0xbc5fa151,0x2a99cf06,0x12177b3b,0x7d27d259,
  111215. 0xc4485483,0xb1f15273,0x102e2297,0x5fd57d81,0xc7f6acb7,0x3d43e017 },
  111216. { 0x3a70eb28,0x41a8bb0b,0x3e80b06b,0x67de2d8e,0x70c28de5,0x09245a41,
  111217. 0xa7b26023,0xad7dbcb1,0x2cbc6c1e,0x70b08a35,0x9b33041f,0xb504fb66 } },
  111218. /* 135 */
  111219. { { 0xf97a27c2,0xa8e85ab5,0xc10a011b,0x6ac5ec8b,0xffbcf161,0x55745533,
  111220. 0x65790a60,0x01780e85,0x99ee75b0,0xe451bf85,0x39c29881,0x8907a63b },
  111221. { 0x260189ed,0x76d46738,0x47bd35cb,0x284a4436,0x20cab61e,0xd74e8c40,
  111222. 0x416cf20a,0x6264bf8c,0x5fd820ce,0xfa5a6c95,0xf24bb5fc,0xfa7154d0 } },
  111223. /* 136 */
  111224. { { 0x9b3f5034,0x18482cec,0xcd9e68fd,0x962d445a,0x95746f23,0x266fb1d6,
  111225. 0x58c94a4b,0xc66ade5a,0xed68a5b6,0xdbbda826,0x7ab0d6ae,0x05664a4d },
  111226. { 0x025e32fc,0xbcd4fe51,0xa96df252,0x61a5aebf,0x31592a31,0xd88a07e2,
  111227. 0x98905517,0x5d9d94de,0x5fd440e7,0x96bb4010,0xe807db4c,0x1b0c47a2 } },
  111228. /* 137 */
  111229. { { 0x08223878,0x5c2a6ac8,0xe65a5558,0xba08c269,0x9bbc27fd,0xd22b1b9b,
  111230. 0x72b9607d,0x919171bf,0xe588dc58,0x9ab455f9,0x23662d93,0x6d54916e },
  111231. { 0x3b1de0c1,0x8da8e938,0x804f278f,0xa84d186a,0xd3461695,0xbf4988cc,
  111232. 0xe10eb0cb,0xf5eae3be,0xbf2a66ed,0x1ff8b68f,0xc305b570,0xa68daf67 } },
  111233. /* 138 */
  111234. { { 0x44b2e045,0xc1004cff,0x4b1c05d4,0x91b5e136,0x88a48a07,0x53ae4090,
  111235. 0xea11bb1a,0x73fb2995,0x3d93a4ea,0x32048570,0x3bfc8a5f,0xcce45de8 },
  111236. { 0xc2b3106e,0xaff4a97e,0xb6848b4f,0x9069c630,0xed76241c,0xeda837a6,
  111237. 0x6cc3f6cf,0x8a0daf13,0x3da018a8,0x199d049d,0xd9093ba3,0xf867c6b1 } },
  111238. /* 139 */
  111239. { { 0x56527296,0xe4d42a56,0xce71178d,0xae26c73d,0x6c251664,0x70a0adac,
  111240. 0x5dc0ae1d,0x813483ae,0xdaab2daf,0x7574eacd,0xc2d55f4f,0xc56b52dc },
  111241. { 0x95f32923,0x872bc167,0x5bdd2a89,0x4be17581,0xa7699f00,0x9b57f1e7,
  111242. 0x3ac2de02,0x5fcd9c72,0x92377739,0x83af3ba1,0xfc50b97f,0xa64d4e2b } },
  111243. /* 140 */
  111244. { { 0x0e552b40,0x2172dae2,0xd34d52e8,0x62f49725,0x07958f98,0x7930ee40,
  111245. 0x751fdd74,0x56da2a90,0xf53e48c3,0xf1192834,0x8e53c343,0x34d2ac26 },
  111246. { 0x13111286,0x1073c218,0xda9d9827,0x201dac14,0xee95d378,0xec2c29db,
  111247. 0x1f3ee0b1,0x9316f119,0x544ce71c,0x7890c9f0,0x27612127,0xd77138af } },
  111248. /* 141 */
  111249. { { 0x3b4ad1cd,0x78045e6d,0x4aa49bc1,0xcd86b94e,0xfd677a16,0x57e51f1d,
  111250. 0xfa613697,0xd9290935,0x34f4d893,0x7a3f9593,0x5d5fcf9b,0x8c9c248b },
  111251. { 0x6f70d4e9,0x9f23a482,0x63190ae9,0x17273454,0x5b081a48,0x4bdd7c13,
  111252. 0x28d65271,0x1e2de389,0xe5841d1f,0x0bbaaa25,0x746772e5,0xc4c18a79 } },
  111253. /* 142 */
  111254. { { 0x593375ac,0x10ee2681,0x7dd5e113,0x4f3288be,0x240f3538,0x9a97b2fb,
  111255. 0x1de6b1e2,0xfa11089f,0x1351bc58,0x516da562,0x2dfa85b5,0x573b6119 },
  111256. { 0x6cba7df5,0x89e96683,0x8c28ab40,0xf299be15,0xad43fcbf,0xe91c9348,
  111257. 0x9a1cefb3,0xe9bbc7cc,0x738b2775,0xc8add876,0x775eaa01,0x6e3b1f2e } },
  111258. /* 143 */
  111259. { { 0xb677788b,0x0365a888,0x3fd6173c,0x634ae8c4,0x9e498dbe,0x30498761,
  111260. 0xc8f779ab,0x08c43e6d,0x4c09aca9,0x068ae384,0x2018d170,0x2380c70b },
  111261. { 0xa297c5ec,0xcf77fbc3,0xca457948,0xdacbc853,0x336bec7e,0x3690de04,
  111262. 0x14eec461,0x26bbac64,0x1f713abf,0xd1c23c7e,0xe6fd569e,0xf08bbfcd } },
  111263. /* 144 */
  111264. { { 0x84770ee3,0x5f8163f4,0x744a1706,0x0e0c7f94,0xe1b2d46d,0x9c8f05f7,
  111265. 0xd01fd99a,0x417eafe7,0x11440e5b,0x2ba15df5,0x91a6fbcf,0xdc5c552a },
  111266. { 0xa270f721,0x86271d74,0xa004485b,0x32c0a075,0x8defa075,0x9d1a87e3,
  111267. 0xbf0d20fe,0xb590a7ac,0x8feda1f5,0x430c41c2,0x58f6ec24,0x454d2879 } },
  111268. /* 145 */
  111269. { { 0x7c525435,0x52b7a635,0x37c4bdbc,0x3d9ef57f,0xdffcc475,0x2bb93e9e,
  111270. 0x7710f3be,0xf7b8ba98,0x21b727de,0x42ee86da,0x2e490d01,0x55ac3f19 },
  111271. { 0xc0c1c390,0x487e3a6e,0x446cde7b,0x036fb345,0x496ae951,0x089eb276,
  111272. 0x71ed1234,0xedfed4d9,0x900f0b46,0x661b0dd5,0x8582f0d3,0x11bd6f1b } },
  111273. /* 146 */
  111274. { { 0x076bc9d1,0x5cf9350f,0xcf3cd2c3,0x15d903be,0x25af031c,0x21cfc8c2,
  111275. 0x8b1cc657,0xe0ad3248,0x70014e87,0xdd9fb963,0x297f1658,0xf0f3a5a1 },
  111276. { 0xf1f703aa,0xbb908fba,0x2f6760ba,0x2f9cc420,0x66a38b51,0x00ceec66,
  111277. 0x05d645da,0x4deda330,0xf7de3394,0xb9cf5c72,0x1ad4c906,0xaeef6502 } },
  111278. /* 147 */
  111279. { { 0x7a19045d,0x0583c8b1,0xd052824c,0xae7c3102,0xff6cfa58,0x2a234979,
  111280. 0x62c733c0,0xfe9dffc9,0x9c0c4b09,0x3a7fa250,0x4fe21805,0x516437bb },
  111281. { 0xc2a23ddb,0x9454e3d5,0x289c104e,0x0726d887,0x4fd15243,0x8977d918,
  111282. 0x6d7790ba,0xc559e73f,0x465af85f,0x8fd3e87d,0x5feee46b,0xa2615c74 } },
  111283. /* 148 */
  111284. { { 0x4335167d,0xc8d607a8,0xe0f5c887,0x8b42d804,0x398d11f9,0x5f9f13df,
  111285. 0x20740c67,0x5aaa5087,0xa3d9234b,0x83da9a6a,0x2a54bad1,0xbd3a5c4e },
  111286. { 0x2db0f658,0xdd13914c,0x5a3f373a,0x29dcb66e,0x5245a72b,0xbfd62df5,
  111287. 0x91e40847,0x19d18023,0xb136b1ae,0xd9df74db,0x3f93bc5b,0x72a06b6b } },
  111288. /* 149 */
  111289. { { 0xad19d96f,0x6da19ec3,0xfb2a4099,0xb342daa4,0x662271ea,0x0e61633a,
  111290. 0xce8c054b,0x3bcece81,0x8bd62dc6,0x7cc8e061,0xee578d8b,0xae189e19 },
  111291. { 0xdced1eed,0x73e7a25d,0x7875d3ab,0xc1257f0a,0x1cfef026,0x2cb2d5a2,
  111292. 0xb1fdf61c,0xd98ef39b,0x24e83e6c,0xcd8e6f69,0xc7b7088b,0xd71e7076 } },
  111293. /* 150 */
  111294. { { 0x9d4245bf,0x33936830,0x2ac2953b,0x22d96217,0x56c3c3cd,0xb3bf5a82,
  111295. 0x0d0699e8,0x50c9be91,0x8f366459,0xec094463,0x513b7c35,0x6c056dba },
  111296. { 0x045ab0e3,0x687a6a83,0x445c9295,0x8d40b57f,0xa16f5954,0x0f345048,
  111297. 0x3d8f0a87,0x64b5c639,0x9f71c5e2,0x106353a2,0x874f0dd4,0xdd58b475 } },
  111298. /* 151 */
  111299. { { 0x62230c72,0x67ec084f,0x481385e3,0xf14f6cca,0x4cda7774,0xf58bb407,
  111300. 0xaa2dbb6b,0xe15011b1,0x0c035ab1,0xd488369d,0x8245f2fd,0xef83c24a },
  111301. { 0x9fdc2538,0xfb57328f,0x191fe46a,0x79808293,0x32ede548,0xe28f5c44,
  111302. 0xea1a022c,0x1b3cda99,0x3df2ec7f,0x39e639b7,0x760e9a18,0x77b6272b } },
  111303. /* 152 */
  111304. { { 0xa65d56d5,0x2b1d51bd,0x7ea696e0,0x3a9b71f9,0x9904f4c4,0x95250ecc,
  111305. 0xe75774b7,0x8bc4d6eb,0xeaeeb9aa,0x0e343f8a,0x930e04cb,0xc473c1d1 },
  111306. { 0x064cd8ae,0x282321b1,0x5562221c,0xf4b4371e,0xd1bf1221,0xc1cc81ec,
  111307. 0xe2c8082f,0xa52a07a9,0xba64a958,0x350d8e59,0x6fb32c9a,0x29e4f3de } },
  111308. /* 153 */
  111309. { { 0xba89aaa5,0x0aa9d56c,0xc4c6059e,0xf0208ac0,0xbd6ddca4,0x7400d9c6,
  111310. 0xf2c2f74a,0xb384e475,0xb1562dd3,0x4c1061fc,0x2e153b8d,0x3924e248 },
  111311. { 0x849808ab,0xf38b8d98,0xa491aa36,0x29bf3260,0x88220ede,0x85159ada,
  111312. 0xbe5bc422,0x8b47915b,0xd7300967,0xa934d72e,0x2e515d0d,0xc4f30398 } },
  111313. /* 154 */
  111314. { { 0x1b1de38b,0xe3e9ee42,0x42636760,0xa124e25a,0x90165b1a,0x90bf73c0,
  111315. 0x146434c5,0x21802a34,0x2e1fa109,0x54aa83f2,0xed9c51e9,0x1d4bd03c },
  111316. { 0x798751e6,0xc2d96a38,0x8c3507f5,0xed27235f,0xc8c24f88,0xb5fb80e2,
  111317. 0xd37f4f78,0xf873eefa,0xf224ba96,0x7229fd74,0x9edd7149,0x9dcd9199 } },
  111318. /* 155 */
  111319. { { 0x4e94f22a,0xee9f81a6,0xf71ec341,0xe5609892,0xa998284e,0x6c818ddd,
  111320. 0x3b54b098,0x9fd47295,0x0e8a7cc9,0x47a6ac03,0xb207a382,0xde684e5e },
  111321. { 0x2b6b956b,0x4bdd1ecd,0xf01b3583,0x09084414,0x55233b14,0xe2f80b32,
  111322. 0xef5ebc5e,0x5a0fec54,0xbf8b29a2,0x74cf25e6,0x7f29e014,0x1c757fa0 } },
  111323. /* 156 */
  111324. { { 0xeb0fdfe4,0x1bcb5c4a,0xf0899367,0xd7c649b3,0x05bc083b,0xaef68e3f,
  111325. 0xa78aa607,0x57a06e46,0x21223a44,0xa2136ecc,0x52f5a50b,0x89bd6484 },
  111326. { 0x4455f15a,0x724411b9,0x08a9c0fd,0x23dfa970,0x6db63bef,0x7b0da4d1,
  111327. 0xfb162443,0x6f8a7ec1,0xe98284fb,0xc1ac9cee,0x33566022,0x085a582b } },
  111328. /* 157 */
  111329. { { 0xec1f138a,0x15cb61f9,0x668f0c28,0x11c9a230,0xdf93f38f,0xac829729,
  111330. 0x4048848d,0xcef25698,0x2bba8fbf,0x3f686da0,0x111c619a,0xed5fea78 },
  111331. { 0xd6d1c833,0x9b4f73bc,0x86e7bf80,0x50951606,0x042b1d51,0xa2a73508,
  111332. 0x5fb89ec2,0x9ef6ea49,0x5ef8b892,0xf1008ce9,0x9ae8568b,0x78a7e684 } },
  111333. /* 158 */
  111334. { { 0x10470cd8,0x3fe83a7c,0xf86df000,0x92734682,0xda9409b5,0xb5dac06b,
  111335. 0x94939c5f,0x1e7a9660,0x5cc116dc,0xdec6c150,0x66bac8cc,0x1a52b408 },
  111336. { 0x6e864045,0x5303a365,0x9139efc1,0x45eae72a,0x6f31d54f,0x83bec646,
  111337. 0x6e958a6d,0x2fb4a86f,0x4ff44030,0x6760718e,0xe91ae0df,0x008117e3 } },
  111338. /* 159 */
  111339. { { 0x384310a2,0x5d5833ba,0x1fd6c9fc,0xbdfb4edc,0x849c4fb8,0xb9a4f102,
  111340. 0x581c1e1f,0xe5fb239a,0xd0a9746d,0xba44b2e7,0x3bd942b9,0x78f7b768 },
  111341. { 0xc87607ae,0x076c8ca1,0xd5caaa7e,0x82b23c2e,0x2763e461,0x6a581f39,
  111342. 0x3886df11,0xca8a5e4a,0x264e7f22,0xc87e90cf,0x215cfcfc,0x04f74870 } },
  111343. /* 160 */
  111344. { { 0x141d161c,0x5285d116,0x93c4ed17,0x67cd2e0e,0x7c36187e,0x12c62a64,
  111345. 0xed2584ca,0xf5329539,0x42fbbd69,0xc4c777c4,0x1bdfc50a,0x107de776 },
  111346. { 0xe96beebd,0x9976dcc5,0xa865a151,0xbe2aff95,0x9d8872af,0x0e0a9da1,
  111347. 0xa63c17cc,0x5e357a3d,0xe15cc67c,0xd31fdfd8,0x7970c6d8,0xc44bbefd } },
  111348. /* 161 */
  111349. { { 0x4c0c62f1,0x703f83e2,0x4e195572,0x9b1e28ee,0xfe26cced,0x6a82858b,
  111350. 0xc43638fa,0xd381c84b,0xa5ba43d8,0x94f72867,0x10b82743,0x3b4a783d },
  111351. { 0x7576451e,0xee1ad7b5,0x14b6b5c8,0xc3d0b597,0xfcacc1b8,0x3dc30954,
  111352. 0x472c9d7b,0x55df110e,0x02f8a328,0x97c86ed7,0x88dc098f,0xd0433413 } },
  111353. /* 162 */
  111354. { { 0x2ca8f2fe,0x1a60d152,0x491bd41f,0x61640948,0x58dfe035,0x6dae29a5,
  111355. 0x278e4863,0x9a615bea,0x9ad7c8e5,0xbbdb4477,0x2ceac2fc,0x1c706630 },
  111356. { 0x99699b4b,0x5e2b54c6,0x239e17e8,0xb509ca6d,0xea063a82,0x728165fe,
  111357. 0xb6a22e02,0x6b5e609d,0xb26ee1df,0x12813905,0x439491fa,0x07b9f722 } },
  111358. /* 163 */
  111359. { { 0x48ff4e49,0x1592ec14,0x6d644129,0x3e4e9f17,0x1156acc0,0x7acf8288,
  111360. 0xbb092b0b,0x5aa34ba8,0x7d38393d,0xcd0f9022,0xea4f8187,0x416724dd },
  111361. { 0xc0139e73,0x3c4e641c,0x91e4d87d,0xe0fe46cf,0xcab61f8a,0xedb3c792,
  111362. 0xd3868753,0x4cb46de4,0x20f1098a,0xe449c21d,0xf5b8ea6e,0x5e5fd059 } },
  111363. /* 164 */
  111364. { { 0x75856031,0x7fcadd46,0xeaf2fbd0,0x89c7a4cd,0x7a87c480,0x1af523ce,
  111365. 0x61d9ae90,0xe5fc1095,0xbcdb95f5,0x3fb5864f,0xbb5b2c7d,0xbeb5188e },
  111366. { 0x3ae65825,0x3d1563c3,0x0e57d641,0x116854c4,0x1942ebd3,0x11f73d34,
  111367. 0xc06955b3,0x24dc5904,0x995a0a62,0x8a0d4c83,0x5d577b7d,0xfb26b86d } },
  111368. /* 165 */
  111369. { { 0xc686ae17,0xc53108e7,0xd1c1da56,0x9090d739,0x9aec50ae,0x4583b013,
  111370. 0xa49a6ab2,0xdd9a088b,0xf382f850,0x28192eea,0xf5fe910e,0xcc8df756 },
  111371. { 0x9cab7630,0x877823a3,0xfb8e7fc1,0x64984a9a,0x364bfc16,0x5448ef9c,
  111372. 0xc44e2a9a,0xbbb4f871,0x435c95e9,0x901a41ab,0xaaa50a06,0xc6c23e5f } },
  111373. /* 166 */
  111374. { { 0x9034d8dd,0xb78016c1,0x0b13e79b,0x856bb44b,0xb3241a05,0x85c6409a,
  111375. 0x2d78ed21,0x8d2fe19a,0x726eddf2,0xdcc7c26d,0x25104f04,0x3ccaff5f },
  111376. { 0x6b21f843,0x397d7edc,0xe975de4c,0xda88e4dd,0x4f5ab69e,0x5273d396,
  111377. 0x9aae6cc0,0x537680e3,0x3e6f9461,0xf749cce5,0x957bffd3,0x021ddbd9 } },
  111378. /* 167 */
  111379. { { 0x777233cf,0x7b64585f,0x0942a6f0,0xfe6771f6,0xdfe6eef0,0x636aba7a,
  111380. 0x86038029,0x63bbeb56,0xde8fcf36,0xacee5842,0xd4a20524,0x48d9aa99 },
  111381. { 0x0da5e57a,0xcff7a74c,0xe549d6c9,0xc232593c,0xf0f2287b,0x68504bcc,
  111382. 0xbc8360b5,0x6d7d098d,0x5b402f41,0xeac5f149,0xb87d1bf1,0x61936f11 } },
  111383. /* 168 */
  111384. { { 0xb8153a9d,0xaa9da167,0x9e83ecf0,0xa49fe3ac,0x1b661384,0x14c18f8e,
  111385. 0x38434de1,0x61c24dab,0x283dae96,0x3d973c3a,0x82754fc9,0xc99baa01 },
  111386. { 0x4c26b1e3,0x477d198f,0xa7516202,0x12e8e186,0x362addfa,0x386e52f6,
  111387. 0xc3962853,0x31e8f695,0x6aaedb60,0xdec2af13,0x29cf74ac,0xfcfdb4c6 } },
  111388. /* 169 */
  111389. { { 0xcca40298,0x6b3ee958,0xf2f5d195,0xc3878153,0xed2eae5b,0x0c565630,
  111390. 0x3a697cf2,0xd089b37e,0xad5029ea,0xc2ed2ac7,0x0f0dda6a,0x7e5cdfad },
  111391. { 0xd9b86202,0xf98426df,0x4335e054,0xed1960b1,0x3f14639e,0x1fdb0246,
  111392. 0x0db6c670,0x17f709c3,0x773421e1,0xbfc687ae,0x26c1a8ac,0x13fefc4a } },
  111393. /* 170 */
  111394. { { 0x7ffa0a5f,0xe361a198,0xc63fe109,0xf4b26102,0x6c74e111,0x264acbc5,
  111395. 0x77abebaf,0x4af445fa,0x24cddb75,0x448c4fdd,0x44506eea,0x0b13157d },
  111396. { 0x72e9993d,0x22a6b159,0x85e5ecbe,0x2c3c57e4,0xfd83e1a1,0xa673560b,
  111397. 0xc3b8c83b,0x6be23f82,0x40bbe38e,0x40b13a96,0xad17399b,0x66eea033 } },
  111398. /* 171 */
  111399. { { 0xb4c6c693,0x49fc6e95,0x36af7d38,0xefc735de,0x35fe42fc,0xe053343d,
  111400. 0x6a9ab7c3,0xf0aa427c,0x4a0fcb24,0xc79f0436,0x93ebbc50,0x16287243 },
  111401. { 0x16927e1e,0x5c3d6bd0,0x673b984c,0x40158ed2,0x4cd48b9a,0xa7f86fc8,
  111402. 0x60ea282d,0x1643eda6,0xe2a1beed,0x45b393ea,0x19571a94,0x664c839e } },
  111403. /* 172 */
  111404. { { 0x27eeaf94,0x57745750,0xea99e1e7,0x2875c925,0x5086adea,0xc127e7ba,
  111405. 0x86fe424f,0x765252a0,0x2b6c0281,0x1143cc6c,0xd671312d,0xc9bb2989 },
  111406. { 0x51acb0a5,0x880c337c,0xd3c60f78,0xa3710915,0x9262b6ed,0x496113c0,
  111407. 0x9ce48182,0x5d25d9f8,0xb3813586,0x53b6ad72,0x4c0e159c,0x0ea3bebc } },
  111408. /* 173 */
  111409. { { 0xc5e49bea,0xcaba450a,0x7c05da59,0x684e5415,0xde7ac36c,0xa2e9cab9,
  111410. 0x2e6f957b,0x4ca79b5f,0x09b817b1,0xef7b0247,0x7d89df0f,0xeb304990 },
  111411. { 0x46fe5096,0x508f7307,0x2e04eaaf,0x695810e8,0x3512f76c,0x88ef1bd9,
  111412. 0x3ebca06b,0x77661351,0xccf158b7,0xf7d4863a,0x94ee57da,0xb2a81e44 } },
  111413. /* 174 */
  111414. { { 0x6d53e6ba,0xff288e5b,0x14484ea2,0xa90de1a9,0xed33c8ec,0x2fadb60c,
  111415. 0x28b66a40,0x579d6ef3,0xec24372d,0x4f2dd6dd,0x1d66ec7d,0xe9e33fc9 },
  111416. { 0x039eab6e,0x110899d2,0x3e97bb5e,0xa31a667a,0xcfdce68e,0x6200166d,
  111417. 0x5137d54b,0xbe83ebae,0x4800acdf,0x085f7d87,0x0c6f8c86,0xcf4ab133 } },
  111418. /* 175 */
  111419. { { 0x931e08fb,0x03f65845,0x1506e2c0,0x6438551e,0x9c36961f,0x5791f0dc,
  111420. 0xe3dcc916,0x68107b29,0xf495d2ca,0x83242374,0x6ee5895b,0xd8cfb663 },
  111421. { 0xa0349b1b,0x525e0f16,0x4a0fab86,0x33cd2c6c,0x2af8dda9,0x46c12ee8,
  111422. 0x71e97ad3,0x7cc424ba,0x37621eb0,0x69766ddf,0xa5f0d390,0x95565f56 } },
  111423. /* 176 */
  111424. { { 0x1a0f5e94,0xe0e7bbf2,0x1d82d327,0xf771e115,0xceb111fa,0x10033e3d,
  111425. 0xd3426638,0xd269744d,0x00d01ef6,0xbdf2d9da,0xa049ceaf,0x1cb80c71 },
  111426. { 0x9e21c677,0x17f18328,0x19c8f98b,0x6452af05,0x80b67997,0x35b9c5f7,
  111427. 0x40f8f3d4,0x5c2e1cbe,0x66d667ca,0x43f91656,0xcf9d6e79,0x9faaa059 } },
  111428. /* 177 */
  111429. { { 0x0a078fe6,0x8ad24618,0x464fd1dd,0xf6cc73e6,0xc3e37448,0x4d2ce34d,
  111430. 0xe3271b5f,0x624950c5,0xefc5af72,0x62910f5e,0xaa132bc6,0x8b585bf8 },
  111431. { 0xa839327f,0x11723985,0x4aac252f,0x34e2d27d,0x6296cc4e,0x402f59ef,
  111432. 0x47053de9,0x00ae055c,0x28b4f09b,0xfc22a972,0xfa0c180e,0xa9e86264 } },
  111433. /* 178 */
  111434. { { 0xbc310ecc,0x0b7b6224,0x67fa14ed,0x8a1a74f1,0x7214395c,0x87dd0960,
  111435. 0xf5c91128,0xdf1b3d09,0x86b264a8,0x39ff23c6,0x3e58d4c5,0xdc2d49d0 },
  111436. { 0xa9d6f501,0x2152b7d3,0xc04094f7,0xf4c32e24,0xd938990f,0xc6366596,
  111437. 0x94fb207f,0x084d078f,0x328594cb,0xfd99f1d7,0xcb2d96b3,0x36defa64 } },
  111438. /* 179 */
  111439. { { 0x13ed7cbe,0x4619b781,0x9784bd0e,0x95e50015,0x2c7705fe,0x2a32251c,
  111440. 0x5f0dd083,0xa376af99,0x0361a45b,0x55425c6c,0x1f291e7b,0x812d2cef },
  111441. { 0x5fd94972,0xccf581a0,0xe56dc383,0x26e20e39,0x63dbfbf0,0x0093685d,
  111442. 0x36b8c575,0x1fc164cc,0x390ef5e7,0xb9c5ab81,0x26908c66,0x40086beb } },
  111443. /* 180 */
  111444. { { 0x37e3c115,0xe5e54f79,0xc1445a8a,0x69b8ee8c,0xb7659709,0x79aedff2,
  111445. 0x1b46fbe6,0xe288e163,0xd18d7bb7,0xdb4844f0,0x48aa6424,0xe0ea23d0 },
  111446. { 0xf3d80a73,0x714c0e4e,0x3bd64f98,0x87a0aa9e,0x2ec63080,0x8844b8a8,
  111447. 0x255d81a3,0xe0ac9c30,0x455397fc,0x86151237,0x2f820155,0x0b979464 } },
  111448. /* 181 */
  111449. { { 0x4ae03080,0x127a255a,0x580a89fb,0x232306b4,0x6416f539,0x04e8cd6a,
  111450. 0x13b02a0e,0xaeb70dee,0x4c09684a,0xa3038cf8,0x28e433ee,0xa710ec3c },
  111451. { 0x681b1f7d,0x77a72567,0x2fc28170,0x86fbce95,0xf5735ac8,0xd3408683,
  111452. 0x6bd68e93,0x3a324e2a,0xc027d155,0x7ec74353,0xd4427177,0xab60354c } },
  111453. /* 182 */
  111454. { { 0xef4c209d,0x32a5342a,0x08d62704,0x2ba75274,0xc825d5fe,0x4bb4af6f,
  111455. 0xd28e7ff1,0x1c3919ce,0xde0340f6,0x1dfc2fdc,0x29f33ba9,0xc6580baf },
  111456. { 0x41d442cb,0xae121e75,0x3a4724e4,0x4c7727fd,0x524f3474,0xe556d6a4,
  111457. 0x785642a2,0x87e13cc7,0xa17845fd,0x182efbb1,0x4e144857,0xdcec0cf1 } },
  111458. /* 183 */
  111459. { { 0xe9539819,0x1cb89541,0x9d94dbf1,0xc8cb3b4f,0x417da578,0x1d353f63,
  111460. 0x8053a09e,0xb7a697fb,0xc35d8b78,0x8d841731,0xb656a7a9,0x85748d6f },
  111461. { 0xc1859c5d,0x1fd03947,0x535d22a2,0x6ce965c1,0x0ca3aadc,0x1966a13e,
  111462. 0x4fb14eff,0x9802e41d,0x76dd3fcd,0xa9048cbb,0xe9455bba,0x89b182b5 } },
  111463. /* 184 */
  111464. { { 0x43360710,0xd777ad6a,0x55e9936b,0x841287ef,0x04a21b24,0xbaf5c670,
  111465. 0x35ad86f1,0xf2c0725f,0xc707e72e,0x338fa650,0xd8883e52,0x2bf8ed2e },
  111466. { 0xb56e0d6a,0xb0212cf4,0x6843290c,0x50537e12,0x98b3dc6f,0xd8b184a1,
  111467. 0x0210b722,0xd2be9a35,0x559781ee,0x407406db,0x0bc18534,0x5a78d591 } },
  111468. /* 185 */
  111469. { { 0xd748b02c,0x4d57aa2a,0xa12b3b95,0xbe5b3451,0x64711258,0xadca7a45,
  111470. 0x322153db,0x597e091a,0x32eb1eab,0xf3271006,0x2873f301,0xbd9adcba },
  111471. { 0x38543f7f,0xd1dc79d1,0x921b1fef,0x00022092,0x1e5df8ed,0x86db3ef5,
  111472. 0x9e6b944a,0x888cae04,0x791a32b4,0x71bd29ec,0xa6d1c13e,0xd3516206 } },
  111473. /* 186 */
  111474. { { 0x55924f43,0x2ef6b952,0x4f9de8d5,0xd2f401ae,0xadc68042,0xfc73e8d7,
  111475. 0x0d9d1bb4,0x627ea70c,0xbbf35679,0xc3bb3e3e,0xd882dee4,0x7e8a254a },
  111476. { 0xb5924407,0x08906f50,0xa1ad444a,0xf14a0e61,0x65f3738e,0xaa0efa21,
  111477. 0xae71f161,0xd60c7dd6,0xf175894d,0x9e8390fa,0x149f4c00,0xd115cd20 } },
  111478. /* 187 */
  111479. { { 0xa52abf77,0x2f2e2c1d,0x54232568,0xc2a0dca5,0x54966dcc,0xed423ea2,
  111480. 0xcd0dd039,0xe48c93c7,0x176405c7,0x1e54a225,0x70d58f2e,0x1efb5b16 },
  111481. { 0x94fb1471,0xa751f9d9,0x67d2941d,0xfdb31e1f,0x53733698,0xa6c74eb2,
  111482. 0x89a0f64a,0xd3155d11,0xa4b8d2b6,0x4414cfe4,0xf7a8e9e3,0x8d5a4be8 } },
  111483. /* 188 */
  111484. { { 0x52669e98,0x5c96b4d4,0x8fd42a03,0x4547f922,0xd285174e,0xcf5c1319,
  111485. 0x064bffa0,0x805cd1ae,0x246d27e7,0x50e8bc4f,0xd5781e11,0xf89ef98f },
  111486. { 0xdee0b63f,0xb4ff95f6,0x222663a4,0xad850047,0x4d23ce9c,0x02691860,
  111487. 0x50019f59,0x3e5309ce,0x69a508ae,0x27e6f722,0x267ba52c,0xe9376652 } },
  111488. /* 189 */
  111489. { { 0xc0368708,0xa04d289c,0x5e306e1d,0xc458872f,0x33112fea,0x76fa23de,
  111490. 0x6efde42e,0x718e3974,0x1d206091,0xf0c98cdc,0x14a71987,0x5fa3ca62 },
  111491. { 0xdcaa9f2a,0xeee8188b,0x589a860d,0x312cc732,0xc63aeb1f,0xf9808dd6,
  111492. 0x4ea62b53,0x70fd43db,0x890b6e97,0x2c2bfe34,0xfa426aa6,0x105f863c } },
  111493. /* 190 */
  111494. { { 0xb38059ad,0x0b29795d,0x90647ea0,0x5686b77e,0xdb473a3e,0xeff0470e,
  111495. 0xf9b6d1e2,0x278d2340,0xbd594ec7,0xebbff95b,0xd3a7f23d,0xf4b72334 },
  111496. { 0xa5a83f0b,0x2a285980,0x9716a8b3,0x0786c41a,0x22511812,0x138901bd,
  111497. 0xe2fede6e,0xd1b55221,0xdf4eb590,0x0806e264,0x762e462e,0x6c4c897e } },
  111498. /* 191 */
  111499. { { 0xb4b41d9d,0xd10b905f,0x4523a65b,0x826ca466,0xb699fa37,0x535bbd13,
  111500. 0x73bc8f90,0x5b9933d7,0xcd2118ad,0x9332d61f,0xd4a65fd0,0x158c693e },
  111501. { 0xe6806e63,0x4ddfb2a8,0xb5de651b,0xe31ed3ec,0x819bc69a,0xf9460e51,
  111502. 0x2c76b1f8,0x6229c0d6,0x901970a3,0xbb78f231,0x9cee72b8,0x31f3820f } },
  111503. /* 192 */
  111504. { { 0xc09e1c72,0xe931caf2,0x12990cf4,0x0715f298,0x943262d8,0x33aad81d,
  111505. 0x73048d3f,0x5d292b7a,0xdc7415f6,0xb152aaa4,0x0fd19587,0xc3d10fd9 },
  111506. { 0x75ddadd0,0xf76b35c5,0x1e7b694c,0x9f5f4a51,0xc0663025,0x2f1ab7eb,
  111507. 0x920260b0,0x01c9cc87,0x05d39da6,0xc4b1f61a,0xeb4a9c4e,0x6dcd76c4 } },
  111508. /* 193 */
  111509. { { 0xfdc83f01,0x0ba0916f,0x9553e4f9,0x354c8b44,0xffc5e622,0xa6cc511a,
  111510. 0xe95be787,0xb954726a,0x75b41a62,0xcb048115,0xebfde989,0xfa2ae6cd },
  111511. { 0x0f24659a,0x6376bbc7,0x4c289c43,0x13a999fd,0xec9abd8b,0xc7134184,
  111512. 0xa789ab04,0x28c02bf6,0xd3e526ec,0xff841ebc,0x640893a8,0x442b191e } },
  111513. /* 194 */
  111514. { { 0xfa2b6e20,0x4cac6c62,0xf6d69861,0x97f29e9b,0xbc96d12d,0x228ab1db,
  111515. 0x5e8e108d,0x6eb91327,0x40771245,0xd4b3d4d1,0xca8a803a,0x61b20623 },
  111516. { 0xa6a560b1,0x2c2f3b41,0x3859fcf4,0x879e1d40,0x024dbfc3,0x7cdb5145,
  111517. 0x3bfa5315,0x55d08f15,0xaa93823a,0x2f57d773,0xc6a2c9a2,0xa97f259c } },
  111518. /* 195 */
  111519. { { 0xe58edbbb,0xc306317b,0x79dfdf13,0x25ade51c,0x16d83dd6,0x6b5beaf1,
  111520. 0x1dd8f925,0xe8038a44,0xb2a87b6b,0x7f00143c,0xf5b438de,0xa885d00d },
  111521. { 0xcf9e48bd,0xe9f76790,0xa5162768,0xf0bdf9f0,0xad7b57cb,0x0436709f,
  111522. 0xf7c15db7,0x7e151c12,0x5d90ee3b,0x3514f022,0x2c361a8d,0x2e84e803 } },
  111523. /* 196 */
  111524. { { 0x563ec8d8,0x2277607d,0xe3934cb7,0xa661811f,0xf58fd5de,0x3ca72e7a,
  111525. 0x62294c6a,0x7989da04,0xf6bbefe9,0x88b3708b,0x53ed7c82,0x0d524cf7 },
  111526. { 0x2f30c073,0x69f699ca,0x9dc1dcf3,0xf0fa264b,0x05f0aaf6,0x44ca4568,
  111527. 0xd19b9baf,0x0f5b23c7,0xeabd1107,0x39193f41,0x2a7c9b83,0x9e3e10ad } },
  111528. /* 197 */
  111529. { { 0xd4ae972f,0xa90824f0,0xc6e846e7,0x43eef02b,0x29d2160a,0x7e460612,
  111530. 0xfe604e91,0x29a178ac,0x4eb184b2,0x23056f04,0xeb54cdf4,0x4fcad55f },
  111531. { 0xae728d15,0xa0ff96f3,0xc6a00331,0x8a2680c6,0x7ee52556,0x5f84cae0,
  111532. 0xc5a65dad,0x5e462c3a,0xe2d23f4f,0x5d2b81df,0xc5b1eb07,0x6e47301b } },
  111533. /* 198 */
  111534. { { 0xaf8219b9,0x77411d68,0x51b1907a,0xcb883ce6,0x101383b5,0x25c87e57,
  111535. 0x982f970d,0x9c7d9859,0x118305d2,0xaa6abca5,0x9013a5db,0x725fed2f },
  111536. { 0xababd109,0x487cdbaf,0x87586528,0xc0f8cf56,0x8ad58254,0xa02591e6,
  111537. 0xdebbd526,0xc071b1d1,0x961e7e31,0x927dfe8b,0x9263dfe1,0x55f895f9 } },
  111538. /* 199 */
  111539. { { 0xb175645b,0xf899b00d,0xb65b4b92,0x51f3a627,0xb67399ef,0xa2f3ac8d,
  111540. 0xe400bc20,0xe717867f,0x1967b952,0x42cc9020,0x3ecd1de1,0x3d596751 },
  111541. { 0xdb979775,0xd41ebcde,0x6a2e7e88,0x99ba61bc,0x321504f2,0x039149a5,
  111542. 0x27ba2fad,0xe7dc2314,0xb57d8368,0x9f556308,0x57da80a7,0x2b6d16c9 } },
  111543. /* 200 */
  111544. { { 0x279ad982,0x84af5e76,0x9c8b81a6,0x9bb4c92d,0x0e698e67,0xd79ad44e,
  111545. 0x265fc167,0xe8be9048,0x0c3a4ccc,0xf135f7e6,0xb8863a33,0xa0a10d38 },
  111546. { 0xd386efd9,0xe197247c,0xb52346c2,0x0eefd3f9,0x78607bc8,0xc22415f9,
  111547. 0x508674ce,0xa2a8f862,0xc8c9d607,0xa72ad09e,0x50fa764f,0xcd9f0ede } },
  111548. /* 201 */
  111549. { { 0xd1a46d4d,0x063391c7,0x9eb01693,0x2df51c11,0x849e83de,0xc5849800,
  111550. 0x8ad08382,0x48fd09aa,0xaa742736,0xa405d873,0xe1f9600c,0xee49e61e },
  111551. { 0x48c76f73,0xd76676be,0x01274b2a,0xd9c100f6,0x83f8718d,0x110bb67c,
  111552. 0x02fc0d73,0xec85a420,0x744656ad,0xc0449e1e,0x37d9939b,0x28ce7376 } },
  111553. /* 202 */
  111554. { { 0x44544ac7,0x97e9af72,0xba010426,0xf2c658d5,0xfb3adfbd,0x732dec39,
  111555. 0xa2df0b07,0xd12faf91,0x2171e208,0x8ac26725,0x5b24fa54,0xf820cdc8 },
  111556. { 0x94f4cf77,0x307a6eea,0x944a33c6,0x18c783d2,0x0b741ac5,0x4b939d4c,
  111557. 0x3ffbb6e4,0x1d7acd15,0x7a255e44,0x06a24858,0xce336d50,0x14fbc494 } },
  111558. /* 203 */
  111559. { { 0x51584e3c,0x9b920c0c,0xf7e54027,0xc7733c59,0x88422bbe,0xe24ce139,
  111560. 0x523bd6ab,0x11ada812,0xb88e6def,0xde068800,0xfe8c582d,0x7b872671 },
  111561. { 0x7de53510,0x4e746f28,0xf7971968,0x492f8b99,0x7d928ac2,0x1ec80bc7,
  111562. 0x432eb1b5,0xb3913e48,0x32028f6e,0xad084866,0x8fc2f38b,0x122bb835 } },
  111563. /* 204 */
  111564. { { 0x3b0b29c3,0x0a9f3b1e,0x4fa44151,0x837b6432,0x17b28ea7,0xb9905c92,
  111565. 0x98451750,0xf39bc937,0xce8b6da1,0xcd383c24,0x010620b2,0x299f57db },
  111566. { 0x58afdce3,0x7b6ac396,0x3d05ef47,0xa15206b3,0xb9bb02ff,0xa0ae37e2,
  111567. 0x9db3964c,0x107760ab,0x67954bea,0xe29de9a0,0x431c3f82,0x446a1ad8 } },
  111568. /* 205 */
  111569. { { 0x5c6b8195,0xc6fecea0,0xf49e71b9,0xd744a7c5,0x177a7ae7,0xa8e96acc,
  111570. 0x358773a7,0x1a05746c,0x37567369,0xa4162146,0x87d1c971,0xaa0217f7 },
  111571. { 0x77fd3226,0x61e9d158,0xe4f600be,0x0f6f2304,0x7a6dff07,0xa9c4cebc,
  111572. 0x09f12a24,0xd15afa01,0x8c863ee9,0x2bbadb22,0xe5eb8c78,0xa28290e4 } },
  111573. /* 206 */
  111574. { { 0x3e9de330,0x55b87fa0,0x195c145b,0x12b26066,0xa920bef0,0xe08536e0,
  111575. 0x4d195adc,0x7bff6f2c,0x945f4187,0x7f319e9d,0xf892ce47,0xf9848863 },
  111576. { 0x4fe37657,0xd0efc1d3,0x5cf0e45a,0x3c58de82,0x8b0ccbbe,0x626ad21a,
  111577. 0xaf952fc5,0xd2a31208,0xeb437357,0x81791995,0x98e95d4f,0x5f19d30f } },
  111578. /* 207 */
  111579. { { 0x0e6865bb,0x72e83d9a,0xf63456a6,0x22f5af3b,0x463c8d9e,0x409e9c73,
  111580. 0xdfe6970e,0x40e9e578,0x711b91ca,0x876b6efa,0x942625a3,0x895512cf },
  111581. { 0xcb4e462b,0x84c8eda8,0x4412e7c8,0x84c0154a,0xceb7b71f,0x04325db1,
  111582. 0x66f70877,0x1537dde3,0x1992b9ac,0xf3a09399,0xd498ae77,0xa7316606 } },
  111583. /* 208 */
  111584. { { 0xcad260f5,0x13990d2f,0xeec0e8c0,0x76c3be29,0x0f7bd7d5,0x7dc5bee0,
  111585. 0xefebda4b,0x9be167d2,0x9122b87e,0xcce3dde6,0x82b5415c,0x75a28b09 },
  111586. { 0xe84607a6,0xf6810bcd,0x6f4dbf0d,0xc6d58128,0x1b4dafeb,0xfead577d,
  111587. 0x066b28eb,0x9bc440b2,0x8b17e84b,0x53f1da97,0xcda9a575,0x0459504b } },
  111588. /* 209 */
  111589. { { 0x329e5836,0x13e39a02,0xf717269d,0x2c9e7d51,0xf26c963b,0xc5ac58d6,
  111590. 0x79967bf5,0x3b0c6c43,0x55908d9d,0x60bbea3f,0xf07c9ad1,0xd84811e7 },
  111591. { 0x5bd20e4a,0xfe7609a7,0x0a70baa8,0xe4325dd2,0xb3600386,0x3711f370,
  111592. 0xd0924302,0x97f9562f,0x4acc4436,0x040dc0c3,0xde79cdd4,0xfd6d725c } },
  111593. /* 210 */
  111594. { { 0xcf13eafb,0xb3efd0e3,0x5aa0ae5f,0x21009cbb,0x79022279,0xe480c553,
  111595. 0xb2fc9a6d,0x755cf334,0x07096ae7,0x8564a5bf,0xbd238139,0xddd649d0 },
  111596. { 0x8a045041,0xd0de10b1,0xc957d572,0x6e05b413,0x4e0fb25c,0x5c5ff806,
  111597. 0x641162fb,0xd933179b,0xe57439f9,0x42d48485,0x8a8d72aa,0x70c5bd0a } },
  111598. /* 211 */
  111599. { { 0x97bdf646,0xa7671738,0xab329f7c,0xaa1485b4,0xf8f25fdf,0xce3e11d6,
  111600. 0xc6221824,0x76a3fc7e,0xf3924740,0x045f281f,0x96d13a9a,0x24557d4e },
  111601. { 0xdd4c27cd,0x875c804b,0x0f5c7fea,0x11c5f0f4,0xdc55ff7e,0xac8c880b,
  111602. 0x1103f101,0x2acddec5,0xf99faa89,0x38341a21,0xce9d6b57,0xc7b67a2c } },
  111603. /* 212 */
  111604. { { 0x8e357586,0x9a0d724f,0xdf648da0,0x1d7f4ff5,0xfdee62a5,0x9c3e6c9b,
  111605. 0x0389b372,0x0499cef0,0x98eab879,0xe904050d,0x6c051617,0xe8eef1b6 },
  111606. { 0xc37e3ca9,0xebf5bfeb,0xa4e0b91d,0x7c5e946d,0x2c4bea28,0x79097314,
  111607. 0xee67b2b7,0x81f6c109,0xdafc5ede,0xaf237d9b,0x2abb04c7,0xd2e60201 } },
  111608. /* 213 */
  111609. { { 0x8a4f57bf,0x6156060c,0xff11182a,0xf9758696,0x6296ef00,0x8336773c,
  111610. 0xff666899,0x9c054bce,0x719cd11c,0xd6a11611,0xdbe1acfa,0x9824a641 },
  111611. { 0xba89fd01,0x0b7b7a5f,0x889f79d8,0xf8d3b809,0xf578285c,0xc5e1ea08,
  111612. 0xae6d8288,0x7ac74536,0x7521ef5f,0x5d37a200,0xb260a25d,0x5ecc4184 } },
  111613. /* 214 */
  111614. { { 0xa708c8d3,0xddcebb19,0xc63f81ec,0xe63ed04f,0x11873f95,0xd045f5a0,
  111615. 0x79f276d5,0x3b5ad544,0x425ae5b3,0x81272a3d,0x10ce1605,0x8bfeb501 },
  111616. { 0x888228bf,0x4233809c,0xb2aff7df,0x4bd82acf,0x0cbd4a7f,0x9c68f180,
  111617. 0x6b44323d,0xfcd77124,0x891db957,0x60c0fcf6,0x04da8f7f,0xcfbb4d89 } },
  111618. /* 215 */
  111619. { { 0x3b26139a,0x9a6a5df9,0xb2cc7eb8,0x3e076a83,0x5a964bcd,0x47a8e82d,
  111620. 0xb9278d6b,0x8a4e2a39,0xe4443549,0x93506c98,0xf1e0d566,0x06497a8f },
  111621. { 0x2b1efa05,0x3dee8d99,0x45393e33,0x2da63ca8,0xcf0579ad,0xa4af7277,
  111622. 0x3236d8ea,0xaf4b4639,0x32b617f5,0x6ccad95b,0xb88bb124,0xce76d8b8 } },
  111623. /* 216 */
  111624. { { 0x083843dc,0x63d2537a,0x1e4153b4,0x89eb3514,0xea9afc94,0x5175ebc4,
  111625. 0x8ed1aed7,0x7a652580,0xd85e8297,0x67295611,0xb584b73d,0x8dd2d68b },
  111626. { 0x0133c3a4,0x237139e6,0x4bd278ea,0x9de838ab,0xc062fcd9,0xe829b072,
  111627. 0x63ba8706,0x70730d4f,0xd3cd05ec,0x6080483f,0x0c85f84d,0x872ab5b8 } },
  111628. /* 217 */
  111629. { { 0x999d4d49,0xfc0776d3,0xec3f45e7,0xa3eb59de,0x0dae1fc1,0xbc990e44,
  111630. 0xa15371ff,0x33596b1e,0x9bc7ab25,0xd447dcb2,0x35979582,0xcd5b63e9 },
  111631. { 0x77d1ff11,0xae3366fa,0xedee6903,0x59f28f05,0xa4433bf2,0x6f43fed1,
  111632. 0xdf9ce00e,0x15409c9b,0xaca9c5dc,0x21b5cded,0x82d7bdb4,0xf9f33595 } },
  111633. /* 218 */
  111634. { { 0x9422c792,0x95944378,0xc958b8bf,0x239ea923,0xdf076541,0x4b61a247,
  111635. 0xbb9fc544,0x4d29ce85,0x0b424559,0x9a692a67,0x0e486900,0x6e0ca5a0 },
  111636. { 0x85b3bece,0x6b79a782,0xc61f9892,0x41f35e39,0xae747f82,0xff82099a,
  111637. 0xd0ca59d6,0x58c8ae3f,0x99406b5f,0x4ac930e2,0x9df24243,0x2ce04eb9 } },
  111638. /* 219 */
  111639. { { 0x1ac37b82,0x4366b994,0x25b04d83,0xff0c728d,0x19c47b7c,0x1f551361,
  111640. 0xbeff13e7,0xdbf2d5ed,0xe12a683d,0xf78efd51,0x989cf9c4,0x82cd85b9 },
  111641. { 0xe0cb5d37,0xe23c6db6,0x72ee1a15,0x818aeebd,0x28771b14,0x8212aafd,
  111642. 0x1def817d,0x7bc221d9,0x9445c51f,0xdac403a2,0x12c3746b,0x711b0517 } },
  111643. /* 220 */
  111644. { { 0x5ea99ecc,0x0ed9ed48,0xb8cab5e1,0xf799500d,0xb570cbdc,0xa8ec87dc,
  111645. 0xd35dfaec,0x52cfb2c2,0x6e4d80a4,0x8d31fae2,0xdcdeabe5,0xe6a37dc9 },
  111646. { 0x1deca452,0x5d365a34,0x0d68b44e,0x09a5f8a5,0xa60744b1,0x59238ea5,
  111647. 0xbb4249e9,0xf2fedc0d,0xa909b2e3,0xe395c74e,0x39388250,0xe156d1a5 } },
  111648. /* 221 */
  111649. { { 0x47181ae9,0xd796b3d0,0x44197808,0xbaf44ba8,0x34cf3fac,0xe6933094,
  111650. 0xc3bd5c46,0x41aa6ade,0xeed947c6,0x4fda75d8,0x9ea5a525,0xacd9d412 },
  111651. { 0xd430301b,0x65cc55a3,0x7b52ea49,0x3c9a5bcf,0x159507f0,0x22d319cf,
  111652. 0xde74a8dd,0x2ee0b9b5,0x877ac2b6,0x20c26a1e,0x92e7c314,0x387d73da } },
  111653. /* 222 */
  111654. { { 0x8cd3fdac,0x13c4833e,0x332e5b8e,0x76fcd473,0xe2fe1fd3,0xff671b4b,
  111655. 0x5d98d8ec,0x4d734e8b,0x514bbc11,0xb1ead3c6,0x7b390494,0xd14ca858 },
  111656. { 0x5d2d37e9,0x95a443af,0x00464622,0x73c6ea73,0x15755044,0xa44aeb4b,
  111657. 0xfab58fee,0xba3f8575,0xdc680a6f,0x9779dbc9,0x7b37ddfc,0xe1ee5f5a } },
  111658. /* 223 */
  111659. { { 0x12d29f46,0xcd0b4648,0x0ed53137,0x93295b0b,0x80bef6c9,0xbfe26094,
  111660. 0x54248b00,0xa6565788,0x80e7f9c4,0x69c43fca,0xbe141ea1,0x2190837b },
  111661. { 0xa1b26cfb,0x875e159a,0x7affe852,0x90ca9f87,0x92ca598e,0x15e6550d,
  111662. 0x1938ad11,0xe3e0945d,0x366ef937,0xef7636bb,0xb39869e5,0xb6034d0b } },
  111663. /* 224 */
  111664. { { 0x26d8356e,0x4d255e30,0xd314626f,0xf83666ed,0xd0c8ed64,0x421ddf61,
  111665. 0x26677b61,0x96e473c5,0x9e9b18b3,0xdad4af7e,0xa9393f75,0xfceffd4a },
  111666. { 0x11c731d5,0x843138a1,0xb2f141d9,0x05bcb3a1,0x617b7671,0x20e1fa95,
  111667. 0x88ccec7b,0xbefce812,0x90f1b568,0x582073dc,0x1f055cb7,0xf572261a } },
  111668. /* 225 */
  111669. { { 0x36973088,0xf3148277,0x86a9f980,0xc008e708,0xe046c261,0x1b795947,
  111670. 0xca76bca0,0xdf1e6a7d,0x71acddf0,0xabafd886,0x1364d8f4,0xff7054d9 },
  111671. { 0xe2260594,0x2cf63547,0xd73b277e,0x468a5372,0xef9bd35e,0xc7419e24,
  111672. 0x24043cc3,0x2b4a1c20,0x890b39cd,0xa28f047a,0x46f9a2e3,0xdca2cea1 } },
  111673. /* 226 */
  111674. { { 0x53277538,0xab788736,0xcf697738,0xa734e225,0x6b22e2c1,0x66ee1d1e,
  111675. 0xebe1d212,0x2c615389,0x02bb0766,0xf36cad40,0x3e64f207,0x120885c3 },
  111676. { 0x90fbfec2,0x59e77d56,0xd7a574ae,0xf9e781aa,0x5d045e53,0x801410b0,
  111677. 0xa91b5f0e,0xd3b5f0aa,0x7fbb3521,0xb3d1df00,0xc72bee9a,0x11c4b33e } },
  111678. /* 227 */
  111679. { { 0x83c3a7f3,0xd32b9832,0x88d8a354,0x8083abcf,0x50f4ec5a,0xdeb16404,
  111680. 0x641e2907,0x18d747f0,0xf1bbf03e,0x4e8978ae,0x88a0cd89,0x932447dc },
  111681. { 0xcf3d5897,0x561e0feb,0x13600e6d,0xfc3a682f,0xd16a6b73,0xc78b9d73,
  111682. 0xd29bf580,0xe713fede,0x08d69e5c,0x0a225223,0x1ff7fda4,0x3a924a57 } },
  111683. /* 228 */
  111684. { { 0xb4093bee,0xfb64554c,0xa58c6ec0,0xa6d65a25,0x43d0ed37,0x4126994d,
  111685. 0x55152d44,0xa5689a51,0x284caa8d,0xb8e5ea8c,0xd1f25538,0x33f05d4f },
  111686. { 0x1b615d6e,0xe0fdfe09,0x705507da,0x2ded7e8f,0x17bbcc80,0xdd5631e5,
  111687. 0x267fd11f,0x4f87453e,0xff89d62d,0xc6da723f,0xe3cda21d,0x55cbcae2 } },
  111688. /* 229 */
  111689. { { 0x6b4e84f3,0x336bc94e,0x4ef72c35,0x72863031,0xeeb57f99,0x6d85fdee,
  111690. 0xa42ece1b,0x7f4e3272,0x36f0320a,0x7f86cbb5,0x923331e6,0xf09b6a2b },
  111691. { 0x56778435,0x21d3ecf1,0x8323b2d2,0x2977ba99,0x1704bc0f,0x6a1b57fb,
  111692. 0x389f048a,0xd777cf8b,0xac6b42cd,0x9ce2174f,0x09e6c55a,0x404e2bff } },
  111693. /* 230 */
  111694. { { 0x204c5ddb,0x9b9b135e,0x3eff550e,0x9dbfe044,0xec3be0f6,0x35eab4bf,
  111695. 0x0a43e56f,0x8b4c3f0d,0x0e73f9b3,0x4c1c6673,0x2c78c905,0x92ed38bd },
  111696. { 0xa386e27c,0xc7003f6a,0xaced8507,0xb9c4f46f,0x59df5464,0xea024ec8,
  111697. 0x429572ea,0x4af96152,0xe1fc1194,0x279cd5e2,0x281e358c,0xaa376a03 } },
  111698. /* 231 */
  111699. { { 0x3cdbc95c,0x07859223,0xef2e337a,0xaae1aa6a,0x472a8544,0xc040108d,
  111700. 0x8d037b7d,0x80c853e6,0x8c7eee24,0xd221315c,0x8ee47752,0x195d3856 },
  111701. { 0xdacd7fbe,0xd4b1ba03,0xd3e0c52b,0x4b5ac61e,0x6aab7b52,0x68d3c052,
  111702. 0x660e3fea,0xf0d7248c,0x3145efb4,0xafdb3f89,0x8f40936d,0xa73fd9a3 } },
  111703. /* 232 */
  111704. { { 0xbb1b17ce,0x891b9ef3,0xc6127f31,0x14023667,0x305521fd,0x12b2e58d,
  111705. 0xe3508088,0x3a47e449,0xff751507,0xe49fc84b,0x5310d16e,0x4023f722 },
  111706. { 0xb73399fa,0xa608e5ed,0xd532aa3e,0xf12632d8,0x845e8415,0x13a2758e,
  111707. 0x1fc2d861,0xae4b6f85,0x339d02f2,0x3879f5b1,0x80d99ebd,0x446d22a6 } },
  111708. /* 233 */
  111709. { { 0x4be164f1,0x0f502302,0x88b81920,0x8d09d2d6,0x984aceff,0x514056f1,
  111710. 0x75e9e80d,0xa5c4ddf0,0xdf496a93,0x38cb47e6,0x38df6bf7,0x899e1d6b },
  111711. { 0xb59eb2a6,0x69e87e88,0x9b47f38b,0x280d9d63,0x3654e955,0x599411ea,
  111712. 0x969aa581,0xcf8dd4fd,0x530742a7,0xff5c2baf,0x1a373085,0xa4391536 } },
  111713. /* 234 */
  111714. { { 0xa8a4bdd2,0x6ace72a3,0xb68ef702,0xc656cdd1,0x90c4dad8,0xd4a33e7e,
  111715. 0x9d951c50,0x4aece08a,0x085d68e6,0xea8005ae,0x6f7502b8,0xfdd7a7d7 },
  111716. { 0x98d6fa45,0xce6fb0a6,0x1104eb8c,0x228f8672,0xda09d7dc,0xd23d8787,
  111717. 0x2ae93065,0x5521428b,0xea56c366,0x95faba3d,0x0a88aca5,0xedbe5039 } },
  111718. /* 235 */
  111719. { { 0xbfb26c82,0xd64da0ad,0x952c2f9c,0xe5d70b3c,0xf7e77f68,0xf5e8f365,
  111720. 0x08f2d695,0x7234e002,0xd12e7be6,0xfaf900ee,0x4acf734e,0x27dc6934 },
  111721. { 0xc260a46a,0x80e4ff5e,0x2dc31c28,0x7da5ebce,0xca69f552,0x485c5d73,
  111722. 0x69cc84c2,0xcdfb6b29,0xed6d4eca,0x031c5afe,0x22247637,0xc7bbf4c8 } },
  111723. /* 236 */
  111724. { { 0x49fe01b2,0x9d5b72c7,0x793a91b8,0x34785186,0xcf460438,0xa3ba3c54,
  111725. 0x3ab21b6f,0x73e8e43d,0xbe57b8ab,0x50cde8e0,0xdd204264,0x6488b3a7 },
  111726. { 0xdddc4582,0xa9e398b3,0x5bec46fe,0x1698c1a9,0x156d3843,0x7f1446ef,
  111727. 0x770329a2,0x3fd25dd8,0x2c710668,0x05b1221a,0xa72ee6cf,0x65b2dc2a } },
  111728. /* 237 */
  111729. { { 0xcd021d63,0x21a885f7,0xfea61f08,0x3f344b15,0xc5cf73e6,0xad5ba6dd,
  111730. 0x227a8b23,0x154d0d8f,0xdc559311,0x9b74373c,0x98620fa1,0x4feab715 },
  111731. { 0x7d9ec924,0x5098938e,0x6d47e550,0x84d54a5e,0x1b617506,0x1a2d1bdc,
  111732. 0x615868a4,0x99fe1782,0x3005a924,0x171da780,0x7d8f79b6,0xa70bf5ed } },
  111733. /* 238 */
  111734. { { 0xfe2216c5,0x0bc1250d,0x7601b351,0x2c37e250,0xd6f06b7e,0xb6300175,
  111735. 0x8bfeb9b7,0x4dde8ca1,0xb82f843d,0x4f210432,0xb1ac0afd,0x8d70e2f9 },
  111736. { 0xaae91abb,0x25c73b78,0x863028f2,0x0230dca3,0xe5cf30b7,0x8b923ecf,
  111737. 0x5506f265,0xed754ec2,0x729a5e39,0x8e41b88c,0xbabf889b,0xee67cec2 } },
  111738. /* 239 */
  111739. { { 0x1be46c65,0xe183acf5,0xe7565d7a,0x9789538f,0xd9627b4e,0x87873391,
  111740. 0x9f1d9187,0xbf4ac4c1,0x4691f5c8,0x5db99f63,0x74a1fb98,0xa68df803 },
  111741. { 0xbf92b5fa,0x3c448ed1,0x3e0bdc32,0xa098c841,0x79bf016c,0x8e74cd55,
  111742. 0x115e244d,0x5df0d09c,0x3410b66e,0x9418ad01,0x17a02130,0x8b6124cb } },
  111743. /* 240 */
  111744. { { 0xc26e3392,0x425ec3af,0xa1722e00,0xc07f8470,0xe2356b43,0xdcc28190,
  111745. 0xb1ef59a6,0x4ed97dff,0xc63028c1,0xc22b3ad1,0x68c18988,0x070723c2 },
  111746. { 0x4cf49e7d,0x70da302f,0x3f12a522,0xc5e87c93,0x18594148,0x74acdd1d,
  111747. 0xca74124c,0xad5f73ab,0xd69fd478,0xe72e4a3e,0x7b117cc3,0x61593868 } },
  111748. /* 241 */
  111749. { { 0xa9aa0486,0x7b7b9577,0xa063d557,0x6e41fb35,0xda9047d7,0xb017d5c7,
  111750. 0x68a87ba9,0x8c748280,0xdf08ad93,0xab45fa5c,0x4c288a28,0xcd9fb217 },
  111751. { 0x5747843d,0x59544642,0xa56111e3,0x34d64c6c,0x4bfce8d5,0x12e47ea1,
  111752. 0x6169267f,0x17740e05,0xeed03fb5,0x5c49438e,0x4fc3f513,0x9da30add } },
  111753. /* 242 */
  111754. { { 0xccfa5200,0xc4e85282,0x6a19b13d,0x2707608f,0xf5726e2f,0xdcb9a53d,
  111755. 0xe9427de5,0x612407c9,0xd54d582a,0x3e5a17e1,0x655ae118,0xb99877de },
  111756. { 0x015254de,0x6f0e972b,0xf0a6f7c5,0x92a56db1,0xa656f8b2,0xd297e4e1,
  111757. 0xad981983,0x99fe0052,0x07cfed84,0xd3652d2f,0x843c1738,0xc784352e } },
  111758. /* 243 */
  111759. { { 0x7e9b2d8a,0x6ee90af0,0x57cf1964,0xac8d7018,0x71f28efc,0xf6ed9031,
  111760. 0x6812b20e,0x7f70d5a9,0xf1c61eee,0x27b557f4,0xc6263758,0xf1c9bd57 },
  111761. { 0x2a1a6194,0x5cf7d014,0x1890ab84,0xdd614e0b,0x0e93c2a6,0x3ef9de10,
  111762. 0xe0cd91c5,0xf98cf575,0x14befc32,0x504ec0c6,0x6279d68c,0xd0513a66 } },
  111763. /* 244 */
  111764. { { 0xa859fb6a,0xa8eadbad,0xdb283666,0xcf8346e7,0x3e22e355,0x7b35e61a,
  111765. 0x99639c6b,0x293ece2c,0x56f241c8,0xfa0162e2,0xbf7a1dda,0xd2e6c7b9 },
  111766. { 0x40075e63,0xd0de6253,0xf9ec8286,0x2405aa61,0x8fe45494,0x2237830a,
  111767. 0x364e9c8c,0x4fd01ac7,0x904ba750,0x4d9c3d21,0xaf1b520b,0xd589be14 } },
  111768. /* 245 */
  111769. { { 0x4662e53b,0x13576a4f,0xf9077676,0x35ec2f51,0x97c0af97,0x66297d13,
  111770. 0x9e598b58,0xed3201fe,0x5e70f604,0x49bc752a,0xbb12d951,0xb54af535 },
  111771. { 0x212c1c76,0x36ea4c2b,0xeb250dfd,0x18f5bbc7,0x9a0a1a46,0xa0d466cc,
  111772. 0xdac2d917,0x52564da4,0x8e95fab5,0x206559f4,0x9ca67a33,0x7487c190 } },
  111773. /* 246 */
  111774. { { 0xdde98e9c,0x75abfe37,0x2a411199,0x99b90b26,0xdcdb1f7c,0x1b410996,
  111775. 0x8b3b5675,0xab346f11,0xf1f8ae1e,0x04852193,0x6b8b98c1,0x1ec4d227 },
  111776. { 0x45452baa,0xba3bc926,0xacc4a572,0x387d1858,0xe51f171e,0x9478eff6,
  111777. 0x931e1c00,0xf357077d,0xe54c8ca8,0xffee77cd,0x551dc9a4,0xfb4892ff } },
  111778. /* 247 */
  111779. { { 0x2db8dff8,0x5b1bdad0,0x5a2285a2,0xd462f4fd,0xda00b461,0x1d6aad8e,
  111780. 0x41306d1b,0x43fbefcf,0x6a13fe19,0x428e86f3,0x17f89404,0xc8b2f118 },
  111781. { 0xf0d51afb,0x762528aa,0x549b1d06,0xa3e2fea4,0xea3ddf66,0x86fad8f2,
  111782. 0x4fbdd206,0x0d9ccc4b,0xc189ff5a,0xcde97d4c,0x199f19a6,0xc36793d6 } },
  111783. /* 248 */
  111784. { { 0x51b85197,0xea38909b,0xb4c92895,0xffb17dd0,0x1ddb3f3f,0x0eb0878b,
  111785. 0xc57cf0f2,0xb05d28ff,0x1abd57e2,0xd8bde2e7,0xc40c1b20,0x7f2be28d },
  111786. { 0x299a2d48,0x6554dca2,0x8377982d,0x5130ba2e,0x1071971a,0x8863205f,
  111787. 0x7cf2825d,0x15ee6282,0x03748f2b,0xd4b6c57f,0x430385a0,0xa9e3f4da } },
  111788. /* 249 */
  111789. { { 0x83fbc9c6,0x33eb7cec,0x4541777e,0x24a311c7,0x4f0767fc,0xc81377f7,
  111790. 0x4ab702da,0x12adae36,0x2a779696,0xb7fcb6db,0x01cea6ad,0x4a6fb284 },
  111791. { 0xcdfc73de,0x5e8b1d2a,0x1b02fd32,0xd0efae8d,0xd81d8519,0x3f99c190,
  111792. 0xfc808971,0x3c18f7fa,0x51b7ae7b,0x41f713e7,0xf07fc3f8,0x0a4b3435 } },
  111793. /* 250 */
  111794. { { 0x019b7d2e,0x7dda3c4c,0xd4dc4b89,0x631c8d1a,0x1cdb313c,0x5489cd6e,
  111795. 0x4c07bb06,0xd44aed10,0x75f000d1,0x8f97e13a,0xdda5df4d,0x0e9ee64f },
  111796. { 0x3e346910,0xeaa99f3b,0xfa294ad7,0x622f6921,0x0d0b2fe9,0x22aaa20d,
  111797. 0x1e5881ba,0x4fed2f99,0xc1571802,0x9af3b2d6,0xdc7ee17c,0x919e67a8 } },
  111798. /* 251 */
  111799. { { 0x76250533,0xc724fe4c,0x7d817ef8,0x8a2080e5,0x172c9751,0xa2afb0f4,
  111800. 0x17c0702e,0x9b10cdeb,0xc9b7e3e9,0xbf3975e3,0x1cd0cdc5,0x206117df },
  111801. { 0xbe05ebd5,0xfb049e61,0x16c782c0,0xeb0bb55c,0xab7fed09,0x13a331b8,
  111802. 0x632863f0,0xf6c58b1d,0x4d3b6195,0x6264ef6e,0x9a53f116,0x92c51b63 } },
  111803. /* 252 */
  111804. { { 0x288b364d,0xa57c7bc8,0x7b41e5c4,0x4a562e08,0x698a9a11,0x699d21c6,
  111805. 0xf3f849b9,0xa4ed9581,0x9eb726ba,0xa223eef3,0xcc2884f9,0x13159c23 },
  111806. { 0x3a3f4963,0x73931e58,0x0ada6a81,0x96500389,0x5ab2950b,0x3ee8a1c6,
  111807. 0x775fab52,0xeedf4949,0x4f2671b6,0x63d652e1,0x3c4e2f55,0xfed4491c } },
  111808. /* 253 */
  111809. { { 0xf4eb453e,0x335eadc3,0xcadd1a5b,0x5ff74b63,0x5d84a91a,0x6933d0d7,
  111810. 0xb49ba337,0x9ca3eeb9,0xc04c15b8,0x1f6facce,0xdc09a7e4,0x4ef19326 },
  111811. { 0x3dca3233,0x53d2d324,0xa2259d4b,0x0ee40590,0x5546f002,0x18c22edb,
  111812. 0x09ea6b71,0x92429801,0xb0e91e61,0xaada0add,0x99963c50,0x5fe53ef4 } },
  111813. /* 254 */
  111814. { { 0x90c28c65,0x372dd06b,0x119ce47d,0x1765242c,0x6b22fc82,0xc041fb80,
  111815. 0xb0a7ccc1,0x667edf07,0x1261bece,0xc79599e7,0x19cff22a,0xbc69d9ba },
  111816. { 0x13c06819,0x009d77cd,0xe282b79d,0x635a66ae,0x225b1be8,0x4edac4a6,
  111817. 0x524008f9,0x57d4f4e4,0xb056af84,0xee299ac5,0x3a0bc386,0xcc38444c } },
  111818. /* 255 */
  111819. { { 0xcd4c2356,0x490643b1,0x750547be,0x740a4851,0xd4944c04,0x643eaf29,
  111820. 0x299a98a0,0xba572479,0xee05fdf9,0x48b29f16,0x089b2d7b,0x33fb4f61 },
  111821. { 0xa950f955,0x86704902,0xfedc3ddf,0x97e1034d,0x05fbb6a2,0x211320b6,
  111822. 0x432299bb,0x23d7b93f,0x8590e4a3,0x1fe1a057,0xf58c0ce6,0x8e1d0586 } },
  111823. };
  111824. /* Multiply the base point of P384 by the scalar and return the result.
  111825. * If map is true then convert result to affine coordinates.
  111826. *
  111827. * Stripe implementation.
  111828. * Pre-generated: 2^0, 2^48, ...
  111829. * Pre-generated: products of all combinations of above.
  111830. * 8 doubles and adds (with qz=1)
  111831. *
  111832. * r Resulting point.
  111833. * k Scalar to multiply by.
  111834. * map Indicates whether to convert result to affine.
  111835. * ct Constant time required.
  111836. * heap Heap to use for allocation.
  111837. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111838. */
  111839. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  111840. int map, int ct, void* heap)
  111841. {
  111842. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  111843. k, map, ct, heap);
  111844. }
  111845. #endif
  111846. /* Multiply the base point of P384 by the scalar and return the result.
  111847. * If map is true then convert result to affine coordinates.
  111848. *
  111849. * km Scalar to multiply by.
  111850. * r Resulting point.
  111851. * map Indicates whether to convert result to affine.
  111852. * heap Heap to use for allocation.
  111853. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111854. */
  111855. int sp_ecc_mulmod_base_384(const mp_int* km, ecc_point* r, int map, void* heap)
  111856. {
  111857. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111858. sp_point_384* point = NULL;
  111859. sp_digit* k = NULL;
  111860. #else
  111861. sp_point_384 point[1];
  111862. sp_digit k[12];
  111863. #endif
  111864. int err = MP_OKAY;
  111865. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111866. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  111867. DYNAMIC_TYPE_ECC);
  111868. if (point == NULL)
  111869. err = MEMORY_E;
  111870. if (err == MP_OKAY) {
  111871. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  111872. DYNAMIC_TYPE_ECC);
  111873. if (k == NULL)
  111874. err = MEMORY_E;
  111875. }
  111876. #endif
  111877. if (err == MP_OKAY) {
  111878. sp_384_from_mp(k, 12, km);
  111879. err = sp_384_ecc_mulmod_base_12(point, k, map, 1, heap);
  111880. }
  111881. if (err == MP_OKAY) {
  111882. err = sp_384_point_to_ecc_point_12(point, r);
  111883. }
  111884. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111885. if (k != NULL)
  111886. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  111887. if (point != NULL)
  111888. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  111889. #endif
  111890. return err;
  111891. }
  111892. /* Multiply the base point of P384 by the scalar, add point a and return
  111893. * the result. If map is true then convert result to affine coordinates.
  111894. *
  111895. * km Scalar to multiply by.
  111896. * am Point to add to scalar mulitply result.
  111897. * inMont Point to add is in montgomery form.
  111898. * r Resulting point.
  111899. * map Indicates whether to convert result to affine.
  111900. * heap Heap to use for allocation.
  111901. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111902. */
  111903. int sp_ecc_mulmod_base_add_384(const mp_int* km, const ecc_point* am,
  111904. int inMont, ecc_point* r, int map, void* heap)
  111905. {
  111906. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111907. sp_point_384* point = NULL;
  111908. sp_digit* k = NULL;
  111909. #else
  111910. sp_point_384 point[2];
  111911. sp_digit k[12 + 12 * 2 * 6];
  111912. #endif
  111913. sp_point_384* addP = NULL;
  111914. sp_digit* tmp = NULL;
  111915. int err = MP_OKAY;
  111916. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111917. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  111918. DYNAMIC_TYPE_ECC);
  111919. if (point == NULL)
  111920. err = MEMORY_E;
  111921. if (err == MP_OKAY) {
  111922. k = (sp_digit*)XMALLOC(
  111923. sizeof(sp_digit) * (12 + 12 * 2 * 6),
  111924. heap, DYNAMIC_TYPE_ECC);
  111925. if (k == NULL)
  111926. err = MEMORY_E;
  111927. }
  111928. #endif
  111929. if (err == MP_OKAY) {
  111930. addP = point + 1;
  111931. tmp = k + 12;
  111932. sp_384_from_mp(k, 12, km);
  111933. sp_384_point_from_ecc_point_12(addP, am);
  111934. }
  111935. if ((err == MP_OKAY) && (!inMont)) {
  111936. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  111937. }
  111938. if ((err == MP_OKAY) && (!inMont)) {
  111939. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  111940. }
  111941. if ((err == MP_OKAY) && (!inMont)) {
  111942. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  111943. }
  111944. if (err == MP_OKAY) {
  111945. err = sp_384_ecc_mulmod_base_12(point, k, 0, 0, heap);
  111946. }
  111947. if (err == MP_OKAY) {
  111948. sp_384_proj_point_add_12(point, point, addP, tmp);
  111949. if (map) {
  111950. sp_384_map_12(point, point, tmp);
  111951. }
  111952. err = sp_384_point_to_ecc_point_12(point, r);
  111953. }
  111954. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111955. if (k != NULL)
  111956. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  111957. if (point)
  111958. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  111959. #endif
  111960. return err;
  111961. }
  111962. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  111963. defined(HAVE_ECC_VERIFY)
  111964. /* Returns 1 if the number of zero.
  111965. * Implementation is constant time.
  111966. *
  111967. * a Number to check.
  111968. * returns 1 if the number is zero and 0 otherwise.
  111969. */
  111970. static int sp_384_iszero_12(const sp_digit* a)
  111971. {
  111972. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  111973. a[8] | a[9] | a[10] | a[11]) == 0;
  111974. }
  111975. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  111976. /* Add 1 to a. (a = a + 1)
  111977. *
  111978. * a A single precision integer.
  111979. */
  111980. SP_NOINLINE static void sp_384_add_one_12(sp_digit* a)
  111981. {
  111982. __asm__ __volatile__ (
  111983. "movs r2, #1\n\t"
  111984. "ldr r1, [%[a]]\n\t"
  111985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  111986. "adds r1, r1, r2\n\t"
  111987. #else
  111988. "add r1, r1, r2\n\t"
  111989. #endif
  111990. "movs r2, #0\n\t"
  111991. "str r1, [%[a]]\n\t"
  111992. "ldr r1, [%[a], #4]\n\t"
  111993. #ifdef WOLFSSL_KEIL
  111994. "adcs r1, r1, r2\n\t"
  111995. #elif defined(__clang__)
  111996. "adcs r1, r2\n\t"
  111997. #else
  111998. "adc r1, r2\n\t"
  111999. #endif
  112000. "str r1, [%[a], #4]\n\t"
  112001. "ldr r1, [%[a], #8]\n\t"
  112002. #ifdef WOLFSSL_KEIL
  112003. "adcs r1, r1, r2\n\t"
  112004. #elif defined(__clang__)
  112005. "adcs r1, r2\n\t"
  112006. #else
  112007. "adc r1, r2\n\t"
  112008. #endif
  112009. "str r1, [%[a], #8]\n\t"
  112010. "ldr r1, [%[a], #12]\n\t"
  112011. #ifdef WOLFSSL_KEIL
  112012. "adcs r1, r1, r2\n\t"
  112013. #elif defined(__clang__)
  112014. "adcs r1, r2\n\t"
  112015. #else
  112016. "adc r1, r2\n\t"
  112017. #endif
  112018. "str r1, [%[a], #12]\n\t"
  112019. "ldr r1, [%[a], #16]\n\t"
  112020. #ifdef WOLFSSL_KEIL
  112021. "adcs r1, r1, r2\n\t"
  112022. #elif defined(__clang__)
  112023. "adcs r1, r2\n\t"
  112024. #else
  112025. "adc r1, r2\n\t"
  112026. #endif
  112027. "str r1, [%[a], #16]\n\t"
  112028. "ldr r1, [%[a], #20]\n\t"
  112029. #ifdef WOLFSSL_KEIL
  112030. "adcs r1, r1, r2\n\t"
  112031. #elif defined(__clang__)
  112032. "adcs r1, r2\n\t"
  112033. #else
  112034. "adc r1, r2\n\t"
  112035. #endif
  112036. "str r1, [%[a], #20]\n\t"
  112037. "ldr r1, [%[a], #24]\n\t"
  112038. #ifdef WOLFSSL_KEIL
  112039. "adcs r1, r1, r2\n\t"
  112040. #elif defined(__clang__)
  112041. "adcs r1, r2\n\t"
  112042. #else
  112043. "adc r1, r2\n\t"
  112044. #endif
  112045. "str r1, [%[a], #24]\n\t"
  112046. "ldr r1, [%[a], #28]\n\t"
  112047. #ifdef WOLFSSL_KEIL
  112048. "adcs r1, r1, r2\n\t"
  112049. #elif defined(__clang__)
  112050. "adcs r1, r2\n\t"
  112051. #else
  112052. "adc r1, r2\n\t"
  112053. #endif
  112054. "str r1, [%[a], #28]\n\t"
  112055. "ldr r1, [%[a], #32]\n\t"
  112056. #ifdef WOLFSSL_KEIL
  112057. "adcs r1, r1, r2\n\t"
  112058. #elif defined(__clang__)
  112059. "adcs r1, r2\n\t"
  112060. #else
  112061. "adc r1, r2\n\t"
  112062. #endif
  112063. "str r1, [%[a], #32]\n\t"
  112064. "ldr r1, [%[a], #36]\n\t"
  112065. #ifdef WOLFSSL_KEIL
  112066. "adcs r1, r1, r2\n\t"
  112067. #elif defined(__clang__)
  112068. "adcs r1, r2\n\t"
  112069. #else
  112070. "adc r1, r2\n\t"
  112071. #endif
  112072. "str r1, [%[a], #36]\n\t"
  112073. "ldr r1, [%[a], #40]\n\t"
  112074. #ifdef WOLFSSL_KEIL
  112075. "adcs r1, r1, r2\n\t"
  112076. #elif defined(__clang__)
  112077. "adcs r1, r2\n\t"
  112078. #else
  112079. "adc r1, r2\n\t"
  112080. #endif
  112081. "str r1, [%[a], #40]\n\t"
  112082. "ldr r1, [%[a], #44]\n\t"
  112083. #ifdef WOLFSSL_KEIL
  112084. "adcs r1, r1, r2\n\t"
  112085. #elif defined(__clang__)
  112086. "adcs r1, r2\n\t"
  112087. #else
  112088. "adc r1, r2\n\t"
  112089. #endif
  112090. "str r1, [%[a], #44]\n\t"
  112091. : [a] "+r" (a)
  112092. :
  112093. : "memory", "r1", "r2"
  112094. );
  112095. }
  112096. /* Read big endian unsigned byte array into r.
  112097. *
  112098. * r A single precision integer.
  112099. * size Maximum number of bytes to convert
  112100. * a Byte array.
  112101. * n Number of bytes in array to read.
  112102. */
  112103. static void sp_384_from_bin(sp_digit* r, int size, const byte* a, int n)
  112104. {
  112105. int i;
  112106. int j = 0;
  112107. word32 s = 0;
  112108. r[0] = 0;
  112109. for (i = n-1; i >= 0; i--) {
  112110. r[j] |= (((sp_digit)a[i]) << s);
  112111. if (s >= 24U) {
  112112. r[j] &= 0xffffffff;
  112113. s = 32U - s;
  112114. if (j + 1 >= size) {
  112115. break;
  112116. }
  112117. r[++j] = (sp_digit)a[i] >> s;
  112118. s = 8U - s;
  112119. }
  112120. else {
  112121. s += 8U;
  112122. }
  112123. }
  112124. for (j++; j < size; j++) {
  112125. r[j] = 0;
  112126. }
  112127. }
  112128. /* Generates a scalar that is in the range 1..order-1.
  112129. *
  112130. * rng Random number generator.
  112131. * k Scalar value.
  112132. * returns RNG failures, MEMORY_E when memory allocation fails and
  112133. * MP_OKAY on success.
  112134. */
  112135. static int sp_384_ecc_gen_k_12(WC_RNG* rng, sp_digit* k)
  112136. {
  112137. int err;
  112138. byte buf[48];
  112139. do {
  112140. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  112141. if (err == 0) {
  112142. sp_384_from_bin(k, 12, buf, (int)sizeof(buf));
  112143. if (sp_384_cmp_12(k, p384_order2) < 0) {
  112144. sp_384_add_one_12(k);
  112145. break;
  112146. }
  112147. }
  112148. }
  112149. while (err == 0);
  112150. return err;
  112151. }
  112152. /* Makes a random EC key pair.
  112153. *
  112154. * rng Random number generator.
  112155. * priv Generated private value.
  112156. * pub Generated public point.
  112157. * heap Heap to use for allocation.
  112158. * returns ECC_INF_E when the point does not have the correct order, RNG
  112159. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  112160. */
  112161. int sp_ecc_make_key_384(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  112162. {
  112163. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  112164. sp_point_384* point = NULL;
  112165. sp_digit* k = NULL;
  112166. #else
  112167. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  112168. sp_point_384 point[2];
  112169. #else
  112170. sp_point_384 point[1];
  112171. #endif
  112172. sp_digit k[12];
  112173. #endif
  112174. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  112175. sp_point_384* infinity = NULL;
  112176. #endif
  112177. int err = MP_OKAY;
  112178. (void)heap;
  112179. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  112180. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  112181. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC);
  112182. #else
  112183. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC);
  112184. #endif
  112185. if (point == NULL)
  112186. err = MEMORY_E;
  112187. if (err == MP_OKAY) {
  112188. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  112189. DYNAMIC_TYPE_ECC);
  112190. if (k == NULL)
  112191. err = MEMORY_E;
  112192. }
  112193. #endif
  112194. if (err == MP_OKAY) {
  112195. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  112196. infinity = point + 1;
  112197. #endif
  112198. err = sp_384_ecc_gen_k_12(rng, k);
  112199. }
  112200. if (err == MP_OKAY) {
  112201. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, NULL);
  112202. }
  112203. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  112204. if (err == MP_OKAY) {
  112205. err = sp_384_ecc_mulmod_12(infinity, point, p384_order, 1, 1, NULL);
  112206. }
  112207. if (err == MP_OKAY) {
  112208. if (sp_384_iszero_12(point->x) || sp_384_iszero_12(point->y)) {
  112209. err = ECC_INF_E;
  112210. }
  112211. }
  112212. #endif
  112213. if (err == MP_OKAY) {
  112214. err = sp_384_to_mp(k, priv);
  112215. }
  112216. if (err == MP_OKAY) {
  112217. err = sp_384_point_to_ecc_point_12(point, pub);
  112218. }
  112219. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  112220. if (k != NULL)
  112221. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  112222. if (point != NULL) {
  112223. /* point is not sensitive, so no need to zeroize */
  112224. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  112225. }
  112226. #endif
  112227. return err;
  112228. }
  112229. #ifdef HAVE_ECC_DHE
  112230. /* Write r as big endian to byte array.
  112231. * Fixed length number of bytes written: 48
  112232. *
  112233. * r A single precision integer.
  112234. * a Byte array.
  112235. */
  112236. static void sp_384_to_bin_12(sp_digit* r, byte* a)
  112237. {
  112238. int i;
  112239. int j;
  112240. int s = 0;
  112241. int b;
  112242. j = 384 / 8 - 1;
  112243. a[j] = 0;
  112244. for (i=0; i<12 && j>=0; i++) {
  112245. b = 0;
  112246. /* lint allow cast of mismatch sp_digit and int */
  112247. a[j--] |= (byte)(r[i] << s); /*lint !e9033*/
  112248. b += 8 - s;
  112249. if (j < 0) {
  112250. break;
  112251. }
  112252. while (b < 32) {
  112253. a[j--] = (byte)(r[i] >> b);
  112254. b += 8;
  112255. if (j < 0) {
  112256. break;
  112257. }
  112258. }
  112259. s = 8 - (b - 32);
  112260. if (j >= 0) {
  112261. a[j] = 0;
  112262. }
  112263. if (s != 0) {
  112264. j++;
  112265. }
  112266. }
  112267. }
  112268. /* Multiply the point by the scalar and serialize the X ordinate.
  112269. * The number is 0 padded to maximum size on output.
  112270. *
  112271. * priv Scalar to multiply the point by.
  112272. * pub Point to multiply.
  112273. * out Buffer to hold X ordinate.
  112274. * outLen On entry, size of the buffer in bytes.
  112275. * On exit, length of data in buffer in bytes.
  112276. * heap Heap to use for allocation.
  112277. * returns BUFFER_E if the buffer is to small for output size,
  112278. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  112279. */
  112280. int sp_ecc_secret_gen_384(const mp_int* priv, const ecc_point* pub, byte* out,
  112281. word32* outLen, void* heap)
  112282. {
  112283. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  112284. sp_point_384* point = NULL;
  112285. sp_digit* k = NULL;
  112286. #else
  112287. sp_point_384 point[1];
  112288. sp_digit k[12];
  112289. #endif
  112290. int err = MP_OKAY;
  112291. if (*outLen < 48U) {
  112292. err = BUFFER_E;
  112293. }
  112294. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  112295. if (err == MP_OKAY) {
  112296. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  112297. DYNAMIC_TYPE_ECC);
  112298. if (point == NULL)
  112299. err = MEMORY_E;
  112300. }
  112301. if (err == MP_OKAY) {
  112302. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  112303. DYNAMIC_TYPE_ECC);
  112304. if (k == NULL)
  112305. err = MEMORY_E;
  112306. }
  112307. #endif
  112308. if (err == MP_OKAY) {
  112309. sp_384_from_mp(k, 12, priv);
  112310. sp_384_point_from_ecc_point_12(point, pub);
  112311. err = sp_384_ecc_mulmod_12(point, point, k, 1, 1, heap);
  112312. }
  112313. if (err == MP_OKAY) {
  112314. sp_384_to_bin_12(point->x, out);
  112315. *outLen = 48;
  112316. }
  112317. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  112318. if (k != NULL)
  112319. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  112320. if (point != NULL)
  112321. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  112322. #endif
  112323. return err;
  112324. }
  112325. #endif /* HAVE_ECC_DHE */
  112326. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  112327. #endif
  112328. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  112329. #ifdef WOLFSSL_SP_SMALL
  112330. /* Sub b from a into a. (a -= b)
  112331. *
  112332. * a A single precision integer.
  112333. * b A single precision integer.
  112334. */
  112335. SP_NOINLINE static sp_digit sp_384_sub_in_place_12(sp_digit* a,
  112336. const sp_digit* b)
  112337. {
  112338. __asm__ __volatile__ (
  112339. "movs r7, %[a]\n\t"
  112340. "movs r2, #0\n\t"
  112341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112342. "adds r7, r7, #48\n\t"
  112343. #else
  112344. "add r7, r7, #48\n\t"
  112345. #endif
  112346. "\n"
  112347. "L_sp_384_sub_in_place_12_words_%=:\n\t"
  112348. "movs r5, #0\n\t"
  112349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112350. "subs r5, r5, r2\n\t"
  112351. #else
  112352. "sub r5, r5, r2\n\t"
  112353. #endif
  112354. "ldr r3, [%[a]]\n\t"
  112355. "ldr r4, [%[a], #4]\n\t"
  112356. "ldr r5, [%[b]]\n\t"
  112357. "ldr r6, [%[b], #4]\n\t"
  112358. #ifdef WOLFSSL_KEIL
  112359. "sbcs r3, r3, r5\n\t"
  112360. #elif defined(__clang__)
  112361. "sbcs r3, r5\n\t"
  112362. #else
  112363. "sbc r3, r5\n\t"
  112364. #endif
  112365. #ifdef WOLFSSL_KEIL
  112366. "sbcs r4, r4, r6\n\t"
  112367. #elif defined(__clang__)
  112368. "sbcs r4, r6\n\t"
  112369. #else
  112370. "sbc r4, r6\n\t"
  112371. #endif
  112372. "str r3, [%[a]]\n\t"
  112373. "str r4, [%[a], #4]\n\t"
  112374. #ifdef WOLFSSL_KEIL
  112375. "sbcs r2, r2, r2\n\t"
  112376. #elif defined(__clang__)
  112377. "sbcs r2, r2\n\t"
  112378. #else
  112379. "sbc r2, r2\n\t"
  112380. #endif
  112381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112382. "adds %[a], %[a], #8\n\t"
  112383. #else
  112384. "add %[a], %[a], #8\n\t"
  112385. #endif
  112386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112387. "adds %[b], %[b], #8\n\t"
  112388. #else
  112389. "add %[b], %[b], #8\n\t"
  112390. #endif
  112391. "cmp %[a], r7\n\t"
  112392. "bne L_sp_384_sub_in_place_12_words_%=\n\t"
  112393. "movs %[a], r2\n\t"
  112394. : [a] "+r" (a), [b] "+r" (b)
  112395. :
  112396. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  112397. );
  112398. return (uint32_t)(size_t)a;
  112399. }
  112400. #else
  112401. /* Sub b from a into a. (a -= b)
  112402. *
  112403. * a A single precision integer.
  112404. * b A single precision integer.
  112405. */
  112406. SP_NOINLINE static sp_digit sp_384_sub_in_place_12(sp_digit* a,
  112407. const sp_digit* b)
  112408. {
  112409. __asm__ __volatile__ (
  112410. "ldm %[b]!, {r4, r5}\n\t"
  112411. "ldr r2, [%[a]]\n\t"
  112412. "ldr r3, [%[a], #4]\n\t"
  112413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112414. "subs r2, r2, r4\n\t"
  112415. #else
  112416. "sub r2, r2, r4\n\t"
  112417. #endif
  112418. #ifdef WOLFSSL_KEIL
  112419. "sbcs r3, r3, r5\n\t"
  112420. #elif defined(__clang__)
  112421. "sbcs r3, r5\n\t"
  112422. #else
  112423. "sbc r3, r5\n\t"
  112424. #endif
  112425. "stm %[a]!, {r2, r3}\n\t"
  112426. "ldm %[b]!, {r4, r5}\n\t"
  112427. "ldr r2, [%[a]]\n\t"
  112428. "ldr r3, [%[a], #4]\n\t"
  112429. #ifdef WOLFSSL_KEIL
  112430. "sbcs r2, r2, r4\n\t"
  112431. #elif defined(__clang__)
  112432. "sbcs r2, r4\n\t"
  112433. #else
  112434. "sbc r2, r4\n\t"
  112435. #endif
  112436. #ifdef WOLFSSL_KEIL
  112437. "sbcs r3, r3, r5\n\t"
  112438. #elif defined(__clang__)
  112439. "sbcs r3, r5\n\t"
  112440. #else
  112441. "sbc r3, r5\n\t"
  112442. #endif
  112443. "stm %[a]!, {r2, r3}\n\t"
  112444. "ldm %[b]!, {r4, r5}\n\t"
  112445. "ldr r2, [%[a]]\n\t"
  112446. "ldr r3, [%[a], #4]\n\t"
  112447. #ifdef WOLFSSL_KEIL
  112448. "sbcs r2, r2, r4\n\t"
  112449. #elif defined(__clang__)
  112450. "sbcs r2, r4\n\t"
  112451. #else
  112452. "sbc r2, r4\n\t"
  112453. #endif
  112454. #ifdef WOLFSSL_KEIL
  112455. "sbcs r3, r3, r5\n\t"
  112456. #elif defined(__clang__)
  112457. "sbcs r3, r5\n\t"
  112458. #else
  112459. "sbc r3, r5\n\t"
  112460. #endif
  112461. "stm %[a]!, {r2, r3}\n\t"
  112462. "ldm %[b]!, {r4, r5}\n\t"
  112463. "ldr r2, [%[a]]\n\t"
  112464. "ldr r3, [%[a], #4]\n\t"
  112465. #ifdef WOLFSSL_KEIL
  112466. "sbcs r2, r2, r4\n\t"
  112467. #elif defined(__clang__)
  112468. "sbcs r2, r4\n\t"
  112469. #else
  112470. "sbc r2, r4\n\t"
  112471. #endif
  112472. #ifdef WOLFSSL_KEIL
  112473. "sbcs r3, r3, r5\n\t"
  112474. #elif defined(__clang__)
  112475. "sbcs r3, r5\n\t"
  112476. #else
  112477. "sbc r3, r5\n\t"
  112478. #endif
  112479. "stm %[a]!, {r2, r3}\n\t"
  112480. "ldm %[b]!, {r4, r5}\n\t"
  112481. "ldr r2, [%[a]]\n\t"
  112482. "ldr r3, [%[a], #4]\n\t"
  112483. #ifdef WOLFSSL_KEIL
  112484. "sbcs r2, r2, r4\n\t"
  112485. #elif defined(__clang__)
  112486. "sbcs r2, r4\n\t"
  112487. #else
  112488. "sbc r2, r4\n\t"
  112489. #endif
  112490. #ifdef WOLFSSL_KEIL
  112491. "sbcs r3, r3, r5\n\t"
  112492. #elif defined(__clang__)
  112493. "sbcs r3, r5\n\t"
  112494. #else
  112495. "sbc r3, r5\n\t"
  112496. #endif
  112497. "stm %[a]!, {r2, r3}\n\t"
  112498. "ldm %[b]!, {r4, r5}\n\t"
  112499. "ldr r2, [%[a]]\n\t"
  112500. "ldr r3, [%[a], #4]\n\t"
  112501. #ifdef WOLFSSL_KEIL
  112502. "sbcs r2, r2, r4\n\t"
  112503. #elif defined(__clang__)
  112504. "sbcs r2, r4\n\t"
  112505. #else
  112506. "sbc r2, r4\n\t"
  112507. #endif
  112508. #ifdef WOLFSSL_KEIL
  112509. "sbcs r3, r3, r5\n\t"
  112510. #elif defined(__clang__)
  112511. "sbcs r3, r5\n\t"
  112512. #else
  112513. "sbc r3, r5\n\t"
  112514. #endif
  112515. "stm %[a]!, {r2, r3}\n\t"
  112516. #ifdef WOLFSSL_KEIL
  112517. "sbcs %[a], %[a], %[a]\n\t"
  112518. #elif defined(__clang__)
  112519. "sbcs %[a], %[a]\n\t"
  112520. #else
  112521. "sbc %[a], %[a]\n\t"
  112522. #endif
  112523. : [a] "+r" (a), [b] "+r" (b)
  112524. :
  112525. : "memory", "r2", "r3", "r4", "r5"
  112526. );
  112527. return (uint32_t)(size_t)a;
  112528. }
  112529. #endif /* WOLFSSL_SP_SMALL */
  112530. /* Mul a by digit b into r. (r = a * b)
  112531. *
  112532. * r A single precision integer.
  112533. * a A single precision integer.
  112534. * b A single precision digit.
  112535. */
  112536. SP_NOINLINE static void sp_384_mul_d_12(sp_digit* r, const sp_digit* a,
  112537. sp_digit b)
  112538. {
  112539. __asm__ __volatile__ (
  112540. "movs r6, #48\n\t"
  112541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112542. "adds r6, r6, %[a]\n\t"
  112543. #else
  112544. "add r6, r6, %[a]\n\t"
  112545. #endif
  112546. "mov r8, %[r]\n\t"
  112547. "mov r9, r6\n\t"
  112548. "movs r3, #0\n\t"
  112549. "movs r4, #0\n\t"
  112550. "\n"
  112551. "L_sp_384_mul_d_12_%=:\n\t"
  112552. "movs %[r], #0\n\t"
  112553. "movs r5, #0\n\t"
  112554. "# A[] * B\n\t"
  112555. "ldrh r6, [%[a]]\n\t"
  112556. "uxth r7, %[b]\n\t"
  112557. #ifdef WOLFSSL_KEIL
  112558. "muls r7, r6, r7\n\t"
  112559. #elif defined(__clang__)
  112560. "muls r7, r6\n\t"
  112561. #else
  112562. "mul r7, r6\n\t"
  112563. #endif
  112564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112565. "adds r3, r3, r7\n\t"
  112566. #else
  112567. "add r3, r3, r7\n\t"
  112568. #endif
  112569. #ifdef WOLFSSL_KEIL
  112570. "adcs r4, r4, %[r]\n\t"
  112571. #elif defined(__clang__)
  112572. "adcs r4, %[r]\n\t"
  112573. #else
  112574. "adc r4, %[r]\n\t"
  112575. #endif
  112576. #ifdef WOLFSSL_KEIL
  112577. "adcs r5, r5, %[r]\n\t"
  112578. #elif defined(__clang__)
  112579. "adcs r5, %[r]\n\t"
  112580. #else
  112581. "adc r5, %[r]\n\t"
  112582. #endif
  112583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112584. "lsrs r7, %[b], #16\n\t"
  112585. #else
  112586. "lsr r7, %[b], #16\n\t"
  112587. #endif
  112588. #ifdef WOLFSSL_KEIL
  112589. "muls r6, r7, r6\n\t"
  112590. #elif defined(__clang__)
  112591. "muls r6, r7\n\t"
  112592. #else
  112593. "mul r6, r7\n\t"
  112594. #endif
  112595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112596. "lsrs r7, r6, #16\n\t"
  112597. #else
  112598. "lsr r7, r6, #16\n\t"
  112599. #endif
  112600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112601. "lsls r6, r6, #16\n\t"
  112602. #else
  112603. "lsl r6, r6, #16\n\t"
  112604. #endif
  112605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112606. "adds r3, r3, r6\n\t"
  112607. #else
  112608. "add r3, r3, r6\n\t"
  112609. #endif
  112610. #ifdef WOLFSSL_KEIL
  112611. "adcs r4, r4, r7\n\t"
  112612. #elif defined(__clang__)
  112613. "adcs r4, r7\n\t"
  112614. #else
  112615. "adc r4, r7\n\t"
  112616. #endif
  112617. #ifdef WOLFSSL_KEIL
  112618. "adcs r5, r5, %[r]\n\t"
  112619. #elif defined(__clang__)
  112620. "adcs r5, %[r]\n\t"
  112621. #else
  112622. "adc r5, %[r]\n\t"
  112623. #endif
  112624. "ldr r6, [%[a]]\n\t"
  112625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112626. "lsrs r6, r6, #16\n\t"
  112627. #else
  112628. "lsr r6, r6, #16\n\t"
  112629. #endif
  112630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112631. "lsrs r7, %[b], #16\n\t"
  112632. #else
  112633. "lsr r7, %[b], #16\n\t"
  112634. #endif
  112635. #ifdef WOLFSSL_KEIL
  112636. "muls r7, r6, r7\n\t"
  112637. #elif defined(__clang__)
  112638. "muls r7, r6\n\t"
  112639. #else
  112640. "mul r7, r6\n\t"
  112641. #endif
  112642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112643. "adds r4, r4, r7\n\t"
  112644. #else
  112645. "add r4, r4, r7\n\t"
  112646. #endif
  112647. #ifdef WOLFSSL_KEIL
  112648. "adcs r5, r5, %[r]\n\t"
  112649. #elif defined(__clang__)
  112650. "adcs r5, %[r]\n\t"
  112651. #else
  112652. "adc r5, %[r]\n\t"
  112653. #endif
  112654. "uxth r7, %[b]\n\t"
  112655. #ifdef WOLFSSL_KEIL
  112656. "muls r6, r7, r6\n\t"
  112657. #elif defined(__clang__)
  112658. "muls r6, r7\n\t"
  112659. #else
  112660. "mul r6, r7\n\t"
  112661. #endif
  112662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112663. "lsrs r7, r6, #16\n\t"
  112664. #else
  112665. "lsr r7, r6, #16\n\t"
  112666. #endif
  112667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112668. "lsls r6, r6, #16\n\t"
  112669. #else
  112670. "lsl r6, r6, #16\n\t"
  112671. #endif
  112672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112673. "adds r3, r3, r6\n\t"
  112674. #else
  112675. "add r3, r3, r6\n\t"
  112676. #endif
  112677. #ifdef WOLFSSL_KEIL
  112678. "adcs r4, r4, r7\n\t"
  112679. #elif defined(__clang__)
  112680. "adcs r4, r7\n\t"
  112681. #else
  112682. "adc r4, r7\n\t"
  112683. #endif
  112684. #ifdef WOLFSSL_KEIL
  112685. "adcs r5, r5, %[r]\n\t"
  112686. #elif defined(__clang__)
  112687. "adcs r5, %[r]\n\t"
  112688. #else
  112689. "adc r5, %[r]\n\t"
  112690. #endif
  112691. "# A[] * B - Done\n\t"
  112692. "mov %[r], r8\n\t"
  112693. "str r3, [%[r]]\n\t"
  112694. "movs r3, r4\n\t"
  112695. "movs r4, r5\n\t"
  112696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112697. "adds %[r], %[r], #4\n\t"
  112698. #else
  112699. "add %[r], %[r], #4\n\t"
  112700. #endif
  112701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112702. "adds %[a], %[a], #4\n\t"
  112703. #else
  112704. "add %[a], %[a], #4\n\t"
  112705. #endif
  112706. "mov r8, %[r]\n\t"
  112707. "cmp %[a], r9\n\t"
  112708. "blt L_sp_384_mul_d_12_%=\n\t"
  112709. "str r3, [%[r]]\n\t"
  112710. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  112711. :
  112712. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  112713. );
  112714. }
  112715. /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
  112716. *
  112717. * d1 The high order half of the number to divide.
  112718. * d0 The low order half of the number to divide.
  112719. * div The dividend.
  112720. * returns the result of the division.
  112721. *
  112722. * Note that this is an approximate div. It may give an answer 1 larger.
  112723. */
  112724. SP_NOINLINE static sp_digit div_384_word_12(sp_digit d1, sp_digit d0,
  112725. sp_digit div)
  112726. {
  112727. __asm__ __volatile__ (
  112728. "movs r3, #0\n\t"
  112729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112730. "lsrs r5, %[div], #1\n\t"
  112731. #else
  112732. "lsr r5, %[div], #1\n\t"
  112733. #endif
  112734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112735. "adds r5, r5, #1\n\t"
  112736. #else
  112737. "add r5, r5, #1\n\t"
  112738. #endif
  112739. "mov r8, %[d0]\n\t"
  112740. "mov r9, %[d1]\n\t"
  112741. "# Do top 32\n\t"
  112742. "movs r6, r5\n\t"
  112743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112744. "subs r6, r6, %[d1]\n\t"
  112745. #else
  112746. "sub r6, r6, %[d1]\n\t"
  112747. #endif
  112748. #ifdef WOLFSSL_KEIL
  112749. "sbcs r6, r6, r6\n\t"
  112750. #elif defined(__clang__)
  112751. "sbcs r6, r6\n\t"
  112752. #else
  112753. "sbc r6, r6\n\t"
  112754. #endif
  112755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112756. "adds r3, r3, r3\n\t"
  112757. #else
  112758. "add r3, r3, r3\n\t"
  112759. #endif
  112760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112761. "subs r3, r3, r6\n\t"
  112762. #else
  112763. "sub r3, r3, r6\n\t"
  112764. #endif
  112765. #ifdef WOLFSSL_KEIL
  112766. "ands r6, r6, r5\n\t"
  112767. #elif defined(__clang__)
  112768. "ands r6, r5\n\t"
  112769. #else
  112770. "and r6, r5\n\t"
  112771. #endif
  112772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112773. "subs %[d1], %[d1], r6\n\t"
  112774. #else
  112775. "sub %[d1], %[d1], r6\n\t"
  112776. #endif
  112777. "movs r4, #29\n\t"
  112778. "\n"
  112779. "L_div_384_word_12_loop_%=:\n\t"
  112780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112781. "lsls %[d0], %[d0], #1\n\t"
  112782. #else
  112783. "lsl %[d0], %[d0], #1\n\t"
  112784. #endif
  112785. #ifdef WOLFSSL_KEIL
  112786. "adcs %[d1], %[d1], %[d1]\n\t"
  112787. #elif defined(__clang__)
  112788. "adcs %[d1], %[d1]\n\t"
  112789. #else
  112790. "adc %[d1], %[d1]\n\t"
  112791. #endif
  112792. "movs r6, r5\n\t"
  112793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112794. "subs r6, r6, %[d1]\n\t"
  112795. #else
  112796. "sub r6, r6, %[d1]\n\t"
  112797. #endif
  112798. #ifdef WOLFSSL_KEIL
  112799. "sbcs r6, r6, r6\n\t"
  112800. #elif defined(__clang__)
  112801. "sbcs r6, r6\n\t"
  112802. #else
  112803. "sbc r6, r6\n\t"
  112804. #endif
  112805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112806. "adds r3, r3, r3\n\t"
  112807. #else
  112808. "add r3, r3, r3\n\t"
  112809. #endif
  112810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112811. "subs r3, r3, r6\n\t"
  112812. #else
  112813. "sub r3, r3, r6\n\t"
  112814. #endif
  112815. #ifdef WOLFSSL_KEIL
  112816. "ands r6, r6, r5\n\t"
  112817. #elif defined(__clang__)
  112818. "ands r6, r5\n\t"
  112819. #else
  112820. "and r6, r5\n\t"
  112821. #endif
  112822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112823. "subs %[d1], %[d1], r6\n\t"
  112824. #else
  112825. "sub %[d1], %[d1], r6\n\t"
  112826. #endif
  112827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112828. "subs r4, r4, #1\n\t"
  112829. #else
  112830. "sub r4, r4, #1\n\t"
  112831. #endif
  112832. "bpl L_div_384_word_12_loop_%=\n\t"
  112833. "movs r7, #0\n\t"
  112834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112835. "adds r3, r3, r3\n\t"
  112836. #else
  112837. "add r3, r3, r3\n\t"
  112838. #endif
  112839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112840. "adds r3, r3, #1\n\t"
  112841. #else
  112842. "add r3, r3, #1\n\t"
  112843. #endif
  112844. "# r * div - Start\n\t"
  112845. "uxth %[d1], r3\n\t"
  112846. "uxth r4, %[div]\n\t"
  112847. #ifdef WOLFSSL_KEIL
  112848. "muls r4, %[d1], r4\n\t"
  112849. #elif defined(__clang__)
  112850. "muls r4, %[d1]\n\t"
  112851. #else
  112852. "mul r4, %[d1]\n\t"
  112853. #endif
  112854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112855. "lsrs r6, %[div], #16\n\t"
  112856. #else
  112857. "lsr r6, %[div], #16\n\t"
  112858. #endif
  112859. #ifdef WOLFSSL_KEIL
  112860. "muls %[d1], r6, %[d1]\n\t"
  112861. #elif defined(__clang__)
  112862. "muls %[d1], r6\n\t"
  112863. #else
  112864. "mul %[d1], r6\n\t"
  112865. #endif
  112866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112867. "lsrs r5, %[d1], #16\n\t"
  112868. #else
  112869. "lsr r5, %[d1], #16\n\t"
  112870. #endif
  112871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112872. "lsls %[d1], %[d1], #16\n\t"
  112873. #else
  112874. "lsl %[d1], %[d1], #16\n\t"
  112875. #endif
  112876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112877. "adds r4, r4, %[d1]\n\t"
  112878. #else
  112879. "add r4, r4, %[d1]\n\t"
  112880. #endif
  112881. #ifdef WOLFSSL_KEIL
  112882. "adcs r5, r5, r7\n\t"
  112883. #elif defined(__clang__)
  112884. "adcs r5, r7\n\t"
  112885. #else
  112886. "adc r5, r7\n\t"
  112887. #endif
  112888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112889. "lsrs %[d1], r3, #16\n\t"
  112890. #else
  112891. "lsr %[d1], r3, #16\n\t"
  112892. #endif
  112893. #ifdef WOLFSSL_KEIL
  112894. "muls r6, %[d1], r6\n\t"
  112895. #elif defined(__clang__)
  112896. "muls r6, %[d1]\n\t"
  112897. #else
  112898. "mul r6, %[d1]\n\t"
  112899. #endif
  112900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112901. "adds r5, r5, r6\n\t"
  112902. #else
  112903. "add r5, r5, r6\n\t"
  112904. #endif
  112905. "uxth r6, %[div]\n\t"
  112906. #ifdef WOLFSSL_KEIL
  112907. "muls %[d1], r6, %[d1]\n\t"
  112908. #elif defined(__clang__)
  112909. "muls %[d1], r6\n\t"
  112910. #else
  112911. "mul %[d1], r6\n\t"
  112912. #endif
  112913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112914. "lsrs r6, %[d1], #16\n\t"
  112915. #else
  112916. "lsr r6, %[d1], #16\n\t"
  112917. #endif
  112918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112919. "lsls %[d1], %[d1], #16\n\t"
  112920. #else
  112921. "lsl %[d1], %[d1], #16\n\t"
  112922. #endif
  112923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112924. "adds r4, r4, %[d1]\n\t"
  112925. #else
  112926. "add r4, r4, %[d1]\n\t"
  112927. #endif
  112928. #ifdef WOLFSSL_KEIL
  112929. "adcs r5, r5, r6\n\t"
  112930. #elif defined(__clang__)
  112931. "adcs r5, r6\n\t"
  112932. #else
  112933. "adc r5, r6\n\t"
  112934. #endif
  112935. "# r * div - Done\n\t"
  112936. "mov %[d1], r8\n\t"
  112937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112938. "subs %[d1], %[d1], r4\n\t"
  112939. #else
  112940. "sub %[d1], %[d1], r4\n\t"
  112941. #endif
  112942. "movs r4, %[d1]\n\t"
  112943. "mov %[d1], r9\n\t"
  112944. #ifdef WOLFSSL_KEIL
  112945. "sbcs %[d1], %[d1], r5\n\t"
  112946. #elif defined(__clang__)
  112947. "sbcs %[d1], r5\n\t"
  112948. #else
  112949. "sbc %[d1], r5\n\t"
  112950. #endif
  112951. "movs r5, %[d1]\n\t"
  112952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112953. "adds r3, r3, r5\n\t"
  112954. #else
  112955. "add r3, r3, r5\n\t"
  112956. #endif
  112957. "# r * div - Start\n\t"
  112958. "uxth %[d1], r3\n\t"
  112959. "uxth r4, %[div]\n\t"
  112960. #ifdef WOLFSSL_KEIL
  112961. "muls r4, %[d1], r4\n\t"
  112962. #elif defined(__clang__)
  112963. "muls r4, %[d1]\n\t"
  112964. #else
  112965. "mul r4, %[d1]\n\t"
  112966. #endif
  112967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112968. "lsrs r6, %[div], #16\n\t"
  112969. #else
  112970. "lsr r6, %[div], #16\n\t"
  112971. #endif
  112972. #ifdef WOLFSSL_KEIL
  112973. "muls %[d1], r6, %[d1]\n\t"
  112974. #elif defined(__clang__)
  112975. "muls %[d1], r6\n\t"
  112976. #else
  112977. "mul %[d1], r6\n\t"
  112978. #endif
  112979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112980. "lsrs r5, %[d1], #16\n\t"
  112981. #else
  112982. "lsr r5, %[d1], #16\n\t"
  112983. #endif
  112984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112985. "lsls %[d1], %[d1], #16\n\t"
  112986. #else
  112987. "lsl %[d1], %[d1], #16\n\t"
  112988. #endif
  112989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  112990. "adds r4, r4, %[d1]\n\t"
  112991. #else
  112992. "add r4, r4, %[d1]\n\t"
  112993. #endif
  112994. #ifdef WOLFSSL_KEIL
  112995. "adcs r5, r5, r7\n\t"
  112996. #elif defined(__clang__)
  112997. "adcs r5, r7\n\t"
  112998. #else
  112999. "adc r5, r7\n\t"
  113000. #endif
  113001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113002. "lsrs %[d1], r3, #16\n\t"
  113003. #else
  113004. "lsr %[d1], r3, #16\n\t"
  113005. #endif
  113006. #ifdef WOLFSSL_KEIL
  113007. "muls r6, %[d1], r6\n\t"
  113008. #elif defined(__clang__)
  113009. "muls r6, %[d1]\n\t"
  113010. #else
  113011. "mul r6, %[d1]\n\t"
  113012. #endif
  113013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113014. "adds r5, r5, r6\n\t"
  113015. #else
  113016. "add r5, r5, r6\n\t"
  113017. #endif
  113018. "uxth r6, %[div]\n\t"
  113019. #ifdef WOLFSSL_KEIL
  113020. "muls %[d1], r6, %[d1]\n\t"
  113021. #elif defined(__clang__)
  113022. "muls %[d1], r6\n\t"
  113023. #else
  113024. "mul %[d1], r6\n\t"
  113025. #endif
  113026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113027. "lsrs r6, %[d1], #16\n\t"
  113028. #else
  113029. "lsr r6, %[d1], #16\n\t"
  113030. #endif
  113031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113032. "lsls %[d1], %[d1], #16\n\t"
  113033. #else
  113034. "lsl %[d1], %[d1], #16\n\t"
  113035. #endif
  113036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113037. "adds r4, r4, %[d1]\n\t"
  113038. #else
  113039. "add r4, r4, %[d1]\n\t"
  113040. #endif
  113041. #ifdef WOLFSSL_KEIL
  113042. "adcs r5, r5, r6\n\t"
  113043. #elif defined(__clang__)
  113044. "adcs r5, r6\n\t"
  113045. #else
  113046. "adc r5, r6\n\t"
  113047. #endif
  113048. "# r * div - Done\n\t"
  113049. "mov %[d1], r8\n\t"
  113050. "mov r6, r9\n\t"
  113051. #ifdef WOLFSSL_KEIL
  113052. "subs r4, %[d1], r4\n\t"
  113053. #else
  113054. #ifdef __clang__
  113055. "subs r4, %[d1], r4\n\t"
  113056. #else
  113057. "sub r4, %[d1], r4\n\t"
  113058. #endif
  113059. #endif
  113060. #ifdef WOLFSSL_KEIL
  113061. "sbcs r6, r6, r5\n\t"
  113062. #elif defined(__clang__)
  113063. "sbcs r6, r5\n\t"
  113064. #else
  113065. "sbc r6, r5\n\t"
  113066. #endif
  113067. "movs r5, r6\n\t"
  113068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113069. "adds r3, r3, r5\n\t"
  113070. #else
  113071. "add r3, r3, r5\n\t"
  113072. #endif
  113073. "# r * div - Start\n\t"
  113074. "uxth %[d1], r3\n\t"
  113075. "uxth r4, %[div]\n\t"
  113076. #ifdef WOLFSSL_KEIL
  113077. "muls r4, %[d1], r4\n\t"
  113078. #elif defined(__clang__)
  113079. "muls r4, %[d1]\n\t"
  113080. #else
  113081. "mul r4, %[d1]\n\t"
  113082. #endif
  113083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113084. "lsrs r6, %[div], #16\n\t"
  113085. #else
  113086. "lsr r6, %[div], #16\n\t"
  113087. #endif
  113088. #ifdef WOLFSSL_KEIL
  113089. "muls %[d1], r6, %[d1]\n\t"
  113090. #elif defined(__clang__)
  113091. "muls %[d1], r6\n\t"
  113092. #else
  113093. "mul %[d1], r6\n\t"
  113094. #endif
  113095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113096. "lsrs r5, %[d1], #16\n\t"
  113097. #else
  113098. "lsr r5, %[d1], #16\n\t"
  113099. #endif
  113100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113101. "lsls %[d1], %[d1], #16\n\t"
  113102. #else
  113103. "lsl %[d1], %[d1], #16\n\t"
  113104. #endif
  113105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113106. "adds r4, r4, %[d1]\n\t"
  113107. #else
  113108. "add r4, r4, %[d1]\n\t"
  113109. #endif
  113110. #ifdef WOLFSSL_KEIL
  113111. "adcs r5, r5, r7\n\t"
  113112. #elif defined(__clang__)
  113113. "adcs r5, r7\n\t"
  113114. #else
  113115. "adc r5, r7\n\t"
  113116. #endif
  113117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113118. "lsrs %[d1], r3, #16\n\t"
  113119. #else
  113120. "lsr %[d1], r3, #16\n\t"
  113121. #endif
  113122. #ifdef WOLFSSL_KEIL
  113123. "muls r6, %[d1], r6\n\t"
  113124. #elif defined(__clang__)
  113125. "muls r6, %[d1]\n\t"
  113126. #else
  113127. "mul r6, %[d1]\n\t"
  113128. #endif
  113129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113130. "adds r5, r5, r6\n\t"
  113131. #else
  113132. "add r5, r5, r6\n\t"
  113133. #endif
  113134. "uxth r6, %[div]\n\t"
  113135. #ifdef WOLFSSL_KEIL
  113136. "muls %[d1], r6, %[d1]\n\t"
  113137. #elif defined(__clang__)
  113138. "muls %[d1], r6\n\t"
  113139. #else
  113140. "mul %[d1], r6\n\t"
  113141. #endif
  113142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113143. "lsrs r6, %[d1], #16\n\t"
  113144. #else
  113145. "lsr r6, %[d1], #16\n\t"
  113146. #endif
  113147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113148. "lsls %[d1], %[d1], #16\n\t"
  113149. #else
  113150. "lsl %[d1], %[d1], #16\n\t"
  113151. #endif
  113152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113153. "adds r4, r4, %[d1]\n\t"
  113154. #else
  113155. "add r4, r4, %[d1]\n\t"
  113156. #endif
  113157. #ifdef WOLFSSL_KEIL
  113158. "adcs r5, r5, r6\n\t"
  113159. #elif defined(__clang__)
  113160. "adcs r5, r6\n\t"
  113161. #else
  113162. "adc r5, r6\n\t"
  113163. #endif
  113164. "# r * div - Done\n\t"
  113165. "mov %[d1], r8\n\t"
  113166. "mov r6, r9\n\t"
  113167. #ifdef WOLFSSL_KEIL
  113168. "subs r4, %[d1], r4\n\t"
  113169. #else
  113170. #ifdef __clang__
  113171. "subs r4, %[d1], r4\n\t"
  113172. #else
  113173. "sub r4, %[d1], r4\n\t"
  113174. #endif
  113175. #endif
  113176. #ifdef WOLFSSL_KEIL
  113177. "sbcs r6, r6, r5\n\t"
  113178. #elif defined(__clang__)
  113179. "sbcs r6, r5\n\t"
  113180. #else
  113181. "sbc r6, r5\n\t"
  113182. #endif
  113183. "movs r5, r6\n\t"
  113184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113185. "adds r3, r3, r5\n\t"
  113186. #else
  113187. "add r3, r3, r5\n\t"
  113188. #endif
  113189. "movs r6, %[div]\n\t"
  113190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113191. "subs r6, r6, r4\n\t"
  113192. #else
  113193. "sub r6, r6, r4\n\t"
  113194. #endif
  113195. #ifdef WOLFSSL_KEIL
  113196. "sbcs r6, r6, r6\n\t"
  113197. #elif defined(__clang__)
  113198. "sbcs r6, r6\n\t"
  113199. #else
  113200. "sbc r6, r6\n\t"
  113201. #endif
  113202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113203. "subs r3, r3, r6\n\t"
  113204. #else
  113205. "sub r3, r3, r6\n\t"
  113206. #endif
  113207. "movs %[d1], r3\n\t"
  113208. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  113209. :
  113210. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  113211. );
  113212. return (uint32_t)(size_t)d1;
  113213. }
  113214. /* AND m into each word of a and store in r.
  113215. *
  113216. * r A single precision integer.
  113217. * a A single precision integer.
  113218. * m Mask to AND against each digit.
  113219. */
  113220. static void sp_384_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  113221. {
  113222. #ifdef WOLFSSL_SP_SMALL
  113223. int i;
  113224. for (i=0; i<12; i++) {
  113225. r[i] = a[i] & m;
  113226. }
  113227. #else
  113228. r[0] = a[0] & m;
  113229. r[1] = a[1] & m;
  113230. r[2] = a[2] & m;
  113231. r[3] = a[3] & m;
  113232. r[4] = a[4] & m;
  113233. r[5] = a[5] & m;
  113234. r[6] = a[6] & m;
  113235. r[7] = a[7] & m;
  113236. r[8] = a[8] & m;
  113237. r[9] = a[9] & m;
  113238. r[10] = a[10] & m;
  113239. r[11] = a[11] & m;
  113240. #endif
  113241. }
  113242. /* Divide d in a and put remainder into r (m*d + r = a)
  113243. * m is not calculated as it is not needed at this time.
  113244. *
  113245. * a Number to be divided.
  113246. * d Number to divide with.
  113247. * m Multiplier result.
  113248. * r Remainder from the division.
  113249. * returns MP_OKAY indicating success.
  113250. */
  113251. static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d, sp_digit* m,
  113252. sp_digit* r)
  113253. {
  113254. sp_digit t1[24], t2[13];
  113255. sp_digit div, r1;
  113256. int i;
  113257. (void)m;
  113258. div = d[11];
  113259. XMEMCPY(t1, a, sizeof(*t1) * 2 * 12);
  113260. for (i=11; i>=0; i--) {
  113261. sp_digit hi = t1[12 + i] - (t1[12 + i] == div);
  113262. r1 = div_384_word_12(hi, t1[12 + i - 1], div);
  113263. sp_384_mul_d_12(t2, d, r1);
  113264. t1[12 + i] += sp_384_sub_in_place_12(&t1[i], t2);
  113265. t1[12 + i] -= t2[12];
  113266. sp_384_mask_12(t2, d, t1[12 + i]);
  113267. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  113268. sp_384_mask_12(t2, d, t1[12 + i]);
  113269. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  113270. }
  113271. r1 = sp_384_cmp_12(t1, d) >= 0;
  113272. sp_384_cond_sub_12(r, t1, d, (sp_digit)0 - r1);
  113273. return MP_OKAY;
  113274. }
  113275. /* Reduce a modulo m into r. (r = a mod m)
  113276. *
  113277. * r A single precision number that is the reduced result.
  113278. * a A single precision number that is to be reduced.
  113279. * m A single precision number that is the modulus to reduce with.
  113280. * returns MP_OKAY indicating success.
  113281. */
  113282. static WC_INLINE int sp_384_mod_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  113283. {
  113284. return sp_384_div_12(a, m, NULL, r);
  113285. }
  113286. #endif
  113287. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  113288. #ifdef WOLFSSL_SP_SMALL
  113289. /* Order-2 for the P384 curve. */
  113290. static const uint32_t p384_order_minus_2[12] = {
  113291. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U,
  113292. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  113293. };
  113294. #else
  113295. /* The low half of the order-2 of the P384 curve. */
  113296. static const uint32_t p384_order_low[6] = {
  113297. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U
  113298. };
  113299. #endif /* WOLFSSL_SP_SMALL */
  113300. /* Multiply two number mod the order of P384 curve. (r = a * b mod order)
  113301. *
  113302. * r Result of the multiplication.
  113303. * a First operand of the multiplication.
  113304. * b Second operand of the multiplication.
  113305. */
  113306. static void sp_384_mont_mul_order_12(sp_digit* r, const sp_digit* a, const sp_digit* b)
  113307. {
  113308. sp_384_mul_12(r, a, b);
  113309. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  113310. }
  113311. /* Square number mod the order of P384 curve. (r = a * a mod order)
  113312. *
  113313. * r Result of the squaring.
  113314. * a Number to square.
  113315. */
  113316. static void sp_384_mont_sqr_order_12(sp_digit* r, const sp_digit* a)
  113317. {
  113318. sp_384_sqr_12(r, a);
  113319. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  113320. }
  113321. #ifndef WOLFSSL_SP_SMALL
  113322. /* Square number mod the order of P384 curve a number of times.
  113323. * (r = a ^ n mod order)
  113324. *
  113325. * r Result of the squaring.
  113326. * a Number to square.
  113327. */
  113328. static void sp_384_mont_sqr_n_order_12(sp_digit* r, const sp_digit* a, int n)
  113329. {
  113330. int i;
  113331. sp_384_mont_sqr_order_12(r, a);
  113332. for (i=1; i<n; i++) {
  113333. sp_384_mont_sqr_order_12(r, r);
  113334. }
  113335. }
  113336. #endif /* !WOLFSSL_SP_SMALL */
  113337. /* Invert the number, in Montgomery form, modulo the order of the P384 curve.
  113338. * (r = 1 / a mod order)
  113339. *
  113340. * r Inverse result.
  113341. * a Number to invert.
  113342. * td Temporary data.
  113343. */
  113344. #ifdef WOLFSSL_SP_NONBLOCK
  113345. typedef struct sp_384_mont_inv_order_12_ctx {
  113346. int state;
  113347. int i;
  113348. } sp_384_mont_inv_order_12_ctx;
  113349. static int sp_384_mont_inv_order_12_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  113350. sp_digit* t)
  113351. {
  113352. int err = FP_WOULDBLOCK;
  113353. sp_384_mont_inv_order_12_ctx* ctx = (sp_384_mont_inv_order_12_ctx*)sp_ctx;
  113354. typedef char ctx_size_test[sizeof(sp_384_mont_inv_order_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  113355. (void)sizeof(ctx_size_test);
  113356. switch (ctx->state) {
  113357. case 0:
  113358. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  113359. ctx->i = 382;
  113360. ctx->state = 1;
  113361. break;
  113362. case 1:
  113363. sp_384_mont_sqr_order_12(t, t);
  113364. ctx->state = 2;
  113365. break;
  113366. case 2:
  113367. if ((p384_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  113368. sp_384_mont_mul_order_12(t, t, a);
  113369. }
  113370. ctx->i--;
  113371. ctx->state = (ctx->i == 0) ? 3 : 1;
  113372. break;
  113373. case 3:
  113374. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  113375. err = MP_OKAY;
  113376. break;
  113377. }
  113378. return err;
  113379. }
  113380. #endif /* WOLFSSL_SP_NONBLOCK */
  113381. static void sp_384_mont_inv_order_12(sp_digit* r, const sp_digit* a,
  113382. sp_digit* td)
  113383. {
  113384. #ifdef WOLFSSL_SP_SMALL
  113385. sp_digit* t = td;
  113386. int i;
  113387. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  113388. for (i=382; i>=0; i--) {
  113389. sp_384_mont_sqr_order_12(t, t);
  113390. if ((p384_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  113391. sp_384_mont_mul_order_12(t, t, a);
  113392. }
  113393. }
  113394. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  113395. #else
  113396. sp_digit* t = td;
  113397. sp_digit* t2 = td + 2 * 12;
  113398. sp_digit* t3 = td + 4 * 12;
  113399. int i;
  113400. /* t = a^2 */
  113401. sp_384_mont_sqr_order_12(t, a);
  113402. /* t = a^3 = t * a */
  113403. sp_384_mont_mul_order_12(t, t, a);
  113404. /* t2= a^c = t ^ 2 ^ 2 */
  113405. sp_384_mont_sqr_n_order_12(t2, t, 2);
  113406. /* t = a^f = t2 * t */
  113407. sp_384_mont_mul_order_12(t, t2, t);
  113408. /* t2= a^f0 = t ^ 2 ^ 4 */
  113409. sp_384_mont_sqr_n_order_12(t2, t, 4);
  113410. /* t = a^ff = t2 * t */
  113411. sp_384_mont_mul_order_12(t, t2, t);
  113412. /* t2= a^ff00 = t ^ 2 ^ 8 */
  113413. sp_384_mont_sqr_n_order_12(t2, t, 8);
  113414. /* t3= a^ffff = t2 * t */
  113415. sp_384_mont_mul_order_12(t3, t2, t);
  113416. /* t2= a^ffff0000 = t3 ^ 2 ^ 16 */
  113417. sp_384_mont_sqr_n_order_12(t2, t3, 16);
  113418. /* t = a^ffffffff = t2 * t3 */
  113419. sp_384_mont_mul_order_12(t, t2, t3);
  113420. /* t2= a^ffffffff0000 = t ^ 2 ^ 16 */
  113421. sp_384_mont_sqr_n_order_12(t2, t, 16);
  113422. /* t = a^ffffffffffff = t2 * t3 */
  113423. sp_384_mont_mul_order_12(t, t2, t3);
  113424. /* t2= a^ffffffffffff000000000000 = t ^ 2 ^ 48 */
  113425. sp_384_mont_sqr_n_order_12(t2, t, 48);
  113426. /* t= a^fffffffffffffffffffffffff = t2 * t */
  113427. sp_384_mont_mul_order_12(t, t2, t);
  113428. /* t2= a^ffffffffffffffffffffffff000000000000000000000000 */
  113429. sp_384_mont_sqr_n_order_12(t2, t, 96);
  113430. /* t2= a^ffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  113431. sp_384_mont_mul_order_12(t2, t2, t);
  113432. for (i=191; i>=1; i--) {
  113433. sp_384_mont_sqr_order_12(t2, t2);
  113434. if ((p384_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  113435. sp_384_mont_mul_order_12(t2, t2, a);
  113436. }
  113437. }
  113438. sp_384_mont_sqr_order_12(t2, t2);
  113439. sp_384_mont_mul_order_12(r, t2, a);
  113440. #endif /* WOLFSSL_SP_SMALL */
  113441. }
  113442. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  113443. #ifdef HAVE_ECC_SIGN
  113444. #ifndef SP_ECC_MAX_SIG_GEN
  113445. #define SP_ECC_MAX_SIG_GEN 64
  113446. #endif
  113447. /* Calculate second signature value S from R, k and private value.
  113448. *
  113449. * s = (r * x + e) / k
  113450. *
  113451. * s Signature value.
  113452. * r First signature value.
  113453. * k Ephemeral private key.
  113454. * x Private key as a number.
  113455. * e Hash of message as a number.
  113456. * tmp Temporary storage for intermediate numbers.
  113457. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  113458. */
  113459. static int sp_384_calc_s_12(sp_digit* s, const sp_digit* r, sp_digit* k,
  113460. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  113461. {
  113462. int err;
  113463. sp_digit carry;
  113464. sp_int32 c;
  113465. sp_digit* kInv = k;
  113466. /* Conv k to Montgomery form (mod order) */
  113467. sp_384_mul_12(k, k, p384_norm_order);
  113468. err = sp_384_mod_12(k, k, p384_order);
  113469. if (err == MP_OKAY) {
  113470. sp_384_norm_12(k);
  113471. /* kInv = 1/k mod order */
  113472. sp_384_mont_inv_order_12(kInv, k, tmp);
  113473. sp_384_norm_12(kInv);
  113474. /* s = r * x + e */
  113475. sp_384_mul_12(x, x, r);
  113476. err = sp_384_mod_12(x, x, p384_order);
  113477. }
  113478. if (err == MP_OKAY) {
  113479. sp_384_norm_12(x);
  113480. carry = sp_384_add_12(s, e, x);
  113481. sp_384_cond_sub_12(s, s, p384_order, 0 - carry);
  113482. sp_384_norm_12(s);
  113483. c = sp_384_cmp_12(s, p384_order);
  113484. sp_384_cond_sub_12(s, s, p384_order,
  113485. (sp_digit)0 - (sp_digit)(c >= 0));
  113486. sp_384_norm_12(s);
  113487. /* s = s * k^-1 mod order */
  113488. sp_384_mont_mul_order_12(s, s, kInv);
  113489. sp_384_norm_12(s);
  113490. }
  113491. return err;
  113492. }
  113493. /* Sign the hash using the private key.
  113494. * e = [hash, 384 bits] from binary
  113495. * r = (k.G)->x mod order
  113496. * s = (r * x + e) / k mod order
  113497. * The hash is truncated to the first 384 bits.
  113498. *
  113499. * hash Hash to sign.
  113500. * hashLen Length of the hash data.
  113501. * rng Random number generator.
  113502. * priv Private part of key - scalar.
  113503. * rm First part of result as an mp_int.
  113504. * sm Sirst part of result as an mp_int.
  113505. * heap Heap to use for allocation.
  113506. * returns RNG failures, MEMORY_E when memory allocation fails and
  113507. * MP_OKAY on success.
  113508. */
  113509. #ifdef WOLFSSL_SP_NONBLOCK
  113510. typedef struct sp_ecc_sign_384_ctx {
  113511. int state;
  113512. union {
  113513. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  113514. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  113515. };
  113516. sp_digit e[2*12];
  113517. sp_digit x[2*12];
  113518. sp_digit k[2*12];
  113519. sp_digit r[2*12];
  113520. sp_digit tmp[3 * 2*12];
  113521. sp_point_384 point;
  113522. sp_digit* s;
  113523. sp_digit* kInv;
  113524. int i;
  113525. } sp_ecc_sign_384_ctx;
  113526. int sp_ecc_sign_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  113527. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  113528. {
  113529. int err = FP_WOULDBLOCK;
  113530. sp_ecc_sign_384_ctx* ctx = (sp_ecc_sign_384_ctx*)sp_ctx->data;
  113531. typedef char ctx_size_test[sizeof(sp_ecc_sign_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  113532. (void)sizeof(ctx_size_test);
  113533. (void)heap;
  113534. switch (ctx->state) {
  113535. case 0: /* INIT */
  113536. ctx->s = ctx->e;
  113537. ctx->kInv = ctx->k;
  113538. if (hashLen > 48U) {
  113539. hashLen = 48U;
  113540. }
  113541. ctx->i = SP_ECC_MAX_SIG_GEN;
  113542. ctx->state = 1;
  113543. break;
  113544. case 1: /* GEN */
  113545. /* New random point. */
  113546. if (km == NULL || mp_iszero(km)) {
  113547. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  113548. }
  113549. else {
  113550. sp_384_from_mp(ctx->k, 12, km);
  113551. mp_zero(km);
  113552. }
  113553. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  113554. ctx->state = 2;
  113555. break;
  113556. case 2: /* MULMOD */
  113557. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  113558. &ctx->point, &p384_base, ctx->k, 1, 1, heap);
  113559. if (err == MP_OKAY) {
  113560. ctx->state = 3;
  113561. }
  113562. break;
  113563. case 3: /* MODORDER */
  113564. {
  113565. sp_int32 c;
  113566. /* r = point->x mod order */
  113567. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 12U);
  113568. sp_384_norm_12(ctx->r);
  113569. c = sp_384_cmp_12(ctx->r, p384_order);
  113570. sp_384_cond_sub_12(ctx->r, ctx->r, p384_order,
  113571. (sp_digit)0 - (sp_digit)(c >= 0));
  113572. sp_384_norm_12(ctx->r);
  113573. sp_384_from_mp(ctx->x, 12, priv);
  113574. sp_384_from_bin(ctx->e, 12, hash, (int)hashLen);
  113575. ctx->state = 4;
  113576. break;
  113577. }
  113578. case 4: /* KMODORDER */
  113579. /* Conv k to Montgomery form (mod order) */
  113580. sp_384_mul_12(ctx->k, ctx->k, p384_norm_order);
  113581. err = sp_384_mod_12(ctx->k, ctx->k, p384_order);
  113582. if (err == MP_OKAY) {
  113583. sp_384_norm_12(ctx->k);
  113584. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  113585. ctx->state = 5;
  113586. }
  113587. break;
  113588. case 5: /* KINV */
  113589. /* kInv = 1/k mod order */
  113590. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  113591. if (err == MP_OKAY) {
  113592. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  113593. ctx->state = 6;
  113594. }
  113595. break;
  113596. case 6: /* KINVNORM */
  113597. sp_384_norm_12(ctx->kInv);
  113598. ctx->state = 7;
  113599. break;
  113600. case 7: /* R */
  113601. /* s = r * x + e */
  113602. sp_384_mul_12(ctx->x, ctx->x, ctx->r);
  113603. ctx->state = 8;
  113604. break;
  113605. case 8: /* S1 */
  113606. err = sp_384_mod_12(ctx->x, ctx->x, p384_order);
  113607. if (err == MP_OKAY)
  113608. ctx->state = 9;
  113609. break;
  113610. case 9: /* S2 */
  113611. {
  113612. sp_digit carry;
  113613. sp_int32 c;
  113614. sp_384_norm_12(ctx->x);
  113615. carry = sp_384_add_12(ctx->s, ctx->e, ctx->x);
  113616. sp_384_cond_sub_12(ctx->s, ctx->s,
  113617. p384_order, 0 - carry);
  113618. sp_384_norm_12(ctx->s);
  113619. c = sp_384_cmp_12(ctx->s, p384_order);
  113620. sp_384_cond_sub_12(ctx->s, ctx->s, p384_order,
  113621. (sp_digit)0 - (sp_digit)(c >= 0));
  113622. sp_384_norm_12(ctx->s);
  113623. /* s = s * k^-1 mod order */
  113624. sp_384_mont_mul_order_12(ctx->s, ctx->s, ctx->kInv);
  113625. sp_384_norm_12(ctx->s);
  113626. /* Check that signature is usable. */
  113627. if (sp_384_iszero_12(ctx->s) == 0) {
  113628. ctx->state = 10;
  113629. break;
  113630. }
  113631. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  113632. ctx->i = 1;
  113633. #endif
  113634. /* not usable gen, try again */
  113635. ctx->i--;
  113636. if (ctx->i == 0) {
  113637. err = RNG_FAILURE_E;
  113638. }
  113639. ctx->state = 1;
  113640. break;
  113641. }
  113642. case 10: /* RES */
  113643. err = sp_384_to_mp(ctx->r, rm);
  113644. if (err == MP_OKAY) {
  113645. err = sp_384_to_mp(ctx->s, sm);
  113646. }
  113647. break;
  113648. }
  113649. if (err == MP_OKAY && ctx->state != 10) {
  113650. err = FP_WOULDBLOCK;
  113651. }
  113652. if (err != FP_WOULDBLOCK) {
  113653. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 12U);
  113654. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 12U);
  113655. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 12U);
  113656. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 12U);
  113657. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 12U);
  113658. }
  113659. return err;
  113660. }
  113661. #endif /* WOLFSSL_SP_NONBLOCK */
  113662. int sp_ecc_sign_384(const byte* hash, word32 hashLen, WC_RNG* rng,
  113663. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  113664. {
  113665. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113666. sp_digit* e = NULL;
  113667. sp_point_384* point = NULL;
  113668. #else
  113669. sp_digit e[7 * 2 * 12];
  113670. sp_point_384 point[1];
  113671. #endif
  113672. sp_digit* x = NULL;
  113673. sp_digit* k = NULL;
  113674. sp_digit* r = NULL;
  113675. sp_digit* tmp = NULL;
  113676. sp_digit* s = NULL;
  113677. sp_int32 c;
  113678. int err = MP_OKAY;
  113679. int i;
  113680. (void)heap;
  113681. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113682. if (err == MP_OKAY) {
  113683. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  113684. DYNAMIC_TYPE_ECC);
  113685. if (point == NULL)
  113686. err = MEMORY_E;
  113687. }
  113688. if (err == MP_OKAY) {
  113689. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 12, heap,
  113690. DYNAMIC_TYPE_ECC);
  113691. if (e == NULL)
  113692. err = MEMORY_E;
  113693. }
  113694. #endif
  113695. if (err == MP_OKAY) {
  113696. x = e + 2 * 12;
  113697. k = e + 4 * 12;
  113698. r = e + 6 * 12;
  113699. tmp = e + 8 * 12;
  113700. s = e;
  113701. if (hashLen > 48U) {
  113702. hashLen = 48U;
  113703. }
  113704. }
  113705. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  113706. /* New random point. */
  113707. if (km == NULL || mp_iszero(km)) {
  113708. err = sp_384_ecc_gen_k_12(rng, k);
  113709. }
  113710. else {
  113711. sp_384_from_mp(k, 12, km);
  113712. mp_zero(km);
  113713. }
  113714. if (err == MP_OKAY) {
  113715. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, heap);
  113716. }
  113717. if (err == MP_OKAY) {
  113718. /* r = point->x mod order */
  113719. XMEMCPY(r, point->x, sizeof(sp_digit) * 12U);
  113720. sp_384_norm_12(r);
  113721. c = sp_384_cmp_12(r, p384_order);
  113722. sp_384_cond_sub_12(r, r, p384_order,
  113723. (sp_digit)0 - (sp_digit)(c >= 0));
  113724. sp_384_norm_12(r);
  113725. sp_384_from_mp(x, 12, priv);
  113726. sp_384_from_bin(e, 12, hash, (int)hashLen);
  113727. err = sp_384_calc_s_12(s, r, k, x, e, tmp);
  113728. }
  113729. /* Check that signature is usable. */
  113730. if ((err == MP_OKAY) && (sp_384_iszero_12(s) == 0)) {
  113731. break;
  113732. }
  113733. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  113734. i = 1;
  113735. #endif
  113736. }
  113737. if (i == 0) {
  113738. err = RNG_FAILURE_E;
  113739. }
  113740. if (err == MP_OKAY) {
  113741. err = sp_384_to_mp(r, rm);
  113742. }
  113743. if (err == MP_OKAY) {
  113744. err = sp_384_to_mp(s, sm);
  113745. }
  113746. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113747. if (e != NULL)
  113748. #endif
  113749. {
  113750. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 12);
  113751. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113752. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  113753. #endif
  113754. }
  113755. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113756. if (point != NULL)
  113757. #endif
  113758. {
  113759. ForceZero(point, sizeof(sp_point_384));
  113760. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113761. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113762. #endif
  113763. }
  113764. return err;
  113765. }
  113766. #endif /* HAVE_ECC_SIGN */
  113767. #ifndef WOLFSSL_SP_SMALL
  113768. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  113769. *
  113770. * r Result of division by 2.
  113771. * a Number to divide.
  113772. * m Modulus.
  113773. */
  113774. static void sp_384_div2_mod_12(sp_digit* r, const sp_digit* a,
  113775. const sp_digit* m)
  113776. {
  113777. __asm__ __volatile__ (
  113778. "ldr r3, [%[a]]\n\t"
  113779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113780. "lsls r3, r3, #31\n\t"
  113781. #else
  113782. "lsl r3, r3, #31\n\t"
  113783. #endif
  113784. "beq L_sp_384_div2_mod_12_no_add_%=\n\t"
  113785. "ldr r4, [%[a]]\n\t"
  113786. "ldr r5, [%[a], #4]\n\t"
  113787. "ldr r6, [%[m]]\n\t"
  113788. "ldr r7, [%[m], #4]\n\t"
  113789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113790. "adds r4, r4, r6\n\t"
  113791. #else
  113792. "add r4, r4, r6\n\t"
  113793. #endif
  113794. #ifdef WOLFSSL_KEIL
  113795. "adcs r5, r5, r7\n\t"
  113796. #elif defined(__clang__)
  113797. "adcs r5, r7\n\t"
  113798. #else
  113799. "adc r5, r7\n\t"
  113800. #endif
  113801. "str r4, [%[r]]\n\t"
  113802. "str r5, [%[r], #4]\n\t"
  113803. "ldr r4, [%[a], #8]\n\t"
  113804. "ldr r5, [%[a], #12]\n\t"
  113805. "ldr r6, [%[m], #8]\n\t"
  113806. "ldr r7, [%[m], #12]\n\t"
  113807. #ifdef WOLFSSL_KEIL
  113808. "adcs r4, r4, r6\n\t"
  113809. #elif defined(__clang__)
  113810. "adcs r4, r6\n\t"
  113811. #else
  113812. "adc r4, r6\n\t"
  113813. #endif
  113814. #ifdef WOLFSSL_KEIL
  113815. "adcs r5, r5, r7\n\t"
  113816. #elif defined(__clang__)
  113817. "adcs r5, r7\n\t"
  113818. #else
  113819. "adc r5, r7\n\t"
  113820. #endif
  113821. "str r4, [%[r], #8]\n\t"
  113822. "str r5, [%[r], #12]\n\t"
  113823. "ldr r4, [%[a], #16]\n\t"
  113824. "ldr r5, [%[a], #20]\n\t"
  113825. "ldr r6, [%[m], #16]\n\t"
  113826. "ldr r7, [%[m], #20]\n\t"
  113827. #ifdef WOLFSSL_KEIL
  113828. "adcs r4, r4, r6\n\t"
  113829. #elif defined(__clang__)
  113830. "adcs r4, r6\n\t"
  113831. #else
  113832. "adc r4, r6\n\t"
  113833. #endif
  113834. #ifdef WOLFSSL_KEIL
  113835. "adcs r5, r5, r7\n\t"
  113836. #elif defined(__clang__)
  113837. "adcs r5, r7\n\t"
  113838. #else
  113839. "adc r5, r7\n\t"
  113840. #endif
  113841. "str r4, [%[r], #16]\n\t"
  113842. "str r5, [%[r], #20]\n\t"
  113843. "ldr r4, [%[a], #24]\n\t"
  113844. "ldr r5, [%[a], #28]\n\t"
  113845. "ldr r6, [%[m], #24]\n\t"
  113846. "ldr r7, [%[m], #28]\n\t"
  113847. #ifdef WOLFSSL_KEIL
  113848. "adcs r4, r4, r6\n\t"
  113849. #elif defined(__clang__)
  113850. "adcs r4, r6\n\t"
  113851. #else
  113852. "adc r4, r6\n\t"
  113853. #endif
  113854. #ifdef WOLFSSL_KEIL
  113855. "adcs r5, r5, r7\n\t"
  113856. #elif defined(__clang__)
  113857. "adcs r5, r7\n\t"
  113858. #else
  113859. "adc r5, r7\n\t"
  113860. #endif
  113861. "str r4, [%[r], #24]\n\t"
  113862. "str r5, [%[r], #28]\n\t"
  113863. "ldr r4, [%[a], #32]\n\t"
  113864. "ldr r5, [%[a], #36]\n\t"
  113865. "ldr r6, [%[m], #32]\n\t"
  113866. "ldr r7, [%[m], #36]\n\t"
  113867. #ifdef WOLFSSL_KEIL
  113868. "adcs r4, r4, r6\n\t"
  113869. #elif defined(__clang__)
  113870. "adcs r4, r6\n\t"
  113871. #else
  113872. "adc r4, r6\n\t"
  113873. #endif
  113874. #ifdef WOLFSSL_KEIL
  113875. "adcs r5, r5, r7\n\t"
  113876. #elif defined(__clang__)
  113877. "adcs r5, r7\n\t"
  113878. #else
  113879. "adc r5, r7\n\t"
  113880. #endif
  113881. "str r4, [%[r], #32]\n\t"
  113882. "str r5, [%[r], #36]\n\t"
  113883. "ldr r4, [%[a], #40]\n\t"
  113884. "ldr r5, [%[a], #44]\n\t"
  113885. "ldr r6, [%[m], #40]\n\t"
  113886. "ldr r7, [%[m], #44]\n\t"
  113887. #ifdef WOLFSSL_KEIL
  113888. "adcs r4, r4, r6\n\t"
  113889. #elif defined(__clang__)
  113890. "adcs r4, r6\n\t"
  113891. #else
  113892. "adc r4, r6\n\t"
  113893. #endif
  113894. #ifdef WOLFSSL_KEIL
  113895. "adcs r5, r5, r7\n\t"
  113896. #elif defined(__clang__)
  113897. "adcs r5, r7\n\t"
  113898. #else
  113899. "adc r5, r7\n\t"
  113900. #endif
  113901. "str r4, [%[r], #40]\n\t"
  113902. "str r5, [%[r], #44]\n\t"
  113903. "movs r3, #0\n\t"
  113904. #ifdef WOLFSSL_KEIL
  113905. "adcs r3, r3, r3\n\t"
  113906. #elif defined(__clang__)
  113907. "adcs r3, r3\n\t"
  113908. #else
  113909. "adc r3, r3\n\t"
  113910. #endif
  113911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113912. "lsls r3, r3, #31\n\t"
  113913. #else
  113914. "lsl r3, r3, #31\n\t"
  113915. #endif
  113916. "b L_sp_384_div2_mod_12_div2_%=\n\t"
  113917. "\n"
  113918. "L_sp_384_div2_mod_12_no_add_%=:\n\t"
  113919. "ldr r4, [%[a]]\n\t"
  113920. "ldr r5, [%[a], #4]\n\t"
  113921. "str r4, [%[r]]\n\t"
  113922. "str r5, [%[r], #4]\n\t"
  113923. "ldr r4, [%[a], #4]\n\t"
  113924. "ldr r5, [%[a], #8]\n\t"
  113925. "str r4, [%[r], #4]\n\t"
  113926. "str r5, [%[r], #8]\n\t"
  113927. "ldr r4, [%[a], #8]\n\t"
  113928. "ldr r5, [%[a], #12]\n\t"
  113929. "str r4, [%[r], #8]\n\t"
  113930. "str r5, [%[r], #12]\n\t"
  113931. "ldr r4, [%[a], #12]\n\t"
  113932. "ldr r5, [%[a], #16]\n\t"
  113933. "str r4, [%[r], #12]\n\t"
  113934. "str r5, [%[r], #16]\n\t"
  113935. "ldr r4, [%[a], #16]\n\t"
  113936. "ldr r5, [%[a], #20]\n\t"
  113937. "str r4, [%[r], #16]\n\t"
  113938. "str r5, [%[r], #20]\n\t"
  113939. "ldr r4, [%[a], #20]\n\t"
  113940. "ldr r5, [%[a], #24]\n\t"
  113941. "str r4, [%[r], #20]\n\t"
  113942. "str r5, [%[r], #24]\n\t"
  113943. "ldr r4, [%[a], #24]\n\t"
  113944. "ldr r5, [%[a], #28]\n\t"
  113945. "str r4, [%[r], #24]\n\t"
  113946. "str r5, [%[r], #28]\n\t"
  113947. "ldr r4, [%[a], #28]\n\t"
  113948. "ldr r5, [%[a], #32]\n\t"
  113949. "str r4, [%[r], #28]\n\t"
  113950. "str r5, [%[r], #32]\n\t"
  113951. "ldr r4, [%[a], #32]\n\t"
  113952. "ldr r5, [%[a], #36]\n\t"
  113953. "str r4, [%[r], #32]\n\t"
  113954. "str r5, [%[r], #36]\n\t"
  113955. "ldr r4, [%[a], #36]\n\t"
  113956. "ldr r5, [%[a], #40]\n\t"
  113957. "str r4, [%[r], #36]\n\t"
  113958. "str r5, [%[r], #40]\n\t"
  113959. "ldr r4, [%[a], #40]\n\t"
  113960. "ldr r5, [%[a], #44]\n\t"
  113961. "str r4, [%[r], #40]\n\t"
  113962. "str r5, [%[r], #44]\n\t"
  113963. "\n"
  113964. "L_sp_384_div2_mod_12_div2_%=:\n\t"
  113965. "ldr r4, [%[r]]\n\t"
  113966. "ldr r5, [%[r], #4]\n\t"
  113967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113968. "lsrs r4, r4, #1\n\t"
  113969. #else
  113970. "lsr r4, r4, #1\n\t"
  113971. #endif
  113972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113973. "lsls r6, r5, #31\n\t"
  113974. #else
  113975. "lsl r6, r5, #31\n\t"
  113976. #endif
  113977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113978. "lsrs r5, r5, #1\n\t"
  113979. #else
  113980. "lsr r5, r5, #1\n\t"
  113981. #endif
  113982. #ifdef WOLFSSL_KEIL
  113983. "orrs r4, r4, r6\n\t"
  113984. #elif defined(__clang__)
  113985. "orrs r4, r6\n\t"
  113986. #else
  113987. "orr r4, r6\n\t"
  113988. #endif
  113989. "ldr r7, [%[r], #8]\n\t"
  113990. "str r4, [%[r]]\n\t"
  113991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113992. "lsls r6, r7, #31\n\t"
  113993. #else
  113994. "lsl r6, r7, #31\n\t"
  113995. #endif
  113996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113997. "lsrs r7, r7, #1\n\t"
  113998. #else
  113999. "lsr r7, r7, #1\n\t"
  114000. #endif
  114001. #ifdef WOLFSSL_KEIL
  114002. "orrs r5, r5, r6\n\t"
  114003. #elif defined(__clang__)
  114004. "orrs r5, r6\n\t"
  114005. #else
  114006. "orr r5, r6\n\t"
  114007. #endif
  114008. "ldr r4, [%[r], #12]\n\t"
  114009. "str r5, [%[r], #4]\n\t"
  114010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114011. "lsls r6, r4, #31\n\t"
  114012. #else
  114013. "lsl r6, r4, #31\n\t"
  114014. #endif
  114015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114016. "lsrs r4, r4, #1\n\t"
  114017. #else
  114018. "lsr r4, r4, #1\n\t"
  114019. #endif
  114020. #ifdef WOLFSSL_KEIL
  114021. "orrs r7, r7, r6\n\t"
  114022. #elif defined(__clang__)
  114023. "orrs r7, r6\n\t"
  114024. #else
  114025. "orr r7, r6\n\t"
  114026. #endif
  114027. "ldr r5, [%[r], #16]\n\t"
  114028. "str r7, [%[r], #8]\n\t"
  114029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114030. "lsls r6, r5, #31\n\t"
  114031. #else
  114032. "lsl r6, r5, #31\n\t"
  114033. #endif
  114034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114035. "lsrs r5, r5, #1\n\t"
  114036. #else
  114037. "lsr r5, r5, #1\n\t"
  114038. #endif
  114039. #ifdef WOLFSSL_KEIL
  114040. "orrs r4, r4, r6\n\t"
  114041. #elif defined(__clang__)
  114042. "orrs r4, r6\n\t"
  114043. #else
  114044. "orr r4, r6\n\t"
  114045. #endif
  114046. "ldr r7, [%[r], #20]\n\t"
  114047. "str r4, [%[r], #12]\n\t"
  114048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114049. "lsls r6, r7, #31\n\t"
  114050. #else
  114051. "lsl r6, r7, #31\n\t"
  114052. #endif
  114053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114054. "lsrs r7, r7, #1\n\t"
  114055. #else
  114056. "lsr r7, r7, #1\n\t"
  114057. #endif
  114058. #ifdef WOLFSSL_KEIL
  114059. "orrs r5, r5, r6\n\t"
  114060. #elif defined(__clang__)
  114061. "orrs r5, r6\n\t"
  114062. #else
  114063. "orr r5, r6\n\t"
  114064. #endif
  114065. "ldr r4, [%[r], #24]\n\t"
  114066. "str r5, [%[r], #16]\n\t"
  114067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114068. "lsls r6, r4, #31\n\t"
  114069. #else
  114070. "lsl r6, r4, #31\n\t"
  114071. #endif
  114072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114073. "lsrs r4, r4, #1\n\t"
  114074. #else
  114075. "lsr r4, r4, #1\n\t"
  114076. #endif
  114077. #ifdef WOLFSSL_KEIL
  114078. "orrs r7, r7, r6\n\t"
  114079. #elif defined(__clang__)
  114080. "orrs r7, r6\n\t"
  114081. #else
  114082. "orr r7, r6\n\t"
  114083. #endif
  114084. "ldr r5, [%[r], #28]\n\t"
  114085. "str r7, [%[r], #20]\n\t"
  114086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114087. "lsls r6, r5, #31\n\t"
  114088. #else
  114089. "lsl r6, r5, #31\n\t"
  114090. #endif
  114091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114092. "lsrs r5, r5, #1\n\t"
  114093. #else
  114094. "lsr r5, r5, #1\n\t"
  114095. #endif
  114096. #ifdef WOLFSSL_KEIL
  114097. "orrs r4, r4, r6\n\t"
  114098. #elif defined(__clang__)
  114099. "orrs r4, r6\n\t"
  114100. #else
  114101. "orr r4, r6\n\t"
  114102. #endif
  114103. "ldr r7, [%[r], #32]\n\t"
  114104. "str r4, [%[r], #24]\n\t"
  114105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114106. "lsls r6, r7, #31\n\t"
  114107. #else
  114108. "lsl r6, r7, #31\n\t"
  114109. #endif
  114110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114111. "lsrs r7, r7, #1\n\t"
  114112. #else
  114113. "lsr r7, r7, #1\n\t"
  114114. #endif
  114115. #ifdef WOLFSSL_KEIL
  114116. "orrs r5, r5, r6\n\t"
  114117. #elif defined(__clang__)
  114118. "orrs r5, r6\n\t"
  114119. #else
  114120. "orr r5, r6\n\t"
  114121. #endif
  114122. "ldr r4, [%[r], #36]\n\t"
  114123. "str r5, [%[r], #28]\n\t"
  114124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114125. "lsls r6, r4, #31\n\t"
  114126. #else
  114127. "lsl r6, r4, #31\n\t"
  114128. #endif
  114129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114130. "lsrs r4, r4, #1\n\t"
  114131. #else
  114132. "lsr r4, r4, #1\n\t"
  114133. #endif
  114134. #ifdef WOLFSSL_KEIL
  114135. "orrs r7, r7, r6\n\t"
  114136. #elif defined(__clang__)
  114137. "orrs r7, r6\n\t"
  114138. #else
  114139. "orr r7, r6\n\t"
  114140. #endif
  114141. "ldr r5, [%[r], #40]\n\t"
  114142. "str r7, [%[r], #32]\n\t"
  114143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114144. "lsls r6, r5, #31\n\t"
  114145. #else
  114146. "lsl r6, r5, #31\n\t"
  114147. #endif
  114148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114149. "lsrs r5, r5, #1\n\t"
  114150. #else
  114151. "lsr r5, r5, #1\n\t"
  114152. #endif
  114153. #ifdef WOLFSSL_KEIL
  114154. "orrs r4, r4, r6\n\t"
  114155. #elif defined(__clang__)
  114156. "orrs r4, r6\n\t"
  114157. #else
  114158. "orr r4, r6\n\t"
  114159. #endif
  114160. "ldr r7, [%[r], #44]\n\t"
  114161. "str r4, [%[r], #36]\n\t"
  114162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114163. "lsls r6, r7, #31\n\t"
  114164. #else
  114165. "lsl r6, r7, #31\n\t"
  114166. #endif
  114167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114168. "lsrs r7, r7, #1\n\t"
  114169. #else
  114170. "lsr r7, r7, #1\n\t"
  114171. #endif
  114172. #ifdef WOLFSSL_KEIL
  114173. "orrs r5, r5, r6\n\t"
  114174. #elif defined(__clang__)
  114175. "orrs r5, r6\n\t"
  114176. #else
  114177. "orr r5, r6\n\t"
  114178. #endif
  114179. #ifdef WOLFSSL_KEIL
  114180. "orrs r7, r7, r3\n\t"
  114181. #elif defined(__clang__)
  114182. "orrs r7, r3\n\t"
  114183. #else
  114184. "orr r7, r3\n\t"
  114185. #endif
  114186. "str r5, [%[r], #40]\n\t"
  114187. "str r7, [%[r], #44]\n\t"
  114188. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  114189. :
  114190. : "memory", "r3", "r4", "r5", "r6", "r7"
  114191. );
  114192. }
  114193. static int sp_384_num_bits_12(sp_digit* a)
  114194. {
  114195. static const byte sp_num_bits_table[256] = {
  114196. 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  114197. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  114198. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  114199. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  114200. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  114201. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  114202. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  114203. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  114204. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  114205. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  114206. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  114207. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  114208. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  114209. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  114210. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  114211. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  114212. };
  114213. const byte* table = sp_num_bits_table;
  114214. __asm__ __volatile__ (
  114215. "movs r6, #0xff\n\t"
  114216. "ldr r3, [%[a], #44]\n\t"
  114217. "cmp r3, #0\n\t"
  114218. "beq L_sp_384_num_bits_12_11_%=\n\t"
  114219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114220. "lsrs r5, r3, #24\n\t"
  114221. #else
  114222. "lsr r5, r3, #24\n\t"
  114223. #endif
  114224. "cmp r5, #0\n\t"
  114225. "beq L_sp_384_num_bits_12_133_%=\n\t"
  114226. "movs r2, #0xff\n\t"
  114227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114228. "adds r2, r2, #0x79\n\t"
  114229. #else
  114230. "add r2, r2, #0x79\n\t"
  114231. #endif
  114232. "ldrb r4, [%[table], r5]\n\t"
  114233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114234. "adds r2, r2, r4\n\t"
  114235. #else
  114236. "add r2, r2, r4\n\t"
  114237. #endif
  114238. "b L_sp_384_num_bits_12_13_%=\n\t"
  114239. "\n"
  114240. "L_sp_384_num_bits_12_133_%=:\n\t"
  114241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114242. "lsrs r5, r3, #16\n\t"
  114243. #else
  114244. "lsr r5, r3, #16\n\t"
  114245. #endif
  114246. #ifdef WOLFSSL_KEIL
  114247. "ands r5, r5, r6\n\t"
  114248. #elif defined(__clang__)
  114249. "ands r5, r6\n\t"
  114250. #else
  114251. "and r5, r6\n\t"
  114252. #endif
  114253. "cmp r5, #0\n\t"
  114254. "beq L_sp_384_num_bits_12_132_%=\n\t"
  114255. "movs r2, #0xff\n\t"
  114256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114257. "adds r2, r2, #0x71\n\t"
  114258. #else
  114259. "add r2, r2, #0x71\n\t"
  114260. #endif
  114261. "ldrb r4, [%[table], r5]\n\t"
  114262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114263. "adds r2, r2, r4\n\t"
  114264. #else
  114265. "add r2, r2, r4\n\t"
  114266. #endif
  114267. "b L_sp_384_num_bits_12_13_%=\n\t"
  114268. "\n"
  114269. "L_sp_384_num_bits_12_132_%=:\n\t"
  114270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114271. "lsrs r5, r3, #8\n\t"
  114272. #else
  114273. "lsr r5, r3, #8\n\t"
  114274. #endif
  114275. #ifdef WOLFSSL_KEIL
  114276. "ands r5, r5, r6\n\t"
  114277. #elif defined(__clang__)
  114278. "ands r5, r6\n\t"
  114279. #else
  114280. "and r5, r6\n\t"
  114281. #endif
  114282. "cmp r5, #0\n\t"
  114283. "beq L_sp_384_num_bits_12_131_%=\n\t"
  114284. "movs r2, #0xff\n\t"
  114285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114286. "adds r2, r2, #0x69\n\t"
  114287. #else
  114288. "add r2, r2, #0x69\n\t"
  114289. #endif
  114290. "ldrb r4, [%[table], r5]\n\t"
  114291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114292. "adds r2, r2, r4\n\t"
  114293. #else
  114294. "add r2, r2, r4\n\t"
  114295. #endif
  114296. "b L_sp_384_num_bits_12_13_%=\n\t"
  114297. "\n"
  114298. "L_sp_384_num_bits_12_131_%=:\n\t"
  114299. "movs r5, r3\n\t"
  114300. #ifdef WOLFSSL_KEIL
  114301. "ands r5, r5, r6\n\t"
  114302. #elif defined(__clang__)
  114303. "ands r5, r6\n\t"
  114304. #else
  114305. "and r5, r6\n\t"
  114306. #endif
  114307. "cmp r5, #0\n\t"
  114308. "beq L_sp_384_num_bits_12_130_%=\n\t"
  114309. "movs r2, #0xff\n\t"
  114310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114311. "adds r2, r2, #0x61\n\t"
  114312. #else
  114313. "add r2, r2, #0x61\n\t"
  114314. #endif
  114315. "ldrb r4, [%[table], r5]\n\t"
  114316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114317. "adds r2, r2, r4\n\t"
  114318. #else
  114319. "add r2, r2, r4\n\t"
  114320. #endif
  114321. "b L_sp_384_num_bits_12_13_%=\n\t"
  114322. "\n"
  114323. "L_sp_384_num_bits_12_130_%=:\n\t"
  114324. "b L_sp_384_num_bits_12_13_%=\n\t"
  114325. "\n"
  114326. "L_sp_384_num_bits_12_11_%=:\n\t"
  114327. "ldr r3, [%[a], #40]\n\t"
  114328. "cmp r3, #0\n\t"
  114329. "beq L_sp_384_num_bits_12_10_%=\n\t"
  114330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114331. "lsrs r5, r3, #24\n\t"
  114332. #else
  114333. "lsr r5, r3, #24\n\t"
  114334. #endif
  114335. "cmp r5, #0\n\t"
  114336. "beq L_sp_384_num_bits_12_123_%=\n\t"
  114337. "movs r2, #0xff\n\t"
  114338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114339. "adds r2, r2, #0x59\n\t"
  114340. #else
  114341. "add r2, r2, #0x59\n\t"
  114342. #endif
  114343. "ldrb r4, [%[table], r5]\n\t"
  114344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114345. "adds r2, r2, r4\n\t"
  114346. #else
  114347. "add r2, r2, r4\n\t"
  114348. #endif
  114349. "b L_sp_384_num_bits_12_13_%=\n\t"
  114350. "\n"
  114351. "L_sp_384_num_bits_12_123_%=:\n\t"
  114352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114353. "lsrs r5, r3, #16\n\t"
  114354. #else
  114355. "lsr r5, r3, #16\n\t"
  114356. #endif
  114357. #ifdef WOLFSSL_KEIL
  114358. "ands r5, r5, r6\n\t"
  114359. #elif defined(__clang__)
  114360. "ands r5, r6\n\t"
  114361. #else
  114362. "and r5, r6\n\t"
  114363. #endif
  114364. "cmp r5, #0\n\t"
  114365. "beq L_sp_384_num_bits_12_122_%=\n\t"
  114366. "movs r2, #0xff\n\t"
  114367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114368. "adds r2, r2, #0x51\n\t"
  114369. #else
  114370. "add r2, r2, #0x51\n\t"
  114371. #endif
  114372. "ldrb r4, [%[table], r5]\n\t"
  114373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114374. "adds r2, r2, r4\n\t"
  114375. #else
  114376. "add r2, r2, r4\n\t"
  114377. #endif
  114378. "b L_sp_384_num_bits_12_13_%=\n\t"
  114379. "\n"
  114380. "L_sp_384_num_bits_12_122_%=:\n\t"
  114381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114382. "lsrs r5, r3, #8\n\t"
  114383. #else
  114384. "lsr r5, r3, #8\n\t"
  114385. #endif
  114386. #ifdef WOLFSSL_KEIL
  114387. "ands r5, r5, r6\n\t"
  114388. #elif defined(__clang__)
  114389. "ands r5, r6\n\t"
  114390. #else
  114391. "and r5, r6\n\t"
  114392. #endif
  114393. "cmp r5, #0\n\t"
  114394. "beq L_sp_384_num_bits_12_121_%=\n\t"
  114395. "movs r2, #0xff\n\t"
  114396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114397. "adds r2, r2, #0x49\n\t"
  114398. #else
  114399. "add r2, r2, #0x49\n\t"
  114400. #endif
  114401. "ldrb r4, [%[table], r5]\n\t"
  114402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114403. "adds r2, r2, r4\n\t"
  114404. #else
  114405. "add r2, r2, r4\n\t"
  114406. #endif
  114407. "b L_sp_384_num_bits_12_13_%=\n\t"
  114408. "\n"
  114409. "L_sp_384_num_bits_12_121_%=:\n\t"
  114410. "movs r5, r3\n\t"
  114411. #ifdef WOLFSSL_KEIL
  114412. "ands r5, r5, r6\n\t"
  114413. #elif defined(__clang__)
  114414. "ands r5, r6\n\t"
  114415. #else
  114416. "and r5, r6\n\t"
  114417. #endif
  114418. "cmp r5, #0\n\t"
  114419. "beq L_sp_384_num_bits_12_120_%=\n\t"
  114420. "movs r2, #0xff\n\t"
  114421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114422. "adds r2, r2, #0x41\n\t"
  114423. #else
  114424. "add r2, r2, #0x41\n\t"
  114425. #endif
  114426. "ldrb r4, [%[table], r5]\n\t"
  114427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114428. "adds r2, r2, r4\n\t"
  114429. #else
  114430. "add r2, r2, r4\n\t"
  114431. #endif
  114432. "b L_sp_384_num_bits_12_13_%=\n\t"
  114433. "\n"
  114434. "L_sp_384_num_bits_12_120_%=:\n\t"
  114435. "b L_sp_384_num_bits_12_13_%=\n\t"
  114436. "\n"
  114437. "L_sp_384_num_bits_12_10_%=:\n\t"
  114438. "ldr r3, [%[a], #36]\n\t"
  114439. "cmp r3, #0\n\t"
  114440. "beq L_sp_384_num_bits_12_9_%=\n\t"
  114441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114442. "lsrs r5, r3, #24\n\t"
  114443. #else
  114444. "lsr r5, r3, #24\n\t"
  114445. #endif
  114446. "cmp r5, #0\n\t"
  114447. "beq L_sp_384_num_bits_12_113_%=\n\t"
  114448. "movs r2, #0xff\n\t"
  114449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114450. "adds r2, r2, #57\n\t"
  114451. #else
  114452. "add r2, r2, #57\n\t"
  114453. #endif
  114454. "ldrb r4, [%[table], r5]\n\t"
  114455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114456. "adds r2, r2, r4\n\t"
  114457. #else
  114458. "add r2, r2, r4\n\t"
  114459. #endif
  114460. "b L_sp_384_num_bits_12_13_%=\n\t"
  114461. "\n"
  114462. "L_sp_384_num_bits_12_113_%=:\n\t"
  114463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114464. "lsrs r5, r3, #16\n\t"
  114465. #else
  114466. "lsr r5, r3, #16\n\t"
  114467. #endif
  114468. #ifdef WOLFSSL_KEIL
  114469. "ands r5, r5, r6\n\t"
  114470. #elif defined(__clang__)
  114471. "ands r5, r6\n\t"
  114472. #else
  114473. "and r5, r6\n\t"
  114474. #endif
  114475. "cmp r5, #0\n\t"
  114476. "beq L_sp_384_num_bits_12_112_%=\n\t"
  114477. "movs r2, #0xff\n\t"
  114478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114479. "adds r2, r2, #49\n\t"
  114480. #else
  114481. "add r2, r2, #49\n\t"
  114482. #endif
  114483. "ldrb r4, [%[table], r5]\n\t"
  114484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114485. "adds r2, r2, r4\n\t"
  114486. #else
  114487. "add r2, r2, r4\n\t"
  114488. #endif
  114489. "b L_sp_384_num_bits_12_13_%=\n\t"
  114490. "\n"
  114491. "L_sp_384_num_bits_12_112_%=:\n\t"
  114492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114493. "lsrs r5, r3, #8\n\t"
  114494. #else
  114495. "lsr r5, r3, #8\n\t"
  114496. #endif
  114497. #ifdef WOLFSSL_KEIL
  114498. "ands r5, r5, r6\n\t"
  114499. #elif defined(__clang__)
  114500. "ands r5, r6\n\t"
  114501. #else
  114502. "and r5, r6\n\t"
  114503. #endif
  114504. "cmp r5, #0\n\t"
  114505. "beq L_sp_384_num_bits_12_111_%=\n\t"
  114506. "movs r2, #0xff\n\t"
  114507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114508. "adds r2, r2, #41\n\t"
  114509. #else
  114510. "add r2, r2, #41\n\t"
  114511. #endif
  114512. "ldrb r4, [%[table], r5]\n\t"
  114513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114514. "adds r2, r2, r4\n\t"
  114515. #else
  114516. "add r2, r2, r4\n\t"
  114517. #endif
  114518. "b L_sp_384_num_bits_12_13_%=\n\t"
  114519. "\n"
  114520. "L_sp_384_num_bits_12_111_%=:\n\t"
  114521. "movs r5, r3\n\t"
  114522. #ifdef WOLFSSL_KEIL
  114523. "ands r5, r5, r6\n\t"
  114524. #elif defined(__clang__)
  114525. "ands r5, r6\n\t"
  114526. #else
  114527. "and r5, r6\n\t"
  114528. #endif
  114529. "cmp r5, #0\n\t"
  114530. "beq L_sp_384_num_bits_12_110_%=\n\t"
  114531. "movs r2, #0xff\n\t"
  114532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114533. "adds r2, r2, #33\n\t"
  114534. #else
  114535. "add r2, r2, #33\n\t"
  114536. #endif
  114537. "ldrb r4, [%[table], r5]\n\t"
  114538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114539. "adds r2, r2, r4\n\t"
  114540. #else
  114541. "add r2, r2, r4\n\t"
  114542. #endif
  114543. "b L_sp_384_num_bits_12_13_%=\n\t"
  114544. "\n"
  114545. "L_sp_384_num_bits_12_110_%=:\n\t"
  114546. "b L_sp_384_num_bits_12_13_%=\n\t"
  114547. "\n"
  114548. "L_sp_384_num_bits_12_9_%=:\n\t"
  114549. "ldr r3, [%[a], #32]\n\t"
  114550. "cmp r3, #0\n\t"
  114551. "beq L_sp_384_num_bits_12_8_%=\n\t"
  114552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114553. "lsrs r5, r3, #24\n\t"
  114554. #else
  114555. "lsr r5, r3, #24\n\t"
  114556. #endif
  114557. "cmp r5, #0\n\t"
  114558. "beq L_sp_384_num_bits_12_103_%=\n\t"
  114559. "movs r2, #0xff\n\t"
  114560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114561. "adds r2, r2, #25\n\t"
  114562. #else
  114563. "add r2, r2, #25\n\t"
  114564. #endif
  114565. "ldrb r4, [%[table], r5]\n\t"
  114566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114567. "adds r2, r2, r4\n\t"
  114568. #else
  114569. "add r2, r2, r4\n\t"
  114570. #endif
  114571. "b L_sp_384_num_bits_12_13_%=\n\t"
  114572. "\n"
  114573. "L_sp_384_num_bits_12_103_%=:\n\t"
  114574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114575. "lsrs r5, r3, #16\n\t"
  114576. #else
  114577. "lsr r5, r3, #16\n\t"
  114578. #endif
  114579. #ifdef WOLFSSL_KEIL
  114580. "ands r5, r5, r6\n\t"
  114581. #elif defined(__clang__)
  114582. "ands r5, r6\n\t"
  114583. #else
  114584. "and r5, r6\n\t"
  114585. #endif
  114586. "cmp r5, #0\n\t"
  114587. "beq L_sp_384_num_bits_12_102_%=\n\t"
  114588. "movs r2, #0xff\n\t"
  114589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114590. "adds r2, r2, #17\n\t"
  114591. #else
  114592. "add r2, r2, #17\n\t"
  114593. #endif
  114594. "ldrb r4, [%[table], r5]\n\t"
  114595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114596. "adds r2, r2, r4\n\t"
  114597. #else
  114598. "add r2, r2, r4\n\t"
  114599. #endif
  114600. "b L_sp_384_num_bits_12_13_%=\n\t"
  114601. "\n"
  114602. "L_sp_384_num_bits_12_102_%=:\n\t"
  114603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114604. "lsrs r5, r3, #8\n\t"
  114605. #else
  114606. "lsr r5, r3, #8\n\t"
  114607. #endif
  114608. #ifdef WOLFSSL_KEIL
  114609. "ands r5, r5, r6\n\t"
  114610. #elif defined(__clang__)
  114611. "ands r5, r6\n\t"
  114612. #else
  114613. "and r5, r6\n\t"
  114614. #endif
  114615. "cmp r5, #0\n\t"
  114616. "beq L_sp_384_num_bits_12_101_%=\n\t"
  114617. "movs r2, #0xff\n\t"
  114618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114619. "adds r2, r2, #9\n\t"
  114620. #else
  114621. "add r2, r2, #9\n\t"
  114622. #endif
  114623. "ldrb r4, [%[table], r5]\n\t"
  114624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114625. "adds r2, r2, r4\n\t"
  114626. #else
  114627. "add r2, r2, r4\n\t"
  114628. #endif
  114629. "b L_sp_384_num_bits_12_13_%=\n\t"
  114630. "\n"
  114631. "L_sp_384_num_bits_12_101_%=:\n\t"
  114632. "movs r5, r3\n\t"
  114633. #ifdef WOLFSSL_KEIL
  114634. "ands r5, r5, r6\n\t"
  114635. #elif defined(__clang__)
  114636. "ands r5, r6\n\t"
  114637. #else
  114638. "and r5, r6\n\t"
  114639. #endif
  114640. "cmp r5, #0\n\t"
  114641. "beq L_sp_384_num_bits_12_100_%=\n\t"
  114642. "movs r2, #0xff\n\t"
  114643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114644. "adds r2, r2, #1\n\t"
  114645. #else
  114646. "add r2, r2, #1\n\t"
  114647. #endif
  114648. "ldrb r4, [%[table], r5]\n\t"
  114649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114650. "adds r2, r2, r4\n\t"
  114651. #else
  114652. "add r2, r2, r4\n\t"
  114653. #endif
  114654. "b L_sp_384_num_bits_12_13_%=\n\t"
  114655. "\n"
  114656. "L_sp_384_num_bits_12_100_%=:\n\t"
  114657. "b L_sp_384_num_bits_12_13_%=\n\t"
  114658. "\n"
  114659. "L_sp_384_num_bits_12_8_%=:\n\t"
  114660. "ldr r3, [%[a], #28]\n\t"
  114661. "cmp r3, #0\n\t"
  114662. "beq L_sp_384_num_bits_12_7_%=\n\t"
  114663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114664. "lsrs r5, r3, #24\n\t"
  114665. #else
  114666. "lsr r5, r3, #24\n\t"
  114667. #endif
  114668. "cmp r5, #0\n\t"
  114669. "beq L_sp_384_num_bits_12_93_%=\n\t"
  114670. "movs r2, #0xf8\n\t"
  114671. "ldrb r4, [%[table], r5]\n\t"
  114672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114673. "adds r2, r2, r4\n\t"
  114674. #else
  114675. "add r2, r2, r4\n\t"
  114676. #endif
  114677. "b L_sp_384_num_bits_12_13_%=\n\t"
  114678. "\n"
  114679. "L_sp_384_num_bits_12_93_%=:\n\t"
  114680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114681. "lsrs r5, r3, #16\n\t"
  114682. #else
  114683. "lsr r5, r3, #16\n\t"
  114684. #endif
  114685. #ifdef WOLFSSL_KEIL
  114686. "ands r5, r5, r6\n\t"
  114687. #elif defined(__clang__)
  114688. "ands r5, r6\n\t"
  114689. #else
  114690. "and r5, r6\n\t"
  114691. #endif
  114692. "cmp r5, #0\n\t"
  114693. "beq L_sp_384_num_bits_12_92_%=\n\t"
  114694. "movs r2, #0xf0\n\t"
  114695. "ldrb r4, [%[table], r5]\n\t"
  114696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114697. "adds r2, r2, r4\n\t"
  114698. #else
  114699. "add r2, r2, r4\n\t"
  114700. #endif
  114701. "b L_sp_384_num_bits_12_13_%=\n\t"
  114702. "\n"
  114703. "L_sp_384_num_bits_12_92_%=:\n\t"
  114704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114705. "lsrs r5, r3, #8\n\t"
  114706. #else
  114707. "lsr r5, r3, #8\n\t"
  114708. #endif
  114709. #ifdef WOLFSSL_KEIL
  114710. "ands r5, r5, r6\n\t"
  114711. #elif defined(__clang__)
  114712. "ands r5, r6\n\t"
  114713. #else
  114714. "and r5, r6\n\t"
  114715. #endif
  114716. "cmp r5, #0\n\t"
  114717. "beq L_sp_384_num_bits_12_91_%=\n\t"
  114718. "movs r2, #0xe8\n\t"
  114719. "ldrb r4, [%[table], r5]\n\t"
  114720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114721. "adds r2, r2, r4\n\t"
  114722. #else
  114723. "add r2, r2, r4\n\t"
  114724. #endif
  114725. "b L_sp_384_num_bits_12_13_%=\n\t"
  114726. "\n"
  114727. "L_sp_384_num_bits_12_91_%=:\n\t"
  114728. "movs r5, r3\n\t"
  114729. #ifdef WOLFSSL_KEIL
  114730. "ands r5, r5, r6\n\t"
  114731. #elif defined(__clang__)
  114732. "ands r5, r6\n\t"
  114733. #else
  114734. "and r5, r6\n\t"
  114735. #endif
  114736. "cmp r5, #0\n\t"
  114737. "beq L_sp_384_num_bits_12_90_%=\n\t"
  114738. "movs r2, #0xe0\n\t"
  114739. "ldrb r4, [%[table], r5]\n\t"
  114740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114741. "adds r2, r2, r4\n\t"
  114742. #else
  114743. "add r2, r2, r4\n\t"
  114744. #endif
  114745. "b L_sp_384_num_bits_12_13_%=\n\t"
  114746. "\n"
  114747. "L_sp_384_num_bits_12_90_%=:\n\t"
  114748. "b L_sp_384_num_bits_12_13_%=\n\t"
  114749. "\n"
  114750. "L_sp_384_num_bits_12_7_%=:\n\t"
  114751. "ldr r3, [%[a], #24]\n\t"
  114752. "cmp r3, #0\n\t"
  114753. "beq L_sp_384_num_bits_12_6_%=\n\t"
  114754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114755. "lsrs r5, r3, #24\n\t"
  114756. #else
  114757. "lsr r5, r3, #24\n\t"
  114758. #endif
  114759. "cmp r5, #0\n\t"
  114760. "beq L_sp_384_num_bits_12_83_%=\n\t"
  114761. "movs r2, #0xd8\n\t"
  114762. "ldrb r4, [%[table], r5]\n\t"
  114763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114764. "adds r2, r2, r4\n\t"
  114765. #else
  114766. "add r2, r2, r4\n\t"
  114767. #endif
  114768. "b L_sp_384_num_bits_12_13_%=\n\t"
  114769. "\n"
  114770. "L_sp_384_num_bits_12_83_%=:\n\t"
  114771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114772. "lsrs r5, r3, #16\n\t"
  114773. #else
  114774. "lsr r5, r3, #16\n\t"
  114775. #endif
  114776. #ifdef WOLFSSL_KEIL
  114777. "ands r5, r5, r6\n\t"
  114778. #elif defined(__clang__)
  114779. "ands r5, r6\n\t"
  114780. #else
  114781. "and r5, r6\n\t"
  114782. #endif
  114783. "cmp r5, #0\n\t"
  114784. "beq L_sp_384_num_bits_12_82_%=\n\t"
  114785. "movs r2, #0xd0\n\t"
  114786. "ldrb r4, [%[table], r5]\n\t"
  114787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114788. "adds r2, r2, r4\n\t"
  114789. #else
  114790. "add r2, r2, r4\n\t"
  114791. #endif
  114792. "b L_sp_384_num_bits_12_13_%=\n\t"
  114793. "\n"
  114794. "L_sp_384_num_bits_12_82_%=:\n\t"
  114795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114796. "lsrs r5, r3, #8\n\t"
  114797. #else
  114798. "lsr r5, r3, #8\n\t"
  114799. #endif
  114800. #ifdef WOLFSSL_KEIL
  114801. "ands r5, r5, r6\n\t"
  114802. #elif defined(__clang__)
  114803. "ands r5, r6\n\t"
  114804. #else
  114805. "and r5, r6\n\t"
  114806. #endif
  114807. "cmp r5, #0\n\t"
  114808. "beq L_sp_384_num_bits_12_81_%=\n\t"
  114809. "movs r2, #0xc8\n\t"
  114810. "ldrb r4, [%[table], r5]\n\t"
  114811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114812. "adds r2, r2, r4\n\t"
  114813. #else
  114814. "add r2, r2, r4\n\t"
  114815. #endif
  114816. "b L_sp_384_num_bits_12_13_%=\n\t"
  114817. "\n"
  114818. "L_sp_384_num_bits_12_81_%=:\n\t"
  114819. "movs r5, r3\n\t"
  114820. #ifdef WOLFSSL_KEIL
  114821. "ands r5, r5, r6\n\t"
  114822. #elif defined(__clang__)
  114823. "ands r5, r6\n\t"
  114824. #else
  114825. "and r5, r6\n\t"
  114826. #endif
  114827. "cmp r5, #0\n\t"
  114828. "beq L_sp_384_num_bits_12_80_%=\n\t"
  114829. "movs r2, #0xc0\n\t"
  114830. "ldrb r4, [%[table], r5]\n\t"
  114831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114832. "adds r2, r2, r4\n\t"
  114833. #else
  114834. "add r2, r2, r4\n\t"
  114835. #endif
  114836. "b L_sp_384_num_bits_12_13_%=\n\t"
  114837. "\n"
  114838. "L_sp_384_num_bits_12_80_%=:\n\t"
  114839. "b L_sp_384_num_bits_12_13_%=\n\t"
  114840. "\n"
  114841. "L_sp_384_num_bits_12_6_%=:\n\t"
  114842. "ldr r3, [%[a], #20]\n\t"
  114843. "cmp r3, #0\n\t"
  114844. "beq L_sp_384_num_bits_12_5_%=\n\t"
  114845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114846. "lsrs r5, r3, #24\n\t"
  114847. #else
  114848. "lsr r5, r3, #24\n\t"
  114849. #endif
  114850. "cmp r5, #0\n\t"
  114851. "beq L_sp_384_num_bits_12_73_%=\n\t"
  114852. "movs r2, #0xb8\n\t"
  114853. "ldrb r4, [%[table], r5]\n\t"
  114854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114855. "adds r2, r2, r4\n\t"
  114856. #else
  114857. "add r2, r2, r4\n\t"
  114858. #endif
  114859. "b L_sp_384_num_bits_12_13_%=\n\t"
  114860. "\n"
  114861. "L_sp_384_num_bits_12_73_%=:\n\t"
  114862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114863. "lsrs r5, r3, #16\n\t"
  114864. #else
  114865. "lsr r5, r3, #16\n\t"
  114866. #endif
  114867. #ifdef WOLFSSL_KEIL
  114868. "ands r5, r5, r6\n\t"
  114869. #elif defined(__clang__)
  114870. "ands r5, r6\n\t"
  114871. #else
  114872. "and r5, r6\n\t"
  114873. #endif
  114874. "cmp r5, #0\n\t"
  114875. "beq L_sp_384_num_bits_12_72_%=\n\t"
  114876. "movs r2, #0xb0\n\t"
  114877. "ldrb r4, [%[table], r5]\n\t"
  114878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114879. "adds r2, r2, r4\n\t"
  114880. #else
  114881. "add r2, r2, r4\n\t"
  114882. #endif
  114883. "b L_sp_384_num_bits_12_13_%=\n\t"
  114884. "\n"
  114885. "L_sp_384_num_bits_12_72_%=:\n\t"
  114886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114887. "lsrs r5, r3, #8\n\t"
  114888. #else
  114889. "lsr r5, r3, #8\n\t"
  114890. #endif
  114891. #ifdef WOLFSSL_KEIL
  114892. "ands r5, r5, r6\n\t"
  114893. #elif defined(__clang__)
  114894. "ands r5, r6\n\t"
  114895. #else
  114896. "and r5, r6\n\t"
  114897. #endif
  114898. "cmp r5, #0\n\t"
  114899. "beq L_sp_384_num_bits_12_71_%=\n\t"
  114900. "movs r2, #0xa8\n\t"
  114901. "ldrb r4, [%[table], r5]\n\t"
  114902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114903. "adds r2, r2, r4\n\t"
  114904. #else
  114905. "add r2, r2, r4\n\t"
  114906. #endif
  114907. "b L_sp_384_num_bits_12_13_%=\n\t"
  114908. "\n"
  114909. "L_sp_384_num_bits_12_71_%=:\n\t"
  114910. "movs r5, r3\n\t"
  114911. #ifdef WOLFSSL_KEIL
  114912. "ands r5, r5, r6\n\t"
  114913. #elif defined(__clang__)
  114914. "ands r5, r6\n\t"
  114915. #else
  114916. "and r5, r6\n\t"
  114917. #endif
  114918. "cmp r5, #0\n\t"
  114919. "beq L_sp_384_num_bits_12_70_%=\n\t"
  114920. "movs r2, #0xa0\n\t"
  114921. "ldrb r4, [%[table], r5]\n\t"
  114922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114923. "adds r2, r2, r4\n\t"
  114924. #else
  114925. "add r2, r2, r4\n\t"
  114926. #endif
  114927. "b L_sp_384_num_bits_12_13_%=\n\t"
  114928. "\n"
  114929. "L_sp_384_num_bits_12_70_%=:\n\t"
  114930. "b L_sp_384_num_bits_12_13_%=\n\t"
  114931. "\n"
  114932. "L_sp_384_num_bits_12_5_%=:\n\t"
  114933. "ldr r3, [%[a], #16]\n\t"
  114934. "cmp r3, #0\n\t"
  114935. "beq L_sp_384_num_bits_12_4_%=\n\t"
  114936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114937. "lsrs r5, r3, #24\n\t"
  114938. #else
  114939. "lsr r5, r3, #24\n\t"
  114940. #endif
  114941. "cmp r5, #0\n\t"
  114942. "beq L_sp_384_num_bits_12_63_%=\n\t"
  114943. "movs r2, #0x98\n\t"
  114944. "ldrb r4, [%[table], r5]\n\t"
  114945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114946. "adds r2, r2, r4\n\t"
  114947. #else
  114948. "add r2, r2, r4\n\t"
  114949. #endif
  114950. "b L_sp_384_num_bits_12_13_%=\n\t"
  114951. "\n"
  114952. "L_sp_384_num_bits_12_63_%=:\n\t"
  114953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114954. "lsrs r5, r3, #16\n\t"
  114955. #else
  114956. "lsr r5, r3, #16\n\t"
  114957. #endif
  114958. #ifdef WOLFSSL_KEIL
  114959. "ands r5, r5, r6\n\t"
  114960. #elif defined(__clang__)
  114961. "ands r5, r6\n\t"
  114962. #else
  114963. "and r5, r6\n\t"
  114964. #endif
  114965. "cmp r5, #0\n\t"
  114966. "beq L_sp_384_num_bits_12_62_%=\n\t"
  114967. "movs r2, #0x90\n\t"
  114968. "ldrb r4, [%[table], r5]\n\t"
  114969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114970. "adds r2, r2, r4\n\t"
  114971. #else
  114972. "add r2, r2, r4\n\t"
  114973. #endif
  114974. "b L_sp_384_num_bits_12_13_%=\n\t"
  114975. "\n"
  114976. "L_sp_384_num_bits_12_62_%=:\n\t"
  114977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114978. "lsrs r5, r3, #8\n\t"
  114979. #else
  114980. "lsr r5, r3, #8\n\t"
  114981. #endif
  114982. #ifdef WOLFSSL_KEIL
  114983. "ands r5, r5, r6\n\t"
  114984. #elif defined(__clang__)
  114985. "ands r5, r6\n\t"
  114986. #else
  114987. "and r5, r6\n\t"
  114988. #endif
  114989. "cmp r5, #0\n\t"
  114990. "beq L_sp_384_num_bits_12_61_%=\n\t"
  114991. "movs r2, #0x88\n\t"
  114992. "ldrb r4, [%[table], r5]\n\t"
  114993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114994. "adds r2, r2, r4\n\t"
  114995. #else
  114996. "add r2, r2, r4\n\t"
  114997. #endif
  114998. "b L_sp_384_num_bits_12_13_%=\n\t"
  114999. "\n"
  115000. "L_sp_384_num_bits_12_61_%=:\n\t"
  115001. "movs r5, r3\n\t"
  115002. #ifdef WOLFSSL_KEIL
  115003. "ands r5, r5, r6\n\t"
  115004. #elif defined(__clang__)
  115005. "ands r5, r6\n\t"
  115006. #else
  115007. "and r5, r6\n\t"
  115008. #endif
  115009. "cmp r5, #0\n\t"
  115010. "beq L_sp_384_num_bits_12_60_%=\n\t"
  115011. "movs r2, #0x80\n\t"
  115012. "ldrb r4, [%[table], r5]\n\t"
  115013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115014. "adds r2, r2, r4\n\t"
  115015. #else
  115016. "add r2, r2, r4\n\t"
  115017. #endif
  115018. "b L_sp_384_num_bits_12_13_%=\n\t"
  115019. "\n"
  115020. "L_sp_384_num_bits_12_60_%=:\n\t"
  115021. "b L_sp_384_num_bits_12_13_%=\n\t"
  115022. "\n"
  115023. "L_sp_384_num_bits_12_4_%=:\n\t"
  115024. "ldr r3, [%[a], #12]\n\t"
  115025. "cmp r3, #0\n\t"
  115026. "beq L_sp_384_num_bits_12_3_%=\n\t"
  115027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115028. "lsrs r5, r3, #24\n\t"
  115029. #else
  115030. "lsr r5, r3, #24\n\t"
  115031. #endif
  115032. "cmp r5, #0\n\t"
  115033. "beq L_sp_384_num_bits_12_53_%=\n\t"
  115034. "movs r2, #0x78\n\t"
  115035. "ldrb r4, [%[table], r5]\n\t"
  115036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115037. "adds r2, r2, r4\n\t"
  115038. #else
  115039. "add r2, r2, r4\n\t"
  115040. #endif
  115041. "b L_sp_384_num_bits_12_13_%=\n\t"
  115042. "\n"
  115043. "L_sp_384_num_bits_12_53_%=:\n\t"
  115044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115045. "lsrs r5, r3, #16\n\t"
  115046. #else
  115047. "lsr r5, r3, #16\n\t"
  115048. #endif
  115049. #ifdef WOLFSSL_KEIL
  115050. "ands r5, r5, r6\n\t"
  115051. #elif defined(__clang__)
  115052. "ands r5, r6\n\t"
  115053. #else
  115054. "and r5, r6\n\t"
  115055. #endif
  115056. "cmp r5, #0\n\t"
  115057. "beq L_sp_384_num_bits_12_52_%=\n\t"
  115058. "movs r2, #0x70\n\t"
  115059. "ldrb r4, [%[table], r5]\n\t"
  115060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115061. "adds r2, r2, r4\n\t"
  115062. #else
  115063. "add r2, r2, r4\n\t"
  115064. #endif
  115065. "b L_sp_384_num_bits_12_13_%=\n\t"
  115066. "\n"
  115067. "L_sp_384_num_bits_12_52_%=:\n\t"
  115068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115069. "lsrs r5, r3, #8\n\t"
  115070. #else
  115071. "lsr r5, r3, #8\n\t"
  115072. #endif
  115073. #ifdef WOLFSSL_KEIL
  115074. "ands r5, r5, r6\n\t"
  115075. #elif defined(__clang__)
  115076. "ands r5, r6\n\t"
  115077. #else
  115078. "and r5, r6\n\t"
  115079. #endif
  115080. "cmp r5, #0\n\t"
  115081. "beq L_sp_384_num_bits_12_51_%=\n\t"
  115082. "movs r2, #0x68\n\t"
  115083. "ldrb r4, [%[table], r5]\n\t"
  115084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115085. "adds r2, r2, r4\n\t"
  115086. #else
  115087. "add r2, r2, r4\n\t"
  115088. #endif
  115089. "b L_sp_384_num_bits_12_13_%=\n\t"
  115090. "\n"
  115091. "L_sp_384_num_bits_12_51_%=:\n\t"
  115092. "movs r5, r3\n\t"
  115093. #ifdef WOLFSSL_KEIL
  115094. "ands r5, r5, r6\n\t"
  115095. #elif defined(__clang__)
  115096. "ands r5, r6\n\t"
  115097. #else
  115098. "and r5, r6\n\t"
  115099. #endif
  115100. "cmp r5, #0\n\t"
  115101. "beq L_sp_384_num_bits_12_50_%=\n\t"
  115102. "movs r2, #0x60\n\t"
  115103. "ldrb r4, [%[table], r5]\n\t"
  115104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115105. "adds r2, r2, r4\n\t"
  115106. #else
  115107. "add r2, r2, r4\n\t"
  115108. #endif
  115109. "b L_sp_384_num_bits_12_13_%=\n\t"
  115110. "\n"
  115111. "L_sp_384_num_bits_12_50_%=:\n\t"
  115112. "b L_sp_384_num_bits_12_13_%=\n\t"
  115113. "\n"
  115114. "L_sp_384_num_bits_12_3_%=:\n\t"
  115115. "ldr r3, [%[a], #8]\n\t"
  115116. "cmp r3, #0\n\t"
  115117. "beq L_sp_384_num_bits_12_2_%=\n\t"
  115118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115119. "lsrs r5, r3, #24\n\t"
  115120. #else
  115121. "lsr r5, r3, #24\n\t"
  115122. #endif
  115123. "cmp r5, #0\n\t"
  115124. "beq L_sp_384_num_bits_12_43_%=\n\t"
  115125. "movs r2, #0x58\n\t"
  115126. "ldrb r4, [%[table], r5]\n\t"
  115127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115128. "adds r2, r2, r4\n\t"
  115129. #else
  115130. "add r2, r2, r4\n\t"
  115131. #endif
  115132. "b L_sp_384_num_bits_12_13_%=\n\t"
  115133. "\n"
  115134. "L_sp_384_num_bits_12_43_%=:\n\t"
  115135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115136. "lsrs r5, r3, #16\n\t"
  115137. #else
  115138. "lsr r5, r3, #16\n\t"
  115139. #endif
  115140. #ifdef WOLFSSL_KEIL
  115141. "ands r5, r5, r6\n\t"
  115142. #elif defined(__clang__)
  115143. "ands r5, r6\n\t"
  115144. #else
  115145. "and r5, r6\n\t"
  115146. #endif
  115147. "cmp r5, #0\n\t"
  115148. "beq L_sp_384_num_bits_12_42_%=\n\t"
  115149. "movs r2, #0x50\n\t"
  115150. "ldrb r4, [%[table], r5]\n\t"
  115151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115152. "adds r2, r2, r4\n\t"
  115153. #else
  115154. "add r2, r2, r4\n\t"
  115155. #endif
  115156. "b L_sp_384_num_bits_12_13_%=\n\t"
  115157. "\n"
  115158. "L_sp_384_num_bits_12_42_%=:\n\t"
  115159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115160. "lsrs r5, r3, #8\n\t"
  115161. #else
  115162. "lsr r5, r3, #8\n\t"
  115163. #endif
  115164. #ifdef WOLFSSL_KEIL
  115165. "ands r5, r5, r6\n\t"
  115166. #elif defined(__clang__)
  115167. "ands r5, r6\n\t"
  115168. #else
  115169. "and r5, r6\n\t"
  115170. #endif
  115171. "cmp r5, #0\n\t"
  115172. "beq L_sp_384_num_bits_12_41_%=\n\t"
  115173. "movs r2, #0x48\n\t"
  115174. "ldrb r4, [%[table], r5]\n\t"
  115175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115176. "adds r2, r2, r4\n\t"
  115177. #else
  115178. "add r2, r2, r4\n\t"
  115179. #endif
  115180. "b L_sp_384_num_bits_12_13_%=\n\t"
  115181. "\n"
  115182. "L_sp_384_num_bits_12_41_%=:\n\t"
  115183. "movs r5, r3\n\t"
  115184. #ifdef WOLFSSL_KEIL
  115185. "ands r5, r5, r6\n\t"
  115186. #elif defined(__clang__)
  115187. "ands r5, r6\n\t"
  115188. #else
  115189. "and r5, r6\n\t"
  115190. #endif
  115191. "cmp r5, #0\n\t"
  115192. "beq L_sp_384_num_bits_12_40_%=\n\t"
  115193. "movs r2, #0x40\n\t"
  115194. "ldrb r4, [%[table], r5]\n\t"
  115195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115196. "adds r2, r2, r4\n\t"
  115197. #else
  115198. "add r2, r2, r4\n\t"
  115199. #endif
  115200. "b L_sp_384_num_bits_12_13_%=\n\t"
  115201. "\n"
  115202. "L_sp_384_num_bits_12_40_%=:\n\t"
  115203. "b L_sp_384_num_bits_12_13_%=\n\t"
  115204. "\n"
  115205. "L_sp_384_num_bits_12_2_%=:\n\t"
  115206. "ldr r3, [%[a], #4]\n\t"
  115207. "cmp r3, #0\n\t"
  115208. "beq L_sp_384_num_bits_12_1_%=\n\t"
  115209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115210. "lsrs r5, r3, #24\n\t"
  115211. #else
  115212. "lsr r5, r3, #24\n\t"
  115213. #endif
  115214. "cmp r5, #0\n\t"
  115215. "beq L_sp_384_num_bits_12_33_%=\n\t"
  115216. "movs r2, #56\n\t"
  115217. "ldrb r4, [%[table], r5]\n\t"
  115218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115219. "adds r2, r2, r4\n\t"
  115220. #else
  115221. "add r2, r2, r4\n\t"
  115222. #endif
  115223. "b L_sp_384_num_bits_12_13_%=\n\t"
  115224. "\n"
  115225. "L_sp_384_num_bits_12_33_%=:\n\t"
  115226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115227. "lsrs r5, r3, #16\n\t"
  115228. #else
  115229. "lsr r5, r3, #16\n\t"
  115230. #endif
  115231. #ifdef WOLFSSL_KEIL
  115232. "ands r5, r5, r6\n\t"
  115233. #elif defined(__clang__)
  115234. "ands r5, r6\n\t"
  115235. #else
  115236. "and r5, r6\n\t"
  115237. #endif
  115238. "cmp r5, #0\n\t"
  115239. "beq L_sp_384_num_bits_12_32_%=\n\t"
  115240. "movs r2, #48\n\t"
  115241. "ldrb r4, [%[table], r5]\n\t"
  115242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115243. "adds r2, r2, r4\n\t"
  115244. #else
  115245. "add r2, r2, r4\n\t"
  115246. #endif
  115247. "b L_sp_384_num_bits_12_13_%=\n\t"
  115248. "\n"
  115249. "L_sp_384_num_bits_12_32_%=:\n\t"
  115250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115251. "lsrs r5, r3, #8\n\t"
  115252. #else
  115253. "lsr r5, r3, #8\n\t"
  115254. #endif
  115255. #ifdef WOLFSSL_KEIL
  115256. "ands r5, r5, r6\n\t"
  115257. #elif defined(__clang__)
  115258. "ands r5, r6\n\t"
  115259. #else
  115260. "and r5, r6\n\t"
  115261. #endif
  115262. "cmp r5, #0\n\t"
  115263. "beq L_sp_384_num_bits_12_31_%=\n\t"
  115264. "movs r2, #40\n\t"
  115265. "ldrb r4, [%[table], r5]\n\t"
  115266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115267. "adds r2, r2, r4\n\t"
  115268. #else
  115269. "add r2, r2, r4\n\t"
  115270. #endif
  115271. "b L_sp_384_num_bits_12_13_%=\n\t"
  115272. "\n"
  115273. "L_sp_384_num_bits_12_31_%=:\n\t"
  115274. "movs r5, r3\n\t"
  115275. #ifdef WOLFSSL_KEIL
  115276. "ands r5, r5, r6\n\t"
  115277. #elif defined(__clang__)
  115278. "ands r5, r6\n\t"
  115279. #else
  115280. "and r5, r6\n\t"
  115281. #endif
  115282. "cmp r5, #0\n\t"
  115283. "beq L_sp_384_num_bits_12_30_%=\n\t"
  115284. "movs r2, #32\n\t"
  115285. "ldrb r4, [%[table], r5]\n\t"
  115286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115287. "adds r2, r2, r4\n\t"
  115288. #else
  115289. "add r2, r2, r4\n\t"
  115290. #endif
  115291. "b L_sp_384_num_bits_12_13_%=\n\t"
  115292. "\n"
  115293. "L_sp_384_num_bits_12_30_%=:\n\t"
  115294. "b L_sp_384_num_bits_12_13_%=\n\t"
  115295. "\n"
  115296. "L_sp_384_num_bits_12_1_%=:\n\t"
  115297. "ldr r3, [%[a]]\n\t"
  115298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115299. "lsrs r5, r3, #24\n\t"
  115300. #else
  115301. "lsr r5, r3, #24\n\t"
  115302. #endif
  115303. "cmp r5, #0\n\t"
  115304. "beq L_sp_384_num_bits_12_23_%=\n\t"
  115305. "movs r2, #24\n\t"
  115306. "ldrb r4, [%[table], r5]\n\t"
  115307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115308. "adds r2, r2, r4\n\t"
  115309. #else
  115310. "add r2, r2, r4\n\t"
  115311. #endif
  115312. "b L_sp_384_num_bits_12_13_%=\n\t"
  115313. "\n"
  115314. "L_sp_384_num_bits_12_23_%=:\n\t"
  115315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115316. "lsrs r5, r3, #16\n\t"
  115317. #else
  115318. "lsr r5, r3, #16\n\t"
  115319. #endif
  115320. #ifdef WOLFSSL_KEIL
  115321. "ands r5, r5, r6\n\t"
  115322. #elif defined(__clang__)
  115323. "ands r5, r6\n\t"
  115324. #else
  115325. "and r5, r6\n\t"
  115326. #endif
  115327. "cmp r5, #0\n\t"
  115328. "beq L_sp_384_num_bits_12_22_%=\n\t"
  115329. "movs r2, #16\n\t"
  115330. "ldrb r4, [%[table], r5]\n\t"
  115331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115332. "adds r2, r2, r4\n\t"
  115333. #else
  115334. "add r2, r2, r4\n\t"
  115335. #endif
  115336. "b L_sp_384_num_bits_12_13_%=\n\t"
  115337. "\n"
  115338. "L_sp_384_num_bits_12_22_%=:\n\t"
  115339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115340. "lsrs r5, r3, #8\n\t"
  115341. #else
  115342. "lsr r5, r3, #8\n\t"
  115343. #endif
  115344. #ifdef WOLFSSL_KEIL
  115345. "ands r5, r5, r6\n\t"
  115346. #elif defined(__clang__)
  115347. "ands r5, r6\n\t"
  115348. #else
  115349. "and r5, r6\n\t"
  115350. #endif
  115351. "cmp r5, #0\n\t"
  115352. "beq L_sp_384_num_bits_12_21_%=\n\t"
  115353. "movs r2, #8\n\t"
  115354. "ldrb r4, [%[table], r5]\n\t"
  115355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115356. "adds r2, r2, r4\n\t"
  115357. #else
  115358. "add r2, r2, r4\n\t"
  115359. #endif
  115360. "b L_sp_384_num_bits_12_13_%=\n\t"
  115361. "\n"
  115362. "L_sp_384_num_bits_12_21_%=:\n\t"
  115363. "movs r5, r3\n\t"
  115364. #ifdef WOLFSSL_KEIL
  115365. "ands r5, r5, r6\n\t"
  115366. #elif defined(__clang__)
  115367. "ands r5, r6\n\t"
  115368. #else
  115369. "and r5, r6\n\t"
  115370. #endif
  115371. "cmp r5, #0\n\t"
  115372. "beq L_sp_384_num_bits_12_20_%=\n\t"
  115373. "movs r2, #0\n\t"
  115374. "ldrb r4, [%[table], r5]\n\t"
  115375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115376. "adds r2, r2, r4\n\t"
  115377. #else
  115378. "add r2, r2, r4\n\t"
  115379. #endif
  115380. "b L_sp_384_num_bits_12_13_%=\n\t"
  115381. "\n"
  115382. "L_sp_384_num_bits_12_20_%=:\n\t"
  115383. "\n"
  115384. "L_sp_384_num_bits_12_13_%=:\n\t"
  115385. "movs %[a], r2\n\t"
  115386. : [a] "+r" (a), [table] "+r" (table)
  115387. :
  115388. : "memory", "r2", "r3", "r4", "r5", "r6"
  115389. );
  115390. return (uint32_t)(size_t)a;
  115391. }
  115392. /* Non-constant time modular inversion.
  115393. *
  115394. * @param [out] r Resulting number.
  115395. * @param [in] a Number to invert.
  115396. * @param [in] m Modulus.
  115397. * @return MP_OKAY on success.
  115398. */
  115399. static int sp_384_mod_inv_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  115400. {
  115401. sp_digit u[12];
  115402. sp_digit v[12];
  115403. sp_digit b[12];
  115404. sp_digit d[12];
  115405. int ut, vt;
  115406. sp_digit o;
  115407. XMEMCPY(u, m, sizeof(u));
  115408. XMEMCPY(v, a, sizeof(v));
  115409. ut = sp_384_num_bits_12(u);
  115410. vt = sp_384_num_bits_12(v);
  115411. XMEMSET(b, 0, sizeof(b));
  115412. if ((v[0] & 1) == 0) {
  115413. sp_384_rshift1_12(v, v);
  115414. XMEMCPY(d, m, sizeof(u));
  115415. d[0] += 1;
  115416. sp_384_rshift1_12(d, d);
  115417. vt--;
  115418. while ((v[0] & 1) == 0) {
  115419. sp_384_rshift1_12(v, v);
  115420. sp_384_div2_mod_12(d, d, m);
  115421. vt--;
  115422. }
  115423. }
  115424. else {
  115425. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  115426. d[0] = 1;
  115427. }
  115428. while (ut > 1 && vt > 1) {
  115429. if (ut > vt || (ut == vt && sp_384_cmp_12(u, v) >= 0)) {
  115430. sp_384_sub_12(u, u, v);
  115431. o = sp_384_sub_12(b, b, d);
  115432. if (o != 0)
  115433. sp_384_add_12(b, b, m);
  115434. ut = sp_384_num_bits_12(u);
  115435. do {
  115436. sp_384_rshift1_12(u, u);
  115437. sp_384_div2_mod_12(b, b, m);
  115438. ut--;
  115439. }
  115440. while (ut > 0 && (u[0] & 1) == 0);
  115441. }
  115442. else {
  115443. sp_384_sub_12(v, v, u);
  115444. o = sp_384_sub_12(d, d, b);
  115445. if (o != 0)
  115446. sp_384_add_12(d, d, m);
  115447. vt = sp_384_num_bits_12(v);
  115448. do {
  115449. sp_384_rshift1_12(v, v);
  115450. sp_384_div2_mod_12(d, d, m);
  115451. vt--;
  115452. }
  115453. while (vt > 0 && (v[0] & 1) == 0);
  115454. }
  115455. }
  115456. if (ut == 1)
  115457. XMEMCPY(r, b, sizeof(b));
  115458. else
  115459. XMEMCPY(r, d, sizeof(d));
  115460. return MP_OKAY;
  115461. }
  115462. #endif /* WOLFSSL_SP_SMALL */
  115463. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  115464. *
  115465. * p1 First point to add and holds result.
  115466. * p2 Second point to add.
  115467. * tmp Temporary storage for intermediate numbers.
  115468. */
  115469. static void sp_384_add_points_12(sp_point_384* p1, const sp_point_384* p2,
  115470. sp_digit* tmp)
  115471. {
  115472. sp_384_proj_point_add_12(p1, p1, p2, tmp);
  115473. if (sp_384_iszero_12(p1->z)) {
  115474. if (sp_384_iszero_12(p1->x) && sp_384_iszero_12(p1->y)) {
  115475. sp_384_proj_point_dbl_12(p1, p2, tmp);
  115476. }
  115477. else {
  115478. /* Y ordinate is not used from here - don't set. */
  115479. p1->x[0] = 0;
  115480. p1->x[1] = 0;
  115481. p1->x[2] = 0;
  115482. p1->x[3] = 0;
  115483. p1->x[4] = 0;
  115484. p1->x[5] = 0;
  115485. p1->x[6] = 0;
  115486. p1->x[7] = 0;
  115487. p1->x[8] = 0;
  115488. p1->x[9] = 0;
  115489. p1->x[10] = 0;
  115490. p1->x[11] = 0;
  115491. XMEMCPY(p1->z, p384_norm_mod, sizeof(p384_norm_mod));
  115492. }
  115493. }
  115494. }
  115495. /* Calculate the verification point: [e/s]G + [r/s]Q
  115496. *
  115497. * p1 Calculated point.
  115498. * p2 Public point and temporary.
  115499. * s Second part of signature as a number.
  115500. * u1 Temporary number.
  115501. * u2 Temproray number.
  115502. * heap Heap to use for allocation.
  115503. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  115504. */
  115505. static int sp_384_calc_vfy_point_12(sp_point_384* p1, sp_point_384* p2,
  115506. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  115507. {
  115508. int err;
  115509. #ifndef WOLFSSL_SP_SMALL
  115510. err = sp_384_mod_inv_12(s, s, p384_order);
  115511. if (err == MP_OKAY)
  115512. #endif /* !WOLFSSL_SP_SMALL */
  115513. {
  115514. sp_384_mul_12(s, s, p384_norm_order);
  115515. err = sp_384_mod_12(s, s, p384_order);
  115516. }
  115517. if (err == MP_OKAY) {
  115518. sp_384_norm_12(s);
  115519. #ifdef WOLFSSL_SP_SMALL
  115520. {
  115521. sp_384_mont_inv_order_12(s, s, tmp);
  115522. sp_384_mont_mul_order_12(u1, u1, s);
  115523. sp_384_mont_mul_order_12(u2, u2, s);
  115524. }
  115525. #else
  115526. {
  115527. sp_384_mont_mul_order_12(u1, u1, s);
  115528. sp_384_mont_mul_order_12(u2, u2, s);
  115529. }
  115530. #endif /* WOLFSSL_SP_SMALL */
  115531. {
  115532. err = sp_384_ecc_mulmod_base_12(p1, u1, 0, 0, heap);
  115533. }
  115534. }
  115535. if ((err == MP_OKAY) && sp_384_iszero_12(p1->z)) {
  115536. p1->infinity = 1;
  115537. }
  115538. if (err == MP_OKAY) {
  115539. err = sp_384_ecc_mulmod_12(p2, p2, u2, 0, 0, heap);
  115540. }
  115541. if ((err == MP_OKAY) && sp_384_iszero_12(p2->z)) {
  115542. p2->infinity = 1;
  115543. }
  115544. if (err == MP_OKAY) {
  115545. sp_384_add_points_12(p1, p2, tmp);
  115546. }
  115547. return err;
  115548. }
  115549. #ifdef HAVE_ECC_VERIFY
  115550. /* Verify the signature values with the hash and public key.
  115551. * e = Truncate(hash, 384)
  115552. * u1 = e/s mod order
  115553. * u2 = r/s mod order
  115554. * r == (u1.G + u2.Q)->x mod order
  115555. * Optimization: Leave point in projective form.
  115556. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  115557. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  115558. * The hash is truncated to the first 384 bits.
  115559. *
  115560. * hash Hash to sign.
  115561. * hashLen Length of the hash data.
  115562. * rng Random number generator.
  115563. * priv Private part of key - scalar.
  115564. * rm First part of result as an mp_int.
  115565. * sm Sirst part of result as an mp_int.
  115566. * heap Heap to use for allocation.
  115567. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  115568. */
  115569. #ifdef WOLFSSL_SP_NONBLOCK
  115570. typedef struct sp_ecc_verify_384_ctx {
  115571. int state;
  115572. union {
  115573. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  115574. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  115575. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  115576. sp_384_proj_point_add_12_ctx add_ctx;
  115577. };
  115578. sp_digit u1[2*12];
  115579. sp_digit u2[2*12];
  115580. sp_digit s[2*12];
  115581. sp_digit tmp[2*12 * 5];
  115582. sp_point_384 p1;
  115583. sp_point_384 p2;
  115584. } sp_ecc_verify_384_ctx;
  115585. int sp_ecc_verify_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  115586. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  115587. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  115588. {
  115589. int err = FP_WOULDBLOCK;
  115590. sp_ecc_verify_384_ctx* ctx = (sp_ecc_verify_384_ctx*)sp_ctx->data;
  115591. typedef char ctx_size_test[sizeof(sp_ecc_verify_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  115592. (void)sizeof(ctx_size_test);
  115593. switch (ctx->state) {
  115594. case 0: /* INIT */
  115595. if (hashLen > 48U) {
  115596. hashLen = 48U;
  115597. }
  115598. sp_384_from_bin(ctx->u1, 12, hash, (int)hashLen);
  115599. sp_384_from_mp(ctx->u2, 12, rm);
  115600. sp_384_from_mp(ctx->s, 12, sm);
  115601. sp_384_from_mp(ctx->p2.x, 12, pX);
  115602. sp_384_from_mp(ctx->p2.y, 12, pY);
  115603. sp_384_from_mp(ctx->p2.z, 12, pZ);
  115604. ctx->state = 1;
  115605. break;
  115606. case 1: /* NORMS0 */
  115607. sp_384_mul_12(ctx->s, ctx->s, p384_norm_order);
  115608. err = sp_384_mod_12(ctx->s, ctx->s, p384_order);
  115609. if (err == MP_OKAY)
  115610. ctx->state = 2;
  115611. break;
  115612. case 2: /* NORMS1 */
  115613. sp_384_norm_12(ctx->s);
  115614. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  115615. ctx->state = 3;
  115616. break;
  115617. case 3: /* NORMS2 */
  115618. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  115619. if (err == MP_OKAY) {
  115620. ctx->state = 4;
  115621. }
  115622. break;
  115623. case 4: /* NORMS3 */
  115624. sp_384_mont_mul_order_12(ctx->u1, ctx->u1, ctx->s);
  115625. ctx->state = 5;
  115626. break;
  115627. case 5: /* NORMS4 */
  115628. sp_384_mont_mul_order_12(ctx->u2, ctx->u2, ctx->s);
  115629. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  115630. ctx->state = 6;
  115631. break;
  115632. case 6: /* MULBASE */
  115633. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p384_base, ctx->u1, 0, 0, heap);
  115634. if (err == MP_OKAY) {
  115635. if (sp_384_iszero_12(ctx->p1.z)) {
  115636. ctx->p1.infinity = 1;
  115637. }
  115638. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  115639. ctx->state = 7;
  115640. }
  115641. break;
  115642. case 7: /* MULMOD */
  115643. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  115644. if (err == MP_OKAY) {
  115645. if (sp_384_iszero_12(ctx->p2.z)) {
  115646. ctx->p2.infinity = 1;
  115647. }
  115648. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  115649. ctx->state = 8;
  115650. }
  115651. break;
  115652. case 8: /* ADD */
  115653. err = sp_384_proj_point_add_12_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  115654. if (err == MP_OKAY)
  115655. ctx->state = 9;
  115656. break;
  115657. case 9: /* MONT */
  115658. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  115659. /* Reload r and convert to Montgomery form. */
  115660. sp_384_from_mp(ctx->u2, 12, rm);
  115661. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  115662. if (err == MP_OKAY)
  115663. ctx->state = 10;
  115664. break;
  115665. case 10: /* SQR */
  115666. /* u1 = r.z'.z' mod prime */
  115667. sp_384_mont_sqr_12(ctx->p1.z, ctx->p1.z, p384_mod, p384_mp_mod);
  115668. ctx->state = 11;
  115669. break;
  115670. case 11: /* MUL */
  115671. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod, p384_mp_mod);
  115672. ctx->state = 12;
  115673. break;
  115674. case 12: /* RES */
  115675. {
  115676. sp_int32 c = 0;
  115677. err = MP_OKAY; /* math okay, now check result */
  115678. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  115679. if (*res == 0) {
  115680. sp_digit carry;
  115681. /* Reload r and add order. */
  115682. sp_384_from_mp(ctx->u2, 12, rm);
  115683. carry = sp_384_add_12(ctx->u2, ctx->u2, p384_order);
  115684. /* Carry means result is greater than mod and is not valid. */
  115685. if (carry == 0) {
  115686. sp_384_norm_12(ctx->u2);
  115687. /* Compare with mod and if greater or equal then not valid. */
  115688. c = sp_384_cmp_12(ctx->u2, p384_mod);
  115689. }
  115690. }
  115691. if ((*res == 0) && (c < 0)) {
  115692. /* Convert to Montogomery form */
  115693. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  115694. if (err == MP_OKAY) {
  115695. /* u1 = (r + 1*order).z'.z' mod prime */
  115696. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod,
  115697. p384_mp_mod);
  115698. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  115699. }
  115700. }
  115701. break;
  115702. }
  115703. } /* switch */
  115704. if (err == MP_OKAY && ctx->state != 12) {
  115705. err = FP_WOULDBLOCK;
  115706. }
  115707. return err;
  115708. }
  115709. #endif /* WOLFSSL_SP_NONBLOCK */
  115710. int sp_ecc_verify_384(const byte* hash, word32 hashLen, const mp_int* pX,
  115711. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  115712. int* res, void* heap)
  115713. {
  115714. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115715. sp_digit* u1 = NULL;
  115716. sp_point_384* p1 = NULL;
  115717. #else
  115718. sp_digit u1[16 * 12];
  115719. sp_point_384 p1[2];
  115720. #endif
  115721. sp_digit* u2 = NULL;
  115722. sp_digit* s = NULL;
  115723. sp_digit* tmp = NULL;
  115724. sp_point_384* p2 = NULL;
  115725. sp_digit carry;
  115726. sp_int32 c = 0;
  115727. int err = MP_OKAY;
  115728. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115729. if (err == MP_OKAY) {
  115730. p1 = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  115731. DYNAMIC_TYPE_ECC);
  115732. if (p1 == NULL)
  115733. err = MEMORY_E;
  115734. }
  115735. if (err == MP_OKAY) {
  115736. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 12, heap,
  115737. DYNAMIC_TYPE_ECC);
  115738. if (u1 == NULL)
  115739. err = MEMORY_E;
  115740. }
  115741. #endif
  115742. if (err == MP_OKAY) {
  115743. u2 = u1 + 2 * 12;
  115744. s = u1 + 4 * 12;
  115745. tmp = u1 + 6 * 12;
  115746. p2 = p1 + 1;
  115747. if (hashLen > 48U) {
  115748. hashLen = 48U;
  115749. }
  115750. sp_384_from_bin(u1, 12, hash, (int)hashLen);
  115751. sp_384_from_mp(u2, 12, rm);
  115752. sp_384_from_mp(s, 12, sm);
  115753. sp_384_from_mp(p2->x, 12, pX);
  115754. sp_384_from_mp(p2->y, 12, pY);
  115755. sp_384_from_mp(p2->z, 12, pZ);
  115756. err = sp_384_calc_vfy_point_12(p1, p2, s, u1, u2, tmp, heap);
  115757. }
  115758. if (err == MP_OKAY) {
  115759. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  115760. /* Reload r and convert to Montgomery form. */
  115761. sp_384_from_mp(u2, 12, rm);
  115762. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  115763. }
  115764. if (err == MP_OKAY) {
  115765. /* u1 = r.z'.z' mod prime */
  115766. sp_384_mont_sqr_12(p1->z, p1->z, p384_mod, p384_mp_mod);
  115767. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  115768. *res = (int)(sp_384_cmp_12(p1->x, u1) == 0);
  115769. if (*res == 0) {
  115770. /* Reload r and add order. */
  115771. sp_384_from_mp(u2, 12, rm);
  115772. carry = sp_384_add_12(u2, u2, p384_order);
  115773. /* Carry means result is greater than mod and is not valid. */
  115774. if (carry == 0) {
  115775. sp_384_norm_12(u2);
  115776. /* Compare with mod and if greater or equal then not valid. */
  115777. c = sp_384_cmp_12(u2, p384_mod);
  115778. }
  115779. }
  115780. if ((*res == 0) && (c < 0)) {
  115781. /* Convert to Montogomery form */
  115782. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  115783. if (err == MP_OKAY) {
  115784. /* u1 = (r + 1*order).z'.z' mod prime */
  115785. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod,
  115786. p384_mp_mod);
  115787. *res = (sp_384_cmp_12(p1->x, u1) == 0);
  115788. }
  115789. }
  115790. }
  115791. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115792. if (u1 != NULL)
  115793. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  115794. if (p1 != NULL)
  115795. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  115796. #endif
  115797. return err;
  115798. }
  115799. #endif /* HAVE_ECC_VERIFY */
  115800. #ifdef HAVE_ECC_CHECK_KEY
  115801. /* Check that the x and y oridinates are a valid point on the curve.
  115802. *
  115803. * point EC point.
  115804. * heap Heap to use if dynamically allocating.
  115805. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  115806. * not on the curve and MP_OKAY otherwise.
  115807. */
  115808. static int sp_384_ecc_is_point_12(const sp_point_384* point,
  115809. void* heap)
  115810. {
  115811. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115812. sp_digit* t1 = NULL;
  115813. #else
  115814. sp_digit t1[12 * 4];
  115815. #endif
  115816. sp_digit* t2 = NULL;
  115817. int err = MP_OKAY;
  115818. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115819. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12 * 4, heap, DYNAMIC_TYPE_ECC);
  115820. if (t1 == NULL)
  115821. err = MEMORY_E;
  115822. #endif
  115823. (void)heap;
  115824. if (err == MP_OKAY) {
  115825. t2 = t1 + 2 * 12;
  115826. sp_384_sqr_12(t1, point->y);
  115827. (void)sp_384_mod_12(t1, t1, p384_mod);
  115828. sp_384_sqr_12(t2, point->x);
  115829. (void)sp_384_mod_12(t2, t2, p384_mod);
  115830. sp_384_mul_12(t2, t2, point->x);
  115831. (void)sp_384_mod_12(t2, t2, p384_mod);
  115832. (void)sp_384_sub_12(t2, p384_mod, t2);
  115833. sp_384_mont_add_12(t1, t1, t2, p384_mod);
  115834. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  115835. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  115836. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  115837. if (sp_384_cmp_12(t1, p384_b) != 0) {
  115838. err = MP_VAL;
  115839. }
  115840. }
  115841. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115842. if (t1 != NULL)
  115843. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  115844. #endif
  115845. return err;
  115846. }
  115847. /* Check that the x and y oridinates are a valid point on the curve.
  115848. *
  115849. * pX X ordinate of EC point.
  115850. * pY Y ordinate of EC point.
  115851. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  115852. * not on the curve and MP_OKAY otherwise.
  115853. */
  115854. int sp_ecc_is_point_384(const mp_int* pX, const mp_int* pY)
  115855. {
  115856. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115857. sp_point_384* pub = NULL;
  115858. #else
  115859. sp_point_384 pub[1];
  115860. #endif
  115861. const byte one[1] = { 1 };
  115862. int err = MP_OKAY;
  115863. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115864. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  115865. DYNAMIC_TYPE_ECC);
  115866. if (pub == NULL)
  115867. err = MEMORY_E;
  115868. #endif
  115869. if (err == MP_OKAY) {
  115870. sp_384_from_mp(pub->x, 12, pX);
  115871. sp_384_from_mp(pub->y, 12, pY);
  115872. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  115873. err = sp_384_ecc_is_point_12(pub, NULL);
  115874. }
  115875. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115876. if (pub != NULL)
  115877. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  115878. #endif
  115879. return err;
  115880. }
  115881. /* Check that the private scalar generates the EC point (px, py), the point is
  115882. * on the curve and the point has the correct order.
  115883. *
  115884. * pX X ordinate of EC point.
  115885. * pY Y ordinate of EC point.
  115886. * privm Private scalar that generates EC point.
  115887. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  115888. * not on the curve, ECC_INF_E if the point does not have the correct order,
  115889. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  115890. * MP_OKAY otherwise.
  115891. */
  115892. int sp_ecc_check_key_384(const mp_int* pX, const mp_int* pY,
  115893. const mp_int* privm, void* heap)
  115894. {
  115895. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115896. sp_digit* priv = NULL;
  115897. sp_point_384* pub = NULL;
  115898. #else
  115899. sp_digit priv[12];
  115900. sp_point_384 pub[2];
  115901. #endif
  115902. sp_point_384* p = NULL;
  115903. const byte one[1] = { 1 };
  115904. int err = MP_OKAY;
  115905. /* Quick check the lengs of public key ordinates and private key are in
  115906. * range. Proper check later.
  115907. */
  115908. if (((mp_count_bits(pX) > 384) ||
  115909. (mp_count_bits(pY) > 384) ||
  115910. ((privm != NULL) && (mp_count_bits(privm) > 384)))) {
  115911. err = ECC_OUT_OF_RANGE_E;
  115912. }
  115913. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115914. if (err == MP_OKAY) {
  115915. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  115916. DYNAMIC_TYPE_ECC);
  115917. if (pub == NULL)
  115918. err = MEMORY_E;
  115919. }
  115920. if (err == MP_OKAY && privm) {
  115921. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  115922. DYNAMIC_TYPE_ECC);
  115923. if (priv == NULL)
  115924. err = MEMORY_E;
  115925. }
  115926. #endif
  115927. if (err == MP_OKAY) {
  115928. p = pub + 1;
  115929. sp_384_from_mp(pub->x, 12, pX);
  115930. sp_384_from_mp(pub->y, 12, pY);
  115931. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  115932. if (privm)
  115933. sp_384_from_mp(priv, 12, privm);
  115934. /* Check point at infinitiy. */
  115935. if ((sp_384_iszero_12(pub->x) != 0) &&
  115936. (sp_384_iszero_12(pub->y) != 0)) {
  115937. err = ECC_INF_E;
  115938. }
  115939. }
  115940. /* Check range of X and Y */
  115941. if ((err == MP_OKAY) &&
  115942. ((sp_384_cmp_12(pub->x, p384_mod) >= 0) ||
  115943. (sp_384_cmp_12(pub->y, p384_mod) >= 0))) {
  115944. err = ECC_OUT_OF_RANGE_E;
  115945. }
  115946. if (err == MP_OKAY) {
  115947. /* Check point is on curve */
  115948. err = sp_384_ecc_is_point_12(pub, heap);
  115949. }
  115950. if (err == MP_OKAY) {
  115951. /* Point * order = infinity */
  115952. err = sp_384_ecc_mulmod_12(p, pub, p384_order, 1, 1, heap);
  115953. }
  115954. /* Check result is infinity */
  115955. if ((err == MP_OKAY) && ((sp_384_iszero_12(p->x) == 0) ||
  115956. (sp_384_iszero_12(p->y) == 0))) {
  115957. err = ECC_INF_E;
  115958. }
  115959. if (privm) {
  115960. if (err == MP_OKAY) {
  115961. /* Base * private = point */
  115962. err = sp_384_ecc_mulmod_base_12(p, priv, 1, 1, heap);
  115963. }
  115964. /* Check result is public key */
  115965. if ((err == MP_OKAY) &&
  115966. ((sp_384_cmp_12(p->x, pub->x) != 0) ||
  115967. (sp_384_cmp_12(p->y, pub->y) != 0))) {
  115968. err = ECC_PRIV_KEY_E;
  115969. }
  115970. }
  115971. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115972. if (pub != NULL)
  115973. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  115974. if (priv != NULL)
  115975. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  115976. #endif
  115977. return err;
  115978. }
  115979. #endif
  115980. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  115981. /* Add two projective EC points together.
  115982. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  115983. *
  115984. * pX First EC point's X ordinate.
  115985. * pY First EC point's Y ordinate.
  115986. * pZ First EC point's Z ordinate.
  115987. * qX Second EC point's X ordinate.
  115988. * qY Second EC point's Y ordinate.
  115989. * qZ Second EC point's Z ordinate.
  115990. * rX Resultant EC point's X ordinate.
  115991. * rY Resultant EC point's Y ordinate.
  115992. * rZ Resultant EC point's Z ordinate.
  115993. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  115994. */
  115995. int sp_ecc_proj_add_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  115996. mp_int* qX, mp_int* qY, mp_int* qZ,
  115997. mp_int* rX, mp_int* rY, mp_int* rZ)
  115998. {
  115999. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116000. sp_digit* tmp = NULL;
  116001. sp_point_384* p = NULL;
  116002. #else
  116003. sp_digit tmp[2 * 12 * 5];
  116004. sp_point_384 p[2];
  116005. #endif
  116006. sp_point_384* q = NULL;
  116007. int err = MP_OKAY;
  116008. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116009. if (err == MP_OKAY) {
  116010. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, NULL,
  116011. DYNAMIC_TYPE_ECC);
  116012. if (p == NULL)
  116013. err = MEMORY_E;
  116014. }
  116015. if (err == MP_OKAY) {
  116016. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 5, NULL,
  116017. DYNAMIC_TYPE_ECC);
  116018. if (tmp == NULL) {
  116019. err = MEMORY_E;
  116020. }
  116021. }
  116022. #endif
  116023. if (err == MP_OKAY) {
  116024. q = p + 1;
  116025. sp_384_from_mp(p->x, 12, pX);
  116026. sp_384_from_mp(p->y, 12, pY);
  116027. sp_384_from_mp(p->z, 12, pZ);
  116028. sp_384_from_mp(q->x, 12, qX);
  116029. sp_384_from_mp(q->y, 12, qY);
  116030. sp_384_from_mp(q->z, 12, qZ);
  116031. p->infinity = sp_384_iszero_12(p->x) &
  116032. sp_384_iszero_12(p->y);
  116033. q->infinity = sp_384_iszero_12(q->x) &
  116034. sp_384_iszero_12(q->y);
  116035. sp_384_proj_point_add_12(p, p, q, tmp);
  116036. }
  116037. if (err == MP_OKAY) {
  116038. err = sp_384_to_mp(p->x, rX);
  116039. }
  116040. if (err == MP_OKAY) {
  116041. err = sp_384_to_mp(p->y, rY);
  116042. }
  116043. if (err == MP_OKAY) {
  116044. err = sp_384_to_mp(p->z, rZ);
  116045. }
  116046. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116047. if (tmp != NULL)
  116048. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  116049. if (p != NULL)
  116050. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  116051. #endif
  116052. return err;
  116053. }
  116054. /* Double a projective EC point.
  116055. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  116056. *
  116057. * pX EC point's X ordinate.
  116058. * pY EC point's Y ordinate.
  116059. * pZ EC point's Z ordinate.
  116060. * rX Resultant EC point's X ordinate.
  116061. * rY Resultant EC point's Y ordinate.
  116062. * rZ Resultant EC point's Z ordinate.
  116063. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  116064. */
  116065. int sp_ecc_proj_dbl_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  116066. mp_int* rX, mp_int* rY, mp_int* rZ)
  116067. {
  116068. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116069. sp_digit* tmp = NULL;
  116070. sp_point_384* p = NULL;
  116071. #else
  116072. sp_digit tmp[2 * 12 * 2];
  116073. sp_point_384 p[1];
  116074. #endif
  116075. int err = MP_OKAY;
  116076. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116077. if (err == MP_OKAY) {
  116078. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  116079. DYNAMIC_TYPE_ECC);
  116080. if (p == NULL)
  116081. err = MEMORY_E;
  116082. }
  116083. if (err == MP_OKAY) {
  116084. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 2, NULL,
  116085. DYNAMIC_TYPE_ECC);
  116086. if (tmp == NULL)
  116087. err = MEMORY_E;
  116088. }
  116089. #endif
  116090. if (err == MP_OKAY) {
  116091. sp_384_from_mp(p->x, 12, pX);
  116092. sp_384_from_mp(p->y, 12, pY);
  116093. sp_384_from_mp(p->z, 12, pZ);
  116094. p->infinity = sp_384_iszero_12(p->x) &
  116095. sp_384_iszero_12(p->y);
  116096. sp_384_proj_point_dbl_12(p, p, tmp);
  116097. }
  116098. if (err == MP_OKAY) {
  116099. err = sp_384_to_mp(p->x, rX);
  116100. }
  116101. if (err == MP_OKAY) {
  116102. err = sp_384_to_mp(p->y, rY);
  116103. }
  116104. if (err == MP_OKAY) {
  116105. err = sp_384_to_mp(p->z, rZ);
  116106. }
  116107. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116108. if (tmp != NULL)
  116109. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  116110. if (p != NULL)
  116111. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  116112. #endif
  116113. return err;
  116114. }
  116115. /* Map a projective EC point to affine in place.
  116116. * pZ will be one.
  116117. *
  116118. * pX EC point's X ordinate.
  116119. * pY EC point's Y ordinate.
  116120. * pZ EC point's Z ordinate.
  116121. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  116122. */
  116123. int sp_ecc_map_384(mp_int* pX, mp_int* pY, mp_int* pZ)
  116124. {
  116125. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116126. sp_digit* tmp = NULL;
  116127. sp_point_384* p = NULL;
  116128. #else
  116129. sp_digit tmp[2 * 12 * 6];
  116130. sp_point_384 p[1];
  116131. #endif
  116132. int err = MP_OKAY;
  116133. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116134. if (err == MP_OKAY) {
  116135. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  116136. DYNAMIC_TYPE_ECC);
  116137. if (p == NULL)
  116138. err = MEMORY_E;
  116139. }
  116140. if (err == MP_OKAY) {
  116141. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  116142. DYNAMIC_TYPE_ECC);
  116143. if (tmp == NULL)
  116144. err = MEMORY_E;
  116145. }
  116146. #endif
  116147. if (err == MP_OKAY) {
  116148. sp_384_from_mp(p->x, 12, pX);
  116149. sp_384_from_mp(p->y, 12, pY);
  116150. sp_384_from_mp(p->z, 12, pZ);
  116151. p->infinity = sp_384_iszero_12(p->x) &
  116152. sp_384_iszero_12(p->y);
  116153. sp_384_map_12(p, p, tmp);
  116154. }
  116155. if (err == MP_OKAY) {
  116156. err = sp_384_to_mp(p->x, pX);
  116157. }
  116158. if (err == MP_OKAY) {
  116159. err = sp_384_to_mp(p->y, pY);
  116160. }
  116161. if (err == MP_OKAY) {
  116162. err = sp_384_to_mp(p->z, pZ);
  116163. }
  116164. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116165. if (tmp != NULL)
  116166. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  116167. if (p != NULL)
  116168. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  116169. #endif
  116170. return err;
  116171. }
  116172. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  116173. #ifdef HAVE_COMP_KEY
  116174. /* Find the square root of a number mod the prime of the curve.
  116175. *
  116176. * y The number to operate on and the result.
  116177. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  116178. */
  116179. static int sp_384_mont_sqrt_12(sp_digit* y)
  116180. {
  116181. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116182. sp_digit* t1 = NULL;
  116183. #else
  116184. sp_digit t1[5 * 2 * 12];
  116185. #endif
  116186. sp_digit* t2 = NULL;
  116187. sp_digit* t3 = NULL;
  116188. sp_digit* t4 = NULL;
  116189. sp_digit* t5 = NULL;
  116190. int err = MP_OKAY;
  116191. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116192. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 5 * 2 * 12, NULL, DYNAMIC_TYPE_ECC);
  116193. if (t1 == NULL)
  116194. err = MEMORY_E;
  116195. #endif
  116196. if (err == MP_OKAY) {
  116197. t2 = t1 + 2 * 12;
  116198. t3 = t1 + 4 * 12;
  116199. t4 = t1 + 6 * 12;
  116200. t5 = t1 + 8 * 12;
  116201. {
  116202. /* t2 = y ^ 0x2 */
  116203. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  116204. /* t1 = y ^ 0x3 */
  116205. sp_384_mont_mul_12(t1, t2, y, p384_mod, p384_mp_mod);
  116206. /* t5 = y ^ 0xc */
  116207. sp_384_mont_sqr_n_12(t5, t1, 2, p384_mod, p384_mp_mod);
  116208. /* t1 = y ^ 0xf */
  116209. sp_384_mont_mul_12(t1, t1, t5, p384_mod, p384_mp_mod);
  116210. /* t2 = y ^ 0x1e */
  116211. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  116212. /* t3 = y ^ 0x1f */
  116213. sp_384_mont_mul_12(t3, t2, y, p384_mod, p384_mp_mod);
  116214. /* t2 = y ^ 0x3e0 */
  116215. sp_384_mont_sqr_n_12(t2, t3, 5, p384_mod, p384_mp_mod);
  116216. /* t1 = y ^ 0x3ff */
  116217. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  116218. /* t2 = y ^ 0x7fe0 */
  116219. sp_384_mont_sqr_n_12(t2, t1, 5, p384_mod, p384_mp_mod);
  116220. /* t3 = y ^ 0x7fff */
  116221. sp_384_mont_mul_12(t3, t3, t2, p384_mod, p384_mp_mod);
  116222. /* t2 = y ^ 0x3fff800 */
  116223. sp_384_mont_sqr_n_12(t2, t3, 15, p384_mod, p384_mp_mod);
  116224. /* t4 = y ^ 0x3ffffff */
  116225. sp_384_mont_mul_12(t4, t3, t2, p384_mod, p384_mp_mod);
  116226. /* t2 = y ^ 0xffffffc000000 */
  116227. sp_384_mont_sqr_n_12(t2, t4, 30, p384_mod, p384_mp_mod);
  116228. /* t1 = y ^ 0xfffffffffffff */
  116229. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  116230. /* t2 = y ^ 0xfffffffffffffff000000000000000 */
  116231. sp_384_mont_sqr_n_12(t2, t1, 60, p384_mod, p384_mp_mod);
  116232. /* t1 = y ^ 0xffffffffffffffffffffffffffffff */
  116233. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  116234. /* t2 = y ^ 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  116235. sp_384_mont_sqr_n_12(t2, t1, 120, p384_mod, p384_mp_mod);
  116236. /* t1 = y ^ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  116237. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  116238. /* t2 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  116239. sp_384_mont_sqr_n_12(t2, t1, 15, p384_mod, p384_mp_mod);
  116240. /* t1 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  116241. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  116242. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000 */
  116243. sp_384_mont_sqr_n_12(t2, t1, 31, p384_mod, p384_mp_mod);
  116244. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff */
  116245. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  116246. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff0 */
  116247. sp_384_mont_sqr_n_12(t2, t1, 4, p384_mod, p384_mp_mod);
  116248. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc */
  116249. sp_384_mont_mul_12(t1, t5, t2, p384_mod, p384_mp_mod);
  116250. /* t2 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000 */
  116251. sp_384_mont_sqr_n_12(t2, t1, 62, p384_mod, p384_mp_mod);
  116252. /* t1 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001 */
  116253. sp_384_mont_mul_12(t1, y, t2, p384_mod, p384_mp_mod);
  116254. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000040000000 */
  116255. sp_384_mont_sqr_n_12(y, t1, 30, p384_mod, p384_mp_mod);
  116256. }
  116257. }
  116258. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116259. if (t1 != NULL)
  116260. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  116261. #endif
  116262. return err;
  116263. }
  116264. /* Uncompress the point given the X ordinate.
  116265. *
  116266. * xm X ordinate.
  116267. * odd Whether the Y ordinate is odd.
  116268. * ym Calculated Y ordinate.
  116269. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  116270. */
  116271. int sp_ecc_uncompress_384(mp_int* xm, int odd, mp_int* ym)
  116272. {
  116273. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116274. sp_digit* x = NULL;
  116275. #else
  116276. sp_digit x[4 * 12];
  116277. #endif
  116278. sp_digit* y = NULL;
  116279. int err = MP_OKAY;
  116280. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116281. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 12, NULL, DYNAMIC_TYPE_ECC);
  116282. if (x == NULL)
  116283. err = MEMORY_E;
  116284. #endif
  116285. if (err == MP_OKAY) {
  116286. y = x + 2 * 12;
  116287. sp_384_from_mp(x, 12, xm);
  116288. err = sp_384_mod_mul_norm_12(x, x, p384_mod);
  116289. }
  116290. if (err == MP_OKAY) {
  116291. /* y = x^3 */
  116292. {
  116293. sp_384_mont_sqr_12(y, x, p384_mod, p384_mp_mod);
  116294. sp_384_mont_mul_12(y, y, x, p384_mod, p384_mp_mod);
  116295. }
  116296. /* y = x^3 - 3x */
  116297. sp_384_mont_sub_12(y, y, x, p384_mod);
  116298. sp_384_mont_sub_12(y, y, x, p384_mod);
  116299. sp_384_mont_sub_12(y, y, x, p384_mod);
  116300. /* y = x^3 - 3x + b */
  116301. err = sp_384_mod_mul_norm_12(x, p384_b, p384_mod);
  116302. }
  116303. if (err == MP_OKAY) {
  116304. sp_384_mont_add_12(y, y, x, p384_mod);
  116305. /* y = sqrt(x^3 - 3x + b) */
  116306. err = sp_384_mont_sqrt_12(y);
  116307. }
  116308. if (err == MP_OKAY) {
  116309. XMEMSET(y + 12, 0, 12U * sizeof(sp_digit));
  116310. sp_384_mont_reduce_12(y, p384_mod, p384_mp_mod);
  116311. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  116312. sp_384_mont_sub_12(y, p384_mod, y, p384_mod);
  116313. }
  116314. err = sp_384_to_mp(y, ym);
  116315. }
  116316. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116317. if (x != NULL)
  116318. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  116319. #endif
  116320. return err;
  116321. }
  116322. #endif
  116323. #endif /* WOLFSSL_SP_384 */
  116324. #ifdef WOLFSSL_SP_1024
  116325. /* Point structure to use. */
  116326. typedef struct sp_point_1024 {
  116327. /* X ordinate of point. */
  116328. sp_digit x[2 * 32];
  116329. /* Y ordinate of point. */
  116330. sp_digit y[2 * 32];
  116331. /* Z ordinate of point. */
  116332. sp_digit z[2 * 32];
  116333. /* Indicates point is at infinity. */
  116334. int infinity;
  116335. } sp_point_1024;
  116336. #ifndef WOLFSSL_SP_SMALL
  116337. #ifndef WOLFSSL_SP_LARGE_CODE
  116338. /* Multiply a and b into r. (r = a * b)
  116339. *
  116340. * r A single precision integer.
  116341. * a A single precision integer.
  116342. * b A single precision integer.
  116343. */
  116344. SP_NOINLINE static void sp_1024_mul_16(sp_digit* r, const sp_digit* a,
  116345. const sp_digit* b)
  116346. {
  116347. sp_digit t[16 * 2];
  116348. sp_digit* tmp = t;
  116349. __asm__ __volatile__ (
  116350. "movs r3, #0\n\t"
  116351. "movs r4, #0\n\t"
  116352. "mov r8, r3\n\t"
  116353. "mov r11, %[tmp]\n\t"
  116354. "mov r9, %[a]\n\t"
  116355. "mov r10, %[b]\n\t"
  116356. "movs r6, #0x40\n\t"
  116357. "add r6, r6, r9\n\t"
  116358. "mov r12, r6\n\t"
  116359. "\n"
  116360. "L_sp_1024_mul_16_words_%=:\n\t"
  116361. "movs %[tmp], #0\n\t"
  116362. "movs r5, #0\n\t"
  116363. "movs r6, #60\n\t"
  116364. "mov %[a], r8\n\t"
  116365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116366. "subs %[a], %[a], r6\n\t"
  116367. #else
  116368. "sub %[a], %[a], r6\n\t"
  116369. #endif
  116370. #ifdef WOLFSSL_KEIL
  116371. "sbcs r6, r6, r6\n\t"
  116372. #elif defined(__clang__)
  116373. "sbcs r6, r6\n\t"
  116374. #else
  116375. "sbc r6, r6\n\t"
  116376. #endif
  116377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116378. "mvns r6, r6\n\t"
  116379. #else
  116380. "mvn r6, r6\n\t"
  116381. #endif
  116382. #ifdef WOLFSSL_KEIL
  116383. "ands %[a], %[a], r6\n\t"
  116384. #elif defined(__clang__)
  116385. "ands %[a], r6\n\t"
  116386. #else
  116387. "and %[a], r6\n\t"
  116388. #endif
  116389. "mov %[b], r8\n\t"
  116390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116391. "subs %[b], %[b], %[a]\n\t"
  116392. #else
  116393. "sub %[b], %[b], %[a]\n\t"
  116394. #endif
  116395. "add %[a], %[a], r9\n\t"
  116396. "add %[b], %[b], r10\n\t"
  116397. "\n"
  116398. "L_sp_1024_mul_16_mul_%=:\n\t"
  116399. "# Multiply Start\n\t"
  116400. "ldrh r6, [%[a]]\n\t"
  116401. "ldrh r7, [%[b]]\n\t"
  116402. #ifdef WOLFSSL_KEIL
  116403. "muls r7, r6, r7\n\t"
  116404. #elif defined(__clang__)
  116405. "muls r7, r6\n\t"
  116406. #else
  116407. "mul r7, r6\n\t"
  116408. #endif
  116409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116410. "adds r3, r3, r7\n\t"
  116411. #else
  116412. "add r3, r3, r7\n\t"
  116413. #endif
  116414. #ifdef WOLFSSL_KEIL
  116415. "adcs r4, r4, %[tmp]\n\t"
  116416. #elif defined(__clang__)
  116417. "adcs r4, %[tmp]\n\t"
  116418. #else
  116419. "adc r4, %[tmp]\n\t"
  116420. #endif
  116421. #ifdef WOLFSSL_KEIL
  116422. "adcs r5, r5, %[tmp]\n\t"
  116423. #elif defined(__clang__)
  116424. "adcs r5, %[tmp]\n\t"
  116425. #else
  116426. "adc r5, %[tmp]\n\t"
  116427. #endif
  116428. "ldr r7, [%[b]]\n\t"
  116429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116430. "lsrs r7, r7, #16\n\t"
  116431. #else
  116432. "lsr r7, r7, #16\n\t"
  116433. #endif
  116434. #ifdef WOLFSSL_KEIL
  116435. "muls r6, r7, r6\n\t"
  116436. #elif defined(__clang__)
  116437. "muls r6, r7\n\t"
  116438. #else
  116439. "mul r6, r7\n\t"
  116440. #endif
  116441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116442. "lsrs r7, r6, #16\n\t"
  116443. #else
  116444. "lsr r7, r6, #16\n\t"
  116445. #endif
  116446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116447. "lsls r6, r6, #16\n\t"
  116448. #else
  116449. "lsl r6, r6, #16\n\t"
  116450. #endif
  116451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116452. "adds r3, r3, r6\n\t"
  116453. #else
  116454. "add r3, r3, r6\n\t"
  116455. #endif
  116456. #ifdef WOLFSSL_KEIL
  116457. "adcs r4, r4, r7\n\t"
  116458. #elif defined(__clang__)
  116459. "adcs r4, r7\n\t"
  116460. #else
  116461. "adc r4, r7\n\t"
  116462. #endif
  116463. #ifdef WOLFSSL_KEIL
  116464. "adcs r5, r5, %[tmp]\n\t"
  116465. #elif defined(__clang__)
  116466. "adcs r5, %[tmp]\n\t"
  116467. #else
  116468. "adc r5, %[tmp]\n\t"
  116469. #endif
  116470. "ldr r6, [%[a]]\n\t"
  116471. "ldr r7, [%[b]]\n\t"
  116472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116473. "lsrs r6, r6, #16\n\t"
  116474. #else
  116475. "lsr r6, r6, #16\n\t"
  116476. #endif
  116477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116478. "lsrs r7, r7, #16\n\t"
  116479. #else
  116480. "lsr r7, r7, #16\n\t"
  116481. #endif
  116482. #ifdef WOLFSSL_KEIL
  116483. "muls r7, r6, r7\n\t"
  116484. #elif defined(__clang__)
  116485. "muls r7, r6\n\t"
  116486. #else
  116487. "mul r7, r6\n\t"
  116488. #endif
  116489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116490. "adds r4, r4, r7\n\t"
  116491. #else
  116492. "add r4, r4, r7\n\t"
  116493. #endif
  116494. #ifdef WOLFSSL_KEIL
  116495. "adcs r5, r5, %[tmp]\n\t"
  116496. #elif defined(__clang__)
  116497. "adcs r5, %[tmp]\n\t"
  116498. #else
  116499. "adc r5, %[tmp]\n\t"
  116500. #endif
  116501. "ldrh r7, [%[b]]\n\t"
  116502. #ifdef WOLFSSL_KEIL
  116503. "muls r6, r7, r6\n\t"
  116504. #elif defined(__clang__)
  116505. "muls r6, r7\n\t"
  116506. #else
  116507. "mul r6, r7\n\t"
  116508. #endif
  116509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116510. "lsrs r7, r6, #16\n\t"
  116511. #else
  116512. "lsr r7, r6, #16\n\t"
  116513. #endif
  116514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116515. "lsls r6, r6, #16\n\t"
  116516. #else
  116517. "lsl r6, r6, #16\n\t"
  116518. #endif
  116519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116520. "adds r3, r3, r6\n\t"
  116521. #else
  116522. "add r3, r3, r6\n\t"
  116523. #endif
  116524. #ifdef WOLFSSL_KEIL
  116525. "adcs r4, r4, r7\n\t"
  116526. #elif defined(__clang__)
  116527. "adcs r4, r7\n\t"
  116528. #else
  116529. "adc r4, r7\n\t"
  116530. #endif
  116531. #ifdef WOLFSSL_KEIL
  116532. "adcs r5, r5, %[tmp]\n\t"
  116533. #elif defined(__clang__)
  116534. "adcs r5, %[tmp]\n\t"
  116535. #else
  116536. "adc r5, %[tmp]\n\t"
  116537. #endif
  116538. "# Multiply Done\n\t"
  116539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116540. "adds %[a], %[a], #4\n\t"
  116541. #else
  116542. "add %[a], %[a], #4\n\t"
  116543. #endif
  116544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116545. "subs %[b], %[b], #4\n\t"
  116546. #else
  116547. "sub %[b], %[b], #4\n\t"
  116548. #endif
  116549. "cmp %[a], r12\n\t"
  116550. "beq L_sp_1024_mul_16_done_mul_%=\n\t"
  116551. "mov r6, r8\n\t"
  116552. "add r6, r6, r9\n\t"
  116553. "cmp %[a], r6\n\t"
  116554. "ble L_sp_1024_mul_16_mul_%=\n\t"
  116555. "\n"
  116556. "L_sp_1024_mul_16_done_mul_%=:\n\t"
  116557. "mov %[tmp], r11\n\t"
  116558. "mov r7, r8\n\t"
  116559. "str r3, [%[tmp], r7]\n\t"
  116560. "movs r3, r4\n\t"
  116561. "movs r4, r5\n\t"
  116562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116563. "adds r7, r7, #4\n\t"
  116564. #else
  116565. "add r7, r7, #4\n\t"
  116566. #endif
  116567. "mov r8, r7\n\t"
  116568. "movs r6, #0x78\n\t"
  116569. "cmp r7, r6\n\t"
  116570. "ble L_sp_1024_mul_16_words_%=\n\t"
  116571. "str r3, [%[tmp], r7]\n\t"
  116572. "mov %[a], r9\n\t"
  116573. "mov %[b], r10\n\t"
  116574. : [a] "+r" (a), [b] "+r" (b), [tmp] "+r" (tmp)
  116575. :
  116576. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  116577. );
  116578. XMEMCPY(r, t, sizeof(t));
  116579. }
  116580. #else
  116581. /* Multiply a and b into r. (r = a * b)
  116582. *
  116583. * r A single precision integer.
  116584. * a A single precision integer.
  116585. * b A single precision integer.
  116586. */
  116587. SP_NOINLINE static void sp_1024_mul_16(sp_digit* r, const sp_digit* a,
  116588. const sp_digit* b)
  116589. {
  116590. __asm__ __volatile__ (
  116591. "sub sp, sp, #0x40\n\t"
  116592. "mov r8, %[r]\n\t"
  116593. "mov r9, %[a]\n\t"
  116594. "mov r10, %[b]\n\t"
  116595. "movs %[r], #0\n\t"
  116596. "# A[0] * B[0]\n\t"
  116597. "ldr %[a], [%[a]]\n\t"
  116598. "ldr %[b], [%[b]]\n\t"
  116599. "uxth r6, %[a]\n\t"
  116600. "uxth r3, %[b]\n\t"
  116601. #ifdef WOLFSSL_KEIL
  116602. "muls r3, r6, r3\n\t"
  116603. #elif defined(__clang__)
  116604. "muls r3, r6\n\t"
  116605. #else
  116606. "mul r3, r6\n\t"
  116607. #endif
  116608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116609. "lsrs r7, %[b], #16\n\t"
  116610. #else
  116611. "lsr r7, %[b], #16\n\t"
  116612. #endif
  116613. #ifdef WOLFSSL_KEIL
  116614. "muls r6, r7, r6\n\t"
  116615. #elif defined(__clang__)
  116616. "muls r6, r7\n\t"
  116617. #else
  116618. "mul r6, r7\n\t"
  116619. #endif
  116620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116621. "lsrs r4, r6, #16\n\t"
  116622. #else
  116623. "lsr r4, r6, #16\n\t"
  116624. #endif
  116625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116626. "lsls r6, r6, #16\n\t"
  116627. #else
  116628. "lsl r6, r6, #16\n\t"
  116629. #endif
  116630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116631. "adds r3, r3, r6\n\t"
  116632. #else
  116633. "add r3, r3, r6\n\t"
  116634. #endif
  116635. #ifdef WOLFSSL_KEIL
  116636. "adcs r4, r4, %[r]\n\t"
  116637. #elif defined(__clang__)
  116638. "adcs r4, %[r]\n\t"
  116639. #else
  116640. "adc r4, %[r]\n\t"
  116641. #endif
  116642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116643. "lsrs r6, %[a], #16\n\t"
  116644. #else
  116645. "lsr r6, %[a], #16\n\t"
  116646. #endif
  116647. #ifdef WOLFSSL_KEIL
  116648. "muls r7, r6, r7\n\t"
  116649. #elif defined(__clang__)
  116650. "muls r7, r6\n\t"
  116651. #else
  116652. "mul r7, r6\n\t"
  116653. #endif
  116654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116655. "adds r4, r4, r7\n\t"
  116656. #else
  116657. "add r4, r4, r7\n\t"
  116658. #endif
  116659. "uxth r7, %[b]\n\t"
  116660. #ifdef WOLFSSL_KEIL
  116661. "muls r6, r7, r6\n\t"
  116662. #elif defined(__clang__)
  116663. "muls r6, r7\n\t"
  116664. #else
  116665. "mul r6, r7\n\t"
  116666. #endif
  116667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116668. "lsrs r7, r6, #16\n\t"
  116669. #else
  116670. "lsr r7, r6, #16\n\t"
  116671. #endif
  116672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116673. "lsls r6, r6, #16\n\t"
  116674. #else
  116675. "lsl r6, r6, #16\n\t"
  116676. #endif
  116677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116678. "adds r3, r3, r6\n\t"
  116679. #else
  116680. "add r3, r3, r6\n\t"
  116681. #endif
  116682. #ifdef WOLFSSL_KEIL
  116683. "adcs r4, r4, r7\n\t"
  116684. #elif defined(__clang__)
  116685. "adcs r4, r7\n\t"
  116686. #else
  116687. "adc r4, r7\n\t"
  116688. #endif
  116689. "movs r5, #0\n\t"
  116690. "str r3, [sp]\n\t"
  116691. "# A[0] * B[1]\n\t"
  116692. "movs r3, #0\n\t"
  116693. "mov %[a], r9\n\t"
  116694. "mov %[b], r10\n\t"
  116695. "ldr %[a], [%[a]]\n\t"
  116696. "ldr %[b], [%[b], #4]\n\t"
  116697. "uxth r6, %[a]\n\t"
  116698. "uxth r7, %[b]\n\t"
  116699. #ifdef WOLFSSL_KEIL
  116700. "muls r7, r6, r7\n\t"
  116701. #elif defined(__clang__)
  116702. "muls r7, r6\n\t"
  116703. #else
  116704. "mul r7, r6\n\t"
  116705. #endif
  116706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116707. "adds r4, r4, r7\n\t"
  116708. #else
  116709. "add r4, r4, r7\n\t"
  116710. #endif
  116711. #ifdef WOLFSSL_KEIL
  116712. "adcs r5, r5, %[r]\n\t"
  116713. #elif defined(__clang__)
  116714. "adcs r5, %[r]\n\t"
  116715. #else
  116716. "adc r5, %[r]\n\t"
  116717. #endif
  116718. #ifdef WOLFSSL_KEIL
  116719. "adcs r3, r3, %[r]\n\t"
  116720. #elif defined(__clang__)
  116721. "adcs r3, %[r]\n\t"
  116722. #else
  116723. "adc r3, %[r]\n\t"
  116724. #endif
  116725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116726. "lsrs r7, %[b], #16\n\t"
  116727. #else
  116728. "lsr r7, %[b], #16\n\t"
  116729. #endif
  116730. #ifdef WOLFSSL_KEIL
  116731. "muls r6, r7, r6\n\t"
  116732. #elif defined(__clang__)
  116733. "muls r6, r7\n\t"
  116734. #else
  116735. "mul r6, r7\n\t"
  116736. #endif
  116737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116738. "lsrs r7, r6, #16\n\t"
  116739. #else
  116740. "lsr r7, r6, #16\n\t"
  116741. #endif
  116742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116743. "lsls r6, r6, #16\n\t"
  116744. #else
  116745. "lsl r6, r6, #16\n\t"
  116746. #endif
  116747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116748. "adds r4, r4, r6\n\t"
  116749. #else
  116750. "add r4, r4, r6\n\t"
  116751. #endif
  116752. #ifdef WOLFSSL_KEIL
  116753. "adcs r5, r5, r7\n\t"
  116754. #elif defined(__clang__)
  116755. "adcs r5, r7\n\t"
  116756. #else
  116757. "adc r5, r7\n\t"
  116758. #endif
  116759. #ifdef WOLFSSL_KEIL
  116760. "adcs r3, r3, %[r]\n\t"
  116761. #elif defined(__clang__)
  116762. "adcs r3, %[r]\n\t"
  116763. #else
  116764. "adc r3, %[r]\n\t"
  116765. #endif
  116766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116767. "lsrs r6, %[a], #16\n\t"
  116768. #else
  116769. "lsr r6, %[a], #16\n\t"
  116770. #endif
  116771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116772. "lsrs r7, %[b], #16\n\t"
  116773. #else
  116774. "lsr r7, %[b], #16\n\t"
  116775. #endif
  116776. #ifdef WOLFSSL_KEIL
  116777. "muls r7, r6, r7\n\t"
  116778. #elif defined(__clang__)
  116779. "muls r7, r6\n\t"
  116780. #else
  116781. "mul r7, r6\n\t"
  116782. #endif
  116783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116784. "adds r5, r5, r7\n\t"
  116785. #else
  116786. "add r5, r5, r7\n\t"
  116787. #endif
  116788. #ifdef WOLFSSL_KEIL
  116789. "adcs r3, r3, %[r]\n\t"
  116790. #elif defined(__clang__)
  116791. "adcs r3, %[r]\n\t"
  116792. #else
  116793. "adc r3, %[r]\n\t"
  116794. #endif
  116795. "uxth r7, %[b]\n\t"
  116796. #ifdef WOLFSSL_KEIL
  116797. "muls r6, r7, r6\n\t"
  116798. #elif defined(__clang__)
  116799. "muls r6, r7\n\t"
  116800. #else
  116801. "mul r6, r7\n\t"
  116802. #endif
  116803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116804. "lsrs r7, r6, #16\n\t"
  116805. #else
  116806. "lsr r7, r6, #16\n\t"
  116807. #endif
  116808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116809. "lsls r6, r6, #16\n\t"
  116810. #else
  116811. "lsl r6, r6, #16\n\t"
  116812. #endif
  116813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116814. "adds r4, r4, r6\n\t"
  116815. #else
  116816. "add r4, r4, r6\n\t"
  116817. #endif
  116818. #ifdef WOLFSSL_KEIL
  116819. "adcs r5, r5, r7\n\t"
  116820. #elif defined(__clang__)
  116821. "adcs r5, r7\n\t"
  116822. #else
  116823. "adc r5, r7\n\t"
  116824. #endif
  116825. #ifdef WOLFSSL_KEIL
  116826. "adcs r3, r3, %[r]\n\t"
  116827. #elif defined(__clang__)
  116828. "adcs r3, %[r]\n\t"
  116829. #else
  116830. "adc r3, %[r]\n\t"
  116831. #endif
  116832. "# A[1] * B[0]\n\t"
  116833. "mov %[a], r9\n\t"
  116834. "mov %[b], r10\n\t"
  116835. "ldr %[a], [%[a], #4]\n\t"
  116836. "ldr %[b], [%[b]]\n\t"
  116837. "uxth r6, %[a]\n\t"
  116838. "uxth r7, %[b]\n\t"
  116839. #ifdef WOLFSSL_KEIL
  116840. "muls r7, r6, r7\n\t"
  116841. #elif defined(__clang__)
  116842. "muls r7, r6\n\t"
  116843. #else
  116844. "mul r7, r6\n\t"
  116845. #endif
  116846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116847. "adds r4, r4, r7\n\t"
  116848. #else
  116849. "add r4, r4, r7\n\t"
  116850. #endif
  116851. #ifdef WOLFSSL_KEIL
  116852. "adcs r5, r5, %[r]\n\t"
  116853. #elif defined(__clang__)
  116854. "adcs r5, %[r]\n\t"
  116855. #else
  116856. "adc r5, %[r]\n\t"
  116857. #endif
  116858. #ifdef WOLFSSL_KEIL
  116859. "adcs r3, r3, %[r]\n\t"
  116860. #elif defined(__clang__)
  116861. "adcs r3, %[r]\n\t"
  116862. #else
  116863. "adc r3, %[r]\n\t"
  116864. #endif
  116865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116866. "lsrs r7, %[b], #16\n\t"
  116867. #else
  116868. "lsr r7, %[b], #16\n\t"
  116869. #endif
  116870. #ifdef WOLFSSL_KEIL
  116871. "muls r6, r7, r6\n\t"
  116872. #elif defined(__clang__)
  116873. "muls r6, r7\n\t"
  116874. #else
  116875. "mul r6, r7\n\t"
  116876. #endif
  116877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116878. "lsrs r7, r6, #16\n\t"
  116879. #else
  116880. "lsr r7, r6, #16\n\t"
  116881. #endif
  116882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116883. "lsls r6, r6, #16\n\t"
  116884. #else
  116885. "lsl r6, r6, #16\n\t"
  116886. #endif
  116887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116888. "adds r4, r4, r6\n\t"
  116889. #else
  116890. "add r4, r4, r6\n\t"
  116891. #endif
  116892. #ifdef WOLFSSL_KEIL
  116893. "adcs r5, r5, r7\n\t"
  116894. #elif defined(__clang__)
  116895. "adcs r5, r7\n\t"
  116896. #else
  116897. "adc r5, r7\n\t"
  116898. #endif
  116899. #ifdef WOLFSSL_KEIL
  116900. "adcs r3, r3, %[r]\n\t"
  116901. #elif defined(__clang__)
  116902. "adcs r3, %[r]\n\t"
  116903. #else
  116904. "adc r3, %[r]\n\t"
  116905. #endif
  116906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116907. "lsrs r6, %[a], #16\n\t"
  116908. #else
  116909. "lsr r6, %[a], #16\n\t"
  116910. #endif
  116911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116912. "lsrs r7, %[b], #16\n\t"
  116913. #else
  116914. "lsr r7, %[b], #16\n\t"
  116915. #endif
  116916. #ifdef WOLFSSL_KEIL
  116917. "muls r7, r6, r7\n\t"
  116918. #elif defined(__clang__)
  116919. "muls r7, r6\n\t"
  116920. #else
  116921. "mul r7, r6\n\t"
  116922. #endif
  116923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116924. "adds r5, r5, r7\n\t"
  116925. #else
  116926. "add r5, r5, r7\n\t"
  116927. #endif
  116928. #ifdef WOLFSSL_KEIL
  116929. "adcs r3, r3, %[r]\n\t"
  116930. #elif defined(__clang__)
  116931. "adcs r3, %[r]\n\t"
  116932. #else
  116933. "adc r3, %[r]\n\t"
  116934. #endif
  116935. "uxth r7, %[b]\n\t"
  116936. #ifdef WOLFSSL_KEIL
  116937. "muls r6, r7, r6\n\t"
  116938. #elif defined(__clang__)
  116939. "muls r6, r7\n\t"
  116940. #else
  116941. "mul r6, r7\n\t"
  116942. #endif
  116943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116944. "lsrs r7, r6, #16\n\t"
  116945. #else
  116946. "lsr r7, r6, #16\n\t"
  116947. #endif
  116948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116949. "lsls r6, r6, #16\n\t"
  116950. #else
  116951. "lsl r6, r6, #16\n\t"
  116952. #endif
  116953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116954. "adds r4, r4, r6\n\t"
  116955. #else
  116956. "add r4, r4, r6\n\t"
  116957. #endif
  116958. #ifdef WOLFSSL_KEIL
  116959. "adcs r5, r5, r7\n\t"
  116960. #elif defined(__clang__)
  116961. "adcs r5, r7\n\t"
  116962. #else
  116963. "adc r5, r7\n\t"
  116964. #endif
  116965. #ifdef WOLFSSL_KEIL
  116966. "adcs r3, r3, %[r]\n\t"
  116967. #elif defined(__clang__)
  116968. "adcs r3, %[r]\n\t"
  116969. #else
  116970. "adc r3, %[r]\n\t"
  116971. #endif
  116972. "str r4, [sp, #4]\n\t"
  116973. "# A[2] * B[0]\n\t"
  116974. "movs r4, #0\n\t"
  116975. "mov %[a], r9\n\t"
  116976. "mov %[b], r10\n\t"
  116977. "ldr %[a], [%[a], #8]\n\t"
  116978. "ldr %[b], [%[b]]\n\t"
  116979. "uxth r6, %[a]\n\t"
  116980. "uxth r7, %[b]\n\t"
  116981. #ifdef WOLFSSL_KEIL
  116982. "muls r7, r6, r7\n\t"
  116983. #elif defined(__clang__)
  116984. "muls r7, r6\n\t"
  116985. #else
  116986. "mul r7, r6\n\t"
  116987. #endif
  116988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116989. "adds r5, r5, r7\n\t"
  116990. #else
  116991. "add r5, r5, r7\n\t"
  116992. #endif
  116993. #ifdef WOLFSSL_KEIL
  116994. "adcs r3, r3, %[r]\n\t"
  116995. #elif defined(__clang__)
  116996. "adcs r3, %[r]\n\t"
  116997. #else
  116998. "adc r3, %[r]\n\t"
  116999. #endif
  117000. #ifdef WOLFSSL_KEIL
  117001. "adcs r4, r4, %[r]\n\t"
  117002. #elif defined(__clang__)
  117003. "adcs r4, %[r]\n\t"
  117004. #else
  117005. "adc r4, %[r]\n\t"
  117006. #endif
  117007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117008. "lsrs r7, %[b], #16\n\t"
  117009. #else
  117010. "lsr r7, %[b], #16\n\t"
  117011. #endif
  117012. #ifdef WOLFSSL_KEIL
  117013. "muls r6, r7, r6\n\t"
  117014. #elif defined(__clang__)
  117015. "muls r6, r7\n\t"
  117016. #else
  117017. "mul r6, r7\n\t"
  117018. #endif
  117019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117020. "lsrs r7, r6, #16\n\t"
  117021. #else
  117022. "lsr r7, r6, #16\n\t"
  117023. #endif
  117024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117025. "lsls r6, r6, #16\n\t"
  117026. #else
  117027. "lsl r6, r6, #16\n\t"
  117028. #endif
  117029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117030. "adds r5, r5, r6\n\t"
  117031. #else
  117032. "add r5, r5, r6\n\t"
  117033. #endif
  117034. #ifdef WOLFSSL_KEIL
  117035. "adcs r3, r3, r7\n\t"
  117036. #elif defined(__clang__)
  117037. "adcs r3, r7\n\t"
  117038. #else
  117039. "adc r3, r7\n\t"
  117040. #endif
  117041. #ifdef WOLFSSL_KEIL
  117042. "adcs r4, r4, %[r]\n\t"
  117043. #elif defined(__clang__)
  117044. "adcs r4, %[r]\n\t"
  117045. #else
  117046. "adc r4, %[r]\n\t"
  117047. #endif
  117048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117049. "lsrs r6, %[a], #16\n\t"
  117050. #else
  117051. "lsr r6, %[a], #16\n\t"
  117052. #endif
  117053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117054. "lsrs r7, %[b], #16\n\t"
  117055. #else
  117056. "lsr r7, %[b], #16\n\t"
  117057. #endif
  117058. #ifdef WOLFSSL_KEIL
  117059. "muls r7, r6, r7\n\t"
  117060. #elif defined(__clang__)
  117061. "muls r7, r6\n\t"
  117062. #else
  117063. "mul r7, r6\n\t"
  117064. #endif
  117065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117066. "adds r3, r3, r7\n\t"
  117067. #else
  117068. "add r3, r3, r7\n\t"
  117069. #endif
  117070. #ifdef WOLFSSL_KEIL
  117071. "adcs r4, r4, %[r]\n\t"
  117072. #elif defined(__clang__)
  117073. "adcs r4, %[r]\n\t"
  117074. #else
  117075. "adc r4, %[r]\n\t"
  117076. #endif
  117077. "uxth r7, %[b]\n\t"
  117078. #ifdef WOLFSSL_KEIL
  117079. "muls r6, r7, r6\n\t"
  117080. #elif defined(__clang__)
  117081. "muls r6, r7\n\t"
  117082. #else
  117083. "mul r6, r7\n\t"
  117084. #endif
  117085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117086. "lsrs r7, r6, #16\n\t"
  117087. #else
  117088. "lsr r7, r6, #16\n\t"
  117089. #endif
  117090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117091. "lsls r6, r6, #16\n\t"
  117092. #else
  117093. "lsl r6, r6, #16\n\t"
  117094. #endif
  117095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117096. "adds r5, r5, r6\n\t"
  117097. #else
  117098. "add r5, r5, r6\n\t"
  117099. #endif
  117100. #ifdef WOLFSSL_KEIL
  117101. "adcs r3, r3, r7\n\t"
  117102. #elif defined(__clang__)
  117103. "adcs r3, r7\n\t"
  117104. #else
  117105. "adc r3, r7\n\t"
  117106. #endif
  117107. #ifdef WOLFSSL_KEIL
  117108. "adcs r4, r4, %[r]\n\t"
  117109. #elif defined(__clang__)
  117110. "adcs r4, %[r]\n\t"
  117111. #else
  117112. "adc r4, %[r]\n\t"
  117113. #endif
  117114. "# A[1] * B[1]\n\t"
  117115. "mov %[a], r9\n\t"
  117116. "mov %[b], r10\n\t"
  117117. "ldr %[a], [%[a], #4]\n\t"
  117118. "ldr %[b], [%[b], #4]\n\t"
  117119. "uxth r6, %[a]\n\t"
  117120. "uxth r7, %[b]\n\t"
  117121. #ifdef WOLFSSL_KEIL
  117122. "muls r7, r6, r7\n\t"
  117123. #elif defined(__clang__)
  117124. "muls r7, r6\n\t"
  117125. #else
  117126. "mul r7, r6\n\t"
  117127. #endif
  117128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117129. "adds r5, r5, r7\n\t"
  117130. #else
  117131. "add r5, r5, r7\n\t"
  117132. #endif
  117133. #ifdef WOLFSSL_KEIL
  117134. "adcs r3, r3, %[r]\n\t"
  117135. #elif defined(__clang__)
  117136. "adcs r3, %[r]\n\t"
  117137. #else
  117138. "adc r3, %[r]\n\t"
  117139. #endif
  117140. #ifdef WOLFSSL_KEIL
  117141. "adcs r4, r4, %[r]\n\t"
  117142. #elif defined(__clang__)
  117143. "adcs r4, %[r]\n\t"
  117144. #else
  117145. "adc r4, %[r]\n\t"
  117146. #endif
  117147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117148. "lsrs r7, %[b], #16\n\t"
  117149. #else
  117150. "lsr r7, %[b], #16\n\t"
  117151. #endif
  117152. #ifdef WOLFSSL_KEIL
  117153. "muls r6, r7, r6\n\t"
  117154. #elif defined(__clang__)
  117155. "muls r6, r7\n\t"
  117156. #else
  117157. "mul r6, r7\n\t"
  117158. #endif
  117159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117160. "lsrs r7, r6, #16\n\t"
  117161. #else
  117162. "lsr r7, r6, #16\n\t"
  117163. #endif
  117164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117165. "lsls r6, r6, #16\n\t"
  117166. #else
  117167. "lsl r6, r6, #16\n\t"
  117168. #endif
  117169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117170. "adds r5, r5, r6\n\t"
  117171. #else
  117172. "add r5, r5, r6\n\t"
  117173. #endif
  117174. #ifdef WOLFSSL_KEIL
  117175. "adcs r3, r3, r7\n\t"
  117176. #elif defined(__clang__)
  117177. "adcs r3, r7\n\t"
  117178. #else
  117179. "adc r3, r7\n\t"
  117180. #endif
  117181. #ifdef WOLFSSL_KEIL
  117182. "adcs r4, r4, %[r]\n\t"
  117183. #elif defined(__clang__)
  117184. "adcs r4, %[r]\n\t"
  117185. #else
  117186. "adc r4, %[r]\n\t"
  117187. #endif
  117188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117189. "lsrs r6, %[a], #16\n\t"
  117190. #else
  117191. "lsr r6, %[a], #16\n\t"
  117192. #endif
  117193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117194. "lsrs r7, %[b], #16\n\t"
  117195. #else
  117196. "lsr r7, %[b], #16\n\t"
  117197. #endif
  117198. #ifdef WOLFSSL_KEIL
  117199. "muls r7, r6, r7\n\t"
  117200. #elif defined(__clang__)
  117201. "muls r7, r6\n\t"
  117202. #else
  117203. "mul r7, r6\n\t"
  117204. #endif
  117205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117206. "adds r3, r3, r7\n\t"
  117207. #else
  117208. "add r3, r3, r7\n\t"
  117209. #endif
  117210. #ifdef WOLFSSL_KEIL
  117211. "adcs r4, r4, %[r]\n\t"
  117212. #elif defined(__clang__)
  117213. "adcs r4, %[r]\n\t"
  117214. #else
  117215. "adc r4, %[r]\n\t"
  117216. #endif
  117217. "uxth r7, %[b]\n\t"
  117218. #ifdef WOLFSSL_KEIL
  117219. "muls r6, r7, r6\n\t"
  117220. #elif defined(__clang__)
  117221. "muls r6, r7\n\t"
  117222. #else
  117223. "mul r6, r7\n\t"
  117224. #endif
  117225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117226. "lsrs r7, r6, #16\n\t"
  117227. #else
  117228. "lsr r7, r6, #16\n\t"
  117229. #endif
  117230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117231. "lsls r6, r6, #16\n\t"
  117232. #else
  117233. "lsl r6, r6, #16\n\t"
  117234. #endif
  117235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117236. "adds r5, r5, r6\n\t"
  117237. #else
  117238. "add r5, r5, r6\n\t"
  117239. #endif
  117240. #ifdef WOLFSSL_KEIL
  117241. "adcs r3, r3, r7\n\t"
  117242. #elif defined(__clang__)
  117243. "adcs r3, r7\n\t"
  117244. #else
  117245. "adc r3, r7\n\t"
  117246. #endif
  117247. #ifdef WOLFSSL_KEIL
  117248. "adcs r4, r4, %[r]\n\t"
  117249. #elif defined(__clang__)
  117250. "adcs r4, %[r]\n\t"
  117251. #else
  117252. "adc r4, %[r]\n\t"
  117253. #endif
  117254. "# A[0] * B[2]\n\t"
  117255. "mov %[a], r9\n\t"
  117256. "mov %[b], r10\n\t"
  117257. "ldr %[a], [%[a]]\n\t"
  117258. "ldr %[b], [%[b], #8]\n\t"
  117259. "uxth r6, %[a]\n\t"
  117260. "uxth r7, %[b]\n\t"
  117261. #ifdef WOLFSSL_KEIL
  117262. "muls r7, r6, r7\n\t"
  117263. #elif defined(__clang__)
  117264. "muls r7, r6\n\t"
  117265. #else
  117266. "mul r7, r6\n\t"
  117267. #endif
  117268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117269. "adds r5, r5, r7\n\t"
  117270. #else
  117271. "add r5, r5, r7\n\t"
  117272. #endif
  117273. #ifdef WOLFSSL_KEIL
  117274. "adcs r3, r3, %[r]\n\t"
  117275. #elif defined(__clang__)
  117276. "adcs r3, %[r]\n\t"
  117277. #else
  117278. "adc r3, %[r]\n\t"
  117279. #endif
  117280. #ifdef WOLFSSL_KEIL
  117281. "adcs r4, r4, %[r]\n\t"
  117282. #elif defined(__clang__)
  117283. "adcs r4, %[r]\n\t"
  117284. #else
  117285. "adc r4, %[r]\n\t"
  117286. #endif
  117287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117288. "lsrs r7, %[b], #16\n\t"
  117289. #else
  117290. "lsr r7, %[b], #16\n\t"
  117291. #endif
  117292. #ifdef WOLFSSL_KEIL
  117293. "muls r6, r7, r6\n\t"
  117294. #elif defined(__clang__)
  117295. "muls r6, r7\n\t"
  117296. #else
  117297. "mul r6, r7\n\t"
  117298. #endif
  117299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117300. "lsrs r7, r6, #16\n\t"
  117301. #else
  117302. "lsr r7, r6, #16\n\t"
  117303. #endif
  117304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117305. "lsls r6, r6, #16\n\t"
  117306. #else
  117307. "lsl r6, r6, #16\n\t"
  117308. #endif
  117309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117310. "adds r5, r5, r6\n\t"
  117311. #else
  117312. "add r5, r5, r6\n\t"
  117313. #endif
  117314. #ifdef WOLFSSL_KEIL
  117315. "adcs r3, r3, r7\n\t"
  117316. #elif defined(__clang__)
  117317. "adcs r3, r7\n\t"
  117318. #else
  117319. "adc r3, r7\n\t"
  117320. #endif
  117321. #ifdef WOLFSSL_KEIL
  117322. "adcs r4, r4, %[r]\n\t"
  117323. #elif defined(__clang__)
  117324. "adcs r4, %[r]\n\t"
  117325. #else
  117326. "adc r4, %[r]\n\t"
  117327. #endif
  117328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117329. "lsrs r6, %[a], #16\n\t"
  117330. #else
  117331. "lsr r6, %[a], #16\n\t"
  117332. #endif
  117333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117334. "lsrs r7, %[b], #16\n\t"
  117335. #else
  117336. "lsr r7, %[b], #16\n\t"
  117337. #endif
  117338. #ifdef WOLFSSL_KEIL
  117339. "muls r7, r6, r7\n\t"
  117340. #elif defined(__clang__)
  117341. "muls r7, r6\n\t"
  117342. #else
  117343. "mul r7, r6\n\t"
  117344. #endif
  117345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117346. "adds r3, r3, r7\n\t"
  117347. #else
  117348. "add r3, r3, r7\n\t"
  117349. #endif
  117350. #ifdef WOLFSSL_KEIL
  117351. "adcs r4, r4, %[r]\n\t"
  117352. #elif defined(__clang__)
  117353. "adcs r4, %[r]\n\t"
  117354. #else
  117355. "adc r4, %[r]\n\t"
  117356. #endif
  117357. "uxth r7, %[b]\n\t"
  117358. #ifdef WOLFSSL_KEIL
  117359. "muls r6, r7, r6\n\t"
  117360. #elif defined(__clang__)
  117361. "muls r6, r7\n\t"
  117362. #else
  117363. "mul r6, r7\n\t"
  117364. #endif
  117365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117366. "lsrs r7, r6, #16\n\t"
  117367. #else
  117368. "lsr r7, r6, #16\n\t"
  117369. #endif
  117370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117371. "lsls r6, r6, #16\n\t"
  117372. #else
  117373. "lsl r6, r6, #16\n\t"
  117374. #endif
  117375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117376. "adds r5, r5, r6\n\t"
  117377. #else
  117378. "add r5, r5, r6\n\t"
  117379. #endif
  117380. #ifdef WOLFSSL_KEIL
  117381. "adcs r3, r3, r7\n\t"
  117382. #elif defined(__clang__)
  117383. "adcs r3, r7\n\t"
  117384. #else
  117385. "adc r3, r7\n\t"
  117386. #endif
  117387. #ifdef WOLFSSL_KEIL
  117388. "adcs r4, r4, %[r]\n\t"
  117389. #elif defined(__clang__)
  117390. "adcs r4, %[r]\n\t"
  117391. #else
  117392. "adc r4, %[r]\n\t"
  117393. #endif
  117394. "str r5, [sp, #8]\n\t"
  117395. "# A[0] * B[3]\n\t"
  117396. "movs r5, #0\n\t"
  117397. "mov %[a], r9\n\t"
  117398. "mov %[b], r10\n\t"
  117399. "ldr %[a], [%[a]]\n\t"
  117400. "ldr %[b], [%[b], #12]\n\t"
  117401. "uxth r6, %[a]\n\t"
  117402. "uxth r7, %[b]\n\t"
  117403. #ifdef WOLFSSL_KEIL
  117404. "muls r7, r6, r7\n\t"
  117405. #elif defined(__clang__)
  117406. "muls r7, r6\n\t"
  117407. #else
  117408. "mul r7, r6\n\t"
  117409. #endif
  117410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117411. "adds r3, r3, r7\n\t"
  117412. #else
  117413. "add r3, r3, r7\n\t"
  117414. #endif
  117415. #ifdef WOLFSSL_KEIL
  117416. "adcs r4, r4, %[r]\n\t"
  117417. #elif defined(__clang__)
  117418. "adcs r4, %[r]\n\t"
  117419. #else
  117420. "adc r4, %[r]\n\t"
  117421. #endif
  117422. #ifdef WOLFSSL_KEIL
  117423. "adcs r5, r5, %[r]\n\t"
  117424. #elif defined(__clang__)
  117425. "adcs r5, %[r]\n\t"
  117426. #else
  117427. "adc r5, %[r]\n\t"
  117428. #endif
  117429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117430. "lsrs r7, %[b], #16\n\t"
  117431. #else
  117432. "lsr r7, %[b], #16\n\t"
  117433. #endif
  117434. #ifdef WOLFSSL_KEIL
  117435. "muls r6, r7, r6\n\t"
  117436. #elif defined(__clang__)
  117437. "muls r6, r7\n\t"
  117438. #else
  117439. "mul r6, r7\n\t"
  117440. #endif
  117441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117442. "lsrs r7, r6, #16\n\t"
  117443. #else
  117444. "lsr r7, r6, #16\n\t"
  117445. #endif
  117446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117447. "lsls r6, r6, #16\n\t"
  117448. #else
  117449. "lsl r6, r6, #16\n\t"
  117450. #endif
  117451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117452. "adds r3, r3, r6\n\t"
  117453. #else
  117454. "add r3, r3, r6\n\t"
  117455. #endif
  117456. #ifdef WOLFSSL_KEIL
  117457. "adcs r4, r4, r7\n\t"
  117458. #elif defined(__clang__)
  117459. "adcs r4, r7\n\t"
  117460. #else
  117461. "adc r4, r7\n\t"
  117462. #endif
  117463. #ifdef WOLFSSL_KEIL
  117464. "adcs r5, r5, %[r]\n\t"
  117465. #elif defined(__clang__)
  117466. "adcs r5, %[r]\n\t"
  117467. #else
  117468. "adc r5, %[r]\n\t"
  117469. #endif
  117470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117471. "lsrs r6, %[a], #16\n\t"
  117472. #else
  117473. "lsr r6, %[a], #16\n\t"
  117474. #endif
  117475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117476. "lsrs r7, %[b], #16\n\t"
  117477. #else
  117478. "lsr r7, %[b], #16\n\t"
  117479. #endif
  117480. #ifdef WOLFSSL_KEIL
  117481. "muls r7, r6, r7\n\t"
  117482. #elif defined(__clang__)
  117483. "muls r7, r6\n\t"
  117484. #else
  117485. "mul r7, r6\n\t"
  117486. #endif
  117487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117488. "adds r4, r4, r7\n\t"
  117489. #else
  117490. "add r4, r4, r7\n\t"
  117491. #endif
  117492. #ifdef WOLFSSL_KEIL
  117493. "adcs r5, r5, %[r]\n\t"
  117494. #elif defined(__clang__)
  117495. "adcs r5, %[r]\n\t"
  117496. #else
  117497. "adc r5, %[r]\n\t"
  117498. #endif
  117499. "uxth r7, %[b]\n\t"
  117500. #ifdef WOLFSSL_KEIL
  117501. "muls r6, r7, r6\n\t"
  117502. #elif defined(__clang__)
  117503. "muls r6, r7\n\t"
  117504. #else
  117505. "mul r6, r7\n\t"
  117506. #endif
  117507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117508. "lsrs r7, r6, #16\n\t"
  117509. #else
  117510. "lsr r7, r6, #16\n\t"
  117511. #endif
  117512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117513. "lsls r6, r6, #16\n\t"
  117514. #else
  117515. "lsl r6, r6, #16\n\t"
  117516. #endif
  117517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117518. "adds r3, r3, r6\n\t"
  117519. #else
  117520. "add r3, r3, r6\n\t"
  117521. #endif
  117522. #ifdef WOLFSSL_KEIL
  117523. "adcs r4, r4, r7\n\t"
  117524. #elif defined(__clang__)
  117525. "adcs r4, r7\n\t"
  117526. #else
  117527. "adc r4, r7\n\t"
  117528. #endif
  117529. #ifdef WOLFSSL_KEIL
  117530. "adcs r5, r5, %[r]\n\t"
  117531. #elif defined(__clang__)
  117532. "adcs r5, %[r]\n\t"
  117533. #else
  117534. "adc r5, %[r]\n\t"
  117535. #endif
  117536. "# A[1] * B[2]\n\t"
  117537. "mov %[a], r9\n\t"
  117538. "mov %[b], r10\n\t"
  117539. "ldr %[a], [%[a], #4]\n\t"
  117540. "ldr %[b], [%[b], #8]\n\t"
  117541. "uxth r6, %[a]\n\t"
  117542. "uxth r7, %[b]\n\t"
  117543. #ifdef WOLFSSL_KEIL
  117544. "muls r7, r6, r7\n\t"
  117545. #elif defined(__clang__)
  117546. "muls r7, r6\n\t"
  117547. #else
  117548. "mul r7, r6\n\t"
  117549. #endif
  117550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117551. "adds r3, r3, r7\n\t"
  117552. #else
  117553. "add r3, r3, r7\n\t"
  117554. #endif
  117555. #ifdef WOLFSSL_KEIL
  117556. "adcs r4, r4, %[r]\n\t"
  117557. #elif defined(__clang__)
  117558. "adcs r4, %[r]\n\t"
  117559. #else
  117560. "adc r4, %[r]\n\t"
  117561. #endif
  117562. #ifdef WOLFSSL_KEIL
  117563. "adcs r5, r5, %[r]\n\t"
  117564. #elif defined(__clang__)
  117565. "adcs r5, %[r]\n\t"
  117566. #else
  117567. "adc r5, %[r]\n\t"
  117568. #endif
  117569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117570. "lsrs r7, %[b], #16\n\t"
  117571. #else
  117572. "lsr r7, %[b], #16\n\t"
  117573. #endif
  117574. #ifdef WOLFSSL_KEIL
  117575. "muls r6, r7, r6\n\t"
  117576. #elif defined(__clang__)
  117577. "muls r6, r7\n\t"
  117578. #else
  117579. "mul r6, r7\n\t"
  117580. #endif
  117581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117582. "lsrs r7, r6, #16\n\t"
  117583. #else
  117584. "lsr r7, r6, #16\n\t"
  117585. #endif
  117586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117587. "lsls r6, r6, #16\n\t"
  117588. #else
  117589. "lsl r6, r6, #16\n\t"
  117590. #endif
  117591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117592. "adds r3, r3, r6\n\t"
  117593. #else
  117594. "add r3, r3, r6\n\t"
  117595. #endif
  117596. #ifdef WOLFSSL_KEIL
  117597. "adcs r4, r4, r7\n\t"
  117598. #elif defined(__clang__)
  117599. "adcs r4, r7\n\t"
  117600. #else
  117601. "adc r4, r7\n\t"
  117602. #endif
  117603. #ifdef WOLFSSL_KEIL
  117604. "adcs r5, r5, %[r]\n\t"
  117605. #elif defined(__clang__)
  117606. "adcs r5, %[r]\n\t"
  117607. #else
  117608. "adc r5, %[r]\n\t"
  117609. #endif
  117610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117611. "lsrs r6, %[a], #16\n\t"
  117612. #else
  117613. "lsr r6, %[a], #16\n\t"
  117614. #endif
  117615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117616. "lsrs r7, %[b], #16\n\t"
  117617. #else
  117618. "lsr r7, %[b], #16\n\t"
  117619. #endif
  117620. #ifdef WOLFSSL_KEIL
  117621. "muls r7, r6, r7\n\t"
  117622. #elif defined(__clang__)
  117623. "muls r7, r6\n\t"
  117624. #else
  117625. "mul r7, r6\n\t"
  117626. #endif
  117627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117628. "adds r4, r4, r7\n\t"
  117629. #else
  117630. "add r4, r4, r7\n\t"
  117631. #endif
  117632. #ifdef WOLFSSL_KEIL
  117633. "adcs r5, r5, %[r]\n\t"
  117634. #elif defined(__clang__)
  117635. "adcs r5, %[r]\n\t"
  117636. #else
  117637. "adc r5, %[r]\n\t"
  117638. #endif
  117639. "uxth r7, %[b]\n\t"
  117640. #ifdef WOLFSSL_KEIL
  117641. "muls r6, r7, r6\n\t"
  117642. #elif defined(__clang__)
  117643. "muls r6, r7\n\t"
  117644. #else
  117645. "mul r6, r7\n\t"
  117646. #endif
  117647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117648. "lsrs r7, r6, #16\n\t"
  117649. #else
  117650. "lsr r7, r6, #16\n\t"
  117651. #endif
  117652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117653. "lsls r6, r6, #16\n\t"
  117654. #else
  117655. "lsl r6, r6, #16\n\t"
  117656. #endif
  117657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117658. "adds r3, r3, r6\n\t"
  117659. #else
  117660. "add r3, r3, r6\n\t"
  117661. #endif
  117662. #ifdef WOLFSSL_KEIL
  117663. "adcs r4, r4, r7\n\t"
  117664. #elif defined(__clang__)
  117665. "adcs r4, r7\n\t"
  117666. #else
  117667. "adc r4, r7\n\t"
  117668. #endif
  117669. #ifdef WOLFSSL_KEIL
  117670. "adcs r5, r5, %[r]\n\t"
  117671. #elif defined(__clang__)
  117672. "adcs r5, %[r]\n\t"
  117673. #else
  117674. "adc r5, %[r]\n\t"
  117675. #endif
  117676. "# A[2] * B[1]\n\t"
  117677. "mov %[a], r9\n\t"
  117678. "mov %[b], r10\n\t"
  117679. "ldr %[a], [%[a], #8]\n\t"
  117680. "ldr %[b], [%[b], #4]\n\t"
  117681. "uxth r6, %[a]\n\t"
  117682. "uxth r7, %[b]\n\t"
  117683. #ifdef WOLFSSL_KEIL
  117684. "muls r7, r6, r7\n\t"
  117685. #elif defined(__clang__)
  117686. "muls r7, r6\n\t"
  117687. #else
  117688. "mul r7, r6\n\t"
  117689. #endif
  117690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117691. "adds r3, r3, r7\n\t"
  117692. #else
  117693. "add r3, r3, r7\n\t"
  117694. #endif
  117695. #ifdef WOLFSSL_KEIL
  117696. "adcs r4, r4, %[r]\n\t"
  117697. #elif defined(__clang__)
  117698. "adcs r4, %[r]\n\t"
  117699. #else
  117700. "adc r4, %[r]\n\t"
  117701. #endif
  117702. #ifdef WOLFSSL_KEIL
  117703. "adcs r5, r5, %[r]\n\t"
  117704. #elif defined(__clang__)
  117705. "adcs r5, %[r]\n\t"
  117706. #else
  117707. "adc r5, %[r]\n\t"
  117708. #endif
  117709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117710. "lsrs r7, %[b], #16\n\t"
  117711. #else
  117712. "lsr r7, %[b], #16\n\t"
  117713. #endif
  117714. #ifdef WOLFSSL_KEIL
  117715. "muls r6, r7, r6\n\t"
  117716. #elif defined(__clang__)
  117717. "muls r6, r7\n\t"
  117718. #else
  117719. "mul r6, r7\n\t"
  117720. #endif
  117721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117722. "lsrs r7, r6, #16\n\t"
  117723. #else
  117724. "lsr r7, r6, #16\n\t"
  117725. #endif
  117726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117727. "lsls r6, r6, #16\n\t"
  117728. #else
  117729. "lsl r6, r6, #16\n\t"
  117730. #endif
  117731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117732. "adds r3, r3, r6\n\t"
  117733. #else
  117734. "add r3, r3, r6\n\t"
  117735. #endif
  117736. #ifdef WOLFSSL_KEIL
  117737. "adcs r4, r4, r7\n\t"
  117738. #elif defined(__clang__)
  117739. "adcs r4, r7\n\t"
  117740. #else
  117741. "adc r4, r7\n\t"
  117742. #endif
  117743. #ifdef WOLFSSL_KEIL
  117744. "adcs r5, r5, %[r]\n\t"
  117745. #elif defined(__clang__)
  117746. "adcs r5, %[r]\n\t"
  117747. #else
  117748. "adc r5, %[r]\n\t"
  117749. #endif
  117750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117751. "lsrs r6, %[a], #16\n\t"
  117752. #else
  117753. "lsr r6, %[a], #16\n\t"
  117754. #endif
  117755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117756. "lsrs r7, %[b], #16\n\t"
  117757. #else
  117758. "lsr r7, %[b], #16\n\t"
  117759. #endif
  117760. #ifdef WOLFSSL_KEIL
  117761. "muls r7, r6, r7\n\t"
  117762. #elif defined(__clang__)
  117763. "muls r7, r6\n\t"
  117764. #else
  117765. "mul r7, r6\n\t"
  117766. #endif
  117767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117768. "adds r4, r4, r7\n\t"
  117769. #else
  117770. "add r4, r4, r7\n\t"
  117771. #endif
  117772. #ifdef WOLFSSL_KEIL
  117773. "adcs r5, r5, %[r]\n\t"
  117774. #elif defined(__clang__)
  117775. "adcs r5, %[r]\n\t"
  117776. #else
  117777. "adc r5, %[r]\n\t"
  117778. #endif
  117779. "uxth r7, %[b]\n\t"
  117780. #ifdef WOLFSSL_KEIL
  117781. "muls r6, r7, r6\n\t"
  117782. #elif defined(__clang__)
  117783. "muls r6, r7\n\t"
  117784. #else
  117785. "mul r6, r7\n\t"
  117786. #endif
  117787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117788. "lsrs r7, r6, #16\n\t"
  117789. #else
  117790. "lsr r7, r6, #16\n\t"
  117791. #endif
  117792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117793. "lsls r6, r6, #16\n\t"
  117794. #else
  117795. "lsl r6, r6, #16\n\t"
  117796. #endif
  117797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117798. "adds r3, r3, r6\n\t"
  117799. #else
  117800. "add r3, r3, r6\n\t"
  117801. #endif
  117802. #ifdef WOLFSSL_KEIL
  117803. "adcs r4, r4, r7\n\t"
  117804. #elif defined(__clang__)
  117805. "adcs r4, r7\n\t"
  117806. #else
  117807. "adc r4, r7\n\t"
  117808. #endif
  117809. #ifdef WOLFSSL_KEIL
  117810. "adcs r5, r5, %[r]\n\t"
  117811. #elif defined(__clang__)
  117812. "adcs r5, %[r]\n\t"
  117813. #else
  117814. "adc r5, %[r]\n\t"
  117815. #endif
  117816. "# A[3] * B[0]\n\t"
  117817. "mov %[a], r9\n\t"
  117818. "mov %[b], r10\n\t"
  117819. "ldr %[a], [%[a], #12]\n\t"
  117820. "ldr %[b], [%[b]]\n\t"
  117821. "uxth r6, %[a]\n\t"
  117822. "uxth r7, %[b]\n\t"
  117823. #ifdef WOLFSSL_KEIL
  117824. "muls r7, r6, r7\n\t"
  117825. #elif defined(__clang__)
  117826. "muls r7, r6\n\t"
  117827. #else
  117828. "mul r7, r6\n\t"
  117829. #endif
  117830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117831. "adds r3, r3, r7\n\t"
  117832. #else
  117833. "add r3, r3, r7\n\t"
  117834. #endif
  117835. #ifdef WOLFSSL_KEIL
  117836. "adcs r4, r4, %[r]\n\t"
  117837. #elif defined(__clang__)
  117838. "adcs r4, %[r]\n\t"
  117839. #else
  117840. "adc r4, %[r]\n\t"
  117841. #endif
  117842. #ifdef WOLFSSL_KEIL
  117843. "adcs r5, r5, %[r]\n\t"
  117844. #elif defined(__clang__)
  117845. "adcs r5, %[r]\n\t"
  117846. #else
  117847. "adc r5, %[r]\n\t"
  117848. #endif
  117849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117850. "lsrs r7, %[b], #16\n\t"
  117851. #else
  117852. "lsr r7, %[b], #16\n\t"
  117853. #endif
  117854. #ifdef WOLFSSL_KEIL
  117855. "muls r6, r7, r6\n\t"
  117856. #elif defined(__clang__)
  117857. "muls r6, r7\n\t"
  117858. #else
  117859. "mul r6, r7\n\t"
  117860. #endif
  117861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117862. "lsrs r7, r6, #16\n\t"
  117863. #else
  117864. "lsr r7, r6, #16\n\t"
  117865. #endif
  117866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117867. "lsls r6, r6, #16\n\t"
  117868. #else
  117869. "lsl r6, r6, #16\n\t"
  117870. #endif
  117871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117872. "adds r3, r3, r6\n\t"
  117873. #else
  117874. "add r3, r3, r6\n\t"
  117875. #endif
  117876. #ifdef WOLFSSL_KEIL
  117877. "adcs r4, r4, r7\n\t"
  117878. #elif defined(__clang__)
  117879. "adcs r4, r7\n\t"
  117880. #else
  117881. "adc r4, r7\n\t"
  117882. #endif
  117883. #ifdef WOLFSSL_KEIL
  117884. "adcs r5, r5, %[r]\n\t"
  117885. #elif defined(__clang__)
  117886. "adcs r5, %[r]\n\t"
  117887. #else
  117888. "adc r5, %[r]\n\t"
  117889. #endif
  117890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117891. "lsrs r6, %[a], #16\n\t"
  117892. #else
  117893. "lsr r6, %[a], #16\n\t"
  117894. #endif
  117895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117896. "lsrs r7, %[b], #16\n\t"
  117897. #else
  117898. "lsr r7, %[b], #16\n\t"
  117899. #endif
  117900. #ifdef WOLFSSL_KEIL
  117901. "muls r7, r6, r7\n\t"
  117902. #elif defined(__clang__)
  117903. "muls r7, r6\n\t"
  117904. #else
  117905. "mul r7, r6\n\t"
  117906. #endif
  117907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117908. "adds r4, r4, r7\n\t"
  117909. #else
  117910. "add r4, r4, r7\n\t"
  117911. #endif
  117912. #ifdef WOLFSSL_KEIL
  117913. "adcs r5, r5, %[r]\n\t"
  117914. #elif defined(__clang__)
  117915. "adcs r5, %[r]\n\t"
  117916. #else
  117917. "adc r5, %[r]\n\t"
  117918. #endif
  117919. "uxth r7, %[b]\n\t"
  117920. #ifdef WOLFSSL_KEIL
  117921. "muls r6, r7, r6\n\t"
  117922. #elif defined(__clang__)
  117923. "muls r6, r7\n\t"
  117924. #else
  117925. "mul r6, r7\n\t"
  117926. #endif
  117927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117928. "lsrs r7, r6, #16\n\t"
  117929. #else
  117930. "lsr r7, r6, #16\n\t"
  117931. #endif
  117932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117933. "lsls r6, r6, #16\n\t"
  117934. #else
  117935. "lsl r6, r6, #16\n\t"
  117936. #endif
  117937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117938. "adds r3, r3, r6\n\t"
  117939. #else
  117940. "add r3, r3, r6\n\t"
  117941. #endif
  117942. #ifdef WOLFSSL_KEIL
  117943. "adcs r4, r4, r7\n\t"
  117944. #elif defined(__clang__)
  117945. "adcs r4, r7\n\t"
  117946. #else
  117947. "adc r4, r7\n\t"
  117948. #endif
  117949. #ifdef WOLFSSL_KEIL
  117950. "adcs r5, r5, %[r]\n\t"
  117951. #elif defined(__clang__)
  117952. "adcs r5, %[r]\n\t"
  117953. #else
  117954. "adc r5, %[r]\n\t"
  117955. #endif
  117956. "str r3, [sp, #12]\n\t"
  117957. "# A[4] * B[0]\n\t"
  117958. "movs r3, #0\n\t"
  117959. "mov %[a], r9\n\t"
  117960. "mov %[b], r10\n\t"
  117961. "ldr %[a], [%[a], #16]\n\t"
  117962. "ldr %[b], [%[b]]\n\t"
  117963. "uxth r6, %[a]\n\t"
  117964. "uxth r7, %[b]\n\t"
  117965. #ifdef WOLFSSL_KEIL
  117966. "muls r7, r6, r7\n\t"
  117967. #elif defined(__clang__)
  117968. "muls r7, r6\n\t"
  117969. #else
  117970. "mul r7, r6\n\t"
  117971. #endif
  117972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117973. "adds r4, r4, r7\n\t"
  117974. #else
  117975. "add r4, r4, r7\n\t"
  117976. #endif
  117977. #ifdef WOLFSSL_KEIL
  117978. "adcs r5, r5, %[r]\n\t"
  117979. #elif defined(__clang__)
  117980. "adcs r5, %[r]\n\t"
  117981. #else
  117982. "adc r5, %[r]\n\t"
  117983. #endif
  117984. #ifdef WOLFSSL_KEIL
  117985. "adcs r3, r3, %[r]\n\t"
  117986. #elif defined(__clang__)
  117987. "adcs r3, %[r]\n\t"
  117988. #else
  117989. "adc r3, %[r]\n\t"
  117990. #endif
  117991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117992. "lsrs r7, %[b], #16\n\t"
  117993. #else
  117994. "lsr r7, %[b], #16\n\t"
  117995. #endif
  117996. #ifdef WOLFSSL_KEIL
  117997. "muls r6, r7, r6\n\t"
  117998. #elif defined(__clang__)
  117999. "muls r6, r7\n\t"
  118000. #else
  118001. "mul r6, r7\n\t"
  118002. #endif
  118003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118004. "lsrs r7, r6, #16\n\t"
  118005. #else
  118006. "lsr r7, r6, #16\n\t"
  118007. #endif
  118008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118009. "lsls r6, r6, #16\n\t"
  118010. #else
  118011. "lsl r6, r6, #16\n\t"
  118012. #endif
  118013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118014. "adds r4, r4, r6\n\t"
  118015. #else
  118016. "add r4, r4, r6\n\t"
  118017. #endif
  118018. #ifdef WOLFSSL_KEIL
  118019. "adcs r5, r5, r7\n\t"
  118020. #elif defined(__clang__)
  118021. "adcs r5, r7\n\t"
  118022. #else
  118023. "adc r5, r7\n\t"
  118024. #endif
  118025. #ifdef WOLFSSL_KEIL
  118026. "adcs r3, r3, %[r]\n\t"
  118027. #elif defined(__clang__)
  118028. "adcs r3, %[r]\n\t"
  118029. #else
  118030. "adc r3, %[r]\n\t"
  118031. #endif
  118032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118033. "lsrs r6, %[a], #16\n\t"
  118034. #else
  118035. "lsr r6, %[a], #16\n\t"
  118036. #endif
  118037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118038. "lsrs r7, %[b], #16\n\t"
  118039. #else
  118040. "lsr r7, %[b], #16\n\t"
  118041. #endif
  118042. #ifdef WOLFSSL_KEIL
  118043. "muls r7, r6, r7\n\t"
  118044. #elif defined(__clang__)
  118045. "muls r7, r6\n\t"
  118046. #else
  118047. "mul r7, r6\n\t"
  118048. #endif
  118049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118050. "adds r5, r5, r7\n\t"
  118051. #else
  118052. "add r5, r5, r7\n\t"
  118053. #endif
  118054. #ifdef WOLFSSL_KEIL
  118055. "adcs r3, r3, %[r]\n\t"
  118056. #elif defined(__clang__)
  118057. "adcs r3, %[r]\n\t"
  118058. #else
  118059. "adc r3, %[r]\n\t"
  118060. #endif
  118061. "uxth r7, %[b]\n\t"
  118062. #ifdef WOLFSSL_KEIL
  118063. "muls r6, r7, r6\n\t"
  118064. #elif defined(__clang__)
  118065. "muls r6, r7\n\t"
  118066. #else
  118067. "mul r6, r7\n\t"
  118068. #endif
  118069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118070. "lsrs r7, r6, #16\n\t"
  118071. #else
  118072. "lsr r7, r6, #16\n\t"
  118073. #endif
  118074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118075. "lsls r6, r6, #16\n\t"
  118076. #else
  118077. "lsl r6, r6, #16\n\t"
  118078. #endif
  118079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118080. "adds r4, r4, r6\n\t"
  118081. #else
  118082. "add r4, r4, r6\n\t"
  118083. #endif
  118084. #ifdef WOLFSSL_KEIL
  118085. "adcs r5, r5, r7\n\t"
  118086. #elif defined(__clang__)
  118087. "adcs r5, r7\n\t"
  118088. #else
  118089. "adc r5, r7\n\t"
  118090. #endif
  118091. #ifdef WOLFSSL_KEIL
  118092. "adcs r3, r3, %[r]\n\t"
  118093. #elif defined(__clang__)
  118094. "adcs r3, %[r]\n\t"
  118095. #else
  118096. "adc r3, %[r]\n\t"
  118097. #endif
  118098. "# A[3] * B[1]\n\t"
  118099. "mov %[a], r9\n\t"
  118100. "mov %[b], r10\n\t"
  118101. "ldr %[a], [%[a], #12]\n\t"
  118102. "ldr %[b], [%[b], #4]\n\t"
  118103. "uxth r6, %[a]\n\t"
  118104. "uxth r7, %[b]\n\t"
  118105. #ifdef WOLFSSL_KEIL
  118106. "muls r7, r6, r7\n\t"
  118107. #elif defined(__clang__)
  118108. "muls r7, r6\n\t"
  118109. #else
  118110. "mul r7, r6\n\t"
  118111. #endif
  118112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118113. "adds r4, r4, r7\n\t"
  118114. #else
  118115. "add r4, r4, r7\n\t"
  118116. #endif
  118117. #ifdef WOLFSSL_KEIL
  118118. "adcs r5, r5, %[r]\n\t"
  118119. #elif defined(__clang__)
  118120. "adcs r5, %[r]\n\t"
  118121. #else
  118122. "adc r5, %[r]\n\t"
  118123. #endif
  118124. #ifdef WOLFSSL_KEIL
  118125. "adcs r3, r3, %[r]\n\t"
  118126. #elif defined(__clang__)
  118127. "adcs r3, %[r]\n\t"
  118128. #else
  118129. "adc r3, %[r]\n\t"
  118130. #endif
  118131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118132. "lsrs r7, %[b], #16\n\t"
  118133. #else
  118134. "lsr r7, %[b], #16\n\t"
  118135. #endif
  118136. #ifdef WOLFSSL_KEIL
  118137. "muls r6, r7, r6\n\t"
  118138. #elif defined(__clang__)
  118139. "muls r6, r7\n\t"
  118140. #else
  118141. "mul r6, r7\n\t"
  118142. #endif
  118143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118144. "lsrs r7, r6, #16\n\t"
  118145. #else
  118146. "lsr r7, r6, #16\n\t"
  118147. #endif
  118148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118149. "lsls r6, r6, #16\n\t"
  118150. #else
  118151. "lsl r6, r6, #16\n\t"
  118152. #endif
  118153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118154. "adds r4, r4, r6\n\t"
  118155. #else
  118156. "add r4, r4, r6\n\t"
  118157. #endif
  118158. #ifdef WOLFSSL_KEIL
  118159. "adcs r5, r5, r7\n\t"
  118160. #elif defined(__clang__)
  118161. "adcs r5, r7\n\t"
  118162. #else
  118163. "adc r5, r7\n\t"
  118164. #endif
  118165. #ifdef WOLFSSL_KEIL
  118166. "adcs r3, r3, %[r]\n\t"
  118167. #elif defined(__clang__)
  118168. "adcs r3, %[r]\n\t"
  118169. #else
  118170. "adc r3, %[r]\n\t"
  118171. #endif
  118172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118173. "lsrs r6, %[a], #16\n\t"
  118174. #else
  118175. "lsr r6, %[a], #16\n\t"
  118176. #endif
  118177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118178. "lsrs r7, %[b], #16\n\t"
  118179. #else
  118180. "lsr r7, %[b], #16\n\t"
  118181. #endif
  118182. #ifdef WOLFSSL_KEIL
  118183. "muls r7, r6, r7\n\t"
  118184. #elif defined(__clang__)
  118185. "muls r7, r6\n\t"
  118186. #else
  118187. "mul r7, r6\n\t"
  118188. #endif
  118189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118190. "adds r5, r5, r7\n\t"
  118191. #else
  118192. "add r5, r5, r7\n\t"
  118193. #endif
  118194. #ifdef WOLFSSL_KEIL
  118195. "adcs r3, r3, %[r]\n\t"
  118196. #elif defined(__clang__)
  118197. "adcs r3, %[r]\n\t"
  118198. #else
  118199. "adc r3, %[r]\n\t"
  118200. #endif
  118201. "uxth r7, %[b]\n\t"
  118202. #ifdef WOLFSSL_KEIL
  118203. "muls r6, r7, r6\n\t"
  118204. #elif defined(__clang__)
  118205. "muls r6, r7\n\t"
  118206. #else
  118207. "mul r6, r7\n\t"
  118208. #endif
  118209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118210. "lsrs r7, r6, #16\n\t"
  118211. #else
  118212. "lsr r7, r6, #16\n\t"
  118213. #endif
  118214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118215. "lsls r6, r6, #16\n\t"
  118216. #else
  118217. "lsl r6, r6, #16\n\t"
  118218. #endif
  118219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118220. "adds r4, r4, r6\n\t"
  118221. #else
  118222. "add r4, r4, r6\n\t"
  118223. #endif
  118224. #ifdef WOLFSSL_KEIL
  118225. "adcs r5, r5, r7\n\t"
  118226. #elif defined(__clang__)
  118227. "adcs r5, r7\n\t"
  118228. #else
  118229. "adc r5, r7\n\t"
  118230. #endif
  118231. #ifdef WOLFSSL_KEIL
  118232. "adcs r3, r3, %[r]\n\t"
  118233. #elif defined(__clang__)
  118234. "adcs r3, %[r]\n\t"
  118235. #else
  118236. "adc r3, %[r]\n\t"
  118237. #endif
  118238. "# A[2] * B[2]\n\t"
  118239. "mov %[a], r9\n\t"
  118240. "mov %[b], r10\n\t"
  118241. "ldr %[a], [%[a], #8]\n\t"
  118242. "ldr %[b], [%[b], #8]\n\t"
  118243. "uxth r6, %[a]\n\t"
  118244. "uxth r7, %[b]\n\t"
  118245. #ifdef WOLFSSL_KEIL
  118246. "muls r7, r6, r7\n\t"
  118247. #elif defined(__clang__)
  118248. "muls r7, r6\n\t"
  118249. #else
  118250. "mul r7, r6\n\t"
  118251. #endif
  118252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118253. "adds r4, r4, r7\n\t"
  118254. #else
  118255. "add r4, r4, r7\n\t"
  118256. #endif
  118257. #ifdef WOLFSSL_KEIL
  118258. "adcs r5, r5, %[r]\n\t"
  118259. #elif defined(__clang__)
  118260. "adcs r5, %[r]\n\t"
  118261. #else
  118262. "adc r5, %[r]\n\t"
  118263. #endif
  118264. #ifdef WOLFSSL_KEIL
  118265. "adcs r3, r3, %[r]\n\t"
  118266. #elif defined(__clang__)
  118267. "adcs r3, %[r]\n\t"
  118268. #else
  118269. "adc r3, %[r]\n\t"
  118270. #endif
  118271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118272. "lsrs r7, %[b], #16\n\t"
  118273. #else
  118274. "lsr r7, %[b], #16\n\t"
  118275. #endif
  118276. #ifdef WOLFSSL_KEIL
  118277. "muls r6, r7, r6\n\t"
  118278. #elif defined(__clang__)
  118279. "muls r6, r7\n\t"
  118280. #else
  118281. "mul r6, r7\n\t"
  118282. #endif
  118283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118284. "lsrs r7, r6, #16\n\t"
  118285. #else
  118286. "lsr r7, r6, #16\n\t"
  118287. #endif
  118288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118289. "lsls r6, r6, #16\n\t"
  118290. #else
  118291. "lsl r6, r6, #16\n\t"
  118292. #endif
  118293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118294. "adds r4, r4, r6\n\t"
  118295. #else
  118296. "add r4, r4, r6\n\t"
  118297. #endif
  118298. #ifdef WOLFSSL_KEIL
  118299. "adcs r5, r5, r7\n\t"
  118300. #elif defined(__clang__)
  118301. "adcs r5, r7\n\t"
  118302. #else
  118303. "adc r5, r7\n\t"
  118304. #endif
  118305. #ifdef WOLFSSL_KEIL
  118306. "adcs r3, r3, %[r]\n\t"
  118307. #elif defined(__clang__)
  118308. "adcs r3, %[r]\n\t"
  118309. #else
  118310. "adc r3, %[r]\n\t"
  118311. #endif
  118312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118313. "lsrs r6, %[a], #16\n\t"
  118314. #else
  118315. "lsr r6, %[a], #16\n\t"
  118316. #endif
  118317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118318. "lsrs r7, %[b], #16\n\t"
  118319. #else
  118320. "lsr r7, %[b], #16\n\t"
  118321. #endif
  118322. #ifdef WOLFSSL_KEIL
  118323. "muls r7, r6, r7\n\t"
  118324. #elif defined(__clang__)
  118325. "muls r7, r6\n\t"
  118326. #else
  118327. "mul r7, r6\n\t"
  118328. #endif
  118329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118330. "adds r5, r5, r7\n\t"
  118331. #else
  118332. "add r5, r5, r7\n\t"
  118333. #endif
  118334. #ifdef WOLFSSL_KEIL
  118335. "adcs r3, r3, %[r]\n\t"
  118336. #elif defined(__clang__)
  118337. "adcs r3, %[r]\n\t"
  118338. #else
  118339. "adc r3, %[r]\n\t"
  118340. #endif
  118341. "uxth r7, %[b]\n\t"
  118342. #ifdef WOLFSSL_KEIL
  118343. "muls r6, r7, r6\n\t"
  118344. #elif defined(__clang__)
  118345. "muls r6, r7\n\t"
  118346. #else
  118347. "mul r6, r7\n\t"
  118348. #endif
  118349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118350. "lsrs r7, r6, #16\n\t"
  118351. #else
  118352. "lsr r7, r6, #16\n\t"
  118353. #endif
  118354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118355. "lsls r6, r6, #16\n\t"
  118356. #else
  118357. "lsl r6, r6, #16\n\t"
  118358. #endif
  118359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118360. "adds r4, r4, r6\n\t"
  118361. #else
  118362. "add r4, r4, r6\n\t"
  118363. #endif
  118364. #ifdef WOLFSSL_KEIL
  118365. "adcs r5, r5, r7\n\t"
  118366. #elif defined(__clang__)
  118367. "adcs r5, r7\n\t"
  118368. #else
  118369. "adc r5, r7\n\t"
  118370. #endif
  118371. #ifdef WOLFSSL_KEIL
  118372. "adcs r3, r3, %[r]\n\t"
  118373. #elif defined(__clang__)
  118374. "adcs r3, %[r]\n\t"
  118375. #else
  118376. "adc r3, %[r]\n\t"
  118377. #endif
  118378. "# A[1] * B[3]\n\t"
  118379. "mov %[a], r9\n\t"
  118380. "mov %[b], r10\n\t"
  118381. "ldr %[a], [%[a], #4]\n\t"
  118382. "ldr %[b], [%[b], #12]\n\t"
  118383. "uxth r6, %[a]\n\t"
  118384. "uxth r7, %[b]\n\t"
  118385. #ifdef WOLFSSL_KEIL
  118386. "muls r7, r6, r7\n\t"
  118387. #elif defined(__clang__)
  118388. "muls r7, r6\n\t"
  118389. #else
  118390. "mul r7, r6\n\t"
  118391. #endif
  118392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118393. "adds r4, r4, r7\n\t"
  118394. #else
  118395. "add r4, r4, r7\n\t"
  118396. #endif
  118397. #ifdef WOLFSSL_KEIL
  118398. "adcs r5, r5, %[r]\n\t"
  118399. #elif defined(__clang__)
  118400. "adcs r5, %[r]\n\t"
  118401. #else
  118402. "adc r5, %[r]\n\t"
  118403. #endif
  118404. #ifdef WOLFSSL_KEIL
  118405. "adcs r3, r3, %[r]\n\t"
  118406. #elif defined(__clang__)
  118407. "adcs r3, %[r]\n\t"
  118408. #else
  118409. "adc r3, %[r]\n\t"
  118410. #endif
  118411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118412. "lsrs r7, %[b], #16\n\t"
  118413. #else
  118414. "lsr r7, %[b], #16\n\t"
  118415. #endif
  118416. #ifdef WOLFSSL_KEIL
  118417. "muls r6, r7, r6\n\t"
  118418. #elif defined(__clang__)
  118419. "muls r6, r7\n\t"
  118420. #else
  118421. "mul r6, r7\n\t"
  118422. #endif
  118423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118424. "lsrs r7, r6, #16\n\t"
  118425. #else
  118426. "lsr r7, r6, #16\n\t"
  118427. #endif
  118428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118429. "lsls r6, r6, #16\n\t"
  118430. #else
  118431. "lsl r6, r6, #16\n\t"
  118432. #endif
  118433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118434. "adds r4, r4, r6\n\t"
  118435. #else
  118436. "add r4, r4, r6\n\t"
  118437. #endif
  118438. #ifdef WOLFSSL_KEIL
  118439. "adcs r5, r5, r7\n\t"
  118440. #elif defined(__clang__)
  118441. "adcs r5, r7\n\t"
  118442. #else
  118443. "adc r5, r7\n\t"
  118444. #endif
  118445. #ifdef WOLFSSL_KEIL
  118446. "adcs r3, r3, %[r]\n\t"
  118447. #elif defined(__clang__)
  118448. "adcs r3, %[r]\n\t"
  118449. #else
  118450. "adc r3, %[r]\n\t"
  118451. #endif
  118452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118453. "lsrs r6, %[a], #16\n\t"
  118454. #else
  118455. "lsr r6, %[a], #16\n\t"
  118456. #endif
  118457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118458. "lsrs r7, %[b], #16\n\t"
  118459. #else
  118460. "lsr r7, %[b], #16\n\t"
  118461. #endif
  118462. #ifdef WOLFSSL_KEIL
  118463. "muls r7, r6, r7\n\t"
  118464. #elif defined(__clang__)
  118465. "muls r7, r6\n\t"
  118466. #else
  118467. "mul r7, r6\n\t"
  118468. #endif
  118469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118470. "adds r5, r5, r7\n\t"
  118471. #else
  118472. "add r5, r5, r7\n\t"
  118473. #endif
  118474. #ifdef WOLFSSL_KEIL
  118475. "adcs r3, r3, %[r]\n\t"
  118476. #elif defined(__clang__)
  118477. "adcs r3, %[r]\n\t"
  118478. #else
  118479. "adc r3, %[r]\n\t"
  118480. #endif
  118481. "uxth r7, %[b]\n\t"
  118482. #ifdef WOLFSSL_KEIL
  118483. "muls r6, r7, r6\n\t"
  118484. #elif defined(__clang__)
  118485. "muls r6, r7\n\t"
  118486. #else
  118487. "mul r6, r7\n\t"
  118488. #endif
  118489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118490. "lsrs r7, r6, #16\n\t"
  118491. #else
  118492. "lsr r7, r6, #16\n\t"
  118493. #endif
  118494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118495. "lsls r6, r6, #16\n\t"
  118496. #else
  118497. "lsl r6, r6, #16\n\t"
  118498. #endif
  118499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118500. "adds r4, r4, r6\n\t"
  118501. #else
  118502. "add r4, r4, r6\n\t"
  118503. #endif
  118504. #ifdef WOLFSSL_KEIL
  118505. "adcs r5, r5, r7\n\t"
  118506. #elif defined(__clang__)
  118507. "adcs r5, r7\n\t"
  118508. #else
  118509. "adc r5, r7\n\t"
  118510. #endif
  118511. #ifdef WOLFSSL_KEIL
  118512. "adcs r3, r3, %[r]\n\t"
  118513. #elif defined(__clang__)
  118514. "adcs r3, %[r]\n\t"
  118515. #else
  118516. "adc r3, %[r]\n\t"
  118517. #endif
  118518. "# A[0] * B[4]\n\t"
  118519. "mov %[a], r9\n\t"
  118520. "mov %[b], r10\n\t"
  118521. "ldr %[a], [%[a]]\n\t"
  118522. "ldr %[b], [%[b], #16]\n\t"
  118523. "uxth r6, %[a]\n\t"
  118524. "uxth r7, %[b]\n\t"
  118525. #ifdef WOLFSSL_KEIL
  118526. "muls r7, r6, r7\n\t"
  118527. #elif defined(__clang__)
  118528. "muls r7, r6\n\t"
  118529. #else
  118530. "mul r7, r6\n\t"
  118531. #endif
  118532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118533. "adds r4, r4, r7\n\t"
  118534. #else
  118535. "add r4, r4, r7\n\t"
  118536. #endif
  118537. #ifdef WOLFSSL_KEIL
  118538. "adcs r5, r5, %[r]\n\t"
  118539. #elif defined(__clang__)
  118540. "adcs r5, %[r]\n\t"
  118541. #else
  118542. "adc r5, %[r]\n\t"
  118543. #endif
  118544. #ifdef WOLFSSL_KEIL
  118545. "adcs r3, r3, %[r]\n\t"
  118546. #elif defined(__clang__)
  118547. "adcs r3, %[r]\n\t"
  118548. #else
  118549. "adc r3, %[r]\n\t"
  118550. #endif
  118551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118552. "lsrs r7, %[b], #16\n\t"
  118553. #else
  118554. "lsr r7, %[b], #16\n\t"
  118555. #endif
  118556. #ifdef WOLFSSL_KEIL
  118557. "muls r6, r7, r6\n\t"
  118558. #elif defined(__clang__)
  118559. "muls r6, r7\n\t"
  118560. #else
  118561. "mul r6, r7\n\t"
  118562. #endif
  118563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118564. "lsrs r7, r6, #16\n\t"
  118565. #else
  118566. "lsr r7, r6, #16\n\t"
  118567. #endif
  118568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118569. "lsls r6, r6, #16\n\t"
  118570. #else
  118571. "lsl r6, r6, #16\n\t"
  118572. #endif
  118573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118574. "adds r4, r4, r6\n\t"
  118575. #else
  118576. "add r4, r4, r6\n\t"
  118577. #endif
  118578. #ifdef WOLFSSL_KEIL
  118579. "adcs r5, r5, r7\n\t"
  118580. #elif defined(__clang__)
  118581. "adcs r5, r7\n\t"
  118582. #else
  118583. "adc r5, r7\n\t"
  118584. #endif
  118585. #ifdef WOLFSSL_KEIL
  118586. "adcs r3, r3, %[r]\n\t"
  118587. #elif defined(__clang__)
  118588. "adcs r3, %[r]\n\t"
  118589. #else
  118590. "adc r3, %[r]\n\t"
  118591. #endif
  118592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118593. "lsrs r6, %[a], #16\n\t"
  118594. #else
  118595. "lsr r6, %[a], #16\n\t"
  118596. #endif
  118597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118598. "lsrs r7, %[b], #16\n\t"
  118599. #else
  118600. "lsr r7, %[b], #16\n\t"
  118601. #endif
  118602. #ifdef WOLFSSL_KEIL
  118603. "muls r7, r6, r7\n\t"
  118604. #elif defined(__clang__)
  118605. "muls r7, r6\n\t"
  118606. #else
  118607. "mul r7, r6\n\t"
  118608. #endif
  118609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118610. "adds r5, r5, r7\n\t"
  118611. #else
  118612. "add r5, r5, r7\n\t"
  118613. #endif
  118614. #ifdef WOLFSSL_KEIL
  118615. "adcs r3, r3, %[r]\n\t"
  118616. #elif defined(__clang__)
  118617. "adcs r3, %[r]\n\t"
  118618. #else
  118619. "adc r3, %[r]\n\t"
  118620. #endif
  118621. "uxth r7, %[b]\n\t"
  118622. #ifdef WOLFSSL_KEIL
  118623. "muls r6, r7, r6\n\t"
  118624. #elif defined(__clang__)
  118625. "muls r6, r7\n\t"
  118626. #else
  118627. "mul r6, r7\n\t"
  118628. #endif
  118629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118630. "lsrs r7, r6, #16\n\t"
  118631. #else
  118632. "lsr r7, r6, #16\n\t"
  118633. #endif
  118634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118635. "lsls r6, r6, #16\n\t"
  118636. #else
  118637. "lsl r6, r6, #16\n\t"
  118638. #endif
  118639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118640. "adds r4, r4, r6\n\t"
  118641. #else
  118642. "add r4, r4, r6\n\t"
  118643. #endif
  118644. #ifdef WOLFSSL_KEIL
  118645. "adcs r5, r5, r7\n\t"
  118646. #elif defined(__clang__)
  118647. "adcs r5, r7\n\t"
  118648. #else
  118649. "adc r5, r7\n\t"
  118650. #endif
  118651. #ifdef WOLFSSL_KEIL
  118652. "adcs r3, r3, %[r]\n\t"
  118653. #elif defined(__clang__)
  118654. "adcs r3, %[r]\n\t"
  118655. #else
  118656. "adc r3, %[r]\n\t"
  118657. #endif
  118658. "str r4, [sp, #16]\n\t"
  118659. "# A[0] * B[5]\n\t"
  118660. "movs r4, #0\n\t"
  118661. "mov %[a], r9\n\t"
  118662. "mov %[b], r10\n\t"
  118663. "ldr %[a], [%[a]]\n\t"
  118664. "ldr %[b], [%[b], #20]\n\t"
  118665. "uxth r6, %[a]\n\t"
  118666. "uxth r7, %[b]\n\t"
  118667. #ifdef WOLFSSL_KEIL
  118668. "muls r7, r6, r7\n\t"
  118669. #elif defined(__clang__)
  118670. "muls r7, r6\n\t"
  118671. #else
  118672. "mul r7, r6\n\t"
  118673. #endif
  118674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118675. "adds r5, r5, r7\n\t"
  118676. #else
  118677. "add r5, r5, r7\n\t"
  118678. #endif
  118679. #ifdef WOLFSSL_KEIL
  118680. "adcs r3, r3, %[r]\n\t"
  118681. #elif defined(__clang__)
  118682. "adcs r3, %[r]\n\t"
  118683. #else
  118684. "adc r3, %[r]\n\t"
  118685. #endif
  118686. #ifdef WOLFSSL_KEIL
  118687. "adcs r4, r4, %[r]\n\t"
  118688. #elif defined(__clang__)
  118689. "adcs r4, %[r]\n\t"
  118690. #else
  118691. "adc r4, %[r]\n\t"
  118692. #endif
  118693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118694. "lsrs r7, %[b], #16\n\t"
  118695. #else
  118696. "lsr r7, %[b], #16\n\t"
  118697. #endif
  118698. #ifdef WOLFSSL_KEIL
  118699. "muls r6, r7, r6\n\t"
  118700. #elif defined(__clang__)
  118701. "muls r6, r7\n\t"
  118702. #else
  118703. "mul r6, r7\n\t"
  118704. #endif
  118705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118706. "lsrs r7, r6, #16\n\t"
  118707. #else
  118708. "lsr r7, r6, #16\n\t"
  118709. #endif
  118710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118711. "lsls r6, r6, #16\n\t"
  118712. #else
  118713. "lsl r6, r6, #16\n\t"
  118714. #endif
  118715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118716. "adds r5, r5, r6\n\t"
  118717. #else
  118718. "add r5, r5, r6\n\t"
  118719. #endif
  118720. #ifdef WOLFSSL_KEIL
  118721. "adcs r3, r3, r7\n\t"
  118722. #elif defined(__clang__)
  118723. "adcs r3, r7\n\t"
  118724. #else
  118725. "adc r3, r7\n\t"
  118726. #endif
  118727. #ifdef WOLFSSL_KEIL
  118728. "adcs r4, r4, %[r]\n\t"
  118729. #elif defined(__clang__)
  118730. "adcs r4, %[r]\n\t"
  118731. #else
  118732. "adc r4, %[r]\n\t"
  118733. #endif
  118734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118735. "lsrs r6, %[a], #16\n\t"
  118736. #else
  118737. "lsr r6, %[a], #16\n\t"
  118738. #endif
  118739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118740. "lsrs r7, %[b], #16\n\t"
  118741. #else
  118742. "lsr r7, %[b], #16\n\t"
  118743. #endif
  118744. #ifdef WOLFSSL_KEIL
  118745. "muls r7, r6, r7\n\t"
  118746. #elif defined(__clang__)
  118747. "muls r7, r6\n\t"
  118748. #else
  118749. "mul r7, r6\n\t"
  118750. #endif
  118751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118752. "adds r3, r3, r7\n\t"
  118753. #else
  118754. "add r3, r3, r7\n\t"
  118755. #endif
  118756. #ifdef WOLFSSL_KEIL
  118757. "adcs r4, r4, %[r]\n\t"
  118758. #elif defined(__clang__)
  118759. "adcs r4, %[r]\n\t"
  118760. #else
  118761. "adc r4, %[r]\n\t"
  118762. #endif
  118763. "uxth r7, %[b]\n\t"
  118764. #ifdef WOLFSSL_KEIL
  118765. "muls r6, r7, r6\n\t"
  118766. #elif defined(__clang__)
  118767. "muls r6, r7\n\t"
  118768. #else
  118769. "mul r6, r7\n\t"
  118770. #endif
  118771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118772. "lsrs r7, r6, #16\n\t"
  118773. #else
  118774. "lsr r7, r6, #16\n\t"
  118775. #endif
  118776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118777. "lsls r6, r6, #16\n\t"
  118778. #else
  118779. "lsl r6, r6, #16\n\t"
  118780. #endif
  118781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118782. "adds r5, r5, r6\n\t"
  118783. #else
  118784. "add r5, r5, r6\n\t"
  118785. #endif
  118786. #ifdef WOLFSSL_KEIL
  118787. "adcs r3, r3, r7\n\t"
  118788. #elif defined(__clang__)
  118789. "adcs r3, r7\n\t"
  118790. #else
  118791. "adc r3, r7\n\t"
  118792. #endif
  118793. #ifdef WOLFSSL_KEIL
  118794. "adcs r4, r4, %[r]\n\t"
  118795. #elif defined(__clang__)
  118796. "adcs r4, %[r]\n\t"
  118797. #else
  118798. "adc r4, %[r]\n\t"
  118799. #endif
  118800. "# A[1] * B[4]\n\t"
  118801. "mov %[a], r9\n\t"
  118802. "mov %[b], r10\n\t"
  118803. "ldr %[a], [%[a], #4]\n\t"
  118804. "ldr %[b], [%[b], #16]\n\t"
  118805. "uxth r6, %[a]\n\t"
  118806. "uxth r7, %[b]\n\t"
  118807. #ifdef WOLFSSL_KEIL
  118808. "muls r7, r6, r7\n\t"
  118809. #elif defined(__clang__)
  118810. "muls r7, r6\n\t"
  118811. #else
  118812. "mul r7, r6\n\t"
  118813. #endif
  118814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118815. "adds r5, r5, r7\n\t"
  118816. #else
  118817. "add r5, r5, r7\n\t"
  118818. #endif
  118819. #ifdef WOLFSSL_KEIL
  118820. "adcs r3, r3, %[r]\n\t"
  118821. #elif defined(__clang__)
  118822. "adcs r3, %[r]\n\t"
  118823. #else
  118824. "adc r3, %[r]\n\t"
  118825. #endif
  118826. #ifdef WOLFSSL_KEIL
  118827. "adcs r4, r4, %[r]\n\t"
  118828. #elif defined(__clang__)
  118829. "adcs r4, %[r]\n\t"
  118830. #else
  118831. "adc r4, %[r]\n\t"
  118832. #endif
  118833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118834. "lsrs r7, %[b], #16\n\t"
  118835. #else
  118836. "lsr r7, %[b], #16\n\t"
  118837. #endif
  118838. #ifdef WOLFSSL_KEIL
  118839. "muls r6, r7, r6\n\t"
  118840. #elif defined(__clang__)
  118841. "muls r6, r7\n\t"
  118842. #else
  118843. "mul r6, r7\n\t"
  118844. #endif
  118845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118846. "lsrs r7, r6, #16\n\t"
  118847. #else
  118848. "lsr r7, r6, #16\n\t"
  118849. #endif
  118850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118851. "lsls r6, r6, #16\n\t"
  118852. #else
  118853. "lsl r6, r6, #16\n\t"
  118854. #endif
  118855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118856. "adds r5, r5, r6\n\t"
  118857. #else
  118858. "add r5, r5, r6\n\t"
  118859. #endif
  118860. #ifdef WOLFSSL_KEIL
  118861. "adcs r3, r3, r7\n\t"
  118862. #elif defined(__clang__)
  118863. "adcs r3, r7\n\t"
  118864. #else
  118865. "adc r3, r7\n\t"
  118866. #endif
  118867. #ifdef WOLFSSL_KEIL
  118868. "adcs r4, r4, %[r]\n\t"
  118869. #elif defined(__clang__)
  118870. "adcs r4, %[r]\n\t"
  118871. #else
  118872. "adc r4, %[r]\n\t"
  118873. #endif
  118874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118875. "lsrs r6, %[a], #16\n\t"
  118876. #else
  118877. "lsr r6, %[a], #16\n\t"
  118878. #endif
  118879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118880. "lsrs r7, %[b], #16\n\t"
  118881. #else
  118882. "lsr r7, %[b], #16\n\t"
  118883. #endif
  118884. #ifdef WOLFSSL_KEIL
  118885. "muls r7, r6, r7\n\t"
  118886. #elif defined(__clang__)
  118887. "muls r7, r6\n\t"
  118888. #else
  118889. "mul r7, r6\n\t"
  118890. #endif
  118891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118892. "adds r3, r3, r7\n\t"
  118893. #else
  118894. "add r3, r3, r7\n\t"
  118895. #endif
  118896. #ifdef WOLFSSL_KEIL
  118897. "adcs r4, r4, %[r]\n\t"
  118898. #elif defined(__clang__)
  118899. "adcs r4, %[r]\n\t"
  118900. #else
  118901. "adc r4, %[r]\n\t"
  118902. #endif
  118903. "uxth r7, %[b]\n\t"
  118904. #ifdef WOLFSSL_KEIL
  118905. "muls r6, r7, r6\n\t"
  118906. #elif defined(__clang__)
  118907. "muls r6, r7\n\t"
  118908. #else
  118909. "mul r6, r7\n\t"
  118910. #endif
  118911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118912. "lsrs r7, r6, #16\n\t"
  118913. #else
  118914. "lsr r7, r6, #16\n\t"
  118915. #endif
  118916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118917. "lsls r6, r6, #16\n\t"
  118918. #else
  118919. "lsl r6, r6, #16\n\t"
  118920. #endif
  118921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118922. "adds r5, r5, r6\n\t"
  118923. #else
  118924. "add r5, r5, r6\n\t"
  118925. #endif
  118926. #ifdef WOLFSSL_KEIL
  118927. "adcs r3, r3, r7\n\t"
  118928. #elif defined(__clang__)
  118929. "adcs r3, r7\n\t"
  118930. #else
  118931. "adc r3, r7\n\t"
  118932. #endif
  118933. #ifdef WOLFSSL_KEIL
  118934. "adcs r4, r4, %[r]\n\t"
  118935. #elif defined(__clang__)
  118936. "adcs r4, %[r]\n\t"
  118937. #else
  118938. "adc r4, %[r]\n\t"
  118939. #endif
  118940. "# A[2] * B[3]\n\t"
  118941. "mov %[a], r9\n\t"
  118942. "mov %[b], r10\n\t"
  118943. "ldr %[a], [%[a], #8]\n\t"
  118944. "ldr %[b], [%[b], #12]\n\t"
  118945. "uxth r6, %[a]\n\t"
  118946. "uxth r7, %[b]\n\t"
  118947. #ifdef WOLFSSL_KEIL
  118948. "muls r7, r6, r7\n\t"
  118949. #elif defined(__clang__)
  118950. "muls r7, r6\n\t"
  118951. #else
  118952. "mul r7, r6\n\t"
  118953. #endif
  118954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118955. "adds r5, r5, r7\n\t"
  118956. #else
  118957. "add r5, r5, r7\n\t"
  118958. #endif
  118959. #ifdef WOLFSSL_KEIL
  118960. "adcs r3, r3, %[r]\n\t"
  118961. #elif defined(__clang__)
  118962. "adcs r3, %[r]\n\t"
  118963. #else
  118964. "adc r3, %[r]\n\t"
  118965. #endif
  118966. #ifdef WOLFSSL_KEIL
  118967. "adcs r4, r4, %[r]\n\t"
  118968. #elif defined(__clang__)
  118969. "adcs r4, %[r]\n\t"
  118970. #else
  118971. "adc r4, %[r]\n\t"
  118972. #endif
  118973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118974. "lsrs r7, %[b], #16\n\t"
  118975. #else
  118976. "lsr r7, %[b], #16\n\t"
  118977. #endif
  118978. #ifdef WOLFSSL_KEIL
  118979. "muls r6, r7, r6\n\t"
  118980. #elif defined(__clang__)
  118981. "muls r6, r7\n\t"
  118982. #else
  118983. "mul r6, r7\n\t"
  118984. #endif
  118985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118986. "lsrs r7, r6, #16\n\t"
  118987. #else
  118988. "lsr r7, r6, #16\n\t"
  118989. #endif
  118990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118991. "lsls r6, r6, #16\n\t"
  118992. #else
  118993. "lsl r6, r6, #16\n\t"
  118994. #endif
  118995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118996. "adds r5, r5, r6\n\t"
  118997. #else
  118998. "add r5, r5, r6\n\t"
  118999. #endif
  119000. #ifdef WOLFSSL_KEIL
  119001. "adcs r3, r3, r7\n\t"
  119002. #elif defined(__clang__)
  119003. "adcs r3, r7\n\t"
  119004. #else
  119005. "adc r3, r7\n\t"
  119006. #endif
  119007. #ifdef WOLFSSL_KEIL
  119008. "adcs r4, r4, %[r]\n\t"
  119009. #elif defined(__clang__)
  119010. "adcs r4, %[r]\n\t"
  119011. #else
  119012. "adc r4, %[r]\n\t"
  119013. #endif
  119014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119015. "lsrs r6, %[a], #16\n\t"
  119016. #else
  119017. "lsr r6, %[a], #16\n\t"
  119018. #endif
  119019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119020. "lsrs r7, %[b], #16\n\t"
  119021. #else
  119022. "lsr r7, %[b], #16\n\t"
  119023. #endif
  119024. #ifdef WOLFSSL_KEIL
  119025. "muls r7, r6, r7\n\t"
  119026. #elif defined(__clang__)
  119027. "muls r7, r6\n\t"
  119028. #else
  119029. "mul r7, r6\n\t"
  119030. #endif
  119031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119032. "adds r3, r3, r7\n\t"
  119033. #else
  119034. "add r3, r3, r7\n\t"
  119035. #endif
  119036. #ifdef WOLFSSL_KEIL
  119037. "adcs r4, r4, %[r]\n\t"
  119038. #elif defined(__clang__)
  119039. "adcs r4, %[r]\n\t"
  119040. #else
  119041. "adc r4, %[r]\n\t"
  119042. #endif
  119043. "uxth r7, %[b]\n\t"
  119044. #ifdef WOLFSSL_KEIL
  119045. "muls r6, r7, r6\n\t"
  119046. #elif defined(__clang__)
  119047. "muls r6, r7\n\t"
  119048. #else
  119049. "mul r6, r7\n\t"
  119050. #endif
  119051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119052. "lsrs r7, r6, #16\n\t"
  119053. #else
  119054. "lsr r7, r6, #16\n\t"
  119055. #endif
  119056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119057. "lsls r6, r6, #16\n\t"
  119058. #else
  119059. "lsl r6, r6, #16\n\t"
  119060. #endif
  119061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119062. "adds r5, r5, r6\n\t"
  119063. #else
  119064. "add r5, r5, r6\n\t"
  119065. #endif
  119066. #ifdef WOLFSSL_KEIL
  119067. "adcs r3, r3, r7\n\t"
  119068. #elif defined(__clang__)
  119069. "adcs r3, r7\n\t"
  119070. #else
  119071. "adc r3, r7\n\t"
  119072. #endif
  119073. #ifdef WOLFSSL_KEIL
  119074. "adcs r4, r4, %[r]\n\t"
  119075. #elif defined(__clang__)
  119076. "adcs r4, %[r]\n\t"
  119077. #else
  119078. "adc r4, %[r]\n\t"
  119079. #endif
  119080. "# A[3] * B[2]\n\t"
  119081. "mov %[a], r9\n\t"
  119082. "mov %[b], r10\n\t"
  119083. "ldr %[a], [%[a], #12]\n\t"
  119084. "ldr %[b], [%[b], #8]\n\t"
  119085. "uxth r6, %[a]\n\t"
  119086. "uxth r7, %[b]\n\t"
  119087. #ifdef WOLFSSL_KEIL
  119088. "muls r7, r6, r7\n\t"
  119089. #elif defined(__clang__)
  119090. "muls r7, r6\n\t"
  119091. #else
  119092. "mul r7, r6\n\t"
  119093. #endif
  119094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119095. "adds r5, r5, r7\n\t"
  119096. #else
  119097. "add r5, r5, r7\n\t"
  119098. #endif
  119099. #ifdef WOLFSSL_KEIL
  119100. "adcs r3, r3, %[r]\n\t"
  119101. #elif defined(__clang__)
  119102. "adcs r3, %[r]\n\t"
  119103. #else
  119104. "adc r3, %[r]\n\t"
  119105. #endif
  119106. #ifdef WOLFSSL_KEIL
  119107. "adcs r4, r4, %[r]\n\t"
  119108. #elif defined(__clang__)
  119109. "adcs r4, %[r]\n\t"
  119110. #else
  119111. "adc r4, %[r]\n\t"
  119112. #endif
  119113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119114. "lsrs r7, %[b], #16\n\t"
  119115. #else
  119116. "lsr r7, %[b], #16\n\t"
  119117. #endif
  119118. #ifdef WOLFSSL_KEIL
  119119. "muls r6, r7, r6\n\t"
  119120. #elif defined(__clang__)
  119121. "muls r6, r7\n\t"
  119122. #else
  119123. "mul r6, r7\n\t"
  119124. #endif
  119125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119126. "lsrs r7, r6, #16\n\t"
  119127. #else
  119128. "lsr r7, r6, #16\n\t"
  119129. #endif
  119130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119131. "lsls r6, r6, #16\n\t"
  119132. #else
  119133. "lsl r6, r6, #16\n\t"
  119134. #endif
  119135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119136. "adds r5, r5, r6\n\t"
  119137. #else
  119138. "add r5, r5, r6\n\t"
  119139. #endif
  119140. #ifdef WOLFSSL_KEIL
  119141. "adcs r3, r3, r7\n\t"
  119142. #elif defined(__clang__)
  119143. "adcs r3, r7\n\t"
  119144. #else
  119145. "adc r3, r7\n\t"
  119146. #endif
  119147. #ifdef WOLFSSL_KEIL
  119148. "adcs r4, r4, %[r]\n\t"
  119149. #elif defined(__clang__)
  119150. "adcs r4, %[r]\n\t"
  119151. #else
  119152. "adc r4, %[r]\n\t"
  119153. #endif
  119154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119155. "lsrs r6, %[a], #16\n\t"
  119156. #else
  119157. "lsr r6, %[a], #16\n\t"
  119158. #endif
  119159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119160. "lsrs r7, %[b], #16\n\t"
  119161. #else
  119162. "lsr r7, %[b], #16\n\t"
  119163. #endif
  119164. #ifdef WOLFSSL_KEIL
  119165. "muls r7, r6, r7\n\t"
  119166. #elif defined(__clang__)
  119167. "muls r7, r6\n\t"
  119168. #else
  119169. "mul r7, r6\n\t"
  119170. #endif
  119171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119172. "adds r3, r3, r7\n\t"
  119173. #else
  119174. "add r3, r3, r7\n\t"
  119175. #endif
  119176. #ifdef WOLFSSL_KEIL
  119177. "adcs r4, r4, %[r]\n\t"
  119178. #elif defined(__clang__)
  119179. "adcs r4, %[r]\n\t"
  119180. #else
  119181. "adc r4, %[r]\n\t"
  119182. #endif
  119183. "uxth r7, %[b]\n\t"
  119184. #ifdef WOLFSSL_KEIL
  119185. "muls r6, r7, r6\n\t"
  119186. #elif defined(__clang__)
  119187. "muls r6, r7\n\t"
  119188. #else
  119189. "mul r6, r7\n\t"
  119190. #endif
  119191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119192. "lsrs r7, r6, #16\n\t"
  119193. #else
  119194. "lsr r7, r6, #16\n\t"
  119195. #endif
  119196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119197. "lsls r6, r6, #16\n\t"
  119198. #else
  119199. "lsl r6, r6, #16\n\t"
  119200. #endif
  119201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119202. "adds r5, r5, r6\n\t"
  119203. #else
  119204. "add r5, r5, r6\n\t"
  119205. #endif
  119206. #ifdef WOLFSSL_KEIL
  119207. "adcs r3, r3, r7\n\t"
  119208. #elif defined(__clang__)
  119209. "adcs r3, r7\n\t"
  119210. #else
  119211. "adc r3, r7\n\t"
  119212. #endif
  119213. #ifdef WOLFSSL_KEIL
  119214. "adcs r4, r4, %[r]\n\t"
  119215. #elif defined(__clang__)
  119216. "adcs r4, %[r]\n\t"
  119217. #else
  119218. "adc r4, %[r]\n\t"
  119219. #endif
  119220. "# A[4] * B[1]\n\t"
  119221. "mov %[a], r9\n\t"
  119222. "mov %[b], r10\n\t"
  119223. "ldr %[a], [%[a], #16]\n\t"
  119224. "ldr %[b], [%[b], #4]\n\t"
  119225. "uxth r6, %[a]\n\t"
  119226. "uxth r7, %[b]\n\t"
  119227. #ifdef WOLFSSL_KEIL
  119228. "muls r7, r6, r7\n\t"
  119229. #elif defined(__clang__)
  119230. "muls r7, r6\n\t"
  119231. #else
  119232. "mul r7, r6\n\t"
  119233. #endif
  119234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119235. "adds r5, r5, r7\n\t"
  119236. #else
  119237. "add r5, r5, r7\n\t"
  119238. #endif
  119239. #ifdef WOLFSSL_KEIL
  119240. "adcs r3, r3, %[r]\n\t"
  119241. #elif defined(__clang__)
  119242. "adcs r3, %[r]\n\t"
  119243. #else
  119244. "adc r3, %[r]\n\t"
  119245. #endif
  119246. #ifdef WOLFSSL_KEIL
  119247. "adcs r4, r4, %[r]\n\t"
  119248. #elif defined(__clang__)
  119249. "adcs r4, %[r]\n\t"
  119250. #else
  119251. "adc r4, %[r]\n\t"
  119252. #endif
  119253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119254. "lsrs r7, %[b], #16\n\t"
  119255. #else
  119256. "lsr r7, %[b], #16\n\t"
  119257. #endif
  119258. #ifdef WOLFSSL_KEIL
  119259. "muls r6, r7, r6\n\t"
  119260. #elif defined(__clang__)
  119261. "muls r6, r7\n\t"
  119262. #else
  119263. "mul r6, r7\n\t"
  119264. #endif
  119265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119266. "lsrs r7, r6, #16\n\t"
  119267. #else
  119268. "lsr r7, r6, #16\n\t"
  119269. #endif
  119270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119271. "lsls r6, r6, #16\n\t"
  119272. #else
  119273. "lsl r6, r6, #16\n\t"
  119274. #endif
  119275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119276. "adds r5, r5, r6\n\t"
  119277. #else
  119278. "add r5, r5, r6\n\t"
  119279. #endif
  119280. #ifdef WOLFSSL_KEIL
  119281. "adcs r3, r3, r7\n\t"
  119282. #elif defined(__clang__)
  119283. "adcs r3, r7\n\t"
  119284. #else
  119285. "adc r3, r7\n\t"
  119286. #endif
  119287. #ifdef WOLFSSL_KEIL
  119288. "adcs r4, r4, %[r]\n\t"
  119289. #elif defined(__clang__)
  119290. "adcs r4, %[r]\n\t"
  119291. #else
  119292. "adc r4, %[r]\n\t"
  119293. #endif
  119294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119295. "lsrs r6, %[a], #16\n\t"
  119296. #else
  119297. "lsr r6, %[a], #16\n\t"
  119298. #endif
  119299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119300. "lsrs r7, %[b], #16\n\t"
  119301. #else
  119302. "lsr r7, %[b], #16\n\t"
  119303. #endif
  119304. #ifdef WOLFSSL_KEIL
  119305. "muls r7, r6, r7\n\t"
  119306. #elif defined(__clang__)
  119307. "muls r7, r6\n\t"
  119308. #else
  119309. "mul r7, r6\n\t"
  119310. #endif
  119311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119312. "adds r3, r3, r7\n\t"
  119313. #else
  119314. "add r3, r3, r7\n\t"
  119315. #endif
  119316. #ifdef WOLFSSL_KEIL
  119317. "adcs r4, r4, %[r]\n\t"
  119318. #elif defined(__clang__)
  119319. "adcs r4, %[r]\n\t"
  119320. #else
  119321. "adc r4, %[r]\n\t"
  119322. #endif
  119323. "uxth r7, %[b]\n\t"
  119324. #ifdef WOLFSSL_KEIL
  119325. "muls r6, r7, r6\n\t"
  119326. #elif defined(__clang__)
  119327. "muls r6, r7\n\t"
  119328. #else
  119329. "mul r6, r7\n\t"
  119330. #endif
  119331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119332. "lsrs r7, r6, #16\n\t"
  119333. #else
  119334. "lsr r7, r6, #16\n\t"
  119335. #endif
  119336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119337. "lsls r6, r6, #16\n\t"
  119338. #else
  119339. "lsl r6, r6, #16\n\t"
  119340. #endif
  119341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119342. "adds r5, r5, r6\n\t"
  119343. #else
  119344. "add r5, r5, r6\n\t"
  119345. #endif
  119346. #ifdef WOLFSSL_KEIL
  119347. "adcs r3, r3, r7\n\t"
  119348. #elif defined(__clang__)
  119349. "adcs r3, r7\n\t"
  119350. #else
  119351. "adc r3, r7\n\t"
  119352. #endif
  119353. #ifdef WOLFSSL_KEIL
  119354. "adcs r4, r4, %[r]\n\t"
  119355. #elif defined(__clang__)
  119356. "adcs r4, %[r]\n\t"
  119357. #else
  119358. "adc r4, %[r]\n\t"
  119359. #endif
  119360. "# A[5] * B[0]\n\t"
  119361. "mov %[a], r9\n\t"
  119362. "mov %[b], r10\n\t"
  119363. "ldr %[a], [%[a], #20]\n\t"
  119364. "ldr %[b], [%[b]]\n\t"
  119365. "uxth r6, %[a]\n\t"
  119366. "uxth r7, %[b]\n\t"
  119367. #ifdef WOLFSSL_KEIL
  119368. "muls r7, r6, r7\n\t"
  119369. #elif defined(__clang__)
  119370. "muls r7, r6\n\t"
  119371. #else
  119372. "mul r7, r6\n\t"
  119373. #endif
  119374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119375. "adds r5, r5, r7\n\t"
  119376. #else
  119377. "add r5, r5, r7\n\t"
  119378. #endif
  119379. #ifdef WOLFSSL_KEIL
  119380. "adcs r3, r3, %[r]\n\t"
  119381. #elif defined(__clang__)
  119382. "adcs r3, %[r]\n\t"
  119383. #else
  119384. "adc r3, %[r]\n\t"
  119385. #endif
  119386. #ifdef WOLFSSL_KEIL
  119387. "adcs r4, r4, %[r]\n\t"
  119388. #elif defined(__clang__)
  119389. "adcs r4, %[r]\n\t"
  119390. #else
  119391. "adc r4, %[r]\n\t"
  119392. #endif
  119393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119394. "lsrs r7, %[b], #16\n\t"
  119395. #else
  119396. "lsr r7, %[b], #16\n\t"
  119397. #endif
  119398. #ifdef WOLFSSL_KEIL
  119399. "muls r6, r7, r6\n\t"
  119400. #elif defined(__clang__)
  119401. "muls r6, r7\n\t"
  119402. #else
  119403. "mul r6, r7\n\t"
  119404. #endif
  119405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119406. "lsrs r7, r6, #16\n\t"
  119407. #else
  119408. "lsr r7, r6, #16\n\t"
  119409. #endif
  119410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119411. "lsls r6, r6, #16\n\t"
  119412. #else
  119413. "lsl r6, r6, #16\n\t"
  119414. #endif
  119415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119416. "adds r5, r5, r6\n\t"
  119417. #else
  119418. "add r5, r5, r6\n\t"
  119419. #endif
  119420. #ifdef WOLFSSL_KEIL
  119421. "adcs r3, r3, r7\n\t"
  119422. #elif defined(__clang__)
  119423. "adcs r3, r7\n\t"
  119424. #else
  119425. "adc r3, r7\n\t"
  119426. #endif
  119427. #ifdef WOLFSSL_KEIL
  119428. "adcs r4, r4, %[r]\n\t"
  119429. #elif defined(__clang__)
  119430. "adcs r4, %[r]\n\t"
  119431. #else
  119432. "adc r4, %[r]\n\t"
  119433. #endif
  119434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119435. "lsrs r6, %[a], #16\n\t"
  119436. #else
  119437. "lsr r6, %[a], #16\n\t"
  119438. #endif
  119439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119440. "lsrs r7, %[b], #16\n\t"
  119441. #else
  119442. "lsr r7, %[b], #16\n\t"
  119443. #endif
  119444. #ifdef WOLFSSL_KEIL
  119445. "muls r7, r6, r7\n\t"
  119446. #elif defined(__clang__)
  119447. "muls r7, r6\n\t"
  119448. #else
  119449. "mul r7, r6\n\t"
  119450. #endif
  119451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119452. "adds r3, r3, r7\n\t"
  119453. #else
  119454. "add r3, r3, r7\n\t"
  119455. #endif
  119456. #ifdef WOLFSSL_KEIL
  119457. "adcs r4, r4, %[r]\n\t"
  119458. #elif defined(__clang__)
  119459. "adcs r4, %[r]\n\t"
  119460. #else
  119461. "adc r4, %[r]\n\t"
  119462. #endif
  119463. "uxth r7, %[b]\n\t"
  119464. #ifdef WOLFSSL_KEIL
  119465. "muls r6, r7, r6\n\t"
  119466. #elif defined(__clang__)
  119467. "muls r6, r7\n\t"
  119468. #else
  119469. "mul r6, r7\n\t"
  119470. #endif
  119471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119472. "lsrs r7, r6, #16\n\t"
  119473. #else
  119474. "lsr r7, r6, #16\n\t"
  119475. #endif
  119476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119477. "lsls r6, r6, #16\n\t"
  119478. #else
  119479. "lsl r6, r6, #16\n\t"
  119480. #endif
  119481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119482. "adds r5, r5, r6\n\t"
  119483. #else
  119484. "add r5, r5, r6\n\t"
  119485. #endif
  119486. #ifdef WOLFSSL_KEIL
  119487. "adcs r3, r3, r7\n\t"
  119488. #elif defined(__clang__)
  119489. "adcs r3, r7\n\t"
  119490. #else
  119491. "adc r3, r7\n\t"
  119492. #endif
  119493. #ifdef WOLFSSL_KEIL
  119494. "adcs r4, r4, %[r]\n\t"
  119495. #elif defined(__clang__)
  119496. "adcs r4, %[r]\n\t"
  119497. #else
  119498. "adc r4, %[r]\n\t"
  119499. #endif
  119500. "str r5, [sp, #20]\n\t"
  119501. "# A[6] * B[0]\n\t"
  119502. "movs r5, #0\n\t"
  119503. "mov %[a], r9\n\t"
  119504. "mov %[b], r10\n\t"
  119505. "ldr %[a], [%[a], #24]\n\t"
  119506. "ldr %[b], [%[b]]\n\t"
  119507. "uxth r6, %[a]\n\t"
  119508. "uxth r7, %[b]\n\t"
  119509. #ifdef WOLFSSL_KEIL
  119510. "muls r7, r6, r7\n\t"
  119511. #elif defined(__clang__)
  119512. "muls r7, r6\n\t"
  119513. #else
  119514. "mul r7, r6\n\t"
  119515. #endif
  119516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119517. "adds r3, r3, r7\n\t"
  119518. #else
  119519. "add r3, r3, r7\n\t"
  119520. #endif
  119521. #ifdef WOLFSSL_KEIL
  119522. "adcs r4, r4, %[r]\n\t"
  119523. #elif defined(__clang__)
  119524. "adcs r4, %[r]\n\t"
  119525. #else
  119526. "adc r4, %[r]\n\t"
  119527. #endif
  119528. #ifdef WOLFSSL_KEIL
  119529. "adcs r5, r5, %[r]\n\t"
  119530. #elif defined(__clang__)
  119531. "adcs r5, %[r]\n\t"
  119532. #else
  119533. "adc r5, %[r]\n\t"
  119534. #endif
  119535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119536. "lsrs r7, %[b], #16\n\t"
  119537. #else
  119538. "lsr r7, %[b], #16\n\t"
  119539. #endif
  119540. #ifdef WOLFSSL_KEIL
  119541. "muls r6, r7, r6\n\t"
  119542. #elif defined(__clang__)
  119543. "muls r6, r7\n\t"
  119544. #else
  119545. "mul r6, r7\n\t"
  119546. #endif
  119547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119548. "lsrs r7, r6, #16\n\t"
  119549. #else
  119550. "lsr r7, r6, #16\n\t"
  119551. #endif
  119552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119553. "lsls r6, r6, #16\n\t"
  119554. #else
  119555. "lsl r6, r6, #16\n\t"
  119556. #endif
  119557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119558. "adds r3, r3, r6\n\t"
  119559. #else
  119560. "add r3, r3, r6\n\t"
  119561. #endif
  119562. #ifdef WOLFSSL_KEIL
  119563. "adcs r4, r4, r7\n\t"
  119564. #elif defined(__clang__)
  119565. "adcs r4, r7\n\t"
  119566. #else
  119567. "adc r4, r7\n\t"
  119568. #endif
  119569. #ifdef WOLFSSL_KEIL
  119570. "adcs r5, r5, %[r]\n\t"
  119571. #elif defined(__clang__)
  119572. "adcs r5, %[r]\n\t"
  119573. #else
  119574. "adc r5, %[r]\n\t"
  119575. #endif
  119576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119577. "lsrs r6, %[a], #16\n\t"
  119578. #else
  119579. "lsr r6, %[a], #16\n\t"
  119580. #endif
  119581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119582. "lsrs r7, %[b], #16\n\t"
  119583. #else
  119584. "lsr r7, %[b], #16\n\t"
  119585. #endif
  119586. #ifdef WOLFSSL_KEIL
  119587. "muls r7, r6, r7\n\t"
  119588. #elif defined(__clang__)
  119589. "muls r7, r6\n\t"
  119590. #else
  119591. "mul r7, r6\n\t"
  119592. #endif
  119593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119594. "adds r4, r4, r7\n\t"
  119595. #else
  119596. "add r4, r4, r7\n\t"
  119597. #endif
  119598. #ifdef WOLFSSL_KEIL
  119599. "adcs r5, r5, %[r]\n\t"
  119600. #elif defined(__clang__)
  119601. "adcs r5, %[r]\n\t"
  119602. #else
  119603. "adc r5, %[r]\n\t"
  119604. #endif
  119605. "uxth r7, %[b]\n\t"
  119606. #ifdef WOLFSSL_KEIL
  119607. "muls r6, r7, r6\n\t"
  119608. #elif defined(__clang__)
  119609. "muls r6, r7\n\t"
  119610. #else
  119611. "mul r6, r7\n\t"
  119612. #endif
  119613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119614. "lsrs r7, r6, #16\n\t"
  119615. #else
  119616. "lsr r7, r6, #16\n\t"
  119617. #endif
  119618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119619. "lsls r6, r6, #16\n\t"
  119620. #else
  119621. "lsl r6, r6, #16\n\t"
  119622. #endif
  119623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119624. "adds r3, r3, r6\n\t"
  119625. #else
  119626. "add r3, r3, r6\n\t"
  119627. #endif
  119628. #ifdef WOLFSSL_KEIL
  119629. "adcs r4, r4, r7\n\t"
  119630. #elif defined(__clang__)
  119631. "adcs r4, r7\n\t"
  119632. #else
  119633. "adc r4, r7\n\t"
  119634. #endif
  119635. #ifdef WOLFSSL_KEIL
  119636. "adcs r5, r5, %[r]\n\t"
  119637. #elif defined(__clang__)
  119638. "adcs r5, %[r]\n\t"
  119639. #else
  119640. "adc r5, %[r]\n\t"
  119641. #endif
  119642. "# A[5] * B[1]\n\t"
  119643. "mov %[a], r9\n\t"
  119644. "mov %[b], r10\n\t"
  119645. "ldr %[a], [%[a], #20]\n\t"
  119646. "ldr %[b], [%[b], #4]\n\t"
  119647. "uxth r6, %[a]\n\t"
  119648. "uxth r7, %[b]\n\t"
  119649. #ifdef WOLFSSL_KEIL
  119650. "muls r7, r6, r7\n\t"
  119651. #elif defined(__clang__)
  119652. "muls r7, r6\n\t"
  119653. #else
  119654. "mul r7, r6\n\t"
  119655. #endif
  119656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119657. "adds r3, r3, r7\n\t"
  119658. #else
  119659. "add r3, r3, r7\n\t"
  119660. #endif
  119661. #ifdef WOLFSSL_KEIL
  119662. "adcs r4, r4, %[r]\n\t"
  119663. #elif defined(__clang__)
  119664. "adcs r4, %[r]\n\t"
  119665. #else
  119666. "adc r4, %[r]\n\t"
  119667. #endif
  119668. #ifdef WOLFSSL_KEIL
  119669. "adcs r5, r5, %[r]\n\t"
  119670. #elif defined(__clang__)
  119671. "adcs r5, %[r]\n\t"
  119672. #else
  119673. "adc r5, %[r]\n\t"
  119674. #endif
  119675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119676. "lsrs r7, %[b], #16\n\t"
  119677. #else
  119678. "lsr r7, %[b], #16\n\t"
  119679. #endif
  119680. #ifdef WOLFSSL_KEIL
  119681. "muls r6, r7, r6\n\t"
  119682. #elif defined(__clang__)
  119683. "muls r6, r7\n\t"
  119684. #else
  119685. "mul r6, r7\n\t"
  119686. #endif
  119687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119688. "lsrs r7, r6, #16\n\t"
  119689. #else
  119690. "lsr r7, r6, #16\n\t"
  119691. #endif
  119692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119693. "lsls r6, r6, #16\n\t"
  119694. #else
  119695. "lsl r6, r6, #16\n\t"
  119696. #endif
  119697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119698. "adds r3, r3, r6\n\t"
  119699. #else
  119700. "add r3, r3, r6\n\t"
  119701. #endif
  119702. #ifdef WOLFSSL_KEIL
  119703. "adcs r4, r4, r7\n\t"
  119704. #elif defined(__clang__)
  119705. "adcs r4, r7\n\t"
  119706. #else
  119707. "adc r4, r7\n\t"
  119708. #endif
  119709. #ifdef WOLFSSL_KEIL
  119710. "adcs r5, r5, %[r]\n\t"
  119711. #elif defined(__clang__)
  119712. "adcs r5, %[r]\n\t"
  119713. #else
  119714. "adc r5, %[r]\n\t"
  119715. #endif
  119716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119717. "lsrs r6, %[a], #16\n\t"
  119718. #else
  119719. "lsr r6, %[a], #16\n\t"
  119720. #endif
  119721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119722. "lsrs r7, %[b], #16\n\t"
  119723. #else
  119724. "lsr r7, %[b], #16\n\t"
  119725. #endif
  119726. #ifdef WOLFSSL_KEIL
  119727. "muls r7, r6, r7\n\t"
  119728. #elif defined(__clang__)
  119729. "muls r7, r6\n\t"
  119730. #else
  119731. "mul r7, r6\n\t"
  119732. #endif
  119733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119734. "adds r4, r4, r7\n\t"
  119735. #else
  119736. "add r4, r4, r7\n\t"
  119737. #endif
  119738. #ifdef WOLFSSL_KEIL
  119739. "adcs r5, r5, %[r]\n\t"
  119740. #elif defined(__clang__)
  119741. "adcs r5, %[r]\n\t"
  119742. #else
  119743. "adc r5, %[r]\n\t"
  119744. #endif
  119745. "uxth r7, %[b]\n\t"
  119746. #ifdef WOLFSSL_KEIL
  119747. "muls r6, r7, r6\n\t"
  119748. #elif defined(__clang__)
  119749. "muls r6, r7\n\t"
  119750. #else
  119751. "mul r6, r7\n\t"
  119752. #endif
  119753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119754. "lsrs r7, r6, #16\n\t"
  119755. #else
  119756. "lsr r7, r6, #16\n\t"
  119757. #endif
  119758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119759. "lsls r6, r6, #16\n\t"
  119760. #else
  119761. "lsl r6, r6, #16\n\t"
  119762. #endif
  119763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119764. "adds r3, r3, r6\n\t"
  119765. #else
  119766. "add r3, r3, r6\n\t"
  119767. #endif
  119768. #ifdef WOLFSSL_KEIL
  119769. "adcs r4, r4, r7\n\t"
  119770. #elif defined(__clang__)
  119771. "adcs r4, r7\n\t"
  119772. #else
  119773. "adc r4, r7\n\t"
  119774. #endif
  119775. #ifdef WOLFSSL_KEIL
  119776. "adcs r5, r5, %[r]\n\t"
  119777. #elif defined(__clang__)
  119778. "adcs r5, %[r]\n\t"
  119779. #else
  119780. "adc r5, %[r]\n\t"
  119781. #endif
  119782. "# A[4] * B[2]\n\t"
  119783. "mov %[a], r9\n\t"
  119784. "mov %[b], r10\n\t"
  119785. "ldr %[a], [%[a], #16]\n\t"
  119786. "ldr %[b], [%[b], #8]\n\t"
  119787. "uxth r6, %[a]\n\t"
  119788. "uxth r7, %[b]\n\t"
  119789. #ifdef WOLFSSL_KEIL
  119790. "muls r7, r6, r7\n\t"
  119791. #elif defined(__clang__)
  119792. "muls r7, r6\n\t"
  119793. #else
  119794. "mul r7, r6\n\t"
  119795. #endif
  119796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119797. "adds r3, r3, r7\n\t"
  119798. #else
  119799. "add r3, r3, r7\n\t"
  119800. #endif
  119801. #ifdef WOLFSSL_KEIL
  119802. "adcs r4, r4, %[r]\n\t"
  119803. #elif defined(__clang__)
  119804. "adcs r4, %[r]\n\t"
  119805. #else
  119806. "adc r4, %[r]\n\t"
  119807. #endif
  119808. #ifdef WOLFSSL_KEIL
  119809. "adcs r5, r5, %[r]\n\t"
  119810. #elif defined(__clang__)
  119811. "adcs r5, %[r]\n\t"
  119812. #else
  119813. "adc r5, %[r]\n\t"
  119814. #endif
  119815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119816. "lsrs r7, %[b], #16\n\t"
  119817. #else
  119818. "lsr r7, %[b], #16\n\t"
  119819. #endif
  119820. #ifdef WOLFSSL_KEIL
  119821. "muls r6, r7, r6\n\t"
  119822. #elif defined(__clang__)
  119823. "muls r6, r7\n\t"
  119824. #else
  119825. "mul r6, r7\n\t"
  119826. #endif
  119827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119828. "lsrs r7, r6, #16\n\t"
  119829. #else
  119830. "lsr r7, r6, #16\n\t"
  119831. #endif
  119832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119833. "lsls r6, r6, #16\n\t"
  119834. #else
  119835. "lsl r6, r6, #16\n\t"
  119836. #endif
  119837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119838. "adds r3, r3, r6\n\t"
  119839. #else
  119840. "add r3, r3, r6\n\t"
  119841. #endif
  119842. #ifdef WOLFSSL_KEIL
  119843. "adcs r4, r4, r7\n\t"
  119844. #elif defined(__clang__)
  119845. "adcs r4, r7\n\t"
  119846. #else
  119847. "adc r4, r7\n\t"
  119848. #endif
  119849. #ifdef WOLFSSL_KEIL
  119850. "adcs r5, r5, %[r]\n\t"
  119851. #elif defined(__clang__)
  119852. "adcs r5, %[r]\n\t"
  119853. #else
  119854. "adc r5, %[r]\n\t"
  119855. #endif
  119856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119857. "lsrs r6, %[a], #16\n\t"
  119858. #else
  119859. "lsr r6, %[a], #16\n\t"
  119860. #endif
  119861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119862. "lsrs r7, %[b], #16\n\t"
  119863. #else
  119864. "lsr r7, %[b], #16\n\t"
  119865. #endif
  119866. #ifdef WOLFSSL_KEIL
  119867. "muls r7, r6, r7\n\t"
  119868. #elif defined(__clang__)
  119869. "muls r7, r6\n\t"
  119870. #else
  119871. "mul r7, r6\n\t"
  119872. #endif
  119873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119874. "adds r4, r4, r7\n\t"
  119875. #else
  119876. "add r4, r4, r7\n\t"
  119877. #endif
  119878. #ifdef WOLFSSL_KEIL
  119879. "adcs r5, r5, %[r]\n\t"
  119880. #elif defined(__clang__)
  119881. "adcs r5, %[r]\n\t"
  119882. #else
  119883. "adc r5, %[r]\n\t"
  119884. #endif
  119885. "uxth r7, %[b]\n\t"
  119886. #ifdef WOLFSSL_KEIL
  119887. "muls r6, r7, r6\n\t"
  119888. #elif defined(__clang__)
  119889. "muls r6, r7\n\t"
  119890. #else
  119891. "mul r6, r7\n\t"
  119892. #endif
  119893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119894. "lsrs r7, r6, #16\n\t"
  119895. #else
  119896. "lsr r7, r6, #16\n\t"
  119897. #endif
  119898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119899. "lsls r6, r6, #16\n\t"
  119900. #else
  119901. "lsl r6, r6, #16\n\t"
  119902. #endif
  119903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119904. "adds r3, r3, r6\n\t"
  119905. #else
  119906. "add r3, r3, r6\n\t"
  119907. #endif
  119908. #ifdef WOLFSSL_KEIL
  119909. "adcs r4, r4, r7\n\t"
  119910. #elif defined(__clang__)
  119911. "adcs r4, r7\n\t"
  119912. #else
  119913. "adc r4, r7\n\t"
  119914. #endif
  119915. #ifdef WOLFSSL_KEIL
  119916. "adcs r5, r5, %[r]\n\t"
  119917. #elif defined(__clang__)
  119918. "adcs r5, %[r]\n\t"
  119919. #else
  119920. "adc r5, %[r]\n\t"
  119921. #endif
  119922. "# A[3] * B[3]\n\t"
  119923. "mov %[a], r9\n\t"
  119924. "mov %[b], r10\n\t"
  119925. "ldr %[a], [%[a], #12]\n\t"
  119926. "ldr %[b], [%[b], #12]\n\t"
  119927. "uxth r6, %[a]\n\t"
  119928. "uxth r7, %[b]\n\t"
  119929. #ifdef WOLFSSL_KEIL
  119930. "muls r7, r6, r7\n\t"
  119931. #elif defined(__clang__)
  119932. "muls r7, r6\n\t"
  119933. #else
  119934. "mul r7, r6\n\t"
  119935. #endif
  119936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119937. "adds r3, r3, r7\n\t"
  119938. #else
  119939. "add r3, r3, r7\n\t"
  119940. #endif
  119941. #ifdef WOLFSSL_KEIL
  119942. "adcs r4, r4, %[r]\n\t"
  119943. #elif defined(__clang__)
  119944. "adcs r4, %[r]\n\t"
  119945. #else
  119946. "adc r4, %[r]\n\t"
  119947. #endif
  119948. #ifdef WOLFSSL_KEIL
  119949. "adcs r5, r5, %[r]\n\t"
  119950. #elif defined(__clang__)
  119951. "adcs r5, %[r]\n\t"
  119952. #else
  119953. "adc r5, %[r]\n\t"
  119954. #endif
  119955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119956. "lsrs r7, %[b], #16\n\t"
  119957. #else
  119958. "lsr r7, %[b], #16\n\t"
  119959. #endif
  119960. #ifdef WOLFSSL_KEIL
  119961. "muls r6, r7, r6\n\t"
  119962. #elif defined(__clang__)
  119963. "muls r6, r7\n\t"
  119964. #else
  119965. "mul r6, r7\n\t"
  119966. #endif
  119967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119968. "lsrs r7, r6, #16\n\t"
  119969. #else
  119970. "lsr r7, r6, #16\n\t"
  119971. #endif
  119972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119973. "lsls r6, r6, #16\n\t"
  119974. #else
  119975. "lsl r6, r6, #16\n\t"
  119976. #endif
  119977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119978. "adds r3, r3, r6\n\t"
  119979. #else
  119980. "add r3, r3, r6\n\t"
  119981. #endif
  119982. #ifdef WOLFSSL_KEIL
  119983. "adcs r4, r4, r7\n\t"
  119984. #elif defined(__clang__)
  119985. "adcs r4, r7\n\t"
  119986. #else
  119987. "adc r4, r7\n\t"
  119988. #endif
  119989. #ifdef WOLFSSL_KEIL
  119990. "adcs r5, r5, %[r]\n\t"
  119991. #elif defined(__clang__)
  119992. "adcs r5, %[r]\n\t"
  119993. #else
  119994. "adc r5, %[r]\n\t"
  119995. #endif
  119996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119997. "lsrs r6, %[a], #16\n\t"
  119998. #else
  119999. "lsr r6, %[a], #16\n\t"
  120000. #endif
  120001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120002. "lsrs r7, %[b], #16\n\t"
  120003. #else
  120004. "lsr r7, %[b], #16\n\t"
  120005. #endif
  120006. #ifdef WOLFSSL_KEIL
  120007. "muls r7, r6, r7\n\t"
  120008. #elif defined(__clang__)
  120009. "muls r7, r6\n\t"
  120010. #else
  120011. "mul r7, r6\n\t"
  120012. #endif
  120013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120014. "adds r4, r4, r7\n\t"
  120015. #else
  120016. "add r4, r4, r7\n\t"
  120017. #endif
  120018. #ifdef WOLFSSL_KEIL
  120019. "adcs r5, r5, %[r]\n\t"
  120020. #elif defined(__clang__)
  120021. "adcs r5, %[r]\n\t"
  120022. #else
  120023. "adc r5, %[r]\n\t"
  120024. #endif
  120025. "uxth r7, %[b]\n\t"
  120026. #ifdef WOLFSSL_KEIL
  120027. "muls r6, r7, r6\n\t"
  120028. #elif defined(__clang__)
  120029. "muls r6, r7\n\t"
  120030. #else
  120031. "mul r6, r7\n\t"
  120032. #endif
  120033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120034. "lsrs r7, r6, #16\n\t"
  120035. #else
  120036. "lsr r7, r6, #16\n\t"
  120037. #endif
  120038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120039. "lsls r6, r6, #16\n\t"
  120040. #else
  120041. "lsl r6, r6, #16\n\t"
  120042. #endif
  120043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120044. "adds r3, r3, r6\n\t"
  120045. #else
  120046. "add r3, r3, r6\n\t"
  120047. #endif
  120048. #ifdef WOLFSSL_KEIL
  120049. "adcs r4, r4, r7\n\t"
  120050. #elif defined(__clang__)
  120051. "adcs r4, r7\n\t"
  120052. #else
  120053. "adc r4, r7\n\t"
  120054. #endif
  120055. #ifdef WOLFSSL_KEIL
  120056. "adcs r5, r5, %[r]\n\t"
  120057. #elif defined(__clang__)
  120058. "adcs r5, %[r]\n\t"
  120059. #else
  120060. "adc r5, %[r]\n\t"
  120061. #endif
  120062. "# A[2] * B[4]\n\t"
  120063. "mov %[a], r9\n\t"
  120064. "mov %[b], r10\n\t"
  120065. "ldr %[a], [%[a], #8]\n\t"
  120066. "ldr %[b], [%[b], #16]\n\t"
  120067. "uxth r6, %[a]\n\t"
  120068. "uxth r7, %[b]\n\t"
  120069. #ifdef WOLFSSL_KEIL
  120070. "muls r7, r6, r7\n\t"
  120071. #elif defined(__clang__)
  120072. "muls r7, r6\n\t"
  120073. #else
  120074. "mul r7, r6\n\t"
  120075. #endif
  120076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120077. "adds r3, r3, r7\n\t"
  120078. #else
  120079. "add r3, r3, r7\n\t"
  120080. #endif
  120081. #ifdef WOLFSSL_KEIL
  120082. "adcs r4, r4, %[r]\n\t"
  120083. #elif defined(__clang__)
  120084. "adcs r4, %[r]\n\t"
  120085. #else
  120086. "adc r4, %[r]\n\t"
  120087. #endif
  120088. #ifdef WOLFSSL_KEIL
  120089. "adcs r5, r5, %[r]\n\t"
  120090. #elif defined(__clang__)
  120091. "adcs r5, %[r]\n\t"
  120092. #else
  120093. "adc r5, %[r]\n\t"
  120094. #endif
  120095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120096. "lsrs r7, %[b], #16\n\t"
  120097. #else
  120098. "lsr r7, %[b], #16\n\t"
  120099. #endif
  120100. #ifdef WOLFSSL_KEIL
  120101. "muls r6, r7, r6\n\t"
  120102. #elif defined(__clang__)
  120103. "muls r6, r7\n\t"
  120104. #else
  120105. "mul r6, r7\n\t"
  120106. #endif
  120107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120108. "lsrs r7, r6, #16\n\t"
  120109. #else
  120110. "lsr r7, r6, #16\n\t"
  120111. #endif
  120112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120113. "lsls r6, r6, #16\n\t"
  120114. #else
  120115. "lsl r6, r6, #16\n\t"
  120116. #endif
  120117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120118. "adds r3, r3, r6\n\t"
  120119. #else
  120120. "add r3, r3, r6\n\t"
  120121. #endif
  120122. #ifdef WOLFSSL_KEIL
  120123. "adcs r4, r4, r7\n\t"
  120124. #elif defined(__clang__)
  120125. "adcs r4, r7\n\t"
  120126. #else
  120127. "adc r4, r7\n\t"
  120128. #endif
  120129. #ifdef WOLFSSL_KEIL
  120130. "adcs r5, r5, %[r]\n\t"
  120131. #elif defined(__clang__)
  120132. "adcs r5, %[r]\n\t"
  120133. #else
  120134. "adc r5, %[r]\n\t"
  120135. #endif
  120136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120137. "lsrs r6, %[a], #16\n\t"
  120138. #else
  120139. "lsr r6, %[a], #16\n\t"
  120140. #endif
  120141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120142. "lsrs r7, %[b], #16\n\t"
  120143. #else
  120144. "lsr r7, %[b], #16\n\t"
  120145. #endif
  120146. #ifdef WOLFSSL_KEIL
  120147. "muls r7, r6, r7\n\t"
  120148. #elif defined(__clang__)
  120149. "muls r7, r6\n\t"
  120150. #else
  120151. "mul r7, r6\n\t"
  120152. #endif
  120153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120154. "adds r4, r4, r7\n\t"
  120155. #else
  120156. "add r4, r4, r7\n\t"
  120157. #endif
  120158. #ifdef WOLFSSL_KEIL
  120159. "adcs r5, r5, %[r]\n\t"
  120160. #elif defined(__clang__)
  120161. "adcs r5, %[r]\n\t"
  120162. #else
  120163. "adc r5, %[r]\n\t"
  120164. #endif
  120165. "uxth r7, %[b]\n\t"
  120166. #ifdef WOLFSSL_KEIL
  120167. "muls r6, r7, r6\n\t"
  120168. #elif defined(__clang__)
  120169. "muls r6, r7\n\t"
  120170. #else
  120171. "mul r6, r7\n\t"
  120172. #endif
  120173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120174. "lsrs r7, r6, #16\n\t"
  120175. #else
  120176. "lsr r7, r6, #16\n\t"
  120177. #endif
  120178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120179. "lsls r6, r6, #16\n\t"
  120180. #else
  120181. "lsl r6, r6, #16\n\t"
  120182. #endif
  120183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120184. "adds r3, r3, r6\n\t"
  120185. #else
  120186. "add r3, r3, r6\n\t"
  120187. #endif
  120188. #ifdef WOLFSSL_KEIL
  120189. "adcs r4, r4, r7\n\t"
  120190. #elif defined(__clang__)
  120191. "adcs r4, r7\n\t"
  120192. #else
  120193. "adc r4, r7\n\t"
  120194. #endif
  120195. #ifdef WOLFSSL_KEIL
  120196. "adcs r5, r5, %[r]\n\t"
  120197. #elif defined(__clang__)
  120198. "adcs r5, %[r]\n\t"
  120199. #else
  120200. "adc r5, %[r]\n\t"
  120201. #endif
  120202. "# A[1] * B[5]\n\t"
  120203. "mov %[a], r9\n\t"
  120204. "mov %[b], r10\n\t"
  120205. "ldr %[a], [%[a], #4]\n\t"
  120206. "ldr %[b], [%[b], #20]\n\t"
  120207. "uxth r6, %[a]\n\t"
  120208. "uxth r7, %[b]\n\t"
  120209. #ifdef WOLFSSL_KEIL
  120210. "muls r7, r6, r7\n\t"
  120211. #elif defined(__clang__)
  120212. "muls r7, r6\n\t"
  120213. #else
  120214. "mul r7, r6\n\t"
  120215. #endif
  120216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120217. "adds r3, r3, r7\n\t"
  120218. #else
  120219. "add r3, r3, r7\n\t"
  120220. #endif
  120221. #ifdef WOLFSSL_KEIL
  120222. "adcs r4, r4, %[r]\n\t"
  120223. #elif defined(__clang__)
  120224. "adcs r4, %[r]\n\t"
  120225. #else
  120226. "adc r4, %[r]\n\t"
  120227. #endif
  120228. #ifdef WOLFSSL_KEIL
  120229. "adcs r5, r5, %[r]\n\t"
  120230. #elif defined(__clang__)
  120231. "adcs r5, %[r]\n\t"
  120232. #else
  120233. "adc r5, %[r]\n\t"
  120234. #endif
  120235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120236. "lsrs r7, %[b], #16\n\t"
  120237. #else
  120238. "lsr r7, %[b], #16\n\t"
  120239. #endif
  120240. #ifdef WOLFSSL_KEIL
  120241. "muls r6, r7, r6\n\t"
  120242. #elif defined(__clang__)
  120243. "muls r6, r7\n\t"
  120244. #else
  120245. "mul r6, r7\n\t"
  120246. #endif
  120247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120248. "lsrs r7, r6, #16\n\t"
  120249. #else
  120250. "lsr r7, r6, #16\n\t"
  120251. #endif
  120252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120253. "lsls r6, r6, #16\n\t"
  120254. #else
  120255. "lsl r6, r6, #16\n\t"
  120256. #endif
  120257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120258. "adds r3, r3, r6\n\t"
  120259. #else
  120260. "add r3, r3, r6\n\t"
  120261. #endif
  120262. #ifdef WOLFSSL_KEIL
  120263. "adcs r4, r4, r7\n\t"
  120264. #elif defined(__clang__)
  120265. "adcs r4, r7\n\t"
  120266. #else
  120267. "adc r4, r7\n\t"
  120268. #endif
  120269. #ifdef WOLFSSL_KEIL
  120270. "adcs r5, r5, %[r]\n\t"
  120271. #elif defined(__clang__)
  120272. "adcs r5, %[r]\n\t"
  120273. #else
  120274. "adc r5, %[r]\n\t"
  120275. #endif
  120276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120277. "lsrs r6, %[a], #16\n\t"
  120278. #else
  120279. "lsr r6, %[a], #16\n\t"
  120280. #endif
  120281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120282. "lsrs r7, %[b], #16\n\t"
  120283. #else
  120284. "lsr r7, %[b], #16\n\t"
  120285. #endif
  120286. #ifdef WOLFSSL_KEIL
  120287. "muls r7, r6, r7\n\t"
  120288. #elif defined(__clang__)
  120289. "muls r7, r6\n\t"
  120290. #else
  120291. "mul r7, r6\n\t"
  120292. #endif
  120293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120294. "adds r4, r4, r7\n\t"
  120295. #else
  120296. "add r4, r4, r7\n\t"
  120297. #endif
  120298. #ifdef WOLFSSL_KEIL
  120299. "adcs r5, r5, %[r]\n\t"
  120300. #elif defined(__clang__)
  120301. "adcs r5, %[r]\n\t"
  120302. #else
  120303. "adc r5, %[r]\n\t"
  120304. #endif
  120305. "uxth r7, %[b]\n\t"
  120306. #ifdef WOLFSSL_KEIL
  120307. "muls r6, r7, r6\n\t"
  120308. #elif defined(__clang__)
  120309. "muls r6, r7\n\t"
  120310. #else
  120311. "mul r6, r7\n\t"
  120312. #endif
  120313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120314. "lsrs r7, r6, #16\n\t"
  120315. #else
  120316. "lsr r7, r6, #16\n\t"
  120317. #endif
  120318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120319. "lsls r6, r6, #16\n\t"
  120320. #else
  120321. "lsl r6, r6, #16\n\t"
  120322. #endif
  120323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120324. "adds r3, r3, r6\n\t"
  120325. #else
  120326. "add r3, r3, r6\n\t"
  120327. #endif
  120328. #ifdef WOLFSSL_KEIL
  120329. "adcs r4, r4, r7\n\t"
  120330. #elif defined(__clang__)
  120331. "adcs r4, r7\n\t"
  120332. #else
  120333. "adc r4, r7\n\t"
  120334. #endif
  120335. #ifdef WOLFSSL_KEIL
  120336. "adcs r5, r5, %[r]\n\t"
  120337. #elif defined(__clang__)
  120338. "adcs r5, %[r]\n\t"
  120339. #else
  120340. "adc r5, %[r]\n\t"
  120341. #endif
  120342. "# A[0] * B[6]\n\t"
  120343. "mov %[a], r9\n\t"
  120344. "mov %[b], r10\n\t"
  120345. "ldr %[a], [%[a]]\n\t"
  120346. "ldr %[b], [%[b], #24]\n\t"
  120347. "uxth r6, %[a]\n\t"
  120348. "uxth r7, %[b]\n\t"
  120349. #ifdef WOLFSSL_KEIL
  120350. "muls r7, r6, r7\n\t"
  120351. #elif defined(__clang__)
  120352. "muls r7, r6\n\t"
  120353. #else
  120354. "mul r7, r6\n\t"
  120355. #endif
  120356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120357. "adds r3, r3, r7\n\t"
  120358. #else
  120359. "add r3, r3, r7\n\t"
  120360. #endif
  120361. #ifdef WOLFSSL_KEIL
  120362. "adcs r4, r4, %[r]\n\t"
  120363. #elif defined(__clang__)
  120364. "adcs r4, %[r]\n\t"
  120365. #else
  120366. "adc r4, %[r]\n\t"
  120367. #endif
  120368. #ifdef WOLFSSL_KEIL
  120369. "adcs r5, r5, %[r]\n\t"
  120370. #elif defined(__clang__)
  120371. "adcs r5, %[r]\n\t"
  120372. #else
  120373. "adc r5, %[r]\n\t"
  120374. #endif
  120375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120376. "lsrs r7, %[b], #16\n\t"
  120377. #else
  120378. "lsr r7, %[b], #16\n\t"
  120379. #endif
  120380. #ifdef WOLFSSL_KEIL
  120381. "muls r6, r7, r6\n\t"
  120382. #elif defined(__clang__)
  120383. "muls r6, r7\n\t"
  120384. #else
  120385. "mul r6, r7\n\t"
  120386. #endif
  120387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120388. "lsrs r7, r6, #16\n\t"
  120389. #else
  120390. "lsr r7, r6, #16\n\t"
  120391. #endif
  120392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120393. "lsls r6, r6, #16\n\t"
  120394. #else
  120395. "lsl r6, r6, #16\n\t"
  120396. #endif
  120397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120398. "adds r3, r3, r6\n\t"
  120399. #else
  120400. "add r3, r3, r6\n\t"
  120401. #endif
  120402. #ifdef WOLFSSL_KEIL
  120403. "adcs r4, r4, r7\n\t"
  120404. #elif defined(__clang__)
  120405. "adcs r4, r7\n\t"
  120406. #else
  120407. "adc r4, r7\n\t"
  120408. #endif
  120409. #ifdef WOLFSSL_KEIL
  120410. "adcs r5, r5, %[r]\n\t"
  120411. #elif defined(__clang__)
  120412. "adcs r5, %[r]\n\t"
  120413. #else
  120414. "adc r5, %[r]\n\t"
  120415. #endif
  120416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120417. "lsrs r6, %[a], #16\n\t"
  120418. #else
  120419. "lsr r6, %[a], #16\n\t"
  120420. #endif
  120421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120422. "lsrs r7, %[b], #16\n\t"
  120423. #else
  120424. "lsr r7, %[b], #16\n\t"
  120425. #endif
  120426. #ifdef WOLFSSL_KEIL
  120427. "muls r7, r6, r7\n\t"
  120428. #elif defined(__clang__)
  120429. "muls r7, r6\n\t"
  120430. #else
  120431. "mul r7, r6\n\t"
  120432. #endif
  120433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120434. "adds r4, r4, r7\n\t"
  120435. #else
  120436. "add r4, r4, r7\n\t"
  120437. #endif
  120438. #ifdef WOLFSSL_KEIL
  120439. "adcs r5, r5, %[r]\n\t"
  120440. #elif defined(__clang__)
  120441. "adcs r5, %[r]\n\t"
  120442. #else
  120443. "adc r5, %[r]\n\t"
  120444. #endif
  120445. "uxth r7, %[b]\n\t"
  120446. #ifdef WOLFSSL_KEIL
  120447. "muls r6, r7, r6\n\t"
  120448. #elif defined(__clang__)
  120449. "muls r6, r7\n\t"
  120450. #else
  120451. "mul r6, r7\n\t"
  120452. #endif
  120453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120454. "lsrs r7, r6, #16\n\t"
  120455. #else
  120456. "lsr r7, r6, #16\n\t"
  120457. #endif
  120458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120459. "lsls r6, r6, #16\n\t"
  120460. #else
  120461. "lsl r6, r6, #16\n\t"
  120462. #endif
  120463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120464. "adds r3, r3, r6\n\t"
  120465. #else
  120466. "add r3, r3, r6\n\t"
  120467. #endif
  120468. #ifdef WOLFSSL_KEIL
  120469. "adcs r4, r4, r7\n\t"
  120470. #elif defined(__clang__)
  120471. "adcs r4, r7\n\t"
  120472. #else
  120473. "adc r4, r7\n\t"
  120474. #endif
  120475. #ifdef WOLFSSL_KEIL
  120476. "adcs r5, r5, %[r]\n\t"
  120477. #elif defined(__clang__)
  120478. "adcs r5, %[r]\n\t"
  120479. #else
  120480. "adc r5, %[r]\n\t"
  120481. #endif
  120482. "str r3, [sp, #24]\n\t"
  120483. "# A[0] * B[7]\n\t"
  120484. "movs r3, #0\n\t"
  120485. "mov %[a], r9\n\t"
  120486. "mov %[b], r10\n\t"
  120487. "ldr %[a], [%[a]]\n\t"
  120488. "ldr %[b], [%[b], #28]\n\t"
  120489. "uxth r6, %[a]\n\t"
  120490. "uxth r7, %[b]\n\t"
  120491. #ifdef WOLFSSL_KEIL
  120492. "muls r7, r6, r7\n\t"
  120493. #elif defined(__clang__)
  120494. "muls r7, r6\n\t"
  120495. #else
  120496. "mul r7, r6\n\t"
  120497. #endif
  120498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120499. "adds r4, r4, r7\n\t"
  120500. #else
  120501. "add r4, r4, r7\n\t"
  120502. #endif
  120503. #ifdef WOLFSSL_KEIL
  120504. "adcs r5, r5, %[r]\n\t"
  120505. #elif defined(__clang__)
  120506. "adcs r5, %[r]\n\t"
  120507. #else
  120508. "adc r5, %[r]\n\t"
  120509. #endif
  120510. #ifdef WOLFSSL_KEIL
  120511. "adcs r3, r3, %[r]\n\t"
  120512. #elif defined(__clang__)
  120513. "adcs r3, %[r]\n\t"
  120514. #else
  120515. "adc r3, %[r]\n\t"
  120516. #endif
  120517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120518. "lsrs r7, %[b], #16\n\t"
  120519. #else
  120520. "lsr r7, %[b], #16\n\t"
  120521. #endif
  120522. #ifdef WOLFSSL_KEIL
  120523. "muls r6, r7, r6\n\t"
  120524. #elif defined(__clang__)
  120525. "muls r6, r7\n\t"
  120526. #else
  120527. "mul r6, r7\n\t"
  120528. #endif
  120529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120530. "lsrs r7, r6, #16\n\t"
  120531. #else
  120532. "lsr r7, r6, #16\n\t"
  120533. #endif
  120534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120535. "lsls r6, r6, #16\n\t"
  120536. #else
  120537. "lsl r6, r6, #16\n\t"
  120538. #endif
  120539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120540. "adds r4, r4, r6\n\t"
  120541. #else
  120542. "add r4, r4, r6\n\t"
  120543. #endif
  120544. #ifdef WOLFSSL_KEIL
  120545. "adcs r5, r5, r7\n\t"
  120546. #elif defined(__clang__)
  120547. "adcs r5, r7\n\t"
  120548. #else
  120549. "adc r5, r7\n\t"
  120550. #endif
  120551. #ifdef WOLFSSL_KEIL
  120552. "adcs r3, r3, %[r]\n\t"
  120553. #elif defined(__clang__)
  120554. "adcs r3, %[r]\n\t"
  120555. #else
  120556. "adc r3, %[r]\n\t"
  120557. #endif
  120558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120559. "lsrs r6, %[a], #16\n\t"
  120560. #else
  120561. "lsr r6, %[a], #16\n\t"
  120562. #endif
  120563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120564. "lsrs r7, %[b], #16\n\t"
  120565. #else
  120566. "lsr r7, %[b], #16\n\t"
  120567. #endif
  120568. #ifdef WOLFSSL_KEIL
  120569. "muls r7, r6, r7\n\t"
  120570. #elif defined(__clang__)
  120571. "muls r7, r6\n\t"
  120572. #else
  120573. "mul r7, r6\n\t"
  120574. #endif
  120575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120576. "adds r5, r5, r7\n\t"
  120577. #else
  120578. "add r5, r5, r7\n\t"
  120579. #endif
  120580. #ifdef WOLFSSL_KEIL
  120581. "adcs r3, r3, %[r]\n\t"
  120582. #elif defined(__clang__)
  120583. "adcs r3, %[r]\n\t"
  120584. #else
  120585. "adc r3, %[r]\n\t"
  120586. #endif
  120587. "uxth r7, %[b]\n\t"
  120588. #ifdef WOLFSSL_KEIL
  120589. "muls r6, r7, r6\n\t"
  120590. #elif defined(__clang__)
  120591. "muls r6, r7\n\t"
  120592. #else
  120593. "mul r6, r7\n\t"
  120594. #endif
  120595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120596. "lsrs r7, r6, #16\n\t"
  120597. #else
  120598. "lsr r7, r6, #16\n\t"
  120599. #endif
  120600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120601. "lsls r6, r6, #16\n\t"
  120602. #else
  120603. "lsl r6, r6, #16\n\t"
  120604. #endif
  120605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120606. "adds r4, r4, r6\n\t"
  120607. #else
  120608. "add r4, r4, r6\n\t"
  120609. #endif
  120610. #ifdef WOLFSSL_KEIL
  120611. "adcs r5, r5, r7\n\t"
  120612. #elif defined(__clang__)
  120613. "adcs r5, r7\n\t"
  120614. #else
  120615. "adc r5, r7\n\t"
  120616. #endif
  120617. #ifdef WOLFSSL_KEIL
  120618. "adcs r3, r3, %[r]\n\t"
  120619. #elif defined(__clang__)
  120620. "adcs r3, %[r]\n\t"
  120621. #else
  120622. "adc r3, %[r]\n\t"
  120623. #endif
  120624. "# A[1] * B[6]\n\t"
  120625. "mov %[a], r9\n\t"
  120626. "mov %[b], r10\n\t"
  120627. "ldr %[a], [%[a], #4]\n\t"
  120628. "ldr %[b], [%[b], #24]\n\t"
  120629. "uxth r6, %[a]\n\t"
  120630. "uxth r7, %[b]\n\t"
  120631. #ifdef WOLFSSL_KEIL
  120632. "muls r7, r6, r7\n\t"
  120633. #elif defined(__clang__)
  120634. "muls r7, r6\n\t"
  120635. #else
  120636. "mul r7, r6\n\t"
  120637. #endif
  120638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120639. "adds r4, r4, r7\n\t"
  120640. #else
  120641. "add r4, r4, r7\n\t"
  120642. #endif
  120643. #ifdef WOLFSSL_KEIL
  120644. "adcs r5, r5, %[r]\n\t"
  120645. #elif defined(__clang__)
  120646. "adcs r5, %[r]\n\t"
  120647. #else
  120648. "adc r5, %[r]\n\t"
  120649. #endif
  120650. #ifdef WOLFSSL_KEIL
  120651. "adcs r3, r3, %[r]\n\t"
  120652. #elif defined(__clang__)
  120653. "adcs r3, %[r]\n\t"
  120654. #else
  120655. "adc r3, %[r]\n\t"
  120656. #endif
  120657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120658. "lsrs r7, %[b], #16\n\t"
  120659. #else
  120660. "lsr r7, %[b], #16\n\t"
  120661. #endif
  120662. #ifdef WOLFSSL_KEIL
  120663. "muls r6, r7, r6\n\t"
  120664. #elif defined(__clang__)
  120665. "muls r6, r7\n\t"
  120666. #else
  120667. "mul r6, r7\n\t"
  120668. #endif
  120669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120670. "lsrs r7, r6, #16\n\t"
  120671. #else
  120672. "lsr r7, r6, #16\n\t"
  120673. #endif
  120674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120675. "lsls r6, r6, #16\n\t"
  120676. #else
  120677. "lsl r6, r6, #16\n\t"
  120678. #endif
  120679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120680. "adds r4, r4, r6\n\t"
  120681. #else
  120682. "add r4, r4, r6\n\t"
  120683. #endif
  120684. #ifdef WOLFSSL_KEIL
  120685. "adcs r5, r5, r7\n\t"
  120686. #elif defined(__clang__)
  120687. "adcs r5, r7\n\t"
  120688. #else
  120689. "adc r5, r7\n\t"
  120690. #endif
  120691. #ifdef WOLFSSL_KEIL
  120692. "adcs r3, r3, %[r]\n\t"
  120693. #elif defined(__clang__)
  120694. "adcs r3, %[r]\n\t"
  120695. #else
  120696. "adc r3, %[r]\n\t"
  120697. #endif
  120698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120699. "lsrs r6, %[a], #16\n\t"
  120700. #else
  120701. "lsr r6, %[a], #16\n\t"
  120702. #endif
  120703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120704. "lsrs r7, %[b], #16\n\t"
  120705. #else
  120706. "lsr r7, %[b], #16\n\t"
  120707. #endif
  120708. #ifdef WOLFSSL_KEIL
  120709. "muls r7, r6, r7\n\t"
  120710. #elif defined(__clang__)
  120711. "muls r7, r6\n\t"
  120712. #else
  120713. "mul r7, r6\n\t"
  120714. #endif
  120715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120716. "adds r5, r5, r7\n\t"
  120717. #else
  120718. "add r5, r5, r7\n\t"
  120719. #endif
  120720. #ifdef WOLFSSL_KEIL
  120721. "adcs r3, r3, %[r]\n\t"
  120722. #elif defined(__clang__)
  120723. "adcs r3, %[r]\n\t"
  120724. #else
  120725. "adc r3, %[r]\n\t"
  120726. #endif
  120727. "uxth r7, %[b]\n\t"
  120728. #ifdef WOLFSSL_KEIL
  120729. "muls r6, r7, r6\n\t"
  120730. #elif defined(__clang__)
  120731. "muls r6, r7\n\t"
  120732. #else
  120733. "mul r6, r7\n\t"
  120734. #endif
  120735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120736. "lsrs r7, r6, #16\n\t"
  120737. #else
  120738. "lsr r7, r6, #16\n\t"
  120739. #endif
  120740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120741. "lsls r6, r6, #16\n\t"
  120742. #else
  120743. "lsl r6, r6, #16\n\t"
  120744. #endif
  120745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120746. "adds r4, r4, r6\n\t"
  120747. #else
  120748. "add r4, r4, r6\n\t"
  120749. #endif
  120750. #ifdef WOLFSSL_KEIL
  120751. "adcs r5, r5, r7\n\t"
  120752. #elif defined(__clang__)
  120753. "adcs r5, r7\n\t"
  120754. #else
  120755. "adc r5, r7\n\t"
  120756. #endif
  120757. #ifdef WOLFSSL_KEIL
  120758. "adcs r3, r3, %[r]\n\t"
  120759. #elif defined(__clang__)
  120760. "adcs r3, %[r]\n\t"
  120761. #else
  120762. "adc r3, %[r]\n\t"
  120763. #endif
  120764. "# A[2] * B[5]\n\t"
  120765. "mov %[a], r9\n\t"
  120766. "mov %[b], r10\n\t"
  120767. "ldr %[a], [%[a], #8]\n\t"
  120768. "ldr %[b], [%[b], #20]\n\t"
  120769. "uxth r6, %[a]\n\t"
  120770. "uxth r7, %[b]\n\t"
  120771. #ifdef WOLFSSL_KEIL
  120772. "muls r7, r6, r7\n\t"
  120773. #elif defined(__clang__)
  120774. "muls r7, r6\n\t"
  120775. #else
  120776. "mul r7, r6\n\t"
  120777. #endif
  120778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120779. "adds r4, r4, r7\n\t"
  120780. #else
  120781. "add r4, r4, r7\n\t"
  120782. #endif
  120783. #ifdef WOLFSSL_KEIL
  120784. "adcs r5, r5, %[r]\n\t"
  120785. #elif defined(__clang__)
  120786. "adcs r5, %[r]\n\t"
  120787. #else
  120788. "adc r5, %[r]\n\t"
  120789. #endif
  120790. #ifdef WOLFSSL_KEIL
  120791. "adcs r3, r3, %[r]\n\t"
  120792. #elif defined(__clang__)
  120793. "adcs r3, %[r]\n\t"
  120794. #else
  120795. "adc r3, %[r]\n\t"
  120796. #endif
  120797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120798. "lsrs r7, %[b], #16\n\t"
  120799. #else
  120800. "lsr r7, %[b], #16\n\t"
  120801. #endif
  120802. #ifdef WOLFSSL_KEIL
  120803. "muls r6, r7, r6\n\t"
  120804. #elif defined(__clang__)
  120805. "muls r6, r7\n\t"
  120806. #else
  120807. "mul r6, r7\n\t"
  120808. #endif
  120809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120810. "lsrs r7, r6, #16\n\t"
  120811. #else
  120812. "lsr r7, r6, #16\n\t"
  120813. #endif
  120814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120815. "lsls r6, r6, #16\n\t"
  120816. #else
  120817. "lsl r6, r6, #16\n\t"
  120818. #endif
  120819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120820. "adds r4, r4, r6\n\t"
  120821. #else
  120822. "add r4, r4, r6\n\t"
  120823. #endif
  120824. #ifdef WOLFSSL_KEIL
  120825. "adcs r5, r5, r7\n\t"
  120826. #elif defined(__clang__)
  120827. "adcs r5, r7\n\t"
  120828. #else
  120829. "adc r5, r7\n\t"
  120830. #endif
  120831. #ifdef WOLFSSL_KEIL
  120832. "adcs r3, r3, %[r]\n\t"
  120833. #elif defined(__clang__)
  120834. "adcs r3, %[r]\n\t"
  120835. #else
  120836. "adc r3, %[r]\n\t"
  120837. #endif
  120838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120839. "lsrs r6, %[a], #16\n\t"
  120840. #else
  120841. "lsr r6, %[a], #16\n\t"
  120842. #endif
  120843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120844. "lsrs r7, %[b], #16\n\t"
  120845. #else
  120846. "lsr r7, %[b], #16\n\t"
  120847. #endif
  120848. #ifdef WOLFSSL_KEIL
  120849. "muls r7, r6, r7\n\t"
  120850. #elif defined(__clang__)
  120851. "muls r7, r6\n\t"
  120852. #else
  120853. "mul r7, r6\n\t"
  120854. #endif
  120855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120856. "adds r5, r5, r7\n\t"
  120857. #else
  120858. "add r5, r5, r7\n\t"
  120859. #endif
  120860. #ifdef WOLFSSL_KEIL
  120861. "adcs r3, r3, %[r]\n\t"
  120862. #elif defined(__clang__)
  120863. "adcs r3, %[r]\n\t"
  120864. #else
  120865. "adc r3, %[r]\n\t"
  120866. #endif
  120867. "uxth r7, %[b]\n\t"
  120868. #ifdef WOLFSSL_KEIL
  120869. "muls r6, r7, r6\n\t"
  120870. #elif defined(__clang__)
  120871. "muls r6, r7\n\t"
  120872. #else
  120873. "mul r6, r7\n\t"
  120874. #endif
  120875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120876. "lsrs r7, r6, #16\n\t"
  120877. #else
  120878. "lsr r7, r6, #16\n\t"
  120879. #endif
  120880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120881. "lsls r6, r6, #16\n\t"
  120882. #else
  120883. "lsl r6, r6, #16\n\t"
  120884. #endif
  120885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120886. "adds r4, r4, r6\n\t"
  120887. #else
  120888. "add r4, r4, r6\n\t"
  120889. #endif
  120890. #ifdef WOLFSSL_KEIL
  120891. "adcs r5, r5, r7\n\t"
  120892. #elif defined(__clang__)
  120893. "adcs r5, r7\n\t"
  120894. #else
  120895. "adc r5, r7\n\t"
  120896. #endif
  120897. #ifdef WOLFSSL_KEIL
  120898. "adcs r3, r3, %[r]\n\t"
  120899. #elif defined(__clang__)
  120900. "adcs r3, %[r]\n\t"
  120901. #else
  120902. "adc r3, %[r]\n\t"
  120903. #endif
  120904. "# A[3] * B[4]\n\t"
  120905. "mov %[a], r9\n\t"
  120906. "mov %[b], r10\n\t"
  120907. "ldr %[a], [%[a], #12]\n\t"
  120908. "ldr %[b], [%[b], #16]\n\t"
  120909. "uxth r6, %[a]\n\t"
  120910. "uxth r7, %[b]\n\t"
  120911. #ifdef WOLFSSL_KEIL
  120912. "muls r7, r6, r7\n\t"
  120913. #elif defined(__clang__)
  120914. "muls r7, r6\n\t"
  120915. #else
  120916. "mul r7, r6\n\t"
  120917. #endif
  120918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120919. "adds r4, r4, r7\n\t"
  120920. #else
  120921. "add r4, r4, r7\n\t"
  120922. #endif
  120923. #ifdef WOLFSSL_KEIL
  120924. "adcs r5, r5, %[r]\n\t"
  120925. #elif defined(__clang__)
  120926. "adcs r5, %[r]\n\t"
  120927. #else
  120928. "adc r5, %[r]\n\t"
  120929. #endif
  120930. #ifdef WOLFSSL_KEIL
  120931. "adcs r3, r3, %[r]\n\t"
  120932. #elif defined(__clang__)
  120933. "adcs r3, %[r]\n\t"
  120934. #else
  120935. "adc r3, %[r]\n\t"
  120936. #endif
  120937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120938. "lsrs r7, %[b], #16\n\t"
  120939. #else
  120940. "lsr r7, %[b], #16\n\t"
  120941. #endif
  120942. #ifdef WOLFSSL_KEIL
  120943. "muls r6, r7, r6\n\t"
  120944. #elif defined(__clang__)
  120945. "muls r6, r7\n\t"
  120946. #else
  120947. "mul r6, r7\n\t"
  120948. #endif
  120949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120950. "lsrs r7, r6, #16\n\t"
  120951. #else
  120952. "lsr r7, r6, #16\n\t"
  120953. #endif
  120954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120955. "lsls r6, r6, #16\n\t"
  120956. #else
  120957. "lsl r6, r6, #16\n\t"
  120958. #endif
  120959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120960. "adds r4, r4, r6\n\t"
  120961. #else
  120962. "add r4, r4, r6\n\t"
  120963. #endif
  120964. #ifdef WOLFSSL_KEIL
  120965. "adcs r5, r5, r7\n\t"
  120966. #elif defined(__clang__)
  120967. "adcs r5, r7\n\t"
  120968. #else
  120969. "adc r5, r7\n\t"
  120970. #endif
  120971. #ifdef WOLFSSL_KEIL
  120972. "adcs r3, r3, %[r]\n\t"
  120973. #elif defined(__clang__)
  120974. "adcs r3, %[r]\n\t"
  120975. #else
  120976. "adc r3, %[r]\n\t"
  120977. #endif
  120978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120979. "lsrs r6, %[a], #16\n\t"
  120980. #else
  120981. "lsr r6, %[a], #16\n\t"
  120982. #endif
  120983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120984. "lsrs r7, %[b], #16\n\t"
  120985. #else
  120986. "lsr r7, %[b], #16\n\t"
  120987. #endif
  120988. #ifdef WOLFSSL_KEIL
  120989. "muls r7, r6, r7\n\t"
  120990. #elif defined(__clang__)
  120991. "muls r7, r6\n\t"
  120992. #else
  120993. "mul r7, r6\n\t"
  120994. #endif
  120995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120996. "adds r5, r5, r7\n\t"
  120997. #else
  120998. "add r5, r5, r7\n\t"
  120999. #endif
  121000. #ifdef WOLFSSL_KEIL
  121001. "adcs r3, r3, %[r]\n\t"
  121002. #elif defined(__clang__)
  121003. "adcs r3, %[r]\n\t"
  121004. #else
  121005. "adc r3, %[r]\n\t"
  121006. #endif
  121007. "uxth r7, %[b]\n\t"
  121008. #ifdef WOLFSSL_KEIL
  121009. "muls r6, r7, r6\n\t"
  121010. #elif defined(__clang__)
  121011. "muls r6, r7\n\t"
  121012. #else
  121013. "mul r6, r7\n\t"
  121014. #endif
  121015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121016. "lsrs r7, r6, #16\n\t"
  121017. #else
  121018. "lsr r7, r6, #16\n\t"
  121019. #endif
  121020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121021. "lsls r6, r6, #16\n\t"
  121022. #else
  121023. "lsl r6, r6, #16\n\t"
  121024. #endif
  121025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121026. "adds r4, r4, r6\n\t"
  121027. #else
  121028. "add r4, r4, r6\n\t"
  121029. #endif
  121030. #ifdef WOLFSSL_KEIL
  121031. "adcs r5, r5, r7\n\t"
  121032. #elif defined(__clang__)
  121033. "adcs r5, r7\n\t"
  121034. #else
  121035. "adc r5, r7\n\t"
  121036. #endif
  121037. #ifdef WOLFSSL_KEIL
  121038. "adcs r3, r3, %[r]\n\t"
  121039. #elif defined(__clang__)
  121040. "adcs r3, %[r]\n\t"
  121041. #else
  121042. "adc r3, %[r]\n\t"
  121043. #endif
  121044. "# A[4] * B[3]\n\t"
  121045. "mov %[a], r9\n\t"
  121046. "mov %[b], r10\n\t"
  121047. "ldr %[a], [%[a], #16]\n\t"
  121048. "ldr %[b], [%[b], #12]\n\t"
  121049. "uxth r6, %[a]\n\t"
  121050. "uxth r7, %[b]\n\t"
  121051. #ifdef WOLFSSL_KEIL
  121052. "muls r7, r6, r7\n\t"
  121053. #elif defined(__clang__)
  121054. "muls r7, r6\n\t"
  121055. #else
  121056. "mul r7, r6\n\t"
  121057. #endif
  121058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121059. "adds r4, r4, r7\n\t"
  121060. #else
  121061. "add r4, r4, r7\n\t"
  121062. #endif
  121063. #ifdef WOLFSSL_KEIL
  121064. "adcs r5, r5, %[r]\n\t"
  121065. #elif defined(__clang__)
  121066. "adcs r5, %[r]\n\t"
  121067. #else
  121068. "adc r5, %[r]\n\t"
  121069. #endif
  121070. #ifdef WOLFSSL_KEIL
  121071. "adcs r3, r3, %[r]\n\t"
  121072. #elif defined(__clang__)
  121073. "adcs r3, %[r]\n\t"
  121074. #else
  121075. "adc r3, %[r]\n\t"
  121076. #endif
  121077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121078. "lsrs r7, %[b], #16\n\t"
  121079. #else
  121080. "lsr r7, %[b], #16\n\t"
  121081. #endif
  121082. #ifdef WOLFSSL_KEIL
  121083. "muls r6, r7, r6\n\t"
  121084. #elif defined(__clang__)
  121085. "muls r6, r7\n\t"
  121086. #else
  121087. "mul r6, r7\n\t"
  121088. #endif
  121089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121090. "lsrs r7, r6, #16\n\t"
  121091. #else
  121092. "lsr r7, r6, #16\n\t"
  121093. #endif
  121094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121095. "lsls r6, r6, #16\n\t"
  121096. #else
  121097. "lsl r6, r6, #16\n\t"
  121098. #endif
  121099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121100. "adds r4, r4, r6\n\t"
  121101. #else
  121102. "add r4, r4, r6\n\t"
  121103. #endif
  121104. #ifdef WOLFSSL_KEIL
  121105. "adcs r5, r5, r7\n\t"
  121106. #elif defined(__clang__)
  121107. "adcs r5, r7\n\t"
  121108. #else
  121109. "adc r5, r7\n\t"
  121110. #endif
  121111. #ifdef WOLFSSL_KEIL
  121112. "adcs r3, r3, %[r]\n\t"
  121113. #elif defined(__clang__)
  121114. "adcs r3, %[r]\n\t"
  121115. #else
  121116. "adc r3, %[r]\n\t"
  121117. #endif
  121118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121119. "lsrs r6, %[a], #16\n\t"
  121120. #else
  121121. "lsr r6, %[a], #16\n\t"
  121122. #endif
  121123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121124. "lsrs r7, %[b], #16\n\t"
  121125. #else
  121126. "lsr r7, %[b], #16\n\t"
  121127. #endif
  121128. #ifdef WOLFSSL_KEIL
  121129. "muls r7, r6, r7\n\t"
  121130. #elif defined(__clang__)
  121131. "muls r7, r6\n\t"
  121132. #else
  121133. "mul r7, r6\n\t"
  121134. #endif
  121135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121136. "adds r5, r5, r7\n\t"
  121137. #else
  121138. "add r5, r5, r7\n\t"
  121139. #endif
  121140. #ifdef WOLFSSL_KEIL
  121141. "adcs r3, r3, %[r]\n\t"
  121142. #elif defined(__clang__)
  121143. "adcs r3, %[r]\n\t"
  121144. #else
  121145. "adc r3, %[r]\n\t"
  121146. #endif
  121147. "uxth r7, %[b]\n\t"
  121148. #ifdef WOLFSSL_KEIL
  121149. "muls r6, r7, r6\n\t"
  121150. #elif defined(__clang__)
  121151. "muls r6, r7\n\t"
  121152. #else
  121153. "mul r6, r7\n\t"
  121154. #endif
  121155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121156. "lsrs r7, r6, #16\n\t"
  121157. #else
  121158. "lsr r7, r6, #16\n\t"
  121159. #endif
  121160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121161. "lsls r6, r6, #16\n\t"
  121162. #else
  121163. "lsl r6, r6, #16\n\t"
  121164. #endif
  121165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121166. "adds r4, r4, r6\n\t"
  121167. #else
  121168. "add r4, r4, r6\n\t"
  121169. #endif
  121170. #ifdef WOLFSSL_KEIL
  121171. "adcs r5, r5, r7\n\t"
  121172. #elif defined(__clang__)
  121173. "adcs r5, r7\n\t"
  121174. #else
  121175. "adc r5, r7\n\t"
  121176. #endif
  121177. #ifdef WOLFSSL_KEIL
  121178. "adcs r3, r3, %[r]\n\t"
  121179. #elif defined(__clang__)
  121180. "adcs r3, %[r]\n\t"
  121181. #else
  121182. "adc r3, %[r]\n\t"
  121183. #endif
  121184. "# A[5] * B[2]\n\t"
  121185. "mov %[a], r9\n\t"
  121186. "mov %[b], r10\n\t"
  121187. "ldr %[a], [%[a], #20]\n\t"
  121188. "ldr %[b], [%[b], #8]\n\t"
  121189. "uxth r6, %[a]\n\t"
  121190. "uxth r7, %[b]\n\t"
  121191. #ifdef WOLFSSL_KEIL
  121192. "muls r7, r6, r7\n\t"
  121193. #elif defined(__clang__)
  121194. "muls r7, r6\n\t"
  121195. #else
  121196. "mul r7, r6\n\t"
  121197. #endif
  121198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121199. "adds r4, r4, r7\n\t"
  121200. #else
  121201. "add r4, r4, r7\n\t"
  121202. #endif
  121203. #ifdef WOLFSSL_KEIL
  121204. "adcs r5, r5, %[r]\n\t"
  121205. #elif defined(__clang__)
  121206. "adcs r5, %[r]\n\t"
  121207. #else
  121208. "adc r5, %[r]\n\t"
  121209. #endif
  121210. #ifdef WOLFSSL_KEIL
  121211. "adcs r3, r3, %[r]\n\t"
  121212. #elif defined(__clang__)
  121213. "adcs r3, %[r]\n\t"
  121214. #else
  121215. "adc r3, %[r]\n\t"
  121216. #endif
  121217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121218. "lsrs r7, %[b], #16\n\t"
  121219. #else
  121220. "lsr r7, %[b], #16\n\t"
  121221. #endif
  121222. #ifdef WOLFSSL_KEIL
  121223. "muls r6, r7, r6\n\t"
  121224. #elif defined(__clang__)
  121225. "muls r6, r7\n\t"
  121226. #else
  121227. "mul r6, r7\n\t"
  121228. #endif
  121229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121230. "lsrs r7, r6, #16\n\t"
  121231. #else
  121232. "lsr r7, r6, #16\n\t"
  121233. #endif
  121234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121235. "lsls r6, r6, #16\n\t"
  121236. #else
  121237. "lsl r6, r6, #16\n\t"
  121238. #endif
  121239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121240. "adds r4, r4, r6\n\t"
  121241. #else
  121242. "add r4, r4, r6\n\t"
  121243. #endif
  121244. #ifdef WOLFSSL_KEIL
  121245. "adcs r5, r5, r7\n\t"
  121246. #elif defined(__clang__)
  121247. "adcs r5, r7\n\t"
  121248. #else
  121249. "adc r5, r7\n\t"
  121250. #endif
  121251. #ifdef WOLFSSL_KEIL
  121252. "adcs r3, r3, %[r]\n\t"
  121253. #elif defined(__clang__)
  121254. "adcs r3, %[r]\n\t"
  121255. #else
  121256. "adc r3, %[r]\n\t"
  121257. #endif
  121258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121259. "lsrs r6, %[a], #16\n\t"
  121260. #else
  121261. "lsr r6, %[a], #16\n\t"
  121262. #endif
  121263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121264. "lsrs r7, %[b], #16\n\t"
  121265. #else
  121266. "lsr r7, %[b], #16\n\t"
  121267. #endif
  121268. #ifdef WOLFSSL_KEIL
  121269. "muls r7, r6, r7\n\t"
  121270. #elif defined(__clang__)
  121271. "muls r7, r6\n\t"
  121272. #else
  121273. "mul r7, r6\n\t"
  121274. #endif
  121275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121276. "adds r5, r5, r7\n\t"
  121277. #else
  121278. "add r5, r5, r7\n\t"
  121279. #endif
  121280. #ifdef WOLFSSL_KEIL
  121281. "adcs r3, r3, %[r]\n\t"
  121282. #elif defined(__clang__)
  121283. "adcs r3, %[r]\n\t"
  121284. #else
  121285. "adc r3, %[r]\n\t"
  121286. #endif
  121287. "uxth r7, %[b]\n\t"
  121288. #ifdef WOLFSSL_KEIL
  121289. "muls r6, r7, r6\n\t"
  121290. #elif defined(__clang__)
  121291. "muls r6, r7\n\t"
  121292. #else
  121293. "mul r6, r7\n\t"
  121294. #endif
  121295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121296. "lsrs r7, r6, #16\n\t"
  121297. #else
  121298. "lsr r7, r6, #16\n\t"
  121299. #endif
  121300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121301. "lsls r6, r6, #16\n\t"
  121302. #else
  121303. "lsl r6, r6, #16\n\t"
  121304. #endif
  121305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121306. "adds r4, r4, r6\n\t"
  121307. #else
  121308. "add r4, r4, r6\n\t"
  121309. #endif
  121310. #ifdef WOLFSSL_KEIL
  121311. "adcs r5, r5, r7\n\t"
  121312. #elif defined(__clang__)
  121313. "adcs r5, r7\n\t"
  121314. #else
  121315. "adc r5, r7\n\t"
  121316. #endif
  121317. #ifdef WOLFSSL_KEIL
  121318. "adcs r3, r3, %[r]\n\t"
  121319. #elif defined(__clang__)
  121320. "adcs r3, %[r]\n\t"
  121321. #else
  121322. "adc r3, %[r]\n\t"
  121323. #endif
  121324. "# A[6] * B[1]\n\t"
  121325. "mov %[a], r9\n\t"
  121326. "mov %[b], r10\n\t"
  121327. "ldr %[a], [%[a], #24]\n\t"
  121328. "ldr %[b], [%[b], #4]\n\t"
  121329. "uxth r6, %[a]\n\t"
  121330. "uxth r7, %[b]\n\t"
  121331. #ifdef WOLFSSL_KEIL
  121332. "muls r7, r6, r7\n\t"
  121333. #elif defined(__clang__)
  121334. "muls r7, r6\n\t"
  121335. #else
  121336. "mul r7, r6\n\t"
  121337. #endif
  121338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121339. "adds r4, r4, r7\n\t"
  121340. #else
  121341. "add r4, r4, r7\n\t"
  121342. #endif
  121343. #ifdef WOLFSSL_KEIL
  121344. "adcs r5, r5, %[r]\n\t"
  121345. #elif defined(__clang__)
  121346. "adcs r5, %[r]\n\t"
  121347. #else
  121348. "adc r5, %[r]\n\t"
  121349. #endif
  121350. #ifdef WOLFSSL_KEIL
  121351. "adcs r3, r3, %[r]\n\t"
  121352. #elif defined(__clang__)
  121353. "adcs r3, %[r]\n\t"
  121354. #else
  121355. "adc r3, %[r]\n\t"
  121356. #endif
  121357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121358. "lsrs r7, %[b], #16\n\t"
  121359. #else
  121360. "lsr r7, %[b], #16\n\t"
  121361. #endif
  121362. #ifdef WOLFSSL_KEIL
  121363. "muls r6, r7, r6\n\t"
  121364. #elif defined(__clang__)
  121365. "muls r6, r7\n\t"
  121366. #else
  121367. "mul r6, r7\n\t"
  121368. #endif
  121369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121370. "lsrs r7, r6, #16\n\t"
  121371. #else
  121372. "lsr r7, r6, #16\n\t"
  121373. #endif
  121374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121375. "lsls r6, r6, #16\n\t"
  121376. #else
  121377. "lsl r6, r6, #16\n\t"
  121378. #endif
  121379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121380. "adds r4, r4, r6\n\t"
  121381. #else
  121382. "add r4, r4, r6\n\t"
  121383. #endif
  121384. #ifdef WOLFSSL_KEIL
  121385. "adcs r5, r5, r7\n\t"
  121386. #elif defined(__clang__)
  121387. "adcs r5, r7\n\t"
  121388. #else
  121389. "adc r5, r7\n\t"
  121390. #endif
  121391. #ifdef WOLFSSL_KEIL
  121392. "adcs r3, r3, %[r]\n\t"
  121393. #elif defined(__clang__)
  121394. "adcs r3, %[r]\n\t"
  121395. #else
  121396. "adc r3, %[r]\n\t"
  121397. #endif
  121398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121399. "lsrs r6, %[a], #16\n\t"
  121400. #else
  121401. "lsr r6, %[a], #16\n\t"
  121402. #endif
  121403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121404. "lsrs r7, %[b], #16\n\t"
  121405. #else
  121406. "lsr r7, %[b], #16\n\t"
  121407. #endif
  121408. #ifdef WOLFSSL_KEIL
  121409. "muls r7, r6, r7\n\t"
  121410. #elif defined(__clang__)
  121411. "muls r7, r6\n\t"
  121412. #else
  121413. "mul r7, r6\n\t"
  121414. #endif
  121415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121416. "adds r5, r5, r7\n\t"
  121417. #else
  121418. "add r5, r5, r7\n\t"
  121419. #endif
  121420. #ifdef WOLFSSL_KEIL
  121421. "adcs r3, r3, %[r]\n\t"
  121422. #elif defined(__clang__)
  121423. "adcs r3, %[r]\n\t"
  121424. #else
  121425. "adc r3, %[r]\n\t"
  121426. #endif
  121427. "uxth r7, %[b]\n\t"
  121428. #ifdef WOLFSSL_KEIL
  121429. "muls r6, r7, r6\n\t"
  121430. #elif defined(__clang__)
  121431. "muls r6, r7\n\t"
  121432. #else
  121433. "mul r6, r7\n\t"
  121434. #endif
  121435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121436. "lsrs r7, r6, #16\n\t"
  121437. #else
  121438. "lsr r7, r6, #16\n\t"
  121439. #endif
  121440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121441. "lsls r6, r6, #16\n\t"
  121442. #else
  121443. "lsl r6, r6, #16\n\t"
  121444. #endif
  121445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121446. "adds r4, r4, r6\n\t"
  121447. #else
  121448. "add r4, r4, r6\n\t"
  121449. #endif
  121450. #ifdef WOLFSSL_KEIL
  121451. "adcs r5, r5, r7\n\t"
  121452. #elif defined(__clang__)
  121453. "adcs r5, r7\n\t"
  121454. #else
  121455. "adc r5, r7\n\t"
  121456. #endif
  121457. #ifdef WOLFSSL_KEIL
  121458. "adcs r3, r3, %[r]\n\t"
  121459. #elif defined(__clang__)
  121460. "adcs r3, %[r]\n\t"
  121461. #else
  121462. "adc r3, %[r]\n\t"
  121463. #endif
  121464. "# A[7] * B[0]\n\t"
  121465. "mov %[a], r9\n\t"
  121466. "mov %[b], r10\n\t"
  121467. "ldr %[a], [%[a], #28]\n\t"
  121468. "ldr %[b], [%[b]]\n\t"
  121469. "uxth r6, %[a]\n\t"
  121470. "uxth r7, %[b]\n\t"
  121471. #ifdef WOLFSSL_KEIL
  121472. "muls r7, r6, r7\n\t"
  121473. #elif defined(__clang__)
  121474. "muls r7, r6\n\t"
  121475. #else
  121476. "mul r7, r6\n\t"
  121477. #endif
  121478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121479. "adds r4, r4, r7\n\t"
  121480. #else
  121481. "add r4, r4, r7\n\t"
  121482. #endif
  121483. #ifdef WOLFSSL_KEIL
  121484. "adcs r5, r5, %[r]\n\t"
  121485. #elif defined(__clang__)
  121486. "adcs r5, %[r]\n\t"
  121487. #else
  121488. "adc r5, %[r]\n\t"
  121489. #endif
  121490. #ifdef WOLFSSL_KEIL
  121491. "adcs r3, r3, %[r]\n\t"
  121492. #elif defined(__clang__)
  121493. "adcs r3, %[r]\n\t"
  121494. #else
  121495. "adc r3, %[r]\n\t"
  121496. #endif
  121497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121498. "lsrs r7, %[b], #16\n\t"
  121499. #else
  121500. "lsr r7, %[b], #16\n\t"
  121501. #endif
  121502. #ifdef WOLFSSL_KEIL
  121503. "muls r6, r7, r6\n\t"
  121504. #elif defined(__clang__)
  121505. "muls r6, r7\n\t"
  121506. #else
  121507. "mul r6, r7\n\t"
  121508. #endif
  121509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121510. "lsrs r7, r6, #16\n\t"
  121511. #else
  121512. "lsr r7, r6, #16\n\t"
  121513. #endif
  121514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121515. "lsls r6, r6, #16\n\t"
  121516. #else
  121517. "lsl r6, r6, #16\n\t"
  121518. #endif
  121519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121520. "adds r4, r4, r6\n\t"
  121521. #else
  121522. "add r4, r4, r6\n\t"
  121523. #endif
  121524. #ifdef WOLFSSL_KEIL
  121525. "adcs r5, r5, r7\n\t"
  121526. #elif defined(__clang__)
  121527. "adcs r5, r7\n\t"
  121528. #else
  121529. "adc r5, r7\n\t"
  121530. #endif
  121531. #ifdef WOLFSSL_KEIL
  121532. "adcs r3, r3, %[r]\n\t"
  121533. #elif defined(__clang__)
  121534. "adcs r3, %[r]\n\t"
  121535. #else
  121536. "adc r3, %[r]\n\t"
  121537. #endif
  121538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121539. "lsrs r6, %[a], #16\n\t"
  121540. #else
  121541. "lsr r6, %[a], #16\n\t"
  121542. #endif
  121543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121544. "lsrs r7, %[b], #16\n\t"
  121545. #else
  121546. "lsr r7, %[b], #16\n\t"
  121547. #endif
  121548. #ifdef WOLFSSL_KEIL
  121549. "muls r7, r6, r7\n\t"
  121550. #elif defined(__clang__)
  121551. "muls r7, r6\n\t"
  121552. #else
  121553. "mul r7, r6\n\t"
  121554. #endif
  121555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121556. "adds r5, r5, r7\n\t"
  121557. #else
  121558. "add r5, r5, r7\n\t"
  121559. #endif
  121560. #ifdef WOLFSSL_KEIL
  121561. "adcs r3, r3, %[r]\n\t"
  121562. #elif defined(__clang__)
  121563. "adcs r3, %[r]\n\t"
  121564. #else
  121565. "adc r3, %[r]\n\t"
  121566. #endif
  121567. "uxth r7, %[b]\n\t"
  121568. #ifdef WOLFSSL_KEIL
  121569. "muls r6, r7, r6\n\t"
  121570. #elif defined(__clang__)
  121571. "muls r6, r7\n\t"
  121572. #else
  121573. "mul r6, r7\n\t"
  121574. #endif
  121575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121576. "lsrs r7, r6, #16\n\t"
  121577. #else
  121578. "lsr r7, r6, #16\n\t"
  121579. #endif
  121580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121581. "lsls r6, r6, #16\n\t"
  121582. #else
  121583. "lsl r6, r6, #16\n\t"
  121584. #endif
  121585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121586. "adds r4, r4, r6\n\t"
  121587. #else
  121588. "add r4, r4, r6\n\t"
  121589. #endif
  121590. #ifdef WOLFSSL_KEIL
  121591. "adcs r5, r5, r7\n\t"
  121592. #elif defined(__clang__)
  121593. "adcs r5, r7\n\t"
  121594. #else
  121595. "adc r5, r7\n\t"
  121596. #endif
  121597. #ifdef WOLFSSL_KEIL
  121598. "adcs r3, r3, %[r]\n\t"
  121599. #elif defined(__clang__)
  121600. "adcs r3, %[r]\n\t"
  121601. #else
  121602. "adc r3, %[r]\n\t"
  121603. #endif
  121604. "str r4, [sp, #28]\n\t"
  121605. "# A[8] * B[0]\n\t"
  121606. "movs r4, #0\n\t"
  121607. "mov %[a], r9\n\t"
  121608. "mov %[b], r10\n\t"
  121609. "ldr %[a], [%[a], #32]\n\t"
  121610. "ldr %[b], [%[b]]\n\t"
  121611. "uxth r6, %[a]\n\t"
  121612. "uxth r7, %[b]\n\t"
  121613. #ifdef WOLFSSL_KEIL
  121614. "muls r7, r6, r7\n\t"
  121615. #elif defined(__clang__)
  121616. "muls r7, r6\n\t"
  121617. #else
  121618. "mul r7, r6\n\t"
  121619. #endif
  121620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121621. "adds r5, r5, r7\n\t"
  121622. #else
  121623. "add r5, r5, r7\n\t"
  121624. #endif
  121625. #ifdef WOLFSSL_KEIL
  121626. "adcs r3, r3, %[r]\n\t"
  121627. #elif defined(__clang__)
  121628. "adcs r3, %[r]\n\t"
  121629. #else
  121630. "adc r3, %[r]\n\t"
  121631. #endif
  121632. #ifdef WOLFSSL_KEIL
  121633. "adcs r4, r4, %[r]\n\t"
  121634. #elif defined(__clang__)
  121635. "adcs r4, %[r]\n\t"
  121636. #else
  121637. "adc r4, %[r]\n\t"
  121638. #endif
  121639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121640. "lsrs r7, %[b], #16\n\t"
  121641. #else
  121642. "lsr r7, %[b], #16\n\t"
  121643. #endif
  121644. #ifdef WOLFSSL_KEIL
  121645. "muls r6, r7, r6\n\t"
  121646. #elif defined(__clang__)
  121647. "muls r6, r7\n\t"
  121648. #else
  121649. "mul r6, r7\n\t"
  121650. #endif
  121651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121652. "lsrs r7, r6, #16\n\t"
  121653. #else
  121654. "lsr r7, r6, #16\n\t"
  121655. #endif
  121656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121657. "lsls r6, r6, #16\n\t"
  121658. #else
  121659. "lsl r6, r6, #16\n\t"
  121660. #endif
  121661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121662. "adds r5, r5, r6\n\t"
  121663. #else
  121664. "add r5, r5, r6\n\t"
  121665. #endif
  121666. #ifdef WOLFSSL_KEIL
  121667. "adcs r3, r3, r7\n\t"
  121668. #elif defined(__clang__)
  121669. "adcs r3, r7\n\t"
  121670. #else
  121671. "adc r3, r7\n\t"
  121672. #endif
  121673. #ifdef WOLFSSL_KEIL
  121674. "adcs r4, r4, %[r]\n\t"
  121675. #elif defined(__clang__)
  121676. "adcs r4, %[r]\n\t"
  121677. #else
  121678. "adc r4, %[r]\n\t"
  121679. #endif
  121680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121681. "lsrs r6, %[a], #16\n\t"
  121682. #else
  121683. "lsr r6, %[a], #16\n\t"
  121684. #endif
  121685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121686. "lsrs r7, %[b], #16\n\t"
  121687. #else
  121688. "lsr r7, %[b], #16\n\t"
  121689. #endif
  121690. #ifdef WOLFSSL_KEIL
  121691. "muls r7, r6, r7\n\t"
  121692. #elif defined(__clang__)
  121693. "muls r7, r6\n\t"
  121694. #else
  121695. "mul r7, r6\n\t"
  121696. #endif
  121697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121698. "adds r3, r3, r7\n\t"
  121699. #else
  121700. "add r3, r3, r7\n\t"
  121701. #endif
  121702. #ifdef WOLFSSL_KEIL
  121703. "adcs r4, r4, %[r]\n\t"
  121704. #elif defined(__clang__)
  121705. "adcs r4, %[r]\n\t"
  121706. #else
  121707. "adc r4, %[r]\n\t"
  121708. #endif
  121709. "uxth r7, %[b]\n\t"
  121710. #ifdef WOLFSSL_KEIL
  121711. "muls r6, r7, r6\n\t"
  121712. #elif defined(__clang__)
  121713. "muls r6, r7\n\t"
  121714. #else
  121715. "mul r6, r7\n\t"
  121716. #endif
  121717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121718. "lsrs r7, r6, #16\n\t"
  121719. #else
  121720. "lsr r7, r6, #16\n\t"
  121721. #endif
  121722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121723. "lsls r6, r6, #16\n\t"
  121724. #else
  121725. "lsl r6, r6, #16\n\t"
  121726. #endif
  121727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121728. "adds r5, r5, r6\n\t"
  121729. #else
  121730. "add r5, r5, r6\n\t"
  121731. #endif
  121732. #ifdef WOLFSSL_KEIL
  121733. "adcs r3, r3, r7\n\t"
  121734. #elif defined(__clang__)
  121735. "adcs r3, r7\n\t"
  121736. #else
  121737. "adc r3, r7\n\t"
  121738. #endif
  121739. #ifdef WOLFSSL_KEIL
  121740. "adcs r4, r4, %[r]\n\t"
  121741. #elif defined(__clang__)
  121742. "adcs r4, %[r]\n\t"
  121743. #else
  121744. "adc r4, %[r]\n\t"
  121745. #endif
  121746. "# A[7] * B[1]\n\t"
  121747. "mov %[a], r9\n\t"
  121748. "mov %[b], r10\n\t"
  121749. "ldr %[a], [%[a], #28]\n\t"
  121750. "ldr %[b], [%[b], #4]\n\t"
  121751. "uxth r6, %[a]\n\t"
  121752. "uxth r7, %[b]\n\t"
  121753. #ifdef WOLFSSL_KEIL
  121754. "muls r7, r6, r7\n\t"
  121755. #elif defined(__clang__)
  121756. "muls r7, r6\n\t"
  121757. #else
  121758. "mul r7, r6\n\t"
  121759. #endif
  121760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121761. "adds r5, r5, r7\n\t"
  121762. #else
  121763. "add r5, r5, r7\n\t"
  121764. #endif
  121765. #ifdef WOLFSSL_KEIL
  121766. "adcs r3, r3, %[r]\n\t"
  121767. #elif defined(__clang__)
  121768. "adcs r3, %[r]\n\t"
  121769. #else
  121770. "adc r3, %[r]\n\t"
  121771. #endif
  121772. #ifdef WOLFSSL_KEIL
  121773. "adcs r4, r4, %[r]\n\t"
  121774. #elif defined(__clang__)
  121775. "adcs r4, %[r]\n\t"
  121776. #else
  121777. "adc r4, %[r]\n\t"
  121778. #endif
  121779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121780. "lsrs r7, %[b], #16\n\t"
  121781. #else
  121782. "lsr r7, %[b], #16\n\t"
  121783. #endif
  121784. #ifdef WOLFSSL_KEIL
  121785. "muls r6, r7, r6\n\t"
  121786. #elif defined(__clang__)
  121787. "muls r6, r7\n\t"
  121788. #else
  121789. "mul r6, r7\n\t"
  121790. #endif
  121791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121792. "lsrs r7, r6, #16\n\t"
  121793. #else
  121794. "lsr r7, r6, #16\n\t"
  121795. #endif
  121796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121797. "lsls r6, r6, #16\n\t"
  121798. #else
  121799. "lsl r6, r6, #16\n\t"
  121800. #endif
  121801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121802. "adds r5, r5, r6\n\t"
  121803. #else
  121804. "add r5, r5, r6\n\t"
  121805. #endif
  121806. #ifdef WOLFSSL_KEIL
  121807. "adcs r3, r3, r7\n\t"
  121808. #elif defined(__clang__)
  121809. "adcs r3, r7\n\t"
  121810. #else
  121811. "adc r3, r7\n\t"
  121812. #endif
  121813. #ifdef WOLFSSL_KEIL
  121814. "adcs r4, r4, %[r]\n\t"
  121815. #elif defined(__clang__)
  121816. "adcs r4, %[r]\n\t"
  121817. #else
  121818. "adc r4, %[r]\n\t"
  121819. #endif
  121820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121821. "lsrs r6, %[a], #16\n\t"
  121822. #else
  121823. "lsr r6, %[a], #16\n\t"
  121824. #endif
  121825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121826. "lsrs r7, %[b], #16\n\t"
  121827. #else
  121828. "lsr r7, %[b], #16\n\t"
  121829. #endif
  121830. #ifdef WOLFSSL_KEIL
  121831. "muls r7, r6, r7\n\t"
  121832. #elif defined(__clang__)
  121833. "muls r7, r6\n\t"
  121834. #else
  121835. "mul r7, r6\n\t"
  121836. #endif
  121837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121838. "adds r3, r3, r7\n\t"
  121839. #else
  121840. "add r3, r3, r7\n\t"
  121841. #endif
  121842. #ifdef WOLFSSL_KEIL
  121843. "adcs r4, r4, %[r]\n\t"
  121844. #elif defined(__clang__)
  121845. "adcs r4, %[r]\n\t"
  121846. #else
  121847. "adc r4, %[r]\n\t"
  121848. #endif
  121849. "uxth r7, %[b]\n\t"
  121850. #ifdef WOLFSSL_KEIL
  121851. "muls r6, r7, r6\n\t"
  121852. #elif defined(__clang__)
  121853. "muls r6, r7\n\t"
  121854. #else
  121855. "mul r6, r7\n\t"
  121856. #endif
  121857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121858. "lsrs r7, r6, #16\n\t"
  121859. #else
  121860. "lsr r7, r6, #16\n\t"
  121861. #endif
  121862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121863. "lsls r6, r6, #16\n\t"
  121864. #else
  121865. "lsl r6, r6, #16\n\t"
  121866. #endif
  121867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121868. "adds r5, r5, r6\n\t"
  121869. #else
  121870. "add r5, r5, r6\n\t"
  121871. #endif
  121872. #ifdef WOLFSSL_KEIL
  121873. "adcs r3, r3, r7\n\t"
  121874. #elif defined(__clang__)
  121875. "adcs r3, r7\n\t"
  121876. #else
  121877. "adc r3, r7\n\t"
  121878. #endif
  121879. #ifdef WOLFSSL_KEIL
  121880. "adcs r4, r4, %[r]\n\t"
  121881. #elif defined(__clang__)
  121882. "adcs r4, %[r]\n\t"
  121883. #else
  121884. "adc r4, %[r]\n\t"
  121885. #endif
  121886. "# A[6] * B[2]\n\t"
  121887. "mov %[a], r9\n\t"
  121888. "mov %[b], r10\n\t"
  121889. "ldr %[a], [%[a], #24]\n\t"
  121890. "ldr %[b], [%[b], #8]\n\t"
  121891. "uxth r6, %[a]\n\t"
  121892. "uxth r7, %[b]\n\t"
  121893. #ifdef WOLFSSL_KEIL
  121894. "muls r7, r6, r7\n\t"
  121895. #elif defined(__clang__)
  121896. "muls r7, r6\n\t"
  121897. #else
  121898. "mul r7, r6\n\t"
  121899. #endif
  121900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121901. "adds r5, r5, r7\n\t"
  121902. #else
  121903. "add r5, r5, r7\n\t"
  121904. #endif
  121905. #ifdef WOLFSSL_KEIL
  121906. "adcs r3, r3, %[r]\n\t"
  121907. #elif defined(__clang__)
  121908. "adcs r3, %[r]\n\t"
  121909. #else
  121910. "adc r3, %[r]\n\t"
  121911. #endif
  121912. #ifdef WOLFSSL_KEIL
  121913. "adcs r4, r4, %[r]\n\t"
  121914. #elif defined(__clang__)
  121915. "adcs r4, %[r]\n\t"
  121916. #else
  121917. "adc r4, %[r]\n\t"
  121918. #endif
  121919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121920. "lsrs r7, %[b], #16\n\t"
  121921. #else
  121922. "lsr r7, %[b], #16\n\t"
  121923. #endif
  121924. #ifdef WOLFSSL_KEIL
  121925. "muls r6, r7, r6\n\t"
  121926. #elif defined(__clang__)
  121927. "muls r6, r7\n\t"
  121928. #else
  121929. "mul r6, r7\n\t"
  121930. #endif
  121931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121932. "lsrs r7, r6, #16\n\t"
  121933. #else
  121934. "lsr r7, r6, #16\n\t"
  121935. #endif
  121936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121937. "lsls r6, r6, #16\n\t"
  121938. #else
  121939. "lsl r6, r6, #16\n\t"
  121940. #endif
  121941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121942. "adds r5, r5, r6\n\t"
  121943. #else
  121944. "add r5, r5, r6\n\t"
  121945. #endif
  121946. #ifdef WOLFSSL_KEIL
  121947. "adcs r3, r3, r7\n\t"
  121948. #elif defined(__clang__)
  121949. "adcs r3, r7\n\t"
  121950. #else
  121951. "adc r3, r7\n\t"
  121952. #endif
  121953. #ifdef WOLFSSL_KEIL
  121954. "adcs r4, r4, %[r]\n\t"
  121955. #elif defined(__clang__)
  121956. "adcs r4, %[r]\n\t"
  121957. #else
  121958. "adc r4, %[r]\n\t"
  121959. #endif
  121960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121961. "lsrs r6, %[a], #16\n\t"
  121962. #else
  121963. "lsr r6, %[a], #16\n\t"
  121964. #endif
  121965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121966. "lsrs r7, %[b], #16\n\t"
  121967. #else
  121968. "lsr r7, %[b], #16\n\t"
  121969. #endif
  121970. #ifdef WOLFSSL_KEIL
  121971. "muls r7, r6, r7\n\t"
  121972. #elif defined(__clang__)
  121973. "muls r7, r6\n\t"
  121974. #else
  121975. "mul r7, r6\n\t"
  121976. #endif
  121977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121978. "adds r3, r3, r7\n\t"
  121979. #else
  121980. "add r3, r3, r7\n\t"
  121981. #endif
  121982. #ifdef WOLFSSL_KEIL
  121983. "adcs r4, r4, %[r]\n\t"
  121984. #elif defined(__clang__)
  121985. "adcs r4, %[r]\n\t"
  121986. #else
  121987. "adc r4, %[r]\n\t"
  121988. #endif
  121989. "uxth r7, %[b]\n\t"
  121990. #ifdef WOLFSSL_KEIL
  121991. "muls r6, r7, r6\n\t"
  121992. #elif defined(__clang__)
  121993. "muls r6, r7\n\t"
  121994. #else
  121995. "mul r6, r7\n\t"
  121996. #endif
  121997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121998. "lsrs r7, r6, #16\n\t"
  121999. #else
  122000. "lsr r7, r6, #16\n\t"
  122001. #endif
  122002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122003. "lsls r6, r6, #16\n\t"
  122004. #else
  122005. "lsl r6, r6, #16\n\t"
  122006. #endif
  122007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122008. "adds r5, r5, r6\n\t"
  122009. #else
  122010. "add r5, r5, r6\n\t"
  122011. #endif
  122012. #ifdef WOLFSSL_KEIL
  122013. "adcs r3, r3, r7\n\t"
  122014. #elif defined(__clang__)
  122015. "adcs r3, r7\n\t"
  122016. #else
  122017. "adc r3, r7\n\t"
  122018. #endif
  122019. #ifdef WOLFSSL_KEIL
  122020. "adcs r4, r4, %[r]\n\t"
  122021. #elif defined(__clang__)
  122022. "adcs r4, %[r]\n\t"
  122023. #else
  122024. "adc r4, %[r]\n\t"
  122025. #endif
  122026. "# A[5] * B[3]\n\t"
  122027. "mov %[a], r9\n\t"
  122028. "mov %[b], r10\n\t"
  122029. "ldr %[a], [%[a], #20]\n\t"
  122030. "ldr %[b], [%[b], #12]\n\t"
  122031. "uxth r6, %[a]\n\t"
  122032. "uxth r7, %[b]\n\t"
  122033. #ifdef WOLFSSL_KEIL
  122034. "muls r7, r6, r7\n\t"
  122035. #elif defined(__clang__)
  122036. "muls r7, r6\n\t"
  122037. #else
  122038. "mul r7, r6\n\t"
  122039. #endif
  122040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122041. "adds r5, r5, r7\n\t"
  122042. #else
  122043. "add r5, r5, r7\n\t"
  122044. #endif
  122045. #ifdef WOLFSSL_KEIL
  122046. "adcs r3, r3, %[r]\n\t"
  122047. #elif defined(__clang__)
  122048. "adcs r3, %[r]\n\t"
  122049. #else
  122050. "adc r3, %[r]\n\t"
  122051. #endif
  122052. #ifdef WOLFSSL_KEIL
  122053. "adcs r4, r4, %[r]\n\t"
  122054. #elif defined(__clang__)
  122055. "adcs r4, %[r]\n\t"
  122056. #else
  122057. "adc r4, %[r]\n\t"
  122058. #endif
  122059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122060. "lsrs r7, %[b], #16\n\t"
  122061. #else
  122062. "lsr r7, %[b], #16\n\t"
  122063. #endif
  122064. #ifdef WOLFSSL_KEIL
  122065. "muls r6, r7, r6\n\t"
  122066. #elif defined(__clang__)
  122067. "muls r6, r7\n\t"
  122068. #else
  122069. "mul r6, r7\n\t"
  122070. #endif
  122071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122072. "lsrs r7, r6, #16\n\t"
  122073. #else
  122074. "lsr r7, r6, #16\n\t"
  122075. #endif
  122076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122077. "lsls r6, r6, #16\n\t"
  122078. #else
  122079. "lsl r6, r6, #16\n\t"
  122080. #endif
  122081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122082. "adds r5, r5, r6\n\t"
  122083. #else
  122084. "add r5, r5, r6\n\t"
  122085. #endif
  122086. #ifdef WOLFSSL_KEIL
  122087. "adcs r3, r3, r7\n\t"
  122088. #elif defined(__clang__)
  122089. "adcs r3, r7\n\t"
  122090. #else
  122091. "adc r3, r7\n\t"
  122092. #endif
  122093. #ifdef WOLFSSL_KEIL
  122094. "adcs r4, r4, %[r]\n\t"
  122095. #elif defined(__clang__)
  122096. "adcs r4, %[r]\n\t"
  122097. #else
  122098. "adc r4, %[r]\n\t"
  122099. #endif
  122100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122101. "lsrs r6, %[a], #16\n\t"
  122102. #else
  122103. "lsr r6, %[a], #16\n\t"
  122104. #endif
  122105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122106. "lsrs r7, %[b], #16\n\t"
  122107. #else
  122108. "lsr r7, %[b], #16\n\t"
  122109. #endif
  122110. #ifdef WOLFSSL_KEIL
  122111. "muls r7, r6, r7\n\t"
  122112. #elif defined(__clang__)
  122113. "muls r7, r6\n\t"
  122114. #else
  122115. "mul r7, r6\n\t"
  122116. #endif
  122117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122118. "adds r3, r3, r7\n\t"
  122119. #else
  122120. "add r3, r3, r7\n\t"
  122121. #endif
  122122. #ifdef WOLFSSL_KEIL
  122123. "adcs r4, r4, %[r]\n\t"
  122124. #elif defined(__clang__)
  122125. "adcs r4, %[r]\n\t"
  122126. #else
  122127. "adc r4, %[r]\n\t"
  122128. #endif
  122129. "uxth r7, %[b]\n\t"
  122130. #ifdef WOLFSSL_KEIL
  122131. "muls r6, r7, r6\n\t"
  122132. #elif defined(__clang__)
  122133. "muls r6, r7\n\t"
  122134. #else
  122135. "mul r6, r7\n\t"
  122136. #endif
  122137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122138. "lsrs r7, r6, #16\n\t"
  122139. #else
  122140. "lsr r7, r6, #16\n\t"
  122141. #endif
  122142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122143. "lsls r6, r6, #16\n\t"
  122144. #else
  122145. "lsl r6, r6, #16\n\t"
  122146. #endif
  122147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122148. "adds r5, r5, r6\n\t"
  122149. #else
  122150. "add r5, r5, r6\n\t"
  122151. #endif
  122152. #ifdef WOLFSSL_KEIL
  122153. "adcs r3, r3, r7\n\t"
  122154. #elif defined(__clang__)
  122155. "adcs r3, r7\n\t"
  122156. #else
  122157. "adc r3, r7\n\t"
  122158. #endif
  122159. #ifdef WOLFSSL_KEIL
  122160. "adcs r4, r4, %[r]\n\t"
  122161. #elif defined(__clang__)
  122162. "adcs r4, %[r]\n\t"
  122163. #else
  122164. "adc r4, %[r]\n\t"
  122165. #endif
  122166. "# A[4] * B[4]\n\t"
  122167. "mov %[a], r9\n\t"
  122168. "mov %[b], r10\n\t"
  122169. "ldr %[a], [%[a], #16]\n\t"
  122170. "ldr %[b], [%[b], #16]\n\t"
  122171. "uxth r6, %[a]\n\t"
  122172. "uxth r7, %[b]\n\t"
  122173. #ifdef WOLFSSL_KEIL
  122174. "muls r7, r6, r7\n\t"
  122175. #elif defined(__clang__)
  122176. "muls r7, r6\n\t"
  122177. #else
  122178. "mul r7, r6\n\t"
  122179. #endif
  122180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122181. "adds r5, r5, r7\n\t"
  122182. #else
  122183. "add r5, r5, r7\n\t"
  122184. #endif
  122185. #ifdef WOLFSSL_KEIL
  122186. "adcs r3, r3, %[r]\n\t"
  122187. #elif defined(__clang__)
  122188. "adcs r3, %[r]\n\t"
  122189. #else
  122190. "adc r3, %[r]\n\t"
  122191. #endif
  122192. #ifdef WOLFSSL_KEIL
  122193. "adcs r4, r4, %[r]\n\t"
  122194. #elif defined(__clang__)
  122195. "adcs r4, %[r]\n\t"
  122196. #else
  122197. "adc r4, %[r]\n\t"
  122198. #endif
  122199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122200. "lsrs r7, %[b], #16\n\t"
  122201. #else
  122202. "lsr r7, %[b], #16\n\t"
  122203. #endif
  122204. #ifdef WOLFSSL_KEIL
  122205. "muls r6, r7, r6\n\t"
  122206. #elif defined(__clang__)
  122207. "muls r6, r7\n\t"
  122208. #else
  122209. "mul r6, r7\n\t"
  122210. #endif
  122211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122212. "lsrs r7, r6, #16\n\t"
  122213. #else
  122214. "lsr r7, r6, #16\n\t"
  122215. #endif
  122216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122217. "lsls r6, r6, #16\n\t"
  122218. #else
  122219. "lsl r6, r6, #16\n\t"
  122220. #endif
  122221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122222. "adds r5, r5, r6\n\t"
  122223. #else
  122224. "add r5, r5, r6\n\t"
  122225. #endif
  122226. #ifdef WOLFSSL_KEIL
  122227. "adcs r3, r3, r7\n\t"
  122228. #elif defined(__clang__)
  122229. "adcs r3, r7\n\t"
  122230. #else
  122231. "adc r3, r7\n\t"
  122232. #endif
  122233. #ifdef WOLFSSL_KEIL
  122234. "adcs r4, r4, %[r]\n\t"
  122235. #elif defined(__clang__)
  122236. "adcs r4, %[r]\n\t"
  122237. #else
  122238. "adc r4, %[r]\n\t"
  122239. #endif
  122240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122241. "lsrs r6, %[a], #16\n\t"
  122242. #else
  122243. "lsr r6, %[a], #16\n\t"
  122244. #endif
  122245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122246. "lsrs r7, %[b], #16\n\t"
  122247. #else
  122248. "lsr r7, %[b], #16\n\t"
  122249. #endif
  122250. #ifdef WOLFSSL_KEIL
  122251. "muls r7, r6, r7\n\t"
  122252. #elif defined(__clang__)
  122253. "muls r7, r6\n\t"
  122254. #else
  122255. "mul r7, r6\n\t"
  122256. #endif
  122257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122258. "adds r3, r3, r7\n\t"
  122259. #else
  122260. "add r3, r3, r7\n\t"
  122261. #endif
  122262. #ifdef WOLFSSL_KEIL
  122263. "adcs r4, r4, %[r]\n\t"
  122264. #elif defined(__clang__)
  122265. "adcs r4, %[r]\n\t"
  122266. #else
  122267. "adc r4, %[r]\n\t"
  122268. #endif
  122269. "uxth r7, %[b]\n\t"
  122270. #ifdef WOLFSSL_KEIL
  122271. "muls r6, r7, r6\n\t"
  122272. #elif defined(__clang__)
  122273. "muls r6, r7\n\t"
  122274. #else
  122275. "mul r6, r7\n\t"
  122276. #endif
  122277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122278. "lsrs r7, r6, #16\n\t"
  122279. #else
  122280. "lsr r7, r6, #16\n\t"
  122281. #endif
  122282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122283. "lsls r6, r6, #16\n\t"
  122284. #else
  122285. "lsl r6, r6, #16\n\t"
  122286. #endif
  122287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122288. "adds r5, r5, r6\n\t"
  122289. #else
  122290. "add r5, r5, r6\n\t"
  122291. #endif
  122292. #ifdef WOLFSSL_KEIL
  122293. "adcs r3, r3, r7\n\t"
  122294. #elif defined(__clang__)
  122295. "adcs r3, r7\n\t"
  122296. #else
  122297. "adc r3, r7\n\t"
  122298. #endif
  122299. #ifdef WOLFSSL_KEIL
  122300. "adcs r4, r4, %[r]\n\t"
  122301. #elif defined(__clang__)
  122302. "adcs r4, %[r]\n\t"
  122303. #else
  122304. "adc r4, %[r]\n\t"
  122305. #endif
  122306. "# A[3] * B[5]\n\t"
  122307. "mov %[a], r9\n\t"
  122308. "mov %[b], r10\n\t"
  122309. "ldr %[a], [%[a], #12]\n\t"
  122310. "ldr %[b], [%[b], #20]\n\t"
  122311. "uxth r6, %[a]\n\t"
  122312. "uxth r7, %[b]\n\t"
  122313. #ifdef WOLFSSL_KEIL
  122314. "muls r7, r6, r7\n\t"
  122315. #elif defined(__clang__)
  122316. "muls r7, r6\n\t"
  122317. #else
  122318. "mul r7, r6\n\t"
  122319. #endif
  122320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122321. "adds r5, r5, r7\n\t"
  122322. #else
  122323. "add r5, r5, r7\n\t"
  122324. #endif
  122325. #ifdef WOLFSSL_KEIL
  122326. "adcs r3, r3, %[r]\n\t"
  122327. #elif defined(__clang__)
  122328. "adcs r3, %[r]\n\t"
  122329. #else
  122330. "adc r3, %[r]\n\t"
  122331. #endif
  122332. #ifdef WOLFSSL_KEIL
  122333. "adcs r4, r4, %[r]\n\t"
  122334. #elif defined(__clang__)
  122335. "adcs r4, %[r]\n\t"
  122336. #else
  122337. "adc r4, %[r]\n\t"
  122338. #endif
  122339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122340. "lsrs r7, %[b], #16\n\t"
  122341. #else
  122342. "lsr r7, %[b], #16\n\t"
  122343. #endif
  122344. #ifdef WOLFSSL_KEIL
  122345. "muls r6, r7, r6\n\t"
  122346. #elif defined(__clang__)
  122347. "muls r6, r7\n\t"
  122348. #else
  122349. "mul r6, r7\n\t"
  122350. #endif
  122351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122352. "lsrs r7, r6, #16\n\t"
  122353. #else
  122354. "lsr r7, r6, #16\n\t"
  122355. #endif
  122356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122357. "lsls r6, r6, #16\n\t"
  122358. #else
  122359. "lsl r6, r6, #16\n\t"
  122360. #endif
  122361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122362. "adds r5, r5, r6\n\t"
  122363. #else
  122364. "add r5, r5, r6\n\t"
  122365. #endif
  122366. #ifdef WOLFSSL_KEIL
  122367. "adcs r3, r3, r7\n\t"
  122368. #elif defined(__clang__)
  122369. "adcs r3, r7\n\t"
  122370. #else
  122371. "adc r3, r7\n\t"
  122372. #endif
  122373. #ifdef WOLFSSL_KEIL
  122374. "adcs r4, r4, %[r]\n\t"
  122375. #elif defined(__clang__)
  122376. "adcs r4, %[r]\n\t"
  122377. #else
  122378. "adc r4, %[r]\n\t"
  122379. #endif
  122380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122381. "lsrs r6, %[a], #16\n\t"
  122382. #else
  122383. "lsr r6, %[a], #16\n\t"
  122384. #endif
  122385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122386. "lsrs r7, %[b], #16\n\t"
  122387. #else
  122388. "lsr r7, %[b], #16\n\t"
  122389. #endif
  122390. #ifdef WOLFSSL_KEIL
  122391. "muls r7, r6, r7\n\t"
  122392. #elif defined(__clang__)
  122393. "muls r7, r6\n\t"
  122394. #else
  122395. "mul r7, r6\n\t"
  122396. #endif
  122397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122398. "adds r3, r3, r7\n\t"
  122399. #else
  122400. "add r3, r3, r7\n\t"
  122401. #endif
  122402. #ifdef WOLFSSL_KEIL
  122403. "adcs r4, r4, %[r]\n\t"
  122404. #elif defined(__clang__)
  122405. "adcs r4, %[r]\n\t"
  122406. #else
  122407. "adc r4, %[r]\n\t"
  122408. #endif
  122409. "uxth r7, %[b]\n\t"
  122410. #ifdef WOLFSSL_KEIL
  122411. "muls r6, r7, r6\n\t"
  122412. #elif defined(__clang__)
  122413. "muls r6, r7\n\t"
  122414. #else
  122415. "mul r6, r7\n\t"
  122416. #endif
  122417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122418. "lsrs r7, r6, #16\n\t"
  122419. #else
  122420. "lsr r7, r6, #16\n\t"
  122421. #endif
  122422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122423. "lsls r6, r6, #16\n\t"
  122424. #else
  122425. "lsl r6, r6, #16\n\t"
  122426. #endif
  122427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122428. "adds r5, r5, r6\n\t"
  122429. #else
  122430. "add r5, r5, r6\n\t"
  122431. #endif
  122432. #ifdef WOLFSSL_KEIL
  122433. "adcs r3, r3, r7\n\t"
  122434. #elif defined(__clang__)
  122435. "adcs r3, r7\n\t"
  122436. #else
  122437. "adc r3, r7\n\t"
  122438. #endif
  122439. #ifdef WOLFSSL_KEIL
  122440. "adcs r4, r4, %[r]\n\t"
  122441. #elif defined(__clang__)
  122442. "adcs r4, %[r]\n\t"
  122443. #else
  122444. "adc r4, %[r]\n\t"
  122445. #endif
  122446. "# A[2] * B[6]\n\t"
  122447. "mov %[a], r9\n\t"
  122448. "mov %[b], r10\n\t"
  122449. "ldr %[a], [%[a], #8]\n\t"
  122450. "ldr %[b], [%[b], #24]\n\t"
  122451. "uxth r6, %[a]\n\t"
  122452. "uxth r7, %[b]\n\t"
  122453. #ifdef WOLFSSL_KEIL
  122454. "muls r7, r6, r7\n\t"
  122455. #elif defined(__clang__)
  122456. "muls r7, r6\n\t"
  122457. #else
  122458. "mul r7, r6\n\t"
  122459. #endif
  122460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122461. "adds r5, r5, r7\n\t"
  122462. #else
  122463. "add r5, r5, r7\n\t"
  122464. #endif
  122465. #ifdef WOLFSSL_KEIL
  122466. "adcs r3, r3, %[r]\n\t"
  122467. #elif defined(__clang__)
  122468. "adcs r3, %[r]\n\t"
  122469. #else
  122470. "adc r3, %[r]\n\t"
  122471. #endif
  122472. #ifdef WOLFSSL_KEIL
  122473. "adcs r4, r4, %[r]\n\t"
  122474. #elif defined(__clang__)
  122475. "adcs r4, %[r]\n\t"
  122476. #else
  122477. "adc r4, %[r]\n\t"
  122478. #endif
  122479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122480. "lsrs r7, %[b], #16\n\t"
  122481. #else
  122482. "lsr r7, %[b], #16\n\t"
  122483. #endif
  122484. #ifdef WOLFSSL_KEIL
  122485. "muls r6, r7, r6\n\t"
  122486. #elif defined(__clang__)
  122487. "muls r6, r7\n\t"
  122488. #else
  122489. "mul r6, r7\n\t"
  122490. #endif
  122491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122492. "lsrs r7, r6, #16\n\t"
  122493. #else
  122494. "lsr r7, r6, #16\n\t"
  122495. #endif
  122496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122497. "lsls r6, r6, #16\n\t"
  122498. #else
  122499. "lsl r6, r6, #16\n\t"
  122500. #endif
  122501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122502. "adds r5, r5, r6\n\t"
  122503. #else
  122504. "add r5, r5, r6\n\t"
  122505. #endif
  122506. #ifdef WOLFSSL_KEIL
  122507. "adcs r3, r3, r7\n\t"
  122508. #elif defined(__clang__)
  122509. "adcs r3, r7\n\t"
  122510. #else
  122511. "adc r3, r7\n\t"
  122512. #endif
  122513. #ifdef WOLFSSL_KEIL
  122514. "adcs r4, r4, %[r]\n\t"
  122515. #elif defined(__clang__)
  122516. "adcs r4, %[r]\n\t"
  122517. #else
  122518. "adc r4, %[r]\n\t"
  122519. #endif
  122520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122521. "lsrs r6, %[a], #16\n\t"
  122522. #else
  122523. "lsr r6, %[a], #16\n\t"
  122524. #endif
  122525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122526. "lsrs r7, %[b], #16\n\t"
  122527. #else
  122528. "lsr r7, %[b], #16\n\t"
  122529. #endif
  122530. #ifdef WOLFSSL_KEIL
  122531. "muls r7, r6, r7\n\t"
  122532. #elif defined(__clang__)
  122533. "muls r7, r6\n\t"
  122534. #else
  122535. "mul r7, r6\n\t"
  122536. #endif
  122537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122538. "adds r3, r3, r7\n\t"
  122539. #else
  122540. "add r3, r3, r7\n\t"
  122541. #endif
  122542. #ifdef WOLFSSL_KEIL
  122543. "adcs r4, r4, %[r]\n\t"
  122544. #elif defined(__clang__)
  122545. "adcs r4, %[r]\n\t"
  122546. #else
  122547. "adc r4, %[r]\n\t"
  122548. #endif
  122549. "uxth r7, %[b]\n\t"
  122550. #ifdef WOLFSSL_KEIL
  122551. "muls r6, r7, r6\n\t"
  122552. #elif defined(__clang__)
  122553. "muls r6, r7\n\t"
  122554. #else
  122555. "mul r6, r7\n\t"
  122556. #endif
  122557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122558. "lsrs r7, r6, #16\n\t"
  122559. #else
  122560. "lsr r7, r6, #16\n\t"
  122561. #endif
  122562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122563. "lsls r6, r6, #16\n\t"
  122564. #else
  122565. "lsl r6, r6, #16\n\t"
  122566. #endif
  122567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122568. "adds r5, r5, r6\n\t"
  122569. #else
  122570. "add r5, r5, r6\n\t"
  122571. #endif
  122572. #ifdef WOLFSSL_KEIL
  122573. "adcs r3, r3, r7\n\t"
  122574. #elif defined(__clang__)
  122575. "adcs r3, r7\n\t"
  122576. #else
  122577. "adc r3, r7\n\t"
  122578. #endif
  122579. #ifdef WOLFSSL_KEIL
  122580. "adcs r4, r4, %[r]\n\t"
  122581. #elif defined(__clang__)
  122582. "adcs r4, %[r]\n\t"
  122583. #else
  122584. "adc r4, %[r]\n\t"
  122585. #endif
  122586. "# A[1] * B[7]\n\t"
  122587. "mov %[a], r9\n\t"
  122588. "mov %[b], r10\n\t"
  122589. "ldr %[a], [%[a], #4]\n\t"
  122590. "ldr %[b], [%[b], #28]\n\t"
  122591. "uxth r6, %[a]\n\t"
  122592. "uxth r7, %[b]\n\t"
  122593. #ifdef WOLFSSL_KEIL
  122594. "muls r7, r6, r7\n\t"
  122595. #elif defined(__clang__)
  122596. "muls r7, r6\n\t"
  122597. #else
  122598. "mul r7, r6\n\t"
  122599. #endif
  122600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122601. "adds r5, r5, r7\n\t"
  122602. #else
  122603. "add r5, r5, r7\n\t"
  122604. #endif
  122605. #ifdef WOLFSSL_KEIL
  122606. "adcs r3, r3, %[r]\n\t"
  122607. #elif defined(__clang__)
  122608. "adcs r3, %[r]\n\t"
  122609. #else
  122610. "adc r3, %[r]\n\t"
  122611. #endif
  122612. #ifdef WOLFSSL_KEIL
  122613. "adcs r4, r4, %[r]\n\t"
  122614. #elif defined(__clang__)
  122615. "adcs r4, %[r]\n\t"
  122616. #else
  122617. "adc r4, %[r]\n\t"
  122618. #endif
  122619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122620. "lsrs r7, %[b], #16\n\t"
  122621. #else
  122622. "lsr r7, %[b], #16\n\t"
  122623. #endif
  122624. #ifdef WOLFSSL_KEIL
  122625. "muls r6, r7, r6\n\t"
  122626. #elif defined(__clang__)
  122627. "muls r6, r7\n\t"
  122628. #else
  122629. "mul r6, r7\n\t"
  122630. #endif
  122631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122632. "lsrs r7, r6, #16\n\t"
  122633. #else
  122634. "lsr r7, r6, #16\n\t"
  122635. #endif
  122636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122637. "lsls r6, r6, #16\n\t"
  122638. #else
  122639. "lsl r6, r6, #16\n\t"
  122640. #endif
  122641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122642. "adds r5, r5, r6\n\t"
  122643. #else
  122644. "add r5, r5, r6\n\t"
  122645. #endif
  122646. #ifdef WOLFSSL_KEIL
  122647. "adcs r3, r3, r7\n\t"
  122648. #elif defined(__clang__)
  122649. "adcs r3, r7\n\t"
  122650. #else
  122651. "adc r3, r7\n\t"
  122652. #endif
  122653. #ifdef WOLFSSL_KEIL
  122654. "adcs r4, r4, %[r]\n\t"
  122655. #elif defined(__clang__)
  122656. "adcs r4, %[r]\n\t"
  122657. #else
  122658. "adc r4, %[r]\n\t"
  122659. #endif
  122660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122661. "lsrs r6, %[a], #16\n\t"
  122662. #else
  122663. "lsr r6, %[a], #16\n\t"
  122664. #endif
  122665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122666. "lsrs r7, %[b], #16\n\t"
  122667. #else
  122668. "lsr r7, %[b], #16\n\t"
  122669. #endif
  122670. #ifdef WOLFSSL_KEIL
  122671. "muls r7, r6, r7\n\t"
  122672. #elif defined(__clang__)
  122673. "muls r7, r6\n\t"
  122674. #else
  122675. "mul r7, r6\n\t"
  122676. #endif
  122677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122678. "adds r3, r3, r7\n\t"
  122679. #else
  122680. "add r3, r3, r7\n\t"
  122681. #endif
  122682. #ifdef WOLFSSL_KEIL
  122683. "adcs r4, r4, %[r]\n\t"
  122684. #elif defined(__clang__)
  122685. "adcs r4, %[r]\n\t"
  122686. #else
  122687. "adc r4, %[r]\n\t"
  122688. #endif
  122689. "uxth r7, %[b]\n\t"
  122690. #ifdef WOLFSSL_KEIL
  122691. "muls r6, r7, r6\n\t"
  122692. #elif defined(__clang__)
  122693. "muls r6, r7\n\t"
  122694. #else
  122695. "mul r6, r7\n\t"
  122696. #endif
  122697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122698. "lsrs r7, r6, #16\n\t"
  122699. #else
  122700. "lsr r7, r6, #16\n\t"
  122701. #endif
  122702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122703. "lsls r6, r6, #16\n\t"
  122704. #else
  122705. "lsl r6, r6, #16\n\t"
  122706. #endif
  122707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122708. "adds r5, r5, r6\n\t"
  122709. #else
  122710. "add r5, r5, r6\n\t"
  122711. #endif
  122712. #ifdef WOLFSSL_KEIL
  122713. "adcs r3, r3, r7\n\t"
  122714. #elif defined(__clang__)
  122715. "adcs r3, r7\n\t"
  122716. #else
  122717. "adc r3, r7\n\t"
  122718. #endif
  122719. #ifdef WOLFSSL_KEIL
  122720. "adcs r4, r4, %[r]\n\t"
  122721. #elif defined(__clang__)
  122722. "adcs r4, %[r]\n\t"
  122723. #else
  122724. "adc r4, %[r]\n\t"
  122725. #endif
  122726. "# A[0] * B[8]\n\t"
  122727. "mov %[a], r9\n\t"
  122728. "mov %[b], r10\n\t"
  122729. "ldr %[a], [%[a]]\n\t"
  122730. "ldr %[b], [%[b], #32]\n\t"
  122731. "uxth r6, %[a]\n\t"
  122732. "uxth r7, %[b]\n\t"
  122733. #ifdef WOLFSSL_KEIL
  122734. "muls r7, r6, r7\n\t"
  122735. #elif defined(__clang__)
  122736. "muls r7, r6\n\t"
  122737. #else
  122738. "mul r7, r6\n\t"
  122739. #endif
  122740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122741. "adds r5, r5, r7\n\t"
  122742. #else
  122743. "add r5, r5, r7\n\t"
  122744. #endif
  122745. #ifdef WOLFSSL_KEIL
  122746. "adcs r3, r3, %[r]\n\t"
  122747. #elif defined(__clang__)
  122748. "adcs r3, %[r]\n\t"
  122749. #else
  122750. "adc r3, %[r]\n\t"
  122751. #endif
  122752. #ifdef WOLFSSL_KEIL
  122753. "adcs r4, r4, %[r]\n\t"
  122754. #elif defined(__clang__)
  122755. "adcs r4, %[r]\n\t"
  122756. #else
  122757. "adc r4, %[r]\n\t"
  122758. #endif
  122759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122760. "lsrs r7, %[b], #16\n\t"
  122761. #else
  122762. "lsr r7, %[b], #16\n\t"
  122763. #endif
  122764. #ifdef WOLFSSL_KEIL
  122765. "muls r6, r7, r6\n\t"
  122766. #elif defined(__clang__)
  122767. "muls r6, r7\n\t"
  122768. #else
  122769. "mul r6, r7\n\t"
  122770. #endif
  122771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122772. "lsrs r7, r6, #16\n\t"
  122773. #else
  122774. "lsr r7, r6, #16\n\t"
  122775. #endif
  122776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122777. "lsls r6, r6, #16\n\t"
  122778. #else
  122779. "lsl r6, r6, #16\n\t"
  122780. #endif
  122781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122782. "adds r5, r5, r6\n\t"
  122783. #else
  122784. "add r5, r5, r6\n\t"
  122785. #endif
  122786. #ifdef WOLFSSL_KEIL
  122787. "adcs r3, r3, r7\n\t"
  122788. #elif defined(__clang__)
  122789. "adcs r3, r7\n\t"
  122790. #else
  122791. "adc r3, r7\n\t"
  122792. #endif
  122793. #ifdef WOLFSSL_KEIL
  122794. "adcs r4, r4, %[r]\n\t"
  122795. #elif defined(__clang__)
  122796. "adcs r4, %[r]\n\t"
  122797. #else
  122798. "adc r4, %[r]\n\t"
  122799. #endif
  122800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122801. "lsrs r6, %[a], #16\n\t"
  122802. #else
  122803. "lsr r6, %[a], #16\n\t"
  122804. #endif
  122805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122806. "lsrs r7, %[b], #16\n\t"
  122807. #else
  122808. "lsr r7, %[b], #16\n\t"
  122809. #endif
  122810. #ifdef WOLFSSL_KEIL
  122811. "muls r7, r6, r7\n\t"
  122812. #elif defined(__clang__)
  122813. "muls r7, r6\n\t"
  122814. #else
  122815. "mul r7, r6\n\t"
  122816. #endif
  122817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122818. "adds r3, r3, r7\n\t"
  122819. #else
  122820. "add r3, r3, r7\n\t"
  122821. #endif
  122822. #ifdef WOLFSSL_KEIL
  122823. "adcs r4, r4, %[r]\n\t"
  122824. #elif defined(__clang__)
  122825. "adcs r4, %[r]\n\t"
  122826. #else
  122827. "adc r4, %[r]\n\t"
  122828. #endif
  122829. "uxth r7, %[b]\n\t"
  122830. #ifdef WOLFSSL_KEIL
  122831. "muls r6, r7, r6\n\t"
  122832. #elif defined(__clang__)
  122833. "muls r6, r7\n\t"
  122834. #else
  122835. "mul r6, r7\n\t"
  122836. #endif
  122837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122838. "lsrs r7, r6, #16\n\t"
  122839. #else
  122840. "lsr r7, r6, #16\n\t"
  122841. #endif
  122842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122843. "lsls r6, r6, #16\n\t"
  122844. #else
  122845. "lsl r6, r6, #16\n\t"
  122846. #endif
  122847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122848. "adds r5, r5, r6\n\t"
  122849. #else
  122850. "add r5, r5, r6\n\t"
  122851. #endif
  122852. #ifdef WOLFSSL_KEIL
  122853. "adcs r3, r3, r7\n\t"
  122854. #elif defined(__clang__)
  122855. "adcs r3, r7\n\t"
  122856. #else
  122857. "adc r3, r7\n\t"
  122858. #endif
  122859. #ifdef WOLFSSL_KEIL
  122860. "adcs r4, r4, %[r]\n\t"
  122861. #elif defined(__clang__)
  122862. "adcs r4, %[r]\n\t"
  122863. #else
  122864. "adc r4, %[r]\n\t"
  122865. #endif
  122866. "str r5, [sp, #32]\n\t"
  122867. "# A[0] * B[9]\n\t"
  122868. "movs r5, #0\n\t"
  122869. "mov %[a], r9\n\t"
  122870. "mov %[b], r10\n\t"
  122871. "ldr %[a], [%[a]]\n\t"
  122872. "ldr %[b], [%[b], #36]\n\t"
  122873. "uxth r6, %[a]\n\t"
  122874. "uxth r7, %[b]\n\t"
  122875. #ifdef WOLFSSL_KEIL
  122876. "muls r7, r6, r7\n\t"
  122877. #elif defined(__clang__)
  122878. "muls r7, r6\n\t"
  122879. #else
  122880. "mul r7, r6\n\t"
  122881. #endif
  122882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122883. "adds r3, r3, r7\n\t"
  122884. #else
  122885. "add r3, r3, r7\n\t"
  122886. #endif
  122887. #ifdef WOLFSSL_KEIL
  122888. "adcs r4, r4, %[r]\n\t"
  122889. #elif defined(__clang__)
  122890. "adcs r4, %[r]\n\t"
  122891. #else
  122892. "adc r4, %[r]\n\t"
  122893. #endif
  122894. #ifdef WOLFSSL_KEIL
  122895. "adcs r5, r5, %[r]\n\t"
  122896. #elif defined(__clang__)
  122897. "adcs r5, %[r]\n\t"
  122898. #else
  122899. "adc r5, %[r]\n\t"
  122900. #endif
  122901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122902. "lsrs r7, %[b], #16\n\t"
  122903. #else
  122904. "lsr r7, %[b], #16\n\t"
  122905. #endif
  122906. #ifdef WOLFSSL_KEIL
  122907. "muls r6, r7, r6\n\t"
  122908. #elif defined(__clang__)
  122909. "muls r6, r7\n\t"
  122910. #else
  122911. "mul r6, r7\n\t"
  122912. #endif
  122913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122914. "lsrs r7, r6, #16\n\t"
  122915. #else
  122916. "lsr r7, r6, #16\n\t"
  122917. #endif
  122918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122919. "lsls r6, r6, #16\n\t"
  122920. #else
  122921. "lsl r6, r6, #16\n\t"
  122922. #endif
  122923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122924. "adds r3, r3, r6\n\t"
  122925. #else
  122926. "add r3, r3, r6\n\t"
  122927. #endif
  122928. #ifdef WOLFSSL_KEIL
  122929. "adcs r4, r4, r7\n\t"
  122930. #elif defined(__clang__)
  122931. "adcs r4, r7\n\t"
  122932. #else
  122933. "adc r4, r7\n\t"
  122934. #endif
  122935. #ifdef WOLFSSL_KEIL
  122936. "adcs r5, r5, %[r]\n\t"
  122937. #elif defined(__clang__)
  122938. "adcs r5, %[r]\n\t"
  122939. #else
  122940. "adc r5, %[r]\n\t"
  122941. #endif
  122942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122943. "lsrs r6, %[a], #16\n\t"
  122944. #else
  122945. "lsr r6, %[a], #16\n\t"
  122946. #endif
  122947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122948. "lsrs r7, %[b], #16\n\t"
  122949. #else
  122950. "lsr r7, %[b], #16\n\t"
  122951. #endif
  122952. #ifdef WOLFSSL_KEIL
  122953. "muls r7, r6, r7\n\t"
  122954. #elif defined(__clang__)
  122955. "muls r7, r6\n\t"
  122956. #else
  122957. "mul r7, r6\n\t"
  122958. #endif
  122959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122960. "adds r4, r4, r7\n\t"
  122961. #else
  122962. "add r4, r4, r7\n\t"
  122963. #endif
  122964. #ifdef WOLFSSL_KEIL
  122965. "adcs r5, r5, %[r]\n\t"
  122966. #elif defined(__clang__)
  122967. "adcs r5, %[r]\n\t"
  122968. #else
  122969. "adc r5, %[r]\n\t"
  122970. #endif
  122971. "uxth r7, %[b]\n\t"
  122972. #ifdef WOLFSSL_KEIL
  122973. "muls r6, r7, r6\n\t"
  122974. #elif defined(__clang__)
  122975. "muls r6, r7\n\t"
  122976. #else
  122977. "mul r6, r7\n\t"
  122978. #endif
  122979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122980. "lsrs r7, r6, #16\n\t"
  122981. #else
  122982. "lsr r7, r6, #16\n\t"
  122983. #endif
  122984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122985. "lsls r6, r6, #16\n\t"
  122986. #else
  122987. "lsl r6, r6, #16\n\t"
  122988. #endif
  122989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122990. "adds r3, r3, r6\n\t"
  122991. #else
  122992. "add r3, r3, r6\n\t"
  122993. #endif
  122994. #ifdef WOLFSSL_KEIL
  122995. "adcs r4, r4, r7\n\t"
  122996. #elif defined(__clang__)
  122997. "adcs r4, r7\n\t"
  122998. #else
  122999. "adc r4, r7\n\t"
  123000. #endif
  123001. #ifdef WOLFSSL_KEIL
  123002. "adcs r5, r5, %[r]\n\t"
  123003. #elif defined(__clang__)
  123004. "adcs r5, %[r]\n\t"
  123005. #else
  123006. "adc r5, %[r]\n\t"
  123007. #endif
  123008. "# A[1] * B[8]\n\t"
  123009. "mov %[a], r9\n\t"
  123010. "mov %[b], r10\n\t"
  123011. "ldr %[a], [%[a], #4]\n\t"
  123012. "ldr %[b], [%[b], #32]\n\t"
  123013. "uxth r6, %[a]\n\t"
  123014. "uxth r7, %[b]\n\t"
  123015. #ifdef WOLFSSL_KEIL
  123016. "muls r7, r6, r7\n\t"
  123017. #elif defined(__clang__)
  123018. "muls r7, r6\n\t"
  123019. #else
  123020. "mul r7, r6\n\t"
  123021. #endif
  123022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123023. "adds r3, r3, r7\n\t"
  123024. #else
  123025. "add r3, r3, r7\n\t"
  123026. #endif
  123027. #ifdef WOLFSSL_KEIL
  123028. "adcs r4, r4, %[r]\n\t"
  123029. #elif defined(__clang__)
  123030. "adcs r4, %[r]\n\t"
  123031. #else
  123032. "adc r4, %[r]\n\t"
  123033. #endif
  123034. #ifdef WOLFSSL_KEIL
  123035. "adcs r5, r5, %[r]\n\t"
  123036. #elif defined(__clang__)
  123037. "adcs r5, %[r]\n\t"
  123038. #else
  123039. "adc r5, %[r]\n\t"
  123040. #endif
  123041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123042. "lsrs r7, %[b], #16\n\t"
  123043. #else
  123044. "lsr r7, %[b], #16\n\t"
  123045. #endif
  123046. #ifdef WOLFSSL_KEIL
  123047. "muls r6, r7, r6\n\t"
  123048. #elif defined(__clang__)
  123049. "muls r6, r7\n\t"
  123050. #else
  123051. "mul r6, r7\n\t"
  123052. #endif
  123053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123054. "lsrs r7, r6, #16\n\t"
  123055. #else
  123056. "lsr r7, r6, #16\n\t"
  123057. #endif
  123058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123059. "lsls r6, r6, #16\n\t"
  123060. #else
  123061. "lsl r6, r6, #16\n\t"
  123062. #endif
  123063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123064. "adds r3, r3, r6\n\t"
  123065. #else
  123066. "add r3, r3, r6\n\t"
  123067. #endif
  123068. #ifdef WOLFSSL_KEIL
  123069. "adcs r4, r4, r7\n\t"
  123070. #elif defined(__clang__)
  123071. "adcs r4, r7\n\t"
  123072. #else
  123073. "adc r4, r7\n\t"
  123074. #endif
  123075. #ifdef WOLFSSL_KEIL
  123076. "adcs r5, r5, %[r]\n\t"
  123077. #elif defined(__clang__)
  123078. "adcs r5, %[r]\n\t"
  123079. #else
  123080. "adc r5, %[r]\n\t"
  123081. #endif
  123082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123083. "lsrs r6, %[a], #16\n\t"
  123084. #else
  123085. "lsr r6, %[a], #16\n\t"
  123086. #endif
  123087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123088. "lsrs r7, %[b], #16\n\t"
  123089. #else
  123090. "lsr r7, %[b], #16\n\t"
  123091. #endif
  123092. #ifdef WOLFSSL_KEIL
  123093. "muls r7, r6, r7\n\t"
  123094. #elif defined(__clang__)
  123095. "muls r7, r6\n\t"
  123096. #else
  123097. "mul r7, r6\n\t"
  123098. #endif
  123099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123100. "adds r4, r4, r7\n\t"
  123101. #else
  123102. "add r4, r4, r7\n\t"
  123103. #endif
  123104. #ifdef WOLFSSL_KEIL
  123105. "adcs r5, r5, %[r]\n\t"
  123106. #elif defined(__clang__)
  123107. "adcs r5, %[r]\n\t"
  123108. #else
  123109. "adc r5, %[r]\n\t"
  123110. #endif
  123111. "uxth r7, %[b]\n\t"
  123112. #ifdef WOLFSSL_KEIL
  123113. "muls r6, r7, r6\n\t"
  123114. #elif defined(__clang__)
  123115. "muls r6, r7\n\t"
  123116. #else
  123117. "mul r6, r7\n\t"
  123118. #endif
  123119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123120. "lsrs r7, r6, #16\n\t"
  123121. #else
  123122. "lsr r7, r6, #16\n\t"
  123123. #endif
  123124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123125. "lsls r6, r6, #16\n\t"
  123126. #else
  123127. "lsl r6, r6, #16\n\t"
  123128. #endif
  123129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123130. "adds r3, r3, r6\n\t"
  123131. #else
  123132. "add r3, r3, r6\n\t"
  123133. #endif
  123134. #ifdef WOLFSSL_KEIL
  123135. "adcs r4, r4, r7\n\t"
  123136. #elif defined(__clang__)
  123137. "adcs r4, r7\n\t"
  123138. #else
  123139. "adc r4, r7\n\t"
  123140. #endif
  123141. #ifdef WOLFSSL_KEIL
  123142. "adcs r5, r5, %[r]\n\t"
  123143. #elif defined(__clang__)
  123144. "adcs r5, %[r]\n\t"
  123145. #else
  123146. "adc r5, %[r]\n\t"
  123147. #endif
  123148. "# A[2] * B[7]\n\t"
  123149. "mov %[a], r9\n\t"
  123150. "mov %[b], r10\n\t"
  123151. "ldr %[a], [%[a], #8]\n\t"
  123152. "ldr %[b], [%[b], #28]\n\t"
  123153. "uxth r6, %[a]\n\t"
  123154. "uxth r7, %[b]\n\t"
  123155. #ifdef WOLFSSL_KEIL
  123156. "muls r7, r6, r7\n\t"
  123157. #elif defined(__clang__)
  123158. "muls r7, r6\n\t"
  123159. #else
  123160. "mul r7, r6\n\t"
  123161. #endif
  123162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123163. "adds r3, r3, r7\n\t"
  123164. #else
  123165. "add r3, r3, r7\n\t"
  123166. #endif
  123167. #ifdef WOLFSSL_KEIL
  123168. "adcs r4, r4, %[r]\n\t"
  123169. #elif defined(__clang__)
  123170. "adcs r4, %[r]\n\t"
  123171. #else
  123172. "adc r4, %[r]\n\t"
  123173. #endif
  123174. #ifdef WOLFSSL_KEIL
  123175. "adcs r5, r5, %[r]\n\t"
  123176. #elif defined(__clang__)
  123177. "adcs r5, %[r]\n\t"
  123178. #else
  123179. "adc r5, %[r]\n\t"
  123180. #endif
  123181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123182. "lsrs r7, %[b], #16\n\t"
  123183. #else
  123184. "lsr r7, %[b], #16\n\t"
  123185. #endif
  123186. #ifdef WOLFSSL_KEIL
  123187. "muls r6, r7, r6\n\t"
  123188. #elif defined(__clang__)
  123189. "muls r6, r7\n\t"
  123190. #else
  123191. "mul r6, r7\n\t"
  123192. #endif
  123193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123194. "lsrs r7, r6, #16\n\t"
  123195. #else
  123196. "lsr r7, r6, #16\n\t"
  123197. #endif
  123198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123199. "lsls r6, r6, #16\n\t"
  123200. #else
  123201. "lsl r6, r6, #16\n\t"
  123202. #endif
  123203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123204. "adds r3, r3, r6\n\t"
  123205. #else
  123206. "add r3, r3, r6\n\t"
  123207. #endif
  123208. #ifdef WOLFSSL_KEIL
  123209. "adcs r4, r4, r7\n\t"
  123210. #elif defined(__clang__)
  123211. "adcs r4, r7\n\t"
  123212. #else
  123213. "adc r4, r7\n\t"
  123214. #endif
  123215. #ifdef WOLFSSL_KEIL
  123216. "adcs r5, r5, %[r]\n\t"
  123217. #elif defined(__clang__)
  123218. "adcs r5, %[r]\n\t"
  123219. #else
  123220. "adc r5, %[r]\n\t"
  123221. #endif
  123222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123223. "lsrs r6, %[a], #16\n\t"
  123224. #else
  123225. "lsr r6, %[a], #16\n\t"
  123226. #endif
  123227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123228. "lsrs r7, %[b], #16\n\t"
  123229. #else
  123230. "lsr r7, %[b], #16\n\t"
  123231. #endif
  123232. #ifdef WOLFSSL_KEIL
  123233. "muls r7, r6, r7\n\t"
  123234. #elif defined(__clang__)
  123235. "muls r7, r6\n\t"
  123236. #else
  123237. "mul r7, r6\n\t"
  123238. #endif
  123239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123240. "adds r4, r4, r7\n\t"
  123241. #else
  123242. "add r4, r4, r7\n\t"
  123243. #endif
  123244. #ifdef WOLFSSL_KEIL
  123245. "adcs r5, r5, %[r]\n\t"
  123246. #elif defined(__clang__)
  123247. "adcs r5, %[r]\n\t"
  123248. #else
  123249. "adc r5, %[r]\n\t"
  123250. #endif
  123251. "uxth r7, %[b]\n\t"
  123252. #ifdef WOLFSSL_KEIL
  123253. "muls r6, r7, r6\n\t"
  123254. #elif defined(__clang__)
  123255. "muls r6, r7\n\t"
  123256. #else
  123257. "mul r6, r7\n\t"
  123258. #endif
  123259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123260. "lsrs r7, r6, #16\n\t"
  123261. #else
  123262. "lsr r7, r6, #16\n\t"
  123263. #endif
  123264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123265. "lsls r6, r6, #16\n\t"
  123266. #else
  123267. "lsl r6, r6, #16\n\t"
  123268. #endif
  123269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123270. "adds r3, r3, r6\n\t"
  123271. #else
  123272. "add r3, r3, r6\n\t"
  123273. #endif
  123274. #ifdef WOLFSSL_KEIL
  123275. "adcs r4, r4, r7\n\t"
  123276. #elif defined(__clang__)
  123277. "adcs r4, r7\n\t"
  123278. #else
  123279. "adc r4, r7\n\t"
  123280. #endif
  123281. #ifdef WOLFSSL_KEIL
  123282. "adcs r5, r5, %[r]\n\t"
  123283. #elif defined(__clang__)
  123284. "adcs r5, %[r]\n\t"
  123285. #else
  123286. "adc r5, %[r]\n\t"
  123287. #endif
  123288. "# A[3] * B[6]\n\t"
  123289. "mov %[a], r9\n\t"
  123290. "mov %[b], r10\n\t"
  123291. "ldr %[a], [%[a], #12]\n\t"
  123292. "ldr %[b], [%[b], #24]\n\t"
  123293. "uxth r6, %[a]\n\t"
  123294. "uxth r7, %[b]\n\t"
  123295. #ifdef WOLFSSL_KEIL
  123296. "muls r7, r6, r7\n\t"
  123297. #elif defined(__clang__)
  123298. "muls r7, r6\n\t"
  123299. #else
  123300. "mul r7, r6\n\t"
  123301. #endif
  123302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123303. "adds r3, r3, r7\n\t"
  123304. #else
  123305. "add r3, r3, r7\n\t"
  123306. #endif
  123307. #ifdef WOLFSSL_KEIL
  123308. "adcs r4, r4, %[r]\n\t"
  123309. #elif defined(__clang__)
  123310. "adcs r4, %[r]\n\t"
  123311. #else
  123312. "adc r4, %[r]\n\t"
  123313. #endif
  123314. #ifdef WOLFSSL_KEIL
  123315. "adcs r5, r5, %[r]\n\t"
  123316. #elif defined(__clang__)
  123317. "adcs r5, %[r]\n\t"
  123318. #else
  123319. "adc r5, %[r]\n\t"
  123320. #endif
  123321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123322. "lsrs r7, %[b], #16\n\t"
  123323. #else
  123324. "lsr r7, %[b], #16\n\t"
  123325. #endif
  123326. #ifdef WOLFSSL_KEIL
  123327. "muls r6, r7, r6\n\t"
  123328. #elif defined(__clang__)
  123329. "muls r6, r7\n\t"
  123330. #else
  123331. "mul r6, r7\n\t"
  123332. #endif
  123333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123334. "lsrs r7, r6, #16\n\t"
  123335. #else
  123336. "lsr r7, r6, #16\n\t"
  123337. #endif
  123338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123339. "lsls r6, r6, #16\n\t"
  123340. #else
  123341. "lsl r6, r6, #16\n\t"
  123342. #endif
  123343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123344. "adds r3, r3, r6\n\t"
  123345. #else
  123346. "add r3, r3, r6\n\t"
  123347. #endif
  123348. #ifdef WOLFSSL_KEIL
  123349. "adcs r4, r4, r7\n\t"
  123350. #elif defined(__clang__)
  123351. "adcs r4, r7\n\t"
  123352. #else
  123353. "adc r4, r7\n\t"
  123354. #endif
  123355. #ifdef WOLFSSL_KEIL
  123356. "adcs r5, r5, %[r]\n\t"
  123357. #elif defined(__clang__)
  123358. "adcs r5, %[r]\n\t"
  123359. #else
  123360. "adc r5, %[r]\n\t"
  123361. #endif
  123362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123363. "lsrs r6, %[a], #16\n\t"
  123364. #else
  123365. "lsr r6, %[a], #16\n\t"
  123366. #endif
  123367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123368. "lsrs r7, %[b], #16\n\t"
  123369. #else
  123370. "lsr r7, %[b], #16\n\t"
  123371. #endif
  123372. #ifdef WOLFSSL_KEIL
  123373. "muls r7, r6, r7\n\t"
  123374. #elif defined(__clang__)
  123375. "muls r7, r6\n\t"
  123376. #else
  123377. "mul r7, r6\n\t"
  123378. #endif
  123379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123380. "adds r4, r4, r7\n\t"
  123381. #else
  123382. "add r4, r4, r7\n\t"
  123383. #endif
  123384. #ifdef WOLFSSL_KEIL
  123385. "adcs r5, r5, %[r]\n\t"
  123386. #elif defined(__clang__)
  123387. "adcs r5, %[r]\n\t"
  123388. #else
  123389. "adc r5, %[r]\n\t"
  123390. #endif
  123391. "uxth r7, %[b]\n\t"
  123392. #ifdef WOLFSSL_KEIL
  123393. "muls r6, r7, r6\n\t"
  123394. #elif defined(__clang__)
  123395. "muls r6, r7\n\t"
  123396. #else
  123397. "mul r6, r7\n\t"
  123398. #endif
  123399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123400. "lsrs r7, r6, #16\n\t"
  123401. #else
  123402. "lsr r7, r6, #16\n\t"
  123403. #endif
  123404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123405. "lsls r6, r6, #16\n\t"
  123406. #else
  123407. "lsl r6, r6, #16\n\t"
  123408. #endif
  123409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123410. "adds r3, r3, r6\n\t"
  123411. #else
  123412. "add r3, r3, r6\n\t"
  123413. #endif
  123414. #ifdef WOLFSSL_KEIL
  123415. "adcs r4, r4, r7\n\t"
  123416. #elif defined(__clang__)
  123417. "adcs r4, r7\n\t"
  123418. #else
  123419. "adc r4, r7\n\t"
  123420. #endif
  123421. #ifdef WOLFSSL_KEIL
  123422. "adcs r5, r5, %[r]\n\t"
  123423. #elif defined(__clang__)
  123424. "adcs r5, %[r]\n\t"
  123425. #else
  123426. "adc r5, %[r]\n\t"
  123427. #endif
  123428. "# A[4] * B[5]\n\t"
  123429. "mov %[a], r9\n\t"
  123430. "mov %[b], r10\n\t"
  123431. "ldr %[a], [%[a], #16]\n\t"
  123432. "ldr %[b], [%[b], #20]\n\t"
  123433. "uxth r6, %[a]\n\t"
  123434. "uxth r7, %[b]\n\t"
  123435. #ifdef WOLFSSL_KEIL
  123436. "muls r7, r6, r7\n\t"
  123437. #elif defined(__clang__)
  123438. "muls r7, r6\n\t"
  123439. #else
  123440. "mul r7, r6\n\t"
  123441. #endif
  123442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123443. "adds r3, r3, r7\n\t"
  123444. #else
  123445. "add r3, r3, r7\n\t"
  123446. #endif
  123447. #ifdef WOLFSSL_KEIL
  123448. "adcs r4, r4, %[r]\n\t"
  123449. #elif defined(__clang__)
  123450. "adcs r4, %[r]\n\t"
  123451. #else
  123452. "adc r4, %[r]\n\t"
  123453. #endif
  123454. #ifdef WOLFSSL_KEIL
  123455. "adcs r5, r5, %[r]\n\t"
  123456. #elif defined(__clang__)
  123457. "adcs r5, %[r]\n\t"
  123458. #else
  123459. "adc r5, %[r]\n\t"
  123460. #endif
  123461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123462. "lsrs r7, %[b], #16\n\t"
  123463. #else
  123464. "lsr r7, %[b], #16\n\t"
  123465. #endif
  123466. #ifdef WOLFSSL_KEIL
  123467. "muls r6, r7, r6\n\t"
  123468. #elif defined(__clang__)
  123469. "muls r6, r7\n\t"
  123470. #else
  123471. "mul r6, r7\n\t"
  123472. #endif
  123473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123474. "lsrs r7, r6, #16\n\t"
  123475. #else
  123476. "lsr r7, r6, #16\n\t"
  123477. #endif
  123478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123479. "lsls r6, r6, #16\n\t"
  123480. #else
  123481. "lsl r6, r6, #16\n\t"
  123482. #endif
  123483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123484. "adds r3, r3, r6\n\t"
  123485. #else
  123486. "add r3, r3, r6\n\t"
  123487. #endif
  123488. #ifdef WOLFSSL_KEIL
  123489. "adcs r4, r4, r7\n\t"
  123490. #elif defined(__clang__)
  123491. "adcs r4, r7\n\t"
  123492. #else
  123493. "adc r4, r7\n\t"
  123494. #endif
  123495. #ifdef WOLFSSL_KEIL
  123496. "adcs r5, r5, %[r]\n\t"
  123497. #elif defined(__clang__)
  123498. "adcs r5, %[r]\n\t"
  123499. #else
  123500. "adc r5, %[r]\n\t"
  123501. #endif
  123502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123503. "lsrs r6, %[a], #16\n\t"
  123504. #else
  123505. "lsr r6, %[a], #16\n\t"
  123506. #endif
  123507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123508. "lsrs r7, %[b], #16\n\t"
  123509. #else
  123510. "lsr r7, %[b], #16\n\t"
  123511. #endif
  123512. #ifdef WOLFSSL_KEIL
  123513. "muls r7, r6, r7\n\t"
  123514. #elif defined(__clang__)
  123515. "muls r7, r6\n\t"
  123516. #else
  123517. "mul r7, r6\n\t"
  123518. #endif
  123519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123520. "adds r4, r4, r7\n\t"
  123521. #else
  123522. "add r4, r4, r7\n\t"
  123523. #endif
  123524. #ifdef WOLFSSL_KEIL
  123525. "adcs r5, r5, %[r]\n\t"
  123526. #elif defined(__clang__)
  123527. "adcs r5, %[r]\n\t"
  123528. #else
  123529. "adc r5, %[r]\n\t"
  123530. #endif
  123531. "uxth r7, %[b]\n\t"
  123532. #ifdef WOLFSSL_KEIL
  123533. "muls r6, r7, r6\n\t"
  123534. #elif defined(__clang__)
  123535. "muls r6, r7\n\t"
  123536. #else
  123537. "mul r6, r7\n\t"
  123538. #endif
  123539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123540. "lsrs r7, r6, #16\n\t"
  123541. #else
  123542. "lsr r7, r6, #16\n\t"
  123543. #endif
  123544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123545. "lsls r6, r6, #16\n\t"
  123546. #else
  123547. "lsl r6, r6, #16\n\t"
  123548. #endif
  123549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123550. "adds r3, r3, r6\n\t"
  123551. #else
  123552. "add r3, r3, r6\n\t"
  123553. #endif
  123554. #ifdef WOLFSSL_KEIL
  123555. "adcs r4, r4, r7\n\t"
  123556. #elif defined(__clang__)
  123557. "adcs r4, r7\n\t"
  123558. #else
  123559. "adc r4, r7\n\t"
  123560. #endif
  123561. #ifdef WOLFSSL_KEIL
  123562. "adcs r5, r5, %[r]\n\t"
  123563. #elif defined(__clang__)
  123564. "adcs r5, %[r]\n\t"
  123565. #else
  123566. "adc r5, %[r]\n\t"
  123567. #endif
  123568. "# A[5] * B[4]\n\t"
  123569. "mov %[a], r9\n\t"
  123570. "mov %[b], r10\n\t"
  123571. "ldr %[a], [%[a], #20]\n\t"
  123572. "ldr %[b], [%[b], #16]\n\t"
  123573. "uxth r6, %[a]\n\t"
  123574. "uxth r7, %[b]\n\t"
  123575. #ifdef WOLFSSL_KEIL
  123576. "muls r7, r6, r7\n\t"
  123577. #elif defined(__clang__)
  123578. "muls r7, r6\n\t"
  123579. #else
  123580. "mul r7, r6\n\t"
  123581. #endif
  123582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123583. "adds r3, r3, r7\n\t"
  123584. #else
  123585. "add r3, r3, r7\n\t"
  123586. #endif
  123587. #ifdef WOLFSSL_KEIL
  123588. "adcs r4, r4, %[r]\n\t"
  123589. #elif defined(__clang__)
  123590. "adcs r4, %[r]\n\t"
  123591. #else
  123592. "adc r4, %[r]\n\t"
  123593. #endif
  123594. #ifdef WOLFSSL_KEIL
  123595. "adcs r5, r5, %[r]\n\t"
  123596. #elif defined(__clang__)
  123597. "adcs r5, %[r]\n\t"
  123598. #else
  123599. "adc r5, %[r]\n\t"
  123600. #endif
  123601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123602. "lsrs r7, %[b], #16\n\t"
  123603. #else
  123604. "lsr r7, %[b], #16\n\t"
  123605. #endif
  123606. #ifdef WOLFSSL_KEIL
  123607. "muls r6, r7, r6\n\t"
  123608. #elif defined(__clang__)
  123609. "muls r6, r7\n\t"
  123610. #else
  123611. "mul r6, r7\n\t"
  123612. #endif
  123613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123614. "lsrs r7, r6, #16\n\t"
  123615. #else
  123616. "lsr r7, r6, #16\n\t"
  123617. #endif
  123618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123619. "lsls r6, r6, #16\n\t"
  123620. #else
  123621. "lsl r6, r6, #16\n\t"
  123622. #endif
  123623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123624. "adds r3, r3, r6\n\t"
  123625. #else
  123626. "add r3, r3, r6\n\t"
  123627. #endif
  123628. #ifdef WOLFSSL_KEIL
  123629. "adcs r4, r4, r7\n\t"
  123630. #elif defined(__clang__)
  123631. "adcs r4, r7\n\t"
  123632. #else
  123633. "adc r4, r7\n\t"
  123634. #endif
  123635. #ifdef WOLFSSL_KEIL
  123636. "adcs r5, r5, %[r]\n\t"
  123637. #elif defined(__clang__)
  123638. "adcs r5, %[r]\n\t"
  123639. #else
  123640. "adc r5, %[r]\n\t"
  123641. #endif
  123642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123643. "lsrs r6, %[a], #16\n\t"
  123644. #else
  123645. "lsr r6, %[a], #16\n\t"
  123646. #endif
  123647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123648. "lsrs r7, %[b], #16\n\t"
  123649. #else
  123650. "lsr r7, %[b], #16\n\t"
  123651. #endif
  123652. #ifdef WOLFSSL_KEIL
  123653. "muls r7, r6, r7\n\t"
  123654. #elif defined(__clang__)
  123655. "muls r7, r6\n\t"
  123656. #else
  123657. "mul r7, r6\n\t"
  123658. #endif
  123659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123660. "adds r4, r4, r7\n\t"
  123661. #else
  123662. "add r4, r4, r7\n\t"
  123663. #endif
  123664. #ifdef WOLFSSL_KEIL
  123665. "adcs r5, r5, %[r]\n\t"
  123666. #elif defined(__clang__)
  123667. "adcs r5, %[r]\n\t"
  123668. #else
  123669. "adc r5, %[r]\n\t"
  123670. #endif
  123671. "uxth r7, %[b]\n\t"
  123672. #ifdef WOLFSSL_KEIL
  123673. "muls r6, r7, r6\n\t"
  123674. #elif defined(__clang__)
  123675. "muls r6, r7\n\t"
  123676. #else
  123677. "mul r6, r7\n\t"
  123678. #endif
  123679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123680. "lsrs r7, r6, #16\n\t"
  123681. #else
  123682. "lsr r7, r6, #16\n\t"
  123683. #endif
  123684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123685. "lsls r6, r6, #16\n\t"
  123686. #else
  123687. "lsl r6, r6, #16\n\t"
  123688. #endif
  123689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123690. "adds r3, r3, r6\n\t"
  123691. #else
  123692. "add r3, r3, r6\n\t"
  123693. #endif
  123694. #ifdef WOLFSSL_KEIL
  123695. "adcs r4, r4, r7\n\t"
  123696. #elif defined(__clang__)
  123697. "adcs r4, r7\n\t"
  123698. #else
  123699. "adc r4, r7\n\t"
  123700. #endif
  123701. #ifdef WOLFSSL_KEIL
  123702. "adcs r5, r5, %[r]\n\t"
  123703. #elif defined(__clang__)
  123704. "adcs r5, %[r]\n\t"
  123705. #else
  123706. "adc r5, %[r]\n\t"
  123707. #endif
  123708. "# A[6] * B[3]\n\t"
  123709. "mov %[a], r9\n\t"
  123710. "mov %[b], r10\n\t"
  123711. "ldr %[a], [%[a], #24]\n\t"
  123712. "ldr %[b], [%[b], #12]\n\t"
  123713. "uxth r6, %[a]\n\t"
  123714. "uxth r7, %[b]\n\t"
  123715. #ifdef WOLFSSL_KEIL
  123716. "muls r7, r6, r7\n\t"
  123717. #elif defined(__clang__)
  123718. "muls r7, r6\n\t"
  123719. #else
  123720. "mul r7, r6\n\t"
  123721. #endif
  123722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123723. "adds r3, r3, r7\n\t"
  123724. #else
  123725. "add r3, r3, r7\n\t"
  123726. #endif
  123727. #ifdef WOLFSSL_KEIL
  123728. "adcs r4, r4, %[r]\n\t"
  123729. #elif defined(__clang__)
  123730. "adcs r4, %[r]\n\t"
  123731. #else
  123732. "adc r4, %[r]\n\t"
  123733. #endif
  123734. #ifdef WOLFSSL_KEIL
  123735. "adcs r5, r5, %[r]\n\t"
  123736. #elif defined(__clang__)
  123737. "adcs r5, %[r]\n\t"
  123738. #else
  123739. "adc r5, %[r]\n\t"
  123740. #endif
  123741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123742. "lsrs r7, %[b], #16\n\t"
  123743. #else
  123744. "lsr r7, %[b], #16\n\t"
  123745. #endif
  123746. #ifdef WOLFSSL_KEIL
  123747. "muls r6, r7, r6\n\t"
  123748. #elif defined(__clang__)
  123749. "muls r6, r7\n\t"
  123750. #else
  123751. "mul r6, r7\n\t"
  123752. #endif
  123753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123754. "lsrs r7, r6, #16\n\t"
  123755. #else
  123756. "lsr r7, r6, #16\n\t"
  123757. #endif
  123758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123759. "lsls r6, r6, #16\n\t"
  123760. #else
  123761. "lsl r6, r6, #16\n\t"
  123762. #endif
  123763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123764. "adds r3, r3, r6\n\t"
  123765. #else
  123766. "add r3, r3, r6\n\t"
  123767. #endif
  123768. #ifdef WOLFSSL_KEIL
  123769. "adcs r4, r4, r7\n\t"
  123770. #elif defined(__clang__)
  123771. "adcs r4, r7\n\t"
  123772. #else
  123773. "adc r4, r7\n\t"
  123774. #endif
  123775. #ifdef WOLFSSL_KEIL
  123776. "adcs r5, r5, %[r]\n\t"
  123777. #elif defined(__clang__)
  123778. "adcs r5, %[r]\n\t"
  123779. #else
  123780. "adc r5, %[r]\n\t"
  123781. #endif
  123782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123783. "lsrs r6, %[a], #16\n\t"
  123784. #else
  123785. "lsr r6, %[a], #16\n\t"
  123786. #endif
  123787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123788. "lsrs r7, %[b], #16\n\t"
  123789. #else
  123790. "lsr r7, %[b], #16\n\t"
  123791. #endif
  123792. #ifdef WOLFSSL_KEIL
  123793. "muls r7, r6, r7\n\t"
  123794. #elif defined(__clang__)
  123795. "muls r7, r6\n\t"
  123796. #else
  123797. "mul r7, r6\n\t"
  123798. #endif
  123799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123800. "adds r4, r4, r7\n\t"
  123801. #else
  123802. "add r4, r4, r7\n\t"
  123803. #endif
  123804. #ifdef WOLFSSL_KEIL
  123805. "adcs r5, r5, %[r]\n\t"
  123806. #elif defined(__clang__)
  123807. "adcs r5, %[r]\n\t"
  123808. #else
  123809. "adc r5, %[r]\n\t"
  123810. #endif
  123811. "uxth r7, %[b]\n\t"
  123812. #ifdef WOLFSSL_KEIL
  123813. "muls r6, r7, r6\n\t"
  123814. #elif defined(__clang__)
  123815. "muls r6, r7\n\t"
  123816. #else
  123817. "mul r6, r7\n\t"
  123818. #endif
  123819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123820. "lsrs r7, r6, #16\n\t"
  123821. #else
  123822. "lsr r7, r6, #16\n\t"
  123823. #endif
  123824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123825. "lsls r6, r6, #16\n\t"
  123826. #else
  123827. "lsl r6, r6, #16\n\t"
  123828. #endif
  123829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123830. "adds r3, r3, r6\n\t"
  123831. #else
  123832. "add r3, r3, r6\n\t"
  123833. #endif
  123834. #ifdef WOLFSSL_KEIL
  123835. "adcs r4, r4, r7\n\t"
  123836. #elif defined(__clang__)
  123837. "adcs r4, r7\n\t"
  123838. #else
  123839. "adc r4, r7\n\t"
  123840. #endif
  123841. #ifdef WOLFSSL_KEIL
  123842. "adcs r5, r5, %[r]\n\t"
  123843. #elif defined(__clang__)
  123844. "adcs r5, %[r]\n\t"
  123845. #else
  123846. "adc r5, %[r]\n\t"
  123847. #endif
  123848. "# A[7] * B[2]\n\t"
  123849. "mov %[a], r9\n\t"
  123850. "mov %[b], r10\n\t"
  123851. "ldr %[a], [%[a], #28]\n\t"
  123852. "ldr %[b], [%[b], #8]\n\t"
  123853. "uxth r6, %[a]\n\t"
  123854. "uxth r7, %[b]\n\t"
  123855. #ifdef WOLFSSL_KEIL
  123856. "muls r7, r6, r7\n\t"
  123857. #elif defined(__clang__)
  123858. "muls r7, r6\n\t"
  123859. #else
  123860. "mul r7, r6\n\t"
  123861. #endif
  123862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123863. "adds r3, r3, r7\n\t"
  123864. #else
  123865. "add r3, r3, r7\n\t"
  123866. #endif
  123867. #ifdef WOLFSSL_KEIL
  123868. "adcs r4, r4, %[r]\n\t"
  123869. #elif defined(__clang__)
  123870. "adcs r4, %[r]\n\t"
  123871. #else
  123872. "adc r4, %[r]\n\t"
  123873. #endif
  123874. #ifdef WOLFSSL_KEIL
  123875. "adcs r5, r5, %[r]\n\t"
  123876. #elif defined(__clang__)
  123877. "adcs r5, %[r]\n\t"
  123878. #else
  123879. "adc r5, %[r]\n\t"
  123880. #endif
  123881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123882. "lsrs r7, %[b], #16\n\t"
  123883. #else
  123884. "lsr r7, %[b], #16\n\t"
  123885. #endif
  123886. #ifdef WOLFSSL_KEIL
  123887. "muls r6, r7, r6\n\t"
  123888. #elif defined(__clang__)
  123889. "muls r6, r7\n\t"
  123890. #else
  123891. "mul r6, r7\n\t"
  123892. #endif
  123893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123894. "lsrs r7, r6, #16\n\t"
  123895. #else
  123896. "lsr r7, r6, #16\n\t"
  123897. #endif
  123898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123899. "lsls r6, r6, #16\n\t"
  123900. #else
  123901. "lsl r6, r6, #16\n\t"
  123902. #endif
  123903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123904. "adds r3, r3, r6\n\t"
  123905. #else
  123906. "add r3, r3, r6\n\t"
  123907. #endif
  123908. #ifdef WOLFSSL_KEIL
  123909. "adcs r4, r4, r7\n\t"
  123910. #elif defined(__clang__)
  123911. "adcs r4, r7\n\t"
  123912. #else
  123913. "adc r4, r7\n\t"
  123914. #endif
  123915. #ifdef WOLFSSL_KEIL
  123916. "adcs r5, r5, %[r]\n\t"
  123917. #elif defined(__clang__)
  123918. "adcs r5, %[r]\n\t"
  123919. #else
  123920. "adc r5, %[r]\n\t"
  123921. #endif
  123922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123923. "lsrs r6, %[a], #16\n\t"
  123924. #else
  123925. "lsr r6, %[a], #16\n\t"
  123926. #endif
  123927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123928. "lsrs r7, %[b], #16\n\t"
  123929. #else
  123930. "lsr r7, %[b], #16\n\t"
  123931. #endif
  123932. #ifdef WOLFSSL_KEIL
  123933. "muls r7, r6, r7\n\t"
  123934. #elif defined(__clang__)
  123935. "muls r7, r6\n\t"
  123936. #else
  123937. "mul r7, r6\n\t"
  123938. #endif
  123939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123940. "adds r4, r4, r7\n\t"
  123941. #else
  123942. "add r4, r4, r7\n\t"
  123943. #endif
  123944. #ifdef WOLFSSL_KEIL
  123945. "adcs r5, r5, %[r]\n\t"
  123946. #elif defined(__clang__)
  123947. "adcs r5, %[r]\n\t"
  123948. #else
  123949. "adc r5, %[r]\n\t"
  123950. #endif
  123951. "uxth r7, %[b]\n\t"
  123952. #ifdef WOLFSSL_KEIL
  123953. "muls r6, r7, r6\n\t"
  123954. #elif defined(__clang__)
  123955. "muls r6, r7\n\t"
  123956. #else
  123957. "mul r6, r7\n\t"
  123958. #endif
  123959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123960. "lsrs r7, r6, #16\n\t"
  123961. #else
  123962. "lsr r7, r6, #16\n\t"
  123963. #endif
  123964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123965. "lsls r6, r6, #16\n\t"
  123966. #else
  123967. "lsl r6, r6, #16\n\t"
  123968. #endif
  123969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123970. "adds r3, r3, r6\n\t"
  123971. #else
  123972. "add r3, r3, r6\n\t"
  123973. #endif
  123974. #ifdef WOLFSSL_KEIL
  123975. "adcs r4, r4, r7\n\t"
  123976. #elif defined(__clang__)
  123977. "adcs r4, r7\n\t"
  123978. #else
  123979. "adc r4, r7\n\t"
  123980. #endif
  123981. #ifdef WOLFSSL_KEIL
  123982. "adcs r5, r5, %[r]\n\t"
  123983. #elif defined(__clang__)
  123984. "adcs r5, %[r]\n\t"
  123985. #else
  123986. "adc r5, %[r]\n\t"
  123987. #endif
  123988. "# A[8] * B[1]\n\t"
  123989. "mov %[a], r9\n\t"
  123990. "mov %[b], r10\n\t"
  123991. "ldr %[a], [%[a], #32]\n\t"
  123992. "ldr %[b], [%[b], #4]\n\t"
  123993. "uxth r6, %[a]\n\t"
  123994. "uxth r7, %[b]\n\t"
  123995. #ifdef WOLFSSL_KEIL
  123996. "muls r7, r6, r7\n\t"
  123997. #elif defined(__clang__)
  123998. "muls r7, r6\n\t"
  123999. #else
  124000. "mul r7, r6\n\t"
  124001. #endif
  124002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124003. "adds r3, r3, r7\n\t"
  124004. #else
  124005. "add r3, r3, r7\n\t"
  124006. #endif
  124007. #ifdef WOLFSSL_KEIL
  124008. "adcs r4, r4, %[r]\n\t"
  124009. #elif defined(__clang__)
  124010. "adcs r4, %[r]\n\t"
  124011. #else
  124012. "adc r4, %[r]\n\t"
  124013. #endif
  124014. #ifdef WOLFSSL_KEIL
  124015. "adcs r5, r5, %[r]\n\t"
  124016. #elif defined(__clang__)
  124017. "adcs r5, %[r]\n\t"
  124018. #else
  124019. "adc r5, %[r]\n\t"
  124020. #endif
  124021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124022. "lsrs r7, %[b], #16\n\t"
  124023. #else
  124024. "lsr r7, %[b], #16\n\t"
  124025. #endif
  124026. #ifdef WOLFSSL_KEIL
  124027. "muls r6, r7, r6\n\t"
  124028. #elif defined(__clang__)
  124029. "muls r6, r7\n\t"
  124030. #else
  124031. "mul r6, r7\n\t"
  124032. #endif
  124033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124034. "lsrs r7, r6, #16\n\t"
  124035. #else
  124036. "lsr r7, r6, #16\n\t"
  124037. #endif
  124038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124039. "lsls r6, r6, #16\n\t"
  124040. #else
  124041. "lsl r6, r6, #16\n\t"
  124042. #endif
  124043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124044. "adds r3, r3, r6\n\t"
  124045. #else
  124046. "add r3, r3, r6\n\t"
  124047. #endif
  124048. #ifdef WOLFSSL_KEIL
  124049. "adcs r4, r4, r7\n\t"
  124050. #elif defined(__clang__)
  124051. "adcs r4, r7\n\t"
  124052. #else
  124053. "adc r4, r7\n\t"
  124054. #endif
  124055. #ifdef WOLFSSL_KEIL
  124056. "adcs r5, r5, %[r]\n\t"
  124057. #elif defined(__clang__)
  124058. "adcs r5, %[r]\n\t"
  124059. #else
  124060. "adc r5, %[r]\n\t"
  124061. #endif
  124062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124063. "lsrs r6, %[a], #16\n\t"
  124064. #else
  124065. "lsr r6, %[a], #16\n\t"
  124066. #endif
  124067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124068. "lsrs r7, %[b], #16\n\t"
  124069. #else
  124070. "lsr r7, %[b], #16\n\t"
  124071. #endif
  124072. #ifdef WOLFSSL_KEIL
  124073. "muls r7, r6, r7\n\t"
  124074. #elif defined(__clang__)
  124075. "muls r7, r6\n\t"
  124076. #else
  124077. "mul r7, r6\n\t"
  124078. #endif
  124079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124080. "adds r4, r4, r7\n\t"
  124081. #else
  124082. "add r4, r4, r7\n\t"
  124083. #endif
  124084. #ifdef WOLFSSL_KEIL
  124085. "adcs r5, r5, %[r]\n\t"
  124086. #elif defined(__clang__)
  124087. "adcs r5, %[r]\n\t"
  124088. #else
  124089. "adc r5, %[r]\n\t"
  124090. #endif
  124091. "uxth r7, %[b]\n\t"
  124092. #ifdef WOLFSSL_KEIL
  124093. "muls r6, r7, r6\n\t"
  124094. #elif defined(__clang__)
  124095. "muls r6, r7\n\t"
  124096. #else
  124097. "mul r6, r7\n\t"
  124098. #endif
  124099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124100. "lsrs r7, r6, #16\n\t"
  124101. #else
  124102. "lsr r7, r6, #16\n\t"
  124103. #endif
  124104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124105. "lsls r6, r6, #16\n\t"
  124106. #else
  124107. "lsl r6, r6, #16\n\t"
  124108. #endif
  124109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124110. "adds r3, r3, r6\n\t"
  124111. #else
  124112. "add r3, r3, r6\n\t"
  124113. #endif
  124114. #ifdef WOLFSSL_KEIL
  124115. "adcs r4, r4, r7\n\t"
  124116. #elif defined(__clang__)
  124117. "adcs r4, r7\n\t"
  124118. #else
  124119. "adc r4, r7\n\t"
  124120. #endif
  124121. #ifdef WOLFSSL_KEIL
  124122. "adcs r5, r5, %[r]\n\t"
  124123. #elif defined(__clang__)
  124124. "adcs r5, %[r]\n\t"
  124125. #else
  124126. "adc r5, %[r]\n\t"
  124127. #endif
  124128. "# A[9] * B[0]\n\t"
  124129. "mov %[a], r9\n\t"
  124130. "mov %[b], r10\n\t"
  124131. "ldr %[a], [%[a], #36]\n\t"
  124132. "ldr %[b], [%[b]]\n\t"
  124133. "uxth r6, %[a]\n\t"
  124134. "uxth r7, %[b]\n\t"
  124135. #ifdef WOLFSSL_KEIL
  124136. "muls r7, r6, r7\n\t"
  124137. #elif defined(__clang__)
  124138. "muls r7, r6\n\t"
  124139. #else
  124140. "mul r7, r6\n\t"
  124141. #endif
  124142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124143. "adds r3, r3, r7\n\t"
  124144. #else
  124145. "add r3, r3, r7\n\t"
  124146. #endif
  124147. #ifdef WOLFSSL_KEIL
  124148. "adcs r4, r4, %[r]\n\t"
  124149. #elif defined(__clang__)
  124150. "adcs r4, %[r]\n\t"
  124151. #else
  124152. "adc r4, %[r]\n\t"
  124153. #endif
  124154. #ifdef WOLFSSL_KEIL
  124155. "adcs r5, r5, %[r]\n\t"
  124156. #elif defined(__clang__)
  124157. "adcs r5, %[r]\n\t"
  124158. #else
  124159. "adc r5, %[r]\n\t"
  124160. #endif
  124161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124162. "lsrs r7, %[b], #16\n\t"
  124163. #else
  124164. "lsr r7, %[b], #16\n\t"
  124165. #endif
  124166. #ifdef WOLFSSL_KEIL
  124167. "muls r6, r7, r6\n\t"
  124168. #elif defined(__clang__)
  124169. "muls r6, r7\n\t"
  124170. #else
  124171. "mul r6, r7\n\t"
  124172. #endif
  124173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124174. "lsrs r7, r6, #16\n\t"
  124175. #else
  124176. "lsr r7, r6, #16\n\t"
  124177. #endif
  124178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124179. "lsls r6, r6, #16\n\t"
  124180. #else
  124181. "lsl r6, r6, #16\n\t"
  124182. #endif
  124183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124184. "adds r3, r3, r6\n\t"
  124185. #else
  124186. "add r3, r3, r6\n\t"
  124187. #endif
  124188. #ifdef WOLFSSL_KEIL
  124189. "adcs r4, r4, r7\n\t"
  124190. #elif defined(__clang__)
  124191. "adcs r4, r7\n\t"
  124192. #else
  124193. "adc r4, r7\n\t"
  124194. #endif
  124195. #ifdef WOLFSSL_KEIL
  124196. "adcs r5, r5, %[r]\n\t"
  124197. #elif defined(__clang__)
  124198. "adcs r5, %[r]\n\t"
  124199. #else
  124200. "adc r5, %[r]\n\t"
  124201. #endif
  124202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124203. "lsrs r6, %[a], #16\n\t"
  124204. #else
  124205. "lsr r6, %[a], #16\n\t"
  124206. #endif
  124207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124208. "lsrs r7, %[b], #16\n\t"
  124209. #else
  124210. "lsr r7, %[b], #16\n\t"
  124211. #endif
  124212. #ifdef WOLFSSL_KEIL
  124213. "muls r7, r6, r7\n\t"
  124214. #elif defined(__clang__)
  124215. "muls r7, r6\n\t"
  124216. #else
  124217. "mul r7, r6\n\t"
  124218. #endif
  124219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124220. "adds r4, r4, r7\n\t"
  124221. #else
  124222. "add r4, r4, r7\n\t"
  124223. #endif
  124224. #ifdef WOLFSSL_KEIL
  124225. "adcs r5, r5, %[r]\n\t"
  124226. #elif defined(__clang__)
  124227. "adcs r5, %[r]\n\t"
  124228. #else
  124229. "adc r5, %[r]\n\t"
  124230. #endif
  124231. "uxth r7, %[b]\n\t"
  124232. #ifdef WOLFSSL_KEIL
  124233. "muls r6, r7, r6\n\t"
  124234. #elif defined(__clang__)
  124235. "muls r6, r7\n\t"
  124236. #else
  124237. "mul r6, r7\n\t"
  124238. #endif
  124239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124240. "lsrs r7, r6, #16\n\t"
  124241. #else
  124242. "lsr r7, r6, #16\n\t"
  124243. #endif
  124244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124245. "lsls r6, r6, #16\n\t"
  124246. #else
  124247. "lsl r6, r6, #16\n\t"
  124248. #endif
  124249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124250. "adds r3, r3, r6\n\t"
  124251. #else
  124252. "add r3, r3, r6\n\t"
  124253. #endif
  124254. #ifdef WOLFSSL_KEIL
  124255. "adcs r4, r4, r7\n\t"
  124256. #elif defined(__clang__)
  124257. "adcs r4, r7\n\t"
  124258. #else
  124259. "adc r4, r7\n\t"
  124260. #endif
  124261. #ifdef WOLFSSL_KEIL
  124262. "adcs r5, r5, %[r]\n\t"
  124263. #elif defined(__clang__)
  124264. "adcs r5, %[r]\n\t"
  124265. #else
  124266. "adc r5, %[r]\n\t"
  124267. #endif
  124268. "str r3, [sp, #36]\n\t"
  124269. "# A[10] * B[0]\n\t"
  124270. "movs r3, #0\n\t"
  124271. "mov %[a], r9\n\t"
  124272. "mov %[b], r10\n\t"
  124273. "ldr %[a], [%[a], #40]\n\t"
  124274. "ldr %[b], [%[b]]\n\t"
  124275. "uxth r6, %[a]\n\t"
  124276. "uxth r7, %[b]\n\t"
  124277. #ifdef WOLFSSL_KEIL
  124278. "muls r7, r6, r7\n\t"
  124279. #elif defined(__clang__)
  124280. "muls r7, r6\n\t"
  124281. #else
  124282. "mul r7, r6\n\t"
  124283. #endif
  124284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124285. "adds r4, r4, r7\n\t"
  124286. #else
  124287. "add r4, r4, r7\n\t"
  124288. #endif
  124289. #ifdef WOLFSSL_KEIL
  124290. "adcs r5, r5, %[r]\n\t"
  124291. #elif defined(__clang__)
  124292. "adcs r5, %[r]\n\t"
  124293. #else
  124294. "adc r5, %[r]\n\t"
  124295. #endif
  124296. #ifdef WOLFSSL_KEIL
  124297. "adcs r3, r3, %[r]\n\t"
  124298. #elif defined(__clang__)
  124299. "adcs r3, %[r]\n\t"
  124300. #else
  124301. "adc r3, %[r]\n\t"
  124302. #endif
  124303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124304. "lsrs r7, %[b], #16\n\t"
  124305. #else
  124306. "lsr r7, %[b], #16\n\t"
  124307. #endif
  124308. #ifdef WOLFSSL_KEIL
  124309. "muls r6, r7, r6\n\t"
  124310. #elif defined(__clang__)
  124311. "muls r6, r7\n\t"
  124312. #else
  124313. "mul r6, r7\n\t"
  124314. #endif
  124315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124316. "lsrs r7, r6, #16\n\t"
  124317. #else
  124318. "lsr r7, r6, #16\n\t"
  124319. #endif
  124320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124321. "lsls r6, r6, #16\n\t"
  124322. #else
  124323. "lsl r6, r6, #16\n\t"
  124324. #endif
  124325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124326. "adds r4, r4, r6\n\t"
  124327. #else
  124328. "add r4, r4, r6\n\t"
  124329. #endif
  124330. #ifdef WOLFSSL_KEIL
  124331. "adcs r5, r5, r7\n\t"
  124332. #elif defined(__clang__)
  124333. "adcs r5, r7\n\t"
  124334. #else
  124335. "adc r5, r7\n\t"
  124336. #endif
  124337. #ifdef WOLFSSL_KEIL
  124338. "adcs r3, r3, %[r]\n\t"
  124339. #elif defined(__clang__)
  124340. "adcs r3, %[r]\n\t"
  124341. #else
  124342. "adc r3, %[r]\n\t"
  124343. #endif
  124344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124345. "lsrs r6, %[a], #16\n\t"
  124346. #else
  124347. "lsr r6, %[a], #16\n\t"
  124348. #endif
  124349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124350. "lsrs r7, %[b], #16\n\t"
  124351. #else
  124352. "lsr r7, %[b], #16\n\t"
  124353. #endif
  124354. #ifdef WOLFSSL_KEIL
  124355. "muls r7, r6, r7\n\t"
  124356. #elif defined(__clang__)
  124357. "muls r7, r6\n\t"
  124358. #else
  124359. "mul r7, r6\n\t"
  124360. #endif
  124361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124362. "adds r5, r5, r7\n\t"
  124363. #else
  124364. "add r5, r5, r7\n\t"
  124365. #endif
  124366. #ifdef WOLFSSL_KEIL
  124367. "adcs r3, r3, %[r]\n\t"
  124368. #elif defined(__clang__)
  124369. "adcs r3, %[r]\n\t"
  124370. #else
  124371. "adc r3, %[r]\n\t"
  124372. #endif
  124373. "uxth r7, %[b]\n\t"
  124374. #ifdef WOLFSSL_KEIL
  124375. "muls r6, r7, r6\n\t"
  124376. #elif defined(__clang__)
  124377. "muls r6, r7\n\t"
  124378. #else
  124379. "mul r6, r7\n\t"
  124380. #endif
  124381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124382. "lsrs r7, r6, #16\n\t"
  124383. #else
  124384. "lsr r7, r6, #16\n\t"
  124385. #endif
  124386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124387. "lsls r6, r6, #16\n\t"
  124388. #else
  124389. "lsl r6, r6, #16\n\t"
  124390. #endif
  124391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124392. "adds r4, r4, r6\n\t"
  124393. #else
  124394. "add r4, r4, r6\n\t"
  124395. #endif
  124396. #ifdef WOLFSSL_KEIL
  124397. "adcs r5, r5, r7\n\t"
  124398. #elif defined(__clang__)
  124399. "adcs r5, r7\n\t"
  124400. #else
  124401. "adc r5, r7\n\t"
  124402. #endif
  124403. #ifdef WOLFSSL_KEIL
  124404. "adcs r3, r3, %[r]\n\t"
  124405. #elif defined(__clang__)
  124406. "adcs r3, %[r]\n\t"
  124407. #else
  124408. "adc r3, %[r]\n\t"
  124409. #endif
  124410. "# A[9] * B[1]\n\t"
  124411. "mov %[a], r9\n\t"
  124412. "mov %[b], r10\n\t"
  124413. "ldr %[a], [%[a], #36]\n\t"
  124414. "ldr %[b], [%[b], #4]\n\t"
  124415. "uxth r6, %[a]\n\t"
  124416. "uxth r7, %[b]\n\t"
  124417. #ifdef WOLFSSL_KEIL
  124418. "muls r7, r6, r7\n\t"
  124419. #elif defined(__clang__)
  124420. "muls r7, r6\n\t"
  124421. #else
  124422. "mul r7, r6\n\t"
  124423. #endif
  124424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124425. "adds r4, r4, r7\n\t"
  124426. #else
  124427. "add r4, r4, r7\n\t"
  124428. #endif
  124429. #ifdef WOLFSSL_KEIL
  124430. "adcs r5, r5, %[r]\n\t"
  124431. #elif defined(__clang__)
  124432. "adcs r5, %[r]\n\t"
  124433. #else
  124434. "adc r5, %[r]\n\t"
  124435. #endif
  124436. #ifdef WOLFSSL_KEIL
  124437. "adcs r3, r3, %[r]\n\t"
  124438. #elif defined(__clang__)
  124439. "adcs r3, %[r]\n\t"
  124440. #else
  124441. "adc r3, %[r]\n\t"
  124442. #endif
  124443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124444. "lsrs r7, %[b], #16\n\t"
  124445. #else
  124446. "lsr r7, %[b], #16\n\t"
  124447. #endif
  124448. #ifdef WOLFSSL_KEIL
  124449. "muls r6, r7, r6\n\t"
  124450. #elif defined(__clang__)
  124451. "muls r6, r7\n\t"
  124452. #else
  124453. "mul r6, r7\n\t"
  124454. #endif
  124455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124456. "lsrs r7, r6, #16\n\t"
  124457. #else
  124458. "lsr r7, r6, #16\n\t"
  124459. #endif
  124460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124461. "lsls r6, r6, #16\n\t"
  124462. #else
  124463. "lsl r6, r6, #16\n\t"
  124464. #endif
  124465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124466. "adds r4, r4, r6\n\t"
  124467. #else
  124468. "add r4, r4, r6\n\t"
  124469. #endif
  124470. #ifdef WOLFSSL_KEIL
  124471. "adcs r5, r5, r7\n\t"
  124472. #elif defined(__clang__)
  124473. "adcs r5, r7\n\t"
  124474. #else
  124475. "adc r5, r7\n\t"
  124476. #endif
  124477. #ifdef WOLFSSL_KEIL
  124478. "adcs r3, r3, %[r]\n\t"
  124479. #elif defined(__clang__)
  124480. "adcs r3, %[r]\n\t"
  124481. #else
  124482. "adc r3, %[r]\n\t"
  124483. #endif
  124484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124485. "lsrs r6, %[a], #16\n\t"
  124486. #else
  124487. "lsr r6, %[a], #16\n\t"
  124488. #endif
  124489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124490. "lsrs r7, %[b], #16\n\t"
  124491. #else
  124492. "lsr r7, %[b], #16\n\t"
  124493. #endif
  124494. #ifdef WOLFSSL_KEIL
  124495. "muls r7, r6, r7\n\t"
  124496. #elif defined(__clang__)
  124497. "muls r7, r6\n\t"
  124498. #else
  124499. "mul r7, r6\n\t"
  124500. #endif
  124501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124502. "adds r5, r5, r7\n\t"
  124503. #else
  124504. "add r5, r5, r7\n\t"
  124505. #endif
  124506. #ifdef WOLFSSL_KEIL
  124507. "adcs r3, r3, %[r]\n\t"
  124508. #elif defined(__clang__)
  124509. "adcs r3, %[r]\n\t"
  124510. #else
  124511. "adc r3, %[r]\n\t"
  124512. #endif
  124513. "uxth r7, %[b]\n\t"
  124514. #ifdef WOLFSSL_KEIL
  124515. "muls r6, r7, r6\n\t"
  124516. #elif defined(__clang__)
  124517. "muls r6, r7\n\t"
  124518. #else
  124519. "mul r6, r7\n\t"
  124520. #endif
  124521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124522. "lsrs r7, r6, #16\n\t"
  124523. #else
  124524. "lsr r7, r6, #16\n\t"
  124525. #endif
  124526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124527. "lsls r6, r6, #16\n\t"
  124528. #else
  124529. "lsl r6, r6, #16\n\t"
  124530. #endif
  124531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124532. "adds r4, r4, r6\n\t"
  124533. #else
  124534. "add r4, r4, r6\n\t"
  124535. #endif
  124536. #ifdef WOLFSSL_KEIL
  124537. "adcs r5, r5, r7\n\t"
  124538. #elif defined(__clang__)
  124539. "adcs r5, r7\n\t"
  124540. #else
  124541. "adc r5, r7\n\t"
  124542. #endif
  124543. #ifdef WOLFSSL_KEIL
  124544. "adcs r3, r3, %[r]\n\t"
  124545. #elif defined(__clang__)
  124546. "adcs r3, %[r]\n\t"
  124547. #else
  124548. "adc r3, %[r]\n\t"
  124549. #endif
  124550. "# A[8] * B[2]\n\t"
  124551. "mov %[a], r9\n\t"
  124552. "mov %[b], r10\n\t"
  124553. "ldr %[a], [%[a], #32]\n\t"
  124554. "ldr %[b], [%[b], #8]\n\t"
  124555. "uxth r6, %[a]\n\t"
  124556. "uxth r7, %[b]\n\t"
  124557. #ifdef WOLFSSL_KEIL
  124558. "muls r7, r6, r7\n\t"
  124559. #elif defined(__clang__)
  124560. "muls r7, r6\n\t"
  124561. #else
  124562. "mul r7, r6\n\t"
  124563. #endif
  124564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124565. "adds r4, r4, r7\n\t"
  124566. #else
  124567. "add r4, r4, r7\n\t"
  124568. #endif
  124569. #ifdef WOLFSSL_KEIL
  124570. "adcs r5, r5, %[r]\n\t"
  124571. #elif defined(__clang__)
  124572. "adcs r5, %[r]\n\t"
  124573. #else
  124574. "adc r5, %[r]\n\t"
  124575. #endif
  124576. #ifdef WOLFSSL_KEIL
  124577. "adcs r3, r3, %[r]\n\t"
  124578. #elif defined(__clang__)
  124579. "adcs r3, %[r]\n\t"
  124580. #else
  124581. "adc r3, %[r]\n\t"
  124582. #endif
  124583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124584. "lsrs r7, %[b], #16\n\t"
  124585. #else
  124586. "lsr r7, %[b], #16\n\t"
  124587. #endif
  124588. #ifdef WOLFSSL_KEIL
  124589. "muls r6, r7, r6\n\t"
  124590. #elif defined(__clang__)
  124591. "muls r6, r7\n\t"
  124592. #else
  124593. "mul r6, r7\n\t"
  124594. #endif
  124595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124596. "lsrs r7, r6, #16\n\t"
  124597. #else
  124598. "lsr r7, r6, #16\n\t"
  124599. #endif
  124600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124601. "lsls r6, r6, #16\n\t"
  124602. #else
  124603. "lsl r6, r6, #16\n\t"
  124604. #endif
  124605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124606. "adds r4, r4, r6\n\t"
  124607. #else
  124608. "add r4, r4, r6\n\t"
  124609. #endif
  124610. #ifdef WOLFSSL_KEIL
  124611. "adcs r5, r5, r7\n\t"
  124612. #elif defined(__clang__)
  124613. "adcs r5, r7\n\t"
  124614. #else
  124615. "adc r5, r7\n\t"
  124616. #endif
  124617. #ifdef WOLFSSL_KEIL
  124618. "adcs r3, r3, %[r]\n\t"
  124619. #elif defined(__clang__)
  124620. "adcs r3, %[r]\n\t"
  124621. #else
  124622. "adc r3, %[r]\n\t"
  124623. #endif
  124624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124625. "lsrs r6, %[a], #16\n\t"
  124626. #else
  124627. "lsr r6, %[a], #16\n\t"
  124628. #endif
  124629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124630. "lsrs r7, %[b], #16\n\t"
  124631. #else
  124632. "lsr r7, %[b], #16\n\t"
  124633. #endif
  124634. #ifdef WOLFSSL_KEIL
  124635. "muls r7, r6, r7\n\t"
  124636. #elif defined(__clang__)
  124637. "muls r7, r6\n\t"
  124638. #else
  124639. "mul r7, r6\n\t"
  124640. #endif
  124641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124642. "adds r5, r5, r7\n\t"
  124643. #else
  124644. "add r5, r5, r7\n\t"
  124645. #endif
  124646. #ifdef WOLFSSL_KEIL
  124647. "adcs r3, r3, %[r]\n\t"
  124648. #elif defined(__clang__)
  124649. "adcs r3, %[r]\n\t"
  124650. #else
  124651. "adc r3, %[r]\n\t"
  124652. #endif
  124653. "uxth r7, %[b]\n\t"
  124654. #ifdef WOLFSSL_KEIL
  124655. "muls r6, r7, r6\n\t"
  124656. #elif defined(__clang__)
  124657. "muls r6, r7\n\t"
  124658. #else
  124659. "mul r6, r7\n\t"
  124660. #endif
  124661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124662. "lsrs r7, r6, #16\n\t"
  124663. #else
  124664. "lsr r7, r6, #16\n\t"
  124665. #endif
  124666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124667. "lsls r6, r6, #16\n\t"
  124668. #else
  124669. "lsl r6, r6, #16\n\t"
  124670. #endif
  124671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124672. "adds r4, r4, r6\n\t"
  124673. #else
  124674. "add r4, r4, r6\n\t"
  124675. #endif
  124676. #ifdef WOLFSSL_KEIL
  124677. "adcs r5, r5, r7\n\t"
  124678. #elif defined(__clang__)
  124679. "adcs r5, r7\n\t"
  124680. #else
  124681. "adc r5, r7\n\t"
  124682. #endif
  124683. #ifdef WOLFSSL_KEIL
  124684. "adcs r3, r3, %[r]\n\t"
  124685. #elif defined(__clang__)
  124686. "adcs r3, %[r]\n\t"
  124687. #else
  124688. "adc r3, %[r]\n\t"
  124689. #endif
  124690. "# A[7] * B[3]\n\t"
  124691. "mov %[a], r9\n\t"
  124692. "mov %[b], r10\n\t"
  124693. "ldr %[a], [%[a], #28]\n\t"
  124694. "ldr %[b], [%[b], #12]\n\t"
  124695. "uxth r6, %[a]\n\t"
  124696. "uxth r7, %[b]\n\t"
  124697. #ifdef WOLFSSL_KEIL
  124698. "muls r7, r6, r7\n\t"
  124699. #elif defined(__clang__)
  124700. "muls r7, r6\n\t"
  124701. #else
  124702. "mul r7, r6\n\t"
  124703. #endif
  124704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124705. "adds r4, r4, r7\n\t"
  124706. #else
  124707. "add r4, r4, r7\n\t"
  124708. #endif
  124709. #ifdef WOLFSSL_KEIL
  124710. "adcs r5, r5, %[r]\n\t"
  124711. #elif defined(__clang__)
  124712. "adcs r5, %[r]\n\t"
  124713. #else
  124714. "adc r5, %[r]\n\t"
  124715. #endif
  124716. #ifdef WOLFSSL_KEIL
  124717. "adcs r3, r3, %[r]\n\t"
  124718. #elif defined(__clang__)
  124719. "adcs r3, %[r]\n\t"
  124720. #else
  124721. "adc r3, %[r]\n\t"
  124722. #endif
  124723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124724. "lsrs r7, %[b], #16\n\t"
  124725. #else
  124726. "lsr r7, %[b], #16\n\t"
  124727. #endif
  124728. #ifdef WOLFSSL_KEIL
  124729. "muls r6, r7, r6\n\t"
  124730. #elif defined(__clang__)
  124731. "muls r6, r7\n\t"
  124732. #else
  124733. "mul r6, r7\n\t"
  124734. #endif
  124735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124736. "lsrs r7, r6, #16\n\t"
  124737. #else
  124738. "lsr r7, r6, #16\n\t"
  124739. #endif
  124740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124741. "lsls r6, r6, #16\n\t"
  124742. #else
  124743. "lsl r6, r6, #16\n\t"
  124744. #endif
  124745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124746. "adds r4, r4, r6\n\t"
  124747. #else
  124748. "add r4, r4, r6\n\t"
  124749. #endif
  124750. #ifdef WOLFSSL_KEIL
  124751. "adcs r5, r5, r7\n\t"
  124752. #elif defined(__clang__)
  124753. "adcs r5, r7\n\t"
  124754. #else
  124755. "adc r5, r7\n\t"
  124756. #endif
  124757. #ifdef WOLFSSL_KEIL
  124758. "adcs r3, r3, %[r]\n\t"
  124759. #elif defined(__clang__)
  124760. "adcs r3, %[r]\n\t"
  124761. #else
  124762. "adc r3, %[r]\n\t"
  124763. #endif
  124764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124765. "lsrs r6, %[a], #16\n\t"
  124766. #else
  124767. "lsr r6, %[a], #16\n\t"
  124768. #endif
  124769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124770. "lsrs r7, %[b], #16\n\t"
  124771. #else
  124772. "lsr r7, %[b], #16\n\t"
  124773. #endif
  124774. #ifdef WOLFSSL_KEIL
  124775. "muls r7, r6, r7\n\t"
  124776. #elif defined(__clang__)
  124777. "muls r7, r6\n\t"
  124778. #else
  124779. "mul r7, r6\n\t"
  124780. #endif
  124781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124782. "adds r5, r5, r7\n\t"
  124783. #else
  124784. "add r5, r5, r7\n\t"
  124785. #endif
  124786. #ifdef WOLFSSL_KEIL
  124787. "adcs r3, r3, %[r]\n\t"
  124788. #elif defined(__clang__)
  124789. "adcs r3, %[r]\n\t"
  124790. #else
  124791. "adc r3, %[r]\n\t"
  124792. #endif
  124793. "uxth r7, %[b]\n\t"
  124794. #ifdef WOLFSSL_KEIL
  124795. "muls r6, r7, r6\n\t"
  124796. #elif defined(__clang__)
  124797. "muls r6, r7\n\t"
  124798. #else
  124799. "mul r6, r7\n\t"
  124800. #endif
  124801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124802. "lsrs r7, r6, #16\n\t"
  124803. #else
  124804. "lsr r7, r6, #16\n\t"
  124805. #endif
  124806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124807. "lsls r6, r6, #16\n\t"
  124808. #else
  124809. "lsl r6, r6, #16\n\t"
  124810. #endif
  124811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124812. "adds r4, r4, r6\n\t"
  124813. #else
  124814. "add r4, r4, r6\n\t"
  124815. #endif
  124816. #ifdef WOLFSSL_KEIL
  124817. "adcs r5, r5, r7\n\t"
  124818. #elif defined(__clang__)
  124819. "adcs r5, r7\n\t"
  124820. #else
  124821. "adc r5, r7\n\t"
  124822. #endif
  124823. #ifdef WOLFSSL_KEIL
  124824. "adcs r3, r3, %[r]\n\t"
  124825. #elif defined(__clang__)
  124826. "adcs r3, %[r]\n\t"
  124827. #else
  124828. "adc r3, %[r]\n\t"
  124829. #endif
  124830. "# A[6] * B[4]\n\t"
  124831. "mov %[a], r9\n\t"
  124832. "mov %[b], r10\n\t"
  124833. "ldr %[a], [%[a], #24]\n\t"
  124834. "ldr %[b], [%[b], #16]\n\t"
  124835. "uxth r6, %[a]\n\t"
  124836. "uxth r7, %[b]\n\t"
  124837. #ifdef WOLFSSL_KEIL
  124838. "muls r7, r6, r7\n\t"
  124839. #elif defined(__clang__)
  124840. "muls r7, r6\n\t"
  124841. #else
  124842. "mul r7, r6\n\t"
  124843. #endif
  124844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124845. "adds r4, r4, r7\n\t"
  124846. #else
  124847. "add r4, r4, r7\n\t"
  124848. #endif
  124849. #ifdef WOLFSSL_KEIL
  124850. "adcs r5, r5, %[r]\n\t"
  124851. #elif defined(__clang__)
  124852. "adcs r5, %[r]\n\t"
  124853. #else
  124854. "adc r5, %[r]\n\t"
  124855. #endif
  124856. #ifdef WOLFSSL_KEIL
  124857. "adcs r3, r3, %[r]\n\t"
  124858. #elif defined(__clang__)
  124859. "adcs r3, %[r]\n\t"
  124860. #else
  124861. "adc r3, %[r]\n\t"
  124862. #endif
  124863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124864. "lsrs r7, %[b], #16\n\t"
  124865. #else
  124866. "lsr r7, %[b], #16\n\t"
  124867. #endif
  124868. #ifdef WOLFSSL_KEIL
  124869. "muls r6, r7, r6\n\t"
  124870. #elif defined(__clang__)
  124871. "muls r6, r7\n\t"
  124872. #else
  124873. "mul r6, r7\n\t"
  124874. #endif
  124875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124876. "lsrs r7, r6, #16\n\t"
  124877. #else
  124878. "lsr r7, r6, #16\n\t"
  124879. #endif
  124880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124881. "lsls r6, r6, #16\n\t"
  124882. #else
  124883. "lsl r6, r6, #16\n\t"
  124884. #endif
  124885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124886. "adds r4, r4, r6\n\t"
  124887. #else
  124888. "add r4, r4, r6\n\t"
  124889. #endif
  124890. #ifdef WOLFSSL_KEIL
  124891. "adcs r5, r5, r7\n\t"
  124892. #elif defined(__clang__)
  124893. "adcs r5, r7\n\t"
  124894. #else
  124895. "adc r5, r7\n\t"
  124896. #endif
  124897. #ifdef WOLFSSL_KEIL
  124898. "adcs r3, r3, %[r]\n\t"
  124899. #elif defined(__clang__)
  124900. "adcs r3, %[r]\n\t"
  124901. #else
  124902. "adc r3, %[r]\n\t"
  124903. #endif
  124904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124905. "lsrs r6, %[a], #16\n\t"
  124906. #else
  124907. "lsr r6, %[a], #16\n\t"
  124908. #endif
  124909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124910. "lsrs r7, %[b], #16\n\t"
  124911. #else
  124912. "lsr r7, %[b], #16\n\t"
  124913. #endif
  124914. #ifdef WOLFSSL_KEIL
  124915. "muls r7, r6, r7\n\t"
  124916. #elif defined(__clang__)
  124917. "muls r7, r6\n\t"
  124918. #else
  124919. "mul r7, r6\n\t"
  124920. #endif
  124921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124922. "adds r5, r5, r7\n\t"
  124923. #else
  124924. "add r5, r5, r7\n\t"
  124925. #endif
  124926. #ifdef WOLFSSL_KEIL
  124927. "adcs r3, r3, %[r]\n\t"
  124928. #elif defined(__clang__)
  124929. "adcs r3, %[r]\n\t"
  124930. #else
  124931. "adc r3, %[r]\n\t"
  124932. #endif
  124933. "uxth r7, %[b]\n\t"
  124934. #ifdef WOLFSSL_KEIL
  124935. "muls r6, r7, r6\n\t"
  124936. #elif defined(__clang__)
  124937. "muls r6, r7\n\t"
  124938. #else
  124939. "mul r6, r7\n\t"
  124940. #endif
  124941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124942. "lsrs r7, r6, #16\n\t"
  124943. #else
  124944. "lsr r7, r6, #16\n\t"
  124945. #endif
  124946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124947. "lsls r6, r6, #16\n\t"
  124948. #else
  124949. "lsl r6, r6, #16\n\t"
  124950. #endif
  124951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124952. "adds r4, r4, r6\n\t"
  124953. #else
  124954. "add r4, r4, r6\n\t"
  124955. #endif
  124956. #ifdef WOLFSSL_KEIL
  124957. "adcs r5, r5, r7\n\t"
  124958. #elif defined(__clang__)
  124959. "adcs r5, r7\n\t"
  124960. #else
  124961. "adc r5, r7\n\t"
  124962. #endif
  124963. #ifdef WOLFSSL_KEIL
  124964. "adcs r3, r3, %[r]\n\t"
  124965. #elif defined(__clang__)
  124966. "adcs r3, %[r]\n\t"
  124967. #else
  124968. "adc r3, %[r]\n\t"
  124969. #endif
  124970. "# A[5] * B[5]\n\t"
  124971. "mov %[a], r9\n\t"
  124972. "mov %[b], r10\n\t"
  124973. "ldr %[a], [%[a], #20]\n\t"
  124974. "ldr %[b], [%[b], #20]\n\t"
  124975. "uxth r6, %[a]\n\t"
  124976. "uxth r7, %[b]\n\t"
  124977. #ifdef WOLFSSL_KEIL
  124978. "muls r7, r6, r7\n\t"
  124979. #elif defined(__clang__)
  124980. "muls r7, r6\n\t"
  124981. #else
  124982. "mul r7, r6\n\t"
  124983. #endif
  124984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  124985. "adds r4, r4, r7\n\t"
  124986. #else
  124987. "add r4, r4, r7\n\t"
  124988. #endif
  124989. #ifdef WOLFSSL_KEIL
  124990. "adcs r5, r5, %[r]\n\t"
  124991. #elif defined(__clang__)
  124992. "adcs r5, %[r]\n\t"
  124993. #else
  124994. "adc r5, %[r]\n\t"
  124995. #endif
  124996. #ifdef WOLFSSL_KEIL
  124997. "adcs r3, r3, %[r]\n\t"
  124998. #elif defined(__clang__)
  124999. "adcs r3, %[r]\n\t"
  125000. #else
  125001. "adc r3, %[r]\n\t"
  125002. #endif
  125003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125004. "lsrs r7, %[b], #16\n\t"
  125005. #else
  125006. "lsr r7, %[b], #16\n\t"
  125007. #endif
  125008. #ifdef WOLFSSL_KEIL
  125009. "muls r6, r7, r6\n\t"
  125010. #elif defined(__clang__)
  125011. "muls r6, r7\n\t"
  125012. #else
  125013. "mul r6, r7\n\t"
  125014. #endif
  125015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125016. "lsrs r7, r6, #16\n\t"
  125017. #else
  125018. "lsr r7, r6, #16\n\t"
  125019. #endif
  125020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125021. "lsls r6, r6, #16\n\t"
  125022. #else
  125023. "lsl r6, r6, #16\n\t"
  125024. #endif
  125025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125026. "adds r4, r4, r6\n\t"
  125027. #else
  125028. "add r4, r4, r6\n\t"
  125029. #endif
  125030. #ifdef WOLFSSL_KEIL
  125031. "adcs r5, r5, r7\n\t"
  125032. #elif defined(__clang__)
  125033. "adcs r5, r7\n\t"
  125034. #else
  125035. "adc r5, r7\n\t"
  125036. #endif
  125037. #ifdef WOLFSSL_KEIL
  125038. "adcs r3, r3, %[r]\n\t"
  125039. #elif defined(__clang__)
  125040. "adcs r3, %[r]\n\t"
  125041. #else
  125042. "adc r3, %[r]\n\t"
  125043. #endif
  125044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125045. "lsrs r6, %[a], #16\n\t"
  125046. #else
  125047. "lsr r6, %[a], #16\n\t"
  125048. #endif
  125049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125050. "lsrs r7, %[b], #16\n\t"
  125051. #else
  125052. "lsr r7, %[b], #16\n\t"
  125053. #endif
  125054. #ifdef WOLFSSL_KEIL
  125055. "muls r7, r6, r7\n\t"
  125056. #elif defined(__clang__)
  125057. "muls r7, r6\n\t"
  125058. #else
  125059. "mul r7, r6\n\t"
  125060. #endif
  125061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125062. "adds r5, r5, r7\n\t"
  125063. #else
  125064. "add r5, r5, r7\n\t"
  125065. #endif
  125066. #ifdef WOLFSSL_KEIL
  125067. "adcs r3, r3, %[r]\n\t"
  125068. #elif defined(__clang__)
  125069. "adcs r3, %[r]\n\t"
  125070. #else
  125071. "adc r3, %[r]\n\t"
  125072. #endif
  125073. "uxth r7, %[b]\n\t"
  125074. #ifdef WOLFSSL_KEIL
  125075. "muls r6, r7, r6\n\t"
  125076. #elif defined(__clang__)
  125077. "muls r6, r7\n\t"
  125078. #else
  125079. "mul r6, r7\n\t"
  125080. #endif
  125081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125082. "lsrs r7, r6, #16\n\t"
  125083. #else
  125084. "lsr r7, r6, #16\n\t"
  125085. #endif
  125086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125087. "lsls r6, r6, #16\n\t"
  125088. #else
  125089. "lsl r6, r6, #16\n\t"
  125090. #endif
  125091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125092. "adds r4, r4, r6\n\t"
  125093. #else
  125094. "add r4, r4, r6\n\t"
  125095. #endif
  125096. #ifdef WOLFSSL_KEIL
  125097. "adcs r5, r5, r7\n\t"
  125098. #elif defined(__clang__)
  125099. "adcs r5, r7\n\t"
  125100. #else
  125101. "adc r5, r7\n\t"
  125102. #endif
  125103. #ifdef WOLFSSL_KEIL
  125104. "adcs r3, r3, %[r]\n\t"
  125105. #elif defined(__clang__)
  125106. "adcs r3, %[r]\n\t"
  125107. #else
  125108. "adc r3, %[r]\n\t"
  125109. #endif
  125110. "# A[4] * B[6]\n\t"
  125111. "mov %[a], r9\n\t"
  125112. "mov %[b], r10\n\t"
  125113. "ldr %[a], [%[a], #16]\n\t"
  125114. "ldr %[b], [%[b], #24]\n\t"
  125115. "uxth r6, %[a]\n\t"
  125116. "uxth r7, %[b]\n\t"
  125117. #ifdef WOLFSSL_KEIL
  125118. "muls r7, r6, r7\n\t"
  125119. #elif defined(__clang__)
  125120. "muls r7, r6\n\t"
  125121. #else
  125122. "mul r7, r6\n\t"
  125123. #endif
  125124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125125. "adds r4, r4, r7\n\t"
  125126. #else
  125127. "add r4, r4, r7\n\t"
  125128. #endif
  125129. #ifdef WOLFSSL_KEIL
  125130. "adcs r5, r5, %[r]\n\t"
  125131. #elif defined(__clang__)
  125132. "adcs r5, %[r]\n\t"
  125133. #else
  125134. "adc r5, %[r]\n\t"
  125135. #endif
  125136. #ifdef WOLFSSL_KEIL
  125137. "adcs r3, r3, %[r]\n\t"
  125138. #elif defined(__clang__)
  125139. "adcs r3, %[r]\n\t"
  125140. #else
  125141. "adc r3, %[r]\n\t"
  125142. #endif
  125143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125144. "lsrs r7, %[b], #16\n\t"
  125145. #else
  125146. "lsr r7, %[b], #16\n\t"
  125147. #endif
  125148. #ifdef WOLFSSL_KEIL
  125149. "muls r6, r7, r6\n\t"
  125150. #elif defined(__clang__)
  125151. "muls r6, r7\n\t"
  125152. #else
  125153. "mul r6, r7\n\t"
  125154. #endif
  125155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125156. "lsrs r7, r6, #16\n\t"
  125157. #else
  125158. "lsr r7, r6, #16\n\t"
  125159. #endif
  125160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125161. "lsls r6, r6, #16\n\t"
  125162. #else
  125163. "lsl r6, r6, #16\n\t"
  125164. #endif
  125165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125166. "adds r4, r4, r6\n\t"
  125167. #else
  125168. "add r4, r4, r6\n\t"
  125169. #endif
  125170. #ifdef WOLFSSL_KEIL
  125171. "adcs r5, r5, r7\n\t"
  125172. #elif defined(__clang__)
  125173. "adcs r5, r7\n\t"
  125174. #else
  125175. "adc r5, r7\n\t"
  125176. #endif
  125177. #ifdef WOLFSSL_KEIL
  125178. "adcs r3, r3, %[r]\n\t"
  125179. #elif defined(__clang__)
  125180. "adcs r3, %[r]\n\t"
  125181. #else
  125182. "adc r3, %[r]\n\t"
  125183. #endif
  125184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125185. "lsrs r6, %[a], #16\n\t"
  125186. #else
  125187. "lsr r6, %[a], #16\n\t"
  125188. #endif
  125189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125190. "lsrs r7, %[b], #16\n\t"
  125191. #else
  125192. "lsr r7, %[b], #16\n\t"
  125193. #endif
  125194. #ifdef WOLFSSL_KEIL
  125195. "muls r7, r6, r7\n\t"
  125196. #elif defined(__clang__)
  125197. "muls r7, r6\n\t"
  125198. #else
  125199. "mul r7, r6\n\t"
  125200. #endif
  125201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125202. "adds r5, r5, r7\n\t"
  125203. #else
  125204. "add r5, r5, r7\n\t"
  125205. #endif
  125206. #ifdef WOLFSSL_KEIL
  125207. "adcs r3, r3, %[r]\n\t"
  125208. #elif defined(__clang__)
  125209. "adcs r3, %[r]\n\t"
  125210. #else
  125211. "adc r3, %[r]\n\t"
  125212. #endif
  125213. "uxth r7, %[b]\n\t"
  125214. #ifdef WOLFSSL_KEIL
  125215. "muls r6, r7, r6\n\t"
  125216. #elif defined(__clang__)
  125217. "muls r6, r7\n\t"
  125218. #else
  125219. "mul r6, r7\n\t"
  125220. #endif
  125221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125222. "lsrs r7, r6, #16\n\t"
  125223. #else
  125224. "lsr r7, r6, #16\n\t"
  125225. #endif
  125226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125227. "lsls r6, r6, #16\n\t"
  125228. #else
  125229. "lsl r6, r6, #16\n\t"
  125230. #endif
  125231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125232. "adds r4, r4, r6\n\t"
  125233. #else
  125234. "add r4, r4, r6\n\t"
  125235. #endif
  125236. #ifdef WOLFSSL_KEIL
  125237. "adcs r5, r5, r7\n\t"
  125238. #elif defined(__clang__)
  125239. "adcs r5, r7\n\t"
  125240. #else
  125241. "adc r5, r7\n\t"
  125242. #endif
  125243. #ifdef WOLFSSL_KEIL
  125244. "adcs r3, r3, %[r]\n\t"
  125245. #elif defined(__clang__)
  125246. "adcs r3, %[r]\n\t"
  125247. #else
  125248. "adc r3, %[r]\n\t"
  125249. #endif
  125250. "# A[3] * B[7]\n\t"
  125251. "mov %[a], r9\n\t"
  125252. "mov %[b], r10\n\t"
  125253. "ldr %[a], [%[a], #12]\n\t"
  125254. "ldr %[b], [%[b], #28]\n\t"
  125255. "uxth r6, %[a]\n\t"
  125256. "uxth r7, %[b]\n\t"
  125257. #ifdef WOLFSSL_KEIL
  125258. "muls r7, r6, r7\n\t"
  125259. #elif defined(__clang__)
  125260. "muls r7, r6\n\t"
  125261. #else
  125262. "mul r7, r6\n\t"
  125263. #endif
  125264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125265. "adds r4, r4, r7\n\t"
  125266. #else
  125267. "add r4, r4, r7\n\t"
  125268. #endif
  125269. #ifdef WOLFSSL_KEIL
  125270. "adcs r5, r5, %[r]\n\t"
  125271. #elif defined(__clang__)
  125272. "adcs r5, %[r]\n\t"
  125273. #else
  125274. "adc r5, %[r]\n\t"
  125275. #endif
  125276. #ifdef WOLFSSL_KEIL
  125277. "adcs r3, r3, %[r]\n\t"
  125278. #elif defined(__clang__)
  125279. "adcs r3, %[r]\n\t"
  125280. #else
  125281. "adc r3, %[r]\n\t"
  125282. #endif
  125283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125284. "lsrs r7, %[b], #16\n\t"
  125285. #else
  125286. "lsr r7, %[b], #16\n\t"
  125287. #endif
  125288. #ifdef WOLFSSL_KEIL
  125289. "muls r6, r7, r6\n\t"
  125290. #elif defined(__clang__)
  125291. "muls r6, r7\n\t"
  125292. #else
  125293. "mul r6, r7\n\t"
  125294. #endif
  125295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125296. "lsrs r7, r6, #16\n\t"
  125297. #else
  125298. "lsr r7, r6, #16\n\t"
  125299. #endif
  125300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125301. "lsls r6, r6, #16\n\t"
  125302. #else
  125303. "lsl r6, r6, #16\n\t"
  125304. #endif
  125305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125306. "adds r4, r4, r6\n\t"
  125307. #else
  125308. "add r4, r4, r6\n\t"
  125309. #endif
  125310. #ifdef WOLFSSL_KEIL
  125311. "adcs r5, r5, r7\n\t"
  125312. #elif defined(__clang__)
  125313. "adcs r5, r7\n\t"
  125314. #else
  125315. "adc r5, r7\n\t"
  125316. #endif
  125317. #ifdef WOLFSSL_KEIL
  125318. "adcs r3, r3, %[r]\n\t"
  125319. #elif defined(__clang__)
  125320. "adcs r3, %[r]\n\t"
  125321. #else
  125322. "adc r3, %[r]\n\t"
  125323. #endif
  125324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125325. "lsrs r6, %[a], #16\n\t"
  125326. #else
  125327. "lsr r6, %[a], #16\n\t"
  125328. #endif
  125329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125330. "lsrs r7, %[b], #16\n\t"
  125331. #else
  125332. "lsr r7, %[b], #16\n\t"
  125333. #endif
  125334. #ifdef WOLFSSL_KEIL
  125335. "muls r7, r6, r7\n\t"
  125336. #elif defined(__clang__)
  125337. "muls r7, r6\n\t"
  125338. #else
  125339. "mul r7, r6\n\t"
  125340. #endif
  125341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125342. "adds r5, r5, r7\n\t"
  125343. #else
  125344. "add r5, r5, r7\n\t"
  125345. #endif
  125346. #ifdef WOLFSSL_KEIL
  125347. "adcs r3, r3, %[r]\n\t"
  125348. #elif defined(__clang__)
  125349. "adcs r3, %[r]\n\t"
  125350. #else
  125351. "adc r3, %[r]\n\t"
  125352. #endif
  125353. "uxth r7, %[b]\n\t"
  125354. #ifdef WOLFSSL_KEIL
  125355. "muls r6, r7, r6\n\t"
  125356. #elif defined(__clang__)
  125357. "muls r6, r7\n\t"
  125358. #else
  125359. "mul r6, r7\n\t"
  125360. #endif
  125361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125362. "lsrs r7, r6, #16\n\t"
  125363. #else
  125364. "lsr r7, r6, #16\n\t"
  125365. #endif
  125366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125367. "lsls r6, r6, #16\n\t"
  125368. #else
  125369. "lsl r6, r6, #16\n\t"
  125370. #endif
  125371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125372. "adds r4, r4, r6\n\t"
  125373. #else
  125374. "add r4, r4, r6\n\t"
  125375. #endif
  125376. #ifdef WOLFSSL_KEIL
  125377. "adcs r5, r5, r7\n\t"
  125378. #elif defined(__clang__)
  125379. "adcs r5, r7\n\t"
  125380. #else
  125381. "adc r5, r7\n\t"
  125382. #endif
  125383. #ifdef WOLFSSL_KEIL
  125384. "adcs r3, r3, %[r]\n\t"
  125385. #elif defined(__clang__)
  125386. "adcs r3, %[r]\n\t"
  125387. #else
  125388. "adc r3, %[r]\n\t"
  125389. #endif
  125390. "# A[2] * B[8]\n\t"
  125391. "mov %[a], r9\n\t"
  125392. "mov %[b], r10\n\t"
  125393. "ldr %[a], [%[a], #8]\n\t"
  125394. "ldr %[b], [%[b], #32]\n\t"
  125395. "uxth r6, %[a]\n\t"
  125396. "uxth r7, %[b]\n\t"
  125397. #ifdef WOLFSSL_KEIL
  125398. "muls r7, r6, r7\n\t"
  125399. #elif defined(__clang__)
  125400. "muls r7, r6\n\t"
  125401. #else
  125402. "mul r7, r6\n\t"
  125403. #endif
  125404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125405. "adds r4, r4, r7\n\t"
  125406. #else
  125407. "add r4, r4, r7\n\t"
  125408. #endif
  125409. #ifdef WOLFSSL_KEIL
  125410. "adcs r5, r5, %[r]\n\t"
  125411. #elif defined(__clang__)
  125412. "adcs r5, %[r]\n\t"
  125413. #else
  125414. "adc r5, %[r]\n\t"
  125415. #endif
  125416. #ifdef WOLFSSL_KEIL
  125417. "adcs r3, r3, %[r]\n\t"
  125418. #elif defined(__clang__)
  125419. "adcs r3, %[r]\n\t"
  125420. #else
  125421. "adc r3, %[r]\n\t"
  125422. #endif
  125423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125424. "lsrs r7, %[b], #16\n\t"
  125425. #else
  125426. "lsr r7, %[b], #16\n\t"
  125427. #endif
  125428. #ifdef WOLFSSL_KEIL
  125429. "muls r6, r7, r6\n\t"
  125430. #elif defined(__clang__)
  125431. "muls r6, r7\n\t"
  125432. #else
  125433. "mul r6, r7\n\t"
  125434. #endif
  125435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125436. "lsrs r7, r6, #16\n\t"
  125437. #else
  125438. "lsr r7, r6, #16\n\t"
  125439. #endif
  125440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125441. "lsls r6, r6, #16\n\t"
  125442. #else
  125443. "lsl r6, r6, #16\n\t"
  125444. #endif
  125445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125446. "adds r4, r4, r6\n\t"
  125447. #else
  125448. "add r4, r4, r6\n\t"
  125449. #endif
  125450. #ifdef WOLFSSL_KEIL
  125451. "adcs r5, r5, r7\n\t"
  125452. #elif defined(__clang__)
  125453. "adcs r5, r7\n\t"
  125454. #else
  125455. "adc r5, r7\n\t"
  125456. #endif
  125457. #ifdef WOLFSSL_KEIL
  125458. "adcs r3, r3, %[r]\n\t"
  125459. #elif defined(__clang__)
  125460. "adcs r3, %[r]\n\t"
  125461. #else
  125462. "adc r3, %[r]\n\t"
  125463. #endif
  125464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125465. "lsrs r6, %[a], #16\n\t"
  125466. #else
  125467. "lsr r6, %[a], #16\n\t"
  125468. #endif
  125469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125470. "lsrs r7, %[b], #16\n\t"
  125471. #else
  125472. "lsr r7, %[b], #16\n\t"
  125473. #endif
  125474. #ifdef WOLFSSL_KEIL
  125475. "muls r7, r6, r7\n\t"
  125476. #elif defined(__clang__)
  125477. "muls r7, r6\n\t"
  125478. #else
  125479. "mul r7, r6\n\t"
  125480. #endif
  125481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125482. "adds r5, r5, r7\n\t"
  125483. #else
  125484. "add r5, r5, r7\n\t"
  125485. #endif
  125486. #ifdef WOLFSSL_KEIL
  125487. "adcs r3, r3, %[r]\n\t"
  125488. #elif defined(__clang__)
  125489. "adcs r3, %[r]\n\t"
  125490. #else
  125491. "adc r3, %[r]\n\t"
  125492. #endif
  125493. "uxth r7, %[b]\n\t"
  125494. #ifdef WOLFSSL_KEIL
  125495. "muls r6, r7, r6\n\t"
  125496. #elif defined(__clang__)
  125497. "muls r6, r7\n\t"
  125498. #else
  125499. "mul r6, r7\n\t"
  125500. #endif
  125501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125502. "lsrs r7, r6, #16\n\t"
  125503. #else
  125504. "lsr r7, r6, #16\n\t"
  125505. #endif
  125506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125507. "lsls r6, r6, #16\n\t"
  125508. #else
  125509. "lsl r6, r6, #16\n\t"
  125510. #endif
  125511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125512. "adds r4, r4, r6\n\t"
  125513. #else
  125514. "add r4, r4, r6\n\t"
  125515. #endif
  125516. #ifdef WOLFSSL_KEIL
  125517. "adcs r5, r5, r7\n\t"
  125518. #elif defined(__clang__)
  125519. "adcs r5, r7\n\t"
  125520. #else
  125521. "adc r5, r7\n\t"
  125522. #endif
  125523. #ifdef WOLFSSL_KEIL
  125524. "adcs r3, r3, %[r]\n\t"
  125525. #elif defined(__clang__)
  125526. "adcs r3, %[r]\n\t"
  125527. #else
  125528. "adc r3, %[r]\n\t"
  125529. #endif
  125530. "# A[1] * B[9]\n\t"
  125531. "mov %[a], r9\n\t"
  125532. "mov %[b], r10\n\t"
  125533. "ldr %[a], [%[a], #4]\n\t"
  125534. "ldr %[b], [%[b], #36]\n\t"
  125535. "uxth r6, %[a]\n\t"
  125536. "uxth r7, %[b]\n\t"
  125537. #ifdef WOLFSSL_KEIL
  125538. "muls r7, r6, r7\n\t"
  125539. #elif defined(__clang__)
  125540. "muls r7, r6\n\t"
  125541. #else
  125542. "mul r7, r6\n\t"
  125543. #endif
  125544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125545. "adds r4, r4, r7\n\t"
  125546. #else
  125547. "add r4, r4, r7\n\t"
  125548. #endif
  125549. #ifdef WOLFSSL_KEIL
  125550. "adcs r5, r5, %[r]\n\t"
  125551. #elif defined(__clang__)
  125552. "adcs r5, %[r]\n\t"
  125553. #else
  125554. "adc r5, %[r]\n\t"
  125555. #endif
  125556. #ifdef WOLFSSL_KEIL
  125557. "adcs r3, r3, %[r]\n\t"
  125558. #elif defined(__clang__)
  125559. "adcs r3, %[r]\n\t"
  125560. #else
  125561. "adc r3, %[r]\n\t"
  125562. #endif
  125563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125564. "lsrs r7, %[b], #16\n\t"
  125565. #else
  125566. "lsr r7, %[b], #16\n\t"
  125567. #endif
  125568. #ifdef WOLFSSL_KEIL
  125569. "muls r6, r7, r6\n\t"
  125570. #elif defined(__clang__)
  125571. "muls r6, r7\n\t"
  125572. #else
  125573. "mul r6, r7\n\t"
  125574. #endif
  125575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125576. "lsrs r7, r6, #16\n\t"
  125577. #else
  125578. "lsr r7, r6, #16\n\t"
  125579. #endif
  125580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125581. "lsls r6, r6, #16\n\t"
  125582. #else
  125583. "lsl r6, r6, #16\n\t"
  125584. #endif
  125585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125586. "adds r4, r4, r6\n\t"
  125587. #else
  125588. "add r4, r4, r6\n\t"
  125589. #endif
  125590. #ifdef WOLFSSL_KEIL
  125591. "adcs r5, r5, r7\n\t"
  125592. #elif defined(__clang__)
  125593. "adcs r5, r7\n\t"
  125594. #else
  125595. "adc r5, r7\n\t"
  125596. #endif
  125597. #ifdef WOLFSSL_KEIL
  125598. "adcs r3, r3, %[r]\n\t"
  125599. #elif defined(__clang__)
  125600. "adcs r3, %[r]\n\t"
  125601. #else
  125602. "adc r3, %[r]\n\t"
  125603. #endif
  125604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125605. "lsrs r6, %[a], #16\n\t"
  125606. #else
  125607. "lsr r6, %[a], #16\n\t"
  125608. #endif
  125609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125610. "lsrs r7, %[b], #16\n\t"
  125611. #else
  125612. "lsr r7, %[b], #16\n\t"
  125613. #endif
  125614. #ifdef WOLFSSL_KEIL
  125615. "muls r7, r6, r7\n\t"
  125616. #elif defined(__clang__)
  125617. "muls r7, r6\n\t"
  125618. #else
  125619. "mul r7, r6\n\t"
  125620. #endif
  125621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125622. "adds r5, r5, r7\n\t"
  125623. #else
  125624. "add r5, r5, r7\n\t"
  125625. #endif
  125626. #ifdef WOLFSSL_KEIL
  125627. "adcs r3, r3, %[r]\n\t"
  125628. #elif defined(__clang__)
  125629. "adcs r3, %[r]\n\t"
  125630. #else
  125631. "adc r3, %[r]\n\t"
  125632. #endif
  125633. "uxth r7, %[b]\n\t"
  125634. #ifdef WOLFSSL_KEIL
  125635. "muls r6, r7, r6\n\t"
  125636. #elif defined(__clang__)
  125637. "muls r6, r7\n\t"
  125638. #else
  125639. "mul r6, r7\n\t"
  125640. #endif
  125641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125642. "lsrs r7, r6, #16\n\t"
  125643. #else
  125644. "lsr r7, r6, #16\n\t"
  125645. #endif
  125646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125647. "lsls r6, r6, #16\n\t"
  125648. #else
  125649. "lsl r6, r6, #16\n\t"
  125650. #endif
  125651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125652. "adds r4, r4, r6\n\t"
  125653. #else
  125654. "add r4, r4, r6\n\t"
  125655. #endif
  125656. #ifdef WOLFSSL_KEIL
  125657. "adcs r5, r5, r7\n\t"
  125658. #elif defined(__clang__)
  125659. "adcs r5, r7\n\t"
  125660. #else
  125661. "adc r5, r7\n\t"
  125662. #endif
  125663. #ifdef WOLFSSL_KEIL
  125664. "adcs r3, r3, %[r]\n\t"
  125665. #elif defined(__clang__)
  125666. "adcs r3, %[r]\n\t"
  125667. #else
  125668. "adc r3, %[r]\n\t"
  125669. #endif
  125670. "# A[0] * B[10]\n\t"
  125671. "mov %[a], r9\n\t"
  125672. "mov %[b], r10\n\t"
  125673. "ldr %[a], [%[a]]\n\t"
  125674. "ldr %[b], [%[b], #40]\n\t"
  125675. "uxth r6, %[a]\n\t"
  125676. "uxth r7, %[b]\n\t"
  125677. #ifdef WOLFSSL_KEIL
  125678. "muls r7, r6, r7\n\t"
  125679. #elif defined(__clang__)
  125680. "muls r7, r6\n\t"
  125681. #else
  125682. "mul r7, r6\n\t"
  125683. #endif
  125684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125685. "adds r4, r4, r7\n\t"
  125686. #else
  125687. "add r4, r4, r7\n\t"
  125688. #endif
  125689. #ifdef WOLFSSL_KEIL
  125690. "adcs r5, r5, %[r]\n\t"
  125691. #elif defined(__clang__)
  125692. "adcs r5, %[r]\n\t"
  125693. #else
  125694. "adc r5, %[r]\n\t"
  125695. #endif
  125696. #ifdef WOLFSSL_KEIL
  125697. "adcs r3, r3, %[r]\n\t"
  125698. #elif defined(__clang__)
  125699. "adcs r3, %[r]\n\t"
  125700. #else
  125701. "adc r3, %[r]\n\t"
  125702. #endif
  125703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125704. "lsrs r7, %[b], #16\n\t"
  125705. #else
  125706. "lsr r7, %[b], #16\n\t"
  125707. #endif
  125708. #ifdef WOLFSSL_KEIL
  125709. "muls r6, r7, r6\n\t"
  125710. #elif defined(__clang__)
  125711. "muls r6, r7\n\t"
  125712. #else
  125713. "mul r6, r7\n\t"
  125714. #endif
  125715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125716. "lsrs r7, r6, #16\n\t"
  125717. #else
  125718. "lsr r7, r6, #16\n\t"
  125719. #endif
  125720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125721. "lsls r6, r6, #16\n\t"
  125722. #else
  125723. "lsl r6, r6, #16\n\t"
  125724. #endif
  125725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125726. "adds r4, r4, r6\n\t"
  125727. #else
  125728. "add r4, r4, r6\n\t"
  125729. #endif
  125730. #ifdef WOLFSSL_KEIL
  125731. "adcs r5, r5, r7\n\t"
  125732. #elif defined(__clang__)
  125733. "adcs r5, r7\n\t"
  125734. #else
  125735. "adc r5, r7\n\t"
  125736. #endif
  125737. #ifdef WOLFSSL_KEIL
  125738. "adcs r3, r3, %[r]\n\t"
  125739. #elif defined(__clang__)
  125740. "adcs r3, %[r]\n\t"
  125741. #else
  125742. "adc r3, %[r]\n\t"
  125743. #endif
  125744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125745. "lsrs r6, %[a], #16\n\t"
  125746. #else
  125747. "lsr r6, %[a], #16\n\t"
  125748. #endif
  125749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125750. "lsrs r7, %[b], #16\n\t"
  125751. #else
  125752. "lsr r7, %[b], #16\n\t"
  125753. #endif
  125754. #ifdef WOLFSSL_KEIL
  125755. "muls r7, r6, r7\n\t"
  125756. #elif defined(__clang__)
  125757. "muls r7, r6\n\t"
  125758. #else
  125759. "mul r7, r6\n\t"
  125760. #endif
  125761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125762. "adds r5, r5, r7\n\t"
  125763. #else
  125764. "add r5, r5, r7\n\t"
  125765. #endif
  125766. #ifdef WOLFSSL_KEIL
  125767. "adcs r3, r3, %[r]\n\t"
  125768. #elif defined(__clang__)
  125769. "adcs r3, %[r]\n\t"
  125770. #else
  125771. "adc r3, %[r]\n\t"
  125772. #endif
  125773. "uxth r7, %[b]\n\t"
  125774. #ifdef WOLFSSL_KEIL
  125775. "muls r6, r7, r6\n\t"
  125776. #elif defined(__clang__)
  125777. "muls r6, r7\n\t"
  125778. #else
  125779. "mul r6, r7\n\t"
  125780. #endif
  125781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125782. "lsrs r7, r6, #16\n\t"
  125783. #else
  125784. "lsr r7, r6, #16\n\t"
  125785. #endif
  125786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125787. "lsls r6, r6, #16\n\t"
  125788. #else
  125789. "lsl r6, r6, #16\n\t"
  125790. #endif
  125791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125792. "adds r4, r4, r6\n\t"
  125793. #else
  125794. "add r4, r4, r6\n\t"
  125795. #endif
  125796. #ifdef WOLFSSL_KEIL
  125797. "adcs r5, r5, r7\n\t"
  125798. #elif defined(__clang__)
  125799. "adcs r5, r7\n\t"
  125800. #else
  125801. "adc r5, r7\n\t"
  125802. #endif
  125803. #ifdef WOLFSSL_KEIL
  125804. "adcs r3, r3, %[r]\n\t"
  125805. #elif defined(__clang__)
  125806. "adcs r3, %[r]\n\t"
  125807. #else
  125808. "adc r3, %[r]\n\t"
  125809. #endif
  125810. "str r4, [sp, #40]\n\t"
  125811. "# A[0] * B[11]\n\t"
  125812. "movs r4, #0\n\t"
  125813. "mov %[a], r9\n\t"
  125814. "mov %[b], r10\n\t"
  125815. "ldr %[a], [%[a]]\n\t"
  125816. "ldr %[b], [%[b], #44]\n\t"
  125817. "uxth r6, %[a]\n\t"
  125818. "uxth r7, %[b]\n\t"
  125819. #ifdef WOLFSSL_KEIL
  125820. "muls r7, r6, r7\n\t"
  125821. #elif defined(__clang__)
  125822. "muls r7, r6\n\t"
  125823. #else
  125824. "mul r7, r6\n\t"
  125825. #endif
  125826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125827. "adds r5, r5, r7\n\t"
  125828. #else
  125829. "add r5, r5, r7\n\t"
  125830. #endif
  125831. #ifdef WOLFSSL_KEIL
  125832. "adcs r3, r3, %[r]\n\t"
  125833. #elif defined(__clang__)
  125834. "adcs r3, %[r]\n\t"
  125835. #else
  125836. "adc r3, %[r]\n\t"
  125837. #endif
  125838. #ifdef WOLFSSL_KEIL
  125839. "adcs r4, r4, %[r]\n\t"
  125840. #elif defined(__clang__)
  125841. "adcs r4, %[r]\n\t"
  125842. #else
  125843. "adc r4, %[r]\n\t"
  125844. #endif
  125845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125846. "lsrs r7, %[b], #16\n\t"
  125847. #else
  125848. "lsr r7, %[b], #16\n\t"
  125849. #endif
  125850. #ifdef WOLFSSL_KEIL
  125851. "muls r6, r7, r6\n\t"
  125852. #elif defined(__clang__)
  125853. "muls r6, r7\n\t"
  125854. #else
  125855. "mul r6, r7\n\t"
  125856. #endif
  125857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125858. "lsrs r7, r6, #16\n\t"
  125859. #else
  125860. "lsr r7, r6, #16\n\t"
  125861. #endif
  125862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125863. "lsls r6, r6, #16\n\t"
  125864. #else
  125865. "lsl r6, r6, #16\n\t"
  125866. #endif
  125867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125868. "adds r5, r5, r6\n\t"
  125869. #else
  125870. "add r5, r5, r6\n\t"
  125871. #endif
  125872. #ifdef WOLFSSL_KEIL
  125873. "adcs r3, r3, r7\n\t"
  125874. #elif defined(__clang__)
  125875. "adcs r3, r7\n\t"
  125876. #else
  125877. "adc r3, r7\n\t"
  125878. #endif
  125879. #ifdef WOLFSSL_KEIL
  125880. "adcs r4, r4, %[r]\n\t"
  125881. #elif defined(__clang__)
  125882. "adcs r4, %[r]\n\t"
  125883. #else
  125884. "adc r4, %[r]\n\t"
  125885. #endif
  125886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125887. "lsrs r6, %[a], #16\n\t"
  125888. #else
  125889. "lsr r6, %[a], #16\n\t"
  125890. #endif
  125891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125892. "lsrs r7, %[b], #16\n\t"
  125893. #else
  125894. "lsr r7, %[b], #16\n\t"
  125895. #endif
  125896. #ifdef WOLFSSL_KEIL
  125897. "muls r7, r6, r7\n\t"
  125898. #elif defined(__clang__)
  125899. "muls r7, r6\n\t"
  125900. #else
  125901. "mul r7, r6\n\t"
  125902. #endif
  125903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125904. "adds r3, r3, r7\n\t"
  125905. #else
  125906. "add r3, r3, r7\n\t"
  125907. #endif
  125908. #ifdef WOLFSSL_KEIL
  125909. "adcs r4, r4, %[r]\n\t"
  125910. #elif defined(__clang__)
  125911. "adcs r4, %[r]\n\t"
  125912. #else
  125913. "adc r4, %[r]\n\t"
  125914. #endif
  125915. "uxth r7, %[b]\n\t"
  125916. #ifdef WOLFSSL_KEIL
  125917. "muls r6, r7, r6\n\t"
  125918. #elif defined(__clang__)
  125919. "muls r6, r7\n\t"
  125920. #else
  125921. "mul r6, r7\n\t"
  125922. #endif
  125923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125924. "lsrs r7, r6, #16\n\t"
  125925. #else
  125926. "lsr r7, r6, #16\n\t"
  125927. #endif
  125928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125929. "lsls r6, r6, #16\n\t"
  125930. #else
  125931. "lsl r6, r6, #16\n\t"
  125932. #endif
  125933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125934. "adds r5, r5, r6\n\t"
  125935. #else
  125936. "add r5, r5, r6\n\t"
  125937. #endif
  125938. #ifdef WOLFSSL_KEIL
  125939. "adcs r3, r3, r7\n\t"
  125940. #elif defined(__clang__)
  125941. "adcs r3, r7\n\t"
  125942. #else
  125943. "adc r3, r7\n\t"
  125944. #endif
  125945. #ifdef WOLFSSL_KEIL
  125946. "adcs r4, r4, %[r]\n\t"
  125947. #elif defined(__clang__)
  125948. "adcs r4, %[r]\n\t"
  125949. #else
  125950. "adc r4, %[r]\n\t"
  125951. #endif
  125952. "# A[1] * B[10]\n\t"
  125953. "mov %[a], r9\n\t"
  125954. "mov %[b], r10\n\t"
  125955. "ldr %[a], [%[a], #4]\n\t"
  125956. "ldr %[b], [%[b], #40]\n\t"
  125957. "uxth r6, %[a]\n\t"
  125958. "uxth r7, %[b]\n\t"
  125959. #ifdef WOLFSSL_KEIL
  125960. "muls r7, r6, r7\n\t"
  125961. #elif defined(__clang__)
  125962. "muls r7, r6\n\t"
  125963. #else
  125964. "mul r7, r6\n\t"
  125965. #endif
  125966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125967. "adds r5, r5, r7\n\t"
  125968. #else
  125969. "add r5, r5, r7\n\t"
  125970. #endif
  125971. #ifdef WOLFSSL_KEIL
  125972. "adcs r3, r3, %[r]\n\t"
  125973. #elif defined(__clang__)
  125974. "adcs r3, %[r]\n\t"
  125975. #else
  125976. "adc r3, %[r]\n\t"
  125977. #endif
  125978. #ifdef WOLFSSL_KEIL
  125979. "adcs r4, r4, %[r]\n\t"
  125980. #elif defined(__clang__)
  125981. "adcs r4, %[r]\n\t"
  125982. #else
  125983. "adc r4, %[r]\n\t"
  125984. #endif
  125985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125986. "lsrs r7, %[b], #16\n\t"
  125987. #else
  125988. "lsr r7, %[b], #16\n\t"
  125989. #endif
  125990. #ifdef WOLFSSL_KEIL
  125991. "muls r6, r7, r6\n\t"
  125992. #elif defined(__clang__)
  125993. "muls r6, r7\n\t"
  125994. #else
  125995. "mul r6, r7\n\t"
  125996. #endif
  125997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  125998. "lsrs r7, r6, #16\n\t"
  125999. #else
  126000. "lsr r7, r6, #16\n\t"
  126001. #endif
  126002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126003. "lsls r6, r6, #16\n\t"
  126004. #else
  126005. "lsl r6, r6, #16\n\t"
  126006. #endif
  126007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126008. "adds r5, r5, r6\n\t"
  126009. #else
  126010. "add r5, r5, r6\n\t"
  126011. #endif
  126012. #ifdef WOLFSSL_KEIL
  126013. "adcs r3, r3, r7\n\t"
  126014. #elif defined(__clang__)
  126015. "adcs r3, r7\n\t"
  126016. #else
  126017. "adc r3, r7\n\t"
  126018. #endif
  126019. #ifdef WOLFSSL_KEIL
  126020. "adcs r4, r4, %[r]\n\t"
  126021. #elif defined(__clang__)
  126022. "adcs r4, %[r]\n\t"
  126023. #else
  126024. "adc r4, %[r]\n\t"
  126025. #endif
  126026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126027. "lsrs r6, %[a], #16\n\t"
  126028. #else
  126029. "lsr r6, %[a], #16\n\t"
  126030. #endif
  126031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126032. "lsrs r7, %[b], #16\n\t"
  126033. #else
  126034. "lsr r7, %[b], #16\n\t"
  126035. #endif
  126036. #ifdef WOLFSSL_KEIL
  126037. "muls r7, r6, r7\n\t"
  126038. #elif defined(__clang__)
  126039. "muls r7, r6\n\t"
  126040. #else
  126041. "mul r7, r6\n\t"
  126042. #endif
  126043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126044. "adds r3, r3, r7\n\t"
  126045. #else
  126046. "add r3, r3, r7\n\t"
  126047. #endif
  126048. #ifdef WOLFSSL_KEIL
  126049. "adcs r4, r4, %[r]\n\t"
  126050. #elif defined(__clang__)
  126051. "adcs r4, %[r]\n\t"
  126052. #else
  126053. "adc r4, %[r]\n\t"
  126054. #endif
  126055. "uxth r7, %[b]\n\t"
  126056. #ifdef WOLFSSL_KEIL
  126057. "muls r6, r7, r6\n\t"
  126058. #elif defined(__clang__)
  126059. "muls r6, r7\n\t"
  126060. #else
  126061. "mul r6, r7\n\t"
  126062. #endif
  126063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126064. "lsrs r7, r6, #16\n\t"
  126065. #else
  126066. "lsr r7, r6, #16\n\t"
  126067. #endif
  126068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126069. "lsls r6, r6, #16\n\t"
  126070. #else
  126071. "lsl r6, r6, #16\n\t"
  126072. #endif
  126073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126074. "adds r5, r5, r6\n\t"
  126075. #else
  126076. "add r5, r5, r6\n\t"
  126077. #endif
  126078. #ifdef WOLFSSL_KEIL
  126079. "adcs r3, r3, r7\n\t"
  126080. #elif defined(__clang__)
  126081. "adcs r3, r7\n\t"
  126082. #else
  126083. "adc r3, r7\n\t"
  126084. #endif
  126085. #ifdef WOLFSSL_KEIL
  126086. "adcs r4, r4, %[r]\n\t"
  126087. #elif defined(__clang__)
  126088. "adcs r4, %[r]\n\t"
  126089. #else
  126090. "adc r4, %[r]\n\t"
  126091. #endif
  126092. "# A[2] * B[9]\n\t"
  126093. "mov %[a], r9\n\t"
  126094. "mov %[b], r10\n\t"
  126095. "ldr %[a], [%[a], #8]\n\t"
  126096. "ldr %[b], [%[b], #36]\n\t"
  126097. "uxth r6, %[a]\n\t"
  126098. "uxth r7, %[b]\n\t"
  126099. #ifdef WOLFSSL_KEIL
  126100. "muls r7, r6, r7\n\t"
  126101. #elif defined(__clang__)
  126102. "muls r7, r6\n\t"
  126103. #else
  126104. "mul r7, r6\n\t"
  126105. #endif
  126106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126107. "adds r5, r5, r7\n\t"
  126108. #else
  126109. "add r5, r5, r7\n\t"
  126110. #endif
  126111. #ifdef WOLFSSL_KEIL
  126112. "adcs r3, r3, %[r]\n\t"
  126113. #elif defined(__clang__)
  126114. "adcs r3, %[r]\n\t"
  126115. #else
  126116. "adc r3, %[r]\n\t"
  126117. #endif
  126118. #ifdef WOLFSSL_KEIL
  126119. "adcs r4, r4, %[r]\n\t"
  126120. #elif defined(__clang__)
  126121. "adcs r4, %[r]\n\t"
  126122. #else
  126123. "adc r4, %[r]\n\t"
  126124. #endif
  126125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126126. "lsrs r7, %[b], #16\n\t"
  126127. #else
  126128. "lsr r7, %[b], #16\n\t"
  126129. #endif
  126130. #ifdef WOLFSSL_KEIL
  126131. "muls r6, r7, r6\n\t"
  126132. #elif defined(__clang__)
  126133. "muls r6, r7\n\t"
  126134. #else
  126135. "mul r6, r7\n\t"
  126136. #endif
  126137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126138. "lsrs r7, r6, #16\n\t"
  126139. #else
  126140. "lsr r7, r6, #16\n\t"
  126141. #endif
  126142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126143. "lsls r6, r6, #16\n\t"
  126144. #else
  126145. "lsl r6, r6, #16\n\t"
  126146. #endif
  126147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126148. "adds r5, r5, r6\n\t"
  126149. #else
  126150. "add r5, r5, r6\n\t"
  126151. #endif
  126152. #ifdef WOLFSSL_KEIL
  126153. "adcs r3, r3, r7\n\t"
  126154. #elif defined(__clang__)
  126155. "adcs r3, r7\n\t"
  126156. #else
  126157. "adc r3, r7\n\t"
  126158. #endif
  126159. #ifdef WOLFSSL_KEIL
  126160. "adcs r4, r4, %[r]\n\t"
  126161. #elif defined(__clang__)
  126162. "adcs r4, %[r]\n\t"
  126163. #else
  126164. "adc r4, %[r]\n\t"
  126165. #endif
  126166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126167. "lsrs r6, %[a], #16\n\t"
  126168. #else
  126169. "lsr r6, %[a], #16\n\t"
  126170. #endif
  126171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126172. "lsrs r7, %[b], #16\n\t"
  126173. #else
  126174. "lsr r7, %[b], #16\n\t"
  126175. #endif
  126176. #ifdef WOLFSSL_KEIL
  126177. "muls r7, r6, r7\n\t"
  126178. #elif defined(__clang__)
  126179. "muls r7, r6\n\t"
  126180. #else
  126181. "mul r7, r6\n\t"
  126182. #endif
  126183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126184. "adds r3, r3, r7\n\t"
  126185. #else
  126186. "add r3, r3, r7\n\t"
  126187. #endif
  126188. #ifdef WOLFSSL_KEIL
  126189. "adcs r4, r4, %[r]\n\t"
  126190. #elif defined(__clang__)
  126191. "adcs r4, %[r]\n\t"
  126192. #else
  126193. "adc r4, %[r]\n\t"
  126194. #endif
  126195. "uxth r7, %[b]\n\t"
  126196. #ifdef WOLFSSL_KEIL
  126197. "muls r6, r7, r6\n\t"
  126198. #elif defined(__clang__)
  126199. "muls r6, r7\n\t"
  126200. #else
  126201. "mul r6, r7\n\t"
  126202. #endif
  126203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126204. "lsrs r7, r6, #16\n\t"
  126205. #else
  126206. "lsr r7, r6, #16\n\t"
  126207. #endif
  126208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126209. "lsls r6, r6, #16\n\t"
  126210. #else
  126211. "lsl r6, r6, #16\n\t"
  126212. #endif
  126213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126214. "adds r5, r5, r6\n\t"
  126215. #else
  126216. "add r5, r5, r6\n\t"
  126217. #endif
  126218. #ifdef WOLFSSL_KEIL
  126219. "adcs r3, r3, r7\n\t"
  126220. #elif defined(__clang__)
  126221. "adcs r3, r7\n\t"
  126222. #else
  126223. "adc r3, r7\n\t"
  126224. #endif
  126225. #ifdef WOLFSSL_KEIL
  126226. "adcs r4, r4, %[r]\n\t"
  126227. #elif defined(__clang__)
  126228. "adcs r4, %[r]\n\t"
  126229. #else
  126230. "adc r4, %[r]\n\t"
  126231. #endif
  126232. "# A[3] * B[8]\n\t"
  126233. "mov %[a], r9\n\t"
  126234. "mov %[b], r10\n\t"
  126235. "ldr %[a], [%[a], #12]\n\t"
  126236. "ldr %[b], [%[b], #32]\n\t"
  126237. "uxth r6, %[a]\n\t"
  126238. "uxth r7, %[b]\n\t"
  126239. #ifdef WOLFSSL_KEIL
  126240. "muls r7, r6, r7\n\t"
  126241. #elif defined(__clang__)
  126242. "muls r7, r6\n\t"
  126243. #else
  126244. "mul r7, r6\n\t"
  126245. #endif
  126246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126247. "adds r5, r5, r7\n\t"
  126248. #else
  126249. "add r5, r5, r7\n\t"
  126250. #endif
  126251. #ifdef WOLFSSL_KEIL
  126252. "adcs r3, r3, %[r]\n\t"
  126253. #elif defined(__clang__)
  126254. "adcs r3, %[r]\n\t"
  126255. #else
  126256. "adc r3, %[r]\n\t"
  126257. #endif
  126258. #ifdef WOLFSSL_KEIL
  126259. "adcs r4, r4, %[r]\n\t"
  126260. #elif defined(__clang__)
  126261. "adcs r4, %[r]\n\t"
  126262. #else
  126263. "adc r4, %[r]\n\t"
  126264. #endif
  126265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126266. "lsrs r7, %[b], #16\n\t"
  126267. #else
  126268. "lsr r7, %[b], #16\n\t"
  126269. #endif
  126270. #ifdef WOLFSSL_KEIL
  126271. "muls r6, r7, r6\n\t"
  126272. #elif defined(__clang__)
  126273. "muls r6, r7\n\t"
  126274. #else
  126275. "mul r6, r7\n\t"
  126276. #endif
  126277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126278. "lsrs r7, r6, #16\n\t"
  126279. #else
  126280. "lsr r7, r6, #16\n\t"
  126281. #endif
  126282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126283. "lsls r6, r6, #16\n\t"
  126284. #else
  126285. "lsl r6, r6, #16\n\t"
  126286. #endif
  126287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126288. "adds r5, r5, r6\n\t"
  126289. #else
  126290. "add r5, r5, r6\n\t"
  126291. #endif
  126292. #ifdef WOLFSSL_KEIL
  126293. "adcs r3, r3, r7\n\t"
  126294. #elif defined(__clang__)
  126295. "adcs r3, r7\n\t"
  126296. #else
  126297. "adc r3, r7\n\t"
  126298. #endif
  126299. #ifdef WOLFSSL_KEIL
  126300. "adcs r4, r4, %[r]\n\t"
  126301. #elif defined(__clang__)
  126302. "adcs r4, %[r]\n\t"
  126303. #else
  126304. "adc r4, %[r]\n\t"
  126305. #endif
  126306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126307. "lsrs r6, %[a], #16\n\t"
  126308. #else
  126309. "lsr r6, %[a], #16\n\t"
  126310. #endif
  126311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126312. "lsrs r7, %[b], #16\n\t"
  126313. #else
  126314. "lsr r7, %[b], #16\n\t"
  126315. #endif
  126316. #ifdef WOLFSSL_KEIL
  126317. "muls r7, r6, r7\n\t"
  126318. #elif defined(__clang__)
  126319. "muls r7, r6\n\t"
  126320. #else
  126321. "mul r7, r6\n\t"
  126322. #endif
  126323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126324. "adds r3, r3, r7\n\t"
  126325. #else
  126326. "add r3, r3, r7\n\t"
  126327. #endif
  126328. #ifdef WOLFSSL_KEIL
  126329. "adcs r4, r4, %[r]\n\t"
  126330. #elif defined(__clang__)
  126331. "adcs r4, %[r]\n\t"
  126332. #else
  126333. "adc r4, %[r]\n\t"
  126334. #endif
  126335. "uxth r7, %[b]\n\t"
  126336. #ifdef WOLFSSL_KEIL
  126337. "muls r6, r7, r6\n\t"
  126338. #elif defined(__clang__)
  126339. "muls r6, r7\n\t"
  126340. #else
  126341. "mul r6, r7\n\t"
  126342. #endif
  126343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126344. "lsrs r7, r6, #16\n\t"
  126345. #else
  126346. "lsr r7, r6, #16\n\t"
  126347. #endif
  126348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126349. "lsls r6, r6, #16\n\t"
  126350. #else
  126351. "lsl r6, r6, #16\n\t"
  126352. #endif
  126353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126354. "adds r5, r5, r6\n\t"
  126355. #else
  126356. "add r5, r5, r6\n\t"
  126357. #endif
  126358. #ifdef WOLFSSL_KEIL
  126359. "adcs r3, r3, r7\n\t"
  126360. #elif defined(__clang__)
  126361. "adcs r3, r7\n\t"
  126362. #else
  126363. "adc r3, r7\n\t"
  126364. #endif
  126365. #ifdef WOLFSSL_KEIL
  126366. "adcs r4, r4, %[r]\n\t"
  126367. #elif defined(__clang__)
  126368. "adcs r4, %[r]\n\t"
  126369. #else
  126370. "adc r4, %[r]\n\t"
  126371. #endif
  126372. "# A[4] * B[7]\n\t"
  126373. "mov %[a], r9\n\t"
  126374. "mov %[b], r10\n\t"
  126375. "ldr %[a], [%[a], #16]\n\t"
  126376. "ldr %[b], [%[b], #28]\n\t"
  126377. "uxth r6, %[a]\n\t"
  126378. "uxth r7, %[b]\n\t"
  126379. #ifdef WOLFSSL_KEIL
  126380. "muls r7, r6, r7\n\t"
  126381. #elif defined(__clang__)
  126382. "muls r7, r6\n\t"
  126383. #else
  126384. "mul r7, r6\n\t"
  126385. #endif
  126386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126387. "adds r5, r5, r7\n\t"
  126388. #else
  126389. "add r5, r5, r7\n\t"
  126390. #endif
  126391. #ifdef WOLFSSL_KEIL
  126392. "adcs r3, r3, %[r]\n\t"
  126393. #elif defined(__clang__)
  126394. "adcs r3, %[r]\n\t"
  126395. #else
  126396. "adc r3, %[r]\n\t"
  126397. #endif
  126398. #ifdef WOLFSSL_KEIL
  126399. "adcs r4, r4, %[r]\n\t"
  126400. #elif defined(__clang__)
  126401. "adcs r4, %[r]\n\t"
  126402. #else
  126403. "adc r4, %[r]\n\t"
  126404. #endif
  126405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126406. "lsrs r7, %[b], #16\n\t"
  126407. #else
  126408. "lsr r7, %[b], #16\n\t"
  126409. #endif
  126410. #ifdef WOLFSSL_KEIL
  126411. "muls r6, r7, r6\n\t"
  126412. #elif defined(__clang__)
  126413. "muls r6, r7\n\t"
  126414. #else
  126415. "mul r6, r7\n\t"
  126416. #endif
  126417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126418. "lsrs r7, r6, #16\n\t"
  126419. #else
  126420. "lsr r7, r6, #16\n\t"
  126421. #endif
  126422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126423. "lsls r6, r6, #16\n\t"
  126424. #else
  126425. "lsl r6, r6, #16\n\t"
  126426. #endif
  126427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126428. "adds r5, r5, r6\n\t"
  126429. #else
  126430. "add r5, r5, r6\n\t"
  126431. #endif
  126432. #ifdef WOLFSSL_KEIL
  126433. "adcs r3, r3, r7\n\t"
  126434. #elif defined(__clang__)
  126435. "adcs r3, r7\n\t"
  126436. #else
  126437. "adc r3, r7\n\t"
  126438. #endif
  126439. #ifdef WOLFSSL_KEIL
  126440. "adcs r4, r4, %[r]\n\t"
  126441. #elif defined(__clang__)
  126442. "adcs r4, %[r]\n\t"
  126443. #else
  126444. "adc r4, %[r]\n\t"
  126445. #endif
  126446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126447. "lsrs r6, %[a], #16\n\t"
  126448. #else
  126449. "lsr r6, %[a], #16\n\t"
  126450. #endif
  126451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126452. "lsrs r7, %[b], #16\n\t"
  126453. #else
  126454. "lsr r7, %[b], #16\n\t"
  126455. #endif
  126456. #ifdef WOLFSSL_KEIL
  126457. "muls r7, r6, r7\n\t"
  126458. #elif defined(__clang__)
  126459. "muls r7, r6\n\t"
  126460. #else
  126461. "mul r7, r6\n\t"
  126462. #endif
  126463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126464. "adds r3, r3, r7\n\t"
  126465. #else
  126466. "add r3, r3, r7\n\t"
  126467. #endif
  126468. #ifdef WOLFSSL_KEIL
  126469. "adcs r4, r4, %[r]\n\t"
  126470. #elif defined(__clang__)
  126471. "adcs r4, %[r]\n\t"
  126472. #else
  126473. "adc r4, %[r]\n\t"
  126474. #endif
  126475. "uxth r7, %[b]\n\t"
  126476. #ifdef WOLFSSL_KEIL
  126477. "muls r6, r7, r6\n\t"
  126478. #elif defined(__clang__)
  126479. "muls r6, r7\n\t"
  126480. #else
  126481. "mul r6, r7\n\t"
  126482. #endif
  126483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126484. "lsrs r7, r6, #16\n\t"
  126485. #else
  126486. "lsr r7, r6, #16\n\t"
  126487. #endif
  126488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126489. "lsls r6, r6, #16\n\t"
  126490. #else
  126491. "lsl r6, r6, #16\n\t"
  126492. #endif
  126493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126494. "adds r5, r5, r6\n\t"
  126495. #else
  126496. "add r5, r5, r6\n\t"
  126497. #endif
  126498. #ifdef WOLFSSL_KEIL
  126499. "adcs r3, r3, r7\n\t"
  126500. #elif defined(__clang__)
  126501. "adcs r3, r7\n\t"
  126502. #else
  126503. "adc r3, r7\n\t"
  126504. #endif
  126505. #ifdef WOLFSSL_KEIL
  126506. "adcs r4, r4, %[r]\n\t"
  126507. #elif defined(__clang__)
  126508. "adcs r4, %[r]\n\t"
  126509. #else
  126510. "adc r4, %[r]\n\t"
  126511. #endif
  126512. "# A[5] * B[6]\n\t"
  126513. "mov %[a], r9\n\t"
  126514. "mov %[b], r10\n\t"
  126515. "ldr %[a], [%[a], #20]\n\t"
  126516. "ldr %[b], [%[b], #24]\n\t"
  126517. "uxth r6, %[a]\n\t"
  126518. "uxth r7, %[b]\n\t"
  126519. #ifdef WOLFSSL_KEIL
  126520. "muls r7, r6, r7\n\t"
  126521. #elif defined(__clang__)
  126522. "muls r7, r6\n\t"
  126523. #else
  126524. "mul r7, r6\n\t"
  126525. #endif
  126526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126527. "adds r5, r5, r7\n\t"
  126528. #else
  126529. "add r5, r5, r7\n\t"
  126530. #endif
  126531. #ifdef WOLFSSL_KEIL
  126532. "adcs r3, r3, %[r]\n\t"
  126533. #elif defined(__clang__)
  126534. "adcs r3, %[r]\n\t"
  126535. #else
  126536. "adc r3, %[r]\n\t"
  126537. #endif
  126538. #ifdef WOLFSSL_KEIL
  126539. "adcs r4, r4, %[r]\n\t"
  126540. #elif defined(__clang__)
  126541. "adcs r4, %[r]\n\t"
  126542. #else
  126543. "adc r4, %[r]\n\t"
  126544. #endif
  126545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126546. "lsrs r7, %[b], #16\n\t"
  126547. #else
  126548. "lsr r7, %[b], #16\n\t"
  126549. #endif
  126550. #ifdef WOLFSSL_KEIL
  126551. "muls r6, r7, r6\n\t"
  126552. #elif defined(__clang__)
  126553. "muls r6, r7\n\t"
  126554. #else
  126555. "mul r6, r7\n\t"
  126556. #endif
  126557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126558. "lsrs r7, r6, #16\n\t"
  126559. #else
  126560. "lsr r7, r6, #16\n\t"
  126561. #endif
  126562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126563. "lsls r6, r6, #16\n\t"
  126564. #else
  126565. "lsl r6, r6, #16\n\t"
  126566. #endif
  126567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126568. "adds r5, r5, r6\n\t"
  126569. #else
  126570. "add r5, r5, r6\n\t"
  126571. #endif
  126572. #ifdef WOLFSSL_KEIL
  126573. "adcs r3, r3, r7\n\t"
  126574. #elif defined(__clang__)
  126575. "adcs r3, r7\n\t"
  126576. #else
  126577. "adc r3, r7\n\t"
  126578. #endif
  126579. #ifdef WOLFSSL_KEIL
  126580. "adcs r4, r4, %[r]\n\t"
  126581. #elif defined(__clang__)
  126582. "adcs r4, %[r]\n\t"
  126583. #else
  126584. "adc r4, %[r]\n\t"
  126585. #endif
  126586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126587. "lsrs r6, %[a], #16\n\t"
  126588. #else
  126589. "lsr r6, %[a], #16\n\t"
  126590. #endif
  126591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126592. "lsrs r7, %[b], #16\n\t"
  126593. #else
  126594. "lsr r7, %[b], #16\n\t"
  126595. #endif
  126596. #ifdef WOLFSSL_KEIL
  126597. "muls r7, r6, r7\n\t"
  126598. #elif defined(__clang__)
  126599. "muls r7, r6\n\t"
  126600. #else
  126601. "mul r7, r6\n\t"
  126602. #endif
  126603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126604. "adds r3, r3, r7\n\t"
  126605. #else
  126606. "add r3, r3, r7\n\t"
  126607. #endif
  126608. #ifdef WOLFSSL_KEIL
  126609. "adcs r4, r4, %[r]\n\t"
  126610. #elif defined(__clang__)
  126611. "adcs r4, %[r]\n\t"
  126612. #else
  126613. "adc r4, %[r]\n\t"
  126614. #endif
  126615. "uxth r7, %[b]\n\t"
  126616. #ifdef WOLFSSL_KEIL
  126617. "muls r6, r7, r6\n\t"
  126618. #elif defined(__clang__)
  126619. "muls r6, r7\n\t"
  126620. #else
  126621. "mul r6, r7\n\t"
  126622. #endif
  126623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126624. "lsrs r7, r6, #16\n\t"
  126625. #else
  126626. "lsr r7, r6, #16\n\t"
  126627. #endif
  126628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126629. "lsls r6, r6, #16\n\t"
  126630. #else
  126631. "lsl r6, r6, #16\n\t"
  126632. #endif
  126633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126634. "adds r5, r5, r6\n\t"
  126635. #else
  126636. "add r5, r5, r6\n\t"
  126637. #endif
  126638. #ifdef WOLFSSL_KEIL
  126639. "adcs r3, r3, r7\n\t"
  126640. #elif defined(__clang__)
  126641. "adcs r3, r7\n\t"
  126642. #else
  126643. "adc r3, r7\n\t"
  126644. #endif
  126645. #ifdef WOLFSSL_KEIL
  126646. "adcs r4, r4, %[r]\n\t"
  126647. #elif defined(__clang__)
  126648. "adcs r4, %[r]\n\t"
  126649. #else
  126650. "adc r4, %[r]\n\t"
  126651. #endif
  126652. "# A[6] * B[5]\n\t"
  126653. "mov %[a], r9\n\t"
  126654. "mov %[b], r10\n\t"
  126655. "ldr %[a], [%[a], #24]\n\t"
  126656. "ldr %[b], [%[b], #20]\n\t"
  126657. "uxth r6, %[a]\n\t"
  126658. "uxth r7, %[b]\n\t"
  126659. #ifdef WOLFSSL_KEIL
  126660. "muls r7, r6, r7\n\t"
  126661. #elif defined(__clang__)
  126662. "muls r7, r6\n\t"
  126663. #else
  126664. "mul r7, r6\n\t"
  126665. #endif
  126666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126667. "adds r5, r5, r7\n\t"
  126668. #else
  126669. "add r5, r5, r7\n\t"
  126670. #endif
  126671. #ifdef WOLFSSL_KEIL
  126672. "adcs r3, r3, %[r]\n\t"
  126673. #elif defined(__clang__)
  126674. "adcs r3, %[r]\n\t"
  126675. #else
  126676. "adc r3, %[r]\n\t"
  126677. #endif
  126678. #ifdef WOLFSSL_KEIL
  126679. "adcs r4, r4, %[r]\n\t"
  126680. #elif defined(__clang__)
  126681. "adcs r4, %[r]\n\t"
  126682. #else
  126683. "adc r4, %[r]\n\t"
  126684. #endif
  126685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126686. "lsrs r7, %[b], #16\n\t"
  126687. #else
  126688. "lsr r7, %[b], #16\n\t"
  126689. #endif
  126690. #ifdef WOLFSSL_KEIL
  126691. "muls r6, r7, r6\n\t"
  126692. #elif defined(__clang__)
  126693. "muls r6, r7\n\t"
  126694. #else
  126695. "mul r6, r7\n\t"
  126696. #endif
  126697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126698. "lsrs r7, r6, #16\n\t"
  126699. #else
  126700. "lsr r7, r6, #16\n\t"
  126701. #endif
  126702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126703. "lsls r6, r6, #16\n\t"
  126704. #else
  126705. "lsl r6, r6, #16\n\t"
  126706. #endif
  126707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126708. "adds r5, r5, r6\n\t"
  126709. #else
  126710. "add r5, r5, r6\n\t"
  126711. #endif
  126712. #ifdef WOLFSSL_KEIL
  126713. "adcs r3, r3, r7\n\t"
  126714. #elif defined(__clang__)
  126715. "adcs r3, r7\n\t"
  126716. #else
  126717. "adc r3, r7\n\t"
  126718. #endif
  126719. #ifdef WOLFSSL_KEIL
  126720. "adcs r4, r4, %[r]\n\t"
  126721. #elif defined(__clang__)
  126722. "adcs r4, %[r]\n\t"
  126723. #else
  126724. "adc r4, %[r]\n\t"
  126725. #endif
  126726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126727. "lsrs r6, %[a], #16\n\t"
  126728. #else
  126729. "lsr r6, %[a], #16\n\t"
  126730. #endif
  126731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126732. "lsrs r7, %[b], #16\n\t"
  126733. #else
  126734. "lsr r7, %[b], #16\n\t"
  126735. #endif
  126736. #ifdef WOLFSSL_KEIL
  126737. "muls r7, r6, r7\n\t"
  126738. #elif defined(__clang__)
  126739. "muls r7, r6\n\t"
  126740. #else
  126741. "mul r7, r6\n\t"
  126742. #endif
  126743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126744. "adds r3, r3, r7\n\t"
  126745. #else
  126746. "add r3, r3, r7\n\t"
  126747. #endif
  126748. #ifdef WOLFSSL_KEIL
  126749. "adcs r4, r4, %[r]\n\t"
  126750. #elif defined(__clang__)
  126751. "adcs r4, %[r]\n\t"
  126752. #else
  126753. "adc r4, %[r]\n\t"
  126754. #endif
  126755. "uxth r7, %[b]\n\t"
  126756. #ifdef WOLFSSL_KEIL
  126757. "muls r6, r7, r6\n\t"
  126758. #elif defined(__clang__)
  126759. "muls r6, r7\n\t"
  126760. #else
  126761. "mul r6, r7\n\t"
  126762. #endif
  126763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126764. "lsrs r7, r6, #16\n\t"
  126765. #else
  126766. "lsr r7, r6, #16\n\t"
  126767. #endif
  126768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126769. "lsls r6, r6, #16\n\t"
  126770. #else
  126771. "lsl r6, r6, #16\n\t"
  126772. #endif
  126773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126774. "adds r5, r5, r6\n\t"
  126775. #else
  126776. "add r5, r5, r6\n\t"
  126777. #endif
  126778. #ifdef WOLFSSL_KEIL
  126779. "adcs r3, r3, r7\n\t"
  126780. #elif defined(__clang__)
  126781. "adcs r3, r7\n\t"
  126782. #else
  126783. "adc r3, r7\n\t"
  126784. #endif
  126785. #ifdef WOLFSSL_KEIL
  126786. "adcs r4, r4, %[r]\n\t"
  126787. #elif defined(__clang__)
  126788. "adcs r4, %[r]\n\t"
  126789. #else
  126790. "adc r4, %[r]\n\t"
  126791. #endif
  126792. "# A[7] * B[4]\n\t"
  126793. "mov %[a], r9\n\t"
  126794. "mov %[b], r10\n\t"
  126795. "ldr %[a], [%[a], #28]\n\t"
  126796. "ldr %[b], [%[b], #16]\n\t"
  126797. "uxth r6, %[a]\n\t"
  126798. "uxth r7, %[b]\n\t"
  126799. #ifdef WOLFSSL_KEIL
  126800. "muls r7, r6, r7\n\t"
  126801. #elif defined(__clang__)
  126802. "muls r7, r6\n\t"
  126803. #else
  126804. "mul r7, r6\n\t"
  126805. #endif
  126806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126807. "adds r5, r5, r7\n\t"
  126808. #else
  126809. "add r5, r5, r7\n\t"
  126810. #endif
  126811. #ifdef WOLFSSL_KEIL
  126812. "adcs r3, r3, %[r]\n\t"
  126813. #elif defined(__clang__)
  126814. "adcs r3, %[r]\n\t"
  126815. #else
  126816. "adc r3, %[r]\n\t"
  126817. #endif
  126818. #ifdef WOLFSSL_KEIL
  126819. "adcs r4, r4, %[r]\n\t"
  126820. #elif defined(__clang__)
  126821. "adcs r4, %[r]\n\t"
  126822. #else
  126823. "adc r4, %[r]\n\t"
  126824. #endif
  126825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126826. "lsrs r7, %[b], #16\n\t"
  126827. #else
  126828. "lsr r7, %[b], #16\n\t"
  126829. #endif
  126830. #ifdef WOLFSSL_KEIL
  126831. "muls r6, r7, r6\n\t"
  126832. #elif defined(__clang__)
  126833. "muls r6, r7\n\t"
  126834. #else
  126835. "mul r6, r7\n\t"
  126836. #endif
  126837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126838. "lsrs r7, r6, #16\n\t"
  126839. #else
  126840. "lsr r7, r6, #16\n\t"
  126841. #endif
  126842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126843. "lsls r6, r6, #16\n\t"
  126844. #else
  126845. "lsl r6, r6, #16\n\t"
  126846. #endif
  126847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126848. "adds r5, r5, r6\n\t"
  126849. #else
  126850. "add r5, r5, r6\n\t"
  126851. #endif
  126852. #ifdef WOLFSSL_KEIL
  126853. "adcs r3, r3, r7\n\t"
  126854. #elif defined(__clang__)
  126855. "adcs r3, r7\n\t"
  126856. #else
  126857. "adc r3, r7\n\t"
  126858. #endif
  126859. #ifdef WOLFSSL_KEIL
  126860. "adcs r4, r4, %[r]\n\t"
  126861. #elif defined(__clang__)
  126862. "adcs r4, %[r]\n\t"
  126863. #else
  126864. "adc r4, %[r]\n\t"
  126865. #endif
  126866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126867. "lsrs r6, %[a], #16\n\t"
  126868. #else
  126869. "lsr r6, %[a], #16\n\t"
  126870. #endif
  126871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126872. "lsrs r7, %[b], #16\n\t"
  126873. #else
  126874. "lsr r7, %[b], #16\n\t"
  126875. #endif
  126876. #ifdef WOLFSSL_KEIL
  126877. "muls r7, r6, r7\n\t"
  126878. #elif defined(__clang__)
  126879. "muls r7, r6\n\t"
  126880. #else
  126881. "mul r7, r6\n\t"
  126882. #endif
  126883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126884. "adds r3, r3, r7\n\t"
  126885. #else
  126886. "add r3, r3, r7\n\t"
  126887. #endif
  126888. #ifdef WOLFSSL_KEIL
  126889. "adcs r4, r4, %[r]\n\t"
  126890. #elif defined(__clang__)
  126891. "adcs r4, %[r]\n\t"
  126892. #else
  126893. "adc r4, %[r]\n\t"
  126894. #endif
  126895. "uxth r7, %[b]\n\t"
  126896. #ifdef WOLFSSL_KEIL
  126897. "muls r6, r7, r6\n\t"
  126898. #elif defined(__clang__)
  126899. "muls r6, r7\n\t"
  126900. #else
  126901. "mul r6, r7\n\t"
  126902. #endif
  126903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126904. "lsrs r7, r6, #16\n\t"
  126905. #else
  126906. "lsr r7, r6, #16\n\t"
  126907. #endif
  126908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126909. "lsls r6, r6, #16\n\t"
  126910. #else
  126911. "lsl r6, r6, #16\n\t"
  126912. #endif
  126913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126914. "adds r5, r5, r6\n\t"
  126915. #else
  126916. "add r5, r5, r6\n\t"
  126917. #endif
  126918. #ifdef WOLFSSL_KEIL
  126919. "adcs r3, r3, r7\n\t"
  126920. #elif defined(__clang__)
  126921. "adcs r3, r7\n\t"
  126922. #else
  126923. "adc r3, r7\n\t"
  126924. #endif
  126925. #ifdef WOLFSSL_KEIL
  126926. "adcs r4, r4, %[r]\n\t"
  126927. #elif defined(__clang__)
  126928. "adcs r4, %[r]\n\t"
  126929. #else
  126930. "adc r4, %[r]\n\t"
  126931. #endif
  126932. "# A[8] * B[3]\n\t"
  126933. "mov %[a], r9\n\t"
  126934. "mov %[b], r10\n\t"
  126935. "ldr %[a], [%[a], #32]\n\t"
  126936. "ldr %[b], [%[b], #12]\n\t"
  126937. "uxth r6, %[a]\n\t"
  126938. "uxth r7, %[b]\n\t"
  126939. #ifdef WOLFSSL_KEIL
  126940. "muls r7, r6, r7\n\t"
  126941. #elif defined(__clang__)
  126942. "muls r7, r6\n\t"
  126943. #else
  126944. "mul r7, r6\n\t"
  126945. #endif
  126946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126947. "adds r5, r5, r7\n\t"
  126948. #else
  126949. "add r5, r5, r7\n\t"
  126950. #endif
  126951. #ifdef WOLFSSL_KEIL
  126952. "adcs r3, r3, %[r]\n\t"
  126953. #elif defined(__clang__)
  126954. "adcs r3, %[r]\n\t"
  126955. #else
  126956. "adc r3, %[r]\n\t"
  126957. #endif
  126958. #ifdef WOLFSSL_KEIL
  126959. "adcs r4, r4, %[r]\n\t"
  126960. #elif defined(__clang__)
  126961. "adcs r4, %[r]\n\t"
  126962. #else
  126963. "adc r4, %[r]\n\t"
  126964. #endif
  126965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126966. "lsrs r7, %[b], #16\n\t"
  126967. #else
  126968. "lsr r7, %[b], #16\n\t"
  126969. #endif
  126970. #ifdef WOLFSSL_KEIL
  126971. "muls r6, r7, r6\n\t"
  126972. #elif defined(__clang__)
  126973. "muls r6, r7\n\t"
  126974. #else
  126975. "mul r6, r7\n\t"
  126976. #endif
  126977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126978. "lsrs r7, r6, #16\n\t"
  126979. #else
  126980. "lsr r7, r6, #16\n\t"
  126981. #endif
  126982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126983. "lsls r6, r6, #16\n\t"
  126984. #else
  126985. "lsl r6, r6, #16\n\t"
  126986. #endif
  126987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  126988. "adds r5, r5, r6\n\t"
  126989. #else
  126990. "add r5, r5, r6\n\t"
  126991. #endif
  126992. #ifdef WOLFSSL_KEIL
  126993. "adcs r3, r3, r7\n\t"
  126994. #elif defined(__clang__)
  126995. "adcs r3, r7\n\t"
  126996. #else
  126997. "adc r3, r7\n\t"
  126998. #endif
  126999. #ifdef WOLFSSL_KEIL
  127000. "adcs r4, r4, %[r]\n\t"
  127001. #elif defined(__clang__)
  127002. "adcs r4, %[r]\n\t"
  127003. #else
  127004. "adc r4, %[r]\n\t"
  127005. #endif
  127006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127007. "lsrs r6, %[a], #16\n\t"
  127008. #else
  127009. "lsr r6, %[a], #16\n\t"
  127010. #endif
  127011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127012. "lsrs r7, %[b], #16\n\t"
  127013. #else
  127014. "lsr r7, %[b], #16\n\t"
  127015. #endif
  127016. #ifdef WOLFSSL_KEIL
  127017. "muls r7, r6, r7\n\t"
  127018. #elif defined(__clang__)
  127019. "muls r7, r6\n\t"
  127020. #else
  127021. "mul r7, r6\n\t"
  127022. #endif
  127023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127024. "adds r3, r3, r7\n\t"
  127025. #else
  127026. "add r3, r3, r7\n\t"
  127027. #endif
  127028. #ifdef WOLFSSL_KEIL
  127029. "adcs r4, r4, %[r]\n\t"
  127030. #elif defined(__clang__)
  127031. "adcs r4, %[r]\n\t"
  127032. #else
  127033. "adc r4, %[r]\n\t"
  127034. #endif
  127035. "uxth r7, %[b]\n\t"
  127036. #ifdef WOLFSSL_KEIL
  127037. "muls r6, r7, r6\n\t"
  127038. #elif defined(__clang__)
  127039. "muls r6, r7\n\t"
  127040. #else
  127041. "mul r6, r7\n\t"
  127042. #endif
  127043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127044. "lsrs r7, r6, #16\n\t"
  127045. #else
  127046. "lsr r7, r6, #16\n\t"
  127047. #endif
  127048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127049. "lsls r6, r6, #16\n\t"
  127050. #else
  127051. "lsl r6, r6, #16\n\t"
  127052. #endif
  127053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127054. "adds r5, r5, r6\n\t"
  127055. #else
  127056. "add r5, r5, r6\n\t"
  127057. #endif
  127058. #ifdef WOLFSSL_KEIL
  127059. "adcs r3, r3, r7\n\t"
  127060. #elif defined(__clang__)
  127061. "adcs r3, r7\n\t"
  127062. #else
  127063. "adc r3, r7\n\t"
  127064. #endif
  127065. #ifdef WOLFSSL_KEIL
  127066. "adcs r4, r4, %[r]\n\t"
  127067. #elif defined(__clang__)
  127068. "adcs r4, %[r]\n\t"
  127069. #else
  127070. "adc r4, %[r]\n\t"
  127071. #endif
  127072. "# A[9] * B[2]\n\t"
  127073. "mov %[a], r9\n\t"
  127074. "mov %[b], r10\n\t"
  127075. "ldr %[a], [%[a], #36]\n\t"
  127076. "ldr %[b], [%[b], #8]\n\t"
  127077. "uxth r6, %[a]\n\t"
  127078. "uxth r7, %[b]\n\t"
  127079. #ifdef WOLFSSL_KEIL
  127080. "muls r7, r6, r7\n\t"
  127081. #elif defined(__clang__)
  127082. "muls r7, r6\n\t"
  127083. #else
  127084. "mul r7, r6\n\t"
  127085. #endif
  127086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127087. "adds r5, r5, r7\n\t"
  127088. #else
  127089. "add r5, r5, r7\n\t"
  127090. #endif
  127091. #ifdef WOLFSSL_KEIL
  127092. "adcs r3, r3, %[r]\n\t"
  127093. #elif defined(__clang__)
  127094. "adcs r3, %[r]\n\t"
  127095. #else
  127096. "adc r3, %[r]\n\t"
  127097. #endif
  127098. #ifdef WOLFSSL_KEIL
  127099. "adcs r4, r4, %[r]\n\t"
  127100. #elif defined(__clang__)
  127101. "adcs r4, %[r]\n\t"
  127102. #else
  127103. "adc r4, %[r]\n\t"
  127104. #endif
  127105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127106. "lsrs r7, %[b], #16\n\t"
  127107. #else
  127108. "lsr r7, %[b], #16\n\t"
  127109. #endif
  127110. #ifdef WOLFSSL_KEIL
  127111. "muls r6, r7, r6\n\t"
  127112. #elif defined(__clang__)
  127113. "muls r6, r7\n\t"
  127114. #else
  127115. "mul r6, r7\n\t"
  127116. #endif
  127117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127118. "lsrs r7, r6, #16\n\t"
  127119. #else
  127120. "lsr r7, r6, #16\n\t"
  127121. #endif
  127122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127123. "lsls r6, r6, #16\n\t"
  127124. #else
  127125. "lsl r6, r6, #16\n\t"
  127126. #endif
  127127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127128. "adds r5, r5, r6\n\t"
  127129. #else
  127130. "add r5, r5, r6\n\t"
  127131. #endif
  127132. #ifdef WOLFSSL_KEIL
  127133. "adcs r3, r3, r7\n\t"
  127134. #elif defined(__clang__)
  127135. "adcs r3, r7\n\t"
  127136. #else
  127137. "adc r3, r7\n\t"
  127138. #endif
  127139. #ifdef WOLFSSL_KEIL
  127140. "adcs r4, r4, %[r]\n\t"
  127141. #elif defined(__clang__)
  127142. "adcs r4, %[r]\n\t"
  127143. #else
  127144. "adc r4, %[r]\n\t"
  127145. #endif
  127146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127147. "lsrs r6, %[a], #16\n\t"
  127148. #else
  127149. "lsr r6, %[a], #16\n\t"
  127150. #endif
  127151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127152. "lsrs r7, %[b], #16\n\t"
  127153. #else
  127154. "lsr r7, %[b], #16\n\t"
  127155. #endif
  127156. #ifdef WOLFSSL_KEIL
  127157. "muls r7, r6, r7\n\t"
  127158. #elif defined(__clang__)
  127159. "muls r7, r6\n\t"
  127160. #else
  127161. "mul r7, r6\n\t"
  127162. #endif
  127163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127164. "adds r3, r3, r7\n\t"
  127165. #else
  127166. "add r3, r3, r7\n\t"
  127167. #endif
  127168. #ifdef WOLFSSL_KEIL
  127169. "adcs r4, r4, %[r]\n\t"
  127170. #elif defined(__clang__)
  127171. "adcs r4, %[r]\n\t"
  127172. #else
  127173. "adc r4, %[r]\n\t"
  127174. #endif
  127175. "uxth r7, %[b]\n\t"
  127176. #ifdef WOLFSSL_KEIL
  127177. "muls r6, r7, r6\n\t"
  127178. #elif defined(__clang__)
  127179. "muls r6, r7\n\t"
  127180. #else
  127181. "mul r6, r7\n\t"
  127182. #endif
  127183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127184. "lsrs r7, r6, #16\n\t"
  127185. #else
  127186. "lsr r7, r6, #16\n\t"
  127187. #endif
  127188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127189. "lsls r6, r6, #16\n\t"
  127190. #else
  127191. "lsl r6, r6, #16\n\t"
  127192. #endif
  127193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127194. "adds r5, r5, r6\n\t"
  127195. #else
  127196. "add r5, r5, r6\n\t"
  127197. #endif
  127198. #ifdef WOLFSSL_KEIL
  127199. "adcs r3, r3, r7\n\t"
  127200. #elif defined(__clang__)
  127201. "adcs r3, r7\n\t"
  127202. #else
  127203. "adc r3, r7\n\t"
  127204. #endif
  127205. #ifdef WOLFSSL_KEIL
  127206. "adcs r4, r4, %[r]\n\t"
  127207. #elif defined(__clang__)
  127208. "adcs r4, %[r]\n\t"
  127209. #else
  127210. "adc r4, %[r]\n\t"
  127211. #endif
  127212. "# A[10] * B[1]\n\t"
  127213. "mov %[a], r9\n\t"
  127214. "mov %[b], r10\n\t"
  127215. "ldr %[a], [%[a], #40]\n\t"
  127216. "ldr %[b], [%[b], #4]\n\t"
  127217. "uxth r6, %[a]\n\t"
  127218. "uxth r7, %[b]\n\t"
  127219. #ifdef WOLFSSL_KEIL
  127220. "muls r7, r6, r7\n\t"
  127221. #elif defined(__clang__)
  127222. "muls r7, r6\n\t"
  127223. #else
  127224. "mul r7, r6\n\t"
  127225. #endif
  127226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127227. "adds r5, r5, r7\n\t"
  127228. #else
  127229. "add r5, r5, r7\n\t"
  127230. #endif
  127231. #ifdef WOLFSSL_KEIL
  127232. "adcs r3, r3, %[r]\n\t"
  127233. #elif defined(__clang__)
  127234. "adcs r3, %[r]\n\t"
  127235. #else
  127236. "adc r3, %[r]\n\t"
  127237. #endif
  127238. #ifdef WOLFSSL_KEIL
  127239. "adcs r4, r4, %[r]\n\t"
  127240. #elif defined(__clang__)
  127241. "adcs r4, %[r]\n\t"
  127242. #else
  127243. "adc r4, %[r]\n\t"
  127244. #endif
  127245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127246. "lsrs r7, %[b], #16\n\t"
  127247. #else
  127248. "lsr r7, %[b], #16\n\t"
  127249. #endif
  127250. #ifdef WOLFSSL_KEIL
  127251. "muls r6, r7, r6\n\t"
  127252. #elif defined(__clang__)
  127253. "muls r6, r7\n\t"
  127254. #else
  127255. "mul r6, r7\n\t"
  127256. #endif
  127257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127258. "lsrs r7, r6, #16\n\t"
  127259. #else
  127260. "lsr r7, r6, #16\n\t"
  127261. #endif
  127262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127263. "lsls r6, r6, #16\n\t"
  127264. #else
  127265. "lsl r6, r6, #16\n\t"
  127266. #endif
  127267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127268. "adds r5, r5, r6\n\t"
  127269. #else
  127270. "add r5, r5, r6\n\t"
  127271. #endif
  127272. #ifdef WOLFSSL_KEIL
  127273. "adcs r3, r3, r7\n\t"
  127274. #elif defined(__clang__)
  127275. "adcs r3, r7\n\t"
  127276. #else
  127277. "adc r3, r7\n\t"
  127278. #endif
  127279. #ifdef WOLFSSL_KEIL
  127280. "adcs r4, r4, %[r]\n\t"
  127281. #elif defined(__clang__)
  127282. "adcs r4, %[r]\n\t"
  127283. #else
  127284. "adc r4, %[r]\n\t"
  127285. #endif
  127286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127287. "lsrs r6, %[a], #16\n\t"
  127288. #else
  127289. "lsr r6, %[a], #16\n\t"
  127290. #endif
  127291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127292. "lsrs r7, %[b], #16\n\t"
  127293. #else
  127294. "lsr r7, %[b], #16\n\t"
  127295. #endif
  127296. #ifdef WOLFSSL_KEIL
  127297. "muls r7, r6, r7\n\t"
  127298. #elif defined(__clang__)
  127299. "muls r7, r6\n\t"
  127300. #else
  127301. "mul r7, r6\n\t"
  127302. #endif
  127303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127304. "adds r3, r3, r7\n\t"
  127305. #else
  127306. "add r3, r3, r7\n\t"
  127307. #endif
  127308. #ifdef WOLFSSL_KEIL
  127309. "adcs r4, r4, %[r]\n\t"
  127310. #elif defined(__clang__)
  127311. "adcs r4, %[r]\n\t"
  127312. #else
  127313. "adc r4, %[r]\n\t"
  127314. #endif
  127315. "uxth r7, %[b]\n\t"
  127316. #ifdef WOLFSSL_KEIL
  127317. "muls r6, r7, r6\n\t"
  127318. #elif defined(__clang__)
  127319. "muls r6, r7\n\t"
  127320. #else
  127321. "mul r6, r7\n\t"
  127322. #endif
  127323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127324. "lsrs r7, r6, #16\n\t"
  127325. #else
  127326. "lsr r7, r6, #16\n\t"
  127327. #endif
  127328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127329. "lsls r6, r6, #16\n\t"
  127330. #else
  127331. "lsl r6, r6, #16\n\t"
  127332. #endif
  127333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127334. "adds r5, r5, r6\n\t"
  127335. #else
  127336. "add r5, r5, r6\n\t"
  127337. #endif
  127338. #ifdef WOLFSSL_KEIL
  127339. "adcs r3, r3, r7\n\t"
  127340. #elif defined(__clang__)
  127341. "adcs r3, r7\n\t"
  127342. #else
  127343. "adc r3, r7\n\t"
  127344. #endif
  127345. #ifdef WOLFSSL_KEIL
  127346. "adcs r4, r4, %[r]\n\t"
  127347. #elif defined(__clang__)
  127348. "adcs r4, %[r]\n\t"
  127349. #else
  127350. "adc r4, %[r]\n\t"
  127351. #endif
  127352. "# A[11] * B[0]\n\t"
  127353. "mov %[a], r9\n\t"
  127354. "mov %[b], r10\n\t"
  127355. "ldr %[a], [%[a], #44]\n\t"
  127356. "ldr %[b], [%[b]]\n\t"
  127357. "uxth r6, %[a]\n\t"
  127358. "uxth r7, %[b]\n\t"
  127359. #ifdef WOLFSSL_KEIL
  127360. "muls r7, r6, r7\n\t"
  127361. #elif defined(__clang__)
  127362. "muls r7, r6\n\t"
  127363. #else
  127364. "mul r7, r6\n\t"
  127365. #endif
  127366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127367. "adds r5, r5, r7\n\t"
  127368. #else
  127369. "add r5, r5, r7\n\t"
  127370. #endif
  127371. #ifdef WOLFSSL_KEIL
  127372. "adcs r3, r3, %[r]\n\t"
  127373. #elif defined(__clang__)
  127374. "adcs r3, %[r]\n\t"
  127375. #else
  127376. "adc r3, %[r]\n\t"
  127377. #endif
  127378. #ifdef WOLFSSL_KEIL
  127379. "adcs r4, r4, %[r]\n\t"
  127380. #elif defined(__clang__)
  127381. "adcs r4, %[r]\n\t"
  127382. #else
  127383. "adc r4, %[r]\n\t"
  127384. #endif
  127385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127386. "lsrs r7, %[b], #16\n\t"
  127387. #else
  127388. "lsr r7, %[b], #16\n\t"
  127389. #endif
  127390. #ifdef WOLFSSL_KEIL
  127391. "muls r6, r7, r6\n\t"
  127392. #elif defined(__clang__)
  127393. "muls r6, r7\n\t"
  127394. #else
  127395. "mul r6, r7\n\t"
  127396. #endif
  127397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127398. "lsrs r7, r6, #16\n\t"
  127399. #else
  127400. "lsr r7, r6, #16\n\t"
  127401. #endif
  127402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127403. "lsls r6, r6, #16\n\t"
  127404. #else
  127405. "lsl r6, r6, #16\n\t"
  127406. #endif
  127407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127408. "adds r5, r5, r6\n\t"
  127409. #else
  127410. "add r5, r5, r6\n\t"
  127411. #endif
  127412. #ifdef WOLFSSL_KEIL
  127413. "adcs r3, r3, r7\n\t"
  127414. #elif defined(__clang__)
  127415. "adcs r3, r7\n\t"
  127416. #else
  127417. "adc r3, r7\n\t"
  127418. #endif
  127419. #ifdef WOLFSSL_KEIL
  127420. "adcs r4, r4, %[r]\n\t"
  127421. #elif defined(__clang__)
  127422. "adcs r4, %[r]\n\t"
  127423. #else
  127424. "adc r4, %[r]\n\t"
  127425. #endif
  127426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127427. "lsrs r6, %[a], #16\n\t"
  127428. #else
  127429. "lsr r6, %[a], #16\n\t"
  127430. #endif
  127431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127432. "lsrs r7, %[b], #16\n\t"
  127433. #else
  127434. "lsr r7, %[b], #16\n\t"
  127435. #endif
  127436. #ifdef WOLFSSL_KEIL
  127437. "muls r7, r6, r7\n\t"
  127438. #elif defined(__clang__)
  127439. "muls r7, r6\n\t"
  127440. #else
  127441. "mul r7, r6\n\t"
  127442. #endif
  127443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127444. "adds r3, r3, r7\n\t"
  127445. #else
  127446. "add r3, r3, r7\n\t"
  127447. #endif
  127448. #ifdef WOLFSSL_KEIL
  127449. "adcs r4, r4, %[r]\n\t"
  127450. #elif defined(__clang__)
  127451. "adcs r4, %[r]\n\t"
  127452. #else
  127453. "adc r4, %[r]\n\t"
  127454. #endif
  127455. "uxth r7, %[b]\n\t"
  127456. #ifdef WOLFSSL_KEIL
  127457. "muls r6, r7, r6\n\t"
  127458. #elif defined(__clang__)
  127459. "muls r6, r7\n\t"
  127460. #else
  127461. "mul r6, r7\n\t"
  127462. #endif
  127463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127464. "lsrs r7, r6, #16\n\t"
  127465. #else
  127466. "lsr r7, r6, #16\n\t"
  127467. #endif
  127468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127469. "lsls r6, r6, #16\n\t"
  127470. #else
  127471. "lsl r6, r6, #16\n\t"
  127472. #endif
  127473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127474. "adds r5, r5, r6\n\t"
  127475. #else
  127476. "add r5, r5, r6\n\t"
  127477. #endif
  127478. #ifdef WOLFSSL_KEIL
  127479. "adcs r3, r3, r7\n\t"
  127480. #elif defined(__clang__)
  127481. "adcs r3, r7\n\t"
  127482. #else
  127483. "adc r3, r7\n\t"
  127484. #endif
  127485. #ifdef WOLFSSL_KEIL
  127486. "adcs r4, r4, %[r]\n\t"
  127487. #elif defined(__clang__)
  127488. "adcs r4, %[r]\n\t"
  127489. #else
  127490. "adc r4, %[r]\n\t"
  127491. #endif
  127492. "str r5, [sp, #44]\n\t"
  127493. "# A[12] * B[0]\n\t"
  127494. "movs r5, #0\n\t"
  127495. "mov %[a], r9\n\t"
  127496. "mov %[b], r10\n\t"
  127497. "ldr %[a], [%[a], #48]\n\t"
  127498. "ldr %[b], [%[b]]\n\t"
  127499. "uxth r6, %[a]\n\t"
  127500. "uxth r7, %[b]\n\t"
  127501. #ifdef WOLFSSL_KEIL
  127502. "muls r7, r6, r7\n\t"
  127503. #elif defined(__clang__)
  127504. "muls r7, r6\n\t"
  127505. #else
  127506. "mul r7, r6\n\t"
  127507. #endif
  127508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127509. "adds r3, r3, r7\n\t"
  127510. #else
  127511. "add r3, r3, r7\n\t"
  127512. #endif
  127513. #ifdef WOLFSSL_KEIL
  127514. "adcs r4, r4, %[r]\n\t"
  127515. #elif defined(__clang__)
  127516. "adcs r4, %[r]\n\t"
  127517. #else
  127518. "adc r4, %[r]\n\t"
  127519. #endif
  127520. #ifdef WOLFSSL_KEIL
  127521. "adcs r5, r5, %[r]\n\t"
  127522. #elif defined(__clang__)
  127523. "adcs r5, %[r]\n\t"
  127524. #else
  127525. "adc r5, %[r]\n\t"
  127526. #endif
  127527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127528. "lsrs r7, %[b], #16\n\t"
  127529. #else
  127530. "lsr r7, %[b], #16\n\t"
  127531. #endif
  127532. #ifdef WOLFSSL_KEIL
  127533. "muls r6, r7, r6\n\t"
  127534. #elif defined(__clang__)
  127535. "muls r6, r7\n\t"
  127536. #else
  127537. "mul r6, r7\n\t"
  127538. #endif
  127539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127540. "lsrs r7, r6, #16\n\t"
  127541. #else
  127542. "lsr r7, r6, #16\n\t"
  127543. #endif
  127544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127545. "lsls r6, r6, #16\n\t"
  127546. #else
  127547. "lsl r6, r6, #16\n\t"
  127548. #endif
  127549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127550. "adds r3, r3, r6\n\t"
  127551. #else
  127552. "add r3, r3, r6\n\t"
  127553. #endif
  127554. #ifdef WOLFSSL_KEIL
  127555. "adcs r4, r4, r7\n\t"
  127556. #elif defined(__clang__)
  127557. "adcs r4, r7\n\t"
  127558. #else
  127559. "adc r4, r7\n\t"
  127560. #endif
  127561. #ifdef WOLFSSL_KEIL
  127562. "adcs r5, r5, %[r]\n\t"
  127563. #elif defined(__clang__)
  127564. "adcs r5, %[r]\n\t"
  127565. #else
  127566. "adc r5, %[r]\n\t"
  127567. #endif
  127568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127569. "lsrs r6, %[a], #16\n\t"
  127570. #else
  127571. "lsr r6, %[a], #16\n\t"
  127572. #endif
  127573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127574. "lsrs r7, %[b], #16\n\t"
  127575. #else
  127576. "lsr r7, %[b], #16\n\t"
  127577. #endif
  127578. #ifdef WOLFSSL_KEIL
  127579. "muls r7, r6, r7\n\t"
  127580. #elif defined(__clang__)
  127581. "muls r7, r6\n\t"
  127582. #else
  127583. "mul r7, r6\n\t"
  127584. #endif
  127585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127586. "adds r4, r4, r7\n\t"
  127587. #else
  127588. "add r4, r4, r7\n\t"
  127589. #endif
  127590. #ifdef WOLFSSL_KEIL
  127591. "adcs r5, r5, %[r]\n\t"
  127592. #elif defined(__clang__)
  127593. "adcs r5, %[r]\n\t"
  127594. #else
  127595. "adc r5, %[r]\n\t"
  127596. #endif
  127597. "uxth r7, %[b]\n\t"
  127598. #ifdef WOLFSSL_KEIL
  127599. "muls r6, r7, r6\n\t"
  127600. #elif defined(__clang__)
  127601. "muls r6, r7\n\t"
  127602. #else
  127603. "mul r6, r7\n\t"
  127604. #endif
  127605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127606. "lsrs r7, r6, #16\n\t"
  127607. #else
  127608. "lsr r7, r6, #16\n\t"
  127609. #endif
  127610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127611. "lsls r6, r6, #16\n\t"
  127612. #else
  127613. "lsl r6, r6, #16\n\t"
  127614. #endif
  127615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127616. "adds r3, r3, r6\n\t"
  127617. #else
  127618. "add r3, r3, r6\n\t"
  127619. #endif
  127620. #ifdef WOLFSSL_KEIL
  127621. "adcs r4, r4, r7\n\t"
  127622. #elif defined(__clang__)
  127623. "adcs r4, r7\n\t"
  127624. #else
  127625. "adc r4, r7\n\t"
  127626. #endif
  127627. #ifdef WOLFSSL_KEIL
  127628. "adcs r5, r5, %[r]\n\t"
  127629. #elif defined(__clang__)
  127630. "adcs r5, %[r]\n\t"
  127631. #else
  127632. "adc r5, %[r]\n\t"
  127633. #endif
  127634. "# A[11] * B[1]\n\t"
  127635. "mov %[a], r9\n\t"
  127636. "mov %[b], r10\n\t"
  127637. "ldr %[a], [%[a], #44]\n\t"
  127638. "ldr %[b], [%[b], #4]\n\t"
  127639. "uxth r6, %[a]\n\t"
  127640. "uxth r7, %[b]\n\t"
  127641. #ifdef WOLFSSL_KEIL
  127642. "muls r7, r6, r7\n\t"
  127643. #elif defined(__clang__)
  127644. "muls r7, r6\n\t"
  127645. #else
  127646. "mul r7, r6\n\t"
  127647. #endif
  127648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127649. "adds r3, r3, r7\n\t"
  127650. #else
  127651. "add r3, r3, r7\n\t"
  127652. #endif
  127653. #ifdef WOLFSSL_KEIL
  127654. "adcs r4, r4, %[r]\n\t"
  127655. #elif defined(__clang__)
  127656. "adcs r4, %[r]\n\t"
  127657. #else
  127658. "adc r4, %[r]\n\t"
  127659. #endif
  127660. #ifdef WOLFSSL_KEIL
  127661. "adcs r5, r5, %[r]\n\t"
  127662. #elif defined(__clang__)
  127663. "adcs r5, %[r]\n\t"
  127664. #else
  127665. "adc r5, %[r]\n\t"
  127666. #endif
  127667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127668. "lsrs r7, %[b], #16\n\t"
  127669. #else
  127670. "lsr r7, %[b], #16\n\t"
  127671. #endif
  127672. #ifdef WOLFSSL_KEIL
  127673. "muls r6, r7, r6\n\t"
  127674. #elif defined(__clang__)
  127675. "muls r6, r7\n\t"
  127676. #else
  127677. "mul r6, r7\n\t"
  127678. #endif
  127679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127680. "lsrs r7, r6, #16\n\t"
  127681. #else
  127682. "lsr r7, r6, #16\n\t"
  127683. #endif
  127684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127685. "lsls r6, r6, #16\n\t"
  127686. #else
  127687. "lsl r6, r6, #16\n\t"
  127688. #endif
  127689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127690. "adds r3, r3, r6\n\t"
  127691. #else
  127692. "add r3, r3, r6\n\t"
  127693. #endif
  127694. #ifdef WOLFSSL_KEIL
  127695. "adcs r4, r4, r7\n\t"
  127696. #elif defined(__clang__)
  127697. "adcs r4, r7\n\t"
  127698. #else
  127699. "adc r4, r7\n\t"
  127700. #endif
  127701. #ifdef WOLFSSL_KEIL
  127702. "adcs r5, r5, %[r]\n\t"
  127703. #elif defined(__clang__)
  127704. "adcs r5, %[r]\n\t"
  127705. #else
  127706. "adc r5, %[r]\n\t"
  127707. #endif
  127708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127709. "lsrs r6, %[a], #16\n\t"
  127710. #else
  127711. "lsr r6, %[a], #16\n\t"
  127712. #endif
  127713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127714. "lsrs r7, %[b], #16\n\t"
  127715. #else
  127716. "lsr r7, %[b], #16\n\t"
  127717. #endif
  127718. #ifdef WOLFSSL_KEIL
  127719. "muls r7, r6, r7\n\t"
  127720. #elif defined(__clang__)
  127721. "muls r7, r6\n\t"
  127722. #else
  127723. "mul r7, r6\n\t"
  127724. #endif
  127725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127726. "adds r4, r4, r7\n\t"
  127727. #else
  127728. "add r4, r4, r7\n\t"
  127729. #endif
  127730. #ifdef WOLFSSL_KEIL
  127731. "adcs r5, r5, %[r]\n\t"
  127732. #elif defined(__clang__)
  127733. "adcs r5, %[r]\n\t"
  127734. #else
  127735. "adc r5, %[r]\n\t"
  127736. #endif
  127737. "uxth r7, %[b]\n\t"
  127738. #ifdef WOLFSSL_KEIL
  127739. "muls r6, r7, r6\n\t"
  127740. #elif defined(__clang__)
  127741. "muls r6, r7\n\t"
  127742. #else
  127743. "mul r6, r7\n\t"
  127744. #endif
  127745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127746. "lsrs r7, r6, #16\n\t"
  127747. #else
  127748. "lsr r7, r6, #16\n\t"
  127749. #endif
  127750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127751. "lsls r6, r6, #16\n\t"
  127752. #else
  127753. "lsl r6, r6, #16\n\t"
  127754. #endif
  127755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127756. "adds r3, r3, r6\n\t"
  127757. #else
  127758. "add r3, r3, r6\n\t"
  127759. #endif
  127760. #ifdef WOLFSSL_KEIL
  127761. "adcs r4, r4, r7\n\t"
  127762. #elif defined(__clang__)
  127763. "adcs r4, r7\n\t"
  127764. #else
  127765. "adc r4, r7\n\t"
  127766. #endif
  127767. #ifdef WOLFSSL_KEIL
  127768. "adcs r5, r5, %[r]\n\t"
  127769. #elif defined(__clang__)
  127770. "adcs r5, %[r]\n\t"
  127771. #else
  127772. "adc r5, %[r]\n\t"
  127773. #endif
  127774. "# A[10] * B[2]\n\t"
  127775. "mov %[a], r9\n\t"
  127776. "mov %[b], r10\n\t"
  127777. "ldr %[a], [%[a], #40]\n\t"
  127778. "ldr %[b], [%[b], #8]\n\t"
  127779. "uxth r6, %[a]\n\t"
  127780. "uxth r7, %[b]\n\t"
  127781. #ifdef WOLFSSL_KEIL
  127782. "muls r7, r6, r7\n\t"
  127783. #elif defined(__clang__)
  127784. "muls r7, r6\n\t"
  127785. #else
  127786. "mul r7, r6\n\t"
  127787. #endif
  127788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127789. "adds r3, r3, r7\n\t"
  127790. #else
  127791. "add r3, r3, r7\n\t"
  127792. #endif
  127793. #ifdef WOLFSSL_KEIL
  127794. "adcs r4, r4, %[r]\n\t"
  127795. #elif defined(__clang__)
  127796. "adcs r4, %[r]\n\t"
  127797. #else
  127798. "adc r4, %[r]\n\t"
  127799. #endif
  127800. #ifdef WOLFSSL_KEIL
  127801. "adcs r5, r5, %[r]\n\t"
  127802. #elif defined(__clang__)
  127803. "adcs r5, %[r]\n\t"
  127804. #else
  127805. "adc r5, %[r]\n\t"
  127806. #endif
  127807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127808. "lsrs r7, %[b], #16\n\t"
  127809. #else
  127810. "lsr r7, %[b], #16\n\t"
  127811. #endif
  127812. #ifdef WOLFSSL_KEIL
  127813. "muls r6, r7, r6\n\t"
  127814. #elif defined(__clang__)
  127815. "muls r6, r7\n\t"
  127816. #else
  127817. "mul r6, r7\n\t"
  127818. #endif
  127819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127820. "lsrs r7, r6, #16\n\t"
  127821. #else
  127822. "lsr r7, r6, #16\n\t"
  127823. #endif
  127824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127825. "lsls r6, r6, #16\n\t"
  127826. #else
  127827. "lsl r6, r6, #16\n\t"
  127828. #endif
  127829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127830. "adds r3, r3, r6\n\t"
  127831. #else
  127832. "add r3, r3, r6\n\t"
  127833. #endif
  127834. #ifdef WOLFSSL_KEIL
  127835. "adcs r4, r4, r7\n\t"
  127836. #elif defined(__clang__)
  127837. "adcs r4, r7\n\t"
  127838. #else
  127839. "adc r4, r7\n\t"
  127840. #endif
  127841. #ifdef WOLFSSL_KEIL
  127842. "adcs r5, r5, %[r]\n\t"
  127843. #elif defined(__clang__)
  127844. "adcs r5, %[r]\n\t"
  127845. #else
  127846. "adc r5, %[r]\n\t"
  127847. #endif
  127848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127849. "lsrs r6, %[a], #16\n\t"
  127850. #else
  127851. "lsr r6, %[a], #16\n\t"
  127852. #endif
  127853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127854. "lsrs r7, %[b], #16\n\t"
  127855. #else
  127856. "lsr r7, %[b], #16\n\t"
  127857. #endif
  127858. #ifdef WOLFSSL_KEIL
  127859. "muls r7, r6, r7\n\t"
  127860. #elif defined(__clang__)
  127861. "muls r7, r6\n\t"
  127862. #else
  127863. "mul r7, r6\n\t"
  127864. #endif
  127865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127866. "adds r4, r4, r7\n\t"
  127867. #else
  127868. "add r4, r4, r7\n\t"
  127869. #endif
  127870. #ifdef WOLFSSL_KEIL
  127871. "adcs r5, r5, %[r]\n\t"
  127872. #elif defined(__clang__)
  127873. "adcs r5, %[r]\n\t"
  127874. #else
  127875. "adc r5, %[r]\n\t"
  127876. #endif
  127877. "uxth r7, %[b]\n\t"
  127878. #ifdef WOLFSSL_KEIL
  127879. "muls r6, r7, r6\n\t"
  127880. #elif defined(__clang__)
  127881. "muls r6, r7\n\t"
  127882. #else
  127883. "mul r6, r7\n\t"
  127884. #endif
  127885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127886. "lsrs r7, r6, #16\n\t"
  127887. #else
  127888. "lsr r7, r6, #16\n\t"
  127889. #endif
  127890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127891. "lsls r6, r6, #16\n\t"
  127892. #else
  127893. "lsl r6, r6, #16\n\t"
  127894. #endif
  127895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127896. "adds r3, r3, r6\n\t"
  127897. #else
  127898. "add r3, r3, r6\n\t"
  127899. #endif
  127900. #ifdef WOLFSSL_KEIL
  127901. "adcs r4, r4, r7\n\t"
  127902. #elif defined(__clang__)
  127903. "adcs r4, r7\n\t"
  127904. #else
  127905. "adc r4, r7\n\t"
  127906. #endif
  127907. #ifdef WOLFSSL_KEIL
  127908. "adcs r5, r5, %[r]\n\t"
  127909. #elif defined(__clang__)
  127910. "adcs r5, %[r]\n\t"
  127911. #else
  127912. "adc r5, %[r]\n\t"
  127913. #endif
  127914. "# A[9] * B[3]\n\t"
  127915. "mov %[a], r9\n\t"
  127916. "mov %[b], r10\n\t"
  127917. "ldr %[a], [%[a], #36]\n\t"
  127918. "ldr %[b], [%[b], #12]\n\t"
  127919. "uxth r6, %[a]\n\t"
  127920. "uxth r7, %[b]\n\t"
  127921. #ifdef WOLFSSL_KEIL
  127922. "muls r7, r6, r7\n\t"
  127923. #elif defined(__clang__)
  127924. "muls r7, r6\n\t"
  127925. #else
  127926. "mul r7, r6\n\t"
  127927. #endif
  127928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127929. "adds r3, r3, r7\n\t"
  127930. #else
  127931. "add r3, r3, r7\n\t"
  127932. #endif
  127933. #ifdef WOLFSSL_KEIL
  127934. "adcs r4, r4, %[r]\n\t"
  127935. #elif defined(__clang__)
  127936. "adcs r4, %[r]\n\t"
  127937. #else
  127938. "adc r4, %[r]\n\t"
  127939. #endif
  127940. #ifdef WOLFSSL_KEIL
  127941. "adcs r5, r5, %[r]\n\t"
  127942. #elif defined(__clang__)
  127943. "adcs r5, %[r]\n\t"
  127944. #else
  127945. "adc r5, %[r]\n\t"
  127946. #endif
  127947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127948. "lsrs r7, %[b], #16\n\t"
  127949. #else
  127950. "lsr r7, %[b], #16\n\t"
  127951. #endif
  127952. #ifdef WOLFSSL_KEIL
  127953. "muls r6, r7, r6\n\t"
  127954. #elif defined(__clang__)
  127955. "muls r6, r7\n\t"
  127956. #else
  127957. "mul r6, r7\n\t"
  127958. #endif
  127959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127960. "lsrs r7, r6, #16\n\t"
  127961. #else
  127962. "lsr r7, r6, #16\n\t"
  127963. #endif
  127964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127965. "lsls r6, r6, #16\n\t"
  127966. #else
  127967. "lsl r6, r6, #16\n\t"
  127968. #endif
  127969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127970. "adds r3, r3, r6\n\t"
  127971. #else
  127972. "add r3, r3, r6\n\t"
  127973. #endif
  127974. #ifdef WOLFSSL_KEIL
  127975. "adcs r4, r4, r7\n\t"
  127976. #elif defined(__clang__)
  127977. "adcs r4, r7\n\t"
  127978. #else
  127979. "adc r4, r7\n\t"
  127980. #endif
  127981. #ifdef WOLFSSL_KEIL
  127982. "adcs r5, r5, %[r]\n\t"
  127983. #elif defined(__clang__)
  127984. "adcs r5, %[r]\n\t"
  127985. #else
  127986. "adc r5, %[r]\n\t"
  127987. #endif
  127988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127989. "lsrs r6, %[a], #16\n\t"
  127990. #else
  127991. "lsr r6, %[a], #16\n\t"
  127992. #endif
  127993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127994. "lsrs r7, %[b], #16\n\t"
  127995. #else
  127996. "lsr r7, %[b], #16\n\t"
  127997. #endif
  127998. #ifdef WOLFSSL_KEIL
  127999. "muls r7, r6, r7\n\t"
  128000. #elif defined(__clang__)
  128001. "muls r7, r6\n\t"
  128002. #else
  128003. "mul r7, r6\n\t"
  128004. #endif
  128005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128006. "adds r4, r4, r7\n\t"
  128007. #else
  128008. "add r4, r4, r7\n\t"
  128009. #endif
  128010. #ifdef WOLFSSL_KEIL
  128011. "adcs r5, r5, %[r]\n\t"
  128012. #elif defined(__clang__)
  128013. "adcs r5, %[r]\n\t"
  128014. #else
  128015. "adc r5, %[r]\n\t"
  128016. #endif
  128017. "uxth r7, %[b]\n\t"
  128018. #ifdef WOLFSSL_KEIL
  128019. "muls r6, r7, r6\n\t"
  128020. #elif defined(__clang__)
  128021. "muls r6, r7\n\t"
  128022. #else
  128023. "mul r6, r7\n\t"
  128024. #endif
  128025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128026. "lsrs r7, r6, #16\n\t"
  128027. #else
  128028. "lsr r7, r6, #16\n\t"
  128029. #endif
  128030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128031. "lsls r6, r6, #16\n\t"
  128032. #else
  128033. "lsl r6, r6, #16\n\t"
  128034. #endif
  128035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128036. "adds r3, r3, r6\n\t"
  128037. #else
  128038. "add r3, r3, r6\n\t"
  128039. #endif
  128040. #ifdef WOLFSSL_KEIL
  128041. "adcs r4, r4, r7\n\t"
  128042. #elif defined(__clang__)
  128043. "adcs r4, r7\n\t"
  128044. #else
  128045. "adc r4, r7\n\t"
  128046. #endif
  128047. #ifdef WOLFSSL_KEIL
  128048. "adcs r5, r5, %[r]\n\t"
  128049. #elif defined(__clang__)
  128050. "adcs r5, %[r]\n\t"
  128051. #else
  128052. "adc r5, %[r]\n\t"
  128053. #endif
  128054. "# A[8] * B[4]\n\t"
  128055. "mov %[a], r9\n\t"
  128056. "mov %[b], r10\n\t"
  128057. "ldr %[a], [%[a], #32]\n\t"
  128058. "ldr %[b], [%[b], #16]\n\t"
  128059. "uxth r6, %[a]\n\t"
  128060. "uxth r7, %[b]\n\t"
  128061. #ifdef WOLFSSL_KEIL
  128062. "muls r7, r6, r7\n\t"
  128063. #elif defined(__clang__)
  128064. "muls r7, r6\n\t"
  128065. #else
  128066. "mul r7, r6\n\t"
  128067. #endif
  128068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128069. "adds r3, r3, r7\n\t"
  128070. #else
  128071. "add r3, r3, r7\n\t"
  128072. #endif
  128073. #ifdef WOLFSSL_KEIL
  128074. "adcs r4, r4, %[r]\n\t"
  128075. #elif defined(__clang__)
  128076. "adcs r4, %[r]\n\t"
  128077. #else
  128078. "adc r4, %[r]\n\t"
  128079. #endif
  128080. #ifdef WOLFSSL_KEIL
  128081. "adcs r5, r5, %[r]\n\t"
  128082. #elif defined(__clang__)
  128083. "adcs r5, %[r]\n\t"
  128084. #else
  128085. "adc r5, %[r]\n\t"
  128086. #endif
  128087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128088. "lsrs r7, %[b], #16\n\t"
  128089. #else
  128090. "lsr r7, %[b], #16\n\t"
  128091. #endif
  128092. #ifdef WOLFSSL_KEIL
  128093. "muls r6, r7, r6\n\t"
  128094. #elif defined(__clang__)
  128095. "muls r6, r7\n\t"
  128096. #else
  128097. "mul r6, r7\n\t"
  128098. #endif
  128099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128100. "lsrs r7, r6, #16\n\t"
  128101. #else
  128102. "lsr r7, r6, #16\n\t"
  128103. #endif
  128104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128105. "lsls r6, r6, #16\n\t"
  128106. #else
  128107. "lsl r6, r6, #16\n\t"
  128108. #endif
  128109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128110. "adds r3, r3, r6\n\t"
  128111. #else
  128112. "add r3, r3, r6\n\t"
  128113. #endif
  128114. #ifdef WOLFSSL_KEIL
  128115. "adcs r4, r4, r7\n\t"
  128116. #elif defined(__clang__)
  128117. "adcs r4, r7\n\t"
  128118. #else
  128119. "adc r4, r7\n\t"
  128120. #endif
  128121. #ifdef WOLFSSL_KEIL
  128122. "adcs r5, r5, %[r]\n\t"
  128123. #elif defined(__clang__)
  128124. "adcs r5, %[r]\n\t"
  128125. #else
  128126. "adc r5, %[r]\n\t"
  128127. #endif
  128128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128129. "lsrs r6, %[a], #16\n\t"
  128130. #else
  128131. "lsr r6, %[a], #16\n\t"
  128132. #endif
  128133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128134. "lsrs r7, %[b], #16\n\t"
  128135. #else
  128136. "lsr r7, %[b], #16\n\t"
  128137. #endif
  128138. #ifdef WOLFSSL_KEIL
  128139. "muls r7, r6, r7\n\t"
  128140. #elif defined(__clang__)
  128141. "muls r7, r6\n\t"
  128142. #else
  128143. "mul r7, r6\n\t"
  128144. #endif
  128145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128146. "adds r4, r4, r7\n\t"
  128147. #else
  128148. "add r4, r4, r7\n\t"
  128149. #endif
  128150. #ifdef WOLFSSL_KEIL
  128151. "adcs r5, r5, %[r]\n\t"
  128152. #elif defined(__clang__)
  128153. "adcs r5, %[r]\n\t"
  128154. #else
  128155. "adc r5, %[r]\n\t"
  128156. #endif
  128157. "uxth r7, %[b]\n\t"
  128158. #ifdef WOLFSSL_KEIL
  128159. "muls r6, r7, r6\n\t"
  128160. #elif defined(__clang__)
  128161. "muls r6, r7\n\t"
  128162. #else
  128163. "mul r6, r7\n\t"
  128164. #endif
  128165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128166. "lsrs r7, r6, #16\n\t"
  128167. #else
  128168. "lsr r7, r6, #16\n\t"
  128169. #endif
  128170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128171. "lsls r6, r6, #16\n\t"
  128172. #else
  128173. "lsl r6, r6, #16\n\t"
  128174. #endif
  128175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128176. "adds r3, r3, r6\n\t"
  128177. #else
  128178. "add r3, r3, r6\n\t"
  128179. #endif
  128180. #ifdef WOLFSSL_KEIL
  128181. "adcs r4, r4, r7\n\t"
  128182. #elif defined(__clang__)
  128183. "adcs r4, r7\n\t"
  128184. #else
  128185. "adc r4, r7\n\t"
  128186. #endif
  128187. #ifdef WOLFSSL_KEIL
  128188. "adcs r5, r5, %[r]\n\t"
  128189. #elif defined(__clang__)
  128190. "adcs r5, %[r]\n\t"
  128191. #else
  128192. "adc r5, %[r]\n\t"
  128193. #endif
  128194. "# A[7] * B[5]\n\t"
  128195. "mov %[a], r9\n\t"
  128196. "mov %[b], r10\n\t"
  128197. "ldr %[a], [%[a], #28]\n\t"
  128198. "ldr %[b], [%[b], #20]\n\t"
  128199. "uxth r6, %[a]\n\t"
  128200. "uxth r7, %[b]\n\t"
  128201. #ifdef WOLFSSL_KEIL
  128202. "muls r7, r6, r7\n\t"
  128203. #elif defined(__clang__)
  128204. "muls r7, r6\n\t"
  128205. #else
  128206. "mul r7, r6\n\t"
  128207. #endif
  128208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128209. "adds r3, r3, r7\n\t"
  128210. #else
  128211. "add r3, r3, r7\n\t"
  128212. #endif
  128213. #ifdef WOLFSSL_KEIL
  128214. "adcs r4, r4, %[r]\n\t"
  128215. #elif defined(__clang__)
  128216. "adcs r4, %[r]\n\t"
  128217. #else
  128218. "adc r4, %[r]\n\t"
  128219. #endif
  128220. #ifdef WOLFSSL_KEIL
  128221. "adcs r5, r5, %[r]\n\t"
  128222. #elif defined(__clang__)
  128223. "adcs r5, %[r]\n\t"
  128224. #else
  128225. "adc r5, %[r]\n\t"
  128226. #endif
  128227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128228. "lsrs r7, %[b], #16\n\t"
  128229. #else
  128230. "lsr r7, %[b], #16\n\t"
  128231. #endif
  128232. #ifdef WOLFSSL_KEIL
  128233. "muls r6, r7, r6\n\t"
  128234. #elif defined(__clang__)
  128235. "muls r6, r7\n\t"
  128236. #else
  128237. "mul r6, r7\n\t"
  128238. #endif
  128239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128240. "lsrs r7, r6, #16\n\t"
  128241. #else
  128242. "lsr r7, r6, #16\n\t"
  128243. #endif
  128244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128245. "lsls r6, r6, #16\n\t"
  128246. #else
  128247. "lsl r6, r6, #16\n\t"
  128248. #endif
  128249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128250. "adds r3, r3, r6\n\t"
  128251. #else
  128252. "add r3, r3, r6\n\t"
  128253. #endif
  128254. #ifdef WOLFSSL_KEIL
  128255. "adcs r4, r4, r7\n\t"
  128256. #elif defined(__clang__)
  128257. "adcs r4, r7\n\t"
  128258. #else
  128259. "adc r4, r7\n\t"
  128260. #endif
  128261. #ifdef WOLFSSL_KEIL
  128262. "adcs r5, r5, %[r]\n\t"
  128263. #elif defined(__clang__)
  128264. "adcs r5, %[r]\n\t"
  128265. #else
  128266. "adc r5, %[r]\n\t"
  128267. #endif
  128268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128269. "lsrs r6, %[a], #16\n\t"
  128270. #else
  128271. "lsr r6, %[a], #16\n\t"
  128272. #endif
  128273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128274. "lsrs r7, %[b], #16\n\t"
  128275. #else
  128276. "lsr r7, %[b], #16\n\t"
  128277. #endif
  128278. #ifdef WOLFSSL_KEIL
  128279. "muls r7, r6, r7\n\t"
  128280. #elif defined(__clang__)
  128281. "muls r7, r6\n\t"
  128282. #else
  128283. "mul r7, r6\n\t"
  128284. #endif
  128285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128286. "adds r4, r4, r7\n\t"
  128287. #else
  128288. "add r4, r4, r7\n\t"
  128289. #endif
  128290. #ifdef WOLFSSL_KEIL
  128291. "adcs r5, r5, %[r]\n\t"
  128292. #elif defined(__clang__)
  128293. "adcs r5, %[r]\n\t"
  128294. #else
  128295. "adc r5, %[r]\n\t"
  128296. #endif
  128297. "uxth r7, %[b]\n\t"
  128298. #ifdef WOLFSSL_KEIL
  128299. "muls r6, r7, r6\n\t"
  128300. #elif defined(__clang__)
  128301. "muls r6, r7\n\t"
  128302. #else
  128303. "mul r6, r7\n\t"
  128304. #endif
  128305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128306. "lsrs r7, r6, #16\n\t"
  128307. #else
  128308. "lsr r7, r6, #16\n\t"
  128309. #endif
  128310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128311. "lsls r6, r6, #16\n\t"
  128312. #else
  128313. "lsl r6, r6, #16\n\t"
  128314. #endif
  128315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128316. "adds r3, r3, r6\n\t"
  128317. #else
  128318. "add r3, r3, r6\n\t"
  128319. #endif
  128320. #ifdef WOLFSSL_KEIL
  128321. "adcs r4, r4, r7\n\t"
  128322. #elif defined(__clang__)
  128323. "adcs r4, r7\n\t"
  128324. #else
  128325. "adc r4, r7\n\t"
  128326. #endif
  128327. #ifdef WOLFSSL_KEIL
  128328. "adcs r5, r5, %[r]\n\t"
  128329. #elif defined(__clang__)
  128330. "adcs r5, %[r]\n\t"
  128331. #else
  128332. "adc r5, %[r]\n\t"
  128333. #endif
  128334. "# A[6] * B[6]\n\t"
  128335. "mov %[a], r9\n\t"
  128336. "mov %[b], r10\n\t"
  128337. "ldr %[a], [%[a], #24]\n\t"
  128338. "ldr %[b], [%[b], #24]\n\t"
  128339. "uxth r6, %[a]\n\t"
  128340. "uxth r7, %[b]\n\t"
  128341. #ifdef WOLFSSL_KEIL
  128342. "muls r7, r6, r7\n\t"
  128343. #elif defined(__clang__)
  128344. "muls r7, r6\n\t"
  128345. #else
  128346. "mul r7, r6\n\t"
  128347. #endif
  128348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128349. "adds r3, r3, r7\n\t"
  128350. #else
  128351. "add r3, r3, r7\n\t"
  128352. #endif
  128353. #ifdef WOLFSSL_KEIL
  128354. "adcs r4, r4, %[r]\n\t"
  128355. #elif defined(__clang__)
  128356. "adcs r4, %[r]\n\t"
  128357. #else
  128358. "adc r4, %[r]\n\t"
  128359. #endif
  128360. #ifdef WOLFSSL_KEIL
  128361. "adcs r5, r5, %[r]\n\t"
  128362. #elif defined(__clang__)
  128363. "adcs r5, %[r]\n\t"
  128364. #else
  128365. "adc r5, %[r]\n\t"
  128366. #endif
  128367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128368. "lsrs r7, %[b], #16\n\t"
  128369. #else
  128370. "lsr r7, %[b], #16\n\t"
  128371. #endif
  128372. #ifdef WOLFSSL_KEIL
  128373. "muls r6, r7, r6\n\t"
  128374. #elif defined(__clang__)
  128375. "muls r6, r7\n\t"
  128376. #else
  128377. "mul r6, r7\n\t"
  128378. #endif
  128379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128380. "lsrs r7, r6, #16\n\t"
  128381. #else
  128382. "lsr r7, r6, #16\n\t"
  128383. #endif
  128384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128385. "lsls r6, r6, #16\n\t"
  128386. #else
  128387. "lsl r6, r6, #16\n\t"
  128388. #endif
  128389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128390. "adds r3, r3, r6\n\t"
  128391. #else
  128392. "add r3, r3, r6\n\t"
  128393. #endif
  128394. #ifdef WOLFSSL_KEIL
  128395. "adcs r4, r4, r7\n\t"
  128396. #elif defined(__clang__)
  128397. "adcs r4, r7\n\t"
  128398. #else
  128399. "adc r4, r7\n\t"
  128400. #endif
  128401. #ifdef WOLFSSL_KEIL
  128402. "adcs r5, r5, %[r]\n\t"
  128403. #elif defined(__clang__)
  128404. "adcs r5, %[r]\n\t"
  128405. #else
  128406. "adc r5, %[r]\n\t"
  128407. #endif
  128408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128409. "lsrs r6, %[a], #16\n\t"
  128410. #else
  128411. "lsr r6, %[a], #16\n\t"
  128412. #endif
  128413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128414. "lsrs r7, %[b], #16\n\t"
  128415. #else
  128416. "lsr r7, %[b], #16\n\t"
  128417. #endif
  128418. #ifdef WOLFSSL_KEIL
  128419. "muls r7, r6, r7\n\t"
  128420. #elif defined(__clang__)
  128421. "muls r7, r6\n\t"
  128422. #else
  128423. "mul r7, r6\n\t"
  128424. #endif
  128425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128426. "adds r4, r4, r7\n\t"
  128427. #else
  128428. "add r4, r4, r7\n\t"
  128429. #endif
  128430. #ifdef WOLFSSL_KEIL
  128431. "adcs r5, r5, %[r]\n\t"
  128432. #elif defined(__clang__)
  128433. "adcs r5, %[r]\n\t"
  128434. #else
  128435. "adc r5, %[r]\n\t"
  128436. #endif
  128437. "uxth r7, %[b]\n\t"
  128438. #ifdef WOLFSSL_KEIL
  128439. "muls r6, r7, r6\n\t"
  128440. #elif defined(__clang__)
  128441. "muls r6, r7\n\t"
  128442. #else
  128443. "mul r6, r7\n\t"
  128444. #endif
  128445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128446. "lsrs r7, r6, #16\n\t"
  128447. #else
  128448. "lsr r7, r6, #16\n\t"
  128449. #endif
  128450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128451. "lsls r6, r6, #16\n\t"
  128452. #else
  128453. "lsl r6, r6, #16\n\t"
  128454. #endif
  128455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128456. "adds r3, r3, r6\n\t"
  128457. #else
  128458. "add r3, r3, r6\n\t"
  128459. #endif
  128460. #ifdef WOLFSSL_KEIL
  128461. "adcs r4, r4, r7\n\t"
  128462. #elif defined(__clang__)
  128463. "adcs r4, r7\n\t"
  128464. #else
  128465. "adc r4, r7\n\t"
  128466. #endif
  128467. #ifdef WOLFSSL_KEIL
  128468. "adcs r5, r5, %[r]\n\t"
  128469. #elif defined(__clang__)
  128470. "adcs r5, %[r]\n\t"
  128471. #else
  128472. "adc r5, %[r]\n\t"
  128473. #endif
  128474. "# A[5] * B[7]\n\t"
  128475. "mov %[a], r9\n\t"
  128476. "mov %[b], r10\n\t"
  128477. "ldr %[a], [%[a], #20]\n\t"
  128478. "ldr %[b], [%[b], #28]\n\t"
  128479. "uxth r6, %[a]\n\t"
  128480. "uxth r7, %[b]\n\t"
  128481. #ifdef WOLFSSL_KEIL
  128482. "muls r7, r6, r7\n\t"
  128483. #elif defined(__clang__)
  128484. "muls r7, r6\n\t"
  128485. #else
  128486. "mul r7, r6\n\t"
  128487. #endif
  128488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128489. "adds r3, r3, r7\n\t"
  128490. #else
  128491. "add r3, r3, r7\n\t"
  128492. #endif
  128493. #ifdef WOLFSSL_KEIL
  128494. "adcs r4, r4, %[r]\n\t"
  128495. #elif defined(__clang__)
  128496. "adcs r4, %[r]\n\t"
  128497. #else
  128498. "adc r4, %[r]\n\t"
  128499. #endif
  128500. #ifdef WOLFSSL_KEIL
  128501. "adcs r5, r5, %[r]\n\t"
  128502. #elif defined(__clang__)
  128503. "adcs r5, %[r]\n\t"
  128504. #else
  128505. "adc r5, %[r]\n\t"
  128506. #endif
  128507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128508. "lsrs r7, %[b], #16\n\t"
  128509. #else
  128510. "lsr r7, %[b], #16\n\t"
  128511. #endif
  128512. #ifdef WOLFSSL_KEIL
  128513. "muls r6, r7, r6\n\t"
  128514. #elif defined(__clang__)
  128515. "muls r6, r7\n\t"
  128516. #else
  128517. "mul r6, r7\n\t"
  128518. #endif
  128519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128520. "lsrs r7, r6, #16\n\t"
  128521. #else
  128522. "lsr r7, r6, #16\n\t"
  128523. #endif
  128524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128525. "lsls r6, r6, #16\n\t"
  128526. #else
  128527. "lsl r6, r6, #16\n\t"
  128528. #endif
  128529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128530. "adds r3, r3, r6\n\t"
  128531. #else
  128532. "add r3, r3, r6\n\t"
  128533. #endif
  128534. #ifdef WOLFSSL_KEIL
  128535. "adcs r4, r4, r7\n\t"
  128536. #elif defined(__clang__)
  128537. "adcs r4, r7\n\t"
  128538. #else
  128539. "adc r4, r7\n\t"
  128540. #endif
  128541. #ifdef WOLFSSL_KEIL
  128542. "adcs r5, r5, %[r]\n\t"
  128543. #elif defined(__clang__)
  128544. "adcs r5, %[r]\n\t"
  128545. #else
  128546. "adc r5, %[r]\n\t"
  128547. #endif
  128548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128549. "lsrs r6, %[a], #16\n\t"
  128550. #else
  128551. "lsr r6, %[a], #16\n\t"
  128552. #endif
  128553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128554. "lsrs r7, %[b], #16\n\t"
  128555. #else
  128556. "lsr r7, %[b], #16\n\t"
  128557. #endif
  128558. #ifdef WOLFSSL_KEIL
  128559. "muls r7, r6, r7\n\t"
  128560. #elif defined(__clang__)
  128561. "muls r7, r6\n\t"
  128562. #else
  128563. "mul r7, r6\n\t"
  128564. #endif
  128565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128566. "adds r4, r4, r7\n\t"
  128567. #else
  128568. "add r4, r4, r7\n\t"
  128569. #endif
  128570. #ifdef WOLFSSL_KEIL
  128571. "adcs r5, r5, %[r]\n\t"
  128572. #elif defined(__clang__)
  128573. "adcs r5, %[r]\n\t"
  128574. #else
  128575. "adc r5, %[r]\n\t"
  128576. #endif
  128577. "uxth r7, %[b]\n\t"
  128578. #ifdef WOLFSSL_KEIL
  128579. "muls r6, r7, r6\n\t"
  128580. #elif defined(__clang__)
  128581. "muls r6, r7\n\t"
  128582. #else
  128583. "mul r6, r7\n\t"
  128584. #endif
  128585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128586. "lsrs r7, r6, #16\n\t"
  128587. #else
  128588. "lsr r7, r6, #16\n\t"
  128589. #endif
  128590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128591. "lsls r6, r6, #16\n\t"
  128592. #else
  128593. "lsl r6, r6, #16\n\t"
  128594. #endif
  128595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128596. "adds r3, r3, r6\n\t"
  128597. #else
  128598. "add r3, r3, r6\n\t"
  128599. #endif
  128600. #ifdef WOLFSSL_KEIL
  128601. "adcs r4, r4, r7\n\t"
  128602. #elif defined(__clang__)
  128603. "adcs r4, r7\n\t"
  128604. #else
  128605. "adc r4, r7\n\t"
  128606. #endif
  128607. #ifdef WOLFSSL_KEIL
  128608. "adcs r5, r5, %[r]\n\t"
  128609. #elif defined(__clang__)
  128610. "adcs r5, %[r]\n\t"
  128611. #else
  128612. "adc r5, %[r]\n\t"
  128613. #endif
  128614. "# A[4] * B[8]\n\t"
  128615. "mov %[a], r9\n\t"
  128616. "mov %[b], r10\n\t"
  128617. "ldr %[a], [%[a], #16]\n\t"
  128618. "ldr %[b], [%[b], #32]\n\t"
  128619. "uxth r6, %[a]\n\t"
  128620. "uxth r7, %[b]\n\t"
  128621. #ifdef WOLFSSL_KEIL
  128622. "muls r7, r6, r7\n\t"
  128623. #elif defined(__clang__)
  128624. "muls r7, r6\n\t"
  128625. #else
  128626. "mul r7, r6\n\t"
  128627. #endif
  128628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128629. "adds r3, r3, r7\n\t"
  128630. #else
  128631. "add r3, r3, r7\n\t"
  128632. #endif
  128633. #ifdef WOLFSSL_KEIL
  128634. "adcs r4, r4, %[r]\n\t"
  128635. #elif defined(__clang__)
  128636. "adcs r4, %[r]\n\t"
  128637. #else
  128638. "adc r4, %[r]\n\t"
  128639. #endif
  128640. #ifdef WOLFSSL_KEIL
  128641. "adcs r5, r5, %[r]\n\t"
  128642. #elif defined(__clang__)
  128643. "adcs r5, %[r]\n\t"
  128644. #else
  128645. "adc r5, %[r]\n\t"
  128646. #endif
  128647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128648. "lsrs r7, %[b], #16\n\t"
  128649. #else
  128650. "lsr r7, %[b], #16\n\t"
  128651. #endif
  128652. #ifdef WOLFSSL_KEIL
  128653. "muls r6, r7, r6\n\t"
  128654. #elif defined(__clang__)
  128655. "muls r6, r7\n\t"
  128656. #else
  128657. "mul r6, r7\n\t"
  128658. #endif
  128659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128660. "lsrs r7, r6, #16\n\t"
  128661. #else
  128662. "lsr r7, r6, #16\n\t"
  128663. #endif
  128664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128665. "lsls r6, r6, #16\n\t"
  128666. #else
  128667. "lsl r6, r6, #16\n\t"
  128668. #endif
  128669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128670. "adds r3, r3, r6\n\t"
  128671. #else
  128672. "add r3, r3, r6\n\t"
  128673. #endif
  128674. #ifdef WOLFSSL_KEIL
  128675. "adcs r4, r4, r7\n\t"
  128676. #elif defined(__clang__)
  128677. "adcs r4, r7\n\t"
  128678. #else
  128679. "adc r4, r7\n\t"
  128680. #endif
  128681. #ifdef WOLFSSL_KEIL
  128682. "adcs r5, r5, %[r]\n\t"
  128683. #elif defined(__clang__)
  128684. "adcs r5, %[r]\n\t"
  128685. #else
  128686. "adc r5, %[r]\n\t"
  128687. #endif
  128688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128689. "lsrs r6, %[a], #16\n\t"
  128690. #else
  128691. "lsr r6, %[a], #16\n\t"
  128692. #endif
  128693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128694. "lsrs r7, %[b], #16\n\t"
  128695. #else
  128696. "lsr r7, %[b], #16\n\t"
  128697. #endif
  128698. #ifdef WOLFSSL_KEIL
  128699. "muls r7, r6, r7\n\t"
  128700. #elif defined(__clang__)
  128701. "muls r7, r6\n\t"
  128702. #else
  128703. "mul r7, r6\n\t"
  128704. #endif
  128705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128706. "adds r4, r4, r7\n\t"
  128707. #else
  128708. "add r4, r4, r7\n\t"
  128709. #endif
  128710. #ifdef WOLFSSL_KEIL
  128711. "adcs r5, r5, %[r]\n\t"
  128712. #elif defined(__clang__)
  128713. "adcs r5, %[r]\n\t"
  128714. #else
  128715. "adc r5, %[r]\n\t"
  128716. #endif
  128717. "uxth r7, %[b]\n\t"
  128718. #ifdef WOLFSSL_KEIL
  128719. "muls r6, r7, r6\n\t"
  128720. #elif defined(__clang__)
  128721. "muls r6, r7\n\t"
  128722. #else
  128723. "mul r6, r7\n\t"
  128724. #endif
  128725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128726. "lsrs r7, r6, #16\n\t"
  128727. #else
  128728. "lsr r7, r6, #16\n\t"
  128729. #endif
  128730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128731. "lsls r6, r6, #16\n\t"
  128732. #else
  128733. "lsl r6, r6, #16\n\t"
  128734. #endif
  128735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128736. "adds r3, r3, r6\n\t"
  128737. #else
  128738. "add r3, r3, r6\n\t"
  128739. #endif
  128740. #ifdef WOLFSSL_KEIL
  128741. "adcs r4, r4, r7\n\t"
  128742. #elif defined(__clang__)
  128743. "adcs r4, r7\n\t"
  128744. #else
  128745. "adc r4, r7\n\t"
  128746. #endif
  128747. #ifdef WOLFSSL_KEIL
  128748. "adcs r5, r5, %[r]\n\t"
  128749. #elif defined(__clang__)
  128750. "adcs r5, %[r]\n\t"
  128751. #else
  128752. "adc r5, %[r]\n\t"
  128753. #endif
  128754. "# A[3] * B[9]\n\t"
  128755. "mov %[a], r9\n\t"
  128756. "mov %[b], r10\n\t"
  128757. "ldr %[a], [%[a], #12]\n\t"
  128758. "ldr %[b], [%[b], #36]\n\t"
  128759. "uxth r6, %[a]\n\t"
  128760. "uxth r7, %[b]\n\t"
  128761. #ifdef WOLFSSL_KEIL
  128762. "muls r7, r6, r7\n\t"
  128763. #elif defined(__clang__)
  128764. "muls r7, r6\n\t"
  128765. #else
  128766. "mul r7, r6\n\t"
  128767. #endif
  128768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128769. "adds r3, r3, r7\n\t"
  128770. #else
  128771. "add r3, r3, r7\n\t"
  128772. #endif
  128773. #ifdef WOLFSSL_KEIL
  128774. "adcs r4, r4, %[r]\n\t"
  128775. #elif defined(__clang__)
  128776. "adcs r4, %[r]\n\t"
  128777. #else
  128778. "adc r4, %[r]\n\t"
  128779. #endif
  128780. #ifdef WOLFSSL_KEIL
  128781. "adcs r5, r5, %[r]\n\t"
  128782. #elif defined(__clang__)
  128783. "adcs r5, %[r]\n\t"
  128784. #else
  128785. "adc r5, %[r]\n\t"
  128786. #endif
  128787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128788. "lsrs r7, %[b], #16\n\t"
  128789. #else
  128790. "lsr r7, %[b], #16\n\t"
  128791. #endif
  128792. #ifdef WOLFSSL_KEIL
  128793. "muls r6, r7, r6\n\t"
  128794. #elif defined(__clang__)
  128795. "muls r6, r7\n\t"
  128796. #else
  128797. "mul r6, r7\n\t"
  128798. #endif
  128799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128800. "lsrs r7, r6, #16\n\t"
  128801. #else
  128802. "lsr r7, r6, #16\n\t"
  128803. #endif
  128804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128805. "lsls r6, r6, #16\n\t"
  128806. #else
  128807. "lsl r6, r6, #16\n\t"
  128808. #endif
  128809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128810. "adds r3, r3, r6\n\t"
  128811. #else
  128812. "add r3, r3, r6\n\t"
  128813. #endif
  128814. #ifdef WOLFSSL_KEIL
  128815. "adcs r4, r4, r7\n\t"
  128816. #elif defined(__clang__)
  128817. "adcs r4, r7\n\t"
  128818. #else
  128819. "adc r4, r7\n\t"
  128820. #endif
  128821. #ifdef WOLFSSL_KEIL
  128822. "adcs r5, r5, %[r]\n\t"
  128823. #elif defined(__clang__)
  128824. "adcs r5, %[r]\n\t"
  128825. #else
  128826. "adc r5, %[r]\n\t"
  128827. #endif
  128828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128829. "lsrs r6, %[a], #16\n\t"
  128830. #else
  128831. "lsr r6, %[a], #16\n\t"
  128832. #endif
  128833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128834. "lsrs r7, %[b], #16\n\t"
  128835. #else
  128836. "lsr r7, %[b], #16\n\t"
  128837. #endif
  128838. #ifdef WOLFSSL_KEIL
  128839. "muls r7, r6, r7\n\t"
  128840. #elif defined(__clang__)
  128841. "muls r7, r6\n\t"
  128842. #else
  128843. "mul r7, r6\n\t"
  128844. #endif
  128845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128846. "adds r4, r4, r7\n\t"
  128847. #else
  128848. "add r4, r4, r7\n\t"
  128849. #endif
  128850. #ifdef WOLFSSL_KEIL
  128851. "adcs r5, r5, %[r]\n\t"
  128852. #elif defined(__clang__)
  128853. "adcs r5, %[r]\n\t"
  128854. #else
  128855. "adc r5, %[r]\n\t"
  128856. #endif
  128857. "uxth r7, %[b]\n\t"
  128858. #ifdef WOLFSSL_KEIL
  128859. "muls r6, r7, r6\n\t"
  128860. #elif defined(__clang__)
  128861. "muls r6, r7\n\t"
  128862. #else
  128863. "mul r6, r7\n\t"
  128864. #endif
  128865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128866. "lsrs r7, r6, #16\n\t"
  128867. #else
  128868. "lsr r7, r6, #16\n\t"
  128869. #endif
  128870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128871. "lsls r6, r6, #16\n\t"
  128872. #else
  128873. "lsl r6, r6, #16\n\t"
  128874. #endif
  128875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128876. "adds r3, r3, r6\n\t"
  128877. #else
  128878. "add r3, r3, r6\n\t"
  128879. #endif
  128880. #ifdef WOLFSSL_KEIL
  128881. "adcs r4, r4, r7\n\t"
  128882. #elif defined(__clang__)
  128883. "adcs r4, r7\n\t"
  128884. #else
  128885. "adc r4, r7\n\t"
  128886. #endif
  128887. #ifdef WOLFSSL_KEIL
  128888. "adcs r5, r5, %[r]\n\t"
  128889. #elif defined(__clang__)
  128890. "adcs r5, %[r]\n\t"
  128891. #else
  128892. "adc r5, %[r]\n\t"
  128893. #endif
  128894. "# A[2] * B[10]\n\t"
  128895. "mov %[a], r9\n\t"
  128896. "mov %[b], r10\n\t"
  128897. "ldr %[a], [%[a], #8]\n\t"
  128898. "ldr %[b], [%[b], #40]\n\t"
  128899. "uxth r6, %[a]\n\t"
  128900. "uxth r7, %[b]\n\t"
  128901. #ifdef WOLFSSL_KEIL
  128902. "muls r7, r6, r7\n\t"
  128903. #elif defined(__clang__)
  128904. "muls r7, r6\n\t"
  128905. #else
  128906. "mul r7, r6\n\t"
  128907. #endif
  128908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128909. "adds r3, r3, r7\n\t"
  128910. #else
  128911. "add r3, r3, r7\n\t"
  128912. #endif
  128913. #ifdef WOLFSSL_KEIL
  128914. "adcs r4, r4, %[r]\n\t"
  128915. #elif defined(__clang__)
  128916. "adcs r4, %[r]\n\t"
  128917. #else
  128918. "adc r4, %[r]\n\t"
  128919. #endif
  128920. #ifdef WOLFSSL_KEIL
  128921. "adcs r5, r5, %[r]\n\t"
  128922. #elif defined(__clang__)
  128923. "adcs r5, %[r]\n\t"
  128924. #else
  128925. "adc r5, %[r]\n\t"
  128926. #endif
  128927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128928. "lsrs r7, %[b], #16\n\t"
  128929. #else
  128930. "lsr r7, %[b], #16\n\t"
  128931. #endif
  128932. #ifdef WOLFSSL_KEIL
  128933. "muls r6, r7, r6\n\t"
  128934. #elif defined(__clang__)
  128935. "muls r6, r7\n\t"
  128936. #else
  128937. "mul r6, r7\n\t"
  128938. #endif
  128939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128940. "lsrs r7, r6, #16\n\t"
  128941. #else
  128942. "lsr r7, r6, #16\n\t"
  128943. #endif
  128944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128945. "lsls r6, r6, #16\n\t"
  128946. #else
  128947. "lsl r6, r6, #16\n\t"
  128948. #endif
  128949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128950. "adds r3, r3, r6\n\t"
  128951. #else
  128952. "add r3, r3, r6\n\t"
  128953. #endif
  128954. #ifdef WOLFSSL_KEIL
  128955. "adcs r4, r4, r7\n\t"
  128956. #elif defined(__clang__)
  128957. "adcs r4, r7\n\t"
  128958. #else
  128959. "adc r4, r7\n\t"
  128960. #endif
  128961. #ifdef WOLFSSL_KEIL
  128962. "adcs r5, r5, %[r]\n\t"
  128963. #elif defined(__clang__)
  128964. "adcs r5, %[r]\n\t"
  128965. #else
  128966. "adc r5, %[r]\n\t"
  128967. #endif
  128968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128969. "lsrs r6, %[a], #16\n\t"
  128970. #else
  128971. "lsr r6, %[a], #16\n\t"
  128972. #endif
  128973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128974. "lsrs r7, %[b], #16\n\t"
  128975. #else
  128976. "lsr r7, %[b], #16\n\t"
  128977. #endif
  128978. #ifdef WOLFSSL_KEIL
  128979. "muls r7, r6, r7\n\t"
  128980. #elif defined(__clang__)
  128981. "muls r7, r6\n\t"
  128982. #else
  128983. "mul r7, r6\n\t"
  128984. #endif
  128985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128986. "adds r4, r4, r7\n\t"
  128987. #else
  128988. "add r4, r4, r7\n\t"
  128989. #endif
  128990. #ifdef WOLFSSL_KEIL
  128991. "adcs r5, r5, %[r]\n\t"
  128992. #elif defined(__clang__)
  128993. "adcs r5, %[r]\n\t"
  128994. #else
  128995. "adc r5, %[r]\n\t"
  128996. #endif
  128997. "uxth r7, %[b]\n\t"
  128998. #ifdef WOLFSSL_KEIL
  128999. "muls r6, r7, r6\n\t"
  129000. #elif defined(__clang__)
  129001. "muls r6, r7\n\t"
  129002. #else
  129003. "mul r6, r7\n\t"
  129004. #endif
  129005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129006. "lsrs r7, r6, #16\n\t"
  129007. #else
  129008. "lsr r7, r6, #16\n\t"
  129009. #endif
  129010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129011. "lsls r6, r6, #16\n\t"
  129012. #else
  129013. "lsl r6, r6, #16\n\t"
  129014. #endif
  129015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129016. "adds r3, r3, r6\n\t"
  129017. #else
  129018. "add r3, r3, r6\n\t"
  129019. #endif
  129020. #ifdef WOLFSSL_KEIL
  129021. "adcs r4, r4, r7\n\t"
  129022. #elif defined(__clang__)
  129023. "adcs r4, r7\n\t"
  129024. #else
  129025. "adc r4, r7\n\t"
  129026. #endif
  129027. #ifdef WOLFSSL_KEIL
  129028. "adcs r5, r5, %[r]\n\t"
  129029. #elif defined(__clang__)
  129030. "adcs r5, %[r]\n\t"
  129031. #else
  129032. "adc r5, %[r]\n\t"
  129033. #endif
  129034. "# A[1] * B[11]\n\t"
  129035. "mov %[a], r9\n\t"
  129036. "mov %[b], r10\n\t"
  129037. "ldr %[a], [%[a], #4]\n\t"
  129038. "ldr %[b], [%[b], #44]\n\t"
  129039. "uxth r6, %[a]\n\t"
  129040. "uxth r7, %[b]\n\t"
  129041. #ifdef WOLFSSL_KEIL
  129042. "muls r7, r6, r7\n\t"
  129043. #elif defined(__clang__)
  129044. "muls r7, r6\n\t"
  129045. #else
  129046. "mul r7, r6\n\t"
  129047. #endif
  129048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129049. "adds r3, r3, r7\n\t"
  129050. #else
  129051. "add r3, r3, r7\n\t"
  129052. #endif
  129053. #ifdef WOLFSSL_KEIL
  129054. "adcs r4, r4, %[r]\n\t"
  129055. #elif defined(__clang__)
  129056. "adcs r4, %[r]\n\t"
  129057. #else
  129058. "adc r4, %[r]\n\t"
  129059. #endif
  129060. #ifdef WOLFSSL_KEIL
  129061. "adcs r5, r5, %[r]\n\t"
  129062. #elif defined(__clang__)
  129063. "adcs r5, %[r]\n\t"
  129064. #else
  129065. "adc r5, %[r]\n\t"
  129066. #endif
  129067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129068. "lsrs r7, %[b], #16\n\t"
  129069. #else
  129070. "lsr r7, %[b], #16\n\t"
  129071. #endif
  129072. #ifdef WOLFSSL_KEIL
  129073. "muls r6, r7, r6\n\t"
  129074. #elif defined(__clang__)
  129075. "muls r6, r7\n\t"
  129076. #else
  129077. "mul r6, r7\n\t"
  129078. #endif
  129079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129080. "lsrs r7, r6, #16\n\t"
  129081. #else
  129082. "lsr r7, r6, #16\n\t"
  129083. #endif
  129084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129085. "lsls r6, r6, #16\n\t"
  129086. #else
  129087. "lsl r6, r6, #16\n\t"
  129088. #endif
  129089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129090. "adds r3, r3, r6\n\t"
  129091. #else
  129092. "add r3, r3, r6\n\t"
  129093. #endif
  129094. #ifdef WOLFSSL_KEIL
  129095. "adcs r4, r4, r7\n\t"
  129096. #elif defined(__clang__)
  129097. "adcs r4, r7\n\t"
  129098. #else
  129099. "adc r4, r7\n\t"
  129100. #endif
  129101. #ifdef WOLFSSL_KEIL
  129102. "adcs r5, r5, %[r]\n\t"
  129103. #elif defined(__clang__)
  129104. "adcs r5, %[r]\n\t"
  129105. #else
  129106. "adc r5, %[r]\n\t"
  129107. #endif
  129108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129109. "lsrs r6, %[a], #16\n\t"
  129110. #else
  129111. "lsr r6, %[a], #16\n\t"
  129112. #endif
  129113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129114. "lsrs r7, %[b], #16\n\t"
  129115. #else
  129116. "lsr r7, %[b], #16\n\t"
  129117. #endif
  129118. #ifdef WOLFSSL_KEIL
  129119. "muls r7, r6, r7\n\t"
  129120. #elif defined(__clang__)
  129121. "muls r7, r6\n\t"
  129122. #else
  129123. "mul r7, r6\n\t"
  129124. #endif
  129125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129126. "adds r4, r4, r7\n\t"
  129127. #else
  129128. "add r4, r4, r7\n\t"
  129129. #endif
  129130. #ifdef WOLFSSL_KEIL
  129131. "adcs r5, r5, %[r]\n\t"
  129132. #elif defined(__clang__)
  129133. "adcs r5, %[r]\n\t"
  129134. #else
  129135. "adc r5, %[r]\n\t"
  129136. #endif
  129137. "uxth r7, %[b]\n\t"
  129138. #ifdef WOLFSSL_KEIL
  129139. "muls r6, r7, r6\n\t"
  129140. #elif defined(__clang__)
  129141. "muls r6, r7\n\t"
  129142. #else
  129143. "mul r6, r7\n\t"
  129144. #endif
  129145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129146. "lsrs r7, r6, #16\n\t"
  129147. #else
  129148. "lsr r7, r6, #16\n\t"
  129149. #endif
  129150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129151. "lsls r6, r6, #16\n\t"
  129152. #else
  129153. "lsl r6, r6, #16\n\t"
  129154. #endif
  129155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129156. "adds r3, r3, r6\n\t"
  129157. #else
  129158. "add r3, r3, r6\n\t"
  129159. #endif
  129160. #ifdef WOLFSSL_KEIL
  129161. "adcs r4, r4, r7\n\t"
  129162. #elif defined(__clang__)
  129163. "adcs r4, r7\n\t"
  129164. #else
  129165. "adc r4, r7\n\t"
  129166. #endif
  129167. #ifdef WOLFSSL_KEIL
  129168. "adcs r5, r5, %[r]\n\t"
  129169. #elif defined(__clang__)
  129170. "adcs r5, %[r]\n\t"
  129171. #else
  129172. "adc r5, %[r]\n\t"
  129173. #endif
  129174. "# A[0] * B[12]\n\t"
  129175. "mov %[a], r9\n\t"
  129176. "mov %[b], r10\n\t"
  129177. "ldr %[a], [%[a]]\n\t"
  129178. "ldr %[b], [%[b], #48]\n\t"
  129179. "uxth r6, %[a]\n\t"
  129180. "uxth r7, %[b]\n\t"
  129181. #ifdef WOLFSSL_KEIL
  129182. "muls r7, r6, r7\n\t"
  129183. #elif defined(__clang__)
  129184. "muls r7, r6\n\t"
  129185. #else
  129186. "mul r7, r6\n\t"
  129187. #endif
  129188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129189. "adds r3, r3, r7\n\t"
  129190. #else
  129191. "add r3, r3, r7\n\t"
  129192. #endif
  129193. #ifdef WOLFSSL_KEIL
  129194. "adcs r4, r4, %[r]\n\t"
  129195. #elif defined(__clang__)
  129196. "adcs r4, %[r]\n\t"
  129197. #else
  129198. "adc r4, %[r]\n\t"
  129199. #endif
  129200. #ifdef WOLFSSL_KEIL
  129201. "adcs r5, r5, %[r]\n\t"
  129202. #elif defined(__clang__)
  129203. "adcs r5, %[r]\n\t"
  129204. #else
  129205. "adc r5, %[r]\n\t"
  129206. #endif
  129207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129208. "lsrs r7, %[b], #16\n\t"
  129209. #else
  129210. "lsr r7, %[b], #16\n\t"
  129211. #endif
  129212. #ifdef WOLFSSL_KEIL
  129213. "muls r6, r7, r6\n\t"
  129214. #elif defined(__clang__)
  129215. "muls r6, r7\n\t"
  129216. #else
  129217. "mul r6, r7\n\t"
  129218. #endif
  129219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129220. "lsrs r7, r6, #16\n\t"
  129221. #else
  129222. "lsr r7, r6, #16\n\t"
  129223. #endif
  129224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129225. "lsls r6, r6, #16\n\t"
  129226. #else
  129227. "lsl r6, r6, #16\n\t"
  129228. #endif
  129229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129230. "adds r3, r3, r6\n\t"
  129231. #else
  129232. "add r3, r3, r6\n\t"
  129233. #endif
  129234. #ifdef WOLFSSL_KEIL
  129235. "adcs r4, r4, r7\n\t"
  129236. #elif defined(__clang__)
  129237. "adcs r4, r7\n\t"
  129238. #else
  129239. "adc r4, r7\n\t"
  129240. #endif
  129241. #ifdef WOLFSSL_KEIL
  129242. "adcs r5, r5, %[r]\n\t"
  129243. #elif defined(__clang__)
  129244. "adcs r5, %[r]\n\t"
  129245. #else
  129246. "adc r5, %[r]\n\t"
  129247. #endif
  129248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129249. "lsrs r6, %[a], #16\n\t"
  129250. #else
  129251. "lsr r6, %[a], #16\n\t"
  129252. #endif
  129253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129254. "lsrs r7, %[b], #16\n\t"
  129255. #else
  129256. "lsr r7, %[b], #16\n\t"
  129257. #endif
  129258. #ifdef WOLFSSL_KEIL
  129259. "muls r7, r6, r7\n\t"
  129260. #elif defined(__clang__)
  129261. "muls r7, r6\n\t"
  129262. #else
  129263. "mul r7, r6\n\t"
  129264. #endif
  129265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129266. "adds r4, r4, r7\n\t"
  129267. #else
  129268. "add r4, r4, r7\n\t"
  129269. #endif
  129270. #ifdef WOLFSSL_KEIL
  129271. "adcs r5, r5, %[r]\n\t"
  129272. #elif defined(__clang__)
  129273. "adcs r5, %[r]\n\t"
  129274. #else
  129275. "adc r5, %[r]\n\t"
  129276. #endif
  129277. "uxth r7, %[b]\n\t"
  129278. #ifdef WOLFSSL_KEIL
  129279. "muls r6, r7, r6\n\t"
  129280. #elif defined(__clang__)
  129281. "muls r6, r7\n\t"
  129282. #else
  129283. "mul r6, r7\n\t"
  129284. #endif
  129285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129286. "lsrs r7, r6, #16\n\t"
  129287. #else
  129288. "lsr r7, r6, #16\n\t"
  129289. #endif
  129290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129291. "lsls r6, r6, #16\n\t"
  129292. #else
  129293. "lsl r6, r6, #16\n\t"
  129294. #endif
  129295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129296. "adds r3, r3, r6\n\t"
  129297. #else
  129298. "add r3, r3, r6\n\t"
  129299. #endif
  129300. #ifdef WOLFSSL_KEIL
  129301. "adcs r4, r4, r7\n\t"
  129302. #elif defined(__clang__)
  129303. "adcs r4, r7\n\t"
  129304. #else
  129305. "adc r4, r7\n\t"
  129306. #endif
  129307. #ifdef WOLFSSL_KEIL
  129308. "adcs r5, r5, %[r]\n\t"
  129309. #elif defined(__clang__)
  129310. "adcs r5, %[r]\n\t"
  129311. #else
  129312. "adc r5, %[r]\n\t"
  129313. #endif
  129314. "str r3, [sp, #48]\n\t"
  129315. "# A[0] * B[13]\n\t"
  129316. "movs r3, #0\n\t"
  129317. "mov %[a], r9\n\t"
  129318. "mov %[b], r10\n\t"
  129319. "ldr %[a], [%[a]]\n\t"
  129320. "ldr %[b], [%[b], #52]\n\t"
  129321. "uxth r6, %[a]\n\t"
  129322. "uxth r7, %[b]\n\t"
  129323. #ifdef WOLFSSL_KEIL
  129324. "muls r7, r6, r7\n\t"
  129325. #elif defined(__clang__)
  129326. "muls r7, r6\n\t"
  129327. #else
  129328. "mul r7, r6\n\t"
  129329. #endif
  129330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129331. "adds r4, r4, r7\n\t"
  129332. #else
  129333. "add r4, r4, r7\n\t"
  129334. #endif
  129335. #ifdef WOLFSSL_KEIL
  129336. "adcs r5, r5, %[r]\n\t"
  129337. #elif defined(__clang__)
  129338. "adcs r5, %[r]\n\t"
  129339. #else
  129340. "adc r5, %[r]\n\t"
  129341. #endif
  129342. #ifdef WOLFSSL_KEIL
  129343. "adcs r3, r3, %[r]\n\t"
  129344. #elif defined(__clang__)
  129345. "adcs r3, %[r]\n\t"
  129346. #else
  129347. "adc r3, %[r]\n\t"
  129348. #endif
  129349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129350. "lsrs r7, %[b], #16\n\t"
  129351. #else
  129352. "lsr r7, %[b], #16\n\t"
  129353. #endif
  129354. #ifdef WOLFSSL_KEIL
  129355. "muls r6, r7, r6\n\t"
  129356. #elif defined(__clang__)
  129357. "muls r6, r7\n\t"
  129358. #else
  129359. "mul r6, r7\n\t"
  129360. #endif
  129361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129362. "lsrs r7, r6, #16\n\t"
  129363. #else
  129364. "lsr r7, r6, #16\n\t"
  129365. #endif
  129366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129367. "lsls r6, r6, #16\n\t"
  129368. #else
  129369. "lsl r6, r6, #16\n\t"
  129370. #endif
  129371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129372. "adds r4, r4, r6\n\t"
  129373. #else
  129374. "add r4, r4, r6\n\t"
  129375. #endif
  129376. #ifdef WOLFSSL_KEIL
  129377. "adcs r5, r5, r7\n\t"
  129378. #elif defined(__clang__)
  129379. "adcs r5, r7\n\t"
  129380. #else
  129381. "adc r5, r7\n\t"
  129382. #endif
  129383. #ifdef WOLFSSL_KEIL
  129384. "adcs r3, r3, %[r]\n\t"
  129385. #elif defined(__clang__)
  129386. "adcs r3, %[r]\n\t"
  129387. #else
  129388. "adc r3, %[r]\n\t"
  129389. #endif
  129390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129391. "lsrs r6, %[a], #16\n\t"
  129392. #else
  129393. "lsr r6, %[a], #16\n\t"
  129394. #endif
  129395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129396. "lsrs r7, %[b], #16\n\t"
  129397. #else
  129398. "lsr r7, %[b], #16\n\t"
  129399. #endif
  129400. #ifdef WOLFSSL_KEIL
  129401. "muls r7, r6, r7\n\t"
  129402. #elif defined(__clang__)
  129403. "muls r7, r6\n\t"
  129404. #else
  129405. "mul r7, r6\n\t"
  129406. #endif
  129407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129408. "adds r5, r5, r7\n\t"
  129409. #else
  129410. "add r5, r5, r7\n\t"
  129411. #endif
  129412. #ifdef WOLFSSL_KEIL
  129413. "adcs r3, r3, %[r]\n\t"
  129414. #elif defined(__clang__)
  129415. "adcs r3, %[r]\n\t"
  129416. #else
  129417. "adc r3, %[r]\n\t"
  129418. #endif
  129419. "uxth r7, %[b]\n\t"
  129420. #ifdef WOLFSSL_KEIL
  129421. "muls r6, r7, r6\n\t"
  129422. #elif defined(__clang__)
  129423. "muls r6, r7\n\t"
  129424. #else
  129425. "mul r6, r7\n\t"
  129426. #endif
  129427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129428. "lsrs r7, r6, #16\n\t"
  129429. #else
  129430. "lsr r7, r6, #16\n\t"
  129431. #endif
  129432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129433. "lsls r6, r6, #16\n\t"
  129434. #else
  129435. "lsl r6, r6, #16\n\t"
  129436. #endif
  129437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129438. "adds r4, r4, r6\n\t"
  129439. #else
  129440. "add r4, r4, r6\n\t"
  129441. #endif
  129442. #ifdef WOLFSSL_KEIL
  129443. "adcs r5, r5, r7\n\t"
  129444. #elif defined(__clang__)
  129445. "adcs r5, r7\n\t"
  129446. #else
  129447. "adc r5, r7\n\t"
  129448. #endif
  129449. #ifdef WOLFSSL_KEIL
  129450. "adcs r3, r3, %[r]\n\t"
  129451. #elif defined(__clang__)
  129452. "adcs r3, %[r]\n\t"
  129453. #else
  129454. "adc r3, %[r]\n\t"
  129455. #endif
  129456. "# A[1] * B[12]\n\t"
  129457. "mov %[a], r9\n\t"
  129458. "mov %[b], r10\n\t"
  129459. "ldr %[a], [%[a], #4]\n\t"
  129460. "ldr %[b], [%[b], #48]\n\t"
  129461. "uxth r6, %[a]\n\t"
  129462. "uxth r7, %[b]\n\t"
  129463. #ifdef WOLFSSL_KEIL
  129464. "muls r7, r6, r7\n\t"
  129465. #elif defined(__clang__)
  129466. "muls r7, r6\n\t"
  129467. #else
  129468. "mul r7, r6\n\t"
  129469. #endif
  129470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129471. "adds r4, r4, r7\n\t"
  129472. #else
  129473. "add r4, r4, r7\n\t"
  129474. #endif
  129475. #ifdef WOLFSSL_KEIL
  129476. "adcs r5, r5, %[r]\n\t"
  129477. #elif defined(__clang__)
  129478. "adcs r5, %[r]\n\t"
  129479. #else
  129480. "adc r5, %[r]\n\t"
  129481. #endif
  129482. #ifdef WOLFSSL_KEIL
  129483. "adcs r3, r3, %[r]\n\t"
  129484. #elif defined(__clang__)
  129485. "adcs r3, %[r]\n\t"
  129486. #else
  129487. "adc r3, %[r]\n\t"
  129488. #endif
  129489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129490. "lsrs r7, %[b], #16\n\t"
  129491. #else
  129492. "lsr r7, %[b], #16\n\t"
  129493. #endif
  129494. #ifdef WOLFSSL_KEIL
  129495. "muls r6, r7, r6\n\t"
  129496. #elif defined(__clang__)
  129497. "muls r6, r7\n\t"
  129498. #else
  129499. "mul r6, r7\n\t"
  129500. #endif
  129501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129502. "lsrs r7, r6, #16\n\t"
  129503. #else
  129504. "lsr r7, r6, #16\n\t"
  129505. #endif
  129506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129507. "lsls r6, r6, #16\n\t"
  129508. #else
  129509. "lsl r6, r6, #16\n\t"
  129510. #endif
  129511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129512. "adds r4, r4, r6\n\t"
  129513. #else
  129514. "add r4, r4, r6\n\t"
  129515. #endif
  129516. #ifdef WOLFSSL_KEIL
  129517. "adcs r5, r5, r7\n\t"
  129518. #elif defined(__clang__)
  129519. "adcs r5, r7\n\t"
  129520. #else
  129521. "adc r5, r7\n\t"
  129522. #endif
  129523. #ifdef WOLFSSL_KEIL
  129524. "adcs r3, r3, %[r]\n\t"
  129525. #elif defined(__clang__)
  129526. "adcs r3, %[r]\n\t"
  129527. #else
  129528. "adc r3, %[r]\n\t"
  129529. #endif
  129530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129531. "lsrs r6, %[a], #16\n\t"
  129532. #else
  129533. "lsr r6, %[a], #16\n\t"
  129534. #endif
  129535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129536. "lsrs r7, %[b], #16\n\t"
  129537. #else
  129538. "lsr r7, %[b], #16\n\t"
  129539. #endif
  129540. #ifdef WOLFSSL_KEIL
  129541. "muls r7, r6, r7\n\t"
  129542. #elif defined(__clang__)
  129543. "muls r7, r6\n\t"
  129544. #else
  129545. "mul r7, r6\n\t"
  129546. #endif
  129547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129548. "adds r5, r5, r7\n\t"
  129549. #else
  129550. "add r5, r5, r7\n\t"
  129551. #endif
  129552. #ifdef WOLFSSL_KEIL
  129553. "adcs r3, r3, %[r]\n\t"
  129554. #elif defined(__clang__)
  129555. "adcs r3, %[r]\n\t"
  129556. #else
  129557. "adc r3, %[r]\n\t"
  129558. #endif
  129559. "uxth r7, %[b]\n\t"
  129560. #ifdef WOLFSSL_KEIL
  129561. "muls r6, r7, r6\n\t"
  129562. #elif defined(__clang__)
  129563. "muls r6, r7\n\t"
  129564. #else
  129565. "mul r6, r7\n\t"
  129566. #endif
  129567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129568. "lsrs r7, r6, #16\n\t"
  129569. #else
  129570. "lsr r7, r6, #16\n\t"
  129571. #endif
  129572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129573. "lsls r6, r6, #16\n\t"
  129574. #else
  129575. "lsl r6, r6, #16\n\t"
  129576. #endif
  129577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129578. "adds r4, r4, r6\n\t"
  129579. #else
  129580. "add r4, r4, r6\n\t"
  129581. #endif
  129582. #ifdef WOLFSSL_KEIL
  129583. "adcs r5, r5, r7\n\t"
  129584. #elif defined(__clang__)
  129585. "adcs r5, r7\n\t"
  129586. #else
  129587. "adc r5, r7\n\t"
  129588. #endif
  129589. #ifdef WOLFSSL_KEIL
  129590. "adcs r3, r3, %[r]\n\t"
  129591. #elif defined(__clang__)
  129592. "adcs r3, %[r]\n\t"
  129593. #else
  129594. "adc r3, %[r]\n\t"
  129595. #endif
  129596. "# A[2] * B[11]\n\t"
  129597. "mov %[a], r9\n\t"
  129598. "mov %[b], r10\n\t"
  129599. "ldr %[a], [%[a], #8]\n\t"
  129600. "ldr %[b], [%[b], #44]\n\t"
  129601. "uxth r6, %[a]\n\t"
  129602. "uxth r7, %[b]\n\t"
  129603. #ifdef WOLFSSL_KEIL
  129604. "muls r7, r6, r7\n\t"
  129605. #elif defined(__clang__)
  129606. "muls r7, r6\n\t"
  129607. #else
  129608. "mul r7, r6\n\t"
  129609. #endif
  129610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129611. "adds r4, r4, r7\n\t"
  129612. #else
  129613. "add r4, r4, r7\n\t"
  129614. #endif
  129615. #ifdef WOLFSSL_KEIL
  129616. "adcs r5, r5, %[r]\n\t"
  129617. #elif defined(__clang__)
  129618. "adcs r5, %[r]\n\t"
  129619. #else
  129620. "adc r5, %[r]\n\t"
  129621. #endif
  129622. #ifdef WOLFSSL_KEIL
  129623. "adcs r3, r3, %[r]\n\t"
  129624. #elif defined(__clang__)
  129625. "adcs r3, %[r]\n\t"
  129626. #else
  129627. "adc r3, %[r]\n\t"
  129628. #endif
  129629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129630. "lsrs r7, %[b], #16\n\t"
  129631. #else
  129632. "lsr r7, %[b], #16\n\t"
  129633. #endif
  129634. #ifdef WOLFSSL_KEIL
  129635. "muls r6, r7, r6\n\t"
  129636. #elif defined(__clang__)
  129637. "muls r6, r7\n\t"
  129638. #else
  129639. "mul r6, r7\n\t"
  129640. #endif
  129641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129642. "lsrs r7, r6, #16\n\t"
  129643. #else
  129644. "lsr r7, r6, #16\n\t"
  129645. #endif
  129646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129647. "lsls r6, r6, #16\n\t"
  129648. #else
  129649. "lsl r6, r6, #16\n\t"
  129650. #endif
  129651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129652. "adds r4, r4, r6\n\t"
  129653. #else
  129654. "add r4, r4, r6\n\t"
  129655. #endif
  129656. #ifdef WOLFSSL_KEIL
  129657. "adcs r5, r5, r7\n\t"
  129658. #elif defined(__clang__)
  129659. "adcs r5, r7\n\t"
  129660. #else
  129661. "adc r5, r7\n\t"
  129662. #endif
  129663. #ifdef WOLFSSL_KEIL
  129664. "adcs r3, r3, %[r]\n\t"
  129665. #elif defined(__clang__)
  129666. "adcs r3, %[r]\n\t"
  129667. #else
  129668. "adc r3, %[r]\n\t"
  129669. #endif
  129670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129671. "lsrs r6, %[a], #16\n\t"
  129672. #else
  129673. "lsr r6, %[a], #16\n\t"
  129674. #endif
  129675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129676. "lsrs r7, %[b], #16\n\t"
  129677. #else
  129678. "lsr r7, %[b], #16\n\t"
  129679. #endif
  129680. #ifdef WOLFSSL_KEIL
  129681. "muls r7, r6, r7\n\t"
  129682. #elif defined(__clang__)
  129683. "muls r7, r6\n\t"
  129684. #else
  129685. "mul r7, r6\n\t"
  129686. #endif
  129687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129688. "adds r5, r5, r7\n\t"
  129689. #else
  129690. "add r5, r5, r7\n\t"
  129691. #endif
  129692. #ifdef WOLFSSL_KEIL
  129693. "adcs r3, r3, %[r]\n\t"
  129694. #elif defined(__clang__)
  129695. "adcs r3, %[r]\n\t"
  129696. #else
  129697. "adc r3, %[r]\n\t"
  129698. #endif
  129699. "uxth r7, %[b]\n\t"
  129700. #ifdef WOLFSSL_KEIL
  129701. "muls r6, r7, r6\n\t"
  129702. #elif defined(__clang__)
  129703. "muls r6, r7\n\t"
  129704. #else
  129705. "mul r6, r7\n\t"
  129706. #endif
  129707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129708. "lsrs r7, r6, #16\n\t"
  129709. #else
  129710. "lsr r7, r6, #16\n\t"
  129711. #endif
  129712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129713. "lsls r6, r6, #16\n\t"
  129714. #else
  129715. "lsl r6, r6, #16\n\t"
  129716. #endif
  129717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129718. "adds r4, r4, r6\n\t"
  129719. #else
  129720. "add r4, r4, r6\n\t"
  129721. #endif
  129722. #ifdef WOLFSSL_KEIL
  129723. "adcs r5, r5, r7\n\t"
  129724. #elif defined(__clang__)
  129725. "adcs r5, r7\n\t"
  129726. #else
  129727. "adc r5, r7\n\t"
  129728. #endif
  129729. #ifdef WOLFSSL_KEIL
  129730. "adcs r3, r3, %[r]\n\t"
  129731. #elif defined(__clang__)
  129732. "adcs r3, %[r]\n\t"
  129733. #else
  129734. "adc r3, %[r]\n\t"
  129735. #endif
  129736. "# A[3] * B[10]\n\t"
  129737. "mov %[a], r9\n\t"
  129738. "mov %[b], r10\n\t"
  129739. "ldr %[a], [%[a], #12]\n\t"
  129740. "ldr %[b], [%[b], #40]\n\t"
  129741. "uxth r6, %[a]\n\t"
  129742. "uxth r7, %[b]\n\t"
  129743. #ifdef WOLFSSL_KEIL
  129744. "muls r7, r6, r7\n\t"
  129745. #elif defined(__clang__)
  129746. "muls r7, r6\n\t"
  129747. #else
  129748. "mul r7, r6\n\t"
  129749. #endif
  129750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129751. "adds r4, r4, r7\n\t"
  129752. #else
  129753. "add r4, r4, r7\n\t"
  129754. #endif
  129755. #ifdef WOLFSSL_KEIL
  129756. "adcs r5, r5, %[r]\n\t"
  129757. #elif defined(__clang__)
  129758. "adcs r5, %[r]\n\t"
  129759. #else
  129760. "adc r5, %[r]\n\t"
  129761. #endif
  129762. #ifdef WOLFSSL_KEIL
  129763. "adcs r3, r3, %[r]\n\t"
  129764. #elif defined(__clang__)
  129765. "adcs r3, %[r]\n\t"
  129766. #else
  129767. "adc r3, %[r]\n\t"
  129768. #endif
  129769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129770. "lsrs r7, %[b], #16\n\t"
  129771. #else
  129772. "lsr r7, %[b], #16\n\t"
  129773. #endif
  129774. #ifdef WOLFSSL_KEIL
  129775. "muls r6, r7, r6\n\t"
  129776. #elif defined(__clang__)
  129777. "muls r6, r7\n\t"
  129778. #else
  129779. "mul r6, r7\n\t"
  129780. #endif
  129781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129782. "lsrs r7, r6, #16\n\t"
  129783. #else
  129784. "lsr r7, r6, #16\n\t"
  129785. #endif
  129786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129787. "lsls r6, r6, #16\n\t"
  129788. #else
  129789. "lsl r6, r6, #16\n\t"
  129790. #endif
  129791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129792. "adds r4, r4, r6\n\t"
  129793. #else
  129794. "add r4, r4, r6\n\t"
  129795. #endif
  129796. #ifdef WOLFSSL_KEIL
  129797. "adcs r5, r5, r7\n\t"
  129798. #elif defined(__clang__)
  129799. "adcs r5, r7\n\t"
  129800. #else
  129801. "adc r5, r7\n\t"
  129802. #endif
  129803. #ifdef WOLFSSL_KEIL
  129804. "adcs r3, r3, %[r]\n\t"
  129805. #elif defined(__clang__)
  129806. "adcs r3, %[r]\n\t"
  129807. #else
  129808. "adc r3, %[r]\n\t"
  129809. #endif
  129810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129811. "lsrs r6, %[a], #16\n\t"
  129812. #else
  129813. "lsr r6, %[a], #16\n\t"
  129814. #endif
  129815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129816. "lsrs r7, %[b], #16\n\t"
  129817. #else
  129818. "lsr r7, %[b], #16\n\t"
  129819. #endif
  129820. #ifdef WOLFSSL_KEIL
  129821. "muls r7, r6, r7\n\t"
  129822. #elif defined(__clang__)
  129823. "muls r7, r6\n\t"
  129824. #else
  129825. "mul r7, r6\n\t"
  129826. #endif
  129827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129828. "adds r5, r5, r7\n\t"
  129829. #else
  129830. "add r5, r5, r7\n\t"
  129831. #endif
  129832. #ifdef WOLFSSL_KEIL
  129833. "adcs r3, r3, %[r]\n\t"
  129834. #elif defined(__clang__)
  129835. "adcs r3, %[r]\n\t"
  129836. #else
  129837. "adc r3, %[r]\n\t"
  129838. #endif
  129839. "uxth r7, %[b]\n\t"
  129840. #ifdef WOLFSSL_KEIL
  129841. "muls r6, r7, r6\n\t"
  129842. #elif defined(__clang__)
  129843. "muls r6, r7\n\t"
  129844. #else
  129845. "mul r6, r7\n\t"
  129846. #endif
  129847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129848. "lsrs r7, r6, #16\n\t"
  129849. #else
  129850. "lsr r7, r6, #16\n\t"
  129851. #endif
  129852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129853. "lsls r6, r6, #16\n\t"
  129854. #else
  129855. "lsl r6, r6, #16\n\t"
  129856. #endif
  129857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129858. "adds r4, r4, r6\n\t"
  129859. #else
  129860. "add r4, r4, r6\n\t"
  129861. #endif
  129862. #ifdef WOLFSSL_KEIL
  129863. "adcs r5, r5, r7\n\t"
  129864. #elif defined(__clang__)
  129865. "adcs r5, r7\n\t"
  129866. #else
  129867. "adc r5, r7\n\t"
  129868. #endif
  129869. #ifdef WOLFSSL_KEIL
  129870. "adcs r3, r3, %[r]\n\t"
  129871. #elif defined(__clang__)
  129872. "adcs r3, %[r]\n\t"
  129873. #else
  129874. "adc r3, %[r]\n\t"
  129875. #endif
  129876. "# A[4] * B[9]\n\t"
  129877. "mov %[a], r9\n\t"
  129878. "mov %[b], r10\n\t"
  129879. "ldr %[a], [%[a], #16]\n\t"
  129880. "ldr %[b], [%[b], #36]\n\t"
  129881. "uxth r6, %[a]\n\t"
  129882. "uxth r7, %[b]\n\t"
  129883. #ifdef WOLFSSL_KEIL
  129884. "muls r7, r6, r7\n\t"
  129885. #elif defined(__clang__)
  129886. "muls r7, r6\n\t"
  129887. #else
  129888. "mul r7, r6\n\t"
  129889. #endif
  129890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129891. "adds r4, r4, r7\n\t"
  129892. #else
  129893. "add r4, r4, r7\n\t"
  129894. #endif
  129895. #ifdef WOLFSSL_KEIL
  129896. "adcs r5, r5, %[r]\n\t"
  129897. #elif defined(__clang__)
  129898. "adcs r5, %[r]\n\t"
  129899. #else
  129900. "adc r5, %[r]\n\t"
  129901. #endif
  129902. #ifdef WOLFSSL_KEIL
  129903. "adcs r3, r3, %[r]\n\t"
  129904. #elif defined(__clang__)
  129905. "adcs r3, %[r]\n\t"
  129906. #else
  129907. "adc r3, %[r]\n\t"
  129908. #endif
  129909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129910. "lsrs r7, %[b], #16\n\t"
  129911. #else
  129912. "lsr r7, %[b], #16\n\t"
  129913. #endif
  129914. #ifdef WOLFSSL_KEIL
  129915. "muls r6, r7, r6\n\t"
  129916. #elif defined(__clang__)
  129917. "muls r6, r7\n\t"
  129918. #else
  129919. "mul r6, r7\n\t"
  129920. #endif
  129921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129922. "lsrs r7, r6, #16\n\t"
  129923. #else
  129924. "lsr r7, r6, #16\n\t"
  129925. #endif
  129926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129927. "lsls r6, r6, #16\n\t"
  129928. #else
  129929. "lsl r6, r6, #16\n\t"
  129930. #endif
  129931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129932. "adds r4, r4, r6\n\t"
  129933. #else
  129934. "add r4, r4, r6\n\t"
  129935. #endif
  129936. #ifdef WOLFSSL_KEIL
  129937. "adcs r5, r5, r7\n\t"
  129938. #elif defined(__clang__)
  129939. "adcs r5, r7\n\t"
  129940. #else
  129941. "adc r5, r7\n\t"
  129942. #endif
  129943. #ifdef WOLFSSL_KEIL
  129944. "adcs r3, r3, %[r]\n\t"
  129945. #elif defined(__clang__)
  129946. "adcs r3, %[r]\n\t"
  129947. #else
  129948. "adc r3, %[r]\n\t"
  129949. #endif
  129950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129951. "lsrs r6, %[a], #16\n\t"
  129952. #else
  129953. "lsr r6, %[a], #16\n\t"
  129954. #endif
  129955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129956. "lsrs r7, %[b], #16\n\t"
  129957. #else
  129958. "lsr r7, %[b], #16\n\t"
  129959. #endif
  129960. #ifdef WOLFSSL_KEIL
  129961. "muls r7, r6, r7\n\t"
  129962. #elif defined(__clang__)
  129963. "muls r7, r6\n\t"
  129964. #else
  129965. "mul r7, r6\n\t"
  129966. #endif
  129967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129968. "adds r5, r5, r7\n\t"
  129969. #else
  129970. "add r5, r5, r7\n\t"
  129971. #endif
  129972. #ifdef WOLFSSL_KEIL
  129973. "adcs r3, r3, %[r]\n\t"
  129974. #elif defined(__clang__)
  129975. "adcs r3, %[r]\n\t"
  129976. #else
  129977. "adc r3, %[r]\n\t"
  129978. #endif
  129979. "uxth r7, %[b]\n\t"
  129980. #ifdef WOLFSSL_KEIL
  129981. "muls r6, r7, r6\n\t"
  129982. #elif defined(__clang__)
  129983. "muls r6, r7\n\t"
  129984. #else
  129985. "mul r6, r7\n\t"
  129986. #endif
  129987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129988. "lsrs r7, r6, #16\n\t"
  129989. #else
  129990. "lsr r7, r6, #16\n\t"
  129991. #endif
  129992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129993. "lsls r6, r6, #16\n\t"
  129994. #else
  129995. "lsl r6, r6, #16\n\t"
  129996. #endif
  129997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129998. "adds r4, r4, r6\n\t"
  129999. #else
  130000. "add r4, r4, r6\n\t"
  130001. #endif
  130002. #ifdef WOLFSSL_KEIL
  130003. "adcs r5, r5, r7\n\t"
  130004. #elif defined(__clang__)
  130005. "adcs r5, r7\n\t"
  130006. #else
  130007. "adc r5, r7\n\t"
  130008. #endif
  130009. #ifdef WOLFSSL_KEIL
  130010. "adcs r3, r3, %[r]\n\t"
  130011. #elif defined(__clang__)
  130012. "adcs r3, %[r]\n\t"
  130013. #else
  130014. "adc r3, %[r]\n\t"
  130015. #endif
  130016. "# A[5] * B[8]\n\t"
  130017. "mov %[a], r9\n\t"
  130018. "mov %[b], r10\n\t"
  130019. "ldr %[a], [%[a], #20]\n\t"
  130020. "ldr %[b], [%[b], #32]\n\t"
  130021. "uxth r6, %[a]\n\t"
  130022. "uxth r7, %[b]\n\t"
  130023. #ifdef WOLFSSL_KEIL
  130024. "muls r7, r6, r7\n\t"
  130025. #elif defined(__clang__)
  130026. "muls r7, r6\n\t"
  130027. #else
  130028. "mul r7, r6\n\t"
  130029. #endif
  130030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130031. "adds r4, r4, r7\n\t"
  130032. #else
  130033. "add r4, r4, r7\n\t"
  130034. #endif
  130035. #ifdef WOLFSSL_KEIL
  130036. "adcs r5, r5, %[r]\n\t"
  130037. #elif defined(__clang__)
  130038. "adcs r5, %[r]\n\t"
  130039. #else
  130040. "adc r5, %[r]\n\t"
  130041. #endif
  130042. #ifdef WOLFSSL_KEIL
  130043. "adcs r3, r3, %[r]\n\t"
  130044. #elif defined(__clang__)
  130045. "adcs r3, %[r]\n\t"
  130046. #else
  130047. "adc r3, %[r]\n\t"
  130048. #endif
  130049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130050. "lsrs r7, %[b], #16\n\t"
  130051. #else
  130052. "lsr r7, %[b], #16\n\t"
  130053. #endif
  130054. #ifdef WOLFSSL_KEIL
  130055. "muls r6, r7, r6\n\t"
  130056. #elif defined(__clang__)
  130057. "muls r6, r7\n\t"
  130058. #else
  130059. "mul r6, r7\n\t"
  130060. #endif
  130061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130062. "lsrs r7, r6, #16\n\t"
  130063. #else
  130064. "lsr r7, r6, #16\n\t"
  130065. #endif
  130066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130067. "lsls r6, r6, #16\n\t"
  130068. #else
  130069. "lsl r6, r6, #16\n\t"
  130070. #endif
  130071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130072. "adds r4, r4, r6\n\t"
  130073. #else
  130074. "add r4, r4, r6\n\t"
  130075. #endif
  130076. #ifdef WOLFSSL_KEIL
  130077. "adcs r5, r5, r7\n\t"
  130078. #elif defined(__clang__)
  130079. "adcs r5, r7\n\t"
  130080. #else
  130081. "adc r5, r7\n\t"
  130082. #endif
  130083. #ifdef WOLFSSL_KEIL
  130084. "adcs r3, r3, %[r]\n\t"
  130085. #elif defined(__clang__)
  130086. "adcs r3, %[r]\n\t"
  130087. #else
  130088. "adc r3, %[r]\n\t"
  130089. #endif
  130090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130091. "lsrs r6, %[a], #16\n\t"
  130092. #else
  130093. "lsr r6, %[a], #16\n\t"
  130094. #endif
  130095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130096. "lsrs r7, %[b], #16\n\t"
  130097. #else
  130098. "lsr r7, %[b], #16\n\t"
  130099. #endif
  130100. #ifdef WOLFSSL_KEIL
  130101. "muls r7, r6, r7\n\t"
  130102. #elif defined(__clang__)
  130103. "muls r7, r6\n\t"
  130104. #else
  130105. "mul r7, r6\n\t"
  130106. #endif
  130107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130108. "adds r5, r5, r7\n\t"
  130109. #else
  130110. "add r5, r5, r7\n\t"
  130111. #endif
  130112. #ifdef WOLFSSL_KEIL
  130113. "adcs r3, r3, %[r]\n\t"
  130114. #elif defined(__clang__)
  130115. "adcs r3, %[r]\n\t"
  130116. #else
  130117. "adc r3, %[r]\n\t"
  130118. #endif
  130119. "uxth r7, %[b]\n\t"
  130120. #ifdef WOLFSSL_KEIL
  130121. "muls r6, r7, r6\n\t"
  130122. #elif defined(__clang__)
  130123. "muls r6, r7\n\t"
  130124. #else
  130125. "mul r6, r7\n\t"
  130126. #endif
  130127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130128. "lsrs r7, r6, #16\n\t"
  130129. #else
  130130. "lsr r7, r6, #16\n\t"
  130131. #endif
  130132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130133. "lsls r6, r6, #16\n\t"
  130134. #else
  130135. "lsl r6, r6, #16\n\t"
  130136. #endif
  130137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130138. "adds r4, r4, r6\n\t"
  130139. #else
  130140. "add r4, r4, r6\n\t"
  130141. #endif
  130142. #ifdef WOLFSSL_KEIL
  130143. "adcs r5, r5, r7\n\t"
  130144. #elif defined(__clang__)
  130145. "adcs r5, r7\n\t"
  130146. #else
  130147. "adc r5, r7\n\t"
  130148. #endif
  130149. #ifdef WOLFSSL_KEIL
  130150. "adcs r3, r3, %[r]\n\t"
  130151. #elif defined(__clang__)
  130152. "adcs r3, %[r]\n\t"
  130153. #else
  130154. "adc r3, %[r]\n\t"
  130155. #endif
  130156. "# A[6] * B[7]\n\t"
  130157. "mov %[a], r9\n\t"
  130158. "mov %[b], r10\n\t"
  130159. "ldr %[a], [%[a], #24]\n\t"
  130160. "ldr %[b], [%[b], #28]\n\t"
  130161. "uxth r6, %[a]\n\t"
  130162. "uxth r7, %[b]\n\t"
  130163. #ifdef WOLFSSL_KEIL
  130164. "muls r7, r6, r7\n\t"
  130165. #elif defined(__clang__)
  130166. "muls r7, r6\n\t"
  130167. #else
  130168. "mul r7, r6\n\t"
  130169. #endif
  130170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130171. "adds r4, r4, r7\n\t"
  130172. #else
  130173. "add r4, r4, r7\n\t"
  130174. #endif
  130175. #ifdef WOLFSSL_KEIL
  130176. "adcs r5, r5, %[r]\n\t"
  130177. #elif defined(__clang__)
  130178. "adcs r5, %[r]\n\t"
  130179. #else
  130180. "adc r5, %[r]\n\t"
  130181. #endif
  130182. #ifdef WOLFSSL_KEIL
  130183. "adcs r3, r3, %[r]\n\t"
  130184. #elif defined(__clang__)
  130185. "adcs r3, %[r]\n\t"
  130186. #else
  130187. "adc r3, %[r]\n\t"
  130188. #endif
  130189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130190. "lsrs r7, %[b], #16\n\t"
  130191. #else
  130192. "lsr r7, %[b], #16\n\t"
  130193. #endif
  130194. #ifdef WOLFSSL_KEIL
  130195. "muls r6, r7, r6\n\t"
  130196. #elif defined(__clang__)
  130197. "muls r6, r7\n\t"
  130198. #else
  130199. "mul r6, r7\n\t"
  130200. #endif
  130201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130202. "lsrs r7, r6, #16\n\t"
  130203. #else
  130204. "lsr r7, r6, #16\n\t"
  130205. #endif
  130206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130207. "lsls r6, r6, #16\n\t"
  130208. #else
  130209. "lsl r6, r6, #16\n\t"
  130210. #endif
  130211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130212. "adds r4, r4, r6\n\t"
  130213. #else
  130214. "add r4, r4, r6\n\t"
  130215. #endif
  130216. #ifdef WOLFSSL_KEIL
  130217. "adcs r5, r5, r7\n\t"
  130218. #elif defined(__clang__)
  130219. "adcs r5, r7\n\t"
  130220. #else
  130221. "adc r5, r7\n\t"
  130222. #endif
  130223. #ifdef WOLFSSL_KEIL
  130224. "adcs r3, r3, %[r]\n\t"
  130225. #elif defined(__clang__)
  130226. "adcs r3, %[r]\n\t"
  130227. #else
  130228. "adc r3, %[r]\n\t"
  130229. #endif
  130230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130231. "lsrs r6, %[a], #16\n\t"
  130232. #else
  130233. "lsr r6, %[a], #16\n\t"
  130234. #endif
  130235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130236. "lsrs r7, %[b], #16\n\t"
  130237. #else
  130238. "lsr r7, %[b], #16\n\t"
  130239. #endif
  130240. #ifdef WOLFSSL_KEIL
  130241. "muls r7, r6, r7\n\t"
  130242. #elif defined(__clang__)
  130243. "muls r7, r6\n\t"
  130244. #else
  130245. "mul r7, r6\n\t"
  130246. #endif
  130247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130248. "adds r5, r5, r7\n\t"
  130249. #else
  130250. "add r5, r5, r7\n\t"
  130251. #endif
  130252. #ifdef WOLFSSL_KEIL
  130253. "adcs r3, r3, %[r]\n\t"
  130254. #elif defined(__clang__)
  130255. "adcs r3, %[r]\n\t"
  130256. #else
  130257. "adc r3, %[r]\n\t"
  130258. #endif
  130259. "uxth r7, %[b]\n\t"
  130260. #ifdef WOLFSSL_KEIL
  130261. "muls r6, r7, r6\n\t"
  130262. #elif defined(__clang__)
  130263. "muls r6, r7\n\t"
  130264. #else
  130265. "mul r6, r7\n\t"
  130266. #endif
  130267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130268. "lsrs r7, r6, #16\n\t"
  130269. #else
  130270. "lsr r7, r6, #16\n\t"
  130271. #endif
  130272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130273. "lsls r6, r6, #16\n\t"
  130274. #else
  130275. "lsl r6, r6, #16\n\t"
  130276. #endif
  130277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130278. "adds r4, r4, r6\n\t"
  130279. #else
  130280. "add r4, r4, r6\n\t"
  130281. #endif
  130282. #ifdef WOLFSSL_KEIL
  130283. "adcs r5, r5, r7\n\t"
  130284. #elif defined(__clang__)
  130285. "adcs r5, r7\n\t"
  130286. #else
  130287. "adc r5, r7\n\t"
  130288. #endif
  130289. #ifdef WOLFSSL_KEIL
  130290. "adcs r3, r3, %[r]\n\t"
  130291. #elif defined(__clang__)
  130292. "adcs r3, %[r]\n\t"
  130293. #else
  130294. "adc r3, %[r]\n\t"
  130295. #endif
  130296. "# A[7] * B[6]\n\t"
  130297. "mov %[a], r9\n\t"
  130298. "mov %[b], r10\n\t"
  130299. "ldr %[a], [%[a], #28]\n\t"
  130300. "ldr %[b], [%[b], #24]\n\t"
  130301. "uxth r6, %[a]\n\t"
  130302. "uxth r7, %[b]\n\t"
  130303. #ifdef WOLFSSL_KEIL
  130304. "muls r7, r6, r7\n\t"
  130305. #elif defined(__clang__)
  130306. "muls r7, r6\n\t"
  130307. #else
  130308. "mul r7, r6\n\t"
  130309. #endif
  130310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130311. "adds r4, r4, r7\n\t"
  130312. #else
  130313. "add r4, r4, r7\n\t"
  130314. #endif
  130315. #ifdef WOLFSSL_KEIL
  130316. "adcs r5, r5, %[r]\n\t"
  130317. #elif defined(__clang__)
  130318. "adcs r5, %[r]\n\t"
  130319. #else
  130320. "adc r5, %[r]\n\t"
  130321. #endif
  130322. #ifdef WOLFSSL_KEIL
  130323. "adcs r3, r3, %[r]\n\t"
  130324. #elif defined(__clang__)
  130325. "adcs r3, %[r]\n\t"
  130326. #else
  130327. "adc r3, %[r]\n\t"
  130328. #endif
  130329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130330. "lsrs r7, %[b], #16\n\t"
  130331. #else
  130332. "lsr r7, %[b], #16\n\t"
  130333. #endif
  130334. #ifdef WOLFSSL_KEIL
  130335. "muls r6, r7, r6\n\t"
  130336. #elif defined(__clang__)
  130337. "muls r6, r7\n\t"
  130338. #else
  130339. "mul r6, r7\n\t"
  130340. #endif
  130341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130342. "lsrs r7, r6, #16\n\t"
  130343. #else
  130344. "lsr r7, r6, #16\n\t"
  130345. #endif
  130346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130347. "lsls r6, r6, #16\n\t"
  130348. #else
  130349. "lsl r6, r6, #16\n\t"
  130350. #endif
  130351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130352. "adds r4, r4, r6\n\t"
  130353. #else
  130354. "add r4, r4, r6\n\t"
  130355. #endif
  130356. #ifdef WOLFSSL_KEIL
  130357. "adcs r5, r5, r7\n\t"
  130358. #elif defined(__clang__)
  130359. "adcs r5, r7\n\t"
  130360. #else
  130361. "adc r5, r7\n\t"
  130362. #endif
  130363. #ifdef WOLFSSL_KEIL
  130364. "adcs r3, r3, %[r]\n\t"
  130365. #elif defined(__clang__)
  130366. "adcs r3, %[r]\n\t"
  130367. #else
  130368. "adc r3, %[r]\n\t"
  130369. #endif
  130370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130371. "lsrs r6, %[a], #16\n\t"
  130372. #else
  130373. "lsr r6, %[a], #16\n\t"
  130374. #endif
  130375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130376. "lsrs r7, %[b], #16\n\t"
  130377. #else
  130378. "lsr r7, %[b], #16\n\t"
  130379. #endif
  130380. #ifdef WOLFSSL_KEIL
  130381. "muls r7, r6, r7\n\t"
  130382. #elif defined(__clang__)
  130383. "muls r7, r6\n\t"
  130384. #else
  130385. "mul r7, r6\n\t"
  130386. #endif
  130387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130388. "adds r5, r5, r7\n\t"
  130389. #else
  130390. "add r5, r5, r7\n\t"
  130391. #endif
  130392. #ifdef WOLFSSL_KEIL
  130393. "adcs r3, r3, %[r]\n\t"
  130394. #elif defined(__clang__)
  130395. "adcs r3, %[r]\n\t"
  130396. #else
  130397. "adc r3, %[r]\n\t"
  130398. #endif
  130399. "uxth r7, %[b]\n\t"
  130400. #ifdef WOLFSSL_KEIL
  130401. "muls r6, r7, r6\n\t"
  130402. #elif defined(__clang__)
  130403. "muls r6, r7\n\t"
  130404. #else
  130405. "mul r6, r7\n\t"
  130406. #endif
  130407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130408. "lsrs r7, r6, #16\n\t"
  130409. #else
  130410. "lsr r7, r6, #16\n\t"
  130411. #endif
  130412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130413. "lsls r6, r6, #16\n\t"
  130414. #else
  130415. "lsl r6, r6, #16\n\t"
  130416. #endif
  130417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130418. "adds r4, r4, r6\n\t"
  130419. #else
  130420. "add r4, r4, r6\n\t"
  130421. #endif
  130422. #ifdef WOLFSSL_KEIL
  130423. "adcs r5, r5, r7\n\t"
  130424. #elif defined(__clang__)
  130425. "adcs r5, r7\n\t"
  130426. #else
  130427. "adc r5, r7\n\t"
  130428. #endif
  130429. #ifdef WOLFSSL_KEIL
  130430. "adcs r3, r3, %[r]\n\t"
  130431. #elif defined(__clang__)
  130432. "adcs r3, %[r]\n\t"
  130433. #else
  130434. "adc r3, %[r]\n\t"
  130435. #endif
  130436. "# A[8] * B[5]\n\t"
  130437. "mov %[a], r9\n\t"
  130438. "mov %[b], r10\n\t"
  130439. "ldr %[a], [%[a], #32]\n\t"
  130440. "ldr %[b], [%[b], #20]\n\t"
  130441. "uxth r6, %[a]\n\t"
  130442. "uxth r7, %[b]\n\t"
  130443. #ifdef WOLFSSL_KEIL
  130444. "muls r7, r6, r7\n\t"
  130445. #elif defined(__clang__)
  130446. "muls r7, r6\n\t"
  130447. #else
  130448. "mul r7, r6\n\t"
  130449. #endif
  130450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130451. "adds r4, r4, r7\n\t"
  130452. #else
  130453. "add r4, r4, r7\n\t"
  130454. #endif
  130455. #ifdef WOLFSSL_KEIL
  130456. "adcs r5, r5, %[r]\n\t"
  130457. #elif defined(__clang__)
  130458. "adcs r5, %[r]\n\t"
  130459. #else
  130460. "adc r5, %[r]\n\t"
  130461. #endif
  130462. #ifdef WOLFSSL_KEIL
  130463. "adcs r3, r3, %[r]\n\t"
  130464. #elif defined(__clang__)
  130465. "adcs r3, %[r]\n\t"
  130466. #else
  130467. "adc r3, %[r]\n\t"
  130468. #endif
  130469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130470. "lsrs r7, %[b], #16\n\t"
  130471. #else
  130472. "lsr r7, %[b], #16\n\t"
  130473. #endif
  130474. #ifdef WOLFSSL_KEIL
  130475. "muls r6, r7, r6\n\t"
  130476. #elif defined(__clang__)
  130477. "muls r6, r7\n\t"
  130478. #else
  130479. "mul r6, r7\n\t"
  130480. #endif
  130481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130482. "lsrs r7, r6, #16\n\t"
  130483. #else
  130484. "lsr r7, r6, #16\n\t"
  130485. #endif
  130486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130487. "lsls r6, r6, #16\n\t"
  130488. #else
  130489. "lsl r6, r6, #16\n\t"
  130490. #endif
  130491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130492. "adds r4, r4, r6\n\t"
  130493. #else
  130494. "add r4, r4, r6\n\t"
  130495. #endif
  130496. #ifdef WOLFSSL_KEIL
  130497. "adcs r5, r5, r7\n\t"
  130498. #elif defined(__clang__)
  130499. "adcs r5, r7\n\t"
  130500. #else
  130501. "adc r5, r7\n\t"
  130502. #endif
  130503. #ifdef WOLFSSL_KEIL
  130504. "adcs r3, r3, %[r]\n\t"
  130505. #elif defined(__clang__)
  130506. "adcs r3, %[r]\n\t"
  130507. #else
  130508. "adc r3, %[r]\n\t"
  130509. #endif
  130510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130511. "lsrs r6, %[a], #16\n\t"
  130512. #else
  130513. "lsr r6, %[a], #16\n\t"
  130514. #endif
  130515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130516. "lsrs r7, %[b], #16\n\t"
  130517. #else
  130518. "lsr r7, %[b], #16\n\t"
  130519. #endif
  130520. #ifdef WOLFSSL_KEIL
  130521. "muls r7, r6, r7\n\t"
  130522. #elif defined(__clang__)
  130523. "muls r7, r6\n\t"
  130524. #else
  130525. "mul r7, r6\n\t"
  130526. #endif
  130527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130528. "adds r5, r5, r7\n\t"
  130529. #else
  130530. "add r5, r5, r7\n\t"
  130531. #endif
  130532. #ifdef WOLFSSL_KEIL
  130533. "adcs r3, r3, %[r]\n\t"
  130534. #elif defined(__clang__)
  130535. "adcs r3, %[r]\n\t"
  130536. #else
  130537. "adc r3, %[r]\n\t"
  130538. #endif
  130539. "uxth r7, %[b]\n\t"
  130540. #ifdef WOLFSSL_KEIL
  130541. "muls r6, r7, r6\n\t"
  130542. #elif defined(__clang__)
  130543. "muls r6, r7\n\t"
  130544. #else
  130545. "mul r6, r7\n\t"
  130546. #endif
  130547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130548. "lsrs r7, r6, #16\n\t"
  130549. #else
  130550. "lsr r7, r6, #16\n\t"
  130551. #endif
  130552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130553. "lsls r6, r6, #16\n\t"
  130554. #else
  130555. "lsl r6, r6, #16\n\t"
  130556. #endif
  130557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130558. "adds r4, r4, r6\n\t"
  130559. #else
  130560. "add r4, r4, r6\n\t"
  130561. #endif
  130562. #ifdef WOLFSSL_KEIL
  130563. "adcs r5, r5, r7\n\t"
  130564. #elif defined(__clang__)
  130565. "adcs r5, r7\n\t"
  130566. #else
  130567. "adc r5, r7\n\t"
  130568. #endif
  130569. #ifdef WOLFSSL_KEIL
  130570. "adcs r3, r3, %[r]\n\t"
  130571. #elif defined(__clang__)
  130572. "adcs r3, %[r]\n\t"
  130573. #else
  130574. "adc r3, %[r]\n\t"
  130575. #endif
  130576. "# A[9] * B[4]\n\t"
  130577. "mov %[a], r9\n\t"
  130578. "mov %[b], r10\n\t"
  130579. "ldr %[a], [%[a], #36]\n\t"
  130580. "ldr %[b], [%[b], #16]\n\t"
  130581. "uxth r6, %[a]\n\t"
  130582. "uxth r7, %[b]\n\t"
  130583. #ifdef WOLFSSL_KEIL
  130584. "muls r7, r6, r7\n\t"
  130585. #elif defined(__clang__)
  130586. "muls r7, r6\n\t"
  130587. #else
  130588. "mul r7, r6\n\t"
  130589. #endif
  130590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130591. "adds r4, r4, r7\n\t"
  130592. #else
  130593. "add r4, r4, r7\n\t"
  130594. #endif
  130595. #ifdef WOLFSSL_KEIL
  130596. "adcs r5, r5, %[r]\n\t"
  130597. #elif defined(__clang__)
  130598. "adcs r5, %[r]\n\t"
  130599. #else
  130600. "adc r5, %[r]\n\t"
  130601. #endif
  130602. #ifdef WOLFSSL_KEIL
  130603. "adcs r3, r3, %[r]\n\t"
  130604. #elif defined(__clang__)
  130605. "adcs r3, %[r]\n\t"
  130606. #else
  130607. "adc r3, %[r]\n\t"
  130608. #endif
  130609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130610. "lsrs r7, %[b], #16\n\t"
  130611. #else
  130612. "lsr r7, %[b], #16\n\t"
  130613. #endif
  130614. #ifdef WOLFSSL_KEIL
  130615. "muls r6, r7, r6\n\t"
  130616. #elif defined(__clang__)
  130617. "muls r6, r7\n\t"
  130618. #else
  130619. "mul r6, r7\n\t"
  130620. #endif
  130621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130622. "lsrs r7, r6, #16\n\t"
  130623. #else
  130624. "lsr r7, r6, #16\n\t"
  130625. #endif
  130626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130627. "lsls r6, r6, #16\n\t"
  130628. #else
  130629. "lsl r6, r6, #16\n\t"
  130630. #endif
  130631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130632. "adds r4, r4, r6\n\t"
  130633. #else
  130634. "add r4, r4, r6\n\t"
  130635. #endif
  130636. #ifdef WOLFSSL_KEIL
  130637. "adcs r5, r5, r7\n\t"
  130638. #elif defined(__clang__)
  130639. "adcs r5, r7\n\t"
  130640. #else
  130641. "adc r5, r7\n\t"
  130642. #endif
  130643. #ifdef WOLFSSL_KEIL
  130644. "adcs r3, r3, %[r]\n\t"
  130645. #elif defined(__clang__)
  130646. "adcs r3, %[r]\n\t"
  130647. #else
  130648. "adc r3, %[r]\n\t"
  130649. #endif
  130650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130651. "lsrs r6, %[a], #16\n\t"
  130652. #else
  130653. "lsr r6, %[a], #16\n\t"
  130654. #endif
  130655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130656. "lsrs r7, %[b], #16\n\t"
  130657. #else
  130658. "lsr r7, %[b], #16\n\t"
  130659. #endif
  130660. #ifdef WOLFSSL_KEIL
  130661. "muls r7, r6, r7\n\t"
  130662. #elif defined(__clang__)
  130663. "muls r7, r6\n\t"
  130664. #else
  130665. "mul r7, r6\n\t"
  130666. #endif
  130667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130668. "adds r5, r5, r7\n\t"
  130669. #else
  130670. "add r5, r5, r7\n\t"
  130671. #endif
  130672. #ifdef WOLFSSL_KEIL
  130673. "adcs r3, r3, %[r]\n\t"
  130674. #elif defined(__clang__)
  130675. "adcs r3, %[r]\n\t"
  130676. #else
  130677. "adc r3, %[r]\n\t"
  130678. #endif
  130679. "uxth r7, %[b]\n\t"
  130680. #ifdef WOLFSSL_KEIL
  130681. "muls r6, r7, r6\n\t"
  130682. #elif defined(__clang__)
  130683. "muls r6, r7\n\t"
  130684. #else
  130685. "mul r6, r7\n\t"
  130686. #endif
  130687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130688. "lsrs r7, r6, #16\n\t"
  130689. #else
  130690. "lsr r7, r6, #16\n\t"
  130691. #endif
  130692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130693. "lsls r6, r6, #16\n\t"
  130694. #else
  130695. "lsl r6, r6, #16\n\t"
  130696. #endif
  130697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130698. "adds r4, r4, r6\n\t"
  130699. #else
  130700. "add r4, r4, r6\n\t"
  130701. #endif
  130702. #ifdef WOLFSSL_KEIL
  130703. "adcs r5, r5, r7\n\t"
  130704. #elif defined(__clang__)
  130705. "adcs r5, r7\n\t"
  130706. #else
  130707. "adc r5, r7\n\t"
  130708. #endif
  130709. #ifdef WOLFSSL_KEIL
  130710. "adcs r3, r3, %[r]\n\t"
  130711. #elif defined(__clang__)
  130712. "adcs r3, %[r]\n\t"
  130713. #else
  130714. "adc r3, %[r]\n\t"
  130715. #endif
  130716. "# A[10] * B[3]\n\t"
  130717. "mov %[a], r9\n\t"
  130718. "mov %[b], r10\n\t"
  130719. "ldr %[a], [%[a], #40]\n\t"
  130720. "ldr %[b], [%[b], #12]\n\t"
  130721. "uxth r6, %[a]\n\t"
  130722. "uxth r7, %[b]\n\t"
  130723. #ifdef WOLFSSL_KEIL
  130724. "muls r7, r6, r7\n\t"
  130725. #elif defined(__clang__)
  130726. "muls r7, r6\n\t"
  130727. #else
  130728. "mul r7, r6\n\t"
  130729. #endif
  130730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130731. "adds r4, r4, r7\n\t"
  130732. #else
  130733. "add r4, r4, r7\n\t"
  130734. #endif
  130735. #ifdef WOLFSSL_KEIL
  130736. "adcs r5, r5, %[r]\n\t"
  130737. #elif defined(__clang__)
  130738. "adcs r5, %[r]\n\t"
  130739. #else
  130740. "adc r5, %[r]\n\t"
  130741. #endif
  130742. #ifdef WOLFSSL_KEIL
  130743. "adcs r3, r3, %[r]\n\t"
  130744. #elif defined(__clang__)
  130745. "adcs r3, %[r]\n\t"
  130746. #else
  130747. "adc r3, %[r]\n\t"
  130748. #endif
  130749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130750. "lsrs r7, %[b], #16\n\t"
  130751. #else
  130752. "lsr r7, %[b], #16\n\t"
  130753. #endif
  130754. #ifdef WOLFSSL_KEIL
  130755. "muls r6, r7, r6\n\t"
  130756. #elif defined(__clang__)
  130757. "muls r6, r7\n\t"
  130758. #else
  130759. "mul r6, r7\n\t"
  130760. #endif
  130761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130762. "lsrs r7, r6, #16\n\t"
  130763. #else
  130764. "lsr r7, r6, #16\n\t"
  130765. #endif
  130766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130767. "lsls r6, r6, #16\n\t"
  130768. #else
  130769. "lsl r6, r6, #16\n\t"
  130770. #endif
  130771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130772. "adds r4, r4, r6\n\t"
  130773. #else
  130774. "add r4, r4, r6\n\t"
  130775. #endif
  130776. #ifdef WOLFSSL_KEIL
  130777. "adcs r5, r5, r7\n\t"
  130778. #elif defined(__clang__)
  130779. "adcs r5, r7\n\t"
  130780. #else
  130781. "adc r5, r7\n\t"
  130782. #endif
  130783. #ifdef WOLFSSL_KEIL
  130784. "adcs r3, r3, %[r]\n\t"
  130785. #elif defined(__clang__)
  130786. "adcs r3, %[r]\n\t"
  130787. #else
  130788. "adc r3, %[r]\n\t"
  130789. #endif
  130790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130791. "lsrs r6, %[a], #16\n\t"
  130792. #else
  130793. "lsr r6, %[a], #16\n\t"
  130794. #endif
  130795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130796. "lsrs r7, %[b], #16\n\t"
  130797. #else
  130798. "lsr r7, %[b], #16\n\t"
  130799. #endif
  130800. #ifdef WOLFSSL_KEIL
  130801. "muls r7, r6, r7\n\t"
  130802. #elif defined(__clang__)
  130803. "muls r7, r6\n\t"
  130804. #else
  130805. "mul r7, r6\n\t"
  130806. #endif
  130807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130808. "adds r5, r5, r7\n\t"
  130809. #else
  130810. "add r5, r5, r7\n\t"
  130811. #endif
  130812. #ifdef WOLFSSL_KEIL
  130813. "adcs r3, r3, %[r]\n\t"
  130814. #elif defined(__clang__)
  130815. "adcs r3, %[r]\n\t"
  130816. #else
  130817. "adc r3, %[r]\n\t"
  130818. #endif
  130819. "uxth r7, %[b]\n\t"
  130820. #ifdef WOLFSSL_KEIL
  130821. "muls r6, r7, r6\n\t"
  130822. #elif defined(__clang__)
  130823. "muls r6, r7\n\t"
  130824. #else
  130825. "mul r6, r7\n\t"
  130826. #endif
  130827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130828. "lsrs r7, r6, #16\n\t"
  130829. #else
  130830. "lsr r7, r6, #16\n\t"
  130831. #endif
  130832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130833. "lsls r6, r6, #16\n\t"
  130834. #else
  130835. "lsl r6, r6, #16\n\t"
  130836. #endif
  130837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130838. "adds r4, r4, r6\n\t"
  130839. #else
  130840. "add r4, r4, r6\n\t"
  130841. #endif
  130842. #ifdef WOLFSSL_KEIL
  130843. "adcs r5, r5, r7\n\t"
  130844. #elif defined(__clang__)
  130845. "adcs r5, r7\n\t"
  130846. #else
  130847. "adc r5, r7\n\t"
  130848. #endif
  130849. #ifdef WOLFSSL_KEIL
  130850. "adcs r3, r3, %[r]\n\t"
  130851. #elif defined(__clang__)
  130852. "adcs r3, %[r]\n\t"
  130853. #else
  130854. "adc r3, %[r]\n\t"
  130855. #endif
  130856. "# A[11] * B[2]\n\t"
  130857. "mov %[a], r9\n\t"
  130858. "mov %[b], r10\n\t"
  130859. "ldr %[a], [%[a], #44]\n\t"
  130860. "ldr %[b], [%[b], #8]\n\t"
  130861. "uxth r6, %[a]\n\t"
  130862. "uxth r7, %[b]\n\t"
  130863. #ifdef WOLFSSL_KEIL
  130864. "muls r7, r6, r7\n\t"
  130865. #elif defined(__clang__)
  130866. "muls r7, r6\n\t"
  130867. #else
  130868. "mul r7, r6\n\t"
  130869. #endif
  130870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130871. "adds r4, r4, r7\n\t"
  130872. #else
  130873. "add r4, r4, r7\n\t"
  130874. #endif
  130875. #ifdef WOLFSSL_KEIL
  130876. "adcs r5, r5, %[r]\n\t"
  130877. #elif defined(__clang__)
  130878. "adcs r5, %[r]\n\t"
  130879. #else
  130880. "adc r5, %[r]\n\t"
  130881. #endif
  130882. #ifdef WOLFSSL_KEIL
  130883. "adcs r3, r3, %[r]\n\t"
  130884. #elif defined(__clang__)
  130885. "adcs r3, %[r]\n\t"
  130886. #else
  130887. "adc r3, %[r]\n\t"
  130888. #endif
  130889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130890. "lsrs r7, %[b], #16\n\t"
  130891. #else
  130892. "lsr r7, %[b], #16\n\t"
  130893. #endif
  130894. #ifdef WOLFSSL_KEIL
  130895. "muls r6, r7, r6\n\t"
  130896. #elif defined(__clang__)
  130897. "muls r6, r7\n\t"
  130898. #else
  130899. "mul r6, r7\n\t"
  130900. #endif
  130901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130902. "lsrs r7, r6, #16\n\t"
  130903. #else
  130904. "lsr r7, r6, #16\n\t"
  130905. #endif
  130906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130907. "lsls r6, r6, #16\n\t"
  130908. #else
  130909. "lsl r6, r6, #16\n\t"
  130910. #endif
  130911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130912. "adds r4, r4, r6\n\t"
  130913. #else
  130914. "add r4, r4, r6\n\t"
  130915. #endif
  130916. #ifdef WOLFSSL_KEIL
  130917. "adcs r5, r5, r7\n\t"
  130918. #elif defined(__clang__)
  130919. "adcs r5, r7\n\t"
  130920. #else
  130921. "adc r5, r7\n\t"
  130922. #endif
  130923. #ifdef WOLFSSL_KEIL
  130924. "adcs r3, r3, %[r]\n\t"
  130925. #elif defined(__clang__)
  130926. "adcs r3, %[r]\n\t"
  130927. #else
  130928. "adc r3, %[r]\n\t"
  130929. #endif
  130930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130931. "lsrs r6, %[a], #16\n\t"
  130932. #else
  130933. "lsr r6, %[a], #16\n\t"
  130934. #endif
  130935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130936. "lsrs r7, %[b], #16\n\t"
  130937. #else
  130938. "lsr r7, %[b], #16\n\t"
  130939. #endif
  130940. #ifdef WOLFSSL_KEIL
  130941. "muls r7, r6, r7\n\t"
  130942. #elif defined(__clang__)
  130943. "muls r7, r6\n\t"
  130944. #else
  130945. "mul r7, r6\n\t"
  130946. #endif
  130947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130948. "adds r5, r5, r7\n\t"
  130949. #else
  130950. "add r5, r5, r7\n\t"
  130951. #endif
  130952. #ifdef WOLFSSL_KEIL
  130953. "adcs r3, r3, %[r]\n\t"
  130954. #elif defined(__clang__)
  130955. "adcs r3, %[r]\n\t"
  130956. #else
  130957. "adc r3, %[r]\n\t"
  130958. #endif
  130959. "uxth r7, %[b]\n\t"
  130960. #ifdef WOLFSSL_KEIL
  130961. "muls r6, r7, r6\n\t"
  130962. #elif defined(__clang__)
  130963. "muls r6, r7\n\t"
  130964. #else
  130965. "mul r6, r7\n\t"
  130966. #endif
  130967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130968. "lsrs r7, r6, #16\n\t"
  130969. #else
  130970. "lsr r7, r6, #16\n\t"
  130971. #endif
  130972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130973. "lsls r6, r6, #16\n\t"
  130974. #else
  130975. "lsl r6, r6, #16\n\t"
  130976. #endif
  130977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130978. "adds r4, r4, r6\n\t"
  130979. #else
  130980. "add r4, r4, r6\n\t"
  130981. #endif
  130982. #ifdef WOLFSSL_KEIL
  130983. "adcs r5, r5, r7\n\t"
  130984. #elif defined(__clang__)
  130985. "adcs r5, r7\n\t"
  130986. #else
  130987. "adc r5, r7\n\t"
  130988. #endif
  130989. #ifdef WOLFSSL_KEIL
  130990. "adcs r3, r3, %[r]\n\t"
  130991. #elif defined(__clang__)
  130992. "adcs r3, %[r]\n\t"
  130993. #else
  130994. "adc r3, %[r]\n\t"
  130995. #endif
  130996. "# A[12] * B[1]\n\t"
  130997. "mov %[a], r9\n\t"
  130998. "mov %[b], r10\n\t"
  130999. "ldr %[a], [%[a], #48]\n\t"
  131000. "ldr %[b], [%[b], #4]\n\t"
  131001. "uxth r6, %[a]\n\t"
  131002. "uxth r7, %[b]\n\t"
  131003. #ifdef WOLFSSL_KEIL
  131004. "muls r7, r6, r7\n\t"
  131005. #elif defined(__clang__)
  131006. "muls r7, r6\n\t"
  131007. #else
  131008. "mul r7, r6\n\t"
  131009. #endif
  131010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131011. "adds r4, r4, r7\n\t"
  131012. #else
  131013. "add r4, r4, r7\n\t"
  131014. #endif
  131015. #ifdef WOLFSSL_KEIL
  131016. "adcs r5, r5, %[r]\n\t"
  131017. #elif defined(__clang__)
  131018. "adcs r5, %[r]\n\t"
  131019. #else
  131020. "adc r5, %[r]\n\t"
  131021. #endif
  131022. #ifdef WOLFSSL_KEIL
  131023. "adcs r3, r3, %[r]\n\t"
  131024. #elif defined(__clang__)
  131025. "adcs r3, %[r]\n\t"
  131026. #else
  131027. "adc r3, %[r]\n\t"
  131028. #endif
  131029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131030. "lsrs r7, %[b], #16\n\t"
  131031. #else
  131032. "lsr r7, %[b], #16\n\t"
  131033. #endif
  131034. #ifdef WOLFSSL_KEIL
  131035. "muls r6, r7, r6\n\t"
  131036. #elif defined(__clang__)
  131037. "muls r6, r7\n\t"
  131038. #else
  131039. "mul r6, r7\n\t"
  131040. #endif
  131041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131042. "lsrs r7, r6, #16\n\t"
  131043. #else
  131044. "lsr r7, r6, #16\n\t"
  131045. #endif
  131046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131047. "lsls r6, r6, #16\n\t"
  131048. #else
  131049. "lsl r6, r6, #16\n\t"
  131050. #endif
  131051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131052. "adds r4, r4, r6\n\t"
  131053. #else
  131054. "add r4, r4, r6\n\t"
  131055. #endif
  131056. #ifdef WOLFSSL_KEIL
  131057. "adcs r5, r5, r7\n\t"
  131058. #elif defined(__clang__)
  131059. "adcs r5, r7\n\t"
  131060. #else
  131061. "adc r5, r7\n\t"
  131062. #endif
  131063. #ifdef WOLFSSL_KEIL
  131064. "adcs r3, r3, %[r]\n\t"
  131065. #elif defined(__clang__)
  131066. "adcs r3, %[r]\n\t"
  131067. #else
  131068. "adc r3, %[r]\n\t"
  131069. #endif
  131070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131071. "lsrs r6, %[a], #16\n\t"
  131072. #else
  131073. "lsr r6, %[a], #16\n\t"
  131074. #endif
  131075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131076. "lsrs r7, %[b], #16\n\t"
  131077. #else
  131078. "lsr r7, %[b], #16\n\t"
  131079. #endif
  131080. #ifdef WOLFSSL_KEIL
  131081. "muls r7, r6, r7\n\t"
  131082. #elif defined(__clang__)
  131083. "muls r7, r6\n\t"
  131084. #else
  131085. "mul r7, r6\n\t"
  131086. #endif
  131087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131088. "adds r5, r5, r7\n\t"
  131089. #else
  131090. "add r5, r5, r7\n\t"
  131091. #endif
  131092. #ifdef WOLFSSL_KEIL
  131093. "adcs r3, r3, %[r]\n\t"
  131094. #elif defined(__clang__)
  131095. "adcs r3, %[r]\n\t"
  131096. #else
  131097. "adc r3, %[r]\n\t"
  131098. #endif
  131099. "uxth r7, %[b]\n\t"
  131100. #ifdef WOLFSSL_KEIL
  131101. "muls r6, r7, r6\n\t"
  131102. #elif defined(__clang__)
  131103. "muls r6, r7\n\t"
  131104. #else
  131105. "mul r6, r7\n\t"
  131106. #endif
  131107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131108. "lsrs r7, r6, #16\n\t"
  131109. #else
  131110. "lsr r7, r6, #16\n\t"
  131111. #endif
  131112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131113. "lsls r6, r6, #16\n\t"
  131114. #else
  131115. "lsl r6, r6, #16\n\t"
  131116. #endif
  131117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131118. "adds r4, r4, r6\n\t"
  131119. #else
  131120. "add r4, r4, r6\n\t"
  131121. #endif
  131122. #ifdef WOLFSSL_KEIL
  131123. "adcs r5, r5, r7\n\t"
  131124. #elif defined(__clang__)
  131125. "adcs r5, r7\n\t"
  131126. #else
  131127. "adc r5, r7\n\t"
  131128. #endif
  131129. #ifdef WOLFSSL_KEIL
  131130. "adcs r3, r3, %[r]\n\t"
  131131. #elif defined(__clang__)
  131132. "adcs r3, %[r]\n\t"
  131133. #else
  131134. "adc r3, %[r]\n\t"
  131135. #endif
  131136. "# A[13] * B[0]\n\t"
  131137. "mov %[a], r9\n\t"
  131138. "mov %[b], r10\n\t"
  131139. "ldr %[a], [%[a], #52]\n\t"
  131140. "ldr %[b], [%[b]]\n\t"
  131141. "uxth r6, %[a]\n\t"
  131142. "uxth r7, %[b]\n\t"
  131143. #ifdef WOLFSSL_KEIL
  131144. "muls r7, r6, r7\n\t"
  131145. #elif defined(__clang__)
  131146. "muls r7, r6\n\t"
  131147. #else
  131148. "mul r7, r6\n\t"
  131149. #endif
  131150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131151. "adds r4, r4, r7\n\t"
  131152. #else
  131153. "add r4, r4, r7\n\t"
  131154. #endif
  131155. #ifdef WOLFSSL_KEIL
  131156. "adcs r5, r5, %[r]\n\t"
  131157. #elif defined(__clang__)
  131158. "adcs r5, %[r]\n\t"
  131159. #else
  131160. "adc r5, %[r]\n\t"
  131161. #endif
  131162. #ifdef WOLFSSL_KEIL
  131163. "adcs r3, r3, %[r]\n\t"
  131164. #elif defined(__clang__)
  131165. "adcs r3, %[r]\n\t"
  131166. #else
  131167. "adc r3, %[r]\n\t"
  131168. #endif
  131169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131170. "lsrs r7, %[b], #16\n\t"
  131171. #else
  131172. "lsr r7, %[b], #16\n\t"
  131173. #endif
  131174. #ifdef WOLFSSL_KEIL
  131175. "muls r6, r7, r6\n\t"
  131176. #elif defined(__clang__)
  131177. "muls r6, r7\n\t"
  131178. #else
  131179. "mul r6, r7\n\t"
  131180. #endif
  131181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131182. "lsrs r7, r6, #16\n\t"
  131183. #else
  131184. "lsr r7, r6, #16\n\t"
  131185. #endif
  131186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131187. "lsls r6, r6, #16\n\t"
  131188. #else
  131189. "lsl r6, r6, #16\n\t"
  131190. #endif
  131191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131192. "adds r4, r4, r6\n\t"
  131193. #else
  131194. "add r4, r4, r6\n\t"
  131195. #endif
  131196. #ifdef WOLFSSL_KEIL
  131197. "adcs r5, r5, r7\n\t"
  131198. #elif defined(__clang__)
  131199. "adcs r5, r7\n\t"
  131200. #else
  131201. "adc r5, r7\n\t"
  131202. #endif
  131203. #ifdef WOLFSSL_KEIL
  131204. "adcs r3, r3, %[r]\n\t"
  131205. #elif defined(__clang__)
  131206. "adcs r3, %[r]\n\t"
  131207. #else
  131208. "adc r3, %[r]\n\t"
  131209. #endif
  131210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131211. "lsrs r6, %[a], #16\n\t"
  131212. #else
  131213. "lsr r6, %[a], #16\n\t"
  131214. #endif
  131215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131216. "lsrs r7, %[b], #16\n\t"
  131217. #else
  131218. "lsr r7, %[b], #16\n\t"
  131219. #endif
  131220. #ifdef WOLFSSL_KEIL
  131221. "muls r7, r6, r7\n\t"
  131222. #elif defined(__clang__)
  131223. "muls r7, r6\n\t"
  131224. #else
  131225. "mul r7, r6\n\t"
  131226. #endif
  131227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131228. "adds r5, r5, r7\n\t"
  131229. #else
  131230. "add r5, r5, r7\n\t"
  131231. #endif
  131232. #ifdef WOLFSSL_KEIL
  131233. "adcs r3, r3, %[r]\n\t"
  131234. #elif defined(__clang__)
  131235. "adcs r3, %[r]\n\t"
  131236. #else
  131237. "adc r3, %[r]\n\t"
  131238. #endif
  131239. "uxth r7, %[b]\n\t"
  131240. #ifdef WOLFSSL_KEIL
  131241. "muls r6, r7, r6\n\t"
  131242. #elif defined(__clang__)
  131243. "muls r6, r7\n\t"
  131244. #else
  131245. "mul r6, r7\n\t"
  131246. #endif
  131247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131248. "lsrs r7, r6, #16\n\t"
  131249. #else
  131250. "lsr r7, r6, #16\n\t"
  131251. #endif
  131252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131253. "lsls r6, r6, #16\n\t"
  131254. #else
  131255. "lsl r6, r6, #16\n\t"
  131256. #endif
  131257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131258. "adds r4, r4, r6\n\t"
  131259. #else
  131260. "add r4, r4, r6\n\t"
  131261. #endif
  131262. #ifdef WOLFSSL_KEIL
  131263. "adcs r5, r5, r7\n\t"
  131264. #elif defined(__clang__)
  131265. "adcs r5, r7\n\t"
  131266. #else
  131267. "adc r5, r7\n\t"
  131268. #endif
  131269. #ifdef WOLFSSL_KEIL
  131270. "adcs r3, r3, %[r]\n\t"
  131271. #elif defined(__clang__)
  131272. "adcs r3, %[r]\n\t"
  131273. #else
  131274. "adc r3, %[r]\n\t"
  131275. #endif
  131276. "str r4, [sp, #52]\n\t"
  131277. "# A[14] * B[0]\n\t"
  131278. "movs r4, #0\n\t"
  131279. "mov %[a], r9\n\t"
  131280. "mov %[b], r10\n\t"
  131281. "ldr %[a], [%[a], #56]\n\t"
  131282. "ldr %[b], [%[b]]\n\t"
  131283. "uxth r6, %[a]\n\t"
  131284. "uxth r7, %[b]\n\t"
  131285. #ifdef WOLFSSL_KEIL
  131286. "muls r7, r6, r7\n\t"
  131287. #elif defined(__clang__)
  131288. "muls r7, r6\n\t"
  131289. #else
  131290. "mul r7, r6\n\t"
  131291. #endif
  131292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131293. "adds r5, r5, r7\n\t"
  131294. #else
  131295. "add r5, r5, r7\n\t"
  131296. #endif
  131297. #ifdef WOLFSSL_KEIL
  131298. "adcs r3, r3, %[r]\n\t"
  131299. #elif defined(__clang__)
  131300. "adcs r3, %[r]\n\t"
  131301. #else
  131302. "adc r3, %[r]\n\t"
  131303. #endif
  131304. #ifdef WOLFSSL_KEIL
  131305. "adcs r4, r4, %[r]\n\t"
  131306. #elif defined(__clang__)
  131307. "adcs r4, %[r]\n\t"
  131308. #else
  131309. "adc r4, %[r]\n\t"
  131310. #endif
  131311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131312. "lsrs r7, %[b], #16\n\t"
  131313. #else
  131314. "lsr r7, %[b], #16\n\t"
  131315. #endif
  131316. #ifdef WOLFSSL_KEIL
  131317. "muls r6, r7, r6\n\t"
  131318. #elif defined(__clang__)
  131319. "muls r6, r7\n\t"
  131320. #else
  131321. "mul r6, r7\n\t"
  131322. #endif
  131323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131324. "lsrs r7, r6, #16\n\t"
  131325. #else
  131326. "lsr r7, r6, #16\n\t"
  131327. #endif
  131328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131329. "lsls r6, r6, #16\n\t"
  131330. #else
  131331. "lsl r6, r6, #16\n\t"
  131332. #endif
  131333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131334. "adds r5, r5, r6\n\t"
  131335. #else
  131336. "add r5, r5, r6\n\t"
  131337. #endif
  131338. #ifdef WOLFSSL_KEIL
  131339. "adcs r3, r3, r7\n\t"
  131340. #elif defined(__clang__)
  131341. "adcs r3, r7\n\t"
  131342. #else
  131343. "adc r3, r7\n\t"
  131344. #endif
  131345. #ifdef WOLFSSL_KEIL
  131346. "adcs r4, r4, %[r]\n\t"
  131347. #elif defined(__clang__)
  131348. "adcs r4, %[r]\n\t"
  131349. #else
  131350. "adc r4, %[r]\n\t"
  131351. #endif
  131352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131353. "lsrs r6, %[a], #16\n\t"
  131354. #else
  131355. "lsr r6, %[a], #16\n\t"
  131356. #endif
  131357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131358. "lsrs r7, %[b], #16\n\t"
  131359. #else
  131360. "lsr r7, %[b], #16\n\t"
  131361. #endif
  131362. #ifdef WOLFSSL_KEIL
  131363. "muls r7, r6, r7\n\t"
  131364. #elif defined(__clang__)
  131365. "muls r7, r6\n\t"
  131366. #else
  131367. "mul r7, r6\n\t"
  131368. #endif
  131369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131370. "adds r3, r3, r7\n\t"
  131371. #else
  131372. "add r3, r3, r7\n\t"
  131373. #endif
  131374. #ifdef WOLFSSL_KEIL
  131375. "adcs r4, r4, %[r]\n\t"
  131376. #elif defined(__clang__)
  131377. "adcs r4, %[r]\n\t"
  131378. #else
  131379. "adc r4, %[r]\n\t"
  131380. #endif
  131381. "uxth r7, %[b]\n\t"
  131382. #ifdef WOLFSSL_KEIL
  131383. "muls r6, r7, r6\n\t"
  131384. #elif defined(__clang__)
  131385. "muls r6, r7\n\t"
  131386. #else
  131387. "mul r6, r7\n\t"
  131388. #endif
  131389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131390. "lsrs r7, r6, #16\n\t"
  131391. #else
  131392. "lsr r7, r6, #16\n\t"
  131393. #endif
  131394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131395. "lsls r6, r6, #16\n\t"
  131396. #else
  131397. "lsl r6, r6, #16\n\t"
  131398. #endif
  131399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131400. "adds r5, r5, r6\n\t"
  131401. #else
  131402. "add r5, r5, r6\n\t"
  131403. #endif
  131404. #ifdef WOLFSSL_KEIL
  131405. "adcs r3, r3, r7\n\t"
  131406. #elif defined(__clang__)
  131407. "adcs r3, r7\n\t"
  131408. #else
  131409. "adc r3, r7\n\t"
  131410. #endif
  131411. #ifdef WOLFSSL_KEIL
  131412. "adcs r4, r4, %[r]\n\t"
  131413. #elif defined(__clang__)
  131414. "adcs r4, %[r]\n\t"
  131415. #else
  131416. "adc r4, %[r]\n\t"
  131417. #endif
  131418. "# A[13] * B[1]\n\t"
  131419. "mov %[a], r9\n\t"
  131420. "mov %[b], r10\n\t"
  131421. "ldr %[a], [%[a], #52]\n\t"
  131422. "ldr %[b], [%[b], #4]\n\t"
  131423. "uxth r6, %[a]\n\t"
  131424. "uxth r7, %[b]\n\t"
  131425. #ifdef WOLFSSL_KEIL
  131426. "muls r7, r6, r7\n\t"
  131427. #elif defined(__clang__)
  131428. "muls r7, r6\n\t"
  131429. #else
  131430. "mul r7, r6\n\t"
  131431. #endif
  131432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131433. "adds r5, r5, r7\n\t"
  131434. #else
  131435. "add r5, r5, r7\n\t"
  131436. #endif
  131437. #ifdef WOLFSSL_KEIL
  131438. "adcs r3, r3, %[r]\n\t"
  131439. #elif defined(__clang__)
  131440. "adcs r3, %[r]\n\t"
  131441. #else
  131442. "adc r3, %[r]\n\t"
  131443. #endif
  131444. #ifdef WOLFSSL_KEIL
  131445. "adcs r4, r4, %[r]\n\t"
  131446. #elif defined(__clang__)
  131447. "adcs r4, %[r]\n\t"
  131448. #else
  131449. "adc r4, %[r]\n\t"
  131450. #endif
  131451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131452. "lsrs r7, %[b], #16\n\t"
  131453. #else
  131454. "lsr r7, %[b], #16\n\t"
  131455. #endif
  131456. #ifdef WOLFSSL_KEIL
  131457. "muls r6, r7, r6\n\t"
  131458. #elif defined(__clang__)
  131459. "muls r6, r7\n\t"
  131460. #else
  131461. "mul r6, r7\n\t"
  131462. #endif
  131463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131464. "lsrs r7, r6, #16\n\t"
  131465. #else
  131466. "lsr r7, r6, #16\n\t"
  131467. #endif
  131468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131469. "lsls r6, r6, #16\n\t"
  131470. #else
  131471. "lsl r6, r6, #16\n\t"
  131472. #endif
  131473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131474. "adds r5, r5, r6\n\t"
  131475. #else
  131476. "add r5, r5, r6\n\t"
  131477. #endif
  131478. #ifdef WOLFSSL_KEIL
  131479. "adcs r3, r3, r7\n\t"
  131480. #elif defined(__clang__)
  131481. "adcs r3, r7\n\t"
  131482. #else
  131483. "adc r3, r7\n\t"
  131484. #endif
  131485. #ifdef WOLFSSL_KEIL
  131486. "adcs r4, r4, %[r]\n\t"
  131487. #elif defined(__clang__)
  131488. "adcs r4, %[r]\n\t"
  131489. #else
  131490. "adc r4, %[r]\n\t"
  131491. #endif
  131492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131493. "lsrs r6, %[a], #16\n\t"
  131494. #else
  131495. "lsr r6, %[a], #16\n\t"
  131496. #endif
  131497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131498. "lsrs r7, %[b], #16\n\t"
  131499. #else
  131500. "lsr r7, %[b], #16\n\t"
  131501. #endif
  131502. #ifdef WOLFSSL_KEIL
  131503. "muls r7, r6, r7\n\t"
  131504. #elif defined(__clang__)
  131505. "muls r7, r6\n\t"
  131506. #else
  131507. "mul r7, r6\n\t"
  131508. #endif
  131509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131510. "adds r3, r3, r7\n\t"
  131511. #else
  131512. "add r3, r3, r7\n\t"
  131513. #endif
  131514. #ifdef WOLFSSL_KEIL
  131515. "adcs r4, r4, %[r]\n\t"
  131516. #elif defined(__clang__)
  131517. "adcs r4, %[r]\n\t"
  131518. #else
  131519. "adc r4, %[r]\n\t"
  131520. #endif
  131521. "uxth r7, %[b]\n\t"
  131522. #ifdef WOLFSSL_KEIL
  131523. "muls r6, r7, r6\n\t"
  131524. #elif defined(__clang__)
  131525. "muls r6, r7\n\t"
  131526. #else
  131527. "mul r6, r7\n\t"
  131528. #endif
  131529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131530. "lsrs r7, r6, #16\n\t"
  131531. #else
  131532. "lsr r7, r6, #16\n\t"
  131533. #endif
  131534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131535. "lsls r6, r6, #16\n\t"
  131536. #else
  131537. "lsl r6, r6, #16\n\t"
  131538. #endif
  131539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131540. "adds r5, r5, r6\n\t"
  131541. #else
  131542. "add r5, r5, r6\n\t"
  131543. #endif
  131544. #ifdef WOLFSSL_KEIL
  131545. "adcs r3, r3, r7\n\t"
  131546. #elif defined(__clang__)
  131547. "adcs r3, r7\n\t"
  131548. #else
  131549. "adc r3, r7\n\t"
  131550. #endif
  131551. #ifdef WOLFSSL_KEIL
  131552. "adcs r4, r4, %[r]\n\t"
  131553. #elif defined(__clang__)
  131554. "adcs r4, %[r]\n\t"
  131555. #else
  131556. "adc r4, %[r]\n\t"
  131557. #endif
  131558. "# A[12] * B[2]\n\t"
  131559. "mov %[a], r9\n\t"
  131560. "mov %[b], r10\n\t"
  131561. "ldr %[a], [%[a], #48]\n\t"
  131562. "ldr %[b], [%[b], #8]\n\t"
  131563. "uxth r6, %[a]\n\t"
  131564. "uxth r7, %[b]\n\t"
  131565. #ifdef WOLFSSL_KEIL
  131566. "muls r7, r6, r7\n\t"
  131567. #elif defined(__clang__)
  131568. "muls r7, r6\n\t"
  131569. #else
  131570. "mul r7, r6\n\t"
  131571. #endif
  131572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131573. "adds r5, r5, r7\n\t"
  131574. #else
  131575. "add r5, r5, r7\n\t"
  131576. #endif
  131577. #ifdef WOLFSSL_KEIL
  131578. "adcs r3, r3, %[r]\n\t"
  131579. #elif defined(__clang__)
  131580. "adcs r3, %[r]\n\t"
  131581. #else
  131582. "adc r3, %[r]\n\t"
  131583. #endif
  131584. #ifdef WOLFSSL_KEIL
  131585. "adcs r4, r4, %[r]\n\t"
  131586. #elif defined(__clang__)
  131587. "adcs r4, %[r]\n\t"
  131588. #else
  131589. "adc r4, %[r]\n\t"
  131590. #endif
  131591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131592. "lsrs r7, %[b], #16\n\t"
  131593. #else
  131594. "lsr r7, %[b], #16\n\t"
  131595. #endif
  131596. #ifdef WOLFSSL_KEIL
  131597. "muls r6, r7, r6\n\t"
  131598. #elif defined(__clang__)
  131599. "muls r6, r7\n\t"
  131600. #else
  131601. "mul r6, r7\n\t"
  131602. #endif
  131603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131604. "lsrs r7, r6, #16\n\t"
  131605. #else
  131606. "lsr r7, r6, #16\n\t"
  131607. #endif
  131608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131609. "lsls r6, r6, #16\n\t"
  131610. #else
  131611. "lsl r6, r6, #16\n\t"
  131612. #endif
  131613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131614. "adds r5, r5, r6\n\t"
  131615. #else
  131616. "add r5, r5, r6\n\t"
  131617. #endif
  131618. #ifdef WOLFSSL_KEIL
  131619. "adcs r3, r3, r7\n\t"
  131620. #elif defined(__clang__)
  131621. "adcs r3, r7\n\t"
  131622. #else
  131623. "adc r3, r7\n\t"
  131624. #endif
  131625. #ifdef WOLFSSL_KEIL
  131626. "adcs r4, r4, %[r]\n\t"
  131627. #elif defined(__clang__)
  131628. "adcs r4, %[r]\n\t"
  131629. #else
  131630. "adc r4, %[r]\n\t"
  131631. #endif
  131632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131633. "lsrs r6, %[a], #16\n\t"
  131634. #else
  131635. "lsr r6, %[a], #16\n\t"
  131636. #endif
  131637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131638. "lsrs r7, %[b], #16\n\t"
  131639. #else
  131640. "lsr r7, %[b], #16\n\t"
  131641. #endif
  131642. #ifdef WOLFSSL_KEIL
  131643. "muls r7, r6, r7\n\t"
  131644. #elif defined(__clang__)
  131645. "muls r7, r6\n\t"
  131646. #else
  131647. "mul r7, r6\n\t"
  131648. #endif
  131649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131650. "adds r3, r3, r7\n\t"
  131651. #else
  131652. "add r3, r3, r7\n\t"
  131653. #endif
  131654. #ifdef WOLFSSL_KEIL
  131655. "adcs r4, r4, %[r]\n\t"
  131656. #elif defined(__clang__)
  131657. "adcs r4, %[r]\n\t"
  131658. #else
  131659. "adc r4, %[r]\n\t"
  131660. #endif
  131661. "uxth r7, %[b]\n\t"
  131662. #ifdef WOLFSSL_KEIL
  131663. "muls r6, r7, r6\n\t"
  131664. #elif defined(__clang__)
  131665. "muls r6, r7\n\t"
  131666. #else
  131667. "mul r6, r7\n\t"
  131668. #endif
  131669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131670. "lsrs r7, r6, #16\n\t"
  131671. #else
  131672. "lsr r7, r6, #16\n\t"
  131673. #endif
  131674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131675. "lsls r6, r6, #16\n\t"
  131676. #else
  131677. "lsl r6, r6, #16\n\t"
  131678. #endif
  131679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131680. "adds r5, r5, r6\n\t"
  131681. #else
  131682. "add r5, r5, r6\n\t"
  131683. #endif
  131684. #ifdef WOLFSSL_KEIL
  131685. "adcs r3, r3, r7\n\t"
  131686. #elif defined(__clang__)
  131687. "adcs r3, r7\n\t"
  131688. #else
  131689. "adc r3, r7\n\t"
  131690. #endif
  131691. #ifdef WOLFSSL_KEIL
  131692. "adcs r4, r4, %[r]\n\t"
  131693. #elif defined(__clang__)
  131694. "adcs r4, %[r]\n\t"
  131695. #else
  131696. "adc r4, %[r]\n\t"
  131697. #endif
  131698. "# A[11] * B[3]\n\t"
  131699. "mov %[a], r9\n\t"
  131700. "mov %[b], r10\n\t"
  131701. "ldr %[a], [%[a], #44]\n\t"
  131702. "ldr %[b], [%[b], #12]\n\t"
  131703. "uxth r6, %[a]\n\t"
  131704. "uxth r7, %[b]\n\t"
  131705. #ifdef WOLFSSL_KEIL
  131706. "muls r7, r6, r7\n\t"
  131707. #elif defined(__clang__)
  131708. "muls r7, r6\n\t"
  131709. #else
  131710. "mul r7, r6\n\t"
  131711. #endif
  131712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131713. "adds r5, r5, r7\n\t"
  131714. #else
  131715. "add r5, r5, r7\n\t"
  131716. #endif
  131717. #ifdef WOLFSSL_KEIL
  131718. "adcs r3, r3, %[r]\n\t"
  131719. #elif defined(__clang__)
  131720. "adcs r3, %[r]\n\t"
  131721. #else
  131722. "adc r3, %[r]\n\t"
  131723. #endif
  131724. #ifdef WOLFSSL_KEIL
  131725. "adcs r4, r4, %[r]\n\t"
  131726. #elif defined(__clang__)
  131727. "adcs r4, %[r]\n\t"
  131728. #else
  131729. "adc r4, %[r]\n\t"
  131730. #endif
  131731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131732. "lsrs r7, %[b], #16\n\t"
  131733. #else
  131734. "lsr r7, %[b], #16\n\t"
  131735. #endif
  131736. #ifdef WOLFSSL_KEIL
  131737. "muls r6, r7, r6\n\t"
  131738. #elif defined(__clang__)
  131739. "muls r6, r7\n\t"
  131740. #else
  131741. "mul r6, r7\n\t"
  131742. #endif
  131743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131744. "lsrs r7, r6, #16\n\t"
  131745. #else
  131746. "lsr r7, r6, #16\n\t"
  131747. #endif
  131748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131749. "lsls r6, r6, #16\n\t"
  131750. #else
  131751. "lsl r6, r6, #16\n\t"
  131752. #endif
  131753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131754. "adds r5, r5, r6\n\t"
  131755. #else
  131756. "add r5, r5, r6\n\t"
  131757. #endif
  131758. #ifdef WOLFSSL_KEIL
  131759. "adcs r3, r3, r7\n\t"
  131760. #elif defined(__clang__)
  131761. "adcs r3, r7\n\t"
  131762. #else
  131763. "adc r3, r7\n\t"
  131764. #endif
  131765. #ifdef WOLFSSL_KEIL
  131766. "adcs r4, r4, %[r]\n\t"
  131767. #elif defined(__clang__)
  131768. "adcs r4, %[r]\n\t"
  131769. #else
  131770. "adc r4, %[r]\n\t"
  131771. #endif
  131772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131773. "lsrs r6, %[a], #16\n\t"
  131774. #else
  131775. "lsr r6, %[a], #16\n\t"
  131776. #endif
  131777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131778. "lsrs r7, %[b], #16\n\t"
  131779. #else
  131780. "lsr r7, %[b], #16\n\t"
  131781. #endif
  131782. #ifdef WOLFSSL_KEIL
  131783. "muls r7, r6, r7\n\t"
  131784. #elif defined(__clang__)
  131785. "muls r7, r6\n\t"
  131786. #else
  131787. "mul r7, r6\n\t"
  131788. #endif
  131789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131790. "adds r3, r3, r7\n\t"
  131791. #else
  131792. "add r3, r3, r7\n\t"
  131793. #endif
  131794. #ifdef WOLFSSL_KEIL
  131795. "adcs r4, r4, %[r]\n\t"
  131796. #elif defined(__clang__)
  131797. "adcs r4, %[r]\n\t"
  131798. #else
  131799. "adc r4, %[r]\n\t"
  131800. #endif
  131801. "uxth r7, %[b]\n\t"
  131802. #ifdef WOLFSSL_KEIL
  131803. "muls r6, r7, r6\n\t"
  131804. #elif defined(__clang__)
  131805. "muls r6, r7\n\t"
  131806. #else
  131807. "mul r6, r7\n\t"
  131808. #endif
  131809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131810. "lsrs r7, r6, #16\n\t"
  131811. #else
  131812. "lsr r7, r6, #16\n\t"
  131813. #endif
  131814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131815. "lsls r6, r6, #16\n\t"
  131816. #else
  131817. "lsl r6, r6, #16\n\t"
  131818. #endif
  131819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131820. "adds r5, r5, r6\n\t"
  131821. #else
  131822. "add r5, r5, r6\n\t"
  131823. #endif
  131824. #ifdef WOLFSSL_KEIL
  131825. "adcs r3, r3, r7\n\t"
  131826. #elif defined(__clang__)
  131827. "adcs r3, r7\n\t"
  131828. #else
  131829. "adc r3, r7\n\t"
  131830. #endif
  131831. #ifdef WOLFSSL_KEIL
  131832. "adcs r4, r4, %[r]\n\t"
  131833. #elif defined(__clang__)
  131834. "adcs r4, %[r]\n\t"
  131835. #else
  131836. "adc r4, %[r]\n\t"
  131837. #endif
  131838. "# A[10] * B[4]\n\t"
  131839. "mov %[a], r9\n\t"
  131840. "mov %[b], r10\n\t"
  131841. "ldr %[a], [%[a], #40]\n\t"
  131842. "ldr %[b], [%[b], #16]\n\t"
  131843. "uxth r6, %[a]\n\t"
  131844. "uxth r7, %[b]\n\t"
  131845. #ifdef WOLFSSL_KEIL
  131846. "muls r7, r6, r7\n\t"
  131847. #elif defined(__clang__)
  131848. "muls r7, r6\n\t"
  131849. #else
  131850. "mul r7, r6\n\t"
  131851. #endif
  131852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131853. "adds r5, r5, r7\n\t"
  131854. #else
  131855. "add r5, r5, r7\n\t"
  131856. #endif
  131857. #ifdef WOLFSSL_KEIL
  131858. "adcs r3, r3, %[r]\n\t"
  131859. #elif defined(__clang__)
  131860. "adcs r3, %[r]\n\t"
  131861. #else
  131862. "adc r3, %[r]\n\t"
  131863. #endif
  131864. #ifdef WOLFSSL_KEIL
  131865. "adcs r4, r4, %[r]\n\t"
  131866. #elif defined(__clang__)
  131867. "adcs r4, %[r]\n\t"
  131868. #else
  131869. "adc r4, %[r]\n\t"
  131870. #endif
  131871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131872. "lsrs r7, %[b], #16\n\t"
  131873. #else
  131874. "lsr r7, %[b], #16\n\t"
  131875. #endif
  131876. #ifdef WOLFSSL_KEIL
  131877. "muls r6, r7, r6\n\t"
  131878. #elif defined(__clang__)
  131879. "muls r6, r7\n\t"
  131880. #else
  131881. "mul r6, r7\n\t"
  131882. #endif
  131883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131884. "lsrs r7, r6, #16\n\t"
  131885. #else
  131886. "lsr r7, r6, #16\n\t"
  131887. #endif
  131888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131889. "lsls r6, r6, #16\n\t"
  131890. #else
  131891. "lsl r6, r6, #16\n\t"
  131892. #endif
  131893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131894. "adds r5, r5, r6\n\t"
  131895. #else
  131896. "add r5, r5, r6\n\t"
  131897. #endif
  131898. #ifdef WOLFSSL_KEIL
  131899. "adcs r3, r3, r7\n\t"
  131900. #elif defined(__clang__)
  131901. "adcs r3, r7\n\t"
  131902. #else
  131903. "adc r3, r7\n\t"
  131904. #endif
  131905. #ifdef WOLFSSL_KEIL
  131906. "adcs r4, r4, %[r]\n\t"
  131907. #elif defined(__clang__)
  131908. "adcs r4, %[r]\n\t"
  131909. #else
  131910. "adc r4, %[r]\n\t"
  131911. #endif
  131912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131913. "lsrs r6, %[a], #16\n\t"
  131914. #else
  131915. "lsr r6, %[a], #16\n\t"
  131916. #endif
  131917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131918. "lsrs r7, %[b], #16\n\t"
  131919. #else
  131920. "lsr r7, %[b], #16\n\t"
  131921. #endif
  131922. #ifdef WOLFSSL_KEIL
  131923. "muls r7, r6, r7\n\t"
  131924. #elif defined(__clang__)
  131925. "muls r7, r6\n\t"
  131926. #else
  131927. "mul r7, r6\n\t"
  131928. #endif
  131929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131930. "adds r3, r3, r7\n\t"
  131931. #else
  131932. "add r3, r3, r7\n\t"
  131933. #endif
  131934. #ifdef WOLFSSL_KEIL
  131935. "adcs r4, r4, %[r]\n\t"
  131936. #elif defined(__clang__)
  131937. "adcs r4, %[r]\n\t"
  131938. #else
  131939. "adc r4, %[r]\n\t"
  131940. #endif
  131941. "uxth r7, %[b]\n\t"
  131942. #ifdef WOLFSSL_KEIL
  131943. "muls r6, r7, r6\n\t"
  131944. #elif defined(__clang__)
  131945. "muls r6, r7\n\t"
  131946. #else
  131947. "mul r6, r7\n\t"
  131948. #endif
  131949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131950. "lsrs r7, r6, #16\n\t"
  131951. #else
  131952. "lsr r7, r6, #16\n\t"
  131953. #endif
  131954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131955. "lsls r6, r6, #16\n\t"
  131956. #else
  131957. "lsl r6, r6, #16\n\t"
  131958. #endif
  131959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131960. "adds r5, r5, r6\n\t"
  131961. #else
  131962. "add r5, r5, r6\n\t"
  131963. #endif
  131964. #ifdef WOLFSSL_KEIL
  131965. "adcs r3, r3, r7\n\t"
  131966. #elif defined(__clang__)
  131967. "adcs r3, r7\n\t"
  131968. #else
  131969. "adc r3, r7\n\t"
  131970. #endif
  131971. #ifdef WOLFSSL_KEIL
  131972. "adcs r4, r4, %[r]\n\t"
  131973. #elif defined(__clang__)
  131974. "adcs r4, %[r]\n\t"
  131975. #else
  131976. "adc r4, %[r]\n\t"
  131977. #endif
  131978. "# A[9] * B[5]\n\t"
  131979. "mov %[a], r9\n\t"
  131980. "mov %[b], r10\n\t"
  131981. "ldr %[a], [%[a], #36]\n\t"
  131982. "ldr %[b], [%[b], #20]\n\t"
  131983. "uxth r6, %[a]\n\t"
  131984. "uxth r7, %[b]\n\t"
  131985. #ifdef WOLFSSL_KEIL
  131986. "muls r7, r6, r7\n\t"
  131987. #elif defined(__clang__)
  131988. "muls r7, r6\n\t"
  131989. #else
  131990. "mul r7, r6\n\t"
  131991. #endif
  131992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131993. "adds r5, r5, r7\n\t"
  131994. #else
  131995. "add r5, r5, r7\n\t"
  131996. #endif
  131997. #ifdef WOLFSSL_KEIL
  131998. "adcs r3, r3, %[r]\n\t"
  131999. #elif defined(__clang__)
  132000. "adcs r3, %[r]\n\t"
  132001. #else
  132002. "adc r3, %[r]\n\t"
  132003. #endif
  132004. #ifdef WOLFSSL_KEIL
  132005. "adcs r4, r4, %[r]\n\t"
  132006. #elif defined(__clang__)
  132007. "adcs r4, %[r]\n\t"
  132008. #else
  132009. "adc r4, %[r]\n\t"
  132010. #endif
  132011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132012. "lsrs r7, %[b], #16\n\t"
  132013. #else
  132014. "lsr r7, %[b], #16\n\t"
  132015. #endif
  132016. #ifdef WOLFSSL_KEIL
  132017. "muls r6, r7, r6\n\t"
  132018. #elif defined(__clang__)
  132019. "muls r6, r7\n\t"
  132020. #else
  132021. "mul r6, r7\n\t"
  132022. #endif
  132023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132024. "lsrs r7, r6, #16\n\t"
  132025. #else
  132026. "lsr r7, r6, #16\n\t"
  132027. #endif
  132028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132029. "lsls r6, r6, #16\n\t"
  132030. #else
  132031. "lsl r6, r6, #16\n\t"
  132032. #endif
  132033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132034. "adds r5, r5, r6\n\t"
  132035. #else
  132036. "add r5, r5, r6\n\t"
  132037. #endif
  132038. #ifdef WOLFSSL_KEIL
  132039. "adcs r3, r3, r7\n\t"
  132040. #elif defined(__clang__)
  132041. "adcs r3, r7\n\t"
  132042. #else
  132043. "adc r3, r7\n\t"
  132044. #endif
  132045. #ifdef WOLFSSL_KEIL
  132046. "adcs r4, r4, %[r]\n\t"
  132047. #elif defined(__clang__)
  132048. "adcs r4, %[r]\n\t"
  132049. #else
  132050. "adc r4, %[r]\n\t"
  132051. #endif
  132052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132053. "lsrs r6, %[a], #16\n\t"
  132054. #else
  132055. "lsr r6, %[a], #16\n\t"
  132056. #endif
  132057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132058. "lsrs r7, %[b], #16\n\t"
  132059. #else
  132060. "lsr r7, %[b], #16\n\t"
  132061. #endif
  132062. #ifdef WOLFSSL_KEIL
  132063. "muls r7, r6, r7\n\t"
  132064. #elif defined(__clang__)
  132065. "muls r7, r6\n\t"
  132066. #else
  132067. "mul r7, r6\n\t"
  132068. #endif
  132069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132070. "adds r3, r3, r7\n\t"
  132071. #else
  132072. "add r3, r3, r7\n\t"
  132073. #endif
  132074. #ifdef WOLFSSL_KEIL
  132075. "adcs r4, r4, %[r]\n\t"
  132076. #elif defined(__clang__)
  132077. "adcs r4, %[r]\n\t"
  132078. #else
  132079. "adc r4, %[r]\n\t"
  132080. #endif
  132081. "uxth r7, %[b]\n\t"
  132082. #ifdef WOLFSSL_KEIL
  132083. "muls r6, r7, r6\n\t"
  132084. #elif defined(__clang__)
  132085. "muls r6, r7\n\t"
  132086. #else
  132087. "mul r6, r7\n\t"
  132088. #endif
  132089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132090. "lsrs r7, r6, #16\n\t"
  132091. #else
  132092. "lsr r7, r6, #16\n\t"
  132093. #endif
  132094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132095. "lsls r6, r6, #16\n\t"
  132096. #else
  132097. "lsl r6, r6, #16\n\t"
  132098. #endif
  132099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132100. "adds r5, r5, r6\n\t"
  132101. #else
  132102. "add r5, r5, r6\n\t"
  132103. #endif
  132104. #ifdef WOLFSSL_KEIL
  132105. "adcs r3, r3, r7\n\t"
  132106. #elif defined(__clang__)
  132107. "adcs r3, r7\n\t"
  132108. #else
  132109. "adc r3, r7\n\t"
  132110. #endif
  132111. #ifdef WOLFSSL_KEIL
  132112. "adcs r4, r4, %[r]\n\t"
  132113. #elif defined(__clang__)
  132114. "adcs r4, %[r]\n\t"
  132115. #else
  132116. "adc r4, %[r]\n\t"
  132117. #endif
  132118. "# A[8] * B[6]\n\t"
  132119. "mov %[a], r9\n\t"
  132120. "mov %[b], r10\n\t"
  132121. "ldr %[a], [%[a], #32]\n\t"
  132122. "ldr %[b], [%[b], #24]\n\t"
  132123. "uxth r6, %[a]\n\t"
  132124. "uxth r7, %[b]\n\t"
  132125. #ifdef WOLFSSL_KEIL
  132126. "muls r7, r6, r7\n\t"
  132127. #elif defined(__clang__)
  132128. "muls r7, r6\n\t"
  132129. #else
  132130. "mul r7, r6\n\t"
  132131. #endif
  132132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132133. "adds r5, r5, r7\n\t"
  132134. #else
  132135. "add r5, r5, r7\n\t"
  132136. #endif
  132137. #ifdef WOLFSSL_KEIL
  132138. "adcs r3, r3, %[r]\n\t"
  132139. #elif defined(__clang__)
  132140. "adcs r3, %[r]\n\t"
  132141. #else
  132142. "adc r3, %[r]\n\t"
  132143. #endif
  132144. #ifdef WOLFSSL_KEIL
  132145. "adcs r4, r4, %[r]\n\t"
  132146. #elif defined(__clang__)
  132147. "adcs r4, %[r]\n\t"
  132148. #else
  132149. "adc r4, %[r]\n\t"
  132150. #endif
  132151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132152. "lsrs r7, %[b], #16\n\t"
  132153. #else
  132154. "lsr r7, %[b], #16\n\t"
  132155. #endif
  132156. #ifdef WOLFSSL_KEIL
  132157. "muls r6, r7, r6\n\t"
  132158. #elif defined(__clang__)
  132159. "muls r6, r7\n\t"
  132160. #else
  132161. "mul r6, r7\n\t"
  132162. #endif
  132163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132164. "lsrs r7, r6, #16\n\t"
  132165. #else
  132166. "lsr r7, r6, #16\n\t"
  132167. #endif
  132168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132169. "lsls r6, r6, #16\n\t"
  132170. #else
  132171. "lsl r6, r6, #16\n\t"
  132172. #endif
  132173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132174. "adds r5, r5, r6\n\t"
  132175. #else
  132176. "add r5, r5, r6\n\t"
  132177. #endif
  132178. #ifdef WOLFSSL_KEIL
  132179. "adcs r3, r3, r7\n\t"
  132180. #elif defined(__clang__)
  132181. "adcs r3, r7\n\t"
  132182. #else
  132183. "adc r3, r7\n\t"
  132184. #endif
  132185. #ifdef WOLFSSL_KEIL
  132186. "adcs r4, r4, %[r]\n\t"
  132187. #elif defined(__clang__)
  132188. "adcs r4, %[r]\n\t"
  132189. #else
  132190. "adc r4, %[r]\n\t"
  132191. #endif
  132192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132193. "lsrs r6, %[a], #16\n\t"
  132194. #else
  132195. "lsr r6, %[a], #16\n\t"
  132196. #endif
  132197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132198. "lsrs r7, %[b], #16\n\t"
  132199. #else
  132200. "lsr r7, %[b], #16\n\t"
  132201. #endif
  132202. #ifdef WOLFSSL_KEIL
  132203. "muls r7, r6, r7\n\t"
  132204. #elif defined(__clang__)
  132205. "muls r7, r6\n\t"
  132206. #else
  132207. "mul r7, r6\n\t"
  132208. #endif
  132209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132210. "adds r3, r3, r7\n\t"
  132211. #else
  132212. "add r3, r3, r7\n\t"
  132213. #endif
  132214. #ifdef WOLFSSL_KEIL
  132215. "adcs r4, r4, %[r]\n\t"
  132216. #elif defined(__clang__)
  132217. "adcs r4, %[r]\n\t"
  132218. #else
  132219. "adc r4, %[r]\n\t"
  132220. #endif
  132221. "uxth r7, %[b]\n\t"
  132222. #ifdef WOLFSSL_KEIL
  132223. "muls r6, r7, r6\n\t"
  132224. #elif defined(__clang__)
  132225. "muls r6, r7\n\t"
  132226. #else
  132227. "mul r6, r7\n\t"
  132228. #endif
  132229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132230. "lsrs r7, r6, #16\n\t"
  132231. #else
  132232. "lsr r7, r6, #16\n\t"
  132233. #endif
  132234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132235. "lsls r6, r6, #16\n\t"
  132236. #else
  132237. "lsl r6, r6, #16\n\t"
  132238. #endif
  132239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132240. "adds r5, r5, r6\n\t"
  132241. #else
  132242. "add r5, r5, r6\n\t"
  132243. #endif
  132244. #ifdef WOLFSSL_KEIL
  132245. "adcs r3, r3, r7\n\t"
  132246. #elif defined(__clang__)
  132247. "adcs r3, r7\n\t"
  132248. #else
  132249. "adc r3, r7\n\t"
  132250. #endif
  132251. #ifdef WOLFSSL_KEIL
  132252. "adcs r4, r4, %[r]\n\t"
  132253. #elif defined(__clang__)
  132254. "adcs r4, %[r]\n\t"
  132255. #else
  132256. "adc r4, %[r]\n\t"
  132257. #endif
  132258. "# A[7] * B[7]\n\t"
  132259. "mov %[a], r9\n\t"
  132260. "mov %[b], r10\n\t"
  132261. "ldr %[a], [%[a], #28]\n\t"
  132262. "ldr %[b], [%[b], #28]\n\t"
  132263. "uxth r6, %[a]\n\t"
  132264. "uxth r7, %[b]\n\t"
  132265. #ifdef WOLFSSL_KEIL
  132266. "muls r7, r6, r7\n\t"
  132267. #elif defined(__clang__)
  132268. "muls r7, r6\n\t"
  132269. #else
  132270. "mul r7, r6\n\t"
  132271. #endif
  132272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132273. "adds r5, r5, r7\n\t"
  132274. #else
  132275. "add r5, r5, r7\n\t"
  132276. #endif
  132277. #ifdef WOLFSSL_KEIL
  132278. "adcs r3, r3, %[r]\n\t"
  132279. #elif defined(__clang__)
  132280. "adcs r3, %[r]\n\t"
  132281. #else
  132282. "adc r3, %[r]\n\t"
  132283. #endif
  132284. #ifdef WOLFSSL_KEIL
  132285. "adcs r4, r4, %[r]\n\t"
  132286. #elif defined(__clang__)
  132287. "adcs r4, %[r]\n\t"
  132288. #else
  132289. "adc r4, %[r]\n\t"
  132290. #endif
  132291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132292. "lsrs r7, %[b], #16\n\t"
  132293. #else
  132294. "lsr r7, %[b], #16\n\t"
  132295. #endif
  132296. #ifdef WOLFSSL_KEIL
  132297. "muls r6, r7, r6\n\t"
  132298. #elif defined(__clang__)
  132299. "muls r6, r7\n\t"
  132300. #else
  132301. "mul r6, r7\n\t"
  132302. #endif
  132303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132304. "lsrs r7, r6, #16\n\t"
  132305. #else
  132306. "lsr r7, r6, #16\n\t"
  132307. #endif
  132308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132309. "lsls r6, r6, #16\n\t"
  132310. #else
  132311. "lsl r6, r6, #16\n\t"
  132312. #endif
  132313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132314. "adds r5, r5, r6\n\t"
  132315. #else
  132316. "add r5, r5, r6\n\t"
  132317. #endif
  132318. #ifdef WOLFSSL_KEIL
  132319. "adcs r3, r3, r7\n\t"
  132320. #elif defined(__clang__)
  132321. "adcs r3, r7\n\t"
  132322. #else
  132323. "adc r3, r7\n\t"
  132324. #endif
  132325. #ifdef WOLFSSL_KEIL
  132326. "adcs r4, r4, %[r]\n\t"
  132327. #elif defined(__clang__)
  132328. "adcs r4, %[r]\n\t"
  132329. #else
  132330. "adc r4, %[r]\n\t"
  132331. #endif
  132332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132333. "lsrs r6, %[a], #16\n\t"
  132334. #else
  132335. "lsr r6, %[a], #16\n\t"
  132336. #endif
  132337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132338. "lsrs r7, %[b], #16\n\t"
  132339. #else
  132340. "lsr r7, %[b], #16\n\t"
  132341. #endif
  132342. #ifdef WOLFSSL_KEIL
  132343. "muls r7, r6, r7\n\t"
  132344. #elif defined(__clang__)
  132345. "muls r7, r6\n\t"
  132346. #else
  132347. "mul r7, r6\n\t"
  132348. #endif
  132349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132350. "adds r3, r3, r7\n\t"
  132351. #else
  132352. "add r3, r3, r7\n\t"
  132353. #endif
  132354. #ifdef WOLFSSL_KEIL
  132355. "adcs r4, r4, %[r]\n\t"
  132356. #elif defined(__clang__)
  132357. "adcs r4, %[r]\n\t"
  132358. #else
  132359. "adc r4, %[r]\n\t"
  132360. #endif
  132361. "uxth r7, %[b]\n\t"
  132362. #ifdef WOLFSSL_KEIL
  132363. "muls r6, r7, r6\n\t"
  132364. #elif defined(__clang__)
  132365. "muls r6, r7\n\t"
  132366. #else
  132367. "mul r6, r7\n\t"
  132368. #endif
  132369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132370. "lsrs r7, r6, #16\n\t"
  132371. #else
  132372. "lsr r7, r6, #16\n\t"
  132373. #endif
  132374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132375. "lsls r6, r6, #16\n\t"
  132376. #else
  132377. "lsl r6, r6, #16\n\t"
  132378. #endif
  132379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132380. "adds r5, r5, r6\n\t"
  132381. #else
  132382. "add r5, r5, r6\n\t"
  132383. #endif
  132384. #ifdef WOLFSSL_KEIL
  132385. "adcs r3, r3, r7\n\t"
  132386. #elif defined(__clang__)
  132387. "adcs r3, r7\n\t"
  132388. #else
  132389. "adc r3, r7\n\t"
  132390. #endif
  132391. #ifdef WOLFSSL_KEIL
  132392. "adcs r4, r4, %[r]\n\t"
  132393. #elif defined(__clang__)
  132394. "adcs r4, %[r]\n\t"
  132395. #else
  132396. "adc r4, %[r]\n\t"
  132397. #endif
  132398. "# A[6] * B[8]\n\t"
  132399. "mov %[a], r9\n\t"
  132400. "mov %[b], r10\n\t"
  132401. "ldr %[a], [%[a], #24]\n\t"
  132402. "ldr %[b], [%[b], #32]\n\t"
  132403. "uxth r6, %[a]\n\t"
  132404. "uxth r7, %[b]\n\t"
  132405. #ifdef WOLFSSL_KEIL
  132406. "muls r7, r6, r7\n\t"
  132407. #elif defined(__clang__)
  132408. "muls r7, r6\n\t"
  132409. #else
  132410. "mul r7, r6\n\t"
  132411. #endif
  132412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132413. "adds r5, r5, r7\n\t"
  132414. #else
  132415. "add r5, r5, r7\n\t"
  132416. #endif
  132417. #ifdef WOLFSSL_KEIL
  132418. "adcs r3, r3, %[r]\n\t"
  132419. #elif defined(__clang__)
  132420. "adcs r3, %[r]\n\t"
  132421. #else
  132422. "adc r3, %[r]\n\t"
  132423. #endif
  132424. #ifdef WOLFSSL_KEIL
  132425. "adcs r4, r4, %[r]\n\t"
  132426. #elif defined(__clang__)
  132427. "adcs r4, %[r]\n\t"
  132428. #else
  132429. "adc r4, %[r]\n\t"
  132430. #endif
  132431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132432. "lsrs r7, %[b], #16\n\t"
  132433. #else
  132434. "lsr r7, %[b], #16\n\t"
  132435. #endif
  132436. #ifdef WOLFSSL_KEIL
  132437. "muls r6, r7, r6\n\t"
  132438. #elif defined(__clang__)
  132439. "muls r6, r7\n\t"
  132440. #else
  132441. "mul r6, r7\n\t"
  132442. #endif
  132443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132444. "lsrs r7, r6, #16\n\t"
  132445. #else
  132446. "lsr r7, r6, #16\n\t"
  132447. #endif
  132448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132449. "lsls r6, r6, #16\n\t"
  132450. #else
  132451. "lsl r6, r6, #16\n\t"
  132452. #endif
  132453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132454. "adds r5, r5, r6\n\t"
  132455. #else
  132456. "add r5, r5, r6\n\t"
  132457. #endif
  132458. #ifdef WOLFSSL_KEIL
  132459. "adcs r3, r3, r7\n\t"
  132460. #elif defined(__clang__)
  132461. "adcs r3, r7\n\t"
  132462. #else
  132463. "adc r3, r7\n\t"
  132464. #endif
  132465. #ifdef WOLFSSL_KEIL
  132466. "adcs r4, r4, %[r]\n\t"
  132467. #elif defined(__clang__)
  132468. "adcs r4, %[r]\n\t"
  132469. #else
  132470. "adc r4, %[r]\n\t"
  132471. #endif
  132472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132473. "lsrs r6, %[a], #16\n\t"
  132474. #else
  132475. "lsr r6, %[a], #16\n\t"
  132476. #endif
  132477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132478. "lsrs r7, %[b], #16\n\t"
  132479. #else
  132480. "lsr r7, %[b], #16\n\t"
  132481. #endif
  132482. #ifdef WOLFSSL_KEIL
  132483. "muls r7, r6, r7\n\t"
  132484. #elif defined(__clang__)
  132485. "muls r7, r6\n\t"
  132486. #else
  132487. "mul r7, r6\n\t"
  132488. #endif
  132489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132490. "adds r3, r3, r7\n\t"
  132491. #else
  132492. "add r3, r3, r7\n\t"
  132493. #endif
  132494. #ifdef WOLFSSL_KEIL
  132495. "adcs r4, r4, %[r]\n\t"
  132496. #elif defined(__clang__)
  132497. "adcs r4, %[r]\n\t"
  132498. #else
  132499. "adc r4, %[r]\n\t"
  132500. #endif
  132501. "uxth r7, %[b]\n\t"
  132502. #ifdef WOLFSSL_KEIL
  132503. "muls r6, r7, r6\n\t"
  132504. #elif defined(__clang__)
  132505. "muls r6, r7\n\t"
  132506. #else
  132507. "mul r6, r7\n\t"
  132508. #endif
  132509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132510. "lsrs r7, r6, #16\n\t"
  132511. #else
  132512. "lsr r7, r6, #16\n\t"
  132513. #endif
  132514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132515. "lsls r6, r6, #16\n\t"
  132516. #else
  132517. "lsl r6, r6, #16\n\t"
  132518. #endif
  132519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132520. "adds r5, r5, r6\n\t"
  132521. #else
  132522. "add r5, r5, r6\n\t"
  132523. #endif
  132524. #ifdef WOLFSSL_KEIL
  132525. "adcs r3, r3, r7\n\t"
  132526. #elif defined(__clang__)
  132527. "adcs r3, r7\n\t"
  132528. #else
  132529. "adc r3, r7\n\t"
  132530. #endif
  132531. #ifdef WOLFSSL_KEIL
  132532. "adcs r4, r4, %[r]\n\t"
  132533. #elif defined(__clang__)
  132534. "adcs r4, %[r]\n\t"
  132535. #else
  132536. "adc r4, %[r]\n\t"
  132537. #endif
  132538. "# A[5] * B[9]\n\t"
  132539. "mov %[a], r9\n\t"
  132540. "mov %[b], r10\n\t"
  132541. "ldr %[a], [%[a], #20]\n\t"
  132542. "ldr %[b], [%[b], #36]\n\t"
  132543. "uxth r6, %[a]\n\t"
  132544. "uxth r7, %[b]\n\t"
  132545. #ifdef WOLFSSL_KEIL
  132546. "muls r7, r6, r7\n\t"
  132547. #elif defined(__clang__)
  132548. "muls r7, r6\n\t"
  132549. #else
  132550. "mul r7, r6\n\t"
  132551. #endif
  132552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132553. "adds r5, r5, r7\n\t"
  132554. #else
  132555. "add r5, r5, r7\n\t"
  132556. #endif
  132557. #ifdef WOLFSSL_KEIL
  132558. "adcs r3, r3, %[r]\n\t"
  132559. #elif defined(__clang__)
  132560. "adcs r3, %[r]\n\t"
  132561. #else
  132562. "adc r3, %[r]\n\t"
  132563. #endif
  132564. #ifdef WOLFSSL_KEIL
  132565. "adcs r4, r4, %[r]\n\t"
  132566. #elif defined(__clang__)
  132567. "adcs r4, %[r]\n\t"
  132568. #else
  132569. "adc r4, %[r]\n\t"
  132570. #endif
  132571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132572. "lsrs r7, %[b], #16\n\t"
  132573. #else
  132574. "lsr r7, %[b], #16\n\t"
  132575. #endif
  132576. #ifdef WOLFSSL_KEIL
  132577. "muls r6, r7, r6\n\t"
  132578. #elif defined(__clang__)
  132579. "muls r6, r7\n\t"
  132580. #else
  132581. "mul r6, r7\n\t"
  132582. #endif
  132583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132584. "lsrs r7, r6, #16\n\t"
  132585. #else
  132586. "lsr r7, r6, #16\n\t"
  132587. #endif
  132588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132589. "lsls r6, r6, #16\n\t"
  132590. #else
  132591. "lsl r6, r6, #16\n\t"
  132592. #endif
  132593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132594. "adds r5, r5, r6\n\t"
  132595. #else
  132596. "add r5, r5, r6\n\t"
  132597. #endif
  132598. #ifdef WOLFSSL_KEIL
  132599. "adcs r3, r3, r7\n\t"
  132600. #elif defined(__clang__)
  132601. "adcs r3, r7\n\t"
  132602. #else
  132603. "adc r3, r7\n\t"
  132604. #endif
  132605. #ifdef WOLFSSL_KEIL
  132606. "adcs r4, r4, %[r]\n\t"
  132607. #elif defined(__clang__)
  132608. "adcs r4, %[r]\n\t"
  132609. #else
  132610. "adc r4, %[r]\n\t"
  132611. #endif
  132612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132613. "lsrs r6, %[a], #16\n\t"
  132614. #else
  132615. "lsr r6, %[a], #16\n\t"
  132616. #endif
  132617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132618. "lsrs r7, %[b], #16\n\t"
  132619. #else
  132620. "lsr r7, %[b], #16\n\t"
  132621. #endif
  132622. #ifdef WOLFSSL_KEIL
  132623. "muls r7, r6, r7\n\t"
  132624. #elif defined(__clang__)
  132625. "muls r7, r6\n\t"
  132626. #else
  132627. "mul r7, r6\n\t"
  132628. #endif
  132629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132630. "adds r3, r3, r7\n\t"
  132631. #else
  132632. "add r3, r3, r7\n\t"
  132633. #endif
  132634. #ifdef WOLFSSL_KEIL
  132635. "adcs r4, r4, %[r]\n\t"
  132636. #elif defined(__clang__)
  132637. "adcs r4, %[r]\n\t"
  132638. #else
  132639. "adc r4, %[r]\n\t"
  132640. #endif
  132641. "uxth r7, %[b]\n\t"
  132642. #ifdef WOLFSSL_KEIL
  132643. "muls r6, r7, r6\n\t"
  132644. #elif defined(__clang__)
  132645. "muls r6, r7\n\t"
  132646. #else
  132647. "mul r6, r7\n\t"
  132648. #endif
  132649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132650. "lsrs r7, r6, #16\n\t"
  132651. #else
  132652. "lsr r7, r6, #16\n\t"
  132653. #endif
  132654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132655. "lsls r6, r6, #16\n\t"
  132656. #else
  132657. "lsl r6, r6, #16\n\t"
  132658. #endif
  132659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132660. "adds r5, r5, r6\n\t"
  132661. #else
  132662. "add r5, r5, r6\n\t"
  132663. #endif
  132664. #ifdef WOLFSSL_KEIL
  132665. "adcs r3, r3, r7\n\t"
  132666. #elif defined(__clang__)
  132667. "adcs r3, r7\n\t"
  132668. #else
  132669. "adc r3, r7\n\t"
  132670. #endif
  132671. #ifdef WOLFSSL_KEIL
  132672. "adcs r4, r4, %[r]\n\t"
  132673. #elif defined(__clang__)
  132674. "adcs r4, %[r]\n\t"
  132675. #else
  132676. "adc r4, %[r]\n\t"
  132677. #endif
  132678. "# A[4] * B[10]\n\t"
  132679. "mov %[a], r9\n\t"
  132680. "mov %[b], r10\n\t"
  132681. "ldr %[a], [%[a], #16]\n\t"
  132682. "ldr %[b], [%[b], #40]\n\t"
  132683. "uxth r6, %[a]\n\t"
  132684. "uxth r7, %[b]\n\t"
  132685. #ifdef WOLFSSL_KEIL
  132686. "muls r7, r6, r7\n\t"
  132687. #elif defined(__clang__)
  132688. "muls r7, r6\n\t"
  132689. #else
  132690. "mul r7, r6\n\t"
  132691. #endif
  132692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132693. "adds r5, r5, r7\n\t"
  132694. #else
  132695. "add r5, r5, r7\n\t"
  132696. #endif
  132697. #ifdef WOLFSSL_KEIL
  132698. "adcs r3, r3, %[r]\n\t"
  132699. #elif defined(__clang__)
  132700. "adcs r3, %[r]\n\t"
  132701. #else
  132702. "adc r3, %[r]\n\t"
  132703. #endif
  132704. #ifdef WOLFSSL_KEIL
  132705. "adcs r4, r4, %[r]\n\t"
  132706. #elif defined(__clang__)
  132707. "adcs r4, %[r]\n\t"
  132708. #else
  132709. "adc r4, %[r]\n\t"
  132710. #endif
  132711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132712. "lsrs r7, %[b], #16\n\t"
  132713. #else
  132714. "lsr r7, %[b], #16\n\t"
  132715. #endif
  132716. #ifdef WOLFSSL_KEIL
  132717. "muls r6, r7, r6\n\t"
  132718. #elif defined(__clang__)
  132719. "muls r6, r7\n\t"
  132720. #else
  132721. "mul r6, r7\n\t"
  132722. #endif
  132723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132724. "lsrs r7, r6, #16\n\t"
  132725. #else
  132726. "lsr r7, r6, #16\n\t"
  132727. #endif
  132728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132729. "lsls r6, r6, #16\n\t"
  132730. #else
  132731. "lsl r6, r6, #16\n\t"
  132732. #endif
  132733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132734. "adds r5, r5, r6\n\t"
  132735. #else
  132736. "add r5, r5, r6\n\t"
  132737. #endif
  132738. #ifdef WOLFSSL_KEIL
  132739. "adcs r3, r3, r7\n\t"
  132740. #elif defined(__clang__)
  132741. "adcs r3, r7\n\t"
  132742. #else
  132743. "adc r3, r7\n\t"
  132744. #endif
  132745. #ifdef WOLFSSL_KEIL
  132746. "adcs r4, r4, %[r]\n\t"
  132747. #elif defined(__clang__)
  132748. "adcs r4, %[r]\n\t"
  132749. #else
  132750. "adc r4, %[r]\n\t"
  132751. #endif
  132752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132753. "lsrs r6, %[a], #16\n\t"
  132754. #else
  132755. "lsr r6, %[a], #16\n\t"
  132756. #endif
  132757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132758. "lsrs r7, %[b], #16\n\t"
  132759. #else
  132760. "lsr r7, %[b], #16\n\t"
  132761. #endif
  132762. #ifdef WOLFSSL_KEIL
  132763. "muls r7, r6, r7\n\t"
  132764. #elif defined(__clang__)
  132765. "muls r7, r6\n\t"
  132766. #else
  132767. "mul r7, r6\n\t"
  132768. #endif
  132769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132770. "adds r3, r3, r7\n\t"
  132771. #else
  132772. "add r3, r3, r7\n\t"
  132773. #endif
  132774. #ifdef WOLFSSL_KEIL
  132775. "adcs r4, r4, %[r]\n\t"
  132776. #elif defined(__clang__)
  132777. "adcs r4, %[r]\n\t"
  132778. #else
  132779. "adc r4, %[r]\n\t"
  132780. #endif
  132781. "uxth r7, %[b]\n\t"
  132782. #ifdef WOLFSSL_KEIL
  132783. "muls r6, r7, r6\n\t"
  132784. #elif defined(__clang__)
  132785. "muls r6, r7\n\t"
  132786. #else
  132787. "mul r6, r7\n\t"
  132788. #endif
  132789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132790. "lsrs r7, r6, #16\n\t"
  132791. #else
  132792. "lsr r7, r6, #16\n\t"
  132793. #endif
  132794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132795. "lsls r6, r6, #16\n\t"
  132796. #else
  132797. "lsl r6, r6, #16\n\t"
  132798. #endif
  132799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132800. "adds r5, r5, r6\n\t"
  132801. #else
  132802. "add r5, r5, r6\n\t"
  132803. #endif
  132804. #ifdef WOLFSSL_KEIL
  132805. "adcs r3, r3, r7\n\t"
  132806. #elif defined(__clang__)
  132807. "adcs r3, r7\n\t"
  132808. #else
  132809. "adc r3, r7\n\t"
  132810. #endif
  132811. #ifdef WOLFSSL_KEIL
  132812. "adcs r4, r4, %[r]\n\t"
  132813. #elif defined(__clang__)
  132814. "adcs r4, %[r]\n\t"
  132815. #else
  132816. "adc r4, %[r]\n\t"
  132817. #endif
  132818. "# A[3] * B[11]\n\t"
  132819. "mov %[a], r9\n\t"
  132820. "mov %[b], r10\n\t"
  132821. "ldr %[a], [%[a], #12]\n\t"
  132822. "ldr %[b], [%[b], #44]\n\t"
  132823. "uxth r6, %[a]\n\t"
  132824. "uxth r7, %[b]\n\t"
  132825. #ifdef WOLFSSL_KEIL
  132826. "muls r7, r6, r7\n\t"
  132827. #elif defined(__clang__)
  132828. "muls r7, r6\n\t"
  132829. #else
  132830. "mul r7, r6\n\t"
  132831. #endif
  132832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132833. "adds r5, r5, r7\n\t"
  132834. #else
  132835. "add r5, r5, r7\n\t"
  132836. #endif
  132837. #ifdef WOLFSSL_KEIL
  132838. "adcs r3, r3, %[r]\n\t"
  132839. #elif defined(__clang__)
  132840. "adcs r3, %[r]\n\t"
  132841. #else
  132842. "adc r3, %[r]\n\t"
  132843. #endif
  132844. #ifdef WOLFSSL_KEIL
  132845. "adcs r4, r4, %[r]\n\t"
  132846. #elif defined(__clang__)
  132847. "adcs r4, %[r]\n\t"
  132848. #else
  132849. "adc r4, %[r]\n\t"
  132850. #endif
  132851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132852. "lsrs r7, %[b], #16\n\t"
  132853. #else
  132854. "lsr r7, %[b], #16\n\t"
  132855. #endif
  132856. #ifdef WOLFSSL_KEIL
  132857. "muls r6, r7, r6\n\t"
  132858. #elif defined(__clang__)
  132859. "muls r6, r7\n\t"
  132860. #else
  132861. "mul r6, r7\n\t"
  132862. #endif
  132863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132864. "lsrs r7, r6, #16\n\t"
  132865. #else
  132866. "lsr r7, r6, #16\n\t"
  132867. #endif
  132868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132869. "lsls r6, r6, #16\n\t"
  132870. #else
  132871. "lsl r6, r6, #16\n\t"
  132872. #endif
  132873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132874. "adds r5, r5, r6\n\t"
  132875. #else
  132876. "add r5, r5, r6\n\t"
  132877. #endif
  132878. #ifdef WOLFSSL_KEIL
  132879. "adcs r3, r3, r7\n\t"
  132880. #elif defined(__clang__)
  132881. "adcs r3, r7\n\t"
  132882. #else
  132883. "adc r3, r7\n\t"
  132884. #endif
  132885. #ifdef WOLFSSL_KEIL
  132886. "adcs r4, r4, %[r]\n\t"
  132887. #elif defined(__clang__)
  132888. "adcs r4, %[r]\n\t"
  132889. #else
  132890. "adc r4, %[r]\n\t"
  132891. #endif
  132892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132893. "lsrs r6, %[a], #16\n\t"
  132894. #else
  132895. "lsr r6, %[a], #16\n\t"
  132896. #endif
  132897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132898. "lsrs r7, %[b], #16\n\t"
  132899. #else
  132900. "lsr r7, %[b], #16\n\t"
  132901. #endif
  132902. #ifdef WOLFSSL_KEIL
  132903. "muls r7, r6, r7\n\t"
  132904. #elif defined(__clang__)
  132905. "muls r7, r6\n\t"
  132906. #else
  132907. "mul r7, r6\n\t"
  132908. #endif
  132909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132910. "adds r3, r3, r7\n\t"
  132911. #else
  132912. "add r3, r3, r7\n\t"
  132913. #endif
  132914. #ifdef WOLFSSL_KEIL
  132915. "adcs r4, r4, %[r]\n\t"
  132916. #elif defined(__clang__)
  132917. "adcs r4, %[r]\n\t"
  132918. #else
  132919. "adc r4, %[r]\n\t"
  132920. #endif
  132921. "uxth r7, %[b]\n\t"
  132922. #ifdef WOLFSSL_KEIL
  132923. "muls r6, r7, r6\n\t"
  132924. #elif defined(__clang__)
  132925. "muls r6, r7\n\t"
  132926. #else
  132927. "mul r6, r7\n\t"
  132928. #endif
  132929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132930. "lsrs r7, r6, #16\n\t"
  132931. #else
  132932. "lsr r7, r6, #16\n\t"
  132933. #endif
  132934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132935. "lsls r6, r6, #16\n\t"
  132936. #else
  132937. "lsl r6, r6, #16\n\t"
  132938. #endif
  132939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132940. "adds r5, r5, r6\n\t"
  132941. #else
  132942. "add r5, r5, r6\n\t"
  132943. #endif
  132944. #ifdef WOLFSSL_KEIL
  132945. "adcs r3, r3, r7\n\t"
  132946. #elif defined(__clang__)
  132947. "adcs r3, r7\n\t"
  132948. #else
  132949. "adc r3, r7\n\t"
  132950. #endif
  132951. #ifdef WOLFSSL_KEIL
  132952. "adcs r4, r4, %[r]\n\t"
  132953. #elif defined(__clang__)
  132954. "adcs r4, %[r]\n\t"
  132955. #else
  132956. "adc r4, %[r]\n\t"
  132957. #endif
  132958. "# A[2] * B[12]\n\t"
  132959. "mov %[a], r9\n\t"
  132960. "mov %[b], r10\n\t"
  132961. "ldr %[a], [%[a], #8]\n\t"
  132962. "ldr %[b], [%[b], #48]\n\t"
  132963. "uxth r6, %[a]\n\t"
  132964. "uxth r7, %[b]\n\t"
  132965. #ifdef WOLFSSL_KEIL
  132966. "muls r7, r6, r7\n\t"
  132967. #elif defined(__clang__)
  132968. "muls r7, r6\n\t"
  132969. #else
  132970. "mul r7, r6\n\t"
  132971. #endif
  132972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132973. "adds r5, r5, r7\n\t"
  132974. #else
  132975. "add r5, r5, r7\n\t"
  132976. #endif
  132977. #ifdef WOLFSSL_KEIL
  132978. "adcs r3, r3, %[r]\n\t"
  132979. #elif defined(__clang__)
  132980. "adcs r3, %[r]\n\t"
  132981. #else
  132982. "adc r3, %[r]\n\t"
  132983. #endif
  132984. #ifdef WOLFSSL_KEIL
  132985. "adcs r4, r4, %[r]\n\t"
  132986. #elif defined(__clang__)
  132987. "adcs r4, %[r]\n\t"
  132988. #else
  132989. "adc r4, %[r]\n\t"
  132990. #endif
  132991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132992. "lsrs r7, %[b], #16\n\t"
  132993. #else
  132994. "lsr r7, %[b], #16\n\t"
  132995. #endif
  132996. #ifdef WOLFSSL_KEIL
  132997. "muls r6, r7, r6\n\t"
  132998. #elif defined(__clang__)
  132999. "muls r6, r7\n\t"
  133000. #else
  133001. "mul r6, r7\n\t"
  133002. #endif
  133003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133004. "lsrs r7, r6, #16\n\t"
  133005. #else
  133006. "lsr r7, r6, #16\n\t"
  133007. #endif
  133008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133009. "lsls r6, r6, #16\n\t"
  133010. #else
  133011. "lsl r6, r6, #16\n\t"
  133012. #endif
  133013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133014. "adds r5, r5, r6\n\t"
  133015. #else
  133016. "add r5, r5, r6\n\t"
  133017. #endif
  133018. #ifdef WOLFSSL_KEIL
  133019. "adcs r3, r3, r7\n\t"
  133020. #elif defined(__clang__)
  133021. "adcs r3, r7\n\t"
  133022. #else
  133023. "adc r3, r7\n\t"
  133024. #endif
  133025. #ifdef WOLFSSL_KEIL
  133026. "adcs r4, r4, %[r]\n\t"
  133027. #elif defined(__clang__)
  133028. "adcs r4, %[r]\n\t"
  133029. #else
  133030. "adc r4, %[r]\n\t"
  133031. #endif
  133032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133033. "lsrs r6, %[a], #16\n\t"
  133034. #else
  133035. "lsr r6, %[a], #16\n\t"
  133036. #endif
  133037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133038. "lsrs r7, %[b], #16\n\t"
  133039. #else
  133040. "lsr r7, %[b], #16\n\t"
  133041. #endif
  133042. #ifdef WOLFSSL_KEIL
  133043. "muls r7, r6, r7\n\t"
  133044. #elif defined(__clang__)
  133045. "muls r7, r6\n\t"
  133046. #else
  133047. "mul r7, r6\n\t"
  133048. #endif
  133049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133050. "adds r3, r3, r7\n\t"
  133051. #else
  133052. "add r3, r3, r7\n\t"
  133053. #endif
  133054. #ifdef WOLFSSL_KEIL
  133055. "adcs r4, r4, %[r]\n\t"
  133056. #elif defined(__clang__)
  133057. "adcs r4, %[r]\n\t"
  133058. #else
  133059. "adc r4, %[r]\n\t"
  133060. #endif
  133061. "uxth r7, %[b]\n\t"
  133062. #ifdef WOLFSSL_KEIL
  133063. "muls r6, r7, r6\n\t"
  133064. #elif defined(__clang__)
  133065. "muls r6, r7\n\t"
  133066. #else
  133067. "mul r6, r7\n\t"
  133068. #endif
  133069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133070. "lsrs r7, r6, #16\n\t"
  133071. #else
  133072. "lsr r7, r6, #16\n\t"
  133073. #endif
  133074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133075. "lsls r6, r6, #16\n\t"
  133076. #else
  133077. "lsl r6, r6, #16\n\t"
  133078. #endif
  133079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133080. "adds r5, r5, r6\n\t"
  133081. #else
  133082. "add r5, r5, r6\n\t"
  133083. #endif
  133084. #ifdef WOLFSSL_KEIL
  133085. "adcs r3, r3, r7\n\t"
  133086. #elif defined(__clang__)
  133087. "adcs r3, r7\n\t"
  133088. #else
  133089. "adc r3, r7\n\t"
  133090. #endif
  133091. #ifdef WOLFSSL_KEIL
  133092. "adcs r4, r4, %[r]\n\t"
  133093. #elif defined(__clang__)
  133094. "adcs r4, %[r]\n\t"
  133095. #else
  133096. "adc r4, %[r]\n\t"
  133097. #endif
  133098. "# A[1] * B[13]\n\t"
  133099. "mov %[a], r9\n\t"
  133100. "mov %[b], r10\n\t"
  133101. "ldr %[a], [%[a], #4]\n\t"
  133102. "ldr %[b], [%[b], #52]\n\t"
  133103. "uxth r6, %[a]\n\t"
  133104. "uxth r7, %[b]\n\t"
  133105. #ifdef WOLFSSL_KEIL
  133106. "muls r7, r6, r7\n\t"
  133107. #elif defined(__clang__)
  133108. "muls r7, r6\n\t"
  133109. #else
  133110. "mul r7, r6\n\t"
  133111. #endif
  133112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133113. "adds r5, r5, r7\n\t"
  133114. #else
  133115. "add r5, r5, r7\n\t"
  133116. #endif
  133117. #ifdef WOLFSSL_KEIL
  133118. "adcs r3, r3, %[r]\n\t"
  133119. #elif defined(__clang__)
  133120. "adcs r3, %[r]\n\t"
  133121. #else
  133122. "adc r3, %[r]\n\t"
  133123. #endif
  133124. #ifdef WOLFSSL_KEIL
  133125. "adcs r4, r4, %[r]\n\t"
  133126. #elif defined(__clang__)
  133127. "adcs r4, %[r]\n\t"
  133128. #else
  133129. "adc r4, %[r]\n\t"
  133130. #endif
  133131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133132. "lsrs r7, %[b], #16\n\t"
  133133. #else
  133134. "lsr r7, %[b], #16\n\t"
  133135. #endif
  133136. #ifdef WOLFSSL_KEIL
  133137. "muls r6, r7, r6\n\t"
  133138. #elif defined(__clang__)
  133139. "muls r6, r7\n\t"
  133140. #else
  133141. "mul r6, r7\n\t"
  133142. #endif
  133143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133144. "lsrs r7, r6, #16\n\t"
  133145. #else
  133146. "lsr r7, r6, #16\n\t"
  133147. #endif
  133148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133149. "lsls r6, r6, #16\n\t"
  133150. #else
  133151. "lsl r6, r6, #16\n\t"
  133152. #endif
  133153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133154. "adds r5, r5, r6\n\t"
  133155. #else
  133156. "add r5, r5, r6\n\t"
  133157. #endif
  133158. #ifdef WOLFSSL_KEIL
  133159. "adcs r3, r3, r7\n\t"
  133160. #elif defined(__clang__)
  133161. "adcs r3, r7\n\t"
  133162. #else
  133163. "adc r3, r7\n\t"
  133164. #endif
  133165. #ifdef WOLFSSL_KEIL
  133166. "adcs r4, r4, %[r]\n\t"
  133167. #elif defined(__clang__)
  133168. "adcs r4, %[r]\n\t"
  133169. #else
  133170. "adc r4, %[r]\n\t"
  133171. #endif
  133172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133173. "lsrs r6, %[a], #16\n\t"
  133174. #else
  133175. "lsr r6, %[a], #16\n\t"
  133176. #endif
  133177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133178. "lsrs r7, %[b], #16\n\t"
  133179. #else
  133180. "lsr r7, %[b], #16\n\t"
  133181. #endif
  133182. #ifdef WOLFSSL_KEIL
  133183. "muls r7, r6, r7\n\t"
  133184. #elif defined(__clang__)
  133185. "muls r7, r6\n\t"
  133186. #else
  133187. "mul r7, r6\n\t"
  133188. #endif
  133189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133190. "adds r3, r3, r7\n\t"
  133191. #else
  133192. "add r3, r3, r7\n\t"
  133193. #endif
  133194. #ifdef WOLFSSL_KEIL
  133195. "adcs r4, r4, %[r]\n\t"
  133196. #elif defined(__clang__)
  133197. "adcs r4, %[r]\n\t"
  133198. #else
  133199. "adc r4, %[r]\n\t"
  133200. #endif
  133201. "uxth r7, %[b]\n\t"
  133202. #ifdef WOLFSSL_KEIL
  133203. "muls r6, r7, r6\n\t"
  133204. #elif defined(__clang__)
  133205. "muls r6, r7\n\t"
  133206. #else
  133207. "mul r6, r7\n\t"
  133208. #endif
  133209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133210. "lsrs r7, r6, #16\n\t"
  133211. #else
  133212. "lsr r7, r6, #16\n\t"
  133213. #endif
  133214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133215. "lsls r6, r6, #16\n\t"
  133216. #else
  133217. "lsl r6, r6, #16\n\t"
  133218. #endif
  133219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133220. "adds r5, r5, r6\n\t"
  133221. #else
  133222. "add r5, r5, r6\n\t"
  133223. #endif
  133224. #ifdef WOLFSSL_KEIL
  133225. "adcs r3, r3, r7\n\t"
  133226. #elif defined(__clang__)
  133227. "adcs r3, r7\n\t"
  133228. #else
  133229. "adc r3, r7\n\t"
  133230. #endif
  133231. #ifdef WOLFSSL_KEIL
  133232. "adcs r4, r4, %[r]\n\t"
  133233. #elif defined(__clang__)
  133234. "adcs r4, %[r]\n\t"
  133235. #else
  133236. "adc r4, %[r]\n\t"
  133237. #endif
  133238. "# A[0] * B[14]\n\t"
  133239. "mov %[a], r9\n\t"
  133240. "mov %[b], r10\n\t"
  133241. "ldr %[a], [%[a]]\n\t"
  133242. "ldr %[b], [%[b], #56]\n\t"
  133243. "uxth r6, %[a]\n\t"
  133244. "uxth r7, %[b]\n\t"
  133245. #ifdef WOLFSSL_KEIL
  133246. "muls r7, r6, r7\n\t"
  133247. #elif defined(__clang__)
  133248. "muls r7, r6\n\t"
  133249. #else
  133250. "mul r7, r6\n\t"
  133251. #endif
  133252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133253. "adds r5, r5, r7\n\t"
  133254. #else
  133255. "add r5, r5, r7\n\t"
  133256. #endif
  133257. #ifdef WOLFSSL_KEIL
  133258. "adcs r3, r3, %[r]\n\t"
  133259. #elif defined(__clang__)
  133260. "adcs r3, %[r]\n\t"
  133261. #else
  133262. "adc r3, %[r]\n\t"
  133263. #endif
  133264. #ifdef WOLFSSL_KEIL
  133265. "adcs r4, r4, %[r]\n\t"
  133266. #elif defined(__clang__)
  133267. "adcs r4, %[r]\n\t"
  133268. #else
  133269. "adc r4, %[r]\n\t"
  133270. #endif
  133271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133272. "lsrs r7, %[b], #16\n\t"
  133273. #else
  133274. "lsr r7, %[b], #16\n\t"
  133275. #endif
  133276. #ifdef WOLFSSL_KEIL
  133277. "muls r6, r7, r6\n\t"
  133278. #elif defined(__clang__)
  133279. "muls r6, r7\n\t"
  133280. #else
  133281. "mul r6, r7\n\t"
  133282. #endif
  133283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133284. "lsrs r7, r6, #16\n\t"
  133285. #else
  133286. "lsr r7, r6, #16\n\t"
  133287. #endif
  133288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133289. "lsls r6, r6, #16\n\t"
  133290. #else
  133291. "lsl r6, r6, #16\n\t"
  133292. #endif
  133293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133294. "adds r5, r5, r6\n\t"
  133295. #else
  133296. "add r5, r5, r6\n\t"
  133297. #endif
  133298. #ifdef WOLFSSL_KEIL
  133299. "adcs r3, r3, r7\n\t"
  133300. #elif defined(__clang__)
  133301. "adcs r3, r7\n\t"
  133302. #else
  133303. "adc r3, r7\n\t"
  133304. #endif
  133305. #ifdef WOLFSSL_KEIL
  133306. "adcs r4, r4, %[r]\n\t"
  133307. #elif defined(__clang__)
  133308. "adcs r4, %[r]\n\t"
  133309. #else
  133310. "adc r4, %[r]\n\t"
  133311. #endif
  133312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133313. "lsrs r6, %[a], #16\n\t"
  133314. #else
  133315. "lsr r6, %[a], #16\n\t"
  133316. #endif
  133317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133318. "lsrs r7, %[b], #16\n\t"
  133319. #else
  133320. "lsr r7, %[b], #16\n\t"
  133321. #endif
  133322. #ifdef WOLFSSL_KEIL
  133323. "muls r7, r6, r7\n\t"
  133324. #elif defined(__clang__)
  133325. "muls r7, r6\n\t"
  133326. #else
  133327. "mul r7, r6\n\t"
  133328. #endif
  133329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133330. "adds r3, r3, r7\n\t"
  133331. #else
  133332. "add r3, r3, r7\n\t"
  133333. #endif
  133334. #ifdef WOLFSSL_KEIL
  133335. "adcs r4, r4, %[r]\n\t"
  133336. #elif defined(__clang__)
  133337. "adcs r4, %[r]\n\t"
  133338. #else
  133339. "adc r4, %[r]\n\t"
  133340. #endif
  133341. "uxth r7, %[b]\n\t"
  133342. #ifdef WOLFSSL_KEIL
  133343. "muls r6, r7, r6\n\t"
  133344. #elif defined(__clang__)
  133345. "muls r6, r7\n\t"
  133346. #else
  133347. "mul r6, r7\n\t"
  133348. #endif
  133349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133350. "lsrs r7, r6, #16\n\t"
  133351. #else
  133352. "lsr r7, r6, #16\n\t"
  133353. #endif
  133354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133355. "lsls r6, r6, #16\n\t"
  133356. #else
  133357. "lsl r6, r6, #16\n\t"
  133358. #endif
  133359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133360. "adds r5, r5, r6\n\t"
  133361. #else
  133362. "add r5, r5, r6\n\t"
  133363. #endif
  133364. #ifdef WOLFSSL_KEIL
  133365. "adcs r3, r3, r7\n\t"
  133366. #elif defined(__clang__)
  133367. "adcs r3, r7\n\t"
  133368. #else
  133369. "adc r3, r7\n\t"
  133370. #endif
  133371. #ifdef WOLFSSL_KEIL
  133372. "adcs r4, r4, %[r]\n\t"
  133373. #elif defined(__clang__)
  133374. "adcs r4, %[r]\n\t"
  133375. #else
  133376. "adc r4, %[r]\n\t"
  133377. #endif
  133378. "str r5, [sp, #56]\n\t"
  133379. "# A[0] * B[15]\n\t"
  133380. "movs r5, #0\n\t"
  133381. "mov %[a], r9\n\t"
  133382. "mov %[b], r10\n\t"
  133383. "ldr %[a], [%[a]]\n\t"
  133384. "ldr %[b], [%[b], #60]\n\t"
  133385. "uxth r6, %[a]\n\t"
  133386. "uxth r7, %[b]\n\t"
  133387. #ifdef WOLFSSL_KEIL
  133388. "muls r7, r6, r7\n\t"
  133389. #elif defined(__clang__)
  133390. "muls r7, r6\n\t"
  133391. #else
  133392. "mul r7, r6\n\t"
  133393. #endif
  133394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133395. "adds r3, r3, r7\n\t"
  133396. #else
  133397. "add r3, r3, r7\n\t"
  133398. #endif
  133399. #ifdef WOLFSSL_KEIL
  133400. "adcs r4, r4, %[r]\n\t"
  133401. #elif defined(__clang__)
  133402. "adcs r4, %[r]\n\t"
  133403. #else
  133404. "adc r4, %[r]\n\t"
  133405. #endif
  133406. #ifdef WOLFSSL_KEIL
  133407. "adcs r5, r5, %[r]\n\t"
  133408. #elif defined(__clang__)
  133409. "adcs r5, %[r]\n\t"
  133410. #else
  133411. "adc r5, %[r]\n\t"
  133412. #endif
  133413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133414. "lsrs r7, %[b], #16\n\t"
  133415. #else
  133416. "lsr r7, %[b], #16\n\t"
  133417. #endif
  133418. #ifdef WOLFSSL_KEIL
  133419. "muls r6, r7, r6\n\t"
  133420. #elif defined(__clang__)
  133421. "muls r6, r7\n\t"
  133422. #else
  133423. "mul r6, r7\n\t"
  133424. #endif
  133425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133426. "lsrs r7, r6, #16\n\t"
  133427. #else
  133428. "lsr r7, r6, #16\n\t"
  133429. #endif
  133430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133431. "lsls r6, r6, #16\n\t"
  133432. #else
  133433. "lsl r6, r6, #16\n\t"
  133434. #endif
  133435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133436. "adds r3, r3, r6\n\t"
  133437. #else
  133438. "add r3, r3, r6\n\t"
  133439. #endif
  133440. #ifdef WOLFSSL_KEIL
  133441. "adcs r4, r4, r7\n\t"
  133442. #elif defined(__clang__)
  133443. "adcs r4, r7\n\t"
  133444. #else
  133445. "adc r4, r7\n\t"
  133446. #endif
  133447. #ifdef WOLFSSL_KEIL
  133448. "adcs r5, r5, %[r]\n\t"
  133449. #elif defined(__clang__)
  133450. "adcs r5, %[r]\n\t"
  133451. #else
  133452. "adc r5, %[r]\n\t"
  133453. #endif
  133454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133455. "lsrs r6, %[a], #16\n\t"
  133456. #else
  133457. "lsr r6, %[a], #16\n\t"
  133458. #endif
  133459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133460. "lsrs r7, %[b], #16\n\t"
  133461. #else
  133462. "lsr r7, %[b], #16\n\t"
  133463. #endif
  133464. #ifdef WOLFSSL_KEIL
  133465. "muls r7, r6, r7\n\t"
  133466. #elif defined(__clang__)
  133467. "muls r7, r6\n\t"
  133468. #else
  133469. "mul r7, r6\n\t"
  133470. #endif
  133471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133472. "adds r4, r4, r7\n\t"
  133473. #else
  133474. "add r4, r4, r7\n\t"
  133475. #endif
  133476. #ifdef WOLFSSL_KEIL
  133477. "adcs r5, r5, %[r]\n\t"
  133478. #elif defined(__clang__)
  133479. "adcs r5, %[r]\n\t"
  133480. #else
  133481. "adc r5, %[r]\n\t"
  133482. #endif
  133483. "uxth r7, %[b]\n\t"
  133484. #ifdef WOLFSSL_KEIL
  133485. "muls r6, r7, r6\n\t"
  133486. #elif defined(__clang__)
  133487. "muls r6, r7\n\t"
  133488. #else
  133489. "mul r6, r7\n\t"
  133490. #endif
  133491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133492. "lsrs r7, r6, #16\n\t"
  133493. #else
  133494. "lsr r7, r6, #16\n\t"
  133495. #endif
  133496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133497. "lsls r6, r6, #16\n\t"
  133498. #else
  133499. "lsl r6, r6, #16\n\t"
  133500. #endif
  133501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133502. "adds r3, r3, r6\n\t"
  133503. #else
  133504. "add r3, r3, r6\n\t"
  133505. #endif
  133506. #ifdef WOLFSSL_KEIL
  133507. "adcs r4, r4, r7\n\t"
  133508. #elif defined(__clang__)
  133509. "adcs r4, r7\n\t"
  133510. #else
  133511. "adc r4, r7\n\t"
  133512. #endif
  133513. #ifdef WOLFSSL_KEIL
  133514. "adcs r5, r5, %[r]\n\t"
  133515. #elif defined(__clang__)
  133516. "adcs r5, %[r]\n\t"
  133517. #else
  133518. "adc r5, %[r]\n\t"
  133519. #endif
  133520. "# A[1] * B[14]\n\t"
  133521. "mov %[a], r9\n\t"
  133522. "mov %[b], r10\n\t"
  133523. "ldr %[a], [%[a], #4]\n\t"
  133524. "ldr %[b], [%[b], #56]\n\t"
  133525. "uxth r6, %[a]\n\t"
  133526. "uxth r7, %[b]\n\t"
  133527. #ifdef WOLFSSL_KEIL
  133528. "muls r7, r6, r7\n\t"
  133529. #elif defined(__clang__)
  133530. "muls r7, r6\n\t"
  133531. #else
  133532. "mul r7, r6\n\t"
  133533. #endif
  133534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133535. "adds r3, r3, r7\n\t"
  133536. #else
  133537. "add r3, r3, r7\n\t"
  133538. #endif
  133539. #ifdef WOLFSSL_KEIL
  133540. "adcs r4, r4, %[r]\n\t"
  133541. #elif defined(__clang__)
  133542. "adcs r4, %[r]\n\t"
  133543. #else
  133544. "adc r4, %[r]\n\t"
  133545. #endif
  133546. #ifdef WOLFSSL_KEIL
  133547. "adcs r5, r5, %[r]\n\t"
  133548. #elif defined(__clang__)
  133549. "adcs r5, %[r]\n\t"
  133550. #else
  133551. "adc r5, %[r]\n\t"
  133552. #endif
  133553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133554. "lsrs r7, %[b], #16\n\t"
  133555. #else
  133556. "lsr r7, %[b], #16\n\t"
  133557. #endif
  133558. #ifdef WOLFSSL_KEIL
  133559. "muls r6, r7, r6\n\t"
  133560. #elif defined(__clang__)
  133561. "muls r6, r7\n\t"
  133562. #else
  133563. "mul r6, r7\n\t"
  133564. #endif
  133565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133566. "lsrs r7, r6, #16\n\t"
  133567. #else
  133568. "lsr r7, r6, #16\n\t"
  133569. #endif
  133570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133571. "lsls r6, r6, #16\n\t"
  133572. #else
  133573. "lsl r6, r6, #16\n\t"
  133574. #endif
  133575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133576. "adds r3, r3, r6\n\t"
  133577. #else
  133578. "add r3, r3, r6\n\t"
  133579. #endif
  133580. #ifdef WOLFSSL_KEIL
  133581. "adcs r4, r4, r7\n\t"
  133582. #elif defined(__clang__)
  133583. "adcs r4, r7\n\t"
  133584. #else
  133585. "adc r4, r7\n\t"
  133586. #endif
  133587. #ifdef WOLFSSL_KEIL
  133588. "adcs r5, r5, %[r]\n\t"
  133589. #elif defined(__clang__)
  133590. "adcs r5, %[r]\n\t"
  133591. #else
  133592. "adc r5, %[r]\n\t"
  133593. #endif
  133594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133595. "lsrs r6, %[a], #16\n\t"
  133596. #else
  133597. "lsr r6, %[a], #16\n\t"
  133598. #endif
  133599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133600. "lsrs r7, %[b], #16\n\t"
  133601. #else
  133602. "lsr r7, %[b], #16\n\t"
  133603. #endif
  133604. #ifdef WOLFSSL_KEIL
  133605. "muls r7, r6, r7\n\t"
  133606. #elif defined(__clang__)
  133607. "muls r7, r6\n\t"
  133608. #else
  133609. "mul r7, r6\n\t"
  133610. #endif
  133611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133612. "adds r4, r4, r7\n\t"
  133613. #else
  133614. "add r4, r4, r7\n\t"
  133615. #endif
  133616. #ifdef WOLFSSL_KEIL
  133617. "adcs r5, r5, %[r]\n\t"
  133618. #elif defined(__clang__)
  133619. "adcs r5, %[r]\n\t"
  133620. #else
  133621. "adc r5, %[r]\n\t"
  133622. #endif
  133623. "uxth r7, %[b]\n\t"
  133624. #ifdef WOLFSSL_KEIL
  133625. "muls r6, r7, r6\n\t"
  133626. #elif defined(__clang__)
  133627. "muls r6, r7\n\t"
  133628. #else
  133629. "mul r6, r7\n\t"
  133630. #endif
  133631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133632. "lsrs r7, r6, #16\n\t"
  133633. #else
  133634. "lsr r7, r6, #16\n\t"
  133635. #endif
  133636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133637. "lsls r6, r6, #16\n\t"
  133638. #else
  133639. "lsl r6, r6, #16\n\t"
  133640. #endif
  133641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133642. "adds r3, r3, r6\n\t"
  133643. #else
  133644. "add r3, r3, r6\n\t"
  133645. #endif
  133646. #ifdef WOLFSSL_KEIL
  133647. "adcs r4, r4, r7\n\t"
  133648. #elif defined(__clang__)
  133649. "adcs r4, r7\n\t"
  133650. #else
  133651. "adc r4, r7\n\t"
  133652. #endif
  133653. #ifdef WOLFSSL_KEIL
  133654. "adcs r5, r5, %[r]\n\t"
  133655. #elif defined(__clang__)
  133656. "adcs r5, %[r]\n\t"
  133657. #else
  133658. "adc r5, %[r]\n\t"
  133659. #endif
  133660. "# A[2] * B[13]\n\t"
  133661. "mov %[a], r9\n\t"
  133662. "mov %[b], r10\n\t"
  133663. "ldr %[a], [%[a], #8]\n\t"
  133664. "ldr %[b], [%[b], #52]\n\t"
  133665. "uxth r6, %[a]\n\t"
  133666. "uxth r7, %[b]\n\t"
  133667. #ifdef WOLFSSL_KEIL
  133668. "muls r7, r6, r7\n\t"
  133669. #elif defined(__clang__)
  133670. "muls r7, r6\n\t"
  133671. #else
  133672. "mul r7, r6\n\t"
  133673. #endif
  133674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133675. "adds r3, r3, r7\n\t"
  133676. #else
  133677. "add r3, r3, r7\n\t"
  133678. #endif
  133679. #ifdef WOLFSSL_KEIL
  133680. "adcs r4, r4, %[r]\n\t"
  133681. #elif defined(__clang__)
  133682. "adcs r4, %[r]\n\t"
  133683. #else
  133684. "adc r4, %[r]\n\t"
  133685. #endif
  133686. #ifdef WOLFSSL_KEIL
  133687. "adcs r5, r5, %[r]\n\t"
  133688. #elif defined(__clang__)
  133689. "adcs r5, %[r]\n\t"
  133690. #else
  133691. "adc r5, %[r]\n\t"
  133692. #endif
  133693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133694. "lsrs r7, %[b], #16\n\t"
  133695. #else
  133696. "lsr r7, %[b], #16\n\t"
  133697. #endif
  133698. #ifdef WOLFSSL_KEIL
  133699. "muls r6, r7, r6\n\t"
  133700. #elif defined(__clang__)
  133701. "muls r6, r7\n\t"
  133702. #else
  133703. "mul r6, r7\n\t"
  133704. #endif
  133705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133706. "lsrs r7, r6, #16\n\t"
  133707. #else
  133708. "lsr r7, r6, #16\n\t"
  133709. #endif
  133710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133711. "lsls r6, r6, #16\n\t"
  133712. #else
  133713. "lsl r6, r6, #16\n\t"
  133714. #endif
  133715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133716. "adds r3, r3, r6\n\t"
  133717. #else
  133718. "add r3, r3, r6\n\t"
  133719. #endif
  133720. #ifdef WOLFSSL_KEIL
  133721. "adcs r4, r4, r7\n\t"
  133722. #elif defined(__clang__)
  133723. "adcs r4, r7\n\t"
  133724. #else
  133725. "adc r4, r7\n\t"
  133726. #endif
  133727. #ifdef WOLFSSL_KEIL
  133728. "adcs r5, r5, %[r]\n\t"
  133729. #elif defined(__clang__)
  133730. "adcs r5, %[r]\n\t"
  133731. #else
  133732. "adc r5, %[r]\n\t"
  133733. #endif
  133734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133735. "lsrs r6, %[a], #16\n\t"
  133736. #else
  133737. "lsr r6, %[a], #16\n\t"
  133738. #endif
  133739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133740. "lsrs r7, %[b], #16\n\t"
  133741. #else
  133742. "lsr r7, %[b], #16\n\t"
  133743. #endif
  133744. #ifdef WOLFSSL_KEIL
  133745. "muls r7, r6, r7\n\t"
  133746. #elif defined(__clang__)
  133747. "muls r7, r6\n\t"
  133748. #else
  133749. "mul r7, r6\n\t"
  133750. #endif
  133751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133752. "adds r4, r4, r7\n\t"
  133753. #else
  133754. "add r4, r4, r7\n\t"
  133755. #endif
  133756. #ifdef WOLFSSL_KEIL
  133757. "adcs r5, r5, %[r]\n\t"
  133758. #elif defined(__clang__)
  133759. "adcs r5, %[r]\n\t"
  133760. #else
  133761. "adc r5, %[r]\n\t"
  133762. #endif
  133763. "uxth r7, %[b]\n\t"
  133764. #ifdef WOLFSSL_KEIL
  133765. "muls r6, r7, r6\n\t"
  133766. #elif defined(__clang__)
  133767. "muls r6, r7\n\t"
  133768. #else
  133769. "mul r6, r7\n\t"
  133770. #endif
  133771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133772. "lsrs r7, r6, #16\n\t"
  133773. #else
  133774. "lsr r7, r6, #16\n\t"
  133775. #endif
  133776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133777. "lsls r6, r6, #16\n\t"
  133778. #else
  133779. "lsl r6, r6, #16\n\t"
  133780. #endif
  133781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133782. "adds r3, r3, r6\n\t"
  133783. #else
  133784. "add r3, r3, r6\n\t"
  133785. #endif
  133786. #ifdef WOLFSSL_KEIL
  133787. "adcs r4, r4, r7\n\t"
  133788. #elif defined(__clang__)
  133789. "adcs r4, r7\n\t"
  133790. #else
  133791. "adc r4, r7\n\t"
  133792. #endif
  133793. #ifdef WOLFSSL_KEIL
  133794. "adcs r5, r5, %[r]\n\t"
  133795. #elif defined(__clang__)
  133796. "adcs r5, %[r]\n\t"
  133797. #else
  133798. "adc r5, %[r]\n\t"
  133799. #endif
  133800. "# A[3] * B[12]\n\t"
  133801. "mov %[a], r9\n\t"
  133802. "mov %[b], r10\n\t"
  133803. "ldr %[a], [%[a], #12]\n\t"
  133804. "ldr %[b], [%[b], #48]\n\t"
  133805. "uxth r6, %[a]\n\t"
  133806. "uxth r7, %[b]\n\t"
  133807. #ifdef WOLFSSL_KEIL
  133808. "muls r7, r6, r7\n\t"
  133809. #elif defined(__clang__)
  133810. "muls r7, r6\n\t"
  133811. #else
  133812. "mul r7, r6\n\t"
  133813. #endif
  133814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133815. "adds r3, r3, r7\n\t"
  133816. #else
  133817. "add r3, r3, r7\n\t"
  133818. #endif
  133819. #ifdef WOLFSSL_KEIL
  133820. "adcs r4, r4, %[r]\n\t"
  133821. #elif defined(__clang__)
  133822. "adcs r4, %[r]\n\t"
  133823. #else
  133824. "adc r4, %[r]\n\t"
  133825. #endif
  133826. #ifdef WOLFSSL_KEIL
  133827. "adcs r5, r5, %[r]\n\t"
  133828. #elif defined(__clang__)
  133829. "adcs r5, %[r]\n\t"
  133830. #else
  133831. "adc r5, %[r]\n\t"
  133832. #endif
  133833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133834. "lsrs r7, %[b], #16\n\t"
  133835. #else
  133836. "lsr r7, %[b], #16\n\t"
  133837. #endif
  133838. #ifdef WOLFSSL_KEIL
  133839. "muls r6, r7, r6\n\t"
  133840. #elif defined(__clang__)
  133841. "muls r6, r7\n\t"
  133842. #else
  133843. "mul r6, r7\n\t"
  133844. #endif
  133845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133846. "lsrs r7, r6, #16\n\t"
  133847. #else
  133848. "lsr r7, r6, #16\n\t"
  133849. #endif
  133850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133851. "lsls r6, r6, #16\n\t"
  133852. #else
  133853. "lsl r6, r6, #16\n\t"
  133854. #endif
  133855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133856. "adds r3, r3, r6\n\t"
  133857. #else
  133858. "add r3, r3, r6\n\t"
  133859. #endif
  133860. #ifdef WOLFSSL_KEIL
  133861. "adcs r4, r4, r7\n\t"
  133862. #elif defined(__clang__)
  133863. "adcs r4, r7\n\t"
  133864. #else
  133865. "adc r4, r7\n\t"
  133866. #endif
  133867. #ifdef WOLFSSL_KEIL
  133868. "adcs r5, r5, %[r]\n\t"
  133869. #elif defined(__clang__)
  133870. "adcs r5, %[r]\n\t"
  133871. #else
  133872. "adc r5, %[r]\n\t"
  133873. #endif
  133874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133875. "lsrs r6, %[a], #16\n\t"
  133876. #else
  133877. "lsr r6, %[a], #16\n\t"
  133878. #endif
  133879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133880. "lsrs r7, %[b], #16\n\t"
  133881. #else
  133882. "lsr r7, %[b], #16\n\t"
  133883. #endif
  133884. #ifdef WOLFSSL_KEIL
  133885. "muls r7, r6, r7\n\t"
  133886. #elif defined(__clang__)
  133887. "muls r7, r6\n\t"
  133888. #else
  133889. "mul r7, r6\n\t"
  133890. #endif
  133891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133892. "adds r4, r4, r7\n\t"
  133893. #else
  133894. "add r4, r4, r7\n\t"
  133895. #endif
  133896. #ifdef WOLFSSL_KEIL
  133897. "adcs r5, r5, %[r]\n\t"
  133898. #elif defined(__clang__)
  133899. "adcs r5, %[r]\n\t"
  133900. #else
  133901. "adc r5, %[r]\n\t"
  133902. #endif
  133903. "uxth r7, %[b]\n\t"
  133904. #ifdef WOLFSSL_KEIL
  133905. "muls r6, r7, r6\n\t"
  133906. #elif defined(__clang__)
  133907. "muls r6, r7\n\t"
  133908. #else
  133909. "mul r6, r7\n\t"
  133910. #endif
  133911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133912. "lsrs r7, r6, #16\n\t"
  133913. #else
  133914. "lsr r7, r6, #16\n\t"
  133915. #endif
  133916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133917. "lsls r6, r6, #16\n\t"
  133918. #else
  133919. "lsl r6, r6, #16\n\t"
  133920. #endif
  133921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133922. "adds r3, r3, r6\n\t"
  133923. #else
  133924. "add r3, r3, r6\n\t"
  133925. #endif
  133926. #ifdef WOLFSSL_KEIL
  133927. "adcs r4, r4, r7\n\t"
  133928. #elif defined(__clang__)
  133929. "adcs r4, r7\n\t"
  133930. #else
  133931. "adc r4, r7\n\t"
  133932. #endif
  133933. #ifdef WOLFSSL_KEIL
  133934. "adcs r5, r5, %[r]\n\t"
  133935. #elif defined(__clang__)
  133936. "adcs r5, %[r]\n\t"
  133937. #else
  133938. "adc r5, %[r]\n\t"
  133939. #endif
  133940. "# A[4] * B[11]\n\t"
  133941. "mov %[a], r9\n\t"
  133942. "mov %[b], r10\n\t"
  133943. "ldr %[a], [%[a], #16]\n\t"
  133944. "ldr %[b], [%[b], #44]\n\t"
  133945. "uxth r6, %[a]\n\t"
  133946. "uxth r7, %[b]\n\t"
  133947. #ifdef WOLFSSL_KEIL
  133948. "muls r7, r6, r7\n\t"
  133949. #elif defined(__clang__)
  133950. "muls r7, r6\n\t"
  133951. #else
  133952. "mul r7, r6\n\t"
  133953. #endif
  133954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133955. "adds r3, r3, r7\n\t"
  133956. #else
  133957. "add r3, r3, r7\n\t"
  133958. #endif
  133959. #ifdef WOLFSSL_KEIL
  133960. "adcs r4, r4, %[r]\n\t"
  133961. #elif defined(__clang__)
  133962. "adcs r4, %[r]\n\t"
  133963. #else
  133964. "adc r4, %[r]\n\t"
  133965. #endif
  133966. #ifdef WOLFSSL_KEIL
  133967. "adcs r5, r5, %[r]\n\t"
  133968. #elif defined(__clang__)
  133969. "adcs r5, %[r]\n\t"
  133970. #else
  133971. "adc r5, %[r]\n\t"
  133972. #endif
  133973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133974. "lsrs r7, %[b], #16\n\t"
  133975. #else
  133976. "lsr r7, %[b], #16\n\t"
  133977. #endif
  133978. #ifdef WOLFSSL_KEIL
  133979. "muls r6, r7, r6\n\t"
  133980. #elif defined(__clang__)
  133981. "muls r6, r7\n\t"
  133982. #else
  133983. "mul r6, r7\n\t"
  133984. #endif
  133985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133986. "lsrs r7, r6, #16\n\t"
  133987. #else
  133988. "lsr r7, r6, #16\n\t"
  133989. #endif
  133990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133991. "lsls r6, r6, #16\n\t"
  133992. #else
  133993. "lsl r6, r6, #16\n\t"
  133994. #endif
  133995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133996. "adds r3, r3, r6\n\t"
  133997. #else
  133998. "add r3, r3, r6\n\t"
  133999. #endif
  134000. #ifdef WOLFSSL_KEIL
  134001. "adcs r4, r4, r7\n\t"
  134002. #elif defined(__clang__)
  134003. "adcs r4, r7\n\t"
  134004. #else
  134005. "adc r4, r7\n\t"
  134006. #endif
  134007. #ifdef WOLFSSL_KEIL
  134008. "adcs r5, r5, %[r]\n\t"
  134009. #elif defined(__clang__)
  134010. "adcs r5, %[r]\n\t"
  134011. #else
  134012. "adc r5, %[r]\n\t"
  134013. #endif
  134014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134015. "lsrs r6, %[a], #16\n\t"
  134016. #else
  134017. "lsr r6, %[a], #16\n\t"
  134018. #endif
  134019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134020. "lsrs r7, %[b], #16\n\t"
  134021. #else
  134022. "lsr r7, %[b], #16\n\t"
  134023. #endif
  134024. #ifdef WOLFSSL_KEIL
  134025. "muls r7, r6, r7\n\t"
  134026. #elif defined(__clang__)
  134027. "muls r7, r6\n\t"
  134028. #else
  134029. "mul r7, r6\n\t"
  134030. #endif
  134031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134032. "adds r4, r4, r7\n\t"
  134033. #else
  134034. "add r4, r4, r7\n\t"
  134035. #endif
  134036. #ifdef WOLFSSL_KEIL
  134037. "adcs r5, r5, %[r]\n\t"
  134038. #elif defined(__clang__)
  134039. "adcs r5, %[r]\n\t"
  134040. #else
  134041. "adc r5, %[r]\n\t"
  134042. #endif
  134043. "uxth r7, %[b]\n\t"
  134044. #ifdef WOLFSSL_KEIL
  134045. "muls r6, r7, r6\n\t"
  134046. #elif defined(__clang__)
  134047. "muls r6, r7\n\t"
  134048. #else
  134049. "mul r6, r7\n\t"
  134050. #endif
  134051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134052. "lsrs r7, r6, #16\n\t"
  134053. #else
  134054. "lsr r7, r6, #16\n\t"
  134055. #endif
  134056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134057. "lsls r6, r6, #16\n\t"
  134058. #else
  134059. "lsl r6, r6, #16\n\t"
  134060. #endif
  134061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134062. "adds r3, r3, r6\n\t"
  134063. #else
  134064. "add r3, r3, r6\n\t"
  134065. #endif
  134066. #ifdef WOLFSSL_KEIL
  134067. "adcs r4, r4, r7\n\t"
  134068. #elif defined(__clang__)
  134069. "adcs r4, r7\n\t"
  134070. #else
  134071. "adc r4, r7\n\t"
  134072. #endif
  134073. #ifdef WOLFSSL_KEIL
  134074. "adcs r5, r5, %[r]\n\t"
  134075. #elif defined(__clang__)
  134076. "adcs r5, %[r]\n\t"
  134077. #else
  134078. "adc r5, %[r]\n\t"
  134079. #endif
  134080. "# A[5] * B[10]\n\t"
  134081. "mov %[a], r9\n\t"
  134082. "mov %[b], r10\n\t"
  134083. "ldr %[a], [%[a], #20]\n\t"
  134084. "ldr %[b], [%[b], #40]\n\t"
  134085. "uxth r6, %[a]\n\t"
  134086. "uxth r7, %[b]\n\t"
  134087. #ifdef WOLFSSL_KEIL
  134088. "muls r7, r6, r7\n\t"
  134089. #elif defined(__clang__)
  134090. "muls r7, r6\n\t"
  134091. #else
  134092. "mul r7, r6\n\t"
  134093. #endif
  134094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134095. "adds r3, r3, r7\n\t"
  134096. #else
  134097. "add r3, r3, r7\n\t"
  134098. #endif
  134099. #ifdef WOLFSSL_KEIL
  134100. "adcs r4, r4, %[r]\n\t"
  134101. #elif defined(__clang__)
  134102. "adcs r4, %[r]\n\t"
  134103. #else
  134104. "adc r4, %[r]\n\t"
  134105. #endif
  134106. #ifdef WOLFSSL_KEIL
  134107. "adcs r5, r5, %[r]\n\t"
  134108. #elif defined(__clang__)
  134109. "adcs r5, %[r]\n\t"
  134110. #else
  134111. "adc r5, %[r]\n\t"
  134112. #endif
  134113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134114. "lsrs r7, %[b], #16\n\t"
  134115. #else
  134116. "lsr r7, %[b], #16\n\t"
  134117. #endif
  134118. #ifdef WOLFSSL_KEIL
  134119. "muls r6, r7, r6\n\t"
  134120. #elif defined(__clang__)
  134121. "muls r6, r7\n\t"
  134122. #else
  134123. "mul r6, r7\n\t"
  134124. #endif
  134125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134126. "lsrs r7, r6, #16\n\t"
  134127. #else
  134128. "lsr r7, r6, #16\n\t"
  134129. #endif
  134130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134131. "lsls r6, r6, #16\n\t"
  134132. #else
  134133. "lsl r6, r6, #16\n\t"
  134134. #endif
  134135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134136. "adds r3, r3, r6\n\t"
  134137. #else
  134138. "add r3, r3, r6\n\t"
  134139. #endif
  134140. #ifdef WOLFSSL_KEIL
  134141. "adcs r4, r4, r7\n\t"
  134142. #elif defined(__clang__)
  134143. "adcs r4, r7\n\t"
  134144. #else
  134145. "adc r4, r7\n\t"
  134146. #endif
  134147. #ifdef WOLFSSL_KEIL
  134148. "adcs r5, r5, %[r]\n\t"
  134149. #elif defined(__clang__)
  134150. "adcs r5, %[r]\n\t"
  134151. #else
  134152. "adc r5, %[r]\n\t"
  134153. #endif
  134154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134155. "lsrs r6, %[a], #16\n\t"
  134156. #else
  134157. "lsr r6, %[a], #16\n\t"
  134158. #endif
  134159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134160. "lsrs r7, %[b], #16\n\t"
  134161. #else
  134162. "lsr r7, %[b], #16\n\t"
  134163. #endif
  134164. #ifdef WOLFSSL_KEIL
  134165. "muls r7, r6, r7\n\t"
  134166. #elif defined(__clang__)
  134167. "muls r7, r6\n\t"
  134168. #else
  134169. "mul r7, r6\n\t"
  134170. #endif
  134171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134172. "adds r4, r4, r7\n\t"
  134173. #else
  134174. "add r4, r4, r7\n\t"
  134175. #endif
  134176. #ifdef WOLFSSL_KEIL
  134177. "adcs r5, r5, %[r]\n\t"
  134178. #elif defined(__clang__)
  134179. "adcs r5, %[r]\n\t"
  134180. #else
  134181. "adc r5, %[r]\n\t"
  134182. #endif
  134183. "uxth r7, %[b]\n\t"
  134184. #ifdef WOLFSSL_KEIL
  134185. "muls r6, r7, r6\n\t"
  134186. #elif defined(__clang__)
  134187. "muls r6, r7\n\t"
  134188. #else
  134189. "mul r6, r7\n\t"
  134190. #endif
  134191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134192. "lsrs r7, r6, #16\n\t"
  134193. #else
  134194. "lsr r7, r6, #16\n\t"
  134195. #endif
  134196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134197. "lsls r6, r6, #16\n\t"
  134198. #else
  134199. "lsl r6, r6, #16\n\t"
  134200. #endif
  134201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134202. "adds r3, r3, r6\n\t"
  134203. #else
  134204. "add r3, r3, r6\n\t"
  134205. #endif
  134206. #ifdef WOLFSSL_KEIL
  134207. "adcs r4, r4, r7\n\t"
  134208. #elif defined(__clang__)
  134209. "adcs r4, r7\n\t"
  134210. #else
  134211. "adc r4, r7\n\t"
  134212. #endif
  134213. #ifdef WOLFSSL_KEIL
  134214. "adcs r5, r5, %[r]\n\t"
  134215. #elif defined(__clang__)
  134216. "adcs r5, %[r]\n\t"
  134217. #else
  134218. "adc r5, %[r]\n\t"
  134219. #endif
  134220. "# A[6] * B[9]\n\t"
  134221. "mov %[a], r9\n\t"
  134222. "mov %[b], r10\n\t"
  134223. "ldr %[a], [%[a], #24]\n\t"
  134224. "ldr %[b], [%[b], #36]\n\t"
  134225. "uxth r6, %[a]\n\t"
  134226. "uxth r7, %[b]\n\t"
  134227. #ifdef WOLFSSL_KEIL
  134228. "muls r7, r6, r7\n\t"
  134229. #elif defined(__clang__)
  134230. "muls r7, r6\n\t"
  134231. #else
  134232. "mul r7, r6\n\t"
  134233. #endif
  134234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134235. "adds r3, r3, r7\n\t"
  134236. #else
  134237. "add r3, r3, r7\n\t"
  134238. #endif
  134239. #ifdef WOLFSSL_KEIL
  134240. "adcs r4, r4, %[r]\n\t"
  134241. #elif defined(__clang__)
  134242. "adcs r4, %[r]\n\t"
  134243. #else
  134244. "adc r4, %[r]\n\t"
  134245. #endif
  134246. #ifdef WOLFSSL_KEIL
  134247. "adcs r5, r5, %[r]\n\t"
  134248. #elif defined(__clang__)
  134249. "adcs r5, %[r]\n\t"
  134250. #else
  134251. "adc r5, %[r]\n\t"
  134252. #endif
  134253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134254. "lsrs r7, %[b], #16\n\t"
  134255. #else
  134256. "lsr r7, %[b], #16\n\t"
  134257. #endif
  134258. #ifdef WOLFSSL_KEIL
  134259. "muls r6, r7, r6\n\t"
  134260. #elif defined(__clang__)
  134261. "muls r6, r7\n\t"
  134262. #else
  134263. "mul r6, r7\n\t"
  134264. #endif
  134265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134266. "lsrs r7, r6, #16\n\t"
  134267. #else
  134268. "lsr r7, r6, #16\n\t"
  134269. #endif
  134270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134271. "lsls r6, r6, #16\n\t"
  134272. #else
  134273. "lsl r6, r6, #16\n\t"
  134274. #endif
  134275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134276. "adds r3, r3, r6\n\t"
  134277. #else
  134278. "add r3, r3, r6\n\t"
  134279. #endif
  134280. #ifdef WOLFSSL_KEIL
  134281. "adcs r4, r4, r7\n\t"
  134282. #elif defined(__clang__)
  134283. "adcs r4, r7\n\t"
  134284. #else
  134285. "adc r4, r7\n\t"
  134286. #endif
  134287. #ifdef WOLFSSL_KEIL
  134288. "adcs r5, r5, %[r]\n\t"
  134289. #elif defined(__clang__)
  134290. "adcs r5, %[r]\n\t"
  134291. #else
  134292. "adc r5, %[r]\n\t"
  134293. #endif
  134294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134295. "lsrs r6, %[a], #16\n\t"
  134296. #else
  134297. "lsr r6, %[a], #16\n\t"
  134298. #endif
  134299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134300. "lsrs r7, %[b], #16\n\t"
  134301. #else
  134302. "lsr r7, %[b], #16\n\t"
  134303. #endif
  134304. #ifdef WOLFSSL_KEIL
  134305. "muls r7, r6, r7\n\t"
  134306. #elif defined(__clang__)
  134307. "muls r7, r6\n\t"
  134308. #else
  134309. "mul r7, r6\n\t"
  134310. #endif
  134311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134312. "adds r4, r4, r7\n\t"
  134313. #else
  134314. "add r4, r4, r7\n\t"
  134315. #endif
  134316. #ifdef WOLFSSL_KEIL
  134317. "adcs r5, r5, %[r]\n\t"
  134318. #elif defined(__clang__)
  134319. "adcs r5, %[r]\n\t"
  134320. #else
  134321. "adc r5, %[r]\n\t"
  134322. #endif
  134323. "uxth r7, %[b]\n\t"
  134324. #ifdef WOLFSSL_KEIL
  134325. "muls r6, r7, r6\n\t"
  134326. #elif defined(__clang__)
  134327. "muls r6, r7\n\t"
  134328. #else
  134329. "mul r6, r7\n\t"
  134330. #endif
  134331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134332. "lsrs r7, r6, #16\n\t"
  134333. #else
  134334. "lsr r7, r6, #16\n\t"
  134335. #endif
  134336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134337. "lsls r6, r6, #16\n\t"
  134338. #else
  134339. "lsl r6, r6, #16\n\t"
  134340. #endif
  134341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134342. "adds r3, r3, r6\n\t"
  134343. #else
  134344. "add r3, r3, r6\n\t"
  134345. #endif
  134346. #ifdef WOLFSSL_KEIL
  134347. "adcs r4, r4, r7\n\t"
  134348. #elif defined(__clang__)
  134349. "adcs r4, r7\n\t"
  134350. #else
  134351. "adc r4, r7\n\t"
  134352. #endif
  134353. #ifdef WOLFSSL_KEIL
  134354. "adcs r5, r5, %[r]\n\t"
  134355. #elif defined(__clang__)
  134356. "adcs r5, %[r]\n\t"
  134357. #else
  134358. "adc r5, %[r]\n\t"
  134359. #endif
  134360. "# A[7] * B[8]\n\t"
  134361. "mov %[a], r9\n\t"
  134362. "mov %[b], r10\n\t"
  134363. "ldr %[a], [%[a], #28]\n\t"
  134364. "ldr %[b], [%[b], #32]\n\t"
  134365. "uxth r6, %[a]\n\t"
  134366. "uxth r7, %[b]\n\t"
  134367. #ifdef WOLFSSL_KEIL
  134368. "muls r7, r6, r7\n\t"
  134369. #elif defined(__clang__)
  134370. "muls r7, r6\n\t"
  134371. #else
  134372. "mul r7, r6\n\t"
  134373. #endif
  134374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134375. "adds r3, r3, r7\n\t"
  134376. #else
  134377. "add r3, r3, r7\n\t"
  134378. #endif
  134379. #ifdef WOLFSSL_KEIL
  134380. "adcs r4, r4, %[r]\n\t"
  134381. #elif defined(__clang__)
  134382. "adcs r4, %[r]\n\t"
  134383. #else
  134384. "adc r4, %[r]\n\t"
  134385. #endif
  134386. #ifdef WOLFSSL_KEIL
  134387. "adcs r5, r5, %[r]\n\t"
  134388. #elif defined(__clang__)
  134389. "adcs r5, %[r]\n\t"
  134390. #else
  134391. "adc r5, %[r]\n\t"
  134392. #endif
  134393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134394. "lsrs r7, %[b], #16\n\t"
  134395. #else
  134396. "lsr r7, %[b], #16\n\t"
  134397. #endif
  134398. #ifdef WOLFSSL_KEIL
  134399. "muls r6, r7, r6\n\t"
  134400. #elif defined(__clang__)
  134401. "muls r6, r7\n\t"
  134402. #else
  134403. "mul r6, r7\n\t"
  134404. #endif
  134405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134406. "lsrs r7, r6, #16\n\t"
  134407. #else
  134408. "lsr r7, r6, #16\n\t"
  134409. #endif
  134410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134411. "lsls r6, r6, #16\n\t"
  134412. #else
  134413. "lsl r6, r6, #16\n\t"
  134414. #endif
  134415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134416. "adds r3, r3, r6\n\t"
  134417. #else
  134418. "add r3, r3, r6\n\t"
  134419. #endif
  134420. #ifdef WOLFSSL_KEIL
  134421. "adcs r4, r4, r7\n\t"
  134422. #elif defined(__clang__)
  134423. "adcs r4, r7\n\t"
  134424. #else
  134425. "adc r4, r7\n\t"
  134426. #endif
  134427. #ifdef WOLFSSL_KEIL
  134428. "adcs r5, r5, %[r]\n\t"
  134429. #elif defined(__clang__)
  134430. "adcs r5, %[r]\n\t"
  134431. #else
  134432. "adc r5, %[r]\n\t"
  134433. #endif
  134434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134435. "lsrs r6, %[a], #16\n\t"
  134436. #else
  134437. "lsr r6, %[a], #16\n\t"
  134438. #endif
  134439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134440. "lsrs r7, %[b], #16\n\t"
  134441. #else
  134442. "lsr r7, %[b], #16\n\t"
  134443. #endif
  134444. #ifdef WOLFSSL_KEIL
  134445. "muls r7, r6, r7\n\t"
  134446. #elif defined(__clang__)
  134447. "muls r7, r6\n\t"
  134448. #else
  134449. "mul r7, r6\n\t"
  134450. #endif
  134451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134452. "adds r4, r4, r7\n\t"
  134453. #else
  134454. "add r4, r4, r7\n\t"
  134455. #endif
  134456. #ifdef WOLFSSL_KEIL
  134457. "adcs r5, r5, %[r]\n\t"
  134458. #elif defined(__clang__)
  134459. "adcs r5, %[r]\n\t"
  134460. #else
  134461. "adc r5, %[r]\n\t"
  134462. #endif
  134463. "uxth r7, %[b]\n\t"
  134464. #ifdef WOLFSSL_KEIL
  134465. "muls r6, r7, r6\n\t"
  134466. #elif defined(__clang__)
  134467. "muls r6, r7\n\t"
  134468. #else
  134469. "mul r6, r7\n\t"
  134470. #endif
  134471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134472. "lsrs r7, r6, #16\n\t"
  134473. #else
  134474. "lsr r7, r6, #16\n\t"
  134475. #endif
  134476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134477. "lsls r6, r6, #16\n\t"
  134478. #else
  134479. "lsl r6, r6, #16\n\t"
  134480. #endif
  134481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134482. "adds r3, r3, r6\n\t"
  134483. #else
  134484. "add r3, r3, r6\n\t"
  134485. #endif
  134486. #ifdef WOLFSSL_KEIL
  134487. "adcs r4, r4, r7\n\t"
  134488. #elif defined(__clang__)
  134489. "adcs r4, r7\n\t"
  134490. #else
  134491. "adc r4, r7\n\t"
  134492. #endif
  134493. #ifdef WOLFSSL_KEIL
  134494. "adcs r5, r5, %[r]\n\t"
  134495. #elif defined(__clang__)
  134496. "adcs r5, %[r]\n\t"
  134497. #else
  134498. "adc r5, %[r]\n\t"
  134499. #endif
  134500. "# A[8] * B[7]\n\t"
  134501. "mov %[a], r9\n\t"
  134502. "mov %[b], r10\n\t"
  134503. "ldr %[a], [%[a], #32]\n\t"
  134504. "ldr %[b], [%[b], #28]\n\t"
  134505. "uxth r6, %[a]\n\t"
  134506. "uxth r7, %[b]\n\t"
  134507. #ifdef WOLFSSL_KEIL
  134508. "muls r7, r6, r7\n\t"
  134509. #elif defined(__clang__)
  134510. "muls r7, r6\n\t"
  134511. #else
  134512. "mul r7, r6\n\t"
  134513. #endif
  134514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134515. "adds r3, r3, r7\n\t"
  134516. #else
  134517. "add r3, r3, r7\n\t"
  134518. #endif
  134519. #ifdef WOLFSSL_KEIL
  134520. "adcs r4, r4, %[r]\n\t"
  134521. #elif defined(__clang__)
  134522. "adcs r4, %[r]\n\t"
  134523. #else
  134524. "adc r4, %[r]\n\t"
  134525. #endif
  134526. #ifdef WOLFSSL_KEIL
  134527. "adcs r5, r5, %[r]\n\t"
  134528. #elif defined(__clang__)
  134529. "adcs r5, %[r]\n\t"
  134530. #else
  134531. "adc r5, %[r]\n\t"
  134532. #endif
  134533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134534. "lsrs r7, %[b], #16\n\t"
  134535. #else
  134536. "lsr r7, %[b], #16\n\t"
  134537. #endif
  134538. #ifdef WOLFSSL_KEIL
  134539. "muls r6, r7, r6\n\t"
  134540. #elif defined(__clang__)
  134541. "muls r6, r7\n\t"
  134542. #else
  134543. "mul r6, r7\n\t"
  134544. #endif
  134545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134546. "lsrs r7, r6, #16\n\t"
  134547. #else
  134548. "lsr r7, r6, #16\n\t"
  134549. #endif
  134550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134551. "lsls r6, r6, #16\n\t"
  134552. #else
  134553. "lsl r6, r6, #16\n\t"
  134554. #endif
  134555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134556. "adds r3, r3, r6\n\t"
  134557. #else
  134558. "add r3, r3, r6\n\t"
  134559. #endif
  134560. #ifdef WOLFSSL_KEIL
  134561. "adcs r4, r4, r7\n\t"
  134562. #elif defined(__clang__)
  134563. "adcs r4, r7\n\t"
  134564. #else
  134565. "adc r4, r7\n\t"
  134566. #endif
  134567. #ifdef WOLFSSL_KEIL
  134568. "adcs r5, r5, %[r]\n\t"
  134569. #elif defined(__clang__)
  134570. "adcs r5, %[r]\n\t"
  134571. #else
  134572. "adc r5, %[r]\n\t"
  134573. #endif
  134574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134575. "lsrs r6, %[a], #16\n\t"
  134576. #else
  134577. "lsr r6, %[a], #16\n\t"
  134578. #endif
  134579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134580. "lsrs r7, %[b], #16\n\t"
  134581. #else
  134582. "lsr r7, %[b], #16\n\t"
  134583. #endif
  134584. #ifdef WOLFSSL_KEIL
  134585. "muls r7, r6, r7\n\t"
  134586. #elif defined(__clang__)
  134587. "muls r7, r6\n\t"
  134588. #else
  134589. "mul r7, r6\n\t"
  134590. #endif
  134591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134592. "adds r4, r4, r7\n\t"
  134593. #else
  134594. "add r4, r4, r7\n\t"
  134595. #endif
  134596. #ifdef WOLFSSL_KEIL
  134597. "adcs r5, r5, %[r]\n\t"
  134598. #elif defined(__clang__)
  134599. "adcs r5, %[r]\n\t"
  134600. #else
  134601. "adc r5, %[r]\n\t"
  134602. #endif
  134603. "uxth r7, %[b]\n\t"
  134604. #ifdef WOLFSSL_KEIL
  134605. "muls r6, r7, r6\n\t"
  134606. #elif defined(__clang__)
  134607. "muls r6, r7\n\t"
  134608. #else
  134609. "mul r6, r7\n\t"
  134610. #endif
  134611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134612. "lsrs r7, r6, #16\n\t"
  134613. #else
  134614. "lsr r7, r6, #16\n\t"
  134615. #endif
  134616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134617. "lsls r6, r6, #16\n\t"
  134618. #else
  134619. "lsl r6, r6, #16\n\t"
  134620. #endif
  134621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134622. "adds r3, r3, r6\n\t"
  134623. #else
  134624. "add r3, r3, r6\n\t"
  134625. #endif
  134626. #ifdef WOLFSSL_KEIL
  134627. "adcs r4, r4, r7\n\t"
  134628. #elif defined(__clang__)
  134629. "adcs r4, r7\n\t"
  134630. #else
  134631. "adc r4, r7\n\t"
  134632. #endif
  134633. #ifdef WOLFSSL_KEIL
  134634. "adcs r5, r5, %[r]\n\t"
  134635. #elif defined(__clang__)
  134636. "adcs r5, %[r]\n\t"
  134637. #else
  134638. "adc r5, %[r]\n\t"
  134639. #endif
  134640. "# A[9] * B[6]\n\t"
  134641. "mov %[a], r9\n\t"
  134642. "mov %[b], r10\n\t"
  134643. "ldr %[a], [%[a], #36]\n\t"
  134644. "ldr %[b], [%[b], #24]\n\t"
  134645. "uxth r6, %[a]\n\t"
  134646. "uxth r7, %[b]\n\t"
  134647. #ifdef WOLFSSL_KEIL
  134648. "muls r7, r6, r7\n\t"
  134649. #elif defined(__clang__)
  134650. "muls r7, r6\n\t"
  134651. #else
  134652. "mul r7, r6\n\t"
  134653. #endif
  134654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134655. "adds r3, r3, r7\n\t"
  134656. #else
  134657. "add r3, r3, r7\n\t"
  134658. #endif
  134659. #ifdef WOLFSSL_KEIL
  134660. "adcs r4, r4, %[r]\n\t"
  134661. #elif defined(__clang__)
  134662. "adcs r4, %[r]\n\t"
  134663. #else
  134664. "adc r4, %[r]\n\t"
  134665. #endif
  134666. #ifdef WOLFSSL_KEIL
  134667. "adcs r5, r5, %[r]\n\t"
  134668. #elif defined(__clang__)
  134669. "adcs r5, %[r]\n\t"
  134670. #else
  134671. "adc r5, %[r]\n\t"
  134672. #endif
  134673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134674. "lsrs r7, %[b], #16\n\t"
  134675. #else
  134676. "lsr r7, %[b], #16\n\t"
  134677. #endif
  134678. #ifdef WOLFSSL_KEIL
  134679. "muls r6, r7, r6\n\t"
  134680. #elif defined(__clang__)
  134681. "muls r6, r7\n\t"
  134682. #else
  134683. "mul r6, r7\n\t"
  134684. #endif
  134685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134686. "lsrs r7, r6, #16\n\t"
  134687. #else
  134688. "lsr r7, r6, #16\n\t"
  134689. #endif
  134690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134691. "lsls r6, r6, #16\n\t"
  134692. #else
  134693. "lsl r6, r6, #16\n\t"
  134694. #endif
  134695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134696. "adds r3, r3, r6\n\t"
  134697. #else
  134698. "add r3, r3, r6\n\t"
  134699. #endif
  134700. #ifdef WOLFSSL_KEIL
  134701. "adcs r4, r4, r7\n\t"
  134702. #elif defined(__clang__)
  134703. "adcs r4, r7\n\t"
  134704. #else
  134705. "adc r4, r7\n\t"
  134706. #endif
  134707. #ifdef WOLFSSL_KEIL
  134708. "adcs r5, r5, %[r]\n\t"
  134709. #elif defined(__clang__)
  134710. "adcs r5, %[r]\n\t"
  134711. #else
  134712. "adc r5, %[r]\n\t"
  134713. #endif
  134714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134715. "lsrs r6, %[a], #16\n\t"
  134716. #else
  134717. "lsr r6, %[a], #16\n\t"
  134718. #endif
  134719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134720. "lsrs r7, %[b], #16\n\t"
  134721. #else
  134722. "lsr r7, %[b], #16\n\t"
  134723. #endif
  134724. #ifdef WOLFSSL_KEIL
  134725. "muls r7, r6, r7\n\t"
  134726. #elif defined(__clang__)
  134727. "muls r7, r6\n\t"
  134728. #else
  134729. "mul r7, r6\n\t"
  134730. #endif
  134731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134732. "adds r4, r4, r7\n\t"
  134733. #else
  134734. "add r4, r4, r7\n\t"
  134735. #endif
  134736. #ifdef WOLFSSL_KEIL
  134737. "adcs r5, r5, %[r]\n\t"
  134738. #elif defined(__clang__)
  134739. "adcs r5, %[r]\n\t"
  134740. #else
  134741. "adc r5, %[r]\n\t"
  134742. #endif
  134743. "uxth r7, %[b]\n\t"
  134744. #ifdef WOLFSSL_KEIL
  134745. "muls r6, r7, r6\n\t"
  134746. #elif defined(__clang__)
  134747. "muls r6, r7\n\t"
  134748. #else
  134749. "mul r6, r7\n\t"
  134750. #endif
  134751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134752. "lsrs r7, r6, #16\n\t"
  134753. #else
  134754. "lsr r7, r6, #16\n\t"
  134755. #endif
  134756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134757. "lsls r6, r6, #16\n\t"
  134758. #else
  134759. "lsl r6, r6, #16\n\t"
  134760. #endif
  134761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134762. "adds r3, r3, r6\n\t"
  134763. #else
  134764. "add r3, r3, r6\n\t"
  134765. #endif
  134766. #ifdef WOLFSSL_KEIL
  134767. "adcs r4, r4, r7\n\t"
  134768. #elif defined(__clang__)
  134769. "adcs r4, r7\n\t"
  134770. #else
  134771. "adc r4, r7\n\t"
  134772. #endif
  134773. #ifdef WOLFSSL_KEIL
  134774. "adcs r5, r5, %[r]\n\t"
  134775. #elif defined(__clang__)
  134776. "adcs r5, %[r]\n\t"
  134777. #else
  134778. "adc r5, %[r]\n\t"
  134779. #endif
  134780. "# A[10] * B[5]\n\t"
  134781. "mov %[a], r9\n\t"
  134782. "mov %[b], r10\n\t"
  134783. "ldr %[a], [%[a], #40]\n\t"
  134784. "ldr %[b], [%[b], #20]\n\t"
  134785. "uxth r6, %[a]\n\t"
  134786. "uxth r7, %[b]\n\t"
  134787. #ifdef WOLFSSL_KEIL
  134788. "muls r7, r6, r7\n\t"
  134789. #elif defined(__clang__)
  134790. "muls r7, r6\n\t"
  134791. #else
  134792. "mul r7, r6\n\t"
  134793. #endif
  134794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134795. "adds r3, r3, r7\n\t"
  134796. #else
  134797. "add r3, r3, r7\n\t"
  134798. #endif
  134799. #ifdef WOLFSSL_KEIL
  134800. "adcs r4, r4, %[r]\n\t"
  134801. #elif defined(__clang__)
  134802. "adcs r4, %[r]\n\t"
  134803. #else
  134804. "adc r4, %[r]\n\t"
  134805. #endif
  134806. #ifdef WOLFSSL_KEIL
  134807. "adcs r5, r5, %[r]\n\t"
  134808. #elif defined(__clang__)
  134809. "adcs r5, %[r]\n\t"
  134810. #else
  134811. "adc r5, %[r]\n\t"
  134812. #endif
  134813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134814. "lsrs r7, %[b], #16\n\t"
  134815. #else
  134816. "lsr r7, %[b], #16\n\t"
  134817. #endif
  134818. #ifdef WOLFSSL_KEIL
  134819. "muls r6, r7, r6\n\t"
  134820. #elif defined(__clang__)
  134821. "muls r6, r7\n\t"
  134822. #else
  134823. "mul r6, r7\n\t"
  134824. #endif
  134825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134826. "lsrs r7, r6, #16\n\t"
  134827. #else
  134828. "lsr r7, r6, #16\n\t"
  134829. #endif
  134830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134831. "lsls r6, r6, #16\n\t"
  134832. #else
  134833. "lsl r6, r6, #16\n\t"
  134834. #endif
  134835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134836. "adds r3, r3, r6\n\t"
  134837. #else
  134838. "add r3, r3, r6\n\t"
  134839. #endif
  134840. #ifdef WOLFSSL_KEIL
  134841. "adcs r4, r4, r7\n\t"
  134842. #elif defined(__clang__)
  134843. "adcs r4, r7\n\t"
  134844. #else
  134845. "adc r4, r7\n\t"
  134846. #endif
  134847. #ifdef WOLFSSL_KEIL
  134848. "adcs r5, r5, %[r]\n\t"
  134849. #elif defined(__clang__)
  134850. "adcs r5, %[r]\n\t"
  134851. #else
  134852. "adc r5, %[r]\n\t"
  134853. #endif
  134854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134855. "lsrs r6, %[a], #16\n\t"
  134856. #else
  134857. "lsr r6, %[a], #16\n\t"
  134858. #endif
  134859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134860. "lsrs r7, %[b], #16\n\t"
  134861. #else
  134862. "lsr r7, %[b], #16\n\t"
  134863. #endif
  134864. #ifdef WOLFSSL_KEIL
  134865. "muls r7, r6, r7\n\t"
  134866. #elif defined(__clang__)
  134867. "muls r7, r6\n\t"
  134868. #else
  134869. "mul r7, r6\n\t"
  134870. #endif
  134871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134872. "adds r4, r4, r7\n\t"
  134873. #else
  134874. "add r4, r4, r7\n\t"
  134875. #endif
  134876. #ifdef WOLFSSL_KEIL
  134877. "adcs r5, r5, %[r]\n\t"
  134878. #elif defined(__clang__)
  134879. "adcs r5, %[r]\n\t"
  134880. #else
  134881. "adc r5, %[r]\n\t"
  134882. #endif
  134883. "uxth r7, %[b]\n\t"
  134884. #ifdef WOLFSSL_KEIL
  134885. "muls r6, r7, r6\n\t"
  134886. #elif defined(__clang__)
  134887. "muls r6, r7\n\t"
  134888. #else
  134889. "mul r6, r7\n\t"
  134890. #endif
  134891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134892. "lsrs r7, r6, #16\n\t"
  134893. #else
  134894. "lsr r7, r6, #16\n\t"
  134895. #endif
  134896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134897. "lsls r6, r6, #16\n\t"
  134898. #else
  134899. "lsl r6, r6, #16\n\t"
  134900. #endif
  134901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134902. "adds r3, r3, r6\n\t"
  134903. #else
  134904. "add r3, r3, r6\n\t"
  134905. #endif
  134906. #ifdef WOLFSSL_KEIL
  134907. "adcs r4, r4, r7\n\t"
  134908. #elif defined(__clang__)
  134909. "adcs r4, r7\n\t"
  134910. #else
  134911. "adc r4, r7\n\t"
  134912. #endif
  134913. #ifdef WOLFSSL_KEIL
  134914. "adcs r5, r5, %[r]\n\t"
  134915. #elif defined(__clang__)
  134916. "adcs r5, %[r]\n\t"
  134917. #else
  134918. "adc r5, %[r]\n\t"
  134919. #endif
  134920. "# A[11] * B[4]\n\t"
  134921. "mov %[a], r9\n\t"
  134922. "mov %[b], r10\n\t"
  134923. "ldr %[a], [%[a], #44]\n\t"
  134924. "ldr %[b], [%[b], #16]\n\t"
  134925. "uxth r6, %[a]\n\t"
  134926. "uxth r7, %[b]\n\t"
  134927. #ifdef WOLFSSL_KEIL
  134928. "muls r7, r6, r7\n\t"
  134929. #elif defined(__clang__)
  134930. "muls r7, r6\n\t"
  134931. #else
  134932. "mul r7, r6\n\t"
  134933. #endif
  134934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134935. "adds r3, r3, r7\n\t"
  134936. #else
  134937. "add r3, r3, r7\n\t"
  134938. #endif
  134939. #ifdef WOLFSSL_KEIL
  134940. "adcs r4, r4, %[r]\n\t"
  134941. #elif defined(__clang__)
  134942. "adcs r4, %[r]\n\t"
  134943. #else
  134944. "adc r4, %[r]\n\t"
  134945. #endif
  134946. #ifdef WOLFSSL_KEIL
  134947. "adcs r5, r5, %[r]\n\t"
  134948. #elif defined(__clang__)
  134949. "adcs r5, %[r]\n\t"
  134950. #else
  134951. "adc r5, %[r]\n\t"
  134952. #endif
  134953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134954. "lsrs r7, %[b], #16\n\t"
  134955. #else
  134956. "lsr r7, %[b], #16\n\t"
  134957. #endif
  134958. #ifdef WOLFSSL_KEIL
  134959. "muls r6, r7, r6\n\t"
  134960. #elif defined(__clang__)
  134961. "muls r6, r7\n\t"
  134962. #else
  134963. "mul r6, r7\n\t"
  134964. #endif
  134965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134966. "lsrs r7, r6, #16\n\t"
  134967. #else
  134968. "lsr r7, r6, #16\n\t"
  134969. #endif
  134970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134971. "lsls r6, r6, #16\n\t"
  134972. #else
  134973. "lsl r6, r6, #16\n\t"
  134974. #endif
  134975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134976. "adds r3, r3, r6\n\t"
  134977. #else
  134978. "add r3, r3, r6\n\t"
  134979. #endif
  134980. #ifdef WOLFSSL_KEIL
  134981. "adcs r4, r4, r7\n\t"
  134982. #elif defined(__clang__)
  134983. "adcs r4, r7\n\t"
  134984. #else
  134985. "adc r4, r7\n\t"
  134986. #endif
  134987. #ifdef WOLFSSL_KEIL
  134988. "adcs r5, r5, %[r]\n\t"
  134989. #elif defined(__clang__)
  134990. "adcs r5, %[r]\n\t"
  134991. #else
  134992. "adc r5, %[r]\n\t"
  134993. #endif
  134994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134995. "lsrs r6, %[a], #16\n\t"
  134996. #else
  134997. "lsr r6, %[a], #16\n\t"
  134998. #endif
  134999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135000. "lsrs r7, %[b], #16\n\t"
  135001. #else
  135002. "lsr r7, %[b], #16\n\t"
  135003. #endif
  135004. #ifdef WOLFSSL_KEIL
  135005. "muls r7, r6, r7\n\t"
  135006. #elif defined(__clang__)
  135007. "muls r7, r6\n\t"
  135008. #else
  135009. "mul r7, r6\n\t"
  135010. #endif
  135011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135012. "adds r4, r4, r7\n\t"
  135013. #else
  135014. "add r4, r4, r7\n\t"
  135015. #endif
  135016. #ifdef WOLFSSL_KEIL
  135017. "adcs r5, r5, %[r]\n\t"
  135018. #elif defined(__clang__)
  135019. "adcs r5, %[r]\n\t"
  135020. #else
  135021. "adc r5, %[r]\n\t"
  135022. #endif
  135023. "uxth r7, %[b]\n\t"
  135024. #ifdef WOLFSSL_KEIL
  135025. "muls r6, r7, r6\n\t"
  135026. #elif defined(__clang__)
  135027. "muls r6, r7\n\t"
  135028. #else
  135029. "mul r6, r7\n\t"
  135030. #endif
  135031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135032. "lsrs r7, r6, #16\n\t"
  135033. #else
  135034. "lsr r7, r6, #16\n\t"
  135035. #endif
  135036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135037. "lsls r6, r6, #16\n\t"
  135038. #else
  135039. "lsl r6, r6, #16\n\t"
  135040. #endif
  135041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135042. "adds r3, r3, r6\n\t"
  135043. #else
  135044. "add r3, r3, r6\n\t"
  135045. #endif
  135046. #ifdef WOLFSSL_KEIL
  135047. "adcs r4, r4, r7\n\t"
  135048. #elif defined(__clang__)
  135049. "adcs r4, r7\n\t"
  135050. #else
  135051. "adc r4, r7\n\t"
  135052. #endif
  135053. #ifdef WOLFSSL_KEIL
  135054. "adcs r5, r5, %[r]\n\t"
  135055. #elif defined(__clang__)
  135056. "adcs r5, %[r]\n\t"
  135057. #else
  135058. "adc r5, %[r]\n\t"
  135059. #endif
  135060. "# A[12] * B[3]\n\t"
  135061. "mov %[a], r9\n\t"
  135062. "mov %[b], r10\n\t"
  135063. "ldr %[a], [%[a], #48]\n\t"
  135064. "ldr %[b], [%[b], #12]\n\t"
  135065. "uxth r6, %[a]\n\t"
  135066. "uxth r7, %[b]\n\t"
  135067. #ifdef WOLFSSL_KEIL
  135068. "muls r7, r6, r7\n\t"
  135069. #elif defined(__clang__)
  135070. "muls r7, r6\n\t"
  135071. #else
  135072. "mul r7, r6\n\t"
  135073. #endif
  135074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135075. "adds r3, r3, r7\n\t"
  135076. #else
  135077. "add r3, 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. #ifdef WOLFSSL_KEIL
  135087. "adcs r5, r5, %[r]\n\t"
  135088. #elif defined(__clang__)
  135089. "adcs r5, %[r]\n\t"
  135090. #else
  135091. "adc r5, %[r]\n\t"
  135092. #endif
  135093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135094. "lsrs r7, %[b], #16\n\t"
  135095. #else
  135096. "lsr r7, %[b], #16\n\t"
  135097. #endif
  135098. #ifdef WOLFSSL_KEIL
  135099. "muls r6, r7, r6\n\t"
  135100. #elif defined(__clang__)
  135101. "muls r6, r7\n\t"
  135102. #else
  135103. "mul r6, r7\n\t"
  135104. #endif
  135105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135106. "lsrs r7, r6, #16\n\t"
  135107. #else
  135108. "lsr r7, r6, #16\n\t"
  135109. #endif
  135110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135111. "lsls r6, r6, #16\n\t"
  135112. #else
  135113. "lsl r6, r6, #16\n\t"
  135114. #endif
  135115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135116. "adds r3, r3, r6\n\t"
  135117. #else
  135118. "add r3, r3, r6\n\t"
  135119. #endif
  135120. #ifdef WOLFSSL_KEIL
  135121. "adcs r4, r4, r7\n\t"
  135122. #elif defined(__clang__)
  135123. "adcs r4, r7\n\t"
  135124. #else
  135125. "adc r4, r7\n\t"
  135126. #endif
  135127. #ifdef WOLFSSL_KEIL
  135128. "adcs r5, r5, %[r]\n\t"
  135129. #elif defined(__clang__)
  135130. "adcs r5, %[r]\n\t"
  135131. #else
  135132. "adc r5, %[r]\n\t"
  135133. #endif
  135134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135135. "lsrs r6, %[a], #16\n\t"
  135136. #else
  135137. "lsr r6, %[a], #16\n\t"
  135138. #endif
  135139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135140. "lsrs r7, %[b], #16\n\t"
  135141. #else
  135142. "lsr r7, %[b], #16\n\t"
  135143. #endif
  135144. #ifdef WOLFSSL_KEIL
  135145. "muls r7, r6, r7\n\t"
  135146. #elif defined(__clang__)
  135147. "muls r7, r6\n\t"
  135148. #else
  135149. "mul r7, r6\n\t"
  135150. #endif
  135151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135152. "adds r4, r4, r7\n\t"
  135153. #else
  135154. "add r4, r4, r7\n\t"
  135155. #endif
  135156. #ifdef WOLFSSL_KEIL
  135157. "adcs r5, r5, %[r]\n\t"
  135158. #elif defined(__clang__)
  135159. "adcs r5, %[r]\n\t"
  135160. #else
  135161. "adc r5, %[r]\n\t"
  135162. #endif
  135163. "uxth r7, %[b]\n\t"
  135164. #ifdef WOLFSSL_KEIL
  135165. "muls r6, r7, r6\n\t"
  135166. #elif defined(__clang__)
  135167. "muls r6, r7\n\t"
  135168. #else
  135169. "mul r6, r7\n\t"
  135170. #endif
  135171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135172. "lsrs r7, r6, #16\n\t"
  135173. #else
  135174. "lsr r7, r6, #16\n\t"
  135175. #endif
  135176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135177. "lsls r6, r6, #16\n\t"
  135178. #else
  135179. "lsl r6, r6, #16\n\t"
  135180. #endif
  135181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135182. "adds r3, r3, r6\n\t"
  135183. #else
  135184. "add r3, r3, r6\n\t"
  135185. #endif
  135186. #ifdef WOLFSSL_KEIL
  135187. "adcs r4, r4, r7\n\t"
  135188. #elif defined(__clang__)
  135189. "adcs r4, r7\n\t"
  135190. #else
  135191. "adc r4, r7\n\t"
  135192. #endif
  135193. #ifdef WOLFSSL_KEIL
  135194. "adcs r5, r5, %[r]\n\t"
  135195. #elif defined(__clang__)
  135196. "adcs r5, %[r]\n\t"
  135197. #else
  135198. "adc r5, %[r]\n\t"
  135199. #endif
  135200. "# A[13] * B[2]\n\t"
  135201. "mov %[a], r9\n\t"
  135202. "mov %[b], r10\n\t"
  135203. "ldr %[a], [%[a], #52]\n\t"
  135204. "ldr %[b], [%[b], #8]\n\t"
  135205. "uxth r6, %[a]\n\t"
  135206. "uxth r7, %[b]\n\t"
  135207. #ifdef WOLFSSL_KEIL
  135208. "muls r7, r6, r7\n\t"
  135209. #elif defined(__clang__)
  135210. "muls r7, r6\n\t"
  135211. #else
  135212. "mul r7, r6\n\t"
  135213. #endif
  135214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135215. "adds r3, r3, r7\n\t"
  135216. #else
  135217. "add r3, 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. #ifdef WOLFSSL_KEIL
  135227. "adcs r5, r5, %[r]\n\t"
  135228. #elif defined(__clang__)
  135229. "adcs r5, %[r]\n\t"
  135230. #else
  135231. "adc r5, %[r]\n\t"
  135232. #endif
  135233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135234. "lsrs r7, %[b], #16\n\t"
  135235. #else
  135236. "lsr r7, %[b], #16\n\t"
  135237. #endif
  135238. #ifdef WOLFSSL_KEIL
  135239. "muls r6, r7, r6\n\t"
  135240. #elif defined(__clang__)
  135241. "muls r6, r7\n\t"
  135242. #else
  135243. "mul r6, r7\n\t"
  135244. #endif
  135245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135246. "lsrs r7, r6, #16\n\t"
  135247. #else
  135248. "lsr r7, r6, #16\n\t"
  135249. #endif
  135250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135251. "lsls r6, r6, #16\n\t"
  135252. #else
  135253. "lsl r6, r6, #16\n\t"
  135254. #endif
  135255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135256. "adds r3, r3, r6\n\t"
  135257. #else
  135258. "add r3, r3, r6\n\t"
  135259. #endif
  135260. #ifdef WOLFSSL_KEIL
  135261. "adcs r4, r4, r7\n\t"
  135262. #elif defined(__clang__)
  135263. "adcs r4, r7\n\t"
  135264. #else
  135265. "adc r4, r7\n\t"
  135266. #endif
  135267. #ifdef WOLFSSL_KEIL
  135268. "adcs r5, r5, %[r]\n\t"
  135269. #elif defined(__clang__)
  135270. "adcs r5, %[r]\n\t"
  135271. #else
  135272. "adc r5, %[r]\n\t"
  135273. #endif
  135274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135275. "lsrs r6, %[a], #16\n\t"
  135276. #else
  135277. "lsr r6, %[a], #16\n\t"
  135278. #endif
  135279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135280. "lsrs r7, %[b], #16\n\t"
  135281. #else
  135282. "lsr r7, %[b], #16\n\t"
  135283. #endif
  135284. #ifdef WOLFSSL_KEIL
  135285. "muls r7, r6, r7\n\t"
  135286. #elif defined(__clang__)
  135287. "muls r7, r6\n\t"
  135288. #else
  135289. "mul r7, r6\n\t"
  135290. #endif
  135291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135292. "adds r4, r4, r7\n\t"
  135293. #else
  135294. "add r4, r4, r7\n\t"
  135295. #endif
  135296. #ifdef WOLFSSL_KEIL
  135297. "adcs r5, r5, %[r]\n\t"
  135298. #elif defined(__clang__)
  135299. "adcs r5, %[r]\n\t"
  135300. #else
  135301. "adc r5, %[r]\n\t"
  135302. #endif
  135303. "uxth r7, %[b]\n\t"
  135304. #ifdef WOLFSSL_KEIL
  135305. "muls r6, r7, r6\n\t"
  135306. #elif defined(__clang__)
  135307. "muls r6, r7\n\t"
  135308. #else
  135309. "mul r6, r7\n\t"
  135310. #endif
  135311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135312. "lsrs r7, r6, #16\n\t"
  135313. #else
  135314. "lsr r7, r6, #16\n\t"
  135315. #endif
  135316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135317. "lsls r6, r6, #16\n\t"
  135318. #else
  135319. "lsl r6, r6, #16\n\t"
  135320. #endif
  135321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135322. "adds r3, r3, r6\n\t"
  135323. #else
  135324. "add r3, r3, r6\n\t"
  135325. #endif
  135326. #ifdef WOLFSSL_KEIL
  135327. "adcs r4, r4, r7\n\t"
  135328. #elif defined(__clang__)
  135329. "adcs r4, r7\n\t"
  135330. #else
  135331. "adc r4, r7\n\t"
  135332. #endif
  135333. #ifdef WOLFSSL_KEIL
  135334. "adcs r5, r5, %[r]\n\t"
  135335. #elif defined(__clang__)
  135336. "adcs r5, %[r]\n\t"
  135337. #else
  135338. "adc r5, %[r]\n\t"
  135339. #endif
  135340. "# A[14] * B[1]\n\t"
  135341. "mov %[a], r9\n\t"
  135342. "mov %[b], r10\n\t"
  135343. "ldr %[a], [%[a], #56]\n\t"
  135344. "ldr %[b], [%[b], #4]\n\t"
  135345. "uxth r6, %[a]\n\t"
  135346. "uxth r7, %[b]\n\t"
  135347. #ifdef WOLFSSL_KEIL
  135348. "muls r7, r6, r7\n\t"
  135349. #elif defined(__clang__)
  135350. "muls r7, r6\n\t"
  135351. #else
  135352. "mul r7, r6\n\t"
  135353. #endif
  135354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135355. "adds r3, r3, r7\n\t"
  135356. #else
  135357. "add r3, 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. #ifdef WOLFSSL_KEIL
  135367. "adcs r5, r5, %[r]\n\t"
  135368. #elif defined(__clang__)
  135369. "adcs r5, %[r]\n\t"
  135370. #else
  135371. "adc r5, %[r]\n\t"
  135372. #endif
  135373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135374. "lsrs r7, %[b], #16\n\t"
  135375. #else
  135376. "lsr r7, %[b], #16\n\t"
  135377. #endif
  135378. #ifdef WOLFSSL_KEIL
  135379. "muls r6, r7, r6\n\t"
  135380. #elif defined(__clang__)
  135381. "muls r6, r7\n\t"
  135382. #else
  135383. "mul r6, r7\n\t"
  135384. #endif
  135385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135386. "lsrs r7, r6, #16\n\t"
  135387. #else
  135388. "lsr r7, r6, #16\n\t"
  135389. #endif
  135390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135391. "lsls r6, r6, #16\n\t"
  135392. #else
  135393. "lsl r6, r6, #16\n\t"
  135394. #endif
  135395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135396. "adds r3, r3, r6\n\t"
  135397. #else
  135398. "add r3, r3, r6\n\t"
  135399. #endif
  135400. #ifdef WOLFSSL_KEIL
  135401. "adcs r4, r4, r7\n\t"
  135402. #elif defined(__clang__)
  135403. "adcs r4, r7\n\t"
  135404. #else
  135405. "adc r4, r7\n\t"
  135406. #endif
  135407. #ifdef WOLFSSL_KEIL
  135408. "adcs r5, r5, %[r]\n\t"
  135409. #elif defined(__clang__)
  135410. "adcs r5, %[r]\n\t"
  135411. #else
  135412. "adc r5, %[r]\n\t"
  135413. #endif
  135414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135415. "lsrs r6, %[a], #16\n\t"
  135416. #else
  135417. "lsr r6, %[a], #16\n\t"
  135418. #endif
  135419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135420. "lsrs r7, %[b], #16\n\t"
  135421. #else
  135422. "lsr r7, %[b], #16\n\t"
  135423. #endif
  135424. #ifdef WOLFSSL_KEIL
  135425. "muls r7, r6, r7\n\t"
  135426. #elif defined(__clang__)
  135427. "muls r7, r6\n\t"
  135428. #else
  135429. "mul r7, r6\n\t"
  135430. #endif
  135431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135432. "adds r4, r4, r7\n\t"
  135433. #else
  135434. "add r4, r4, r7\n\t"
  135435. #endif
  135436. #ifdef WOLFSSL_KEIL
  135437. "adcs r5, r5, %[r]\n\t"
  135438. #elif defined(__clang__)
  135439. "adcs r5, %[r]\n\t"
  135440. #else
  135441. "adc r5, %[r]\n\t"
  135442. #endif
  135443. "uxth r7, %[b]\n\t"
  135444. #ifdef WOLFSSL_KEIL
  135445. "muls r6, r7, r6\n\t"
  135446. #elif defined(__clang__)
  135447. "muls r6, r7\n\t"
  135448. #else
  135449. "mul r6, r7\n\t"
  135450. #endif
  135451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135452. "lsrs r7, r6, #16\n\t"
  135453. #else
  135454. "lsr r7, r6, #16\n\t"
  135455. #endif
  135456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135457. "lsls r6, r6, #16\n\t"
  135458. #else
  135459. "lsl r6, r6, #16\n\t"
  135460. #endif
  135461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135462. "adds r3, r3, r6\n\t"
  135463. #else
  135464. "add r3, r3, r6\n\t"
  135465. #endif
  135466. #ifdef WOLFSSL_KEIL
  135467. "adcs r4, r4, r7\n\t"
  135468. #elif defined(__clang__)
  135469. "adcs r4, r7\n\t"
  135470. #else
  135471. "adc r4, r7\n\t"
  135472. #endif
  135473. #ifdef WOLFSSL_KEIL
  135474. "adcs r5, r5, %[r]\n\t"
  135475. #elif defined(__clang__)
  135476. "adcs r5, %[r]\n\t"
  135477. #else
  135478. "adc r5, %[r]\n\t"
  135479. #endif
  135480. "# A[15] * B[0]\n\t"
  135481. "mov %[a], r9\n\t"
  135482. "mov %[b], r10\n\t"
  135483. "ldr %[a], [%[a], #60]\n\t"
  135484. "ldr %[b], [%[b]]\n\t"
  135485. "uxth r6, %[a]\n\t"
  135486. "uxth r7, %[b]\n\t"
  135487. #ifdef WOLFSSL_KEIL
  135488. "muls r7, r6, r7\n\t"
  135489. #elif defined(__clang__)
  135490. "muls r7, r6\n\t"
  135491. #else
  135492. "mul r7, r6\n\t"
  135493. #endif
  135494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135495. "adds r3, r3, r7\n\t"
  135496. #else
  135497. "add r3, r3, r7\n\t"
  135498. #endif
  135499. #ifdef WOLFSSL_KEIL
  135500. "adcs r4, r4, %[r]\n\t"
  135501. #elif defined(__clang__)
  135502. "adcs r4, %[r]\n\t"
  135503. #else
  135504. "adc r4, %[r]\n\t"
  135505. #endif
  135506. #ifdef WOLFSSL_KEIL
  135507. "adcs r5, r5, %[r]\n\t"
  135508. #elif defined(__clang__)
  135509. "adcs r5, %[r]\n\t"
  135510. #else
  135511. "adc r5, %[r]\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 r6, r7, r6\n\t"
  135520. #elif defined(__clang__)
  135521. "muls r6, r7\n\t"
  135522. #else
  135523. "mul r6, r7\n\t"
  135524. #endif
  135525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135526. "lsrs r7, r6, #16\n\t"
  135527. #else
  135528. "lsr r7, r6, #16\n\t"
  135529. #endif
  135530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135531. "lsls r6, r6, #16\n\t"
  135532. #else
  135533. "lsl r6, r6, #16\n\t"
  135534. #endif
  135535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135536. "adds r3, r3, r6\n\t"
  135537. #else
  135538. "add r3, r3, r6\n\t"
  135539. #endif
  135540. #ifdef WOLFSSL_KEIL
  135541. "adcs r4, r4, r7\n\t"
  135542. #elif defined(__clang__)
  135543. "adcs r4, r7\n\t"
  135544. #else
  135545. "adc r4, r7\n\t"
  135546. #endif
  135547. #ifdef WOLFSSL_KEIL
  135548. "adcs r5, r5, %[r]\n\t"
  135549. #elif defined(__clang__)
  135550. "adcs r5, %[r]\n\t"
  135551. #else
  135552. "adc r5, %[r]\n\t"
  135553. #endif
  135554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135555. "lsrs r6, %[a], #16\n\t"
  135556. #else
  135557. "lsr r6, %[a], #16\n\t"
  135558. #endif
  135559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135560. "lsrs r7, %[b], #16\n\t"
  135561. #else
  135562. "lsr r7, %[b], #16\n\t"
  135563. #endif
  135564. #ifdef WOLFSSL_KEIL
  135565. "muls r7, r6, r7\n\t"
  135566. #elif defined(__clang__)
  135567. "muls r7, r6\n\t"
  135568. #else
  135569. "mul r7, r6\n\t"
  135570. #endif
  135571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135572. "adds r4, r4, r7\n\t"
  135573. #else
  135574. "add r4, r4, r7\n\t"
  135575. #endif
  135576. #ifdef WOLFSSL_KEIL
  135577. "adcs r5, r5, %[r]\n\t"
  135578. #elif defined(__clang__)
  135579. "adcs r5, %[r]\n\t"
  135580. #else
  135581. "adc r5, %[r]\n\t"
  135582. #endif
  135583. "uxth r7, %[b]\n\t"
  135584. #ifdef WOLFSSL_KEIL
  135585. "muls r6, r7, r6\n\t"
  135586. #elif defined(__clang__)
  135587. "muls r6, r7\n\t"
  135588. #else
  135589. "mul r6, r7\n\t"
  135590. #endif
  135591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135592. "lsrs r7, r6, #16\n\t"
  135593. #else
  135594. "lsr r7, r6, #16\n\t"
  135595. #endif
  135596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135597. "lsls r6, r6, #16\n\t"
  135598. #else
  135599. "lsl r6, r6, #16\n\t"
  135600. #endif
  135601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135602. "adds r3, r3, r6\n\t"
  135603. #else
  135604. "add r3, r3, r6\n\t"
  135605. #endif
  135606. #ifdef WOLFSSL_KEIL
  135607. "adcs r4, r4, r7\n\t"
  135608. #elif defined(__clang__)
  135609. "adcs r4, r7\n\t"
  135610. #else
  135611. "adc r4, r7\n\t"
  135612. #endif
  135613. #ifdef WOLFSSL_KEIL
  135614. "adcs r5, r5, %[r]\n\t"
  135615. #elif defined(__clang__)
  135616. "adcs r5, %[r]\n\t"
  135617. #else
  135618. "adc r5, %[r]\n\t"
  135619. #endif
  135620. "str r3, [sp, #60]\n\t"
  135621. "# A[15] * B[1]\n\t"
  135622. "movs r3, #0\n\t"
  135623. "mov %[a], r9\n\t"
  135624. "mov %[b], r10\n\t"
  135625. "ldr %[a], [%[a], #60]\n\t"
  135626. "ldr %[b], [%[b], #4]\n\t"
  135627. "uxth r6, %[a]\n\t"
  135628. "uxth r7, %[b]\n\t"
  135629. #ifdef WOLFSSL_KEIL
  135630. "muls r7, r6, r7\n\t"
  135631. #elif defined(__clang__)
  135632. "muls r7, r6\n\t"
  135633. #else
  135634. "mul r7, r6\n\t"
  135635. #endif
  135636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135637. "adds r4, r4, r7\n\t"
  135638. #else
  135639. "add r4, 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. #ifdef WOLFSSL_KEIL
  135649. "adcs r3, r3, %[r]\n\t"
  135650. #elif defined(__clang__)
  135651. "adcs r3, %[r]\n\t"
  135652. #else
  135653. "adc r3, %[r]\n\t"
  135654. #endif
  135655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135656. "lsrs r7, %[b], #16\n\t"
  135657. #else
  135658. "lsr r7, %[b], #16\n\t"
  135659. #endif
  135660. #ifdef WOLFSSL_KEIL
  135661. "muls r6, r7, r6\n\t"
  135662. #elif defined(__clang__)
  135663. "muls r6, r7\n\t"
  135664. #else
  135665. "mul r6, r7\n\t"
  135666. #endif
  135667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135668. "lsrs r7, r6, #16\n\t"
  135669. #else
  135670. "lsr r7, r6, #16\n\t"
  135671. #endif
  135672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135673. "lsls r6, r6, #16\n\t"
  135674. #else
  135675. "lsl r6, r6, #16\n\t"
  135676. #endif
  135677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135678. "adds r4, r4, r6\n\t"
  135679. #else
  135680. "add r4, r4, r6\n\t"
  135681. #endif
  135682. #ifdef WOLFSSL_KEIL
  135683. "adcs r5, r5, r7\n\t"
  135684. #elif defined(__clang__)
  135685. "adcs r5, r7\n\t"
  135686. #else
  135687. "adc r5, r7\n\t"
  135688. #endif
  135689. #ifdef WOLFSSL_KEIL
  135690. "adcs r3, r3, %[r]\n\t"
  135691. #elif defined(__clang__)
  135692. "adcs r3, %[r]\n\t"
  135693. #else
  135694. "adc r3, %[r]\n\t"
  135695. #endif
  135696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135697. "lsrs r6, %[a], #16\n\t"
  135698. #else
  135699. "lsr r6, %[a], #16\n\t"
  135700. #endif
  135701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135702. "lsrs r7, %[b], #16\n\t"
  135703. #else
  135704. "lsr r7, %[b], #16\n\t"
  135705. #endif
  135706. #ifdef WOLFSSL_KEIL
  135707. "muls r7, r6, r7\n\t"
  135708. #elif defined(__clang__)
  135709. "muls r7, r6\n\t"
  135710. #else
  135711. "mul r7, r6\n\t"
  135712. #endif
  135713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135714. "adds r5, r5, r7\n\t"
  135715. #else
  135716. "add r5, r5, r7\n\t"
  135717. #endif
  135718. #ifdef WOLFSSL_KEIL
  135719. "adcs r3, r3, %[r]\n\t"
  135720. #elif defined(__clang__)
  135721. "adcs r3, %[r]\n\t"
  135722. #else
  135723. "adc r3, %[r]\n\t"
  135724. #endif
  135725. "uxth r7, %[b]\n\t"
  135726. #ifdef WOLFSSL_KEIL
  135727. "muls r6, r7, r6\n\t"
  135728. #elif defined(__clang__)
  135729. "muls r6, r7\n\t"
  135730. #else
  135731. "mul r6, r7\n\t"
  135732. #endif
  135733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135734. "lsrs r7, r6, #16\n\t"
  135735. #else
  135736. "lsr r7, r6, #16\n\t"
  135737. #endif
  135738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135739. "lsls r6, r6, #16\n\t"
  135740. #else
  135741. "lsl r6, r6, #16\n\t"
  135742. #endif
  135743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135744. "adds r4, r4, r6\n\t"
  135745. #else
  135746. "add r4, r4, r6\n\t"
  135747. #endif
  135748. #ifdef WOLFSSL_KEIL
  135749. "adcs r5, r5, r7\n\t"
  135750. #elif defined(__clang__)
  135751. "adcs r5, r7\n\t"
  135752. #else
  135753. "adc r5, r7\n\t"
  135754. #endif
  135755. #ifdef WOLFSSL_KEIL
  135756. "adcs r3, r3, %[r]\n\t"
  135757. #elif defined(__clang__)
  135758. "adcs r3, %[r]\n\t"
  135759. #else
  135760. "adc r3, %[r]\n\t"
  135761. #endif
  135762. "# A[14] * B[2]\n\t"
  135763. "mov %[a], r9\n\t"
  135764. "mov %[b], r10\n\t"
  135765. "ldr %[a], [%[a], #56]\n\t"
  135766. "ldr %[b], [%[b], #8]\n\t"
  135767. "uxth r6, %[a]\n\t"
  135768. "uxth r7, %[b]\n\t"
  135769. #ifdef WOLFSSL_KEIL
  135770. "muls r7, r6, r7\n\t"
  135771. #elif defined(__clang__)
  135772. "muls r7, r6\n\t"
  135773. #else
  135774. "mul r7, r6\n\t"
  135775. #endif
  135776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135777. "adds r4, r4, r7\n\t"
  135778. #else
  135779. "add r4, 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. #ifdef WOLFSSL_KEIL
  135789. "adcs r3, r3, %[r]\n\t"
  135790. #elif defined(__clang__)
  135791. "adcs r3, %[r]\n\t"
  135792. #else
  135793. "adc r3, %[r]\n\t"
  135794. #endif
  135795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135796. "lsrs r7, %[b], #16\n\t"
  135797. #else
  135798. "lsr r7, %[b], #16\n\t"
  135799. #endif
  135800. #ifdef WOLFSSL_KEIL
  135801. "muls r6, r7, r6\n\t"
  135802. #elif defined(__clang__)
  135803. "muls r6, r7\n\t"
  135804. #else
  135805. "mul r6, r7\n\t"
  135806. #endif
  135807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135808. "lsrs r7, r6, #16\n\t"
  135809. #else
  135810. "lsr r7, r6, #16\n\t"
  135811. #endif
  135812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135813. "lsls r6, r6, #16\n\t"
  135814. #else
  135815. "lsl r6, r6, #16\n\t"
  135816. #endif
  135817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135818. "adds r4, r4, r6\n\t"
  135819. #else
  135820. "add r4, r4, r6\n\t"
  135821. #endif
  135822. #ifdef WOLFSSL_KEIL
  135823. "adcs r5, r5, r7\n\t"
  135824. #elif defined(__clang__)
  135825. "adcs r5, r7\n\t"
  135826. #else
  135827. "adc r5, r7\n\t"
  135828. #endif
  135829. #ifdef WOLFSSL_KEIL
  135830. "adcs r3, r3, %[r]\n\t"
  135831. #elif defined(__clang__)
  135832. "adcs r3, %[r]\n\t"
  135833. #else
  135834. "adc r3, %[r]\n\t"
  135835. #endif
  135836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135837. "lsrs r6, %[a], #16\n\t"
  135838. #else
  135839. "lsr r6, %[a], #16\n\t"
  135840. #endif
  135841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135842. "lsrs r7, %[b], #16\n\t"
  135843. #else
  135844. "lsr r7, %[b], #16\n\t"
  135845. #endif
  135846. #ifdef WOLFSSL_KEIL
  135847. "muls r7, r6, r7\n\t"
  135848. #elif defined(__clang__)
  135849. "muls r7, r6\n\t"
  135850. #else
  135851. "mul r7, r6\n\t"
  135852. #endif
  135853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135854. "adds r5, r5, r7\n\t"
  135855. #else
  135856. "add r5, r5, r7\n\t"
  135857. #endif
  135858. #ifdef WOLFSSL_KEIL
  135859. "adcs r3, r3, %[r]\n\t"
  135860. #elif defined(__clang__)
  135861. "adcs r3, %[r]\n\t"
  135862. #else
  135863. "adc r3, %[r]\n\t"
  135864. #endif
  135865. "uxth r7, %[b]\n\t"
  135866. #ifdef WOLFSSL_KEIL
  135867. "muls r6, r7, r6\n\t"
  135868. #elif defined(__clang__)
  135869. "muls r6, r7\n\t"
  135870. #else
  135871. "mul r6, r7\n\t"
  135872. #endif
  135873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135874. "lsrs r7, r6, #16\n\t"
  135875. #else
  135876. "lsr r7, r6, #16\n\t"
  135877. #endif
  135878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135879. "lsls r6, r6, #16\n\t"
  135880. #else
  135881. "lsl r6, r6, #16\n\t"
  135882. #endif
  135883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135884. "adds r4, r4, r6\n\t"
  135885. #else
  135886. "add r4, r4, r6\n\t"
  135887. #endif
  135888. #ifdef WOLFSSL_KEIL
  135889. "adcs r5, r5, r7\n\t"
  135890. #elif defined(__clang__)
  135891. "adcs r5, r7\n\t"
  135892. #else
  135893. "adc r5, r7\n\t"
  135894. #endif
  135895. #ifdef WOLFSSL_KEIL
  135896. "adcs r3, r3, %[r]\n\t"
  135897. #elif defined(__clang__)
  135898. "adcs r3, %[r]\n\t"
  135899. #else
  135900. "adc r3, %[r]\n\t"
  135901. #endif
  135902. "# A[13] * B[3]\n\t"
  135903. "mov %[a], r9\n\t"
  135904. "mov %[b], r10\n\t"
  135905. "ldr %[a], [%[a], #52]\n\t"
  135906. "ldr %[b], [%[b], #12]\n\t"
  135907. "uxth r6, %[a]\n\t"
  135908. "uxth r7, %[b]\n\t"
  135909. #ifdef WOLFSSL_KEIL
  135910. "muls r7, r6, r7\n\t"
  135911. #elif defined(__clang__)
  135912. "muls r7, r6\n\t"
  135913. #else
  135914. "mul r7, r6\n\t"
  135915. #endif
  135916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135917. "adds r4, r4, r7\n\t"
  135918. #else
  135919. "add r4, 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. #ifdef WOLFSSL_KEIL
  135929. "adcs r3, r3, %[r]\n\t"
  135930. #elif defined(__clang__)
  135931. "adcs r3, %[r]\n\t"
  135932. #else
  135933. "adc r3, %[r]\n\t"
  135934. #endif
  135935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135936. "lsrs r7, %[b], #16\n\t"
  135937. #else
  135938. "lsr r7, %[b], #16\n\t"
  135939. #endif
  135940. #ifdef WOLFSSL_KEIL
  135941. "muls r6, r7, r6\n\t"
  135942. #elif defined(__clang__)
  135943. "muls r6, r7\n\t"
  135944. #else
  135945. "mul r6, r7\n\t"
  135946. #endif
  135947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135948. "lsrs r7, r6, #16\n\t"
  135949. #else
  135950. "lsr r7, r6, #16\n\t"
  135951. #endif
  135952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135953. "lsls r6, r6, #16\n\t"
  135954. #else
  135955. "lsl r6, r6, #16\n\t"
  135956. #endif
  135957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135958. "adds r4, r4, r6\n\t"
  135959. #else
  135960. "add r4, r4, r6\n\t"
  135961. #endif
  135962. #ifdef WOLFSSL_KEIL
  135963. "adcs r5, r5, r7\n\t"
  135964. #elif defined(__clang__)
  135965. "adcs r5, r7\n\t"
  135966. #else
  135967. "adc r5, r7\n\t"
  135968. #endif
  135969. #ifdef WOLFSSL_KEIL
  135970. "adcs r3, r3, %[r]\n\t"
  135971. #elif defined(__clang__)
  135972. "adcs r3, %[r]\n\t"
  135973. #else
  135974. "adc r3, %[r]\n\t"
  135975. #endif
  135976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135977. "lsrs r6, %[a], #16\n\t"
  135978. #else
  135979. "lsr r6, %[a], #16\n\t"
  135980. #endif
  135981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135982. "lsrs r7, %[b], #16\n\t"
  135983. #else
  135984. "lsr r7, %[b], #16\n\t"
  135985. #endif
  135986. #ifdef WOLFSSL_KEIL
  135987. "muls r7, r6, r7\n\t"
  135988. #elif defined(__clang__)
  135989. "muls r7, r6\n\t"
  135990. #else
  135991. "mul r7, r6\n\t"
  135992. #endif
  135993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135994. "adds r5, r5, r7\n\t"
  135995. #else
  135996. "add r5, r5, r7\n\t"
  135997. #endif
  135998. #ifdef WOLFSSL_KEIL
  135999. "adcs r3, r3, %[r]\n\t"
  136000. #elif defined(__clang__)
  136001. "adcs r3, %[r]\n\t"
  136002. #else
  136003. "adc r3, %[r]\n\t"
  136004. #endif
  136005. "uxth r7, %[b]\n\t"
  136006. #ifdef WOLFSSL_KEIL
  136007. "muls r6, r7, r6\n\t"
  136008. #elif defined(__clang__)
  136009. "muls r6, r7\n\t"
  136010. #else
  136011. "mul r6, r7\n\t"
  136012. #endif
  136013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136014. "lsrs r7, r6, #16\n\t"
  136015. #else
  136016. "lsr r7, r6, #16\n\t"
  136017. #endif
  136018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136019. "lsls r6, r6, #16\n\t"
  136020. #else
  136021. "lsl r6, r6, #16\n\t"
  136022. #endif
  136023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136024. "adds r4, r4, r6\n\t"
  136025. #else
  136026. "add r4, r4, r6\n\t"
  136027. #endif
  136028. #ifdef WOLFSSL_KEIL
  136029. "adcs r5, r5, r7\n\t"
  136030. #elif defined(__clang__)
  136031. "adcs r5, r7\n\t"
  136032. #else
  136033. "adc r5, r7\n\t"
  136034. #endif
  136035. #ifdef WOLFSSL_KEIL
  136036. "adcs r3, r3, %[r]\n\t"
  136037. #elif defined(__clang__)
  136038. "adcs r3, %[r]\n\t"
  136039. #else
  136040. "adc r3, %[r]\n\t"
  136041. #endif
  136042. "# A[12] * B[4]\n\t"
  136043. "mov %[a], r9\n\t"
  136044. "mov %[b], r10\n\t"
  136045. "ldr %[a], [%[a], #48]\n\t"
  136046. "ldr %[b], [%[b], #16]\n\t"
  136047. "uxth r6, %[a]\n\t"
  136048. "uxth r7, %[b]\n\t"
  136049. #ifdef WOLFSSL_KEIL
  136050. "muls r7, r6, r7\n\t"
  136051. #elif defined(__clang__)
  136052. "muls r7, r6\n\t"
  136053. #else
  136054. "mul r7, r6\n\t"
  136055. #endif
  136056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136057. "adds r4, r4, r7\n\t"
  136058. #else
  136059. "add r4, r4, r7\n\t"
  136060. #endif
  136061. #ifdef WOLFSSL_KEIL
  136062. "adcs r5, r5, %[r]\n\t"
  136063. #elif defined(__clang__)
  136064. "adcs r5, %[r]\n\t"
  136065. #else
  136066. "adc r5, %[r]\n\t"
  136067. #endif
  136068. #ifdef WOLFSSL_KEIL
  136069. "adcs r3, r3, %[r]\n\t"
  136070. #elif defined(__clang__)
  136071. "adcs r3, %[r]\n\t"
  136072. #else
  136073. "adc r3, %[r]\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 r6, r7, r6\n\t"
  136082. #elif defined(__clang__)
  136083. "muls r6, r7\n\t"
  136084. #else
  136085. "mul r6, r7\n\t"
  136086. #endif
  136087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136088. "lsrs r7, r6, #16\n\t"
  136089. #else
  136090. "lsr r7, r6, #16\n\t"
  136091. #endif
  136092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136093. "lsls r6, r6, #16\n\t"
  136094. #else
  136095. "lsl r6, r6, #16\n\t"
  136096. #endif
  136097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136098. "adds r4, r4, r6\n\t"
  136099. #else
  136100. "add r4, r4, r6\n\t"
  136101. #endif
  136102. #ifdef WOLFSSL_KEIL
  136103. "adcs r5, r5, r7\n\t"
  136104. #elif defined(__clang__)
  136105. "adcs r5, r7\n\t"
  136106. #else
  136107. "adc r5, r7\n\t"
  136108. #endif
  136109. #ifdef WOLFSSL_KEIL
  136110. "adcs r3, r3, %[r]\n\t"
  136111. #elif defined(__clang__)
  136112. "adcs r3, %[r]\n\t"
  136113. #else
  136114. "adc r3, %[r]\n\t"
  136115. #endif
  136116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136117. "lsrs r6, %[a], #16\n\t"
  136118. #else
  136119. "lsr r6, %[a], #16\n\t"
  136120. #endif
  136121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136122. "lsrs r7, %[b], #16\n\t"
  136123. #else
  136124. "lsr r7, %[b], #16\n\t"
  136125. #endif
  136126. #ifdef WOLFSSL_KEIL
  136127. "muls r7, r6, r7\n\t"
  136128. #elif defined(__clang__)
  136129. "muls r7, r6\n\t"
  136130. #else
  136131. "mul r7, r6\n\t"
  136132. #endif
  136133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136134. "adds r5, r5, r7\n\t"
  136135. #else
  136136. "add r5, r5, r7\n\t"
  136137. #endif
  136138. #ifdef WOLFSSL_KEIL
  136139. "adcs r3, r3, %[r]\n\t"
  136140. #elif defined(__clang__)
  136141. "adcs r3, %[r]\n\t"
  136142. #else
  136143. "adc r3, %[r]\n\t"
  136144. #endif
  136145. "uxth r7, %[b]\n\t"
  136146. #ifdef WOLFSSL_KEIL
  136147. "muls r6, r7, r6\n\t"
  136148. #elif defined(__clang__)
  136149. "muls r6, r7\n\t"
  136150. #else
  136151. "mul r6, r7\n\t"
  136152. #endif
  136153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136154. "lsrs r7, r6, #16\n\t"
  136155. #else
  136156. "lsr r7, r6, #16\n\t"
  136157. #endif
  136158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136159. "lsls r6, r6, #16\n\t"
  136160. #else
  136161. "lsl r6, r6, #16\n\t"
  136162. #endif
  136163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136164. "adds r4, r4, r6\n\t"
  136165. #else
  136166. "add r4, r4, r6\n\t"
  136167. #endif
  136168. #ifdef WOLFSSL_KEIL
  136169. "adcs r5, r5, r7\n\t"
  136170. #elif defined(__clang__)
  136171. "adcs r5, r7\n\t"
  136172. #else
  136173. "adc r5, r7\n\t"
  136174. #endif
  136175. #ifdef WOLFSSL_KEIL
  136176. "adcs r3, r3, %[r]\n\t"
  136177. #elif defined(__clang__)
  136178. "adcs r3, %[r]\n\t"
  136179. #else
  136180. "adc r3, %[r]\n\t"
  136181. #endif
  136182. "# A[11] * B[5]\n\t"
  136183. "mov %[a], r9\n\t"
  136184. "mov %[b], r10\n\t"
  136185. "ldr %[a], [%[a], #44]\n\t"
  136186. "ldr %[b], [%[b], #20]\n\t"
  136187. "uxth r6, %[a]\n\t"
  136188. "uxth r7, %[b]\n\t"
  136189. #ifdef WOLFSSL_KEIL
  136190. "muls r7, r6, r7\n\t"
  136191. #elif defined(__clang__)
  136192. "muls r7, r6\n\t"
  136193. #else
  136194. "mul r7, r6\n\t"
  136195. #endif
  136196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136197. "adds r4, r4, r7\n\t"
  136198. #else
  136199. "add r4, r4, r7\n\t"
  136200. #endif
  136201. #ifdef WOLFSSL_KEIL
  136202. "adcs r5, r5, %[r]\n\t"
  136203. #elif defined(__clang__)
  136204. "adcs r5, %[r]\n\t"
  136205. #else
  136206. "adc r5, %[r]\n\t"
  136207. #endif
  136208. #ifdef WOLFSSL_KEIL
  136209. "adcs r3, r3, %[r]\n\t"
  136210. #elif defined(__clang__)
  136211. "adcs r3, %[r]\n\t"
  136212. #else
  136213. "adc r3, %[r]\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 r6, r7, r6\n\t"
  136222. #elif defined(__clang__)
  136223. "muls r6, r7\n\t"
  136224. #else
  136225. "mul r6, r7\n\t"
  136226. #endif
  136227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136228. "lsrs r7, r6, #16\n\t"
  136229. #else
  136230. "lsr r7, r6, #16\n\t"
  136231. #endif
  136232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136233. "lsls r6, r6, #16\n\t"
  136234. #else
  136235. "lsl r6, r6, #16\n\t"
  136236. #endif
  136237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136238. "adds r4, r4, r6\n\t"
  136239. #else
  136240. "add r4, r4, r6\n\t"
  136241. #endif
  136242. #ifdef WOLFSSL_KEIL
  136243. "adcs r5, r5, r7\n\t"
  136244. #elif defined(__clang__)
  136245. "adcs r5, r7\n\t"
  136246. #else
  136247. "adc r5, r7\n\t"
  136248. #endif
  136249. #ifdef WOLFSSL_KEIL
  136250. "adcs r3, r3, %[r]\n\t"
  136251. #elif defined(__clang__)
  136252. "adcs r3, %[r]\n\t"
  136253. #else
  136254. "adc r3, %[r]\n\t"
  136255. #endif
  136256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136257. "lsrs r6, %[a], #16\n\t"
  136258. #else
  136259. "lsr r6, %[a], #16\n\t"
  136260. #endif
  136261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136262. "lsrs r7, %[b], #16\n\t"
  136263. #else
  136264. "lsr r7, %[b], #16\n\t"
  136265. #endif
  136266. #ifdef WOLFSSL_KEIL
  136267. "muls r7, r6, r7\n\t"
  136268. #elif defined(__clang__)
  136269. "muls r7, r6\n\t"
  136270. #else
  136271. "mul r7, r6\n\t"
  136272. #endif
  136273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136274. "adds r5, r5, r7\n\t"
  136275. #else
  136276. "add r5, r5, r7\n\t"
  136277. #endif
  136278. #ifdef WOLFSSL_KEIL
  136279. "adcs r3, r3, %[r]\n\t"
  136280. #elif defined(__clang__)
  136281. "adcs r3, %[r]\n\t"
  136282. #else
  136283. "adc r3, %[r]\n\t"
  136284. #endif
  136285. "uxth r7, %[b]\n\t"
  136286. #ifdef WOLFSSL_KEIL
  136287. "muls r6, r7, r6\n\t"
  136288. #elif defined(__clang__)
  136289. "muls r6, r7\n\t"
  136290. #else
  136291. "mul r6, r7\n\t"
  136292. #endif
  136293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136294. "lsrs r7, r6, #16\n\t"
  136295. #else
  136296. "lsr r7, r6, #16\n\t"
  136297. #endif
  136298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136299. "lsls r6, r6, #16\n\t"
  136300. #else
  136301. "lsl r6, r6, #16\n\t"
  136302. #endif
  136303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136304. "adds r4, r4, r6\n\t"
  136305. #else
  136306. "add r4, r4, r6\n\t"
  136307. #endif
  136308. #ifdef WOLFSSL_KEIL
  136309. "adcs r5, r5, r7\n\t"
  136310. #elif defined(__clang__)
  136311. "adcs r5, r7\n\t"
  136312. #else
  136313. "adc r5, r7\n\t"
  136314. #endif
  136315. #ifdef WOLFSSL_KEIL
  136316. "adcs r3, r3, %[r]\n\t"
  136317. #elif defined(__clang__)
  136318. "adcs r3, %[r]\n\t"
  136319. #else
  136320. "adc r3, %[r]\n\t"
  136321. #endif
  136322. "# A[10] * B[6]\n\t"
  136323. "mov %[a], r9\n\t"
  136324. "mov %[b], r10\n\t"
  136325. "ldr %[a], [%[a], #40]\n\t"
  136326. "ldr %[b], [%[b], #24]\n\t"
  136327. "uxth r6, %[a]\n\t"
  136328. "uxth r7, %[b]\n\t"
  136329. #ifdef WOLFSSL_KEIL
  136330. "muls r7, r6, r7\n\t"
  136331. #elif defined(__clang__)
  136332. "muls r7, r6\n\t"
  136333. #else
  136334. "mul r7, r6\n\t"
  136335. #endif
  136336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136337. "adds r4, r4, r7\n\t"
  136338. #else
  136339. "add r4, r4, r7\n\t"
  136340. #endif
  136341. #ifdef WOLFSSL_KEIL
  136342. "adcs r5, r5, %[r]\n\t"
  136343. #elif defined(__clang__)
  136344. "adcs r5, %[r]\n\t"
  136345. #else
  136346. "adc r5, %[r]\n\t"
  136347. #endif
  136348. #ifdef WOLFSSL_KEIL
  136349. "adcs r3, r3, %[r]\n\t"
  136350. #elif defined(__clang__)
  136351. "adcs r3, %[r]\n\t"
  136352. #else
  136353. "adc r3, %[r]\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 r6, r7, r6\n\t"
  136362. #elif defined(__clang__)
  136363. "muls r6, r7\n\t"
  136364. #else
  136365. "mul r6, r7\n\t"
  136366. #endif
  136367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136368. "lsrs r7, r6, #16\n\t"
  136369. #else
  136370. "lsr r7, r6, #16\n\t"
  136371. #endif
  136372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136373. "lsls r6, r6, #16\n\t"
  136374. #else
  136375. "lsl r6, r6, #16\n\t"
  136376. #endif
  136377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136378. "adds r4, r4, r6\n\t"
  136379. #else
  136380. "add r4, r4, r6\n\t"
  136381. #endif
  136382. #ifdef WOLFSSL_KEIL
  136383. "adcs r5, r5, r7\n\t"
  136384. #elif defined(__clang__)
  136385. "adcs r5, r7\n\t"
  136386. #else
  136387. "adc r5, r7\n\t"
  136388. #endif
  136389. #ifdef WOLFSSL_KEIL
  136390. "adcs r3, r3, %[r]\n\t"
  136391. #elif defined(__clang__)
  136392. "adcs r3, %[r]\n\t"
  136393. #else
  136394. "adc r3, %[r]\n\t"
  136395. #endif
  136396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136397. "lsrs r6, %[a], #16\n\t"
  136398. #else
  136399. "lsr r6, %[a], #16\n\t"
  136400. #endif
  136401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136402. "lsrs r7, %[b], #16\n\t"
  136403. #else
  136404. "lsr r7, %[b], #16\n\t"
  136405. #endif
  136406. #ifdef WOLFSSL_KEIL
  136407. "muls r7, r6, r7\n\t"
  136408. #elif defined(__clang__)
  136409. "muls r7, r6\n\t"
  136410. #else
  136411. "mul r7, r6\n\t"
  136412. #endif
  136413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136414. "adds r5, r5, r7\n\t"
  136415. #else
  136416. "add r5, r5, r7\n\t"
  136417. #endif
  136418. #ifdef WOLFSSL_KEIL
  136419. "adcs r3, r3, %[r]\n\t"
  136420. #elif defined(__clang__)
  136421. "adcs r3, %[r]\n\t"
  136422. #else
  136423. "adc r3, %[r]\n\t"
  136424. #endif
  136425. "uxth r7, %[b]\n\t"
  136426. #ifdef WOLFSSL_KEIL
  136427. "muls r6, r7, r6\n\t"
  136428. #elif defined(__clang__)
  136429. "muls r6, r7\n\t"
  136430. #else
  136431. "mul r6, r7\n\t"
  136432. #endif
  136433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136434. "lsrs r7, r6, #16\n\t"
  136435. #else
  136436. "lsr r7, r6, #16\n\t"
  136437. #endif
  136438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136439. "lsls r6, r6, #16\n\t"
  136440. #else
  136441. "lsl r6, r6, #16\n\t"
  136442. #endif
  136443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136444. "adds r4, r4, r6\n\t"
  136445. #else
  136446. "add r4, r4, r6\n\t"
  136447. #endif
  136448. #ifdef WOLFSSL_KEIL
  136449. "adcs r5, r5, r7\n\t"
  136450. #elif defined(__clang__)
  136451. "adcs r5, r7\n\t"
  136452. #else
  136453. "adc r5, r7\n\t"
  136454. #endif
  136455. #ifdef WOLFSSL_KEIL
  136456. "adcs r3, r3, %[r]\n\t"
  136457. #elif defined(__clang__)
  136458. "adcs r3, %[r]\n\t"
  136459. #else
  136460. "adc r3, %[r]\n\t"
  136461. #endif
  136462. "# A[9] * B[7]\n\t"
  136463. "mov %[a], r9\n\t"
  136464. "mov %[b], r10\n\t"
  136465. "ldr %[a], [%[a], #36]\n\t"
  136466. "ldr %[b], [%[b], #28]\n\t"
  136467. "uxth r6, %[a]\n\t"
  136468. "uxth r7, %[b]\n\t"
  136469. #ifdef WOLFSSL_KEIL
  136470. "muls r7, r6, r7\n\t"
  136471. #elif defined(__clang__)
  136472. "muls r7, r6\n\t"
  136473. #else
  136474. "mul r7, r6\n\t"
  136475. #endif
  136476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136477. "adds r4, r4, r7\n\t"
  136478. #else
  136479. "add r4, r4, r7\n\t"
  136480. #endif
  136481. #ifdef WOLFSSL_KEIL
  136482. "adcs r5, r5, %[r]\n\t"
  136483. #elif defined(__clang__)
  136484. "adcs r5, %[r]\n\t"
  136485. #else
  136486. "adc r5, %[r]\n\t"
  136487. #endif
  136488. #ifdef WOLFSSL_KEIL
  136489. "adcs r3, r3, %[r]\n\t"
  136490. #elif defined(__clang__)
  136491. "adcs r3, %[r]\n\t"
  136492. #else
  136493. "adc r3, %[r]\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 r6, r7, r6\n\t"
  136502. #elif defined(__clang__)
  136503. "muls r6, r7\n\t"
  136504. #else
  136505. "mul r6, r7\n\t"
  136506. #endif
  136507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136508. "lsrs r7, r6, #16\n\t"
  136509. #else
  136510. "lsr r7, r6, #16\n\t"
  136511. #endif
  136512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136513. "lsls r6, r6, #16\n\t"
  136514. #else
  136515. "lsl r6, r6, #16\n\t"
  136516. #endif
  136517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136518. "adds r4, r4, r6\n\t"
  136519. #else
  136520. "add r4, r4, r6\n\t"
  136521. #endif
  136522. #ifdef WOLFSSL_KEIL
  136523. "adcs r5, r5, r7\n\t"
  136524. #elif defined(__clang__)
  136525. "adcs r5, r7\n\t"
  136526. #else
  136527. "adc r5, r7\n\t"
  136528. #endif
  136529. #ifdef WOLFSSL_KEIL
  136530. "adcs r3, r3, %[r]\n\t"
  136531. #elif defined(__clang__)
  136532. "adcs r3, %[r]\n\t"
  136533. #else
  136534. "adc r3, %[r]\n\t"
  136535. #endif
  136536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136537. "lsrs r6, %[a], #16\n\t"
  136538. #else
  136539. "lsr r6, %[a], #16\n\t"
  136540. #endif
  136541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136542. "lsrs r7, %[b], #16\n\t"
  136543. #else
  136544. "lsr r7, %[b], #16\n\t"
  136545. #endif
  136546. #ifdef WOLFSSL_KEIL
  136547. "muls r7, r6, r7\n\t"
  136548. #elif defined(__clang__)
  136549. "muls r7, r6\n\t"
  136550. #else
  136551. "mul r7, r6\n\t"
  136552. #endif
  136553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136554. "adds r5, r5, r7\n\t"
  136555. #else
  136556. "add r5, r5, r7\n\t"
  136557. #endif
  136558. #ifdef WOLFSSL_KEIL
  136559. "adcs r3, r3, %[r]\n\t"
  136560. #elif defined(__clang__)
  136561. "adcs r3, %[r]\n\t"
  136562. #else
  136563. "adc r3, %[r]\n\t"
  136564. #endif
  136565. "uxth r7, %[b]\n\t"
  136566. #ifdef WOLFSSL_KEIL
  136567. "muls r6, r7, r6\n\t"
  136568. #elif defined(__clang__)
  136569. "muls r6, r7\n\t"
  136570. #else
  136571. "mul r6, r7\n\t"
  136572. #endif
  136573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136574. "lsrs r7, r6, #16\n\t"
  136575. #else
  136576. "lsr r7, r6, #16\n\t"
  136577. #endif
  136578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136579. "lsls r6, r6, #16\n\t"
  136580. #else
  136581. "lsl r6, r6, #16\n\t"
  136582. #endif
  136583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136584. "adds r4, r4, r6\n\t"
  136585. #else
  136586. "add r4, r4, r6\n\t"
  136587. #endif
  136588. #ifdef WOLFSSL_KEIL
  136589. "adcs r5, r5, r7\n\t"
  136590. #elif defined(__clang__)
  136591. "adcs r5, r7\n\t"
  136592. #else
  136593. "adc r5, r7\n\t"
  136594. #endif
  136595. #ifdef WOLFSSL_KEIL
  136596. "adcs r3, r3, %[r]\n\t"
  136597. #elif defined(__clang__)
  136598. "adcs r3, %[r]\n\t"
  136599. #else
  136600. "adc r3, %[r]\n\t"
  136601. #endif
  136602. "# A[8] * B[8]\n\t"
  136603. "mov %[a], r9\n\t"
  136604. "mov %[b], r10\n\t"
  136605. "ldr %[a], [%[a], #32]\n\t"
  136606. "ldr %[b], [%[b], #32]\n\t"
  136607. "uxth r6, %[a]\n\t"
  136608. "uxth r7, %[b]\n\t"
  136609. #ifdef WOLFSSL_KEIL
  136610. "muls r7, r6, r7\n\t"
  136611. #elif defined(__clang__)
  136612. "muls r7, r6\n\t"
  136613. #else
  136614. "mul r7, r6\n\t"
  136615. #endif
  136616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136617. "adds r4, r4, r7\n\t"
  136618. #else
  136619. "add r4, r4, r7\n\t"
  136620. #endif
  136621. #ifdef WOLFSSL_KEIL
  136622. "adcs r5, r5, %[r]\n\t"
  136623. #elif defined(__clang__)
  136624. "adcs r5, %[r]\n\t"
  136625. #else
  136626. "adc r5, %[r]\n\t"
  136627. #endif
  136628. #ifdef WOLFSSL_KEIL
  136629. "adcs r3, r3, %[r]\n\t"
  136630. #elif defined(__clang__)
  136631. "adcs r3, %[r]\n\t"
  136632. #else
  136633. "adc r3, %[r]\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 r6, r7, r6\n\t"
  136642. #elif defined(__clang__)
  136643. "muls r6, r7\n\t"
  136644. #else
  136645. "mul r6, r7\n\t"
  136646. #endif
  136647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136648. "lsrs r7, r6, #16\n\t"
  136649. #else
  136650. "lsr r7, r6, #16\n\t"
  136651. #endif
  136652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136653. "lsls r6, r6, #16\n\t"
  136654. #else
  136655. "lsl r6, r6, #16\n\t"
  136656. #endif
  136657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136658. "adds r4, r4, r6\n\t"
  136659. #else
  136660. "add r4, r4, r6\n\t"
  136661. #endif
  136662. #ifdef WOLFSSL_KEIL
  136663. "adcs r5, r5, r7\n\t"
  136664. #elif defined(__clang__)
  136665. "adcs r5, r7\n\t"
  136666. #else
  136667. "adc r5, r7\n\t"
  136668. #endif
  136669. #ifdef WOLFSSL_KEIL
  136670. "adcs r3, r3, %[r]\n\t"
  136671. #elif defined(__clang__)
  136672. "adcs r3, %[r]\n\t"
  136673. #else
  136674. "adc r3, %[r]\n\t"
  136675. #endif
  136676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136677. "lsrs r6, %[a], #16\n\t"
  136678. #else
  136679. "lsr r6, %[a], #16\n\t"
  136680. #endif
  136681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136682. "lsrs r7, %[b], #16\n\t"
  136683. #else
  136684. "lsr r7, %[b], #16\n\t"
  136685. #endif
  136686. #ifdef WOLFSSL_KEIL
  136687. "muls r7, r6, r7\n\t"
  136688. #elif defined(__clang__)
  136689. "muls r7, r6\n\t"
  136690. #else
  136691. "mul r7, r6\n\t"
  136692. #endif
  136693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136694. "adds r5, r5, r7\n\t"
  136695. #else
  136696. "add r5, r5, r7\n\t"
  136697. #endif
  136698. #ifdef WOLFSSL_KEIL
  136699. "adcs r3, r3, %[r]\n\t"
  136700. #elif defined(__clang__)
  136701. "adcs r3, %[r]\n\t"
  136702. #else
  136703. "adc r3, %[r]\n\t"
  136704. #endif
  136705. "uxth r7, %[b]\n\t"
  136706. #ifdef WOLFSSL_KEIL
  136707. "muls r6, r7, r6\n\t"
  136708. #elif defined(__clang__)
  136709. "muls r6, r7\n\t"
  136710. #else
  136711. "mul r6, r7\n\t"
  136712. #endif
  136713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136714. "lsrs r7, r6, #16\n\t"
  136715. #else
  136716. "lsr r7, r6, #16\n\t"
  136717. #endif
  136718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136719. "lsls r6, r6, #16\n\t"
  136720. #else
  136721. "lsl r6, r6, #16\n\t"
  136722. #endif
  136723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136724. "adds r4, r4, r6\n\t"
  136725. #else
  136726. "add r4, r4, r6\n\t"
  136727. #endif
  136728. #ifdef WOLFSSL_KEIL
  136729. "adcs r5, r5, r7\n\t"
  136730. #elif defined(__clang__)
  136731. "adcs r5, r7\n\t"
  136732. #else
  136733. "adc r5, r7\n\t"
  136734. #endif
  136735. #ifdef WOLFSSL_KEIL
  136736. "adcs r3, r3, %[r]\n\t"
  136737. #elif defined(__clang__)
  136738. "adcs r3, %[r]\n\t"
  136739. #else
  136740. "adc r3, %[r]\n\t"
  136741. #endif
  136742. "# A[7] * B[9]\n\t"
  136743. "mov %[a], r9\n\t"
  136744. "mov %[b], r10\n\t"
  136745. "ldr %[a], [%[a], #28]\n\t"
  136746. "ldr %[b], [%[b], #36]\n\t"
  136747. "uxth r6, %[a]\n\t"
  136748. "uxth r7, %[b]\n\t"
  136749. #ifdef WOLFSSL_KEIL
  136750. "muls r7, r6, r7\n\t"
  136751. #elif defined(__clang__)
  136752. "muls r7, r6\n\t"
  136753. #else
  136754. "mul r7, r6\n\t"
  136755. #endif
  136756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136757. "adds r4, r4, r7\n\t"
  136758. #else
  136759. "add r4, r4, r7\n\t"
  136760. #endif
  136761. #ifdef WOLFSSL_KEIL
  136762. "adcs r5, r5, %[r]\n\t"
  136763. #elif defined(__clang__)
  136764. "adcs r5, %[r]\n\t"
  136765. #else
  136766. "adc r5, %[r]\n\t"
  136767. #endif
  136768. #ifdef WOLFSSL_KEIL
  136769. "adcs r3, r3, %[r]\n\t"
  136770. #elif defined(__clang__)
  136771. "adcs r3, %[r]\n\t"
  136772. #else
  136773. "adc r3, %[r]\n\t"
  136774. #endif
  136775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136776. "lsrs r7, %[b], #16\n\t"
  136777. #else
  136778. "lsr r7, %[b], #16\n\t"
  136779. #endif
  136780. #ifdef WOLFSSL_KEIL
  136781. "muls r6, r7, r6\n\t"
  136782. #elif defined(__clang__)
  136783. "muls r6, r7\n\t"
  136784. #else
  136785. "mul r6, r7\n\t"
  136786. #endif
  136787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136788. "lsrs r7, r6, #16\n\t"
  136789. #else
  136790. "lsr r7, r6, #16\n\t"
  136791. #endif
  136792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136793. "lsls r6, r6, #16\n\t"
  136794. #else
  136795. "lsl r6, r6, #16\n\t"
  136796. #endif
  136797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136798. "adds r4, r4, r6\n\t"
  136799. #else
  136800. "add r4, r4, r6\n\t"
  136801. #endif
  136802. #ifdef WOLFSSL_KEIL
  136803. "adcs r5, r5, r7\n\t"
  136804. #elif defined(__clang__)
  136805. "adcs r5, r7\n\t"
  136806. #else
  136807. "adc r5, r7\n\t"
  136808. #endif
  136809. #ifdef WOLFSSL_KEIL
  136810. "adcs r3, r3, %[r]\n\t"
  136811. #elif defined(__clang__)
  136812. "adcs r3, %[r]\n\t"
  136813. #else
  136814. "adc r3, %[r]\n\t"
  136815. #endif
  136816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136817. "lsrs r6, %[a], #16\n\t"
  136818. #else
  136819. "lsr r6, %[a], #16\n\t"
  136820. #endif
  136821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136822. "lsrs r7, %[b], #16\n\t"
  136823. #else
  136824. "lsr r7, %[b], #16\n\t"
  136825. #endif
  136826. #ifdef WOLFSSL_KEIL
  136827. "muls r7, r6, r7\n\t"
  136828. #elif defined(__clang__)
  136829. "muls r7, r6\n\t"
  136830. #else
  136831. "mul r7, r6\n\t"
  136832. #endif
  136833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136834. "adds r5, r5, r7\n\t"
  136835. #else
  136836. "add r5, r5, r7\n\t"
  136837. #endif
  136838. #ifdef WOLFSSL_KEIL
  136839. "adcs r3, r3, %[r]\n\t"
  136840. #elif defined(__clang__)
  136841. "adcs r3, %[r]\n\t"
  136842. #else
  136843. "adc r3, %[r]\n\t"
  136844. #endif
  136845. "uxth r7, %[b]\n\t"
  136846. #ifdef WOLFSSL_KEIL
  136847. "muls r6, r7, r6\n\t"
  136848. #elif defined(__clang__)
  136849. "muls r6, r7\n\t"
  136850. #else
  136851. "mul r6, r7\n\t"
  136852. #endif
  136853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136854. "lsrs r7, r6, #16\n\t"
  136855. #else
  136856. "lsr r7, r6, #16\n\t"
  136857. #endif
  136858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136859. "lsls r6, r6, #16\n\t"
  136860. #else
  136861. "lsl r6, r6, #16\n\t"
  136862. #endif
  136863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136864. "adds r4, r4, r6\n\t"
  136865. #else
  136866. "add r4, r4, r6\n\t"
  136867. #endif
  136868. #ifdef WOLFSSL_KEIL
  136869. "adcs r5, r5, r7\n\t"
  136870. #elif defined(__clang__)
  136871. "adcs r5, r7\n\t"
  136872. #else
  136873. "adc r5, r7\n\t"
  136874. #endif
  136875. #ifdef WOLFSSL_KEIL
  136876. "adcs r3, r3, %[r]\n\t"
  136877. #elif defined(__clang__)
  136878. "adcs r3, %[r]\n\t"
  136879. #else
  136880. "adc r3, %[r]\n\t"
  136881. #endif
  136882. "# A[6] * B[10]\n\t"
  136883. "mov %[a], r9\n\t"
  136884. "mov %[b], r10\n\t"
  136885. "ldr %[a], [%[a], #24]\n\t"
  136886. "ldr %[b], [%[b], #40]\n\t"
  136887. "uxth r6, %[a]\n\t"
  136888. "uxth r7, %[b]\n\t"
  136889. #ifdef WOLFSSL_KEIL
  136890. "muls r7, r6, r7\n\t"
  136891. #elif defined(__clang__)
  136892. "muls r7, r6\n\t"
  136893. #else
  136894. "mul r7, r6\n\t"
  136895. #endif
  136896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136897. "adds r4, r4, r7\n\t"
  136898. #else
  136899. "add r4, r4, r7\n\t"
  136900. #endif
  136901. #ifdef WOLFSSL_KEIL
  136902. "adcs r5, r5, %[r]\n\t"
  136903. #elif defined(__clang__)
  136904. "adcs r5, %[r]\n\t"
  136905. #else
  136906. "adc r5, %[r]\n\t"
  136907. #endif
  136908. #ifdef WOLFSSL_KEIL
  136909. "adcs r3, r3, %[r]\n\t"
  136910. #elif defined(__clang__)
  136911. "adcs r3, %[r]\n\t"
  136912. #else
  136913. "adc r3, %[r]\n\t"
  136914. #endif
  136915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136916. "lsrs r7, %[b], #16\n\t"
  136917. #else
  136918. "lsr r7, %[b], #16\n\t"
  136919. #endif
  136920. #ifdef WOLFSSL_KEIL
  136921. "muls r6, r7, r6\n\t"
  136922. #elif defined(__clang__)
  136923. "muls r6, r7\n\t"
  136924. #else
  136925. "mul r6, r7\n\t"
  136926. #endif
  136927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136928. "lsrs r7, r6, #16\n\t"
  136929. #else
  136930. "lsr r7, r6, #16\n\t"
  136931. #endif
  136932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136933. "lsls r6, r6, #16\n\t"
  136934. #else
  136935. "lsl r6, r6, #16\n\t"
  136936. #endif
  136937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136938. "adds r4, r4, r6\n\t"
  136939. #else
  136940. "add r4, r4, r6\n\t"
  136941. #endif
  136942. #ifdef WOLFSSL_KEIL
  136943. "adcs r5, r5, r7\n\t"
  136944. #elif defined(__clang__)
  136945. "adcs r5, r7\n\t"
  136946. #else
  136947. "adc r5, r7\n\t"
  136948. #endif
  136949. #ifdef WOLFSSL_KEIL
  136950. "adcs r3, r3, %[r]\n\t"
  136951. #elif defined(__clang__)
  136952. "adcs r3, %[r]\n\t"
  136953. #else
  136954. "adc r3, %[r]\n\t"
  136955. #endif
  136956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136957. "lsrs r6, %[a], #16\n\t"
  136958. #else
  136959. "lsr r6, %[a], #16\n\t"
  136960. #endif
  136961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136962. "lsrs r7, %[b], #16\n\t"
  136963. #else
  136964. "lsr r7, %[b], #16\n\t"
  136965. #endif
  136966. #ifdef WOLFSSL_KEIL
  136967. "muls r7, r6, r7\n\t"
  136968. #elif defined(__clang__)
  136969. "muls r7, r6\n\t"
  136970. #else
  136971. "mul r7, r6\n\t"
  136972. #endif
  136973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136974. "adds r5, r5, r7\n\t"
  136975. #else
  136976. "add r5, r5, r7\n\t"
  136977. #endif
  136978. #ifdef WOLFSSL_KEIL
  136979. "adcs r3, r3, %[r]\n\t"
  136980. #elif defined(__clang__)
  136981. "adcs r3, %[r]\n\t"
  136982. #else
  136983. "adc r3, %[r]\n\t"
  136984. #endif
  136985. "uxth r7, %[b]\n\t"
  136986. #ifdef WOLFSSL_KEIL
  136987. "muls r6, r7, r6\n\t"
  136988. #elif defined(__clang__)
  136989. "muls r6, r7\n\t"
  136990. #else
  136991. "mul r6, r7\n\t"
  136992. #endif
  136993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136994. "lsrs r7, r6, #16\n\t"
  136995. #else
  136996. "lsr r7, r6, #16\n\t"
  136997. #endif
  136998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136999. "lsls r6, r6, #16\n\t"
  137000. #else
  137001. "lsl r6, r6, #16\n\t"
  137002. #endif
  137003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137004. "adds r4, r4, r6\n\t"
  137005. #else
  137006. "add r4, r4, r6\n\t"
  137007. #endif
  137008. #ifdef WOLFSSL_KEIL
  137009. "adcs r5, r5, r7\n\t"
  137010. #elif defined(__clang__)
  137011. "adcs r5, r7\n\t"
  137012. #else
  137013. "adc r5, r7\n\t"
  137014. #endif
  137015. #ifdef WOLFSSL_KEIL
  137016. "adcs r3, r3, %[r]\n\t"
  137017. #elif defined(__clang__)
  137018. "adcs r3, %[r]\n\t"
  137019. #else
  137020. "adc r3, %[r]\n\t"
  137021. #endif
  137022. "# A[5] * B[11]\n\t"
  137023. "mov %[a], r9\n\t"
  137024. "mov %[b], r10\n\t"
  137025. "ldr %[a], [%[a], #20]\n\t"
  137026. "ldr %[b], [%[b], #44]\n\t"
  137027. "uxth r6, %[a]\n\t"
  137028. "uxth r7, %[b]\n\t"
  137029. #ifdef WOLFSSL_KEIL
  137030. "muls r7, r6, r7\n\t"
  137031. #elif defined(__clang__)
  137032. "muls r7, r6\n\t"
  137033. #else
  137034. "mul r7, r6\n\t"
  137035. #endif
  137036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137037. "adds r4, r4, r7\n\t"
  137038. #else
  137039. "add r4, r4, r7\n\t"
  137040. #endif
  137041. #ifdef WOLFSSL_KEIL
  137042. "adcs r5, r5, %[r]\n\t"
  137043. #elif defined(__clang__)
  137044. "adcs r5, %[r]\n\t"
  137045. #else
  137046. "adc r5, %[r]\n\t"
  137047. #endif
  137048. #ifdef WOLFSSL_KEIL
  137049. "adcs r3, r3, %[r]\n\t"
  137050. #elif defined(__clang__)
  137051. "adcs r3, %[r]\n\t"
  137052. #else
  137053. "adc r3, %[r]\n\t"
  137054. #endif
  137055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137056. "lsrs r7, %[b], #16\n\t"
  137057. #else
  137058. "lsr r7, %[b], #16\n\t"
  137059. #endif
  137060. #ifdef WOLFSSL_KEIL
  137061. "muls r6, r7, r6\n\t"
  137062. #elif defined(__clang__)
  137063. "muls r6, r7\n\t"
  137064. #else
  137065. "mul r6, r7\n\t"
  137066. #endif
  137067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137068. "lsrs r7, r6, #16\n\t"
  137069. #else
  137070. "lsr r7, r6, #16\n\t"
  137071. #endif
  137072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137073. "lsls r6, r6, #16\n\t"
  137074. #else
  137075. "lsl r6, r6, #16\n\t"
  137076. #endif
  137077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137078. "adds r4, r4, r6\n\t"
  137079. #else
  137080. "add r4, r4, r6\n\t"
  137081. #endif
  137082. #ifdef WOLFSSL_KEIL
  137083. "adcs r5, r5, r7\n\t"
  137084. #elif defined(__clang__)
  137085. "adcs r5, r7\n\t"
  137086. #else
  137087. "adc r5, r7\n\t"
  137088. #endif
  137089. #ifdef WOLFSSL_KEIL
  137090. "adcs r3, r3, %[r]\n\t"
  137091. #elif defined(__clang__)
  137092. "adcs r3, %[r]\n\t"
  137093. #else
  137094. "adc r3, %[r]\n\t"
  137095. #endif
  137096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137097. "lsrs r6, %[a], #16\n\t"
  137098. #else
  137099. "lsr r6, %[a], #16\n\t"
  137100. #endif
  137101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137102. "lsrs r7, %[b], #16\n\t"
  137103. #else
  137104. "lsr r7, %[b], #16\n\t"
  137105. #endif
  137106. #ifdef WOLFSSL_KEIL
  137107. "muls r7, r6, r7\n\t"
  137108. #elif defined(__clang__)
  137109. "muls r7, r6\n\t"
  137110. #else
  137111. "mul r7, r6\n\t"
  137112. #endif
  137113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137114. "adds r5, r5, r7\n\t"
  137115. #else
  137116. "add r5, r5, r7\n\t"
  137117. #endif
  137118. #ifdef WOLFSSL_KEIL
  137119. "adcs r3, r3, %[r]\n\t"
  137120. #elif defined(__clang__)
  137121. "adcs r3, %[r]\n\t"
  137122. #else
  137123. "adc r3, %[r]\n\t"
  137124. #endif
  137125. "uxth r7, %[b]\n\t"
  137126. #ifdef WOLFSSL_KEIL
  137127. "muls r6, r7, r6\n\t"
  137128. #elif defined(__clang__)
  137129. "muls r6, r7\n\t"
  137130. #else
  137131. "mul r6, r7\n\t"
  137132. #endif
  137133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137134. "lsrs r7, r6, #16\n\t"
  137135. #else
  137136. "lsr r7, r6, #16\n\t"
  137137. #endif
  137138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137139. "lsls r6, r6, #16\n\t"
  137140. #else
  137141. "lsl r6, r6, #16\n\t"
  137142. #endif
  137143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137144. "adds r4, r4, r6\n\t"
  137145. #else
  137146. "add r4, r4, r6\n\t"
  137147. #endif
  137148. #ifdef WOLFSSL_KEIL
  137149. "adcs r5, r5, r7\n\t"
  137150. #elif defined(__clang__)
  137151. "adcs r5, r7\n\t"
  137152. #else
  137153. "adc r5, r7\n\t"
  137154. #endif
  137155. #ifdef WOLFSSL_KEIL
  137156. "adcs r3, r3, %[r]\n\t"
  137157. #elif defined(__clang__)
  137158. "adcs r3, %[r]\n\t"
  137159. #else
  137160. "adc r3, %[r]\n\t"
  137161. #endif
  137162. "# A[4] * B[12]\n\t"
  137163. "mov %[a], r9\n\t"
  137164. "mov %[b], r10\n\t"
  137165. "ldr %[a], [%[a], #16]\n\t"
  137166. "ldr %[b], [%[b], #48]\n\t"
  137167. "uxth r6, %[a]\n\t"
  137168. "uxth r7, %[b]\n\t"
  137169. #ifdef WOLFSSL_KEIL
  137170. "muls r7, r6, r7\n\t"
  137171. #elif defined(__clang__)
  137172. "muls r7, r6\n\t"
  137173. #else
  137174. "mul r7, r6\n\t"
  137175. #endif
  137176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137177. "adds r4, r4, r7\n\t"
  137178. #else
  137179. "add r4, r4, r7\n\t"
  137180. #endif
  137181. #ifdef WOLFSSL_KEIL
  137182. "adcs r5, r5, %[r]\n\t"
  137183. #elif defined(__clang__)
  137184. "adcs r5, %[r]\n\t"
  137185. #else
  137186. "adc r5, %[r]\n\t"
  137187. #endif
  137188. #ifdef WOLFSSL_KEIL
  137189. "adcs r3, r3, %[r]\n\t"
  137190. #elif defined(__clang__)
  137191. "adcs r3, %[r]\n\t"
  137192. #else
  137193. "adc r3, %[r]\n\t"
  137194. #endif
  137195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137196. "lsrs r7, %[b], #16\n\t"
  137197. #else
  137198. "lsr r7, %[b], #16\n\t"
  137199. #endif
  137200. #ifdef WOLFSSL_KEIL
  137201. "muls r6, r7, r6\n\t"
  137202. #elif defined(__clang__)
  137203. "muls r6, r7\n\t"
  137204. #else
  137205. "mul r6, r7\n\t"
  137206. #endif
  137207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137208. "lsrs r7, r6, #16\n\t"
  137209. #else
  137210. "lsr r7, r6, #16\n\t"
  137211. #endif
  137212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137213. "lsls r6, r6, #16\n\t"
  137214. #else
  137215. "lsl r6, r6, #16\n\t"
  137216. #endif
  137217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137218. "adds r4, r4, r6\n\t"
  137219. #else
  137220. "add r4, r4, r6\n\t"
  137221. #endif
  137222. #ifdef WOLFSSL_KEIL
  137223. "adcs r5, r5, r7\n\t"
  137224. #elif defined(__clang__)
  137225. "adcs r5, r7\n\t"
  137226. #else
  137227. "adc r5, r7\n\t"
  137228. #endif
  137229. #ifdef WOLFSSL_KEIL
  137230. "adcs r3, r3, %[r]\n\t"
  137231. #elif defined(__clang__)
  137232. "adcs r3, %[r]\n\t"
  137233. #else
  137234. "adc r3, %[r]\n\t"
  137235. #endif
  137236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137237. "lsrs r6, %[a], #16\n\t"
  137238. #else
  137239. "lsr r6, %[a], #16\n\t"
  137240. #endif
  137241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137242. "lsrs r7, %[b], #16\n\t"
  137243. #else
  137244. "lsr r7, %[b], #16\n\t"
  137245. #endif
  137246. #ifdef WOLFSSL_KEIL
  137247. "muls r7, r6, r7\n\t"
  137248. #elif defined(__clang__)
  137249. "muls r7, r6\n\t"
  137250. #else
  137251. "mul r7, r6\n\t"
  137252. #endif
  137253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137254. "adds r5, r5, r7\n\t"
  137255. #else
  137256. "add r5, r5, r7\n\t"
  137257. #endif
  137258. #ifdef WOLFSSL_KEIL
  137259. "adcs r3, r3, %[r]\n\t"
  137260. #elif defined(__clang__)
  137261. "adcs r3, %[r]\n\t"
  137262. #else
  137263. "adc r3, %[r]\n\t"
  137264. #endif
  137265. "uxth r7, %[b]\n\t"
  137266. #ifdef WOLFSSL_KEIL
  137267. "muls r6, r7, r6\n\t"
  137268. #elif defined(__clang__)
  137269. "muls r6, r7\n\t"
  137270. #else
  137271. "mul r6, r7\n\t"
  137272. #endif
  137273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137274. "lsrs r7, r6, #16\n\t"
  137275. #else
  137276. "lsr r7, r6, #16\n\t"
  137277. #endif
  137278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137279. "lsls r6, r6, #16\n\t"
  137280. #else
  137281. "lsl r6, r6, #16\n\t"
  137282. #endif
  137283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137284. "adds r4, r4, r6\n\t"
  137285. #else
  137286. "add r4, r4, r6\n\t"
  137287. #endif
  137288. #ifdef WOLFSSL_KEIL
  137289. "adcs r5, r5, r7\n\t"
  137290. #elif defined(__clang__)
  137291. "adcs r5, r7\n\t"
  137292. #else
  137293. "adc r5, r7\n\t"
  137294. #endif
  137295. #ifdef WOLFSSL_KEIL
  137296. "adcs r3, r3, %[r]\n\t"
  137297. #elif defined(__clang__)
  137298. "adcs r3, %[r]\n\t"
  137299. #else
  137300. "adc r3, %[r]\n\t"
  137301. #endif
  137302. "# A[3] * B[13]\n\t"
  137303. "mov %[a], r9\n\t"
  137304. "mov %[b], r10\n\t"
  137305. "ldr %[a], [%[a], #12]\n\t"
  137306. "ldr %[b], [%[b], #52]\n\t"
  137307. "uxth r6, %[a]\n\t"
  137308. "uxth r7, %[b]\n\t"
  137309. #ifdef WOLFSSL_KEIL
  137310. "muls r7, r6, r7\n\t"
  137311. #elif defined(__clang__)
  137312. "muls r7, r6\n\t"
  137313. #else
  137314. "mul r7, r6\n\t"
  137315. #endif
  137316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137317. "adds r4, r4, r7\n\t"
  137318. #else
  137319. "add r4, r4, r7\n\t"
  137320. #endif
  137321. #ifdef WOLFSSL_KEIL
  137322. "adcs r5, r5, %[r]\n\t"
  137323. #elif defined(__clang__)
  137324. "adcs r5, %[r]\n\t"
  137325. #else
  137326. "adc r5, %[r]\n\t"
  137327. #endif
  137328. #ifdef WOLFSSL_KEIL
  137329. "adcs r3, r3, %[r]\n\t"
  137330. #elif defined(__clang__)
  137331. "adcs r3, %[r]\n\t"
  137332. #else
  137333. "adc r3, %[r]\n\t"
  137334. #endif
  137335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137336. "lsrs r7, %[b], #16\n\t"
  137337. #else
  137338. "lsr r7, %[b], #16\n\t"
  137339. #endif
  137340. #ifdef WOLFSSL_KEIL
  137341. "muls r6, r7, r6\n\t"
  137342. #elif defined(__clang__)
  137343. "muls r6, r7\n\t"
  137344. #else
  137345. "mul r6, r7\n\t"
  137346. #endif
  137347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137348. "lsrs r7, r6, #16\n\t"
  137349. #else
  137350. "lsr r7, r6, #16\n\t"
  137351. #endif
  137352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137353. "lsls r6, r6, #16\n\t"
  137354. #else
  137355. "lsl r6, r6, #16\n\t"
  137356. #endif
  137357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137358. "adds r4, r4, r6\n\t"
  137359. #else
  137360. "add r4, r4, r6\n\t"
  137361. #endif
  137362. #ifdef WOLFSSL_KEIL
  137363. "adcs r5, r5, r7\n\t"
  137364. #elif defined(__clang__)
  137365. "adcs r5, r7\n\t"
  137366. #else
  137367. "adc r5, r7\n\t"
  137368. #endif
  137369. #ifdef WOLFSSL_KEIL
  137370. "adcs r3, r3, %[r]\n\t"
  137371. #elif defined(__clang__)
  137372. "adcs r3, %[r]\n\t"
  137373. #else
  137374. "adc r3, %[r]\n\t"
  137375. #endif
  137376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137377. "lsrs r6, %[a], #16\n\t"
  137378. #else
  137379. "lsr r6, %[a], #16\n\t"
  137380. #endif
  137381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137382. "lsrs r7, %[b], #16\n\t"
  137383. #else
  137384. "lsr r7, %[b], #16\n\t"
  137385. #endif
  137386. #ifdef WOLFSSL_KEIL
  137387. "muls r7, r6, r7\n\t"
  137388. #elif defined(__clang__)
  137389. "muls r7, r6\n\t"
  137390. #else
  137391. "mul r7, r6\n\t"
  137392. #endif
  137393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137394. "adds r5, r5, r7\n\t"
  137395. #else
  137396. "add r5, r5, r7\n\t"
  137397. #endif
  137398. #ifdef WOLFSSL_KEIL
  137399. "adcs r3, r3, %[r]\n\t"
  137400. #elif defined(__clang__)
  137401. "adcs r3, %[r]\n\t"
  137402. #else
  137403. "adc r3, %[r]\n\t"
  137404. #endif
  137405. "uxth r7, %[b]\n\t"
  137406. #ifdef WOLFSSL_KEIL
  137407. "muls r6, r7, r6\n\t"
  137408. #elif defined(__clang__)
  137409. "muls r6, r7\n\t"
  137410. #else
  137411. "mul r6, r7\n\t"
  137412. #endif
  137413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137414. "lsrs r7, r6, #16\n\t"
  137415. #else
  137416. "lsr r7, r6, #16\n\t"
  137417. #endif
  137418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137419. "lsls r6, r6, #16\n\t"
  137420. #else
  137421. "lsl r6, r6, #16\n\t"
  137422. #endif
  137423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137424. "adds r4, r4, r6\n\t"
  137425. #else
  137426. "add r4, r4, r6\n\t"
  137427. #endif
  137428. #ifdef WOLFSSL_KEIL
  137429. "adcs r5, r5, r7\n\t"
  137430. #elif defined(__clang__)
  137431. "adcs r5, r7\n\t"
  137432. #else
  137433. "adc r5, r7\n\t"
  137434. #endif
  137435. #ifdef WOLFSSL_KEIL
  137436. "adcs r3, r3, %[r]\n\t"
  137437. #elif defined(__clang__)
  137438. "adcs r3, %[r]\n\t"
  137439. #else
  137440. "adc r3, %[r]\n\t"
  137441. #endif
  137442. "# A[2] * B[14]\n\t"
  137443. "mov %[a], r9\n\t"
  137444. "mov %[b], r10\n\t"
  137445. "ldr %[a], [%[a], #8]\n\t"
  137446. "ldr %[b], [%[b], #56]\n\t"
  137447. "uxth r6, %[a]\n\t"
  137448. "uxth r7, %[b]\n\t"
  137449. #ifdef WOLFSSL_KEIL
  137450. "muls r7, r6, r7\n\t"
  137451. #elif defined(__clang__)
  137452. "muls r7, r6\n\t"
  137453. #else
  137454. "mul r7, r6\n\t"
  137455. #endif
  137456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137457. "adds r4, r4, r7\n\t"
  137458. #else
  137459. "add r4, r4, r7\n\t"
  137460. #endif
  137461. #ifdef WOLFSSL_KEIL
  137462. "adcs r5, r5, %[r]\n\t"
  137463. #elif defined(__clang__)
  137464. "adcs r5, %[r]\n\t"
  137465. #else
  137466. "adc r5, %[r]\n\t"
  137467. #endif
  137468. #ifdef WOLFSSL_KEIL
  137469. "adcs r3, r3, %[r]\n\t"
  137470. #elif defined(__clang__)
  137471. "adcs r3, %[r]\n\t"
  137472. #else
  137473. "adc r3, %[r]\n\t"
  137474. #endif
  137475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137476. "lsrs r7, %[b], #16\n\t"
  137477. #else
  137478. "lsr r7, %[b], #16\n\t"
  137479. #endif
  137480. #ifdef WOLFSSL_KEIL
  137481. "muls r6, r7, r6\n\t"
  137482. #elif defined(__clang__)
  137483. "muls r6, r7\n\t"
  137484. #else
  137485. "mul r6, r7\n\t"
  137486. #endif
  137487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137488. "lsrs r7, r6, #16\n\t"
  137489. #else
  137490. "lsr r7, r6, #16\n\t"
  137491. #endif
  137492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137493. "lsls r6, r6, #16\n\t"
  137494. #else
  137495. "lsl r6, r6, #16\n\t"
  137496. #endif
  137497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137498. "adds r4, r4, r6\n\t"
  137499. #else
  137500. "add r4, r4, r6\n\t"
  137501. #endif
  137502. #ifdef WOLFSSL_KEIL
  137503. "adcs r5, r5, r7\n\t"
  137504. #elif defined(__clang__)
  137505. "adcs r5, r7\n\t"
  137506. #else
  137507. "adc r5, r7\n\t"
  137508. #endif
  137509. #ifdef WOLFSSL_KEIL
  137510. "adcs r3, r3, %[r]\n\t"
  137511. #elif defined(__clang__)
  137512. "adcs r3, %[r]\n\t"
  137513. #else
  137514. "adc r3, %[r]\n\t"
  137515. #endif
  137516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137517. "lsrs r6, %[a], #16\n\t"
  137518. #else
  137519. "lsr r6, %[a], #16\n\t"
  137520. #endif
  137521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137522. "lsrs r7, %[b], #16\n\t"
  137523. #else
  137524. "lsr r7, %[b], #16\n\t"
  137525. #endif
  137526. #ifdef WOLFSSL_KEIL
  137527. "muls r7, r6, r7\n\t"
  137528. #elif defined(__clang__)
  137529. "muls r7, r6\n\t"
  137530. #else
  137531. "mul r7, r6\n\t"
  137532. #endif
  137533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137534. "adds r5, r5, r7\n\t"
  137535. #else
  137536. "add r5, r5, r7\n\t"
  137537. #endif
  137538. #ifdef WOLFSSL_KEIL
  137539. "adcs r3, r3, %[r]\n\t"
  137540. #elif defined(__clang__)
  137541. "adcs r3, %[r]\n\t"
  137542. #else
  137543. "adc r3, %[r]\n\t"
  137544. #endif
  137545. "uxth r7, %[b]\n\t"
  137546. #ifdef WOLFSSL_KEIL
  137547. "muls r6, r7, r6\n\t"
  137548. #elif defined(__clang__)
  137549. "muls r6, r7\n\t"
  137550. #else
  137551. "mul r6, r7\n\t"
  137552. #endif
  137553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137554. "lsrs r7, r6, #16\n\t"
  137555. #else
  137556. "lsr r7, r6, #16\n\t"
  137557. #endif
  137558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137559. "lsls r6, r6, #16\n\t"
  137560. #else
  137561. "lsl r6, r6, #16\n\t"
  137562. #endif
  137563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137564. "adds r4, r4, r6\n\t"
  137565. #else
  137566. "add r4, r4, r6\n\t"
  137567. #endif
  137568. #ifdef WOLFSSL_KEIL
  137569. "adcs r5, r5, r7\n\t"
  137570. #elif defined(__clang__)
  137571. "adcs r5, r7\n\t"
  137572. #else
  137573. "adc r5, r7\n\t"
  137574. #endif
  137575. #ifdef WOLFSSL_KEIL
  137576. "adcs r3, r3, %[r]\n\t"
  137577. #elif defined(__clang__)
  137578. "adcs r3, %[r]\n\t"
  137579. #else
  137580. "adc r3, %[r]\n\t"
  137581. #endif
  137582. "# A[1] * B[15]\n\t"
  137583. "mov %[a], r9\n\t"
  137584. "mov %[b], r10\n\t"
  137585. "ldr %[a], [%[a], #4]\n\t"
  137586. "ldr %[b], [%[b], #60]\n\t"
  137587. "uxth r6, %[a]\n\t"
  137588. "uxth r7, %[b]\n\t"
  137589. #ifdef WOLFSSL_KEIL
  137590. "muls r7, r6, r7\n\t"
  137591. #elif defined(__clang__)
  137592. "muls r7, r6\n\t"
  137593. #else
  137594. "mul r7, r6\n\t"
  137595. #endif
  137596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137597. "adds r4, r4, r7\n\t"
  137598. #else
  137599. "add r4, r4, r7\n\t"
  137600. #endif
  137601. #ifdef WOLFSSL_KEIL
  137602. "adcs r5, r5, %[r]\n\t"
  137603. #elif defined(__clang__)
  137604. "adcs r5, %[r]\n\t"
  137605. #else
  137606. "adc r5, %[r]\n\t"
  137607. #endif
  137608. #ifdef WOLFSSL_KEIL
  137609. "adcs r3, r3, %[r]\n\t"
  137610. #elif defined(__clang__)
  137611. "adcs r3, %[r]\n\t"
  137612. #else
  137613. "adc r3, %[r]\n\t"
  137614. #endif
  137615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137616. "lsrs r7, %[b], #16\n\t"
  137617. #else
  137618. "lsr r7, %[b], #16\n\t"
  137619. #endif
  137620. #ifdef WOLFSSL_KEIL
  137621. "muls r6, r7, r6\n\t"
  137622. #elif defined(__clang__)
  137623. "muls r6, r7\n\t"
  137624. #else
  137625. "mul r6, r7\n\t"
  137626. #endif
  137627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137628. "lsrs r7, r6, #16\n\t"
  137629. #else
  137630. "lsr r7, r6, #16\n\t"
  137631. #endif
  137632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137633. "lsls r6, r6, #16\n\t"
  137634. #else
  137635. "lsl r6, r6, #16\n\t"
  137636. #endif
  137637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137638. "adds r4, r4, r6\n\t"
  137639. #else
  137640. "add r4, r4, r6\n\t"
  137641. #endif
  137642. #ifdef WOLFSSL_KEIL
  137643. "adcs r5, r5, r7\n\t"
  137644. #elif defined(__clang__)
  137645. "adcs r5, r7\n\t"
  137646. #else
  137647. "adc r5, r7\n\t"
  137648. #endif
  137649. #ifdef WOLFSSL_KEIL
  137650. "adcs r3, r3, %[r]\n\t"
  137651. #elif defined(__clang__)
  137652. "adcs r3, %[r]\n\t"
  137653. #else
  137654. "adc r3, %[r]\n\t"
  137655. #endif
  137656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137657. "lsrs r6, %[a], #16\n\t"
  137658. #else
  137659. "lsr r6, %[a], #16\n\t"
  137660. #endif
  137661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137662. "lsrs r7, %[b], #16\n\t"
  137663. #else
  137664. "lsr r7, %[b], #16\n\t"
  137665. #endif
  137666. #ifdef WOLFSSL_KEIL
  137667. "muls r7, r6, r7\n\t"
  137668. #elif defined(__clang__)
  137669. "muls r7, r6\n\t"
  137670. #else
  137671. "mul r7, r6\n\t"
  137672. #endif
  137673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137674. "adds r5, r5, r7\n\t"
  137675. #else
  137676. "add r5, r5, r7\n\t"
  137677. #endif
  137678. #ifdef WOLFSSL_KEIL
  137679. "adcs r3, r3, %[r]\n\t"
  137680. #elif defined(__clang__)
  137681. "adcs r3, %[r]\n\t"
  137682. #else
  137683. "adc r3, %[r]\n\t"
  137684. #endif
  137685. "uxth r7, %[b]\n\t"
  137686. #ifdef WOLFSSL_KEIL
  137687. "muls r6, r7, r6\n\t"
  137688. #elif defined(__clang__)
  137689. "muls r6, r7\n\t"
  137690. #else
  137691. "mul r6, r7\n\t"
  137692. #endif
  137693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137694. "lsrs r7, r6, #16\n\t"
  137695. #else
  137696. "lsr r7, r6, #16\n\t"
  137697. #endif
  137698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137699. "lsls r6, r6, #16\n\t"
  137700. #else
  137701. "lsl r6, r6, #16\n\t"
  137702. #endif
  137703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137704. "adds r4, r4, r6\n\t"
  137705. #else
  137706. "add r4, r4, r6\n\t"
  137707. #endif
  137708. #ifdef WOLFSSL_KEIL
  137709. "adcs r5, r5, r7\n\t"
  137710. #elif defined(__clang__)
  137711. "adcs r5, r7\n\t"
  137712. #else
  137713. "adc r5, r7\n\t"
  137714. #endif
  137715. #ifdef WOLFSSL_KEIL
  137716. "adcs r3, r3, %[r]\n\t"
  137717. #elif defined(__clang__)
  137718. "adcs r3, %[r]\n\t"
  137719. #else
  137720. "adc r3, %[r]\n\t"
  137721. #endif
  137722. "mov %[r], r8\n\t"
  137723. "str r4, [%[r], #64]\n\t"
  137724. "movs %[r], #0\n\t"
  137725. "# A[2] * B[15]\n\t"
  137726. "movs r4, #0\n\t"
  137727. "mov %[a], r9\n\t"
  137728. "mov %[b], r10\n\t"
  137729. "ldr %[a], [%[a], #8]\n\t"
  137730. "ldr %[b], [%[b], #60]\n\t"
  137731. "uxth r6, %[a]\n\t"
  137732. "uxth r7, %[b]\n\t"
  137733. #ifdef WOLFSSL_KEIL
  137734. "muls r7, r6, r7\n\t"
  137735. #elif defined(__clang__)
  137736. "muls r7, r6\n\t"
  137737. #else
  137738. "mul r7, r6\n\t"
  137739. #endif
  137740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137741. "adds r5, r5, r7\n\t"
  137742. #else
  137743. "add r5, r5, r7\n\t"
  137744. #endif
  137745. #ifdef WOLFSSL_KEIL
  137746. "adcs r3, r3, %[r]\n\t"
  137747. #elif defined(__clang__)
  137748. "adcs r3, %[r]\n\t"
  137749. #else
  137750. "adc r3, %[r]\n\t"
  137751. #endif
  137752. #ifdef WOLFSSL_KEIL
  137753. "adcs r4, r4, %[r]\n\t"
  137754. #elif defined(__clang__)
  137755. "adcs r4, %[r]\n\t"
  137756. #else
  137757. "adc r4, %[r]\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 r6, r7, r6\n\t"
  137766. #elif defined(__clang__)
  137767. "muls r6, r7\n\t"
  137768. #else
  137769. "mul r6, r7\n\t"
  137770. #endif
  137771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137772. "lsrs r7, r6, #16\n\t"
  137773. #else
  137774. "lsr r7, r6, #16\n\t"
  137775. #endif
  137776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137777. "lsls r6, r6, #16\n\t"
  137778. #else
  137779. "lsl r6, r6, #16\n\t"
  137780. #endif
  137781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137782. "adds r5, r5, r6\n\t"
  137783. #else
  137784. "add r5, r5, r6\n\t"
  137785. #endif
  137786. #ifdef WOLFSSL_KEIL
  137787. "adcs r3, r3, r7\n\t"
  137788. #elif defined(__clang__)
  137789. "adcs r3, r7\n\t"
  137790. #else
  137791. "adc r3, r7\n\t"
  137792. #endif
  137793. #ifdef WOLFSSL_KEIL
  137794. "adcs r4, r4, %[r]\n\t"
  137795. #elif defined(__clang__)
  137796. "adcs r4, %[r]\n\t"
  137797. #else
  137798. "adc r4, %[r]\n\t"
  137799. #endif
  137800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137801. "lsrs r6, %[a], #16\n\t"
  137802. #else
  137803. "lsr r6, %[a], #16\n\t"
  137804. #endif
  137805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137806. "lsrs r7, %[b], #16\n\t"
  137807. #else
  137808. "lsr r7, %[b], #16\n\t"
  137809. #endif
  137810. #ifdef WOLFSSL_KEIL
  137811. "muls r7, r6, r7\n\t"
  137812. #elif defined(__clang__)
  137813. "muls r7, r6\n\t"
  137814. #else
  137815. "mul r7, r6\n\t"
  137816. #endif
  137817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137818. "adds r3, r3, r7\n\t"
  137819. #else
  137820. "add r3, r3, r7\n\t"
  137821. #endif
  137822. #ifdef WOLFSSL_KEIL
  137823. "adcs r4, r4, %[r]\n\t"
  137824. #elif defined(__clang__)
  137825. "adcs r4, %[r]\n\t"
  137826. #else
  137827. "adc r4, %[r]\n\t"
  137828. #endif
  137829. "uxth r7, %[b]\n\t"
  137830. #ifdef WOLFSSL_KEIL
  137831. "muls r6, r7, r6\n\t"
  137832. #elif defined(__clang__)
  137833. "muls r6, r7\n\t"
  137834. #else
  137835. "mul r6, r7\n\t"
  137836. #endif
  137837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137838. "lsrs r7, r6, #16\n\t"
  137839. #else
  137840. "lsr r7, r6, #16\n\t"
  137841. #endif
  137842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137843. "lsls r6, r6, #16\n\t"
  137844. #else
  137845. "lsl r6, r6, #16\n\t"
  137846. #endif
  137847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137848. "adds r5, r5, r6\n\t"
  137849. #else
  137850. "add r5, r5, r6\n\t"
  137851. #endif
  137852. #ifdef WOLFSSL_KEIL
  137853. "adcs r3, r3, r7\n\t"
  137854. #elif defined(__clang__)
  137855. "adcs r3, r7\n\t"
  137856. #else
  137857. "adc r3, r7\n\t"
  137858. #endif
  137859. #ifdef WOLFSSL_KEIL
  137860. "adcs r4, r4, %[r]\n\t"
  137861. #elif defined(__clang__)
  137862. "adcs r4, %[r]\n\t"
  137863. #else
  137864. "adc r4, %[r]\n\t"
  137865. #endif
  137866. "# A[3] * B[14]\n\t"
  137867. "mov %[a], r9\n\t"
  137868. "mov %[b], r10\n\t"
  137869. "ldr %[a], [%[a], #12]\n\t"
  137870. "ldr %[b], [%[b], #56]\n\t"
  137871. "uxth r6, %[a]\n\t"
  137872. "uxth r7, %[b]\n\t"
  137873. #ifdef WOLFSSL_KEIL
  137874. "muls r7, r6, r7\n\t"
  137875. #elif defined(__clang__)
  137876. "muls r7, r6\n\t"
  137877. #else
  137878. "mul r7, r6\n\t"
  137879. #endif
  137880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137881. "adds r5, r5, r7\n\t"
  137882. #else
  137883. "add r5, r5, r7\n\t"
  137884. #endif
  137885. #ifdef WOLFSSL_KEIL
  137886. "adcs r3, r3, %[r]\n\t"
  137887. #elif defined(__clang__)
  137888. "adcs r3, %[r]\n\t"
  137889. #else
  137890. "adc r3, %[r]\n\t"
  137891. #endif
  137892. #ifdef WOLFSSL_KEIL
  137893. "adcs r4, r4, %[r]\n\t"
  137894. #elif defined(__clang__)
  137895. "adcs r4, %[r]\n\t"
  137896. #else
  137897. "adc r4, %[r]\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 r6, r7, r6\n\t"
  137906. #elif defined(__clang__)
  137907. "muls r6, r7\n\t"
  137908. #else
  137909. "mul r6, r7\n\t"
  137910. #endif
  137911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137912. "lsrs r7, r6, #16\n\t"
  137913. #else
  137914. "lsr r7, r6, #16\n\t"
  137915. #endif
  137916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137917. "lsls r6, r6, #16\n\t"
  137918. #else
  137919. "lsl r6, r6, #16\n\t"
  137920. #endif
  137921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137922. "adds r5, r5, r6\n\t"
  137923. #else
  137924. "add r5, r5, r6\n\t"
  137925. #endif
  137926. #ifdef WOLFSSL_KEIL
  137927. "adcs r3, r3, r7\n\t"
  137928. #elif defined(__clang__)
  137929. "adcs r3, r7\n\t"
  137930. #else
  137931. "adc r3, r7\n\t"
  137932. #endif
  137933. #ifdef WOLFSSL_KEIL
  137934. "adcs r4, r4, %[r]\n\t"
  137935. #elif defined(__clang__)
  137936. "adcs r4, %[r]\n\t"
  137937. #else
  137938. "adc r4, %[r]\n\t"
  137939. #endif
  137940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137941. "lsrs r6, %[a], #16\n\t"
  137942. #else
  137943. "lsr r6, %[a], #16\n\t"
  137944. #endif
  137945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137946. "lsrs r7, %[b], #16\n\t"
  137947. #else
  137948. "lsr r7, %[b], #16\n\t"
  137949. #endif
  137950. #ifdef WOLFSSL_KEIL
  137951. "muls r7, r6, r7\n\t"
  137952. #elif defined(__clang__)
  137953. "muls r7, r6\n\t"
  137954. #else
  137955. "mul r7, r6\n\t"
  137956. #endif
  137957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137958. "adds r3, r3, r7\n\t"
  137959. #else
  137960. "add r3, r3, r7\n\t"
  137961. #endif
  137962. #ifdef WOLFSSL_KEIL
  137963. "adcs r4, r4, %[r]\n\t"
  137964. #elif defined(__clang__)
  137965. "adcs r4, %[r]\n\t"
  137966. #else
  137967. "adc r4, %[r]\n\t"
  137968. #endif
  137969. "uxth r7, %[b]\n\t"
  137970. #ifdef WOLFSSL_KEIL
  137971. "muls r6, r7, r6\n\t"
  137972. #elif defined(__clang__)
  137973. "muls r6, r7\n\t"
  137974. #else
  137975. "mul r6, r7\n\t"
  137976. #endif
  137977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137978. "lsrs r7, r6, #16\n\t"
  137979. #else
  137980. "lsr r7, r6, #16\n\t"
  137981. #endif
  137982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137983. "lsls r6, r6, #16\n\t"
  137984. #else
  137985. "lsl r6, r6, #16\n\t"
  137986. #endif
  137987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137988. "adds r5, r5, r6\n\t"
  137989. #else
  137990. "add r5, r5, r6\n\t"
  137991. #endif
  137992. #ifdef WOLFSSL_KEIL
  137993. "adcs r3, r3, r7\n\t"
  137994. #elif defined(__clang__)
  137995. "adcs r3, r7\n\t"
  137996. #else
  137997. "adc r3, r7\n\t"
  137998. #endif
  137999. #ifdef WOLFSSL_KEIL
  138000. "adcs r4, r4, %[r]\n\t"
  138001. #elif defined(__clang__)
  138002. "adcs r4, %[r]\n\t"
  138003. #else
  138004. "adc r4, %[r]\n\t"
  138005. #endif
  138006. "# A[4] * B[13]\n\t"
  138007. "mov %[a], r9\n\t"
  138008. "mov %[b], r10\n\t"
  138009. "ldr %[a], [%[a], #16]\n\t"
  138010. "ldr %[b], [%[b], #52]\n\t"
  138011. "uxth r6, %[a]\n\t"
  138012. "uxth r7, %[b]\n\t"
  138013. #ifdef WOLFSSL_KEIL
  138014. "muls r7, r6, r7\n\t"
  138015. #elif defined(__clang__)
  138016. "muls r7, r6\n\t"
  138017. #else
  138018. "mul r7, r6\n\t"
  138019. #endif
  138020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138021. "adds r5, r5, r7\n\t"
  138022. #else
  138023. "add r5, r5, r7\n\t"
  138024. #endif
  138025. #ifdef WOLFSSL_KEIL
  138026. "adcs r3, r3, %[r]\n\t"
  138027. #elif defined(__clang__)
  138028. "adcs r3, %[r]\n\t"
  138029. #else
  138030. "adc r3, %[r]\n\t"
  138031. #endif
  138032. #ifdef WOLFSSL_KEIL
  138033. "adcs r4, r4, %[r]\n\t"
  138034. #elif defined(__clang__)
  138035. "adcs r4, %[r]\n\t"
  138036. #else
  138037. "adc r4, %[r]\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 r6, r7, r6\n\t"
  138046. #elif defined(__clang__)
  138047. "muls r6, r7\n\t"
  138048. #else
  138049. "mul r6, r7\n\t"
  138050. #endif
  138051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138052. "lsrs r7, r6, #16\n\t"
  138053. #else
  138054. "lsr r7, r6, #16\n\t"
  138055. #endif
  138056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138057. "lsls r6, r6, #16\n\t"
  138058. #else
  138059. "lsl r6, r6, #16\n\t"
  138060. #endif
  138061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138062. "adds r5, r5, r6\n\t"
  138063. #else
  138064. "add r5, r5, r6\n\t"
  138065. #endif
  138066. #ifdef WOLFSSL_KEIL
  138067. "adcs r3, r3, r7\n\t"
  138068. #elif defined(__clang__)
  138069. "adcs r3, r7\n\t"
  138070. #else
  138071. "adc r3, r7\n\t"
  138072. #endif
  138073. #ifdef WOLFSSL_KEIL
  138074. "adcs r4, r4, %[r]\n\t"
  138075. #elif defined(__clang__)
  138076. "adcs r4, %[r]\n\t"
  138077. #else
  138078. "adc r4, %[r]\n\t"
  138079. #endif
  138080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138081. "lsrs r6, %[a], #16\n\t"
  138082. #else
  138083. "lsr r6, %[a], #16\n\t"
  138084. #endif
  138085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138086. "lsrs r7, %[b], #16\n\t"
  138087. #else
  138088. "lsr r7, %[b], #16\n\t"
  138089. #endif
  138090. #ifdef WOLFSSL_KEIL
  138091. "muls r7, r6, r7\n\t"
  138092. #elif defined(__clang__)
  138093. "muls r7, r6\n\t"
  138094. #else
  138095. "mul r7, r6\n\t"
  138096. #endif
  138097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138098. "adds r3, r3, r7\n\t"
  138099. #else
  138100. "add r3, r3, r7\n\t"
  138101. #endif
  138102. #ifdef WOLFSSL_KEIL
  138103. "adcs r4, r4, %[r]\n\t"
  138104. #elif defined(__clang__)
  138105. "adcs r4, %[r]\n\t"
  138106. #else
  138107. "adc r4, %[r]\n\t"
  138108. #endif
  138109. "uxth r7, %[b]\n\t"
  138110. #ifdef WOLFSSL_KEIL
  138111. "muls r6, r7, r6\n\t"
  138112. #elif defined(__clang__)
  138113. "muls r6, r7\n\t"
  138114. #else
  138115. "mul r6, r7\n\t"
  138116. #endif
  138117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138118. "lsrs r7, r6, #16\n\t"
  138119. #else
  138120. "lsr r7, r6, #16\n\t"
  138121. #endif
  138122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138123. "lsls r6, r6, #16\n\t"
  138124. #else
  138125. "lsl r6, r6, #16\n\t"
  138126. #endif
  138127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138128. "adds r5, r5, r6\n\t"
  138129. #else
  138130. "add r5, r5, r6\n\t"
  138131. #endif
  138132. #ifdef WOLFSSL_KEIL
  138133. "adcs r3, r3, r7\n\t"
  138134. #elif defined(__clang__)
  138135. "adcs r3, r7\n\t"
  138136. #else
  138137. "adc r3, r7\n\t"
  138138. #endif
  138139. #ifdef WOLFSSL_KEIL
  138140. "adcs r4, r4, %[r]\n\t"
  138141. #elif defined(__clang__)
  138142. "adcs r4, %[r]\n\t"
  138143. #else
  138144. "adc r4, %[r]\n\t"
  138145. #endif
  138146. "# A[5] * B[12]\n\t"
  138147. "mov %[a], r9\n\t"
  138148. "mov %[b], r10\n\t"
  138149. "ldr %[a], [%[a], #20]\n\t"
  138150. "ldr %[b], [%[b], #48]\n\t"
  138151. "uxth r6, %[a]\n\t"
  138152. "uxth r7, %[b]\n\t"
  138153. #ifdef WOLFSSL_KEIL
  138154. "muls r7, r6, r7\n\t"
  138155. #elif defined(__clang__)
  138156. "muls r7, r6\n\t"
  138157. #else
  138158. "mul r7, r6\n\t"
  138159. #endif
  138160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138161. "adds r5, r5, r7\n\t"
  138162. #else
  138163. "add r5, r5, r7\n\t"
  138164. #endif
  138165. #ifdef WOLFSSL_KEIL
  138166. "adcs r3, r3, %[r]\n\t"
  138167. #elif defined(__clang__)
  138168. "adcs r3, %[r]\n\t"
  138169. #else
  138170. "adc r3, %[r]\n\t"
  138171. #endif
  138172. #ifdef WOLFSSL_KEIL
  138173. "adcs r4, r4, %[r]\n\t"
  138174. #elif defined(__clang__)
  138175. "adcs r4, %[r]\n\t"
  138176. #else
  138177. "adc r4, %[r]\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 r6, r7, r6\n\t"
  138186. #elif defined(__clang__)
  138187. "muls r6, r7\n\t"
  138188. #else
  138189. "mul r6, r7\n\t"
  138190. #endif
  138191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138192. "lsrs r7, r6, #16\n\t"
  138193. #else
  138194. "lsr r7, r6, #16\n\t"
  138195. #endif
  138196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138197. "lsls r6, r6, #16\n\t"
  138198. #else
  138199. "lsl r6, r6, #16\n\t"
  138200. #endif
  138201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138202. "adds r5, r5, r6\n\t"
  138203. #else
  138204. "add r5, r5, r6\n\t"
  138205. #endif
  138206. #ifdef WOLFSSL_KEIL
  138207. "adcs r3, r3, r7\n\t"
  138208. #elif defined(__clang__)
  138209. "adcs r3, r7\n\t"
  138210. #else
  138211. "adc r3, r7\n\t"
  138212. #endif
  138213. #ifdef WOLFSSL_KEIL
  138214. "adcs r4, r4, %[r]\n\t"
  138215. #elif defined(__clang__)
  138216. "adcs r4, %[r]\n\t"
  138217. #else
  138218. "adc r4, %[r]\n\t"
  138219. #endif
  138220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138221. "lsrs r6, %[a], #16\n\t"
  138222. #else
  138223. "lsr r6, %[a], #16\n\t"
  138224. #endif
  138225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138226. "lsrs r7, %[b], #16\n\t"
  138227. #else
  138228. "lsr r7, %[b], #16\n\t"
  138229. #endif
  138230. #ifdef WOLFSSL_KEIL
  138231. "muls r7, r6, r7\n\t"
  138232. #elif defined(__clang__)
  138233. "muls r7, r6\n\t"
  138234. #else
  138235. "mul r7, r6\n\t"
  138236. #endif
  138237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138238. "adds r3, r3, r7\n\t"
  138239. #else
  138240. "add r3, r3, r7\n\t"
  138241. #endif
  138242. #ifdef WOLFSSL_KEIL
  138243. "adcs r4, r4, %[r]\n\t"
  138244. #elif defined(__clang__)
  138245. "adcs r4, %[r]\n\t"
  138246. #else
  138247. "adc r4, %[r]\n\t"
  138248. #endif
  138249. "uxth r7, %[b]\n\t"
  138250. #ifdef WOLFSSL_KEIL
  138251. "muls r6, r7, r6\n\t"
  138252. #elif defined(__clang__)
  138253. "muls r6, r7\n\t"
  138254. #else
  138255. "mul r6, r7\n\t"
  138256. #endif
  138257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138258. "lsrs r7, r6, #16\n\t"
  138259. #else
  138260. "lsr r7, r6, #16\n\t"
  138261. #endif
  138262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138263. "lsls r6, r6, #16\n\t"
  138264. #else
  138265. "lsl r6, r6, #16\n\t"
  138266. #endif
  138267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138268. "adds r5, r5, r6\n\t"
  138269. #else
  138270. "add r5, r5, r6\n\t"
  138271. #endif
  138272. #ifdef WOLFSSL_KEIL
  138273. "adcs r3, r3, r7\n\t"
  138274. #elif defined(__clang__)
  138275. "adcs r3, r7\n\t"
  138276. #else
  138277. "adc r3, r7\n\t"
  138278. #endif
  138279. #ifdef WOLFSSL_KEIL
  138280. "adcs r4, r4, %[r]\n\t"
  138281. #elif defined(__clang__)
  138282. "adcs r4, %[r]\n\t"
  138283. #else
  138284. "adc r4, %[r]\n\t"
  138285. #endif
  138286. "# A[6] * B[11]\n\t"
  138287. "mov %[a], r9\n\t"
  138288. "mov %[b], r10\n\t"
  138289. "ldr %[a], [%[a], #24]\n\t"
  138290. "ldr %[b], [%[b], #44]\n\t"
  138291. "uxth r6, %[a]\n\t"
  138292. "uxth r7, %[b]\n\t"
  138293. #ifdef WOLFSSL_KEIL
  138294. "muls r7, r6, r7\n\t"
  138295. #elif defined(__clang__)
  138296. "muls r7, r6\n\t"
  138297. #else
  138298. "mul r7, r6\n\t"
  138299. #endif
  138300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138301. "adds r5, r5, r7\n\t"
  138302. #else
  138303. "add r5, r5, r7\n\t"
  138304. #endif
  138305. #ifdef WOLFSSL_KEIL
  138306. "adcs r3, r3, %[r]\n\t"
  138307. #elif defined(__clang__)
  138308. "adcs r3, %[r]\n\t"
  138309. #else
  138310. "adc r3, %[r]\n\t"
  138311. #endif
  138312. #ifdef WOLFSSL_KEIL
  138313. "adcs r4, r4, %[r]\n\t"
  138314. #elif defined(__clang__)
  138315. "adcs r4, %[r]\n\t"
  138316. #else
  138317. "adc r4, %[r]\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 r6, r7, r6\n\t"
  138326. #elif defined(__clang__)
  138327. "muls r6, r7\n\t"
  138328. #else
  138329. "mul r6, r7\n\t"
  138330. #endif
  138331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138332. "lsrs r7, r6, #16\n\t"
  138333. #else
  138334. "lsr r7, r6, #16\n\t"
  138335. #endif
  138336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138337. "lsls r6, r6, #16\n\t"
  138338. #else
  138339. "lsl r6, r6, #16\n\t"
  138340. #endif
  138341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138342. "adds r5, r5, r6\n\t"
  138343. #else
  138344. "add r5, r5, r6\n\t"
  138345. #endif
  138346. #ifdef WOLFSSL_KEIL
  138347. "adcs r3, r3, r7\n\t"
  138348. #elif defined(__clang__)
  138349. "adcs r3, r7\n\t"
  138350. #else
  138351. "adc r3, r7\n\t"
  138352. #endif
  138353. #ifdef WOLFSSL_KEIL
  138354. "adcs r4, r4, %[r]\n\t"
  138355. #elif defined(__clang__)
  138356. "adcs r4, %[r]\n\t"
  138357. #else
  138358. "adc r4, %[r]\n\t"
  138359. #endif
  138360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138361. "lsrs r6, %[a], #16\n\t"
  138362. #else
  138363. "lsr r6, %[a], #16\n\t"
  138364. #endif
  138365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138366. "lsrs r7, %[b], #16\n\t"
  138367. #else
  138368. "lsr r7, %[b], #16\n\t"
  138369. #endif
  138370. #ifdef WOLFSSL_KEIL
  138371. "muls r7, r6, r7\n\t"
  138372. #elif defined(__clang__)
  138373. "muls r7, r6\n\t"
  138374. #else
  138375. "mul r7, r6\n\t"
  138376. #endif
  138377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138378. "adds r3, r3, r7\n\t"
  138379. #else
  138380. "add r3, r3, r7\n\t"
  138381. #endif
  138382. #ifdef WOLFSSL_KEIL
  138383. "adcs r4, r4, %[r]\n\t"
  138384. #elif defined(__clang__)
  138385. "adcs r4, %[r]\n\t"
  138386. #else
  138387. "adc r4, %[r]\n\t"
  138388. #endif
  138389. "uxth r7, %[b]\n\t"
  138390. #ifdef WOLFSSL_KEIL
  138391. "muls r6, r7, r6\n\t"
  138392. #elif defined(__clang__)
  138393. "muls r6, r7\n\t"
  138394. #else
  138395. "mul r6, r7\n\t"
  138396. #endif
  138397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138398. "lsrs r7, r6, #16\n\t"
  138399. #else
  138400. "lsr r7, r6, #16\n\t"
  138401. #endif
  138402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138403. "lsls r6, r6, #16\n\t"
  138404. #else
  138405. "lsl r6, r6, #16\n\t"
  138406. #endif
  138407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138408. "adds r5, r5, r6\n\t"
  138409. #else
  138410. "add r5, r5, r6\n\t"
  138411. #endif
  138412. #ifdef WOLFSSL_KEIL
  138413. "adcs r3, r3, r7\n\t"
  138414. #elif defined(__clang__)
  138415. "adcs r3, r7\n\t"
  138416. #else
  138417. "adc r3, r7\n\t"
  138418. #endif
  138419. #ifdef WOLFSSL_KEIL
  138420. "adcs r4, r4, %[r]\n\t"
  138421. #elif defined(__clang__)
  138422. "adcs r4, %[r]\n\t"
  138423. #else
  138424. "adc r4, %[r]\n\t"
  138425. #endif
  138426. "# A[7] * B[10]\n\t"
  138427. "mov %[a], r9\n\t"
  138428. "mov %[b], r10\n\t"
  138429. "ldr %[a], [%[a], #28]\n\t"
  138430. "ldr %[b], [%[b], #40]\n\t"
  138431. "uxth r6, %[a]\n\t"
  138432. "uxth r7, %[b]\n\t"
  138433. #ifdef WOLFSSL_KEIL
  138434. "muls r7, r6, r7\n\t"
  138435. #elif defined(__clang__)
  138436. "muls r7, r6\n\t"
  138437. #else
  138438. "mul r7, r6\n\t"
  138439. #endif
  138440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138441. "adds r5, r5, r7\n\t"
  138442. #else
  138443. "add r5, r5, r7\n\t"
  138444. #endif
  138445. #ifdef WOLFSSL_KEIL
  138446. "adcs r3, r3, %[r]\n\t"
  138447. #elif defined(__clang__)
  138448. "adcs r3, %[r]\n\t"
  138449. #else
  138450. "adc r3, %[r]\n\t"
  138451. #endif
  138452. #ifdef WOLFSSL_KEIL
  138453. "adcs r4, r4, %[r]\n\t"
  138454. #elif defined(__clang__)
  138455. "adcs r4, %[r]\n\t"
  138456. #else
  138457. "adc r4, %[r]\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 r6, r7, r6\n\t"
  138466. #elif defined(__clang__)
  138467. "muls r6, r7\n\t"
  138468. #else
  138469. "mul r6, r7\n\t"
  138470. #endif
  138471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138472. "lsrs r7, r6, #16\n\t"
  138473. #else
  138474. "lsr r7, r6, #16\n\t"
  138475. #endif
  138476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138477. "lsls r6, r6, #16\n\t"
  138478. #else
  138479. "lsl r6, r6, #16\n\t"
  138480. #endif
  138481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138482. "adds r5, r5, r6\n\t"
  138483. #else
  138484. "add r5, r5, r6\n\t"
  138485. #endif
  138486. #ifdef WOLFSSL_KEIL
  138487. "adcs r3, r3, r7\n\t"
  138488. #elif defined(__clang__)
  138489. "adcs r3, r7\n\t"
  138490. #else
  138491. "adc r3, r7\n\t"
  138492. #endif
  138493. #ifdef WOLFSSL_KEIL
  138494. "adcs r4, r4, %[r]\n\t"
  138495. #elif defined(__clang__)
  138496. "adcs r4, %[r]\n\t"
  138497. #else
  138498. "adc r4, %[r]\n\t"
  138499. #endif
  138500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138501. "lsrs r6, %[a], #16\n\t"
  138502. #else
  138503. "lsr r6, %[a], #16\n\t"
  138504. #endif
  138505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138506. "lsrs r7, %[b], #16\n\t"
  138507. #else
  138508. "lsr r7, %[b], #16\n\t"
  138509. #endif
  138510. #ifdef WOLFSSL_KEIL
  138511. "muls r7, r6, r7\n\t"
  138512. #elif defined(__clang__)
  138513. "muls r7, r6\n\t"
  138514. #else
  138515. "mul r7, r6\n\t"
  138516. #endif
  138517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138518. "adds r3, r3, r7\n\t"
  138519. #else
  138520. "add r3, r3, r7\n\t"
  138521. #endif
  138522. #ifdef WOLFSSL_KEIL
  138523. "adcs r4, r4, %[r]\n\t"
  138524. #elif defined(__clang__)
  138525. "adcs r4, %[r]\n\t"
  138526. #else
  138527. "adc r4, %[r]\n\t"
  138528. #endif
  138529. "uxth r7, %[b]\n\t"
  138530. #ifdef WOLFSSL_KEIL
  138531. "muls r6, r7, r6\n\t"
  138532. #elif defined(__clang__)
  138533. "muls r6, r7\n\t"
  138534. #else
  138535. "mul r6, r7\n\t"
  138536. #endif
  138537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138538. "lsrs r7, r6, #16\n\t"
  138539. #else
  138540. "lsr r7, r6, #16\n\t"
  138541. #endif
  138542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138543. "lsls r6, r6, #16\n\t"
  138544. #else
  138545. "lsl r6, r6, #16\n\t"
  138546. #endif
  138547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138548. "adds r5, r5, r6\n\t"
  138549. #else
  138550. "add r5, r5, r6\n\t"
  138551. #endif
  138552. #ifdef WOLFSSL_KEIL
  138553. "adcs r3, r3, r7\n\t"
  138554. #elif defined(__clang__)
  138555. "adcs r3, r7\n\t"
  138556. #else
  138557. "adc r3, r7\n\t"
  138558. #endif
  138559. #ifdef WOLFSSL_KEIL
  138560. "adcs r4, r4, %[r]\n\t"
  138561. #elif defined(__clang__)
  138562. "adcs r4, %[r]\n\t"
  138563. #else
  138564. "adc r4, %[r]\n\t"
  138565. #endif
  138566. "# A[8] * B[9]\n\t"
  138567. "mov %[a], r9\n\t"
  138568. "mov %[b], r10\n\t"
  138569. "ldr %[a], [%[a], #32]\n\t"
  138570. "ldr %[b], [%[b], #36]\n\t"
  138571. "uxth r6, %[a]\n\t"
  138572. "uxth r7, %[b]\n\t"
  138573. #ifdef WOLFSSL_KEIL
  138574. "muls r7, r6, r7\n\t"
  138575. #elif defined(__clang__)
  138576. "muls r7, r6\n\t"
  138577. #else
  138578. "mul r7, r6\n\t"
  138579. #endif
  138580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138581. "adds r5, r5, r7\n\t"
  138582. #else
  138583. "add r5, r5, r7\n\t"
  138584. #endif
  138585. #ifdef WOLFSSL_KEIL
  138586. "adcs r3, r3, %[r]\n\t"
  138587. #elif defined(__clang__)
  138588. "adcs r3, %[r]\n\t"
  138589. #else
  138590. "adc r3, %[r]\n\t"
  138591. #endif
  138592. #ifdef WOLFSSL_KEIL
  138593. "adcs r4, r4, %[r]\n\t"
  138594. #elif defined(__clang__)
  138595. "adcs r4, %[r]\n\t"
  138596. #else
  138597. "adc r4, %[r]\n\t"
  138598. #endif
  138599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138600. "lsrs r7, %[b], #16\n\t"
  138601. #else
  138602. "lsr r7, %[b], #16\n\t"
  138603. #endif
  138604. #ifdef WOLFSSL_KEIL
  138605. "muls r6, r7, r6\n\t"
  138606. #elif defined(__clang__)
  138607. "muls r6, r7\n\t"
  138608. #else
  138609. "mul r6, r7\n\t"
  138610. #endif
  138611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138612. "lsrs r7, r6, #16\n\t"
  138613. #else
  138614. "lsr r7, r6, #16\n\t"
  138615. #endif
  138616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138617. "lsls r6, r6, #16\n\t"
  138618. #else
  138619. "lsl r6, r6, #16\n\t"
  138620. #endif
  138621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138622. "adds r5, r5, r6\n\t"
  138623. #else
  138624. "add r5, r5, r6\n\t"
  138625. #endif
  138626. #ifdef WOLFSSL_KEIL
  138627. "adcs r3, r3, r7\n\t"
  138628. #elif defined(__clang__)
  138629. "adcs r3, r7\n\t"
  138630. #else
  138631. "adc r3, r7\n\t"
  138632. #endif
  138633. #ifdef WOLFSSL_KEIL
  138634. "adcs r4, r4, %[r]\n\t"
  138635. #elif defined(__clang__)
  138636. "adcs r4, %[r]\n\t"
  138637. #else
  138638. "adc r4, %[r]\n\t"
  138639. #endif
  138640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138641. "lsrs r6, %[a], #16\n\t"
  138642. #else
  138643. "lsr r6, %[a], #16\n\t"
  138644. #endif
  138645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138646. "lsrs r7, %[b], #16\n\t"
  138647. #else
  138648. "lsr r7, %[b], #16\n\t"
  138649. #endif
  138650. #ifdef WOLFSSL_KEIL
  138651. "muls r7, r6, r7\n\t"
  138652. #elif defined(__clang__)
  138653. "muls r7, r6\n\t"
  138654. #else
  138655. "mul r7, r6\n\t"
  138656. #endif
  138657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138658. "adds r3, r3, r7\n\t"
  138659. #else
  138660. "add r3, r3, r7\n\t"
  138661. #endif
  138662. #ifdef WOLFSSL_KEIL
  138663. "adcs r4, r4, %[r]\n\t"
  138664. #elif defined(__clang__)
  138665. "adcs r4, %[r]\n\t"
  138666. #else
  138667. "adc r4, %[r]\n\t"
  138668. #endif
  138669. "uxth r7, %[b]\n\t"
  138670. #ifdef WOLFSSL_KEIL
  138671. "muls r6, r7, r6\n\t"
  138672. #elif defined(__clang__)
  138673. "muls r6, r7\n\t"
  138674. #else
  138675. "mul r6, r7\n\t"
  138676. #endif
  138677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138678. "lsrs r7, r6, #16\n\t"
  138679. #else
  138680. "lsr r7, r6, #16\n\t"
  138681. #endif
  138682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138683. "lsls r6, r6, #16\n\t"
  138684. #else
  138685. "lsl r6, r6, #16\n\t"
  138686. #endif
  138687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138688. "adds r5, r5, r6\n\t"
  138689. #else
  138690. "add r5, r5, r6\n\t"
  138691. #endif
  138692. #ifdef WOLFSSL_KEIL
  138693. "adcs r3, r3, r7\n\t"
  138694. #elif defined(__clang__)
  138695. "adcs r3, r7\n\t"
  138696. #else
  138697. "adc r3, r7\n\t"
  138698. #endif
  138699. #ifdef WOLFSSL_KEIL
  138700. "adcs r4, r4, %[r]\n\t"
  138701. #elif defined(__clang__)
  138702. "adcs r4, %[r]\n\t"
  138703. #else
  138704. "adc r4, %[r]\n\t"
  138705. #endif
  138706. "# A[9] * B[8]\n\t"
  138707. "mov %[a], r9\n\t"
  138708. "mov %[b], r10\n\t"
  138709. "ldr %[a], [%[a], #36]\n\t"
  138710. "ldr %[b], [%[b], #32]\n\t"
  138711. "uxth r6, %[a]\n\t"
  138712. "uxth r7, %[b]\n\t"
  138713. #ifdef WOLFSSL_KEIL
  138714. "muls r7, r6, r7\n\t"
  138715. #elif defined(__clang__)
  138716. "muls r7, r6\n\t"
  138717. #else
  138718. "mul r7, r6\n\t"
  138719. #endif
  138720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138721. "adds r5, r5, r7\n\t"
  138722. #else
  138723. "add r5, r5, r7\n\t"
  138724. #endif
  138725. #ifdef WOLFSSL_KEIL
  138726. "adcs r3, r3, %[r]\n\t"
  138727. #elif defined(__clang__)
  138728. "adcs r3, %[r]\n\t"
  138729. #else
  138730. "adc r3, %[r]\n\t"
  138731. #endif
  138732. #ifdef WOLFSSL_KEIL
  138733. "adcs r4, r4, %[r]\n\t"
  138734. #elif defined(__clang__)
  138735. "adcs r4, %[r]\n\t"
  138736. #else
  138737. "adc r4, %[r]\n\t"
  138738. #endif
  138739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138740. "lsrs r7, %[b], #16\n\t"
  138741. #else
  138742. "lsr r7, %[b], #16\n\t"
  138743. #endif
  138744. #ifdef WOLFSSL_KEIL
  138745. "muls r6, r7, r6\n\t"
  138746. #elif defined(__clang__)
  138747. "muls r6, r7\n\t"
  138748. #else
  138749. "mul r6, r7\n\t"
  138750. #endif
  138751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138752. "lsrs r7, r6, #16\n\t"
  138753. #else
  138754. "lsr r7, r6, #16\n\t"
  138755. #endif
  138756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138757. "lsls r6, r6, #16\n\t"
  138758. #else
  138759. "lsl r6, r6, #16\n\t"
  138760. #endif
  138761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138762. "adds r5, r5, r6\n\t"
  138763. #else
  138764. "add r5, r5, r6\n\t"
  138765. #endif
  138766. #ifdef WOLFSSL_KEIL
  138767. "adcs r3, r3, r7\n\t"
  138768. #elif defined(__clang__)
  138769. "adcs r3, r7\n\t"
  138770. #else
  138771. "adc r3, r7\n\t"
  138772. #endif
  138773. #ifdef WOLFSSL_KEIL
  138774. "adcs r4, r4, %[r]\n\t"
  138775. #elif defined(__clang__)
  138776. "adcs r4, %[r]\n\t"
  138777. #else
  138778. "adc r4, %[r]\n\t"
  138779. #endif
  138780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138781. "lsrs r6, %[a], #16\n\t"
  138782. #else
  138783. "lsr r6, %[a], #16\n\t"
  138784. #endif
  138785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138786. "lsrs r7, %[b], #16\n\t"
  138787. #else
  138788. "lsr r7, %[b], #16\n\t"
  138789. #endif
  138790. #ifdef WOLFSSL_KEIL
  138791. "muls r7, r6, r7\n\t"
  138792. #elif defined(__clang__)
  138793. "muls r7, r6\n\t"
  138794. #else
  138795. "mul r7, r6\n\t"
  138796. #endif
  138797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138798. "adds r3, r3, r7\n\t"
  138799. #else
  138800. "add r3, r3, r7\n\t"
  138801. #endif
  138802. #ifdef WOLFSSL_KEIL
  138803. "adcs r4, r4, %[r]\n\t"
  138804. #elif defined(__clang__)
  138805. "adcs r4, %[r]\n\t"
  138806. #else
  138807. "adc r4, %[r]\n\t"
  138808. #endif
  138809. "uxth r7, %[b]\n\t"
  138810. #ifdef WOLFSSL_KEIL
  138811. "muls r6, r7, r6\n\t"
  138812. #elif defined(__clang__)
  138813. "muls r6, r7\n\t"
  138814. #else
  138815. "mul r6, r7\n\t"
  138816. #endif
  138817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138818. "lsrs r7, r6, #16\n\t"
  138819. #else
  138820. "lsr r7, r6, #16\n\t"
  138821. #endif
  138822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138823. "lsls r6, r6, #16\n\t"
  138824. #else
  138825. "lsl r6, r6, #16\n\t"
  138826. #endif
  138827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138828. "adds r5, r5, r6\n\t"
  138829. #else
  138830. "add r5, r5, r6\n\t"
  138831. #endif
  138832. #ifdef WOLFSSL_KEIL
  138833. "adcs r3, r3, r7\n\t"
  138834. #elif defined(__clang__)
  138835. "adcs r3, r7\n\t"
  138836. #else
  138837. "adc r3, r7\n\t"
  138838. #endif
  138839. #ifdef WOLFSSL_KEIL
  138840. "adcs r4, r4, %[r]\n\t"
  138841. #elif defined(__clang__)
  138842. "adcs r4, %[r]\n\t"
  138843. #else
  138844. "adc r4, %[r]\n\t"
  138845. #endif
  138846. "# A[10] * B[7]\n\t"
  138847. "mov %[a], r9\n\t"
  138848. "mov %[b], r10\n\t"
  138849. "ldr %[a], [%[a], #40]\n\t"
  138850. "ldr %[b], [%[b], #28]\n\t"
  138851. "uxth r6, %[a]\n\t"
  138852. "uxth r7, %[b]\n\t"
  138853. #ifdef WOLFSSL_KEIL
  138854. "muls r7, r6, r7\n\t"
  138855. #elif defined(__clang__)
  138856. "muls r7, r6\n\t"
  138857. #else
  138858. "mul r7, r6\n\t"
  138859. #endif
  138860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138861. "adds r5, r5, r7\n\t"
  138862. #else
  138863. "add r5, r5, r7\n\t"
  138864. #endif
  138865. #ifdef WOLFSSL_KEIL
  138866. "adcs r3, r3, %[r]\n\t"
  138867. #elif defined(__clang__)
  138868. "adcs r3, %[r]\n\t"
  138869. #else
  138870. "adc r3, %[r]\n\t"
  138871. #endif
  138872. #ifdef WOLFSSL_KEIL
  138873. "adcs r4, r4, %[r]\n\t"
  138874. #elif defined(__clang__)
  138875. "adcs r4, %[r]\n\t"
  138876. #else
  138877. "adc r4, %[r]\n\t"
  138878. #endif
  138879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138880. "lsrs r7, %[b], #16\n\t"
  138881. #else
  138882. "lsr r7, %[b], #16\n\t"
  138883. #endif
  138884. #ifdef WOLFSSL_KEIL
  138885. "muls r6, r7, r6\n\t"
  138886. #elif defined(__clang__)
  138887. "muls r6, r7\n\t"
  138888. #else
  138889. "mul r6, r7\n\t"
  138890. #endif
  138891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138892. "lsrs r7, r6, #16\n\t"
  138893. #else
  138894. "lsr r7, r6, #16\n\t"
  138895. #endif
  138896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138897. "lsls r6, r6, #16\n\t"
  138898. #else
  138899. "lsl r6, r6, #16\n\t"
  138900. #endif
  138901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138902. "adds r5, r5, r6\n\t"
  138903. #else
  138904. "add r5, r5, r6\n\t"
  138905. #endif
  138906. #ifdef WOLFSSL_KEIL
  138907. "adcs r3, r3, r7\n\t"
  138908. #elif defined(__clang__)
  138909. "adcs r3, r7\n\t"
  138910. #else
  138911. "adc r3, r7\n\t"
  138912. #endif
  138913. #ifdef WOLFSSL_KEIL
  138914. "adcs r4, r4, %[r]\n\t"
  138915. #elif defined(__clang__)
  138916. "adcs r4, %[r]\n\t"
  138917. #else
  138918. "adc r4, %[r]\n\t"
  138919. #endif
  138920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138921. "lsrs r6, %[a], #16\n\t"
  138922. #else
  138923. "lsr r6, %[a], #16\n\t"
  138924. #endif
  138925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138926. "lsrs r7, %[b], #16\n\t"
  138927. #else
  138928. "lsr r7, %[b], #16\n\t"
  138929. #endif
  138930. #ifdef WOLFSSL_KEIL
  138931. "muls r7, r6, r7\n\t"
  138932. #elif defined(__clang__)
  138933. "muls r7, r6\n\t"
  138934. #else
  138935. "mul r7, r6\n\t"
  138936. #endif
  138937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138938. "adds r3, r3, r7\n\t"
  138939. #else
  138940. "add r3, r3, r7\n\t"
  138941. #endif
  138942. #ifdef WOLFSSL_KEIL
  138943. "adcs r4, r4, %[r]\n\t"
  138944. #elif defined(__clang__)
  138945. "adcs r4, %[r]\n\t"
  138946. #else
  138947. "adc r4, %[r]\n\t"
  138948. #endif
  138949. "uxth r7, %[b]\n\t"
  138950. #ifdef WOLFSSL_KEIL
  138951. "muls r6, r7, r6\n\t"
  138952. #elif defined(__clang__)
  138953. "muls r6, r7\n\t"
  138954. #else
  138955. "mul r6, r7\n\t"
  138956. #endif
  138957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138958. "lsrs r7, r6, #16\n\t"
  138959. #else
  138960. "lsr r7, r6, #16\n\t"
  138961. #endif
  138962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138963. "lsls r6, r6, #16\n\t"
  138964. #else
  138965. "lsl r6, r6, #16\n\t"
  138966. #endif
  138967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138968. "adds r5, r5, r6\n\t"
  138969. #else
  138970. "add r5, r5, r6\n\t"
  138971. #endif
  138972. #ifdef WOLFSSL_KEIL
  138973. "adcs r3, r3, r7\n\t"
  138974. #elif defined(__clang__)
  138975. "adcs r3, r7\n\t"
  138976. #else
  138977. "adc r3, r7\n\t"
  138978. #endif
  138979. #ifdef WOLFSSL_KEIL
  138980. "adcs r4, r4, %[r]\n\t"
  138981. #elif defined(__clang__)
  138982. "adcs r4, %[r]\n\t"
  138983. #else
  138984. "adc r4, %[r]\n\t"
  138985. #endif
  138986. "# A[11] * B[6]\n\t"
  138987. "mov %[a], r9\n\t"
  138988. "mov %[b], r10\n\t"
  138989. "ldr %[a], [%[a], #44]\n\t"
  138990. "ldr %[b], [%[b], #24]\n\t"
  138991. "uxth r6, %[a]\n\t"
  138992. "uxth r7, %[b]\n\t"
  138993. #ifdef WOLFSSL_KEIL
  138994. "muls r7, r6, r7\n\t"
  138995. #elif defined(__clang__)
  138996. "muls r7, r6\n\t"
  138997. #else
  138998. "mul r7, r6\n\t"
  138999. #endif
  139000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139001. "adds r5, r5, r7\n\t"
  139002. #else
  139003. "add r5, r5, r7\n\t"
  139004. #endif
  139005. #ifdef WOLFSSL_KEIL
  139006. "adcs r3, r3, %[r]\n\t"
  139007. #elif defined(__clang__)
  139008. "adcs r3, %[r]\n\t"
  139009. #else
  139010. "adc r3, %[r]\n\t"
  139011. #endif
  139012. #ifdef WOLFSSL_KEIL
  139013. "adcs r4, r4, %[r]\n\t"
  139014. #elif defined(__clang__)
  139015. "adcs r4, %[r]\n\t"
  139016. #else
  139017. "adc r4, %[r]\n\t"
  139018. #endif
  139019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139020. "lsrs r7, %[b], #16\n\t"
  139021. #else
  139022. "lsr r7, %[b], #16\n\t"
  139023. #endif
  139024. #ifdef WOLFSSL_KEIL
  139025. "muls r6, r7, r6\n\t"
  139026. #elif defined(__clang__)
  139027. "muls r6, r7\n\t"
  139028. #else
  139029. "mul r6, r7\n\t"
  139030. #endif
  139031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139032. "lsrs r7, r6, #16\n\t"
  139033. #else
  139034. "lsr r7, r6, #16\n\t"
  139035. #endif
  139036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139037. "lsls r6, r6, #16\n\t"
  139038. #else
  139039. "lsl r6, r6, #16\n\t"
  139040. #endif
  139041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139042. "adds r5, r5, r6\n\t"
  139043. #else
  139044. "add r5, r5, r6\n\t"
  139045. #endif
  139046. #ifdef WOLFSSL_KEIL
  139047. "adcs r3, r3, r7\n\t"
  139048. #elif defined(__clang__)
  139049. "adcs r3, r7\n\t"
  139050. #else
  139051. "adc r3, r7\n\t"
  139052. #endif
  139053. #ifdef WOLFSSL_KEIL
  139054. "adcs r4, r4, %[r]\n\t"
  139055. #elif defined(__clang__)
  139056. "adcs r4, %[r]\n\t"
  139057. #else
  139058. "adc r4, %[r]\n\t"
  139059. #endif
  139060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139061. "lsrs r6, %[a], #16\n\t"
  139062. #else
  139063. "lsr r6, %[a], #16\n\t"
  139064. #endif
  139065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139066. "lsrs r7, %[b], #16\n\t"
  139067. #else
  139068. "lsr r7, %[b], #16\n\t"
  139069. #endif
  139070. #ifdef WOLFSSL_KEIL
  139071. "muls r7, r6, r7\n\t"
  139072. #elif defined(__clang__)
  139073. "muls r7, r6\n\t"
  139074. #else
  139075. "mul r7, r6\n\t"
  139076. #endif
  139077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139078. "adds r3, r3, r7\n\t"
  139079. #else
  139080. "add r3, r3, r7\n\t"
  139081. #endif
  139082. #ifdef WOLFSSL_KEIL
  139083. "adcs r4, r4, %[r]\n\t"
  139084. #elif defined(__clang__)
  139085. "adcs r4, %[r]\n\t"
  139086. #else
  139087. "adc r4, %[r]\n\t"
  139088. #endif
  139089. "uxth r7, %[b]\n\t"
  139090. #ifdef WOLFSSL_KEIL
  139091. "muls r6, r7, r6\n\t"
  139092. #elif defined(__clang__)
  139093. "muls r6, r7\n\t"
  139094. #else
  139095. "mul r6, r7\n\t"
  139096. #endif
  139097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139098. "lsrs r7, r6, #16\n\t"
  139099. #else
  139100. "lsr r7, r6, #16\n\t"
  139101. #endif
  139102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139103. "lsls r6, r6, #16\n\t"
  139104. #else
  139105. "lsl r6, r6, #16\n\t"
  139106. #endif
  139107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139108. "adds r5, r5, r6\n\t"
  139109. #else
  139110. "add r5, r5, r6\n\t"
  139111. #endif
  139112. #ifdef WOLFSSL_KEIL
  139113. "adcs r3, r3, r7\n\t"
  139114. #elif defined(__clang__)
  139115. "adcs r3, r7\n\t"
  139116. #else
  139117. "adc r3, r7\n\t"
  139118. #endif
  139119. #ifdef WOLFSSL_KEIL
  139120. "adcs r4, r4, %[r]\n\t"
  139121. #elif defined(__clang__)
  139122. "adcs r4, %[r]\n\t"
  139123. #else
  139124. "adc r4, %[r]\n\t"
  139125. #endif
  139126. "# A[12] * B[5]\n\t"
  139127. "mov %[a], r9\n\t"
  139128. "mov %[b], r10\n\t"
  139129. "ldr %[a], [%[a], #48]\n\t"
  139130. "ldr %[b], [%[b], #20]\n\t"
  139131. "uxth r6, %[a]\n\t"
  139132. "uxth r7, %[b]\n\t"
  139133. #ifdef WOLFSSL_KEIL
  139134. "muls r7, r6, r7\n\t"
  139135. #elif defined(__clang__)
  139136. "muls r7, r6\n\t"
  139137. #else
  139138. "mul r7, r6\n\t"
  139139. #endif
  139140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139141. "adds r5, r5, r7\n\t"
  139142. #else
  139143. "add r5, r5, r7\n\t"
  139144. #endif
  139145. #ifdef WOLFSSL_KEIL
  139146. "adcs r3, r3, %[r]\n\t"
  139147. #elif defined(__clang__)
  139148. "adcs r3, %[r]\n\t"
  139149. #else
  139150. "adc r3, %[r]\n\t"
  139151. #endif
  139152. #ifdef WOLFSSL_KEIL
  139153. "adcs r4, r4, %[r]\n\t"
  139154. #elif defined(__clang__)
  139155. "adcs r4, %[r]\n\t"
  139156. #else
  139157. "adc r4, %[r]\n\t"
  139158. #endif
  139159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139160. "lsrs r7, %[b], #16\n\t"
  139161. #else
  139162. "lsr r7, %[b], #16\n\t"
  139163. #endif
  139164. #ifdef WOLFSSL_KEIL
  139165. "muls r6, r7, r6\n\t"
  139166. #elif defined(__clang__)
  139167. "muls r6, r7\n\t"
  139168. #else
  139169. "mul r6, r7\n\t"
  139170. #endif
  139171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139172. "lsrs r7, r6, #16\n\t"
  139173. #else
  139174. "lsr r7, r6, #16\n\t"
  139175. #endif
  139176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139177. "lsls r6, r6, #16\n\t"
  139178. #else
  139179. "lsl r6, r6, #16\n\t"
  139180. #endif
  139181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139182. "adds r5, r5, r6\n\t"
  139183. #else
  139184. "add r5, r5, r6\n\t"
  139185. #endif
  139186. #ifdef WOLFSSL_KEIL
  139187. "adcs r3, r3, r7\n\t"
  139188. #elif defined(__clang__)
  139189. "adcs r3, r7\n\t"
  139190. #else
  139191. "adc r3, r7\n\t"
  139192. #endif
  139193. #ifdef WOLFSSL_KEIL
  139194. "adcs r4, r4, %[r]\n\t"
  139195. #elif defined(__clang__)
  139196. "adcs r4, %[r]\n\t"
  139197. #else
  139198. "adc r4, %[r]\n\t"
  139199. #endif
  139200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139201. "lsrs r6, %[a], #16\n\t"
  139202. #else
  139203. "lsr r6, %[a], #16\n\t"
  139204. #endif
  139205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139206. "lsrs r7, %[b], #16\n\t"
  139207. #else
  139208. "lsr r7, %[b], #16\n\t"
  139209. #endif
  139210. #ifdef WOLFSSL_KEIL
  139211. "muls r7, r6, r7\n\t"
  139212. #elif defined(__clang__)
  139213. "muls r7, r6\n\t"
  139214. #else
  139215. "mul r7, r6\n\t"
  139216. #endif
  139217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139218. "adds r3, r3, r7\n\t"
  139219. #else
  139220. "add r3, r3, r7\n\t"
  139221. #endif
  139222. #ifdef WOLFSSL_KEIL
  139223. "adcs r4, r4, %[r]\n\t"
  139224. #elif defined(__clang__)
  139225. "adcs r4, %[r]\n\t"
  139226. #else
  139227. "adc r4, %[r]\n\t"
  139228. #endif
  139229. "uxth r7, %[b]\n\t"
  139230. #ifdef WOLFSSL_KEIL
  139231. "muls r6, r7, r6\n\t"
  139232. #elif defined(__clang__)
  139233. "muls r6, r7\n\t"
  139234. #else
  139235. "mul r6, r7\n\t"
  139236. #endif
  139237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139238. "lsrs r7, r6, #16\n\t"
  139239. #else
  139240. "lsr r7, r6, #16\n\t"
  139241. #endif
  139242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139243. "lsls r6, r6, #16\n\t"
  139244. #else
  139245. "lsl r6, r6, #16\n\t"
  139246. #endif
  139247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139248. "adds r5, r5, r6\n\t"
  139249. #else
  139250. "add r5, r5, r6\n\t"
  139251. #endif
  139252. #ifdef WOLFSSL_KEIL
  139253. "adcs r3, r3, r7\n\t"
  139254. #elif defined(__clang__)
  139255. "adcs r3, r7\n\t"
  139256. #else
  139257. "adc r3, r7\n\t"
  139258. #endif
  139259. #ifdef WOLFSSL_KEIL
  139260. "adcs r4, r4, %[r]\n\t"
  139261. #elif defined(__clang__)
  139262. "adcs r4, %[r]\n\t"
  139263. #else
  139264. "adc r4, %[r]\n\t"
  139265. #endif
  139266. "# A[13] * B[4]\n\t"
  139267. "mov %[a], r9\n\t"
  139268. "mov %[b], r10\n\t"
  139269. "ldr %[a], [%[a], #52]\n\t"
  139270. "ldr %[b], [%[b], #16]\n\t"
  139271. "uxth r6, %[a]\n\t"
  139272. "uxth r7, %[b]\n\t"
  139273. #ifdef WOLFSSL_KEIL
  139274. "muls r7, r6, r7\n\t"
  139275. #elif defined(__clang__)
  139276. "muls r7, r6\n\t"
  139277. #else
  139278. "mul r7, r6\n\t"
  139279. #endif
  139280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139281. "adds r5, r5, r7\n\t"
  139282. #else
  139283. "add r5, r5, r7\n\t"
  139284. #endif
  139285. #ifdef WOLFSSL_KEIL
  139286. "adcs r3, r3, %[r]\n\t"
  139287. #elif defined(__clang__)
  139288. "adcs r3, %[r]\n\t"
  139289. #else
  139290. "adc r3, %[r]\n\t"
  139291. #endif
  139292. #ifdef WOLFSSL_KEIL
  139293. "adcs r4, r4, %[r]\n\t"
  139294. #elif defined(__clang__)
  139295. "adcs r4, %[r]\n\t"
  139296. #else
  139297. "adc r4, %[r]\n\t"
  139298. #endif
  139299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139300. "lsrs r7, %[b], #16\n\t"
  139301. #else
  139302. "lsr r7, %[b], #16\n\t"
  139303. #endif
  139304. #ifdef WOLFSSL_KEIL
  139305. "muls r6, r7, r6\n\t"
  139306. #elif defined(__clang__)
  139307. "muls r6, r7\n\t"
  139308. #else
  139309. "mul r6, r7\n\t"
  139310. #endif
  139311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139312. "lsrs r7, r6, #16\n\t"
  139313. #else
  139314. "lsr r7, r6, #16\n\t"
  139315. #endif
  139316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139317. "lsls r6, r6, #16\n\t"
  139318. #else
  139319. "lsl r6, r6, #16\n\t"
  139320. #endif
  139321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139322. "adds r5, r5, r6\n\t"
  139323. #else
  139324. "add r5, r5, r6\n\t"
  139325. #endif
  139326. #ifdef WOLFSSL_KEIL
  139327. "adcs r3, r3, r7\n\t"
  139328. #elif defined(__clang__)
  139329. "adcs r3, r7\n\t"
  139330. #else
  139331. "adc r3, r7\n\t"
  139332. #endif
  139333. #ifdef WOLFSSL_KEIL
  139334. "adcs r4, r4, %[r]\n\t"
  139335. #elif defined(__clang__)
  139336. "adcs r4, %[r]\n\t"
  139337. #else
  139338. "adc r4, %[r]\n\t"
  139339. #endif
  139340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139341. "lsrs r6, %[a], #16\n\t"
  139342. #else
  139343. "lsr r6, %[a], #16\n\t"
  139344. #endif
  139345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139346. "lsrs r7, %[b], #16\n\t"
  139347. #else
  139348. "lsr r7, %[b], #16\n\t"
  139349. #endif
  139350. #ifdef WOLFSSL_KEIL
  139351. "muls r7, r6, r7\n\t"
  139352. #elif defined(__clang__)
  139353. "muls r7, r6\n\t"
  139354. #else
  139355. "mul r7, r6\n\t"
  139356. #endif
  139357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139358. "adds r3, r3, r7\n\t"
  139359. #else
  139360. "add r3, r3, r7\n\t"
  139361. #endif
  139362. #ifdef WOLFSSL_KEIL
  139363. "adcs r4, r4, %[r]\n\t"
  139364. #elif defined(__clang__)
  139365. "adcs r4, %[r]\n\t"
  139366. #else
  139367. "adc r4, %[r]\n\t"
  139368. #endif
  139369. "uxth r7, %[b]\n\t"
  139370. #ifdef WOLFSSL_KEIL
  139371. "muls r6, r7, r6\n\t"
  139372. #elif defined(__clang__)
  139373. "muls r6, r7\n\t"
  139374. #else
  139375. "mul r6, r7\n\t"
  139376. #endif
  139377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139378. "lsrs r7, r6, #16\n\t"
  139379. #else
  139380. "lsr r7, r6, #16\n\t"
  139381. #endif
  139382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139383. "lsls r6, r6, #16\n\t"
  139384. #else
  139385. "lsl r6, r6, #16\n\t"
  139386. #endif
  139387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139388. "adds r5, r5, r6\n\t"
  139389. #else
  139390. "add r5, r5, r6\n\t"
  139391. #endif
  139392. #ifdef WOLFSSL_KEIL
  139393. "adcs r3, r3, r7\n\t"
  139394. #elif defined(__clang__)
  139395. "adcs r3, r7\n\t"
  139396. #else
  139397. "adc r3, r7\n\t"
  139398. #endif
  139399. #ifdef WOLFSSL_KEIL
  139400. "adcs r4, r4, %[r]\n\t"
  139401. #elif defined(__clang__)
  139402. "adcs r4, %[r]\n\t"
  139403. #else
  139404. "adc r4, %[r]\n\t"
  139405. #endif
  139406. "# A[14] * B[3]\n\t"
  139407. "mov %[a], r9\n\t"
  139408. "mov %[b], r10\n\t"
  139409. "ldr %[a], [%[a], #56]\n\t"
  139410. "ldr %[b], [%[b], #12]\n\t"
  139411. "uxth r6, %[a]\n\t"
  139412. "uxth r7, %[b]\n\t"
  139413. #ifdef WOLFSSL_KEIL
  139414. "muls r7, r6, r7\n\t"
  139415. #elif defined(__clang__)
  139416. "muls r7, r6\n\t"
  139417. #else
  139418. "mul r7, r6\n\t"
  139419. #endif
  139420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139421. "adds r5, r5, r7\n\t"
  139422. #else
  139423. "add r5, r5, r7\n\t"
  139424. #endif
  139425. #ifdef WOLFSSL_KEIL
  139426. "adcs r3, r3, %[r]\n\t"
  139427. #elif defined(__clang__)
  139428. "adcs r3, %[r]\n\t"
  139429. #else
  139430. "adc r3, %[r]\n\t"
  139431. #endif
  139432. #ifdef WOLFSSL_KEIL
  139433. "adcs r4, r4, %[r]\n\t"
  139434. #elif defined(__clang__)
  139435. "adcs r4, %[r]\n\t"
  139436. #else
  139437. "adc r4, %[r]\n\t"
  139438. #endif
  139439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139440. "lsrs r7, %[b], #16\n\t"
  139441. #else
  139442. "lsr r7, %[b], #16\n\t"
  139443. #endif
  139444. #ifdef WOLFSSL_KEIL
  139445. "muls r6, r7, r6\n\t"
  139446. #elif defined(__clang__)
  139447. "muls r6, r7\n\t"
  139448. #else
  139449. "mul r6, r7\n\t"
  139450. #endif
  139451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139452. "lsrs r7, r6, #16\n\t"
  139453. #else
  139454. "lsr r7, r6, #16\n\t"
  139455. #endif
  139456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139457. "lsls r6, r6, #16\n\t"
  139458. #else
  139459. "lsl r6, r6, #16\n\t"
  139460. #endif
  139461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139462. "adds r5, r5, r6\n\t"
  139463. #else
  139464. "add r5, r5, r6\n\t"
  139465. #endif
  139466. #ifdef WOLFSSL_KEIL
  139467. "adcs r3, r3, r7\n\t"
  139468. #elif defined(__clang__)
  139469. "adcs r3, r7\n\t"
  139470. #else
  139471. "adc r3, r7\n\t"
  139472. #endif
  139473. #ifdef WOLFSSL_KEIL
  139474. "adcs r4, r4, %[r]\n\t"
  139475. #elif defined(__clang__)
  139476. "adcs r4, %[r]\n\t"
  139477. #else
  139478. "adc r4, %[r]\n\t"
  139479. #endif
  139480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139481. "lsrs r6, %[a], #16\n\t"
  139482. #else
  139483. "lsr r6, %[a], #16\n\t"
  139484. #endif
  139485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139486. "lsrs r7, %[b], #16\n\t"
  139487. #else
  139488. "lsr r7, %[b], #16\n\t"
  139489. #endif
  139490. #ifdef WOLFSSL_KEIL
  139491. "muls r7, r6, r7\n\t"
  139492. #elif defined(__clang__)
  139493. "muls r7, r6\n\t"
  139494. #else
  139495. "mul r7, r6\n\t"
  139496. #endif
  139497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139498. "adds r3, r3, r7\n\t"
  139499. #else
  139500. "add r3, r3, r7\n\t"
  139501. #endif
  139502. #ifdef WOLFSSL_KEIL
  139503. "adcs r4, r4, %[r]\n\t"
  139504. #elif defined(__clang__)
  139505. "adcs r4, %[r]\n\t"
  139506. #else
  139507. "adc r4, %[r]\n\t"
  139508. #endif
  139509. "uxth r7, %[b]\n\t"
  139510. #ifdef WOLFSSL_KEIL
  139511. "muls r6, r7, r6\n\t"
  139512. #elif defined(__clang__)
  139513. "muls r6, r7\n\t"
  139514. #else
  139515. "mul r6, r7\n\t"
  139516. #endif
  139517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139518. "lsrs r7, r6, #16\n\t"
  139519. #else
  139520. "lsr r7, r6, #16\n\t"
  139521. #endif
  139522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139523. "lsls r6, r6, #16\n\t"
  139524. #else
  139525. "lsl r6, r6, #16\n\t"
  139526. #endif
  139527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139528. "adds r5, r5, r6\n\t"
  139529. #else
  139530. "add r5, r5, r6\n\t"
  139531. #endif
  139532. #ifdef WOLFSSL_KEIL
  139533. "adcs r3, r3, r7\n\t"
  139534. #elif defined(__clang__)
  139535. "adcs r3, r7\n\t"
  139536. #else
  139537. "adc r3, r7\n\t"
  139538. #endif
  139539. #ifdef WOLFSSL_KEIL
  139540. "adcs r4, r4, %[r]\n\t"
  139541. #elif defined(__clang__)
  139542. "adcs r4, %[r]\n\t"
  139543. #else
  139544. "adc r4, %[r]\n\t"
  139545. #endif
  139546. "# A[15] * B[2]\n\t"
  139547. "mov %[a], r9\n\t"
  139548. "mov %[b], r10\n\t"
  139549. "ldr %[a], [%[a], #60]\n\t"
  139550. "ldr %[b], [%[b], #8]\n\t"
  139551. "uxth r6, %[a]\n\t"
  139552. "uxth r7, %[b]\n\t"
  139553. #ifdef WOLFSSL_KEIL
  139554. "muls r7, r6, r7\n\t"
  139555. #elif defined(__clang__)
  139556. "muls r7, r6\n\t"
  139557. #else
  139558. "mul r7, r6\n\t"
  139559. #endif
  139560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139561. "adds r5, r5, r7\n\t"
  139562. #else
  139563. "add r5, r5, r7\n\t"
  139564. #endif
  139565. #ifdef WOLFSSL_KEIL
  139566. "adcs r3, r3, %[r]\n\t"
  139567. #elif defined(__clang__)
  139568. "adcs r3, %[r]\n\t"
  139569. #else
  139570. "adc r3, %[r]\n\t"
  139571. #endif
  139572. #ifdef WOLFSSL_KEIL
  139573. "adcs r4, r4, %[r]\n\t"
  139574. #elif defined(__clang__)
  139575. "adcs r4, %[r]\n\t"
  139576. #else
  139577. "adc r4, %[r]\n\t"
  139578. #endif
  139579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139580. "lsrs r7, %[b], #16\n\t"
  139581. #else
  139582. "lsr r7, %[b], #16\n\t"
  139583. #endif
  139584. #ifdef WOLFSSL_KEIL
  139585. "muls r6, r7, r6\n\t"
  139586. #elif defined(__clang__)
  139587. "muls r6, r7\n\t"
  139588. #else
  139589. "mul r6, r7\n\t"
  139590. #endif
  139591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139592. "lsrs r7, r6, #16\n\t"
  139593. #else
  139594. "lsr r7, r6, #16\n\t"
  139595. #endif
  139596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139597. "lsls r6, r6, #16\n\t"
  139598. #else
  139599. "lsl r6, r6, #16\n\t"
  139600. #endif
  139601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139602. "adds r5, r5, r6\n\t"
  139603. #else
  139604. "add r5, r5, r6\n\t"
  139605. #endif
  139606. #ifdef WOLFSSL_KEIL
  139607. "adcs r3, r3, r7\n\t"
  139608. #elif defined(__clang__)
  139609. "adcs r3, r7\n\t"
  139610. #else
  139611. "adc r3, r7\n\t"
  139612. #endif
  139613. #ifdef WOLFSSL_KEIL
  139614. "adcs r4, r4, %[r]\n\t"
  139615. #elif defined(__clang__)
  139616. "adcs r4, %[r]\n\t"
  139617. #else
  139618. "adc r4, %[r]\n\t"
  139619. #endif
  139620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139621. "lsrs r6, %[a], #16\n\t"
  139622. #else
  139623. "lsr r6, %[a], #16\n\t"
  139624. #endif
  139625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139626. "lsrs r7, %[b], #16\n\t"
  139627. #else
  139628. "lsr r7, %[b], #16\n\t"
  139629. #endif
  139630. #ifdef WOLFSSL_KEIL
  139631. "muls r7, r6, r7\n\t"
  139632. #elif defined(__clang__)
  139633. "muls r7, r6\n\t"
  139634. #else
  139635. "mul r7, r6\n\t"
  139636. #endif
  139637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139638. "adds r3, r3, r7\n\t"
  139639. #else
  139640. "add r3, r3, r7\n\t"
  139641. #endif
  139642. #ifdef WOLFSSL_KEIL
  139643. "adcs r4, r4, %[r]\n\t"
  139644. #elif defined(__clang__)
  139645. "adcs r4, %[r]\n\t"
  139646. #else
  139647. "adc r4, %[r]\n\t"
  139648. #endif
  139649. "uxth r7, %[b]\n\t"
  139650. #ifdef WOLFSSL_KEIL
  139651. "muls r6, r7, r6\n\t"
  139652. #elif defined(__clang__)
  139653. "muls r6, r7\n\t"
  139654. #else
  139655. "mul r6, r7\n\t"
  139656. #endif
  139657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139658. "lsrs r7, r6, #16\n\t"
  139659. #else
  139660. "lsr r7, r6, #16\n\t"
  139661. #endif
  139662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139663. "lsls r6, r6, #16\n\t"
  139664. #else
  139665. "lsl r6, r6, #16\n\t"
  139666. #endif
  139667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139668. "adds r5, r5, r6\n\t"
  139669. #else
  139670. "add r5, r5, r6\n\t"
  139671. #endif
  139672. #ifdef WOLFSSL_KEIL
  139673. "adcs r3, r3, r7\n\t"
  139674. #elif defined(__clang__)
  139675. "adcs r3, r7\n\t"
  139676. #else
  139677. "adc r3, r7\n\t"
  139678. #endif
  139679. #ifdef WOLFSSL_KEIL
  139680. "adcs r4, r4, %[r]\n\t"
  139681. #elif defined(__clang__)
  139682. "adcs r4, %[r]\n\t"
  139683. #else
  139684. "adc r4, %[r]\n\t"
  139685. #endif
  139686. "mov %[r], r8\n\t"
  139687. "str r5, [%[r], #68]\n\t"
  139688. "movs %[r], #0\n\t"
  139689. "# A[15] * B[3]\n\t"
  139690. "movs r5, #0\n\t"
  139691. "mov %[a], r9\n\t"
  139692. "mov %[b], r10\n\t"
  139693. "ldr %[a], [%[a], #60]\n\t"
  139694. "ldr %[b], [%[b], #12]\n\t"
  139695. "uxth r6, %[a]\n\t"
  139696. "uxth r7, %[b]\n\t"
  139697. #ifdef WOLFSSL_KEIL
  139698. "muls r7, r6, r7\n\t"
  139699. #elif defined(__clang__)
  139700. "muls r7, r6\n\t"
  139701. #else
  139702. "mul r7, r6\n\t"
  139703. #endif
  139704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139705. "adds r3, r3, r7\n\t"
  139706. #else
  139707. "add r3, r3, r7\n\t"
  139708. #endif
  139709. #ifdef WOLFSSL_KEIL
  139710. "adcs r4, r4, %[r]\n\t"
  139711. #elif defined(__clang__)
  139712. "adcs r4, %[r]\n\t"
  139713. #else
  139714. "adc r4, %[r]\n\t"
  139715. #endif
  139716. #ifdef WOLFSSL_KEIL
  139717. "adcs r5, r5, %[r]\n\t"
  139718. #elif defined(__clang__)
  139719. "adcs r5, %[r]\n\t"
  139720. #else
  139721. "adc r5, %[r]\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 r6, r7, r6\n\t"
  139730. #elif defined(__clang__)
  139731. "muls r6, r7\n\t"
  139732. #else
  139733. "mul r6, r7\n\t"
  139734. #endif
  139735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139736. "lsrs r7, r6, #16\n\t"
  139737. #else
  139738. "lsr r7, r6, #16\n\t"
  139739. #endif
  139740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139741. "lsls r6, r6, #16\n\t"
  139742. #else
  139743. "lsl r6, r6, #16\n\t"
  139744. #endif
  139745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139746. "adds r3, r3, r6\n\t"
  139747. #else
  139748. "add r3, r3, r6\n\t"
  139749. #endif
  139750. #ifdef WOLFSSL_KEIL
  139751. "adcs r4, r4, r7\n\t"
  139752. #elif defined(__clang__)
  139753. "adcs r4, r7\n\t"
  139754. #else
  139755. "adc r4, r7\n\t"
  139756. #endif
  139757. #ifdef WOLFSSL_KEIL
  139758. "adcs r5, r5, %[r]\n\t"
  139759. #elif defined(__clang__)
  139760. "adcs r5, %[r]\n\t"
  139761. #else
  139762. "adc r5, %[r]\n\t"
  139763. #endif
  139764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139765. "lsrs r6, %[a], #16\n\t"
  139766. #else
  139767. "lsr r6, %[a], #16\n\t"
  139768. #endif
  139769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139770. "lsrs r7, %[b], #16\n\t"
  139771. #else
  139772. "lsr r7, %[b], #16\n\t"
  139773. #endif
  139774. #ifdef WOLFSSL_KEIL
  139775. "muls r7, r6, r7\n\t"
  139776. #elif defined(__clang__)
  139777. "muls r7, r6\n\t"
  139778. #else
  139779. "mul r7, r6\n\t"
  139780. #endif
  139781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139782. "adds r4, r4, r7\n\t"
  139783. #else
  139784. "add r4, r4, r7\n\t"
  139785. #endif
  139786. #ifdef WOLFSSL_KEIL
  139787. "adcs r5, r5, %[r]\n\t"
  139788. #elif defined(__clang__)
  139789. "adcs r5, %[r]\n\t"
  139790. #else
  139791. "adc r5, %[r]\n\t"
  139792. #endif
  139793. "uxth r7, %[b]\n\t"
  139794. #ifdef WOLFSSL_KEIL
  139795. "muls r6, r7, r6\n\t"
  139796. #elif defined(__clang__)
  139797. "muls r6, r7\n\t"
  139798. #else
  139799. "mul r6, r7\n\t"
  139800. #endif
  139801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139802. "lsrs r7, r6, #16\n\t"
  139803. #else
  139804. "lsr r7, r6, #16\n\t"
  139805. #endif
  139806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139807. "lsls r6, r6, #16\n\t"
  139808. #else
  139809. "lsl r6, r6, #16\n\t"
  139810. #endif
  139811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139812. "adds r3, r3, r6\n\t"
  139813. #else
  139814. "add r3, r3, r6\n\t"
  139815. #endif
  139816. #ifdef WOLFSSL_KEIL
  139817. "adcs r4, r4, r7\n\t"
  139818. #elif defined(__clang__)
  139819. "adcs r4, r7\n\t"
  139820. #else
  139821. "adc r4, r7\n\t"
  139822. #endif
  139823. #ifdef WOLFSSL_KEIL
  139824. "adcs r5, r5, %[r]\n\t"
  139825. #elif defined(__clang__)
  139826. "adcs r5, %[r]\n\t"
  139827. #else
  139828. "adc r5, %[r]\n\t"
  139829. #endif
  139830. "# A[14] * B[4]\n\t"
  139831. "mov %[a], r9\n\t"
  139832. "mov %[b], r10\n\t"
  139833. "ldr %[a], [%[a], #56]\n\t"
  139834. "ldr %[b], [%[b], #16]\n\t"
  139835. "uxth r6, %[a]\n\t"
  139836. "uxth r7, %[b]\n\t"
  139837. #ifdef WOLFSSL_KEIL
  139838. "muls r7, r6, r7\n\t"
  139839. #elif defined(__clang__)
  139840. "muls r7, r6\n\t"
  139841. #else
  139842. "mul r7, r6\n\t"
  139843. #endif
  139844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139845. "adds r3, r3, r7\n\t"
  139846. #else
  139847. "add r3, r3, r7\n\t"
  139848. #endif
  139849. #ifdef WOLFSSL_KEIL
  139850. "adcs r4, r4, %[r]\n\t"
  139851. #elif defined(__clang__)
  139852. "adcs r4, %[r]\n\t"
  139853. #else
  139854. "adc r4, %[r]\n\t"
  139855. #endif
  139856. #ifdef WOLFSSL_KEIL
  139857. "adcs r5, r5, %[r]\n\t"
  139858. #elif defined(__clang__)
  139859. "adcs r5, %[r]\n\t"
  139860. #else
  139861. "adc r5, %[r]\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 r6, r7, r6\n\t"
  139870. #elif defined(__clang__)
  139871. "muls r6, r7\n\t"
  139872. #else
  139873. "mul r6, r7\n\t"
  139874. #endif
  139875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139876. "lsrs r7, r6, #16\n\t"
  139877. #else
  139878. "lsr r7, r6, #16\n\t"
  139879. #endif
  139880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139881. "lsls r6, r6, #16\n\t"
  139882. #else
  139883. "lsl r6, r6, #16\n\t"
  139884. #endif
  139885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139886. "adds r3, r3, r6\n\t"
  139887. #else
  139888. "add r3, r3, r6\n\t"
  139889. #endif
  139890. #ifdef WOLFSSL_KEIL
  139891. "adcs r4, r4, r7\n\t"
  139892. #elif defined(__clang__)
  139893. "adcs r4, r7\n\t"
  139894. #else
  139895. "adc r4, r7\n\t"
  139896. #endif
  139897. #ifdef WOLFSSL_KEIL
  139898. "adcs r5, r5, %[r]\n\t"
  139899. #elif defined(__clang__)
  139900. "adcs r5, %[r]\n\t"
  139901. #else
  139902. "adc r5, %[r]\n\t"
  139903. #endif
  139904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139905. "lsrs r6, %[a], #16\n\t"
  139906. #else
  139907. "lsr r6, %[a], #16\n\t"
  139908. #endif
  139909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139910. "lsrs r7, %[b], #16\n\t"
  139911. #else
  139912. "lsr r7, %[b], #16\n\t"
  139913. #endif
  139914. #ifdef WOLFSSL_KEIL
  139915. "muls r7, r6, r7\n\t"
  139916. #elif defined(__clang__)
  139917. "muls r7, r6\n\t"
  139918. #else
  139919. "mul r7, r6\n\t"
  139920. #endif
  139921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139922. "adds r4, r4, r7\n\t"
  139923. #else
  139924. "add r4, r4, r7\n\t"
  139925. #endif
  139926. #ifdef WOLFSSL_KEIL
  139927. "adcs r5, r5, %[r]\n\t"
  139928. #elif defined(__clang__)
  139929. "adcs r5, %[r]\n\t"
  139930. #else
  139931. "adc r5, %[r]\n\t"
  139932. #endif
  139933. "uxth r7, %[b]\n\t"
  139934. #ifdef WOLFSSL_KEIL
  139935. "muls r6, r7, r6\n\t"
  139936. #elif defined(__clang__)
  139937. "muls r6, r7\n\t"
  139938. #else
  139939. "mul r6, r7\n\t"
  139940. #endif
  139941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139942. "lsrs r7, r6, #16\n\t"
  139943. #else
  139944. "lsr r7, r6, #16\n\t"
  139945. #endif
  139946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139947. "lsls r6, r6, #16\n\t"
  139948. #else
  139949. "lsl r6, r6, #16\n\t"
  139950. #endif
  139951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139952. "adds r3, r3, r6\n\t"
  139953. #else
  139954. "add r3, r3, r6\n\t"
  139955. #endif
  139956. #ifdef WOLFSSL_KEIL
  139957. "adcs r4, r4, r7\n\t"
  139958. #elif defined(__clang__)
  139959. "adcs r4, r7\n\t"
  139960. #else
  139961. "adc r4, r7\n\t"
  139962. #endif
  139963. #ifdef WOLFSSL_KEIL
  139964. "adcs r5, r5, %[r]\n\t"
  139965. #elif defined(__clang__)
  139966. "adcs r5, %[r]\n\t"
  139967. #else
  139968. "adc r5, %[r]\n\t"
  139969. #endif
  139970. "# A[13] * B[5]\n\t"
  139971. "mov %[a], r9\n\t"
  139972. "mov %[b], r10\n\t"
  139973. "ldr %[a], [%[a], #52]\n\t"
  139974. "ldr %[b], [%[b], #20]\n\t"
  139975. "uxth r6, %[a]\n\t"
  139976. "uxth r7, %[b]\n\t"
  139977. #ifdef WOLFSSL_KEIL
  139978. "muls r7, r6, r7\n\t"
  139979. #elif defined(__clang__)
  139980. "muls r7, r6\n\t"
  139981. #else
  139982. "mul r7, r6\n\t"
  139983. #endif
  139984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139985. "adds r3, r3, r7\n\t"
  139986. #else
  139987. "add r3, r3, r7\n\t"
  139988. #endif
  139989. #ifdef WOLFSSL_KEIL
  139990. "adcs r4, r4, %[r]\n\t"
  139991. #elif defined(__clang__)
  139992. "adcs r4, %[r]\n\t"
  139993. #else
  139994. "adc r4, %[r]\n\t"
  139995. #endif
  139996. #ifdef WOLFSSL_KEIL
  139997. "adcs r5, r5, %[r]\n\t"
  139998. #elif defined(__clang__)
  139999. "adcs r5, %[r]\n\t"
  140000. #else
  140001. "adc r5, %[r]\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 r6, r7, r6\n\t"
  140010. #elif defined(__clang__)
  140011. "muls r6, r7\n\t"
  140012. #else
  140013. "mul r6, r7\n\t"
  140014. #endif
  140015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140016. "lsrs r7, r6, #16\n\t"
  140017. #else
  140018. "lsr r7, r6, #16\n\t"
  140019. #endif
  140020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140021. "lsls r6, r6, #16\n\t"
  140022. #else
  140023. "lsl r6, r6, #16\n\t"
  140024. #endif
  140025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140026. "adds r3, r3, r6\n\t"
  140027. #else
  140028. "add r3, r3, r6\n\t"
  140029. #endif
  140030. #ifdef WOLFSSL_KEIL
  140031. "adcs r4, r4, r7\n\t"
  140032. #elif defined(__clang__)
  140033. "adcs r4, r7\n\t"
  140034. #else
  140035. "adc r4, r7\n\t"
  140036. #endif
  140037. #ifdef WOLFSSL_KEIL
  140038. "adcs r5, r5, %[r]\n\t"
  140039. #elif defined(__clang__)
  140040. "adcs r5, %[r]\n\t"
  140041. #else
  140042. "adc r5, %[r]\n\t"
  140043. #endif
  140044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140045. "lsrs r6, %[a], #16\n\t"
  140046. #else
  140047. "lsr r6, %[a], #16\n\t"
  140048. #endif
  140049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140050. "lsrs r7, %[b], #16\n\t"
  140051. #else
  140052. "lsr r7, %[b], #16\n\t"
  140053. #endif
  140054. #ifdef WOLFSSL_KEIL
  140055. "muls r7, r6, r7\n\t"
  140056. #elif defined(__clang__)
  140057. "muls r7, r6\n\t"
  140058. #else
  140059. "mul r7, r6\n\t"
  140060. #endif
  140061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140062. "adds r4, r4, r7\n\t"
  140063. #else
  140064. "add r4, r4, r7\n\t"
  140065. #endif
  140066. #ifdef WOLFSSL_KEIL
  140067. "adcs r5, r5, %[r]\n\t"
  140068. #elif defined(__clang__)
  140069. "adcs r5, %[r]\n\t"
  140070. #else
  140071. "adc r5, %[r]\n\t"
  140072. #endif
  140073. "uxth r7, %[b]\n\t"
  140074. #ifdef WOLFSSL_KEIL
  140075. "muls r6, r7, r6\n\t"
  140076. #elif defined(__clang__)
  140077. "muls r6, r7\n\t"
  140078. #else
  140079. "mul r6, r7\n\t"
  140080. #endif
  140081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140082. "lsrs r7, r6, #16\n\t"
  140083. #else
  140084. "lsr r7, r6, #16\n\t"
  140085. #endif
  140086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140087. "lsls r6, r6, #16\n\t"
  140088. #else
  140089. "lsl r6, r6, #16\n\t"
  140090. #endif
  140091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140092. "adds r3, r3, r6\n\t"
  140093. #else
  140094. "add r3, r3, r6\n\t"
  140095. #endif
  140096. #ifdef WOLFSSL_KEIL
  140097. "adcs r4, r4, r7\n\t"
  140098. #elif defined(__clang__)
  140099. "adcs r4, r7\n\t"
  140100. #else
  140101. "adc r4, r7\n\t"
  140102. #endif
  140103. #ifdef WOLFSSL_KEIL
  140104. "adcs r5, r5, %[r]\n\t"
  140105. #elif defined(__clang__)
  140106. "adcs r5, %[r]\n\t"
  140107. #else
  140108. "adc r5, %[r]\n\t"
  140109. #endif
  140110. "# A[12] * B[6]\n\t"
  140111. "mov %[a], r9\n\t"
  140112. "mov %[b], r10\n\t"
  140113. "ldr %[a], [%[a], #48]\n\t"
  140114. "ldr %[b], [%[b], #24]\n\t"
  140115. "uxth r6, %[a]\n\t"
  140116. "uxth r7, %[b]\n\t"
  140117. #ifdef WOLFSSL_KEIL
  140118. "muls r7, r6, r7\n\t"
  140119. #elif defined(__clang__)
  140120. "muls r7, r6\n\t"
  140121. #else
  140122. "mul r7, r6\n\t"
  140123. #endif
  140124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140125. "adds r3, r3, r7\n\t"
  140126. #else
  140127. "add r3, r3, r7\n\t"
  140128. #endif
  140129. #ifdef WOLFSSL_KEIL
  140130. "adcs r4, r4, %[r]\n\t"
  140131. #elif defined(__clang__)
  140132. "adcs r4, %[r]\n\t"
  140133. #else
  140134. "adc r4, %[r]\n\t"
  140135. #endif
  140136. #ifdef WOLFSSL_KEIL
  140137. "adcs r5, r5, %[r]\n\t"
  140138. #elif defined(__clang__)
  140139. "adcs r5, %[r]\n\t"
  140140. #else
  140141. "adc r5, %[r]\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 r6, r7, r6\n\t"
  140150. #elif defined(__clang__)
  140151. "muls r6, r7\n\t"
  140152. #else
  140153. "mul r6, r7\n\t"
  140154. #endif
  140155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140156. "lsrs r7, r6, #16\n\t"
  140157. #else
  140158. "lsr r7, r6, #16\n\t"
  140159. #endif
  140160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140161. "lsls r6, r6, #16\n\t"
  140162. #else
  140163. "lsl r6, r6, #16\n\t"
  140164. #endif
  140165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140166. "adds r3, r3, r6\n\t"
  140167. #else
  140168. "add r3, r3, r6\n\t"
  140169. #endif
  140170. #ifdef WOLFSSL_KEIL
  140171. "adcs r4, r4, r7\n\t"
  140172. #elif defined(__clang__)
  140173. "adcs r4, r7\n\t"
  140174. #else
  140175. "adc r4, r7\n\t"
  140176. #endif
  140177. #ifdef WOLFSSL_KEIL
  140178. "adcs r5, r5, %[r]\n\t"
  140179. #elif defined(__clang__)
  140180. "adcs r5, %[r]\n\t"
  140181. #else
  140182. "adc r5, %[r]\n\t"
  140183. #endif
  140184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140185. "lsrs r6, %[a], #16\n\t"
  140186. #else
  140187. "lsr r6, %[a], #16\n\t"
  140188. #endif
  140189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140190. "lsrs r7, %[b], #16\n\t"
  140191. #else
  140192. "lsr r7, %[b], #16\n\t"
  140193. #endif
  140194. #ifdef WOLFSSL_KEIL
  140195. "muls r7, r6, r7\n\t"
  140196. #elif defined(__clang__)
  140197. "muls r7, r6\n\t"
  140198. #else
  140199. "mul r7, r6\n\t"
  140200. #endif
  140201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140202. "adds r4, r4, r7\n\t"
  140203. #else
  140204. "add r4, r4, r7\n\t"
  140205. #endif
  140206. #ifdef WOLFSSL_KEIL
  140207. "adcs r5, r5, %[r]\n\t"
  140208. #elif defined(__clang__)
  140209. "adcs r5, %[r]\n\t"
  140210. #else
  140211. "adc r5, %[r]\n\t"
  140212. #endif
  140213. "uxth r7, %[b]\n\t"
  140214. #ifdef WOLFSSL_KEIL
  140215. "muls r6, r7, r6\n\t"
  140216. #elif defined(__clang__)
  140217. "muls r6, r7\n\t"
  140218. #else
  140219. "mul r6, r7\n\t"
  140220. #endif
  140221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140222. "lsrs r7, r6, #16\n\t"
  140223. #else
  140224. "lsr r7, r6, #16\n\t"
  140225. #endif
  140226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140227. "lsls r6, r6, #16\n\t"
  140228. #else
  140229. "lsl r6, r6, #16\n\t"
  140230. #endif
  140231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140232. "adds r3, r3, r6\n\t"
  140233. #else
  140234. "add r3, r3, r6\n\t"
  140235. #endif
  140236. #ifdef WOLFSSL_KEIL
  140237. "adcs r4, r4, r7\n\t"
  140238. #elif defined(__clang__)
  140239. "adcs r4, r7\n\t"
  140240. #else
  140241. "adc r4, r7\n\t"
  140242. #endif
  140243. #ifdef WOLFSSL_KEIL
  140244. "adcs r5, r5, %[r]\n\t"
  140245. #elif defined(__clang__)
  140246. "adcs r5, %[r]\n\t"
  140247. #else
  140248. "adc r5, %[r]\n\t"
  140249. #endif
  140250. "# A[11] * B[7]\n\t"
  140251. "mov %[a], r9\n\t"
  140252. "mov %[b], r10\n\t"
  140253. "ldr %[a], [%[a], #44]\n\t"
  140254. "ldr %[b], [%[b], #28]\n\t"
  140255. "uxth r6, %[a]\n\t"
  140256. "uxth r7, %[b]\n\t"
  140257. #ifdef WOLFSSL_KEIL
  140258. "muls r7, r6, r7\n\t"
  140259. #elif defined(__clang__)
  140260. "muls r7, r6\n\t"
  140261. #else
  140262. "mul r7, r6\n\t"
  140263. #endif
  140264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140265. "adds r3, r3, r7\n\t"
  140266. #else
  140267. "add r3, r3, r7\n\t"
  140268. #endif
  140269. #ifdef WOLFSSL_KEIL
  140270. "adcs r4, r4, %[r]\n\t"
  140271. #elif defined(__clang__)
  140272. "adcs r4, %[r]\n\t"
  140273. #else
  140274. "adc r4, %[r]\n\t"
  140275. #endif
  140276. #ifdef WOLFSSL_KEIL
  140277. "adcs r5, r5, %[r]\n\t"
  140278. #elif defined(__clang__)
  140279. "adcs r5, %[r]\n\t"
  140280. #else
  140281. "adc r5, %[r]\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 r6, r7, r6\n\t"
  140290. #elif defined(__clang__)
  140291. "muls r6, r7\n\t"
  140292. #else
  140293. "mul r6, r7\n\t"
  140294. #endif
  140295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140296. "lsrs r7, r6, #16\n\t"
  140297. #else
  140298. "lsr r7, r6, #16\n\t"
  140299. #endif
  140300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140301. "lsls r6, r6, #16\n\t"
  140302. #else
  140303. "lsl r6, r6, #16\n\t"
  140304. #endif
  140305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140306. "adds r3, r3, r6\n\t"
  140307. #else
  140308. "add r3, r3, r6\n\t"
  140309. #endif
  140310. #ifdef WOLFSSL_KEIL
  140311. "adcs r4, r4, r7\n\t"
  140312. #elif defined(__clang__)
  140313. "adcs r4, r7\n\t"
  140314. #else
  140315. "adc r4, r7\n\t"
  140316. #endif
  140317. #ifdef WOLFSSL_KEIL
  140318. "adcs r5, r5, %[r]\n\t"
  140319. #elif defined(__clang__)
  140320. "adcs r5, %[r]\n\t"
  140321. #else
  140322. "adc r5, %[r]\n\t"
  140323. #endif
  140324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140325. "lsrs r6, %[a], #16\n\t"
  140326. #else
  140327. "lsr r6, %[a], #16\n\t"
  140328. #endif
  140329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140330. "lsrs r7, %[b], #16\n\t"
  140331. #else
  140332. "lsr r7, %[b], #16\n\t"
  140333. #endif
  140334. #ifdef WOLFSSL_KEIL
  140335. "muls r7, r6, r7\n\t"
  140336. #elif defined(__clang__)
  140337. "muls r7, r6\n\t"
  140338. #else
  140339. "mul r7, r6\n\t"
  140340. #endif
  140341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140342. "adds r4, r4, r7\n\t"
  140343. #else
  140344. "add r4, r4, r7\n\t"
  140345. #endif
  140346. #ifdef WOLFSSL_KEIL
  140347. "adcs r5, r5, %[r]\n\t"
  140348. #elif defined(__clang__)
  140349. "adcs r5, %[r]\n\t"
  140350. #else
  140351. "adc r5, %[r]\n\t"
  140352. #endif
  140353. "uxth r7, %[b]\n\t"
  140354. #ifdef WOLFSSL_KEIL
  140355. "muls r6, r7, r6\n\t"
  140356. #elif defined(__clang__)
  140357. "muls r6, r7\n\t"
  140358. #else
  140359. "mul r6, r7\n\t"
  140360. #endif
  140361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140362. "lsrs r7, r6, #16\n\t"
  140363. #else
  140364. "lsr r7, r6, #16\n\t"
  140365. #endif
  140366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140367. "lsls r6, r6, #16\n\t"
  140368. #else
  140369. "lsl r6, r6, #16\n\t"
  140370. #endif
  140371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140372. "adds r3, r3, r6\n\t"
  140373. #else
  140374. "add r3, r3, r6\n\t"
  140375. #endif
  140376. #ifdef WOLFSSL_KEIL
  140377. "adcs r4, r4, r7\n\t"
  140378. #elif defined(__clang__)
  140379. "adcs r4, r7\n\t"
  140380. #else
  140381. "adc r4, r7\n\t"
  140382. #endif
  140383. #ifdef WOLFSSL_KEIL
  140384. "adcs r5, r5, %[r]\n\t"
  140385. #elif defined(__clang__)
  140386. "adcs r5, %[r]\n\t"
  140387. #else
  140388. "adc r5, %[r]\n\t"
  140389. #endif
  140390. "# A[10] * B[8]\n\t"
  140391. "mov %[a], r9\n\t"
  140392. "mov %[b], r10\n\t"
  140393. "ldr %[a], [%[a], #40]\n\t"
  140394. "ldr %[b], [%[b], #32]\n\t"
  140395. "uxth r6, %[a]\n\t"
  140396. "uxth r7, %[b]\n\t"
  140397. #ifdef WOLFSSL_KEIL
  140398. "muls r7, r6, r7\n\t"
  140399. #elif defined(__clang__)
  140400. "muls r7, r6\n\t"
  140401. #else
  140402. "mul r7, r6\n\t"
  140403. #endif
  140404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140405. "adds r3, r3, r7\n\t"
  140406. #else
  140407. "add r3, r3, r7\n\t"
  140408. #endif
  140409. #ifdef WOLFSSL_KEIL
  140410. "adcs r4, r4, %[r]\n\t"
  140411. #elif defined(__clang__)
  140412. "adcs r4, %[r]\n\t"
  140413. #else
  140414. "adc r4, %[r]\n\t"
  140415. #endif
  140416. #ifdef WOLFSSL_KEIL
  140417. "adcs r5, r5, %[r]\n\t"
  140418. #elif defined(__clang__)
  140419. "adcs r5, %[r]\n\t"
  140420. #else
  140421. "adc r5, %[r]\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 r6, r7, r6\n\t"
  140430. #elif defined(__clang__)
  140431. "muls r6, r7\n\t"
  140432. #else
  140433. "mul r6, r7\n\t"
  140434. #endif
  140435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140436. "lsrs r7, r6, #16\n\t"
  140437. #else
  140438. "lsr r7, r6, #16\n\t"
  140439. #endif
  140440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140441. "lsls r6, r6, #16\n\t"
  140442. #else
  140443. "lsl r6, r6, #16\n\t"
  140444. #endif
  140445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140446. "adds r3, r3, r6\n\t"
  140447. #else
  140448. "add r3, r3, r6\n\t"
  140449. #endif
  140450. #ifdef WOLFSSL_KEIL
  140451. "adcs r4, r4, r7\n\t"
  140452. #elif defined(__clang__)
  140453. "adcs r4, r7\n\t"
  140454. #else
  140455. "adc r4, r7\n\t"
  140456. #endif
  140457. #ifdef WOLFSSL_KEIL
  140458. "adcs r5, r5, %[r]\n\t"
  140459. #elif defined(__clang__)
  140460. "adcs r5, %[r]\n\t"
  140461. #else
  140462. "adc r5, %[r]\n\t"
  140463. #endif
  140464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140465. "lsrs r6, %[a], #16\n\t"
  140466. #else
  140467. "lsr r6, %[a], #16\n\t"
  140468. #endif
  140469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140470. "lsrs r7, %[b], #16\n\t"
  140471. #else
  140472. "lsr r7, %[b], #16\n\t"
  140473. #endif
  140474. #ifdef WOLFSSL_KEIL
  140475. "muls r7, r6, r7\n\t"
  140476. #elif defined(__clang__)
  140477. "muls r7, r6\n\t"
  140478. #else
  140479. "mul r7, r6\n\t"
  140480. #endif
  140481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140482. "adds r4, r4, r7\n\t"
  140483. #else
  140484. "add r4, r4, r7\n\t"
  140485. #endif
  140486. #ifdef WOLFSSL_KEIL
  140487. "adcs r5, r5, %[r]\n\t"
  140488. #elif defined(__clang__)
  140489. "adcs r5, %[r]\n\t"
  140490. #else
  140491. "adc r5, %[r]\n\t"
  140492. #endif
  140493. "uxth r7, %[b]\n\t"
  140494. #ifdef WOLFSSL_KEIL
  140495. "muls r6, r7, r6\n\t"
  140496. #elif defined(__clang__)
  140497. "muls r6, r7\n\t"
  140498. #else
  140499. "mul r6, r7\n\t"
  140500. #endif
  140501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140502. "lsrs r7, r6, #16\n\t"
  140503. #else
  140504. "lsr r7, r6, #16\n\t"
  140505. #endif
  140506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140507. "lsls r6, r6, #16\n\t"
  140508. #else
  140509. "lsl r6, r6, #16\n\t"
  140510. #endif
  140511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140512. "adds r3, r3, r6\n\t"
  140513. #else
  140514. "add r3, r3, r6\n\t"
  140515. #endif
  140516. #ifdef WOLFSSL_KEIL
  140517. "adcs r4, r4, r7\n\t"
  140518. #elif defined(__clang__)
  140519. "adcs r4, r7\n\t"
  140520. #else
  140521. "adc r4, r7\n\t"
  140522. #endif
  140523. #ifdef WOLFSSL_KEIL
  140524. "adcs r5, r5, %[r]\n\t"
  140525. #elif defined(__clang__)
  140526. "adcs r5, %[r]\n\t"
  140527. #else
  140528. "adc r5, %[r]\n\t"
  140529. #endif
  140530. "# A[9] * B[9]\n\t"
  140531. "mov %[a], r9\n\t"
  140532. "mov %[b], r10\n\t"
  140533. "ldr %[a], [%[a], #36]\n\t"
  140534. "ldr %[b], [%[b], #36]\n\t"
  140535. "uxth r6, %[a]\n\t"
  140536. "uxth r7, %[b]\n\t"
  140537. #ifdef WOLFSSL_KEIL
  140538. "muls r7, r6, r7\n\t"
  140539. #elif defined(__clang__)
  140540. "muls r7, r6\n\t"
  140541. #else
  140542. "mul r7, r6\n\t"
  140543. #endif
  140544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140545. "adds r3, r3, r7\n\t"
  140546. #else
  140547. "add r3, r3, r7\n\t"
  140548. #endif
  140549. #ifdef WOLFSSL_KEIL
  140550. "adcs r4, r4, %[r]\n\t"
  140551. #elif defined(__clang__)
  140552. "adcs r4, %[r]\n\t"
  140553. #else
  140554. "adc r4, %[r]\n\t"
  140555. #endif
  140556. #ifdef WOLFSSL_KEIL
  140557. "adcs r5, r5, %[r]\n\t"
  140558. #elif defined(__clang__)
  140559. "adcs r5, %[r]\n\t"
  140560. #else
  140561. "adc r5, %[r]\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 r6, r7, r6\n\t"
  140570. #elif defined(__clang__)
  140571. "muls r6, r7\n\t"
  140572. #else
  140573. "mul r6, r7\n\t"
  140574. #endif
  140575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140576. "lsrs r7, r6, #16\n\t"
  140577. #else
  140578. "lsr r7, r6, #16\n\t"
  140579. #endif
  140580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140581. "lsls r6, r6, #16\n\t"
  140582. #else
  140583. "lsl r6, r6, #16\n\t"
  140584. #endif
  140585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140586. "adds r3, r3, r6\n\t"
  140587. #else
  140588. "add r3, r3, r6\n\t"
  140589. #endif
  140590. #ifdef WOLFSSL_KEIL
  140591. "adcs r4, r4, r7\n\t"
  140592. #elif defined(__clang__)
  140593. "adcs r4, r7\n\t"
  140594. #else
  140595. "adc r4, r7\n\t"
  140596. #endif
  140597. #ifdef WOLFSSL_KEIL
  140598. "adcs r5, r5, %[r]\n\t"
  140599. #elif defined(__clang__)
  140600. "adcs r5, %[r]\n\t"
  140601. #else
  140602. "adc r5, %[r]\n\t"
  140603. #endif
  140604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140605. "lsrs r6, %[a], #16\n\t"
  140606. #else
  140607. "lsr r6, %[a], #16\n\t"
  140608. #endif
  140609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140610. "lsrs r7, %[b], #16\n\t"
  140611. #else
  140612. "lsr r7, %[b], #16\n\t"
  140613. #endif
  140614. #ifdef WOLFSSL_KEIL
  140615. "muls r7, r6, r7\n\t"
  140616. #elif defined(__clang__)
  140617. "muls r7, r6\n\t"
  140618. #else
  140619. "mul r7, r6\n\t"
  140620. #endif
  140621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140622. "adds r4, r4, r7\n\t"
  140623. #else
  140624. "add r4, r4, r7\n\t"
  140625. #endif
  140626. #ifdef WOLFSSL_KEIL
  140627. "adcs r5, r5, %[r]\n\t"
  140628. #elif defined(__clang__)
  140629. "adcs r5, %[r]\n\t"
  140630. #else
  140631. "adc r5, %[r]\n\t"
  140632. #endif
  140633. "uxth r7, %[b]\n\t"
  140634. #ifdef WOLFSSL_KEIL
  140635. "muls r6, r7, r6\n\t"
  140636. #elif defined(__clang__)
  140637. "muls r6, r7\n\t"
  140638. #else
  140639. "mul r6, r7\n\t"
  140640. #endif
  140641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140642. "lsrs r7, r6, #16\n\t"
  140643. #else
  140644. "lsr r7, r6, #16\n\t"
  140645. #endif
  140646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140647. "lsls r6, r6, #16\n\t"
  140648. #else
  140649. "lsl r6, r6, #16\n\t"
  140650. #endif
  140651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140652. "adds r3, r3, r6\n\t"
  140653. #else
  140654. "add r3, r3, r6\n\t"
  140655. #endif
  140656. #ifdef WOLFSSL_KEIL
  140657. "adcs r4, r4, r7\n\t"
  140658. #elif defined(__clang__)
  140659. "adcs r4, r7\n\t"
  140660. #else
  140661. "adc r4, r7\n\t"
  140662. #endif
  140663. #ifdef WOLFSSL_KEIL
  140664. "adcs r5, r5, %[r]\n\t"
  140665. #elif defined(__clang__)
  140666. "adcs r5, %[r]\n\t"
  140667. #else
  140668. "adc r5, %[r]\n\t"
  140669. #endif
  140670. "# A[8] * B[10]\n\t"
  140671. "mov %[a], r9\n\t"
  140672. "mov %[b], r10\n\t"
  140673. "ldr %[a], [%[a], #32]\n\t"
  140674. "ldr %[b], [%[b], #40]\n\t"
  140675. "uxth r6, %[a]\n\t"
  140676. "uxth r7, %[b]\n\t"
  140677. #ifdef WOLFSSL_KEIL
  140678. "muls r7, r6, r7\n\t"
  140679. #elif defined(__clang__)
  140680. "muls r7, r6\n\t"
  140681. #else
  140682. "mul r7, r6\n\t"
  140683. #endif
  140684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140685. "adds r3, r3, r7\n\t"
  140686. #else
  140687. "add r3, r3, r7\n\t"
  140688. #endif
  140689. #ifdef WOLFSSL_KEIL
  140690. "adcs r4, r4, %[r]\n\t"
  140691. #elif defined(__clang__)
  140692. "adcs r4, %[r]\n\t"
  140693. #else
  140694. "adc r4, %[r]\n\t"
  140695. #endif
  140696. #ifdef WOLFSSL_KEIL
  140697. "adcs r5, r5, %[r]\n\t"
  140698. #elif defined(__clang__)
  140699. "adcs r5, %[r]\n\t"
  140700. #else
  140701. "adc r5, %[r]\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 r6, r7, r6\n\t"
  140710. #elif defined(__clang__)
  140711. "muls r6, r7\n\t"
  140712. #else
  140713. "mul r6, r7\n\t"
  140714. #endif
  140715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140716. "lsrs r7, r6, #16\n\t"
  140717. #else
  140718. "lsr r7, r6, #16\n\t"
  140719. #endif
  140720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140721. "lsls r6, r6, #16\n\t"
  140722. #else
  140723. "lsl r6, r6, #16\n\t"
  140724. #endif
  140725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140726. "adds r3, r3, r6\n\t"
  140727. #else
  140728. "add r3, r3, r6\n\t"
  140729. #endif
  140730. #ifdef WOLFSSL_KEIL
  140731. "adcs r4, r4, r7\n\t"
  140732. #elif defined(__clang__)
  140733. "adcs r4, r7\n\t"
  140734. #else
  140735. "adc r4, r7\n\t"
  140736. #endif
  140737. #ifdef WOLFSSL_KEIL
  140738. "adcs r5, r5, %[r]\n\t"
  140739. #elif defined(__clang__)
  140740. "adcs r5, %[r]\n\t"
  140741. #else
  140742. "adc r5, %[r]\n\t"
  140743. #endif
  140744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140745. "lsrs r6, %[a], #16\n\t"
  140746. #else
  140747. "lsr r6, %[a], #16\n\t"
  140748. #endif
  140749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140750. "lsrs r7, %[b], #16\n\t"
  140751. #else
  140752. "lsr r7, %[b], #16\n\t"
  140753. #endif
  140754. #ifdef WOLFSSL_KEIL
  140755. "muls r7, r6, r7\n\t"
  140756. #elif defined(__clang__)
  140757. "muls r7, r6\n\t"
  140758. #else
  140759. "mul r7, r6\n\t"
  140760. #endif
  140761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140762. "adds r4, r4, r7\n\t"
  140763. #else
  140764. "add r4, r4, r7\n\t"
  140765. #endif
  140766. #ifdef WOLFSSL_KEIL
  140767. "adcs r5, r5, %[r]\n\t"
  140768. #elif defined(__clang__)
  140769. "adcs r5, %[r]\n\t"
  140770. #else
  140771. "adc r5, %[r]\n\t"
  140772. #endif
  140773. "uxth r7, %[b]\n\t"
  140774. #ifdef WOLFSSL_KEIL
  140775. "muls r6, r7, r6\n\t"
  140776. #elif defined(__clang__)
  140777. "muls r6, r7\n\t"
  140778. #else
  140779. "mul r6, r7\n\t"
  140780. #endif
  140781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140782. "lsrs r7, r6, #16\n\t"
  140783. #else
  140784. "lsr r7, r6, #16\n\t"
  140785. #endif
  140786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140787. "lsls r6, r6, #16\n\t"
  140788. #else
  140789. "lsl r6, r6, #16\n\t"
  140790. #endif
  140791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140792. "adds r3, r3, r6\n\t"
  140793. #else
  140794. "add r3, r3, r6\n\t"
  140795. #endif
  140796. #ifdef WOLFSSL_KEIL
  140797. "adcs r4, r4, r7\n\t"
  140798. #elif defined(__clang__)
  140799. "adcs r4, r7\n\t"
  140800. #else
  140801. "adc r4, r7\n\t"
  140802. #endif
  140803. #ifdef WOLFSSL_KEIL
  140804. "adcs r5, r5, %[r]\n\t"
  140805. #elif defined(__clang__)
  140806. "adcs r5, %[r]\n\t"
  140807. #else
  140808. "adc r5, %[r]\n\t"
  140809. #endif
  140810. "# A[7] * B[11]\n\t"
  140811. "mov %[a], r9\n\t"
  140812. "mov %[b], r10\n\t"
  140813. "ldr %[a], [%[a], #28]\n\t"
  140814. "ldr %[b], [%[b], #44]\n\t"
  140815. "uxth r6, %[a]\n\t"
  140816. "uxth r7, %[b]\n\t"
  140817. #ifdef WOLFSSL_KEIL
  140818. "muls r7, r6, r7\n\t"
  140819. #elif defined(__clang__)
  140820. "muls r7, r6\n\t"
  140821. #else
  140822. "mul r7, r6\n\t"
  140823. #endif
  140824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140825. "adds r3, r3, r7\n\t"
  140826. #else
  140827. "add r3, r3, r7\n\t"
  140828. #endif
  140829. #ifdef WOLFSSL_KEIL
  140830. "adcs r4, r4, %[r]\n\t"
  140831. #elif defined(__clang__)
  140832. "adcs r4, %[r]\n\t"
  140833. #else
  140834. "adc r4, %[r]\n\t"
  140835. #endif
  140836. #ifdef WOLFSSL_KEIL
  140837. "adcs r5, r5, %[r]\n\t"
  140838. #elif defined(__clang__)
  140839. "adcs r5, %[r]\n\t"
  140840. #else
  140841. "adc r5, %[r]\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 r6, r7, r6\n\t"
  140850. #elif defined(__clang__)
  140851. "muls r6, r7\n\t"
  140852. #else
  140853. "mul r6, r7\n\t"
  140854. #endif
  140855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140856. "lsrs r7, r6, #16\n\t"
  140857. #else
  140858. "lsr r7, r6, #16\n\t"
  140859. #endif
  140860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140861. "lsls r6, r6, #16\n\t"
  140862. #else
  140863. "lsl r6, r6, #16\n\t"
  140864. #endif
  140865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140866. "adds r3, r3, r6\n\t"
  140867. #else
  140868. "add r3, r3, r6\n\t"
  140869. #endif
  140870. #ifdef WOLFSSL_KEIL
  140871. "adcs r4, r4, r7\n\t"
  140872. #elif defined(__clang__)
  140873. "adcs r4, r7\n\t"
  140874. #else
  140875. "adc r4, r7\n\t"
  140876. #endif
  140877. #ifdef WOLFSSL_KEIL
  140878. "adcs r5, r5, %[r]\n\t"
  140879. #elif defined(__clang__)
  140880. "adcs r5, %[r]\n\t"
  140881. #else
  140882. "adc r5, %[r]\n\t"
  140883. #endif
  140884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140885. "lsrs r6, %[a], #16\n\t"
  140886. #else
  140887. "lsr r6, %[a], #16\n\t"
  140888. #endif
  140889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140890. "lsrs r7, %[b], #16\n\t"
  140891. #else
  140892. "lsr r7, %[b], #16\n\t"
  140893. #endif
  140894. #ifdef WOLFSSL_KEIL
  140895. "muls r7, r6, r7\n\t"
  140896. #elif defined(__clang__)
  140897. "muls r7, r6\n\t"
  140898. #else
  140899. "mul r7, r6\n\t"
  140900. #endif
  140901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140902. "adds r4, r4, r7\n\t"
  140903. #else
  140904. "add r4, r4, r7\n\t"
  140905. #endif
  140906. #ifdef WOLFSSL_KEIL
  140907. "adcs r5, r5, %[r]\n\t"
  140908. #elif defined(__clang__)
  140909. "adcs r5, %[r]\n\t"
  140910. #else
  140911. "adc r5, %[r]\n\t"
  140912. #endif
  140913. "uxth r7, %[b]\n\t"
  140914. #ifdef WOLFSSL_KEIL
  140915. "muls r6, r7, r6\n\t"
  140916. #elif defined(__clang__)
  140917. "muls r6, r7\n\t"
  140918. #else
  140919. "mul r6, r7\n\t"
  140920. #endif
  140921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140922. "lsrs r7, r6, #16\n\t"
  140923. #else
  140924. "lsr r7, r6, #16\n\t"
  140925. #endif
  140926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140927. "lsls r6, r6, #16\n\t"
  140928. #else
  140929. "lsl r6, r6, #16\n\t"
  140930. #endif
  140931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140932. "adds r3, r3, r6\n\t"
  140933. #else
  140934. "add r3, r3, r6\n\t"
  140935. #endif
  140936. #ifdef WOLFSSL_KEIL
  140937. "adcs r4, r4, r7\n\t"
  140938. #elif defined(__clang__)
  140939. "adcs r4, r7\n\t"
  140940. #else
  140941. "adc r4, r7\n\t"
  140942. #endif
  140943. #ifdef WOLFSSL_KEIL
  140944. "adcs r5, r5, %[r]\n\t"
  140945. #elif defined(__clang__)
  140946. "adcs r5, %[r]\n\t"
  140947. #else
  140948. "adc r5, %[r]\n\t"
  140949. #endif
  140950. "# A[6] * B[12]\n\t"
  140951. "mov %[a], r9\n\t"
  140952. "mov %[b], r10\n\t"
  140953. "ldr %[a], [%[a], #24]\n\t"
  140954. "ldr %[b], [%[b], #48]\n\t"
  140955. "uxth r6, %[a]\n\t"
  140956. "uxth r7, %[b]\n\t"
  140957. #ifdef WOLFSSL_KEIL
  140958. "muls r7, r6, r7\n\t"
  140959. #elif defined(__clang__)
  140960. "muls r7, r6\n\t"
  140961. #else
  140962. "mul r7, r6\n\t"
  140963. #endif
  140964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140965. "adds r3, r3, r7\n\t"
  140966. #else
  140967. "add r3, r3, r7\n\t"
  140968. #endif
  140969. #ifdef WOLFSSL_KEIL
  140970. "adcs r4, r4, %[r]\n\t"
  140971. #elif defined(__clang__)
  140972. "adcs r4, %[r]\n\t"
  140973. #else
  140974. "adc r4, %[r]\n\t"
  140975. #endif
  140976. #ifdef WOLFSSL_KEIL
  140977. "adcs r5, r5, %[r]\n\t"
  140978. #elif defined(__clang__)
  140979. "adcs r5, %[r]\n\t"
  140980. #else
  140981. "adc r5, %[r]\n\t"
  140982. #endif
  140983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140984. "lsrs r7, %[b], #16\n\t"
  140985. #else
  140986. "lsr r7, %[b], #16\n\t"
  140987. #endif
  140988. #ifdef WOLFSSL_KEIL
  140989. "muls r6, r7, r6\n\t"
  140990. #elif defined(__clang__)
  140991. "muls r6, r7\n\t"
  140992. #else
  140993. "mul r6, r7\n\t"
  140994. #endif
  140995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140996. "lsrs r7, r6, #16\n\t"
  140997. #else
  140998. "lsr r7, r6, #16\n\t"
  140999. #endif
  141000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141001. "lsls r6, r6, #16\n\t"
  141002. #else
  141003. "lsl r6, r6, #16\n\t"
  141004. #endif
  141005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141006. "adds r3, r3, r6\n\t"
  141007. #else
  141008. "add r3, r3, r6\n\t"
  141009. #endif
  141010. #ifdef WOLFSSL_KEIL
  141011. "adcs r4, r4, r7\n\t"
  141012. #elif defined(__clang__)
  141013. "adcs r4, r7\n\t"
  141014. #else
  141015. "adc r4, r7\n\t"
  141016. #endif
  141017. #ifdef WOLFSSL_KEIL
  141018. "adcs r5, r5, %[r]\n\t"
  141019. #elif defined(__clang__)
  141020. "adcs r5, %[r]\n\t"
  141021. #else
  141022. "adc r5, %[r]\n\t"
  141023. #endif
  141024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141025. "lsrs r6, %[a], #16\n\t"
  141026. #else
  141027. "lsr r6, %[a], #16\n\t"
  141028. #endif
  141029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141030. "lsrs r7, %[b], #16\n\t"
  141031. #else
  141032. "lsr r7, %[b], #16\n\t"
  141033. #endif
  141034. #ifdef WOLFSSL_KEIL
  141035. "muls r7, r6, r7\n\t"
  141036. #elif defined(__clang__)
  141037. "muls r7, r6\n\t"
  141038. #else
  141039. "mul r7, r6\n\t"
  141040. #endif
  141041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141042. "adds r4, r4, r7\n\t"
  141043. #else
  141044. "add r4, r4, r7\n\t"
  141045. #endif
  141046. #ifdef WOLFSSL_KEIL
  141047. "adcs r5, r5, %[r]\n\t"
  141048. #elif defined(__clang__)
  141049. "adcs r5, %[r]\n\t"
  141050. #else
  141051. "adc r5, %[r]\n\t"
  141052. #endif
  141053. "uxth r7, %[b]\n\t"
  141054. #ifdef WOLFSSL_KEIL
  141055. "muls r6, r7, r6\n\t"
  141056. #elif defined(__clang__)
  141057. "muls r6, r7\n\t"
  141058. #else
  141059. "mul r6, r7\n\t"
  141060. #endif
  141061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141062. "lsrs r7, r6, #16\n\t"
  141063. #else
  141064. "lsr r7, r6, #16\n\t"
  141065. #endif
  141066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141067. "lsls r6, r6, #16\n\t"
  141068. #else
  141069. "lsl r6, r6, #16\n\t"
  141070. #endif
  141071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141072. "adds r3, r3, r6\n\t"
  141073. #else
  141074. "add r3, r3, r6\n\t"
  141075. #endif
  141076. #ifdef WOLFSSL_KEIL
  141077. "adcs r4, r4, r7\n\t"
  141078. #elif defined(__clang__)
  141079. "adcs r4, r7\n\t"
  141080. #else
  141081. "adc r4, r7\n\t"
  141082. #endif
  141083. #ifdef WOLFSSL_KEIL
  141084. "adcs r5, r5, %[r]\n\t"
  141085. #elif defined(__clang__)
  141086. "adcs r5, %[r]\n\t"
  141087. #else
  141088. "adc r5, %[r]\n\t"
  141089. #endif
  141090. "# A[5] * B[13]\n\t"
  141091. "mov %[a], r9\n\t"
  141092. "mov %[b], r10\n\t"
  141093. "ldr %[a], [%[a], #20]\n\t"
  141094. "ldr %[b], [%[b], #52]\n\t"
  141095. "uxth r6, %[a]\n\t"
  141096. "uxth r7, %[b]\n\t"
  141097. #ifdef WOLFSSL_KEIL
  141098. "muls r7, r6, r7\n\t"
  141099. #elif defined(__clang__)
  141100. "muls r7, r6\n\t"
  141101. #else
  141102. "mul r7, r6\n\t"
  141103. #endif
  141104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141105. "adds r3, r3, r7\n\t"
  141106. #else
  141107. "add r3, r3, r7\n\t"
  141108. #endif
  141109. #ifdef WOLFSSL_KEIL
  141110. "adcs r4, r4, %[r]\n\t"
  141111. #elif defined(__clang__)
  141112. "adcs r4, %[r]\n\t"
  141113. #else
  141114. "adc r4, %[r]\n\t"
  141115. #endif
  141116. #ifdef WOLFSSL_KEIL
  141117. "adcs r5, r5, %[r]\n\t"
  141118. #elif defined(__clang__)
  141119. "adcs r5, %[r]\n\t"
  141120. #else
  141121. "adc r5, %[r]\n\t"
  141122. #endif
  141123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141124. "lsrs r7, %[b], #16\n\t"
  141125. #else
  141126. "lsr r7, %[b], #16\n\t"
  141127. #endif
  141128. #ifdef WOLFSSL_KEIL
  141129. "muls r6, r7, r6\n\t"
  141130. #elif defined(__clang__)
  141131. "muls r6, r7\n\t"
  141132. #else
  141133. "mul r6, r7\n\t"
  141134. #endif
  141135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141136. "lsrs r7, r6, #16\n\t"
  141137. #else
  141138. "lsr r7, r6, #16\n\t"
  141139. #endif
  141140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141141. "lsls r6, r6, #16\n\t"
  141142. #else
  141143. "lsl r6, r6, #16\n\t"
  141144. #endif
  141145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141146. "adds r3, r3, r6\n\t"
  141147. #else
  141148. "add r3, r3, r6\n\t"
  141149. #endif
  141150. #ifdef WOLFSSL_KEIL
  141151. "adcs r4, r4, r7\n\t"
  141152. #elif defined(__clang__)
  141153. "adcs r4, r7\n\t"
  141154. #else
  141155. "adc r4, r7\n\t"
  141156. #endif
  141157. #ifdef WOLFSSL_KEIL
  141158. "adcs r5, r5, %[r]\n\t"
  141159. #elif defined(__clang__)
  141160. "adcs r5, %[r]\n\t"
  141161. #else
  141162. "adc r5, %[r]\n\t"
  141163. #endif
  141164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141165. "lsrs r6, %[a], #16\n\t"
  141166. #else
  141167. "lsr r6, %[a], #16\n\t"
  141168. #endif
  141169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141170. "lsrs r7, %[b], #16\n\t"
  141171. #else
  141172. "lsr r7, %[b], #16\n\t"
  141173. #endif
  141174. #ifdef WOLFSSL_KEIL
  141175. "muls r7, r6, r7\n\t"
  141176. #elif defined(__clang__)
  141177. "muls r7, r6\n\t"
  141178. #else
  141179. "mul r7, r6\n\t"
  141180. #endif
  141181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141182. "adds r4, r4, r7\n\t"
  141183. #else
  141184. "add r4, r4, r7\n\t"
  141185. #endif
  141186. #ifdef WOLFSSL_KEIL
  141187. "adcs r5, r5, %[r]\n\t"
  141188. #elif defined(__clang__)
  141189. "adcs r5, %[r]\n\t"
  141190. #else
  141191. "adc r5, %[r]\n\t"
  141192. #endif
  141193. "uxth r7, %[b]\n\t"
  141194. #ifdef WOLFSSL_KEIL
  141195. "muls r6, r7, r6\n\t"
  141196. #elif defined(__clang__)
  141197. "muls r6, r7\n\t"
  141198. #else
  141199. "mul r6, r7\n\t"
  141200. #endif
  141201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141202. "lsrs r7, r6, #16\n\t"
  141203. #else
  141204. "lsr r7, r6, #16\n\t"
  141205. #endif
  141206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141207. "lsls r6, r6, #16\n\t"
  141208. #else
  141209. "lsl r6, r6, #16\n\t"
  141210. #endif
  141211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141212. "adds r3, r3, r6\n\t"
  141213. #else
  141214. "add r3, r3, r6\n\t"
  141215. #endif
  141216. #ifdef WOLFSSL_KEIL
  141217. "adcs r4, r4, r7\n\t"
  141218. #elif defined(__clang__)
  141219. "adcs r4, r7\n\t"
  141220. #else
  141221. "adc r4, r7\n\t"
  141222. #endif
  141223. #ifdef WOLFSSL_KEIL
  141224. "adcs r5, r5, %[r]\n\t"
  141225. #elif defined(__clang__)
  141226. "adcs r5, %[r]\n\t"
  141227. #else
  141228. "adc r5, %[r]\n\t"
  141229. #endif
  141230. "# A[4] * B[14]\n\t"
  141231. "mov %[a], r9\n\t"
  141232. "mov %[b], r10\n\t"
  141233. "ldr %[a], [%[a], #16]\n\t"
  141234. "ldr %[b], [%[b], #56]\n\t"
  141235. "uxth r6, %[a]\n\t"
  141236. "uxth r7, %[b]\n\t"
  141237. #ifdef WOLFSSL_KEIL
  141238. "muls r7, r6, r7\n\t"
  141239. #elif defined(__clang__)
  141240. "muls r7, r6\n\t"
  141241. #else
  141242. "mul r7, r6\n\t"
  141243. #endif
  141244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141245. "adds r3, r3, r7\n\t"
  141246. #else
  141247. "add r3, r3, r7\n\t"
  141248. #endif
  141249. #ifdef WOLFSSL_KEIL
  141250. "adcs r4, r4, %[r]\n\t"
  141251. #elif defined(__clang__)
  141252. "adcs r4, %[r]\n\t"
  141253. #else
  141254. "adc r4, %[r]\n\t"
  141255. #endif
  141256. #ifdef WOLFSSL_KEIL
  141257. "adcs r5, r5, %[r]\n\t"
  141258. #elif defined(__clang__)
  141259. "adcs r5, %[r]\n\t"
  141260. #else
  141261. "adc r5, %[r]\n\t"
  141262. #endif
  141263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141264. "lsrs r7, %[b], #16\n\t"
  141265. #else
  141266. "lsr r7, %[b], #16\n\t"
  141267. #endif
  141268. #ifdef WOLFSSL_KEIL
  141269. "muls r6, r7, r6\n\t"
  141270. #elif defined(__clang__)
  141271. "muls r6, r7\n\t"
  141272. #else
  141273. "mul r6, r7\n\t"
  141274. #endif
  141275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141276. "lsrs r7, r6, #16\n\t"
  141277. #else
  141278. "lsr r7, r6, #16\n\t"
  141279. #endif
  141280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141281. "lsls r6, r6, #16\n\t"
  141282. #else
  141283. "lsl r6, r6, #16\n\t"
  141284. #endif
  141285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141286. "adds r3, r3, r6\n\t"
  141287. #else
  141288. "add r3, r3, r6\n\t"
  141289. #endif
  141290. #ifdef WOLFSSL_KEIL
  141291. "adcs r4, r4, r7\n\t"
  141292. #elif defined(__clang__)
  141293. "adcs r4, r7\n\t"
  141294. #else
  141295. "adc r4, r7\n\t"
  141296. #endif
  141297. #ifdef WOLFSSL_KEIL
  141298. "adcs r5, r5, %[r]\n\t"
  141299. #elif defined(__clang__)
  141300. "adcs r5, %[r]\n\t"
  141301. #else
  141302. "adc r5, %[r]\n\t"
  141303. #endif
  141304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141305. "lsrs r6, %[a], #16\n\t"
  141306. #else
  141307. "lsr r6, %[a], #16\n\t"
  141308. #endif
  141309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141310. "lsrs r7, %[b], #16\n\t"
  141311. #else
  141312. "lsr r7, %[b], #16\n\t"
  141313. #endif
  141314. #ifdef WOLFSSL_KEIL
  141315. "muls r7, r6, r7\n\t"
  141316. #elif defined(__clang__)
  141317. "muls r7, r6\n\t"
  141318. #else
  141319. "mul r7, r6\n\t"
  141320. #endif
  141321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141322. "adds r4, r4, r7\n\t"
  141323. #else
  141324. "add r4, r4, r7\n\t"
  141325. #endif
  141326. #ifdef WOLFSSL_KEIL
  141327. "adcs r5, r5, %[r]\n\t"
  141328. #elif defined(__clang__)
  141329. "adcs r5, %[r]\n\t"
  141330. #else
  141331. "adc r5, %[r]\n\t"
  141332. #endif
  141333. "uxth r7, %[b]\n\t"
  141334. #ifdef WOLFSSL_KEIL
  141335. "muls r6, r7, r6\n\t"
  141336. #elif defined(__clang__)
  141337. "muls r6, r7\n\t"
  141338. #else
  141339. "mul r6, r7\n\t"
  141340. #endif
  141341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141342. "lsrs r7, r6, #16\n\t"
  141343. #else
  141344. "lsr r7, r6, #16\n\t"
  141345. #endif
  141346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141347. "lsls r6, r6, #16\n\t"
  141348. #else
  141349. "lsl r6, r6, #16\n\t"
  141350. #endif
  141351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141352. "adds r3, r3, r6\n\t"
  141353. #else
  141354. "add r3, r3, r6\n\t"
  141355. #endif
  141356. #ifdef WOLFSSL_KEIL
  141357. "adcs r4, r4, r7\n\t"
  141358. #elif defined(__clang__)
  141359. "adcs r4, r7\n\t"
  141360. #else
  141361. "adc r4, r7\n\t"
  141362. #endif
  141363. #ifdef WOLFSSL_KEIL
  141364. "adcs r5, r5, %[r]\n\t"
  141365. #elif defined(__clang__)
  141366. "adcs r5, %[r]\n\t"
  141367. #else
  141368. "adc r5, %[r]\n\t"
  141369. #endif
  141370. "# A[3] * B[15]\n\t"
  141371. "mov %[a], r9\n\t"
  141372. "mov %[b], r10\n\t"
  141373. "ldr %[a], [%[a], #12]\n\t"
  141374. "ldr %[b], [%[b], #60]\n\t"
  141375. "uxth r6, %[a]\n\t"
  141376. "uxth r7, %[b]\n\t"
  141377. #ifdef WOLFSSL_KEIL
  141378. "muls r7, r6, r7\n\t"
  141379. #elif defined(__clang__)
  141380. "muls r7, r6\n\t"
  141381. #else
  141382. "mul r7, r6\n\t"
  141383. #endif
  141384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141385. "adds r3, r3, r7\n\t"
  141386. #else
  141387. "add r3, r3, r7\n\t"
  141388. #endif
  141389. #ifdef WOLFSSL_KEIL
  141390. "adcs r4, r4, %[r]\n\t"
  141391. #elif defined(__clang__)
  141392. "adcs r4, %[r]\n\t"
  141393. #else
  141394. "adc r4, %[r]\n\t"
  141395. #endif
  141396. #ifdef WOLFSSL_KEIL
  141397. "adcs r5, r5, %[r]\n\t"
  141398. #elif defined(__clang__)
  141399. "adcs r5, %[r]\n\t"
  141400. #else
  141401. "adc r5, %[r]\n\t"
  141402. #endif
  141403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141404. "lsrs r7, %[b], #16\n\t"
  141405. #else
  141406. "lsr r7, %[b], #16\n\t"
  141407. #endif
  141408. #ifdef WOLFSSL_KEIL
  141409. "muls r6, r7, r6\n\t"
  141410. #elif defined(__clang__)
  141411. "muls r6, r7\n\t"
  141412. #else
  141413. "mul r6, r7\n\t"
  141414. #endif
  141415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141416. "lsrs r7, r6, #16\n\t"
  141417. #else
  141418. "lsr r7, r6, #16\n\t"
  141419. #endif
  141420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141421. "lsls r6, r6, #16\n\t"
  141422. #else
  141423. "lsl r6, r6, #16\n\t"
  141424. #endif
  141425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141426. "adds r3, r3, r6\n\t"
  141427. #else
  141428. "add r3, r3, r6\n\t"
  141429. #endif
  141430. #ifdef WOLFSSL_KEIL
  141431. "adcs r4, r4, r7\n\t"
  141432. #elif defined(__clang__)
  141433. "adcs r4, r7\n\t"
  141434. #else
  141435. "adc r4, r7\n\t"
  141436. #endif
  141437. #ifdef WOLFSSL_KEIL
  141438. "adcs r5, r5, %[r]\n\t"
  141439. #elif defined(__clang__)
  141440. "adcs r5, %[r]\n\t"
  141441. #else
  141442. "adc r5, %[r]\n\t"
  141443. #endif
  141444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141445. "lsrs r6, %[a], #16\n\t"
  141446. #else
  141447. "lsr r6, %[a], #16\n\t"
  141448. #endif
  141449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141450. "lsrs r7, %[b], #16\n\t"
  141451. #else
  141452. "lsr r7, %[b], #16\n\t"
  141453. #endif
  141454. #ifdef WOLFSSL_KEIL
  141455. "muls r7, r6, r7\n\t"
  141456. #elif defined(__clang__)
  141457. "muls r7, r6\n\t"
  141458. #else
  141459. "mul r7, r6\n\t"
  141460. #endif
  141461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141462. "adds r4, r4, r7\n\t"
  141463. #else
  141464. "add r4, r4, r7\n\t"
  141465. #endif
  141466. #ifdef WOLFSSL_KEIL
  141467. "adcs r5, r5, %[r]\n\t"
  141468. #elif defined(__clang__)
  141469. "adcs r5, %[r]\n\t"
  141470. #else
  141471. "adc r5, %[r]\n\t"
  141472. #endif
  141473. "uxth r7, %[b]\n\t"
  141474. #ifdef WOLFSSL_KEIL
  141475. "muls r6, r7, r6\n\t"
  141476. #elif defined(__clang__)
  141477. "muls r6, r7\n\t"
  141478. #else
  141479. "mul r6, r7\n\t"
  141480. #endif
  141481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141482. "lsrs r7, r6, #16\n\t"
  141483. #else
  141484. "lsr r7, r6, #16\n\t"
  141485. #endif
  141486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141487. "lsls r6, r6, #16\n\t"
  141488. #else
  141489. "lsl r6, r6, #16\n\t"
  141490. #endif
  141491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141492. "adds r3, r3, r6\n\t"
  141493. #else
  141494. "add r3, r3, r6\n\t"
  141495. #endif
  141496. #ifdef WOLFSSL_KEIL
  141497. "adcs r4, r4, r7\n\t"
  141498. #elif defined(__clang__)
  141499. "adcs r4, r7\n\t"
  141500. #else
  141501. "adc r4, r7\n\t"
  141502. #endif
  141503. #ifdef WOLFSSL_KEIL
  141504. "adcs r5, r5, %[r]\n\t"
  141505. #elif defined(__clang__)
  141506. "adcs r5, %[r]\n\t"
  141507. #else
  141508. "adc r5, %[r]\n\t"
  141509. #endif
  141510. "mov %[r], r8\n\t"
  141511. "str r3, [%[r], #72]\n\t"
  141512. "movs %[r], #0\n\t"
  141513. "# A[4] * B[15]\n\t"
  141514. "movs r3, #0\n\t"
  141515. "mov %[a], r9\n\t"
  141516. "mov %[b], r10\n\t"
  141517. "ldr %[a], [%[a], #16]\n\t"
  141518. "ldr %[b], [%[b], #60]\n\t"
  141519. "uxth r6, %[a]\n\t"
  141520. "uxth r7, %[b]\n\t"
  141521. #ifdef WOLFSSL_KEIL
  141522. "muls r7, r6, r7\n\t"
  141523. #elif defined(__clang__)
  141524. "muls r7, r6\n\t"
  141525. #else
  141526. "mul r7, r6\n\t"
  141527. #endif
  141528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141529. "adds r4, r4, r7\n\t"
  141530. #else
  141531. "add r4, 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. #ifdef WOLFSSL_KEIL
  141541. "adcs r3, r3, %[r]\n\t"
  141542. #elif defined(__clang__)
  141543. "adcs r3, %[r]\n\t"
  141544. #else
  141545. "adc r3, %[r]\n\t"
  141546. #endif
  141547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141548. "lsrs r7, %[b], #16\n\t"
  141549. #else
  141550. "lsr r7, %[b], #16\n\t"
  141551. #endif
  141552. #ifdef WOLFSSL_KEIL
  141553. "muls r6, r7, r6\n\t"
  141554. #elif defined(__clang__)
  141555. "muls r6, r7\n\t"
  141556. #else
  141557. "mul r6, r7\n\t"
  141558. #endif
  141559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141560. "lsrs r7, r6, #16\n\t"
  141561. #else
  141562. "lsr r7, r6, #16\n\t"
  141563. #endif
  141564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141565. "lsls r6, r6, #16\n\t"
  141566. #else
  141567. "lsl r6, r6, #16\n\t"
  141568. #endif
  141569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141570. "adds r4, r4, r6\n\t"
  141571. #else
  141572. "add r4, r4, r6\n\t"
  141573. #endif
  141574. #ifdef WOLFSSL_KEIL
  141575. "adcs r5, r5, r7\n\t"
  141576. #elif defined(__clang__)
  141577. "adcs r5, r7\n\t"
  141578. #else
  141579. "adc r5, r7\n\t"
  141580. #endif
  141581. #ifdef WOLFSSL_KEIL
  141582. "adcs r3, r3, %[r]\n\t"
  141583. #elif defined(__clang__)
  141584. "adcs r3, %[r]\n\t"
  141585. #else
  141586. "adc r3, %[r]\n\t"
  141587. #endif
  141588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141589. "lsrs r6, %[a], #16\n\t"
  141590. #else
  141591. "lsr r6, %[a], #16\n\t"
  141592. #endif
  141593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141594. "lsrs r7, %[b], #16\n\t"
  141595. #else
  141596. "lsr r7, %[b], #16\n\t"
  141597. #endif
  141598. #ifdef WOLFSSL_KEIL
  141599. "muls r7, r6, r7\n\t"
  141600. #elif defined(__clang__)
  141601. "muls r7, r6\n\t"
  141602. #else
  141603. "mul r7, r6\n\t"
  141604. #endif
  141605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141606. "adds r5, r5, r7\n\t"
  141607. #else
  141608. "add r5, r5, r7\n\t"
  141609. #endif
  141610. #ifdef WOLFSSL_KEIL
  141611. "adcs r3, r3, %[r]\n\t"
  141612. #elif defined(__clang__)
  141613. "adcs r3, %[r]\n\t"
  141614. #else
  141615. "adc r3, %[r]\n\t"
  141616. #endif
  141617. "uxth r7, %[b]\n\t"
  141618. #ifdef WOLFSSL_KEIL
  141619. "muls r6, r7, r6\n\t"
  141620. #elif defined(__clang__)
  141621. "muls r6, r7\n\t"
  141622. #else
  141623. "mul r6, r7\n\t"
  141624. #endif
  141625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141626. "lsrs r7, r6, #16\n\t"
  141627. #else
  141628. "lsr r7, r6, #16\n\t"
  141629. #endif
  141630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141631. "lsls r6, r6, #16\n\t"
  141632. #else
  141633. "lsl r6, r6, #16\n\t"
  141634. #endif
  141635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141636. "adds r4, r4, r6\n\t"
  141637. #else
  141638. "add r4, r4, r6\n\t"
  141639. #endif
  141640. #ifdef WOLFSSL_KEIL
  141641. "adcs r5, r5, r7\n\t"
  141642. #elif defined(__clang__)
  141643. "adcs r5, r7\n\t"
  141644. #else
  141645. "adc r5, r7\n\t"
  141646. #endif
  141647. #ifdef WOLFSSL_KEIL
  141648. "adcs r3, r3, %[r]\n\t"
  141649. #elif defined(__clang__)
  141650. "adcs r3, %[r]\n\t"
  141651. #else
  141652. "adc r3, %[r]\n\t"
  141653. #endif
  141654. "# A[5] * B[14]\n\t"
  141655. "mov %[a], r9\n\t"
  141656. "mov %[b], r10\n\t"
  141657. "ldr %[a], [%[a], #20]\n\t"
  141658. "ldr %[b], [%[b], #56]\n\t"
  141659. "uxth r6, %[a]\n\t"
  141660. "uxth r7, %[b]\n\t"
  141661. #ifdef WOLFSSL_KEIL
  141662. "muls r7, r6, r7\n\t"
  141663. #elif defined(__clang__)
  141664. "muls r7, r6\n\t"
  141665. #else
  141666. "mul r7, r6\n\t"
  141667. #endif
  141668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141669. "adds r4, r4, r7\n\t"
  141670. #else
  141671. "add r4, 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. #ifdef WOLFSSL_KEIL
  141681. "adcs r3, r3, %[r]\n\t"
  141682. #elif defined(__clang__)
  141683. "adcs r3, %[r]\n\t"
  141684. #else
  141685. "adc r3, %[r]\n\t"
  141686. #endif
  141687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141688. "lsrs r7, %[b], #16\n\t"
  141689. #else
  141690. "lsr r7, %[b], #16\n\t"
  141691. #endif
  141692. #ifdef WOLFSSL_KEIL
  141693. "muls r6, r7, r6\n\t"
  141694. #elif defined(__clang__)
  141695. "muls r6, r7\n\t"
  141696. #else
  141697. "mul r6, r7\n\t"
  141698. #endif
  141699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141700. "lsrs r7, r6, #16\n\t"
  141701. #else
  141702. "lsr r7, r6, #16\n\t"
  141703. #endif
  141704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141705. "lsls r6, r6, #16\n\t"
  141706. #else
  141707. "lsl r6, r6, #16\n\t"
  141708. #endif
  141709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141710. "adds r4, r4, r6\n\t"
  141711. #else
  141712. "add r4, r4, r6\n\t"
  141713. #endif
  141714. #ifdef WOLFSSL_KEIL
  141715. "adcs r5, r5, r7\n\t"
  141716. #elif defined(__clang__)
  141717. "adcs r5, r7\n\t"
  141718. #else
  141719. "adc r5, r7\n\t"
  141720. #endif
  141721. #ifdef WOLFSSL_KEIL
  141722. "adcs r3, r3, %[r]\n\t"
  141723. #elif defined(__clang__)
  141724. "adcs r3, %[r]\n\t"
  141725. #else
  141726. "adc r3, %[r]\n\t"
  141727. #endif
  141728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141729. "lsrs r6, %[a], #16\n\t"
  141730. #else
  141731. "lsr r6, %[a], #16\n\t"
  141732. #endif
  141733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141734. "lsrs r7, %[b], #16\n\t"
  141735. #else
  141736. "lsr r7, %[b], #16\n\t"
  141737. #endif
  141738. #ifdef WOLFSSL_KEIL
  141739. "muls r7, r6, r7\n\t"
  141740. #elif defined(__clang__)
  141741. "muls r7, r6\n\t"
  141742. #else
  141743. "mul r7, r6\n\t"
  141744. #endif
  141745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141746. "adds r5, r5, r7\n\t"
  141747. #else
  141748. "add r5, r5, r7\n\t"
  141749. #endif
  141750. #ifdef WOLFSSL_KEIL
  141751. "adcs r3, r3, %[r]\n\t"
  141752. #elif defined(__clang__)
  141753. "adcs r3, %[r]\n\t"
  141754. #else
  141755. "adc r3, %[r]\n\t"
  141756. #endif
  141757. "uxth r7, %[b]\n\t"
  141758. #ifdef WOLFSSL_KEIL
  141759. "muls r6, r7, r6\n\t"
  141760. #elif defined(__clang__)
  141761. "muls r6, r7\n\t"
  141762. #else
  141763. "mul r6, r7\n\t"
  141764. #endif
  141765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141766. "lsrs r7, r6, #16\n\t"
  141767. #else
  141768. "lsr r7, r6, #16\n\t"
  141769. #endif
  141770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141771. "lsls r6, r6, #16\n\t"
  141772. #else
  141773. "lsl r6, r6, #16\n\t"
  141774. #endif
  141775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141776. "adds r4, r4, r6\n\t"
  141777. #else
  141778. "add r4, r4, r6\n\t"
  141779. #endif
  141780. #ifdef WOLFSSL_KEIL
  141781. "adcs r5, r5, r7\n\t"
  141782. #elif defined(__clang__)
  141783. "adcs r5, r7\n\t"
  141784. #else
  141785. "adc r5, r7\n\t"
  141786. #endif
  141787. #ifdef WOLFSSL_KEIL
  141788. "adcs r3, r3, %[r]\n\t"
  141789. #elif defined(__clang__)
  141790. "adcs r3, %[r]\n\t"
  141791. #else
  141792. "adc r3, %[r]\n\t"
  141793. #endif
  141794. "# A[6] * B[13]\n\t"
  141795. "mov %[a], r9\n\t"
  141796. "mov %[b], r10\n\t"
  141797. "ldr %[a], [%[a], #24]\n\t"
  141798. "ldr %[b], [%[b], #52]\n\t"
  141799. "uxth r6, %[a]\n\t"
  141800. "uxth r7, %[b]\n\t"
  141801. #ifdef WOLFSSL_KEIL
  141802. "muls r7, r6, r7\n\t"
  141803. #elif defined(__clang__)
  141804. "muls r7, r6\n\t"
  141805. #else
  141806. "mul r7, r6\n\t"
  141807. #endif
  141808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141809. "adds r4, r4, r7\n\t"
  141810. #else
  141811. "add r4, 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. #ifdef WOLFSSL_KEIL
  141821. "adcs r3, r3, %[r]\n\t"
  141822. #elif defined(__clang__)
  141823. "adcs r3, %[r]\n\t"
  141824. #else
  141825. "adc r3, %[r]\n\t"
  141826. #endif
  141827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141828. "lsrs r7, %[b], #16\n\t"
  141829. #else
  141830. "lsr r7, %[b], #16\n\t"
  141831. #endif
  141832. #ifdef WOLFSSL_KEIL
  141833. "muls r6, r7, r6\n\t"
  141834. #elif defined(__clang__)
  141835. "muls r6, r7\n\t"
  141836. #else
  141837. "mul r6, r7\n\t"
  141838. #endif
  141839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141840. "lsrs r7, r6, #16\n\t"
  141841. #else
  141842. "lsr r7, r6, #16\n\t"
  141843. #endif
  141844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141845. "lsls r6, r6, #16\n\t"
  141846. #else
  141847. "lsl r6, r6, #16\n\t"
  141848. #endif
  141849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141850. "adds r4, r4, r6\n\t"
  141851. #else
  141852. "add r4, r4, r6\n\t"
  141853. #endif
  141854. #ifdef WOLFSSL_KEIL
  141855. "adcs r5, r5, r7\n\t"
  141856. #elif defined(__clang__)
  141857. "adcs r5, r7\n\t"
  141858. #else
  141859. "adc r5, r7\n\t"
  141860. #endif
  141861. #ifdef WOLFSSL_KEIL
  141862. "adcs r3, r3, %[r]\n\t"
  141863. #elif defined(__clang__)
  141864. "adcs r3, %[r]\n\t"
  141865. #else
  141866. "adc r3, %[r]\n\t"
  141867. #endif
  141868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141869. "lsrs r6, %[a], #16\n\t"
  141870. #else
  141871. "lsr r6, %[a], #16\n\t"
  141872. #endif
  141873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141874. "lsrs r7, %[b], #16\n\t"
  141875. #else
  141876. "lsr r7, %[b], #16\n\t"
  141877. #endif
  141878. #ifdef WOLFSSL_KEIL
  141879. "muls r7, r6, r7\n\t"
  141880. #elif defined(__clang__)
  141881. "muls r7, r6\n\t"
  141882. #else
  141883. "mul r7, r6\n\t"
  141884. #endif
  141885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141886. "adds r5, r5, r7\n\t"
  141887. #else
  141888. "add r5, r5, r7\n\t"
  141889. #endif
  141890. #ifdef WOLFSSL_KEIL
  141891. "adcs r3, r3, %[r]\n\t"
  141892. #elif defined(__clang__)
  141893. "adcs r3, %[r]\n\t"
  141894. #else
  141895. "adc r3, %[r]\n\t"
  141896. #endif
  141897. "uxth r7, %[b]\n\t"
  141898. #ifdef WOLFSSL_KEIL
  141899. "muls r6, r7, r6\n\t"
  141900. #elif defined(__clang__)
  141901. "muls r6, r7\n\t"
  141902. #else
  141903. "mul r6, r7\n\t"
  141904. #endif
  141905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141906. "lsrs r7, r6, #16\n\t"
  141907. #else
  141908. "lsr r7, r6, #16\n\t"
  141909. #endif
  141910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141911. "lsls r6, r6, #16\n\t"
  141912. #else
  141913. "lsl r6, r6, #16\n\t"
  141914. #endif
  141915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141916. "adds r4, r4, r6\n\t"
  141917. #else
  141918. "add r4, r4, r6\n\t"
  141919. #endif
  141920. #ifdef WOLFSSL_KEIL
  141921. "adcs r5, r5, r7\n\t"
  141922. #elif defined(__clang__)
  141923. "adcs r5, r7\n\t"
  141924. #else
  141925. "adc r5, r7\n\t"
  141926. #endif
  141927. #ifdef WOLFSSL_KEIL
  141928. "adcs r3, r3, %[r]\n\t"
  141929. #elif defined(__clang__)
  141930. "adcs r3, %[r]\n\t"
  141931. #else
  141932. "adc r3, %[r]\n\t"
  141933. #endif
  141934. "# A[7] * B[12]\n\t"
  141935. "mov %[a], r9\n\t"
  141936. "mov %[b], r10\n\t"
  141937. "ldr %[a], [%[a], #28]\n\t"
  141938. "ldr %[b], [%[b], #48]\n\t"
  141939. "uxth r6, %[a]\n\t"
  141940. "uxth r7, %[b]\n\t"
  141941. #ifdef WOLFSSL_KEIL
  141942. "muls r7, r6, r7\n\t"
  141943. #elif defined(__clang__)
  141944. "muls r7, r6\n\t"
  141945. #else
  141946. "mul r7, r6\n\t"
  141947. #endif
  141948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141949. "adds r4, r4, r7\n\t"
  141950. #else
  141951. "add r4, 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. #ifdef WOLFSSL_KEIL
  141961. "adcs r3, r3, %[r]\n\t"
  141962. #elif defined(__clang__)
  141963. "adcs r3, %[r]\n\t"
  141964. #else
  141965. "adc r3, %[r]\n\t"
  141966. #endif
  141967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141968. "lsrs r7, %[b], #16\n\t"
  141969. #else
  141970. "lsr r7, %[b], #16\n\t"
  141971. #endif
  141972. #ifdef WOLFSSL_KEIL
  141973. "muls r6, r7, r6\n\t"
  141974. #elif defined(__clang__)
  141975. "muls r6, r7\n\t"
  141976. #else
  141977. "mul r6, r7\n\t"
  141978. #endif
  141979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141980. "lsrs r7, r6, #16\n\t"
  141981. #else
  141982. "lsr r7, r6, #16\n\t"
  141983. #endif
  141984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141985. "lsls r6, r6, #16\n\t"
  141986. #else
  141987. "lsl r6, r6, #16\n\t"
  141988. #endif
  141989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141990. "adds r4, r4, r6\n\t"
  141991. #else
  141992. "add r4, r4, r6\n\t"
  141993. #endif
  141994. #ifdef WOLFSSL_KEIL
  141995. "adcs r5, r5, r7\n\t"
  141996. #elif defined(__clang__)
  141997. "adcs r5, r7\n\t"
  141998. #else
  141999. "adc r5, r7\n\t"
  142000. #endif
  142001. #ifdef WOLFSSL_KEIL
  142002. "adcs r3, r3, %[r]\n\t"
  142003. #elif defined(__clang__)
  142004. "adcs r3, %[r]\n\t"
  142005. #else
  142006. "adc r3, %[r]\n\t"
  142007. #endif
  142008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142009. "lsrs r6, %[a], #16\n\t"
  142010. #else
  142011. "lsr r6, %[a], #16\n\t"
  142012. #endif
  142013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142014. "lsrs r7, %[b], #16\n\t"
  142015. #else
  142016. "lsr r7, %[b], #16\n\t"
  142017. #endif
  142018. #ifdef WOLFSSL_KEIL
  142019. "muls r7, r6, r7\n\t"
  142020. #elif defined(__clang__)
  142021. "muls r7, r6\n\t"
  142022. #else
  142023. "mul r7, r6\n\t"
  142024. #endif
  142025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142026. "adds r5, r5, r7\n\t"
  142027. #else
  142028. "add r5, r5, r7\n\t"
  142029. #endif
  142030. #ifdef WOLFSSL_KEIL
  142031. "adcs r3, r3, %[r]\n\t"
  142032. #elif defined(__clang__)
  142033. "adcs r3, %[r]\n\t"
  142034. #else
  142035. "adc r3, %[r]\n\t"
  142036. #endif
  142037. "uxth r7, %[b]\n\t"
  142038. #ifdef WOLFSSL_KEIL
  142039. "muls r6, r7, r6\n\t"
  142040. #elif defined(__clang__)
  142041. "muls r6, r7\n\t"
  142042. #else
  142043. "mul r6, r7\n\t"
  142044. #endif
  142045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142046. "lsrs r7, r6, #16\n\t"
  142047. #else
  142048. "lsr r7, r6, #16\n\t"
  142049. #endif
  142050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142051. "lsls r6, r6, #16\n\t"
  142052. #else
  142053. "lsl r6, r6, #16\n\t"
  142054. #endif
  142055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142056. "adds r4, r4, r6\n\t"
  142057. #else
  142058. "add r4, r4, r6\n\t"
  142059. #endif
  142060. #ifdef WOLFSSL_KEIL
  142061. "adcs r5, r5, r7\n\t"
  142062. #elif defined(__clang__)
  142063. "adcs r5, r7\n\t"
  142064. #else
  142065. "adc r5, r7\n\t"
  142066. #endif
  142067. #ifdef WOLFSSL_KEIL
  142068. "adcs r3, r3, %[r]\n\t"
  142069. #elif defined(__clang__)
  142070. "adcs r3, %[r]\n\t"
  142071. #else
  142072. "adc r3, %[r]\n\t"
  142073. #endif
  142074. "# A[8] * B[11]\n\t"
  142075. "mov %[a], r9\n\t"
  142076. "mov %[b], r10\n\t"
  142077. "ldr %[a], [%[a], #32]\n\t"
  142078. "ldr %[b], [%[b], #44]\n\t"
  142079. "uxth r6, %[a]\n\t"
  142080. "uxth r7, %[b]\n\t"
  142081. #ifdef WOLFSSL_KEIL
  142082. "muls r7, r6, r7\n\t"
  142083. #elif defined(__clang__)
  142084. "muls r7, r6\n\t"
  142085. #else
  142086. "mul r7, r6\n\t"
  142087. #endif
  142088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142089. "adds r4, r4, r7\n\t"
  142090. #else
  142091. "add r4, 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. #ifdef WOLFSSL_KEIL
  142101. "adcs r3, r3, %[r]\n\t"
  142102. #elif defined(__clang__)
  142103. "adcs r3, %[r]\n\t"
  142104. #else
  142105. "adc r3, %[r]\n\t"
  142106. #endif
  142107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142108. "lsrs r7, %[b], #16\n\t"
  142109. #else
  142110. "lsr r7, %[b], #16\n\t"
  142111. #endif
  142112. #ifdef WOLFSSL_KEIL
  142113. "muls r6, r7, r6\n\t"
  142114. #elif defined(__clang__)
  142115. "muls r6, r7\n\t"
  142116. #else
  142117. "mul r6, r7\n\t"
  142118. #endif
  142119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142120. "lsrs r7, r6, #16\n\t"
  142121. #else
  142122. "lsr r7, r6, #16\n\t"
  142123. #endif
  142124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142125. "lsls r6, r6, #16\n\t"
  142126. #else
  142127. "lsl r6, r6, #16\n\t"
  142128. #endif
  142129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142130. "adds r4, r4, r6\n\t"
  142131. #else
  142132. "add r4, r4, r6\n\t"
  142133. #endif
  142134. #ifdef WOLFSSL_KEIL
  142135. "adcs r5, r5, r7\n\t"
  142136. #elif defined(__clang__)
  142137. "adcs r5, r7\n\t"
  142138. #else
  142139. "adc r5, r7\n\t"
  142140. #endif
  142141. #ifdef WOLFSSL_KEIL
  142142. "adcs r3, r3, %[r]\n\t"
  142143. #elif defined(__clang__)
  142144. "adcs r3, %[r]\n\t"
  142145. #else
  142146. "adc r3, %[r]\n\t"
  142147. #endif
  142148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142149. "lsrs r6, %[a], #16\n\t"
  142150. #else
  142151. "lsr r6, %[a], #16\n\t"
  142152. #endif
  142153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142154. "lsrs r7, %[b], #16\n\t"
  142155. #else
  142156. "lsr r7, %[b], #16\n\t"
  142157. #endif
  142158. #ifdef WOLFSSL_KEIL
  142159. "muls r7, r6, r7\n\t"
  142160. #elif defined(__clang__)
  142161. "muls r7, r6\n\t"
  142162. #else
  142163. "mul r7, r6\n\t"
  142164. #endif
  142165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142166. "adds r5, r5, r7\n\t"
  142167. #else
  142168. "add r5, r5, r7\n\t"
  142169. #endif
  142170. #ifdef WOLFSSL_KEIL
  142171. "adcs r3, r3, %[r]\n\t"
  142172. #elif defined(__clang__)
  142173. "adcs r3, %[r]\n\t"
  142174. #else
  142175. "adc r3, %[r]\n\t"
  142176. #endif
  142177. "uxth r7, %[b]\n\t"
  142178. #ifdef WOLFSSL_KEIL
  142179. "muls r6, r7, r6\n\t"
  142180. #elif defined(__clang__)
  142181. "muls r6, r7\n\t"
  142182. #else
  142183. "mul r6, r7\n\t"
  142184. #endif
  142185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142186. "lsrs r7, r6, #16\n\t"
  142187. #else
  142188. "lsr r7, r6, #16\n\t"
  142189. #endif
  142190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142191. "lsls r6, r6, #16\n\t"
  142192. #else
  142193. "lsl r6, r6, #16\n\t"
  142194. #endif
  142195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142196. "adds r4, r4, r6\n\t"
  142197. #else
  142198. "add r4, r4, r6\n\t"
  142199. #endif
  142200. #ifdef WOLFSSL_KEIL
  142201. "adcs r5, r5, r7\n\t"
  142202. #elif defined(__clang__)
  142203. "adcs r5, r7\n\t"
  142204. #else
  142205. "adc r5, r7\n\t"
  142206. #endif
  142207. #ifdef WOLFSSL_KEIL
  142208. "adcs r3, r3, %[r]\n\t"
  142209. #elif defined(__clang__)
  142210. "adcs r3, %[r]\n\t"
  142211. #else
  142212. "adc r3, %[r]\n\t"
  142213. #endif
  142214. "# A[9] * B[10]\n\t"
  142215. "mov %[a], r9\n\t"
  142216. "mov %[b], r10\n\t"
  142217. "ldr %[a], [%[a], #36]\n\t"
  142218. "ldr %[b], [%[b], #40]\n\t"
  142219. "uxth r6, %[a]\n\t"
  142220. "uxth r7, %[b]\n\t"
  142221. #ifdef WOLFSSL_KEIL
  142222. "muls r7, r6, r7\n\t"
  142223. #elif defined(__clang__)
  142224. "muls r7, r6\n\t"
  142225. #else
  142226. "mul r7, r6\n\t"
  142227. #endif
  142228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142229. "adds r4, r4, r7\n\t"
  142230. #else
  142231. "add r4, 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. #ifdef WOLFSSL_KEIL
  142241. "adcs r3, r3, %[r]\n\t"
  142242. #elif defined(__clang__)
  142243. "adcs r3, %[r]\n\t"
  142244. #else
  142245. "adc r3, %[r]\n\t"
  142246. #endif
  142247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142248. "lsrs r7, %[b], #16\n\t"
  142249. #else
  142250. "lsr r7, %[b], #16\n\t"
  142251. #endif
  142252. #ifdef WOLFSSL_KEIL
  142253. "muls r6, r7, r6\n\t"
  142254. #elif defined(__clang__)
  142255. "muls r6, r7\n\t"
  142256. #else
  142257. "mul r6, r7\n\t"
  142258. #endif
  142259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142260. "lsrs r7, r6, #16\n\t"
  142261. #else
  142262. "lsr r7, r6, #16\n\t"
  142263. #endif
  142264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142265. "lsls r6, r6, #16\n\t"
  142266. #else
  142267. "lsl r6, r6, #16\n\t"
  142268. #endif
  142269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142270. "adds r4, r4, r6\n\t"
  142271. #else
  142272. "add r4, r4, r6\n\t"
  142273. #endif
  142274. #ifdef WOLFSSL_KEIL
  142275. "adcs r5, r5, r7\n\t"
  142276. #elif defined(__clang__)
  142277. "adcs r5, r7\n\t"
  142278. #else
  142279. "adc r5, r7\n\t"
  142280. #endif
  142281. #ifdef WOLFSSL_KEIL
  142282. "adcs r3, r3, %[r]\n\t"
  142283. #elif defined(__clang__)
  142284. "adcs r3, %[r]\n\t"
  142285. #else
  142286. "adc r3, %[r]\n\t"
  142287. #endif
  142288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142289. "lsrs r6, %[a], #16\n\t"
  142290. #else
  142291. "lsr r6, %[a], #16\n\t"
  142292. #endif
  142293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142294. "lsrs r7, %[b], #16\n\t"
  142295. #else
  142296. "lsr r7, %[b], #16\n\t"
  142297. #endif
  142298. #ifdef WOLFSSL_KEIL
  142299. "muls r7, r6, r7\n\t"
  142300. #elif defined(__clang__)
  142301. "muls r7, r6\n\t"
  142302. #else
  142303. "mul r7, r6\n\t"
  142304. #endif
  142305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142306. "adds r5, r5, r7\n\t"
  142307. #else
  142308. "add r5, r5, r7\n\t"
  142309. #endif
  142310. #ifdef WOLFSSL_KEIL
  142311. "adcs r3, r3, %[r]\n\t"
  142312. #elif defined(__clang__)
  142313. "adcs r3, %[r]\n\t"
  142314. #else
  142315. "adc r3, %[r]\n\t"
  142316. #endif
  142317. "uxth r7, %[b]\n\t"
  142318. #ifdef WOLFSSL_KEIL
  142319. "muls r6, r7, r6\n\t"
  142320. #elif defined(__clang__)
  142321. "muls r6, r7\n\t"
  142322. #else
  142323. "mul r6, r7\n\t"
  142324. #endif
  142325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142326. "lsrs r7, r6, #16\n\t"
  142327. #else
  142328. "lsr r7, r6, #16\n\t"
  142329. #endif
  142330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142331. "lsls r6, r6, #16\n\t"
  142332. #else
  142333. "lsl r6, r6, #16\n\t"
  142334. #endif
  142335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142336. "adds r4, r4, r6\n\t"
  142337. #else
  142338. "add r4, r4, r6\n\t"
  142339. #endif
  142340. #ifdef WOLFSSL_KEIL
  142341. "adcs r5, r5, r7\n\t"
  142342. #elif defined(__clang__)
  142343. "adcs r5, r7\n\t"
  142344. #else
  142345. "adc r5, r7\n\t"
  142346. #endif
  142347. #ifdef WOLFSSL_KEIL
  142348. "adcs r3, r3, %[r]\n\t"
  142349. #elif defined(__clang__)
  142350. "adcs r3, %[r]\n\t"
  142351. #else
  142352. "adc r3, %[r]\n\t"
  142353. #endif
  142354. "# A[10] * B[9]\n\t"
  142355. "mov %[a], r9\n\t"
  142356. "mov %[b], r10\n\t"
  142357. "ldr %[a], [%[a], #40]\n\t"
  142358. "ldr %[b], [%[b], #36]\n\t"
  142359. "uxth r6, %[a]\n\t"
  142360. "uxth r7, %[b]\n\t"
  142361. #ifdef WOLFSSL_KEIL
  142362. "muls r7, r6, r7\n\t"
  142363. #elif defined(__clang__)
  142364. "muls r7, r6\n\t"
  142365. #else
  142366. "mul r7, r6\n\t"
  142367. #endif
  142368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142369. "adds r4, r4, r7\n\t"
  142370. #else
  142371. "add r4, r4, r7\n\t"
  142372. #endif
  142373. #ifdef WOLFSSL_KEIL
  142374. "adcs r5, r5, %[r]\n\t"
  142375. #elif defined(__clang__)
  142376. "adcs r5, %[r]\n\t"
  142377. #else
  142378. "adc r5, %[r]\n\t"
  142379. #endif
  142380. #ifdef WOLFSSL_KEIL
  142381. "adcs r3, r3, %[r]\n\t"
  142382. #elif defined(__clang__)
  142383. "adcs r3, %[r]\n\t"
  142384. #else
  142385. "adc r3, %[r]\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 r6, r7, r6\n\t"
  142394. #elif defined(__clang__)
  142395. "muls r6, r7\n\t"
  142396. #else
  142397. "mul r6, r7\n\t"
  142398. #endif
  142399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142400. "lsrs r7, r6, #16\n\t"
  142401. #else
  142402. "lsr r7, r6, #16\n\t"
  142403. #endif
  142404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142405. "lsls r6, r6, #16\n\t"
  142406. #else
  142407. "lsl r6, r6, #16\n\t"
  142408. #endif
  142409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142410. "adds r4, r4, r6\n\t"
  142411. #else
  142412. "add r4, r4, r6\n\t"
  142413. #endif
  142414. #ifdef WOLFSSL_KEIL
  142415. "adcs r5, r5, r7\n\t"
  142416. #elif defined(__clang__)
  142417. "adcs r5, r7\n\t"
  142418. #else
  142419. "adc r5, r7\n\t"
  142420. #endif
  142421. #ifdef WOLFSSL_KEIL
  142422. "adcs r3, r3, %[r]\n\t"
  142423. #elif defined(__clang__)
  142424. "adcs r3, %[r]\n\t"
  142425. #else
  142426. "adc r3, %[r]\n\t"
  142427. #endif
  142428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142429. "lsrs r6, %[a], #16\n\t"
  142430. #else
  142431. "lsr r6, %[a], #16\n\t"
  142432. #endif
  142433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142434. "lsrs r7, %[b], #16\n\t"
  142435. #else
  142436. "lsr r7, %[b], #16\n\t"
  142437. #endif
  142438. #ifdef WOLFSSL_KEIL
  142439. "muls r7, r6, r7\n\t"
  142440. #elif defined(__clang__)
  142441. "muls r7, r6\n\t"
  142442. #else
  142443. "mul r7, r6\n\t"
  142444. #endif
  142445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142446. "adds r5, r5, r7\n\t"
  142447. #else
  142448. "add r5, r5, r7\n\t"
  142449. #endif
  142450. #ifdef WOLFSSL_KEIL
  142451. "adcs r3, r3, %[r]\n\t"
  142452. #elif defined(__clang__)
  142453. "adcs r3, %[r]\n\t"
  142454. #else
  142455. "adc r3, %[r]\n\t"
  142456. #endif
  142457. "uxth r7, %[b]\n\t"
  142458. #ifdef WOLFSSL_KEIL
  142459. "muls r6, r7, r6\n\t"
  142460. #elif defined(__clang__)
  142461. "muls r6, r7\n\t"
  142462. #else
  142463. "mul r6, r7\n\t"
  142464. #endif
  142465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142466. "lsrs r7, r6, #16\n\t"
  142467. #else
  142468. "lsr r7, r6, #16\n\t"
  142469. #endif
  142470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142471. "lsls r6, r6, #16\n\t"
  142472. #else
  142473. "lsl r6, r6, #16\n\t"
  142474. #endif
  142475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142476. "adds r4, r4, r6\n\t"
  142477. #else
  142478. "add r4, r4, r6\n\t"
  142479. #endif
  142480. #ifdef WOLFSSL_KEIL
  142481. "adcs r5, r5, r7\n\t"
  142482. #elif defined(__clang__)
  142483. "adcs r5, r7\n\t"
  142484. #else
  142485. "adc r5, r7\n\t"
  142486. #endif
  142487. #ifdef WOLFSSL_KEIL
  142488. "adcs r3, r3, %[r]\n\t"
  142489. #elif defined(__clang__)
  142490. "adcs r3, %[r]\n\t"
  142491. #else
  142492. "adc r3, %[r]\n\t"
  142493. #endif
  142494. "# A[11] * B[8]\n\t"
  142495. "mov %[a], r9\n\t"
  142496. "mov %[b], r10\n\t"
  142497. "ldr %[a], [%[a], #44]\n\t"
  142498. "ldr %[b], [%[b], #32]\n\t"
  142499. "uxth r6, %[a]\n\t"
  142500. "uxth r7, %[b]\n\t"
  142501. #ifdef WOLFSSL_KEIL
  142502. "muls r7, r6, r7\n\t"
  142503. #elif defined(__clang__)
  142504. "muls r7, r6\n\t"
  142505. #else
  142506. "mul r7, r6\n\t"
  142507. #endif
  142508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142509. "adds r4, r4, r7\n\t"
  142510. #else
  142511. "add r4, r4, r7\n\t"
  142512. #endif
  142513. #ifdef WOLFSSL_KEIL
  142514. "adcs r5, r5, %[r]\n\t"
  142515. #elif defined(__clang__)
  142516. "adcs r5, %[r]\n\t"
  142517. #else
  142518. "adc r5, %[r]\n\t"
  142519. #endif
  142520. #ifdef WOLFSSL_KEIL
  142521. "adcs r3, r3, %[r]\n\t"
  142522. #elif defined(__clang__)
  142523. "adcs r3, %[r]\n\t"
  142524. #else
  142525. "adc r3, %[r]\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 r6, r7, r6\n\t"
  142534. #elif defined(__clang__)
  142535. "muls r6, r7\n\t"
  142536. #else
  142537. "mul r6, r7\n\t"
  142538. #endif
  142539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142540. "lsrs r7, r6, #16\n\t"
  142541. #else
  142542. "lsr r7, r6, #16\n\t"
  142543. #endif
  142544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142545. "lsls r6, r6, #16\n\t"
  142546. #else
  142547. "lsl r6, r6, #16\n\t"
  142548. #endif
  142549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142550. "adds r4, r4, r6\n\t"
  142551. #else
  142552. "add r4, r4, r6\n\t"
  142553. #endif
  142554. #ifdef WOLFSSL_KEIL
  142555. "adcs r5, r5, r7\n\t"
  142556. #elif defined(__clang__)
  142557. "adcs r5, r7\n\t"
  142558. #else
  142559. "adc r5, r7\n\t"
  142560. #endif
  142561. #ifdef WOLFSSL_KEIL
  142562. "adcs r3, r3, %[r]\n\t"
  142563. #elif defined(__clang__)
  142564. "adcs r3, %[r]\n\t"
  142565. #else
  142566. "adc r3, %[r]\n\t"
  142567. #endif
  142568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142569. "lsrs r6, %[a], #16\n\t"
  142570. #else
  142571. "lsr r6, %[a], #16\n\t"
  142572. #endif
  142573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142574. "lsrs r7, %[b], #16\n\t"
  142575. #else
  142576. "lsr r7, %[b], #16\n\t"
  142577. #endif
  142578. #ifdef WOLFSSL_KEIL
  142579. "muls r7, r6, r7\n\t"
  142580. #elif defined(__clang__)
  142581. "muls r7, r6\n\t"
  142582. #else
  142583. "mul r7, r6\n\t"
  142584. #endif
  142585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142586. "adds r5, r5, r7\n\t"
  142587. #else
  142588. "add r5, r5, r7\n\t"
  142589. #endif
  142590. #ifdef WOLFSSL_KEIL
  142591. "adcs r3, r3, %[r]\n\t"
  142592. #elif defined(__clang__)
  142593. "adcs r3, %[r]\n\t"
  142594. #else
  142595. "adc r3, %[r]\n\t"
  142596. #endif
  142597. "uxth r7, %[b]\n\t"
  142598. #ifdef WOLFSSL_KEIL
  142599. "muls r6, r7, r6\n\t"
  142600. #elif defined(__clang__)
  142601. "muls r6, r7\n\t"
  142602. #else
  142603. "mul r6, r7\n\t"
  142604. #endif
  142605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142606. "lsrs r7, r6, #16\n\t"
  142607. #else
  142608. "lsr r7, r6, #16\n\t"
  142609. #endif
  142610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142611. "lsls r6, r6, #16\n\t"
  142612. #else
  142613. "lsl r6, r6, #16\n\t"
  142614. #endif
  142615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142616. "adds r4, r4, r6\n\t"
  142617. #else
  142618. "add r4, r4, r6\n\t"
  142619. #endif
  142620. #ifdef WOLFSSL_KEIL
  142621. "adcs r5, r5, r7\n\t"
  142622. #elif defined(__clang__)
  142623. "adcs r5, r7\n\t"
  142624. #else
  142625. "adc r5, r7\n\t"
  142626. #endif
  142627. #ifdef WOLFSSL_KEIL
  142628. "adcs r3, r3, %[r]\n\t"
  142629. #elif defined(__clang__)
  142630. "adcs r3, %[r]\n\t"
  142631. #else
  142632. "adc r3, %[r]\n\t"
  142633. #endif
  142634. "# A[12] * B[7]\n\t"
  142635. "mov %[a], r9\n\t"
  142636. "mov %[b], r10\n\t"
  142637. "ldr %[a], [%[a], #48]\n\t"
  142638. "ldr %[b], [%[b], #28]\n\t"
  142639. "uxth r6, %[a]\n\t"
  142640. "uxth r7, %[b]\n\t"
  142641. #ifdef WOLFSSL_KEIL
  142642. "muls r7, r6, r7\n\t"
  142643. #elif defined(__clang__)
  142644. "muls r7, r6\n\t"
  142645. #else
  142646. "mul r7, r6\n\t"
  142647. #endif
  142648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142649. "adds r4, r4, r7\n\t"
  142650. #else
  142651. "add r4, r4, r7\n\t"
  142652. #endif
  142653. #ifdef WOLFSSL_KEIL
  142654. "adcs r5, r5, %[r]\n\t"
  142655. #elif defined(__clang__)
  142656. "adcs r5, %[r]\n\t"
  142657. #else
  142658. "adc r5, %[r]\n\t"
  142659. #endif
  142660. #ifdef WOLFSSL_KEIL
  142661. "adcs r3, r3, %[r]\n\t"
  142662. #elif defined(__clang__)
  142663. "adcs r3, %[r]\n\t"
  142664. #else
  142665. "adc r3, %[r]\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 r6, r7, r6\n\t"
  142674. #elif defined(__clang__)
  142675. "muls r6, r7\n\t"
  142676. #else
  142677. "mul r6, r7\n\t"
  142678. #endif
  142679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142680. "lsrs r7, r6, #16\n\t"
  142681. #else
  142682. "lsr r7, r6, #16\n\t"
  142683. #endif
  142684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142685. "lsls r6, r6, #16\n\t"
  142686. #else
  142687. "lsl r6, r6, #16\n\t"
  142688. #endif
  142689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142690. "adds r4, r4, r6\n\t"
  142691. #else
  142692. "add r4, r4, r6\n\t"
  142693. #endif
  142694. #ifdef WOLFSSL_KEIL
  142695. "adcs r5, r5, r7\n\t"
  142696. #elif defined(__clang__)
  142697. "adcs r5, r7\n\t"
  142698. #else
  142699. "adc r5, r7\n\t"
  142700. #endif
  142701. #ifdef WOLFSSL_KEIL
  142702. "adcs r3, r3, %[r]\n\t"
  142703. #elif defined(__clang__)
  142704. "adcs r3, %[r]\n\t"
  142705. #else
  142706. "adc r3, %[r]\n\t"
  142707. #endif
  142708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142709. "lsrs r6, %[a], #16\n\t"
  142710. #else
  142711. "lsr r6, %[a], #16\n\t"
  142712. #endif
  142713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142714. "lsrs r7, %[b], #16\n\t"
  142715. #else
  142716. "lsr r7, %[b], #16\n\t"
  142717. #endif
  142718. #ifdef WOLFSSL_KEIL
  142719. "muls r7, r6, r7\n\t"
  142720. #elif defined(__clang__)
  142721. "muls r7, r6\n\t"
  142722. #else
  142723. "mul r7, r6\n\t"
  142724. #endif
  142725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142726. "adds r5, r5, r7\n\t"
  142727. #else
  142728. "add r5, r5, r7\n\t"
  142729. #endif
  142730. #ifdef WOLFSSL_KEIL
  142731. "adcs r3, r3, %[r]\n\t"
  142732. #elif defined(__clang__)
  142733. "adcs r3, %[r]\n\t"
  142734. #else
  142735. "adc r3, %[r]\n\t"
  142736. #endif
  142737. "uxth r7, %[b]\n\t"
  142738. #ifdef WOLFSSL_KEIL
  142739. "muls r6, r7, r6\n\t"
  142740. #elif defined(__clang__)
  142741. "muls r6, r7\n\t"
  142742. #else
  142743. "mul r6, r7\n\t"
  142744. #endif
  142745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142746. "lsrs r7, r6, #16\n\t"
  142747. #else
  142748. "lsr r7, r6, #16\n\t"
  142749. #endif
  142750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142751. "lsls r6, r6, #16\n\t"
  142752. #else
  142753. "lsl r6, r6, #16\n\t"
  142754. #endif
  142755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142756. "adds r4, r4, r6\n\t"
  142757. #else
  142758. "add r4, r4, r6\n\t"
  142759. #endif
  142760. #ifdef WOLFSSL_KEIL
  142761. "adcs r5, r5, r7\n\t"
  142762. #elif defined(__clang__)
  142763. "adcs r5, r7\n\t"
  142764. #else
  142765. "adc r5, r7\n\t"
  142766. #endif
  142767. #ifdef WOLFSSL_KEIL
  142768. "adcs r3, r3, %[r]\n\t"
  142769. #elif defined(__clang__)
  142770. "adcs r3, %[r]\n\t"
  142771. #else
  142772. "adc r3, %[r]\n\t"
  142773. #endif
  142774. "# A[13] * B[6]\n\t"
  142775. "mov %[a], r9\n\t"
  142776. "mov %[b], r10\n\t"
  142777. "ldr %[a], [%[a], #52]\n\t"
  142778. "ldr %[b], [%[b], #24]\n\t"
  142779. "uxth r6, %[a]\n\t"
  142780. "uxth r7, %[b]\n\t"
  142781. #ifdef WOLFSSL_KEIL
  142782. "muls r7, r6, r7\n\t"
  142783. #elif defined(__clang__)
  142784. "muls r7, r6\n\t"
  142785. #else
  142786. "mul r7, r6\n\t"
  142787. #endif
  142788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142789. "adds r4, r4, r7\n\t"
  142790. #else
  142791. "add r4, r4, r7\n\t"
  142792. #endif
  142793. #ifdef WOLFSSL_KEIL
  142794. "adcs r5, r5, %[r]\n\t"
  142795. #elif defined(__clang__)
  142796. "adcs r5, %[r]\n\t"
  142797. #else
  142798. "adc r5, %[r]\n\t"
  142799. #endif
  142800. #ifdef WOLFSSL_KEIL
  142801. "adcs r3, r3, %[r]\n\t"
  142802. #elif defined(__clang__)
  142803. "adcs r3, %[r]\n\t"
  142804. #else
  142805. "adc r3, %[r]\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 r6, r7, r6\n\t"
  142814. #elif defined(__clang__)
  142815. "muls r6, r7\n\t"
  142816. #else
  142817. "mul r6, r7\n\t"
  142818. #endif
  142819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142820. "lsrs r7, r6, #16\n\t"
  142821. #else
  142822. "lsr r7, r6, #16\n\t"
  142823. #endif
  142824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142825. "lsls r6, r6, #16\n\t"
  142826. #else
  142827. "lsl r6, r6, #16\n\t"
  142828. #endif
  142829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142830. "adds r4, r4, r6\n\t"
  142831. #else
  142832. "add r4, r4, r6\n\t"
  142833. #endif
  142834. #ifdef WOLFSSL_KEIL
  142835. "adcs r5, r5, r7\n\t"
  142836. #elif defined(__clang__)
  142837. "adcs r5, r7\n\t"
  142838. #else
  142839. "adc r5, r7\n\t"
  142840. #endif
  142841. #ifdef WOLFSSL_KEIL
  142842. "adcs r3, r3, %[r]\n\t"
  142843. #elif defined(__clang__)
  142844. "adcs r3, %[r]\n\t"
  142845. #else
  142846. "adc r3, %[r]\n\t"
  142847. #endif
  142848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142849. "lsrs r6, %[a], #16\n\t"
  142850. #else
  142851. "lsr r6, %[a], #16\n\t"
  142852. #endif
  142853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142854. "lsrs r7, %[b], #16\n\t"
  142855. #else
  142856. "lsr r7, %[b], #16\n\t"
  142857. #endif
  142858. #ifdef WOLFSSL_KEIL
  142859. "muls r7, r6, r7\n\t"
  142860. #elif defined(__clang__)
  142861. "muls r7, r6\n\t"
  142862. #else
  142863. "mul r7, r6\n\t"
  142864. #endif
  142865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142866. "adds r5, r5, r7\n\t"
  142867. #else
  142868. "add r5, r5, r7\n\t"
  142869. #endif
  142870. #ifdef WOLFSSL_KEIL
  142871. "adcs r3, r3, %[r]\n\t"
  142872. #elif defined(__clang__)
  142873. "adcs r3, %[r]\n\t"
  142874. #else
  142875. "adc r3, %[r]\n\t"
  142876. #endif
  142877. "uxth r7, %[b]\n\t"
  142878. #ifdef WOLFSSL_KEIL
  142879. "muls r6, r7, r6\n\t"
  142880. #elif defined(__clang__)
  142881. "muls r6, r7\n\t"
  142882. #else
  142883. "mul r6, r7\n\t"
  142884. #endif
  142885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142886. "lsrs r7, r6, #16\n\t"
  142887. #else
  142888. "lsr r7, r6, #16\n\t"
  142889. #endif
  142890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142891. "lsls r6, r6, #16\n\t"
  142892. #else
  142893. "lsl r6, r6, #16\n\t"
  142894. #endif
  142895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142896. "adds r4, r4, r6\n\t"
  142897. #else
  142898. "add r4, r4, r6\n\t"
  142899. #endif
  142900. #ifdef WOLFSSL_KEIL
  142901. "adcs r5, r5, r7\n\t"
  142902. #elif defined(__clang__)
  142903. "adcs r5, r7\n\t"
  142904. #else
  142905. "adc r5, r7\n\t"
  142906. #endif
  142907. #ifdef WOLFSSL_KEIL
  142908. "adcs r3, r3, %[r]\n\t"
  142909. #elif defined(__clang__)
  142910. "adcs r3, %[r]\n\t"
  142911. #else
  142912. "adc r3, %[r]\n\t"
  142913. #endif
  142914. "# A[14] * B[5]\n\t"
  142915. "mov %[a], r9\n\t"
  142916. "mov %[b], r10\n\t"
  142917. "ldr %[a], [%[a], #56]\n\t"
  142918. "ldr %[b], [%[b], #20]\n\t"
  142919. "uxth r6, %[a]\n\t"
  142920. "uxth r7, %[b]\n\t"
  142921. #ifdef WOLFSSL_KEIL
  142922. "muls r7, r6, r7\n\t"
  142923. #elif defined(__clang__)
  142924. "muls r7, r6\n\t"
  142925. #else
  142926. "mul r7, r6\n\t"
  142927. #endif
  142928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142929. "adds r4, r4, r7\n\t"
  142930. #else
  142931. "add r4, r4, r7\n\t"
  142932. #endif
  142933. #ifdef WOLFSSL_KEIL
  142934. "adcs r5, r5, %[r]\n\t"
  142935. #elif defined(__clang__)
  142936. "adcs r5, %[r]\n\t"
  142937. #else
  142938. "adc r5, %[r]\n\t"
  142939. #endif
  142940. #ifdef WOLFSSL_KEIL
  142941. "adcs r3, r3, %[r]\n\t"
  142942. #elif defined(__clang__)
  142943. "adcs r3, %[r]\n\t"
  142944. #else
  142945. "adc r3, %[r]\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 r6, r7, r6\n\t"
  142954. #elif defined(__clang__)
  142955. "muls r6, r7\n\t"
  142956. #else
  142957. "mul r6, r7\n\t"
  142958. #endif
  142959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142960. "lsrs r7, r6, #16\n\t"
  142961. #else
  142962. "lsr r7, r6, #16\n\t"
  142963. #endif
  142964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142965. "lsls r6, r6, #16\n\t"
  142966. #else
  142967. "lsl r6, r6, #16\n\t"
  142968. #endif
  142969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142970. "adds r4, r4, r6\n\t"
  142971. #else
  142972. "add r4, r4, r6\n\t"
  142973. #endif
  142974. #ifdef WOLFSSL_KEIL
  142975. "adcs r5, r5, r7\n\t"
  142976. #elif defined(__clang__)
  142977. "adcs r5, r7\n\t"
  142978. #else
  142979. "adc r5, r7\n\t"
  142980. #endif
  142981. #ifdef WOLFSSL_KEIL
  142982. "adcs r3, r3, %[r]\n\t"
  142983. #elif defined(__clang__)
  142984. "adcs r3, %[r]\n\t"
  142985. #else
  142986. "adc r3, %[r]\n\t"
  142987. #endif
  142988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142989. "lsrs r6, %[a], #16\n\t"
  142990. #else
  142991. "lsr r6, %[a], #16\n\t"
  142992. #endif
  142993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142994. "lsrs r7, %[b], #16\n\t"
  142995. #else
  142996. "lsr r7, %[b], #16\n\t"
  142997. #endif
  142998. #ifdef WOLFSSL_KEIL
  142999. "muls r7, r6, r7\n\t"
  143000. #elif defined(__clang__)
  143001. "muls r7, r6\n\t"
  143002. #else
  143003. "mul r7, r6\n\t"
  143004. #endif
  143005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143006. "adds r5, r5, r7\n\t"
  143007. #else
  143008. "add r5, r5, r7\n\t"
  143009. #endif
  143010. #ifdef WOLFSSL_KEIL
  143011. "adcs r3, r3, %[r]\n\t"
  143012. #elif defined(__clang__)
  143013. "adcs r3, %[r]\n\t"
  143014. #else
  143015. "adc r3, %[r]\n\t"
  143016. #endif
  143017. "uxth r7, %[b]\n\t"
  143018. #ifdef WOLFSSL_KEIL
  143019. "muls r6, r7, r6\n\t"
  143020. #elif defined(__clang__)
  143021. "muls r6, r7\n\t"
  143022. #else
  143023. "mul r6, r7\n\t"
  143024. #endif
  143025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143026. "lsrs r7, r6, #16\n\t"
  143027. #else
  143028. "lsr r7, r6, #16\n\t"
  143029. #endif
  143030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143031. "lsls r6, r6, #16\n\t"
  143032. #else
  143033. "lsl r6, r6, #16\n\t"
  143034. #endif
  143035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143036. "adds r4, r4, r6\n\t"
  143037. #else
  143038. "add r4, r4, r6\n\t"
  143039. #endif
  143040. #ifdef WOLFSSL_KEIL
  143041. "adcs r5, r5, r7\n\t"
  143042. #elif defined(__clang__)
  143043. "adcs r5, r7\n\t"
  143044. #else
  143045. "adc r5, r7\n\t"
  143046. #endif
  143047. #ifdef WOLFSSL_KEIL
  143048. "adcs r3, r3, %[r]\n\t"
  143049. #elif defined(__clang__)
  143050. "adcs r3, %[r]\n\t"
  143051. #else
  143052. "adc r3, %[r]\n\t"
  143053. #endif
  143054. "# A[15] * B[4]\n\t"
  143055. "mov %[a], r9\n\t"
  143056. "mov %[b], r10\n\t"
  143057. "ldr %[a], [%[a], #60]\n\t"
  143058. "ldr %[b], [%[b], #16]\n\t"
  143059. "uxth r6, %[a]\n\t"
  143060. "uxth r7, %[b]\n\t"
  143061. #ifdef WOLFSSL_KEIL
  143062. "muls r7, r6, r7\n\t"
  143063. #elif defined(__clang__)
  143064. "muls r7, r6\n\t"
  143065. #else
  143066. "mul r7, r6\n\t"
  143067. #endif
  143068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143069. "adds r4, r4, r7\n\t"
  143070. #else
  143071. "add r4, r4, r7\n\t"
  143072. #endif
  143073. #ifdef WOLFSSL_KEIL
  143074. "adcs r5, r5, %[r]\n\t"
  143075. #elif defined(__clang__)
  143076. "adcs r5, %[r]\n\t"
  143077. #else
  143078. "adc r5, %[r]\n\t"
  143079. #endif
  143080. #ifdef WOLFSSL_KEIL
  143081. "adcs r3, r3, %[r]\n\t"
  143082. #elif defined(__clang__)
  143083. "adcs r3, %[r]\n\t"
  143084. #else
  143085. "adc r3, %[r]\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 r6, r7, r6\n\t"
  143094. #elif defined(__clang__)
  143095. "muls r6, r7\n\t"
  143096. #else
  143097. "mul r6, r7\n\t"
  143098. #endif
  143099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143100. "lsrs r7, r6, #16\n\t"
  143101. #else
  143102. "lsr r7, r6, #16\n\t"
  143103. #endif
  143104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143105. "lsls r6, r6, #16\n\t"
  143106. #else
  143107. "lsl r6, r6, #16\n\t"
  143108. #endif
  143109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143110. "adds r4, r4, r6\n\t"
  143111. #else
  143112. "add r4, r4, r6\n\t"
  143113. #endif
  143114. #ifdef WOLFSSL_KEIL
  143115. "adcs r5, r5, r7\n\t"
  143116. #elif defined(__clang__)
  143117. "adcs r5, r7\n\t"
  143118. #else
  143119. "adc r5, r7\n\t"
  143120. #endif
  143121. #ifdef WOLFSSL_KEIL
  143122. "adcs r3, r3, %[r]\n\t"
  143123. #elif defined(__clang__)
  143124. "adcs r3, %[r]\n\t"
  143125. #else
  143126. "adc r3, %[r]\n\t"
  143127. #endif
  143128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143129. "lsrs r6, %[a], #16\n\t"
  143130. #else
  143131. "lsr r6, %[a], #16\n\t"
  143132. #endif
  143133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143134. "lsrs r7, %[b], #16\n\t"
  143135. #else
  143136. "lsr r7, %[b], #16\n\t"
  143137. #endif
  143138. #ifdef WOLFSSL_KEIL
  143139. "muls r7, r6, r7\n\t"
  143140. #elif defined(__clang__)
  143141. "muls r7, r6\n\t"
  143142. #else
  143143. "mul r7, r6\n\t"
  143144. #endif
  143145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143146. "adds r5, r5, r7\n\t"
  143147. #else
  143148. "add r5, r5, r7\n\t"
  143149. #endif
  143150. #ifdef WOLFSSL_KEIL
  143151. "adcs r3, r3, %[r]\n\t"
  143152. #elif defined(__clang__)
  143153. "adcs r3, %[r]\n\t"
  143154. #else
  143155. "adc r3, %[r]\n\t"
  143156. #endif
  143157. "uxth r7, %[b]\n\t"
  143158. #ifdef WOLFSSL_KEIL
  143159. "muls r6, r7, r6\n\t"
  143160. #elif defined(__clang__)
  143161. "muls r6, r7\n\t"
  143162. #else
  143163. "mul r6, r7\n\t"
  143164. #endif
  143165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143166. "lsrs r7, r6, #16\n\t"
  143167. #else
  143168. "lsr r7, r6, #16\n\t"
  143169. #endif
  143170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143171. "lsls r6, r6, #16\n\t"
  143172. #else
  143173. "lsl r6, r6, #16\n\t"
  143174. #endif
  143175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143176. "adds r4, r4, r6\n\t"
  143177. #else
  143178. "add r4, r4, r6\n\t"
  143179. #endif
  143180. #ifdef WOLFSSL_KEIL
  143181. "adcs r5, r5, r7\n\t"
  143182. #elif defined(__clang__)
  143183. "adcs r5, r7\n\t"
  143184. #else
  143185. "adc r5, r7\n\t"
  143186. #endif
  143187. #ifdef WOLFSSL_KEIL
  143188. "adcs r3, r3, %[r]\n\t"
  143189. #elif defined(__clang__)
  143190. "adcs r3, %[r]\n\t"
  143191. #else
  143192. "adc r3, %[r]\n\t"
  143193. #endif
  143194. "mov %[r], r8\n\t"
  143195. "str r4, [%[r], #76]\n\t"
  143196. "movs %[r], #0\n\t"
  143197. "# A[15] * B[5]\n\t"
  143198. "movs r4, #0\n\t"
  143199. "mov %[a], r9\n\t"
  143200. "mov %[b], r10\n\t"
  143201. "ldr %[a], [%[a], #60]\n\t"
  143202. "ldr %[b], [%[b], #20]\n\t"
  143203. "uxth r6, %[a]\n\t"
  143204. "uxth r7, %[b]\n\t"
  143205. #ifdef WOLFSSL_KEIL
  143206. "muls r7, r6, r7\n\t"
  143207. #elif defined(__clang__)
  143208. "muls r7, r6\n\t"
  143209. #else
  143210. "mul r7, r6\n\t"
  143211. #endif
  143212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143213. "adds r5, r5, r7\n\t"
  143214. #else
  143215. "add r5, r5, r7\n\t"
  143216. #endif
  143217. #ifdef WOLFSSL_KEIL
  143218. "adcs r3, r3, %[r]\n\t"
  143219. #elif defined(__clang__)
  143220. "adcs r3, %[r]\n\t"
  143221. #else
  143222. "adc r3, %[r]\n\t"
  143223. #endif
  143224. #ifdef WOLFSSL_KEIL
  143225. "adcs r4, r4, %[r]\n\t"
  143226. #elif defined(__clang__)
  143227. "adcs r4, %[r]\n\t"
  143228. #else
  143229. "adc r4, %[r]\n\t"
  143230. #endif
  143231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143232. "lsrs r7, %[b], #16\n\t"
  143233. #else
  143234. "lsr r7, %[b], #16\n\t"
  143235. #endif
  143236. #ifdef WOLFSSL_KEIL
  143237. "muls r6, r7, r6\n\t"
  143238. #elif defined(__clang__)
  143239. "muls r6, r7\n\t"
  143240. #else
  143241. "mul r6, r7\n\t"
  143242. #endif
  143243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143244. "lsrs r7, r6, #16\n\t"
  143245. #else
  143246. "lsr r7, r6, #16\n\t"
  143247. #endif
  143248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143249. "lsls r6, r6, #16\n\t"
  143250. #else
  143251. "lsl r6, r6, #16\n\t"
  143252. #endif
  143253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143254. "adds r5, r5, r6\n\t"
  143255. #else
  143256. "add r5, r5, r6\n\t"
  143257. #endif
  143258. #ifdef WOLFSSL_KEIL
  143259. "adcs r3, r3, r7\n\t"
  143260. #elif defined(__clang__)
  143261. "adcs r3, r7\n\t"
  143262. #else
  143263. "adc r3, r7\n\t"
  143264. #endif
  143265. #ifdef WOLFSSL_KEIL
  143266. "adcs r4, r4, %[r]\n\t"
  143267. #elif defined(__clang__)
  143268. "adcs r4, %[r]\n\t"
  143269. #else
  143270. "adc r4, %[r]\n\t"
  143271. #endif
  143272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143273. "lsrs r6, %[a], #16\n\t"
  143274. #else
  143275. "lsr r6, %[a], #16\n\t"
  143276. #endif
  143277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143278. "lsrs r7, %[b], #16\n\t"
  143279. #else
  143280. "lsr r7, %[b], #16\n\t"
  143281. #endif
  143282. #ifdef WOLFSSL_KEIL
  143283. "muls r7, r6, r7\n\t"
  143284. #elif defined(__clang__)
  143285. "muls r7, r6\n\t"
  143286. #else
  143287. "mul r7, r6\n\t"
  143288. #endif
  143289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143290. "adds r3, r3, r7\n\t"
  143291. #else
  143292. "add r3, r3, r7\n\t"
  143293. #endif
  143294. #ifdef WOLFSSL_KEIL
  143295. "adcs r4, r4, %[r]\n\t"
  143296. #elif defined(__clang__)
  143297. "adcs r4, %[r]\n\t"
  143298. #else
  143299. "adc r4, %[r]\n\t"
  143300. #endif
  143301. "uxth r7, %[b]\n\t"
  143302. #ifdef WOLFSSL_KEIL
  143303. "muls r6, r7, r6\n\t"
  143304. #elif defined(__clang__)
  143305. "muls r6, r7\n\t"
  143306. #else
  143307. "mul r6, r7\n\t"
  143308. #endif
  143309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143310. "lsrs r7, r6, #16\n\t"
  143311. #else
  143312. "lsr r7, r6, #16\n\t"
  143313. #endif
  143314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143315. "lsls r6, r6, #16\n\t"
  143316. #else
  143317. "lsl r6, r6, #16\n\t"
  143318. #endif
  143319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143320. "adds r5, r5, r6\n\t"
  143321. #else
  143322. "add r5, r5, r6\n\t"
  143323. #endif
  143324. #ifdef WOLFSSL_KEIL
  143325. "adcs r3, r3, r7\n\t"
  143326. #elif defined(__clang__)
  143327. "adcs r3, r7\n\t"
  143328. #else
  143329. "adc r3, r7\n\t"
  143330. #endif
  143331. #ifdef WOLFSSL_KEIL
  143332. "adcs r4, r4, %[r]\n\t"
  143333. #elif defined(__clang__)
  143334. "adcs r4, %[r]\n\t"
  143335. #else
  143336. "adc r4, %[r]\n\t"
  143337. #endif
  143338. "# A[14] * B[6]\n\t"
  143339. "mov %[a], r9\n\t"
  143340. "mov %[b], r10\n\t"
  143341. "ldr %[a], [%[a], #56]\n\t"
  143342. "ldr %[b], [%[b], #24]\n\t"
  143343. "uxth r6, %[a]\n\t"
  143344. "uxth r7, %[b]\n\t"
  143345. #ifdef WOLFSSL_KEIL
  143346. "muls r7, r6, r7\n\t"
  143347. #elif defined(__clang__)
  143348. "muls r7, r6\n\t"
  143349. #else
  143350. "mul r7, r6\n\t"
  143351. #endif
  143352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143353. "adds r5, r5, r7\n\t"
  143354. #else
  143355. "add r5, r5, r7\n\t"
  143356. #endif
  143357. #ifdef WOLFSSL_KEIL
  143358. "adcs r3, r3, %[r]\n\t"
  143359. #elif defined(__clang__)
  143360. "adcs r3, %[r]\n\t"
  143361. #else
  143362. "adc r3, %[r]\n\t"
  143363. #endif
  143364. #ifdef WOLFSSL_KEIL
  143365. "adcs r4, r4, %[r]\n\t"
  143366. #elif defined(__clang__)
  143367. "adcs r4, %[r]\n\t"
  143368. #else
  143369. "adc r4, %[r]\n\t"
  143370. #endif
  143371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143372. "lsrs r7, %[b], #16\n\t"
  143373. #else
  143374. "lsr r7, %[b], #16\n\t"
  143375. #endif
  143376. #ifdef WOLFSSL_KEIL
  143377. "muls r6, r7, r6\n\t"
  143378. #elif defined(__clang__)
  143379. "muls r6, r7\n\t"
  143380. #else
  143381. "mul r6, r7\n\t"
  143382. #endif
  143383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143384. "lsrs r7, r6, #16\n\t"
  143385. #else
  143386. "lsr r7, r6, #16\n\t"
  143387. #endif
  143388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143389. "lsls r6, r6, #16\n\t"
  143390. #else
  143391. "lsl r6, r6, #16\n\t"
  143392. #endif
  143393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143394. "adds r5, r5, r6\n\t"
  143395. #else
  143396. "add r5, r5, r6\n\t"
  143397. #endif
  143398. #ifdef WOLFSSL_KEIL
  143399. "adcs r3, r3, r7\n\t"
  143400. #elif defined(__clang__)
  143401. "adcs r3, r7\n\t"
  143402. #else
  143403. "adc r3, r7\n\t"
  143404. #endif
  143405. #ifdef WOLFSSL_KEIL
  143406. "adcs r4, r4, %[r]\n\t"
  143407. #elif defined(__clang__)
  143408. "adcs r4, %[r]\n\t"
  143409. #else
  143410. "adc r4, %[r]\n\t"
  143411. #endif
  143412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143413. "lsrs r6, %[a], #16\n\t"
  143414. #else
  143415. "lsr r6, %[a], #16\n\t"
  143416. #endif
  143417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143418. "lsrs r7, %[b], #16\n\t"
  143419. #else
  143420. "lsr r7, %[b], #16\n\t"
  143421. #endif
  143422. #ifdef WOLFSSL_KEIL
  143423. "muls r7, r6, r7\n\t"
  143424. #elif defined(__clang__)
  143425. "muls r7, r6\n\t"
  143426. #else
  143427. "mul r7, r6\n\t"
  143428. #endif
  143429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143430. "adds r3, r3, r7\n\t"
  143431. #else
  143432. "add r3, r3, r7\n\t"
  143433. #endif
  143434. #ifdef WOLFSSL_KEIL
  143435. "adcs r4, r4, %[r]\n\t"
  143436. #elif defined(__clang__)
  143437. "adcs r4, %[r]\n\t"
  143438. #else
  143439. "adc r4, %[r]\n\t"
  143440. #endif
  143441. "uxth r7, %[b]\n\t"
  143442. #ifdef WOLFSSL_KEIL
  143443. "muls r6, r7, r6\n\t"
  143444. #elif defined(__clang__)
  143445. "muls r6, r7\n\t"
  143446. #else
  143447. "mul r6, r7\n\t"
  143448. #endif
  143449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143450. "lsrs r7, r6, #16\n\t"
  143451. #else
  143452. "lsr r7, r6, #16\n\t"
  143453. #endif
  143454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143455. "lsls r6, r6, #16\n\t"
  143456. #else
  143457. "lsl r6, r6, #16\n\t"
  143458. #endif
  143459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143460. "adds r5, r5, r6\n\t"
  143461. #else
  143462. "add r5, r5, r6\n\t"
  143463. #endif
  143464. #ifdef WOLFSSL_KEIL
  143465. "adcs r3, r3, r7\n\t"
  143466. #elif defined(__clang__)
  143467. "adcs r3, r7\n\t"
  143468. #else
  143469. "adc r3, r7\n\t"
  143470. #endif
  143471. #ifdef WOLFSSL_KEIL
  143472. "adcs r4, r4, %[r]\n\t"
  143473. #elif defined(__clang__)
  143474. "adcs r4, %[r]\n\t"
  143475. #else
  143476. "adc r4, %[r]\n\t"
  143477. #endif
  143478. "# A[13] * B[7]\n\t"
  143479. "mov %[a], r9\n\t"
  143480. "mov %[b], r10\n\t"
  143481. "ldr %[a], [%[a], #52]\n\t"
  143482. "ldr %[b], [%[b], #28]\n\t"
  143483. "uxth r6, %[a]\n\t"
  143484. "uxth r7, %[b]\n\t"
  143485. #ifdef WOLFSSL_KEIL
  143486. "muls r7, r6, r7\n\t"
  143487. #elif defined(__clang__)
  143488. "muls r7, r6\n\t"
  143489. #else
  143490. "mul r7, r6\n\t"
  143491. #endif
  143492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143493. "adds r5, r5, r7\n\t"
  143494. #else
  143495. "add r5, r5, r7\n\t"
  143496. #endif
  143497. #ifdef WOLFSSL_KEIL
  143498. "adcs r3, r3, %[r]\n\t"
  143499. #elif defined(__clang__)
  143500. "adcs r3, %[r]\n\t"
  143501. #else
  143502. "adc r3, %[r]\n\t"
  143503. #endif
  143504. #ifdef WOLFSSL_KEIL
  143505. "adcs r4, r4, %[r]\n\t"
  143506. #elif defined(__clang__)
  143507. "adcs r4, %[r]\n\t"
  143508. #else
  143509. "adc r4, %[r]\n\t"
  143510. #endif
  143511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143512. "lsrs r7, %[b], #16\n\t"
  143513. #else
  143514. "lsr r7, %[b], #16\n\t"
  143515. #endif
  143516. #ifdef WOLFSSL_KEIL
  143517. "muls r6, r7, r6\n\t"
  143518. #elif defined(__clang__)
  143519. "muls r6, r7\n\t"
  143520. #else
  143521. "mul r6, r7\n\t"
  143522. #endif
  143523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143524. "lsrs r7, r6, #16\n\t"
  143525. #else
  143526. "lsr r7, r6, #16\n\t"
  143527. #endif
  143528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143529. "lsls r6, r6, #16\n\t"
  143530. #else
  143531. "lsl r6, r6, #16\n\t"
  143532. #endif
  143533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143534. "adds r5, r5, r6\n\t"
  143535. #else
  143536. "add r5, r5, r6\n\t"
  143537. #endif
  143538. #ifdef WOLFSSL_KEIL
  143539. "adcs r3, r3, r7\n\t"
  143540. #elif defined(__clang__)
  143541. "adcs r3, r7\n\t"
  143542. #else
  143543. "adc r3, r7\n\t"
  143544. #endif
  143545. #ifdef WOLFSSL_KEIL
  143546. "adcs r4, r4, %[r]\n\t"
  143547. #elif defined(__clang__)
  143548. "adcs r4, %[r]\n\t"
  143549. #else
  143550. "adc r4, %[r]\n\t"
  143551. #endif
  143552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143553. "lsrs r6, %[a], #16\n\t"
  143554. #else
  143555. "lsr r6, %[a], #16\n\t"
  143556. #endif
  143557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143558. "lsrs r7, %[b], #16\n\t"
  143559. #else
  143560. "lsr r7, %[b], #16\n\t"
  143561. #endif
  143562. #ifdef WOLFSSL_KEIL
  143563. "muls r7, r6, r7\n\t"
  143564. #elif defined(__clang__)
  143565. "muls r7, r6\n\t"
  143566. #else
  143567. "mul r7, r6\n\t"
  143568. #endif
  143569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143570. "adds r3, r3, r7\n\t"
  143571. #else
  143572. "add r3, r3, r7\n\t"
  143573. #endif
  143574. #ifdef WOLFSSL_KEIL
  143575. "adcs r4, r4, %[r]\n\t"
  143576. #elif defined(__clang__)
  143577. "adcs r4, %[r]\n\t"
  143578. #else
  143579. "adc r4, %[r]\n\t"
  143580. #endif
  143581. "uxth r7, %[b]\n\t"
  143582. #ifdef WOLFSSL_KEIL
  143583. "muls r6, r7, r6\n\t"
  143584. #elif defined(__clang__)
  143585. "muls r6, r7\n\t"
  143586. #else
  143587. "mul r6, r7\n\t"
  143588. #endif
  143589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143590. "lsrs r7, r6, #16\n\t"
  143591. #else
  143592. "lsr r7, r6, #16\n\t"
  143593. #endif
  143594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143595. "lsls r6, r6, #16\n\t"
  143596. #else
  143597. "lsl r6, r6, #16\n\t"
  143598. #endif
  143599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143600. "adds r5, r5, r6\n\t"
  143601. #else
  143602. "add r5, r5, r6\n\t"
  143603. #endif
  143604. #ifdef WOLFSSL_KEIL
  143605. "adcs r3, r3, r7\n\t"
  143606. #elif defined(__clang__)
  143607. "adcs r3, r7\n\t"
  143608. #else
  143609. "adc r3, r7\n\t"
  143610. #endif
  143611. #ifdef WOLFSSL_KEIL
  143612. "adcs r4, r4, %[r]\n\t"
  143613. #elif defined(__clang__)
  143614. "adcs r4, %[r]\n\t"
  143615. #else
  143616. "adc r4, %[r]\n\t"
  143617. #endif
  143618. "# A[12] * B[8]\n\t"
  143619. "mov %[a], r9\n\t"
  143620. "mov %[b], r10\n\t"
  143621. "ldr %[a], [%[a], #48]\n\t"
  143622. "ldr %[b], [%[b], #32]\n\t"
  143623. "uxth r6, %[a]\n\t"
  143624. "uxth r7, %[b]\n\t"
  143625. #ifdef WOLFSSL_KEIL
  143626. "muls r7, r6, r7\n\t"
  143627. #elif defined(__clang__)
  143628. "muls r7, r6\n\t"
  143629. #else
  143630. "mul r7, r6\n\t"
  143631. #endif
  143632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143633. "adds r5, r5, r7\n\t"
  143634. #else
  143635. "add r5, r5, r7\n\t"
  143636. #endif
  143637. #ifdef WOLFSSL_KEIL
  143638. "adcs r3, r3, %[r]\n\t"
  143639. #elif defined(__clang__)
  143640. "adcs r3, %[r]\n\t"
  143641. #else
  143642. "adc r3, %[r]\n\t"
  143643. #endif
  143644. #ifdef WOLFSSL_KEIL
  143645. "adcs r4, r4, %[r]\n\t"
  143646. #elif defined(__clang__)
  143647. "adcs r4, %[r]\n\t"
  143648. #else
  143649. "adc r4, %[r]\n\t"
  143650. #endif
  143651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143652. "lsrs r7, %[b], #16\n\t"
  143653. #else
  143654. "lsr r7, %[b], #16\n\t"
  143655. #endif
  143656. #ifdef WOLFSSL_KEIL
  143657. "muls r6, r7, r6\n\t"
  143658. #elif defined(__clang__)
  143659. "muls r6, r7\n\t"
  143660. #else
  143661. "mul r6, r7\n\t"
  143662. #endif
  143663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143664. "lsrs r7, r6, #16\n\t"
  143665. #else
  143666. "lsr r7, r6, #16\n\t"
  143667. #endif
  143668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143669. "lsls r6, r6, #16\n\t"
  143670. #else
  143671. "lsl r6, r6, #16\n\t"
  143672. #endif
  143673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143674. "adds r5, r5, r6\n\t"
  143675. #else
  143676. "add r5, r5, r6\n\t"
  143677. #endif
  143678. #ifdef WOLFSSL_KEIL
  143679. "adcs r3, r3, r7\n\t"
  143680. #elif defined(__clang__)
  143681. "adcs r3, r7\n\t"
  143682. #else
  143683. "adc r3, r7\n\t"
  143684. #endif
  143685. #ifdef WOLFSSL_KEIL
  143686. "adcs r4, r4, %[r]\n\t"
  143687. #elif defined(__clang__)
  143688. "adcs r4, %[r]\n\t"
  143689. #else
  143690. "adc r4, %[r]\n\t"
  143691. #endif
  143692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143693. "lsrs r6, %[a], #16\n\t"
  143694. #else
  143695. "lsr r6, %[a], #16\n\t"
  143696. #endif
  143697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143698. "lsrs r7, %[b], #16\n\t"
  143699. #else
  143700. "lsr r7, %[b], #16\n\t"
  143701. #endif
  143702. #ifdef WOLFSSL_KEIL
  143703. "muls r7, r6, r7\n\t"
  143704. #elif defined(__clang__)
  143705. "muls r7, r6\n\t"
  143706. #else
  143707. "mul r7, r6\n\t"
  143708. #endif
  143709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143710. "adds r3, r3, r7\n\t"
  143711. #else
  143712. "add r3, r3, r7\n\t"
  143713. #endif
  143714. #ifdef WOLFSSL_KEIL
  143715. "adcs r4, r4, %[r]\n\t"
  143716. #elif defined(__clang__)
  143717. "adcs r4, %[r]\n\t"
  143718. #else
  143719. "adc r4, %[r]\n\t"
  143720. #endif
  143721. "uxth r7, %[b]\n\t"
  143722. #ifdef WOLFSSL_KEIL
  143723. "muls r6, r7, r6\n\t"
  143724. #elif defined(__clang__)
  143725. "muls r6, r7\n\t"
  143726. #else
  143727. "mul r6, r7\n\t"
  143728. #endif
  143729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143730. "lsrs r7, r6, #16\n\t"
  143731. #else
  143732. "lsr r7, r6, #16\n\t"
  143733. #endif
  143734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143735. "lsls r6, r6, #16\n\t"
  143736. #else
  143737. "lsl r6, r6, #16\n\t"
  143738. #endif
  143739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143740. "adds r5, r5, r6\n\t"
  143741. #else
  143742. "add r5, r5, r6\n\t"
  143743. #endif
  143744. #ifdef WOLFSSL_KEIL
  143745. "adcs r3, r3, r7\n\t"
  143746. #elif defined(__clang__)
  143747. "adcs r3, r7\n\t"
  143748. #else
  143749. "adc r3, r7\n\t"
  143750. #endif
  143751. #ifdef WOLFSSL_KEIL
  143752. "adcs r4, r4, %[r]\n\t"
  143753. #elif defined(__clang__)
  143754. "adcs r4, %[r]\n\t"
  143755. #else
  143756. "adc r4, %[r]\n\t"
  143757. #endif
  143758. "# A[11] * B[9]\n\t"
  143759. "mov %[a], r9\n\t"
  143760. "mov %[b], r10\n\t"
  143761. "ldr %[a], [%[a], #44]\n\t"
  143762. "ldr %[b], [%[b], #36]\n\t"
  143763. "uxth r6, %[a]\n\t"
  143764. "uxth r7, %[b]\n\t"
  143765. #ifdef WOLFSSL_KEIL
  143766. "muls r7, r6, r7\n\t"
  143767. #elif defined(__clang__)
  143768. "muls r7, r6\n\t"
  143769. #else
  143770. "mul r7, r6\n\t"
  143771. #endif
  143772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143773. "adds r5, r5, r7\n\t"
  143774. #else
  143775. "add r5, r5, r7\n\t"
  143776. #endif
  143777. #ifdef WOLFSSL_KEIL
  143778. "adcs r3, r3, %[r]\n\t"
  143779. #elif defined(__clang__)
  143780. "adcs r3, %[r]\n\t"
  143781. #else
  143782. "adc r3, %[r]\n\t"
  143783. #endif
  143784. #ifdef WOLFSSL_KEIL
  143785. "adcs r4, r4, %[r]\n\t"
  143786. #elif defined(__clang__)
  143787. "adcs r4, %[r]\n\t"
  143788. #else
  143789. "adc r4, %[r]\n\t"
  143790. #endif
  143791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143792. "lsrs r7, %[b], #16\n\t"
  143793. #else
  143794. "lsr r7, %[b], #16\n\t"
  143795. #endif
  143796. #ifdef WOLFSSL_KEIL
  143797. "muls r6, r7, r6\n\t"
  143798. #elif defined(__clang__)
  143799. "muls r6, r7\n\t"
  143800. #else
  143801. "mul r6, r7\n\t"
  143802. #endif
  143803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143804. "lsrs r7, r6, #16\n\t"
  143805. #else
  143806. "lsr r7, r6, #16\n\t"
  143807. #endif
  143808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143809. "lsls r6, r6, #16\n\t"
  143810. #else
  143811. "lsl r6, r6, #16\n\t"
  143812. #endif
  143813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143814. "adds r5, r5, r6\n\t"
  143815. #else
  143816. "add r5, r5, r6\n\t"
  143817. #endif
  143818. #ifdef WOLFSSL_KEIL
  143819. "adcs r3, r3, r7\n\t"
  143820. #elif defined(__clang__)
  143821. "adcs r3, r7\n\t"
  143822. #else
  143823. "adc r3, r7\n\t"
  143824. #endif
  143825. #ifdef WOLFSSL_KEIL
  143826. "adcs r4, r4, %[r]\n\t"
  143827. #elif defined(__clang__)
  143828. "adcs r4, %[r]\n\t"
  143829. #else
  143830. "adc r4, %[r]\n\t"
  143831. #endif
  143832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143833. "lsrs r6, %[a], #16\n\t"
  143834. #else
  143835. "lsr r6, %[a], #16\n\t"
  143836. #endif
  143837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143838. "lsrs r7, %[b], #16\n\t"
  143839. #else
  143840. "lsr r7, %[b], #16\n\t"
  143841. #endif
  143842. #ifdef WOLFSSL_KEIL
  143843. "muls r7, r6, r7\n\t"
  143844. #elif defined(__clang__)
  143845. "muls r7, r6\n\t"
  143846. #else
  143847. "mul r7, r6\n\t"
  143848. #endif
  143849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143850. "adds r3, r3, r7\n\t"
  143851. #else
  143852. "add r3, r3, r7\n\t"
  143853. #endif
  143854. #ifdef WOLFSSL_KEIL
  143855. "adcs r4, r4, %[r]\n\t"
  143856. #elif defined(__clang__)
  143857. "adcs r4, %[r]\n\t"
  143858. #else
  143859. "adc r4, %[r]\n\t"
  143860. #endif
  143861. "uxth r7, %[b]\n\t"
  143862. #ifdef WOLFSSL_KEIL
  143863. "muls r6, r7, r6\n\t"
  143864. #elif defined(__clang__)
  143865. "muls r6, r7\n\t"
  143866. #else
  143867. "mul r6, r7\n\t"
  143868. #endif
  143869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143870. "lsrs r7, r6, #16\n\t"
  143871. #else
  143872. "lsr r7, r6, #16\n\t"
  143873. #endif
  143874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143875. "lsls r6, r6, #16\n\t"
  143876. #else
  143877. "lsl r6, r6, #16\n\t"
  143878. #endif
  143879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143880. "adds r5, r5, r6\n\t"
  143881. #else
  143882. "add r5, r5, r6\n\t"
  143883. #endif
  143884. #ifdef WOLFSSL_KEIL
  143885. "adcs r3, r3, r7\n\t"
  143886. #elif defined(__clang__)
  143887. "adcs r3, r7\n\t"
  143888. #else
  143889. "adc r3, r7\n\t"
  143890. #endif
  143891. #ifdef WOLFSSL_KEIL
  143892. "adcs r4, r4, %[r]\n\t"
  143893. #elif defined(__clang__)
  143894. "adcs r4, %[r]\n\t"
  143895. #else
  143896. "adc r4, %[r]\n\t"
  143897. #endif
  143898. "# A[10] * B[10]\n\t"
  143899. "mov %[a], r9\n\t"
  143900. "mov %[b], r10\n\t"
  143901. "ldr %[a], [%[a], #40]\n\t"
  143902. "ldr %[b], [%[b], #40]\n\t"
  143903. "uxth r6, %[a]\n\t"
  143904. "uxth r7, %[b]\n\t"
  143905. #ifdef WOLFSSL_KEIL
  143906. "muls r7, r6, r7\n\t"
  143907. #elif defined(__clang__)
  143908. "muls r7, r6\n\t"
  143909. #else
  143910. "mul r7, r6\n\t"
  143911. #endif
  143912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143913. "adds r5, r5, r7\n\t"
  143914. #else
  143915. "add r5, r5, r7\n\t"
  143916. #endif
  143917. #ifdef WOLFSSL_KEIL
  143918. "adcs r3, r3, %[r]\n\t"
  143919. #elif defined(__clang__)
  143920. "adcs r3, %[r]\n\t"
  143921. #else
  143922. "adc r3, %[r]\n\t"
  143923. #endif
  143924. #ifdef WOLFSSL_KEIL
  143925. "adcs r4, r4, %[r]\n\t"
  143926. #elif defined(__clang__)
  143927. "adcs r4, %[r]\n\t"
  143928. #else
  143929. "adc r4, %[r]\n\t"
  143930. #endif
  143931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143932. "lsrs r7, %[b], #16\n\t"
  143933. #else
  143934. "lsr r7, %[b], #16\n\t"
  143935. #endif
  143936. #ifdef WOLFSSL_KEIL
  143937. "muls r6, r7, r6\n\t"
  143938. #elif defined(__clang__)
  143939. "muls r6, r7\n\t"
  143940. #else
  143941. "mul r6, r7\n\t"
  143942. #endif
  143943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143944. "lsrs r7, r6, #16\n\t"
  143945. #else
  143946. "lsr r7, r6, #16\n\t"
  143947. #endif
  143948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143949. "lsls r6, r6, #16\n\t"
  143950. #else
  143951. "lsl r6, r6, #16\n\t"
  143952. #endif
  143953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143954. "adds r5, r5, r6\n\t"
  143955. #else
  143956. "add r5, r5, r6\n\t"
  143957. #endif
  143958. #ifdef WOLFSSL_KEIL
  143959. "adcs r3, r3, r7\n\t"
  143960. #elif defined(__clang__)
  143961. "adcs r3, r7\n\t"
  143962. #else
  143963. "adc r3, r7\n\t"
  143964. #endif
  143965. #ifdef WOLFSSL_KEIL
  143966. "adcs r4, r4, %[r]\n\t"
  143967. #elif defined(__clang__)
  143968. "adcs r4, %[r]\n\t"
  143969. #else
  143970. "adc r4, %[r]\n\t"
  143971. #endif
  143972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143973. "lsrs r6, %[a], #16\n\t"
  143974. #else
  143975. "lsr r6, %[a], #16\n\t"
  143976. #endif
  143977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143978. "lsrs r7, %[b], #16\n\t"
  143979. #else
  143980. "lsr r7, %[b], #16\n\t"
  143981. #endif
  143982. #ifdef WOLFSSL_KEIL
  143983. "muls r7, r6, r7\n\t"
  143984. #elif defined(__clang__)
  143985. "muls r7, r6\n\t"
  143986. #else
  143987. "mul r7, r6\n\t"
  143988. #endif
  143989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143990. "adds r3, r3, r7\n\t"
  143991. #else
  143992. "add r3, r3, r7\n\t"
  143993. #endif
  143994. #ifdef WOLFSSL_KEIL
  143995. "adcs r4, r4, %[r]\n\t"
  143996. #elif defined(__clang__)
  143997. "adcs r4, %[r]\n\t"
  143998. #else
  143999. "adc r4, %[r]\n\t"
  144000. #endif
  144001. "uxth r7, %[b]\n\t"
  144002. #ifdef WOLFSSL_KEIL
  144003. "muls r6, r7, r6\n\t"
  144004. #elif defined(__clang__)
  144005. "muls r6, r7\n\t"
  144006. #else
  144007. "mul r6, r7\n\t"
  144008. #endif
  144009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144010. "lsrs r7, r6, #16\n\t"
  144011. #else
  144012. "lsr r7, r6, #16\n\t"
  144013. #endif
  144014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144015. "lsls r6, r6, #16\n\t"
  144016. #else
  144017. "lsl r6, r6, #16\n\t"
  144018. #endif
  144019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144020. "adds r5, r5, r6\n\t"
  144021. #else
  144022. "add r5, r5, r6\n\t"
  144023. #endif
  144024. #ifdef WOLFSSL_KEIL
  144025. "adcs r3, r3, r7\n\t"
  144026. #elif defined(__clang__)
  144027. "adcs r3, r7\n\t"
  144028. #else
  144029. "adc r3, r7\n\t"
  144030. #endif
  144031. #ifdef WOLFSSL_KEIL
  144032. "adcs r4, r4, %[r]\n\t"
  144033. #elif defined(__clang__)
  144034. "adcs r4, %[r]\n\t"
  144035. #else
  144036. "adc r4, %[r]\n\t"
  144037. #endif
  144038. "# A[9] * B[11]\n\t"
  144039. "mov %[a], r9\n\t"
  144040. "mov %[b], r10\n\t"
  144041. "ldr %[a], [%[a], #36]\n\t"
  144042. "ldr %[b], [%[b], #44]\n\t"
  144043. "uxth r6, %[a]\n\t"
  144044. "uxth r7, %[b]\n\t"
  144045. #ifdef WOLFSSL_KEIL
  144046. "muls r7, r6, r7\n\t"
  144047. #elif defined(__clang__)
  144048. "muls r7, r6\n\t"
  144049. #else
  144050. "mul r7, r6\n\t"
  144051. #endif
  144052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144053. "adds r5, r5, r7\n\t"
  144054. #else
  144055. "add r5, r5, r7\n\t"
  144056. #endif
  144057. #ifdef WOLFSSL_KEIL
  144058. "adcs r3, r3, %[r]\n\t"
  144059. #elif defined(__clang__)
  144060. "adcs r3, %[r]\n\t"
  144061. #else
  144062. "adc r3, %[r]\n\t"
  144063. #endif
  144064. #ifdef WOLFSSL_KEIL
  144065. "adcs r4, r4, %[r]\n\t"
  144066. #elif defined(__clang__)
  144067. "adcs r4, %[r]\n\t"
  144068. #else
  144069. "adc r4, %[r]\n\t"
  144070. #endif
  144071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144072. "lsrs r7, %[b], #16\n\t"
  144073. #else
  144074. "lsr r7, %[b], #16\n\t"
  144075. #endif
  144076. #ifdef WOLFSSL_KEIL
  144077. "muls r6, r7, r6\n\t"
  144078. #elif defined(__clang__)
  144079. "muls r6, r7\n\t"
  144080. #else
  144081. "mul r6, r7\n\t"
  144082. #endif
  144083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144084. "lsrs r7, r6, #16\n\t"
  144085. #else
  144086. "lsr r7, r6, #16\n\t"
  144087. #endif
  144088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144089. "lsls r6, r6, #16\n\t"
  144090. #else
  144091. "lsl r6, r6, #16\n\t"
  144092. #endif
  144093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144094. "adds r5, r5, r6\n\t"
  144095. #else
  144096. "add r5, r5, r6\n\t"
  144097. #endif
  144098. #ifdef WOLFSSL_KEIL
  144099. "adcs r3, r3, r7\n\t"
  144100. #elif defined(__clang__)
  144101. "adcs r3, r7\n\t"
  144102. #else
  144103. "adc r3, r7\n\t"
  144104. #endif
  144105. #ifdef WOLFSSL_KEIL
  144106. "adcs r4, r4, %[r]\n\t"
  144107. #elif defined(__clang__)
  144108. "adcs r4, %[r]\n\t"
  144109. #else
  144110. "adc r4, %[r]\n\t"
  144111. #endif
  144112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144113. "lsrs r6, %[a], #16\n\t"
  144114. #else
  144115. "lsr r6, %[a], #16\n\t"
  144116. #endif
  144117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144118. "lsrs r7, %[b], #16\n\t"
  144119. #else
  144120. "lsr r7, %[b], #16\n\t"
  144121. #endif
  144122. #ifdef WOLFSSL_KEIL
  144123. "muls r7, r6, r7\n\t"
  144124. #elif defined(__clang__)
  144125. "muls r7, r6\n\t"
  144126. #else
  144127. "mul r7, r6\n\t"
  144128. #endif
  144129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144130. "adds r3, r3, r7\n\t"
  144131. #else
  144132. "add r3, r3, r7\n\t"
  144133. #endif
  144134. #ifdef WOLFSSL_KEIL
  144135. "adcs r4, r4, %[r]\n\t"
  144136. #elif defined(__clang__)
  144137. "adcs r4, %[r]\n\t"
  144138. #else
  144139. "adc r4, %[r]\n\t"
  144140. #endif
  144141. "uxth r7, %[b]\n\t"
  144142. #ifdef WOLFSSL_KEIL
  144143. "muls r6, r7, r6\n\t"
  144144. #elif defined(__clang__)
  144145. "muls r6, r7\n\t"
  144146. #else
  144147. "mul r6, r7\n\t"
  144148. #endif
  144149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144150. "lsrs r7, r6, #16\n\t"
  144151. #else
  144152. "lsr r7, r6, #16\n\t"
  144153. #endif
  144154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144155. "lsls r6, r6, #16\n\t"
  144156. #else
  144157. "lsl r6, r6, #16\n\t"
  144158. #endif
  144159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144160. "adds r5, r5, r6\n\t"
  144161. #else
  144162. "add r5, r5, r6\n\t"
  144163. #endif
  144164. #ifdef WOLFSSL_KEIL
  144165. "adcs r3, r3, r7\n\t"
  144166. #elif defined(__clang__)
  144167. "adcs r3, r7\n\t"
  144168. #else
  144169. "adc r3, r7\n\t"
  144170. #endif
  144171. #ifdef WOLFSSL_KEIL
  144172. "adcs r4, r4, %[r]\n\t"
  144173. #elif defined(__clang__)
  144174. "adcs r4, %[r]\n\t"
  144175. #else
  144176. "adc r4, %[r]\n\t"
  144177. #endif
  144178. "# A[8] * B[12]\n\t"
  144179. "mov %[a], r9\n\t"
  144180. "mov %[b], r10\n\t"
  144181. "ldr %[a], [%[a], #32]\n\t"
  144182. "ldr %[b], [%[b], #48]\n\t"
  144183. "uxth r6, %[a]\n\t"
  144184. "uxth r7, %[b]\n\t"
  144185. #ifdef WOLFSSL_KEIL
  144186. "muls r7, r6, r7\n\t"
  144187. #elif defined(__clang__)
  144188. "muls r7, r6\n\t"
  144189. #else
  144190. "mul r7, r6\n\t"
  144191. #endif
  144192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144193. "adds r5, r5, r7\n\t"
  144194. #else
  144195. "add r5, r5, r7\n\t"
  144196. #endif
  144197. #ifdef WOLFSSL_KEIL
  144198. "adcs r3, r3, %[r]\n\t"
  144199. #elif defined(__clang__)
  144200. "adcs r3, %[r]\n\t"
  144201. #else
  144202. "adc r3, %[r]\n\t"
  144203. #endif
  144204. #ifdef WOLFSSL_KEIL
  144205. "adcs r4, r4, %[r]\n\t"
  144206. #elif defined(__clang__)
  144207. "adcs r4, %[r]\n\t"
  144208. #else
  144209. "adc r4, %[r]\n\t"
  144210. #endif
  144211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144212. "lsrs r7, %[b], #16\n\t"
  144213. #else
  144214. "lsr r7, %[b], #16\n\t"
  144215. #endif
  144216. #ifdef WOLFSSL_KEIL
  144217. "muls r6, r7, r6\n\t"
  144218. #elif defined(__clang__)
  144219. "muls r6, r7\n\t"
  144220. #else
  144221. "mul r6, r7\n\t"
  144222. #endif
  144223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144224. "lsrs r7, r6, #16\n\t"
  144225. #else
  144226. "lsr r7, r6, #16\n\t"
  144227. #endif
  144228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144229. "lsls r6, r6, #16\n\t"
  144230. #else
  144231. "lsl r6, r6, #16\n\t"
  144232. #endif
  144233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144234. "adds r5, r5, r6\n\t"
  144235. #else
  144236. "add r5, r5, r6\n\t"
  144237. #endif
  144238. #ifdef WOLFSSL_KEIL
  144239. "adcs r3, r3, r7\n\t"
  144240. #elif defined(__clang__)
  144241. "adcs r3, r7\n\t"
  144242. #else
  144243. "adc r3, r7\n\t"
  144244. #endif
  144245. #ifdef WOLFSSL_KEIL
  144246. "adcs r4, r4, %[r]\n\t"
  144247. #elif defined(__clang__)
  144248. "adcs r4, %[r]\n\t"
  144249. #else
  144250. "adc r4, %[r]\n\t"
  144251. #endif
  144252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144253. "lsrs r6, %[a], #16\n\t"
  144254. #else
  144255. "lsr r6, %[a], #16\n\t"
  144256. #endif
  144257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144258. "lsrs r7, %[b], #16\n\t"
  144259. #else
  144260. "lsr r7, %[b], #16\n\t"
  144261. #endif
  144262. #ifdef WOLFSSL_KEIL
  144263. "muls r7, r6, r7\n\t"
  144264. #elif defined(__clang__)
  144265. "muls r7, r6\n\t"
  144266. #else
  144267. "mul r7, r6\n\t"
  144268. #endif
  144269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144270. "adds r3, r3, r7\n\t"
  144271. #else
  144272. "add r3, r3, r7\n\t"
  144273. #endif
  144274. #ifdef WOLFSSL_KEIL
  144275. "adcs r4, r4, %[r]\n\t"
  144276. #elif defined(__clang__)
  144277. "adcs r4, %[r]\n\t"
  144278. #else
  144279. "adc r4, %[r]\n\t"
  144280. #endif
  144281. "uxth r7, %[b]\n\t"
  144282. #ifdef WOLFSSL_KEIL
  144283. "muls r6, r7, r6\n\t"
  144284. #elif defined(__clang__)
  144285. "muls r6, r7\n\t"
  144286. #else
  144287. "mul r6, r7\n\t"
  144288. #endif
  144289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144290. "lsrs r7, r6, #16\n\t"
  144291. #else
  144292. "lsr r7, r6, #16\n\t"
  144293. #endif
  144294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144295. "lsls r6, r6, #16\n\t"
  144296. #else
  144297. "lsl r6, r6, #16\n\t"
  144298. #endif
  144299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144300. "adds r5, r5, r6\n\t"
  144301. #else
  144302. "add r5, r5, r6\n\t"
  144303. #endif
  144304. #ifdef WOLFSSL_KEIL
  144305. "adcs r3, r3, r7\n\t"
  144306. #elif defined(__clang__)
  144307. "adcs r3, r7\n\t"
  144308. #else
  144309. "adc r3, r7\n\t"
  144310. #endif
  144311. #ifdef WOLFSSL_KEIL
  144312. "adcs r4, r4, %[r]\n\t"
  144313. #elif defined(__clang__)
  144314. "adcs r4, %[r]\n\t"
  144315. #else
  144316. "adc r4, %[r]\n\t"
  144317. #endif
  144318. "# A[7] * B[13]\n\t"
  144319. "mov %[a], r9\n\t"
  144320. "mov %[b], r10\n\t"
  144321. "ldr %[a], [%[a], #28]\n\t"
  144322. "ldr %[b], [%[b], #52]\n\t"
  144323. "uxth r6, %[a]\n\t"
  144324. "uxth r7, %[b]\n\t"
  144325. #ifdef WOLFSSL_KEIL
  144326. "muls r7, r6, r7\n\t"
  144327. #elif defined(__clang__)
  144328. "muls r7, r6\n\t"
  144329. #else
  144330. "mul r7, r6\n\t"
  144331. #endif
  144332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144333. "adds r5, r5, r7\n\t"
  144334. #else
  144335. "add r5, r5, r7\n\t"
  144336. #endif
  144337. #ifdef WOLFSSL_KEIL
  144338. "adcs r3, r3, %[r]\n\t"
  144339. #elif defined(__clang__)
  144340. "adcs r3, %[r]\n\t"
  144341. #else
  144342. "adc r3, %[r]\n\t"
  144343. #endif
  144344. #ifdef WOLFSSL_KEIL
  144345. "adcs r4, r4, %[r]\n\t"
  144346. #elif defined(__clang__)
  144347. "adcs r4, %[r]\n\t"
  144348. #else
  144349. "adc r4, %[r]\n\t"
  144350. #endif
  144351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144352. "lsrs r7, %[b], #16\n\t"
  144353. #else
  144354. "lsr r7, %[b], #16\n\t"
  144355. #endif
  144356. #ifdef WOLFSSL_KEIL
  144357. "muls r6, r7, r6\n\t"
  144358. #elif defined(__clang__)
  144359. "muls r6, r7\n\t"
  144360. #else
  144361. "mul r6, r7\n\t"
  144362. #endif
  144363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144364. "lsrs r7, r6, #16\n\t"
  144365. #else
  144366. "lsr r7, r6, #16\n\t"
  144367. #endif
  144368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144369. "lsls r6, r6, #16\n\t"
  144370. #else
  144371. "lsl r6, r6, #16\n\t"
  144372. #endif
  144373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144374. "adds r5, r5, r6\n\t"
  144375. #else
  144376. "add r5, r5, r6\n\t"
  144377. #endif
  144378. #ifdef WOLFSSL_KEIL
  144379. "adcs r3, r3, r7\n\t"
  144380. #elif defined(__clang__)
  144381. "adcs r3, r7\n\t"
  144382. #else
  144383. "adc r3, r7\n\t"
  144384. #endif
  144385. #ifdef WOLFSSL_KEIL
  144386. "adcs r4, r4, %[r]\n\t"
  144387. #elif defined(__clang__)
  144388. "adcs r4, %[r]\n\t"
  144389. #else
  144390. "adc r4, %[r]\n\t"
  144391. #endif
  144392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144393. "lsrs r6, %[a], #16\n\t"
  144394. #else
  144395. "lsr r6, %[a], #16\n\t"
  144396. #endif
  144397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144398. "lsrs r7, %[b], #16\n\t"
  144399. #else
  144400. "lsr r7, %[b], #16\n\t"
  144401. #endif
  144402. #ifdef WOLFSSL_KEIL
  144403. "muls r7, r6, r7\n\t"
  144404. #elif defined(__clang__)
  144405. "muls r7, r6\n\t"
  144406. #else
  144407. "mul r7, r6\n\t"
  144408. #endif
  144409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144410. "adds r3, r3, r7\n\t"
  144411. #else
  144412. "add r3, r3, r7\n\t"
  144413. #endif
  144414. #ifdef WOLFSSL_KEIL
  144415. "adcs r4, r4, %[r]\n\t"
  144416. #elif defined(__clang__)
  144417. "adcs r4, %[r]\n\t"
  144418. #else
  144419. "adc r4, %[r]\n\t"
  144420. #endif
  144421. "uxth r7, %[b]\n\t"
  144422. #ifdef WOLFSSL_KEIL
  144423. "muls r6, r7, r6\n\t"
  144424. #elif defined(__clang__)
  144425. "muls r6, r7\n\t"
  144426. #else
  144427. "mul r6, r7\n\t"
  144428. #endif
  144429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144430. "lsrs r7, r6, #16\n\t"
  144431. #else
  144432. "lsr r7, r6, #16\n\t"
  144433. #endif
  144434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144435. "lsls r6, r6, #16\n\t"
  144436. #else
  144437. "lsl r6, r6, #16\n\t"
  144438. #endif
  144439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144440. "adds r5, r5, r6\n\t"
  144441. #else
  144442. "add r5, r5, r6\n\t"
  144443. #endif
  144444. #ifdef WOLFSSL_KEIL
  144445. "adcs r3, r3, r7\n\t"
  144446. #elif defined(__clang__)
  144447. "adcs r3, r7\n\t"
  144448. #else
  144449. "adc r3, r7\n\t"
  144450. #endif
  144451. #ifdef WOLFSSL_KEIL
  144452. "adcs r4, r4, %[r]\n\t"
  144453. #elif defined(__clang__)
  144454. "adcs r4, %[r]\n\t"
  144455. #else
  144456. "adc r4, %[r]\n\t"
  144457. #endif
  144458. "# A[6] * B[14]\n\t"
  144459. "mov %[a], r9\n\t"
  144460. "mov %[b], r10\n\t"
  144461. "ldr %[a], [%[a], #24]\n\t"
  144462. "ldr %[b], [%[b], #56]\n\t"
  144463. "uxth r6, %[a]\n\t"
  144464. "uxth r7, %[b]\n\t"
  144465. #ifdef WOLFSSL_KEIL
  144466. "muls r7, r6, r7\n\t"
  144467. #elif defined(__clang__)
  144468. "muls r7, r6\n\t"
  144469. #else
  144470. "mul r7, r6\n\t"
  144471. #endif
  144472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144473. "adds r5, r5, r7\n\t"
  144474. #else
  144475. "add r5, r5, r7\n\t"
  144476. #endif
  144477. #ifdef WOLFSSL_KEIL
  144478. "adcs r3, r3, %[r]\n\t"
  144479. #elif defined(__clang__)
  144480. "adcs r3, %[r]\n\t"
  144481. #else
  144482. "adc r3, %[r]\n\t"
  144483. #endif
  144484. #ifdef WOLFSSL_KEIL
  144485. "adcs r4, r4, %[r]\n\t"
  144486. #elif defined(__clang__)
  144487. "adcs r4, %[r]\n\t"
  144488. #else
  144489. "adc r4, %[r]\n\t"
  144490. #endif
  144491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144492. "lsrs r7, %[b], #16\n\t"
  144493. #else
  144494. "lsr r7, %[b], #16\n\t"
  144495. #endif
  144496. #ifdef WOLFSSL_KEIL
  144497. "muls r6, r7, r6\n\t"
  144498. #elif defined(__clang__)
  144499. "muls r6, r7\n\t"
  144500. #else
  144501. "mul r6, r7\n\t"
  144502. #endif
  144503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144504. "lsrs r7, r6, #16\n\t"
  144505. #else
  144506. "lsr r7, r6, #16\n\t"
  144507. #endif
  144508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144509. "lsls r6, r6, #16\n\t"
  144510. #else
  144511. "lsl r6, r6, #16\n\t"
  144512. #endif
  144513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144514. "adds r5, r5, r6\n\t"
  144515. #else
  144516. "add r5, r5, r6\n\t"
  144517. #endif
  144518. #ifdef WOLFSSL_KEIL
  144519. "adcs r3, r3, r7\n\t"
  144520. #elif defined(__clang__)
  144521. "adcs r3, r7\n\t"
  144522. #else
  144523. "adc r3, r7\n\t"
  144524. #endif
  144525. #ifdef WOLFSSL_KEIL
  144526. "adcs r4, r4, %[r]\n\t"
  144527. #elif defined(__clang__)
  144528. "adcs r4, %[r]\n\t"
  144529. #else
  144530. "adc r4, %[r]\n\t"
  144531. #endif
  144532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144533. "lsrs r6, %[a], #16\n\t"
  144534. #else
  144535. "lsr r6, %[a], #16\n\t"
  144536. #endif
  144537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144538. "lsrs r7, %[b], #16\n\t"
  144539. #else
  144540. "lsr r7, %[b], #16\n\t"
  144541. #endif
  144542. #ifdef WOLFSSL_KEIL
  144543. "muls r7, r6, r7\n\t"
  144544. #elif defined(__clang__)
  144545. "muls r7, r6\n\t"
  144546. #else
  144547. "mul r7, r6\n\t"
  144548. #endif
  144549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144550. "adds r3, r3, r7\n\t"
  144551. #else
  144552. "add r3, r3, r7\n\t"
  144553. #endif
  144554. #ifdef WOLFSSL_KEIL
  144555. "adcs r4, r4, %[r]\n\t"
  144556. #elif defined(__clang__)
  144557. "adcs r4, %[r]\n\t"
  144558. #else
  144559. "adc r4, %[r]\n\t"
  144560. #endif
  144561. "uxth r7, %[b]\n\t"
  144562. #ifdef WOLFSSL_KEIL
  144563. "muls r6, r7, r6\n\t"
  144564. #elif defined(__clang__)
  144565. "muls r6, r7\n\t"
  144566. #else
  144567. "mul r6, r7\n\t"
  144568. #endif
  144569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144570. "lsrs r7, r6, #16\n\t"
  144571. #else
  144572. "lsr r7, r6, #16\n\t"
  144573. #endif
  144574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144575. "lsls r6, r6, #16\n\t"
  144576. #else
  144577. "lsl r6, r6, #16\n\t"
  144578. #endif
  144579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144580. "adds r5, r5, r6\n\t"
  144581. #else
  144582. "add r5, r5, r6\n\t"
  144583. #endif
  144584. #ifdef WOLFSSL_KEIL
  144585. "adcs r3, r3, r7\n\t"
  144586. #elif defined(__clang__)
  144587. "adcs r3, r7\n\t"
  144588. #else
  144589. "adc r3, r7\n\t"
  144590. #endif
  144591. #ifdef WOLFSSL_KEIL
  144592. "adcs r4, r4, %[r]\n\t"
  144593. #elif defined(__clang__)
  144594. "adcs r4, %[r]\n\t"
  144595. #else
  144596. "adc r4, %[r]\n\t"
  144597. #endif
  144598. "# A[5] * B[15]\n\t"
  144599. "mov %[a], r9\n\t"
  144600. "mov %[b], r10\n\t"
  144601. "ldr %[a], [%[a], #20]\n\t"
  144602. "ldr %[b], [%[b], #60]\n\t"
  144603. "uxth r6, %[a]\n\t"
  144604. "uxth r7, %[b]\n\t"
  144605. #ifdef WOLFSSL_KEIL
  144606. "muls r7, r6, r7\n\t"
  144607. #elif defined(__clang__)
  144608. "muls r7, r6\n\t"
  144609. #else
  144610. "mul r7, r6\n\t"
  144611. #endif
  144612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144613. "adds r5, r5, r7\n\t"
  144614. #else
  144615. "add r5, r5, r7\n\t"
  144616. #endif
  144617. #ifdef WOLFSSL_KEIL
  144618. "adcs r3, r3, %[r]\n\t"
  144619. #elif defined(__clang__)
  144620. "adcs r3, %[r]\n\t"
  144621. #else
  144622. "adc r3, %[r]\n\t"
  144623. #endif
  144624. #ifdef WOLFSSL_KEIL
  144625. "adcs r4, r4, %[r]\n\t"
  144626. #elif defined(__clang__)
  144627. "adcs r4, %[r]\n\t"
  144628. #else
  144629. "adc r4, %[r]\n\t"
  144630. #endif
  144631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144632. "lsrs r7, %[b], #16\n\t"
  144633. #else
  144634. "lsr r7, %[b], #16\n\t"
  144635. #endif
  144636. #ifdef WOLFSSL_KEIL
  144637. "muls r6, r7, r6\n\t"
  144638. #elif defined(__clang__)
  144639. "muls r6, r7\n\t"
  144640. #else
  144641. "mul r6, r7\n\t"
  144642. #endif
  144643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144644. "lsrs r7, r6, #16\n\t"
  144645. #else
  144646. "lsr r7, r6, #16\n\t"
  144647. #endif
  144648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144649. "lsls r6, r6, #16\n\t"
  144650. #else
  144651. "lsl r6, r6, #16\n\t"
  144652. #endif
  144653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144654. "adds r5, r5, r6\n\t"
  144655. #else
  144656. "add r5, r5, r6\n\t"
  144657. #endif
  144658. #ifdef WOLFSSL_KEIL
  144659. "adcs r3, r3, r7\n\t"
  144660. #elif defined(__clang__)
  144661. "adcs r3, r7\n\t"
  144662. #else
  144663. "adc r3, r7\n\t"
  144664. #endif
  144665. #ifdef WOLFSSL_KEIL
  144666. "adcs r4, r4, %[r]\n\t"
  144667. #elif defined(__clang__)
  144668. "adcs r4, %[r]\n\t"
  144669. #else
  144670. "adc r4, %[r]\n\t"
  144671. #endif
  144672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144673. "lsrs r6, %[a], #16\n\t"
  144674. #else
  144675. "lsr r6, %[a], #16\n\t"
  144676. #endif
  144677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144678. "lsrs r7, %[b], #16\n\t"
  144679. #else
  144680. "lsr r7, %[b], #16\n\t"
  144681. #endif
  144682. #ifdef WOLFSSL_KEIL
  144683. "muls r7, r6, r7\n\t"
  144684. #elif defined(__clang__)
  144685. "muls r7, r6\n\t"
  144686. #else
  144687. "mul r7, r6\n\t"
  144688. #endif
  144689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144690. "adds r3, r3, r7\n\t"
  144691. #else
  144692. "add r3, r3, r7\n\t"
  144693. #endif
  144694. #ifdef WOLFSSL_KEIL
  144695. "adcs r4, r4, %[r]\n\t"
  144696. #elif defined(__clang__)
  144697. "adcs r4, %[r]\n\t"
  144698. #else
  144699. "adc r4, %[r]\n\t"
  144700. #endif
  144701. "uxth r7, %[b]\n\t"
  144702. #ifdef WOLFSSL_KEIL
  144703. "muls r6, r7, r6\n\t"
  144704. #elif defined(__clang__)
  144705. "muls r6, r7\n\t"
  144706. #else
  144707. "mul r6, r7\n\t"
  144708. #endif
  144709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144710. "lsrs r7, r6, #16\n\t"
  144711. #else
  144712. "lsr r7, r6, #16\n\t"
  144713. #endif
  144714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144715. "lsls r6, r6, #16\n\t"
  144716. #else
  144717. "lsl r6, r6, #16\n\t"
  144718. #endif
  144719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144720. "adds r5, r5, r6\n\t"
  144721. #else
  144722. "add r5, r5, r6\n\t"
  144723. #endif
  144724. #ifdef WOLFSSL_KEIL
  144725. "adcs r3, r3, r7\n\t"
  144726. #elif defined(__clang__)
  144727. "adcs r3, r7\n\t"
  144728. #else
  144729. "adc r3, r7\n\t"
  144730. #endif
  144731. #ifdef WOLFSSL_KEIL
  144732. "adcs r4, r4, %[r]\n\t"
  144733. #elif defined(__clang__)
  144734. "adcs r4, %[r]\n\t"
  144735. #else
  144736. "adc r4, %[r]\n\t"
  144737. #endif
  144738. "mov %[r], r8\n\t"
  144739. "str r5, [%[r], #80]\n\t"
  144740. "movs %[r], #0\n\t"
  144741. "# A[6] * B[15]\n\t"
  144742. "movs r5, #0\n\t"
  144743. "mov %[a], r9\n\t"
  144744. "mov %[b], r10\n\t"
  144745. "ldr %[a], [%[a], #24]\n\t"
  144746. "ldr %[b], [%[b], #60]\n\t"
  144747. "uxth r6, %[a]\n\t"
  144748. "uxth r7, %[b]\n\t"
  144749. #ifdef WOLFSSL_KEIL
  144750. "muls r7, r6, r7\n\t"
  144751. #elif defined(__clang__)
  144752. "muls r7, r6\n\t"
  144753. #else
  144754. "mul r7, r6\n\t"
  144755. #endif
  144756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144757. "adds r3, r3, r7\n\t"
  144758. #else
  144759. "add r3, r3, r7\n\t"
  144760. #endif
  144761. #ifdef WOLFSSL_KEIL
  144762. "adcs r4, r4, %[r]\n\t"
  144763. #elif defined(__clang__)
  144764. "adcs r4, %[r]\n\t"
  144765. #else
  144766. "adc r4, %[r]\n\t"
  144767. #endif
  144768. #ifdef WOLFSSL_KEIL
  144769. "adcs r5, r5, %[r]\n\t"
  144770. #elif defined(__clang__)
  144771. "adcs r5, %[r]\n\t"
  144772. #else
  144773. "adc r5, %[r]\n\t"
  144774. #endif
  144775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144776. "lsrs r7, %[b], #16\n\t"
  144777. #else
  144778. "lsr r7, %[b], #16\n\t"
  144779. #endif
  144780. #ifdef WOLFSSL_KEIL
  144781. "muls r6, r7, r6\n\t"
  144782. #elif defined(__clang__)
  144783. "muls r6, r7\n\t"
  144784. #else
  144785. "mul r6, r7\n\t"
  144786. #endif
  144787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144788. "lsrs r7, r6, #16\n\t"
  144789. #else
  144790. "lsr r7, r6, #16\n\t"
  144791. #endif
  144792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144793. "lsls r6, r6, #16\n\t"
  144794. #else
  144795. "lsl r6, r6, #16\n\t"
  144796. #endif
  144797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144798. "adds r3, r3, r6\n\t"
  144799. #else
  144800. "add r3, r3, r6\n\t"
  144801. #endif
  144802. #ifdef WOLFSSL_KEIL
  144803. "adcs r4, r4, r7\n\t"
  144804. #elif defined(__clang__)
  144805. "adcs r4, r7\n\t"
  144806. #else
  144807. "adc r4, r7\n\t"
  144808. #endif
  144809. #ifdef WOLFSSL_KEIL
  144810. "adcs r5, r5, %[r]\n\t"
  144811. #elif defined(__clang__)
  144812. "adcs r5, %[r]\n\t"
  144813. #else
  144814. "adc r5, %[r]\n\t"
  144815. #endif
  144816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144817. "lsrs r6, %[a], #16\n\t"
  144818. #else
  144819. "lsr r6, %[a], #16\n\t"
  144820. #endif
  144821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144822. "lsrs r7, %[b], #16\n\t"
  144823. #else
  144824. "lsr r7, %[b], #16\n\t"
  144825. #endif
  144826. #ifdef WOLFSSL_KEIL
  144827. "muls r7, r6, r7\n\t"
  144828. #elif defined(__clang__)
  144829. "muls r7, r6\n\t"
  144830. #else
  144831. "mul r7, r6\n\t"
  144832. #endif
  144833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144834. "adds r4, r4, r7\n\t"
  144835. #else
  144836. "add r4, r4, r7\n\t"
  144837. #endif
  144838. #ifdef WOLFSSL_KEIL
  144839. "adcs r5, r5, %[r]\n\t"
  144840. #elif defined(__clang__)
  144841. "adcs r5, %[r]\n\t"
  144842. #else
  144843. "adc r5, %[r]\n\t"
  144844. #endif
  144845. "uxth r7, %[b]\n\t"
  144846. #ifdef WOLFSSL_KEIL
  144847. "muls r6, r7, r6\n\t"
  144848. #elif defined(__clang__)
  144849. "muls r6, r7\n\t"
  144850. #else
  144851. "mul r6, r7\n\t"
  144852. #endif
  144853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144854. "lsrs r7, r6, #16\n\t"
  144855. #else
  144856. "lsr r7, r6, #16\n\t"
  144857. #endif
  144858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144859. "lsls r6, r6, #16\n\t"
  144860. #else
  144861. "lsl r6, r6, #16\n\t"
  144862. #endif
  144863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144864. "adds r3, r3, r6\n\t"
  144865. #else
  144866. "add r3, r3, r6\n\t"
  144867. #endif
  144868. #ifdef WOLFSSL_KEIL
  144869. "adcs r4, r4, r7\n\t"
  144870. #elif defined(__clang__)
  144871. "adcs r4, r7\n\t"
  144872. #else
  144873. "adc r4, r7\n\t"
  144874. #endif
  144875. #ifdef WOLFSSL_KEIL
  144876. "adcs r5, r5, %[r]\n\t"
  144877. #elif defined(__clang__)
  144878. "adcs r5, %[r]\n\t"
  144879. #else
  144880. "adc r5, %[r]\n\t"
  144881. #endif
  144882. "# A[7] * B[14]\n\t"
  144883. "mov %[a], r9\n\t"
  144884. "mov %[b], r10\n\t"
  144885. "ldr %[a], [%[a], #28]\n\t"
  144886. "ldr %[b], [%[b], #56]\n\t"
  144887. "uxth r6, %[a]\n\t"
  144888. "uxth r7, %[b]\n\t"
  144889. #ifdef WOLFSSL_KEIL
  144890. "muls r7, r6, r7\n\t"
  144891. #elif defined(__clang__)
  144892. "muls r7, r6\n\t"
  144893. #else
  144894. "mul r7, r6\n\t"
  144895. #endif
  144896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144897. "adds r3, r3, r7\n\t"
  144898. #else
  144899. "add r3, r3, r7\n\t"
  144900. #endif
  144901. #ifdef WOLFSSL_KEIL
  144902. "adcs r4, r4, %[r]\n\t"
  144903. #elif defined(__clang__)
  144904. "adcs r4, %[r]\n\t"
  144905. #else
  144906. "adc r4, %[r]\n\t"
  144907. #endif
  144908. #ifdef WOLFSSL_KEIL
  144909. "adcs r5, r5, %[r]\n\t"
  144910. #elif defined(__clang__)
  144911. "adcs r5, %[r]\n\t"
  144912. #else
  144913. "adc r5, %[r]\n\t"
  144914. #endif
  144915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144916. "lsrs r7, %[b], #16\n\t"
  144917. #else
  144918. "lsr r7, %[b], #16\n\t"
  144919. #endif
  144920. #ifdef WOLFSSL_KEIL
  144921. "muls r6, r7, r6\n\t"
  144922. #elif defined(__clang__)
  144923. "muls r6, r7\n\t"
  144924. #else
  144925. "mul r6, r7\n\t"
  144926. #endif
  144927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144928. "lsrs r7, r6, #16\n\t"
  144929. #else
  144930. "lsr r7, r6, #16\n\t"
  144931. #endif
  144932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144933. "lsls r6, r6, #16\n\t"
  144934. #else
  144935. "lsl r6, r6, #16\n\t"
  144936. #endif
  144937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144938. "adds r3, r3, r6\n\t"
  144939. #else
  144940. "add r3, r3, r6\n\t"
  144941. #endif
  144942. #ifdef WOLFSSL_KEIL
  144943. "adcs r4, r4, r7\n\t"
  144944. #elif defined(__clang__)
  144945. "adcs r4, r7\n\t"
  144946. #else
  144947. "adc r4, r7\n\t"
  144948. #endif
  144949. #ifdef WOLFSSL_KEIL
  144950. "adcs r5, r5, %[r]\n\t"
  144951. #elif defined(__clang__)
  144952. "adcs r5, %[r]\n\t"
  144953. #else
  144954. "adc r5, %[r]\n\t"
  144955. #endif
  144956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144957. "lsrs r6, %[a], #16\n\t"
  144958. #else
  144959. "lsr r6, %[a], #16\n\t"
  144960. #endif
  144961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144962. "lsrs r7, %[b], #16\n\t"
  144963. #else
  144964. "lsr r7, %[b], #16\n\t"
  144965. #endif
  144966. #ifdef WOLFSSL_KEIL
  144967. "muls r7, r6, r7\n\t"
  144968. #elif defined(__clang__)
  144969. "muls r7, r6\n\t"
  144970. #else
  144971. "mul r7, r6\n\t"
  144972. #endif
  144973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144974. "adds r4, r4, r7\n\t"
  144975. #else
  144976. "add r4, r4, r7\n\t"
  144977. #endif
  144978. #ifdef WOLFSSL_KEIL
  144979. "adcs r5, r5, %[r]\n\t"
  144980. #elif defined(__clang__)
  144981. "adcs r5, %[r]\n\t"
  144982. #else
  144983. "adc r5, %[r]\n\t"
  144984. #endif
  144985. "uxth r7, %[b]\n\t"
  144986. #ifdef WOLFSSL_KEIL
  144987. "muls r6, r7, r6\n\t"
  144988. #elif defined(__clang__)
  144989. "muls r6, r7\n\t"
  144990. #else
  144991. "mul r6, r7\n\t"
  144992. #endif
  144993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144994. "lsrs r7, r6, #16\n\t"
  144995. #else
  144996. "lsr r7, r6, #16\n\t"
  144997. #endif
  144998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144999. "lsls r6, r6, #16\n\t"
  145000. #else
  145001. "lsl r6, r6, #16\n\t"
  145002. #endif
  145003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145004. "adds r3, r3, r6\n\t"
  145005. #else
  145006. "add r3, r3, r6\n\t"
  145007. #endif
  145008. #ifdef WOLFSSL_KEIL
  145009. "adcs r4, r4, r7\n\t"
  145010. #elif defined(__clang__)
  145011. "adcs r4, r7\n\t"
  145012. #else
  145013. "adc r4, r7\n\t"
  145014. #endif
  145015. #ifdef WOLFSSL_KEIL
  145016. "adcs r5, r5, %[r]\n\t"
  145017. #elif defined(__clang__)
  145018. "adcs r5, %[r]\n\t"
  145019. #else
  145020. "adc r5, %[r]\n\t"
  145021. #endif
  145022. "# A[8] * B[13]\n\t"
  145023. "mov %[a], r9\n\t"
  145024. "mov %[b], r10\n\t"
  145025. "ldr %[a], [%[a], #32]\n\t"
  145026. "ldr %[b], [%[b], #52]\n\t"
  145027. "uxth r6, %[a]\n\t"
  145028. "uxth r7, %[b]\n\t"
  145029. #ifdef WOLFSSL_KEIL
  145030. "muls r7, r6, r7\n\t"
  145031. #elif defined(__clang__)
  145032. "muls r7, r6\n\t"
  145033. #else
  145034. "mul r7, r6\n\t"
  145035. #endif
  145036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145037. "adds r3, r3, r7\n\t"
  145038. #else
  145039. "add r3, r3, r7\n\t"
  145040. #endif
  145041. #ifdef WOLFSSL_KEIL
  145042. "adcs r4, r4, %[r]\n\t"
  145043. #elif defined(__clang__)
  145044. "adcs r4, %[r]\n\t"
  145045. #else
  145046. "adc r4, %[r]\n\t"
  145047. #endif
  145048. #ifdef WOLFSSL_KEIL
  145049. "adcs r5, r5, %[r]\n\t"
  145050. #elif defined(__clang__)
  145051. "adcs r5, %[r]\n\t"
  145052. #else
  145053. "adc r5, %[r]\n\t"
  145054. #endif
  145055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145056. "lsrs r7, %[b], #16\n\t"
  145057. #else
  145058. "lsr r7, %[b], #16\n\t"
  145059. #endif
  145060. #ifdef WOLFSSL_KEIL
  145061. "muls r6, r7, r6\n\t"
  145062. #elif defined(__clang__)
  145063. "muls r6, r7\n\t"
  145064. #else
  145065. "mul r6, r7\n\t"
  145066. #endif
  145067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145068. "lsrs r7, r6, #16\n\t"
  145069. #else
  145070. "lsr r7, r6, #16\n\t"
  145071. #endif
  145072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145073. "lsls r6, r6, #16\n\t"
  145074. #else
  145075. "lsl r6, r6, #16\n\t"
  145076. #endif
  145077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145078. "adds r3, r3, r6\n\t"
  145079. #else
  145080. "add r3, r3, r6\n\t"
  145081. #endif
  145082. #ifdef WOLFSSL_KEIL
  145083. "adcs r4, r4, r7\n\t"
  145084. #elif defined(__clang__)
  145085. "adcs r4, r7\n\t"
  145086. #else
  145087. "adc r4, r7\n\t"
  145088. #endif
  145089. #ifdef WOLFSSL_KEIL
  145090. "adcs r5, r5, %[r]\n\t"
  145091. #elif defined(__clang__)
  145092. "adcs r5, %[r]\n\t"
  145093. #else
  145094. "adc r5, %[r]\n\t"
  145095. #endif
  145096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145097. "lsrs r6, %[a], #16\n\t"
  145098. #else
  145099. "lsr r6, %[a], #16\n\t"
  145100. #endif
  145101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145102. "lsrs r7, %[b], #16\n\t"
  145103. #else
  145104. "lsr r7, %[b], #16\n\t"
  145105. #endif
  145106. #ifdef WOLFSSL_KEIL
  145107. "muls r7, r6, r7\n\t"
  145108. #elif defined(__clang__)
  145109. "muls r7, r6\n\t"
  145110. #else
  145111. "mul r7, r6\n\t"
  145112. #endif
  145113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145114. "adds r4, r4, r7\n\t"
  145115. #else
  145116. "add r4, r4, r7\n\t"
  145117. #endif
  145118. #ifdef WOLFSSL_KEIL
  145119. "adcs r5, r5, %[r]\n\t"
  145120. #elif defined(__clang__)
  145121. "adcs r5, %[r]\n\t"
  145122. #else
  145123. "adc r5, %[r]\n\t"
  145124. #endif
  145125. "uxth r7, %[b]\n\t"
  145126. #ifdef WOLFSSL_KEIL
  145127. "muls r6, r7, r6\n\t"
  145128. #elif defined(__clang__)
  145129. "muls r6, r7\n\t"
  145130. #else
  145131. "mul r6, r7\n\t"
  145132. #endif
  145133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145134. "lsrs r7, r6, #16\n\t"
  145135. #else
  145136. "lsr r7, r6, #16\n\t"
  145137. #endif
  145138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145139. "lsls r6, r6, #16\n\t"
  145140. #else
  145141. "lsl r6, r6, #16\n\t"
  145142. #endif
  145143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145144. "adds r3, r3, r6\n\t"
  145145. #else
  145146. "add r3, r3, r6\n\t"
  145147. #endif
  145148. #ifdef WOLFSSL_KEIL
  145149. "adcs r4, r4, r7\n\t"
  145150. #elif defined(__clang__)
  145151. "adcs r4, r7\n\t"
  145152. #else
  145153. "adc r4, r7\n\t"
  145154. #endif
  145155. #ifdef WOLFSSL_KEIL
  145156. "adcs r5, r5, %[r]\n\t"
  145157. #elif defined(__clang__)
  145158. "adcs r5, %[r]\n\t"
  145159. #else
  145160. "adc r5, %[r]\n\t"
  145161. #endif
  145162. "# A[9] * B[12]\n\t"
  145163. "mov %[a], r9\n\t"
  145164. "mov %[b], r10\n\t"
  145165. "ldr %[a], [%[a], #36]\n\t"
  145166. "ldr %[b], [%[b], #48]\n\t"
  145167. "uxth r6, %[a]\n\t"
  145168. "uxth r7, %[b]\n\t"
  145169. #ifdef WOLFSSL_KEIL
  145170. "muls r7, r6, r7\n\t"
  145171. #elif defined(__clang__)
  145172. "muls r7, r6\n\t"
  145173. #else
  145174. "mul r7, r6\n\t"
  145175. #endif
  145176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145177. "adds r3, r3, r7\n\t"
  145178. #else
  145179. "add r3, r3, r7\n\t"
  145180. #endif
  145181. #ifdef WOLFSSL_KEIL
  145182. "adcs r4, r4, %[r]\n\t"
  145183. #elif defined(__clang__)
  145184. "adcs r4, %[r]\n\t"
  145185. #else
  145186. "adc r4, %[r]\n\t"
  145187. #endif
  145188. #ifdef WOLFSSL_KEIL
  145189. "adcs r5, r5, %[r]\n\t"
  145190. #elif defined(__clang__)
  145191. "adcs r5, %[r]\n\t"
  145192. #else
  145193. "adc r5, %[r]\n\t"
  145194. #endif
  145195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145196. "lsrs r7, %[b], #16\n\t"
  145197. #else
  145198. "lsr r7, %[b], #16\n\t"
  145199. #endif
  145200. #ifdef WOLFSSL_KEIL
  145201. "muls r6, r7, r6\n\t"
  145202. #elif defined(__clang__)
  145203. "muls r6, r7\n\t"
  145204. #else
  145205. "mul r6, r7\n\t"
  145206. #endif
  145207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145208. "lsrs r7, r6, #16\n\t"
  145209. #else
  145210. "lsr r7, r6, #16\n\t"
  145211. #endif
  145212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145213. "lsls r6, r6, #16\n\t"
  145214. #else
  145215. "lsl r6, r6, #16\n\t"
  145216. #endif
  145217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145218. "adds r3, r3, r6\n\t"
  145219. #else
  145220. "add r3, r3, r6\n\t"
  145221. #endif
  145222. #ifdef WOLFSSL_KEIL
  145223. "adcs r4, r4, r7\n\t"
  145224. #elif defined(__clang__)
  145225. "adcs r4, r7\n\t"
  145226. #else
  145227. "adc r4, r7\n\t"
  145228. #endif
  145229. #ifdef WOLFSSL_KEIL
  145230. "adcs r5, r5, %[r]\n\t"
  145231. #elif defined(__clang__)
  145232. "adcs r5, %[r]\n\t"
  145233. #else
  145234. "adc r5, %[r]\n\t"
  145235. #endif
  145236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145237. "lsrs r6, %[a], #16\n\t"
  145238. #else
  145239. "lsr r6, %[a], #16\n\t"
  145240. #endif
  145241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145242. "lsrs r7, %[b], #16\n\t"
  145243. #else
  145244. "lsr r7, %[b], #16\n\t"
  145245. #endif
  145246. #ifdef WOLFSSL_KEIL
  145247. "muls r7, r6, r7\n\t"
  145248. #elif defined(__clang__)
  145249. "muls r7, r6\n\t"
  145250. #else
  145251. "mul r7, r6\n\t"
  145252. #endif
  145253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145254. "adds r4, r4, r7\n\t"
  145255. #else
  145256. "add r4, r4, r7\n\t"
  145257. #endif
  145258. #ifdef WOLFSSL_KEIL
  145259. "adcs r5, r5, %[r]\n\t"
  145260. #elif defined(__clang__)
  145261. "adcs r5, %[r]\n\t"
  145262. #else
  145263. "adc r5, %[r]\n\t"
  145264. #endif
  145265. "uxth r7, %[b]\n\t"
  145266. #ifdef WOLFSSL_KEIL
  145267. "muls r6, r7, r6\n\t"
  145268. #elif defined(__clang__)
  145269. "muls r6, r7\n\t"
  145270. #else
  145271. "mul r6, r7\n\t"
  145272. #endif
  145273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145274. "lsrs r7, r6, #16\n\t"
  145275. #else
  145276. "lsr r7, r6, #16\n\t"
  145277. #endif
  145278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145279. "lsls r6, r6, #16\n\t"
  145280. #else
  145281. "lsl r6, r6, #16\n\t"
  145282. #endif
  145283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145284. "adds r3, r3, r6\n\t"
  145285. #else
  145286. "add r3, r3, r6\n\t"
  145287. #endif
  145288. #ifdef WOLFSSL_KEIL
  145289. "adcs r4, r4, r7\n\t"
  145290. #elif defined(__clang__)
  145291. "adcs r4, r7\n\t"
  145292. #else
  145293. "adc r4, r7\n\t"
  145294. #endif
  145295. #ifdef WOLFSSL_KEIL
  145296. "adcs r5, r5, %[r]\n\t"
  145297. #elif defined(__clang__)
  145298. "adcs r5, %[r]\n\t"
  145299. #else
  145300. "adc r5, %[r]\n\t"
  145301. #endif
  145302. "# A[10] * B[11]\n\t"
  145303. "mov %[a], r9\n\t"
  145304. "mov %[b], r10\n\t"
  145305. "ldr %[a], [%[a], #40]\n\t"
  145306. "ldr %[b], [%[b], #44]\n\t"
  145307. "uxth r6, %[a]\n\t"
  145308. "uxth r7, %[b]\n\t"
  145309. #ifdef WOLFSSL_KEIL
  145310. "muls r7, r6, r7\n\t"
  145311. #elif defined(__clang__)
  145312. "muls r7, r6\n\t"
  145313. #else
  145314. "mul r7, r6\n\t"
  145315. #endif
  145316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145317. "adds r3, r3, r7\n\t"
  145318. #else
  145319. "add r3, r3, r7\n\t"
  145320. #endif
  145321. #ifdef WOLFSSL_KEIL
  145322. "adcs r4, r4, %[r]\n\t"
  145323. #elif defined(__clang__)
  145324. "adcs r4, %[r]\n\t"
  145325. #else
  145326. "adc r4, %[r]\n\t"
  145327. #endif
  145328. #ifdef WOLFSSL_KEIL
  145329. "adcs r5, r5, %[r]\n\t"
  145330. #elif defined(__clang__)
  145331. "adcs r5, %[r]\n\t"
  145332. #else
  145333. "adc r5, %[r]\n\t"
  145334. #endif
  145335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145336. "lsrs r7, %[b], #16\n\t"
  145337. #else
  145338. "lsr r7, %[b], #16\n\t"
  145339. #endif
  145340. #ifdef WOLFSSL_KEIL
  145341. "muls r6, r7, r6\n\t"
  145342. #elif defined(__clang__)
  145343. "muls r6, r7\n\t"
  145344. #else
  145345. "mul r6, r7\n\t"
  145346. #endif
  145347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145348. "lsrs r7, r6, #16\n\t"
  145349. #else
  145350. "lsr r7, r6, #16\n\t"
  145351. #endif
  145352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145353. "lsls r6, r6, #16\n\t"
  145354. #else
  145355. "lsl r6, r6, #16\n\t"
  145356. #endif
  145357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145358. "adds r3, r3, r6\n\t"
  145359. #else
  145360. "add r3, r3, r6\n\t"
  145361. #endif
  145362. #ifdef WOLFSSL_KEIL
  145363. "adcs r4, r4, r7\n\t"
  145364. #elif defined(__clang__)
  145365. "adcs r4, r7\n\t"
  145366. #else
  145367. "adc r4, r7\n\t"
  145368. #endif
  145369. #ifdef WOLFSSL_KEIL
  145370. "adcs r5, r5, %[r]\n\t"
  145371. #elif defined(__clang__)
  145372. "adcs r5, %[r]\n\t"
  145373. #else
  145374. "adc r5, %[r]\n\t"
  145375. #endif
  145376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145377. "lsrs r6, %[a], #16\n\t"
  145378. #else
  145379. "lsr r6, %[a], #16\n\t"
  145380. #endif
  145381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145382. "lsrs r7, %[b], #16\n\t"
  145383. #else
  145384. "lsr r7, %[b], #16\n\t"
  145385. #endif
  145386. #ifdef WOLFSSL_KEIL
  145387. "muls r7, r6, r7\n\t"
  145388. #elif defined(__clang__)
  145389. "muls r7, r6\n\t"
  145390. #else
  145391. "mul r7, r6\n\t"
  145392. #endif
  145393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145394. "adds r4, r4, r7\n\t"
  145395. #else
  145396. "add r4, r4, r7\n\t"
  145397. #endif
  145398. #ifdef WOLFSSL_KEIL
  145399. "adcs r5, r5, %[r]\n\t"
  145400. #elif defined(__clang__)
  145401. "adcs r5, %[r]\n\t"
  145402. #else
  145403. "adc r5, %[r]\n\t"
  145404. #endif
  145405. "uxth r7, %[b]\n\t"
  145406. #ifdef WOLFSSL_KEIL
  145407. "muls r6, r7, r6\n\t"
  145408. #elif defined(__clang__)
  145409. "muls r6, r7\n\t"
  145410. #else
  145411. "mul r6, r7\n\t"
  145412. #endif
  145413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145414. "lsrs r7, r6, #16\n\t"
  145415. #else
  145416. "lsr r7, r6, #16\n\t"
  145417. #endif
  145418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145419. "lsls r6, r6, #16\n\t"
  145420. #else
  145421. "lsl r6, r6, #16\n\t"
  145422. #endif
  145423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145424. "adds r3, r3, r6\n\t"
  145425. #else
  145426. "add r3, r3, r6\n\t"
  145427. #endif
  145428. #ifdef WOLFSSL_KEIL
  145429. "adcs r4, r4, r7\n\t"
  145430. #elif defined(__clang__)
  145431. "adcs r4, r7\n\t"
  145432. #else
  145433. "adc r4, r7\n\t"
  145434. #endif
  145435. #ifdef WOLFSSL_KEIL
  145436. "adcs r5, r5, %[r]\n\t"
  145437. #elif defined(__clang__)
  145438. "adcs r5, %[r]\n\t"
  145439. #else
  145440. "adc r5, %[r]\n\t"
  145441. #endif
  145442. "# A[11] * B[10]\n\t"
  145443. "mov %[a], r9\n\t"
  145444. "mov %[b], r10\n\t"
  145445. "ldr %[a], [%[a], #44]\n\t"
  145446. "ldr %[b], [%[b], #40]\n\t"
  145447. "uxth r6, %[a]\n\t"
  145448. "uxth r7, %[b]\n\t"
  145449. #ifdef WOLFSSL_KEIL
  145450. "muls r7, r6, r7\n\t"
  145451. #elif defined(__clang__)
  145452. "muls r7, r6\n\t"
  145453. #else
  145454. "mul r7, r6\n\t"
  145455. #endif
  145456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145457. "adds r3, r3, r7\n\t"
  145458. #else
  145459. "add r3, r3, r7\n\t"
  145460. #endif
  145461. #ifdef WOLFSSL_KEIL
  145462. "adcs r4, r4, %[r]\n\t"
  145463. #elif defined(__clang__)
  145464. "adcs r4, %[r]\n\t"
  145465. #else
  145466. "adc r4, %[r]\n\t"
  145467. #endif
  145468. #ifdef WOLFSSL_KEIL
  145469. "adcs r5, r5, %[r]\n\t"
  145470. #elif defined(__clang__)
  145471. "adcs r5, %[r]\n\t"
  145472. #else
  145473. "adc r5, %[r]\n\t"
  145474. #endif
  145475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145476. "lsrs r7, %[b], #16\n\t"
  145477. #else
  145478. "lsr r7, %[b], #16\n\t"
  145479. #endif
  145480. #ifdef WOLFSSL_KEIL
  145481. "muls r6, r7, r6\n\t"
  145482. #elif defined(__clang__)
  145483. "muls r6, r7\n\t"
  145484. #else
  145485. "mul r6, r7\n\t"
  145486. #endif
  145487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145488. "lsrs r7, r6, #16\n\t"
  145489. #else
  145490. "lsr r7, r6, #16\n\t"
  145491. #endif
  145492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145493. "lsls r6, r6, #16\n\t"
  145494. #else
  145495. "lsl r6, r6, #16\n\t"
  145496. #endif
  145497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145498. "adds r3, r3, r6\n\t"
  145499. #else
  145500. "add r3, r3, r6\n\t"
  145501. #endif
  145502. #ifdef WOLFSSL_KEIL
  145503. "adcs r4, r4, r7\n\t"
  145504. #elif defined(__clang__)
  145505. "adcs r4, r7\n\t"
  145506. #else
  145507. "adc r4, r7\n\t"
  145508. #endif
  145509. #ifdef WOLFSSL_KEIL
  145510. "adcs r5, r5, %[r]\n\t"
  145511. #elif defined(__clang__)
  145512. "adcs r5, %[r]\n\t"
  145513. #else
  145514. "adc r5, %[r]\n\t"
  145515. #endif
  145516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145517. "lsrs r6, %[a], #16\n\t"
  145518. #else
  145519. "lsr r6, %[a], #16\n\t"
  145520. #endif
  145521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145522. "lsrs r7, %[b], #16\n\t"
  145523. #else
  145524. "lsr r7, %[b], #16\n\t"
  145525. #endif
  145526. #ifdef WOLFSSL_KEIL
  145527. "muls r7, r6, r7\n\t"
  145528. #elif defined(__clang__)
  145529. "muls r7, r6\n\t"
  145530. #else
  145531. "mul r7, r6\n\t"
  145532. #endif
  145533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145534. "adds r4, r4, r7\n\t"
  145535. #else
  145536. "add r4, r4, r7\n\t"
  145537. #endif
  145538. #ifdef WOLFSSL_KEIL
  145539. "adcs r5, r5, %[r]\n\t"
  145540. #elif defined(__clang__)
  145541. "adcs r5, %[r]\n\t"
  145542. #else
  145543. "adc r5, %[r]\n\t"
  145544. #endif
  145545. "uxth r7, %[b]\n\t"
  145546. #ifdef WOLFSSL_KEIL
  145547. "muls r6, r7, r6\n\t"
  145548. #elif defined(__clang__)
  145549. "muls r6, r7\n\t"
  145550. #else
  145551. "mul r6, r7\n\t"
  145552. #endif
  145553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145554. "lsrs r7, r6, #16\n\t"
  145555. #else
  145556. "lsr r7, r6, #16\n\t"
  145557. #endif
  145558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145559. "lsls r6, r6, #16\n\t"
  145560. #else
  145561. "lsl r6, r6, #16\n\t"
  145562. #endif
  145563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145564. "adds r3, r3, r6\n\t"
  145565. #else
  145566. "add r3, r3, r6\n\t"
  145567. #endif
  145568. #ifdef WOLFSSL_KEIL
  145569. "adcs r4, r4, r7\n\t"
  145570. #elif defined(__clang__)
  145571. "adcs r4, r7\n\t"
  145572. #else
  145573. "adc r4, r7\n\t"
  145574. #endif
  145575. #ifdef WOLFSSL_KEIL
  145576. "adcs r5, r5, %[r]\n\t"
  145577. #elif defined(__clang__)
  145578. "adcs r5, %[r]\n\t"
  145579. #else
  145580. "adc r5, %[r]\n\t"
  145581. #endif
  145582. "# A[12] * B[9]\n\t"
  145583. "mov %[a], r9\n\t"
  145584. "mov %[b], r10\n\t"
  145585. "ldr %[a], [%[a], #48]\n\t"
  145586. "ldr %[b], [%[b], #36]\n\t"
  145587. "uxth r6, %[a]\n\t"
  145588. "uxth r7, %[b]\n\t"
  145589. #ifdef WOLFSSL_KEIL
  145590. "muls r7, r6, r7\n\t"
  145591. #elif defined(__clang__)
  145592. "muls r7, r6\n\t"
  145593. #else
  145594. "mul r7, r6\n\t"
  145595. #endif
  145596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145597. "adds r3, r3, r7\n\t"
  145598. #else
  145599. "add r3, r3, r7\n\t"
  145600. #endif
  145601. #ifdef WOLFSSL_KEIL
  145602. "adcs r4, r4, %[r]\n\t"
  145603. #elif defined(__clang__)
  145604. "adcs r4, %[r]\n\t"
  145605. #else
  145606. "adc r4, %[r]\n\t"
  145607. #endif
  145608. #ifdef WOLFSSL_KEIL
  145609. "adcs r5, r5, %[r]\n\t"
  145610. #elif defined(__clang__)
  145611. "adcs r5, %[r]\n\t"
  145612. #else
  145613. "adc r5, %[r]\n\t"
  145614. #endif
  145615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145616. "lsrs r7, %[b], #16\n\t"
  145617. #else
  145618. "lsr r7, %[b], #16\n\t"
  145619. #endif
  145620. #ifdef WOLFSSL_KEIL
  145621. "muls r6, r7, r6\n\t"
  145622. #elif defined(__clang__)
  145623. "muls r6, r7\n\t"
  145624. #else
  145625. "mul r6, r7\n\t"
  145626. #endif
  145627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145628. "lsrs r7, r6, #16\n\t"
  145629. #else
  145630. "lsr r7, r6, #16\n\t"
  145631. #endif
  145632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145633. "lsls r6, r6, #16\n\t"
  145634. #else
  145635. "lsl r6, r6, #16\n\t"
  145636. #endif
  145637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145638. "adds r3, r3, r6\n\t"
  145639. #else
  145640. "add r3, r3, r6\n\t"
  145641. #endif
  145642. #ifdef WOLFSSL_KEIL
  145643. "adcs r4, r4, r7\n\t"
  145644. #elif defined(__clang__)
  145645. "adcs r4, r7\n\t"
  145646. #else
  145647. "adc r4, r7\n\t"
  145648. #endif
  145649. #ifdef WOLFSSL_KEIL
  145650. "adcs r5, r5, %[r]\n\t"
  145651. #elif defined(__clang__)
  145652. "adcs r5, %[r]\n\t"
  145653. #else
  145654. "adc r5, %[r]\n\t"
  145655. #endif
  145656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145657. "lsrs r6, %[a], #16\n\t"
  145658. #else
  145659. "lsr r6, %[a], #16\n\t"
  145660. #endif
  145661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145662. "lsrs r7, %[b], #16\n\t"
  145663. #else
  145664. "lsr r7, %[b], #16\n\t"
  145665. #endif
  145666. #ifdef WOLFSSL_KEIL
  145667. "muls r7, r6, r7\n\t"
  145668. #elif defined(__clang__)
  145669. "muls r7, r6\n\t"
  145670. #else
  145671. "mul r7, r6\n\t"
  145672. #endif
  145673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145674. "adds r4, r4, r7\n\t"
  145675. #else
  145676. "add r4, r4, r7\n\t"
  145677. #endif
  145678. #ifdef WOLFSSL_KEIL
  145679. "adcs r5, r5, %[r]\n\t"
  145680. #elif defined(__clang__)
  145681. "adcs r5, %[r]\n\t"
  145682. #else
  145683. "adc r5, %[r]\n\t"
  145684. #endif
  145685. "uxth r7, %[b]\n\t"
  145686. #ifdef WOLFSSL_KEIL
  145687. "muls r6, r7, r6\n\t"
  145688. #elif defined(__clang__)
  145689. "muls r6, r7\n\t"
  145690. #else
  145691. "mul r6, r7\n\t"
  145692. #endif
  145693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145694. "lsrs r7, r6, #16\n\t"
  145695. #else
  145696. "lsr r7, r6, #16\n\t"
  145697. #endif
  145698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145699. "lsls r6, r6, #16\n\t"
  145700. #else
  145701. "lsl r6, r6, #16\n\t"
  145702. #endif
  145703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145704. "adds r3, r3, r6\n\t"
  145705. #else
  145706. "add r3, r3, r6\n\t"
  145707. #endif
  145708. #ifdef WOLFSSL_KEIL
  145709. "adcs r4, r4, r7\n\t"
  145710. #elif defined(__clang__)
  145711. "adcs r4, r7\n\t"
  145712. #else
  145713. "adc r4, r7\n\t"
  145714. #endif
  145715. #ifdef WOLFSSL_KEIL
  145716. "adcs r5, r5, %[r]\n\t"
  145717. #elif defined(__clang__)
  145718. "adcs r5, %[r]\n\t"
  145719. #else
  145720. "adc r5, %[r]\n\t"
  145721. #endif
  145722. "# A[13] * B[8]\n\t"
  145723. "mov %[a], r9\n\t"
  145724. "mov %[b], r10\n\t"
  145725. "ldr %[a], [%[a], #52]\n\t"
  145726. "ldr %[b], [%[b], #32]\n\t"
  145727. "uxth r6, %[a]\n\t"
  145728. "uxth r7, %[b]\n\t"
  145729. #ifdef WOLFSSL_KEIL
  145730. "muls r7, r6, r7\n\t"
  145731. #elif defined(__clang__)
  145732. "muls r7, r6\n\t"
  145733. #else
  145734. "mul r7, r6\n\t"
  145735. #endif
  145736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145737. "adds r3, r3, r7\n\t"
  145738. #else
  145739. "add r3, r3, r7\n\t"
  145740. #endif
  145741. #ifdef WOLFSSL_KEIL
  145742. "adcs r4, r4, %[r]\n\t"
  145743. #elif defined(__clang__)
  145744. "adcs r4, %[r]\n\t"
  145745. #else
  145746. "adc r4, %[r]\n\t"
  145747. #endif
  145748. #ifdef WOLFSSL_KEIL
  145749. "adcs r5, r5, %[r]\n\t"
  145750. #elif defined(__clang__)
  145751. "adcs r5, %[r]\n\t"
  145752. #else
  145753. "adc r5, %[r]\n\t"
  145754. #endif
  145755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145756. "lsrs r7, %[b], #16\n\t"
  145757. #else
  145758. "lsr r7, %[b], #16\n\t"
  145759. #endif
  145760. #ifdef WOLFSSL_KEIL
  145761. "muls r6, r7, r6\n\t"
  145762. #elif defined(__clang__)
  145763. "muls r6, r7\n\t"
  145764. #else
  145765. "mul r6, r7\n\t"
  145766. #endif
  145767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145768. "lsrs r7, r6, #16\n\t"
  145769. #else
  145770. "lsr r7, r6, #16\n\t"
  145771. #endif
  145772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145773. "lsls r6, r6, #16\n\t"
  145774. #else
  145775. "lsl r6, r6, #16\n\t"
  145776. #endif
  145777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145778. "adds r3, r3, r6\n\t"
  145779. #else
  145780. "add r3, r3, r6\n\t"
  145781. #endif
  145782. #ifdef WOLFSSL_KEIL
  145783. "adcs r4, r4, r7\n\t"
  145784. #elif defined(__clang__)
  145785. "adcs r4, r7\n\t"
  145786. #else
  145787. "adc r4, r7\n\t"
  145788. #endif
  145789. #ifdef WOLFSSL_KEIL
  145790. "adcs r5, r5, %[r]\n\t"
  145791. #elif defined(__clang__)
  145792. "adcs r5, %[r]\n\t"
  145793. #else
  145794. "adc r5, %[r]\n\t"
  145795. #endif
  145796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145797. "lsrs r6, %[a], #16\n\t"
  145798. #else
  145799. "lsr r6, %[a], #16\n\t"
  145800. #endif
  145801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145802. "lsrs r7, %[b], #16\n\t"
  145803. #else
  145804. "lsr r7, %[b], #16\n\t"
  145805. #endif
  145806. #ifdef WOLFSSL_KEIL
  145807. "muls r7, r6, r7\n\t"
  145808. #elif defined(__clang__)
  145809. "muls r7, r6\n\t"
  145810. #else
  145811. "mul r7, r6\n\t"
  145812. #endif
  145813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145814. "adds r4, r4, r7\n\t"
  145815. #else
  145816. "add r4, r4, r7\n\t"
  145817. #endif
  145818. #ifdef WOLFSSL_KEIL
  145819. "adcs r5, r5, %[r]\n\t"
  145820. #elif defined(__clang__)
  145821. "adcs r5, %[r]\n\t"
  145822. #else
  145823. "adc r5, %[r]\n\t"
  145824. #endif
  145825. "uxth r7, %[b]\n\t"
  145826. #ifdef WOLFSSL_KEIL
  145827. "muls r6, r7, r6\n\t"
  145828. #elif defined(__clang__)
  145829. "muls r6, r7\n\t"
  145830. #else
  145831. "mul r6, r7\n\t"
  145832. #endif
  145833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145834. "lsrs r7, r6, #16\n\t"
  145835. #else
  145836. "lsr r7, r6, #16\n\t"
  145837. #endif
  145838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145839. "lsls r6, r6, #16\n\t"
  145840. #else
  145841. "lsl r6, r6, #16\n\t"
  145842. #endif
  145843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145844. "adds r3, r3, r6\n\t"
  145845. #else
  145846. "add r3, r3, r6\n\t"
  145847. #endif
  145848. #ifdef WOLFSSL_KEIL
  145849. "adcs r4, r4, r7\n\t"
  145850. #elif defined(__clang__)
  145851. "adcs r4, r7\n\t"
  145852. #else
  145853. "adc r4, r7\n\t"
  145854. #endif
  145855. #ifdef WOLFSSL_KEIL
  145856. "adcs r5, r5, %[r]\n\t"
  145857. #elif defined(__clang__)
  145858. "adcs r5, %[r]\n\t"
  145859. #else
  145860. "adc r5, %[r]\n\t"
  145861. #endif
  145862. "# A[14] * B[7]\n\t"
  145863. "mov %[a], r9\n\t"
  145864. "mov %[b], r10\n\t"
  145865. "ldr %[a], [%[a], #56]\n\t"
  145866. "ldr %[b], [%[b], #28]\n\t"
  145867. "uxth r6, %[a]\n\t"
  145868. "uxth r7, %[b]\n\t"
  145869. #ifdef WOLFSSL_KEIL
  145870. "muls r7, r6, r7\n\t"
  145871. #elif defined(__clang__)
  145872. "muls r7, r6\n\t"
  145873. #else
  145874. "mul r7, r6\n\t"
  145875. #endif
  145876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145877. "adds r3, r3, r7\n\t"
  145878. #else
  145879. "add r3, r3, r7\n\t"
  145880. #endif
  145881. #ifdef WOLFSSL_KEIL
  145882. "adcs r4, r4, %[r]\n\t"
  145883. #elif defined(__clang__)
  145884. "adcs r4, %[r]\n\t"
  145885. #else
  145886. "adc r4, %[r]\n\t"
  145887. #endif
  145888. #ifdef WOLFSSL_KEIL
  145889. "adcs r5, r5, %[r]\n\t"
  145890. #elif defined(__clang__)
  145891. "adcs r5, %[r]\n\t"
  145892. #else
  145893. "adc r5, %[r]\n\t"
  145894. #endif
  145895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145896. "lsrs r7, %[b], #16\n\t"
  145897. #else
  145898. "lsr r7, %[b], #16\n\t"
  145899. #endif
  145900. #ifdef WOLFSSL_KEIL
  145901. "muls r6, r7, r6\n\t"
  145902. #elif defined(__clang__)
  145903. "muls r6, r7\n\t"
  145904. #else
  145905. "mul r6, r7\n\t"
  145906. #endif
  145907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145908. "lsrs r7, r6, #16\n\t"
  145909. #else
  145910. "lsr r7, r6, #16\n\t"
  145911. #endif
  145912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145913. "lsls r6, r6, #16\n\t"
  145914. #else
  145915. "lsl r6, r6, #16\n\t"
  145916. #endif
  145917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145918. "adds r3, r3, r6\n\t"
  145919. #else
  145920. "add r3, r3, r6\n\t"
  145921. #endif
  145922. #ifdef WOLFSSL_KEIL
  145923. "adcs r4, r4, r7\n\t"
  145924. #elif defined(__clang__)
  145925. "adcs r4, r7\n\t"
  145926. #else
  145927. "adc r4, r7\n\t"
  145928. #endif
  145929. #ifdef WOLFSSL_KEIL
  145930. "adcs r5, r5, %[r]\n\t"
  145931. #elif defined(__clang__)
  145932. "adcs r5, %[r]\n\t"
  145933. #else
  145934. "adc r5, %[r]\n\t"
  145935. #endif
  145936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145937. "lsrs r6, %[a], #16\n\t"
  145938. #else
  145939. "lsr r6, %[a], #16\n\t"
  145940. #endif
  145941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145942. "lsrs r7, %[b], #16\n\t"
  145943. #else
  145944. "lsr r7, %[b], #16\n\t"
  145945. #endif
  145946. #ifdef WOLFSSL_KEIL
  145947. "muls r7, r6, r7\n\t"
  145948. #elif defined(__clang__)
  145949. "muls r7, r6\n\t"
  145950. #else
  145951. "mul r7, r6\n\t"
  145952. #endif
  145953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145954. "adds r4, r4, r7\n\t"
  145955. #else
  145956. "add r4, r4, r7\n\t"
  145957. #endif
  145958. #ifdef WOLFSSL_KEIL
  145959. "adcs r5, r5, %[r]\n\t"
  145960. #elif defined(__clang__)
  145961. "adcs r5, %[r]\n\t"
  145962. #else
  145963. "adc r5, %[r]\n\t"
  145964. #endif
  145965. "uxth r7, %[b]\n\t"
  145966. #ifdef WOLFSSL_KEIL
  145967. "muls r6, r7, r6\n\t"
  145968. #elif defined(__clang__)
  145969. "muls r6, r7\n\t"
  145970. #else
  145971. "mul r6, r7\n\t"
  145972. #endif
  145973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145974. "lsrs r7, r6, #16\n\t"
  145975. #else
  145976. "lsr r7, r6, #16\n\t"
  145977. #endif
  145978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145979. "lsls r6, r6, #16\n\t"
  145980. #else
  145981. "lsl r6, r6, #16\n\t"
  145982. #endif
  145983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145984. "adds r3, r3, r6\n\t"
  145985. #else
  145986. "add r3, r3, r6\n\t"
  145987. #endif
  145988. #ifdef WOLFSSL_KEIL
  145989. "adcs r4, r4, r7\n\t"
  145990. #elif defined(__clang__)
  145991. "adcs r4, r7\n\t"
  145992. #else
  145993. "adc r4, r7\n\t"
  145994. #endif
  145995. #ifdef WOLFSSL_KEIL
  145996. "adcs r5, r5, %[r]\n\t"
  145997. #elif defined(__clang__)
  145998. "adcs r5, %[r]\n\t"
  145999. #else
  146000. "adc r5, %[r]\n\t"
  146001. #endif
  146002. "# A[15] * B[6]\n\t"
  146003. "mov %[a], r9\n\t"
  146004. "mov %[b], r10\n\t"
  146005. "ldr %[a], [%[a], #60]\n\t"
  146006. "ldr %[b], [%[b], #24]\n\t"
  146007. "uxth r6, %[a]\n\t"
  146008. "uxth r7, %[b]\n\t"
  146009. #ifdef WOLFSSL_KEIL
  146010. "muls r7, r6, r7\n\t"
  146011. #elif defined(__clang__)
  146012. "muls r7, r6\n\t"
  146013. #else
  146014. "mul r7, r6\n\t"
  146015. #endif
  146016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146017. "adds r3, r3, r7\n\t"
  146018. #else
  146019. "add r3, r3, r7\n\t"
  146020. #endif
  146021. #ifdef WOLFSSL_KEIL
  146022. "adcs r4, r4, %[r]\n\t"
  146023. #elif defined(__clang__)
  146024. "adcs r4, %[r]\n\t"
  146025. #else
  146026. "adc r4, %[r]\n\t"
  146027. #endif
  146028. #ifdef WOLFSSL_KEIL
  146029. "adcs r5, r5, %[r]\n\t"
  146030. #elif defined(__clang__)
  146031. "adcs r5, %[r]\n\t"
  146032. #else
  146033. "adc r5, %[r]\n\t"
  146034. #endif
  146035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146036. "lsrs r7, %[b], #16\n\t"
  146037. #else
  146038. "lsr r7, %[b], #16\n\t"
  146039. #endif
  146040. #ifdef WOLFSSL_KEIL
  146041. "muls r6, r7, r6\n\t"
  146042. #elif defined(__clang__)
  146043. "muls r6, r7\n\t"
  146044. #else
  146045. "mul r6, r7\n\t"
  146046. #endif
  146047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146048. "lsrs r7, r6, #16\n\t"
  146049. #else
  146050. "lsr r7, r6, #16\n\t"
  146051. #endif
  146052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146053. "lsls r6, r6, #16\n\t"
  146054. #else
  146055. "lsl r6, r6, #16\n\t"
  146056. #endif
  146057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146058. "adds r3, r3, r6\n\t"
  146059. #else
  146060. "add r3, r3, r6\n\t"
  146061. #endif
  146062. #ifdef WOLFSSL_KEIL
  146063. "adcs r4, r4, r7\n\t"
  146064. #elif defined(__clang__)
  146065. "adcs r4, r7\n\t"
  146066. #else
  146067. "adc r4, r7\n\t"
  146068. #endif
  146069. #ifdef WOLFSSL_KEIL
  146070. "adcs r5, r5, %[r]\n\t"
  146071. #elif defined(__clang__)
  146072. "adcs r5, %[r]\n\t"
  146073. #else
  146074. "adc r5, %[r]\n\t"
  146075. #endif
  146076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146077. "lsrs r6, %[a], #16\n\t"
  146078. #else
  146079. "lsr r6, %[a], #16\n\t"
  146080. #endif
  146081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146082. "lsrs r7, %[b], #16\n\t"
  146083. #else
  146084. "lsr r7, %[b], #16\n\t"
  146085. #endif
  146086. #ifdef WOLFSSL_KEIL
  146087. "muls r7, r6, r7\n\t"
  146088. #elif defined(__clang__)
  146089. "muls r7, r6\n\t"
  146090. #else
  146091. "mul r7, r6\n\t"
  146092. #endif
  146093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146094. "adds r4, r4, r7\n\t"
  146095. #else
  146096. "add r4, r4, r7\n\t"
  146097. #endif
  146098. #ifdef WOLFSSL_KEIL
  146099. "adcs r5, r5, %[r]\n\t"
  146100. #elif defined(__clang__)
  146101. "adcs r5, %[r]\n\t"
  146102. #else
  146103. "adc r5, %[r]\n\t"
  146104. #endif
  146105. "uxth r7, %[b]\n\t"
  146106. #ifdef WOLFSSL_KEIL
  146107. "muls r6, r7, r6\n\t"
  146108. #elif defined(__clang__)
  146109. "muls r6, r7\n\t"
  146110. #else
  146111. "mul r6, r7\n\t"
  146112. #endif
  146113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146114. "lsrs r7, r6, #16\n\t"
  146115. #else
  146116. "lsr r7, r6, #16\n\t"
  146117. #endif
  146118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146119. "lsls r6, r6, #16\n\t"
  146120. #else
  146121. "lsl r6, r6, #16\n\t"
  146122. #endif
  146123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146124. "adds r3, r3, r6\n\t"
  146125. #else
  146126. "add r3, r3, r6\n\t"
  146127. #endif
  146128. #ifdef WOLFSSL_KEIL
  146129. "adcs r4, r4, r7\n\t"
  146130. #elif defined(__clang__)
  146131. "adcs r4, r7\n\t"
  146132. #else
  146133. "adc r4, r7\n\t"
  146134. #endif
  146135. #ifdef WOLFSSL_KEIL
  146136. "adcs r5, r5, %[r]\n\t"
  146137. #elif defined(__clang__)
  146138. "adcs r5, %[r]\n\t"
  146139. #else
  146140. "adc r5, %[r]\n\t"
  146141. #endif
  146142. "mov %[r], r8\n\t"
  146143. "str r3, [%[r], #84]\n\t"
  146144. "movs %[r], #0\n\t"
  146145. "# A[15] * B[7]\n\t"
  146146. "movs r3, #0\n\t"
  146147. "mov %[a], r9\n\t"
  146148. "mov %[b], r10\n\t"
  146149. "ldr %[a], [%[a], #60]\n\t"
  146150. "ldr %[b], [%[b], #28]\n\t"
  146151. "uxth r6, %[a]\n\t"
  146152. "uxth r7, %[b]\n\t"
  146153. #ifdef WOLFSSL_KEIL
  146154. "muls r7, r6, r7\n\t"
  146155. #elif defined(__clang__)
  146156. "muls r7, r6\n\t"
  146157. #else
  146158. "mul r7, r6\n\t"
  146159. #endif
  146160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146161. "adds r4, r4, r7\n\t"
  146162. #else
  146163. "add r4, r4, r7\n\t"
  146164. #endif
  146165. #ifdef WOLFSSL_KEIL
  146166. "adcs r5, r5, %[r]\n\t"
  146167. #elif defined(__clang__)
  146168. "adcs r5, %[r]\n\t"
  146169. #else
  146170. "adc r5, %[r]\n\t"
  146171. #endif
  146172. #ifdef WOLFSSL_KEIL
  146173. "adcs r3, r3, %[r]\n\t"
  146174. #elif defined(__clang__)
  146175. "adcs r3, %[r]\n\t"
  146176. #else
  146177. "adc r3, %[r]\n\t"
  146178. #endif
  146179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146180. "lsrs r7, %[b], #16\n\t"
  146181. #else
  146182. "lsr r7, %[b], #16\n\t"
  146183. #endif
  146184. #ifdef WOLFSSL_KEIL
  146185. "muls r6, r7, r6\n\t"
  146186. #elif defined(__clang__)
  146187. "muls r6, r7\n\t"
  146188. #else
  146189. "mul r6, r7\n\t"
  146190. #endif
  146191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146192. "lsrs r7, r6, #16\n\t"
  146193. #else
  146194. "lsr r7, r6, #16\n\t"
  146195. #endif
  146196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146197. "lsls r6, r6, #16\n\t"
  146198. #else
  146199. "lsl r6, r6, #16\n\t"
  146200. #endif
  146201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146202. "adds r4, r4, r6\n\t"
  146203. #else
  146204. "add r4, r4, r6\n\t"
  146205. #endif
  146206. #ifdef WOLFSSL_KEIL
  146207. "adcs r5, r5, r7\n\t"
  146208. #elif defined(__clang__)
  146209. "adcs r5, r7\n\t"
  146210. #else
  146211. "adc r5, r7\n\t"
  146212. #endif
  146213. #ifdef WOLFSSL_KEIL
  146214. "adcs r3, r3, %[r]\n\t"
  146215. #elif defined(__clang__)
  146216. "adcs r3, %[r]\n\t"
  146217. #else
  146218. "adc r3, %[r]\n\t"
  146219. #endif
  146220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146221. "lsrs r6, %[a], #16\n\t"
  146222. #else
  146223. "lsr r6, %[a], #16\n\t"
  146224. #endif
  146225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146226. "lsrs r7, %[b], #16\n\t"
  146227. #else
  146228. "lsr r7, %[b], #16\n\t"
  146229. #endif
  146230. #ifdef WOLFSSL_KEIL
  146231. "muls r7, r6, r7\n\t"
  146232. #elif defined(__clang__)
  146233. "muls r7, r6\n\t"
  146234. #else
  146235. "mul r7, r6\n\t"
  146236. #endif
  146237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146238. "adds r5, r5, r7\n\t"
  146239. #else
  146240. "add r5, r5, r7\n\t"
  146241. #endif
  146242. #ifdef WOLFSSL_KEIL
  146243. "adcs r3, r3, %[r]\n\t"
  146244. #elif defined(__clang__)
  146245. "adcs r3, %[r]\n\t"
  146246. #else
  146247. "adc r3, %[r]\n\t"
  146248. #endif
  146249. "uxth r7, %[b]\n\t"
  146250. #ifdef WOLFSSL_KEIL
  146251. "muls r6, r7, r6\n\t"
  146252. #elif defined(__clang__)
  146253. "muls r6, r7\n\t"
  146254. #else
  146255. "mul r6, r7\n\t"
  146256. #endif
  146257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146258. "lsrs r7, r6, #16\n\t"
  146259. #else
  146260. "lsr r7, r6, #16\n\t"
  146261. #endif
  146262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146263. "lsls r6, r6, #16\n\t"
  146264. #else
  146265. "lsl r6, r6, #16\n\t"
  146266. #endif
  146267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146268. "adds r4, r4, r6\n\t"
  146269. #else
  146270. "add r4, r4, r6\n\t"
  146271. #endif
  146272. #ifdef WOLFSSL_KEIL
  146273. "adcs r5, r5, r7\n\t"
  146274. #elif defined(__clang__)
  146275. "adcs r5, r7\n\t"
  146276. #else
  146277. "adc r5, r7\n\t"
  146278. #endif
  146279. #ifdef WOLFSSL_KEIL
  146280. "adcs r3, r3, %[r]\n\t"
  146281. #elif defined(__clang__)
  146282. "adcs r3, %[r]\n\t"
  146283. #else
  146284. "adc r3, %[r]\n\t"
  146285. #endif
  146286. "# A[14] * B[8]\n\t"
  146287. "mov %[a], r9\n\t"
  146288. "mov %[b], r10\n\t"
  146289. "ldr %[a], [%[a], #56]\n\t"
  146290. "ldr %[b], [%[b], #32]\n\t"
  146291. "uxth r6, %[a]\n\t"
  146292. "uxth r7, %[b]\n\t"
  146293. #ifdef WOLFSSL_KEIL
  146294. "muls r7, r6, r7\n\t"
  146295. #elif defined(__clang__)
  146296. "muls r7, r6\n\t"
  146297. #else
  146298. "mul r7, r6\n\t"
  146299. #endif
  146300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146301. "adds r4, r4, r7\n\t"
  146302. #else
  146303. "add r4, r4, r7\n\t"
  146304. #endif
  146305. #ifdef WOLFSSL_KEIL
  146306. "adcs r5, r5, %[r]\n\t"
  146307. #elif defined(__clang__)
  146308. "adcs r5, %[r]\n\t"
  146309. #else
  146310. "adc r5, %[r]\n\t"
  146311. #endif
  146312. #ifdef WOLFSSL_KEIL
  146313. "adcs r3, r3, %[r]\n\t"
  146314. #elif defined(__clang__)
  146315. "adcs r3, %[r]\n\t"
  146316. #else
  146317. "adc r3, %[r]\n\t"
  146318. #endif
  146319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146320. "lsrs r7, %[b], #16\n\t"
  146321. #else
  146322. "lsr r7, %[b], #16\n\t"
  146323. #endif
  146324. #ifdef WOLFSSL_KEIL
  146325. "muls r6, r7, r6\n\t"
  146326. #elif defined(__clang__)
  146327. "muls r6, r7\n\t"
  146328. #else
  146329. "mul r6, r7\n\t"
  146330. #endif
  146331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146332. "lsrs r7, r6, #16\n\t"
  146333. #else
  146334. "lsr r7, r6, #16\n\t"
  146335. #endif
  146336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146337. "lsls r6, r6, #16\n\t"
  146338. #else
  146339. "lsl r6, r6, #16\n\t"
  146340. #endif
  146341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146342. "adds r4, r4, r6\n\t"
  146343. #else
  146344. "add r4, r4, r6\n\t"
  146345. #endif
  146346. #ifdef WOLFSSL_KEIL
  146347. "adcs r5, r5, r7\n\t"
  146348. #elif defined(__clang__)
  146349. "adcs r5, r7\n\t"
  146350. #else
  146351. "adc r5, r7\n\t"
  146352. #endif
  146353. #ifdef WOLFSSL_KEIL
  146354. "adcs r3, r3, %[r]\n\t"
  146355. #elif defined(__clang__)
  146356. "adcs r3, %[r]\n\t"
  146357. #else
  146358. "adc r3, %[r]\n\t"
  146359. #endif
  146360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146361. "lsrs r6, %[a], #16\n\t"
  146362. #else
  146363. "lsr r6, %[a], #16\n\t"
  146364. #endif
  146365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146366. "lsrs r7, %[b], #16\n\t"
  146367. #else
  146368. "lsr r7, %[b], #16\n\t"
  146369. #endif
  146370. #ifdef WOLFSSL_KEIL
  146371. "muls r7, r6, r7\n\t"
  146372. #elif defined(__clang__)
  146373. "muls r7, r6\n\t"
  146374. #else
  146375. "mul r7, r6\n\t"
  146376. #endif
  146377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146378. "adds r5, r5, r7\n\t"
  146379. #else
  146380. "add r5, r5, r7\n\t"
  146381. #endif
  146382. #ifdef WOLFSSL_KEIL
  146383. "adcs r3, r3, %[r]\n\t"
  146384. #elif defined(__clang__)
  146385. "adcs r3, %[r]\n\t"
  146386. #else
  146387. "adc r3, %[r]\n\t"
  146388. #endif
  146389. "uxth r7, %[b]\n\t"
  146390. #ifdef WOLFSSL_KEIL
  146391. "muls r6, r7, r6\n\t"
  146392. #elif defined(__clang__)
  146393. "muls r6, r7\n\t"
  146394. #else
  146395. "mul r6, r7\n\t"
  146396. #endif
  146397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146398. "lsrs r7, r6, #16\n\t"
  146399. #else
  146400. "lsr r7, r6, #16\n\t"
  146401. #endif
  146402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146403. "lsls r6, r6, #16\n\t"
  146404. #else
  146405. "lsl r6, r6, #16\n\t"
  146406. #endif
  146407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146408. "adds r4, r4, r6\n\t"
  146409. #else
  146410. "add r4, r4, r6\n\t"
  146411. #endif
  146412. #ifdef WOLFSSL_KEIL
  146413. "adcs r5, r5, r7\n\t"
  146414. #elif defined(__clang__)
  146415. "adcs r5, r7\n\t"
  146416. #else
  146417. "adc r5, r7\n\t"
  146418. #endif
  146419. #ifdef WOLFSSL_KEIL
  146420. "adcs r3, r3, %[r]\n\t"
  146421. #elif defined(__clang__)
  146422. "adcs r3, %[r]\n\t"
  146423. #else
  146424. "adc r3, %[r]\n\t"
  146425. #endif
  146426. "# A[13] * B[9]\n\t"
  146427. "mov %[a], r9\n\t"
  146428. "mov %[b], r10\n\t"
  146429. "ldr %[a], [%[a], #52]\n\t"
  146430. "ldr %[b], [%[b], #36]\n\t"
  146431. "uxth r6, %[a]\n\t"
  146432. "uxth r7, %[b]\n\t"
  146433. #ifdef WOLFSSL_KEIL
  146434. "muls r7, r6, r7\n\t"
  146435. #elif defined(__clang__)
  146436. "muls r7, r6\n\t"
  146437. #else
  146438. "mul r7, r6\n\t"
  146439. #endif
  146440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146441. "adds r4, r4, r7\n\t"
  146442. #else
  146443. "add r4, r4, r7\n\t"
  146444. #endif
  146445. #ifdef WOLFSSL_KEIL
  146446. "adcs r5, r5, %[r]\n\t"
  146447. #elif defined(__clang__)
  146448. "adcs r5, %[r]\n\t"
  146449. #else
  146450. "adc r5, %[r]\n\t"
  146451. #endif
  146452. #ifdef WOLFSSL_KEIL
  146453. "adcs r3, r3, %[r]\n\t"
  146454. #elif defined(__clang__)
  146455. "adcs r3, %[r]\n\t"
  146456. #else
  146457. "adc r3, %[r]\n\t"
  146458. #endif
  146459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146460. "lsrs r7, %[b], #16\n\t"
  146461. #else
  146462. "lsr r7, %[b], #16\n\t"
  146463. #endif
  146464. #ifdef WOLFSSL_KEIL
  146465. "muls r6, r7, r6\n\t"
  146466. #elif defined(__clang__)
  146467. "muls r6, r7\n\t"
  146468. #else
  146469. "mul r6, r7\n\t"
  146470. #endif
  146471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146472. "lsrs r7, r6, #16\n\t"
  146473. #else
  146474. "lsr r7, r6, #16\n\t"
  146475. #endif
  146476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146477. "lsls r6, r6, #16\n\t"
  146478. #else
  146479. "lsl r6, r6, #16\n\t"
  146480. #endif
  146481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146482. "adds r4, r4, r6\n\t"
  146483. #else
  146484. "add r4, r4, r6\n\t"
  146485. #endif
  146486. #ifdef WOLFSSL_KEIL
  146487. "adcs r5, r5, r7\n\t"
  146488. #elif defined(__clang__)
  146489. "adcs r5, r7\n\t"
  146490. #else
  146491. "adc r5, r7\n\t"
  146492. #endif
  146493. #ifdef WOLFSSL_KEIL
  146494. "adcs r3, r3, %[r]\n\t"
  146495. #elif defined(__clang__)
  146496. "adcs r3, %[r]\n\t"
  146497. #else
  146498. "adc r3, %[r]\n\t"
  146499. #endif
  146500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146501. "lsrs r6, %[a], #16\n\t"
  146502. #else
  146503. "lsr r6, %[a], #16\n\t"
  146504. #endif
  146505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146506. "lsrs r7, %[b], #16\n\t"
  146507. #else
  146508. "lsr r7, %[b], #16\n\t"
  146509. #endif
  146510. #ifdef WOLFSSL_KEIL
  146511. "muls r7, r6, r7\n\t"
  146512. #elif defined(__clang__)
  146513. "muls r7, r6\n\t"
  146514. #else
  146515. "mul r7, r6\n\t"
  146516. #endif
  146517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146518. "adds r5, r5, r7\n\t"
  146519. #else
  146520. "add r5, r5, r7\n\t"
  146521. #endif
  146522. #ifdef WOLFSSL_KEIL
  146523. "adcs r3, r3, %[r]\n\t"
  146524. #elif defined(__clang__)
  146525. "adcs r3, %[r]\n\t"
  146526. #else
  146527. "adc r3, %[r]\n\t"
  146528. #endif
  146529. "uxth r7, %[b]\n\t"
  146530. #ifdef WOLFSSL_KEIL
  146531. "muls r6, r7, r6\n\t"
  146532. #elif defined(__clang__)
  146533. "muls r6, r7\n\t"
  146534. #else
  146535. "mul r6, r7\n\t"
  146536. #endif
  146537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146538. "lsrs r7, r6, #16\n\t"
  146539. #else
  146540. "lsr r7, r6, #16\n\t"
  146541. #endif
  146542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146543. "lsls r6, r6, #16\n\t"
  146544. #else
  146545. "lsl r6, r6, #16\n\t"
  146546. #endif
  146547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146548. "adds r4, r4, r6\n\t"
  146549. #else
  146550. "add r4, r4, r6\n\t"
  146551. #endif
  146552. #ifdef WOLFSSL_KEIL
  146553. "adcs r5, r5, r7\n\t"
  146554. #elif defined(__clang__)
  146555. "adcs r5, r7\n\t"
  146556. #else
  146557. "adc r5, r7\n\t"
  146558. #endif
  146559. #ifdef WOLFSSL_KEIL
  146560. "adcs r3, r3, %[r]\n\t"
  146561. #elif defined(__clang__)
  146562. "adcs r3, %[r]\n\t"
  146563. #else
  146564. "adc r3, %[r]\n\t"
  146565. #endif
  146566. "# A[12] * B[10]\n\t"
  146567. "mov %[a], r9\n\t"
  146568. "mov %[b], r10\n\t"
  146569. "ldr %[a], [%[a], #48]\n\t"
  146570. "ldr %[b], [%[b], #40]\n\t"
  146571. "uxth r6, %[a]\n\t"
  146572. "uxth r7, %[b]\n\t"
  146573. #ifdef WOLFSSL_KEIL
  146574. "muls r7, r6, r7\n\t"
  146575. #elif defined(__clang__)
  146576. "muls r7, r6\n\t"
  146577. #else
  146578. "mul r7, r6\n\t"
  146579. #endif
  146580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146581. "adds r4, r4, r7\n\t"
  146582. #else
  146583. "add r4, r4, r7\n\t"
  146584. #endif
  146585. #ifdef WOLFSSL_KEIL
  146586. "adcs r5, r5, %[r]\n\t"
  146587. #elif defined(__clang__)
  146588. "adcs r5, %[r]\n\t"
  146589. #else
  146590. "adc r5, %[r]\n\t"
  146591. #endif
  146592. #ifdef WOLFSSL_KEIL
  146593. "adcs r3, r3, %[r]\n\t"
  146594. #elif defined(__clang__)
  146595. "adcs r3, %[r]\n\t"
  146596. #else
  146597. "adc r3, %[r]\n\t"
  146598. #endif
  146599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146600. "lsrs r7, %[b], #16\n\t"
  146601. #else
  146602. "lsr r7, %[b], #16\n\t"
  146603. #endif
  146604. #ifdef WOLFSSL_KEIL
  146605. "muls r6, r7, r6\n\t"
  146606. #elif defined(__clang__)
  146607. "muls r6, r7\n\t"
  146608. #else
  146609. "mul r6, r7\n\t"
  146610. #endif
  146611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146612. "lsrs r7, r6, #16\n\t"
  146613. #else
  146614. "lsr r7, r6, #16\n\t"
  146615. #endif
  146616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146617. "lsls r6, r6, #16\n\t"
  146618. #else
  146619. "lsl r6, r6, #16\n\t"
  146620. #endif
  146621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146622. "adds r4, r4, r6\n\t"
  146623. #else
  146624. "add r4, r4, r6\n\t"
  146625. #endif
  146626. #ifdef WOLFSSL_KEIL
  146627. "adcs r5, r5, r7\n\t"
  146628. #elif defined(__clang__)
  146629. "adcs r5, r7\n\t"
  146630. #else
  146631. "adc r5, r7\n\t"
  146632. #endif
  146633. #ifdef WOLFSSL_KEIL
  146634. "adcs r3, r3, %[r]\n\t"
  146635. #elif defined(__clang__)
  146636. "adcs r3, %[r]\n\t"
  146637. #else
  146638. "adc r3, %[r]\n\t"
  146639. #endif
  146640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146641. "lsrs r6, %[a], #16\n\t"
  146642. #else
  146643. "lsr r6, %[a], #16\n\t"
  146644. #endif
  146645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146646. "lsrs r7, %[b], #16\n\t"
  146647. #else
  146648. "lsr r7, %[b], #16\n\t"
  146649. #endif
  146650. #ifdef WOLFSSL_KEIL
  146651. "muls r7, r6, r7\n\t"
  146652. #elif defined(__clang__)
  146653. "muls r7, r6\n\t"
  146654. #else
  146655. "mul r7, r6\n\t"
  146656. #endif
  146657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146658. "adds r5, r5, r7\n\t"
  146659. #else
  146660. "add r5, r5, r7\n\t"
  146661. #endif
  146662. #ifdef WOLFSSL_KEIL
  146663. "adcs r3, r3, %[r]\n\t"
  146664. #elif defined(__clang__)
  146665. "adcs r3, %[r]\n\t"
  146666. #else
  146667. "adc r3, %[r]\n\t"
  146668. #endif
  146669. "uxth r7, %[b]\n\t"
  146670. #ifdef WOLFSSL_KEIL
  146671. "muls r6, r7, r6\n\t"
  146672. #elif defined(__clang__)
  146673. "muls r6, r7\n\t"
  146674. #else
  146675. "mul r6, r7\n\t"
  146676. #endif
  146677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146678. "lsrs r7, r6, #16\n\t"
  146679. #else
  146680. "lsr r7, r6, #16\n\t"
  146681. #endif
  146682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146683. "lsls r6, r6, #16\n\t"
  146684. #else
  146685. "lsl r6, r6, #16\n\t"
  146686. #endif
  146687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146688. "adds r4, r4, r6\n\t"
  146689. #else
  146690. "add r4, r4, r6\n\t"
  146691. #endif
  146692. #ifdef WOLFSSL_KEIL
  146693. "adcs r5, r5, r7\n\t"
  146694. #elif defined(__clang__)
  146695. "adcs r5, r7\n\t"
  146696. #else
  146697. "adc r5, r7\n\t"
  146698. #endif
  146699. #ifdef WOLFSSL_KEIL
  146700. "adcs r3, r3, %[r]\n\t"
  146701. #elif defined(__clang__)
  146702. "adcs r3, %[r]\n\t"
  146703. #else
  146704. "adc r3, %[r]\n\t"
  146705. #endif
  146706. "# A[11] * B[11]\n\t"
  146707. "mov %[a], r9\n\t"
  146708. "mov %[b], r10\n\t"
  146709. "ldr %[a], [%[a], #44]\n\t"
  146710. "ldr %[b], [%[b], #44]\n\t"
  146711. "uxth r6, %[a]\n\t"
  146712. "uxth r7, %[b]\n\t"
  146713. #ifdef WOLFSSL_KEIL
  146714. "muls r7, r6, r7\n\t"
  146715. #elif defined(__clang__)
  146716. "muls r7, r6\n\t"
  146717. #else
  146718. "mul r7, r6\n\t"
  146719. #endif
  146720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146721. "adds r4, r4, r7\n\t"
  146722. #else
  146723. "add r4, r4, r7\n\t"
  146724. #endif
  146725. #ifdef WOLFSSL_KEIL
  146726. "adcs r5, r5, %[r]\n\t"
  146727. #elif defined(__clang__)
  146728. "adcs r5, %[r]\n\t"
  146729. #else
  146730. "adc r5, %[r]\n\t"
  146731. #endif
  146732. #ifdef WOLFSSL_KEIL
  146733. "adcs r3, r3, %[r]\n\t"
  146734. #elif defined(__clang__)
  146735. "adcs r3, %[r]\n\t"
  146736. #else
  146737. "adc r3, %[r]\n\t"
  146738. #endif
  146739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146740. "lsrs r7, %[b], #16\n\t"
  146741. #else
  146742. "lsr r7, %[b], #16\n\t"
  146743. #endif
  146744. #ifdef WOLFSSL_KEIL
  146745. "muls r6, r7, r6\n\t"
  146746. #elif defined(__clang__)
  146747. "muls r6, r7\n\t"
  146748. #else
  146749. "mul r6, r7\n\t"
  146750. #endif
  146751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146752. "lsrs r7, r6, #16\n\t"
  146753. #else
  146754. "lsr r7, r6, #16\n\t"
  146755. #endif
  146756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146757. "lsls r6, r6, #16\n\t"
  146758. #else
  146759. "lsl r6, r6, #16\n\t"
  146760. #endif
  146761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146762. "adds r4, r4, r6\n\t"
  146763. #else
  146764. "add r4, r4, r6\n\t"
  146765. #endif
  146766. #ifdef WOLFSSL_KEIL
  146767. "adcs r5, r5, r7\n\t"
  146768. #elif defined(__clang__)
  146769. "adcs r5, r7\n\t"
  146770. #else
  146771. "adc r5, r7\n\t"
  146772. #endif
  146773. #ifdef WOLFSSL_KEIL
  146774. "adcs r3, r3, %[r]\n\t"
  146775. #elif defined(__clang__)
  146776. "adcs r3, %[r]\n\t"
  146777. #else
  146778. "adc r3, %[r]\n\t"
  146779. #endif
  146780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146781. "lsrs r6, %[a], #16\n\t"
  146782. #else
  146783. "lsr r6, %[a], #16\n\t"
  146784. #endif
  146785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146786. "lsrs r7, %[b], #16\n\t"
  146787. #else
  146788. "lsr r7, %[b], #16\n\t"
  146789. #endif
  146790. #ifdef WOLFSSL_KEIL
  146791. "muls r7, r6, r7\n\t"
  146792. #elif defined(__clang__)
  146793. "muls r7, r6\n\t"
  146794. #else
  146795. "mul r7, r6\n\t"
  146796. #endif
  146797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146798. "adds r5, r5, r7\n\t"
  146799. #else
  146800. "add r5, r5, r7\n\t"
  146801. #endif
  146802. #ifdef WOLFSSL_KEIL
  146803. "adcs r3, r3, %[r]\n\t"
  146804. #elif defined(__clang__)
  146805. "adcs r3, %[r]\n\t"
  146806. #else
  146807. "adc r3, %[r]\n\t"
  146808. #endif
  146809. "uxth r7, %[b]\n\t"
  146810. #ifdef WOLFSSL_KEIL
  146811. "muls r6, r7, r6\n\t"
  146812. #elif defined(__clang__)
  146813. "muls r6, r7\n\t"
  146814. #else
  146815. "mul r6, r7\n\t"
  146816. #endif
  146817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146818. "lsrs r7, r6, #16\n\t"
  146819. #else
  146820. "lsr r7, r6, #16\n\t"
  146821. #endif
  146822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146823. "lsls r6, r6, #16\n\t"
  146824. #else
  146825. "lsl r6, r6, #16\n\t"
  146826. #endif
  146827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146828. "adds r4, r4, r6\n\t"
  146829. #else
  146830. "add r4, r4, r6\n\t"
  146831. #endif
  146832. #ifdef WOLFSSL_KEIL
  146833. "adcs r5, r5, r7\n\t"
  146834. #elif defined(__clang__)
  146835. "adcs r5, r7\n\t"
  146836. #else
  146837. "adc r5, r7\n\t"
  146838. #endif
  146839. #ifdef WOLFSSL_KEIL
  146840. "adcs r3, r3, %[r]\n\t"
  146841. #elif defined(__clang__)
  146842. "adcs r3, %[r]\n\t"
  146843. #else
  146844. "adc r3, %[r]\n\t"
  146845. #endif
  146846. "# A[10] * B[12]\n\t"
  146847. "mov %[a], r9\n\t"
  146848. "mov %[b], r10\n\t"
  146849. "ldr %[a], [%[a], #40]\n\t"
  146850. "ldr %[b], [%[b], #48]\n\t"
  146851. "uxth r6, %[a]\n\t"
  146852. "uxth r7, %[b]\n\t"
  146853. #ifdef WOLFSSL_KEIL
  146854. "muls r7, r6, r7\n\t"
  146855. #elif defined(__clang__)
  146856. "muls r7, r6\n\t"
  146857. #else
  146858. "mul r7, r6\n\t"
  146859. #endif
  146860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146861. "adds r4, r4, r7\n\t"
  146862. #else
  146863. "add r4, r4, r7\n\t"
  146864. #endif
  146865. #ifdef WOLFSSL_KEIL
  146866. "adcs r5, r5, %[r]\n\t"
  146867. #elif defined(__clang__)
  146868. "adcs r5, %[r]\n\t"
  146869. #else
  146870. "adc r5, %[r]\n\t"
  146871. #endif
  146872. #ifdef WOLFSSL_KEIL
  146873. "adcs r3, r3, %[r]\n\t"
  146874. #elif defined(__clang__)
  146875. "adcs r3, %[r]\n\t"
  146876. #else
  146877. "adc r3, %[r]\n\t"
  146878. #endif
  146879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146880. "lsrs r7, %[b], #16\n\t"
  146881. #else
  146882. "lsr r7, %[b], #16\n\t"
  146883. #endif
  146884. #ifdef WOLFSSL_KEIL
  146885. "muls r6, r7, r6\n\t"
  146886. #elif defined(__clang__)
  146887. "muls r6, r7\n\t"
  146888. #else
  146889. "mul r6, r7\n\t"
  146890. #endif
  146891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146892. "lsrs r7, r6, #16\n\t"
  146893. #else
  146894. "lsr r7, r6, #16\n\t"
  146895. #endif
  146896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146897. "lsls r6, r6, #16\n\t"
  146898. #else
  146899. "lsl r6, r6, #16\n\t"
  146900. #endif
  146901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146902. "adds r4, r4, r6\n\t"
  146903. #else
  146904. "add r4, r4, r6\n\t"
  146905. #endif
  146906. #ifdef WOLFSSL_KEIL
  146907. "adcs r5, r5, r7\n\t"
  146908. #elif defined(__clang__)
  146909. "adcs r5, r7\n\t"
  146910. #else
  146911. "adc r5, r7\n\t"
  146912. #endif
  146913. #ifdef WOLFSSL_KEIL
  146914. "adcs r3, r3, %[r]\n\t"
  146915. #elif defined(__clang__)
  146916. "adcs r3, %[r]\n\t"
  146917. #else
  146918. "adc r3, %[r]\n\t"
  146919. #endif
  146920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146921. "lsrs r6, %[a], #16\n\t"
  146922. #else
  146923. "lsr r6, %[a], #16\n\t"
  146924. #endif
  146925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146926. "lsrs r7, %[b], #16\n\t"
  146927. #else
  146928. "lsr r7, %[b], #16\n\t"
  146929. #endif
  146930. #ifdef WOLFSSL_KEIL
  146931. "muls r7, r6, r7\n\t"
  146932. #elif defined(__clang__)
  146933. "muls r7, r6\n\t"
  146934. #else
  146935. "mul r7, r6\n\t"
  146936. #endif
  146937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146938. "adds r5, r5, r7\n\t"
  146939. #else
  146940. "add r5, r5, r7\n\t"
  146941. #endif
  146942. #ifdef WOLFSSL_KEIL
  146943. "adcs r3, r3, %[r]\n\t"
  146944. #elif defined(__clang__)
  146945. "adcs r3, %[r]\n\t"
  146946. #else
  146947. "adc r3, %[r]\n\t"
  146948. #endif
  146949. "uxth r7, %[b]\n\t"
  146950. #ifdef WOLFSSL_KEIL
  146951. "muls r6, r7, r6\n\t"
  146952. #elif defined(__clang__)
  146953. "muls r6, r7\n\t"
  146954. #else
  146955. "mul r6, r7\n\t"
  146956. #endif
  146957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146958. "lsrs r7, r6, #16\n\t"
  146959. #else
  146960. "lsr r7, r6, #16\n\t"
  146961. #endif
  146962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146963. "lsls r6, r6, #16\n\t"
  146964. #else
  146965. "lsl r6, r6, #16\n\t"
  146966. #endif
  146967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146968. "adds r4, r4, r6\n\t"
  146969. #else
  146970. "add r4, r4, r6\n\t"
  146971. #endif
  146972. #ifdef WOLFSSL_KEIL
  146973. "adcs r5, r5, r7\n\t"
  146974. #elif defined(__clang__)
  146975. "adcs r5, r7\n\t"
  146976. #else
  146977. "adc r5, r7\n\t"
  146978. #endif
  146979. #ifdef WOLFSSL_KEIL
  146980. "adcs r3, r3, %[r]\n\t"
  146981. #elif defined(__clang__)
  146982. "adcs r3, %[r]\n\t"
  146983. #else
  146984. "adc r3, %[r]\n\t"
  146985. #endif
  146986. "# A[9] * B[13]\n\t"
  146987. "mov %[a], r9\n\t"
  146988. "mov %[b], r10\n\t"
  146989. "ldr %[a], [%[a], #36]\n\t"
  146990. "ldr %[b], [%[b], #52]\n\t"
  146991. "uxth r6, %[a]\n\t"
  146992. "uxth r7, %[b]\n\t"
  146993. #ifdef WOLFSSL_KEIL
  146994. "muls r7, r6, r7\n\t"
  146995. #elif defined(__clang__)
  146996. "muls r7, r6\n\t"
  146997. #else
  146998. "mul r7, r6\n\t"
  146999. #endif
  147000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147001. "adds r4, r4, r7\n\t"
  147002. #else
  147003. "add r4, r4, r7\n\t"
  147004. #endif
  147005. #ifdef WOLFSSL_KEIL
  147006. "adcs r5, r5, %[r]\n\t"
  147007. #elif defined(__clang__)
  147008. "adcs r5, %[r]\n\t"
  147009. #else
  147010. "adc r5, %[r]\n\t"
  147011. #endif
  147012. #ifdef WOLFSSL_KEIL
  147013. "adcs r3, r3, %[r]\n\t"
  147014. #elif defined(__clang__)
  147015. "adcs r3, %[r]\n\t"
  147016. #else
  147017. "adc r3, %[r]\n\t"
  147018. #endif
  147019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147020. "lsrs r7, %[b], #16\n\t"
  147021. #else
  147022. "lsr r7, %[b], #16\n\t"
  147023. #endif
  147024. #ifdef WOLFSSL_KEIL
  147025. "muls r6, r7, r6\n\t"
  147026. #elif defined(__clang__)
  147027. "muls r6, r7\n\t"
  147028. #else
  147029. "mul r6, r7\n\t"
  147030. #endif
  147031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147032. "lsrs r7, r6, #16\n\t"
  147033. #else
  147034. "lsr r7, r6, #16\n\t"
  147035. #endif
  147036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147037. "lsls r6, r6, #16\n\t"
  147038. #else
  147039. "lsl r6, r6, #16\n\t"
  147040. #endif
  147041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147042. "adds r4, r4, r6\n\t"
  147043. #else
  147044. "add r4, r4, r6\n\t"
  147045. #endif
  147046. #ifdef WOLFSSL_KEIL
  147047. "adcs r5, r5, r7\n\t"
  147048. #elif defined(__clang__)
  147049. "adcs r5, r7\n\t"
  147050. #else
  147051. "adc r5, r7\n\t"
  147052. #endif
  147053. #ifdef WOLFSSL_KEIL
  147054. "adcs r3, r3, %[r]\n\t"
  147055. #elif defined(__clang__)
  147056. "adcs r3, %[r]\n\t"
  147057. #else
  147058. "adc r3, %[r]\n\t"
  147059. #endif
  147060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147061. "lsrs r6, %[a], #16\n\t"
  147062. #else
  147063. "lsr r6, %[a], #16\n\t"
  147064. #endif
  147065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147066. "lsrs r7, %[b], #16\n\t"
  147067. #else
  147068. "lsr r7, %[b], #16\n\t"
  147069. #endif
  147070. #ifdef WOLFSSL_KEIL
  147071. "muls r7, r6, r7\n\t"
  147072. #elif defined(__clang__)
  147073. "muls r7, r6\n\t"
  147074. #else
  147075. "mul r7, r6\n\t"
  147076. #endif
  147077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147078. "adds r5, r5, r7\n\t"
  147079. #else
  147080. "add r5, r5, r7\n\t"
  147081. #endif
  147082. #ifdef WOLFSSL_KEIL
  147083. "adcs r3, r3, %[r]\n\t"
  147084. #elif defined(__clang__)
  147085. "adcs r3, %[r]\n\t"
  147086. #else
  147087. "adc r3, %[r]\n\t"
  147088. #endif
  147089. "uxth r7, %[b]\n\t"
  147090. #ifdef WOLFSSL_KEIL
  147091. "muls r6, r7, r6\n\t"
  147092. #elif defined(__clang__)
  147093. "muls r6, r7\n\t"
  147094. #else
  147095. "mul r6, r7\n\t"
  147096. #endif
  147097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147098. "lsrs r7, r6, #16\n\t"
  147099. #else
  147100. "lsr r7, r6, #16\n\t"
  147101. #endif
  147102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147103. "lsls r6, r6, #16\n\t"
  147104. #else
  147105. "lsl r6, r6, #16\n\t"
  147106. #endif
  147107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147108. "adds r4, r4, r6\n\t"
  147109. #else
  147110. "add r4, r4, r6\n\t"
  147111. #endif
  147112. #ifdef WOLFSSL_KEIL
  147113. "adcs r5, r5, r7\n\t"
  147114. #elif defined(__clang__)
  147115. "adcs r5, r7\n\t"
  147116. #else
  147117. "adc r5, r7\n\t"
  147118. #endif
  147119. #ifdef WOLFSSL_KEIL
  147120. "adcs r3, r3, %[r]\n\t"
  147121. #elif defined(__clang__)
  147122. "adcs r3, %[r]\n\t"
  147123. #else
  147124. "adc r3, %[r]\n\t"
  147125. #endif
  147126. "# A[8] * B[14]\n\t"
  147127. "mov %[a], r9\n\t"
  147128. "mov %[b], r10\n\t"
  147129. "ldr %[a], [%[a], #32]\n\t"
  147130. "ldr %[b], [%[b], #56]\n\t"
  147131. "uxth r6, %[a]\n\t"
  147132. "uxth r7, %[b]\n\t"
  147133. #ifdef WOLFSSL_KEIL
  147134. "muls r7, r6, r7\n\t"
  147135. #elif defined(__clang__)
  147136. "muls r7, r6\n\t"
  147137. #else
  147138. "mul r7, r6\n\t"
  147139. #endif
  147140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147141. "adds r4, r4, r7\n\t"
  147142. #else
  147143. "add r4, r4, r7\n\t"
  147144. #endif
  147145. #ifdef WOLFSSL_KEIL
  147146. "adcs r5, r5, %[r]\n\t"
  147147. #elif defined(__clang__)
  147148. "adcs r5, %[r]\n\t"
  147149. #else
  147150. "adc r5, %[r]\n\t"
  147151. #endif
  147152. #ifdef WOLFSSL_KEIL
  147153. "adcs r3, r3, %[r]\n\t"
  147154. #elif defined(__clang__)
  147155. "adcs r3, %[r]\n\t"
  147156. #else
  147157. "adc r3, %[r]\n\t"
  147158. #endif
  147159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147160. "lsrs r7, %[b], #16\n\t"
  147161. #else
  147162. "lsr r7, %[b], #16\n\t"
  147163. #endif
  147164. #ifdef WOLFSSL_KEIL
  147165. "muls r6, r7, r6\n\t"
  147166. #elif defined(__clang__)
  147167. "muls r6, r7\n\t"
  147168. #else
  147169. "mul r6, r7\n\t"
  147170. #endif
  147171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147172. "lsrs r7, r6, #16\n\t"
  147173. #else
  147174. "lsr r7, r6, #16\n\t"
  147175. #endif
  147176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147177. "lsls r6, r6, #16\n\t"
  147178. #else
  147179. "lsl r6, r6, #16\n\t"
  147180. #endif
  147181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147182. "adds r4, r4, r6\n\t"
  147183. #else
  147184. "add r4, r4, r6\n\t"
  147185. #endif
  147186. #ifdef WOLFSSL_KEIL
  147187. "adcs r5, r5, r7\n\t"
  147188. #elif defined(__clang__)
  147189. "adcs r5, r7\n\t"
  147190. #else
  147191. "adc r5, r7\n\t"
  147192. #endif
  147193. #ifdef WOLFSSL_KEIL
  147194. "adcs r3, r3, %[r]\n\t"
  147195. #elif defined(__clang__)
  147196. "adcs r3, %[r]\n\t"
  147197. #else
  147198. "adc r3, %[r]\n\t"
  147199. #endif
  147200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147201. "lsrs r6, %[a], #16\n\t"
  147202. #else
  147203. "lsr r6, %[a], #16\n\t"
  147204. #endif
  147205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147206. "lsrs r7, %[b], #16\n\t"
  147207. #else
  147208. "lsr r7, %[b], #16\n\t"
  147209. #endif
  147210. #ifdef WOLFSSL_KEIL
  147211. "muls r7, r6, r7\n\t"
  147212. #elif defined(__clang__)
  147213. "muls r7, r6\n\t"
  147214. #else
  147215. "mul r7, r6\n\t"
  147216. #endif
  147217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147218. "adds r5, r5, r7\n\t"
  147219. #else
  147220. "add r5, r5, r7\n\t"
  147221. #endif
  147222. #ifdef WOLFSSL_KEIL
  147223. "adcs r3, r3, %[r]\n\t"
  147224. #elif defined(__clang__)
  147225. "adcs r3, %[r]\n\t"
  147226. #else
  147227. "adc r3, %[r]\n\t"
  147228. #endif
  147229. "uxth r7, %[b]\n\t"
  147230. #ifdef WOLFSSL_KEIL
  147231. "muls r6, r7, r6\n\t"
  147232. #elif defined(__clang__)
  147233. "muls r6, r7\n\t"
  147234. #else
  147235. "mul r6, r7\n\t"
  147236. #endif
  147237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147238. "lsrs r7, r6, #16\n\t"
  147239. #else
  147240. "lsr r7, r6, #16\n\t"
  147241. #endif
  147242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147243. "lsls r6, r6, #16\n\t"
  147244. #else
  147245. "lsl r6, r6, #16\n\t"
  147246. #endif
  147247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147248. "adds r4, r4, r6\n\t"
  147249. #else
  147250. "add r4, r4, r6\n\t"
  147251. #endif
  147252. #ifdef WOLFSSL_KEIL
  147253. "adcs r5, r5, r7\n\t"
  147254. #elif defined(__clang__)
  147255. "adcs r5, r7\n\t"
  147256. #else
  147257. "adc r5, r7\n\t"
  147258. #endif
  147259. #ifdef WOLFSSL_KEIL
  147260. "adcs r3, r3, %[r]\n\t"
  147261. #elif defined(__clang__)
  147262. "adcs r3, %[r]\n\t"
  147263. #else
  147264. "adc r3, %[r]\n\t"
  147265. #endif
  147266. "# A[7] * B[15]\n\t"
  147267. "mov %[a], r9\n\t"
  147268. "mov %[b], r10\n\t"
  147269. "ldr %[a], [%[a], #28]\n\t"
  147270. "ldr %[b], [%[b], #60]\n\t"
  147271. "uxth r6, %[a]\n\t"
  147272. "uxth r7, %[b]\n\t"
  147273. #ifdef WOLFSSL_KEIL
  147274. "muls r7, r6, r7\n\t"
  147275. #elif defined(__clang__)
  147276. "muls r7, r6\n\t"
  147277. #else
  147278. "mul r7, r6\n\t"
  147279. #endif
  147280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147281. "adds r4, r4, r7\n\t"
  147282. #else
  147283. "add r4, r4, r7\n\t"
  147284. #endif
  147285. #ifdef WOLFSSL_KEIL
  147286. "adcs r5, r5, %[r]\n\t"
  147287. #elif defined(__clang__)
  147288. "adcs r5, %[r]\n\t"
  147289. #else
  147290. "adc r5, %[r]\n\t"
  147291. #endif
  147292. #ifdef WOLFSSL_KEIL
  147293. "adcs r3, r3, %[r]\n\t"
  147294. #elif defined(__clang__)
  147295. "adcs r3, %[r]\n\t"
  147296. #else
  147297. "adc r3, %[r]\n\t"
  147298. #endif
  147299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147300. "lsrs r7, %[b], #16\n\t"
  147301. #else
  147302. "lsr r7, %[b], #16\n\t"
  147303. #endif
  147304. #ifdef WOLFSSL_KEIL
  147305. "muls r6, r7, r6\n\t"
  147306. #elif defined(__clang__)
  147307. "muls r6, r7\n\t"
  147308. #else
  147309. "mul r6, r7\n\t"
  147310. #endif
  147311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147312. "lsrs r7, r6, #16\n\t"
  147313. #else
  147314. "lsr r7, r6, #16\n\t"
  147315. #endif
  147316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147317. "lsls r6, r6, #16\n\t"
  147318. #else
  147319. "lsl r6, r6, #16\n\t"
  147320. #endif
  147321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147322. "adds r4, r4, r6\n\t"
  147323. #else
  147324. "add r4, r4, r6\n\t"
  147325. #endif
  147326. #ifdef WOLFSSL_KEIL
  147327. "adcs r5, r5, r7\n\t"
  147328. #elif defined(__clang__)
  147329. "adcs r5, r7\n\t"
  147330. #else
  147331. "adc r5, r7\n\t"
  147332. #endif
  147333. #ifdef WOLFSSL_KEIL
  147334. "adcs r3, r3, %[r]\n\t"
  147335. #elif defined(__clang__)
  147336. "adcs r3, %[r]\n\t"
  147337. #else
  147338. "adc r3, %[r]\n\t"
  147339. #endif
  147340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147341. "lsrs r6, %[a], #16\n\t"
  147342. #else
  147343. "lsr r6, %[a], #16\n\t"
  147344. #endif
  147345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147346. "lsrs r7, %[b], #16\n\t"
  147347. #else
  147348. "lsr r7, %[b], #16\n\t"
  147349. #endif
  147350. #ifdef WOLFSSL_KEIL
  147351. "muls r7, r6, r7\n\t"
  147352. #elif defined(__clang__)
  147353. "muls r7, r6\n\t"
  147354. #else
  147355. "mul r7, r6\n\t"
  147356. #endif
  147357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147358. "adds r5, r5, r7\n\t"
  147359. #else
  147360. "add r5, r5, r7\n\t"
  147361. #endif
  147362. #ifdef WOLFSSL_KEIL
  147363. "adcs r3, r3, %[r]\n\t"
  147364. #elif defined(__clang__)
  147365. "adcs r3, %[r]\n\t"
  147366. #else
  147367. "adc r3, %[r]\n\t"
  147368. #endif
  147369. "uxth r7, %[b]\n\t"
  147370. #ifdef WOLFSSL_KEIL
  147371. "muls r6, r7, r6\n\t"
  147372. #elif defined(__clang__)
  147373. "muls r6, r7\n\t"
  147374. #else
  147375. "mul r6, r7\n\t"
  147376. #endif
  147377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147378. "lsrs r7, r6, #16\n\t"
  147379. #else
  147380. "lsr r7, r6, #16\n\t"
  147381. #endif
  147382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147383. "lsls r6, r6, #16\n\t"
  147384. #else
  147385. "lsl r6, r6, #16\n\t"
  147386. #endif
  147387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147388. "adds r4, r4, r6\n\t"
  147389. #else
  147390. "add r4, r4, r6\n\t"
  147391. #endif
  147392. #ifdef WOLFSSL_KEIL
  147393. "adcs r5, r5, r7\n\t"
  147394. #elif defined(__clang__)
  147395. "adcs r5, r7\n\t"
  147396. #else
  147397. "adc r5, r7\n\t"
  147398. #endif
  147399. #ifdef WOLFSSL_KEIL
  147400. "adcs r3, r3, %[r]\n\t"
  147401. #elif defined(__clang__)
  147402. "adcs r3, %[r]\n\t"
  147403. #else
  147404. "adc r3, %[r]\n\t"
  147405. #endif
  147406. "mov %[r], r8\n\t"
  147407. "str r4, [%[r], #88]\n\t"
  147408. "movs %[r], #0\n\t"
  147409. "# A[8] * B[15]\n\t"
  147410. "movs r4, #0\n\t"
  147411. "mov %[a], r9\n\t"
  147412. "mov %[b], r10\n\t"
  147413. "ldr %[a], [%[a], #32]\n\t"
  147414. "ldr %[b], [%[b], #60]\n\t"
  147415. "uxth r6, %[a]\n\t"
  147416. "uxth r7, %[b]\n\t"
  147417. #ifdef WOLFSSL_KEIL
  147418. "muls r7, r6, r7\n\t"
  147419. #elif defined(__clang__)
  147420. "muls r7, r6\n\t"
  147421. #else
  147422. "mul r7, r6\n\t"
  147423. #endif
  147424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147425. "adds r5, r5, r7\n\t"
  147426. #else
  147427. "add r5, r5, r7\n\t"
  147428. #endif
  147429. #ifdef WOLFSSL_KEIL
  147430. "adcs r3, r3, %[r]\n\t"
  147431. #elif defined(__clang__)
  147432. "adcs r3, %[r]\n\t"
  147433. #else
  147434. "adc r3, %[r]\n\t"
  147435. #endif
  147436. #ifdef WOLFSSL_KEIL
  147437. "adcs r4, r4, %[r]\n\t"
  147438. #elif defined(__clang__)
  147439. "adcs r4, %[r]\n\t"
  147440. #else
  147441. "adc r4, %[r]\n\t"
  147442. #endif
  147443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147444. "lsrs r7, %[b], #16\n\t"
  147445. #else
  147446. "lsr r7, %[b], #16\n\t"
  147447. #endif
  147448. #ifdef WOLFSSL_KEIL
  147449. "muls r6, r7, r6\n\t"
  147450. #elif defined(__clang__)
  147451. "muls r6, r7\n\t"
  147452. #else
  147453. "mul r6, r7\n\t"
  147454. #endif
  147455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147456. "lsrs r7, r6, #16\n\t"
  147457. #else
  147458. "lsr r7, r6, #16\n\t"
  147459. #endif
  147460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147461. "lsls r6, r6, #16\n\t"
  147462. #else
  147463. "lsl r6, r6, #16\n\t"
  147464. #endif
  147465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147466. "adds r5, r5, r6\n\t"
  147467. #else
  147468. "add r5, r5, r6\n\t"
  147469. #endif
  147470. #ifdef WOLFSSL_KEIL
  147471. "adcs r3, r3, r7\n\t"
  147472. #elif defined(__clang__)
  147473. "adcs r3, r7\n\t"
  147474. #else
  147475. "adc r3, r7\n\t"
  147476. #endif
  147477. #ifdef WOLFSSL_KEIL
  147478. "adcs r4, r4, %[r]\n\t"
  147479. #elif defined(__clang__)
  147480. "adcs r4, %[r]\n\t"
  147481. #else
  147482. "adc r4, %[r]\n\t"
  147483. #endif
  147484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147485. "lsrs r6, %[a], #16\n\t"
  147486. #else
  147487. "lsr r6, %[a], #16\n\t"
  147488. #endif
  147489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147490. "lsrs r7, %[b], #16\n\t"
  147491. #else
  147492. "lsr r7, %[b], #16\n\t"
  147493. #endif
  147494. #ifdef WOLFSSL_KEIL
  147495. "muls r7, r6, r7\n\t"
  147496. #elif defined(__clang__)
  147497. "muls r7, r6\n\t"
  147498. #else
  147499. "mul r7, r6\n\t"
  147500. #endif
  147501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147502. "adds r3, r3, r7\n\t"
  147503. #else
  147504. "add r3, r3, r7\n\t"
  147505. #endif
  147506. #ifdef WOLFSSL_KEIL
  147507. "adcs r4, r4, %[r]\n\t"
  147508. #elif defined(__clang__)
  147509. "adcs r4, %[r]\n\t"
  147510. #else
  147511. "adc r4, %[r]\n\t"
  147512. #endif
  147513. "uxth r7, %[b]\n\t"
  147514. #ifdef WOLFSSL_KEIL
  147515. "muls r6, r7, r6\n\t"
  147516. #elif defined(__clang__)
  147517. "muls r6, r7\n\t"
  147518. #else
  147519. "mul r6, r7\n\t"
  147520. #endif
  147521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147522. "lsrs r7, r6, #16\n\t"
  147523. #else
  147524. "lsr r7, r6, #16\n\t"
  147525. #endif
  147526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147527. "lsls r6, r6, #16\n\t"
  147528. #else
  147529. "lsl r6, r6, #16\n\t"
  147530. #endif
  147531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147532. "adds r5, r5, r6\n\t"
  147533. #else
  147534. "add r5, r5, r6\n\t"
  147535. #endif
  147536. #ifdef WOLFSSL_KEIL
  147537. "adcs r3, r3, r7\n\t"
  147538. #elif defined(__clang__)
  147539. "adcs r3, r7\n\t"
  147540. #else
  147541. "adc r3, r7\n\t"
  147542. #endif
  147543. #ifdef WOLFSSL_KEIL
  147544. "adcs r4, r4, %[r]\n\t"
  147545. #elif defined(__clang__)
  147546. "adcs r4, %[r]\n\t"
  147547. #else
  147548. "adc r4, %[r]\n\t"
  147549. #endif
  147550. "# A[9] * B[14]\n\t"
  147551. "mov %[a], r9\n\t"
  147552. "mov %[b], r10\n\t"
  147553. "ldr %[a], [%[a], #36]\n\t"
  147554. "ldr %[b], [%[b], #56]\n\t"
  147555. "uxth r6, %[a]\n\t"
  147556. "uxth r7, %[b]\n\t"
  147557. #ifdef WOLFSSL_KEIL
  147558. "muls r7, r6, r7\n\t"
  147559. #elif defined(__clang__)
  147560. "muls r7, r6\n\t"
  147561. #else
  147562. "mul r7, r6\n\t"
  147563. #endif
  147564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147565. "adds r5, r5, r7\n\t"
  147566. #else
  147567. "add r5, r5, r7\n\t"
  147568. #endif
  147569. #ifdef WOLFSSL_KEIL
  147570. "adcs r3, r3, %[r]\n\t"
  147571. #elif defined(__clang__)
  147572. "adcs r3, %[r]\n\t"
  147573. #else
  147574. "adc r3, %[r]\n\t"
  147575. #endif
  147576. #ifdef WOLFSSL_KEIL
  147577. "adcs r4, r4, %[r]\n\t"
  147578. #elif defined(__clang__)
  147579. "adcs r4, %[r]\n\t"
  147580. #else
  147581. "adc r4, %[r]\n\t"
  147582. #endif
  147583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147584. "lsrs r7, %[b], #16\n\t"
  147585. #else
  147586. "lsr r7, %[b], #16\n\t"
  147587. #endif
  147588. #ifdef WOLFSSL_KEIL
  147589. "muls r6, r7, r6\n\t"
  147590. #elif defined(__clang__)
  147591. "muls r6, r7\n\t"
  147592. #else
  147593. "mul r6, r7\n\t"
  147594. #endif
  147595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147596. "lsrs r7, r6, #16\n\t"
  147597. #else
  147598. "lsr r7, r6, #16\n\t"
  147599. #endif
  147600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147601. "lsls r6, r6, #16\n\t"
  147602. #else
  147603. "lsl r6, r6, #16\n\t"
  147604. #endif
  147605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147606. "adds r5, r5, r6\n\t"
  147607. #else
  147608. "add r5, r5, r6\n\t"
  147609. #endif
  147610. #ifdef WOLFSSL_KEIL
  147611. "adcs r3, r3, r7\n\t"
  147612. #elif defined(__clang__)
  147613. "adcs r3, r7\n\t"
  147614. #else
  147615. "adc r3, r7\n\t"
  147616. #endif
  147617. #ifdef WOLFSSL_KEIL
  147618. "adcs r4, r4, %[r]\n\t"
  147619. #elif defined(__clang__)
  147620. "adcs r4, %[r]\n\t"
  147621. #else
  147622. "adc r4, %[r]\n\t"
  147623. #endif
  147624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147625. "lsrs r6, %[a], #16\n\t"
  147626. #else
  147627. "lsr r6, %[a], #16\n\t"
  147628. #endif
  147629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147630. "lsrs r7, %[b], #16\n\t"
  147631. #else
  147632. "lsr r7, %[b], #16\n\t"
  147633. #endif
  147634. #ifdef WOLFSSL_KEIL
  147635. "muls r7, r6, r7\n\t"
  147636. #elif defined(__clang__)
  147637. "muls r7, r6\n\t"
  147638. #else
  147639. "mul r7, r6\n\t"
  147640. #endif
  147641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147642. "adds r3, r3, r7\n\t"
  147643. #else
  147644. "add r3, r3, r7\n\t"
  147645. #endif
  147646. #ifdef WOLFSSL_KEIL
  147647. "adcs r4, r4, %[r]\n\t"
  147648. #elif defined(__clang__)
  147649. "adcs r4, %[r]\n\t"
  147650. #else
  147651. "adc r4, %[r]\n\t"
  147652. #endif
  147653. "uxth r7, %[b]\n\t"
  147654. #ifdef WOLFSSL_KEIL
  147655. "muls r6, r7, r6\n\t"
  147656. #elif defined(__clang__)
  147657. "muls r6, r7\n\t"
  147658. #else
  147659. "mul r6, r7\n\t"
  147660. #endif
  147661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147662. "lsrs r7, r6, #16\n\t"
  147663. #else
  147664. "lsr r7, r6, #16\n\t"
  147665. #endif
  147666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147667. "lsls r6, r6, #16\n\t"
  147668. #else
  147669. "lsl r6, r6, #16\n\t"
  147670. #endif
  147671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147672. "adds r5, r5, r6\n\t"
  147673. #else
  147674. "add r5, r5, r6\n\t"
  147675. #endif
  147676. #ifdef WOLFSSL_KEIL
  147677. "adcs r3, r3, r7\n\t"
  147678. #elif defined(__clang__)
  147679. "adcs r3, r7\n\t"
  147680. #else
  147681. "adc r3, r7\n\t"
  147682. #endif
  147683. #ifdef WOLFSSL_KEIL
  147684. "adcs r4, r4, %[r]\n\t"
  147685. #elif defined(__clang__)
  147686. "adcs r4, %[r]\n\t"
  147687. #else
  147688. "adc r4, %[r]\n\t"
  147689. #endif
  147690. "# A[10] * B[13]\n\t"
  147691. "mov %[a], r9\n\t"
  147692. "mov %[b], r10\n\t"
  147693. "ldr %[a], [%[a], #40]\n\t"
  147694. "ldr %[b], [%[b], #52]\n\t"
  147695. "uxth r6, %[a]\n\t"
  147696. "uxth r7, %[b]\n\t"
  147697. #ifdef WOLFSSL_KEIL
  147698. "muls r7, r6, r7\n\t"
  147699. #elif defined(__clang__)
  147700. "muls r7, r6\n\t"
  147701. #else
  147702. "mul r7, r6\n\t"
  147703. #endif
  147704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147705. "adds r5, r5, r7\n\t"
  147706. #else
  147707. "add r5, r5, r7\n\t"
  147708. #endif
  147709. #ifdef WOLFSSL_KEIL
  147710. "adcs r3, r3, %[r]\n\t"
  147711. #elif defined(__clang__)
  147712. "adcs r3, %[r]\n\t"
  147713. #else
  147714. "adc r3, %[r]\n\t"
  147715. #endif
  147716. #ifdef WOLFSSL_KEIL
  147717. "adcs r4, r4, %[r]\n\t"
  147718. #elif defined(__clang__)
  147719. "adcs r4, %[r]\n\t"
  147720. #else
  147721. "adc r4, %[r]\n\t"
  147722. #endif
  147723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147724. "lsrs r7, %[b], #16\n\t"
  147725. #else
  147726. "lsr r7, %[b], #16\n\t"
  147727. #endif
  147728. #ifdef WOLFSSL_KEIL
  147729. "muls r6, r7, r6\n\t"
  147730. #elif defined(__clang__)
  147731. "muls r6, r7\n\t"
  147732. #else
  147733. "mul r6, r7\n\t"
  147734. #endif
  147735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147736. "lsrs r7, r6, #16\n\t"
  147737. #else
  147738. "lsr r7, r6, #16\n\t"
  147739. #endif
  147740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147741. "lsls r6, r6, #16\n\t"
  147742. #else
  147743. "lsl r6, r6, #16\n\t"
  147744. #endif
  147745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147746. "adds r5, r5, r6\n\t"
  147747. #else
  147748. "add r5, r5, r6\n\t"
  147749. #endif
  147750. #ifdef WOLFSSL_KEIL
  147751. "adcs r3, r3, r7\n\t"
  147752. #elif defined(__clang__)
  147753. "adcs r3, r7\n\t"
  147754. #else
  147755. "adc r3, r7\n\t"
  147756. #endif
  147757. #ifdef WOLFSSL_KEIL
  147758. "adcs r4, r4, %[r]\n\t"
  147759. #elif defined(__clang__)
  147760. "adcs r4, %[r]\n\t"
  147761. #else
  147762. "adc r4, %[r]\n\t"
  147763. #endif
  147764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147765. "lsrs r6, %[a], #16\n\t"
  147766. #else
  147767. "lsr r6, %[a], #16\n\t"
  147768. #endif
  147769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147770. "lsrs r7, %[b], #16\n\t"
  147771. #else
  147772. "lsr r7, %[b], #16\n\t"
  147773. #endif
  147774. #ifdef WOLFSSL_KEIL
  147775. "muls r7, r6, r7\n\t"
  147776. #elif defined(__clang__)
  147777. "muls r7, r6\n\t"
  147778. #else
  147779. "mul r7, r6\n\t"
  147780. #endif
  147781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147782. "adds r3, r3, r7\n\t"
  147783. #else
  147784. "add r3, r3, r7\n\t"
  147785. #endif
  147786. #ifdef WOLFSSL_KEIL
  147787. "adcs r4, r4, %[r]\n\t"
  147788. #elif defined(__clang__)
  147789. "adcs r4, %[r]\n\t"
  147790. #else
  147791. "adc r4, %[r]\n\t"
  147792. #endif
  147793. "uxth r7, %[b]\n\t"
  147794. #ifdef WOLFSSL_KEIL
  147795. "muls r6, r7, r6\n\t"
  147796. #elif defined(__clang__)
  147797. "muls r6, r7\n\t"
  147798. #else
  147799. "mul r6, r7\n\t"
  147800. #endif
  147801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147802. "lsrs r7, r6, #16\n\t"
  147803. #else
  147804. "lsr r7, r6, #16\n\t"
  147805. #endif
  147806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147807. "lsls r6, r6, #16\n\t"
  147808. #else
  147809. "lsl r6, r6, #16\n\t"
  147810. #endif
  147811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147812. "adds r5, r5, r6\n\t"
  147813. #else
  147814. "add r5, r5, r6\n\t"
  147815. #endif
  147816. #ifdef WOLFSSL_KEIL
  147817. "adcs r3, r3, r7\n\t"
  147818. #elif defined(__clang__)
  147819. "adcs r3, r7\n\t"
  147820. #else
  147821. "adc r3, r7\n\t"
  147822. #endif
  147823. #ifdef WOLFSSL_KEIL
  147824. "adcs r4, r4, %[r]\n\t"
  147825. #elif defined(__clang__)
  147826. "adcs r4, %[r]\n\t"
  147827. #else
  147828. "adc r4, %[r]\n\t"
  147829. #endif
  147830. "# A[11] * B[12]\n\t"
  147831. "mov %[a], r9\n\t"
  147832. "mov %[b], r10\n\t"
  147833. "ldr %[a], [%[a], #44]\n\t"
  147834. "ldr %[b], [%[b], #48]\n\t"
  147835. "uxth r6, %[a]\n\t"
  147836. "uxth r7, %[b]\n\t"
  147837. #ifdef WOLFSSL_KEIL
  147838. "muls r7, r6, r7\n\t"
  147839. #elif defined(__clang__)
  147840. "muls r7, r6\n\t"
  147841. #else
  147842. "mul r7, r6\n\t"
  147843. #endif
  147844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147845. "adds r5, r5, r7\n\t"
  147846. #else
  147847. "add r5, r5, r7\n\t"
  147848. #endif
  147849. #ifdef WOLFSSL_KEIL
  147850. "adcs r3, r3, %[r]\n\t"
  147851. #elif defined(__clang__)
  147852. "adcs r3, %[r]\n\t"
  147853. #else
  147854. "adc r3, %[r]\n\t"
  147855. #endif
  147856. #ifdef WOLFSSL_KEIL
  147857. "adcs r4, r4, %[r]\n\t"
  147858. #elif defined(__clang__)
  147859. "adcs r4, %[r]\n\t"
  147860. #else
  147861. "adc r4, %[r]\n\t"
  147862. #endif
  147863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147864. "lsrs r7, %[b], #16\n\t"
  147865. #else
  147866. "lsr r7, %[b], #16\n\t"
  147867. #endif
  147868. #ifdef WOLFSSL_KEIL
  147869. "muls r6, r7, r6\n\t"
  147870. #elif defined(__clang__)
  147871. "muls r6, r7\n\t"
  147872. #else
  147873. "mul r6, r7\n\t"
  147874. #endif
  147875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147876. "lsrs r7, r6, #16\n\t"
  147877. #else
  147878. "lsr r7, r6, #16\n\t"
  147879. #endif
  147880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147881. "lsls r6, r6, #16\n\t"
  147882. #else
  147883. "lsl r6, r6, #16\n\t"
  147884. #endif
  147885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147886. "adds r5, r5, r6\n\t"
  147887. #else
  147888. "add r5, r5, r6\n\t"
  147889. #endif
  147890. #ifdef WOLFSSL_KEIL
  147891. "adcs r3, r3, r7\n\t"
  147892. #elif defined(__clang__)
  147893. "adcs r3, r7\n\t"
  147894. #else
  147895. "adc r3, r7\n\t"
  147896. #endif
  147897. #ifdef WOLFSSL_KEIL
  147898. "adcs r4, r4, %[r]\n\t"
  147899. #elif defined(__clang__)
  147900. "adcs r4, %[r]\n\t"
  147901. #else
  147902. "adc r4, %[r]\n\t"
  147903. #endif
  147904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147905. "lsrs r6, %[a], #16\n\t"
  147906. #else
  147907. "lsr r6, %[a], #16\n\t"
  147908. #endif
  147909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147910. "lsrs r7, %[b], #16\n\t"
  147911. #else
  147912. "lsr r7, %[b], #16\n\t"
  147913. #endif
  147914. #ifdef WOLFSSL_KEIL
  147915. "muls r7, r6, r7\n\t"
  147916. #elif defined(__clang__)
  147917. "muls r7, r6\n\t"
  147918. #else
  147919. "mul r7, r6\n\t"
  147920. #endif
  147921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147922. "adds r3, r3, r7\n\t"
  147923. #else
  147924. "add r3, r3, r7\n\t"
  147925. #endif
  147926. #ifdef WOLFSSL_KEIL
  147927. "adcs r4, r4, %[r]\n\t"
  147928. #elif defined(__clang__)
  147929. "adcs r4, %[r]\n\t"
  147930. #else
  147931. "adc r4, %[r]\n\t"
  147932. #endif
  147933. "uxth r7, %[b]\n\t"
  147934. #ifdef WOLFSSL_KEIL
  147935. "muls r6, r7, r6\n\t"
  147936. #elif defined(__clang__)
  147937. "muls r6, r7\n\t"
  147938. #else
  147939. "mul r6, r7\n\t"
  147940. #endif
  147941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147942. "lsrs r7, r6, #16\n\t"
  147943. #else
  147944. "lsr r7, r6, #16\n\t"
  147945. #endif
  147946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147947. "lsls r6, r6, #16\n\t"
  147948. #else
  147949. "lsl r6, r6, #16\n\t"
  147950. #endif
  147951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147952. "adds r5, r5, r6\n\t"
  147953. #else
  147954. "add r5, r5, r6\n\t"
  147955. #endif
  147956. #ifdef WOLFSSL_KEIL
  147957. "adcs r3, r3, r7\n\t"
  147958. #elif defined(__clang__)
  147959. "adcs r3, r7\n\t"
  147960. #else
  147961. "adc r3, r7\n\t"
  147962. #endif
  147963. #ifdef WOLFSSL_KEIL
  147964. "adcs r4, r4, %[r]\n\t"
  147965. #elif defined(__clang__)
  147966. "adcs r4, %[r]\n\t"
  147967. #else
  147968. "adc r4, %[r]\n\t"
  147969. #endif
  147970. "# A[12] * B[11]\n\t"
  147971. "mov %[a], r9\n\t"
  147972. "mov %[b], r10\n\t"
  147973. "ldr %[a], [%[a], #48]\n\t"
  147974. "ldr %[b], [%[b], #44]\n\t"
  147975. "uxth r6, %[a]\n\t"
  147976. "uxth r7, %[b]\n\t"
  147977. #ifdef WOLFSSL_KEIL
  147978. "muls r7, r6, r7\n\t"
  147979. #elif defined(__clang__)
  147980. "muls r7, r6\n\t"
  147981. #else
  147982. "mul r7, r6\n\t"
  147983. #endif
  147984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147985. "adds r5, r5, r7\n\t"
  147986. #else
  147987. "add r5, r5, r7\n\t"
  147988. #endif
  147989. #ifdef WOLFSSL_KEIL
  147990. "adcs r3, r3, %[r]\n\t"
  147991. #elif defined(__clang__)
  147992. "adcs r3, %[r]\n\t"
  147993. #else
  147994. "adc r3, %[r]\n\t"
  147995. #endif
  147996. #ifdef WOLFSSL_KEIL
  147997. "adcs r4, r4, %[r]\n\t"
  147998. #elif defined(__clang__)
  147999. "adcs r4, %[r]\n\t"
  148000. #else
  148001. "adc r4, %[r]\n\t"
  148002. #endif
  148003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148004. "lsrs r7, %[b], #16\n\t"
  148005. #else
  148006. "lsr r7, %[b], #16\n\t"
  148007. #endif
  148008. #ifdef WOLFSSL_KEIL
  148009. "muls r6, r7, r6\n\t"
  148010. #elif defined(__clang__)
  148011. "muls r6, r7\n\t"
  148012. #else
  148013. "mul r6, r7\n\t"
  148014. #endif
  148015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148016. "lsrs r7, r6, #16\n\t"
  148017. #else
  148018. "lsr r7, r6, #16\n\t"
  148019. #endif
  148020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148021. "lsls r6, r6, #16\n\t"
  148022. #else
  148023. "lsl r6, r6, #16\n\t"
  148024. #endif
  148025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148026. "adds r5, r5, r6\n\t"
  148027. #else
  148028. "add r5, r5, r6\n\t"
  148029. #endif
  148030. #ifdef WOLFSSL_KEIL
  148031. "adcs r3, r3, r7\n\t"
  148032. #elif defined(__clang__)
  148033. "adcs r3, r7\n\t"
  148034. #else
  148035. "adc r3, r7\n\t"
  148036. #endif
  148037. #ifdef WOLFSSL_KEIL
  148038. "adcs r4, r4, %[r]\n\t"
  148039. #elif defined(__clang__)
  148040. "adcs r4, %[r]\n\t"
  148041. #else
  148042. "adc r4, %[r]\n\t"
  148043. #endif
  148044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148045. "lsrs r6, %[a], #16\n\t"
  148046. #else
  148047. "lsr r6, %[a], #16\n\t"
  148048. #endif
  148049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148050. "lsrs r7, %[b], #16\n\t"
  148051. #else
  148052. "lsr r7, %[b], #16\n\t"
  148053. #endif
  148054. #ifdef WOLFSSL_KEIL
  148055. "muls r7, r6, r7\n\t"
  148056. #elif defined(__clang__)
  148057. "muls r7, r6\n\t"
  148058. #else
  148059. "mul r7, r6\n\t"
  148060. #endif
  148061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148062. "adds r3, r3, r7\n\t"
  148063. #else
  148064. "add r3, r3, r7\n\t"
  148065. #endif
  148066. #ifdef WOLFSSL_KEIL
  148067. "adcs r4, r4, %[r]\n\t"
  148068. #elif defined(__clang__)
  148069. "adcs r4, %[r]\n\t"
  148070. #else
  148071. "adc r4, %[r]\n\t"
  148072. #endif
  148073. "uxth r7, %[b]\n\t"
  148074. #ifdef WOLFSSL_KEIL
  148075. "muls r6, r7, r6\n\t"
  148076. #elif defined(__clang__)
  148077. "muls r6, r7\n\t"
  148078. #else
  148079. "mul r6, r7\n\t"
  148080. #endif
  148081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148082. "lsrs r7, r6, #16\n\t"
  148083. #else
  148084. "lsr r7, r6, #16\n\t"
  148085. #endif
  148086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148087. "lsls r6, r6, #16\n\t"
  148088. #else
  148089. "lsl r6, r6, #16\n\t"
  148090. #endif
  148091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148092. "adds r5, r5, r6\n\t"
  148093. #else
  148094. "add r5, r5, r6\n\t"
  148095. #endif
  148096. #ifdef WOLFSSL_KEIL
  148097. "adcs r3, r3, r7\n\t"
  148098. #elif defined(__clang__)
  148099. "adcs r3, r7\n\t"
  148100. #else
  148101. "adc r3, r7\n\t"
  148102. #endif
  148103. #ifdef WOLFSSL_KEIL
  148104. "adcs r4, r4, %[r]\n\t"
  148105. #elif defined(__clang__)
  148106. "adcs r4, %[r]\n\t"
  148107. #else
  148108. "adc r4, %[r]\n\t"
  148109. #endif
  148110. "# A[13] * B[10]\n\t"
  148111. "mov %[a], r9\n\t"
  148112. "mov %[b], r10\n\t"
  148113. "ldr %[a], [%[a], #52]\n\t"
  148114. "ldr %[b], [%[b], #40]\n\t"
  148115. "uxth r6, %[a]\n\t"
  148116. "uxth r7, %[b]\n\t"
  148117. #ifdef WOLFSSL_KEIL
  148118. "muls r7, r6, r7\n\t"
  148119. #elif defined(__clang__)
  148120. "muls r7, r6\n\t"
  148121. #else
  148122. "mul r7, r6\n\t"
  148123. #endif
  148124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148125. "adds r5, r5, r7\n\t"
  148126. #else
  148127. "add r5, r5, r7\n\t"
  148128. #endif
  148129. #ifdef WOLFSSL_KEIL
  148130. "adcs r3, r3, %[r]\n\t"
  148131. #elif defined(__clang__)
  148132. "adcs r3, %[r]\n\t"
  148133. #else
  148134. "adc r3, %[r]\n\t"
  148135. #endif
  148136. #ifdef WOLFSSL_KEIL
  148137. "adcs r4, r4, %[r]\n\t"
  148138. #elif defined(__clang__)
  148139. "adcs r4, %[r]\n\t"
  148140. #else
  148141. "adc r4, %[r]\n\t"
  148142. #endif
  148143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148144. "lsrs r7, %[b], #16\n\t"
  148145. #else
  148146. "lsr r7, %[b], #16\n\t"
  148147. #endif
  148148. #ifdef WOLFSSL_KEIL
  148149. "muls r6, r7, r6\n\t"
  148150. #elif defined(__clang__)
  148151. "muls r6, r7\n\t"
  148152. #else
  148153. "mul r6, r7\n\t"
  148154. #endif
  148155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148156. "lsrs r7, r6, #16\n\t"
  148157. #else
  148158. "lsr r7, r6, #16\n\t"
  148159. #endif
  148160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148161. "lsls r6, r6, #16\n\t"
  148162. #else
  148163. "lsl r6, r6, #16\n\t"
  148164. #endif
  148165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148166. "adds r5, r5, r6\n\t"
  148167. #else
  148168. "add r5, r5, r6\n\t"
  148169. #endif
  148170. #ifdef WOLFSSL_KEIL
  148171. "adcs r3, r3, r7\n\t"
  148172. #elif defined(__clang__)
  148173. "adcs r3, r7\n\t"
  148174. #else
  148175. "adc r3, r7\n\t"
  148176. #endif
  148177. #ifdef WOLFSSL_KEIL
  148178. "adcs r4, r4, %[r]\n\t"
  148179. #elif defined(__clang__)
  148180. "adcs r4, %[r]\n\t"
  148181. #else
  148182. "adc r4, %[r]\n\t"
  148183. #endif
  148184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148185. "lsrs r6, %[a], #16\n\t"
  148186. #else
  148187. "lsr r6, %[a], #16\n\t"
  148188. #endif
  148189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148190. "lsrs r7, %[b], #16\n\t"
  148191. #else
  148192. "lsr r7, %[b], #16\n\t"
  148193. #endif
  148194. #ifdef WOLFSSL_KEIL
  148195. "muls r7, r6, r7\n\t"
  148196. #elif defined(__clang__)
  148197. "muls r7, r6\n\t"
  148198. #else
  148199. "mul r7, r6\n\t"
  148200. #endif
  148201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148202. "adds r3, r3, r7\n\t"
  148203. #else
  148204. "add r3, r3, r7\n\t"
  148205. #endif
  148206. #ifdef WOLFSSL_KEIL
  148207. "adcs r4, r4, %[r]\n\t"
  148208. #elif defined(__clang__)
  148209. "adcs r4, %[r]\n\t"
  148210. #else
  148211. "adc r4, %[r]\n\t"
  148212. #endif
  148213. "uxth r7, %[b]\n\t"
  148214. #ifdef WOLFSSL_KEIL
  148215. "muls r6, r7, r6\n\t"
  148216. #elif defined(__clang__)
  148217. "muls r6, r7\n\t"
  148218. #else
  148219. "mul r6, r7\n\t"
  148220. #endif
  148221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148222. "lsrs r7, r6, #16\n\t"
  148223. #else
  148224. "lsr r7, r6, #16\n\t"
  148225. #endif
  148226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148227. "lsls r6, r6, #16\n\t"
  148228. #else
  148229. "lsl r6, r6, #16\n\t"
  148230. #endif
  148231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148232. "adds r5, r5, r6\n\t"
  148233. #else
  148234. "add r5, r5, r6\n\t"
  148235. #endif
  148236. #ifdef WOLFSSL_KEIL
  148237. "adcs r3, r3, r7\n\t"
  148238. #elif defined(__clang__)
  148239. "adcs r3, r7\n\t"
  148240. #else
  148241. "adc r3, r7\n\t"
  148242. #endif
  148243. #ifdef WOLFSSL_KEIL
  148244. "adcs r4, r4, %[r]\n\t"
  148245. #elif defined(__clang__)
  148246. "adcs r4, %[r]\n\t"
  148247. #else
  148248. "adc r4, %[r]\n\t"
  148249. #endif
  148250. "# A[14] * B[9]\n\t"
  148251. "mov %[a], r9\n\t"
  148252. "mov %[b], r10\n\t"
  148253. "ldr %[a], [%[a], #56]\n\t"
  148254. "ldr %[b], [%[b], #36]\n\t"
  148255. "uxth r6, %[a]\n\t"
  148256. "uxth r7, %[b]\n\t"
  148257. #ifdef WOLFSSL_KEIL
  148258. "muls r7, r6, r7\n\t"
  148259. #elif defined(__clang__)
  148260. "muls r7, r6\n\t"
  148261. #else
  148262. "mul r7, r6\n\t"
  148263. #endif
  148264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148265. "adds r5, r5, r7\n\t"
  148266. #else
  148267. "add r5, r5, r7\n\t"
  148268. #endif
  148269. #ifdef WOLFSSL_KEIL
  148270. "adcs r3, r3, %[r]\n\t"
  148271. #elif defined(__clang__)
  148272. "adcs r3, %[r]\n\t"
  148273. #else
  148274. "adc r3, %[r]\n\t"
  148275. #endif
  148276. #ifdef WOLFSSL_KEIL
  148277. "adcs r4, r4, %[r]\n\t"
  148278. #elif defined(__clang__)
  148279. "adcs r4, %[r]\n\t"
  148280. #else
  148281. "adc r4, %[r]\n\t"
  148282. #endif
  148283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148284. "lsrs r7, %[b], #16\n\t"
  148285. #else
  148286. "lsr r7, %[b], #16\n\t"
  148287. #endif
  148288. #ifdef WOLFSSL_KEIL
  148289. "muls r6, r7, r6\n\t"
  148290. #elif defined(__clang__)
  148291. "muls r6, r7\n\t"
  148292. #else
  148293. "mul r6, r7\n\t"
  148294. #endif
  148295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148296. "lsrs r7, r6, #16\n\t"
  148297. #else
  148298. "lsr r7, r6, #16\n\t"
  148299. #endif
  148300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148301. "lsls r6, r6, #16\n\t"
  148302. #else
  148303. "lsl r6, r6, #16\n\t"
  148304. #endif
  148305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148306. "adds r5, r5, r6\n\t"
  148307. #else
  148308. "add r5, r5, r6\n\t"
  148309. #endif
  148310. #ifdef WOLFSSL_KEIL
  148311. "adcs r3, r3, r7\n\t"
  148312. #elif defined(__clang__)
  148313. "adcs r3, r7\n\t"
  148314. #else
  148315. "adc r3, r7\n\t"
  148316. #endif
  148317. #ifdef WOLFSSL_KEIL
  148318. "adcs r4, r4, %[r]\n\t"
  148319. #elif defined(__clang__)
  148320. "adcs r4, %[r]\n\t"
  148321. #else
  148322. "adc r4, %[r]\n\t"
  148323. #endif
  148324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148325. "lsrs r6, %[a], #16\n\t"
  148326. #else
  148327. "lsr r6, %[a], #16\n\t"
  148328. #endif
  148329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148330. "lsrs r7, %[b], #16\n\t"
  148331. #else
  148332. "lsr r7, %[b], #16\n\t"
  148333. #endif
  148334. #ifdef WOLFSSL_KEIL
  148335. "muls r7, r6, r7\n\t"
  148336. #elif defined(__clang__)
  148337. "muls r7, r6\n\t"
  148338. #else
  148339. "mul r7, r6\n\t"
  148340. #endif
  148341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148342. "adds r3, r3, r7\n\t"
  148343. #else
  148344. "add r3, r3, r7\n\t"
  148345. #endif
  148346. #ifdef WOLFSSL_KEIL
  148347. "adcs r4, r4, %[r]\n\t"
  148348. #elif defined(__clang__)
  148349. "adcs r4, %[r]\n\t"
  148350. #else
  148351. "adc r4, %[r]\n\t"
  148352. #endif
  148353. "uxth r7, %[b]\n\t"
  148354. #ifdef WOLFSSL_KEIL
  148355. "muls r6, r7, r6\n\t"
  148356. #elif defined(__clang__)
  148357. "muls r6, r7\n\t"
  148358. #else
  148359. "mul r6, r7\n\t"
  148360. #endif
  148361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148362. "lsrs r7, r6, #16\n\t"
  148363. #else
  148364. "lsr r7, r6, #16\n\t"
  148365. #endif
  148366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148367. "lsls r6, r6, #16\n\t"
  148368. #else
  148369. "lsl r6, r6, #16\n\t"
  148370. #endif
  148371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148372. "adds r5, r5, r6\n\t"
  148373. #else
  148374. "add r5, r5, r6\n\t"
  148375. #endif
  148376. #ifdef WOLFSSL_KEIL
  148377. "adcs r3, r3, r7\n\t"
  148378. #elif defined(__clang__)
  148379. "adcs r3, r7\n\t"
  148380. #else
  148381. "adc r3, r7\n\t"
  148382. #endif
  148383. #ifdef WOLFSSL_KEIL
  148384. "adcs r4, r4, %[r]\n\t"
  148385. #elif defined(__clang__)
  148386. "adcs r4, %[r]\n\t"
  148387. #else
  148388. "adc r4, %[r]\n\t"
  148389. #endif
  148390. "# A[15] * B[8]\n\t"
  148391. "mov %[a], r9\n\t"
  148392. "mov %[b], r10\n\t"
  148393. "ldr %[a], [%[a], #60]\n\t"
  148394. "ldr %[b], [%[b], #32]\n\t"
  148395. "uxth r6, %[a]\n\t"
  148396. "uxth r7, %[b]\n\t"
  148397. #ifdef WOLFSSL_KEIL
  148398. "muls r7, r6, r7\n\t"
  148399. #elif defined(__clang__)
  148400. "muls r7, r6\n\t"
  148401. #else
  148402. "mul r7, r6\n\t"
  148403. #endif
  148404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148405. "adds r5, r5, r7\n\t"
  148406. #else
  148407. "add r5, r5, r7\n\t"
  148408. #endif
  148409. #ifdef WOLFSSL_KEIL
  148410. "adcs r3, r3, %[r]\n\t"
  148411. #elif defined(__clang__)
  148412. "adcs r3, %[r]\n\t"
  148413. #else
  148414. "adc r3, %[r]\n\t"
  148415. #endif
  148416. #ifdef WOLFSSL_KEIL
  148417. "adcs r4, r4, %[r]\n\t"
  148418. #elif defined(__clang__)
  148419. "adcs r4, %[r]\n\t"
  148420. #else
  148421. "adc r4, %[r]\n\t"
  148422. #endif
  148423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148424. "lsrs r7, %[b], #16\n\t"
  148425. #else
  148426. "lsr r7, %[b], #16\n\t"
  148427. #endif
  148428. #ifdef WOLFSSL_KEIL
  148429. "muls r6, r7, r6\n\t"
  148430. #elif defined(__clang__)
  148431. "muls r6, r7\n\t"
  148432. #else
  148433. "mul r6, r7\n\t"
  148434. #endif
  148435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148436. "lsrs r7, r6, #16\n\t"
  148437. #else
  148438. "lsr r7, r6, #16\n\t"
  148439. #endif
  148440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148441. "lsls r6, r6, #16\n\t"
  148442. #else
  148443. "lsl r6, r6, #16\n\t"
  148444. #endif
  148445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148446. "adds r5, r5, r6\n\t"
  148447. #else
  148448. "add r5, r5, r6\n\t"
  148449. #endif
  148450. #ifdef WOLFSSL_KEIL
  148451. "adcs r3, r3, r7\n\t"
  148452. #elif defined(__clang__)
  148453. "adcs r3, r7\n\t"
  148454. #else
  148455. "adc r3, r7\n\t"
  148456. #endif
  148457. #ifdef WOLFSSL_KEIL
  148458. "adcs r4, r4, %[r]\n\t"
  148459. #elif defined(__clang__)
  148460. "adcs r4, %[r]\n\t"
  148461. #else
  148462. "adc r4, %[r]\n\t"
  148463. #endif
  148464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148465. "lsrs r6, %[a], #16\n\t"
  148466. #else
  148467. "lsr r6, %[a], #16\n\t"
  148468. #endif
  148469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148470. "lsrs r7, %[b], #16\n\t"
  148471. #else
  148472. "lsr r7, %[b], #16\n\t"
  148473. #endif
  148474. #ifdef WOLFSSL_KEIL
  148475. "muls r7, r6, r7\n\t"
  148476. #elif defined(__clang__)
  148477. "muls r7, r6\n\t"
  148478. #else
  148479. "mul r7, r6\n\t"
  148480. #endif
  148481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148482. "adds r3, r3, r7\n\t"
  148483. #else
  148484. "add r3, r3, r7\n\t"
  148485. #endif
  148486. #ifdef WOLFSSL_KEIL
  148487. "adcs r4, r4, %[r]\n\t"
  148488. #elif defined(__clang__)
  148489. "adcs r4, %[r]\n\t"
  148490. #else
  148491. "adc r4, %[r]\n\t"
  148492. #endif
  148493. "uxth r7, %[b]\n\t"
  148494. #ifdef WOLFSSL_KEIL
  148495. "muls r6, r7, r6\n\t"
  148496. #elif defined(__clang__)
  148497. "muls r6, r7\n\t"
  148498. #else
  148499. "mul r6, r7\n\t"
  148500. #endif
  148501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148502. "lsrs r7, r6, #16\n\t"
  148503. #else
  148504. "lsr r7, r6, #16\n\t"
  148505. #endif
  148506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148507. "lsls r6, r6, #16\n\t"
  148508. #else
  148509. "lsl r6, r6, #16\n\t"
  148510. #endif
  148511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148512. "adds r5, r5, r6\n\t"
  148513. #else
  148514. "add r5, r5, r6\n\t"
  148515. #endif
  148516. #ifdef WOLFSSL_KEIL
  148517. "adcs r3, r3, r7\n\t"
  148518. #elif defined(__clang__)
  148519. "adcs r3, r7\n\t"
  148520. #else
  148521. "adc r3, r7\n\t"
  148522. #endif
  148523. #ifdef WOLFSSL_KEIL
  148524. "adcs r4, r4, %[r]\n\t"
  148525. #elif defined(__clang__)
  148526. "adcs r4, %[r]\n\t"
  148527. #else
  148528. "adc r4, %[r]\n\t"
  148529. #endif
  148530. "mov %[r], r8\n\t"
  148531. "str r5, [%[r], #92]\n\t"
  148532. "movs %[r], #0\n\t"
  148533. "# A[15] * B[9]\n\t"
  148534. "movs r5, #0\n\t"
  148535. "mov %[a], r9\n\t"
  148536. "mov %[b], r10\n\t"
  148537. "ldr %[a], [%[a], #60]\n\t"
  148538. "ldr %[b], [%[b], #36]\n\t"
  148539. "uxth r6, %[a]\n\t"
  148540. "uxth r7, %[b]\n\t"
  148541. #ifdef WOLFSSL_KEIL
  148542. "muls r7, r6, r7\n\t"
  148543. #elif defined(__clang__)
  148544. "muls r7, r6\n\t"
  148545. #else
  148546. "mul r7, r6\n\t"
  148547. #endif
  148548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148549. "adds r3, r3, r7\n\t"
  148550. #else
  148551. "add r3, r3, r7\n\t"
  148552. #endif
  148553. #ifdef WOLFSSL_KEIL
  148554. "adcs r4, r4, %[r]\n\t"
  148555. #elif defined(__clang__)
  148556. "adcs r4, %[r]\n\t"
  148557. #else
  148558. "adc r4, %[r]\n\t"
  148559. #endif
  148560. #ifdef WOLFSSL_KEIL
  148561. "adcs r5, r5, %[r]\n\t"
  148562. #elif defined(__clang__)
  148563. "adcs r5, %[r]\n\t"
  148564. #else
  148565. "adc r5, %[r]\n\t"
  148566. #endif
  148567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148568. "lsrs r7, %[b], #16\n\t"
  148569. #else
  148570. "lsr r7, %[b], #16\n\t"
  148571. #endif
  148572. #ifdef WOLFSSL_KEIL
  148573. "muls r6, r7, r6\n\t"
  148574. #elif defined(__clang__)
  148575. "muls r6, r7\n\t"
  148576. #else
  148577. "mul r6, r7\n\t"
  148578. #endif
  148579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148580. "lsrs r7, r6, #16\n\t"
  148581. #else
  148582. "lsr r7, r6, #16\n\t"
  148583. #endif
  148584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148585. "lsls r6, r6, #16\n\t"
  148586. #else
  148587. "lsl r6, r6, #16\n\t"
  148588. #endif
  148589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148590. "adds r3, r3, r6\n\t"
  148591. #else
  148592. "add r3, r3, r6\n\t"
  148593. #endif
  148594. #ifdef WOLFSSL_KEIL
  148595. "adcs r4, r4, r7\n\t"
  148596. #elif defined(__clang__)
  148597. "adcs r4, r7\n\t"
  148598. #else
  148599. "adc r4, r7\n\t"
  148600. #endif
  148601. #ifdef WOLFSSL_KEIL
  148602. "adcs r5, r5, %[r]\n\t"
  148603. #elif defined(__clang__)
  148604. "adcs r5, %[r]\n\t"
  148605. #else
  148606. "adc r5, %[r]\n\t"
  148607. #endif
  148608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148609. "lsrs r6, %[a], #16\n\t"
  148610. #else
  148611. "lsr r6, %[a], #16\n\t"
  148612. #endif
  148613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148614. "lsrs r7, %[b], #16\n\t"
  148615. #else
  148616. "lsr r7, %[b], #16\n\t"
  148617. #endif
  148618. #ifdef WOLFSSL_KEIL
  148619. "muls r7, r6, r7\n\t"
  148620. #elif defined(__clang__)
  148621. "muls r7, r6\n\t"
  148622. #else
  148623. "mul r7, r6\n\t"
  148624. #endif
  148625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148626. "adds r4, r4, r7\n\t"
  148627. #else
  148628. "add r4, r4, r7\n\t"
  148629. #endif
  148630. #ifdef WOLFSSL_KEIL
  148631. "adcs r5, r5, %[r]\n\t"
  148632. #elif defined(__clang__)
  148633. "adcs r5, %[r]\n\t"
  148634. #else
  148635. "adc r5, %[r]\n\t"
  148636. #endif
  148637. "uxth r7, %[b]\n\t"
  148638. #ifdef WOLFSSL_KEIL
  148639. "muls r6, r7, r6\n\t"
  148640. #elif defined(__clang__)
  148641. "muls r6, r7\n\t"
  148642. #else
  148643. "mul r6, r7\n\t"
  148644. #endif
  148645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148646. "lsrs r7, r6, #16\n\t"
  148647. #else
  148648. "lsr r7, r6, #16\n\t"
  148649. #endif
  148650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148651. "lsls r6, r6, #16\n\t"
  148652. #else
  148653. "lsl r6, r6, #16\n\t"
  148654. #endif
  148655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148656. "adds r3, r3, r6\n\t"
  148657. #else
  148658. "add r3, r3, r6\n\t"
  148659. #endif
  148660. #ifdef WOLFSSL_KEIL
  148661. "adcs r4, r4, r7\n\t"
  148662. #elif defined(__clang__)
  148663. "adcs r4, r7\n\t"
  148664. #else
  148665. "adc r4, r7\n\t"
  148666. #endif
  148667. #ifdef WOLFSSL_KEIL
  148668. "adcs r5, r5, %[r]\n\t"
  148669. #elif defined(__clang__)
  148670. "adcs r5, %[r]\n\t"
  148671. #else
  148672. "adc r5, %[r]\n\t"
  148673. #endif
  148674. "# A[14] * B[10]\n\t"
  148675. "mov %[a], r9\n\t"
  148676. "mov %[b], r10\n\t"
  148677. "ldr %[a], [%[a], #56]\n\t"
  148678. "ldr %[b], [%[b], #40]\n\t"
  148679. "uxth r6, %[a]\n\t"
  148680. "uxth r7, %[b]\n\t"
  148681. #ifdef WOLFSSL_KEIL
  148682. "muls r7, r6, r7\n\t"
  148683. #elif defined(__clang__)
  148684. "muls r7, r6\n\t"
  148685. #else
  148686. "mul r7, r6\n\t"
  148687. #endif
  148688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148689. "adds r3, r3, r7\n\t"
  148690. #else
  148691. "add r3, r3, r7\n\t"
  148692. #endif
  148693. #ifdef WOLFSSL_KEIL
  148694. "adcs r4, r4, %[r]\n\t"
  148695. #elif defined(__clang__)
  148696. "adcs r4, %[r]\n\t"
  148697. #else
  148698. "adc r4, %[r]\n\t"
  148699. #endif
  148700. #ifdef WOLFSSL_KEIL
  148701. "adcs r5, r5, %[r]\n\t"
  148702. #elif defined(__clang__)
  148703. "adcs r5, %[r]\n\t"
  148704. #else
  148705. "adc r5, %[r]\n\t"
  148706. #endif
  148707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148708. "lsrs r7, %[b], #16\n\t"
  148709. #else
  148710. "lsr r7, %[b], #16\n\t"
  148711. #endif
  148712. #ifdef WOLFSSL_KEIL
  148713. "muls r6, r7, r6\n\t"
  148714. #elif defined(__clang__)
  148715. "muls r6, r7\n\t"
  148716. #else
  148717. "mul r6, r7\n\t"
  148718. #endif
  148719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148720. "lsrs r7, r6, #16\n\t"
  148721. #else
  148722. "lsr r7, r6, #16\n\t"
  148723. #endif
  148724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148725. "lsls r6, r6, #16\n\t"
  148726. #else
  148727. "lsl r6, r6, #16\n\t"
  148728. #endif
  148729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148730. "adds r3, r3, r6\n\t"
  148731. #else
  148732. "add r3, r3, r6\n\t"
  148733. #endif
  148734. #ifdef WOLFSSL_KEIL
  148735. "adcs r4, r4, r7\n\t"
  148736. #elif defined(__clang__)
  148737. "adcs r4, r7\n\t"
  148738. #else
  148739. "adc r4, r7\n\t"
  148740. #endif
  148741. #ifdef WOLFSSL_KEIL
  148742. "adcs r5, r5, %[r]\n\t"
  148743. #elif defined(__clang__)
  148744. "adcs r5, %[r]\n\t"
  148745. #else
  148746. "adc r5, %[r]\n\t"
  148747. #endif
  148748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148749. "lsrs r6, %[a], #16\n\t"
  148750. #else
  148751. "lsr r6, %[a], #16\n\t"
  148752. #endif
  148753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148754. "lsrs r7, %[b], #16\n\t"
  148755. #else
  148756. "lsr r7, %[b], #16\n\t"
  148757. #endif
  148758. #ifdef WOLFSSL_KEIL
  148759. "muls r7, r6, r7\n\t"
  148760. #elif defined(__clang__)
  148761. "muls r7, r6\n\t"
  148762. #else
  148763. "mul r7, r6\n\t"
  148764. #endif
  148765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148766. "adds r4, r4, r7\n\t"
  148767. #else
  148768. "add r4, r4, r7\n\t"
  148769. #endif
  148770. #ifdef WOLFSSL_KEIL
  148771. "adcs r5, r5, %[r]\n\t"
  148772. #elif defined(__clang__)
  148773. "adcs r5, %[r]\n\t"
  148774. #else
  148775. "adc r5, %[r]\n\t"
  148776. #endif
  148777. "uxth r7, %[b]\n\t"
  148778. #ifdef WOLFSSL_KEIL
  148779. "muls r6, r7, r6\n\t"
  148780. #elif defined(__clang__)
  148781. "muls r6, r7\n\t"
  148782. #else
  148783. "mul r6, r7\n\t"
  148784. #endif
  148785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148786. "lsrs r7, r6, #16\n\t"
  148787. #else
  148788. "lsr r7, r6, #16\n\t"
  148789. #endif
  148790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148791. "lsls r6, r6, #16\n\t"
  148792. #else
  148793. "lsl r6, r6, #16\n\t"
  148794. #endif
  148795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148796. "adds r3, r3, r6\n\t"
  148797. #else
  148798. "add r3, r3, r6\n\t"
  148799. #endif
  148800. #ifdef WOLFSSL_KEIL
  148801. "adcs r4, r4, r7\n\t"
  148802. #elif defined(__clang__)
  148803. "adcs r4, r7\n\t"
  148804. #else
  148805. "adc r4, r7\n\t"
  148806. #endif
  148807. #ifdef WOLFSSL_KEIL
  148808. "adcs r5, r5, %[r]\n\t"
  148809. #elif defined(__clang__)
  148810. "adcs r5, %[r]\n\t"
  148811. #else
  148812. "adc r5, %[r]\n\t"
  148813. #endif
  148814. "# A[13] * B[11]\n\t"
  148815. "mov %[a], r9\n\t"
  148816. "mov %[b], r10\n\t"
  148817. "ldr %[a], [%[a], #52]\n\t"
  148818. "ldr %[b], [%[b], #44]\n\t"
  148819. "uxth r6, %[a]\n\t"
  148820. "uxth r7, %[b]\n\t"
  148821. #ifdef WOLFSSL_KEIL
  148822. "muls r7, r6, r7\n\t"
  148823. #elif defined(__clang__)
  148824. "muls r7, r6\n\t"
  148825. #else
  148826. "mul r7, r6\n\t"
  148827. #endif
  148828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148829. "adds r3, r3, r7\n\t"
  148830. #else
  148831. "add r3, r3, r7\n\t"
  148832. #endif
  148833. #ifdef WOLFSSL_KEIL
  148834. "adcs r4, r4, %[r]\n\t"
  148835. #elif defined(__clang__)
  148836. "adcs r4, %[r]\n\t"
  148837. #else
  148838. "adc r4, %[r]\n\t"
  148839. #endif
  148840. #ifdef WOLFSSL_KEIL
  148841. "adcs r5, r5, %[r]\n\t"
  148842. #elif defined(__clang__)
  148843. "adcs r5, %[r]\n\t"
  148844. #else
  148845. "adc r5, %[r]\n\t"
  148846. #endif
  148847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148848. "lsrs r7, %[b], #16\n\t"
  148849. #else
  148850. "lsr r7, %[b], #16\n\t"
  148851. #endif
  148852. #ifdef WOLFSSL_KEIL
  148853. "muls r6, r7, r6\n\t"
  148854. #elif defined(__clang__)
  148855. "muls r6, r7\n\t"
  148856. #else
  148857. "mul r6, r7\n\t"
  148858. #endif
  148859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148860. "lsrs r7, r6, #16\n\t"
  148861. #else
  148862. "lsr r7, r6, #16\n\t"
  148863. #endif
  148864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148865. "lsls r6, r6, #16\n\t"
  148866. #else
  148867. "lsl r6, r6, #16\n\t"
  148868. #endif
  148869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148870. "adds r3, r3, r6\n\t"
  148871. #else
  148872. "add r3, r3, r6\n\t"
  148873. #endif
  148874. #ifdef WOLFSSL_KEIL
  148875. "adcs r4, r4, r7\n\t"
  148876. #elif defined(__clang__)
  148877. "adcs r4, r7\n\t"
  148878. #else
  148879. "adc r4, r7\n\t"
  148880. #endif
  148881. #ifdef WOLFSSL_KEIL
  148882. "adcs r5, r5, %[r]\n\t"
  148883. #elif defined(__clang__)
  148884. "adcs r5, %[r]\n\t"
  148885. #else
  148886. "adc r5, %[r]\n\t"
  148887. #endif
  148888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148889. "lsrs r6, %[a], #16\n\t"
  148890. #else
  148891. "lsr r6, %[a], #16\n\t"
  148892. #endif
  148893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148894. "lsrs r7, %[b], #16\n\t"
  148895. #else
  148896. "lsr r7, %[b], #16\n\t"
  148897. #endif
  148898. #ifdef WOLFSSL_KEIL
  148899. "muls r7, r6, r7\n\t"
  148900. #elif defined(__clang__)
  148901. "muls r7, r6\n\t"
  148902. #else
  148903. "mul r7, r6\n\t"
  148904. #endif
  148905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148906. "adds r4, r4, r7\n\t"
  148907. #else
  148908. "add r4, r4, r7\n\t"
  148909. #endif
  148910. #ifdef WOLFSSL_KEIL
  148911. "adcs r5, r5, %[r]\n\t"
  148912. #elif defined(__clang__)
  148913. "adcs r5, %[r]\n\t"
  148914. #else
  148915. "adc r5, %[r]\n\t"
  148916. #endif
  148917. "uxth r7, %[b]\n\t"
  148918. #ifdef WOLFSSL_KEIL
  148919. "muls r6, r7, r6\n\t"
  148920. #elif defined(__clang__)
  148921. "muls r6, r7\n\t"
  148922. #else
  148923. "mul r6, r7\n\t"
  148924. #endif
  148925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148926. "lsrs r7, r6, #16\n\t"
  148927. #else
  148928. "lsr r7, r6, #16\n\t"
  148929. #endif
  148930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148931. "lsls r6, r6, #16\n\t"
  148932. #else
  148933. "lsl r6, r6, #16\n\t"
  148934. #endif
  148935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148936. "adds r3, r3, r6\n\t"
  148937. #else
  148938. "add r3, r3, r6\n\t"
  148939. #endif
  148940. #ifdef WOLFSSL_KEIL
  148941. "adcs r4, r4, r7\n\t"
  148942. #elif defined(__clang__)
  148943. "adcs r4, r7\n\t"
  148944. #else
  148945. "adc r4, r7\n\t"
  148946. #endif
  148947. #ifdef WOLFSSL_KEIL
  148948. "adcs r5, r5, %[r]\n\t"
  148949. #elif defined(__clang__)
  148950. "adcs r5, %[r]\n\t"
  148951. #else
  148952. "adc r5, %[r]\n\t"
  148953. #endif
  148954. "# A[12] * B[12]\n\t"
  148955. "mov %[a], r9\n\t"
  148956. "mov %[b], r10\n\t"
  148957. "ldr %[a], [%[a], #48]\n\t"
  148958. "ldr %[b], [%[b], #48]\n\t"
  148959. "uxth r6, %[a]\n\t"
  148960. "uxth r7, %[b]\n\t"
  148961. #ifdef WOLFSSL_KEIL
  148962. "muls r7, r6, r7\n\t"
  148963. #elif defined(__clang__)
  148964. "muls r7, r6\n\t"
  148965. #else
  148966. "mul r7, r6\n\t"
  148967. #endif
  148968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148969. "adds r3, r3, r7\n\t"
  148970. #else
  148971. "add r3, r3, r7\n\t"
  148972. #endif
  148973. #ifdef WOLFSSL_KEIL
  148974. "adcs r4, r4, %[r]\n\t"
  148975. #elif defined(__clang__)
  148976. "adcs r4, %[r]\n\t"
  148977. #else
  148978. "adc r4, %[r]\n\t"
  148979. #endif
  148980. #ifdef WOLFSSL_KEIL
  148981. "adcs r5, r5, %[r]\n\t"
  148982. #elif defined(__clang__)
  148983. "adcs r5, %[r]\n\t"
  148984. #else
  148985. "adc r5, %[r]\n\t"
  148986. #endif
  148987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148988. "lsrs r7, %[b], #16\n\t"
  148989. #else
  148990. "lsr r7, %[b], #16\n\t"
  148991. #endif
  148992. #ifdef WOLFSSL_KEIL
  148993. "muls r6, r7, r6\n\t"
  148994. #elif defined(__clang__)
  148995. "muls r6, r7\n\t"
  148996. #else
  148997. "mul r6, r7\n\t"
  148998. #endif
  148999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149000. "lsrs r7, r6, #16\n\t"
  149001. #else
  149002. "lsr r7, r6, #16\n\t"
  149003. #endif
  149004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149005. "lsls r6, r6, #16\n\t"
  149006. #else
  149007. "lsl r6, r6, #16\n\t"
  149008. #endif
  149009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149010. "adds r3, r3, r6\n\t"
  149011. #else
  149012. "add r3, r3, r6\n\t"
  149013. #endif
  149014. #ifdef WOLFSSL_KEIL
  149015. "adcs r4, r4, r7\n\t"
  149016. #elif defined(__clang__)
  149017. "adcs r4, r7\n\t"
  149018. #else
  149019. "adc r4, r7\n\t"
  149020. #endif
  149021. #ifdef WOLFSSL_KEIL
  149022. "adcs r5, r5, %[r]\n\t"
  149023. #elif defined(__clang__)
  149024. "adcs r5, %[r]\n\t"
  149025. #else
  149026. "adc r5, %[r]\n\t"
  149027. #endif
  149028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149029. "lsrs r6, %[a], #16\n\t"
  149030. #else
  149031. "lsr r6, %[a], #16\n\t"
  149032. #endif
  149033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149034. "lsrs r7, %[b], #16\n\t"
  149035. #else
  149036. "lsr r7, %[b], #16\n\t"
  149037. #endif
  149038. #ifdef WOLFSSL_KEIL
  149039. "muls r7, r6, r7\n\t"
  149040. #elif defined(__clang__)
  149041. "muls r7, r6\n\t"
  149042. #else
  149043. "mul r7, r6\n\t"
  149044. #endif
  149045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149046. "adds r4, r4, r7\n\t"
  149047. #else
  149048. "add r4, r4, r7\n\t"
  149049. #endif
  149050. #ifdef WOLFSSL_KEIL
  149051. "adcs r5, r5, %[r]\n\t"
  149052. #elif defined(__clang__)
  149053. "adcs r5, %[r]\n\t"
  149054. #else
  149055. "adc r5, %[r]\n\t"
  149056. #endif
  149057. "uxth r7, %[b]\n\t"
  149058. #ifdef WOLFSSL_KEIL
  149059. "muls r6, r7, r6\n\t"
  149060. #elif defined(__clang__)
  149061. "muls r6, r7\n\t"
  149062. #else
  149063. "mul r6, r7\n\t"
  149064. #endif
  149065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149066. "lsrs r7, r6, #16\n\t"
  149067. #else
  149068. "lsr r7, r6, #16\n\t"
  149069. #endif
  149070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149071. "lsls r6, r6, #16\n\t"
  149072. #else
  149073. "lsl r6, r6, #16\n\t"
  149074. #endif
  149075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149076. "adds r3, r3, r6\n\t"
  149077. #else
  149078. "add r3, r3, r6\n\t"
  149079. #endif
  149080. #ifdef WOLFSSL_KEIL
  149081. "adcs r4, r4, r7\n\t"
  149082. #elif defined(__clang__)
  149083. "adcs r4, r7\n\t"
  149084. #else
  149085. "adc r4, r7\n\t"
  149086. #endif
  149087. #ifdef WOLFSSL_KEIL
  149088. "adcs r5, r5, %[r]\n\t"
  149089. #elif defined(__clang__)
  149090. "adcs r5, %[r]\n\t"
  149091. #else
  149092. "adc r5, %[r]\n\t"
  149093. #endif
  149094. "# A[11] * B[13]\n\t"
  149095. "mov %[a], r9\n\t"
  149096. "mov %[b], r10\n\t"
  149097. "ldr %[a], [%[a], #44]\n\t"
  149098. "ldr %[b], [%[b], #52]\n\t"
  149099. "uxth r6, %[a]\n\t"
  149100. "uxth r7, %[b]\n\t"
  149101. #ifdef WOLFSSL_KEIL
  149102. "muls r7, r6, r7\n\t"
  149103. #elif defined(__clang__)
  149104. "muls r7, r6\n\t"
  149105. #else
  149106. "mul r7, r6\n\t"
  149107. #endif
  149108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149109. "adds r3, r3, r7\n\t"
  149110. #else
  149111. "add r3, r3, r7\n\t"
  149112. #endif
  149113. #ifdef WOLFSSL_KEIL
  149114. "adcs r4, r4, %[r]\n\t"
  149115. #elif defined(__clang__)
  149116. "adcs r4, %[r]\n\t"
  149117. #else
  149118. "adc r4, %[r]\n\t"
  149119. #endif
  149120. #ifdef WOLFSSL_KEIL
  149121. "adcs r5, r5, %[r]\n\t"
  149122. #elif defined(__clang__)
  149123. "adcs r5, %[r]\n\t"
  149124. #else
  149125. "adc r5, %[r]\n\t"
  149126. #endif
  149127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149128. "lsrs r7, %[b], #16\n\t"
  149129. #else
  149130. "lsr r7, %[b], #16\n\t"
  149131. #endif
  149132. #ifdef WOLFSSL_KEIL
  149133. "muls r6, r7, r6\n\t"
  149134. #elif defined(__clang__)
  149135. "muls r6, r7\n\t"
  149136. #else
  149137. "mul r6, r7\n\t"
  149138. #endif
  149139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149140. "lsrs r7, r6, #16\n\t"
  149141. #else
  149142. "lsr r7, r6, #16\n\t"
  149143. #endif
  149144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149145. "lsls r6, r6, #16\n\t"
  149146. #else
  149147. "lsl r6, r6, #16\n\t"
  149148. #endif
  149149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149150. "adds r3, r3, r6\n\t"
  149151. #else
  149152. "add r3, r3, r6\n\t"
  149153. #endif
  149154. #ifdef WOLFSSL_KEIL
  149155. "adcs r4, r4, r7\n\t"
  149156. #elif defined(__clang__)
  149157. "adcs r4, r7\n\t"
  149158. #else
  149159. "adc r4, r7\n\t"
  149160. #endif
  149161. #ifdef WOLFSSL_KEIL
  149162. "adcs r5, r5, %[r]\n\t"
  149163. #elif defined(__clang__)
  149164. "adcs r5, %[r]\n\t"
  149165. #else
  149166. "adc r5, %[r]\n\t"
  149167. #endif
  149168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149169. "lsrs r6, %[a], #16\n\t"
  149170. #else
  149171. "lsr r6, %[a], #16\n\t"
  149172. #endif
  149173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149174. "lsrs r7, %[b], #16\n\t"
  149175. #else
  149176. "lsr r7, %[b], #16\n\t"
  149177. #endif
  149178. #ifdef WOLFSSL_KEIL
  149179. "muls r7, r6, r7\n\t"
  149180. #elif defined(__clang__)
  149181. "muls r7, r6\n\t"
  149182. #else
  149183. "mul r7, r6\n\t"
  149184. #endif
  149185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149186. "adds r4, r4, r7\n\t"
  149187. #else
  149188. "add r4, r4, r7\n\t"
  149189. #endif
  149190. #ifdef WOLFSSL_KEIL
  149191. "adcs r5, r5, %[r]\n\t"
  149192. #elif defined(__clang__)
  149193. "adcs r5, %[r]\n\t"
  149194. #else
  149195. "adc r5, %[r]\n\t"
  149196. #endif
  149197. "uxth r7, %[b]\n\t"
  149198. #ifdef WOLFSSL_KEIL
  149199. "muls r6, r7, r6\n\t"
  149200. #elif defined(__clang__)
  149201. "muls r6, r7\n\t"
  149202. #else
  149203. "mul r6, r7\n\t"
  149204. #endif
  149205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149206. "lsrs r7, r6, #16\n\t"
  149207. #else
  149208. "lsr r7, r6, #16\n\t"
  149209. #endif
  149210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149211. "lsls r6, r6, #16\n\t"
  149212. #else
  149213. "lsl r6, r6, #16\n\t"
  149214. #endif
  149215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149216. "adds r3, r3, r6\n\t"
  149217. #else
  149218. "add r3, r3, r6\n\t"
  149219. #endif
  149220. #ifdef WOLFSSL_KEIL
  149221. "adcs r4, r4, r7\n\t"
  149222. #elif defined(__clang__)
  149223. "adcs r4, r7\n\t"
  149224. #else
  149225. "adc r4, r7\n\t"
  149226. #endif
  149227. #ifdef WOLFSSL_KEIL
  149228. "adcs r5, r5, %[r]\n\t"
  149229. #elif defined(__clang__)
  149230. "adcs r5, %[r]\n\t"
  149231. #else
  149232. "adc r5, %[r]\n\t"
  149233. #endif
  149234. "# A[10] * B[14]\n\t"
  149235. "mov %[a], r9\n\t"
  149236. "mov %[b], r10\n\t"
  149237. "ldr %[a], [%[a], #40]\n\t"
  149238. "ldr %[b], [%[b], #56]\n\t"
  149239. "uxth r6, %[a]\n\t"
  149240. "uxth r7, %[b]\n\t"
  149241. #ifdef WOLFSSL_KEIL
  149242. "muls r7, r6, r7\n\t"
  149243. #elif defined(__clang__)
  149244. "muls r7, r6\n\t"
  149245. #else
  149246. "mul r7, r6\n\t"
  149247. #endif
  149248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149249. "adds r3, r3, r7\n\t"
  149250. #else
  149251. "add r3, r3, r7\n\t"
  149252. #endif
  149253. #ifdef WOLFSSL_KEIL
  149254. "adcs r4, r4, %[r]\n\t"
  149255. #elif defined(__clang__)
  149256. "adcs r4, %[r]\n\t"
  149257. #else
  149258. "adc r4, %[r]\n\t"
  149259. #endif
  149260. #ifdef WOLFSSL_KEIL
  149261. "adcs r5, r5, %[r]\n\t"
  149262. #elif defined(__clang__)
  149263. "adcs r5, %[r]\n\t"
  149264. #else
  149265. "adc r5, %[r]\n\t"
  149266. #endif
  149267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149268. "lsrs r7, %[b], #16\n\t"
  149269. #else
  149270. "lsr r7, %[b], #16\n\t"
  149271. #endif
  149272. #ifdef WOLFSSL_KEIL
  149273. "muls r6, r7, r6\n\t"
  149274. #elif defined(__clang__)
  149275. "muls r6, r7\n\t"
  149276. #else
  149277. "mul r6, r7\n\t"
  149278. #endif
  149279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149280. "lsrs r7, r6, #16\n\t"
  149281. #else
  149282. "lsr r7, r6, #16\n\t"
  149283. #endif
  149284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149285. "lsls r6, r6, #16\n\t"
  149286. #else
  149287. "lsl r6, r6, #16\n\t"
  149288. #endif
  149289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149290. "adds r3, r3, r6\n\t"
  149291. #else
  149292. "add r3, r3, r6\n\t"
  149293. #endif
  149294. #ifdef WOLFSSL_KEIL
  149295. "adcs r4, r4, r7\n\t"
  149296. #elif defined(__clang__)
  149297. "adcs r4, r7\n\t"
  149298. #else
  149299. "adc r4, r7\n\t"
  149300. #endif
  149301. #ifdef WOLFSSL_KEIL
  149302. "adcs r5, r5, %[r]\n\t"
  149303. #elif defined(__clang__)
  149304. "adcs r5, %[r]\n\t"
  149305. #else
  149306. "adc r5, %[r]\n\t"
  149307. #endif
  149308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149309. "lsrs r6, %[a], #16\n\t"
  149310. #else
  149311. "lsr r6, %[a], #16\n\t"
  149312. #endif
  149313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149314. "lsrs r7, %[b], #16\n\t"
  149315. #else
  149316. "lsr r7, %[b], #16\n\t"
  149317. #endif
  149318. #ifdef WOLFSSL_KEIL
  149319. "muls r7, r6, r7\n\t"
  149320. #elif defined(__clang__)
  149321. "muls r7, r6\n\t"
  149322. #else
  149323. "mul r7, r6\n\t"
  149324. #endif
  149325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149326. "adds r4, r4, r7\n\t"
  149327. #else
  149328. "add r4, r4, r7\n\t"
  149329. #endif
  149330. #ifdef WOLFSSL_KEIL
  149331. "adcs r5, r5, %[r]\n\t"
  149332. #elif defined(__clang__)
  149333. "adcs r5, %[r]\n\t"
  149334. #else
  149335. "adc r5, %[r]\n\t"
  149336. #endif
  149337. "uxth r7, %[b]\n\t"
  149338. #ifdef WOLFSSL_KEIL
  149339. "muls r6, r7, r6\n\t"
  149340. #elif defined(__clang__)
  149341. "muls r6, r7\n\t"
  149342. #else
  149343. "mul r6, r7\n\t"
  149344. #endif
  149345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149346. "lsrs r7, r6, #16\n\t"
  149347. #else
  149348. "lsr r7, r6, #16\n\t"
  149349. #endif
  149350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149351. "lsls r6, r6, #16\n\t"
  149352. #else
  149353. "lsl r6, r6, #16\n\t"
  149354. #endif
  149355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149356. "adds r3, r3, r6\n\t"
  149357. #else
  149358. "add r3, r3, r6\n\t"
  149359. #endif
  149360. #ifdef WOLFSSL_KEIL
  149361. "adcs r4, r4, r7\n\t"
  149362. #elif defined(__clang__)
  149363. "adcs r4, r7\n\t"
  149364. #else
  149365. "adc r4, r7\n\t"
  149366. #endif
  149367. #ifdef WOLFSSL_KEIL
  149368. "adcs r5, r5, %[r]\n\t"
  149369. #elif defined(__clang__)
  149370. "adcs r5, %[r]\n\t"
  149371. #else
  149372. "adc r5, %[r]\n\t"
  149373. #endif
  149374. "# A[9] * B[15]\n\t"
  149375. "mov %[a], r9\n\t"
  149376. "mov %[b], r10\n\t"
  149377. "ldr %[a], [%[a], #36]\n\t"
  149378. "ldr %[b], [%[b], #60]\n\t"
  149379. "uxth r6, %[a]\n\t"
  149380. "uxth r7, %[b]\n\t"
  149381. #ifdef WOLFSSL_KEIL
  149382. "muls r7, r6, r7\n\t"
  149383. #elif defined(__clang__)
  149384. "muls r7, r6\n\t"
  149385. #else
  149386. "mul r7, r6\n\t"
  149387. #endif
  149388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149389. "adds r3, r3, r7\n\t"
  149390. #else
  149391. "add r3, r3, r7\n\t"
  149392. #endif
  149393. #ifdef WOLFSSL_KEIL
  149394. "adcs r4, r4, %[r]\n\t"
  149395. #elif defined(__clang__)
  149396. "adcs r4, %[r]\n\t"
  149397. #else
  149398. "adc r4, %[r]\n\t"
  149399. #endif
  149400. #ifdef WOLFSSL_KEIL
  149401. "adcs r5, r5, %[r]\n\t"
  149402. #elif defined(__clang__)
  149403. "adcs r5, %[r]\n\t"
  149404. #else
  149405. "adc r5, %[r]\n\t"
  149406. #endif
  149407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149408. "lsrs r7, %[b], #16\n\t"
  149409. #else
  149410. "lsr r7, %[b], #16\n\t"
  149411. #endif
  149412. #ifdef WOLFSSL_KEIL
  149413. "muls r6, r7, r6\n\t"
  149414. #elif defined(__clang__)
  149415. "muls r6, r7\n\t"
  149416. #else
  149417. "mul r6, r7\n\t"
  149418. #endif
  149419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149420. "lsrs r7, r6, #16\n\t"
  149421. #else
  149422. "lsr r7, r6, #16\n\t"
  149423. #endif
  149424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149425. "lsls r6, r6, #16\n\t"
  149426. #else
  149427. "lsl r6, r6, #16\n\t"
  149428. #endif
  149429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149430. "adds r3, r3, r6\n\t"
  149431. #else
  149432. "add r3, r3, r6\n\t"
  149433. #endif
  149434. #ifdef WOLFSSL_KEIL
  149435. "adcs r4, r4, r7\n\t"
  149436. #elif defined(__clang__)
  149437. "adcs r4, r7\n\t"
  149438. #else
  149439. "adc r4, r7\n\t"
  149440. #endif
  149441. #ifdef WOLFSSL_KEIL
  149442. "adcs r5, r5, %[r]\n\t"
  149443. #elif defined(__clang__)
  149444. "adcs r5, %[r]\n\t"
  149445. #else
  149446. "adc r5, %[r]\n\t"
  149447. #endif
  149448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149449. "lsrs r6, %[a], #16\n\t"
  149450. #else
  149451. "lsr r6, %[a], #16\n\t"
  149452. #endif
  149453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149454. "lsrs r7, %[b], #16\n\t"
  149455. #else
  149456. "lsr r7, %[b], #16\n\t"
  149457. #endif
  149458. #ifdef WOLFSSL_KEIL
  149459. "muls r7, r6, r7\n\t"
  149460. #elif defined(__clang__)
  149461. "muls r7, r6\n\t"
  149462. #else
  149463. "mul r7, r6\n\t"
  149464. #endif
  149465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149466. "adds r4, r4, r7\n\t"
  149467. #else
  149468. "add r4, r4, r7\n\t"
  149469. #endif
  149470. #ifdef WOLFSSL_KEIL
  149471. "adcs r5, r5, %[r]\n\t"
  149472. #elif defined(__clang__)
  149473. "adcs r5, %[r]\n\t"
  149474. #else
  149475. "adc r5, %[r]\n\t"
  149476. #endif
  149477. "uxth r7, %[b]\n\t"
  149478. #ifdef WOLFSSL_KEIL
  149479. "muls r6, r7, r6\n\t"
  149480. #elif defined(__clang__)
  149481. "muls r6, r7\n\t"
  149482. #else
  149483. "mul r6, r7\n\t"
  149484. #endif
  149485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149486. "lsrs r7, r6, #16\n\t"
  149487. #else
  149488. "lsr r7, r6, #16\n\t"
  149489. #endif
  149490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149491. "lsls r6, r6, #16\n\t"
  149492. #else
  149493. "lsl r6, r6, #16\n\t"
  149494. #endif
  149495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149496. "adds r3, r3, r6\n\t"
  149497. #else
  149498. "add r3, r3, r6\n\t"
  149499. #endif
  149500. #ifdef WOLFSSL_KEIL
  149501. "adcs r4, r4, r7\n\t"
  149502. #elif defined(__clang__)
  149503. "adcs r4, r7\n\t"
  149504. #else
  149505. "adc r4, r7\n\t"
  149506. #endif
  149507. #ifdef WOLFSSL_KEIL
  149508. "adcs r5, r5, %[r]\n\t"
  149509. #elif defined(__clang__)
  149510. "adcs r5, %[r]\n\t"
  149511. #else
  149512. "adc r5, %[r]\n\t"
  149513. #endif
  149514. "mov %[r], r8\n\t"
  149515. "str r3, [%[r], #96]\n\t"
  149516. "movs %[r], #0\n\t"
  149517. "# A[10] * B[15]\n\t"
  149518. "movs r3, #0\n\t"
  149519. "mov %[a], r9\n\t"
  149520. "mov %[b], r10\n\t"
  149521. "ldr %[a], [%[a], #40]\n\t"
  149522. "ldr %[b], [%[b], #60]\n\t"
  149523. "uxth r6, %[a]\n\t"
  149524. "uxth r7, %[b]\n\t"
  149525. #ifdef WOLFSSL_KEIL
  149526. "muls r7, r6, r7\n\t"
  149527. #elif defined(__clang__)
  149528. "muls r7, r6\n\t"
  149529. #else
  149530. "mul r7, r6\n\t"
  149531. #endif
  149532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149533. "adds r4, r4, r7\n\t"
  149534. #else
  149535. "add r4, r4, r7\n\t"
  149536. #endif
  149537. #ifdef WOLFSSL_KEIL
  149538. "adcs r5, r5, %[r]\n\t"
  149539. #elif defined(__clang__)
  149540. "adcs r5, %[r]\n\t"
  149541. #else
  149542. "adc r5, %[r]\n\t"
  149543. #endif
  149544. #ifdef WOLFSSL_KEIL
  149545. "adcs r3, r3, %[r]\n\t"
  149546. #elif defined(__clang__)
  149547. "adcs r3, %[r]\n\t"
  149548. #else
  149549. "adc r3, %[r]\n\t"
  149550. #endif
  149551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149552. "lsrs r7, %[b], #16\n\t"
  149553. #else
  149554. "lsr r7, %[b], #16\n\t"
  149555. #endif
  149556. #ifdef WOLFSSL_KEIL
  149557. "muls r6, r7, r6\n\t"
  149558. #elif defined(__clang__)
  149559. "muls r6, r7\n\t"
  149560. #else
  149561. "mul r6, r7\n\t"
  149562. #endif
  149563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149564. "lsrs r7, r6, #16\n\t"
  149565. #else
  149566. "lsr r7, r6, #16\n\t"
  149567. #endif
  149568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149569. "lsls r6, r6, #16\n\t"
  149570. #else
  149571. "lsl r6, r6, #16\n\t"
  149572. #endif
  149573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149574. "adds r4, r4, r6\n\t"
  149575. #else
  149576. "add r4, r4, r6\n\t"
  149577. #endif
  149578. #ifdef WOLFSSL_KEIL
  149579. "adcs r5, r5, r7\n\t"
  149580. #elif defined(__clang__)
  149581. "adcs r5, r7\n\t"
  149582. #else
  149583. "adc r5, r7\n\t"
  149584. #endif
  149585. #ifdef WOLFSSL_KEIL
  149586. "adcs r3, r3, %[r]\n\t"
  149587. #elif defined(__clang__)
  149588. "adcs r3, %[r]\n\t"
  149589. #else
  149590. "adc r3, %[r]\n\t"
  149591. #endif
  149592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149593. "lsrs r6, %[a], #16\n\t"
  149594. #else
  149595. "lsr r6, %[a], #16\n\t"
  149596. #endif
  149597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149598. "lsrs r7, %[b], #16\n\t"
  149599. #else
  149600. "lsr r7, %[b], #16\n\t"
  149601. #endif
  149602. #ifdef WOLFSSL_KEIL
  149603. "muls r7, r6, r7\n\t"
  149604. #elif defined(__clang__)
  149605. "muls r7, r6\n\t"
  149606. #else
  149607. "mul r7, r6\n\t"
  149608. #endif
  149609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149610. "adds r5, r5, r7\n\t"
  149611. #else
  149612. "add r5, r5, r7\n\t"
  149613. #endif
  149614. #ifdef WOLFSSL_KEIL
  149615. "adcs r3, r3, %[r]\n\t"
  149616. #elif defined(__clang__)
  149617. "adcs r3, %[r]\n\t"
  149618. #else
  149619. "adc r3, %[r]\n\t"
  149620. #endif
  149621. "uxth r7, %[b]\n\t"
  149622. #ifdef WOLFSSL_KEIL
  149623. "muls r6, r7, r6\n\t"
  149624. #elif defined(__clang__)
  149625. "muls r6, r7\n\t"
  149626. #else
  149627. "mul r6, r7\n\t"
  149628. #endif
  149629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149630. "lsrs r7, r6, #16\n\t"
  149631. #else
  149632. "lsr r7, r6, #16\n\t"
  149633. #endif
  149634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149635. "lsls r6, r6, #16\n\t"
  149636. #else
  149637. "lsl r6, r6, #16\n\t"
  149638. #endif
  149639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149640. "adds r4, r4, r6\n\t"
  149641. #else
  149642. "add r4, r4, r6\n\t"
  149643. #endif
  149644. #ifdef WOLFSSL_KEIL
  149645. "adcs r5, r5, r7\n\t"
  149646. #elif defined(__clang__)
  149647. "adcs r5, r7\n\t"
  149648. #else
  149649. "adc r5, r7\n\t"
  149650. #endif
  149651. #ifdef WOLFSSL_KEIL
  149652. "adcs r3, r3, %[r]\n\t"
  149653. #elif defined(__clang__)
  149654. "adcs r3, %[r]\n\t"
  149655. #else
  149656. "adc r3, %[r]\n\t"
  149657. #endif
  149658. "# A[11] * B[14]\n\t"
  149659. "mov %[a], r9\n\t"
  149660. "mov %[b], r10\n\t"
  149661. "ldr %[a], [%[a], #44]\n\t"
  149662. "ldr %[b], [%[b], #56]\n\t"
  149663. "uxth r6, %[a]\n\t"
  149664. "uxth r7, %[b]\n\t"
  149665. #ifdef WOLFSSL_KEIL
  149666. "muls r7, r6, r7\n\t"
  149667. #elif defined(__clang__)
  149668. "muls r7, r6\n\t"
  149669. #else
  149670. "mul r7, r6\n\t"
  149671. #endif
  149672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149673. "adds r4, r4, r7\n\t"
  149674. #else
  149675. "add r4, r4, r7\n\t"
  149676. #endif
  149677. #ifdef WOLFSSL_KEIL
  149678. "adcs r5, r5, %[r]\n\t"
  149679. #elif defined(__clang__)
  149680. "adcs r5, %[r]\n\t"
  149681. #else
  149682. "adc r5, %[r]\n\t"
  149683. #endif
  149684. #ifdef WOLFSSL_KEIL
  149685. "adcs r3, r3, %[r]\n\t"
  149686. #elif defined(__clang__)
  149687. "adcs r3, %[r]\n\t"
  149688. #else
  149689. "adc r3, %[r]\n\t"
  149690. #endif
  149691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149692. "lsrs r7, %[b], #16\n\t"
  149693. #else
  149694. "lsr r7, %[b], #16\n\t"
  149695. #endif
  149696. #ifdef WOLFSSL_KEIL
  149697. "muls r6, r7, r6\n\t"
  149698. #elif defined(__clang__)
  149699. "muls r6, r7\n\t"
  149700. #else
  149701. "mul r6, r7\n\t"
  149702. #endif
  149703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149704. "lsrs r7, r6, #16\n\t"
  149705. #else
  149706. "lsr r7, r6, #16\n\t"
  149707. #endif
  149708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149709. "lsls r6, r6, #16\n\t"
  149710. #else
  149711. "lsl r6, r6, #16\n\t"
  149712. #endif
  149713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149714. "adds r4, r4, r6\n\t"
  149715. #else
  149716. "add r4, r4, r6\n\t"
  149717. #endif
  149718. #ifdef WOLFSSL_KEIL
  149719. "adcs r5, r5, r7\n\t"
  149720. #elif defined(__clang__)
  149721. "adcs r5, r7\n\t"
  149722. #else
  149723. "adc r5, r7\n\t"
  149724. #endif
  149725. #ifdef WOLFSSL_KEIL
  149726. "adcs r3, r3, %[r]\n\t"
  149727. #elif defined(__clang__)
  149728. "adcs r3, %[r]\n\t"
  149729. #else
  149730. "adc r3, %[r]\n\t"
  149731. #endif
  149732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149733. "lsrs r6, %[a], #16\n\t"
  149734. #else
  149735. "lsr r6, %[a], #16\n\t"
  149736. #endif
  149737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149738. "lsrs r7, %[b], #16\n\t"
  149739. #else
  149740. "lsr r7, %[b], #16\n\t"
  149741. #endif
  149742. #ifdef WOLFSSL_KEIL
  149743. "muls r7, r6, r7\n\t"
  149744. #elif defined(__clang__)
  149745. "muls r7, r6\n\t"
  149746. #else
  149747. "mul r7, r6\n\t"
  149748. #endif
  149749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149750. "adds r5, r5, r7\n\t"
  149751. #else
  149752. "add r5, r5, r7\n\t"
  149753. #endif
  149754. #ifdef WOLFSSL_KEIL
  149755. "adcs r3, r3, %[r]\n\t"
  149756. #elif defined(__clang__)
  149757. "adcs r3, %[r]\n\t"
  149758. #else
  149759. "adc r3, %[r]\n\t"
  149760. #endif
  149761. "uxth r7, %[b]\n\t"
  149762. #ifdef WOLFSSL_KEIL
  149763. "muls r6, r7, r6\n\t"
  149764. #elif defined(__clang__)
  149765. "muls r6, r7\n\t"
  149766. #else
  149767. "mul r6, r7\n\t"
  149768. #endif
  149769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149770. "lsrs r7, r6, #16\n\t"
  149771. #else
  149772. "lsr r7, r6, #16\n\t"
  149773. #endif
  149774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149775. "lsls r6, r6, #16\n\t"
  149776. #else
  149777. "lsl r6, r6, #16\n\t"
  149778. #endif
  149779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149780. "adds r4, r4, r6\n\t"
  149781. #else
  149782. "add r4, r4, r6\n\t"
  149783. #endif
  149784. #ifdef WOLFSSL_KEIL
  149785. "adcs r5, r5, r7\n\t"
  149786. #elif defined(__clang__)
  149787. "adcs r5, r7\n\t"
  149788. #else
  149789. "adc r5, r7\n\t"
  149790. #endif
  149791. #ifdef WOLFSSL_KEIL
  149792. "adcs r3, r3, %[r]\n\t"
  149793. #elif defined(__clang__)
  149794. "adcs r3, %[r]\n\t"
  149795. #else
  149796. "adc r3, %[r]\n\t"
  149797. #endif
  149798. "# A[12] * B[13]\n\t"
  149799. "mov %[a], r9\n\t"
  149800. "mov %[b], r10\n\t"
  149801. "ldr %[a], [%[a], #48]\n\t"
  149802. "ldr %[b], [%[b], #52]\n\t"
  149803. "uxth r6, %[a]\n\t"
  149804. "uxth r7, %[b]\n\t"
  149805. #ifdef WOLFSSL_KEIL
  149806. "muls r7, r6, r7\n\t"
  149807. #elif defined(__clang__)
  149808. "muls r7, r6\n\t"
  149809. #else
  149810. "mul r7, r6\n\t"
  149811. #endif
  149812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149813. "adds r4, r4, r7\n\t"
  149814. #else
  149815. "add r4, r4, r7\n\t"
  149816. #endif
  149817. #ifdef WOLFSSL_KEIL
  149818. "adcs r5, r5, %[r]\n\t"
  149819. #elif defined(__clang__)
  149820. "adcs r5, %[r]\n\t"
  149821. #else
  149822. "adc r5, %[r]\n\t"
  149823. #endif
  149824. #ifdef WOLFSSL_KEIL
  149825. "adcs r3, r3, %[r]\n\t"
  149826. #elif defined(__clang__)
  149827. "adcs r3, %[r]\n\t"
  149828. #else
  149829. "adc r3, %[r]\n\t"
  149830. #endif
  149831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149832. "lsrs r7, %[b], #16\n\t"
  149833. #else
  149834. "lsr r7, %[b], #16\n\t"
  149835. #endif
  149836. #ifdef WOLFSSL_KEIL
  149837. "muls r6, r7, r6\n\t"
  149838. #elif defined(__clang__)
  149839. "muls r6, r7\n\t"
  149840. #else
  149841. "mul r6, r7\n\t"
  149842. #endif
  149843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149844. "lsrs r7, r6, #16\n\t"
  149845. #else
  149846. "lsr r7, r6, #16\n\t"
  149847. #endif
  149848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149849. "lsls r6, r6, #16\n\t"
  149850. #else
  149851. "lsl r6, r6, #16\n\t"
  149852. #endif
  149853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149854. "adds r4, r4, r6\n\t"
  149855. #else
  149856. "add r4, r4, r6\n\t"
  149857. #endif
  149858. #ifdef WOLFSSL_KEIL
  149859. "adcs r5, r5, r7\n\t"
  149860. #elif defined(__clang__)
  149861. "adcs r5, r7\n\t"
  149862. #else
  149863. "adc r5, r7\n\t"
  149864. #endif
  149865. #ifdef WOLFSSL_KEIL
  149866. "adcs r3, r3, %[r]\n\t"
  149867. #elif defined(__clang__)
  149868. "adcs r3, %[r]\n\t"
  149869. #else
  149870. "adc r3, %[r]\n\t"
  149871. #endif
  149872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149873. "lsrs r6, %[a], #16\n\t"
  149874. #else
  149875. "lsr r6, %[a], #16\n\t"
  149876. #endif
  149877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149878. "lsrs r7, %[b], #16\n\t"
  149879. #else
  149880. "lsr r7, %[b], #16\n\t"
  149881. #endif
  149882. #ifdef WOLFSSL_KEIL
  149883. "muls r7, r6, r7\n\t"
  149884. #elif defined(__clang__)
  149885. "muls r7, r6\n\t"
  149886. #else
  149887. "mul r7, r6\n\t"
  149888. #endif
  149889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149890. "adds r5, r5, r7\n\t"
  149891. #else
  149892. "add r5, r5, r7\n\t"
  149893. #endif
  149894. #ifdef WOLFSSL_KEIL
  149895. "adcs r3, r3, %[r]\n\t"
  149896. #elif defined(__clang__)
  149897. "adcs r3, %[r]\n\t"
  149898. #else
  149899. "adc r3, %[r]\n\t"
  149900. #endif
  149901. "uxth r7, %[b]\n\t"
  149902. #ifdef WOLFSSL_KEIL
  149903. "muls r6, r7, r6\n\t"
  149904. #elif defined(__clang__)
  149905. "muls r6, r7\n\t"
  149906. #else
  149907. "mul r6, r7\n\t"
  149908. #endif
  149909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149910. "lsrs r7, r6, #16\n\t"
  149911. #else
  149912. "lsr r7, r6, #16\n\t"
  149913. #endif
  149914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149915. "lsls r6, r6, #16\n\t"
  149916. #else
  149917. "lsl r6, r6, #16\n\t"
  149918. #endif
  149919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149920. "adds r4, r4, r6\n\t"
  149921. #else
  149922. "add r4, r4, r6\n\t"
  149923. #endif
  149924. #ifdef WOLFSSL_KEIL
  149925. "adcs r5, r5, r7\n\t"
  149926. #elif defined(__clang__)
  149927. "adcs r5, r7\n\t"
  149928. #else
  149929. "adc r5, r7\n\t"
  149930. #endif
  149931. #ifdef WOLFSSL_KEIL
  149932. "adcs r3, r3, %[r]\n\t"
  149933. #elif defined(__clang__)
  149934. "adcs r3, %[r]\n\t"
  149935. #else
  149936. "adc r3, %[r]\n\t"
  149937. #endif
  149938. "# A[13] * B[12]\n\t"
  149939. "mov %[a], r9\n\t"
  149940. "mov %[b], r10\n\t"
  149941. "ldr %[a], [%[a], #52]\n\t"
  149942. "ldr %[b], [%[b], #48]\n\t"
  149943. "uxth r6, %[a]\n\t"
  149944. "uxth r7, %[b]\n\t"
  149945. #ifdef WOLFSSL_KEIL
  149946. "muls r7, r6, r7\n\t"
  149947. #elif defined(__clang__)
  149948. "muls r7, r6\n\t"
  149949. #else
  149950. "mul r7, r6\n\t"
  149951. #endif
  149952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149953. "adds r4, r4, r7\n\t"
  149954. #else
  149955. "add r4, r4, r7\n\t"
  149956. #endif
  149957. #ifdef WOLFSSL_KEIL
  149958. "adcs r5, r5, %[r]\n\t"
  149959. #elif defined(__clang__)
  149960. "adcs r5, %[r]\n\t"
  149961. #else
  149962. "adc r5, %[r]\n\t"
  149963. #endif
  149964. #ifdef WOLFSSL_KEIL
  149965. "adcs r3, r3, %[r]\n\t"
  149966. #elif defined(__clang__)
  149967. "adcs r3, %[r]\n\t"
  149968. #else
  149969. "adc r3, %[r]\n\t"
  149970. #endif
  149971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149972. "lsrs r7, %[b], #16\n\t"
  149973. #else
  149974. "lsr r7, %[b], #16\n\t"
  149975. #endif
  149976. #ifdef WOLFSSL_KEIL
  149977. "muls r6, r7, r6\n\t"
  149978. #elif defined(__clang__)
  149979. "muls r6, r7\n\t"
  149980. #else
  149981. "mul r6, r7\n\t"
  149982. #endif
  149983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149984. "lsrs r7, r6, #16\n\t"
  149985. #else
  149986. "lsr r7, r6, #16\n\t"
  149987. #endif
  149988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149989. "lsls r6, r6, #16\n\t"
  149990. #else
  149991. "lsl r6, r6, #16\n\t"
  149992. #endif
  149993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149994. "adds r4, r4, r6\n\t"
  149995. #else
  149996. "add r4, r4, r6\n\t"
  149997. #endif
  149998. #ifdef WOLFSSL_KEIL
  149999. "adcs r5, r5, r7\n\t"
  150000. #elif defined(__clang__)
  150001. "adcs r5, r7\n\t"
  150002. #else
  150003. "adc r5, r7\n\t"
  150004. #endif
  150005. #ifdef WOLFSSL_KEIL
  150006. "adcs r3, r3, %[r]\n\t"
  150007. #elif defined(__clang__)
  150008. "adcs r3, %[r]\n\t"
  150009. #else
  150010. "adc r3, %[r]\n\t"
  150011. #endif
  150012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150013. "lsrs r6, %[a], #16\n\t"
  150014. #else
  150015. "lsr r6, %[a], #16\n\t"
  150016. #endif
  150017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150018. "lsrs r7, %[b], #16\n\t"
  150019. #else
  150020. "lsr r7, %[b], #16\n\t"
  150021. #endif
  150022. #ifdef WOLFSSL_KEIL
  150023. "muls r7, r6, r7\n\t"
  150024. #elif defined(__clang__)
  150025. "muls r7, r6\n\t"
  150026. #else
  150027. "mul r7, r6\n\t"
  150028. #endif
  150029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150030. "adds r5, r5, r7\n\t"
  150031. #else
  150032. "add r5, r5, r7\n\t"
  150033. #endif
  150034. #ifdef WOLFSSL_KEIL
  150035. "adcs r3, r3, %[r]\n\t"
  150036. #elif defined(__clang__)
  150037. "adcs r3, %[r]\n\t"
  150038. #else
  150039. "adc r3, %[r]\n\t"
  150040. #endif
  150041. "uxth r7, %[b]\n\t"
  150042. #ifdef WOLFSSL_KEIL
  150043. "muls r6, r7, r6\n\t"
  150044. #elif defined(__clang__)
  150045. "muls r6, r7\n\t"
  150046. #else
  150047. "mul r6, r7\n\t"
  150048. #endif
  150049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150050. "lsrs r7, r6, #16\n\t"
  150051. #else
  150052. "lsr r7, r6, #16\n\t"
  150053. #endif
  150054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150055. "lsls r6, r6, #16\n\t"
  150056. #else
  150057. "lsl r6, r6, #16\n\t"
  150058. #endif
  150059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150060. "adds r4, r4, r6\n\t"
  150061. #else
  150062. "add r4, r4, r6\n\t"
  150063. #endif
  150064. #ifdef WOLFSSL_KEIL
  150065. "adcs r5, r5, r7\n\t"
  150066. #elif defined(__clang__)
  150067. "adcs r5, r7\n\t"
  150068. #else
  150069. "adc r5, r7\n\t"
  150070. #endif
  150071. #ifdef WOLFSSL_KEIL
  150072. "adcs r3, r3, %[r]\n\t"
  150073. #elif defined(__clang__)
  150074. "adcs r3, %[r]\n\t"
  150075. #else
  150076. "adc r3, %[r]\n\t"
  150077. #endif
  150078. "# A[14] * B[11]\n\t"
  150079. "mov %[a], r9\n\t"
  150080. "mov %[b], r10\n\t"
  150081. "ldr %[a], [%[a], #56]\n\t"
  150082. "ldr %[b], [%[b], #44]\n\t"
  150083. "uxth r6, %[a]\n\t"
  150084. "uxth r7, %[b]\n\t"
  150085. #ifdef WOLFSSL_KEIL
  150086. "muls r7, r6, r7\n\t"
  150087. #elif defined(__clang__)
  150088. "muls r7, r6\n\t"
  150089. #else
  150090. "mul r7, r6\n\t"
  150091. #endif
  150092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150093. "adds r4, r4, r7\n\t"
  150094. #else
  150095. "add r4, r4, r7\n\t"
  150096. #endif
  150097. #ifdef WOLFSSL_KEIL
  150098. "adcs r5, r5, %[r]\n\t"
  150099. #elif defined(__clang__)
  150100. "adcs r5, %[r]\n\t"
  150101. #else
  150102. "adc r5, %[r]\n\t"
  150103. #endif
  150104. #ifdef WOLFSSL_KEIL
  150105. "adcs r3, r3, %[r]\n\t"
  150106. #elif defined(__clang__)
  150107. "adcs r3, %[r]\n\t"
  150108. #else
  150109. "adc r3, %[r]\n\t"
  150110. #endif
  150111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150112. "lsrs r7, %[b], #16\n\t"
  150113. #else
  150114. "lsr r7, %[b], #16\n\t"
  150115. #endif
  150116. #ifdef WOLFSSL_KEIL
  150117. "muls r6, r7, r6\n\t"
  150118. #elif defined(__clang__)
  150119. "muls r6, r7\n\t"
  150120. #else
  150121. "mul r6, r7\n\t"
  150122. #endif
  150123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150124. "lsrs r7, r6, #16\n\t"
  150125. #else
  150126. "lsr r7, r6, #16\n\t"
  150127. #endif
  150128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150129. "lsls r6, r6, #16\n\t"
  150130. #else
  150131. "lsl r6, r6, #16\n\t"
  150132. #endif
  150133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150134. "adds r4, r4, r6\n\t"
  150135. #else
  150136. "add r4, r4, r6\n\t"
  150137. #endif
  150138. #ifdef WOLFSSL_KEIL
  150139. "adcs r5, r5, r7\n\t"
  150140. #elif defined(__clang__)
  150141. "adcs r5, r7\n\t"
  150142. #else
  150143. "adc r5, r7\n\t"
  150144. #endif
  150145. #ifdef WOLFSSL_KEIL
  150146. "adcs r3, r3, %[r]\n\t"
  150147. #elif defined(__clang__)
  150148. "adcs r3, %[r]\n\t"
  150149. #else
  150150. "adc r3, %[r]\n\t"
  150151. #endif
  150152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150153. "lsrs r6, %[a], #16\n\t"
  150154. #else
  150155. "lsr r6, %[a], #16\n\t"
  150156. #endif
  150157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150158. "lsrs r7, %[b], #16\n\t"
  150159. #else
  150160. "lsr r7, %[b], #16\n\t"
  150161. #endif
  150162. #ifdef WOLFSSL_KEIL
  150163. "muls r7, r6, r7\n\t"
  150164. #elif defined(__clang__)
  150165. "muls r7, r6\n\t"
  150166. #else
  150167. "mul r7, r6\n\t"
  150168. #endif
  150169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150170. "adds r5, r5, r7\n\t"
  150171. #else
  150172. "add r5, r5, r7\n\t"
  150173. #endif
  150174. #ifdef WOLFSSL_KEIL
  150175. "adcs r3, r3, %[r]\n\t"
  150176. #elif defined(__clang__)
  150177. "adcs r3, %[r]\n\t"
  150178. #else
  150179. "adc r3, %[r]\n\t"
  150180. #endif
  150181. "uxth r7, %[b]\n\t"
  150182. #ifdef WOLFSSL_KEIL
  150183. "muls r6, r7, r6\n\t"
  150184. #elif defined(__clang__)
  150185. "muls r6, r7\n\t"
  150186. #else
  150187. "mul r6, r7\n\t"
  150188. #endif
  150189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150190. "lsrs r7, r6, #16\n\t"
  150191. #else
  150192. "lsr r7, r6, #16\n\t"
  150193. #endif
  150194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150195. "lsls r6, r6, #16\n\t"
  150196. #else
  150197. "lsl r6, r6, #16\n\t"
  150198. #endif
  150199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150200. "adds r4, r4, r6\n\t"
  150201. #else
  150202. "add r4, r4, r6\n\t"
  150203. #endif
  150204. #ifdef WOLFSSL_KEIL
  150205. "adcs r5, r5, r7\n\t"
  150206. #elif defined(__clang__)
  150207. "adcs r5, r7\n\t"
  150208. #else
  150209. "adc r5, r7\n\t"
  150210. #endif
  150211. #ifdef WOLFSSL_KEIL
  150212. "adcs r3, r3, %[r]\n\t"
  150213. #elif defined(__clang__)
  150214. "adcs r3, %[r]\n\t"
  150215. #else
  150216. "adc r3, %[r]\n\t"
  150217. #endif
  150218. "# A[15] * B[10]\n\t"
  150219. "mov %[a], r9\n\t"
  150220. "mov %[b], r10\n\t"
  150221. "ldr %[a], [%[a], #60]\n\t"
  150222. "ldr %[b], [%[b], #40]\n\t"
  150223. "uxth r6, %[a]\n\t"
  150224. "uxth r7, %[b]\n\t"
  150225. #ifdef WOLFSSL_KEIL
  150226. "muls r7, r6, r7\n\t"
  150227. #elif defined(__clang__)
  150228. "muls r7, r6\n\t"
  150229. #else
  150230. "mul r7, r6\n\t"
  150231. #endif
  150232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150233. "adds r4, r4, r7\n\t"
  150234. #else
  150235. "add r4, r4, r7\n\t"
  150236. #endif
  150237. #ifdef WOLFSSL_KEIL
  150238. "adcs r5, r5, %[r]\n\t"
  150239. #elif defined(__clang__)
  150240. "adcs r5, %[r]\n\t"
  150241. #else
  150242. "adc r5, %[r]\n\t"
  150243. #endif
  150244. #ifdef WOLFSSL_KEIL
  150245. "adcs r3, r3, %[r]\n\t"
  150246. #elif defined(__clang__)
  150247. "adcs r3, %[r]\n\t"
  150248. #else
  150249. "adc r3, %[r]\n\t"
  150250. #endif
  150251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150252. "lsrs r7, %[b], #16\n\t"
  150253. #else
  150254. "lsr r7, %[b], #16\n\t"
  150255. #endif
  150256. #ifdef WOLFSSL_KEIL
  150257. "muls r6, r7, r6\n\t"
  150258. #elif defined(__clang__)
  150259. "muls r6, r7\n\t"
  150260. #else
  150261. "mul r6, r7\n\t"
  150262. #endif
  150263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150264. "lsrs r7, r6, #16\n\t"
  150265. #else
  150266. "lsr r7, r6, #16\n\t"
  150267. #endif
  150268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150269. "lsls r6, r6, #16\n\t"
  150270. #else
  150271. "lsl r6, r6, #16\n\t"
  150272. #endif
  150273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150274. "adds r4, r4, r6\n\t"
  150275. #else
  150276. "add r4, r4, r6\n\t"
  150277. #endif
  150278. #ifdef WOLFSSL_KEIL
  150279. "adcs r5, r5, r7\n\t"
  150280. #elif defined(__clang__)
  150281. "adcs r5, r7\n\t"
  150282. #else
  150283. "adc r5, r7\n\t"
  150284. #endif
  150285. #ifdef WOLFSSL_KEIL
  150286. "adcs r3, r3, %[r]\n\t"
  150287. #elif defined(__clang__)
  150288. "adcs r3, %[r]\n\t"
  150289. #else
  150290. "adc r3, %[r]\n\t"
  150291. #endif
  150292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150293. "lsrs r6, %[a], #16\n\t"
  150294. #else
  150295. "lsr r6, %[a], #16\n\t"
  150296. #endif
  150297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150298. "lsrs r7, %[b], #16\n\t"
  150299. #else
  150300. "lsr r7, %[b], #16\n\t"
  150301. #endif
  150302. #ifdef WOLFSSL_KEIL
  150303. "muls r7, r6, r7\n\t"
  150304. #elif defined(__clang__)
  150305. "muls r7, r6\n\t"
  150306. #else
  150307. "mul r7, r6\n\t"
  150308. #endif
  150309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150310. "adds r5, r5, r7\n\t"
  150311. #else
  150312. "add r5, r5, r7\n\t"
  150313. #endif
  150314. #ifdef WOLFSSL_KEIL
  150315. "adcs r3, r3, %[r]\n\t"
  150316. #elif defined(__clang__)
  150317. "adcs r3, %[r]\n\t"
  150318. #else
  150319. "adc r3, %[r]\n\t"
  150320. #endif
  150321. "uxth r7, %[b]\n\t"
  150322. #ifdef WOLFSSL_KEIL
  150323. "muls r6, r7, r6\n\t"
  150324. #elif defined(__clang__)
  150325. "muls r6, r7\n\t"
  150326. #else
  150327. "mul r6, r7\n\t"
  150328. #endif
  150329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150330. "lsrs r7, r6, #16\n\t"
  150331. #else
  150332. "lsr r7, r6, #16\n\t"
  150333. #endif
  150334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150335. "lsls r6, r6, #16\n\t"
  150336. #else
  150337. "lsl r6, r6, #16\n\t"
  150338. #endif
  150339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150340. "adds r4, r4, r6\n\t"
  150341. #else
  150342. "add r4, r4, r6\n\t"
  150343. #endif
  150344. #ifdef WOLFSSL_KEIL
  150345. "adcs r5, r5, r7\n\t"
  150346. #elif defined(__clang__)
  150347. "adcs r5, r7\n\t"
  150348. #else
  150349. "adc r5, r7\n\t"
  150350. #endif
  150351. #ifdef WOLFSSL_KEIL
  150352. "adcs r3, r3, %[r]\n\t"
  150353. #elif defined(__clang__)
  150354. "adcs r3, %[r]\n\t"
  150355. #else
  150356. "adc r3, %[r]\n\t"
  150357. #endif
  150358. "mov %[r], r8\n\t"
  150359. "str r4, [%[r], #100]\n\t"
  150360. "movs %[r], #0\n\t"
  150361. "# A[15] * B[11]\n\t"
  150362. "movs r4, #0\n\t"
  150363. "mov %[a], r9\n\t"
  150364. "mov %[b], r10\n\t"
  150365. "ldr %[a], [%[a], #60]\n\t"
  150366. "ldr %[b], [%[b], #44]\n\t"
  150367. "uxth r6, %[a]\n\t"
  150368. "uxth r7, %[b]\n\t"
  150369. #ifdef WOLFSSL_KEIL
  150370. "muls r7, r6, r7\n\t"
  150371. #elif defined(__clang__)
  150372. "muls r7, r6\n\t"
  150373. #else
  150374. "mul r7, r6\n\t"
  150375. #endif
  150376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150377. "adds r5, r5, r7\n\t"
  150378. #else
  150379. "add r5, r5, r7\n\t"
  150380. #endif
  150381. #ifdef WOLFSSL_KEIL
  150382. "adcs r3, r3, %[r]\n\t"
  150383. #elif defined(__clang__)
  150384. "adcs r3, %[r]\n\t"
  150385. #else
  150386. "adc r3, %[r]\n\t"
  150387. #endif
  150388. #ifdef WOLFSSL_KEIL
  150389. "adcs r4, r4, %[r]\n\t"
  150390. #elif defined(__clang__)
  150391. "adcs r4, %[r]\n\t"
  150392. #else
  150393. "adc r4, %[r]\n\t"
  150394. #endif
  150395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150396. "lsrs r7, %[b], #16\n\t"
  150397. #else
  150398. "lsr r7, %[b], #16\n\t"
  150399. #endif
  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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150437. "lsrs r6, %[a], #16\n\t"
  150438. #else
  150439. "lsr r6, %[a], #16\n\t"
  150440. #endif
  150441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150442. "lsrs r7, %[b], #16\n\t"
  150443. #else
  150444. "lsr r7, %[b], #16\n\t"
  150445. #endif
  150446. #ifdef WOLFSSL_KEIL
  150447. "muls r7, r6, r7\n\t"
  150448. #elif defined(__clang__)
  150449. "muls r7, r6\n\t"
  150450. #else
  150451. "mul r7, r6\n\t"
  150452. #endif
  150453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150454. "adds r3, r3, r7\n\t"
  150455. #else
  150456. "add r3, r3, r7\n\t"
  150457. #endif
  150458. #ifdef WOLFSSL_KEIL
  150459. "adcs r4, r4, %[r]\n\t"
  150460. #elif defined(__clang__)
  150461. "adcs r4, %[r]\n\t"
  150462. #else
  150463. "adc r4, %[r]\n\t"
  150464. #endif
  150465. "uxth r7, %[b]\n\t"
  150466. #ifdef WOLFSSL_KEIL
  150467. "muls r6, r7, r6\n\t"
  150468. #elif defined(__clang__)
  150469. "muls r6, r7\n\t"
  150470. #else
  150471. "mul r6, r7\n\t"
  150472. #endif
  150473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150474. "lsrs r7, r6, #16\n\t"
  150475. #else
  150476. "lsr r7, r6, #16\n\t"
  150477. #endif
  150478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150479. "lsls r6, r6, #16\n\t"
  150480. #else
  150481. "lsl r6, r6, #16\n\t"
  150482. #endif
  150483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150484. "adds r5, r5, r6\n\t"
  150485. #else
  150486. "add r5, r5, r6\n\t"
  150487. #endif
  150488. #ifdef WOLFSSL_KEIL
  150489. "adcs r3, r3, r7\n\t"
  150490. #elif defined(__clang__)
  150491. "adcs r3, r7\n\t"
  150492. #else
  150493. "adc r3, r7\n\t"
  150494. #endif
  150495. #ifdef WOLFSSL_KEIL
  150496. "adcs r4, r4, %[r]\n\t"
  150497. #elif defined(__clang__)
  150498. "adcs r4, %[r]\n\t"
  150499. #else
  150500. "adc r4, %[r]\n\t"
  150501. #endif
  150502. "# A[14] * B[12]\n\t"
  150503. "mov %[a], r9\n\t"
  150504. "mov %[b], r10\n\t"
  150505. "ldr %[a], [%[a], #56]\n\t"
  150506. "ldr %[b], [%[b], #48]\n\t"
  150507. "uxth r6, %[a]\n\t"
  150508. "uxth r7, %[b]\n\t"
  150509. #ifdef WOLFSSL_KEIL
  150510. "muls r7, r6, r7\n\t"
  150511. #elif defined(__clang__)
  150512. "muls r7, r6\n\t"
  150513. #else
  150514. "mul r7, r6\n\t"
  150515. #endif
  150516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150517. "adds r5, r5, r7\n\t"
  150518. #else
  150519. "add r5, r5, r7\n\t"
  150520. #endif
  150521. #ifdef WOLFSSL_KEIL
  150522. "adcs r3, r3, %[r]\n\t"
  150523. #elif defined(__clang__)
  150524. "adcs r3, %[r]\n\t"
  150525. #else
  150526. "adc r3, %[r]\n\t"
  150527. #endif
  150528. #ifdef WOLFSSL_KEIL
  150529. "adcs r4, r4, %[r]\n\t"
  150530. #elif defined(__clang__)
  150531. "adcs r4, %[r]\n\t"
  150532. #else
  150533. "adc r4, %[r]\n\t"
  150534. #endif
  150535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150536. "lsrs r7, %[b], #16\n\t"
  150537. #else
  150538. "lsr r7, %[b], #16\n\t"
  150539. #endif
  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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150577. "lsrs r6, %[a], #16\n\t"
  150578. #else
  150579. "lsr r6, %[a], #16\n\t"
  150580. #endif
  150581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150582. "lsrs r7, %[b], #16\n\t"
  150583. #else
  150584. "lsr r7, %[b], #16\n\t"
  150585. #endif
  150586. #ifdef WOLFSSL_KEIL
  150587. "muls r7, r6, r7\n\t"
  150588. #elif defined(__clang__)
  150589. "muls r7, r6\n\t"
  150590. #else
  150591. "mul r7, r6\n\t"
  150592. #endif
  150593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150594. "adds r3, r3, r7\n\t"
  150595. #else
  150596. "add r3, r3, r7\n\t"
  150597. #endif
  150598. #ifdef WOLFSSL_KEIL
  150599. "adcs r4, r4, %[r]\n\t"
  150600. #elif defined(__clang__)
  150601. "adcs r4, %[r]\n\t"
  150602. #else
  150603. "adc r4, %[r]\n\t"
  150604. #endif
  150605. "uxth r7, %[b]\n\t"
  150606. #ifdef WOLFSSL_KEIL
  150607. "muls r6, r7, r6\n\t"
  150608. #elif defined(__clang__)
  150609. "muls r6, r7\n\t"
  150610. #else
  150611. "mul r6, r7\n\t"
  150612. #endif
  150613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150614. "lsrs r7, r6, #16\n\t"
  150615. #else
  150616. "lsr r7, r6, #16\n\t"
  150617. #endif
  150618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150619. "lsls r6, r6, #16\n\t"
  150620. #else
  150621. "lsl r6, r6, #16\n\t"
  150622. #endif
  150623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150624. "adds r5, r5, r6\n\t"
  150625. #else
  150626. "add r5, r5, r6\n\t"
  150627. #endif
  150628. #ifdef WOLFSSL_KEIL
  150629. "adcs r3, r3, r7\n\t"
  150630. #elif defined(__clang__)
  150631. "adcs r3, r7\n\t"
  150632. #else
  150633. "adc r3, r7\n\t"
  150634. #endif
  150635. #ifdef WOLFSSL_KEIL
  150636. "adcs r4, r4, %[r]\n\t"
  150637. #elif defined(__clang__)
  150638. "adcs r4, %[r]\n\t"
  150639. #else
  150640. "adc r4, %[r]\n\t"
  150641. #endif
  150642. "# A[13] * B[13]\n\t"
  150643. "mov %[a], r9\n\t"
  150644. "mov %[b], r10\n\t"
  150645. "ldr %[a], [%[a], #52]\n\t"
  150646. "ldr %[b], [%[b], #52]\n\t"
  150647. "uxth r6, %[a]\n\t"
  150648. "uxth r7, %[b]\n\t"
  150649. #ifdef WOLFSSL_KEIL
  150650. "muls r7, r6, r7\n\t"
  150651. #elif defined(__clang__)
  150652. "muls r7, r6\n\t"
  150653. #else
  150654. "mul r7, r6\n\t"
  150655. #endif
  150656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150657. "adds r5, r5, r7\n\t"
  150658. #else
  150659. "add r5, r5, r7\n\t"
  150660. #endif
  150661. #ifdef WOLFSSL_KEIL
  150662. "adcs r3, r3, %[r]\n\t"
  150663. #elif defined(__clang__)
  150664. "adcs r3, %[r]\n\t"
  150665. #else
  150666. "adc r3, %[r]\n\t"
  150667. #endif
  150668. #ifdef WOLFSSL_KEIL
  150669. "adcs r4, r4, %[r]\n\t"
  150670. #elif defined(__clang__)
  150671. "adcs r4, %[r]\n\t"
  150672. #else
  150673. "adc r4, %[r]\n\t"
  150674. #endif
  150675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150676. "lsrs r7, %[b], #16\n\t"
  150677. #else
  150678. "lsr r7, %[b], #16\n\t"
  150679. #endif
  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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150717. "lsrs r6, %[a], #16\n\t"
  150718. #else
  150719. "lsr r6, %[a], #16\n\t"
  150720. #endif
  150721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150722. "lsrs r7, %[b], #16\n\t"
  150723. #else
  150724. "lsr r7, %[b], #16\n\t"
  150725. #endif
  150726. #ifdef WOLFSSL_KEIL
  150727. "muls r7, r6, r7\n\t"
  150728. #elif defined(__clang__)
  150729. "muls r7, r6\n\t"
  150730. #else
  150731. "mul r7, r6\n\t"
  150732. #endif
  150733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150734. "adds r3, r3, r7\n\t"
  150735. #else
  150736. "add r3, r3, r7\n\t"
  150737. #endif
  150738. #ifdef WOLFSSL_KEIL
  150739. "adcs r4, r4, %[r]\n\t"
  150740. #elif defined(__clang__)
  150741. "adcs r4, %[r]\n\t"
  150742. #else
  150743. "adc r4, %[r]\n\t"
  150744. #endif
  150745. "uxth r7, %[b]\n\t"
  150746. #ifdef WOLFSSL_KEIL
  150747. "muls r6, r7, r6\n\t"
  150748. #elif defined(__clang__)
  150749. "muls r6, r7\n\t"
  150750. #else
  150751. "mul r6, r7\n\t"
  150752. #endif
  150753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150754. "lsrs r7, r6, #16\n\t"
  150755. #else
  150756. "lsr r7, r6, #16\n\t"
  150757. #endif
  150758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150759. "lsls r6, r6, #16\n\t"
  150760. #else
  150761. "lsl r6, r6, #16\n\t"
  150762. #endif
  150763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150764. "adds r5, r5, r6\n\t"
  150765. #else
  150766. "add r5, r5, r6\n\t"
  150767. #endif
  150768. #ifdef WOLFSSL_KEIL
  150769. "adcs r3, r3, r7\n\t"
  150770. #elif defined(__clang__)
  150771. "adcs r3, r7\n\t"
  150772. #else
  150773. "adc r3, r7\n\t"
  150774. #endif
  150775. #ifdef WOLFSSL_KEIL
  150776. "adcs r4, r4, %[r]\n\t"
  150777. #elif defined(__clang__)
  150778. "adcs r4, %[r]\n\t"
  150779. #else
  150780. "adc r4, %[r]\n\t"
  150781. #endif
  150782. "# A[12] * B[14]\n\t"
  150783. "mov %[a], r9\n\t"
  150784. "mov %[b], r10\n\t"
  150785. "ldr %[a], [%[a], #48]\n\t"
  150786. "ldr %[b], [%[b], #56]\n\t"
  150787. "uxth r6, %[a]\n\t"
  150788. "uxth r7, %[b]\n\t"
  150789. #ifdef WOLFSSL_KEIL
  150790. "muls r7, r6, r7\n\t"
  150791. #elif defined(__clang__)
  150792. "muls r7, r6\n\t"
  150793. #else
  150794. "mul r7, r6\n\t"
  150795. #endif
  150796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150797. "adds r5, r5, r7\n\t"
  150798. #else
  150799. "add r5, r5, r7\n\t"
  150800. #endif
  150801. #ifdef WOLFSSL_KEIL
  150802. "adcs r3, r3, %[r]\n\t"
  150803. #elif defined(__clang__)
  150804. "adcs r3, %[r]\n\t"
  150805. #else
  150806. "adc r3, %[r]\n\t"
  150807. #endif
  150808. #ifdef WOLFSSL_KEIL
  150809. "adcs r4, r4, %[r]\n\t"
  150810. #elif defined(__clang__)
  150811. "adcs r4, %[r]\n\t"
  150812. #else
  150813. "adc r4, %[r]\n\t"
  150814. #endif
  150815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150816. "lsrs r7, %[b], #16\n\t"
  150817. #else
  150818. "lsr r7, %[b], #16\n\t"
  150819. #endif
  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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150857. "lsrs r6, %[a], #16\n\t"
  150858. #else
  150859. "lsr r6, %[a], #16\n\t"
  150860. #endif
  150861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150862. "lsrs r7, %[b], #16\n\t"
  150863. #else
  150864. "lsr r7, %[b], #16\n\t"
  150865. #endif
  150866. #ifdef WOLFSSL_KEIL
  150867. "muls r7, r6, r7\n\t"
  150868. #elif defined(__clang__)
  150869. "muls r7, r6\n\t"
  150870. #else
  150871. "mul r7, r6\n\t"
  150872. #endif
  150873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150874. "adds r3, r3, r7\n\t"
  150875. #else
  150876. "add r3, r3, r7\n\t"
  150877. #endif
  150878. #ifdef WOLFSSL_KEIL
  150879. "adcs r4, r4, %[r]\n\t"
  150880. #elif defined(__clang__)
  150881. "adcs r4, %[r]\n\t"
  150882. #else
  150883. "adc r4, %[r]\n\t"
  150884. #endif
  150885. "uxth r7, %[b]\n\t"
  150886. #ifdef WOLFSSL_KEIL
  150887. "muls r6, r7, r6\n\t"
  150888. #elif defined(__clang__)
  150889. "muls r6, r7\n\t"
  150890. #else
  150891. "mul r6, r7\n\t"
  150892. #endif
  150893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150894. "lsrs r7, r6, #16\n\t"
  150895. #else
  150896. "lsr r7, r6, #16\n\t"
  150897. #endif
  150898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150899. "lsls r6, r6, #16\n\t"
  150900. #else
  150901. "lsl r6, r6, #16\n\t"
  150902. #endif
  150903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150904. "adds r5, r5, r6\n\t"
  150905. #else
  150906. "add r5, r5, r6\n\t"
  150907. #endif
  150908. #ifdef WOLFSSL_KEIL
  150909. "adcs r3, r3, r7\n\t"
  150910. #elif defined(__clang__)
  150911. "adcs r3, r7\n\t"
  150912. #else
  150913. "adc r3, r7\n\t"
  150914. #endif
  150915. #ifdef WOLFSSL_KEIL
  150916. "adcs r4, r4, %[r]\n\t"
  150917. #elif defined(__clang__)
  150918. "adcs r4, %[r]\n\t"
  150919. #else
  150920. "adc r4, %[r]\n\t"
  150921. #endif
  150922. "# A[11] * B[15]\n\t"
  150923. "mov %[a], r9\n\t"
  150924. "mov %[b], r10\n\t"
  150925. "ldr %[a], [%[a], #44]\n\t"
  150926. "ldr %[b], [%[b], #60]\n\t"
  150927. "uxth r6, %[a]\n\t"
  150928. "uxth r7, %[b]\n\t"
  150929. #ifdef WOLFSSL_KEIL
  150930. "muls r7, r6, r7\n\t"
  150931. #elif defined(__clang__)
  150932. "muls r7, r6\n\t"
  150933. #else
  150934. "mul r7, r6\n\t"
  150935. #endif
  150936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150937. "adds r5, r5, r7\n\t"
  150938. #else
  150939. "add r5, r5, r7\n\t"
  150940. #endif
  150941. #ifdef WOLFSSL_KEIL
  150942. "adcs r3, r3, %[r]\n\t"
  150943. #elif defined(__clang__)
  150944. "adcs r3, %[r]\n\t"
  150945. #else
  150946. "adc r3, %[r]\n\t"
  150947. #endif
  150948. #ifdef WOLFSSL_KEIL
  150949. "adcs r4, r4, %[r]\n\t"
  150950. #elif defined(__clang__)
  150951. "adcs r4, %[r]\n\t"
  150952. #else
  150953. "adc r4, %[r]\n\t"
  150954. #endif
  150955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150956. "lsrs r7, %[b], #16\n\t"
  150957. #else
  150958. "lsr r7, %[b], #16\n\t"
  150959. #endif
  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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150997. "lsrs r6, %[a], #16\n\t"
  150998. #else
  150999. "lsr r6, %[a], #16\n\t"
  151000. #endif
  151001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151002. "lsrs r7, %[b], #16\n\t"
  151003. #else
  151004. "lsr r7, %[b], #16\n\t"
  151005. #endif
  151006. #ifdef WOLFSSL_KEIL
  151007. "muls r7, r6, r7\n\t"
  151008. #elif defined(__clang__)
  151009. "muls r7, r6\n\t"
  151010. #else
  151011. "mul r7, r6\n\t"
  151012. #endif
  151013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151014. "adds r3, r3, r7\n\t"
  151015. #else
  151016. "add r3, r3, r7\n\t"
  151017. #endif
  151018. #ifdef WOLFSSL_KEIL
  151019. "adcs r4, r4, %[r]\n\t"
  151020. #elif defined(__clang__)
  151021. "adcs r4, %[r]\n\t"
  151022. #else
  151023. "adc r4, %[r]\n\t"
  151024. #endif
  151025. "uxth r7, %[b]\n\t"
  151026. #ifdef WOLFSSL_KEIL
  151027. "muls r6, r7, r6\n\t"
  151028. #elif defined(__clang__)
  151029. "muls r6, r7\n\t"
  151030. #else
  151031. "mul r6, r7\n\t"
  151032. #endif
  151033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151034. "lsrs r7, r6, #16\n\t"
  151035. #else
  151036. "lsr r7, r6, #16\n\t"
  151037. #endif
  151038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151039. "lsls r6, r6, #16\n\t"
  151040. #else
  151041. "lsl r6, r6, #16\n\t"
  151042. #endif
  151043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151044. "adds r5, r5, r6\n\t"
  151045. #else
  151046. "add r5, r5, r6\n\t"
  151047. #endif
  151048. #ifdef WOLFSSL_KEIL
  151049. "adcs r3, r3, r7\n\t"
  151050. #elif defined(__clang__)
  151051. "adcs r3, r7\n\t"
  151052. #else
  151053. "adc r3, r7\n\t"
  151054. #endif
  151055. #ifdef WOLFSSL_KEIL
  151056. "adcs r4, r4, %[r]\n\t"
  151057. #elif defined(__clang__)
  151058. "adcs r4, %[r]\n\t"
  151059. #else
  151060. "adc r4, %[r]\n\t"
  151061. #endif
  151062. "mov %[r], r8\n\t"
  151063. "str r5, [%[r], #104]\n\t"
  151064. "movs %[r], #0\n\t"
  151065. "# A[12] * B[15]\n\t"
  151066. "movs r5, #0\n\t"
  151067. "mov %[a], r9\n\t"
  151068. "mov %[b], r10\n\t"
  151069. "ldr %[a], [%[a], #48]\n\t"
  151070. "ldr %[b], [%[b], #60]\n\t"
  151071. "uxth r6, %[a]\n\t"
  151072. "uxth r7, %[b]\n\t"
  151073. #ifdef WOLFSSL_KEIL
  151074. "muls r7, r6, r7\n\t"
  151075. #elif defined(__clang__)
  151076. "muls r7, r6\n\t"
  151077. #else
  151078. "mul r7, r6\n\t"
  151079. #endif
  151080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151081. "adds r3, r3, r7\n\t"
  151082. #else
  151083. "add r3, r3, r7\n\t"
  151084. #endif
  151085. #ifdef WOLFSSL_KEIL
  151086. "adcs r4, r4, %[r]\n\t"
  151087. #elif defined(__clang__)
  151088. "adcs r4, %[r]\n\t"
  151089. #else
  151090. "adc r4, %[r]\n\t"
  151091. #endif
  151092. #ifdef WOLFSSL_KEIL
  151093. "adcs r5, r5, %[r]\n\t"
  151094. #elif defined(__clang__)
  151095. "adcs r5, %[r]\n\t"
  151096. #else
  151097. "adc r5, %[r]\n\t"
  151098. #endif
  151099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151100. "lsrs r7, %[b], #16\n\t"
  151101. #else
  151102. "lsr r7, %[b], #16\n\t"
  151103. #endif
  151104. #ifdef WOLFSSL_KEIL
  151105. "muls r6, r7, r6\n\t"
  151106. #elif defined(__clang__)
  151107. "muls r6, r7\n\t"
  151108. #else
  151109. "mul r6, r7\n\t"
  151110. #endif
  151111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151112. "lsrs r7, r6, #16\n\t"
  151113. #else
  151114. "lsr r7, r6, #16\n\t"
  151115. #endif
  151116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151117. "lsls r6, r6, #16\n\t"
  151118. #else
  151119. "lsl r6, r6, #16\n\t"
  151120. #endif
  151121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151122. "adds r3, r3, r6\n\t"
  151123. #else
  151124. "add r3, r3, r6\n\t"
  151125. #endif
  151126. #ifdef WOLFSSL_KEIL
  151127. "adcs r4, r4, r7\n\t"
  151128. #elif defined(__clang__)
  151129. "adcs r4, r7\n\t"
  151130. #else
  151131. "adc r4, r7\n\t"
  151132. #endif
  151133. #ifdef WOLFSSL_KEIL
  151134. "adcs r5, r5, %[r]\n\t"
  151135. #elif defined(__clang__)
  151136. "adcs r5, %[r]\n\t"
  151137. #else
  151138. "adc r5, %[r]\n\t"
  151139. #endif
  151140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151141. "lsrs r6, %[a], #16\n\t"
  151142. #else
  151143. "lsr r6, %[a], #16\n\t"
  151144. #endif
  151145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151146. "lsrs r7, %[b], #16\n\t"
  151147. #else
  151148. "lsr r7, %[b], #16\n\t"
  151149. #endif
  151150. #ifdef WOLFSSL_KEIL
  151151. "muls r7, r6, r7\n\t"
  151152. #elif defined(__clang__)
  151153. "muls r7, r6\n\t"
  151154. #else
  151155. "mul r7, r6\n\t"
  151156. #endif
  151157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151158. "adds r4, r4, r7\n\t"
  151159. #else
  151160. "add r4, r4, r7\n\t"
  151161. #endif
  151162. #ifdef WOLFSSL_KEIL
  151163. "adcs r5, r5, %[r]\n\t"
  151164. #elif defined(__clang__)
  151165. "adcs r5, %[r]\n\t"
  151166. #else
  151167. "adc r5, %[r]\n\t"
  151168. #endif
  151169. "uxth r7, %[b]\n\t"
  151170. #ifdef WOLFSSL_KEIL
  151171. "muls r6, r7, r6\n\t"
  151172. #elif defined(__clang__)
  151173. "muls r6, r7\n\t"
  151174. #else
  151175. "mul r6, r7\n\t"
  151176. #endif
  151177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151178. "lsrs r7, r6, #16\n\t"
  151179. #else
  151180. "lsr r7, r6, #16\n\t"
  151181. #endif
  151182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151183. "lsls r6, r6, #16\n\t"
  151184. #else
  151185. "lsl r6, r6, #16\n\t"
  151186. #endif
  151187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151188. "adds r3, r3, r6\n\t"
  151189. #else
  151190. "add r3, r3, r6\n\t"
  151191. #endif
  151192. #ifdef WOLFSSL_KEIL
  151193. "adcs r4, r4, r7\n\t"
  151194. #elif defined(__clang__)
  151195. "adcs r4, r7\n\t"
  151196. #else
  151197. "adc r4, r7\n\t"
  151198. #endif
  151199. #ifdef WOLFSSL_KEIL
  151200. "adcs r5, r5, %[r]\n\t"
  151201. #elif defined(__clang__)
  151202. "adcs r5, %[r]\n\t"
  151203. #else
  151204. "adc r5, %[r]\n\t"
  151205. #endif
  151206. "# A[13] * B[14]\n\t"
  151207. "mov %[a], r9\n\t"
  151208. "mov %[b], r10\n\t"
  151209. "ldr %[a], [%[a], #52]\n\t"
  151210. "ldr %[b], [%[b], #56]\n\t"
  151211. "uxth r6, %[a]\n\t"
  151212. "uxth r7, %[b]\n\t"
  151213. #ifdef WOLFSSL_KEIL
  151214. "muls r7, r6, r7\n\t"
  151215. #elif defined(__clang__)
  151216. "muls r7, r6\n\t"
  151217. #else
  151218. "mul r7, r6\n\t"
  151219. #endif
  151220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151221. "adds r3, r3, r7\n\t"
  151222. #else
  151223. "add r3, r3, r7\n\t"
  151224. #endif
  151225. #ifdef WOLFSSL_KEIL
  151226. "adcs r4, r4, %[r]\n\t"
  151227. #elif defined(__clang__)
  151228. "adcs r4, %[r]\n\t"
  151229. #else
  151230. "adc r4, %[r]\n\t"
  151231. #endif
  151232. #ifdef WOLFSSL_KEIL
  151233. "adcs r5, r5, %[r]\n\t"
  151234. #elif defined(__clang__)
  151235. "adcs r5, %[r]\n\t"
  151236. #else
  151237. "adc r5, %[r]\n\t"
  151238. #endif
  151239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151240. "lsrs r7, %[b], #16\n\t"
  151241. #else
  151242. "lsr r7, %[b], #16\n\t"
  151243. #endif
  151244. #ifdef WOLFSSL_KEIL
  151245. "muls r6, r7, r6\n\t"
  151246. #elif defined(__clang__)
  151247. "muls r6, r7\n\t"
  151248. #else
  151249. "mul r6, r7\n\t"
  151250. #endif
  151251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151252. "lsrs r7, r6, #16\n\t"
  151253. #else
  151254. "lsr r7, r6, #16\n\t"
  151255. #endif
  151256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151257. "lsls r6, r6, #16\n\t"
  151258. #else
  151259. "lsl r6, r6, #16\n\t"
  151260. #endif
  151261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151262. "adds r3, r3, r6\n\t"
  151263. #else
  151264. "add r3, r3, r6\n\t"
  151265. #endif
  151266. #ifdef WOLFSSL_KEIL
  151267. "adcs r4, r4, r7\n\t"
  151268. #elif defined(__clang__)
  151269. "adcs r4, r7\n\t"
  151270. #else
  151271. "adc r4, r7\n\t"
  151272. #endif
  151273. #ifdef WOLFSSL_KEIL
  151274. "adcs r5, r5, %[r]\n\t"
  151275. #elif defined(__clang__)
  151276. "adcs r5, %[r]\n\t"
  151277. #else
  151278. "adc r5, %[r]\n\t"
  151279. #endif
  151280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151281. "lsrs r6, %[a], #16\n\t"
  151282. #else
  151283. "lsr r6, %[a], #16\n\t"
  151284. #endif
  151285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151286. "lsrs r7, %[b], #16\n\t"
  151287. #else
  151288. "lsr r7, %[b], #16\n\t"
  151289. #endif
  151290. #ifdef WOLFSSL_KEIL
  151291. "muls r7, r6, r7\n\t"
  151292. #elif defined(__clang__)
  151293. "muls r7, r6\n\t"
  151294. #else
  151295. "mul r7, r6\n\t"
  151296. #endif
  151297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151298. "adds r4, r4, r7\n\t"
  151299. #else
  151300. "add r4, r4, r7\n\t"
  151301. #endif
  151302. #ifdef WOLFSSL_KEIL
  151303. "adcs r5, r5, %[r]\n\t"
  151304. #elif defined(__clang__)
  151305. "adcs r5, %[r]\n\t"
  151306. #else
  151307. "adc r5, %[r]\n\t"
  151308. #endif
  151309. "uxth r7, %[b]\n\t"
  151310. #ifdef WOLFSSL_KEIL
  151311. "muls r6, r7, r6\n\t"
  151312. #elif defined(__clang__)
  151313. "muls r6, r7\n\t"
  151314. #else
  151315. "mul r6, r7\n\t"
  151316. #endif
  151317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151318. "lsrs r7, r6, #16\n\t"
  151319. #else
  151320. "lsr r7, r6, #16\n\t"
  151321. #endif
  151322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151323. "lsls r6, r6, #16\n\t"
  151324. #else
  151325. "lsl r6, r6, #16\n\t"
  151326. #endif
  151327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151328. "adds r3, r3, r6\n\t"
  151329. #else
  151330. "add r3, r3, r6\n\t"
  151331. #endif
  151332. #ifdef WOLFSSL_KEIL
  151333. "adcs r4, r4, r7\n\t"
  151334. #elif defined(__clang__)
  151335. "adcs r4, r7\n\t"
  151336. #else
  151337. "adc r4, r7\n\t"
  151338. #endif
  151339. #ifdef WOLFSSL_KEIL
  151340. "adcs r5, r5, %[r]\n\t"
  151341. #elif defined(__clang__)
  151342. "adcs r5, %[r]\n\t"
  151343. #else
  151344. "adc r5, %[r]\n\t"
  151345. #endif
  151346. "# A[14] * B[13]\n\t"
  151347. "mov %[a], r9\n\t"
  151348. "mov %[b], r10\n\t"
  151349. "ldr %[a], [%[a], #56]\n\t"
  151350. "ldr %[b], [%[b], #52]\n\t"
  151351. "uxth r6, %[a]\n\t"
  151352. "uxth r7, %[b]\n\t"
  151353. #ifdef WOLFSSL_KEIL
  151354. "muls r7, r6, r7\n\t"
  151355. #elif defined(__clang__)
  151356. "muls r7, r6\n\t"
  151357. #else
  151358. "mul r7, r6\n\t"
  151359. #endif
  151360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151361. "adds r3, r3, r7\n\t"
  151362. #else
  151363. "add r3, r3, r7\n\t"
  151364. #endif
  151365. #ifdef WOLFSSL_KEIL
  151366. "adcs r4, r4, %[r]\n\t"
  151367. #elif defined(__clang__)
  151368. "adcs r4, %[r]\n\t"
  151369. #else
  151370. "adc r4, %[r]\n\t"
  151371. #endif
  151372. #ifdef WOLFSSL_KEIL
  151373. "adcs r5, r5, %[r]\n\t"
  151374. #elif defined(__clang__)
  151375. "adcs r5, %[r]\n\t"
  151376. #else
  151377. "adc r5, %[r]\n\t"
  151378. #endif
  151379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151380. "lsrs r7, %[b], #16\n\t"
  151381. #else
  151382. "lsr r7, %[b], #16\n\t"
  151383. #endif
  151384. #ifdef WOLFSSL_KEIL
  151385. "muls r6, r7, r6\n\t"
  151386. #elif defined(__clang__)
  151387. "muls r6, r7\n\t"
  151388. #else
  151389. "mul r6, r7\n\t"
  151390. #endif
  151391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151392. "lsrs r7, r6, #16\n\t"
  151393. #else
  151394. "lsr r7, r6, #16\n\t"
  151395. #endif
  151396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151397. "lsls r6, r6, #16\n\t"
  151398. #else
  151399. "lsl r6, r6, #16\n\t"
  151400. #endif
  151401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151402. "adds r3, r3, r6\n\t"
  151403. #else
  151404. "add r3, r3, r6\n\t"
  151405. #endif
  151406. #ifdef WOLFSSL_KEIL
  151407. "adcs r4, r4, r7\n\t"
  151408. #elif defined(__clang__)
  151409. "adcs r4, r7\n\t"
  151410. #else
  151411. "adc r4, r7\n\t"
  151412. #endif
  151413. #ifdef WOLFSSL_KEIL
  151414. "adcs r5, r5, %[r]\n\t"
  151415. #elif defined(__clang__)
  151416. "adcs r5, %[r]\n\t"
  151417. #else
  151418. "adc r5, %[r]\n\t"
  151419. #endif
  151420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151421. "lsrs r6, %[a], #16\n\t"
  151422. #else
  151423. "lsr r6, %[a], #16\n\t"
  151424. #endif
  151425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151426. "lsrs r7, %[b], #16\n\t"
  151427. #else
  151428. "lsr r7, %[b], #16\n\t"
  151429. #endif
  151430. #ifdef WOLFSSL_KEIL
  151431. "muls r7, r6, r7\n\t"
  151432. #elif defined(__clang__)
  151433. "muls r7, r6\n\t"
  151434. #else
  151435. "mul r7, r6\n\t"
  151436. #endif
  151437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151438. "adds r4, r4, r7\n\t"
  151439. #else
  151440. "add r4, r4, r7\n\t"
  151441. #endif
  151442. #ifdef WOLFSSL_KEIL
  151443. "adcs r5, r5, %[r]\n\t"
  151444. #elif defined(__clang__)
  151445. "adcs r5, %[r]\n\t"
  151446. #else
  151447. "adc r5, %[r]\n\t"
  151448. #endif
  151449. "uxth r7, %[b]\n\t"
  151450. #ifdef WOLFSSL_KEIL
  151451. "muls r6, r7, r6\n\t"
  151452. #elif defined(__clang__)
  151453. "muls r6, r7\n\t"
  151454. #else
  151455. "mul r6, r7\n\t"
  151456. #endif
  151457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151458. "lsrs r7, r6, #16\n\t"
  151459. #else
  151460. "lsr r7, r6, #16\n\t"
  151461. #endif
  151462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151463. "lsls r6, r6, #16\n\t"
  151464. #else
  151465. "lsl r6, r6, #16\n\t"
  151466. #endif
  151467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151468. "adds r3, r3, r6\n\t"
  151469. #else
  151470. "add r3, r3, r6\n\t"
  151471. #endif
  151472. #ifdef WOLFSSL_KEIL
  151473. "adcs r4, r4, r7\n\t"
  151474. #elif defined(__clang__)
  151475. "adcs r4, r7\n\t"
  151476. #else
  151477. "adc r4, r7\n\t"
  151478. #endif
  151479. #ifdef WOLFSSL_KEIL
  151480. "adcs r5, r5, %[r]\n\t"
  151481. #elif defined(__clang__)
  151482. "adcs r5, %[r]\n\t"
  151483. #else
  151484. "adc r5, %[r]\n\t"
  151485. #endif
  151486. "# A[15] * B[12]\n\t"
  151487. "mov %[a], r9\n\t"
  151488. "mov %[b], r10\n\t"
  151489. "ldr %[a], [%[a], #60]\n\t"
  151490. "ldr %[b], [%[b], #48]\n\t"
  151491. "uxth r6, %[a]\n\t"
  151492. "uxth r7, %[b]\n\t"
  151493. #ifdef WOLFSSL_KEIL
  151494. "muls r7, r6, r7\n\t"
  151495. #elif defined(__clang__)
  151496. "muls r7, r6\n\t"
  151497. #else
  151498. "mul r7, r6\n\t"
  151499. #endif
  151500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151501. "adds r3, r3, r7\n\t"
  151502. #else
  151503. "add r3, r3, r7\n\t"
  151504. #endif
  151505. #ifdef WOLFSSL_KEIL
  151506. "adcs r4, r4, %[r]\n\t"
  151507. #elif defined(__clang__)
  151508. "adcs r4, %[r]\n\t"
  151509. #else
  151510. "adc r4, %[r]\n\t"
  151511. #endif
  151512. #ifdef WOLFSSL_KEIL
  151513. "adcs r5, r5, %[r]\n\t"
  151514. #elif defined(__clang__)
  151515. "adcs r5, %[r]\n\t"
  151516. #else
  151517. "adc r5, %[r]\n\t"
  151518. #endif
  151519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151520. "lsrs r7, %[b], #16\n\t"
  151521. #else
  151522. "lsr r7, %[b], #16\n\t"
  151523. #endif
  151524. #ifdef WOLFSSL_KEIL
  151525. "muls r6, r7, r6\n\t"
  151526. #elif defined(__clang__)
  151527. "muls r6, r7\n\t"
  151528. #else
  151529. "mul r6, r7\n\t"
  151530. #endif
  151531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151532. "lsrs r7, r6, #16\n\t"
  151533. #else
  151534. "lsr r7, r6, #16\n\t"
  151535. #endif
  151536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151537. "lsls r6, r6, #16\n\t"
  151538. #else
  151539. "lsl r6, r6, #16\n\t"
  151540. #endif
  151541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151542. "adds r3, r3, r6\n\t"
  151543. #else
  151544. "add r3, r3, r6\n\t"
  151545. #endif
  151546. #ifdef WOLFSSL_KEIL
  151547. "adcs r4, r4, r7\n\t"
  151548. #elif defined(__clang__)
  151549. "adcs r4, r7\n\t"
  151550. #else
  151551. "adc r4, r7\n\t"
  151552. #endif
  151553. #ifdef WOLFSSL_KEIL
  151554. "adcs r5, r5, %[r]\n\t"
  151555. #elif defined(__clang__)
  151556. "adcs r5, %[r]\n\t"
  151557. #else
  151558. "adc r5, %[r]\n\t"
  151559. #endif
  151560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151561. "lsrs r6, %[a], #16\n\t"
  151562. #else
  151563. "lsr r6, %[a], #16\n\t"
  151564. #endif
  151565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151566. "lsrs r7, %[b], #16\n\t"
  151567. #else
  151568. "lsr r7, %[b], #16\n\t"
  151569. #endif
  151570. #ifdef WOLFSSL_KEIL
  151571. "muls r7, r6, r7\n\t"
  151572. #elif defined(__clang__)
  151573. "muls r7, r6\n\t"
  151574. #else
  151575. "mul r7, r6\n\t"
  151576. #endif
  151577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151578. "adds r4, r4, r7\n\t"
  151579. #else
  151580. "add r4, r4, r7\n\t"
  151581. #endif
  151582. #ifdef WOLFSSL_KEIL
  151583. "adcs r5, r5, %[r]\n\t"
  151584. #elif defined(__clang__)
  151585. "adcs r5, %[r]\n\t"
  151586. #else
  151587. "adc r5, %[r]\n\t"
  151588. #endif
  151589. "uxth r7, %[b]\n\t"
  151590. #ifdef WOLFSSL_KEIL
  151591. "muls r6, r7, r6\n\t"
  151592. #elif defined(__clang__)
  151593. "muls r6, r7\n\t"
  151594. #else
  151595. "mul r6, r7\n\t"
  151596. #endif
  151597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151598. "lsrs r7, r6, #16\n\t"
  151599. #else
  151600. "lsr r7, r6, #16\n\t"
  151601. #endif
  151602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151603. "lsls r6, r6, #16\n\t"
  151604. #else
  151605. "lsl r6, r6, #16\n\t"
  151606. #endif
  151607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151608. "adds r3, r3, r6\n\t"
  151609. #else
  151610. "add r3, r3, r6\n\t"
  151611. #endif
  151612. #ifdef WOLFSSL_KEIL
  151613. "adcs r4, r4, r7\n\t"
  151614. #elif defined(__clang__)
  151615. "adcs r4, r7\n\t"
  151616. #else
  151617. "adc r4, r7\n\t"
  151618. #endif
  151619. #ifdef WOLFSSL_KEIL
  151620. "adcs r5, r5, %[r]\n\t"
  151621. #elif defined(__clang__)
  151622. "adcs r5, %[r]\n\t"
  151623. #else
  151624. "adc r5, %[r]\n\t"
  151625. #endif
  151626. "mov %[r], r8\n\t"
  151627. "str r3, [%[r], #108]\n\t"
  151628. "movs %[r], #0\n\t"
  151629. "# A[15] * B[13]\n\t"
  151630. "movs r3, #0\n\t"
  151631. "mov %[a], r9\n\t"
  151632. "mov %[b], r10\n\t"
  151633. "ldr %[a], [%[a], #60]\n\t"
  151634. "ldr %[b], [%[b], #52]\n\t"
  151635. "uxth r6, %[a]\n\t"
  151636. "uxth r7, %[b]\n\t"
  151637. #ifdef WOLFSSL_KEIL
  151638. "muls r7, r6, r7\n\t"
  151639. #elif defined(__clang__)
  151640. "muls r7, r6\n\t"
  151641. #else
  151642. "mul r7, r6\n\t"
  151643. #endif
  151644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151645. "adds r4, r4, r7\n\t"
  151646. #else
  151647. "add r4, r4, r7\n\t"
  151648. #endif
  151649. #ifdef WOLFSSL_KEIL
  151650. "adcs r5, r5, %[r]\n\t"
  151651. #elif defined(__clang__)
  151652. "adcs r5, %[r]\n\t"
  151653. #else
  151654. "adc r5, %[r]\n\t"
  151655. #endif
  151656. #ifdef WOLFSSL_KEIL
  151657. "adcs r3, r3, %[r]\n\t"
  151658. #elif defined(__clang__)
  151659. "adcs r3, %[r]\n\t"
  151660. #else
  151661. "adc r3, %[r]\n\t"
  151662. #endif
  151663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151664. "lsrs r7, %[b], #16\n\t"
  151665. #else
  151666. "lsr r7, %[b], #16\n\t"
  151667. #endif
  151668. #ifdef WOLFSSL_KEIL
  151669. "muls r6, r7, r6\n\t"
  151670. #elif defined(__clang__)
  151671. "muls r6, r7\n\t"
  151672. #else
  151673. "mul r6, r7\n\t"
  151674. #endif
  151675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151676. "lsrs r7, r6, #16\n\t"
  151677. #else
  151678. "lsr r7, r6, #16\n\t"
  151679. #endif
  151680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151681. "lsls r6, r6, #16\n\t"
  151682. #else
  151683. "lsl r6, r6, #16\n\t"
  151684. #endif
  151685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151686. "adds r4, r4, r6\n\t"
  151687. #else
  151688. "add r4, r4, r6\n\t"
  151689. #endif
  151690. #ifdef WOLFSSL_KEIL
  151691. "adcs r5, r5, r7\n\t"
  151692. #elif defined(__clang__)
  151693. "adcs r5, r7\n\t"
  151694. #else
  151695. "adc r5, r7\n\t"
  151696. #endif
  151697. #ifdef WOLFSSL_KEIL
  151698. "adcs r3, r3, %[r]\n\t"
  151699. #elif defined(__clang__)
  151700. "adcs r3, %[r]\n\t"
  151701. #else
  151702. "adc r3, %[r]\n\t"
  151703. #endif
  151704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151705. "lsrs r6, %[a], #16\n\t"
  151706. #else
  151707. "lsr r6, %[a], #16\n\t"
  151708. #endif
  151709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151710. "lsrs r7, %[b], #16\n\t"
  151711. #else
  151712. "lsr r7, %[b], #16\n\t"
  151713. #endif
  151714. #ifdef WOLFSSL_KEIL
  151715. "muls r7, r6, r7\n\t"
  151716. #elif defined(__clang__)
  151717. "muls r7, r6\n\t"
  151718. #else
  151719. "mul r7, r6\n\t"
  151720. #endif
  151721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151722. "adds r5, r5, r7\n\t"
  151723. #else
  151724. "add r5, r5, r7\n\t"
  151725. #endif
  151726. #ifdef WOLFSSL_KEIL
  151727. "adcs r3, r3, %[r]\n\t"
  151728. #elif defined(__clang__)
  151729. "adcs r3, %[r]\n\t"
  151730. #else
  151731. "adc r3, %[r]\n\t"
  151732. #endif
  151733. "uxth r7, %[b]\n\t"
  151734. #ifdef WOLFSSL_KEIL
  151735. "muls r6, r7, r6\n\t"
  151736. #elif defined(__clang__)
  151737. "muls r6, r7\n\t"
  151738. #else
  151739. "mul r6, r7\n\t"
  151740. #endif
  151741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151742. "lsrs r7, r6, #16\n\t"
  151743. #else
  151744. "lsr r7, r6, #16\n\t"
  151745. #endif
  151746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151747. "lsls r6, r6, #16\n\t"
  151748. #else
  151749. "lsl r6, r6, #16\n\t"
  151750. #endif
  151751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151752. "adds r4, r4, r6\n\t"
  151753. #else
  151754. "add r4, r4, r6\n\t"
  151755. #endif
  151756. #ifdef WOLFSSL_KEIL
  151757. "adcs r5, r5, r7\n\t"
  151758. #elif defined(__clang__)
  151759. "adcs r5, r7\n\t"
  151760. #else
  151761. "adc r5, r7\n\t"
  151762. #endif
  151763. #ifdef WOLFSSL_KEIL
  151764. "adcs r3, r3, %[r]\n\t"
  151765. #elif defined(__clang__)
  151766. "adcs r3, %[r]\n\t"
  151767. #else
  151768. "adc r3, %[r]\n\t"
  151769. #endif
  151770. "# A[14] * B[14]\n\t"
  151771. "mov %[a], r9\n\t"
  151772. "mov %[b], r10\n\t"
  151773. "ldr %[a], [%[a], #56]\n\t"
  151774. "ldr %[b], [%[b], #56]\n\t"
  151775. "uxth r6, %[a]\n\t"
  151776. "uxth r7, %[b]\n\t"
  151777. #ifdef WOLFSSL_KEIL
  151778. "muls r7, r6, r7\n\t"
  151779. #elif defined(__clang__)
  151780. "muls r7, r6\n\t"
  151781. #else
  151782. "mul r7, r6\n\t"
  151783. #endif
  151784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151785. "adds r4, r4, r7\n\t"
  151786. #else
  151787. "add r4, r4, r7\n\t"
  151788. #endif
  151789. #ifdef WOLFSSL_KEIL
  151790. "adcs r5, r5, %[r]\n\t"
  151791. #elif defined(__clang__)
  151792. "adcs r5, %[r]\n\t"
  151793. #else
  151794. "adc r5, %[r]\n\t"
  151795. #endif
  151796. #ifdef WOLFSSL_KEIL
  151797. "adcs r3, r3, %[r]\n\t"
  151798. #elif defined(__clang__)
  151799. "adcs r3, %[r]\n\t"
  151800. #else
  151801. "adc r3, %[r]\n\t"
  151802. #endif
  151803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151804. "lsrs r7, %[b], #16\n\t"
  151805. #else
  151806. "lsr r7, %[b], #16\n\t"
  151807. #endif
  151808. #ifdef WOLFSSL_KEIL
  151809. "muls r6, r7, r6\n\t"
  151810. #elif defined(__clang__)
  151811. "muls r6, r7\n\t"
  151812. #else
  151813. "mul r6, r7\n\t"
  151814. #endif
  151815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151816. "lsrs r7, r6, #16\n\t"
  151817. #else
  151818. "lsr r7, r6, #16\n\t"
  151819. #endif
  151820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151821. "lsls r6, r6, #16\n\t"
  151822. #else
  151823. "lsl r6, r6, #16\n\t"
  151824. #endif
  151825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151826. "adds r4, r4, r6\n\t"
  151827. #else
  151828. "add r4, r4, r6\n\t"
  151829. #endif
  151830. #ifdef WOLFSSL_KEIL
  151831. "adcs r5, r5, r7\n\t"
  151832. #elif defined(__clang__)
  151833. "adcs r5, r7\n\t"
  151834. #else
  151835. "adc r5, r7\n\t"
  151836. #endif
  151837. #ifdef WOLFSSL_KEIL
  151838. "adcs r3, r3, %[r]\n\t"
  151839. #elif defined(__clang__)
  151840. "adcs r3, %[r]\n\t"
  151841. #else
  151842. "adc r3, %[r]\n\t"
  151843. #endif
  151844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151845. "lsrs r6, %[a], #16\n\t"
  151846. #else
  151847. "lsr r6, %[a], #16\n\t"
  151848. #endif
  151849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151850. "lsrs r7, %[b], #16\n\t"
  151851. #else
  151852. "lsr r7, %[b], #16\n\t"
  151853. #endif
  151854. #ifdef WOLFSSL_KEIL
  151855. "muls r7, r6, r7\n\t"
  151856. #elif defined(__clang__)
  151857. "muls r7, r6\n\t"
  151858. #else
  151859. "mul r7, r6\n\t"
  151860. #endif
  151861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151862. "adds r5, r5, r7\n\t"
  151863. #else
  151864. "add r5, r5, r7\n\t"
  151865. #endif
  151866. #ifdef WOLFSSL_KEIL
  151867. "adcs r3, r3, %[r]\n\t"
  151868. #elif defined(__clang__)
  151869. "adcs r3, %[r]\n\t"
  151870. #else
  151871. "adc r3, %[r]\n\t"
  151872. #endif
  151873. "uxth r7, %[b]\n\t"
  151874. #ifdef WOLFSSL_KEIL
  151875. "muls r6, r7, r6\n\t"
  151876. #elif defined(__clang__)
  151877. "muls r6, r7\n\t"
  151878. #else
  151879. "mul r6, r7\n\t"
  151880. #endif
  151881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151882. "lsrs r7, r6, #16\n\t"
  151883. #else
  151884. "lsr r7, r6, #16\n\t"
  151885. #endif
  151886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151887. "lsls r6, r6, #16\n\t"
  151888. #else
  151889. "lsl r6, r6, #16\n\t"
  151890. #endif
  151891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151892. "adds r4, r4, r6\n\t"
  151893. #else
  151894. "add r4, r4, r6\n\t"
  151895. #endif
  151896. #ifdef WOLFSSL_KEIL
  151897. "adcs r5, r5, r7\n\t"
  151898. #elif defined(__clang__)
  151899. "adcs r5, r7\n\t"
  151900. #else
  151901. "adc r5, r7\n\t"
  151902. #endif
  151903. #ifdef WOLFSSL_KEIL
  151904. "adcs r3, r3, %[r]\n\t"
  151905. #elif defined(__clang__)
  151906. "adcs r3, %[r]\n\t"
  151907. #else
  151908. "adc r3, %[r]\n\t"
  151909. #endif
  151910. "# A[13] * B[15]\n\t"
  151911. "mov %[a], r9\n\t"
  151912. "mov %[b], r10\n\t"
  151913. "ldr %[a], [%[a], #52]\n\t"
  151914. "ldr %[b], [%[b], #60]\n\t"
  151915. "uxth r6, %[a]\n\t"
  151916. "uxth r7, %[b]\n\t"
  151917. #ifdef WOLFSSL_KEIL
  151918. "muls r7, r6, r7\n\t"
  151919. #elif defined(__clang__)
  151920. "muls r7, r6\n\t"
  151921. #else
  151922. "mul r7, r6\n\t"
  151923. #endif
  151924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151925. "adds r4, r4, r7\n\t"
  151926. #else
  151927. "add r4, r4, r7\n\t"
  151928. #endif
  151929. #ifdef WOLFSSL_KEIL
  151930. "adcs r5, r5, %[r]\n\t"
  151931. #elif defined(__clang__)
  151932. "adcs r5, %[r]\n\t"
  151933. #else
  151934. "adc r5, %[r]\n\t"
  151935. #endif
  151936. #ifdef WOLFSSL_KEIL
  151937. "adcs r3, r3, %[r]\n\t"
  151938. #elif defined(__clang__)
  151939. "adcs r3, %[r]\n\t"
  151940. #else
  151941. "adc r3, %[r]\n\t"
  151942. #endif
  151943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151944. "lsrs r7, %[b], #16\n\t"
  151945. #else
  151946. "lsr r7, %[b], #16\n\t"
  151947. #endif
  151948. #ifdef WOLFSSL_KEIL
  151949. "muls r6, r7, r6\n\t"
  151950. #elif defined(__clang__)
  151951. "muls r6, r7\n\t"
  151952. #else
  151953. "mul r6, r7\n\t"
  151954. #endif
  151955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151956. "lsrs r7, r6, #16\n\t"
  151957. #else
  151958. "lsr r7, r6, #16\n\t"
  151959. #endif
  151960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151961. "lsls r6, r6, #16\n\t"
  151962. #else
  151963. "lsl r6, r6, #16\n\t"
  151964. #endif
  151965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151966. "adds r4, r4, r6\n\t"
  151967. #else
  151968. "add r4, r4, r6\n\t"
  151969. #endif
  151970. #ifdef WOLFSSL_KEIL
  151971. "adcs r5, r5, r7\n\t"
  151972. #elif defined(__clang__)
  151973. "adcs r5, r7\n\t"
  151974. #else
  151975. "adc r5, r7\n\t"
  151976. #endif
  151977. #ifdef WOLFSSL_KEIL
  151978. "adcs r3, r3, %[r]\n\t"
  151979. #elif defined(__clang__)
  151980. "adcs r3, %[r]\n\t"
  151981. #else
  151982. "adc r3, %[r]\n\t"
  151983. #endif
  151984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151985. "lsrs r6, %[a], #16\n\t"
  151986. #else
  151987. "lsr r6, %[a], #16\n\t"
  151988. #endif
  151989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151990. "lsrs r7, %[b], #16\n\t"
  151991. #else
  151992. "lsr r7, %[b], #16\n\t"
  151993. #endif
  151994. #ifdef WOLFSSL_KEIL
  151995. "muls r7, r6, r7\n\t"
  151996. #elif defined(__clang__)
  151997. "muls r7, r6\n\t"
  151998. #else
  151999. "mul r7, r6\n\t"
  152000. #endif
  152001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152002. "adds r5, r5, r7\n\t"
  152003. #else
  152004. "add r5, r5, r7\n\t"
  152005. #endif
  152006. #ifdef WOLFSSL_KEIL
  152007. "adcs r3, r3, %[r]\n\t"
  152008. #elif defined(__clang__)
  152009. "adcs r3, %[r]\n\t"
  152010. #else
  152011. "adc r3, %[r]\n\t"
  152012. #endif
  152013. "uxth r7, %[b]\n\t"
  152014. #ifdef WOLFSSL_KEIL
  152015. "muls r6, r7, r6\n\t"
  152016. #elif defined(__clang__)
  152017. "muls r6, r7\n\t"
  152018. #else
  152019. "mul r6, r7\n\t"
  152020. #endif
  152021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152022. "lsrs r7, r6, #16\n\t"
  152023. #else
  152024. "lsr r7, r6, #16\n\t"
  152025. #endif
  152026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152027. "lsls r6, r6, #16\n\t"
  152028. #else
  152029. "lsl r6, r6, #16\n\t"
  152030. #endif
  152031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152032. "adds r4, r4, r6\n\t"
  152033. #else
  152034. "add r4, r4, r6\n\t"
  152035. #endif
  152036. #ifdef WOLFSSL_KEIL
  152037. "adcs r5, r5, r7\n\t"
  152038. #elif defined(__clang__)
  152039. "adcs r5, r7\n\t"
  152040. #else
  152041. "adc r5, r7\n\t"
  152042. #endif
  152043. #ifdef WOLFSSL_KEIL
  152044. "adcs r3, r3, %[r]\n\t"
  152045. #elif defined(__clang__)
  152046. "adcs r3, %[r]\n\t"
  152047. #else
  152048. "adc r3, %[r]\n\t"
  152049. #endif
  152050. "mov %[r], r8\n\t"
  152051. "str r4, [%[r], #112]\n\t"
  152052. "movs %[r], #0\n\t"
  152053. "# A[14] * B[15]\n\t"
  152054. "movs r4, #0\n\t"
  152055. "mov %[a], r9\n\t"
  152056. "mov %[b], r10\n\t"
  152057. "ldr %[a], [%[a], #56]\n\t"
  152058. "ldr %[b], [%[b], #60]\n\t"
  152059. "uxth r6, %[a]\n\t"
  152060. "uxth r7, %[b]\n\t"
  152061. #ifdef WOLFSSL_KEIL
  152062. "muls r7, r6, r7\n\t"
  152063. #elif defined(__clang__)
  152064. "muls r7, r6\n\t"
  152065. #else
  152066. "mul r7, r6\n\t"
  152067. #endif
  152068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152069. "adds r5, r5, r7\n\t"
  152070. #else
  152071. "add r5, r5, r7\n\t"
  152072. #endif
  152073. #ifdef WOLFSSL_KEIL
  152074. "adcs r3, r3, %[r]\n\t"
  152075. #elif defined(__clang__)
  152076. "adcs r3, %[r]\n\t"
  152077. #else
  152078. "adc r3, %[r]\n\t"
  152079. #endif
  152080. #ifdef WOLFSSL_KEIL
  152081. "adcs r4, r4, %[r]\n\t"
  152082. #elif defined(__clang__)
  152083. "adcs r4, %[r]\n\t"
  152084. #else
  152085. "adc r4, %[r]\n\t"
  152086. #endif
  152087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152088. "lsrs r7, %[b], #16\n\t"
  152089. #else
  152090. "lsr r7, %[b], #16\n\t"
  152091. #endif
  152092. #ifdef WOLFSSL_KEIL
  152093. "muls r6, r7, r6\n\t"
  152094. #elif defined(__clang__)
  152095. "muls r6, r7\n\t"
  152096. #else
  152097. "mul r6, r7\n\t"
  152098. #endif
  152099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152100. "lsrs r7, r6, #16\n\t"
  152101. #else
  152102. "lsr r7, r6, #16\n\t"
  152103. #endif
  152104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152105. "lsls r6, r6, #16\n\t"
  152106. #else
  152107. "lsl r6, r6, #16\n\t"
  152108. #endif
  152109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152110. "adds r5, r5, r6\n\t"
  152111. #else
  152112. "add r5, r5, r6\n\t"
  152113. #endif
  152114. #ifdef WOLFSSL_KEIL
  152115. "adcs r3, r3, r7\n\t"
  152116. #elif defined(__clang__)
  152117. "adcs r3, r7\n\t"
  152118. #else
  152119. "adc r3, r7\n\t"
  152120. #endif
  152121. #ifdef WOLFSSL_KEIL
  152122. "adcs r4, r4, %[r]\n\t"
  152123. #elif defined(__clang__)
  152124. "adcs r4, %[r]\n\t"
  152125. #else
  152126. "adc r4, %[r]\n\t"
  152127. #endif
  152128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152129. "lsrs r6, %[a], #16\n\t"
  152130. #else
  152131. "lsr r6, %[a], #16\n\t"
  152132. #endif
  152133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152134. "lsrs r7, %[b], #16\n\t"
  152135. #else
  152136. "lsr r7, %[b], #16\n\t"
  152137. #endif
  152138. #ifdef WOLFSSL_KEIL
  152139. "muls r7, r6, r7\n\t"
  152140. #elif defined(__clang__)
  152141. "muls r7, r6\n\t"
  152142. #else
  152143. "mul r7, r6\n\t"
  152144. #endif
  152145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152146. "adds r3, r3, r7\n\t"
  152147. #else
  152148. "add r3, r3, r7\n\t"
  152149. #endif
  152150. #ifdef WOLFSSL_KEIL
  152151. "adcs r4, r4, %[r]\n\t"
  152152. #elif defined(__clang__)
  152153. "adcs r4, %[r]\n\t"
  152154. #else
  152155. "adc r4, %[r]\n\t"
  152156. #endif
  152157. "uxth r7, %[b]\n\t"
  152158. #ifdef WOLFSSL_KEIL
  152159. "muls r6, r7, r6\n\t"
  152160. #elif defined(__clang__)
  152161. "muls r6, r7\n\t"
  152162. #else
  152163. "mul r6, r7\n\t"
  152164. #endif
  152165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152166. "lsrs r7, r6, #16\n\t"
  152167. #else
  152168. "lsr r7, r6, #16\n\t"
  152169. #endif
  152170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152171. "lsls r6, r6, #16\n\t"
  152172. #else
  152173. "lsl r6, r6, #16\n\t"
  152174. #endif
  152175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152176. "adds r5, r5, r6\n\t"
  152177. #else
  152178. "add r5, r5, r6\n\t"
  152179. #endif
  152180. #ifdef WOLFSSL_KEIL
  152181. "adcs r3, r3, r7\n\t"
  152182. #elif defined(__clang__)
  152183. "adcs r3, r7\n\t"
  152184. #else
  152185. "adc r3, r7\n\t"
  152186. #endif
  152187. #ifdef WOLFSSL_KEIL
  152188. "adcs r4, r4, %[r]\n\t"
  152189. #elif defined(__clang__)
  152190. "adcs r4, %[r]\n\t"
  152191. #else
  152192. "adc r4, %[r]\n\t"
  152193. #endif
  152194. "# A[15] * B[14]\n\t"
  152195. "mov %[a], r9\n\t"
  152196. "mov %[b], r10\n\t"
  152197. "ldr %[a], [%[a], #60]\n\t"
  152198. "ldr %[b], [%[b], #56]\n\t"
  152199. "uxth r6, %[a]\n\t"
  152200. "uxth r7, %[b]\n\t"
  152201. #ifdef WOLFSSL_KEIL
  152202. "muls r7, r6, r7\n\t"
  152203. #elif defined(__clang__)
  152204. "muls r7, r6\n\t"
  152205. #else
  152206. "mul r7, r6\n\t"
  152207. #endif
  152208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152209. "adds r5, r5, r7\n\t"
  152210. #else
  152211. "add r5, r5, r7\n\t"
  152212. #endif
  152213. #ifdef WOLFSSL_KEIL
  152214. "adcs r3, r3, %[r]\n\t"
  152215. #elif defined(__clang__)
  152216. "adcs r3, %[r]\n\t"
  152217. #else
  152218. "adc r3, %[r]\n\t"
  152219. #endif
  152220. #ifdef WOLFSSL_KEIL
  152221. "adcs r4, r4, %[r]\n\t"
  152222. #elif defined(__clang__)
  152223. "adcs r4, %[r]\n\t"
  152224. #else
  152225. "adc r4, %[r]\n\t"
  152226. #endif
  152227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152228. "lsrs r7, %[b], #16\n\t"
  152229. #else
  152230. "lsr r7, %[b], #16\n\t"
  152231. #endif
  152232. #ifdef WOLFSSL_KEIL
  152233. "muls r6, r7, r6\n\t"
  152234. #elif defined(__clang__)
  152235. "muls r6, r7\n\t"
  152236. #else
  152237. "mul r6, r7\n\t"
  152238. #endif
  152239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152240. "lsrs r7, r6, #16\n\t"
  152241. #else
  152242. "lsr r7, r6, #16\n\t"
  152243. #endif
  152244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152245. "lsls r6, r6, #16\n\t"
  152246. #else
  152247. "lsl r6, r6, #16\n\t"
  152248. #endif
  152249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152250. "adds r5, r5, r6\n\t"
  152251. #else
  152252. "add r5, r5, r6\n\t"
  152253. #endif
  152254. #ifdef WOLFSSL_KEIL
  152255. "adcs r3, r3, r7\n\t"
  152256. #elif defined(__clang__)
  152257. "adcs r3, r7\n\t"
  152258. #else
  152259. "adc r3, r7\n\t"
  152260. #endif
  152261. #ifdef WOLFSSL_KEIL
  152262. "adcs r4, r4, %[r]\n\t"
  152263. #elif defined(__clang__)
  152264. "adcs r4, %[r]\n\t"
  152265. #else
  152266. "adc r4, %[r]\n\t"
  152267. #endif
  152268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152269. "lsrs r6, %[a], #16\n\t"
  152270. #else
  152271. "lsr r6, %[a], #16\n\t"
  152272. #endif
  152273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152274. "lsrs r7, %[b], #16\n\t"
  152275. #else
  152276. "lsr r7, %[b], #16\n\t"
  152277. #endif
  152278. #ifdef WOLFSSL_KEIL
  152279. "muls r7, r6, r7\n\t"
  152280. #elif defined(__clang__)
  152281. "muls r7, r6\n\t"
  152282. #else
  152283. "mul r7, r6\n\t"
  152284. #endif
  152285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152286. "adds r3, r3, r7\n\t"
  152287. #else
  152288. "add r3, r3, r7\n\t"
  152289. #endif
  152290. #ifdef WOLFSSL_KEIL
  152291. "adcs r4, r4, %[r]\n\t"
  152292. #elif defined(__clang__)
  152293. "adcs r4, %[r]\n\t"
  152294. #else
  152295. "adc r4, %[r]\n\t"
  152296. #endif
  152297. "uxth r7, %[b]\n\t"
  152298. #ifdef WOLFSSL_KEIL
  152299. "muls r6, r7, r6\n\t"
  152300. #elif defined(__clang__)
  152301. "muls r6, r7\n\t"
  152302. #else
  152303. "mul r6, r7\n\t"
  152304. #endif
  152305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152306. "lsrs r7, r6, #16\n\t"
  152307. #else
  152308. "lsr r7, r6, #16\n\t"
  152309. #endif
  152310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152311. "lsls r6, r6, #16\n\t"
  152312. #else
  152313. "lsl r6, r6, #16\n\t"
  152314. #endif
  152315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152316. "adds r5, r5, r6\n\t"
  152317. #else
  152318. "add r5, r5, r6\n\t"
  152319. #endif
  152320. #ifdef WOLFSSL_KEIL
  152321. "adcs r3, r3, r7\n\t"
  152322. #elif defined(__clang__)
  152323. "adcs r3, r7\n\t"
  152324. #else
  152325. "adc r3, r7\n\t"
  152326. #endif
  152327. #ifdef WOLFSSL_KEIL
  152328. "adcs r4, r4, %[r]\n\t"
  152329. #elif defined(__clang__)
  152330. "adcs r4, %[r]\n\t"
  152331. #else
  152332. "adc r4, %[r]\n\t"
  152333. #endif
  152334. "mov %[r], r8\n\t"
  152335. "str r5, [%[r], #116]\n\t"
  152336. "movs %[r], #0\n\t"
  152337. "# A[15] * B[15]\n\t"
  152338. "mov %[a], r9\n\t"
  152339. "mov %[b], r10\n\t"
  152340. "ldr %[a], [%[a], #60]\n\t"
  152341. "ldr %[b], [%[b], #60]\n\t"
  152342. "uxth r6, %[a]\n\t"
  152343. "uxth r7, %[b]\n\t"
  152344. #ifdef WOLFSSL_KEIL
  152345. "muls r7, r6, r7\n\t"
  152346. #elif defined(__clang__)
  152347. "muls r7, r6\n\t"
  152348. #else
  152349. "mul r7, r6\n\t"
  152350. #endif
  152351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152352. "adds r3, r3, r7\n\t"
  152353. #else
  152354. "add r3, r3, r7\n\t"
  152355. #endif
  152356. #ifdef WOLFSSL_KEIL
  152357. "adcs r4, r4, %[r]\n\t"
  152358. #elif defined(__clang__)
  152359. "adcs r4, %[r]\n\t"
  152360. #else
  152361. "adc r4, %[r]\n\t"
  152362. #endif
  152363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152364. "lsrs r7, %[b], #16\n\t"
  152365. #else
  152366. "lsr r7, %[b], #16\n\t"
  152367. #endif
  152368. #ifdef WOLFSSL_KEIL
  152369. "muls r6, r7, r6\n\t"
  152370. #elif defined(__clang__)
  152371. "muls r6, r7\n\t"
  152372. #else
  152373. "mul r6, r7\n\t"
  152374. #endif
  152375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152376. "lsrs r7, r6, #16\n\t"
  152377. #else
  152378. "lsr r7, r6, #16\n\t"
  152379. #endif
  152380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152381. "lsls r6, r6, #16\n\t"
  152382. #else
  152383. "lsl r6, r6, #16\n\t"
  152384. #endif
  152385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152386. "adds r3, r3, r6\n\t"
  152387. #else
  152388. "add r3, r3, r6\n\t"
  152389. #endif
  152390. #ifdef WOLFSSL_KEIL
  152391. "adcs r4, r4, r7\n\t"
  152392. #elif defined(__clang__)
  152393. "adcs r4, r7\n\t"
  152394. #else
  152395. "adc r4, r7\n\t"
  152396. #endif
  152397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152398. "lsrs r6, %[a], #16\n\t"
  152399. #else
  152400. "lsr r6, %[a], #16\n\t"
  152401. #endif
  152402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152403. "lsrs r7, %[b], #16\n\t"
  152404. #else
  152405. "lsr r7, %[b], #16\n\t"
  152406. #endif
  152407. #ifdef WOLFSSL_KEIL
  152408. "muls r7, r6, r7\n\t"
  152409. #elif defined(__clang__)
  152410. "muls r7, r6\n\t"
  152411. #else
  152412. "mul r7, r6\n\t"
  152413. #endif
  152414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152415. "adds r4, r4, r7\n\t"
  152416. #else
  152417. "add r4, r4, r7\n\t"
  152418. #endif
  152419. "uxth r7, %[b]\n\t"
  152420. #ifdef WOLFSSL_KEIL
  152421. "muls r6, r7, r6\n\t"
  152422. #elif defined(__clang__)
  152423. "muls r6, r7\n\t"
  152424. #else
  152425. "mul r6, r7\n\t"
  152426. #endif
  152427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152428. "lsrs r7, r6, #16\n\t"
  152429. #else
  152430. "lsr r7, r6, #16\n\t"
  152431. #endif
  152432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152433. "lsls r6, r6, #16\n\t"
  152434. #else
  152435. "lsl r6, r6, #16\n\t"
  152436. #endif
  152437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152438. "adds r3, r3, r6\n\t"
  152439. #else
  152440. "add r3, r3, r6\n\t"
  152441. #endif
  152442. #ifdef WOLFSSL_KEIL
  152443. "adcs r4, r4, r7\n\t"
  152444. #elif defined(__clang__)
  152445. "adcs r4, r7\n\t"
  152446. #else
  152447. "adc r4, r7\n\t"
  152448. #endif
  152449. "mov %[r], r8\n\t"
  152450. "str r3, [%[r], #120]\n\t"
  152451. "str r4, [%[r], #124]\n\t"
  152452. "pop {r3, r4, r5, r6}\n\t"
  152453. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  152454. "pop {r3, r4, r5, r6}\n\t"
  152455. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  152456. "pop {r3, r4, r5, r6}\n\t"
  152457. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  152458. "pop {r3, r4, r5, r6}\n\t"
  152459. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  152460. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  152461. :
  152462. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  152463. );
  152464. }
  152465. #endif /* !WOLFSSL_SP_LARGE_CODE */
  152466. #ifndef WOLFSSL_SP_LARGE_CODE
  152467. /* Square a and put result in r. (r = a * a)
  152468. *
  152469. * r A single precision integer.
  152470. * a A single precision integer.
  152471. */
  152472. SP_NOINLINE static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a)
  152473. {
  152474. __asm__ __volatile__ (
  152475. "movs r3, #0\n\t"
  152476. "movs r4, #0\n\t"
  152477. "movs r5, #0\n\t"
  152478. "mov r8, r3\n\t"
  152479. "mov r11, %[r]\n\t"
  152480. "movs r6, #0x80\n\t"
  152481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152482. "negs r6, r6\n\t"
  152483. #else
  152484. "neg r6, r6\n\t"
  152485. #endif
  152486. "add sp, sp, r6\n\t"
  152487. "mov r10, sp\n\t"
  152488. "mov r9, %[a]\n\t"
  152489. "\n"
  152490. "L_sp_1024_sqr_16_words_%=:\n\t"
  152491. "movs %[r], #0\n\t"
  152492. "movs r6, #60\n\t"
  152493. "mov %[a], r8\n\t"
  152494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152495. "subs %[a], %[a], r6\n\t"
  152496. #else
  152497. "sub %[a], %[a], r6\n\t"
  152498. #endif
  152499. #ifdef WOLFSSL_KEIL
  152500. "sbcs r6, r6, r6\n\t"
  152501. #elif defined(__clang__)
  152502. "sbcs r6, r6\n\t"
  152503. #else
  152504. "sbc r6, r6\n\t"
  152505. #endif
  152506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152507. "mvns r6, r6\n\t"
  152508. #else
  152509. "mvn r6, r6\n\t"
  152510. #endif
  152511. #ifdef WOLFSSL_KEIL
  152512. "ands %[a], %[a], r6\n\t"
  152513. #elif defined(__clang__)
  152514. "ands %[a], r6\n\t"
  152515. #else
  152516. "and %[a], r6\n\t"
  152517. #endif
  152518. "mov r2, r8\n\t"
  152519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152520. "subs r2, r2, %[a]\n\t"
  152521. #else
  152522. "sub r2, r2, %[a]\n\t"
  152523. #endif
  152524. "add %[a], %[a], r9\n\t"
  152525. "add r2, r2, r9\n\t"
  152526. "\n"
  152527. "L_sp_1024_sqr_16_mul_%=:\n\t"
  152528. "cmp r2, %[a]\n\t"
  152529. "beq L_sp_1024_sqr_16_sqr_%=\n\t"
  152530. "# Multiply * 2: Start\n\t"
  152531. "ldrh r6, [%[a]]\n\t"
  152532. "ldrh r7, [r2]\n\t"
  152533. #ifdef WOLFSSL_KEIL
  152534. "muls r7, r6, r7\n\t"
  152535. #elif defined(__clang__)
  152536. "muls r7, r6\n\t"
  152537. #else
  152538. "mul r7, r6\n\t"
  152539. #endif
  152540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152541. "adds r3, r3, r7\n\t"
  152542. #else
  152543. "add r3, r3, r7\n\t"
  152544. #endif
  152545. #ifdef WOLFSSL_KEIL
  152546. "adcs r4, r4, %[r]\n\t"
  152547. #elif defined(__clang__)
  152548. "adcs r4, %[r]\n\t"
  152549. #else
  152550. "adc r4, %[r]\n\t"
  152551. #endif
  152552. #ifdef WOLFSSL_KEIL
  152553. "adcs r5, r5, %[r]\n\t"
  152554. #elif defined(__clang__)
  152555. "adcs r5, %[r]\n\t"
  152556. #else
  152557. "adc r5, %[r]\n\t"
  152558. #endif
  152559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152560. "adds r3, r3, r7\n\t"
  152561. #else
  152562. "add r3, r3, r7\n\t"
  152563. #endif
  152564. #ifdef WOLFSSL_KEIL
  152565. "adcs r4, r4, %[r]\n\t"
  152566. #elif defined(__clang__)
  152567. "adcs r4, %[r]\n\t"
  152568. #else
  152569. "adc r4, %[r]\n\t"
  152570. #endif
  152571. #ifdef WOLFSSL_KEIL
  152572. "adcs r5, r5, %[r]\n\t"
  152573. #elif defined(__clang__)
  152574. "adcs r5, %[r]\n\t"
  152575. #else
  152576. "adc r5, %[r]\n\t"
  152577. #endif
  152578. "ldr r7, [r2]\n\t"
  152579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152580. "lsrs r7, r7, #16\n\t"
  152581. #else
  152582. "lsr r7, r7, #16\n\t"
  152583. #endif
  152584. #ifdef WOLFSSL_KEIL
  152585. "muls r6, r7, r6\n\t"
  152586. #elif defined(__clang__)
  152587. "muls r6, r7\n\t"
  152588. #else
  152589. "mul r6, r7\n\t"
  152590. #endif
  152591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152592. "lsrs r7, r6, #16\n\t"
  152593. #else
  152594. "lsr r7, r6, #16\n\t"
  152595. #endif
  152596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152597. "lsls r6, r6, #16\n\t"
  152598. #else
  152599. "lsl r6, r6, #16\n\t"
  152600. #endif
  152601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152602. "adds r3, r3, r6\n\t"
  152603. #else
  152604. "add r3, r3, r6\n\t"
  152605. #endif
  152606. #ifdef WOLFSSL_KEIL
  152607. "adcs r4, r4, r7\n\t"
  152608. #elif defined(__clang__)
  152609. "adcs r4, r7\n\t"
  152610. #else
  152611. "adc r4, r7\n\t"
  152612. #endif
  152613. #ifdef WOLFSSL_KEIL
  152614. "adcs r5, r5, %[r]\n\t"
  152615. #elif defined(__clang__)
  152616. "adcs r5, %[r]\n\t"
  152617. #else
  152618. "adc r5, %[r]\n\t"
  152619. #endif
  152620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152621. "adds r3, r3, r6\n\t"
  152622. #else
  152623. "add r3, r3, r6\n\t"
  152624. #endif
  152625. #ifdef WOLFSSL_KEIL
  152626. "adcs r4, r4, r7\n\t"
  152627. #elif defined(__clang__)
  152628. "adcs r4, r7\n\t"
  152629. #else
  152630. "adc r4, r7\n\t"
  152631. #endif
  152632. #ifdef WOLFSSL_KEIL
  152633. "adcs r5, r5, %[r]\n\t"
  152634. #elif defined(__clang__)
  152635. "adcs r5, %[r]\n\t"
  152636. #else
  152637. "adc r5, %[r]\n\t"
  152638. #endif
  152639. "ldr r6, [%[a]]\n\t"
  152640. "ldr r7, [r2]\n\t"
  152641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152642. "lsrs r6, r6, #16\n\t"
  152643. #else
  152644. "lsr r6, r6, #16\n\t"
  152645. #endif
  152646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152647. "lsrs r7, r7, #16\n\t"
  152648. #else
  152649. "lsr r7, r7, #16\n\t"
  152650. #endif
  152651. #ifdef WOLFSSL_KEIL
  152652. "muls r7, r6, r7\n\t"
  152653. #elif defined(__clang__)
  152654. "muls r7, r6\n\t"
  152655. #else
  152656. "mul r7, r6\n\t"
  152657. #endif
  152658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152659. "adds r4, r4, r7\n\t"
  152660. #else
  152661. "add r4, r4, r7\n\t"
  152662. #endif
  152663. #ifdef WOLFSSL_KEIL
  152664. "adcs r5, r5, %[r]\n\t"
  152665. #elif defined(__clang__)
  152666. "adcs r5, %[r]\n\t"
  152667. #else
  152668. "adc r5, %[r]\n\t"
  152669. #endif
  152670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152671. "adds r4, r4, r7\n\t"
  152672. #else
  152673. "add r4, r4, r7\n\t"
  152674. #endif
  152675. #ifdef WOLFSSL_KEIL
  152676. "adcs r5, r5, %[r]\n\t"
  152677. #elif defined(__clang__)
  152678. "adcs r5, %[r]\n\t"
  152679. #else
  152680. "adc r5, %[r]\n\t"
  152681. #endif
  152682. "ldrh r7, [r2]\n\t"
  152683. #ifdef WOLFSSL_KEIL
  152684. "muls r6, r7, r6\n\t"
  152685. #elif defined(__clang__)
  152686. "muls r6, r7\n\t"
  152687. #else
  152688. "mul r6, r7\n\t"
  152689. #endif
  152690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152691. "lsrs r7, r6, #16\n\t"
  152692. #else
  152693. "lsr r7, r6, #16\n\t"
  152694. #endif
  152695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152696. "lsls r6, r6, #16\n\t"
  152697. #else
  152698. "lsl r6, r6, #16\n\t"
  152699. #endif
  152700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152701. "adds r3, r3, r6\n\t"
  152702. #else
  152703. "add r3, r3, r6\n\t"
  152704. #endif
  152705. #ifdef WOLFSSL_KEIL
  152706. "adcs r4, r4, r7\n\t"
  152707. #elif defined(__clang__)
  152708. "adcs r4, r7\n\t"
  152709. #else
  152710. "adc r4, r7\n\t"
  152711. #endif
  152712. #ifdef WOLFSSL_KEIL
  152713. "adcs r5, r5, %[r]\n\t"
  152714. #elif defined(__clang__)
  152715. "adcs r5, %[r]\n\t"
  152716. #else
  152717. "adc r5, %[r]\n\t"
  152718. #endif
  152719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152720. "adds r3, r3, r6\n\t"
  152721. #else
  152722. "add r3, r3, r6\n\t"
  152723. #endif
  152724. #ifdef WOLFSSL_KEIL
  152725. "adcs r4, r4, r7\n\t"
  152726. #elif defined(__clang__)
  152727. "adcs r4, r7\n\t"
  152728. #else
  152729. "adc r4, r7\n\t"
  152730. #endif
  152731. #ifdef WOLFSSL_KEIL
  152732. "adcs r5, r5, %[r]\n\t"
  152733. #elif defined(__clang__)
  152734. "adcs r5, %[r]\n\t"
  152735. #else
  152736. "adc r5, %[r]\n\t"
  152737. #endif
  152738. "# Multiply * 2: Done\n\t"
  152739. "bal L_sp_1024_sqr_16_done_sqr_%=\n\t"
  152740. "\n"
  152741. "L_sp_1024_sqr_16_sqr_%=:\n\t"
  152742. "mov r12, r2\n\t"
  152743. "ldr r2, [%[a]]\n\t"
  152744. "# Square: Start\n\t"
  152745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152746. "lsrs r7, r2, #16\n\t"
  152747. #else
  152748. "lsr r7, r2, #16\n\t"
  152749. #endif
  152750. "uxth r6, r2\n\t"
  152751. #ifdef WOLFSSL_KEIL
  152752. "muls r6, r6, r6\n\t"
  152753. #elif defined(__clang__)
  152754. "muls r6, r6\n\t"
  152755. #else
  152756. "mul r6, r6\n\t"
  152757. #endif
  152758. #ifdef WOLFSSL_KEIL
  152759. "muls r7, r7, r7\n\t"
  152760. #elif defined(__clang__)
  152761. "muls r7, r7\n\t"
  152762. #else
  152763. "mul r7, r7\n\t"
  152764. #endif
  152765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152766. "adds r3, r3, r6\n\t"
  152767. #else
  152768. "add r3, r3, r6\n\t"
  152769. #endif
  152770. #ifdef WOLFSSL_KEIL
  152771. "adcs r4, r4, r7\n\t"
  152772. #elif defined(__clang__)
  152773. "adcs r4, r7\n\t"
  152774. #else
  152775. "adc r4, r7\n\t"
  152776. #endif
  152777. #ifdef WOLFSSL_KEIL
  152778. "adcs r5, r5, %[r]\n\t"
  152779. #elif defined(__clang__)
  152780. "adcs r5, %[r]\n\t"
  152781. #else
  152782. "adc r5, %[r]\n\t"
  152783. #endif
  152784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152785. "lsrs r7, r2, #16\n\t"
  152786. #else
  152787. "lsr r7, r2, #16\n\t"
  152788. #endif
  152789. "uxth r6, r2\n\t"
  152790. #ifdef WOLFSSL_KEIL
  152791. "muls r6, r7, r6\n\t"
  152792. #elif defined(__clang__)
  152793. "muls r6, r7\n\t"
  152794. #else
  152795. "mul r6, r7\n\t"
  152796. #endif
  152797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152798. "lsrs r7, r6, #15\n\t"
  152799. #else
  152800. "lsr r7, r6, #15\n\t"
  152801. #endif
  152802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152803. "lsls r6, r6, #17\n\t"
  152804. #else
  152805. "lsl r6, r6, #17\n\t"
  152806. #endif
  152807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152808. "adds r3, r3, r6\n\t"
  152809. #else
  152810. "add r3, r3, r6\n\t"
  152811. #endif
  152812. #ifdef WOLFSSL_KEIL
  152813. "adcs r4, r4, r7\n\t"
  152814. #elif defined(__clang__)
  152815. "adcs r4, r7\n\t"
  152816. #else
  152817. "adc r4, r7\n\t"
  152818. #endif
  152819. #ifdef WOLFSSL_KEIL
  152820. "adcs r5, r5, %[r]\n\t"
  152821. #elif defined(__clang__)
  152822. "adcs r5, %[r]\n\t"
  152823. #else
  152824. "adc r5, %[r]\n\t"
  152825. #endif
  152826. "# Square: Done\n\t"
  152827. "mov r2, r12\n\t"
  152828. "\n"
  152829. "L_sp_1024_sqr_16_done_sqr_%=:\n\t"
  152830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152831. "adds %[a], %[a], #4\n\t"
  152832. #else
  152833. "add %[a], %[a], #4\n\t"
  152834. #endif
  152835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152836. "subs r2, r2, #4\n\t"
  152837. #else
  152838. "sub r2, r2, #4\n\t"
  152839. #endif
  152840. "movs r6, #0x40\n\t"
  152841. "add r6, r6, r9\n\t"
  152842. "cmp %[a], r6\n\t"
  152843. "beq L_sp_1024_sqr_16_done_mul_%=\n\t"
  152844. "cmp %[a], r2\n\t"
  152845. "bgt L_sp_1024_sqr_16_done_mul_%=\n\t"
  152846. "mov r7, r8\n\t"
  152847. "add r7, r7, r9\n\t"
  152848. "cmp %[a], r7\n\t"
  152849. "ble L_sp_1024_sqr_16_mul_%=\n\t"
  152850. "\n"
  152851. "L_sp_1024_sqr_16_done_mul_%=:\n\t"
  152852. "mov %[r], r10\n\t"
  152853. "mov r7, r8\n\t"
  152854. "str r3, [%[r], r7]\n\t"
  152855. "movs r3, r4\n\t"
  152856. "movs r4, r5\n\t"
  152857. "movs r5, #0\n\t"
  152858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152859. "adds r7, r7, #4\n\t"
  152860. #else
  152861. "add r7, r7, #4\n\t"
  152862. #endif
  152863. "mov r8, r7\n\t"
  152864. "movs r6, #0x78\n\t"
  152865. "cmp r7, r6\n\t"
  152866. "ble L_sp_1024_sqr_16_words_%=\n\t"
  152867. "mov %[a], r9\n\t"
  152868. "str r3, [%[r], r7]\n\t"
  152869. "mov %[r], r11\n\t"
  152870. "mov %[a], r10\n\t"
  152871. "movs r3, #0x7c\n\t"
  152872. "\n"
  152873. "L_sp_1024_sqr_16_store_%=:\n\t"
  152874. "ldr r6, [%[a], r3]\n\t"
  152875. "str r6, [%[r], r3]\n\t"
  152876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152877. "subs r3, r3, #4\n\t"
  152878. #else
  152879. "sub r3, r3, #4\n\t"
  152880. #endif
  152881. "bge L_sp_1024_sqr_16_store_%=\n\t"
  152882. "movs r6, #0x80\n\t"
  152883. "add sp, sp, r6\n\t"
  152884. : [r] "+r" (r), [a] "+r" (a)
  152885. :
  152886. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  152887. );
  152888. }
  152889. #else
  152890. /* Square a and put result in r. (r = a * a)
  152891. *
  152892. * r A single precision integer.
  152893. * a A single precision integer.
  152894. */
  152895. SP_NOINLINE static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a)
  152896. {
  152897. __asm__ __volatile__ (
  152898. "sub sp, sp, #0x40\n\t"
  152899. "mov r8, %[r]\n\t"
  152900. "mov r9, %[a]\n\t"
  152901. "movs %[r], #0\n\t"
  152902. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  152903. "mov r10, r2\n\t"
  152904. "mov r11, r3\n\t"
  152905. "mov r12, r4\n\t"
  152906. "mov lr, r5\n\t"
  152907. "mov %[a], r9\n\t"
  152908. "# A[0] * A[0]\n\t"
  152909. "movs r4, #0\n\t"
  152910. "mov r7, r10\n\t"
  152911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152912. "lsrs r6, r7, #16\n\t"
  152913. #else
  152914. "lsr r6, r7, #16\n\t"
  152915. #endif
  152916. "uxth r5, r7\n\t"
  152917. "movs r2, r5\n\t"
  152918. "movs r3, r6\n\t"
  152919. #ifdef WOLFSSL_KEIL
  152920. "muls r2, r2, r2\n\t"
  152921. #elif defined(__clang__)
  152922. "muls r2, r2\n\t"
  152923. #else
  152924. "mul r2, r2\n\t"
  152925. #endif
  152926. #ifdef WOLFSSL_KEIL
  152927. "muls r3, r3, r3\n\t"
  152928. #elif defined(__clang__)
  152929. "muls r3, r3\n\t"
  152930. #else
  152931. "mul r3, r3\n\t"
  152932. #endif
  152933. #ifdef WOLFSSL_KEIL
  152934. "muls r5, r6, r5\n\t"
  152935. #elif defined(__clang__)
  152936. "muls r5, r6\n\t"
  152937. #else
  152938. "mul r5, r6\n\t"
  152939. #endif
  152940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152941. "lsrs r6, r5, #15\n\t"
  152942. #else
  152943. "lsr r6, r5, #15\n\t"
  152944. #endif
  152945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152946. "lsls r5, r5, #17\n\t"
  152947. #else
  152948. "lsl r5, r5, #17\n\t"
  152949. #endif
  152950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152951. "adds r2, r2, r5\n\t"
  152952. #else
  152953. "add r2, r2, r5\n\t"
  152954. #endif
  152955. #ifdef WOLFSSL_KEIL
  152956. "adcs r3, r3, r6\n\t"
  152957. #elif defined(__clang__)
  152958. "adcs r3, r6\n\t"
  152959. #else
  152960. "adc r3, r6\n\t"
  152961. #endif
  152962. "str r2, [sp]\n\t"
  152963. "# A[1] * A[0]\n\t"
  152964. "movs r2, #0\n\t"
  152965. "mov %[a], r11\n\t"
  152966. "uxth r5, %[a]\n\t"
  152967. "uxth r6, r7\n\t"
  152968. #ifdef WOLFSSL_KEIL
  152969. "muls r6, r5, r6\n\t"
  152970. #elif defined(__clang__)
  152971. "muls r6, r5\n\t"
  152972. #else
  152973. "mul r6, r5\n\t"
  152974. #endif
  152975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152976. "adds r3, r3, r6\n\t"
  152977. #else
  152978. "add r3, r3, r6\n\t"
  152979. #endif
  152980. #ifdef WOLFSSL_KEIL
  152981. "adcs r4, r4, %[r]\n\t"
  152982. #elif defined(__clang__)
  152983. "adcs r4, %[r]\n\t"
  152984. #else
  152985. "adc r4, %[r]\n\t"
  152986. #endif
  152987. #ifdef WOLFSSL_KEIL
  152988. "adcs r2, r2, %[r]\n\t"
  152989. #elif defined(__clang__)
  152990. "adcs r2, %[r]\n\t"
  152991. #else
  152992. "adc r2, %[r]\n\t"
  152993. #endif
  152994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152995. "adds r3, r3, r6\n\t"
  152996. #else
  152997. "add r3, r3, r6\n\t"
  152998. #endif
  152999. #ifdef WOLFSSL_KEIL
  153000. "adcs r4, r4, %[r]\n\t"
  153001. #elif defined(__clang__)
  153002. "adcs r4, %[r]\n\t"
  153003. #else
  153004. "adc r4, %[r]\n\t"
  153005. #endif
  153006. #ifdef WOLFSSL_KEIL
  153007. "adcs r2, r2, %[r]\n\t"
  153008. #elif defined(__clang__)
  153009. "adcs r2, %[r]\n\t"
  153010. #else
  153011. "adc r2, %[r]\n\t"
  153012. #endif
  153013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153014. "lsrs r6, r7, #16\n\t"
  153015. #else
  153016. "lsr r6, r7, #16\n\t"
  153017. #endif
  153018. #ifdef WOLFSSL_KEIL
  153019. "muls r5, r6, r5\n\t"
  153020. #elif defined(__clang__)
  153021. "muls r5, r6\n\t"
  153022. #else
  153023. "mul r5, r6\n\t"
  153024. #endif
  153025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153026. "lsrs r6, r5, #16\n\t"
  153027. #else
  153028. "lsr r6, r5, #16\n\t"
  153029. #endif
  153030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153031. "lsls r5, r5, #16\n\t"
  153032. #else
  153033. "lsl r5, r5, #16\n\t"
  153034. #endif
  153035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153036. "adds r3, r3, r5\n\t"
  153037. #else
  153038. "add r3, r3, r5\n\t"
  153039. #endif
  153040. #ifdef WOLFSSL_KEIL
  153041. "adcs r4, r4, r6\n\t"
  153042. #elif defined(__clang__)
  153043. "adcs r4, r6\n\t"
  153044. #else
  153045. "adc r4, r6\n\t"
  153046. #endif
  153047. #ifdef WOLFSSL_KEIL
  153048. "adcs r2, r2, %[r]\n\t"
  153049. #elif defined(__clang__)
  153050. "adcs r2, %[r]\n\t"
  153051. #else
  153052. "adc r2, %[r]\n\t"
  153053. #endif
  153054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153055. "adds r3, r3, r5\n\t"
  153056. #else
  153057. "add r3, r3, r5\n\t"
  153058. #endif
  153059. #ifdef WOLFSSL_KEIL
  153060. "adcs r4, r4, r6\n\t"
  153061. #elif defined(__clang__)
  153062. "adcs r4, r6\n\t"
  153063. #else
  153064. "adc r4, r6\n\t"
  153065. #endif
  153066. #ifdef WOLFSSL_KEIL
  153067. "adcs r2, r2, %[r]\n\t"
  153068. #elif defined(__clang__)
  153069. "adcs r2, %[r]\n\t"
  153070. #else
  153071. "adc r2, %[r]\n\t"
  153072. #endif
  153073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153074. "lsrs r5, %[a], #16\n\t"
  153075. #else
  153076. "lsr r5, %[a], #16\n\t"
  153077. #endif
  153078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153079. "lsrs r6, r7, #16\n\t"
  153080. #else
  153081. "lsr r6, r7, #16\n\t"
  153082. #endif
  153083. #ifdef WOLFSSL_KEIL
  153084. "muls r6, r5, r6\n\t"
  153085. #elif defined(__clang__)
  153086. "muls r6, r5\n\t"
  153087. #else
  153088. "mul r6, r5\n\t"
  153089. #endif
  153090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153091. "adds r4, r4, r6\n\t"
  153092. #else
  153093. "add r4, r4, r6\n\t"
  153094. #endif
  153095. #ifdef WOLFSSL_KEIL
  153096. "adcs r2, r2, %[r]\n\t"
  153097. #elif defined(__clang__)
  153098. "adcs r2, %[r]\n\t"
  153099. #else
  153100. "adc r2, %[r]\n\t"
  153101. #endif
  153102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153103. "adds r4, r4, r6\n\t"
  153104. #else
  153105. "add r4, r4, r6\n\t"
  153106. #endif
  153107. #ifdef WOLFSSL_KEIL
  153108. "adcs r2, r2, %[r]\n\t"
  153109. #elif defined(__clang__)
  153110. "adcs r2, %[r]\n\t"
  153111. #else
  153112. "adc r2, %[r]\n\t"
  153113. #endif
  153114. "uxth r6, r7\n\t"
  153115. #ifdef WOLFSSL_KEIL
  153116. "muls r5, r6, r5\n\t"
  153117. #elif defined(__clang__)
  153118. "muls r5, r6\n\t"
  153119. #else
  153120. "mul r5, r6\n\t"
  153121. #endif
  153122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153123. "lsrs r6, r5, #16\n\t"
  153124. #else
  153125. "lsr r6, r5, #16\n\t"
  153126. #endif
  153127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153128. "lsls r5, r5, #16\n\t"
  153129. #else
  153130. "lsl r5, r5, #16\n\t"
  153131. #endif
  153132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153133. "adds r3, r3, r5\n\t"
  153134. #else
  153135. "add r3, r3, r5\n\t"
  153136. #endif
  153137. #ifdef WOLFSSL_KEIL
  153138. "adcs r4, r4, r6\n\t"
  153139. #elif defined(__clang__)
  153140. "adcs r4, r6\n\t"
  153141. #else
  153142. "adc r4, r6\n\t"
  153143. #endif
  153144. #ifdef WOLFSSL_KEIL
  153145. "adcs r2, r2, %[r]\n\t"
  153146. #elif defined(__clang__)
  153147. "adcs r2, %[r]\n\t"
  153148. #else
  153149. "adc r2, %[r]\n\t"
  153150. #endif
  153151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153152. "adds r3, r3, r5\n\t"
  153153. #else
  153154. "add r3, r3, r5\n\t"
  153155. #endif
  153156. #ifdef WOLFSSL_KEIL
  153157. "adcs r4, r4, r6\n\t"
  153158. #elif defined(__clang__)
  153159. "adcs r4, r6\n\t"
  153160. #else
  153161. "adc r4, r6\n\t"
  153162. #endif
  153163. #ifdef WOLFSSL_KEIL
  153164. "adcs r2, r2, %[r]\n\t"
  153165. #elif defined(__clang__)
  153166. "adcs r2, %[r]\n\t"
  153167. #else
  153168. "adc r2, %[r]\n\t"
  153169. #endif
  153170. "str r3, [sp, #4]\n\t"
  153171. "# A[2] * A[0]\n\t"
  153172. "movs r3, #0\n\t"
  153173. "mov %[a], r9\n\t"
  153174. "mov %[a], r12\n\t"
  153175. "uxth r5, %[a]\n\t"
  153176. "uxth r6, r7\n\t"
  153177. #ifdef WOLFSSL_KEIL
  153178. "muls r6, r5, r6\n\t"
  153179. #elif defined(__clang__)
  153180. "muls r6, r5\n\t"
  153181. #else
  153182. "mul r6, r5\n\t"
  153183. #endif
  153184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153185. "adds r4, r4, r6\n\t"
  153186. #else
  153187. "add r4, r4, r6\n\t"
  153188. #endif
  153189. #ifdef WOLFSSL_KEIL
  153190. "adcs r2, r2, %[r]\n\t"
  153191. #elif defined(__clang__)
  153192. "adcs r2, %[r]\n\t"
  153193. #else
  153194. "adc r2, %[r]\n\t"
  153195. #endif
  153196. #ifdef WOLFSSL_KEIL
  153197. "adcs r3, r3, %[r]\n\t"
  153198. #elif defined(__clang__)
  153199. "adcs r3, %[r]\n\t"
  153200. #else
  153201. "adc r3, %[r]\n\t"
  153202. #endif
  153203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153204. "adds r4, r4, r6\n\t"
  153205. #else
  153206. "add r4, r4, r6\n\t"
  153207. #endif
  153208. #ifdef WOLFSSL_KEIL
  153209. "adcs r2, r2, %[r]\n\t"
  153210. #elif defined(__clang__)
  153211. "adcs r2, %[r]\n\t"
  153212. #else
  153213. "adc r2, %[r]\n\t"
  153214. #endif
  153215. #ifdef WOLFSSL_KEIL
  153216. "adcs r3, r3, %[r]\n\t"
  153217. #elif defined(__clang__)
  153218. "adcs r3, %[r]\n\t"
  153219. #else
  153220. "adc r3, %[r]\n\t"
  153221. #endif
  153222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153223. "lsrs r6, r7, #16\n\t"
  153224. #else
  153225. "lsr r6, r7, #16\n\t"
  153226. #endif
  153227. #ifdef WOLFSSL_KEIL
  153228. "muls r5, r6, r5\n\t"
  153229. #elif defined(__clang__)
  153230. "muls r5, r6\n\t"
  153231. #else
  153232. "mul r5, r6\n\t"
  153233. #endif
  153234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153235. "lsrs r6, r5, #16\n\t"
  153236. #else
  153237. "lsr r6, r5, #16\n\t"
  153238. #endif
  153239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153240. "lsls r5, r5, #16\n\t"
  153241. #else
  153242. "lsl r5, r5, #16\n\t"
  153243. #endif
  153244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153245. "adds r4, r4, r5\n\t"
  153246. #else
  153247. "add r4, r4, r5\n\t"
  153248. #endif
  153249. #ifdef WOLFSSL_KEIL
  153250. "adcs r2, r2, r6\n\t"
  153251. #elif defined(__clang__)
  153252. "adcs r2, r6\n\t"
  153253. #else
  153254. "adc r2, r6\n\t"
  153255. #endif
  153256. #ifdef WOLFSSL_KEIL
  153257. "adcs r3, r3, %[r]\n\t"
  153258. #elif defined(__clang__)
  153259. "adcs r3, %[r]\n\t"
  153260. #else
  153261. "adc r3, %[r]\n\t"
  153262. #endif
  153263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153264. "adds r4, r4, r5\n\t"
  153265. #else
  153266. "add r4, r4, r5\n\t"
  153267. #endif
  153268. #ifdef WOLFSSL_KEIL
  153269. "adcs r2, r2, r6\n\t"
  153270. #elif defined(__clang__)
  153271. "adcs r2, r6\n\t"
  153272. #else
  153273. "adc r2, r6\n\t"
  153274. #endif
  153275. #ifdef WOLFSSL_KEIL
  153276. "adcs r3, r3, %[r]\n\t"
  153277. #elif defined(__clang__)
  153278. "adcs r3, %[r]\n\t"
  153279. #else
  153280. "adc r3, %[r]\n\t"
  153281. #endif
  153282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153283. "lsrs r5, %[a], #16\n\t"
  153284. #else
  153285. "lsr r5, %[a], #16\n\t"
  153286. #endif
  153287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153288. "lsrs r6, r7, #16\n\t"
  153289. #else
  153290. "lsr r6, r7, #16\n\t"
  153291. #endif
  153292. #ifdef WOLFSSL_KEIL
  153293. "muls r6, r5, r6\n\t"
  153294. #elif defined(__clang__)
  153295. "muls r6, r5\n\t"
  153296. #else
  153297. "mul r6, r5\n\t"
  153298. #endif
  153299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153300. "adds r2, r2, r6\n\t"
  153301. #else
  153302. "add r2, r2, r6\n\t"
  153303. #endif
  153304. #ifdef WOLFSSL_KEIL
  153305. "adcs r3, r3, %[r]\n\t"
  153306. #elif defined(__clang__)
  153307. "adcs r3, %[r]\n\t"
  153308. #else
  153309. "adc r3, %[r]\n\t"
  153310. #endif
  153311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153312. "adds r2, r2, r6\n\t"
  153313. #else
  153314. "add r2, r2, r6\n\t"
  153315. #endif
  153316. #ifdef WOLFSSL_KEIL
  153317. "adcs r3, r3, %[r]\n\t"
  153318. #elif defined(__clang__)
  153319. "adcs r3, %[r]\n\t"
  153320. #else
  153321. "adc r3, %[r]\n\t"
  153322. #endif
  153323. "uxth r6, r7\n\t"
  153324. #ifdef WOLFSSL_KEIL
  153325. "muls r5, r6, r5\n\t"
  153326. #elif defined(__clang__)
  153327. "muls r5, r6\n\t"
  153328. #else
  153329. "mul r5, r6\n\t"
  153330. #endif
  153331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153332. "lsrs r6, r5, #16\n\t"
  153333. #else
  153334. "lsr r6, r5, #16\n\t"
  153335. #endif
  153336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153337. "lsls r5, r5, #16\n\t"
  153338. #else
  153339. "lsl r5, r5, #16\n\t"
  153340. #endif
  153341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153342. "adds r4, r4, r5\n\t"
  153343. #else
  153344. "add r4, r4, r5\n\t"
  153345. #endif
  153346. #ifdef WOLFSSL_KEIL
  153347. "adcs r2, r2, r6\n\t"
  153348. #elif defined(__clang__)
  153349. "adcs r2, r6\n\t"
  153350. #else
  153351. "adc r2, r6\n\t"
  153352. #endif
  153353. #ifdef WOLFSSL_KEIL
  153354. "adcs r3, r3, %[r]\n\t"
  153355. #elif defined(__clang__)
  153356. "adcs r3, %[r]\n\t"
  153357. #else
  153358. "adc r3, %[r]\n\t"
  153359. #endif
  153360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153361. "adds r4, r4, r5\n\t"
  153362. #else
  153363. "add r4, r4, r5\n\t"
  153364. #endif
  153365. #ifdef WOLFSSL_KEIL
  153366. "adcs r2, r2, r6\n\t"
  153367. #elif defined(__clang__)
  153368. "adcs r2, r6\n\t"
  153369. #else
  153370. "adc r2, r6\n\t"
  153371. #endif
  153372. #ifdef WOLFSSL_KEIL
  153373. "adcs r3, r3, %[r]\n\t"
  153374. #elif defined(__clang__)
  153375. "adcs r3, %[r]\n\t"
  153376. #else
  153377. "adc r3, %[r]\n\t"
  153378. #endif
  153379. "# A[1] * A[1]\n\t"
  153380. "mov r7, r11\n\t"
  153381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153382. "lsrs r6, r7, #16\n\t"
  153383. #else
  153384. "lsr r6, r7, #16\n\t"
  153385. #endif
  153386. "uxth r5, r7\n\t"
  153387. #ifdef WOLFSSL_KEIL
  153388. "muls r5, r5, r5\n\t"
  153389. #elif defined(__clang__)
  153390. "muls r5, r5\n\t"
  153391. #else
  153392. "mul r5, r5\n\t"
  153393. #endif
  153394. #ifdef WOLFSSL_KEIL
  153395. "muls r6, r6, r6\n\t"
  153396. #elif defined(__clang__)
  153397. "muls r6, r6\n\t"
  153398. #else
  153399. "mul r6, r6\n\t"
  153400. #endif
  153401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153402. "adds r4, r4, r5\n\t"
  153403. #else
  153404. "add r4, r4, r5\n\t"
  153405. #endif
  153406. #ifdef WOLFSSL_KEIL
  153407. "adcs r2, r2, r6\n\t"
  153408. #elif defined(__clang__)
  153409. "adcs r2, r6\n\t"
  153410. #else
  153411. "adc r2, r6\n\t"
  153412. #endif
  153413. #ifdef WOLFSSL_KEIL
  153414. "adcs r3, r3, %[r]\n\t"
  153415. #elif defined(__clang__)
  153416. "adcs r3, %[r]\n\t"
  153417. #else
  153418. "adc r3, %[r]\n\t"
  153419. #endif
  153420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153421. "lsrs r6, r7, #16\n\t"
  153422. #else
  153423. "lsr r6, r7, #16\n\t"
  153424. #endif
  153425. "uxth r5, r7\n\t"
  153426. #ifdef WOLFSSL_KEIL
  153427. "muls r5, r6, r5\n\t"
  153428. #elif defined(__clang__)
  153429. "muls r5, r6\n\t"
  153430. #else
  153431. "mul r5, r6\n\t"
  153432. #endif
  153433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153434. "lsrs r6, r5, #15\n\t"
  153435. #else
  153436. "lsr r6, r5, #15\n\t"
  153437. #endif
  153438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153439. "lsls r5, r5, #17\n\t"
  153440. #else
  153441. "lsl r5, r5, #17\n\t"
  153442. #endif
  153443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153444. "adds r4, r4, r5\n\t"
  153445. #else
  153446. "add r4, r4, r5\n\t"
  153447. #endif
  153448. #ifdef WOLFSSL_KEIL
  153449. "adcs r2, r2, r6\n\t"
  153450. #elif defined(__clang__)
  153451. "adcs r2, r6\n\t"
  153452. #else
  153453. "adc r2, r6\n\t"
  153454. #endif
  153455. #ifdef WOLFSSL_KEIL
  153456. "adcs r3, r3, %[r]\n\t"
  153457. #elif defined(__clang__)
  153458. "adcs r3, %[r]\n\t"
  153459. #else
  153460. "adc r3, %[r]\n\t"
  153461. #endif
  153462. "str r4, [sp, #8]\n\t"
  153463. "# A[2] * A[1]\n\t"
  153464. "movs r4, #0\n\t"
  153465. "mov %[a], r9\n\t"
  153466. "mov %[a], r12\n\t"
  153467. "uxth r5, %[a]\n\t"
  153468. "uxth r6, r7\n\t"
  153469. #ifdef WOLFSSL_KEIL
  153470. "muls r6, r5, r6\n\t"
  153471. #elif defined(__clang__)
  153472. "muls r6, r5\n\t"
  153473. #else
  153474. "mul r6, r5\n\t"
  153475. #endif
  153476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153477. "adds r2, r2, r6\n\t"
  153478. #else
  153479. "add r2, r2, r6\n\t"
  153480. #endif
  153481. #ifdef WOLFSSL_KEIL
  153482. "adcs r3, r3, %[r]\n\t"
  153483. #elif defined(__clang__)
  153484. "adcs r3, %[r]\n\t"
  153485. #else
  153486. "adc r3, %[r]\n\t"
  153487. #endif
  153488. #ifdef WOLFSSL_KEIL
  153489. "adcs r4, r4, %[r]\n\t"
  153490. #elif defined(__clang__)
  153491. "adcs r4, %[r]\n\t"
  153492. #else
  153493. "adc r4, %[r]\n\t"
  153494. #endif
  153495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153496. "adds r2, r2, r6\n\t"
  153497. #else
  153498. "add r2, r2, r6\n\t"
  153499. #endif
  153500. #ifdef WOLFSSL_KEIL
  153501. "adcs r3, r3, %[r]\n\t"
  153502. #elif defined(__clang__)
  153503. "adcs r3, %[r]\n\t"
  153504. #else
  153505. "adc r3, %[r]\n\t"
  153506. #endif
  153507. #ifdef WOLFSSL_KEIL
  153508. "adcs r4, r4, %[r]\n\t"
  153509. #elif defined(__clang__)
  153510. "adcs r4, %[r]\n\t"
  153511. #else
  153512. "adc r4, %[r]\n\t"
  153513. #endif
  153514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153515. "lsrs r6, r7, #16\n\t"
  153516. #else
  153517. "lsr r6, r7, #16\n\t"
  153518. #endif
  153519. #ifdef WOLFSSL_KEIL
  153520. "muls r5, r6, r5\n\t"
  153521. #elif defined(__clang__)
  153522. "muls r5, r6\n\t"
  153523. #else
  153524. "mul r5, r6\n\t"
  153525. #endif
  153526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153527. "lsrs r6, r5, #16\n\t"
  153528. #else
  153529. "lsr r6, r5, #16\n\t"
  153530. #endif
  153531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153532. "lsls r5, r5, #16\n\t"
  153533. #else
  153534. "lsl r5, r5, #16\n\t"
  153535. #endif
  153536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153537. "adds r2, r2, r5\n\t"
  153538. #else
  153539. "add r2, r2, r5\n\t"
  153540. #endif
  153541. #ifdef WOLFSSL_KEIL
  153542. "adcs r3, r3, r6\n\t"
  153543. #elif defined(__clang__)
  153544. "adcs r3, r6\n\t"
  153545. #else
  153546. "adc r3, r6\n\t"
  153547. #endif
  153548. #ifdef WOLFSSL_KEIL
  153549. "adcs r4, r4, %[r]\n\t"
  153550. #elif defined(__clang__)
  153551. "adcs r4, %[r]\n\t"
  153552. #else
  153553. "adc r4, %[r]\n\t"
  153554. #endif
  153555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153556. "adds r2, r2, r5\n\t"
  153557. #else
  153558. "add r2, r2, r5\n\t"
  153559. #endif
  153560. #ifdef WOLFSSL_KEIL
  153561. "adcs r3, r3, r6\n\t"
  153562. #elif defined(__clang__)
  153563. "adcs r3, r6\n\t"
  153564. #else
  153565. "adc r3, r6\n\t"
  153566. #endif
  153567. #ifdef WOLFSSL_KEIL
  153568. "adcs r4, r4, %[r]\n\t"
  153569. #elif defined(__clang__)
  153570. "adcs r4, %[r]\n\t"
  153571. #else
  153572. "adc r4, %[r]\n\t"
  153573. #endif
  153574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153575. "lsrs r5, %[a], #16\n\t"
  153576. #else
  153577. "lsr r5, %[a], #16\n\t"
  153578. #endif
  153579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153580. "lsrs r6, r7, #16\n\t"
  153581. #else
  153582. "lsr r6, r7, #16\n\t"
  153583. #endif
  153584. #ifdef WOLFSSL_KEIL
  153585. "muls r6, r5, r6\n\t"
  153586. #elif defined(__clang__)
  153587. "muls r6, r5\n\t"
  153588. #else
  153589. "mul r6, r5\n\t"
  153590. #endif
  153591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153592. "adds r3, r3, r6\n\t"
  153593. #else
  153594. "add r3, r3, r6\n\t"
  153595. #endif
  153596. #ifdef WOLFSSL_KEIL
  153597. "adcs r4, r4, %[r]\n\t"
  153598. #elif defined(__clang__)
  153599. "adcs r4, %[r]\n\t"
  153600. #else
  153601. "adc r4, %[r]\n\t"
  153602. #endif
  153603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153604. "adds r3, r3, r6\n\t"
  153605. #else
  153606. "add r3, r3, r6\n\t"
  153607. #endif
  153608. #ifdef WOLFSSL_KEIL
  153609. "adcs r4, r4, %[r]\n\t"
  153610. #elif defined(__clang__)
  153611. "adcs r4, %[r]\n\t"
  153612. #else
  153613. "adc r4, %[r]\n\t"
  153614. #endif
  153615. "uxth r6, r7\n\t"
  153616. #ifdef WOLFSSL_KEIL
  153617. "muls r5, r6, r5\n\t"
  153618. #elif defined(__clang__)
  153619. "muls r5, r6\n\t"
  153620. #else
  153621. "mul r5, r6\n\t"
  153622. #endif
  153623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153624. "lsrs r6, r5, #16\n\t"
  153625. #else
  153626. "lsr r6, r5, #16\n\t"
  153627. #endif
  153628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153629. "lsls r5, r5, #16\n\t"
  153630. #else
  153631. "lsl r5, r5, #16\n\t"
  153632. #endif
  153633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153634. "adds r2, r2, r5\n\t"
  153635. #else
  153636. "add r2, r2, r5\n\t"
  153637. #endif
  153638. #ifdef WOLFSSL_KEIL
  153639. "adcs r3, r3, r6\n\t"
  153640. #elif defined(__clang__)
  153641. "adcs r3, r6\n\t"
  153642. #else
  153643. "adc r3, r6\n\t"
  153644. #endif
  153645. #ifdef WOLFSSL_KEIL
  153646. "adcs r4, r4, %[r]\n\t"
  153647. #elif defined(__clang__)
  153648. "adcs r4, %[r]\n\t"
  153649. #else
  153650. "adc r4, %[r]\n\t"
  153651. #endif
  153652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153653. "adds r2, r2, r5\n\t"
  153654. #else
  153655. "add r2, r2, r5\n\t"
  153656. #endif
  153657. #ifdef WOLFSSL_KEIL
  153658. "adcs r3, r3, r6\n\t"
  153659. #elif defined(__clang__)
  153660. "adcs r3, r6\n\t"
  153661. #else
  153662. "adc r3, r6\n\t"
  153663. #endif
  153664. #ifdef WOLFSSL_KEIL
  153665. "adcs r4, r4, %[r]\n\t"
  153666. #elif defined(__clang__)
  153667. "adcs r4, %[r]\n\t"
  153668. #else
  153669. "adc r4, %[r]\n\t"
  153670. #endif
  153671. "# A[3] * A[0]\n\t"
  153672. "mov %[a], r9\n\t"
  153673. "mov r7, r10\n\t"
  153674. "mov %[a], lr\n\t"
  153675. "uxth r5, %[a]\n\t"
  153676. "uxth r6, r7\n\t"
  153677. #ifdef WOLFSSL_KEIL
  153678. "muls r6, r5, r6\n\t"
  153679. #elif defined(__clang__)
  153680. "muls r6, r5\n\t"
  153681. #else
  153682. "mul r6, r5\n\t"
  153683. #endif
  153684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153685. "adds r2, r2, r6\n\t"
  153686. #else
  153687. "add r2, r2, r6\n\t"
  153688. #endif
  153689. #ifdef WOLFSSL_KEIL
  153690. "adcs r3, r3, %[r]\n\t"
  153691. #elif defined(__clang__)
  153692. "adcs r3, %[r]\n\t"
  153693. #else
  153694. "adc r3, %[r]\n\t"
  153695. #endif
  153696. #ifdef WOLFSSL_KEIL
  153697. "adcs r4, r4, %[r]\n\t"
  153698. #elif defined(__clang__)
  153699. "adcs r4, %[r]\n\t"
  153700. #else
  153701. "adc r4, %[r]\n\t"
  153702. #endif
  153703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153704. "adds r2, r2, r6\n\t"
  153705. #else
  153706. "add r2, r2, r6\n\t"
  153707. #endif
  153708. #ifdef WOLFSSL_KEIL
  153709. "adcs r3, r3, %[r]\n\t"
  153710. #elif defined(__clang__)
  153711. "adcs r3, %[r]\n\t"
  153712. #else
  153713. "adc r3, %[r]\n\t"
  153714. #endif
  153715. #ifdef WOLFSSL_KEIL
  153716. "adcs r4, r4, %[r]\n\t"
  153717. #elif defined(__clang__)
  153718. "adcs r4, %[r]\n\t"
  153719. #else
  153720. "adc r4, %[r]\n\t"
  153721. #endif
  153722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153723. "lsrs r6, r7, #16\n\t"
  153724. #else
  153725. "lsr r6, r7, #16\n\t"
  153726. #endif
  153727. #ifdef WOLFSSL_KEIL
  153728. "muls r5, r6, r5\n\t"
  153729. #elif defined(__clang__)
  153730. "muls r5, r6\n\t"
  153731. #else
  153732. "mul r5, r6\n\t"
  153733. #endif
  153734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153735. "lsrs r6, r5, #16\n\t"
  153736. #else
  153737. "lsr r6, r5, #16\n\t"
  153738. #endif
  153739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153740. "lsls r5, r5, #16\n\t"
  153741. #else
  153742. "lsl r5, r5, #16\n\t"
  153743. #endif
  153744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153745. "adds r2, r2, r5\n\t"
  153746. #else
  153747. "add r2, r2, r5\n\t"
  153748. #endif
  153749. #ifdef WOLFSSL_KEIL
  153750. "adcs r3, r3, r6\n\t"
  153751. #elif defined(__clang__)
  153752. "adcs r3, r6\n\t"
  153753. #else
  153754. "adc r3, r6\n\t"
  153755. #endif
  153756. #ifdef WOLFSSL_KEIL
  153757. "adcs r4, r4, %[r]\n\t"
  153758. #elif defined(__clang__)
  153759. "adcs r4, %[r]\n\t"
  153760. #else
  153761. "adc r4, %[r]\n\t"
  153762. #endif
  153763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153764. "adds r2, r2, r5\n\t"
  153765. #else
  153766. "add r2, r2, r5\n\t"
  153767. #endif
  153768. #ifdef WOLFSSL_KEIL
  153769. "adcs r3, r3, r6\n\t"
  153770. #elif defined(__clang__)
  153771. "adcs r3, r6\n\t"
  153772. #else
  153773. "adc r3, r6\n\t"
  153774. #endif
  153775. #ifdef WOLFSSL_KEIL
  153776. "adcs r4, r4, %[r]\n\t"
  153777. #elif defined(__clang__)
  153778. "adcs r4, %[r]\n\t"
  153779. #else
  153780. "adc r4, %[r]\n\t"
  153781. #endif
  153782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153783. "lsrs r5, %[a], #16\n\t"
  153784. #else
  153785. "lsr r5, %[a], #16\n\t"
  153786. #endif
  153787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153788. "lsrs r6, r7, #16\n\t"
  153789. #else
  153790. "lsr r6, r7, #16\n\t"
  153791. #endif
  153792. #ifdef WOLFSSL_KEIL
  153793. "muls r6, r5, r6\n\t"
  153794. #elif defined(__clang__)
  153795. "muls r6, r5\n\t"
  153796. #else
  153797. "mul r6, r5\n\t"
  153798. #endif
  153799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153800. "adds r3, r3, r6\n\t"
  153801. #else
  153802. "add r3, r3, r6\n\t"
  153803. #endif
  153804. #ifdef WOLFSSL_KEIL
  153805. "adcs r4, r4, %[r]\n\t"
  153806. #elif defined(__clang__)
  153807. "adcs r4, %[r]\n\t"
  153808. #else
  153809. "adc r4, %[r]\n\t"
  153810. #endif
  153811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153812. "adds r3, r3, r6\n\t"
  153813. #else
  153814. "add r3, r3, r6\n\t"
  153815. #endif
  153816. #ifdef WOLFSSL_KEIL
  153817. "adcs r4, r4, %[r]\n\t"
  153818. #elif defined(__clang__)
  153819. "adcs r4, %[r]\n\t"
  153820. #else
  153821. "adc r4, %[r]\n\t"
  153822. #endif
  153823. "uxth r6, r7\n\t"
  153824. #ifdef WOLFSSL_KEIL
  153825. "muls r5, r6, r5\n\t"
  153826. #elif defined(__clang__)
  153827. "muls r5, r6\n\t"
  153828. #else
  153829. "mul r5, r6\n\t"
  153830. #endif
  153831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153832. "lsrs r6, r5, #16\n\t"
  153833. #else
  153834. "lsr r6, r5, #16\n\t"
  153835. #endif
  153836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153837. "lsls r5, r5, #16\n\t"
  153838. #else
  153839. "lsl r5, r5, #16\n\t"
  153840. #endif
  153841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153842. "adds r2, r2, r5\n\t"
  153843. #else
  153844. "add r2, r2, r5\n\t"
  153845. #endif
  153846. #ifdef WOLFSSL_KEIL
  153847. "adcs r3, r3, r6\n\t"
  153848. #elif defined(__clang__)
  153849. "adcs r3, r6\n\t"
  153850. #else
  153851. "adc r3, r6\n\t"
  153852. #endif
  153853. #ifdef WOLFSSL_KEIL
  153854. "adcs r4, r4, %[r]\n\t"
  153855. #elif defined(__clang__)
  153856. "adcs r4, %[r]\n\t"
  153857. #else
  153858. "adc r4, %[r]\n\t"
  153859. #endif
  153860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153861. "adds r2, r2, r5\n\t"
  153862. #else
  153863. "add r2, r2, r5\n\t"
  153864. #endif
  153865. #ifdef WOLFSSL_KEIL
  153866. "adcs r3, r3, r6\n\t"
  153867. #elif defined(__clang__)
  153868. "adcs r3, r6\n\t"
  153869. #else
  153870. "adc r3, r6\n\t"
  153871. #endif
  153872. #ifdef WOLFSSL_KEIL
  153873. "adcs r4, r4, %[r]\n\t"
  153874. #elif defined(__clang__)
  153875. "adcs r4, %[r]\n\t"
  153876. #else
  153877. "adc r4, %[r]\n\t"
  153878. #endif
  153879. "str r2, [sp, #12]\n\t"
  153880. "# A[4] * A[0]\n\t"
  153881. "movs r2, #0\n\t"
  153882. "mov %[a], r9\n\t"
  153883. "ldr %[a], [%[a], #16]\n\t"
  153884. "uxth r5, %[a]\n\t"
  153885. "uxth r6, r7\n\t"
  153886. #ifdef WOLFSSL_KEIL
  153887. "muls r6, r5, r6\n\t"
  153888. #elif defined(__clang__)
  153889. "muls r6, r5\n\t"
  153890. #else
  153891. "mul r6, r5\n\t"
  153892. #endif
  153893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153894. "adds r3, r3, r6\n\t"
  153895. #else
  153896. "add r3, r3, r6\n\t"
  153897. #endif
  153898. #ifdef WOLFSSL_KEIL
  153899. "adcs r4, r4, %[r]\n\t"
  153900. #elif defined(__clang__)
  153901. "adcs r4, %[r]\n\t"
  153902. #else
  153903. "adc r4, %[r]\n\t"
  153904. #endif
  153905. #ifdef WOLFSSL_KEIL
  153906. "adcs r2, r2, %[r]\n\t"
  153907. #elif defined(__clang__)
  153908. "adcs r2, %[r]\n\t"
  153909. #else
  153910. "adc r2, %[r]\n\t"
  153911. #endif
  153912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153913. "adds r3, r3, r6\n\t"
  153914. #else
  153915. "add r3, r3, r6\n\t"
  153916. #endif
  153917. #ifdef WOLFSSL_KEIL
  153918. "adcs r4, r4, %[r]\n\t"
  153919. #elif defined(__clang__)
  153920. "adcs r4, %[r]\n\t"
  153921. #else
  153922. "adc r4, %[r]\n\t"
  153923. #endif
  153924. #ifdef WOLFSSL_KEIL
  153925. "adcs r2, r2, %[r]\n\t"
  153926. #elif defined(__clang__)
  153927. "adcs r2, %[r]\n\t"
  153928. #else
  153929. "adc r2, %[r]\n\t"
  153930. #endif
  153931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153932. "lsrs r6, r7, #16\n\t"
  153933. #else
  153934. "lsr r6, r7, #16\n\t"
  153935. #endif
  153936. #ifdef WOLFSSL_KEIL
  153937. "muls r5, r6, r5\n\t"
  153938. #elif defined(__clang__)
  153939. "muls r5, r6\n\t"
  153940. #else
  153941. "mul r5, r6\n\t"
  153942. #endif
  153943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153944. "lsrs r6, r5, #16\n\t"
  153945. #else
  153946. "lsr r6, r5, #16\n\t"
  153947. #endif
  153948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153949. "lsls r5, r5, #16\n\t"
  153950. #else
  153951. "lsl r5, r5, #16\n\t"
  153952. #endif
  153953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153954. "adds r3, r3, r5\n\t"
  153955. #else
  153956. "add r3, r3, r5\n\t"
  153957. #endif
  153958. #ifdef WOLFSSL_KEIL
  153959. "adcs r4, r4, r6\n\t"
  153960. #elif defined(__clang__)
  153961. "adcs r4, r6\n\t"
  153962. #else
  153963. "adc r4, r6\n\t"
  153964. #endif
  153965. #ifdef WOLFSSL_KEIL
  153966. "adcs r2, r2, %[r]\n\t"
  153967. #elif defined(__clang__)
  153968. "adcs r2, %[r]\n\t"
  153969. #else
  153970. "adc r2, %[r]\n\t"
  153971. #endif
  153972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153973. "adds r3, r3, r5\n\t"
  153974. #else
  153975. "add r3, r3, r5\n\t"
  153976. #endif
  153977. #ifdef WOLFSSL_KEIL
  153978. "adcs r4, r4, r6\n\t"
  153979. #elif defined(__clang__)
  153980. "adcs r4, r6\n\t"
  153981. #else
  153982. "adc r4, r6\n\t"
  153983. #endif
  153984. #ifdef WOLFSSL_KEIL
  153985. "adcs r2, r2, %[r]\n\t"
  153986. #elif defined(__clang__)
  153987. "adcs r2, %[r]\n\t"
  153988. #else
  153989. "adc r2, %[r]\n\t"
  153990. #endif
  153991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153992. "lsrs r5, %[a], #16\n\t"
  153993. #else
  153994. "lsr r5, %[a], #16\n\t"
  153995. #endif
  153996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153997. "lsrs r6, r7, #16\n\t"
  153998. #else
  153999. "lsr r6, r7, #16\n\t"
  154000. #endif
  154001. #ifdef WOLFSSL_KEIL
  154002. "muls r6, r5, r6\n\t"
  154003. #elif defined(__clang__)
  154004. "muls r6, r5\n\t"
  154005. #else
  154006. "mul r6, r5\n\t"
  154007. #endif
  154008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154009. "adds r4, r4, r6\n\t"
  154010. #else
  154011. "add r4, r4, r6\n\t"
  154012. #endif
  154013. #ifdef WOLFSSL_KEIL
  154014. "adcs r2, r2, %[r]\n\t"
  154015. #elif defined(__clang__)
  154016. "adcs r2, %[r]\n\t"
  154017. #else
  154018. "adc r2, %[r]\n\t"
  154019. #endif
  154020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154021. "adds r4, r4, r6\n\t"
  154022. #else
  154023. "add r4, r4, r6\n\t"
  154024. #endif
  154025. #ifdef WOLFSSL_KEIL
  154026. "adcs r2, r2, %[r]\n\t"
  154027. #elif defined(__clang__)
  154028. "adcs r2, %[r]\n\t"
  154029. #else
  154030. "adc r2, %[r]\n\t"
  154031. #endif
  154032. "uxth r6, r7\n\t"
  154033. #ifdef WOLFSSL_KEIL
  154034. "muls r5, r6, r5\n\t"
  154035. #elif defined(__clang__)
  154036. "muls r5, r6\n\t"
  154037. #else
  154038. "mul r5, r6\n\t"
  154039. #endif
  154040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154041. "lsrs r6, r5, #16\n\t"
  154042. #else
  154043. "lsr r6, r5, #16\n\t"
  154044. #endif
  154045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154046. "lsls r5, r5, #16\n\t"
  154047. #else
  154048. "lsl r5, r5, #16\n\t"
  154049. #endif
  154050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154051. "adds r3, r3, r5\n\t"
  154052. #else
  154053. "add r3, r3, r5\n\t"
  154054. #endif
  154055. #ifdef WOLFSSL_KEIL
  154056. "adcs r4, r4, r6\n\t"
  154057. #elif defined(__clang__)
  154058. "adcs r4, r6\n\t"
  154059. #else
  154060. "adc r4, r6\n\t"
  154061. #endif
  154062. #ifdef WOLFSSL_KEIL
  154063. "adcs r2, r2, %[r]\n\t"
  154064. #elif defined(__clang__)
  154065. "adcs r2, %[r]\n\t"
  154066. #else
  154067. "adc r2, %[r]\n\t"
  154068. #endif
  154069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154070. "adds r3, r3, r5\n\t"
  154071. #else
  154072. "add r3, r3, r5\n\t"
  154073. #endif
  154074. #ifdef WOLFSSL_KEIL
  154075. "adcs r4, r4, r6\n\t"
  154076. #elif defined(__clang__)
  154077. "adcs r4, r6\n\t"
  154078. #else
  154079. "adc r4, r6\n\t"
  154080. #endif
  154081. #ifdef WOLFSSL_KEIL
  154082. "adcs r2, r2, %[r]\n\t"
  154083. #elif defined(__clang__)
  154084. "adcs r2, %[r]\n\t"
  154085. #else
  154086. "adc r2, %[r]\n\t"
  154087. #endif
  154088. "# A[3] * A[1]\n\t"
  154089. "mov %[a], r9\n\t"
  154090. "mov r7, r11\n\t"
  154091. "mov %[a], lr\n\t"
  154092. "uxth r5, %[a]\n\t"
  154093. "uxth r6, r7\n\t"
  154094. #ifdef WOLFSSL_KEIL
  154095. "muls r6, r5, r6\n\t"
  154096. #elif defined(__clang__)
  154097. "muls r6, r5\n\t"
  154098. #else
  154099. "mul r6, r5\n\t"
  154100. #endif
  154101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154102. "adds r3, r3, r6\n\t"
  154103. #else
  154104. "add r3, r3, r6\n\t"
  154105. #endif
  154106. #ifdef WOLFSSL_KEIL
  154107. "adcs r4, r4, %[r]\n\t"
  154108. #elif defined(__clang__)
  154109. "adcs r4, %[r]\n\t"
  154110. #else
  154111. "adc r4, %[r]\n\t"
  154112. #endif
  154113. #ifdef WOLFSSL_KEIL
  154114. "adcs r2, r2, %[r]\n\t"
  154115. #elif defined(__clang__)
  154116. "adcs r2, %[r]\n\t"
  154117. #else
  154118. "adc r2, %[r]\n\t"
  154119. #endif
  154120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154121. "adds r3, r3, r6\n\t"
  154122. #else
  154123. "add r3, r3, r6\n\t"
  154124. #endif
  154125. #ifdef WOLFSSL_KEIL
  154126. "adcs r4, r4, %[r]\n\t"
  154127. #elif defined(__clang__)
  154128. "adcs r4, %[r]\n\t"
  154129. #else
  154130. "adc r4, %[r]\n\t"
  154131. #endif
  154132. #ifdef WOLFSSL_KEIL
  154133. "adcs r2, r2, %[r]\n\t"
  154134. #elif defined(__clang__)
  154135. "adcs r2, %[r]\n\t"
  154136. #else
  154137. "adc r2, %[r]\n\t"
  154138. #endif
  154139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154140. "lsrs r6, r7, #16\n\t"
  154141. #else
  154142. "lsr r6, r7, #16\n\t"
  154143. #endif
  154144. #ifdef WOLFSSL_KEIL
  154145. "muls r5, r6, r5\n\t"
  154146. #elif defined(__clang__)
  154147. "muls r5, r6\n\t"
  154148. #else
  154149. "mul r5, r6\n\t"
  154150. #endif
  154151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154152. "lsrs r6, r5, #16\n\t"
  154153. #else
  154154. "lsr r6, r5, #16\n\t"
  154155. #endif
  154156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154157. "lsls r5, r5, #16\n\t"
  154158. #else
  154159. "lsl r5, r5, #16\n\t"
  154160. #endif
  154161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154162. "adds r3, r3, r5\n\t"
  154163. #else
  154164. "add r3, r3, r5\n\t"
  154165. #endif
  154166. #ifdef WOLFSSL_KEIL
  154167. "adcs r4, r4, r6\n\t"
  154168. #elif defined(__clang__)
  154169. "adcs r4, r6\n\t"
  154170. #else
  154171. "adc r4, r6\n\t"
  154172. #endif
  154173. #ifdef WOLFSSL_KEIL
  154174. "adcs r2, r2, %[r]\n\t"
  154175. #elif defined(__clang__)
  154176. "adcs r2, %[r]\n\t"
  154177. #else
  154178. "adc r2, %[r]\n\t"
  154179. #endif
  154180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154181. "adds r3, r3, r5\n\t"
  154182. #else
  154183. "add r3, r3, r5\n\t"
  154184. #endif
  154185. #ifdef WOLFSSL_KEIL
  154186. "adcs r4, r4, r6\n\t"
  154187. #elif defined(__clang__)
  154188. "adcs r4, r6\n\t"
  154189. #else
  154190. "adc r4, r6\n\t"
  154191. #endif
  154192. #ifdef WOLFSSL_KEIL
  154193. "adcs r2, r2, %[r]\n\t"
  154194. #elif defined(__clang__)
  154195. "adcs r2, %[r]\n\t"
  154196. #else
  154197. "adc r2, %[r]\n\t"
  154198. #endif
  154199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154200. "lsrs r5, %[a], #16\n\t"
  154201. #else
  154202. "lsr r5, %[a], #16\n\t"
  154203. #endif
  154204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154205. "lsrs r6, r7, #16\n\t"
  154206. #else
  154207. "lsr r6, r7, #16\n\t"
  154208. #endif
  154209. #ifdef WOLFSSL_KEIL
  154210. "muls r6, r5, r6\n\t"
  154211. #elif defined(__clang__)
  154212. "muls r6, r5\n\t"
  154213. #else
  154214. "mul r6, r5\n\t"
  154215. #endif
  154216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154217. "adds r4, r4, r6\n\t"
  154218. #else
  154219. "add r4, r4, r6\n\t"
  154220. #endif
  154221. #ifdef WOLFSSL_KEIL
  154222. "adcs r2, r2, %[r]\n\t"
  154223. #elif defined(__clang__)
  154224. "adcs r2, %[r]\n\t"
  154225. #else
  154226. "adc r2, %[r]\n\t"
  154227. #endif
  154228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154229. "adds r4, r4, r6\n\t"
  154230. #else
  154231. "add r4, r4, r6\n\t"
  154232. #endif
  154233. #ifdef WOLFSSL_KEIL
  154234. "adcs r2, r2, %[r]\n\t"
  154235. #elif defined(__clang__)
  154236. "adcs r2, %[r]\n\t"
  154237. #else
  154238. "adc r2, %[r]\n\t"
  154239. #endif
  154240. "uxth r6, r7\n\t"
  154241. #ifdef WOLFSSL_KEIL
  154242. "muls r5, r6, r5\n\t"
  154243. #elif defined(__clang__)
  154244. "muls r5, r6\n\t"
  154245. #else
  154246. "mul r5, r6\n\t"
  154247. #endif
  154248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154249. "lsrs r6, r5, #16\n\t"
  154250. #else
  154251. "lsr r6, r5, #16\n\t"
  154252. #endif
  154253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154254. "lsls r5, r5, #16\n\t"
  154255. #else
  154256. "lsl r5, r5, #16\n\t"
  154257. #endif
  154258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154259. "adds r3, r3, r5\n\t"
  154260. #else
  154261. "add r3, r3, r5\n\t"
  154262. #endif
  154263. #ifdef WOLFSSL_KEIL
  154264. "adcs r4, r4, r6\n\t"
  154265. #elif defined(__clang__)
  154266. "adcs r4, r6\n\t"
  154267. #else
  154268. "adc r4, r6\n\t"
  154269. #endif
  154270. #ifdef WOLFSSL_KEIL
  154271. "adcs r2, r2, %[r]\n\t"
  154272. #elif defined(__clang__)
  154273. "adcs r2, %[r]\n\t"
  154274. #else
  154275. "adc r2, %[r]\n\t"
  154276. #endif
  154277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154278. "adds r3, r3, r5\n\t"
  154279. #else
  154280. "add r3, r3, r5\n\t"
  154281. #endif
  154282. #ifdef WOLFSSL_KEIL
  154283. "adcs r4, r4, r6\n\t"
  154284. #elif defined(__clang__)
  154285. "adcs r4, r6\n\t"
  154286. #else
  154287. "adc r4, r6\n\t"
  154288. #endif
  154289. #ifdef WOLFSSL_KEIL
  154290. "adcs r2, r2, %[r]\n\t"
  154291. #elif defined(__clang__)
  154292. "adcs r2, %[r]\n\t"
  154293. #else
  154294. "adc r2, %[r]\n\t"
  154295. #endif
  154296. "# A[2] * A[2]\n\t"
  154297. "mov r7, r12\n\t"
  154298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154299. "lsrs r6, r7, #16\n\t"
  154300. #else
  154301. "lsr r6, r7, #16\n\t"
  154302. #endif
  154303. "uxth r5, r7\n\t"
  154304. #ifdef WOLFSSL_KEIL
  154305. "muls r5, r5, r5\n\t"
  154306. #elif defined(__clang__)
  154307. "muls r5, r5\n\t"
  154308. #else
  154309. "mul r5, r5\n\t"
  154310. #endif
  154311. #ifdef WOLFSSL_KEIL
  154312. "muls r6, r6, r6\n\t"
  154313. #elif defined(__clang__)
  154314. "muls r6, r6\n\t"
  154315. #else
  154316. "mul r6, r6\n\t"
  154317. #endif
  154318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154319. "adds r3, r3, r5\n\t"
  154320. #else
  154321. "add r3, r3, r5\n\t"
  154322. #endif
  154323. #ifdef WOLFSSL_KEIL
  154324. "adcs r4, r4, r6\n\t"
  154325. #elif defined(__clang__)
  154326. "adcs r4, r6\n\t"
  154327. #else
  154328. "adc r4, r6\n\t"
  154329. #endif
  154330. #ifdef WOLFSSL_KEIL
  154331. "adcs r2, r2, %[r]\n\t"
  154332. #elif defined(__clang__)
  154333. "adcs r2, %[r]\n\t"
  154334. #else
  154335. "adc r2, %[r]\n\t"
  154336. #endif
  154337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154338. "lsrs r6, r7, #16\n\t"
  154339. #else
  154340. "lsr r6, r7, #16\n\t"
  154341. #endif
  154342. "uxth r5, r7\n\t"
  154343. #ifdef WOLFSSL_KEIL
  154344. "muls r5, r6, r5\n\t"
  154345. #elif defined(__clang__)
  154346. "muls r5, r6\n\t"
  154347. #else
  154348. "mul r5, r6\n\t"
  154349. #endif
  154350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154351. "lsrs r6, r5, #15\n\t"
  154352. #else
  154353. "lsr r6, r5, #15\n\t"
  154354. #endif
  154355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154356. "lsls r5, r5, #17\n\t"
  154357. #else
  154358. "lsl r5, r5, #17\n\t"
  154359. #endif
  154360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154361. "adds r3, r3, r5\n\t"
  154362. #else
  154363. "add r3, r3, r5\n\t"
  154364. #endif
  154365. #ifdef WOLFSSL_KEIL
  154366. "adcs r4, r4, r6\n\t"
  154367. #elif defined(__clang__)
  154368. "adcs r4, r6\n\t"
  154369. #else
  154370. "adc r4, r6\n\t"
  154371. #endif
  154372. #ifdef WOLFSSL_KEIL
  154373. "adcs r2, r2, %[r]\n\t"
  154374. #elif defined(__clang__)
  154375. "adcs r2, %[r]\n\t"
  154376. #else
  154377. "adc r2, %[r]\n\t"
  154378. #endif
  154379. "str r3, [sp, #16]\n\t"
  154380. "# A[3] * A[2]\n\t"
  154381. "movs r3, #0\n\t"
  154382. "mov %[a], r9\n\t"
  154383. "mov %[a], lr\n\t"
  154384. "uxth r5, %[a]\n\t"
  154385. "uxth r6, r7\n\t"
  154386. #ifdef WOLFSSL_KEIL
  154387. "muls r6, r5, r6\n\t"
  154388. #elif defined(__clang__)
  154389. "muls r6, r5\n\t"
  154390. #else
  154391. "mul r6, r5\n\t"
  154392. #endif
  154393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154394. "adds r4, r4, r6\n\t"
  154395. #else
  154396. "add r4, r4, r6\n\t"
  154397. #endif
  154398. #ifdef WOLFSSL_KEIL
  154399. "adcs r2, r2, %[r]\n\t"
  154400. #elif defined(__clang__)
  154401. "adcs r2, %[r]\n\t"
  154402. #else
  154403. "adc r2, %[r]\n\t"
  154404. #endif
  154405. #ifdef WOLFSSL_KEIL
  154406. "adcs r3, r3, %[r]\n\t"
  154407. #elif defined(__clang__)
  154408. "adcs r3, %[r]\n\t"
  154409. #else
  154410. "adc r3, %[r]\n\t"
  154411. #endif
  154412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154413. "adds r4, r4, r6\n\t"
  154414. #else
  154415. "add r4, r4, r6\n\t"
  154416. #endif
  154417. #ifdef WOLFSSL_KEIL
  154418. "adcs r2, r2, %[r]\n\t"
  154419. #elif defined(__clang__)
  154420. "adcs r2, %[r]\n\t"
  154421. #else
  154422. "adc r2, %[r]\n\t"
  154423. #endif
  154424. #ifdef WOLFSSL_KEIL
  154425. "adcs r3, r3, %[r]\n\t"
  154426. #elif defined(__clang__)
  154427. "adcs r3, %[r]\n\t"
  154428. #else
  154429. "adc r3, %[r]\n\t"
  154430. #endif
  154431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154432. "lsrs r6, r7, #16\n\t"
  154433. #else
  154434. "lsr r6, r7, #16\n\t"
  154435. #endif
  154436. #ifdef WOLFSSL_KEIL
  154437. "muls r5, r6, r5\n\t"
  154438. #elif defined(__clang__)
  154439. "muls r5, r6\n\t"
  154440. #else
  154441. "mul r5, r6\n\t"
  154442. #endif
  154443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154444. "lsrs r6, r5, #16\n\t"
  154445. #else
  154446. "lsr r6, r5, #16\n\t"
  154447. #endif
  154448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154449. "lsls r5, r5, #16\n\t"
  154450. #else
  154451. "lsl r5, r5, #16\n\t"
  154452. #endif
  154453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154454. "adds r4, r4, r5\n\t"
  154455. #else
  154456. "add r4, r4, r5\n\t"
  154457. #endif
  154458. #ifdef WOLFSSL_KEIL
  154459. "adcs r2, r2, r6\n\t"
  154460. #elif defined(__clang__)
  154461. "adcs r2, r6\n\t"
  154462. #else
  154463. "adc r2, r6\n\t"
  154464. #endif
  154465. #ifdef WOLFSSL_KEIL
  154466. "adcs r3, r3, %[r]\n\t"
  154467. #elif defined(__clang__)
  154468. "adcs r3, %[r]\n\t"
  154469. #else
  154470. "adc r3, %[r]\n\t"
  154471. #endif
  154472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154473. "adds r4, r4, r5\n\t"
  154474. #else
  154475. "add r4, r4, r5\n\t"
  154476. #endif
  154477. #ifdef WOLFSSL_KEIL
  154478. "adcs r2, r2, r6\n\t"
  154479. #elif defined(__clang__)
  154480. "adcs r2, r6\n\t"
  154481. #else
  154482. "adc r2, r6\n\t"
  154483. #endif
  154484. #ifdef WOLFSSL_KEIL
  154485. "adcs r3, r3, %[r]\n\t"
  154486. #elif defined(__clang__)
  154487. "adcs r3, %[r]\n\t"
  154488. #else
  154489. "adc r3, %[r]\n\t"
  154490. #endif
  154491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154492. "lsrs r5, %[a], #16\n\t"
  154493. #else
  154494. "lsr r5, %[a], #16\n\t"
  154495. #endif
  154496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154497. "lsrs r6, r7, #16\n\t"
  154498. #else
  154499. "lsr r6, r7, #16\n\t"
  154500. #endif
  154501. #ifdef WOLFSSL_KEIL
  154502. "muls r6, r5, r6\n\t"
  154503. #elif defined(__clang__)
  154504. "muls r6, r5\n\t"
  154505. #else
  154506. "mul r6, r5\n\t"
  154507. #endif
  154508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154509. "adds r2, r2, r6\n\t"
  154510. #else
  154511. "add r2, r2, r6\n\t"
  154512. #endif
  154513. #ifdef WOLFSSL_KEIL
  154514. "adcs r3, r3, %[r]\n\t"
  154515. #elif defined(__clang__)
  154516. "adcs r3, %[r]\n\t"
  154517. #else
  154518. "adc r3, %[r]\n\t"
  154519. #endif
  154520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154521. "adds r2, r2, r6\n\t"
  154522. #else
  154523. "add r2, r2, r6\n\t"
  154524. #endif
  154525. #ifdef WOLFSSL_KEIL
  154526. "adcs r3, r3, %[r]\n\t"
  154527. #elif defined(__clang__)
  154528. "adcs r3, %[r]\n\t"
  154529. #else
  154530. "adc r3, %[r]\n\t"
  154531. #endif
  154532. "uxth r6, r7\n\t"
  154533. #ifdef WOLFSSL_KEIL
  154534. "muls r5, r6, r5\n\t"
  154535. #elif defined(__clang__)
  154536. "muls r5, r6\n\t"
  154537. #else
  154538. "mul r5, r6\n\t"
  154539. #endif
  154540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154541. "lsrs r6, r5, #16\n\t"
  154542. #else
  154543. "lsr r6, r5, #16\n\t"
  154544. #endif
  154545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154546. "lsls r5, r5, #16\n\t"
  154547. #else
  154548. "lsl r5, r5, #16\n\t"
  154549. #endif
  154550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154551. "adds r4, r4, r5\n\t"
  154552. #else
  154553. "add r4, r4, r5\n\t"
  154554. #endif
  154555. #ifdef WOLFSSL_KEIL
  154556. "adcs r2, r2, r6\n\t"
  154557. #elif defined(__clang__)
  154558. "adcs r2, r6\n\t"
  154559. #else
  154560. "adc r2, r6\n\t"
  154561. #endif
  154562. #ifdef WOLFSSL_KEIL
  154563. "adcs r3, r3, %[r]\n\t"
  154564. #elif defined(__clang__)
  154565. "adcs r3, %[r]\n\t"
  154566. #else
  154567. "adc r3, %[r]\n\t"
  154568. #endif
  154569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154570. "adds r4, r4, r5\n\t"
  154571. #else
  154572. "add r4, r4, r5\n\t"
  154573. #endif
  154574. #ifdef WOLFSSL_KEIL
  154575. "adcs r2, r2, r6\n\t"
  154576. #elif defined(__clang__)
  154577. "adcs r2, r6\n\t"
  154578. #else
  154579. "adc r2, r6\n\t"
  154580. #endif
  154581. #ifdef WOLFSSL_KEIL
  154582. "adcs r3, r3, %[r]\n\t"
  154583. #elif defined(__clang__)
  154584. "adcs r3, %[r]\n\t"
  154585. #else
  154586. "adc r3, %[r]\n\t"
  154587. #endif
  154588. "# A[4] * A[1]\n\t"
  154589. "mov %[a], r9\n\t"
  154590. "mov r7, r11\n\t"
  154591. "ldr %[a], [%[a], #16]\n\t"
  154592. "uxth r5, %[a]\n\t"
  154593. "uxth r6, r7\n\t"
  154594. #ifdef WOLFSSL_KEIL
  154595. "muls r6, r5, r6\n\t"
  154596. #elif defined(__clang__)
  154597. "muls r6, r5\n\t"
  154598. #else
  154599. "mul r6, r5\n\t"
  154600. #endif
  154601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154602. "adds r4, r4, r6\n\t"
  154603. #else
  154604. "add r4, r4, r6\n\t"
  154605. #endif
  154606. #ifdef WOLFSSL_KEIL
  154607. "adcs r2, r2, %[r]\n\t"
  154608. #elif defined(__clang__)
  154609. "adcs r2, %[r]\n\t"
  154610. #else
  154611. "adc r2, %[r]\n\t"
  154612. #endif
  154613. #ifdef WOLFSSL_KEIL
  154614. "adcs r3, r3, %[r]\n\t"
  154615. #elif defined(__clang__)
  154616. "adcs r3, %[r]\n\t"
  154617. #else
  154618. "adc r3, %[r]\n\t"
  154619. #endif
  154620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154621. "adds r4, r4, r6\n\t"
  154622. #else
  154623. "add r4, r4, r6\n\t"
  154624. #endif
  154625. #ifdef WOLFSSL_KEIL
  154626. "adcs r2, r2, %[r]\n\t"
  154627. #elif defined(__clang__)
  154628. "adcs r2, %[r]\n\t"
  154629. #else
  154630. "adc r2, %[r]\n\t"
  154631. #endif
  154632. #ifdef WOLFSSL_KEIL
  154633. "adcs r3, r3, %[r]\n\t"
  154634. #elif defined(__clang__)
  154635. "adcs r3, %[r]\n\t"
  154636. #else
  154637. "adc r3, %[r]\n\t"
  154638. #endif
  154639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154640. "lsrs r6, r7, #16\n\t"
  154641. #else
  154642. "lsr r6, r7, #16\n\t"
  154643. #endif
  154644. #ifdef WOLFSSL_KEIL
  154645. "muls r5, r6, r5\n\t"
  154646. #elif defined(__clang__)
  154647. "muls r5, r6\n\t"
  154648. #else
  154649. "mul r5, r6\n\t"
  154650. #endif
  154651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154652. "lsrs r6, r5, #16\n\t"
  154653. #else
  154654. "lsr r6, r5, #16\n\t"
  154655. #endif
  154656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154657. "lsls r5, r5, #16\n\t"
  154658. #else
  154659. "lsl r5, r5, #16\n\t"
  154660. #endif
  154661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154662. "adds r4, r4, r5\n\t"
  154663. #else
  154664. "add r4, r4, r5\n\t"
  154665. #endif
  154666. #ifdef WOLFSSL_KEIL
  154667. "adcs r2, r2, r6\n\t"
  154668. #elif defined(__clang__)
  154669. "adcs r2, r6\n\t"
  154670. #else
  154671. "adc r2, r6\n\t"
  154672. #endif
  154673. #ifdef WOLFSSL_KEIL
  154674. "adcs r3, r3, %[r]\n\t"
  154675. #elif defined(__clang__)
  154676. "adcs r3, %[r]\n\t"
  154677. #else
  154678. "adc r3, %[r]\n\t"
  154679. #endif
  154680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154681. "adds r4, r4, r5\n\t"
  154682. #else
  154683. "add r4, r4, r5\n\t"
  154684. #endif
  154685. #ifdef WOLFSSL_KEIL
  154686. "adcs r2, r2, r6\n\t"
  154687. #elif defined(__clang__)
  154688. "adcs r2, r6\n\t"
  154689. #else
  154690. "adc r2, r6\n\t"
  154691. #endif
  154692. #ifdef WOLFSSL_KEIL
  154693. "adcs r3, r3, %[r]\n\t"
  154694. #elif defined(__clang__)
  154695. "adcs r3, %[r]\n\t"
  154696. #else
  154697. "adc r3, %[r]\n\t"
  154698. #endif
  154699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154700. "lsrs r5, %[a], #16\n\t"
  154701. #else
  154702. "lsr r5, %[a], #16\n\t"
  154703. #endif
  154704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154705. "lsrs r6, r7, #16\n\t"
  154706. #else
  154707. "lsr r6, r7, #16\n\t"
  154708. #endif
  154709. #ifdef WOLFSSL_KEIL
  154710. "muls r6, r5, r6\n\t"
  154711. #elif defined(__clang__)
  154712. "muls r6, r5\n\t"
  154713. #else
  154714. "mul r6, r5\n\t"
  154715. #endif
  154716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154717. "adds r2, r2, r6\n\t"
  154718. #else
  154719. "add r2, r2, r6\n\t"
  154720. #endif
  154721. #ifdef WOLFSSL_KEIL
  154722. "adcs r3, r3, %[r]\n\t"
  154723. #elif defined(__clang__)
  154724. "adcs r3, %[r]\n\t"
  154725. #else
  154726. "adc r3, %[r]\n\t"
  154727. #endif
  154728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154729. "adds r2, r2, r6\n\t"
  154730. #else
  154731. "add r2, r2, r6\n\t"
  154732. #endif
  154733. #ifdef WOLFSSL_KEIL
  154734. "adcs r3, r3, %[r]\n\t"
  154735. #elif defined(__clang__)
  154736. "adcs r3, %[r]\n\t"
  154737. #else
  154738. "adc r3, %[r]\n\t"
  154739. #endif
  154740. "uxth r6, r7\n\t"
  154741. #ifdef WOLFSSL_KEIL
  154742. "muls r5, r6, r5\n\t"
  154743. #elif defined(__clang__)
  154744. "muls r5, r6\n\t"
  154745. #else
  154746. "mul r5, r6\n\t"
  154747. #endif
  154748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154749. "lsrs r6, r5, #16\n\t"
  154750. #else
  154751. "lsr r6, r5, #16\n\t"
  154752. #endif
  154753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154754. "lsls r5, r5, #16\n\t"
  154755. #else
  154756. "lsl r5, r5, #16\n\t"
  154757. #endif
  154758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154759. "adds r4, r4, r5\n\t"
  154760. #else
  154761. "add r4, r4, r5\n\t"
  154762. #endif
  154763. #ifdef WOLFSSL_KEIL
  154764. "adcs r2, r2, r6\n\t"
  154765. #elif defined(__clang__)
  154766. "adcs r2, r6\n\t"
  154767. #else
  154768. "adc r2, r6\n\t"
  154769. #endif
  154770. #ifdef WOLFSSL_KEIL
  154771. "adcs r3, r3, %[r]\n\t"
  154772. #elif defined(__clang__)
  154773. "adcs r3, %[r]\n\t"
  154774. #else
  154775. "adc r3, %[r]\n\t"
  154776. #endif
  154777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154778. "adds r4, r4, r5\n\t"
  154779. #else
  154780. "add r4, r4, r5\n\t"
  154781. #endif
  154782. #ifdef WOLFSSL_KEIL
  154783. "adcs r2, r2, r6\n\t"
  154784. #elif defined(__clang__)
  154785. "adcs r2, r6\n\t"
  154786. #else
  154787. "adc r2, r6\n\t"
  154788. #endif
  154789. #ifdef WOLFSSL_KEIL
  154790. "adcs r3, r3, %[r]\n\t"
  154791. #elif defined(__clang__)
  154792. "adcs r3, %[r]\n\t"
  154793. #else
  154794. "adc r3, %[r]\n\t"
  154795. #endif
  154796. "# A[5] * A[0]\n\t"
  154797. "mov %[a], r9\n\t"
  154798. "mov r7, r10\n\t"
  154799. "ldr %[a], [%[a], #20]\n\t"
  154800. "uxth r5, %[a]\n\t"
  154801. "uxth r6, r7\n\t"
  154802. #ifdef WOLFSSL_KEIL
  154803. "muls r6, r5, r6\n\t"
  154804. #elif defined(__clang__)
  154805. "muls r6, r5\n\t"
  154806. #else
  154807. "mul r6, r5\n\t"
  154808. #endif
  154809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154810. "adds r4, r4, r6\n\t"
  154811. #else
  154812. "add r4, r4, r6\n\t"
  154813. #endif
  154814. #ifdef WOLFSSL_KEIL
  154815. "adcs r2, r2, %[r]\n\t"
  154816. #elif defined(__clang__)
  154817. "adcs r2, %[r]\n\t"
  154818. #else
  154819. "adc r2, %[r]\n\t"
  154820. #endif
  154821. #ifdef WOLFSSL_KEIL
  154822. "adcs r3, r3, %[r]\n\t"
  154823. #elif defined(__clang__)
  154824. "adcs r3, %[r]\n\t"
  154825. #else
  154826. "adc r3, %[r]\n\t"
  154827. #endif
  154828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154829. "adds r4, r4, r6\n\t"
  154830. #else
  154831. "add r4, r4, r6\n\t"
  154832. #endif
  154833. #ifdef WOLFSSL_KEIL
  154834. "adcs r2, r2, %[r]\n\t"
  154835. #elif defined(__clang__)
  154836. "adcs r2, %[r]\n\t"
  154837. #else
  154838. "adc r2, %[r]\n\t"
  154839. #endif
  154840. #ifdef WOLFSSL_KEIL
  154841. "adcs r3, r3, %[r]\n\t"
  154842. #elif defined(__clang__)
  154843. "adcs r3, %[r]\n\t"
  154844. #else
  154845. "adc r3, %[r]\n\t"
  154846. #endif
  154847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154848. "lsrs r6, r7, #16\n\t"
  154849. #else
  154850. "lsr r6, r7, #16\n\t"
  154851. #endif
  154852. #ifdef WOLFSSL_KEIL
  154853. "muls r5, r6, r5\n\t"
  154854. #elif defined(__clang__)
  154855. "muls r5, r6\n\t"
  154856. #else
  154857. "mul r5, r6\n\t"
  154858. #endif
  154859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154860. "lsrs r6, r5, #16\n\t"
  154861. #else
  154862. "lsr r6, r5, #16\n\t"
  154863. #endif
  154864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154865. "lsls r5, r5, #16\n\t"
  154866. #else
  154867. "lsl r5, r5, #16\n\t"
  154868. #endif
  154869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154870. "adds r4, r4, r5\n\t"
  154871. #else
  154872. "add r4, r4, r5\n\t"
  154873. #endif
  154874. #ifdef WOLFSSL_KEIL
  154875. "adcs r2, r2, r6\n\t"
  154876. #elif defined(__clang__)
  154877. "adcs r2, r6\n\t"
  154878. #else
  154879. "adc r2, r6\n\t"
  154880. #endif
  154881. #ifdef WOLFSSL_KEIL
  154882. "adcs r3, r3, %[r]\n\t"
  154883. #elif defined(__clang__)
  154884. "adcs r3, %[r]\n\t"
  154885. #else
  154886. "adc r3, %[r]\n\t"
  154887. #endif
  154888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154889. "adds r4, r4, r5\n\t"
  154890. #else
  154891. "add r4, r4, r5\n\t"
  154892. #endif
  154893. #ifdef WOLFSSL_KEIL
  154894. "adcs r2, r2, r6\n\t"
  154895. #elif defined(__clang__)
  154896. "adcs r2, r6\n\t"
  154897. #else
  154898. "adc r2, r6\n\t"
  154899. #endif
  154900. #ifdef WOLFSSL_KEIL
  154901. "adcs r3, r3, %[r]\n\t"
  154902. #elif defined(__clang__)
  154903. "adcs r3, %[r]\n\t"
  154904. #else
  154905. "adc r3, %[r]\n\t"
  154906. #endif
  154907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154908. "lsrs r5, %[a], #16\n\t"
  154909. #else
  154910. "lsr r5, %[a], #16\n\t"
  154911. #endif
  154912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154913. "lsrs r6, r7, #16\n\t"
  154914. #else
  154915. "lsr r6, r7, #16\n\t"
  154916. #endif
  154917. #ifdef WOLFSSL_KEIL
  154918. "muls r6, r5, r6\n\t"
  154919. #elif defined(__clang__)
  154920. "muls r6, r5\n\t"
  154921. #else
  154922. "mul r6, r5\n\t"
  154923. #endif
  154924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154925. "adds r2, r2, r6\n\t"
  154926. #else
  154927. "add r2, r2, r6\n\t"
  154928. #endif
  154929. #ifdef WOLFSSL_KEIL
  154930. "adcs r3, r3, %[r]\n\t"
  154931. #elif defined(__clang__)
  154932. "adcs r3, %[r]\n\t"
  154933. #else
  154934. "adc r3, %[r]\n\t"
  154935. #endif
  154936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154937. "adds r2, r2, r6\n\t"
  154938. #else
  154939. "add r2, r2, r6\n\t"
  154940. #endif
  154941. #ifdef WOLFSSL_KEIL
  154942. "adcs r3, r3, %[r]\n\t"
  154943. #elif defined(__clang__)
  154944. "adcs r3, %[r]\n\t"
  154945. #else
  154946. "adc r3, %[r]\n\t"
  154947. #endif
  154948. "uxth r6, r7\n\t"
  154949. #ifdef WOLFSSL_KEIL
  154950. "muls r5, r6, r5\n\t"
  154951. #elif defined(__clang__)
  154952. "muls r5, r6\n\t"
  154953. #else
  154954. "mul r5, r6\n\t"
  154955. #endif
  154956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154957. "lsrs r6, r5, #16\n\t"
  154958. #else
  154959. "lsr r6, r5, #16\n\t"
  154960. #endif
  154961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154962. "lsls r5, r5, #16\n\t"
  154963. #else
  154964. "lsl r5, r5, #16\n\t"
  154965. #endif
  154966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154967. "adds r4, r4, r5\n\t"
  154968. #else
  154969. "add r4, r4, r5\n\t"
  154970. #endif
  154971. #ifdef WOLFSSL_KEIL
  154972. "adcs r2, r2, r6\n\t"
  154973. #elif defined(__clang__)
  154974. "adcs r2, r6\n\t"
  154975. #else
  154976. "adc r2, r6\n\t"
  154977. #endif
  154978. #ifdef WOLFSSL_KEIL
  154979. "adcs r3, r3, %[r]\n\t"
  154980. #elif defined(__clang__)
  154981. "adcs r3, %[r]\n\t"
  154982. #else
  154983. "adc r3, %[r]\n\t"
  154984. #endif
  154985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154986. "adds r4, r4, r5\n\t"
  154987. #else
  154988. "add r4, r4, r5\n\t"
  154989. #endif
  154990. #ifdef WOLFSSL_KEIL
  154991. "adcs r2, r2, r6\n\t"
  154992. #elif defined(__clang__)
  154993. "adcs r2, r6\n\t"
  154994. #else
  154995. "adc r2, r6\n\t"
  154996. #endif
  154997. #ifdef WOLFSSL_KEIL
  154998. "adcs r3, r3, %[r]\n\t"
  154999. #elif defined(__clang__)
  155000. "adcs r3, %[r]\n\t"
  155001. #else
  155002. "adc r3, %[r]\n\t"
  155003. #endif
  155004. "str r4, [sp, #20]\n\t"
  155005. "# A[6] * A[0]\n\t"
  155006. "movs r4, #0\n\t"
  155007. "mov %[a], r9\n\t"
  155008. "ldr %[a], [%[a], #24]\n\t"
  155009. "uxth r5, %[a]\n\t"
  155010. "uxth r6, r7\n\t"
  155011. #ifdef WOLFSSL_KEIL
  155012. "muls r6, r5, r6\n\t"
  155013. #elif defined(__clang__)
  155014. "muls r6, r5\n\t"
  155015. #else
  155016. "mul r6, r5\n\t"
  155017. #endif
  155018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155019. "adds r2, r2, r6\n\t"
  155020. #else
  155021. "add r2, r2, r6\n\t"
  155022. #endif
  155023. #ifdef WOLFSSL_KEIL
  155024. "adcs r3, r3, %[r]\n\t"
  155025. #elif defined(__clang__)
  155026. "adcs r3, %[r]\n\t"
  155027. #else
  155028. "adc r3, %[r]\n\t"
  155029. #endif
  155030. #ifdef WOLFSSL_KEIL
  155031. "adcs r4, r4, %[r]\n\t"
  155032. #elif defined(__clang__)
  155033. "adcs r4, %[r]\n\t"
  155034. #else
  155035. "adc r4, %[r]\n\t"
  155036. #endif
  155037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155038. "adds r2, r2, r6\n\t"
  155039. #else
  155040. "add r2, r2, r6\n\t"
  155041. #endif
  155042. #ifdef WOLFSSL_KEIL
  155043. "adcs r3, r3, %[r]\n\t"
  155044. #elif defined(__clang__)
  155045. "adcs r3, %[r]\n\t"
  155046. #else
  155047. "adc r3, %[r]\n\t"
  155048. #endif
  155049. #ifdef WOLFSSL_KEIL
  155050. "adcs r4, r4, %[r]\n\t"
  155051. #elif defined(__clang__)
  155052. "adcs r4, %[r]\n\t"
  155053. #else
  155054. "adc r4, %[r]\n\t"
  155055. #endif
  155056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155057. "lsrs r6, r7, #16\n\t"
  155058. #else
  155059. "lsr r6, r7, #16\n\t"
  155060. #endif
  155061. #ifdef WOLFSSL_KEIL
  155062. "muls r5, r6, r5\n\t"
  155063. #elif defined(__clang__)
  155064. "muls r5, r6\n\t"
  155065. #else
  155066. "mul r5, r6\n\t"
  155067. #endif
  155068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155069. "lsrs r6, r5, #16\n\t"
  155070. #else
  155071. "lsr r6, r5, #16\n\t"
  155072. #endif
  155073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155074. "lsls r5, r5, #16\n\t"
  155075. #else
  155076. "lsl r5, r5, #16\n\t"
  155077. #endif
  155078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155079. "adds r2, r2, r5\n\t"
  155080. #else
  155081. "add r2, r2, r5\n\t"
  155082. #endif
  155083. #ifdef WOLFSSL_KEIL
  155084. "adcs r3, r3, r6\n\t"
  155085. #elif defined(__clang__)
  155086. "adcs r3, r6\n\t"
  155087. #else
  155088. "adc r3, r6\n\t"
  155089. #endif
  155090. #ifdef WOLFSSL_KEIL
  155091. "adcs r4, r4, %[r]\n\t"
  155092. #elif defined(__clang__)
  155093. "adcs r4, %[r]\n\t"
  155094. #else
  155095. "adc r4, %[r]\n\t"
  155096. #endif
  155097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155098. "adds r2, r2, r5\n\t"
  155099. #else
  155100. "add r2, r2, r5\n\t"
  155101. #endif
  155102. #ifdef WOLFSSL_KEIL
  155103. "adcs r3, r3, r6\n\t"
  155104. #elif defined(__clang__)
  155105. "adcs r3, r6\n\t"
  155106. #else
  155107. "adc r3, r6\n\t"
  155108. #endif
  155109. #ifdef WOLFSSL_KEIL
  155110. "adcs r4, r4, %[r]\n\t"
  155111. #elif defined(__clang__)
  155112. "adcs r4, %[r]\n\t"
  155113. #else
  155114. "adc r4, %[r]\n\t"
  155115. #endif
  155116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155117. "lsrs r5, %[a], #16\n\t"
  155118. #else
  155119. "lsr r5, %[a], #16\n\t"
  155120. #endif
  155121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155122. "lsrs r6, r7, #16\n\t"
  155123. #else
  155124. "lsr r6, r7, #16\n\t"
  155125. #endif
  155126. #ifdef WOLFSSL_KEIL
  155127. "muls r6, r5, r6\n\t"
  155128. #elif defined(__clang__)
  155129. "muls r6, r5\n\t"
  155130. #else
  155131. "mul r6, r5\n\t"
  155132. #endif
  155133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155134. "adds r3, r3, r6\n\t"
  155135. #else
  155136. "add r3, r3, r6\n\t"
  155137. #endif
  155138. #ifdef WOLFSSL_KEIL
  155139. "adcs r4, r4, %[r]\n\t"
  155140. #elif defined(__clang__)
  155141. "adcs r4, %[r]\n\t"
  155142. #else
  155143. "adc r4, %[r]\n\t"
  155144. #endif
  155145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155146. "adds r3, r3, r6\n\t"
  155147. #else
  155148. "add r3, r3, r6\n\t"
  155149. #endif
  155150. #ifdef WOLFSSL_KEIL
  155151. "adcs r4, r4, %[r]\n\t"
  155152. #elif defined(__clang__)
  155153. "adcs r4, %[r]\n\t"
  155154. #else
  155155. "adc r4, %[r]\n\t"
  155156. #endif
  155157. "uxth r6, r7\n\t"
  155158. #ifdef WOLFSSL_KEIL
  155159. "muls r5, r6, r5\n\t"
  155160. #elif defined(__clang__)
  155161. "muls r5, r6\n\t"
  155162. #else
  155163. "mul r5, r6\n\t"
  155164. #endif
  155165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155166. "lsrs r6, r5, #16\n\t"
  155167. #else
  155168. "lsr r6, r5, #16\n\t"
  155169. #endif
  155170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155171. "lsls r5, r5, #16\n\t"
  155172. #else
  155173. "lsl r5, r5, #16\n\t"
  155174. #endif
  155175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155176. "adds r2, r2, r5\n\t"
  155177. #else
  155178. "add r2, r2, r5\n\t"
  155179. #endif
  155180. #ifdef WOLFSSL_KEIL
  155181. "adcs r3, r3, r6\n\t"
  155182. #elif defined(__clang__)
  155183. "adcs r3, r6\n\t"
  155184. #else
  155185. "adc r3, r6\n\t"
  155186. #endif
  155187. #ifdef WOLFSSL_KEIL
  155188. "adcs r4, r4, %[r]\n\t"
  155189. #elif defined(__clang__)
  155190. "adcs r4, %[r]\n\t"
  155191. #else
  155192. "adc r4, %[r]\n\t"
  155193. #endif
  155194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155195. "adds r2, r2, r5\n\t"
  155196. #else
  155197. "add r2, r2, r5\n\t"
  155198. #endif
  155199. #ifdef WOLFSSL_KEIL
  155200. "adcs r3, r3, r6\n\t"
  155201. #elif defined(__clang__)
  155202. "adcs r3, r6\n\t"
  155203. #else
  155204. "adc r3, r6\n\t"
  155205. #endif
  155206. #ifdef WOLFSSL_KEIL
  155207. "adcs r4, r4, %[r]\n\t"
  155208. #elif defined(__clang__)
  155209. "adcs r4, %[r]\n\t"
  155210. #else
  155211. "adc r4, %[r]\n\t"
  155212. #endif
  155213. "# A[5] * A[1]\n\t"
  155214. "mov %[a], r9\n\t"
  155215. "mov r7, r11\n\t"
  155216. "ldr %[a], [%[a], #20]\n\t"
  155217. "uxth r5, %[a]\n\t"
  155218. "uxth r6, r7\n\t"
  155219. #ifdef WOLFSSL_KEIL
  155220. "muls r6, r5, r6\n\t"
  155221. #elif defined(__clang__)
  155222. "muls r6, r5\n\t"
  155223. #else
  155224. "mul r6, r5\n\t"
  155225. #endif
  155226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155227. "adds r2, r2, r6\n\t"
  155228. #else
  155229. "add r2, r2, r6\n\t"
  155230. #endif
  155231. #ifdef WOLFSSL_KEIL
  155232. "adcs r3, r3, %[r]\n\t"
  155233. #elif defined(__clang__)
  155234. "adcs r3, %[r]\n\t"
  155235. #else
  155236. "adc r3, %[r]\n\t"
  155237. #endif
  155238. #ifdef WOLFSSL_KEIL
  155239. "adcs r4, r4, %[r]\n\t"
  155240. #elif defined(__clang__)
  155241. "adcs r4, %[r]\n\t"
  155242. #else
  155243. "adc r4, %[r]\n\t"
  155244. #endif
  155245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155246. "adds r2, r2, r6\n\t"
  155247. #else
  155248. "add r2, r2, r6\n\t"
  155249. #endif
  155250. #ifdef WOLFSSL_KEIL
  155251. "adcs r3, r3, %[r]\n\t"
  155252. #elif defined(__clang__)
  155253. "adcs r3, %[r]\n\t"
  155254. #else
  155255. "adc r3, %[r]\n\t"
  155256. #endif
  155257. #ifdef WOLFSSL_KEIL
  155258. "adcs r4, r4, %[r]\n\t"
  155259. #elif defined(__clang__)
  155260. "adcs r4, %[r]\n\t"
  155261. #else
  155262. "adc r4, %[r]\n\t"
  155263. #endif
  155264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155265. "lsrs r6, r7, #16\n\t"
  155266. #else
  155267. "lsr r6, r7, #16\n\t"
  155268. #endif
  155269. #ifdef WOLFSSL_KEIL
  155270. "muls r5, r6, r5\n\t"
  155271. #elif defined(__clang__)
  155272. "muls r5, r6\n\t"
  155273. #else
  155274. "mul r5, r6\n\t"
  155275. #endif
  155276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155277. "lsrs r6, r5, #16\n\t"
  155278. #else
  155279. "lsr r6, r5, #16\n\t"
  155280. #endif
  155281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155282. "lsls r5, r5, #16\n\t"
  155283. #else
  155284. "lsl r5, r5, #16\n\t"
  155285. #endif
  155286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155287. "adds r2, r2, r5\n\t"
  155288. #else
  155289. "add r2, r2, r5\n\t"
  155290. #endif
  155291. #ifdef WOLFSSL_KEIL
  155292. "adcs r3, r3, r6\n\t"
  155293. #elif defined(__clang__)
  155294. "adcs r3, r6\n\t"
  155295. #else
  155296. "adc r3, r6\n\t"
  155297. #endif
  155298. #ifdef WOLFSSL_KEIL
  155299. "adcs r4, r4, %[r]\n\t"
  155300. #elif defined(__clang__)
  155301. "adcs r4, %[r]\n\t"
  155302. #else
  155303. "adc r4, %[r]\n\t"
  155304. #endif
  155305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155306. "adds r2, r2, r5\n\t"
  155307. #else
  155308. "add r2, r2, r5\n\t"
  155309. #endif
  155310. #ifdef WOLFSSL_KEIL
  155311. "adcs r3, r3, r6\n\t"
  155312. #elif defined(__clang__)
  155313. "adcs r3, r6\n\t"
  155314. #else
  155315. "adc r3, r6\n\t"
  155316. #endif
  155317. #ifdef WOLFSSL_KEIL
  155318. "adcs r4, r4, %[r]\n\t"
  155319. #elif defined(__clang__)
  155320. "adcs r4, %[r]\n\t"
  155321. #else
  155322. "adc r4, %[r]\n\t"
  155323. #endif
  155324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155325. "lsrs r5, %[a], #16\n\t"
  155326. #else
  155327. "lsr r5, %[a], #16\n\t"
  155328. #endif
  155329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155330. "lsrs r6, r7, #16\n\t"
  155331. #else
  155332. "lsr r6, r7, #16\n\t"
  155333. #endif
  155334. #ifdef WOLFSSL_KEIL
  155335. "muls r6, r5, r6\n\t"
  155336. #elif defined(__clang__)
  155337. "muls r6, r5\n\t"
  155338. #else
  155339. "mul r6, r5\n\t"
  155340. #endif
  155341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155342. "adds r3, r3, r6\n\t"
  155343. #else
  155344. "add r3, r3, r6\n\t"
  155345. #endif
  155346. #ifdef WOLFSSL_KEIL
  155347. "adcs r4, r4, %[r]\n\t"
  155348. #elif defined(__clang__)
  155349. "adcs r4, %[r]\n\t"
  155350. #else
  155351. "adc r4, %[r]\n\t"
  155352. #endif
  155353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155354. "adds r3, r3, r6\n\t"
  155355. #else
  155356. "add r3, r3, r6\n\t"
  155357. #endif
  155358. #ifdef WOLFSSL_KEIL
  155359. "adcs r4, r4, %[r]\n\t"
  155360. #elif defined(__clang__)
  155361. "adcs r4, %[r]\n\t"
  155362. #else
  155363. "adc r4, %[r]\n\t"
  155364. #endif
  155365. "uxth r6, r7\n\t"
  155366. #ifdef WOLFSSL_KEIL
  155367. "muls r5, r6, r5\n\t"
  155368. #elif defined(__clang__)
  155369. "muls r5, r6\n\t"
  155370. #else
  155371. "mul r5, r6\n\t"
  155372. #endif
  155373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155374. "lsrs r6, r5, #16\n\t"
  155375. #else
  155376. "lsr r6, r5, #16\n\t"
  155377. #endif
  155378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155379. "lsls r5, r5, #16\n\t"
  155380. #else
  155381. "lsl r5, r5, #16\n\t"
  155382. #endif
  155383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155384. "adds r2, r2, r5\n\t"
  155385. #else
  155386. "add r2, r2, r5\n\t"
  155387. #endif
  155388. #ifdef WOLFSSL_KEIL
  155389. "adcs r3, r3, r6\n\t"
  155390. #elif defined(__clang__)
  155391. "adcs r3, r6\n\t"
  155392. #else
  155393. "adc r3, r6\n\t"
  155394. #endif
  155395. #ifdef WOLFSSL_KEIL
  155396. "adcs r4, r4, %[r]\n\t"
  155397. #elif defined(__clang__)
  155398. "adcs r4, %[r]\n\t"
  155399. #else
  155400. "adc r4, %[r]\n\t"
  155401. #endif
  155402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155403. "adds r2, r2, r5\n\t"
  155404. #else
  155405. "add r2, r2, r5\n\t"
  155406. #endif
  155407. #ifdef WOLFSSL_KEIL
  155408. "adcs r3, r3, r6\n\t"
  155409. #elif defined(__clang__)
  155410. "adcs r3, r6\n\t"
  155411. #else
  155412. "adc r3, r6\n\t"
  155413. #endif
  155414. #ifdef WOLFSSL_KEIL
  155415. "adcs r4, r4, %[r]\n\t"
  155416. #elif defined(__clang__)
  155417. "adcs r4, %[r]\n\t"
  155418. #else
  155419. "adc r4, %[r]\n\t"
  155420. #endif
  155421. "# A[4] * A[2]\n\t"
  155422. "mov %[a], r9\n\t"
  155423. "mov r7, r12\n\t"
  155424. "ldr %[a], [%[a], #16]\n\t"
  155425. "uxth r5, %[a]\n\t"
  155426. "uxth r6, r7\n\t"
  155427. #ifdef WOLFSSL_KEIL
  155428. "muls r6, r5, r6\n\t"
  155429. #elif defined(__clang__)
  155430. "muls r6, r5\n\t"
  155431. #else
  155432. "mul r6, r5\n\t"
  155433. #endif
  155434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155435. "adds r2, r2, r6\n\t"
  155436. #else
  155437. "add r2, r2, r6\n\t"
  155438. #endif
  155439. #ifdef WOLFSSL_KEIL
  155440. "adcs r3, r3, %[r]\n\t"
  155441. #elif defined(__clang__)
  155442. "adcs r3, %[r]\n\t"
  155443. #else
  155444. "adc r3, %[r]\n\t"
  155445. #endif
  155446. #ifdef WOLFSSL_KEIL
  155447. "adcs r4, r4, %[r]\n\t"
  155448. #elif defined(__clang__)
  155449. "adcs r4, %[r]\n\t"
  155450. #else
  155451. "adc r4, %[r]\n\t"
  155452. #endif
  155453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155454. "adds r2, r2, r6\n\t"
  155455. #else
  155456. "add r2, r2, r6\n\t"
  155457. #endif
  155458. #ifdef WOLFSSL_KEIL
  155459. "adcs r3, r3, %[r]\n\t"
  155460. #elif defined(__clang__)
  155461. "adcs r3, %[r]\n\t"
  155462. #else
  155463. "adc r3, %[r]\n\t"
  155464. #endif
  155465. #ifdef WOLFSSL_KEIL
  155466. "adcs r4, r4, %[r]\n\t"
  155467. #elif defined(__clang__)
  155468. "adcs r4, %[r]\n\t"
  155469. #else
  155470. "adc r4, %[r]\n\t"
  155471. #endif
  155472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155473. "lsrs r6, r7, #16\n\t"
  155474. #else
  155475. "lsr r6, r7, #16\n\t"
  155476. #endif
  155477. #ifdef WOLFSSL_KEIL
  155478. "muls r5, r6, r5\n\t"
  155479. #elif defined(__clang__)
  155480. "muls r5, r6\n\t"
  155481. #else
  155482. "mul r5, r6\n\t"
  155483. #endif
  155484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155485. "lsrs r6, r5, #16\n\t"
  155486. #else
  155487. "lsr r6, r5, #16\n\t"
  155488. #endif
  155489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155490. "lsls r5, r5, #16\n\t"
  155491. #else
  155492. "lsl r5, r5, #16\n\t"
  155493. #endif
  155494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155495. "adds r2, r2, r5\n\t"
  155496. #else
  155497. "add r2, r2, r5\n\t"
  155498. #endif
  155499. #ifdef WOLFSSL_KEIL
  155500. "adcs r3, r3, r6\n\t"
  155501. #elif defined(__clang__)
  155502. "adcs r3, r6\n\t"
  155503. #else
  155504. "adc r3, r6\n\t"
  155505. #endif
  155506. #ifdef WOLFSSL_KEIL
  155507. "adcs r4, r4, %[r]\n\t"
  155508. #elif defined(__clang__)
  155509. "adcs r4, %[r]\n\t"
  155510. #else
  155511. "adc r4, %[r]\n\t"
  155512. #endif
  155513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155514. "adds r2, r2, r5\n\t"
  155515. #else
  155516. "add r2, r2, r5\n\t"
  155517. #endif
  155518. #ifdef WOLFSSL_KEIL
  155519. "adcs r3, r3, r6\n\t"
  155520. #elif defined(__clang__)
  155521. "adcs r3, r6\n\t"
  155522. #else
  155523. "adc r3, r6\n\t"
  155524. #endif
  155525. #ifdef WOLFSSL_KEIL
  155526. "adcs r4, r4, %[r]\n\t"
  155527. #elif defined(__clang__)
  155528. "adcs r4, %[r]\n\t"
  155529. #else
  155530. "adc r4, %[r]\n\t"
  155531. #endif
  155532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155533. "lsrs r5, %[a], #16\n\t"
  155534. #else
  155535. "lsr r5, %[a], #16\n\t"
  155536. #endif
  155537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155538. "lsrs r6, r7, #16\n\t"
  155539. #else
  155540. "lsr r6, r7, #16\n\t"
  155541. #endif
  155542. #ifdef WOLFSSL_KEIL
  155543. "muls r6, r5, r6\n\t"
  155544. #elif defined(__clang__)
  155545. "muls r6, r5\n\t"
  155546. #else
  155547. "mul r6, r5\n\t"
  155548. #endif
  155549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155550. "adds r3, r3, r6\n\t"
  155551. #else
  155552. "add r3, r3, r6\n\t"
  155553. #endif
  155554. #ifdef WOLFSSL_KEIL
  155555. "adcs r4, r4, %[r]\n\t"
  155556. #elif defined(__clang__)
  155557. "adcs r4, %[r]\n\t"
  155558. #else
  155559. "adc r4, %[r]\n\t"
  155560. #endif
  155561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155562. "adds r3, r3, r6\n\t"
  155563. #else
  155564. "add r3, r3, r6\n\t"
  155565. #endif
  155566. #ifdef WOLFSSL_KEIL
  155567. "adcs r4, r4, %[r]\n\t"
  155568. #elif defined(__clang__)
  155569. "adcs r4, %[r]\n\t"
  155570. #else
  155571. "adc r4, %[r]\n\t"
  155572. #endif
  155573. "uxth r6, r7\n\t"
  155574. #ifdef WOLFSSL_KEIL
  155575. "muls r5, r6, r5\n\t"
  155576. #elif defined(__clang__)
  155577. "muls r5, r6\n\t"
  155578. #else
  155579. "mul r5, r6\n\t"
  155580. #endif
  155581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155582. "lsrs r6, r5, #16\n\t"
  155583. #else
  155584. "lsr r6, r5, #16\n\t"
  155585. #endif
  155586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155587. "lsls r5, r5, #16\n\t"
  155588. #else
  155589. "lsl r5, r5, #16\n\t"
  155590. #endif
  155591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155592. "adds r2, r2, r5\n\t"
  155593. #else
  155594. "add r2, r2, r5\n\t"
  155595. #endif
  155596. #ifdef WOLFSSL_KEIL
  155597. "adcs r3, r3, r6\n\t"
  155598. #elif defined(__clang__)
  155599. "adcs r3, r6\n\t"
  155600. #else
  155601. "adc r3, r6\n\t"
  155602. #endif
  155603. #ifdef WOLFSSL_KEIL
  155604. "adcs r4, r4, %[r]\n\t"
  155605. #elif defined(__clang__)
  155606. "adcs r4, %[r]\n\t"
  155607. #else
  155608. "adc r4, %[r]\n\t"
  155609. #endif
  155610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155611. "adds r2, r2, r5\n\t"
  155612. #else
  155613. "add r2, r2, r5\n\t"
  155614. #endif
  155615. #ifdef WOLFSSL_KEIL
  155616. "adcs r3, r3, r6\n\t"
  155617. #elif defined(__clang__)
  155618. "adcs r3, r6\n\t"
  155619. #else
  155620. "adc r3, r6\n\t"
  155621. #endif
  155622. #ifdef WOLFSSL_KEIL
  155623. "adcs r4, r4, %[r]\n\t"
  155624. #elif defined(__clang__)
  155625. "adcs r4, %[r]\n\t"
  155626. #else
  155627. "adc r4, %[r]\n\t"
  155628. #endif
  155629. "# A[3] * A[3]\n\t"
  155630. "mov r7, lr\n\t"
  155631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155632. "lsrs r6, r7, #16\n\t"
  155633. #else
  155634. "lsr r6, r7, #16\n\t"
  155635. #endif
  155636. "uxth r5, r7\n\t"
  155637. #ifdef WOLFSSL_KEIL
  155638. "muls r5, r5, r5\n\t"
  155639. #elif defined(__clang__)
  155640. "muls r5, r5\n\t"
  155641. #else
  155642. "mul r5, r5\n\t"
  155643. #endif
  155644. #ifdef WOLFSSL_KEIL
  155645. "muls r6, r6, r6\n\t"
  155646. #elif defined(__clang__)
  155647. "muls r6, r6\n\t"
  155648. #else
  155649. "mul r6, r6\n\t"
  155650. #endif
  155651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155652. "adds r2, r2, r5\n\t"
  155653. #else
  155654. "add r2, r2, r5\n\t"
  155655. #endif
  155656. #ifdef WOLFSSL_KEIL
  155657. "adcs r3, r3, r6\n\t"
  155658. #elif defined(__clang__)
  155659. "adcs r3, r6\n\t"
  155660. #else
  155661. "adc r3, r6\n\t"
  155662. #endif
  155663. #ifdef WOLFSSL_KEIL
  155664. "adcs r4, r4, %[r]\n\t"
  155665. #elif defined(__clang__)
  155666. "adcs r4, %[r]\n\t"
  155667. #else
  155668. "adc r4, %[r]\n\t"
  155669. #endif
  155670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155671. "lsrs r6, r7, #16\n\t"
  155672. #else
  155673. "lsr r6, r7, #16\n\t"
  155674. #endif
  155675. "uxth r5, r7\n\t"
  155676. #ifdef WOLFSSL_KEIL
  155677. "muls r5, r6, r5\n\t"
  155678. #elif defined(__clang__)
  155679. "muls r5, r6\n\t"
  155680. #else
  155681. "mul r5, r6\n\t"
  155682. #endif
  155683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155684. "lsrs r6, r5, #15\n\t"
  155685. #else
  155686. "lsr r6, r5, #15\n\t"
  155687. #endif
  155688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155689. "lsls r5, r5, #17\n\t"
  155690. #else
  155691. "lsl r5, r5, #17\n\t"
  155692. #endif
  155693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155694. "adds r2, r2, r5\n\t"
  155695. #else
  155696. "add r2, r2, r5\n\t"
  155697. #endif
  155698. #ifdef WOLFSSL_KEIL
  155699. "adcs r3, r3, r6\n\t"
  155700. #elif defined(__clang__)
  155701. "adcs r3, r6\n\t"
  155702. #else
  155703. "adc r3, r6\n\t"
  155704. #endif
  155705. #ifdef WOLFSSL_KEIL
  155706. "adcs r4, r4, %[r]\n\t"
  155707. #elif defined(__clang__)
  155708. "adcs r4, %[r]\n\t"
  155709. #else
  155710. "adc r4, %[r]\n\t"
  155711. #endif
  155712. "str r2, [sp, #24]\n\t"
  155713. "# A[4] * A[3]\n\t"
  155714. "movs r2, #0\n\t"
  155715. "mov %[a], r9\n\t"
  155716. "ldr %[a], [%[a], #16]\n\t"
  155717. "uxth r5, %[a]\n\t"
  155718. "uxth r6, r7\n\t"
  155719. #ifdef WOLFSSL_KEIL
  155720. "muls r6, r5, r6\n\t"
  155721. #elif defined(__clang__)
  155722. "muls r6, r5\n\t"
  155723. #else
  155724. "mul r6, r5\n\t"
  155725. #endif
  155726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155727. "adds r3, r3, r6\n\t"
  155728. #else
  155729. "add r3, r3, r6\n\t"
  155730. #endif
  155731. #ifdef WOLFSSL_KEIL
  155732. "adcs r4, r4, %[r]\n\t"
  155733. #elif defined(__clang__)
  155734. "adcs r4, %[r]\n\t"
  155735. #else
  155736. "adc r4, %[r]\n\t"
  155737. #endif
  155738. #ifdef WOLFSSL_KEIL
  155739. "adcs r2, r2, %[r]\n\t"
  155740. #elif defined(__clang__)
  155741. "adcs r2, %[r]\n\t"
  155742. #else
  155743. "adc r2, %[r]\n\t"
  155744. #endif
  155745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155746. "adds r3, r3, r6\n\t"
  155747. #else
  155748. "add r3, r3, r6\n\t"
  155749. #endif
  155750. #ifdef WOLFSSL_KEIL
  155751. "adcs r4, r4, %[r]\n\t"
  155752. #elif defined(__clang__)
  155753. "adcs r4, %[r]\n\t"
  155754. #else
  155755. "adc r4, %[r]\n\t"
  155756. #endif
  155757. #ifdef WOLFSSL_KEIL
  155758. "adcs r2, r2, %[r]\n\t"
  155759. #elif defined(__clang__)
  155760. "adcs r2, %[r]\n\t"
  155761. #else
  155762. "adc r2, %[r]\n\t"
  155763. #endif
  155764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155765. "lsrs r6, r7, #16\n\t"
  155766. #else
  155767. "lsr r6, r7, #16\n\t"
  155768. #endif
  155769. #ifdef WOLFSSL_KEIL
  155770. "muls r5, r6, r5\n\t"
  155771. #elif defined(__clang__)
  155772. "muls r5, r6\n\t"
  155773. #else
  155774. "mul r5, r6\n\t"
  155775. #endif
  155776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155777. "lsrs r6, r5, #16\n\t"
  155778. #else
  155779. "lsr r6, r5, #16\n\t"
  155780. #endif
  155781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155782. "lsls r5, r5, #16\n\t"
  155783. #else
  155784. "lsl r5, r5, #16\n\t"
  155785. #endif
  155786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155787. "adds r3, r3, r5\n\t"
  155788. #else
  155789. "add r3, r3, r5\n\t"
  155790. #endif
  155791. #ifdef WOLFSSL_KEIL
  155792. "adcs r4, r4, r6\n\t"
  155793. #elif defined(__clang__)
  155794. "adcs r4, r6\n\t"
  155795. #else
  155796. "adc r4, r6\n\t"
  155797. #endif
  155798. #ifdef WOLFSSL_KEIL
  155799. "adcs r2, r2, %[r]\n\t"
  155800. #elif defined(__clang__)
  155801. "adcs r2, %[r]\n\t"
  155802. #else
  155803. "adc r2, %[r]\n\t"
  155804. #endif
  155805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155806. "adds r3, r3, r5\n\t"
  155807. #else
  155808. "add r3, r3, r5\n\t"
  155809. #endif
  155810. #ifdef WOLFSSL_KEIL
  155811. "adcs r4, r4, r6\n\t"
  155812. #elif defined(__clang__)
  155813. "adcs r4, r6\n\t"
  155814. #else
  155815. "adc r4, r6\n\t"
  155816. #endif
  155817. #ifdef WOLFSSL_KEIL
  155818. "adcs r2, r2, %[r]\n\t"
  155819. #elif defined(__clang__)
  155820. "adcs r2, %[r]\n\t"
  155821. #else
  155822. "adc r2, %[r]\n\t"
  155823. #endif
  155824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155825. "lsrs r5, %[a], #16\n\t"
  155826. #else
  155827. "lsr r5, %[a], #16\n\t"
  155828. #endif
  155829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155830. "lsrs r6, r7, #16\n\t"
  155831. #else
  155832. "lsr r6, r7, #16\n\t"
  155833. #endif
  155834. #ifdef WOLFSSL_KEIL
  155835. "muls r6, r5, r6\n\t"
  155836. #elif defined(__clang__)
  155837. "muls r6, r5\n\t"
  155838. #else
  155839. "mul r6, r5\n\t"
  155840. #endif
  155841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155842. "adds r4, r4, r6\n\t"
  155843. #else
  155844. "add r4, r4, r6\n\t"
  155845. #endif
  155846. #ifdef WOLFSSL_KEIL
  155847. "adcs r2, r2, %[r]\n\t"
  155848. #elif defined(__clang__)
  155849. "adcs r2, %[r]\n\t"
  155850. #else
  155851. "adc r2, %[r]\n\t"
  155852. #endif
  155853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155854. "adds r4, r4, r6\n\t"
  155855. #else
  155856. "add r4, r4, r6\n\t"
  155857. #endif
  155858. #ifdef WOLFSSL_KEIL
  155859. "adcs r2, r2, %[r]\n\t"
  155860. #elif defined(__clang__)
  155861. "adcs r2, %[r]\n\t"
  155862. #else
  155863. "adc r2, %[r]\n\t"
  155864. #endif
  155865. "uxth r6, r7\n\t"
  155866. #ifdef WOLFSSL_KEIL
  155867. "muls r5, r6, r5\n\t"
  155868. #elif defined(__clang__)
  155869. "muls r5, r6\n\t"
  155870. #else
  155871. "mul r5, r6\n\t"
  155872. #endif
  155873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155874. "lsrs r6, r5, #16\n\t"
  155875. #else
  155876. "lsr r6, r5, #16\n\t"
  155877. #endif
  155878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155879. "lsls r5, r5, #16\n\t"
  155880. #else
  155881. "lsl r5, r5, #16\n\t"
  155882. #endif
  155883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155884. "adds r3, r3, r5\n\t"
  155885. #else
  155886. "add r3, r3, r5\n\t"
  155887. #endif
  155888. #ifdef WOLFSSL_KEIL
  155889. "adcs r4, r4, r6\n\t"
  155890. #elif defined(__clang__)
  155891. "adcs r4, r6\n\t"
  155892. #else
  155893. "adc r4, r6\n\t"
  155894. #endif
  155895. #ifdef WOLFSSL_KEIL
  155896. "adcs r2, r2, %[r]\n\t"
  155897. #elif defined(__clang__)
  155898. "adcs r2, %[r]\n\t"
  155899. #else
  155900. "adc r2, %[r]\n\t"
  155901. #endif
  155902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155903. "adds r3, r3, r5\n\t"
  155904. #else
  155905. "add r3, r3, r5\n\t"
  155906. #endif
  155907. #ifdef WOLFSSL_KEIL
  155908. "adcs r4, r4, r6\n\t"
  155909. #elif defined(__clang__)
  155910. "adcs r4, r6\n\t"
  155911. #else
  155912. "adc r4, r6\n\t"
  155913. #endif
  155914. #ifdef WOLFSSL_KEIL
  155915. "adcs r2, r2, %[r]\n\t"
  155916. #elif defined(__clang__)
  155917. "adcs r2, %[r]\n\t"
  155918. #else
  155919. "adc r2, %[r]\n\t"
  155920. #endif
  155921. "# A[5] * A[2]\n\t"
  155922. "mov %[a], r9\n\t"
  155923. "mov r7, r12\n\t"
  155924. "ldr %[a], [%[a], #20]\n\t"
  155925. "uxth r5, %[a]\n\t"
  155926. "uxth r6, r7\n\t"
  155927. #ifdef WOLFSSL_KEIL
  155928. "muls r6, r5, r6\n\t"
  155929. #elif defined(__clang__)
  155930. "muls r6, r5\n\t"
  155931. #else
  155932. "mul r6, r5\n\t"
  155933. #endif
  155934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155935. "adds r3, r3, r6\n\t"
  155936. #else
  155937. "add r3, r3, r6\n\t"
  155938. #endif
  155939. #ifdef WOLFSSL_KEIL
  155940. "adcs r4, r4, %[r]\n\t"
  155941. #elif defined(__clang__)
  155942. "adcs r4, %[r]\n\t"
  155943. #else
  155944. "adc r4, %[r]\n\t"
  155945. #endif
  155946. #ifdef WOLFSSL_KEIL
  155947. "adcs r2, r2, %[r]\n\t"
  155948. #elif defined(__clang__)
  155949. "adcs r2, %[r]\n\t"
  155950. #else
  155951. "adc r2, %[r]\n\t"
  155952. #endif
  155953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155954. "adds r3, r3, r6\n\t"
  155955. #else
  155956. "add r3, r3, r6\n\t"
  155957. #endif
  155958. #ifdef WOLFSSL_KEIL
  155959. "adcs r4, r4, %[r]\n\t"
  155960. #elif defined(__clang__)
  155961. "adcs r4, %[r]\n\t"
  155962. #else
  155963. "adc r4, %[r]\n\t"
  155964. #endif
  155965. #ifdef WOLFSSL_KEIL
  155966. "adcs r2, r2, %[r]\n\t"
  155967. #elif defined(__clang__)
  155968. "adcs r2, %[r]\n\t"
  155969. #else
  155970. "adc r2, %[r]\n\t"
  155971. #endif
  155972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155973. "lsrs r6, r7, #16\n\t"
  155974. #else
  155975. "lsr r6, r7, #16\n\t"
  155976. #endif
  155977. #ifdef WOLFSSL_KEIL
  155978. "muls r5, r6, r5\n\t"
  155979. #elif defined(__clang__)
  155980. "muls r5, r6\n\t"
  155981. #else
  155982. "mul r5, r6\n\t"
  155983. #endif
  155984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155985. "lsrs r6, r5, #16\n\t"
  155986. #else
  155987. "lsr r6, r5, #16\n\t"
  155988. #endif
  155989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155990. "lsls r5, r5, #16\n\t"
  155991. #else
  155992. "lsl r5, r5, #16\n\t"
  155993. #endif
  155994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155995. "adds r3, r3, r5\n\t"
  155996. #else
  155997. "add r3, r3, r5\n\t"
  155998. #endif
  155999. #ifdef WOLFSSL_KEIL
  156000. "adcs r4, r4, r6\n\t"
  156001. #elif defined(__clang__)
  156002. "adcs r4, r6\n\t"
  156003. #else
  156004. "adc r4, r6\n\t"
  156005. #endif
  156006. #ifdef WOLFSSL_KEIL
  156007. "adcs r2, r2, %[r]\n\t"
  156008. #elif defined(__clang__)
  156009. "adcs r2, %[r]\n\t"
  156010. #else
  156011. "adc r2, %[r]\n\t"
  156012. #endif
  156013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156014. "adds r3, r3, r5\n\t"
  156015. #else
  156016. "add r3, r3, r5\n\t"
  156017. #endif
  156018. #ifdef WOLFSSL_KEIL
  156019. "adcs r4, r4, r6\n\t"
  156020. #elif defined(__clang__)
  156021. "adcs r4, r6\n\t"
  156022. #else
  156023. "adc r4, r6\n\t"
  156024. #endif
  156025. #ifdef WOLFSSL_KEIL
  156026. "adcs r2, r2, %[r]\n\t"
  156027. #elif defined(__clang__)
  156028. "adcs r2, %[r]\n\t"
  156029. #else
  156030. "adc r2, %[r]\n\t"
  156031. #endif
  156032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156033. "lsrs r5, %[a], #16\n\t"
  156034. #else
  156035. "lsr r5, %[a], #16\n\t"
  156036. #endif
  156037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156038. "lsrs r6, r7, #16\n\t"
  156039. #else
  156040. "lsr r6, r7, #16\n\t"
  156041. #endif
  156042. #ifdef WOLFSSL_KEIL
  156043. "muls r6, r5, r6\n\t"
  156044. #elif defined(__clang__)
  156045. "muls r6, r5\n\t"
  156046. #else
  156047. "mul r6, r5\n\t"
  156048. #endif
  156049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156050. "adds r4, r4, r6\n\t"
  156051. #else
  156052. "add r4, r4, r6\n\t"
  156053. #endif
  156054. #ifdef WOLFSSL_KEIL
  156055. "adcs r2, r2, %[r]\n\t"
  156056. #elif defined(__clang__)
  156057. "adcs r2, %[r]\n\t"
  156058. #else
  156059. "adc r2, %[r]\n\t"
  156060. #endif
  156061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156062. "adds r4, r4, r6\n\t"
  156063. #else
  156064. "add r4, r4, r6\n\t"
  156065. #endif
  156066. #ifdef WOLFSSL_KEIL
  156067. "adcs r2, r2, %[r]\n\t"
  156068. #elif defined(__clang__)
  156069. "adcs r2, %[r]\n\t"
  156070. #else
  156071. "adc r2, %[r]\n\t"
  156072. #endif
  156073. "uxth r6, r7\n\t"
  156074. #ifdef WOLFSSL_KEIL
  156075. "muls r5, r6, r5\n\t"
  156076. #elif defined(__clang__)
  156077. "muls r5, r6\n\t"
  156078. #else
  156079. "mul r5, r6\n\t"
  156080. #endif
  156081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156082. "lsrs r6, r5, #16\n\t"
  156083. #else
  156084. "lsr r6, r5, #16\n\t"
  156085. #endif
  156086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156087. "lsls r5, r5, #16\n\t"
  156088. #else
  156089. "lsl r5, r5, #16\n\t"
  156090. #endif
  156091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156092. "adds r3, r3, r5\n\t"
  156093. #else
  156094. "add r3, r3, r5\n\t"
  156095. #endif
  156096. #ifdef WOLFSSL_KEIL
  156097. "adcs r4, r4, r6\n\t"
  156098. #elif defined(__clang__)
  156099. "adcs r4, r6\n\t"
  156100. #else
  156101. "adc r4, r6\n\t"
  156102. #endif
  156103. #ifdef WOLFSSL_KEIL
  156104. "adcs r2, r2, %[r]\n\t"
  156105. #elif defined(__clang__)
  156106. "adcs r2, %[r]\n\t"
  156107. #else
  156108. "adc r2, %[r]\n\t"
  156109. #endif
  156110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156111. "adds r3, r3, r5\n\t"
  156112. #else
  156113. "add r3, r3, r5\n\t"
  156114. #endif
  156115. #ifdef WOLFSSL_KEIL
  156116. "adcs r4, r4, r6\n\t"
  156117. #elif defined(__clang__)
  156118. "adcs r4, r6\n\t"
  156119. #else
  156120. "adc r4, r6\n\t"
  156121. #endif
  156122. #ifdef WOLFSSL_KEIL
  156123. "adcs r2, r2, %[r]\n\t"
  156124. #elif defined(__clang__)
  156125. "adcs r2, %[r]\n\t"
  156126. #else
  156127. "adc r2, %[r]\n\t"
  156128. #endif
  156129. "# A[6] * A[1]\n\t"
  156130. "mov %[a], r9\n\t"
  156131. "mov r7, r11\n\t"
  156132. "ldr %[a], [%[a], #24]\n\t"
  156133. "uxth r5, %[a]\n\t"
  156134. "uxth r6, r7\n\t"
  156135. #ifdef WOLFSSL_KEIL
  156136. "muls r6, r5, r6\n\t"
  156137. #elif defined(__clang__)
  156138. "muls r6, r5\n\t"
  156139. #else
  156140. "mul r6, r5\n\t"
  156141. #endif
  156142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156143. "adds r3, r3, r6\n\t"
  156144. #else
  156145. "add r3, r3, r6\n\t"
  156146. #endif
  156147. #ifdef WOLFSSL_KEIL
  156148. "adcs r4, r4, %[r]\n\t"
  156149. #elif defined(__clang__)
  156150. "adcs r4, %[r]\n\t"
  156151. #else
  156152. "adc r4, %[r]\n\t"
  156153. #endif
  156154. #ifdef WOLFSSL_KEIL
  156155. "adcs r2, r2, %[r]\n\t"
  156156. #elif defined(__clang__)
  156157. "adcs r2, %[r]\n\t"
  156158. #else
  156159. "adc r2, %[r]\n\t"
  156160. #endif
  156161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156162. "adds r3, r3, r6\n\t"
  156163. #else
  156164. "add r3, r3, r6\n\t"
  156165. #endif
  156166. #ifdef WOLFSSL_KEIL
  156167. "adcs r4, r4, %[r]\n\t"
  156168. #elif defined(__clang__)
  156169. "adcs r4, %[r]\n\t"
  156170. #else
  156171. "adc r4, %[r]\n\t"
  156172. #endif
  156173. #ifdef WOLFSSL_KEIL
  156174. "adcs r2, r2, %[r]\n\t"
  156175. #elif defined(__clang__)
  156176. "adcs r2, %[r]\n\t"
  156177. #else
  156178. "adc r2, %[r]\n\t"
  156179. #endif
  156180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156181. "lsrs r6, r7, #16\n\t"
  156182. #else
  156183. "lsr r6, r7, #16\n\t"
  156184. #endif
  156185. #ifdef WOLFSSL_KEIL
  156186. "muls r5, r6, r5\n\t"
  156187. #elif defined(__clang__)
  156188. "muls r5, r6\n\t"
  156189. #else
  156190. "mul r5, r6\n\t"
  156191. #endif
  156192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156193. "lsrs r6, r5, #16\n\t"
  156194. #else
  156195. "lsr r6, r5, #16\n\t"
  156196. #endif
  156197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156198. "lsls r5, r5, #16\n\t"
  156199. #else
  156200. "lsl r5, r5, #16\n\t"
  156201. #endif
  156202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156203. "adds r3, r3, r5\n\t"
  156204. #else
  156205. "add r3, r3, r5\n\t"
  156206. #endif
  156207. #ifdef WOLFSSL_KEIL
  156208. "adcs r4, r4, r6\n\t"
  156209. #elif defined(__clang__)
  156210. "adcs r4, r6\n\t"
  156211. #else
  156212. "adc r4, r6\n\t"
  156213. #endif
  156214. #ifdef WOLFSSL_KEIL
  156215. "adcs r2, r2, %[r]\n\t"
  156216. #elif defined(__clang__)
  156217. "adcs r2, %[r]\n\t"
  156218. #else
  156219. "adc r2, %[r]\n\t"
  156220. #endif
  156221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156222. "adds r3, r3, r5\n\t"
  156223. #else
  156224. "add r3, r3, r5\n\t"
  156225. #endif
  156226. #ifdef WOLFSSL_KEIL
  156227. "adcs r4, r4, r6\n\t"
  156228. #elif defined(__clang__)
  156229. "adcs r4, r6\n\t"
  156230. #else
  156231. "adc r4, r6\n\t"
  156232. #endif
  156233. #ifdef WOLFSSL_KEIL
  156234. "adcs r2, r2, %[r]\n\t"
  156235. #elif defined(__clang__)
  156236. "adcs r2, %[r]\n\t"
  156237. #else
  156238. "adc r2, %[r]\n\t"
  156239. #endif
  156240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156241. "lsrs r5, %[a], #16\n\t"
  156242. #else
  156243. "lsr r5, %[a], #16\n\t"
  156244. #endif
  156245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156246. "lsrs r6, r7, #16\n\t"
  156247. #else
  156248. "lsr r6, r7, #16\n\t"
  156249. #endif
  156250. #ifdef WOLFSSL_KEIL
  156251. "muls r6, r5, r6\n\t"
  156252. #elif defined(__clang__)
  156253. "muls r6, r5\n\t"
  156254. #else
  156255. "mul r6, r5\n\t"
  156256. #endif
  156257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156258. "adds r4, r4, r6\n\t"
  156259. #else
  156260. "add r4, r4, r6\n\t"
  156261. #endif
  156262. #ifdef WOLFSSL_KEIL
  156263. "adcs r2, r2, %[r]\n\t"
  156264. #elif defined(__clang__)
  156265. "adcs r2, %[r]\n\t"
  156266. #else
  156267. "adc r2, %[r]\n\t"
  156268. #endif
  156269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156270. "adds r4, r4, r6\n\t"
  156271. #else
  156272. "add r4, r4, r6\n\t"
  156273. #endif
  156274. #ifdef WOLFSSL_KEIL
  156275. "adcs r2, r2, %[r]\n\t"
  156276. #elif defined(__clang__)
  156277. "adcs r2, %[r]\n\t"
  156278. #else
  156279. "adc r2, %[r]\n\t"
  156280. #endif
  156281. "uxth r6, r7\n\t"
  156282. #ifdef WOLFSSL_KEIL
  156283. "muls r5, r6, r5\n\t"
  156284. #elif defined(__clang__)
  156285. "muls r5, r6\n\t"
  156286. #else
  156287. "mul r5, r6\n\t"
  156288. #endif
  156289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156290. "lsrs r6, r5, #16\n\t"
  156291. #else
  156292. "lsr r6, r5, #16\n\t"
  156293. #endif
  156294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156295. "lsls r5, r5, #16\n\t"
  156296. #else
  156297. "lsl r5, r5, #16\n\t"
  156298. #endif
  156299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156300. "adds r3, r3, r5\n\t"
  156301. #else
  156302. "add r3, r3, r5\n\t"
  156303. #endif
  156304. #ifdef WOLFSSL_KEIL
  156305. "adcs r4, r4, r6\n\t"
  156306. #elif defined(__clang__)
  156307. "adcs r4, r6\n\t"
  156308. #else
  156309. "adc r4, r6\n\t"
  156310. #endif
  156311. #ifdef WOLFSSL_KEIL
  156312. "adcs r2, r2, %[r]\n\t"
  156313. #elif defined(__clang__)
  156314. "adcs r2, %[r]\n\t"
  156315. #else
  156316. "adc r2, %[r]\n\t"
  156317. #endif
  156318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156319. "adds r3, r3, r5\n\t"
  156320. #else
  156321. "add r3, r3, r5\n\t"
  156322. #endif
  156323. #ifdef WOLFSSL_KEIL
  156324. "adcs r4, r4, r6\n\t"
  156325. #elif defined(__clang__)
  156326. "adcs r4, r6\n\t"
  156327. #else
  156328. "adc r4, r6\n\t"
  156329. #endif
  156330. #ifdef WOLFSSL_KEIL
  156331. "adcs r2, r2, %[r]\n\t"
  156332. #elif defined(__clang__)
  156333. "adcs r2, %[r]\n\t"
  156334. #else
  156335. "adc r2, %[r]\n\t"
  156336. #endif
  156337. "# A[7] * A[0]\n\t"
  156338. "mov %[a], r9\n\t"
  156339. "mov r7, r10\n\t"
  156340. "ldr %[a], [%[a], #28]\n\t"
  156341. "uxth r5, %[a]\n\t"
  156342. "uxth r6, r7\n\t"
  156343. #ifdef WOLFSSL_KEIL
  156344. "muls r6, r5, r6\n\t"
  156345. #elif defined(__clang__)
  156346. "muls r6, r5\n\t"
  156347. #else
  156348. "mul r6, r5\n\t"
  156349. #endif
  156350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156351. "adds r3, r3, r6\n\t"
  156352. #else
  156353. "add r3, r3, r6\n\t"
  156354. #endif
  156355. #ifdef WOLFSSL_KEIL
  156356. "adcs r4, r4, %[r]\n\t"
  156357. #elif defined(__clang__)
  156358. "adcs r4, %[r]\n\t"
  156359. #else
  156360. "adc r4, %[r]\n\t"
  156361. #endif
  156362. #ifdef WOLFSSL_KEIL
  156363. "adcs r2, r2, %[r]\n\t"
  156364. #elif defined(__clang__)
  156365. "adcs r2, %[r]\n\t"
  156366. #else
  156367. "adc r2, %[r]\n\t"
  156368. #endif
  156369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156370. "adds r3, r3, r6\n\t"
  156371. #else
  156372. "add r3, r3, r6\n\t"
  156373. #endif
  156374. #ifdef WOLFSSL_KEIL
  156375. "adcs r4, r4, %[r]\n\t"
  156376. #elif defined(__clang__)
  156377. "adcs r4, %[r]\n\t"
  156378. #else
  156379. "adc r4, %[r]\n\t"
  156380. #endif
  156381. #ifdef WOLFSSL_KEIL
  156382. "adcs r2, r2, %[r]\n\t"
  156383. #elif defined(__clang__)
  156384. "adcs r2, %[r]\n\t"
  156385. #else
  156386. "adc r2, %[r]\n\t"
  156387. #endif
  156388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156389. "lsrs r6, r7, #16\n\t"
  156390. #else
  156391. "lsr r6, r7, #16\n\t"
  156392. #endif
  156393. #ifdef WOLFSSL_KEIL
  156394. "muls r5, r6, r5\n\t"
  156395. #elif defined(__clang__)
  156396. "muls r5, r6\n\t"
  156397. #else
  156398. "mul r5, r6\n\t"
  156399. #endif
  156400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156401. "lsrs r6, r5, #16\n\t"
  156402. #else
  156403. "lsr r6, r5, #16\n\t"
  156404. #endif
  156405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156406. "lsls r5, r5, #16\n\t"
  156407. #else
  156408. "lsl r5, r5, #16\n\t"
  156409. #endif
  156410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156411. "adds r3, r3, r5\n\t"
  156412. #else
  156413. "add r3, r3, r5\n\t"
  156414. #endif
  156415. #ifdef WOLFSSL_KEIL
  156416. "adcs r4, r4, r6\n\t"
  156417. #elif defined(__clang__)
  156418. "adcs r4, r6\n\t"
  156419. #else
  156420. "adc r4, r6\n\t"
  156421. #endif
  156422. #ifdef WOLFSSL_KEIL
  156423. "adcs r2, r2, %[r]\n\t"
  156424. #elif defined(__clang__)
  156425. "adcs r2, %[r]\n\t"
  156426. #else
  156427. "adc r2, %[r]\n\t"
  156428. #endif
  156429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156430. "adds r3, r3, r5\n\t"
  156431. #else
  156432. "add r3, r3, r5\n\t"
  156433. #endif
  156434. #ifdef WOLFSSL_KEIL
  156435. "adcs r4, r4, r6\n\t"
  156436. #elif defined(__clang__)
  156437. "adcs r4, r6\n\t"
  156438. #else
  156439. "adc r4, r6\n\t"
  156440. #endif
  156441. #ifdef WOLFSSL_KEIL
  156442. "adcs r2, r2, %[r]\n\t"
  156443. #elif defined(__clang__)
  156444. "adcs r2, %[r]\n\t"
  156445. #else
  156446. "adc r2, %[r]\n\t"
  156447. #endif
  156448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156449. "lsrs r5, %[a], #16\n\t"
  156450. #else
  156451. "lsr r5, %[a], #16\n\t"
  156452. #endif
  156453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156454. "lsrs r6, r7, #16\n\t"
  156455. #else
  156456. "lsr r6, r7, #16\n\t"
  156457. #endif
  156458. #ifdef WOLFSSL_KEIL
  156459. "muls r6, r5, r6\n\t"
  156460. #elif defined(__clang__)
  156461. "muls r6, r5\n\t"
  156462. #else
  156463. "mul r6, r5\n\t"
  156464. #endif
  156465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156466. "adds r4, r4, r6\n\t"
  156467. #else
  156468. "add r4, r4, r6\n\t"
  156469. #endif
  156470. #ifdef WOLFSSL_KEIL
  156471. "adcs r2, r2, %[r]\n\t"
  156472. #elif defined(__clang__)
  156473. "adcs r2, %[r]\n\t"
  156474. #else
  156475. "adc r2, %[r]\n\t"
  156476. #endif
  156477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156478. "adds r4, r4, r6\n\t"
  156479. #else
  156480. "add r4, r4, r6\n\t"
  156481. #endif
  156482. #ifdef WOLFSSL_KEIL
  156483. "adcs r2, r2, %[r]\n\t"
  156484. #elif defined(__clang__)
  156485. "adcs r2, %[r]\n\t"
  156486. #else
  156487. "adc r2, %[r]\n\t"
  156488. #endif
  156489. "uxth r6, r7\n\t"
  156490. #ifdef WOLFSSL_KEIL
  156491. "muls r5, r6, r5\n\t"
  156492. #elif defined(__clang__)
  156493. "muls r5, r6\n\t"
  156494. #else
  156495. "mul r5, r6\n\t"
  156496. #endif
  156497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156498. "lsrs r6, r5, #16\n\t"
  156499. #else
  156500. "lsr r6, r5, #16\n\t"
  156501. #endif
  156502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156503. "lsls r5, r5, #16\n\t"
  156504. #else
  156505. "lsl r5, r5, #16\n\t"
  156506. #endif
  156507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156508. "adds r3, r3, r5\n\t"
  156509. #else
  156510. "add r3, r3, r5\n\t"
  156511. #endif
  156512. #ifdef WOLFSSL_KEIL
  156513. "adcs r4, r4, r6\n\t"
  156514. #elif defined(__clang__)
  156515. "adcs r4, r6\n\t"
  156516. #else
  156517. "adc r4, r6\n\t"
  156518. #endif
  156519. #ifdef WOLFSSL_KEIL
  156520. "adcs r2, r2, %[r]\n\t"
  156521. #elif defined(__clang__)
  156522. "adcs r2, %[r]\n\t"
  156523. #else
  156524. "adc r2, %[r]\n\t"
  156525. #endif
  156526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156527. "adds r3, r3, r5\n\t"
  156528. #else
  156529. "add r3, r3, r5\n\t"
  156530. #endif
  156531. #ifdef WOLFSSL_KEIL
  156532. "adcs r4, r4, r6\n\t"
  156533. #elif defined(__clang__)
  156534. "adcs r4, r6\n\t"
  156535. #else
  156536. "adc r4, r6\n\t"
  156537. #endif
  156538. #ifdef WOLFSSL_KEIL
  156539. "adcs r2, r2, %[r]\n\t"
  156540. #elif defined(__clang__)
  156541. "adcs r2, %[r]\n\t"
  156542. #else
  156543. "adc r2, %[r]\n\t"
  156544. #endif
  156545. "str r3, [sp, #28]\n\t"
  156546. "# A[8] * A[0]\n\t"
  156547. "movs r3, #0\n\t"
  156548. "mov %[a], r9\n\t"
  156549. "ldr %[a], [%[a], #32]\n\t"
  156550. "uxth r5, %[a]\n\t"
  156551. "uxth r6, r7\n\t"
  156552. #ifdef WOLFSSL_KEIL
  156553. "muls r6, r5, r6\n\t"
  156554. #elif defined(__clang__)
  156555. "muls r6, r5\n\t"
  156556. #else
  156557. "mul r6, r5\n\t"
  156558. #endif
  156559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156560. "adds r4, r4, r6\n\t"
  156561. #else
  156562. "add r4, r4, r6\n\t"
  156563. #endif
  156564. #ifdef WOLFSSL_KEIL
  156565. "adcs r2, r2, %[r]\n\t"
  156566. #elif defined(__clang__)
  156567. "adcs r2, %[r]\n\t"
  156568. #else
  156569. "adc r2, %[r]\n\t"
  156570. #endif
  156571. #ifdef WOLFSSL_KEIL
  156572. "adcs r3, r3, %[r]\n\t"
  156573. #elif defined(__clang__)
  156574. "adcs r3, %[r]\n\t"
  156575. #else
  156576. "adc r3, %[r]\n\t"
  156577. #endif
  156578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156579. "adds r4, r4, r6\n\t"
  156580. #else
  156581. "add r4, r4, r6\n\t"
  156582. #endif
  156583. #ifdef WOLFSSL_KEIL
  156584. "adcs r2, r2, %[r]\n\t"
  156585. #elif defined(__clang__)
  156586. "adcs r2, %[r]\n\t"
  156587. #else
  156588. "adc r2, %[r]\n\t"
  156589. #endif
  156590. #ifdef WOLFSSL_KEIL
  156591. "adcs r3, r3, %[r]\n\t"
  156592. #elif defined(__clang__)
  156593. "adcs r3, %[r]\n\t"
  156594. #else
  156595. "adc r3, %[r]\n\t"
  156596. #endif
  156597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156598. "lsrs r6, r7, #16\n\t"
  156599. #else
  156600. "lsr r6, r7, #16\n\t"
  156601. #endif
  156602. #ifdef WOLFSSL_KEIL
  156603. "muls r5, r6, r5\n\t"
  156604. #elif defined(__clang__)
  156605. "muls r5, r6\n\t"
  156606. #else
  156607. "mul r5, r6\n\t"
  156608. #endif
  156609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156610. "lsrs r6, r5, #16\n\t"
  156611. #else
  156612. "lsr r6, r5, #16\n\t"
  156613. #endif
  156614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156615. "lsls r5, r5, #16\n\t"
  156616. #else
  156617. "lsl r5, r5, #16\n\t"
  156618. #endif
  156619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156620. "adds r4, r4, r5\n\t"
  156621. #else
  156622. "add r4, r4, r5\n\t"
  156623. #endif
  156624. #ifdef WOLFSSL_KEIL
  156625. "adcs r2, r2, r6\n\t"
  156626. #elif defined(__clang__)
  156627. "adcs r2, r6\n\t"
  156628. #else
  156629. "adc r2, r6\n\t"
  156630. #endif
  156631. #ifdef WOLFSSL_KEIL
  156632. "adcs r3, r3, %[r]\n\t"
  156633. #elif defined(__clang__)
  156634. "adcs r3, %[r]\n\t"
  156635. #else
  156636. "adc r3, %[r]\n\t"
  156637. #endif
  156638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156639. "adds r4, r4, r5\n\t"
  156640. #else
  156641. "add r4, r4, r5\n\t"
  156642. #endif
  156643. #ifdef WOLFSSL_KEIL
  156644. "adcs r2, r2, r6\n\t"
  156645. #elif defined(__clang__)
  156646. "adcs r2, r6\n\t"
  156647. #else
  156648. "adc r2, r6\n\t"
  156649. #endif
  156650. #ifdef WOLFSSL_KEIL
  156651. "adcs r3, r3, %[r]\n\t"
  156652. #elif defined(__clang__)
  156653. "adcs r3, %[r]\n\t"
  156654. #else
  156655. "adc r3, %[r]\n\t"
  156656. #endif
  156657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156658. "lsrs r5, %[a], #16\n\t"
  156659. #else
  156660. "lsr r5, %[a], #16\n\t"
  156661. #endif
  156662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156663. "lsrs r6, r7, #16\n\t"
  156664. #else
  156665. "lsr r6, r7, #16\n\t"
  156666. #endif
  156667. #ifdef WOLFSSL_KEIL
  156668. "muls r6, r5, r6\n\t"
  156669. #elif defined(__clang__)
  156670. "muls r6, r5\n\t"
  156671. #else
  156672. "mul r6, r5\n\t"
  156673. #endif
  156674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156675. "adds r2, r2, r6\n\t"
  156676. #else
  156677. "add r2, r2, r6\n\t"
  156678. #endif
  156679. #ifdef WOLFSSL_KEIL
  156680. "adcs r3, r3, %[r]\n\t"
  156681. #elif defined(__clang__)
  156682. "adcs r3, %[r]\n\t"
  156683. #else
  156684. "adc r3, %[r]\n\t"
  156685. #endif
  156686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156687. "adds r2, r2, r6\n\t"
  156688. #else
  156689. "add r2, r2, r6\n\t"
  156690. #endif
  156691. #ifdef WOLFSSL_KEIL
  156692. "adcs r3, r3, %[r]\n\t"
  156693. #elif defined(__clang__)
  156694. "adcs r3, %[r]\n\t"
  156695. #else
  156696. "adc r3, %[r]\n\t"
  156697. #endif
  156698. "uxth r6, r7\n\t"
  156699. #ifdef WOLFSSL_KEIL
  156700. "muls r5, r6, r5\n\t"
  156701. #elif defined(__clang__)
  156702. "muls r5, r6\n\t"
  156703. #else
  156704. "mul r5, r6\n\t"
  156705. #endif
  156706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156707. "lsrs r6, r5, #16\n\t"
  156708. #else
  156709. "lsr r6, r5, #16\n\t"
  156710. #endif
  156711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156712. "lsls r5, r5, #16\n\t"
  156713. #else
  156714. "lsl r5, r5, #16\n\t"
  156715. #endif
  156716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156717. "adds r4, r4, r5\n\t"
  156718. #else
  156719. "add r4, r4, r5\n\t"
  156720. #endif
  156721. #ifdef WOLFSSL_KEIL
  156722. "adcs r2, r2, r6\n\t"
  156723. #elif defined(__clang__)
  156724. "adcs r2, r6\n\t"
  156725. #else
  156726. "adc r2, r6\n\t"
  156727. #endif
  156728. #ifdef WOLFSSL_KEIL
  156729. "adcs r3, r3, %[r]\n\t"
  156730. #elif defined(__clang__)
  156731. "adcs r3, %[r]\n\t"
  156732. #else
  156733. "adc r3, %[r]\n\t"
  156734. #endif
  156735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156736. "adds r4, r4, r5\n\t"
  156737. #else
  156738. "add r4, r4, r5\n\t"
  156739. #endif
  156740. #ifdef WOLFSSL_KEIL
  156741. "adcs r2, r2, r6\n\t"
  156742. #elif defined(__clang__)
  156743. "adcs r2, r6\n\t"
  156744. #else
  156745. "adc r2, r6\n\t"
  156746. #endif
  156747. #ifdef WOLFSSL_KEIL
  156748. "adcs r3, r3, %[r]\n\t"
  156749. #elif defined(__clang__)
  156750. "adcs r3, %[r]\n\t"
  156751. #else
  156752. "adc r3, %[r]\n\t"
  156753. #endif
  156754. "# A[7] * A[1]\n\t"
  156755. "mov %[a], r9\n\t"
  156756. "mov r7, r11\n\t"
  156757. "ldr %[a], [%[a], #28]\n\t"
  156758. "uxth r5, %[a]\n\t"
  156759. "uxth r6, r7\n\t"
  156760. #ifdef WOLFSSL_KEIL
  156761. "muls r6, r5, r6\n\t"
  156762. #elif defined(__clang__)
  156763. "muls r6, r5\n\t"
  156764. #else
  156765. "mul r6, r5\n\t"
  156766. #endif
  156767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156768. "adds r4, r4, r6\n\t"
  156769. #else
  156770. "add r4, r4, r6\n\t"
  156771. #endif
  156772. #ifdef WOLFSSL_KEIL
  156773. "adcs r2, r2, %[r]\n\t"
  156774. #elif defined(__clang__)
  156775. "adcs r2, %[r]\n\t"
  156776. #else
  156777. "adc r2, %[r]\n\t"
  156778. #endif
  156779. #ifdef WOLFSSL_KEIL
  156780. "adcs r3, r3, %[r]\n\t"
  156781. #elif defined(__clang__)
  156782. "adcs r3, %[r]\n\t"
  156783. #else
  156784. "adc r3, %[r]\n\t"
  156785. #endif
  156786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156787. "adds r4, r4, r6\n\t"
  156788. #else
  156789. "add r4, r4, r6\n\t"
  156790. #endif
  156791. #ifdef WOLFSSL_KEIL
  156792. "adcs r2, r2, %[r]\n\t"
  156793. #elif defined(__clang__)
  156794. "adcs r2, %[r]\n\t"
  156795. #else
  156796. "adc r2, %[r]\n\t"
  156797. #endif
  156798. #ifdef WOLFSSL_KEIL
  156799. "adcs r3, r3, %[r]\n\t"
  156800. #elif defined(__clang__)
  156801. "adcs r3, %[r]\n\t"
  156802. #else
  156803. "adc r3, %[r]\n\t"
  156804. #endif
  156805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156806. "lsrs r6, r7, #16\n\t"
  156807. #else
  156808. "lsr r6, r7, #16\n\t"
  156809. #endif
  156810. #ifdef WOLFSSL_KEIL
  156811. "muls r5, r6, r5\n\t"
  156812. #elif defined(__clang__)
  156813. "muls r5, r6\n\t"
  156814. #else
  156815. "mul r5, r6\n\t"
  156816. #endif
  156817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156818. "lsrs r6, r5, #16\n\t"
  156819. #else
  156820. "lsr r6, r5, #16\n\t"
  156821. #endif
  156822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156823. "lsls r5, r5, #16\n\t"
  156824. #else
  156825. "lsl r5, r5, #16\n\t"
  156826. #endif
  156827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156828. "adds r4, r4, r5\n\t"
  156829. #else
  156830. "add r4, r4, r5\n\t"
  156831. #endif
  156832. #ifdef WOLFSSL_KEIL
  156833. "adcs r2, r2, r6\n\t"
  156834. #elif defined(__clang__)
  156835. "adcs r2, r6\n\t"
  156836. #else
  156837. "adc r2, r6\n\t"
  156838. #endif
  156839. #ifdef WOLFSSL_KEIL
  156840. "adcs r3, r3, %[r]\n\t"
  156841. #elif defined(__clang__)
  156842. "adcs r3, %[r]\n\t"
  156843. #else
  156844. "adc r3, %[r]\n\t"
  156845. #endif
  156846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156847. "adds r4, r4, r5\n\t"
  156848. #else
  156849. "add r4, r4, r5\n\t"
  156850. #endif
  156851. #ifdef WOLFSSL_KEIL
  156852. "adcs r2, r2, r6\n\t"
  156853. #elif defined(__clang__)
  156854. "adcs r2, r6\n\t"
  156855. #else
  156856. "adc r2, r6\n\t"
  156857. #endif
  156858. #ifdef WOLFSSL_KEIL
  156859. "adcs r3, r3, %[r]\n\t"
  156860. #elif defined(__clang__)
  156861. "adcs r3, %[r]\n\t"
  156862. #else
  156863. "adc r3, %[r]\n\t"
  156864. #endif
  156865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156866. "lsrs r5, %[a], #16\n\t"
  156867. #else
  156868. "lsr r5, %[a], #16\n\t"
  156869. #endif
  156870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156871. "lsrs r6, r7, #16\n\t"
  156872. #else
  156873. "lsr r6, r7, #16\n\t"
  156874. #endif
  156875. #ifdef WOLFSSL_KEIL
  156876. "muls r6, r5, r6\n\t"
  156877. #elif defined(__clang__)
  156878. "muls r6, r5\n\t"
  156879. #else
  156880. "mul r6, r5\n\t"
  156881. #endif
  156882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156883. "adds r2, r2, r6\n\t"
  156884. #else
  156885. "add r2, r2, r6\n\t"
  156886. #endif
  156887. #ifdef WOLFSSL_KEIL
  156888. "adcs r3, r3, %[r]\n\t"
  156889. #elif defined(__clang__)
  156890. "adcs r3, %[r]\n\t"
  156891. #else
  156892. "adc r3, %[r]\n\t"
  156893. #endif
  156894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156895. "adds r2, r2, r6\n\t"
  156896. #else
  156897. "add r2, r2, r6\n\t"
  156898. #endif
  156899. #ifdef WOLFSSL_KEIL
  156900. "adcs r3, r3, %[r]\n\t"
  156901. #elif defined(__clang__)
  156902. "adcs r3, %[r]\n\t"
  156903. #else
  156904. "adc r3, %[r]\n\t"
  156905. #endif
  156906. "uxth r6, r7\n\t"
  156907. #ifdef WOLFSSL_KEIL
  156908. "muls r5, r6, r5\n\t"
  156909. #elif defined(__clang__)
  156910. "muls r5, r6\n\t"
  156911. #else
  156912. "mul r5, r6\n\t"
  156913. #endif
  156914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156915. "lsrs r6, r5, #16\n\t"
  156916. #else
  156917. "lsr r6, r5, #16\n\t"
  156918. #endif
  156919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156920. "lsls r5, r5, #16\n\t"
  156921. #else
  156922. "lsl r5, r5, #16\n\t"
  156923. #endif
  156924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156925. "adds r4, r4, r5\n\t"
  156926. #else
  156927. "add r4, r4, r5\n\t"
  156928. #endif
  156929. #ifdef WOLFSSL_KEIL
  156930. "adcs r2, r2, r6\n\t"
  156931. #elif defined(__clang__)
  156932. "adcs r2, r6\n\t"
  156933. #else
  156934. "adc r2, r6\n\t"
  156935. #endif
  156936. #ifdef WOLFSSL_KEIL
  156937. "adcs r3, r3, %[r]\n\t"
  156938. #elif defined(__clang__)
  156939. "adcs r3, %[r]\n\t"
  156940. #else
  156941. "adc r3, %[r]\n\t"
  156942. #endif
  156943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156944. "adds r4, r4, r5\n\t"
  156945. #else
  156946. "add r4, r4, r5\n\t"
  156947. #endif
  156948. #ifdef WOLFSSL_KEIL
  156949. "adcs r2, r2, r6\n\t"
  156950. #elif defined(__clang__)
  156951. "adcs r2, r6\n\t"
  156952. #else
  156953. "adc r2, r6\n\t"
  156954. #endif
  156955. #ifdef WOLFSSL_KEIL
  156956. "adcs r3, r3, %[r]\n\t"
  156957. #elif defined(__clang__)
  156958. "adcs r3, %[r]\n\t"
  156959. #else
  156960. "adc r3, %[r]\n\t"
  156961. #endif
  156962. "# A[6] * A[2]\n\t"
  156963. "mov %[a], r9\n\t"
  156964. "mov r7, r12\n\t"
  156965. "ldr %[a], [%[a], #24]\n\t"
  156966. "uxth r5, %[a]\n\t"
  156967. "uxth r6, r7\n\t"
  156968. #ifdef WOLFSSL_KEIL
  156969. "muls r6, r5, r6\n\t"
  156970. #elif defined(__clang__)
  156971. "muls r6, r5\n\t"
  156972. #else
  156973. "mul r6, r5\n\t"
  156974. #endif
  156975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156976. "adds r4, r4, r6\n\t"
  156977. #else
  156978. "add r4, r4, r6\n\t"
  156979. #endif
  156980. #ifdef WOLFSSL_KEIL
  156981. "adcs r2, r2, %[r]\n\t"
  156982. #elif defined(__clang__)
  156983. "adcs r2, %[r]\n\t"
  156984. #else
  156985. "adc r2, %[r]\n\t"
  156986. #endif
  156987. #ifdef WOLFSSL_KEIL
  156988. "adcs r3, r3, %[r]\n\t"
  156989. #elif defined(__clang__)
  156990. "adcs r3, %[r]\n\t"
  156991. #else
  156992. "adc r3, %[r]\n\t"
  156993. #endif
  156994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156995. "adds r4, r4, r6\n\t"
  156996. #else
  156997. "add r4, r4, r6\n\t"
  156998. #endif
  156999. #ifdef WOLFSSL_KEIL
  157000. "adcs r2, r2, %[r]\n\t"
  157001. #elif defined(__clang__)
  157002. "adcs r2, %[r]\n\t"
  157003. #else
  157004. "adc r2, %[r]\n\t"
  157005. #endif
  157006. #ifdef WOLFSSL_KEIL
  157007. "adcs r3, r3, %[r]\n\t"
  157008. #elif defined(__clang__)
  157009. "adcs r3, %[r]\n\t"
  157010. #else
  157011. "adc r3, %[r]\n\t"
  157012. #endif
  157013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157014. "lsrs r6, r7, #16\n\t"
  157015. #else
  157016. "lsr r6, r7, #16\n\t"
  157017. #endif
  157018. #ifdef WOLFSSL_KEIL
  157019. "muls r5, r6, r5\n\t"
  157020. #elif defined(__clang__)
  157021. "muls r5, r6\n\t"
  157022. #else
  157023. "mul r5, r6\n\t"
  157024. #endif
  157025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157026. "lsrs r6, r5, #16\n\t"
  157027. #else
  157028. "lsr r6, r5, #16\n\t"
  157029. #endif
  157030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157031. "lsls r5, r5, #16\n\t"
  157032. #else
  157033. "lsl r5, r5, #16\n\t"
  157034. #endif
  157035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157036. "adds r4, r4, r5\n\t"
  157037. #else
  157038. "add r4, r4, r5\n\t"
  157039. #endif
  157040. #ifdef WOLFSSL_KEIL
  157041. "adcs r2, r2, r6\n\t"
  157042. #elif defined(__clang__)
  157043. "adcs r2, r6\n\t"
  157044. #else
  157045. "adc r2, r6\n\t"
  157046. #endif
  157047. #ifdef WOLFSSL_KEIL
  157048. "adcs r3, r3, %[r]\n\t"
  157049. #elif defined(__clang__)
  157050. "adcs r3, %[r]\n\t"
  157051. #else
  157052. "adc r3, %[r]\n\t"
  157053. #endif
  157054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157055. "adds r4, r4, r5\n\t"
  157056. #else
  157057. "add r4, r4, r5\n\t"
  157058. #endif
  157059. #ifdef WOLFSSL_KEIL
  157060. "adcs r2, r2, r6\n\t"
  157061. #elif defined(__clang__)
  157062. "adcs r2, r6\n\t"
  157063. #else
  157064. "adc r2, r6\n\t"
  157065. #endif
  157066. #ifdef WOLFSSL_KEIL
  157067. "adcs r3, r3, %[r]\n\t"
  157068. #elif defined(__clang__)
  157069. "adcs r3, %[r]\n\t"
  157070. #else
  157071. "adc r3, %[r]\n\t"
  157072. #endif
  157073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157074. "lsrs r5, %[a], #16\n\t"
  157075. #else
  157076. "lsr r5, %[a], #16\n\t"
  157077. #endif
  157078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157079. "lsrs r6, r7, #16\n\t"
  157080. #else
  157081. "lsr r6, r7, #16\n\t"
  157082. #endif
  157083. #ifdef WOLFSSL_KEIL
  157084. "muls r6, r5, r6\n\t"
  157085. #elif defined(__clang__)
  157086. "muls r6, r5\n\t"
  157087. #else
  157088. "mul r6, r5\n\t"
  157089. #endif
  157090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157091. "adds r2, r2, r6\n\t"
  157092. #else
  157093. "add r2, r2, r6\n\t"
  157094. #endif
  157095. #ifdef WOLFSSL_KEIL
  157096. "adcs r3, r3, %[r]\n\t"
  157097. #elif defined(__clang__)
  157098. "adcs r3, %[r]\n\t"
  157099. #else
  157100. "adc r3, %[r]\n\t"
  157101. #endif
  157102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157103. "adds r2, r2, r6\n\t"
  157104. #else
  157105. "add r2, r2, r6\n\t"
  157106. #endif
  157107. #ifdef WOLFSSL_KEIL
  157108. "adcs r3, r3, %[r]\n\t"
  157109. #elif defined(__clang__)
  157110. "adcs r3, %[r]\n\t"
  157111. #else
  157112. "adc r3, %[r]\n\t"
  157113. #endif
  157114. "uxth r6, r7\n\t"
  157115. #ifdef WOLFSSL_KEIL
  157116. "muls r5, r6, r5\n\t"
  157117. #elif defined(__clang__)
  157118. "muls r5, r6\n\t"
  157119. #else
  157120. "mul r5, r6\n\t"
  157121. #endif
  157122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157123. "lsrs r6, r5, #16\n\t"
  157124. #else
  157125. "lsr r6, r5, #16\n\t"
  157126. #endif
  157127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157128. "lsls r5, r5, #16\n\t"
  157129. #else
  157130. "lsl r5, r5, #16\n\t"
  157131. #endif
  157132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157133. "adds r4, r4, r5\n\t"
  157134. #else
  157135. "add r4, r4, r5\n\t"
  157136. #endif
  157137. #ifdef WOLFSSL_KEIL
  157138. "adcs r2, r2, r6\n\t"
  157139. #elif defined(__clang__)
  157140. "adcs r2, r6\n\t"
  157141. #else
  157142. "adc r2, r6\n\t"
  157143. #endif
  157144. #ifdef WOLFSSL_KEIL
  157145. "adcs r3, r3, %[r]\n\t"
  157146. #elif defined(__clang__)
  157147. "adcs r3, %[r]\n\t"
  157148. #else
  157149. "adc r3, %[r]\n\t"
  157150. #endif
  157151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157152. "adds r4, r4, r5\n\t"
  157153. #else
  157154. "add r4, r4, r5\n\t"
  157155. #endif
  157156. #ifdef WOLFSSL_KEIL
  157157. "adcs r2, r2, r6\n\t"
  157158. #elif defined(__clang__)
  157159. "adcs r2, r6\n\t"
  157160. #else
  157161. "adc r2, r6\n\t"
  157162. #endif
  157163. #ifdef WOLFSSL_KEIL
  157164. "adcs r3, r3, %[r]\n\t"
  157165. #elif defined(__clang__)
  157166. "adcs r3, %[r]\n\t"
  157167. #else
  157168. "adc r3, %[r]\n\t"
  157169. #endif
  157170. "# A[5] * A[3]\n\t"
  157171. "mov %[a], r9\n\t"
  157172. "mov r7, lr\n\t"
  157173. "ldr %[a], [%[a], #20]\n\t"
  157174. "uxth r5, %[a]\n\t"
  157175. "uxth r6, r7\n\t"
  157176. #ifdef WOLFSSL_KEIL
  157177. "muls r6, r5, r6\n\t"
  157178. #elif defined(__clang__)
  157179. "muls r6, r5\n\t"
  157180. #else
  157181. "mul r6, r5\n\t"
  157182. #endif
  157183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157184. "adds r4, r4, r6\n\t"
  157185. #else
  157186. "add r4, r4, r6\n\t"
  157187. #endif
  157188. #ifdef WOLFSSL_KEIL
  157189. "adcs r2, r2, %[r]\n\t"
  157190. #elif defined(__clang__)
  157191. "adcs r2, %[r]\n\t"
  157192. #else
  157193. "adc r2, %[r]\n\t"
  157194. #endif
  157195. #ifdef WOLFSSL_KEIL
  157196. "adcs r3, r3, %[r]\n\t"
  157197. #elif defined(__clang__)
  157198. "adcs r3, %[r]\n\t"
  157199. #else
  157200. "adc r3, %[r]\n\t"
  157201. #endif
  157202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157203. "adds r4, r4, r6\n\t"
  157204. #else
  157205. "add r4, r4, r6\n\t"
  157206. #endif
  157207. #ifdef WOLFSSL_KEIL
  157208. "adcs r2, r2, %[r]\n\t"
  157209. #elif defined(__clang__)
  157210. "adcs r2, %[r]\n\t"
  157211. #else
  157212. "adc r2, %[r]\n\t"
  157213. #endif
  157214. #ifdef WOLFSSL_KEIL
  157215. "adcs r3, r3, %[r]\n\t"
  157216. #elif defined(__clang__)
  157217. "adcs r3, %[r]\n\t"
  157218. #else
  157219. "adc r3, %[r]\n\t"
  157220. #endif
  157221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157222. "lsrs r6, r7, #16\n\t"
  157223. #else
  157224. "lsr r6, r7, #16\n\t"
  157225. #endif
  157226. #ifdef WOLFSSL_KEIL
  157227. "muls r5, r6, r5\n\t"
  157228. #elif defined(__clang__)
  157229. "muls r5, r6\n\t"
  157230. #else
  157231. "mul r5, r6\n\t"
  157232. #endif
  157233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157234. "lsrs r6, r5, #16\n\t"
  157235. #else
  157236. "lsr r6, r5, #16\n\t"
  157237. #endif
  157238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157239. "lsls r5, r5, #16\n\t"
  157240. #else
  157241. "lsl r5, r5, #16\n\t"
  157242. #endif
  157243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157244. "adds r4, r4, r5\n\t"
  157245. #else
  157246. "add r4, r4, r5\n\t"
  157247. #endif
  157248. #ifdef WOLFSSL_KEIL
  157249. "adcs r2, r2, r6\n\t"
  157250. #elif defined(__clang__)
  157251. "adcs r2, r6\n\t"
  157252. #else
  157253. "adc r2, r6\n\t"
  157254. #endif
  157255. #ifdef WOLFSSL_KEIL
  157256. "adcs r3, r3, %[r]\n\t"
  157257. #elif defined(__clang__)
  157258. "adcs r3, %[r]\n\t"
  157259. #else
  157260. "adc r3, %[r]\n\t"
  157261. #endif
  157262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157263. "adds r4, r4, r5\n\t"
  157264. #else
  157265. "add r4, r4, r5\n\t"
  157266. #endif
  157267. #ifdef WOLFSSL_KEIL
  157268. "adcs r2, r2, r6\n\t"
  157269. #elif defined(__clang__)
  157270. "adcs r2, r6\n\t"
  157271. #else
  157272. "adc r2, r6\n\t"
  157273. #endif
  157274. #ifdef WOLFSSL_KEIL
  157275. "adcs r3, r3, %[r]\n\t"
  157276. #elif defined(__clang__)
  157277. "adcs r3, %[r]\n\t"
  157278. #else
  157279. "adc r3, %[r]\n\t"
  157280. #endif
  157281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157282. "lsrs r5, %[a], #16\n\t"
  157283. #else
  157284. "lsr r5, %[a], #16\n\t"
  157285. #endif
  157286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157287. "lsrs r6, r7, #16\n\t"
  157288. #else
  157289. "lsr r6, r7, #16\n\t"
  157290. #endif
  157291. #ifdef WOLFSSL_KEIL
  157292. "muls r6, r5, r6\n\t"
  157293. #elif defined(__clang__)
  157294. "muls r6, r5\n\t"
  157295. #else
  157296. "mul r6, r5\n\t"
  157297. #endif
  157298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157299. "adds r2, r2, r6\n\t"
  157300. #else
  157301. "add r2, r2, r6\n\t"
  157302. #endif
  157303. #ifdef WOLFSSL_KEIL
  157304. "adcs r3, r3, %[r]\n\t"
  157305. #elif defined(__clang__)
  157306. "adcs r3, %[r]\n\t"
  157307. #else
  157308. "adc r3, %[r]\n\t"
  157309. #endif
  157310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157311. "adds r2, r2, r6\n\t"
  157312. #else
  157313. "add r2, r2, r6\n\t"
  157314. #endif
  157315. #ifdef WOLFSSL_KEIL
  157316. "adcs r3, r3, %[r]\n\t"
  157317. #elif defined(__clang__)
  157318. "adcs r3, %[r]\n\t"
  157319. #else
  157320. "adc r3, %[r]\n\t"
  157321. #endif
  157322. "uxth r6, r7\n\t"
  157323. #ifdef WOLFSSL_KEIL
  157324. "muls r5, r6, r5\n\t"
  157325. #elif defined(__clang__)
  157326. "muls r5, r6\n\t"
  157327. #else
  157328. "mul r5, r6\n\t"
  157329. #endif
  157330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157331. "lsrs r6, r5, #16\n\t"
  157332. #else
  157333. "lsr r6, r5, #16\n\t"
  157334. #endif
  157335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157336. "lsls r5, r5, #16\n\t"
  157337. #else
  157338. "lsl r5, r5, #16\n\t"
  157339. #endif
  157340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157341. "adds r4, r4, r5\n\t"
  157342. #else
  157343. "add r4, r4, r5\n\t"
  157344. #endif
  157345. #ifdef WOLFSSL_KEIL
  157346. "adcs r2, r2, r6\n\t"
  157347. #elif defined(__clang__)
  157348. "adcs r2, r6\n\t"
  157349. #else
  157350. "adc r2, r6\n\t"
  157351. #endif
  157352. #ifdef WOLFSSL_KEIL
  157353. "adcs r3, r3, %[r]\n\t"
  157354. #elif defined(__clang__)
  157355. "adcs r3, %[r]\n\t"
  157356. #else
  157357. "adc r3, %[r]\n\t"
  157358. #endif
  157359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157360. "adds r4, r4, r5\n\t"
  157361. #else
  157362. "add r4, r4, r5\n\t"
  157363. #endif
  157364. #ifdef WOLFSSL_KEIL
  157365. "adcs r2, r2, r6\n\t"
  157366. #elif defined(__clang__)
  157367. "adcs r2, r6\n\t"
  157368. #else
  157369. "adc r2, r6\n\t"
  157370. #endif
  157371. #ifdef WOLFSSL_KEIL
  157372. "adcs r3, r3, %[r]\n\t"
  157373. #elif defined(__clang__)
  157374. "adcs r3, %[r]\n\t"
  157375. #else
  157376. "adc r3, %[r]\n\t"
  157377. #endif
  157378. "# A[4] * A[4]\n\t"
  157379. "mov %[a], r9\n\t"
  157380. "ldr r7, [%[a], #16]\n\t"
  157381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157382. "lsrs r6, r7, #16\n\t"
  157383. #else
  157384. "lsr r6, r7, #16\n\t"
  157385. #endif
  157386. "uxth r5, r7\n\t"
  157387. #ifdef WOLFSSL_KEIL
  157388. "muls r5, r5, r5\n\t"
  157389. #elif defined(__clang__)
  157390. "muls r5, r5\n\t"
  157391. #else
  157392. "mul r5, r5\n\t"
  157393. #endif
  157394. #ifdef WOLFSSL_KEIL
  157395. "muls r6, r6, r6\n\t"
  157396. #elif defined(__clang__)
  157397. "muls r6, r6\n\t"
  157398. #else
  157399. "mul r6, r6\n\t"
  157400. #endif
  157401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157402. "adds r4, r4, r5\n\t"
  157403. #else
  157404. "add r4, r4, r5\n\t"
  157405. #endif
  157406. #ifdef WOLFSSL_KEIL
  157407. "adcs r2, r2, r6\n\t"
  157408. #elif defined(__clang__)
  157409. "adcs r2, r6\n\t"
  157410. #else
  157411. "adc r2, r6\n\t"
  157412. #endif
  157413. #ifdef WOLFSSL_KEIL
  157414. "adcs r3, r3, %[r]\n\t"
  157415. #elif defined(__clang__)
  157416. "adcs r3, %[r]\n\t"
  157417. #else
  157418. "adc r3, %[r]\n\t"
  157419. #endif
  157420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157421. "lsrs r6, r7, #16\n\t"
  157422. #else
  157423. "lsr r6, r7, #16\n\t"
  157424. #endif
  157425. "uxth r5, r7\n\t"
  157426. #ifdef WOLFSSL_KEIL
  157427. "muls r5, r6, r5\n\t"
  157428. #elif defined(__clang__)
  157429. "muls r5, r6\n\t"
  157430. #else
  157431. "mul r5, r6\n\t"
  157432. #endif
  157433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157434. "lsrs r6, r5, #15\n\t"
  157435. #else
  157436. "lsr r6, r5, #15\n\t"
  157437. #endif
  157438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157439. "lsls r5, r5, #17\n\t"
  157440. #else
  157441. "lsl r5, r5, #17\n\t"
  157442. #endif
  157443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157444. "adds r4, r4, r5\n\t"
  157445. #else
  157446. "add r4, r4, r5\n\t"
  157447. #endif
  157448. #ifdef WOLFSSL_KEIL
  157449. "adcs r2, r2, r6\n\t"
  157450. #elif defined(__clang__)
  157451. "adcs r2, r6\n\t"
  157452. #else
  157453. "adc r2, r6\n\t"
  157454. #endif
  157455. #ifdef WOLFSSL_KEIL
  157456. "adcs r3, r3, %[r]\n\t"
  157457. #elif defined(__clang__)
  157458. "adcs r3, %[r]\n\t"
  157459. #else
  157460. "adc r3, %[r]\n\t"
  157461. #endif
  157462. "str r4, [sp, #32]\n\t"
  157463. "# A[5] * A[4]\n\t"
  157464. "movs r4, #0\n\t"
  157465. "ldr %[a], [%[a], #20]\n\t"
  157466. "uxth r5, %[a]\n\t"
  157467. "uxth r6, r7\n\t"
  157468. #ifdef WOLFSSL_KEIL
  157469. "muls r6, r5, r6\n\t"
  157470. #elif defined(__clang__)
  157471. "muls r6, r5\n\t"
  157472. #else
  157473. "mul r6, r5\n\t"
  157474. #endif
  157475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157476. "adds r2, r2, r6\n\t"
  157477. #else
  157478. "add r2, r2, r6\n\t"
  157479. #endif
  157480. #ifdef WOLFSSL_KEIL
  157481. "adcs r3, r3, %[r]\n\t"
  157482. #elif defined(__clang__)
  157483. "adcs r3, %[r]\n\t"
  157484. #else
  157485. "adc r3, %[r]\n\t"
  157486. #endif
  157487. #ifdef WOLFSSL_KEIL
  157488. "adcs r4, r4, %[r]\n\t"
  157489. #elif defined(__clang__)
  157490. "adcs r4, %[r]\n\t"
  157491. #else
  157492. "adc r4, %[r]\n\t"
  157493. #endif
  157494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157495. "adds r2, r2, r6\n\t"
  157496. #else
  157497. "add r2, r2, r6\n\t"
  157498. #endif
  157499. #ifdef WOLFSSL_KEIL
  157500. "adcs r3, r3, %[r]\n\t"
  157501. #elif defined(__clang__)
  157502. "adcs r3, %[r]\n\t"
  157503. #else
  157504. "adc r3, %[r]\n\t"
  157505. #endif
  157506. #ifdef WOLFSSL_KEIL
  157507. "adcs r4, r4, %[r]\n\t"
  157508. #elif defined(__clang__)
  157509. "adcs r4, %[r]\n\t"
  157510. #else
  157511. "adc r4, %[r]\n\t"
  157512. #endif
  157513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157514. "lsrs r6, r7, #16\n\t"
  157515. #else
  157516. "lsr r6, r7, #16\n\t"
  157517. #endif
  157518. #ifdef WOLFSSL_KEIL
  157519. "muls r5, r6, r5\n\t"
  157520. #elif defined(__clang__)
  157521. "muls r5, r6\n\t"
  157522. #else
  157523. "mul r5, r6\n\t"
  157524. #endif
  157525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157526. "lsrs r6, r5, #16\n\t"
  157527. #else
  157528. "lsr r6, r5, #16\n\t"
  157529. #endif
  157530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157531. "lsls r5, r5, #16\n\t"
  157532. #else
  157533. "lsl r5, r5, #16\n\t"
  157534. #endif
  157535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157536. "adds r2, r2, r5\n\t"
  157537. #else
  157538. "add r2, r2, r5\n\t"
  157539. #endif
  157540. #ifdef WOLFSSL_KEIL
  157541. "adcs r3, r3, r6\n\t"
  157542. #elif defined(__clang__)
  157543. "adcs r3, r6\n\t"
  157544. #else
  157545. "adc r3, r6\n\t"
  157546. #endif
  157547. #ifdef WOLFSSL_KEIL
  157548. "adcs r4, r4, %[r]\n\t"
  157549. #elif defined(__clang__)
  157550. "adcs r4, %[r]\n\t"
  157551. #else
  157552. "adc r4, %[r]\n\t"
  157553. #endif
  157554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157555. "adds r2, r2, r5\n\t"
  157556. #else
  157557. "add r2, r2, r5\n\t"
  157558. #endif
  157559. #ifdef WOLFSSL_KEIL
  157560. "adcs r3, r3, r6\n\t"
  157561. #elif defined(__clang__)
  157562. "adcs r3, r6\n\t"
  157563. #else
  157564. "adc r3, r6\n\t"
  157565. #endif
  157566. #ifdef WOLFSSL_KEIL
  157567. "adcs r4, r4, %[r]\n\t"
  157568. #elif defined(__clang__)
  157569. "adcs r4, %[r]\n\t"
  157570. #else
  157571. "adc r4, %[r]\n\t"
  157572. #endif
  157573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157574. "lsrs r5, %[a], #16\n\t"
  157575. #else
  157576. "lsr r5, %[a], #16\n\t"
  157577. #endif
  157578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157579. "lsrs r6, r7, #16\n\t"
  157580. #else
  157581. "lsr r6, r7, #16\n\t"
  157582. #endif
  157583. #ifdef WOLFSSL_KEIL
  157584. "muls r6, r5, r6\n\t"
  157585. #elif defined(__clang__)
  157586. "muls r6, r5\n\t"
  157587. #else
  157588. "mul r6, r5\n\t"
  157589. #endif
  157590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157591. "adds r3, r3, r6\n\t"
  157592. #else
  157593. "add r3, r3, r6\n\t"
  157594. #endif
  157595. #ifdef WOLFSSL_KEIL
  157596. "adcs r4, r4, %[r]\n\t"
  157597. #elif defined(__clang__)
  157598. "adcs r4, %[r]\n\t"
  157599. #else
  157600. "adc r4, %[r]\n\t"
  157601. #endif
  157602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157603. "adds r3, r3, r6\n\t"
  157604. #else
  157605. "add r3, r3, r6\n\t"
  157606. #endif
  157607. #ifdef WOLFSSL_KEIL
  157608. "adcs r4, r4, %[r]\n\t"
  157609. #elif defined(__clang__)
  157610. "adcs r4, %[r]\n\t"
  157611. #else
  157612. "adc r4, %[r]\n\t"
  157613. #endif
  157614. "uxth r6, r7\n\t"
  157615. #ifdef WOLFSSL_KEIL
  157616. "muls r5, r6, r5\n\t"
  157617. #elif defined(__clang__)
  157618. "muls r5, r6\n\t"
  157619. #else
  157620. "mul r5, r6\n\t"
  157621. #endif
  157622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157623. "lsrs r6, r5, #16\n\t"
  157624. #else
  157625. "lsr r6, r5, #16\n\t"
  157626. #endif
  157627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157628. "lsls r5, r5, #16\n\t"
  157629. #else
  157630. "lsl r5, r5, #16\n\t"
  157631. #endif
  157632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157633. "adds r2, r2, r5\n\t"
  157634. #else
  157635. "add r2, r2, r5\n\t"
  157636. #endif
  157637. #ifdef WOLFSSL_KEIL
  157638. "adcs r3, r3, r6\n\t"
  157639. #elif defined(__clang__)
  157640. "adcs r3, r6\n\t"
  157641. #else
  157642. "adc r3, r6\n\t"
  157643. #endif
  157644. #ifdef WOLFSSL_KEIL
  157645. "adcs r4, r4, %[r]\n\t"
  157646. #elif defined(__clang__)
  157647. "adcs r4, %[r]\n\t"
  157648. #else
  157649. "adc r4, %[r]\n\t"
  157650. #endif
  157651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157652. "adds r2, r2, r5\n\t"
  157653. #else
  157654. "add r2, r2, r5\n\t"
  157655. #endif
  157656. #ifdef WOLFSSL_KEIL
  157657. "adcs r3, r3, r6\n\t"
  157658. #elif defined(__clang__)
  157659. "adcs r3, r6\n\t"
  157660. #else
  157661. "adc r3, r6\n\t"
  157662. #endif
  157663. #ifdef WOLFSSL_KEIL
  157664. "adcs r4, r4, %[r]\n\t"
  157665. #elif defined(__clang__)
  157666. "adcs r4, %[r]\n\t"
  157667. #else
  157668. "adc r4, %[r]\n\t"
  157669. #endif
  157670. "# A[6] * A[3]\n\t"
  157671. "mov %[a], r9\n\t"
  157672. "mov r7, lr\n\t"
  157673. "ldr %[a], [%[a], #24]\n\t"
  157674. "uxth r5, %[a]\n\t"
  157675. "uxth r6, r7\n\t"
  157676. #ifdef WOLFSSL_KEIL
  157677. "muls r6, r5, r6\n\t"
  157678. #elif defined(__clang__)
  157679. "muls r6, r5\n\t"
  157680. #else
  157681. "mul r6, r5\n\t"
  157682. #endif
  157683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157684. "adds r2, r2, r6\n\t"
  157685. #else
  157686. "add r2, r2, r6\n\t"
  157687. #endif
  157688. #ifdef WOLFSSL_KEIL
  157689. "adcs r3, r3, %[r]\n\t"
  157690. #elif defined(__clang__)
  157691. "adcs r3, %[r]\n\t"
  157692. #else
  157693. "adc r3, %[r]\n\t"
  157694. #endif
  157695. #ifdef WOLFSSL_KEIL
  157696. "adcs r4, r4, %[r]\n\t"
  157697. #elif defined(__clang__)
  157698. "adcs r4, %[r]\n\t"
  157699. #else
  157700. "adc r4, %[r]\n\t"
  157701. #endif
  157702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157703. "adds r2, r2, r6\n\t"
  157704. #else
  157705. "add r2, r2, r6\n\t"
  157706. #endif
  157707. #ifdef WOLFSSL_KEIL
  157708. "adcs r3, r3, %[r]\n\t"
  157709. #elif defined(__clang__)
  157710. "adcs r3, %[r]\n\t"
  157711. #else
  157712. "adc r3, %[r]\n\t"
  157713. #endif
  157714. #ifdef WOLFSSL_KEIL
  157715. "adcs r4, r4, %[r]\n\t"
  157716. #elif defined(__clang__)
  157717. "adcs r4, %[r]\n\t"
  157718. #else
  157719. "adc r4, %[r]\n\t"
  157720. #endif
  157721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157722. "lsrs r6, r7, #16\n\t"
  157723. #else
  157724. "lsr r6, r7, #16\n\t"
  157725. #endif
  157726. #ifdef WOLFSSL_KEIL
  157727. "muls r5, r6, r5\n\t"
  157728. #elif defined(__clang__)
  157729. "muls r5, r6\n\t"
  157730. #else
  157731. "mul r5, r6\n\t"
  157732. #endif
  157733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157734. "lsrs r6, r5, #16\n\t"
  157735. #else
  157736. "lsr r6, r5, #16\n\t"
  157737. #endif
  157738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157739. "lsls r5, r5, #16\n\t"
  157740. #else
  157741. "lsl r5, r5, #16\n\t"
  157742. #endif
  157743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157744. "adds r2, r2, r5\n\t"
  157745. #else
  157746. "add r2, r2, r5\n\t"
  157747. #endif
  157748. #ifdef WOLFSSL_KEIL
  157749. "adcs r3, r3, r6\n\t"
  157750. #elif defined(__clang__)
  157751. "adcs r3, r6\n\t"
  157752. #else
  157753. "adc r3, r6\n\t"
  157754. #endif
  157755. #ifdef WOLFSSL_KEIL
  157756. "adcs r4, r4, %[r]\n\t"
  157757. #elif defined(__clang__)
  157758. "adcs r4, %[r]\n\t"
  157759. #else
  157760. "adc r4, %[r]\n\t"
  157761. #endif
  157762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157763. "adds r2, r2, r5\n\t"
  157764. #else
  157765. "add r2, r2, r5\n\t"
  157766. #endif
  157767. #ifdef WOLFSSL_KEIL
  157768. "adcs r3, r3, r6\n\t"
  157769. #elif defined(__clang__)
  157770. "adcs r3, r6\n\t"
  157771. #else
  157772. "adc r3, r6\n\t"
  157773. #endif
  157774. #ifdef WOLFSSL_KEIL
  157775. "adcs r4, r4, %[r]\n\t"
  157776. #elif defined(__clang__)
  157777. "adcs r4, %[r]\n\t"
  157778. #else
  157779. "adc r4, %[r]\n\t"
  157780. #endif
  157781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157782. "lsrs r5, %[a], #16\n\t"
  157783. #else
  157784. "lsr r5, %[a], #16\n\t"
  157785. #endif
  157786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157787. "lsrs r6, r7, #16\n\t"
  157788. #else
  157789. "lsr r6, r7, #16\n\t"
  157790. #endif
  157791. #ifdef WOLFSSL_KEIL
  157792. "muls r6, r5, r6\n\t"
  157793. #elif defined(__clang__)
  157794. "muls r6, r5\n\t"
  157795. #else
  157796. "mul r6, r5\n\t"
  157797. #endif
  157798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157799. "adds r3, r3, r6\n\t"
  157800. #else
  157801. "add r3, r3, r6\n\t"
  157802. #endif
  157803. #ifdef WOLFSSL_KEIL
  157804. "adcs r4, r4, %[r]\n\t"
  157805. #elif defined(__clang__)
  157806. "adcs r4, %[r]\n\t"
  157807. #else
  157808. "adc r4, %[r]\n\t"
  157809. #endif
  157810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157811. "adds r3, r3, r6\n\t"
  157812. #else
  157813. "add r3, r3, r6\n\t"
  157814. #endif
  157815. #ifdef WOLFSSL_KEIL
  157816. "adcs r4, r4, %[r]\n\t"
  157817. #elif defined(__clang__)
  157818. "adcs r4, %[r]\n\t"
  157819. #else
  157820. "adc r4, %[r]\n\t"
  157821. #endif
  157822. "uxth r6, r7\n\t"
  157823. #ifdef WOLFSSL_KEIL
  157824. "muls r5, r6, r5\n\t"
  157825. #elif defined(__clang__)
  157826. "muls r5, r6\n\t"
  157827. #else
  157828. "mul r5, r6\n\t"
  157829. #endif
  157830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157831. "lsrs r6, r5, #16\n\t"
  157832. #else
  157833. "lsr r6, r5, #16\n\t"
  157834. #endif
  157835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157836. "lsls r5, r5, #16\n\t"
  157837. #else
  157838. "lsl r5, r5, #16\n\t"
  157839. #endif
  157840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157841. "adds r2, r2, r5\n\t"
  157842. #else
  157843. "add r2, r2, r5\n\t"
  157844. #endif
  157845. #ifdef WOLFSSL_KEIL
  157846. "adcs r3, r3, r6\n\t"
  157847. #elif defined(__clang__)
  157848. "adcs r3, r6\n\t"
  157849. #else
  157850. "adc r3, r6\n\t"
  157851. #endif
  157852. #ifdef WOLFSSL_KEIL
  157853. "adcs r4, r4, %[r]\n\t"
  157854. #elif defined(__clang__)
  157855. "adcs r4, %[r]\n\t"
  157856. #else
  157857. "adc r4, %[r]\n\t"
  157858. #endif
  157859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157860. "adds r2, r2, r5\n\t"
  157861. #else
  157862. "add r2, r2, r5\n\t"
  157863. #endif
  157864. #ifdef WOLFSSL_KEIL
  157865. "adcs r3, r3, r6\n\t"
  157866. #elif defined(__clang__)
  157867. "adcs r3, r6\n\t"
  157868. #else
  157869. "adc r3, r6\n\t"
  157870. #endif
  157871. #ifdef WOLFSSL_KEIL
  157872. "adcs r4, r4, %[r]\n\t"
  157873. #elif defined(__clang__)
  157874. "adcs r4, %[r]\n\t"
  157875. #else
  157876. "adc r4, %[r]\n\t"
  157877. #endif
  157878. "# A[7] * A[2]\n\t"
  157879. "mov %[a], r9\n\t"
  157880. "mov r7, r12\n\t"
  157881. "ldr %[a], [%[a], #28]\n\t"
  157882. "uxth r5, %[a]\n\t"
  157883. "uxth r6, r7\n\t"
  157884. #ifdef WOLFSSL_KEIL
  157885. "muls r6, r5, r6\n\t"
  157886. #elif defined(__clang__)
  157887. "muls r6, r5\n\t"
  157888. #else
  157889. "mul r6, r5\n\t"
  157890. #endif
  157891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157892. "adds r2, r2, r6\n\t"
  157893. #else
  157894. "add r2, r2, r6\n\t"
  157895. #endif
  157896. #ifdef WOLFSSL_KEIL
  157897. "adcs r3, r3, %[r]\n\t"
  157898. #elif defined(__clang__)
  157899. "adcs r3, %[r]\n\t"
  157900. #else
  157901. "adc r3, %[r]\n\t"
  157902. #endif
  157903. #ifdef WOLFSSL_KEIL
  157904. "adcs r4, r4, %[r]\n\t"
  157905. #elif defined(__clang__)
  157906. "adcs r4, %[r]\n\t"
  157907. #else
  157908. "adc r4, %[r]\n\t"
  157909. #endif
  157910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157911. "adds r2, r2, r6\n\t"
  157912. #else
  157913. "add r2, r2, r6\n\t"
  157914. #endif
  157915. #ifdef WOLFSSL_KEIL
  157916. "adcs r3, r3, %[r]\n\t"
  157917. #elif defined(__clang__)
  157918. "adcs r3, %[r]\n\t"
  157919. #else
  157920. "adc r3, %[r]\n\t"
  157921. #endif
  157922. #ifdef WOLFSSL_KEIL
  157923. "adcs r4, r4, %[r]\n\t"
  157924. #elif defined(__clang__)
  157925. "adcs r4, %[r]\n\t"
  157926. #else
  157927. "adc r4, %[r]\n\t"
  157928. #endif
  157929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157930. "lsrs r6, r7, #16\n\t"
  157931. #else
  157932. "lsr r6, r7, #16\n\t"
  157933. #endif
  157934. #ifdef WOLFSSL_KEIL
  157935. "muls r5, r6, r5\n\t"
  157936. #elif defined(__clang__)
  157937. "muls r5, r6\n\t"
  157938. #else
  157939. "mul r5, r6\n\t"
  157940. #endif
  157941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157942. "lsrs r6, r5, #16\n\t"
  157943. #else
  157944. "lsr r6, r5, #16\n\t"
  157945. #endif
  157946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157947. "lsls r5, r5, #16\n\t"
  157948. #else
  157949. "lsl r5, r5, #16\n\t"
  157950. #endif
  157951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157952. "adds r2, r2, r5\n\t"
  157953. #else
  157954. "add r2, r2, r5\n\t"
  157955. #endif
  157956. #ifdef WOLFSSL_KEIL
  157957. "adcs r3, r3, r6\n\t"
  157958. #elif defined(__clang__)
  157959. "adcs r3, r6\n\t"
  157960. #else
  157961. "adc r3, r6\n\t"
  157962. #endif
  157963. #ifdef WOLFSSL_KEIL
  157964. "adcs r4, r4, %[r]\n\t"
  157965. #elif defined(__clang__)
  157966. "adcs r4, %[r]\n\t"
  157967. #else
  157968. "adc r4, %[r]\n\t"
  157969. #endif
  157970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157971. "adds r2, r2, r5\n\t"
  157972. #else
  157973. "add r2, r2, r5\n\t"
  157974. #endif
  157975. #ifdef WOLFSSL_KEIL
  157976. "adcs r3, r3, r6\n\t"
  157977. #elif defined(__clang__)
  157978. "adcs r3, r6\n\t"
  157979. #else
  157980. "adc r3, r6\n\t"
  157981. #endif
  157982. #ifdef WOLFSSL_KEIL
  157983. "adcs r4, r4, %[r]\n\t"
  157984. #elif defined(__clang__)
  157985. "adcs r4, %[r]\n\t"
  157986. #else
  157987. "adc r4, %[r]\n\t"
  157988. #endif
  157989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157990. "lsrs r5, %[a], #16\n\t"
  157991. #else
  157992. "lsr r5, %[a], #16\n\t"
  157993. #endif
  157994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157995. "lsrs r6, r7, #16\n\t"
  157996. #else
  157997. "lsr r6, r7, #16\n\t"
  157998. #endif
  157999. #ifdef WOLFSSL_KEIL
  158000. "muls r6, r5, r6\n\t"
  158001. #elif defined(__clang__)
  158002. "muls r6, r5\n\t"
  158003. #else
  158004. "mul r6, r5\n\t"
  158005. #endif
  158006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158007. "adds r3, r3, r6\n\t"
  158008. #else
  158009. "add r3, r3, r6\n\t"
  158010. #endif
  158011. #ifdef WOLFSSL_KEIL
  158012. "adcs r4, r4, %[r]\n\t"
  158013. #elif defined(__clang__)
  158014. "adcs r4, %[r]\n\t"
  158015. #else
  158016. "adc r4, %[r]\n\t"
  158017. #endif
  158018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158019. "adds r3, r3, r6\n\t"
  158020. #else
  158021. "add r3, r3, r6\n\t"
  158022. #endif
  158023. #ifdef WOLFSSL_KEIL
  158024. "adcs r4, r4, %[r]\n\t"
  158025. #elif defined(__clang__)
  158026. "adcs r4, %[r]\n\t"
  158027. #else
  158028. "adc r4, %[r]\n\t"
  158029. #endif
  158030. "uxth r6, r7\n\t"
  158031. #ifdef WOLFSSL_KEIL
  158032. "muls r5, r6, r5\n\t"
  158033. #elif defined(__clang__)
  158034. "muls r5, r6\n\t"
  158035. #else
  158036. "mul r5, r6\n\t"
  158037. #endif
  158038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158039. "lsrs r6, r5, #16\n\t"
  158040. #else
  158041. "lsr r6, r5, #16\n\t"
  158042. #endif
  158043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158044. "lsls r5, r5, #16\n\t"
  158045. #else
  158046. "lsl r5, r5, #16\n\t"
  158047. #endif
  158048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158049. "adds r2, r2, r5\n\t"
  158050. #else
  158051. "add r2, r2, r5\n\t"
  158052. #endif
  158053. #ifdef WOLFSSL_KEIL
  158054. "adcs r3, r3, r6\n\t"
  158055. #elif defined(__clang__)
  158056. "adcs r3, r6\n\t"
  158057. #else
  158058. "adc r3, r6\n\t"
  158059. #endif
  158060. #ifdef WOLFSSL_KEIL
  158061. "adcs r4, r4, %[r]\n\t"
  158062. #elif defined(__clang__)
  158063. "adcs r4, %[r]\n\t"
  158064. #else
  158065. "adc r4, %[r]\n\t"
  158066. #endif
  158067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158068. "adds r2, r2, r5\n\t"
  158069. #else
  158070. "add r2, r2, r5\n\t"
  158071. #endif
  158072. #ifdef WOLFSSL_KEIL
  158073. "adcs r3, r3, r6\n\t"
  158074. #elif defined(__clang__)
  158075. "adcs r3, r6\n\t"
  158076. #else
  158077. "adc r3, r6\n\t"
  158078. #endif
  158079. #ifdef WOLFSSL_KEIL
  158080. "adcs r4, r4, %[r]\n\t"
  158081. #elif defined(__clang__)
  158082. "adcs r4, %[r]\n\t"
  158083. #else
  158084. "adc r4, %[r]\n\t"
  158085. #endif
  158086. "# A[8] * A[1]\n\t"
  158087. "mov %[a], r9\n\t"
  158088. "mov r7, r11\n\t"
  158089. "ldr %[a], [%[a], #32]\n\t"
  158090. "uxth r5, %[a]\n\t"
  158091. "uxth r6, r7\n\t"
  158092. #ifdef WOLFSSL_KEIL
  158093. "muls r6, r5, r6\n\t"
  158094. #elif defined(__clang__)
  158095. "muls r6, r5\n\t"
  158096. #else
  158097. "mul r6, r5\n\t"
  158098. #endif
  158099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158100. "adds r2, r2, r6\n\t"
  158101. #else
  158102. "add r2, r2, r6\n\t"
  158103. #endif
  158104. #ifdef WOLFSSL_KEIL
  158105. "adcs r3, r3, %[r]\n\t"
  158106. #elif defined(__clang__)
  158107. "adcs r3, %[r]\n\t"
  158108. #else
  158109. "adc r3, %[r]\n\t"
  158110. #endif
  158111. #ifdef WOLFSSL_KEIL
  158112. "adcs r4, r4, %[r]\n\t"
  158113. #elif defined(__clang__)
  158114. "adcs r4, %[r]\n\t"
  158115. #else
  158116. "adc r4, %[r]\n\t"
  158117. #endif
  158118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158119. "adds r2, r2, r6\n\t"
  158120. #else
  158121. "add r2, r2, r6\n\t"
  158122. #endif
  158123. #ifdef WOLFSSL_KEIL
  158124. "adcs r3, r3, %[r]\n\t"
  158125. #elif defined(__clang__)
  158126. "adcs r3, %[r]\n\t"
  158127. #else
  158128. "adc r3, %[r]\n\t"
  158129. #endif
  158130. #ifdef WOLFSSL_KEIL
  158131. "adcs r4, r4, %[r]\n\t"
  158132. #elif defined(__clang__)
  158133. "adcs r4, %[r]\n\t"
  158134. #else
  158135. "adc r4, %[r]\n\t"
  158136. #endif
  158137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158138. "lsrs r6, r7, #16\n\t"
  158139. #else
  158140. "lsr r6, r7, #16\n\t"
  158141. #endif
  158142. #ifdef WOLFSSL_KEIL
  158143. "muls r5, r6, r5\n\t"
  158144. #elif defined(__clang__)
  158145. "muls r5, r6\n\t"
  158146. #else
  158147. "mul r5, r6\n\t"
  158148. #endif
  158149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158150. "lsrs r6, r5, #16\n\t"
  158151. #else
  158152. "lsr r6, r5, #16\n\t"
  158153. #endif
  158154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158155. "lsls r5, r5, #16\n\t"
  158156. #else
  158157. "lsl r5, r5, #16\n\t"
  158158. #endif
  158159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158160. "adds r2, r2, r5\n\t"
  158161. #else
  158162. "add r2, r2, r5\n\t"
  158163. #endif
  158164. #ifdef WOLFSSL_KEIL
  158165. "adcs r3, r3, r6\n\t"
  158166. #elif defined(__clang__)
  158167. "adcs r3, r6\n\t"
  158168. #else
  158169. "adc r3, r6\n\t"
  158170. #endif
  158171. #ifdef WOLFSSL_KEIL
  158172. "adcs r4, r4, %[r]\n\t"
  158173. #elif defined(__clang__)
  158174. "adcs r4, %[r]\n\t"
  158175. #else
  158176. "adc r4, %[r]\n\t"
  158177. #endif
  158178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158179. "adds r2, r2, r5\n\t"
  158180. #else
  158181. "add r2, r2, r5\n\t"
  158182. #endif
  158183. #ifdef WOLFSSL_KEIL
  158184. "adcs r3, r3, r6\n\t"
  158185. #elif defined(__clang__)
  158186. "adcs r3, r6\n\t"
  158187. #else
  158188. "adc r3, r6\n\t"
  158189. #endif
  158190. #ifdef WOLFSSL_KEIL
  158191. "adcs r4, r4, %[r]\n\t"
  158192. #elif defined(__clang__)
  158193. "adcs r4, %[r]\n\t"
  158194. #else
  158195. "adc r4, %[r]\n\t"
  158196. #endif
  158197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158198. "lsrs r5, %[a], #16\n\t"
  158199. #else
  158200. "lsr r5, %[a], #16\n\t"
  158201. #endif
  158202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158203. "lsrs r6, r7, #16\n\t"
  158204. #else
  158205. "lsr r6, r7, #16\n\t"
  158206. #endif
  158207. #ifdef WOLFSSL_KEIL
  158208. "muls r6, r5, r6\n\t"
  158209. #elif defined(__clang__)
  158210. "muls r6, r5\n\t"
  158211. #else
  158212. "mul r6, r5\n\t"
  158213. #endif
  158214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158215. "adds r3, r3, r6\n\t"
  158216. #else
  158217. "add r3, r3, r6\n\t"
  158218. #endif
  158219. #ifdef WOLFSSL_KEIL
  158220. "adcs r4, r4, %[r]\n\t"
  158221. #elif defined(__clang__)
  158222. "adcs r4, %[r]\n\t"
  158223. #else
  158224. "adc r4, %[r]\n\t"
  158225. #endif
  158226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158227. "adds r3, r3, r6\n\t"
  158228. #else
  158229. "add r3, r3, r6\n\t"
  158230. #endif
  158231. #ifdef WOLFSSL_KEIL
  158232. "adcs r4, r4, %[r]\n\t"
  158233. #elif defined(__clang__)
  158234. "adcs r4, %[r]\n\t"
  158235. #else
  158236. "adc r4, %[r]\n\t"
  158237. #endif
  158238. "uxth r6, r7\n\t"
  158239. #ifdef WOLFSSL_KEIL
  158240. "muls r5, r6, r5\n\t"
  158241. #elif defined(__clang__)
  158242. "muls r5, r6\n\t"
  158243. #else
  158244. "mul r5, r6\n\t"
  158245. #endif
  158246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158247. "lsrs r6, r5, #16\n\t"
  158248. #else
  158249. "lsr r6, r5, #16\n\t"
  158250. #endif
  158251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158252. "lsls r5, r5, #16\n\t"
  158253. #else
  158254. "lsl r5, r5, #16\n\t"
  158255. #endif
  158256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158257. "adds r2, r2, r5\n\t"
  158258. #else
  158259. "add r2, r2, r5\n\t"
  158260. #endif
  158261. #ifdef WOLFSSL_KEIL
  158262. "adcs r3, r3, r6\n\t"
  158263. #elif defined(__clang__)
  158264. "adcs r3, r6\n\t"
  158265. #else
  158266. "adc r3, r6\n\t"
  158267. #endif
  158268. #ifdef WOLFSSL_KEIL
  158269. "adcs r4, r4, %[r]\n\t"
  158270. #elif defined(__clang__)
  158271. "adcs r4, %[r]\n\t"
  158272. #else
  158273. "adc r4, %[r]\n\t"
  158274. #endif
  158275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158276. "adds r2, r2, r5\n\t"
  158277. #else
  158278. "add r2, r2, r5\n\t"
  158279. #endif
  158280. #ifdef WOLFSSL_KEIL
  158281. "adcs r3, r3, r6\n\t"
  158282. #elif defined(__clang__)
  158283. "adcs r3, r6\n\t"
  158284. #else
  158285. "adc r3, r6\n\t"
  158286. #endif
  158287. #ifdef WOLFSSL_KEIL
  158288. "adcs r4, r4, %[r]\n\t"
  158289. #elif defined(__clang__)
  158290. "adcs r4, %[r]\n\t"
  158291. #else
  158292. "adc r4, %[r]\n\t"
  158293. #endif
  158294. "# A[9] * A[0]\n\t"
  158295. "mov %[a], r9\n\t"
  158296. "mov r7, r10\n\t"
  158297. "ldr %[a], [%[a], #36]\n\t"
  158298. "uxth r5, %[a]\n\t"
  158299. "uxth r6, r7\n\t"
  158300. #ifdef WOLFSSL_KEIL
  158301. "muls r6, r5, r6\n\t"
  158302. #elif defined(__clang__)
  158303. "muls r6, r5\n\t"
  158304. #else
  158305. "mul r6, r5\n\t"
  158306. #endif
  158307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158308. "adds r2, r2, r6\n\t"
  158309. #else
  158310. "add r2, r2, r6\n\t"
  158311. #endif
  158312. #ifdef WOLFSSL_KEIL
  158313. "adcs r3, r3, %[r]\n\t"
  158314. #elif defined(__clang__)
  158315. "adcs r3, %[r]\n\t"
  158316. #else
  158317. "adc r3, %[r]\n\t"
  158318. #endif
  158319. #ifdef WOLFSSL_KEIL
  158320. "adcs r4, r4, %[r]\n\t"
  158321. #elif defined(__clang__)
  158322. "adcs r4, %[r]\n\t"
  158323. #else
  158324. "adc r4, %[r]\n\t"
  158325. #endif
  158326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158327. "adds r2, r2, r6\n\t"
  158328. #else
  158329. "add r2, r2, r6\n\t"
  158330. #endif
  158331. #ifdef WOLFSSL_KEIL
  158332. "adcs r3, r3, %[r]\n\t"
  158333. #elif defined(__clang__)
  158334. "adcs r3, %[r]\n\t"
  158335. #else
  158336. "adc r3, %[r]\n\t"
  158337. #endif
  158338. #ifdef WOLFSSL_KEIL
  158339. "adcs r4, r4, %[r]\n\t"
  158340. #elif defined(__clang__)
  158341. "adcs r4, %[r]\n\t"
  158342. #else
  158343. "adc r4, %[r]\n\t"
  158344. #endif
  158345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158346. "lsrs r6, r7, #16\n\t"
  158347. #else
  158348. "lsr r6, r7, #16\n\t"
  158349. #endif
  158350. #ifdef WOLFSSL_KEIL
  158351. "muls r5, r6, r5\n\t"
  158352. #elif defined(__clang__)
  158353. "muls r5, r6\n\t"
  158354. #else
  158355. "mul r5, r6\n\t"
  158356. #endif
  158357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158358. "lsrs r6, r5, #16\n\t"
  158359. #else
  158360. "lsr r6, r5, #16\n\t"
  158361. #endif
  158362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158363. "lsls r5, r5, #16\n\t"
  158364. #else
  158365. "lsl r5, r5, #16\n\t"
  158366. #endif
  158367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158368. "adds r2, r2, r5\n\t"
  158369. #else
  158370. "add r2, r2, r5\n\t"
  158371. #endif
  158372. #ifdef WOLFSSL_KEIL
  158373. "adcs r3, r3, r6\n\t"
  158374. #elif defined(__clang__)
  158375. "adcs r3, r6\n\t"
  158376. #else
  158377. "adc r3, r6\n\t"
  158378. #endif
  158379. #ifdef WOLFSSL_KEIL
  158380. "adcs r4, r4, %[r]\n\t"
  158381. #elif defined(__clang__)
  158382. "adcs r4, %[r]\n\t"
  158383. #else
  158384. "adc r4, %[r]\n\t"
  158385. #endif
  158386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158387. "adds r2, r2, r5\n\t"
  158388. #else
  158389. "add r2, r2, r5\n\t"
  158390. #endif
  158391. #ifdef WOLFSSL_KEIL
  158392. "adcs r3, r3, r6\n\t"
  158393. #elif defined(__clang__)
  158394. "adcs r3, r6\n\t"
  158395. #else
  158396. "adc r3, r6\n\t"
  158397. #endif
  158398. #ifdef WOLFSSL_KEIL
  158399. "adcs r4, r4, %[r]\n\t"
  158400. #elif defined(__clang__)
  158401. "adcs r4, %[r]\n\t"
  158402. #else
  158403. "adc r4, %[r]\n\t"
  158404. #endif
  158405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158406. "lsrs r5, %[a], #16\n\t"
  158407. #else
  158408. "lsr r5, %[a], #16\n\t"
  158409. #endif
  158410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158411. "lsrs r6, r7, #16\n\t"
  158412. #else
  158413. "lsr r6, r7, #16\n\t"
  158414. #endif
  158415. #ifdef WOLFSSL_KEIL
  158416. "muls r6, r5, r6\n\t"
  158417. #elif defined(__clang__)
  158418. "muls r6, r5\n\t"
  158419. #else
  158420. "mul r6, r5\n\t"
  158421. #endif
  158422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158423. "adds r3, r3, r6\n\t"
  158424. #else
  158425. "add r3, r3, r6\n\t"
  158426. #endif
  158427. #ifdef WOLFSSL_KEIL
  158428. "adcs r4, r4, %[r]\n\t"
  158429. #elif defined(__clang__)
  158430. "adcs r4, %[r]\n\t"
  158431. #else
  158432. "adc r4, %[r]\n\t"
  158433. #endif
  158434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158435. "adds r3, r3, r6\n\t"
  158436. #else
  158437. "add r3, r3, r6\n\t"
  158438. #endif
  158439. #ifdef WOLFSSL_KEIL
  158440. "adcs r4, r4, %[r]\n\t"
  158441. #elif defined(__clang__)
  158442. "adcs r4, %[r]\n\t"
  158443. #else
  158444. "adc r4, %[r]\n\t"
  158445. #endif
  158446. "uxth r6, r7\n\t"
  158447. #ifdef WOLFSSL_KEIL
  158448. "muls r5, r6, r5\n\t"
  158449. #elif defined(__clang__)
  158450. "muls r5, r6\n\t"
  158451. #else
  158452. "mul r5, r6\n\t"
  158453. #endif
  158454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158455. "lsrs r6, r5, #16\n\t"
  158456. #else
  158457. "lsr r6, r5, #16\n\t"
  158458. #endif
  158459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158460. "lsls r5, r5, #16\n\t"
  158461. #else
  158462. "lsl r5, r5, #16\n\t"
  158463. #endif
  158464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158465. "adds r2, r2, r5\n\t"
  158466. #else
  158467. "add r2, r2, r5\n\t"
  158468. #endif
  158469. #ifdef WOLFSSL_KEIL
  158470. "adcs r3, r3, r6\n\t"
  158471. #elif defined(__clang__)
  158472. "adcs r3, r6\n\t"
  158473. #else
  158474. "adc r3, r6\n\t"
  158475. #endif
  158476. #ifdef WOLFSSL_KEIL
  158477. "adcs r4, r4, %[r]\n\t"
  158478. #elif defined(__clang__)
  158479. "adcs r4, %[r]\n\t"
  158480. #else
  158481. "adc r4, %[r]\n\t"
  158482. #endif
  158483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158484. "adds r2, r2, r5\n\t"
  158485. #else
  158486. "add r2, r2, r5\n\t"
  158487. #endif
  158488. #ifdef WOLFSSL_KEIL
  158489. "adcs r3, r3, r6\n\t"
  158490. #elif defined(__clang__)
  158491. "adcs r3, r6\n\t"
  158492. #else
  158493. "adc r3, r6\n\t"
  158494. #endif
  158495. #ifdef WOLFSSL_KEIL
  158496. "adcs r4, r4, %[r]\n\t"
  158497. #elif defined(__clang__)
  158498. "adcs r4, %[r]\n\t"
  158499. #else
  158500. "adc r4, %[r]\n\t"
  158501. #endif
  158502. "str r2, [sp, #36]\n\t"
  158503. "# A[10] * A[0]\n\t"
  158504. "movs r2, #0\n\t"
  158505. "mov %[a], r9\n\t"
  158506. "ldr %[a], [%[a], #40]\n\t"
  158507. "uxth r5, %[a]\n\t"
  158508. "uxth r6, r7\n\t"
  158509. #ifdef WOLFSSL_KEIL
  158510. "muls r6, r5, r6\n\t"
  158511. #elif defined(__clang__)
  158512. "muls r6, r5\n\t"
  158513. #else
  158514. "mul r6, r5\n\t"
  158515. #endif
  158516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158517. "adds r3, r3, r6\n\t"
  158518. #else
  158519. "add r3, r3, r6\n\t"
  158520. #endif
  158521. #ifdef WOLFSSL_KEIL
  158522. "adcs r4, r4, %[r]\n\t"
  158523. #elif defined(__clang__)
  158524. "adcs r4, %[r]\n\t"
  158525. #else
  158526. "adc r4, %[r]\n\t"
  158527. #endif
  158528. #ifdef WOLFSSL_KEIL
  158529. "adcs r2, r2, %[r]\n\t"
  158530. #elif defined(__clang__)
  158531. "adcs r2, %[r]\n\t"
  158532. #else
  158533. "adc r2, %[r]\n\t"
  158534. #endif
  158535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158536. "adds r3, r3, r6\n\t"
  158537. #else
  158538. "add r3, r3, r6\n\t"
  158539. #endif
  158540. #ifdef WOLFSSL_KEIL
  158541. "adcs r4, r4, %[r]\n\t"
  158542. #elif defined(__clang__)
  158543. "adcs r4, %[r]\n\t"
  158544. #else
  158545. "adc r4, %[r]\n\t"
  158546. #endif
  158547. #ifdef WOLFSSL_KEIL
  158548. "adcs r2, r2, %[r]\n\t"
  158549. #elif defined(__clang__)
  158550. "adcs r2, %[r]\n\t"
  158551. #else
  158552. "adc r2, %[r]\n\t"
  158553. #endif
  158554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158555. "lsrs r6, r7, #16\n\t"
  158556. #else
  158557. "lsr r6, r7, #16\n\t"
  158558. #endif
  158559. #ifdef WOLFSSL_KEIL
  158560. "muls r5, r6, r5\n\t"
  158561. #elif defined(__clang__)
  158562. "muls r5, r6\n\t"
  158563. #else
  158564. "mul r5, r6\n\t"
  158565. #endif
  158566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158567. "lsrs r6, r5, #16\n\t"
  158568. #else
  158569. "lsr r6, r5, #16\n\t"
  158570. #endif
  158571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158572. "lsls r5, r5, #16\n\t"
  158573. #else
  158574. "lsl r5, r5, #16\n\t"
  158575. #endif
  158576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158577. "adds r3, r3, r5\n\t"
  158578. #else
  158579. "add r3, r3, r5\n\t"
  158580. #endif
  158581. #ifdef WOLFSSL_KEIL
  158582. "adcs r4, r4, r6\n\t"
  158583. #elif defined(__clang__)
  158584. "adcs r4, r6\n\t"
  158585. #else
  158586. "adc r4, r6\n\t"
  158587. #endif
  158588. #ifdef WOLFSSL_KEIL
  158589. "adcs r2, r2, %[r]\n\t"
  158590. #elif defined(__clang__)
  158591. "adcs r2, %[r]\n\t"
  158592. #else
  158593. "adc r2, %[r]\n\t"
  158594. #endif
  158595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158596. "adds r3, r3, r5\n\t"
  158597. #else
  158598. "add r3, r3, r5\n\t"
  158599. #endif
  158600. #ifdef WOLFSSL_KEIL
  158601. "adcs r4, r4, r6\n\t"
  158602. #elif defined(__clang__)
  158603. "adcs r4, r6\n\t"
  158604. #else
  158605. "adc r4, r6\n\t"
  158606. #endif
  158607. #ifdef WOLFSSL_KEIL
  158608. "adcs r2, r2, %[r]\n\t"
  158609. #elif defined(__clang__)
  158610. "adcs r2, %[r]\n\t"
  158611. #else
  158612. "adc r2, %[r]\n\t"
  158613. #endif
  158614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158615. "lsrs r5, %[a], #16\n\t"
  158616. #else
  158617. "lsr r5, %[a], #16\n\t"
  158618. #endif
  158619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158620. "lsrs r6, r7, #16\n\t"
  158621. #else
  158622. "lsr r6, r7, #16\n\t"
  158623. #endif
  158624. #ifdef WOLFSSL_KEIL
  158625. "muls r6, r5, r6\n\t"
  158626. #elif defined(__clang__)
  158627. "muls r6, r5\n\t"
  158628. #else
  158629. "mul r6, r5\n\t"
  158630. #endif
  158631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158632. "adds r4, r4, r6\n\t"
  158633. #else
  158634. "add r4, r4, r6\n\t"
  158635. #endif
  158636. #ifdef WOLFSSL_KEIL
  158637. "adcs r2, r2, %[r]\n\t"
  158638. #elif defined(__clang__)
  158639. "adcs r2, %[r]\n\t"
  158640. #else
  158641. "adc r2, %[r]\n\t"
  158642. #endif
  158643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158644. "adds r4, r4, r6\n\t"
  158645. #else
  158646. "add r4, r4, r6\n\t"
  158647. #endif
  158648. #ifdef WOLFSSL_KEIL
  158649. "adcs r2, r2, %[r]\n\t"
  158650. #elif defined(__clang__)
  158651. "adcs r2, %[r]\n\t"
  158652. #else
  158653. "adc r2, %[r]\n\t"
  158654. #endif
  158655. "uxth r6, r7\n\t"
  158656. #ifdef WOLFSSL_KEIL
  158657. "muls r5, r6, r5\n\t"
  158658. #elif defined(__clang__)
  158659. "muls r5, r6\n\t"
  158660. #else
  158661. "mul r5, r6\n\t"
  158662. #endif
  158663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158664. "lsrs r6, r5, #16\n\t"
  158665. #else
  158666. "lsr r6, r5, #16\n\t"
  158667. #endif
  158668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158669. "lsls r5, r5, #16\n\t"
  158670. #else
  158671. "lsl r5, r5, #16\n\t"
  158672. #endif
  158673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158674. "adds r3, r3, r5\n\t"
  158675. #else
  158676. "add r3, r3, r5\n\t"
  158677. #endif
  158678. #ifdef WOLFSSL_KEIL
  158679. "adcs r4, r4, r6\n\t"
  158680. #elif defined(__clang__)
  158681. "adcs r4, r6\n\t"
  158682. #else
  158683. "adc r4, r6\n\t"
  158684. #endif
  158685. #ifdef WOLFSSL_KEIL
  158686. "adcs r2, r2, %[r]\n\t"
  158687. #elif defined(__clang__)
  158688. "adcs r2, %[r]\n\t"
  158689. #else
  158690. "adc r2, %[r]\n\t"
  158691. #endif
  158692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158693. "adds r3, r3, r5\n\t"
  158694. #else
  158695. "add r3, r3, r5\n\t"
  158696. #endif
  158697. #ifdef WOLFSSL_KEIL
  158698. "adcs r4, r4, r6\n\t"
  158699. #elif defined(__clang__)
  158700. "adcs r4, r6\n\t"
  158701. #else
  158702. "adc r4, r6\n\t"
  158703. #endif
  158704. #ifdef WOLFSSL_KEIL
  158705. "adcs r2, r2, %[r]\n\t"
  158706. #elif defined(__clang__)
  158707. "adcs r2, %[r]\n\t"
  158708. #else
  158709. "adc r2, %[r]\n\t"
  158710. #endif
  158711. "# A[9] * A[1]\n\t"
  158712. "mov %[a], r9\n\t"
  158713. "mov r7, r11\n\t"
  158714. "ldr %[a], [%[a], #36]\n\t"
  158715. "uxth r5, %[a]\n\t"
  158716. "uxth r6, r7\n\t"
  158717. #ifdef WOLFSSL_KEIL
  158718. "muls r6, r5, r6\n\t"
  158719. #elif defined(__clang__)
  158720. "muls r6, r5\n\t"
  158721. #else
  158722. "mul r6, r5\n\t"
  158723. #endif
  158724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158725. "adds r3, r3, r6\n\t"
  158726. #else
  158727. "add r3, r3, r6\n\t"
  158728. #endif
  158729. #ifdef WOLFSSL_KEIL
  158730. "adcs r4, r4, %[r]\n\t"
  158731. #elif defined(__clang__)
  158732. "adcs r4, %[r]\n\t"
  158733. #else
  158734. "adc r4, %[r]\n\t"
  158735. #endif
  158736. #ifdef WOLFSSL_KEIL
  158737. "adcs r2, r2, %[r]\n\t"
  158738. #elif defined(__clang__)
  158739. "adcs r2, %[r]\n\t"
  158740. #else
  158741. "adc r2, %[r]\n\t"
  158742. #endif
  158743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158744. "adds r3, r3, r6\n\t"
  158745. #else
  158746. "add r3, r3, r6\n\t"
  158747. #endif
  158748. #ifdef WOLFSSL_KEIL
  158749. "adcs r4, r4, %[r]\n\t"
  158750. #elif defined(__clang__)
  158751. "adcs r4, %[r]\n\t"
  158752. #else
  158753. "adc r4, %[r]\n\t"
  158754. #endif
  158755. #ifdef WOLFSSL_KEIL
  158756. "adcs r2, r2, %[r]\n\t"
  158757. #elif defined(__clang__)
  158758. "adcs r2, %[r]\n\t"
  158759. #else
  158760. "adc r2, %[r]\n\t"
  158761. #endif
  158762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158763. "lsrs r6, r7, #16\n\t"
  158764. #else
  158765. "lsr r6, r7, #16\n\t"
  158766. #endif
  158767. #ifdef WOLFSSL_KEIL
  158768. "muls r5, r6, r5\n\t"
  158769. #elif defined(__clang__)
  158770. "muls r5, r6\n\t"
  158771. #else
  158772. "mul r5, r6\n\t"
  158773. #endif
  158774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158775. "lsrs r6, r5, #16\n\t"
  158776. #else
  158777. "lsr r6, r5, #16\n\t"
  158778. #endif
  158779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158780. "lsls r5, r5, #16\n\t"
  158781. #else
  158782. "lsl r5, r5, #16\n\t"
  158783. #endif
  158784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158785. "adds r3, r3, r5\n\t"
  158786. #else
  158787. "add r3, r3, r5\n\t"
  158788. #endif
  158789. #ifdef WOLFSSL_KEIL
  158790. "adcs r4, r4, r6\n\t"
  158791. #elif defined(__clang__)
  158792. "adcs r4, r6\n\t"
  158793. #else
  158794. "adc r4, r6\n\t"
  158795. #endif
  158796. #ifdef WOLFSSL_KEIL
  158797. "adcs r2, r2, %[r]\n\t"
  158798. #elif defined(__clang__)
  158799. "adcs r2, %[r]\n\t"
  158800. #else
  158801. "adc r2, %[r]\n\t"
  158802. #endif
  158803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158804. "adds r3, r3, r5\n\t"
  158805. #else
  158806. "add r3, r3, r5\n\t"
  158807. #endif
  158808. #ifdef WOLFSSL_KEIL
  158809. "adcs r4, r4, r6\n\t"
  158810. #elif defined(__clang__)
  158811. "adcs r4, r6\n\t"
  158812. #else
  158813. "adc r4, r6\n\t"
  158814. #endif
  158815. #ifdef WOLFSSL_KEIL
  158816. "adcs r2, r2, %[r]\n\t"
  158817. #elif defined(__clang__)
  158818. "adcs r2, %[r]\n\t"
  158819. #else
  158820. "adc r2, %[r]\n\t"
  158821. #endif
  158822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158823. "lsrs r5, %[a], #16\n\t"
  158824. #else
  158825. "lsr r5, %[a], #16\n\t"
  158826. #endif
  158827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158828. "lsrs r6, r7, #16\n\t"
  158829. #else
  158830. "lsr r6, r7, #16\n\t"
  158831. #endif
  158832. #ifdef WOLFSSL_KEIL
  158833. "muls r6, r5, r6\n\t"
  158834. #elif defined(__clang__)
  158835. "muls r6, r5\n\t"
  158836. #else
  158837. "mul r6, r5\n\t"
  158838. #endif
  158839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158840. "adds r4, r4, r6\n\t"
  158841. #else
  158842. "add r4, r4, r6\n\t"
  158843. #endif
  158844. #ifdef WOLFSSL_KEIL
  158845. "adcs r2, r2, %[r]\n\t"
  158846. #elif defined(__clang__)
  158847. "adcs r2, %[r]\n\t"
  158848. #else
  158849. "adc r2, %[r]\n\t"
  158850. #endif
  158851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158852. "adds r4, r4, r6\n\t"
  158853. #else
  158854. "add r4, r4, r6\n\t"
  158855. #endif
  158856. #ifdef WOLFSSL_KEIL
  158857. "adcs r2, r2, %[r]\n\t"
  158858. #elif defined(__clang__)
  158859. "adcs r2, %[r]\n\t"
  158860. #else
  158861. "adc r2, %[r]\n\t"
  158862. #endif
  158863. "uxth r6, r7\n\t"
  158864. #ifdef WOLFSSL_KEIL
  158865. "muls r5, r6, r5\n\t"
  158866. #elif defined(__clang__)
  158867. "muls r5, r6\n\t"
  158868. #else
  158869. "mul r5, r6\n\t"
  158870. #endif
  158871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158872. "lsrs r6, r5, #16\n\t"
  158873. #else
  158874. "lsr r6, r5, #16\n\t"
  158875. #endif
  158876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158877. "lsls r5, r5, #16\n\t"
  158878. #else
  158879. "lsl r5, r5, #16\n\t"
  158880. #endif
  158881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158882. "adds r3, r3, r5\n\t"
  158883. #else
  158884. "add r3, r3, r5\n\t"
  158885. #endif
  158886. #ifdef WOLFSSL_KEIL
  158887. "adcs r4, r4, r6\n\t"
  158888. #elif defined(__clang__)
  158889. "adcs r4, r6\n\t"
  158890. #else
  158891. "adc r4, r6\n\t"
  158892. #endif
  158893. #ifdef WOLFSSL_KEIL
  158894. "adcs r2, r2, %[r]\n\t"
  158895. #elif defined(__clang__)
  158896. "adcs r2, %[r]\n\t"
  158897. #else
  158898. "adc r2, %[r]\n\t"
  158899. #endif
  158900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158901. "adds r3, r3, r5\n\t"
  158902. #else
  158903. "add r3, r3, r5\n\t"
  158904. #endif
  158905. #ifdef WOLFSSL_KEIL
  158906. "adcs r4, r4, r6\n\t"
  158907. #elif defined(__clang__)
  158908. "adcs r4, r6\n\t"
  158909. #else
  158910. "adc r4, r6\n\t"
  158911. #endif
  158912. #ifdef WOLFSSL_KEIL
  158913. "adcs r2, r2, %[r]\n\t"
  158914. #elif defined(__clang__)
  158915. "adcs r2, %[r]\n\t"
  158916. #else
  158917. "adc r2, %[r]\n\t"
  158918. #endif
  158919. "# A[8] * A[2]\n\t"
  158920. "mov %[a], r9\n\t"
  158921. "mov r7, r12\n\t"
  158922. "ldr %[a], [%[a], #32]\n\t"
  158923. "uxth r5, %[a]\n\t"
  158924. "uxth r6, r7\n\t"
  158925. #ifdef WOLFSSL_KEIL
  158926. "muls r6, r5, r6\n\t"
  158927. #elif defined(__clang__)
  158928. "muls r6, r5\n\t"
  158929. #else
  158930. "mul r6, r5\n\t"
  158931. #endif
  158932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158933. "adds r3, r3, r6\n\t"
  158934. #else
  158935. "add r3, r3, r6\n\t"
  158936. #endif
  158937. #ifdef WOLFSSL_KEIL
  158938. "adcs r4, r4, %[r]\n\t"
  158939. #elif defined(__clang__)
  158940. "adcs r4, %[r]\n\t"
  158941. #else
  158942. "adc r4, %[r]\n\t"
  158943. #endif
  158944. #ifdef WOLFSSL_KEIL
  158945. "adcs r2, r2, %[r]\n\t"
  158946. #elif defined(__clang__)
  158947. "adcs r2, %[r]\n\t"
  158948. #else
  158949. "adc r2, %[r]\n\t"
  158950. #endif
  158951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158952. "adds r3, r3, r6\n\t"
  158953. #else
  158954. "add r3, r3, r6\n\t"
  158955. #endif
  158956. #ifdef WOLFSSL_KEIL
  158957. "adcs r4, r4, %[r]\n\t"
  158958. #elif defined(__clang__)
  158959. "adcs r4, %[r]\n\t"
  158960. #else
  158961. "adc r4, %[r]\n\t"
  158962. #endif
  158963. #ifdef WOLFSSL_KEIL
  158964. "adcs r2, r2, %[r]\n\t"
  158965. #elif defined(__clang__)
  158966. "adcs r2, %[r]\n\t"
  158967. #else
  158968. "adc r2, %[r]\n\t"
  158969. #endif
  158970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158971. "lsrs r6, r7, #16\n\t"
  158972. #else
  158973. "lsr r6, r7, #16\n\t"
  158974. #endif
  158975. #ifdef WOLFSSL_KEIL
  158976. "muls r5, r6, r5\n\t"
  158977. #elif defined(__clang__)
  158978. "muls r5, r6\n\t"
  158979. #else
  158980. "mul r5, r6\n\t"
  158981. #endif
  158982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158983. "lsrs r6, r5, #16\n\t"
  158984. #else
  158985. "lsr r6, r5, #16\n\t"
  158986. #endif
  158987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158988. "lsls r5, r5, #16\n\t"
  158989. #else
  158990. "lsl r5, r5, #16\n\t"
  158991. #endif
  158992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158993. "adds r3, r3, r5\n\t"
  158994. #else
  158995. "add r3, r3, r5\n\t"
  158996. #endif
  158997. #ifdef WOLFSSL_KEIL
  158998. "adcs r4, r4, r6\n\t"
  158999. #elif defined(__clang__)
  159000. "adcs r4, r6\n\t"
  159001. #else
  159002. "adc r4, r6\n\t"
  159003. #endif
  159004. #ifdef WOLFSSL_KEIL
  159005. "adcs r2, r2, %[r]\n\t"
  159006. #elif defined(__clang__)
  159007. "adcs r2, %[r]\n\t"
  159008. #else
  159009. "adc r2, %[r]\n\t"
  159010. #endif
  159011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159012. "adds r3, r3, r5\n\t"
  159013. #else
  159014. "add r3, r3, r5\n\t"
  159015. #endif
  159016. #ifdef WOLFSSL_KEIL
  159017. "adcs r4, r4, r6\n\t"
  159018. #elif defined(__clang__)
  159019. "adcs r4, r6\n\t"
  159020. #else
  159021. "adc r4, r6\n\t"
  159022. #endif
  159023. #ifdef WOLFSSL_KEIL
  159024. "adcs r2, r2, %[r]\n\t"
  159025. #elif defined(__clang__)
  159026. "adcs r2, %[r]\n\t"
  159027. #else
  159028. "adc r2, %[r]\n\t"
  159029. #endif
  159030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159031. "lsrs r5, %[a], #16\n\t"
  159032. #else
  159033. "lsr r5, %[a], #16\n\t"
  159034. #endif
  159035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159036. "lsrs r6, r7, #16\n\t"
  159037. #else
  159038. "lsr r6, r7, #16\n\t"
  159039. #endif
  159040. #ifdef WOLFSSL_KEIL
  159041. "muls r6, r5, r6\n\t"
  159042. #elif defined(__clang__)
  159043. "muls r6, r5\n\t"
  159044. #else
  159045. "mul r6, r5\n\t"
  159046. #endif
  159047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159048. "adds r4, r4, r6\n\t"
  159049. #else
  159050. "add r4, r4, r6\n\t"
  159051. #endif
  159052. #ifdef WOLFSSL_KEIL
  159053. "adcs r2, r2, %[r]\n\t"
  159054. #elif defined(__clang__)
  159055. "adcs r2, %[r]\n\t"
  159056. #else
  159057. "adc r2, %[r]\n\t"
  159058. #endif
  159059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159060. "adds r4, r4, r6\n\t"
  159061. #else
  159062. "add r4, r4, r6\n\t"
  159063. #endif
  159064. #ifdef WOLFSSL_KEIL
  159065. "adcs r2, r2, %[r]\n\t"
  159066. #elif defined(__clang__)
  159067. "adcs r2, %[r]\n\t"
  159068. #else
  159069. "adc r2, %[r]\n\t"
  159070. #endif
  159071. "uxth r6, r7\n\t"
  159072. #ifdef WOLFSSL_KEIL
  159073. "muls r5, r6, r5\n\t"
  159074. #elif defined(__clang__)
  159075. "muls r5, r6\n\t"
  159076. #else
  159077. "mul r5, r6\n\t"
  159078. #endif
  159079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159080. "lsrs r6, r5, #16\n\t"
  159081. #else
  159082. "lsr r6, r5, #16\n\t"
  159083. #endif
  159084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159085. "lsls r5, r5, #16\n\t"
  159086. #else
  159087. "lsl r5, r5, #16\n\t"
  159088. #endif
  159089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159090. "adds r3, r3, r5\n\t"
  159091. #else
  159092. "add r3, r3, r5\n\t"
  159093. #endif
  159094. #ifdef WOLFSSL_KEIL
  159095. "adcs r4, r4, r6\n\t"
  159096. #elif defined(__clang__)
  159097. "adcs r4, r6\n\t"
  159098. #else
  159099. "adc r4, r6\n\t"
  159100. #endif
  159101. #ifdef WOLFSSL_KEIL
  159102. "adcs r2, r2, %[r]\n\t"
  159103. #elif defined(__clang__)
  159104. "adcs r2, %[r]\n\t"
  159105. #else
  159106. "adc r2, %[r]\n\t"
  159107. #endif
  159108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159109. "adds r3, r3, r5\n\t"
  159110. #else
  159111. "add r3, r3, r5\n\t"
  159112. #endif
  159113. #ifdef WOLFSSL_KEIL
  159114. "adcs r4, r4, r6\n\t"
  159115. #elif defined(__clang__)
  159116. "adcs r4, r6\n\t"
  159117. #else
  159118. "adc r4, r6\n\t"
  159119. #endif
  159120. #ifdef WOLFSSL_KEIL
  159121. "adcs r2, r2, %[r]\n\t"
  159122. #elif defined(__clang__)
  159123. "adcs r2, %[r]\n\t"
  159124. #else
  159125. "adc r2, %[r]\n\t"
  159126. #endif
  159127. "# A[7] * A[3]\n\t"
  159128. "mov %[a], r9\n\t"
  159129. "mov r7, lr\n\t"
  159130. "ldr %[a], [%[a], #28]\n\t"
  159131. "uxth r5, %[a]\n\t"
  159132. "uxth r6, r7\n\t"
  159133. #ifdef WOLFSSL_KEIL
  159134. "muls r6, r5, r6\n\t"
  159135. #elif defined(__clang__)
  159136. "muls r6, r5\n\t"
  159137. #else
  159138. "mul r6, r5\n\t"
  159139. #endif
  159140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159141. "adds r3, r3, r6\n\t"
  159142. #else
  159143. "add r3, r3, r6\n\t"
  159144. #endif
  159145. #ifdef WOLFSSL_KEIL
  159146. "adcs r4, r4, %[r]\n\t"
  159147. #elif defined(__clang__)
  159148. "adcs r4, %[r]\n\t"
  159149. #else
  159150. "adc r4, %[r]\n\t"
  159151. #endif
  159152. #ifdef WOLFSSL_KEIL
  159153. "adcs r2, r2, %[r]\n\t"
  159154. #elif defined(__clang__)
  159155. "adcs r2, %[r]\n\t"
  159156. #else
  159157. "adc r2, %[r]\n\t"
  159158. #endif
  159159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159160. "adds r3, r3, r6\n\t"
  159161. #else
  159162. "add r3, r3, r6\n\t"
  159163. #endif
  159164. #ifdef WOLFSSL_KEIL
  159165. "adcs r4, r4, %[r]\n\t"
  159166. #elif defined(__clang__)
  159167. "adcs r4, %[r]\n\t"
  159168. #else
  159169. "adc r4, %[r]\n\t"
  159170. #endif
  159171. #ifdef WOLFSSL_KEIL
  159172. "adcs r2, r2, %[r]\n\t"
  159173. #elif defined(__clang__)
  159174. "adcs r2, %[r]\n\t"
  159175. #else
  159176. "adc r2, %[r]\n\t"
  159177. #endif
  159178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159179. "lsrs r6, r7, #16\n\t"
  159180. #else
  159181. "lsr r6, r7, #16\n\t"
  159182. #endif
  159183. #ifdef WOLFSSL_KEIL
  159184. "muls r5, r6, r5\n\t"
  159185. #elif defined(__clang__)
  159186. "muls r5, r6\n\t"
  159187. #else
  159188. "mul r5, r6\n\t"
  159189. #endif
  159190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159191. "lsrs r6, r5, #16\n\t"
  159192. #else
  159193. "lsr r6, r5, #16\n\t"
  159194. #endif
  159195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159196. "lsls r5, r5, #16\n\t"
  159197. #else
  159198. "lsl r5, r5, #16\n\t"
  159199. #endif
  159200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159201. "adds r3, r3, r5\n\t"
  159202. #else
  159203. "add r3, r3, r5\n\t"
  159204. #endif
  159205. #ifdef WOLFSSL_KEIL
  159206. "adcs r4, r4, r6\n\t"
  159207. #elif defined(__clang__)
  159208. "adcs r4, r6\n\t"
  159209. #else
  159210. "adc r4, r6\n\t"
  159211. #endif
  159212. #ifdef WOLFSSL_KEIL
  159213. "adcs r2, r2, %[r]\n\t"
  159214. #elif defined(__clang__)
  159215. "adcs r2, %[r]\n\t"
  159216. #else
  159217. "adc r2, %[r]\n\t"
  159218. #endif
  159219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159220. "adds r3, r3, r5\n\t"
  159221. #else
  159222. "add r3, r3, r5\n\t"
  159223. #endif
  159224. #ifdef WOLFSSL_KEIL
  159225. "adcs r4, r4, r6\n\t"
  159226. #elif defined(__clang__)
  159227. "adcs r4, r6\n\t"
  159228. #else
  159229. "adc r4, r6\n\t"
  159230. #endif
  159231. #ifdef WOLFSSL_KEIL
  159232. "adcs r2, r2, %[r]\n\t"
  159233. #elif defined(__clang__)
  159234. "adcs r2, %[r]\n\t"
  159235. #else
  159236. "adc r2, %[r]\n\t"
  159237. #endif
  159238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159239. "lsrs r5, %[a], #16\n\t"
  159240. #else
  159241. "lsr r5, %[a], #16\n\t"
  159242. #endif
  159243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159244. "lsrs r6, r7, #16\n\t"
  159245. #else
  159246. "lsr r6, r7, #16\n\t"
  159247. #endif
  159248. #ifdef WOLFSSL_KEIL
  159249. "muls r6, r5, r6\n\t"
  159250. #elif defined(__clang__)
  159251. "muls r6, r5\n\t"
  159252. #else
  159253. "mul r6, r5\n\t"
  159254. #endif
  159255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159256. "adds r4, r4, r6\n\t"
  159257. #else
  159258. "add r4, r4, r6\n\t"
  159259. #endif
  159260. #ifdef WOLFSSL_KEIL
  159261. "adcs r2, r2, %[r]\n\t"
  159262. #elif defined(__clang__)
  159263. "adcs r2, %[r]\n\t"
  159264. #else
  159265. "adc r2, %[r]\n\t"
  159266. #endif
  159267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159268. "adds r4, r4, r6\n\t"
  159269. #else
  159270. "add r4, r4, r6\n\t"
  159271. #endif
  159272. #ifdef WOLFSSL_KEIL
  159273. "adcs r2, r2, %[r]\n\t"
  159274. #elif defined(__clang__)
  159275. "adcs r2, %[r]\n\t"
  159276. #else
  159277. "adc r2, %[r]\n\t"
  159278. #endif
  159279. "uxth r6, r7\n\t"
  159280. #ifdef WOLFSSL_KEIL
  159281. "muls r5, r6, r5\n\t"
  159282. #elif defined(__clang__)
  159283. "muls r5, r6\n\t"
  159284. #else
  159285. "mul r5, r6\n\t"
  159286. #endif
  159287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159288. "lsrs r6, r5, #16\n\t"
  159289. #else
  159290. "lsr r6, r5, #16\n\t"
  159291. #endif
  159292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159293. "lsls r5, r5, #16\n\t"
  159294. #else
  159295. "lsl r5, r5, #16\n\t"
  159296. #endif
  159297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159298. "adds r3, r3, r5\n\t"
  159299. #else
  159300. "add r3, r3, r5\n\t"
  159301. #endif
  159302. #ifdef WOLFSSL_KEIL
  159303. "adcs r4, r4, r6\n\t"
  159304. #elif defined(__clang__)
  159305. "adcs r4, r6\n\t"
  159306. #else
  159307. "adc r4, r6\n\t"
  159308. #endif
  159309. #ifdef WOLFSSL_KEIL
  159310. "adcs r2, r2, %[r]\n\t"
  159311. #elif defined(__clang__)
  159312. "adcs r2, %[r]\n\t"
  159313. #else
  159314. "adc r2, %[r]\n\t"
  159315. #endif
  159316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159317. "adds r3, r3, r5\n\t"
  159318. #else
  159319. "add r3, r3, r5\n\t"
  159320. #endif
  159321. #ifdef WOLFSSL_KEIL
  159322. "adcs r4, r4, r6\n\t"
  159323. #elif defined(__clang__)
  159324. "adcs r4, r6\n\t"
  159325. #else
  159326. "adc r4, r6\n\t"
  159327. #endif
  159328. #ifdef WOLFSSL_KEIL
  159329. "adcs r2, r2, %[r]\n\t"
  159330. #elif defined(__clang__)
  159331. "adcs r2, %[r]\n\t"
  159332. #else
  159333. "adc r2, %[r]\n\t"
  159334. #endif
  159335. "# A[6] * A[4]\n\t"
  159336. "mov %[a], r9\n\t"
  159337. "ldr r7, [%[a], #16]\n\t"
  159338. "ldr %[a], [%[a], #24]\n\t"
  159339. "uxth r5, %[a]\n\t"
  159340. "uxth r6, r7\n\t"
  159341. #ifdef WOLFSSL_KEIL
  159342. "muls r6, r5, r6\n\t"
  159343. #elif defined(__clang__)
  159344. "muls r6, r5\n\t"
  159345. #else
  159346. "mul r6, r5\n\t"
  159347. #endif
  159348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159349. "adds r3, r3, r6\n\t"
  159350. #else
  159351. "add r3, r3, r6\n\t"
  159352. #endif
  159353. #ifdef WOLFSSL_KEIL
  159354. "adcs r4, r4, %[r]\n\t"
  159355. #elif defined(__clang__)
  159356. "adcs r4, %[r]\n\t"
  159357. #else
  159358. "adc r4, %[r]\n\t"
  159359. #endif
  159360. #ifdef WOLFSSL_KEIL
  159361. "adcs r2, r2, %[r]\n\t"
  159362. #elif defined(__clang__)
  159363. "adcs r2, %[r]\n\t"
  159364. #else
  159365. "adc r2, %[r]\n\t"
  159366. #endif
  159367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159368. "adds r3, r3, r6\n\t"
  159369. #else
  159370. "add r3, r3, r6\n\t"
  159371. #endif
  159372. #ifdef WOLFSSL_KEIL
  159373. "adcs r4, r4, %[r]\n\t"
  159374. #elif defined(__clang__)
  159375. "adcs r4, %[r]\n\t"
  159376. #else
  159377. "adc r4, %[r]\n\t"
  159378. #endif
  159379. #ifdef WOLFSSL_KEIL
  159380. "adcs r2, r2, %[r]\n\t"
  159381. #elif defined(__clang__)
  159382. "adcs r2, %[r]\n\t"
  159383. #else
  159384. "adc r2, %[r]\n\t"
  159385. #endif
  159386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159387. "lsrs r6, r7, #16\n\t"
  159388. #else
  159389. "lsr r6, r7, #16\n\t"
  159390. #endif
  159391. #ifdef WOLFSSL_KEIL
  159392. "muls r5, r6, r5\n\t"
  159393. #elif defined(__clang__)
  159394. "muls r5, r6\n\t"
  159395. #else
  159396. "mul r5, r6\n\t"
  159397. #endif
  159398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159399. "lsrs r6, r5, #16\n\t"
  159400. #else
  159401. "lsr r6, r5, #16\n\t"
  159402. #endif
  159403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159404. "lsls r5, r5, #16\n\t"
  159405. #else
  159406. "lsl r5, r5, #16\n\t"
  159407. #endif
  159408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159409. "adds r3, r3, r5\n\t"
  159410. #else
  159411. "add r3, r3, r5\n\t"
  159412. #endif
  159413. #ifdef WOLFSSL_KEIL
  159414. "adcs r4, r4, r6\n\t"
  159415. #elif defined(__clang__)
  159416. "adcs r4, r6\n\t"
  159417. #else
  159418. "adc r4, r6\n\t"
  159419. #endif
  159420. #ifdef WOLFSSL_KEIL
  159421. "adcs r2, r2, %[r]\n\t"
  159422. #elif defined(__clang__)
  159423. "adcs r2, %[r]\n\t"
  159424. #else
  159425. "adc r2, %[r]\n\t"
  159426. #endif
  159427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159428. "adds r3, r3, r5\n\t"
  159429. #else
  159430. "add r3, r3, r5\n\t"
  159431. #endif
  159432. #ifdef WOLFSSL_KEIL
  159433. "adcs r4, r4, r6\n\t"
  159434. #elif defined(__clang__)
  159435. "adcs r4, r6\n\t"
  159436. #else
  159437. "adc r4, r6\n\t"
  159438. #endif
  159439. #ifdef WOLFSSL_KEIL
  159440. "adcs r2, r2, %[r]\n\t"
  159441. #elif defined(__clang__)
  159442. "adcs r2, %[r]\n\t"
  159443. #else
  159444. "adc r2, %[r]\n\t"
  159445. #endif
  159446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159447. "lsrs r5, %[a], #16\n\t"
  159448. #else
  159449. "lsr r5, %[a], #16\n\t"
  159450. #endif
  159451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159452. "lsrs r6, r7, #16\n\t"
  159453. #else
  159454. "lsr r6, r7, #16\n\t"
  159455. #endif
  159456. #ifdef WOLFSSL_KEIL
  159457. "muls r6, r5, r6\n\t"
  159458. #elif defined(__clang__)
  159459. "muls r6, r5\n\t"
  159460. #else
  159461. "mul r6, r5\n\t"
  159462. #endif
  159463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159464. "adds r4, r4, r6\n\t"
  159465. #else
  159466. "add r4, r4, r6\n\t"
  159467. #endif
  159468. #ifdef WOLFSSL_KEIL
  159469. "adcs r2, r2, %[r]\n\t"
  159470. #elif defined(__clang__)
  159471. "adcs r2, %[r]\n\t"
  159472. #else
  159473. "adc r2, %[r]\n\t"
  159474. #endif
  159475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159476. "adds r4, r4, r6\n\t"
  159477. #else
  159478. "add r4, r4, r6\n\t"
  159479. #endif
  159480. #ifdef WOLFSSL_KEIL
  159481. "adcs r2, r2, %[r]\n\t"
  159482. #elif defined(__clang__)
  159483. "adcs r2, %[r]\n\t"
  159484. #else
  159485. "adc r2, %[r]\n\t"
  159486. #endif
  159487. "uxth r6, r7\n\t"
  159488. #ifdef WOLFSSL_KEIL
  159489. "muls r5, r6, r5\n\t"
  159490. #elif defined(__clang__)
  159491. "muls r5, r6\n\t"
  159492. #else
  159493. "mul r5, r6\n\t"
  159494. #endif
  159495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159496. "lsrs r6, r5, #16\n\t"
  159497. #else
  159498. "lsr r6, r5, #16\n\t"
  159499. #endif
  159500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159501. "lsls r5, r5, #16\n\t"
  159502. #else
  159503. "lsl r5, r5, #16\n\t"
  159504. #endif
  159505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159506. "adds r3, r3, r5\n\t"
  159507. #else
  159508. "add r3, r3, r5\n\t"
  159509. #endif
  159510. #ifdef WOLFSSL_KEIL
  159511. "adcs r4, r4, r6\n\t"
  159512. #elif defined(__clang__)
  159513. "adcs r4, r6\n\t"
  159514. #else
  159515. "adc r4, r6\n\t"
  159516. #endif
  159517. #ifdef WOLFSSL_KEIL
  159518. "adcs r2, r2, %[r]\n\t"
  159519. #elif defined(__clang__)
  159520. "adcs r2, %[r]\n\t"
  159521. #else
  159522. "adc r2, %[r]\n\t"
  159523. #endif
  159524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159525. "adds r3, r3, r5\n\t"
  159526. #else
  159527. "add r3, r3, r5\n\t"
  159528. #endif
  159529. #ifdef WOLFSSL_KEIL
  159530. "adcs r4, r4, r6\n\t"
  159531. #elif defined(__clang__)
  159532. "adcs r4, r6\n\t"
  159533. #else
  159534. "adc r4, r6\n\t"
  159535. #endif
  159536. #ifdef WOLFSSL_KEIL
  159537. "adcs r2, r2, %[r]\n\t"
  159538. #elif defined(__clang__)
  159539. "adcs r2, %[r]\n\t"
  159540. #else
  159541. "adc r2, %[r]\n\t"
  159542. #endif
  159543. "# A[5] * A[5]\n\t"
  159544. "mov %[a], r9\n\t"
  159545. "ldr r7, [%[a], #20]\n\t"
  159546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159547. "lsrs r6, r7, #16\n\t"
  159548. #else
  159549. "lsr r6, r7, #16\n\t"
  159550. #endif
  159551. "uxth r5, r7\n\t"
  159552. #ifdef WOLFSSL_KEIL
  159553. "muls r5, r5, r5\n\t"
  159554. #elif defined(__clang__)
  159555. "muls r5, r5\n\t"
  159556. #else
  159557. "mul r5, r5\n\t"
  159558. #endif
  159559. #ifdef WOLFSSL_KEIL
  159560. "muls r6, r6, r6\n\t"
  159561. #elif defined(__clang__)
  159562. "muls r6, r6\n\t"
  159563. #else
  159564. "mul r6, r6\n\t"
  159565. #endif
  159566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159567. "adds r3, r3, r5\n\t"
  159568. #else
  159569. "add r3, r3, r5\n\t"
  159570. #endif
  159571. #ifdef WOLFSSL_KEIL
  159572. "adcs r4, r4, r6\n\t"
  159573. #elif defined(__clang__)
  159574. "adcs r4, r6\n\t"
  159575. #else
  159576. "adc r4, r6\n\t"
  159577. #endif
  159578. #ifdef WOLFSSL_KEIL
  159579. "adcs r2, r2, %[r]\n\t"
  159580. #elif defined(__clang__)
  159581. "adcs r2, %[r]\n\t"
  159582. #else
  159583. "adc r2, %[r]\n\t"
  159584. #endif
  159585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159586. "lsrs r6, r7, #16\n\t"
  159587. #else
  159588. "lsr r6, r7, #16\n\t"
  159589. #endif
  159590. "uxth r5, r7\n\t"
  159591. #ifdef WOLFSSL_KEIL
  159592. "muls r5, r6, r5\n\t"
  159593. #elif defined(__clang__)
  159594. "muls r5, r6\n\t"
  159595. #else
  159596. "mul r5, r6\n\t"
  159597. #endif
  159598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159599. "lsrs r6, r5, #15\n\t"
  159600. #else
  159601. "lsr r6, r5, #15\n\t"
  159602. #endif
  159603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159604. "lsls r5, r5, #17\n\t"
  159605. #else
  159606. "lsl r5, r5, #17\n\t"
  159607. #endif
  159608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159609. "adds r3, r3, r5\n\t"
  159610. #else
  159611. "add r3, r3, r5\n\t"
  159612. #endif
  159613. #ifdef WOLFSSL_KEIL
  159614. "adcs r4, r4, r6\n\t"
  159615. #elif defined(__clang__)
  159616. "adcs r4, r6\n\t"
  159617. #else
  159618. "adc r4, r6\n\t"
  159619. #endif
  159620. #ifdef WOLFSSL_KEIL
  159621. "adcs r2, r2, %[r]\n\t"
  159622. #elif defined(__clang__)
  159623. "adcs r2, %[r]\n\t"
  159624. #else
  159625. "adc r2, %[r]\n\t"
  159626. #endif
  159627. "str r3, [sp, #40]\n\t"
  159628. "# A[6] * A[5]\n\t"
  159629. "movs r3, #0\n\t"
  159630. "ldr %[a], [%[a], #24]\n\t"
  159631. "uxth r5, %[a]\n\t"
  159632. "uxth r6, r7\n\t"
  159633. #ifdef WOLFSSL_KEIL
  159634. "muls r6, r5, r6\n\t"
  159635. #elif defined(__clang__)
  159636. "muls r6, r5\n\t"
  159637. #else
  159638. "mul r6, r5\n\t"
  159639. #endif
  159640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159641. "adds r4, r4, r6\n\t"
  159642. #else
  159643. "add r4, r4, r6\n\t"
  159644. #endif
  159645. #ifdef WOLFSSL_KEIL
  159646. "adcs r2, r2, %[r]\n\t"
  159647. #elif defined(__clang__)
  159648. "adcs r2, %[r]\n\t"
  159649. #else
  159650. "adc r2, %[r]\n\t"
  159651. #endif
  159652. #ifdef WOLFSSL_KEIL
  159653. "adcs r3, r3, %[r]\n\t"
  159654. #elif defined(__clang__)
  159655. "adcs r3, %[r]\n\t"
  159656. #else
  159657. "adc r3, %[r]\n\t"
  159658. #endif
  159659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159660. "adds r4, r4, r6\n\t"
  159661. #else
  159662. "add r4, r4, r6\n\t"
  159663. #endif
  159664. #ifdef WOLFSSL_KEIL
  159665. "adcs r2, r2, %[r]\n\t"
  159666. #elif defined(__clang__)
  159667. "adcs r2, %[r]\n\t"
  159668. #else
  159669. "adc r2, %[r]\n\t"
  159670. #endif
  159671. #ifdef WOLFSSL_KEIL
  159672. "adcs r3, r3, %[r]\n\t"
  159673. #elif defined(__clang__)
  159674. "adcs r3, %[r]\n\t"
  159675. #else
  159676. "adc r3, %[r]\n\t"
  159677. #endif
  159678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159679. "lsrs r6, r7, #16\n\t"
  159680. #else
  159681. "lsr r6, r7, #16\n\t"
  159682. #endif
  159683. #ifdef WOLFSSL_KEIL
  159684. "muls r5, r6, r5\n\t"
  159685. #elif defined(__clang__)
  159686. "muls r5, r6\n\t"
  159687. #else
  159688. "mul r5, r6\n\t"
  159689. #endif
  159690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159691. "lsrs r6, r5, #16\n\t"
  159692. #else
  159693. "lsr r6, r5, #16\n\t"
  159694. #endif
  159695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159696. "lsls r5, r5, #16\n\t"
  159697. #else
  159698. "lsl r5, r5, #16\n\t"
  159699. #endif
  159700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159701. "adds r4, r4, r5\n\t"
  159702. #else
  159703. "add r4, r4, r5\n\t"
  159704. #endif
  159705. #ifdef WOLFSSL_KEIL
  159706. "adcs r2, r2, r6\n\t"
  159707. #elif defined(__clang__)
  159708. "adcs r2, r6\n\t"
  159709. #else
  159710. "adc r2, r6\n\t"
  159711. #endif
  159712. #ifdef WOLFSSL_KEIL
  159713. "adcs r3, r3, %[r]\n\t"
  159714. #elif defined(__clang__)
  159715. "adcs r3, %[r]\n\t"
  159716. #else
  159717. "adc r3, %[r]\n\t"
  159718. #endif
  159719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159720. "adds r4, r4, r5\n\t"
  159721. #else
  159722. "add r4, r4, r5\n\t"
  159723. #endif
  159724. #ifdef WOLFSSL_KEIL
  159725. "adcs r2, r2, r6\n\t"
  159726. #elif defined(__clang__)
  159727. "adcs r2, r6\n\t"
  159728. #else
  159729. "adc r2, r6\n\t"
  159730. #endif
  159731. #ifdef WOLFSSL_KEIL
  159732. "adcs r3, r3, %[r]\n\t"
  159733. #elif defined(__clang__)
  159734. "adcs r3, %[r]\n\t"
  159735. #else
  159736. "adc r3, %[r]\n\t"
  159737. #endif
  159738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159739. "lsrs r5, %[a], #16\n\t"
  159740. #else
  159741. "lsr r5, %[a], #16\n\t"
  159742. #endif
  159743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159744. "lsrs r6, r7, #16\n\t"
  159745. #else
  159746. "lsr r6, r7, #16\n\t"
  159747. #endif
  159748. #ifdef WOLFSSL_KEIL
  159749. "muls r6, r5, r6\n\t"
  159750. #elif defined(__clang__)
  159751. "muls r6, r5\n\t"
  159752. #else
  159753. "mul r6, r5\n\t"
  159754. #endif
  159755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159756. "adds r2, r2, r6\n\t"
  159757. #else
  159758. "add r2, r2, r6\n\t"
  159759. #endif
  159760. #ifdef WOLFSSL_KEIL
  159761. "adcs r3, r3, %[r]\n\t"
  159762. #elif defined(__clang__)
  159763. "adcs r3, %[r]\n\t"
  159764. #else
  159765. "adc r3, %[r]\n\t"
  159766. #endif
  159767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159768. "adds r2, r2, r6\n\t"
  159769. #else
  159770. "add r2, r2, r6\n\t"
  159771. #endif
  159772. #ifdef WOLFSSL_KEIL
  159773. "adcs r3, r3, %[r]\n\t"
  159774. #elif defined(__clang__)
  159775. "adcs r3, %[r]\n\t"
  159776. #else
  159777. "adc r3, %[r]\n\t"
  159778. #endif
  159779. "uxth r6, r7\n\t"
  159780. #ifdef WOLFSSL_KEIL
  159781. "muls r5, r6, r5\n\t"
  159782. #elif defined(__clang__)
  159783. "muls r5, r6\n\t"
  159784. #else
  159785. "mul r5, r6\n\t"
  159786. #endif
  159787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159788. "lsrs r6, r5, #16\n\t"
  159789. #else
  159790. "lsr r6, r5, #16\n\t"
  159791. #endif
  159792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159793. "lsls r5, r5, #16\n\t"
  159794. #else
  159795. "lsl r5, r5, #16\n\t"
  159796. #endif
  159797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159798. "adds r4, r4, r5\n\t"
  159799. #else
  159800. "add r4, r4, r5\n\t"
  159801. #endif
  159802. #ifdef WOLFSSL_KEIL
  159803. "adcs r2, r2, r6\n\t"
  159804. #elif defined(__clang__)
  159805. "adcs r2, r6\n\t"
  159806. #else
  159807. "adc r2, r6\n\t"
  159808. #endif
  159809. #ifdef WOLFSSL_KEIL
  159810. "adcs r3, r3, %[r]\n\t"
  159811. #elif defined(__clang__)
  159812. "adcs r3, %[r]\n\t"
  159813. #else
  159814. "adc r3, %[r]\n\t"
  159815. #endif
  159816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159817. "adds r4, r4, r5\n\t"
  159818. #else
  159819. "add r4, r4, r5\n\t"
  159820. #endif
  159821. #ifdef WOLFSSL_KEIL
  159822. "adcs r2, r2, r6\n\t"
  159823. #elif defined(__clang__)
  159824. "adcs r2, r6\n\t"
  159825. #else
  159826. "adc r2, r6\n\t"
  159827. #endif
  159828. #ifdef WOLFSSL_KEIL
  159829. "adcs r3, r3, %[r]\n\t"
  159830. #elif defined(__clang__)
  159831. "adcs r3, %[r]\n\t"
  159832. #else
  159833. "adc r3, %[r]\n\t"
  159834. #endif
  159835. "# A[7] * A[4]\n\t"
  159836. "mov %[a], r9\n\t"
  159837. "ldr r7, [%[a], #16]\n\t"
  159838. "ldr %[a], [%[a], #28]\n\t"
  159839. "uxth r5, %[a]\n\t"
  159840. "uxth r6, r7\n\t"
  159841. #ifdef WOLFSSL_KEIL
  159842. "muls r6, r5, r6\n\t"
  159843. #elif defined(__clang__)
  159844. "muls r6, r5\n\t"
  159845. #else
  159846. "mul r6, r5\n\t"
  159847. #endif
  159848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159849. "adds r4, r4, r6\n\t"
  159850. #else
  159851. "add r4, r4, r6\n\t"
  159852. #endif
  159853. #ifdef WOLFSSL_KEIL
  159854. "adcs r2, r2, %[r]\n\t"
  159855. #elif defined(__clang__)
  159856. "adcs r2, %[r]\n\t"
  159857. #else
  159858. "adc r2, %[r]\n\t"
  159859. #endif
  159860. #ifdef WOLFSSL_KEIL
  159861. "adcs r3, r3, %[r]\n\t"
  159862. #elif defined(__clang__)
  159863. "adcs r3, %[r]\n\t"
  159864. #else
  159865. "adc r3, %[r]\n\t"
  159866. #endif
  159867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159868. "adds r4, r4, r6\n\t"
  159869. #else
  159870. "add r4, r4, r6\n\t"
  159871. #endif
  159872. #ifdef WOLFSSL_KEIL
  159873. "adcs r2, r2, %[r]\n\t"
  159874. #elif defined(__clang__)
  159875. "adcs r2, %[r]\n\t"
  159876. #else
  159877. "adc r2, %[r]\n\t"
  159878. #endif
  159879. #ifdef WOLFSSL_KEIL
  159880. "adcs r3, r3, %[r]\n\t"
  159881. #elif defined(__clang__)
  159882. "adcs r3, %[r]\n\t"
  159883. #else
  159884. "adc r3, %[r]\n\t"
  159885. #endif
  159886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159887. "lsrs r6, r7, #16\n\t"
  159888. #else
  159889. "lsr r6, r7, #16\n\t"
  159890. #endif
  159891. #ifdef WOLFSSL_KEIL
  159892. "muls r5, r6, r5\n\t"
  159893. #elif defined(__clang__)
  159894. "muls r5, r6\n\t"
  159895. #else
  159896. "mul r5, r6\n\t"
  159897. #endif
  159898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159899. "lsrs r6, r5, #16\n\t"
  159900. #else
  159901. "lsr r6, r5, #16\n\t"
  159902. #endif
  159903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159904. "lsls r5, r5, #16\n\t"
  159905. #else
  159906. "lsl r5, r5, #16\n\t"
  159907. #endif
  159908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159909. "adds r4, r4, r5\n\t"
  159910. #else
  159911. "add r4, r4, r5\n\t"
  159912. #endif
  159913. #ifdef WOLFSSL_KEIL
  159914. "adcs r2, r2, r6\n\t"
  159915. #elif defined(__clang__)
  159916. "adcs r2, r6\n\t"
  159917. #else
  159918. "adc r2, r6\n\t"
  159919. #endif
  159920. #ifdef WOLFSSL_KEIL
  159921. "adcs r3, r3, %[r]\n\t"
  159922. #elif defined(__clang__)
  159923. "adcs r3, %[r]\n\t"
  159924. #else
  159925. "adc r3, %[r]\n\t"
  159926. #endif
  159927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159928. "adds r4, r4, r5\n\t"
  159929. #else
  159930. "add r4, r4, r5\n\t"
  159931. #endif
  159932. #ifdef WOLFSSL_KEIL
  159933. "adcs r2, r2, r6\n\t"
  159934. #elif defined(__clang__)
  159935. "adcs r2, r6\n\t"
  159936. #else
  159937. "adc r2, r6\n\t"
  159938. #endif
  159939. #ifdef WOLFSSL_KEIL
  159940. "adcs r3, r3, %[r]\n\t"
  159941. #elif defined(__clang__)
  159942. "adcs r3, %[r]\n\t"
  159943. #else
  159944. "adc r3, %[r]\n\t"
  159945. #endif
  159946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159947. "lsrs r5, %[a], #16\n\t"
  159948. #else
  159949. "lsr r5, %[a], #16\n\t"
  159950. #endif
  159951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159952. "lsrs r6, r7, #16\n\t"
  159953. #else
  159954. "lsr r6, r7, #16\n\t"
  159955. #endif
  159956. #ifdef WOLFSSL_KEIL
  159957. "muls r6, r5, r6\n\t"
  159958. #elif defined(__clang__)
  159959. "muls r6, r5\n\t"
  159960. #else
  159961. "mul r6, r5\n\t"
  159962. #endif
  159963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159964. "adds r2, r2, r6\n\t"
  159965. #else
  159966. "add r2, r2, r6\n\t"
  159967. #endif
  159968. #ifdef WOLFSSL_KEIL
  159969. "adcs r3, r3, %[r]\n\t"
  159970. #elif defined(__clang__)
  159971. "adcs r3, %[r]\n\t"
  159972. #else
  159973. "adc r3, %[r]\n\t"
  159974. #endif
  159975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159976. "adds r2, r2, r6\n\t"
  159977. #else
  159978. "add r2, r2, r6\n\t"
  159979. #endif
  159980. #ifdef WOLFSSL_KEIL
  159981. "adcs r3, r3, %[r]\n\t"
  159982. #elif defined(__clang__)
  159983. "adcs r3, %[r]\n\t"
  159984. #else
  159985. "adc r3, %[r]\n\t"
  159986. #endif
  159987. "uxth r6, r7\n\t"
  159988. #ifdef WOLFSSL_KEIL
  159989. "muls r5, r6, r5\n\t"
  159990. #elif defined(__clang__)
  159991. "muls r5, r6\n\t"
  159992. #else
  159993. "mul r5, r6\n\t"
  159994. #endif
  159995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159996. "lsrs r6, r5, #16\n\t"
  159997. #else
  159998. "lsr r6, r5, #16\n\t"
  159999. #endif
  160000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160001. "lsls r5, r5, #16\n\t"
  160002. #else
  160003. "lsl r5, r5, #16\n\t"
  160004. #endif
  160005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160006. "adds r4, r4, r5\n\t"
  160007. #else
  160008. "add r4, r4, r5\n\t"
  160009. #endif
  160010. #ifdef WOLFSSL_KEIL
  160011. "adcs r2, r2, r6\n\t"
  160012. #elif defined(__clang__)
  160013. "adcs r2, r6\n\t"
  160014. #else
  160015. "adc r2, r6\n\t"
  160016. #endif
  160017. #ifdef WOLFSSL_KEIL
  160018. "adcs r3, r3, %[r]\n\t"
  160019. #elif defined(__clang__)
  160020. "adcs r3, %[r]\n\t"
  160021. #else
  160022. "adc r3, %[r]\n\t"
  160023. #endif
  160024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160025. "adds r4, r4, r5\n\t"
  160026. #else
  160027. "add r4, r4, r5\n\t"
  160028. #endif
  160029. #ifdef WOLFSSL_KEIL
  160030. "adcs r2, r2, r6\n\t"
  160031. #elif defined(__clang__)
  160032. "adcs r2, r6\n\t"
  160033. #else
  160034. "adc r2, r6\n\t"
  160035. #endif
  160036. #ifdef WOLFSSL_KEIL
  160037. "adcs r3, r3, %[r]\n\t"
  160038. #elif defined(__clang__)
  160039. "adcs r3, %[r]\n\t"
  160040. #else
  160041. "adc r3, %[r]\n\t"
  160042. #endif
  160043. "# A[8] * A[3]\n\t"
  160044. "mov %[a], r9\n\t"
  160045. "mov r7, lr\n\t"
  160046. "ldr %[a], [%[a], #32]\n\t"
  160047. "uxth r5, %[a]\n\t"
  160048. "uxth r6, r7\n\t"
  160049. #ifdef WOLFSSL_KEIL
  160050. "muls r6, r5, r6\n\t"
  160051. #elif defined(__clang__)
  160052. "muls r6, r5\n\t"
  160053. #else
  160054. "mul r6, r5\n\t"
  160055. #endif
  160056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160057. "adds r4, r4, r6\n\t"
  160058. #else
  160059. "add r4, r4, r6\n\t"
  160060. #endif
  160061. #ifdef WOLFSSL_KEIL
  160062. "adcs r2, r2, %[r]\n\t"
  160063. #elif defined(__clang__)
  160064. "adcs r2, %[r]\n\t"
  160065. #else
  160066. "adc r2, %[r]\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160076. "adds r4, r4, r6\n\t"
  160077. #else
  160078. "add r4, r4, r6\n\t"
  160079. #endif
  160080. #ifdef WOLFSSL_KEIL
  160081. "adcs r2, r2, %[r]\n\t"
  160082. #elif defined(__clang__)
  160083. "adcs r2, %[r]\n\t"
  160084. #else
  160085. "adc r2, %[r]\n\t"
  160086. #endif
  160087. #ifdef WOLFSSL_KEIL
  160088. "adcs r3, r3, %[r]\n\t"
  160089. #elif defined(__clang__)
  160090. "adcs r3, %[r]\n\t"
  160091. #else
  160092. "adc r3, %[r]\n\t"
  160093. #endif
  160094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160095. "lsrs r6, r7, #16\n\t"
  160096. #else
  160097. "lsr r6, r7, #16\n\t"
  160098. #endif
  160099. #ifdef WOLFSSL_KEIL
  160100. "muls r5, r6, r5\n\t"
  160101. #elif defined(__clang__)
  160102. "muls r5, r6\n\t"
  160103. #else
  160104. "mul r5, r6\n\t"
  160105. #endif
  160106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160107. "lsrs r6, r5, #16\n\t"
  160108. #else
  160109. "lsr r6, r5, #16\n\t"
  160110. #endif
  160111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160112. "lsls r5, r5, #16\n\t"
  160113. #else
  160114. "lsl r5, r5, #16\n\t"
  160115. #endif
  160116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160117. "adds r4, r4, r5\n\t"
  160118. #else
  160119. "add r4, r4, r5\n\t"
  160120. #endif
  160121. #ifdef WOLFSSL_KEIL
  160122. "adcs r2, r2, r6\n\t"
  160123. #elif defined(__clang__)
  160124. "adcs r2, r6\n\t"
  160125. #else
  160126. "adc r2, r6\n\t"
  160127. #endif
  160128. #ifdef WOLFSSL_KEIL
  160129. "adcs r3, r3, %[r]\n\t"
  160130. #elif defined(__clang__)
  160131. "adcs r3, %[r]\n\t"
  160132. #else
  160133. "adc r3, %[r]\n\t"
  160134. #endif
  160135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160136. "adds r4, r4, r5\n\t"
  160137. #else
  160138. "add r4, r4, r5\n\t"
  160139. #endif
  160140. #ifdef WOLFSSL_KEIL
  160141. "adcs r2, r2, r6\n\t"
  160142. #elif defined(__clang__)
  160143. "adcs r2, r6\n\t"
  160144. #else
  160145. "adc r2, r6\n\t"
  160146. #endif
  160147. #ifdef WOLFSSL_KEIL
  160148. "adcs r3, r3, %[r]\n\t"
  160149. #elif defined(__clang__)
  160150. "adcs r3, %[r]\n\t"
  160151. #else
  160152. "adc r3, %[r]\n\t"
  160153. #endif
  160154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160155. "lsrs r5, %[a], #16\n\t"
  160156. #else
  160157. "lsr r5, %[a], #16\n\t"
  160158. #endif
  160159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160160. "lsrs r6, r7, #16\n\t"
  160161. #else
  160162. "lsr r6, r7, #16\n\t"
  160163. #endif
  160164. #ifdef WOLFSSL_KEIL
  160165. "muls r6, r5, r6\n\t"
  160166. #elif defined(__clang__)
  160167. "muls r6, r5\n\t"
  160168. #else
  160169. "mul r6, r5\n\t"
  160170. #endif
  160171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160172. "adds r2, r2, r6\n\t"
  160173. #else
  160174. "add r2, r2, r6\n\t"
  160175. #endif
  160176. #ifdef WOLFSSL_KEIL
  160177. "adcs r3, r3, %[r]\n\t"
  160178. #elif defined(__clang__)
  160179. "adcs r3, %[r]\n\t"
  160180. #else
  160181. "adc r3, %[r]\n\t"
  160182. #endif
  160183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160184. "adds r2, r2, r6\n\t"
  160185. #else
  160186. "add r2, r2, r6\n\t"
  160187. #endif
  160188. #ifdef WOLFSSL_KEIL
  160189. "adcs r3, r3, %[r]\n\t"
  160190. #elif defined(__clang__)
  160191. "adcs r3, %[r]\n\t"
  160192. #else
  160193. "adc r3, %[r]\n\t"
  160194. #endif
  160195. "uxth r6, r7\n\t"
  160196. #ifdef WOLFSSL_KEIL
  160197. "muls r5, r6, r5\n\t"
  160198. #elif defined(__clang__)
  160199. "muls r5, r6\n\t"
  160200. #else
  160201. "mul r5, r6\n\t"
  160202. #endif
  160203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160204. "lsrs r6, r5, #16\n\t"
  160205. #else
  160206. "lsr r6, r5, #16\n\t"
  160207. #endif
  160208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160209. "lsls r5, r5, #16\n\t"
  160210. #else
  160211. "lsl r5, r5, #16\n\t"
  160212. #endif
  160213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160214. "adds r4, r4, r5\n\t"
  160215. #else
  160216. "add r4, r4, r5\n\t"
  160217. #endif
  160218. #ifdef WOLFSSL_KEIL
  160219. "adcs r2, r2, r6\n\t"
  160220. #elif defined(__clang__)
  160221. "adcs r2, r6\n\t"
  160222. #else
  160223. "adc r2, r6\n\t"
  160224. #endif
  160225. #ifdef WOLFSSL_KEIL
  160226. "adcs r3, r3, %[r]\n\t"
  160227. #elif defined(__clang__)
  160228. "adcs r3, %[r]\n\t"
  160229. #else
  160230. "adc r3, %[r]\n\t"
  160231. #endif
  160232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160233. "adds r4, r4, r5\n\t"
  160234. #else
  160235. "add r4, r4, r5\n\t"
  160236. #endif
  160237. #ifdef WOLFSSL_KEIL
  160238. "adcs r2, r2, r6\n\t"
  160239. #elif defined(__clang__)
  160240. "adcs r2, r6\n\t"
  160241. #else
  160242. "adc r2, r6\n\t"
  160243. #endif
  160244. #ifdef WOLFSSL_KEIL
  160245. "adcs r3, r3, %[r]\n\t"
  160246. #elif defined(__clang__)
  160247. "adcs r3, %[r]\n\t"
  160248. #else
  160249. "adc r3, %[r]\n\t"
  160250. #endif
  160251. "# A[9] * A[2]\n\t"
  160252. "mov %[a], r9\n\t"
  160253. "mov r7, r12\n\t"
  160254. "ldr %[a], [%[a], #36]\n\t"
  160255. "uxth r5, %[a]\n\t"
  160256. "uxth r6, r7\n\t"
  160257. #ifdef WOLFSSL_KEIL
  160258. "muls r6, r5, r6\n\t"
  160259. #elif defined(__clang__)
  160260. "muls r6, r5\n\t"
  160261. #else
  160262. "mul r6, r5\n\t"
  160263. #endif
  160264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160265. "adds r4, r4, r6\n\t"
  160266. #else
  160267. "add r4, r4, r6\n\t"
  160268. #endif
  160269. #ifdef WOLFSSL_KEIL
  160270. "adcs r2, r2, %[r]\n\t"
  160271. #elif defined(__clang__)
  160272. "adcs r2, %[r]\n\t"
  160273. #else
  160274. "adc r2, %[r]\n\t"
  160275. #endif
  160276. #ifdef WOLFSSL_KEIL
  160277. "adcs r3, r3, %[r]\n\t"
  160278. #elif defined(__clang__)
  160279. "adcs r3, %[r]\n\t"
  160280. #else
  160281. "adc r3, %[r]\n\t"
  160282. #endif
  160283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160284. "adds r4, r4, r6\n\t"
  160285. #else
  160286. "add r4, r4, r6\n\t"
  160287. #endif
  160288. #ifdef WOLFSSL_KEIL
  160289. "adcs r2, r2, %[r]\n\t"
  160290. #elif defined(__clang__)
  160291. "adcs r2, %[r]\n\t"
  160292. #else
  160293. "adc r2, %[r]\n\t"
  160294. #endif
  160295. #ifdef WOLFSSL_KEIL
  160296. "adcs r3, r3, %[r]\n\t"
  160297. #elif defined(__clang__)
  160298. "adcs r3, %[r]\n\t"
  160299. #else
  160300. "adc r3, %[r]\n\t"
  160301. #endif
  160302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160303. "lsrs r6, r7, #16\n\t"
  160304. #else
  160305. "lsr r6, r7, #16\n\t"
  160306. #endif
  160307. #ifdef WOLFSSL_KEIL
  160308. "muls r5, r6, r5\n\t"
  160309. #elif defined(__clang__)
  160310. "muls r5, r6\n\t"
  160311. #else
  160312. "mul r5, r6\n\t"
  160313. #endif
  160314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160315. "lsrs r6, r5, #16\n\t"
  160316. #else
  160317. "lsr r6, r5, #16\n\t"
  160318. #endif
  160319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160320. "lsls r5, r5, #16\n\t"
  160321. #else
  160322. "lsl r5, r5, #16\n\t"
  160323. #endif
  160324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160325. "adds r4, r4, r5\n\t"
  160326. #else
  160327. "add r4, r4, r5\n\t"
  160328. #endif
  160329. #ifdef WOLFSSL_KEIL
  160330. "adcs r2, r2, r6\n\t"
  160331. #elif defined(__clang__)
  160332. "adcs r2, r6\n\t"
  160333. #else
  160334. "adc r2, r6\n\t"
  160335. #endif
  160336. #ifdef WOLFSSL_KEIL
  160337. "adcs r3, r3, %[r]\n\t"
  160338. #elif defined(__clang__)
  160339. "adcs r3, %[r]\n\t"
  160340. #else
  160341. "adc r3, %[r]\n\t"
  160342. #endif
  160343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160344. "adds r4, r4, r5\n\t"
  160345. #else
  160346. "add r4, r4, r5\n\t"
  160347. #endif
  160348. #ifdef WOLFSSL_KEIL
  160349. "adcs r2, r2, r6\n\t"
  160350. #elif defined(__clang__)
  160351. "adcs r2, r6\n\t"
  160352. #else
  160353. "adc r2, r6\n\t"
  160354. #endif
  160355. #ifdef WOLFSSL_KEIL
  160356. "adcs r3, r3, %[r]\n\t"
  160357. #elif defined(__clang__)
  160358. "adcs r3, %[r]\n\t"
  160359. #else
  160360. "adc r3, %[r]\n\t"
  160361. #endif
  160362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160363. "lsrs r5, %[a], #16\n\t"
  160364. #else
  160365. "lsr r5, %[a], #16\n\t"
  160366. #endif
  160367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160368. "lsrs r6, r7, #16\n\t"
  160369. #else
  160370. "lsr r6, r7, #16\n\t"
  160371. #endif
  160372. #ifdef WOLFSSL_KEIL
  160373. "muls r6, r5, r6\n\t"
  160374. #elif defined(__clang__)
  160375. "muls r6, r5\n\t"
  160376. #else
  160377. "mul r6, r5\n\t"
  160378. #endif
  160379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160380. "adds r2, r2, r6\n\t"
  160381. #else
  160382. "add r2, r2, r6\n\t"
  160383. #endif
  160384. #ifdef WOLFSSL_KEIL
  160385. "adcs r3, r3, %[r]\n\t"
  160386. #elif defined(__clang__)
  160387. "adcs r3, %[r]\n\t"
  160388. #else
  160389. "adc r3, %[r]\n\t"
  160390. #endif
  160391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160392. "adds r2, r2, r6\n\t"
  160393. #else
  160394. "add r2, r2, r6\n\t"
  160395. #endif
  160396. #ifdef WOLFSSL_KEIL
  160397. "adcs r3, r3, %[r]\n\t"
  160398. #elif defined(__clang__)
  160399. "adcs r3, %[r]\n\t"
  160400. #else
  160401. "adc r3, %[r]\n\t"
  160402. #endif
  160403. "uxth r6, r7\n\t"
  160404. #ifdef WOLFSSL_KEIL
  160405. "muls r5, r6, r5\n\t"
  160406. #elif defined(__clang__)
  160407. "muls r5, r6\n\t"
  160408. #else
  160409. "mul r5, r6\n\t"
  160410. #endif
  160411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160412. "lsrs r6, r5, #16\n\t"
  160413. #else
  160414. "lsr r6, r5, #16\n\t"
  160415. #endif
  160416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160417. "lsls r5, r5, #16\n\t"
  160418. #else
  160419. "lsl r5, r5, #16\n\t"
  160420. #endif
  160421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160422. "adds r4, r4, r5\n\t"
  160423. #else
  160424. "add r4, r4, r5\n\t"
  160425. #endif
  160426. #ifdef WOLFSSL_KEIL
  160427. "adcs r2, r2, r6\n\t"
  160428. #elif defined(__clang__)
  160429. "adcs r2, r6\n\t"
  160430. #else
  160431. "adc r2, r6\n\t"
  160432. #endif
  160433. #ifdef WOLFSSL_KEIL
  160434. "adcs r3, r3, %[r]\n\t"
  160435. #elif defined(__clang__)
  160436. "adcs r3, %[r]\n\t"
  160437. #else
  160438. "adc r3, %[r]\n\t"
  160439. #endif
  160440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160441. "adds r4, r4, r5\n\t"
  160442. #else
  160443. "add r4, r4, r5\n\t"
  160444. #endif
  160445. #ifdef WOLFSSL_KEIL
  160446. "adcs r2, r2, r6\n\t"
  160447. #elif defined(__clang__)
  160448. "adcs r2, r6\n\t"
  160449. #else
  160450. "adc r2, r6\n\t"
  160451. #endif
  160452. #ifdef WOLFSSL_KEIL
  160453. "adcs r3, r3, %[r]\n\t"
  160454. #elif defined(__clang__)
  160455. "adcs r3, %[r]\n\t"
  160456. #else
  160457. "adc r3, %[r]\n\t"
  160458. #endif
  160459. "# A[10] * A[1]\n\t"
  160460. "mov %[a], r9\n\t"
  160461. "mov r7, r11\n\t"
  160462. "ldr %[a], [%[a], #40]\n\t"
  160463. "uxth r5, %[a]\n\t"
  160464. "uxth r6, r7\n\t"
  160465. #ifdef WOLFSSL_KEIL
  160466. "muls r6, r5, r6\n\t"
  160467. #elif defined(__clang__)
  160468. "muls r6, r5\n\t"
  160469. #else
  160470. "mul r6, r5\n\t"
  160471. #endif
  160472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160473. "adds r4, r4, r6\n\t"
  160474. #else
  160475. "add r4, r4, r6\n\t"
  160476. #endif
  160477. #ifdef WOLFSSL_KEIL
  160478. "adcs r2, r2, %[r]\n\t"
  160479. #elif defined(__clang__)
  160480. "adcs r2, %[r]\n\t"
  160481. #else
  160482. "adc r2, %[r]\n\t"
  160483. #endif
  160484. #ifdef WOLFSSL_KEIL
  160485. "adcs r3, r3, %[r]\n\t"
  160486. #elif defined(__clang__)
  160487. "adcs r3, %[r]\n\t"
  160488. #else
  160489. "adc r3, %[r]\n\t"
  160490. #endif
  160491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160492. "adds r4, r4, r6\n\t"
  160493. #else
  160494. "add r4, r4, r6\n\t"
  160495. #endif
  160496. #ifdef WOLFSSL_KEIL
  160497. "adcs r2, r2, %[r]\n\t"
  160498. #elif defined(__clang__)
  160499. "adcs r2, %[r]\n\t"
  160500. #else
  160501. "adc r2, %[r]\n\t"
  160502. #endif
  160503. #ifdef WOLFSSL_KEIL
  160504. "adcs r3, r3, %[r]\n\t"
  160505. #elif defined(__clang__)
  160506. "adcs r3, %[r]\n\t"
  160507. #else
  160508. "adc r3, %[r]\n\t"
  160509. #endif
  160510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160511. "lsrs r6, r7, #16\n\t"
  160512. #else
  160513. "lsr r6, r7, #16\n\t"
  160514. #endif
  160515. #ifdef WOLFSSL_KEIL
  160516. "muls r5, r6, r5\n\t"
  160517. #elif defined(__clang__)
  160518. "muls r5, r6\n\t"
  160519. #else
  160520. "mul r5, r6\n\t"
  160521. #endif
  160522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160523. "lsrs r6, r5, #16\n\t"
  160524. #else
  160525. "lsr r6, r5, #16\n\t"
  160526. #endif
  160527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160528. "lsls r5, r5, #16\n\t"
  160529. #else
  160530. "lsl r5, r5, #16\n\t"
  160531. #endif
  160532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160533. "adds r4, r4, r5\n\t"
  160534. #else
  160535. "add r4, r4, r5\n\t"
  160536. #endif
  160537. #ifdef WOLFSSL_KEIL
  160538. "adcs r2, r2, r6\n\t"
  160539. #elif defined(__clang__)
  160540. "adcs r2, r6\n\t"
  160541. #else
  160542. "adc r2, r6\n\t"
  160543. #endif
  160544. #ifdef WOLFSSL_KEIL
  160545. "adcs r3, r3, %[r]\n\t"
  160546. #elif defined(__clang__)
  160547. "adcs r3, %[r]\n\t"
  160548. #else
  160549. "adc r3, %[r]\n\t"
  160550. #endif
  160551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160552. "adds r4, r4, r5\n\t"
  160553. #else
  160554. "add r4, r4, r5\n\t"
  160555. #endif
  160556. #ifdef WOLFSSL_KEIL
  160557. "adcs r2, r2, r6\n\t"
  160558. #elif defined(__clang__)
  160559. "adcs r2, r6\n\t"
  160560. #else
  160561. "adc r2, r6\n\t"
  160562. #endif
  160563. #ifdef WOLFSSL_KEIL
  160564. "adcs r3, r3, %[r]\n\t"
  160565. #elif defined(__clang__)
  160566. "adcs r3, %[r]\n\t"
  160567. #else
  160568. "adc r3, %[r]\n\t"
  160569. #endif
  160570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160571. "lsrs r5, %[a], #16\n\t"
  160572. #else
  160573. "lsr r5, %[a], #16\n\t"
  160574. #endif
  160575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160576. "lsrs r6, r7, #16\n\t"
  160577. #else
  160578. "lsr r6, r7, #16\n\t"
  160579. #endif
  160580. #ifdef WOLFSSL_KEIL
  160581. "muls r6, r5, r6\n\t"
  160582. #elif defined(__clang__)
  160583. "muls r6, r5\n\t"
  160584. #else
  160585. "mul r6, r5\n\t"
  160586. #endif
  160587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160588. "adds r2, r2, r6\n\t"
  160589. #else
  160590. "add r2, r2, r6\n\t"
  160591. #endif
  160592. #ifdef WOLFSSL_KEIL
  160593. "adcs r3, r3, %[r]\n\t"
  160594. #elif defined(__clang__)
  160595. "adcs r3, %[r]\n\t"
  160596. #else
  160597. "adc r3, %[r]\n\t"
  160598. #endif
  160599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160600. "adds r2, r2, r6\n\t"
  160601. #else
  160602. "add r2, r2, r6\n\t"
  160603. #endif
  160604. #ifdef WOLFSSL_KEIL
  160605. "adcs r3, r3, %[r]\n\t"
  160606. #elif defined(__clang__)
  160607. "adcs r3, %[r]\n\t"
  160608. #else
  160609. "adc r3, %[r]\n\t"
  160610. #endif
  160611. "uxth r6, r7\n\t"
  160612. #ifdef WOLFSSL_KEIL
  160613. "muls r5, r6, r5\n\t"
  160614. #elif defined(__clang__)
  160615. "muls r5, r6\n\t"
  160616. #else
  160617. "mul r5, r6\n\t"
  160618. #endif
  160619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160620. "lsrs r6, r5, #16\n\t"
  160621. #else
  160622. "lsr r6, r5, #16\n\t"
  160623. #endif
  160624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160625. "lsls r5, r5, #16\n\t"
  160626. #else
  160627. "lsl r5, r5, #16\n\t"
  160628. #endif
  160629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160630. "adds r4, r4, r5\n\t"
  160631. #else
  160632. "add r4, r4, r5\n\t"
  160633. #endif
  160634. #ifdef WOLFSSL_KEIL
  160635. "adcs r2, r2, r6\n\t"
  160636. #elif defined(__clang__)
  160637. "adcs r2, r6\n\t"
  160638. #else
  160639. "adc r2, r6\n\t"
  160640. #endif
  160641. #ifdef WOLFSSL_KEIL
  160642. "adcs r3, r3, %[r]\n\t"
  160643. #elif defined(__clang__)
  160644. "adcs r3, %[r]\n\t"
  160645. #else
  160646. "adc r3, %[r]\n\t"
  160647. #endif
  160648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160649. "adds r4, r4, r5\n\t"
  160650. #else
  160651. "add r4, r4, r5\n\t"
  160652. #endif
  160653. #ifdef WOLFSSL_KEIL
  160654. "adcs r2, r2, r6\n\t"
  160655. #elif defined(__clang__)
  160656. "adcs r2, r6\n\t"
  160657. #else
  160658. "adc r2, r6\n\t"
  160659. #endif
  160660. #ifdef WOLFSSL_KEIL
  160661. "adcs r3, r3, %[r]\n\t"
  160662. #elif defined(__clang__)
  160663. "adcs r3, %[r]\n\t"
  160664. #else
  160665. "adc r3, %[r]\n\t"
  160666. #endif
  160667. "# A[11] * A[0]\n\t"
  160668. "mov %[a], r9\n\t"
  160669. "mov r7, r10\n\t"
  160670. "ldr %[a], [%[a], #44]\n\t"
  160671. "uxth r5, %[a]\n\t"
  160672. "uxth r6, r7\n\t"
  160673. #ifdef WOLFSSL_KEIL
  160674. "muls r6, r5, r6\n\t"
  160675. #elif defined(__clang__)
  160676. "muls r6, r5\n\t"
  160677. #else
  160678. "mul r6, r5\n\t"
  160679. #endif
  160680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160681. "adds r4, r4, r6\n\t"
  160682. #else
  160683. "add r4, r4, r6\n\t"
  160684. #endif
  160685. #ifdef WOLFSSL_KEIL
  160686. "adcs r2, r2, %[r]\n\t"
  160687. #elif defined(__clang__)
  160688. "adcs r2, %[r]\n\t"
  160689. #else
  160690. "adc r2, %[r]\n\t"
  160691. #endif
  160692. #ifdef WOLFSSL_KEIL
  160693. "adcs r3, r3, %[r]\n\t"
  160694. #elif defined(__clang__)
  160695. "adcs r3, %[r]\n\t"
  160696. #else
  160697. "adc r3, %[r]\n\t"
  160698. #endif
  160699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160700. "adds r4, r4, r6\n\t"
  160701. #else
  160702. "add r4, r4, r6\n\t"
  160703. #endif
  160704. #ifdef WOLFSSL_KEIL
  160705. "adcs r2, r2, %[r]\n\t"
  160706. #elif defined(__clang__)
  160707. "adcs r2, %[r]\n\t"
  160708. #else
  160709. "adc r2, %[r]\n\t"
  160710. #endif
  160711. #ifdef WOLFSSL_KEIL
  160712. "adcs r3, r3, %[r]\n\t"
  160713. #elif defined(__clang__)
  160714. "adcs r3, %[r]\n\t"
  160715. #else
  160716. "adc r3, %[r]\n\t"
  160717. #endif
  160718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160719. "lsrs r6, r7, #16\n\t"
  160720. #else
  160721. "lsr r6, r7, #16\n\t"
  160722. #endif
  160723. #ifdef WOLFSSL_KEIL
  160724. "muls r5, r6, r5\n\t"
  160725. #elif defined(__clang__)
  160726. "muls r5, r6\n\t"
  160727. #else
  160728. "mul r5, r6\n\t"
  160729. #endif
  160730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160731. "lsrs r6, r5, #16\n\t"
  160732. #else
  160733. "lsr r6, r5, #16\n\t"
  160734. #endif
  160735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160736. "lsls r5, r5, #16\n\t"
  160737. #else
  160738. "lsl r5, r5, #16\n\t"
  160739. #endif
  160740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160741. "adds r4, r4, r5\n\t"
  160742. #else
  160743. "add r4, r4, r5\n\t"
  160744. #endif
  160745. #ifdef WOLFSSL_KEIL
  160746. "adcs r2, r2, r6\n\t"
  160747. #elif defined(__clang__)
  160748. "adcs r2, r6\n\t"
  160749. #else
  160750. "adc r2, r6\n\t"
  160751. #endif
  160752. #ifdef WOLFSSL_KEIL
  160753. "adcs r3, r3, %[r]\n\t"
  160754. #elif defined(__clang__)
  160755. "adcs r3, %[r]\n\t"
  160756. #else
  160757. "adc r3, %[r]\n\t"
  160758. #endif
  160759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160760. "adds r4, r4, r5\n\t"
  160761. #else
  160762. "add r4, r4, r5\n\t"
  160763. #endif
  160764. #ifdef WOLFSSL_KEIL
  160765. "adcs r2, r2, r6\n\t"
  160766. #elif defined(__clang__)
  160767. "adcs r2, r6\n\t"
  160768. #else
  160769. "adc r2, r6\n\t"
  160770. #endif
  160771. #ifdef WOLFSSL_KEIL
  160772. "adcs r3, r3, %[r]\n\t"
  160773. #elif defined(__clang__)
  160774. "adcs r3, %[r]\n\t"
  160775. #else
  160776. "adc r3, %[r]\n\t"
  160777. #endif
  160778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160779. "lsrs r5, %[a], #16\n\t"
  160780. #else
  160781. "lsr r5, %[a], #16\n\t"
  160782. #endif
  160783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160784. "lsrs r6, r7, #16\n\t"
  160785. #else
  160786. "lsr r6, r7, #16\n\t"
  160787. #endif
  160788. #ifdef WOLFSSL_KEIL
  160789. "muls r6, r5, r6\n\t"
  160790. #elif defined(__clang__)
  160791. "muls r6, r5\n\t"
  160792. #else
  160793. "mul r6, r5\n\t"
  160794. #endif
  160795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160796. "adds r2, r2, r6\n\t"
  160797. #else
  160798. "add r2, r2, r6\n\t"
  160799. #endif
  160800. #ifdef WOLFSSL_KEIL
  160801. "adcs r3, r3, %[r]\n\t"
  160802. #elif defined(__clang__)
  160803. "adcs r3, %[r]\n\t"
  160804. #else
  160805. "adc r3, %[r]\n\t"
  160806. #endif
  160807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160808. "adds r2, r2, r6\n\t"
  160809. #else
  160810. "add r2, r2, r6\n\t"
  160811. #endif
  160812. #ifdef WOLFSSL_KEIL
  160813. "adcs r3, r3, %[r]\n\t"
  160814. #elif defined(__clang__)
  160815. "adcs r3, %[r]\n\t"
  160816. #else
  160817. "adc r3, %[r]\n\t"
  160818. #endif
  160819. "uxth r6, r7\n\t"
  160820. #ifdef WOLFSSL_KEIL
  160821. "muls r5, r6, r5\n\t"
  160822. #elif defined(__clang__)
  160823. "muls r5, r6\n\t"
  160824. #else
  160825. "mul r5, r6\n\t"
  160826. #endif
  160827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160828. "lsrs r6, r5, #16\n\t"
  160829. #else
  160830. "lsr r6, r5, #16\n\t"
  160831. #endif
  160832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160833. "lsls r5, r5, #16\n\t"
  160834. #else
  160835. "lsl r5, r5, #16\n\t"
  160836. #endif
  160837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160838. "adds r4, r4, r5\n\t"
  160839. #else
  160840. "add r4, r4, r5\n\t"
  160841. #endif
  160842. #ifdef WOLFSSL_KEIL
  160843. "adcs r2, r2, r6\n\t"
  160844. #elif defined(__clang__)
  160845. "adcs r2, r6\n\t"
  160846. #else
  160847. "adc r2, r6\n\t"
  160848. #endif
  160849. #ifdef WOLFSSL_KEIL
  160850. "adcs r3, r3, %[r]\n\t"
  160851. #elif defined(__clang__)
  160852. "adcs r3, %[r]\n\t"
  160853. #else
  160854. "adc r3, %[r]\n\t"
  160855. #endif
  160856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160857. "adds r4, r4, r5\n\t"
  160858. #else
  160859. "add r4, r4, r5\n\t"
  160860. #endif
  160861. #ifdef WOLFSSL_KEIL
  160862. "adcs r2, r2, r6\n\t"
  160863. #elif defined(__clang__)
  160864. "adcs r2, r6\n\t"
  160865. #else
  160866. "adc r2, r6\n\t"
  160867. #endif
  160868. #ifdef WOLFSSL_KEIL
  160869. "adcs r3, r3, %[r]\n\t"
  160870. #elif defined(__clang__)
  160871. "adcs r3, %[r]\n\t"
  160872. #else
  160873. "adc r3, %[r]\n\t"
  160874. #endif
  160875. "str r4, [sp, #44]\n\t"
  160876. "# A[12] * A[0]\n\t"
  160877. "movs r4, #0\n\t"
  160878. "mov %[a], r9\n\t"
  160879. "ldr %[a], [%[a], #48]\n\t"
  160880. "uxth r5, %[a]\n\t"
  160881. "uxth r6, r7\n\t"
  160882. #ifdef WOLFSSL_KEIL
  160883. "muls r6, r5, r6\n\t"
  160884. #elif defined(__clang__)
  160885. "muls r6, r5\n\t"
  160886. #else
  160887. "mul r6, r5\n\t"
  160888. #endif
  160889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160890. "adds r2, r2, r6\n\t"
  160891. #else
  160892. "add r2, r2, r6\n\t"
  160893. #endif
  160894. #ifdef WOLFSSL_KEIL
  160895. "adcs r3, r3, %[r]\n\t"
  160896. #elif defined(__clang__)
  160897. "adcs r3, %[r]\n\t"
  160898. #else
  160899. "adc r3, %[r]\n\t"
  160900. #endif
  160901. #ifdef WOLFSSL_KEIL
  160902. "adcs r4, r4, %[r]\n\t"
  160903. #elif defined(__clang__)
  160904. "adcs r4, %[r]\n\t"
  160905. #else
  160906. "adc r4, %[r]\n\t"
  160907. #endif
  160908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160909. "adds r2, r2, r6\n\t"
  160910. #else
  160911. "add r2, r2, r6\n\t"
  160912. #endif
  160913. #ifdef WOLFSSL_KEIL
  160914. "adcs r3, r3, %[r]\n\t"
  160915. #elif defined(__clang__)
  160916. "adcs r3, %[r]\n\t"
  160917. #else
  160918. "adc r3, %[r]\n\t"
  160919. #endif
  160920. #ifdef WOLFSSL_KEIL
  160921. "adcs r4, r4, %[r]\n\t"
  160922. #elif defined(__clang__)
  160923. "adcs r4, %[r]\n\t"
  160924. #else
  160925. "adc r4, %[r]\n\t"
  160926. #endif
  160927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160928. "lsrs r6, r7, #16\n\t"
  160929. #else
  160930. "lsr r6, r7, #16\n\t"
  160931. #endif
  160932. #ifdef WOLFSSL_KEIL
  160933. "muls r5, r6, r5\n\t"
  160934. #elif defined(__clang__)
  160935. "muls r5, r6\n\t"
  160936. #else
  160937. "mul r5, r6\n\t"
  160938. #endif
  160939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160940. "lsrs r6, r5, #16\n\t"
  160941. #else
  160942. "lsr r6, r5, #16\n\t"
  160943. #endif
  160944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160945. "lsls r5, r5, #16\n\t"
  160946. #else
  160947. "lsl r5, r5, #16\n\t"
  160948. #endif
  160949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160950. "adds r2, r2, r5\n\t"
  160951. #else
  160952. "add r2, r2, r5\n\t"
  160953. #endif
  160954. #ifdef WOLFSSL_KEIL
  160955. "adcs r3, r3, r6\n\t"
  160956. #elif defined(__clang__)
  160957. "adcs r3, r6\n\t"
  160958. #else
  160959. "adc r3, r6\n\t"
  160960. #endif
  160961. #ifdef WOLFSSL_KEIL
  160962. "adcs r4, r4, %[r]\n\t"
  160963. #elif defined(__clang__)
  160964. "adcs r4, %[r]\n\t"
  160965. #else
  160966. "adc r4, %[r]\n\t"
  160967. #endif
  160968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160969. "adds r2, r2, r5\n\t"
  160970. #else
  160971. "add r2, r2, r5\n\t"
  160972. #endif
  160973. #ifdef WOLFSSL_KEIL
  160974. "adcs r3, r3, r6\n\t"
  160975. #elif defined(__clang__)
  160976. "adcs r3, r6\n\t"
  160977. #else
  160978. "adc r3, r6\n\t"
  160979. #endif
  160980. #ifdef WOLFSSL_KEIL
  160981. "adcs r4, r4, %[r]\n\t"
  160982. #elif defined(__clang__)
  160983. "adcs r4, %[r]\n\t"
  160984. #else
  160985. "adc r4, %[r]\n\t"
  160986. #endif
  160987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160988. "lsrs r5, %[a], #16\n\t"
  160989. #else
  160990. "lsr r5, %[a], #16\n\t"
  160991. #endif
  160992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160993. "lsrs r6, r7, #16\n\t"
  160994. #else
  160995. "lsr r6, r7, #16\n\t"
  160996. #endif
  160997. #ifdef WOLFSSL_KEIL
  160998. "muls r6, r5, r6\n\t"
  160999. #elif defined(__clang__)
  161000. "muls r6, r5\n\t"
  161001. #else
  161002. "mul r6, r5\n\t"
  161003. #endif
  161004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161005. "adds r3, r3, r6\n\t"
  161006. #else
  161007. "add r3, r3, r6\n\t"
  161008. #endif
  161009. #ifdef WOLFSSL_KEIL
  161010. "adcs r4, r4, %[r]\n\t"
  161011. #elif defined(__clang__)
  161012. "adcs r4, %[r]\n\t"
  161013. #else
  161014. "adc r4, %[r]\n\t"
  161015. #endif
  161016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161017. "adds r3, r3, r6\n\t"
  161018. #else
  161019. "add r3, r3, r6\n\t"
  161020. #endif
  161021. #ifdef WOLFSSL_KEIL
  161022. "adcs r4, r4, %[r]\n\t"
  161023. #elif defined(__clang__)
  161024. "adcs r4, %[r]\n\t"
  161025. #else
  161026. "adc r4, %[r]\n\t"
  161027. #endif
  161028. "uxth r6, r7\n\t"
  161029. #ifdef WOLFSSL_KEIL
  161030. "muls r5, r6, r5\n\t"
  161031. #elif defined(__clang__)
  161032. "muls r5, r6\n\t"
  161033. #else
  161034. "mul r5, r6\n\t"
  161035. #endif
  161036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161037. "lsrs r6, r5, #16\n\t"
  161038. #else
  161039. "lsr r6, r5, #16\n\t"
  161040. #endif
  161041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161042. "lsls r5, r5, #16\n\t"
  161043. #else
  161044. "lsl r5, r5, #16\n\t"
  161045. #endif
  161046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161047. "adds r2, r2, r5\n\t"
  161048. #else
  161049. "add r2, r2, r5\n\t"
  161050. #endif
  161051. #ifdef WOLFSSL_KEIL
  161052. "adcs r3, r3, r6\n\t"
  161053. #elif defined(__clang__)
  161054. "adcs r3, r6\n\t"
  161055. #else
  161056. "adc r3, r6\n\t"
  161057. #endif
  161058. #ifdef WOLFSSL_KEIL
  161059. "adcs r4, r4, %[r]\n\t"
  161060. #elif defined(__clang__)
  161061. "adcs r4, %[r]\n\t"
  161062. #else
  161063. "adc r4, %[r]\n\t"
  161064. #endif
  161065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161066. "adds r2, r2, r5\n\t"
  161067. #else
  161068. "add r2, r2, r5\n\t"
  161069. #endif
  161070. #ifdef WOLFSSL_KEIL
  161071. "adcs r3, r3, r6\n\t"
  161072. #elif defined(__clang__)
  161073. "adcs r3, r6\n\t"
  161074. #else
  161075. "adc r3, r6\n\t"
  161076. #endif
  161077. #ifdef WOLFSSL_KEIL
  161078. "adcs r4, r4, %[r]\n\t"
  161079. #elif defined(__clang__)
  161080. "adcs r4, %[r]\n\t"
  161081. #else
  161082. "adc r4, %[r]\n\t"
  161083. #endif
  161084. "# A[11] * A[1]\n\t"
  161085. "mov %[a], r9\n\t"
  161086. "mov r7, r11\n\t"
  161087. "ldr %[a], [%[a], #44]\n\t"
  161088. "uxth r5, %[a]\n\t"
  161089. "uxth r6, r7\n\t"
  161090. #ifdef WOLFSSL_KEIL
  161091. "muls r6, r5, r6\n\t"
  161092. #elif defined(__clang__)
  161093. "muls r6, r5\n\t"
  161094. #else
  161095. "mul r6, r5\n\t"
  161096. #endif
  161097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161098. "adds r2, r2, r6\n\t"
  161099. #else
  161100. "add r2, r2, r6\n\t"
  161101. #endif
  161102. #ifdef WOLFSSL_KEIL
  161103. "adcs r3, r3, %[r]\n\t"
  161104. #elif defined(__clang__)
  161105. "adcs r3, %[r]\n\t"
  161106. #else
  161107. "adc r3, %[r]\n\t"
  161108. #endif
  161109. #ifdef WOLFSSL_KEIL
  161110. "adcs r4, r4, %[r]\n\t"
  161111. #elif defined(__clang__)
  161112. "adcs r4, %[r]\n\t"
  161113. #else
  161114. "adc r4, %[r]\n\t"
  161115. #endif
  161116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161117. "adds r2, r2, r6\n\t"
  161118. #else
  161119. "add r2, r2, r6\n\t"
  161120. #endif
  161121. #ifdef WOLFSSL_KEIL
  161122. "adcs r3, r3, %[r]\n\t"
  161123. #elif defined(__clang__)
  161124. "adcs r3, %[r]\n\t"
  161125. #else
  161126. "adc r3, %[r]\n\t"
  161127. #endif
  161128. #ifdef WOLFSSL_KEIL
  161129. "adcs r4, r4, %[r]\n\t"
  161130. #elif defined(__clang__)
  161131. "adcs r4, %[r]\n\t"
  161132. #else
  161133. "adc r4, %[r]\n\t"
  161134. #endif
  161135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161136. "lsrs r6, r7, #16\n\t"
  161137. #else
  161138. "lsr r6, r7, #16\n\t"
  161139. #endif
  161140. #ifdef WOLFSSL_KEIL
  161141. "muls r5, r6, r5\n\t"
  161142. #elif defined(__clang__)
  161143. "muls r5, r6\n\t"
  161144. #else
  161145. "mul r5, r6\n\t"
  161146. #endif
  161147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161148. "lsrs r6, r5, #16\n\t"
  161149. #else
  161150. "lsr r6, r5, #16\n\t"
  161151. #endif
  161152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161153. "lsls r5, r5, #16\n\t"
  161154. #else
  161155. "lsl r5, r5, #16\n\t"
  161156. #endif
  161157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161158. "adds r2, r2, r5\n\t"
  161159. #else
  161160. "add r2, r2, r5\n\t"
  161161. #endif
  161162. #ifdef WOLFSSL_KEIL
  161163. "adcs r3, r3, r6\n\t"
  161164. #elif defined(__clang__)
  161165. "adcs r3, r6\n\t"
  161166. #else
  161167. "adc r3, r6\n\t"
  161168. #endif
  161169. #ifdef WOLFSSL_KEIL
  161170. "adcs r4, r4, %[r]\n\t"
  161171. #elif defined(__clang__)
  161172. "adcs r4, %[r]\n\t"
  161173. #else
  161174. "adc r4, %[r]\n\t"
  161175. #endif
  161176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161177. "adds r2, r2, r5\n\t"
  161178. #else
  161179. "add r2, r2, r5\n\t"
  161180. #endif
  161181. #ifdef WOLFSSL_KEIL
  161182. "adcs r3, r3, r6\n\t"
  161183. #elif defined(__clang__)
  161184. "adcs r3, r6\n\t"
  161185. #else
  161186. "adc r3, r6\n\t"
  161187. #endif
  161188. #ifdef WOLFSSL_KEIL
  161189. "adcs r4, r4, %[r]\n\t"
  161190. #elif defined(__clang__)
  161191. "adcs r4, %[r]\n\t"
  161192. #else
  161193. "adc r4, %[r]\n\t"
  161194. #endif
  161195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161196. "lsrs r5, %[a], #16\n\t"
  161197. #else
  161198. "lsr r5, %[a], #16\n\t"
  161199. #endif
  161200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161201. "lsrs r6, r7, #16\n\t"
  161202. #else
  161203. "lsr r6, r7, #16\n\t"
  161204. #endif
  161205. #ifdef WOLFSSL_KEIL
  161206. "muls r6, r5, r6\n\t"
  161207. #elif defined(__clang__)
  161208. "muls r6, r5\n\t"
  161209. #else
  161210. "mul r6, r5\n\t"
  161211. #endif
  161212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161213. "adds r3, r3, r6\n\t"
  161214. #else
  161215. "add r3, r3, r6\n\t"
  161216. #endif
  161217. #ifdef WOLFSSL_KEIL
  161218. "adcs r4, r4, %[r]\n\t"
  161219. #elif defined(__clang__)
  161220. "adcs r4, %[r]\n\t"
  161221. #else
  161222. "adc r4, %[r]\n\t"
  161223. #endif
  161224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161225. "adds r3, r3, r6\n\t"
  161226. #else
  161227. "add r3, r3, r6\n\t"
  161228. #endif
  161229. #ifdef WOLFSSL_KEIL
  161230. "adcs r4, r4, %[r]\n\t"
  161231. #elif defined(__clang__)
  161232. "adcs r4, %[r]\n\t"
  161233. #else
  161234. "adc r4, %[r]\n\t"
  161235. #endif
  161236. "uxth r6, r7\n\t"
  161237. #ifdef WOLFSSL_KEIL
  161238. "muls r5, r6, r5\n\t"
  161239. #elif defined(__clang__)
  161240. "muls r5, r6\n\t"
  161241. #else
  161242. "mul r5, r6\n\t"
  161243. #endif
  161244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161245. "lsrs r6, r5, #16\n\t"
  161246. #else
  161247. "lsr r6, r5, #16\n\t"
  161248. #endif
  161249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161250. "lsls r5, r5, #16\n\t"
  161251. #else
  161252. "lsl r5, r5, #16\n\t"
  161253. #endif
  161254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161255. "adds r2, r2, r5\n\t"
  161256. #else
  161257. "add r2, r2, r5\n\t"
  161258. #endif
  161259. #ifdef WOLFSSL_KEIL
  161260. "adcs r3, r3, r6\n\t"
  161261. #elif defined(__clang__)
  161262. "adcs r3, r6\n\t"
  161263. #else
  161264. "adc r3, r6\n\t"
  161265. #endif
  161266. #ifdef WOLFSSL_KEIL
  161267. "adcs r4, r4, %[r]\n\t"
  161268. #elif defined(__clang__)
  161269. "adcs r4, %[r]\n\t"
  161270. #else
  161271. "adc r4, %[r]\n\t"
  161272. #endif
  161273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161274. "adds r2, r2, r5\n\t"
  161275. #else
  161276. "add r2, r2, r5\n\t"
  161277. #endif
  161278. #ifdef WOLFSSL_KEIL
  161279. "adcs r3, r3, r6\n\t"
  161280. #elif defined(__clang__)
  161281. "adcs r3, r6\n\t"
  161282. #else
  161283. "adc r3, r6\n\t"
  161284. #endif
  161285. #ifdef WOLFSSL_KEIL
  161286. "adcs r4, r4, %[r]\n\t"
  161287. #elif defined(__clang__)
  161288. "adcs r4, %[r]\n\t"
  161289. #else
  161290. "adc r4, %[r]\n\t"
  161291. #endif
  161292. "# A[10] * A[2]\n\t"
  161293. "mov %[a], r9\n\t"
  161294. "mov r7, r12\n\t"
  161295. "ldr %[a], [%[a], #40]\n\t"
  161296. "uxth r5, %[a]\n\t"
  161297. "uxth r6, r7\n\t"
  161298. #ifdef WOLFSSL_KEIL
  161299. "muls r6, r5, r6\n\t"
  161300. #elif defined(__clang__)
  161301. "muls r6, r5\n\t"
  161302. #else
  161303. "mul r6, r5\n\t"
  161304. #endif
  161305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161306. "adds r2, r2, r6\n\t"
  161307. #else
  161308. "add r2, r2, r6\n\t"
  161309. #endif
  161310. #ifdef WOLFSSL_KEIL
  161311. "adcs r3, r3, %[r]\n\t"
  161312. #elif defined(__clang__)
  161313. "adcs r3, %[r]\n\t"
  161314. #else
  161315. "adc r3, %[r]\n\t"
  161316. #endif
  161317. #ifdef WOLFSSL_KEIL
  161318. "adcs r4, r4, %[r]\n\t"
  161319. #elif defined(__clang__)
  161320. "adcs r4, %[r]\n\t"
  161321. #else
  161322. "adc r4, %[r]\n\t"
  161323. #endif
  161324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161325. "adds r2, r2, r6\n\t"
  161326. #else
  161327. "add r2, r2, r6\n\t"
  161328. #endif
  161329. #ifdef WOLFSSL_KEIL
  161330. "adcs r3, r3, %[r]\n\t"
  161331. #elif defined(__clang__)
  161332. "adcs r3, %[r]\n\t"
  161333. #else
  161334. "adc r3, %[r]\n\t"
  161335. #endif
  161336. #ifdef WOLFSSL_KEIL
  161337. "adcs r4, r4, %[r]\n\t"
  161338. #elif defined(__clang__)
  161339. "adcs r4, %[r]\n\t"
  161340. #else
  161341. "adc r4, %[r]\n\t"
  161342. #endif
  161343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161344. "lsrs r6, r7, #16\n\t"
  161345. #else
  161346. "lsr r6, r7, #16\n\t"
  161347. #endif
  161348. #ifdef WOLFSSL_KEIL
  161349. "muls r5, r6, r5\n\t"
  161350. #elif defined(__clang__)
  161351. "muls r5, r6\n\t"
  161352. #else
  161353. "mul r5, r6\n\t"
  161354. #endif
  161355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161356. "lsrs r6, r5, #16\n\t"
  161357. #else
  161358. "lsr r6, r5, #16\n\t"
  161359. #endif
  161360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161361. "lsls r5, r5, #16\n\t"
  161362. #else
  161363. "lsl r5, r5, #16\n\t"
  161364. #endif
  161365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161366. "adds r2, r2, r5\n\t"
  161367. #else
  161368. "add r2, r2, r5\n\t"
  161369. #endif
  161370. #ifdef WOLFSSL_KEIL
  161371. "adcs r3, r3, r6\n\t"
  161372. #elif defined(__clang__)
  161373. "adcs r3, r6\n\t"
  161374. #else
  161375. "adc r3, r6\n\t"
  161376. #endif
  161377. #ifdef WOLFSSL_KEIL
  161378. "adcs r4, r4, %[r]\n\t"
  161379. #elif defined(__clang__)
  161380. "adcs r4, %[r]\n\t"
  161381. #else
  161382. "adc r4, %[r]\n\t"
  161383. #endif
  161384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161385. "adds r2, r2, r5\n\t"
  161386. #else
  161387. "add r2, r2, r5\n\t"
  161388. #endif
  161389. #ifdef WOLFSSL_KEIL
  161390. "adcs r3, r3, r6\n\t"
  161391. #elif defined(__clang__)
  161392. "adcs r3, r6\n\t"
  161393. #else
  161394. "adc r3, r6\n\t"
  161395. #endif
  161396. #ifdef WOLFSSL_KEIL
  161397. "adcs r4, r4, %[r]\n\t"
  161398. #elif defined(__clang__)
  161399. "adcs r4, %[r]\n\t"
  161400. #else
  161401. "adc r4, %[r]\n\t"
  161402. #endif
  161403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161404. "lsrs r5, %[a], #16\n\t"
  161405. #else
  161406. "lsr r5, %[a], #16\n\t"
  161407. #endif
  161408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161409. "lsrs r6, r7, #16\n\t"
  161410. #else
  161411. "lsr r6, r7, #16\n\t"
  161412. #endif
  161413. #ifdef WOLFSSL_KEIL
  161414. "muls r6, r5, r6\n\t"
  161415. #elif defined(__clang__)
  161416. "muls r6, r5\n\t"
  161417. #else
  161418. "mul r6, r5\n\t"
  161419. #endif
  161420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161421. "adds r3, r3, r6\n\t"
  161422. #else
  161423. "add r3, r3, r6\n\t"
  161424. #endif
  161425. #ifdef WOLFSSL_KEIL
  161426. "adcs r4, r4, %[r]\n\t"
  161427. #elif defined(__clang__)
  161428. "adcs r4, %[r]\n\t"
  161429. #else
  161430. "adc r4, %[r]\n\t"
  161431. #endif
  161432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161433. "adds r3, r3, r6\n\t"
  161434. #else
  161435. "add r3, r3, r6\n\t"
  161436. #endif
  161437. #ifdef WOLFSSL_KEIL
  161438. "adcs r4, r4, %[r]\n\t"
  161439. #elif defined(__clang__)
  161440. "adcs r4, %[r]\n\t"
  161441. #else
  161442. "adc r4, %[r]\n\t"
  161443. #endif
  161444. "uxth r6, r7\n\t"
  161445. #ifdef WOLFSSL_KEIL
  161446. "muls r5, r6, r5\n\t"
  161447. #elif defined(__clang__)
  161448. "muls r5, r6\n\t"
  161449. #else
  161450. "mul r5, r6\n\t"
  161451. #endif
  161452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161453. "lsrs r6, r5, #16\n\t"
  161454. #else
  161455. "lsr r6, r5, #16\n\t"
  161456. #endif
  161457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161458. "lsls r5, r5, #16\n\t"
  161459. #else
  161460. "lsl r5, r5, #16\n\t"
  161461. #endif
  161462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161463. "adds r2, r2, r5\n\t"
  161464. #else
  161465. "add r2, r2, r5\n\t"
  161466. #endif
  161467. #ifdef WOLFSSL_KEIL
  161468. "adcs r3, r3, r6\n\t"
  161469. #elif defined(__clang__)
  161470. "adcs r3, r6\n\t"
  161471. #else
  161472. "adc r3, r6\n\t"
  161473. #endif
  161474. #ifdef WOLFSSL_KEIL
  161475. "adcs r4, r4, %[r]\n\t"
  161476. #elif defined(__clang__)
  161477. "adcs r4, %[r]\n\t"
  161478. #else
  161479. "adc r4, %[r]\n\t"
  161480. #endif
  161481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161482. "adds r2, r2, r5\n\t"
  161483. #else
  161484. "add r2, r2, r5\n\t"
  161485. #endif
  161486. #ifdef WOLFSSL_KEIL
  161487. "adcs r3, r3, r6\n\t"
  161488. #elif defined(__clang__)
  161489. "adcs r3, r6\n\t"
  161490. #else
  161491. "adc r3, r6\n\t"
  161492. #endif
  161493. #ifdef WOLFSSL_KEIL
  161494. "adcs r4, r4, %[r]\n\t"
  161495. #elif defined(__clang__)
  161496. "adcs r4, %[r]\n\t"
  161497. #else
  161498. "adc r4, %[r]\n\t"
  161499. #endif
  161500. "# A[9] * A[3]\n\t"
  161501. "mov %[a], r9\n\t"
  161502. "mov r7, lr\n\t"
  161503. "ldr %[a], [%[a], #36]\n\t"
  161504. "uxth r5, %[a]\n\t"
  161505. "uxth r6, r7\n\t"
  161506. #ifdef WOLFSSL_KEIL
  161507. "muls r6, r5, r6\n\t"
  161508. #elif defined(__clang__)
  161509. "muls r6, r5\n\t"
  161510. #else
  161511. "mul r6, r5\n\t"
  161512. #endif
  161513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161514. "adds r2, r2, r6\n\t"
  161515. #else
  161516. "add r2, r2, r6\n\t"
  161517. #endif
  161518. #ifdef WOLFSSL_KEIL
  161519. "adcs r3, r3, %[r]\n\t"
  161520. #elif defined(__clang__)
  161521. "adcs r3, %[r]\n\t"
  161522. #else
  161523. "adc r3, %[r]\n\t"
  161524. #endif
  161525. #ifdef WOLFSSL_KEIL
  161526. "adcs r4, r4, %[r]\n\t"
  161527. #elif defined(__clang__)
  161528. "adcs r4, %[r]\n\t"
  161529. #else
  161530. "adc r4, %[r]\n\t"
  161531. #endif
  161532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161533. "adds r2, r2, r6\n\t"
  161534. #else
  161535. "add r2, r2, r6\n\t"
  161536. #endif
  161537. #ifdef WOLFSSL_KEIL
  161538. "adcs r3, r3, %[r]\n\t"
  161539. #elif defined(__clang__)
  161540. "adcs r3, %[r]\n\t"
  161541. #else
  161542. "adc r3, %[r]\n\t"
  161543. #endif
  161544. #ifdef WOLFSSL_KEIL
  161545. "adcs r4, r4, %[r]\n\t"
  161546. #elif defined(__clang__)
  161547. "adcs r4, %[r]\n\t"
  161548. #else
  161549. "adc r4, %[r]\n\t"
  161550. #endif
  161551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161552. "lsrs r6, r7, #16\n\t"
  161553. #else
  161554. "lsr r6, r7, #16\n\t"
  161555. #endif
  161556. #ifdef WOLFSSL_KEIL
  161557. "muls r5, r6, r5\n\t"
  161558. #elif defined(__clang__)
  161559. "muls r5, r6\n\t"
  161560. #else
  161561. "mul r5, r6\n\t"
  161562. #endif
  161563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161564. "lsrs r6, r5, #16\n\t"
  161565. #else
  161566. "lsr r6, r5, #16\n\t"
  161567. #endif
  161568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161569. "lsls r5, r5, #16\n\t"
  161570. #else
  161571. "lsl r5, r5, #16\n\t"
  161572. #endif
  161573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161574. "adds r2, r2, r5\n\t"
  161575. #else
  161576. "add r2, r2, r5\n\t"
  161577. #endif
  161578. #ifdef WOLFSSL_KEIL
  161579. "adcs r3, r3, r6\n\t"
  161580. #elif defined(__clang__)
  161581. "adcs r3, r6\n\t"
  161582. #else
  161583. "adc r3, r6\n\t"
  161584. #endif
  161585. #ifdef WOLFSSL_KEIL
  161586. "adcs r4, r4, %[r]\n\t"
  161587. #elif defined(__clang__)
  161588. "adcs r4, %[r]\n\t"
  161589. #else
  161590. "adc r4, %[r]\n\t"
  161591. #endif
  161592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161593. "adds r2, r2, r5\n\t"
  161594. #else
  161595. "add r2, r2, r5\n\t"
  161596. #endif
  161597. #ifdef WOLFSSL_KEIL
  161598. "adcs r3, r3, r6\n\t"
  161599. #elif defined(__clang__)
  161600. "adcs r3, r6\n\t"
  161601. #else
  161602. "adc r3, r6\n\t"
  161603. #endif
  161604. #ifdef WOLFSSL_KEIL
  161605. "adcs r4, r4, %[r]\n\t"
  161606. #elif defined(__clang__)
  161607. "adcs r4, %[r]\n\t"
  161608. #else
  161609. "adc r4, %[r]\n\t"
  161610. #endif
  161611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161612. "lsrs r5, %[a], #16\n\t"
  161613. #else
  161614. "lsr r5, %[a], #16\n\t"
  161615. #endif
  161616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161617. "lsrs r6, r7, #16\n\t"
  161618. #else
  161619. "lsr r6, r7, #16\n\t"
  161620. #endif
  161621. #ifdef WOLFSSL_KEIL
  161622. "muls r6, r5, r6\n\t"
  161623. #elif defined(__clang__)
  161624. "muls r6, r5\n\t"
  161625. #else
  161626. "mul r6, r5\n\t"
  161627. #endif
  161628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161629. "adds r3, r3, r6\n\t"
  161630. #else
  161631. "add r3, r3, r6\n\t"
  161632. #endif
  161633. #ifdef WOLFSSL_KEIL
  161634. "adcs r4, r4, %[r]\n\t"
  161635. #elif defined(__clang__)
  161636. "adcs r4, %[r]\n\t"
  161637. #else
  161638. "adc r4, %[r]\n\t"
  161639. #endif
  161640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161641. "adds r3, r3, r6\n\t"
  161642. #else
  161643. "add r3, r3, r6\n\t"
  161644. #endif
  161645. #ifdef WOLFSSL_KEIL
  161646. "adcs r4, r4, %[r]\n\t"
  161647. #elif defined(__clang__)
  161648. "adcs r4, %[r]\n\t"
  161649. #else
  161650. "adc r4, %[r]\n\t"
  161651. #endif
  161652. "uxth r6, r7\n\t"
  161653. #ifdef WOLFSSL_KEIL
  161654. "muls r5, r6, r5\n\t"
  161655. #elif defined(__clang__)
  161656. "muls r5, r6\n\t"
  161657. #else
  161658. "mul r5, r6\n\t"
  161659. #endif
  161660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161661. "lsrs r6, r5, #16\n\t"
  161662. #else
  161663. "lsr r6, r5, #16\n\t"
  161664. #endif
  161665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161666. "lsls r5, r5, #16\n\t"
  161667. #else
  161668. "lsl r5, r5, #16\n\t"
  161669. #endif
  161670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161671. "adds r2, r2, r5\n\t"
  161672. #else
  161673. "add r2, r2, r5\n\t"
  161674. #endif
  161675. #ifdef WOLFSSL_KEIL
  161676. "adcs r3, r3, r6\n\t"
  161677. #elif defined(__clang__)
  161678. "adcs r3, r6\n\t"
  161679. #else
  161680. "adc r3, r6\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. "adds r2, r2, r5\n\t"
  161691. #else
  161692. "add r2, r2, r5\n\t"
  161693. #endif
  161694. #ifdef WOLFSSL_KEIL
  161695. "adcs r3, r3, r6\n\t"
  161696. #elif defined(__clang__)
  161697. "adcs r3, r6\n\t"
  161698. #else
  161699. "adc r3, r6\n\t"
  161700. #endif
  161701. #ifdef WOLFSSL_KEIL
  161702. "adcs r4, r4, %[r]\n\t"
  161703. #elif defined(__clang__)
  161704. "adcs r4, %[r]\n\t"
  161705. #else
  161706. "adc r4, %[r]\n\t"
  161707. #endif
  161708. "# A[8] * A[4]\n\t"
  161709. "mov %[a], r9\n\t"
  161710. "ldr r7, [%[a], #16]\n\t"
  161711. "ldr %[a], [%[a], #32]\n\t"
  161712. "uxth r5, %[a]\n\t"
  161713. "uxth r6, r7\n\t"
  161714. #ifdef WOLFSSL_KEIL
  161715. "muls r6, r5, r6\n\t"
  161716. #elif defined(__clang__)
  161717. "muls r6, r5\n\t"
  161718. #else
  161719. "mul r6, r5\n\t"
  161720. #endif
  161721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161722. "adds r2, r2, r6\n\t"
  161723. #else
  161724. "add r2, r2, r6\n\t"
  161725. #endif
  161726. #ifdef WOLFSSL_KEIL
  161727. "adcs r3, r3, %[r]\n\t"
  161728. #elif defined(__clang__)
  161729. "adcs r3, %[r]\n\t"
  161730. #else
  161731. "adc r3, %[r]\n\t"
  161732. #endif
  161733. #ifdef WOLFSSL_KEIL
  161734. "adcs r4, r4, %[r]\n\t"
  161735. #elif defined(__clang__)
  161736. "adcs r4, %[r]\n\t"
  161737. #else
  161738. "adc r4, %[r]\n\t"
  161739. #endif
  161740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161741. "adds r2, r2, r6\n\t"
  161742. #else
  161743. "add r2, r2, r6\n\t"
  161744. #endif
  161745. #ifdef WOLFSSL_KEIL
  161746. "adcs r3, r3, %[r]\n\t"
  161747. #elif defined(__clang__)
  161748. "adcs r3, %[r]\n\t"
  161749. #else
  161750. "adc r3, %[r]\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161760. "lsrs r6, r7, #16\n\t"
  161761. #else
  161762. "lsr r6, r7, #16\n\t"
  161763. #endif
  161764. #ifdef WOLFSSL_KEIL
  161765. "muls r5, r6, r5\n\t"
  161766. #elif defined(__clang__)
  161767. "muls r5, r6\n\t"
  161768. #else
  161769. "mul r5, r6\n\t"
  161770. #endif
  161771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161772. "lsrs r6, r5, #16\n\t"
  161773. #else
  161774. "lsr r6, r5, #16\n\t"
  161775. #endif
  161776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161777. "lsls r5, r5, #16\n\t"
  161778. #else
  161779. "lsl r5, r5, #16\n\t"
  161780. #endif
  161781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161782. "adds r2, r2, r5\n\t"
  161783. #else
  161784. "add r2, r2, r5\n\t"
  161785. #endif
  161786. #ifdef WOLFSSL_KEIL
  161787. "adcs r3, r3, r6\n\t"
  161788. #elif defined(__clang__)
  161789. "adcs r3, r6\n\t"
  161790. #else
  161791. "adc r3, r6\n\t"
  161792. #endif
  161793. #ifdef WOLFSSL_KEIL
  161794. "adcs r4, r4, %[r]\n\t"
  161795. #elif defined(__clang__)
  161796. "adcs r4, %[r]\n\t"
  161797. #else
  161798. "adc r4, %[r]\n\t"
  161799. #endif
  161800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161801. "adds r2, r2, r5\n\t"
  161802. #else
  161803. "add r2, r2, r5\n\t"
  161804. #endif
  161805. #ifdef WOLFSSL_KEIL
  161806. "adcs r3, r3, r6\n\t"
  161807. #elif defined(__clang__)
  161808. "adcs r3, r6\n\t"
  161809. #else
  161810. "adc r3, r6\n\t"
  161811. #endif
  161812. #ifdef WOLFSSL_KEIL
  161813. "adcs r4, r4, %[r]\n\t"
  161814. #elif defined(__clang__)
  161815. "adcs r4, %[r]\n\t"
  161816. #else
  161817. "adc r4, %[r]\n\t"
  161818. #endif
  161819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161820. "lsrs r5, %[a], #16\n\t"
  161821. #else
  161822. "lsr r5, %[a], #16\n\t"
  161823. #endif
  161824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161825. "lsrs r6, r7, #16\n\t"
  161826. #else
  161827. "lsr r6, r7, #16\n\t"
  161828. #endif
  161829. #ifdef WOLFSSL_KEIL
  161830. "muls r6, r5, r6\n\t"
  161831. #elif defined(__clang__)
  161832. "muls r6, r5\n\t"
  161833. #else
  161834. "mul r6, r5\n\t"
  161835. #endif
  161836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161837. "adds r3, r3, r6\n\t"
  161838. #else
  161839. "add r3, r3, r6\n\t"
  161840. #endif
  161841. #ifdef WOLFSSL_KEIL
  161842. "adcs r4, r4, %[r]\n\t"
  161843. #elif defined(__clang__)
  161844. "adcs r4, %[r]\n\t"
  161845. #else
  161846. "adc r4, %[r]\n\t"
  161847. #endif
  161848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161849. "adds r3, r3, r6\n\t"
  161850. #else
  161851. "add r3, r3, r6\n\t"
  161852. #endif
  161853. #ifdef WOLFSSL_KEIL
  161854. "adcs r4, r4, %[r]\n\t"
  161855. #elif defined(__clang__)
  161856. "adcs r4, %[r]\n\t"
  161857. #else
  161858. "adc r4, %[r]\n\t"
  161859. #endif
  161860. "uxth r6, r7\n\t"
  161861. #ifdef WOLFSSL_KEIL
  161862. "muls r5, r6, r5\n\t"
  161863. #elif defined(__clang__)
  161864. "muls r5, r6\n\t"
  161865. #else
  161866. "mul r5, r6\n\t"
  161867. #endif
  161868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161869. "lsrs r6, r5, #16\n\t"
  161870. #else
  161871. "lsr r6, r5, #16\n\t"
  161872. #endif
  161873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161874. "lsls r5, r5, #16\n\t"
  161875. #else
  161876. "lsl r5, r5, #16\n\t"
  161877. #endif
  161878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161879. "adds r2, r2, r5\n\t"
  161880. #else
  161881. "add r2, r2, r5\n\t"
  161882. #endif
  161883. #ifdef WOLFSSL_KEIL
  161884. "adcs r3, r3, r6\n\t"
  161885. #elif defined(__clang__)
  161886. "adcs r3, r6\n\t"
  161887. #else
  161888. "adc r3, r6\n\t"
  161889. #endif
  161890. #ifdef WOLFSSL_KEIL
  161891. "adcs r4, r4, %[r]\n\t"
  161892. #elif defined(__clang__)
  161893. "adcs r4, %[r]\n\t"
  161894. #else
  161895. "adc r4, %[r]\n\t"
  161896. #endif
  161897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161898. "adds r2, r2, r5\n\t"
  161899. #else
  161900. "add r2, r2, r5\n\t"
  161901. #endif
  161902. #ifdef WOLFSSL_KEIL
  161903. "adcs r3, r3, r6\n\t"
  161904. #elif defined(__clang__)
  161905. "adcs r3, r6\n\t"
  161906. #else
  161907. "adc r3, r6\n\t"
  161908. #endif
  161909. #ifdef WOLFSSL_KEIL
  161910. "adcs r4, r4, %[r]\n\t"
  161911. #elif defined(__clang__)
  161912. "adcs r4, %[r]\n\t"
  161913. #else
  161914. "adc r4, %[r]\n\t"
  161915. #endif
  161916. "# A[7] * A[5]\n\t"
  161917. "mov %[a], r9\n\t"
  161918. "ldr r7, [%[a], #20]\n\t"
  161919. "ldr %[a], [%[a], #28]\n\t"
  161920. "uxth r5, %[a]\n\t"
  161921. "uxth r6, r7\n\t"
  161922. #ifdef WOLFSSL_KEIL
  161923. "muls r6, r5, r6\n\t"
  161924. #elif defined(__clang__)
  161925. "muls r6, r5\n\t"
  161926. #else
  161927. "mul r6, r5\n\t"
  161928. #endif
  161929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161930. "adds r2, r2, r6\n\t"
  161931. #else
  161932. "add r2, r2, r6\n\t"
  161933. #endif
  161934. #ifdef WOLFSSL_KEIL
  161935. "adcs r3, r3, %[r]\n\t"
  161936. #elif defined(__clang__)
  161937. "adcs r3, %[r]\n\t"
  161938. #else
  161939. "adc r3, %[r]\n\t"
  161940. #endif
  161941. #ifdef WOLFSSL_KEIL
  161942. "adcs r4, r4, %[r]\n\t"
  161943. #elif defined(__clang__)
  161944. "adcs r4, %[r]\n\t"
  161945. #else
  161946. "adc r4, %[r]\n\t"
  161947. #endif
  161948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161949. "adds r2, r2, r6\n\t"
  161950. #else
  161951. "add r2, r2, r6\n\t"
  161952. #endif
  161953. #ifdef WOLFSSL_KEIL
  161954. "adcs r3, r3, %[r]\n\t"
  161955. #elif defined(__clang__)
  161956. "adcs r3, %[r]\n\t"
  161957. #else
  161958. "adc r3, %[r]\n\t"
  161959. #endif
  161960. #ifdef WOLFSSL_KEIL
  161961. "adcs r4, r4, %[r]\n\t"
  161962. #elif defined(__clang__)
  161963. "adcs r4, %[r]\n\t"
  161964. #else
  161965. "adc r4, %[r]\n\t"
  161966. #endif
  161967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161968. "lsrs r6, r7, #16\n\t"
  161969. #else
  161970. "lsr r6, r7, #16\n\t"
  161971. #endif
  161972. #ifdef WOLFSSL_KEIL
  161973. "muls r5, r6, r5\n\t"
  161974. #elif defined(__clang__)
  161975. "muls r5, r6\n\t"
  161976. #else
  161977. "mul r5, r6\n\t"
  161978. #endif
  161979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161980. "lsrs r6, r5, #16\n\t"
  161981. #else
  161982. "lsr r6, r5, #16\n\t"
  161983. #endif
  161984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161985. "lsls r5, r5, #16\n\t"
  161986. #else
  161987. "lsl r5, r5, #16\n\t"
  161988. #endif
  161989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161990. "adds r2, r2, r5\n\t"
  161991. #else
  161992. "add r2, r2, r5\n\t"
  161993. #endif
  161994. #ifdef WOLFSSL_KEIL
  161995. "adcs r3, r3, r6\n\t"
  161996. #elif defined(__clang__)
  161997. "adcs r3, r6\n\t"
  161998. #else
  161999. "adc r3, r6\n\t"
  162000. #endif
  162001. #ifdef WOLFSSL_KEIL
  162002. "adcs r4, r4, %[r]\n\t"
  162003. #elif defined(__clang__)
  162004. "adcs r4, %[r]\n\t"
  162005. #else
  162006. "adc r4, %[r]\n\t"
  162007. #endif
  162008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162009. "adds r2, r2, r5\n\t"
  162010. #else
  162011. "add r2, r2, r5\n\t"
  162012. #endif
  162013. #ifdef WOLFSSL_KEIL
  162014. "adcs r3, r3, r6\n\t"
  162015. #elif defined(__clang__)
  162016. "adcs r3, r6\n\t"
  162017. #else
  162018. "adc r3, r6\n\t"
  162019. #endif
  162020. #ifdef WOLFSSL_KEIL
  162021. "adcs r4, r4, %[r]\n\t"
  162022. #elif defined(__clang__)
  162023. "adcs r4, %[r]\n\t"
  162024. #else
  162025. "adc r4, %[r]\n\t"
  162026. #endif
  162027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162028. "lsrs r5, %[a], #16\n\t"
  162029. #else
  162030. "lsr r5, %[a], #16\n\t"
  162031. #endif
  162032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162033. "lsrs r6, r7, #16\n\t"
  162034. #else
  162035. "lsr r6, r7, #16\n\t"
  162036. #endif
  162037. #ifdef WOLFSSL_KEIL
  162038. "muls r6, r5, r6\n\t"
  162039. #elif defined(__clang__)
  162040. "muls r6, r5\n\t"
  162041. #else
  162042. "mul r6, r5\n\t"
  162043. #endif
  162044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162045. "adds r3, r3, r6\n\t"
  162046. #else
  162047. "add r3, r3, r6\n\t"
  162048. #endif
  162049. #ifdef WOLFSSL_KEIL
  162050. "adcs r4, r4, %[r]\n\t"
  162051. #elif defined(__clang__)
  162052. "adcs r4, %[r]\n\t"
  162053. #else
  162054. "adc r4, %[r]\n\t"
  162055. #endif
  162056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162057. "adds r3, r3, r6\n\t"
  162058. #else
  162059. "add r3, r3, r6\n\t"
  162060. #endif
  162061. #ifdef WOLFSSL_KEIL
  162062. "adcs r4, r4, %[r]\n\t"
  162063. #elif defined(__clang__)
  162064. "adcs r4, %[r]\n\t"
  162065. #else
  162066. "adc r4, %[r]\n\t"
  162067. #endif
  162068. "uxth r6, r7\n\t"
  162069. #ifdef WOLFSSL_KEIL
  162070. "muls r5, r6, r5\n\t"
  162071. #elif defined(__clang__)
  162072. "muls r5, r6\n\t"
  162073. #else
  162074. "mul r5, r6\n\t"
  162075. #endif
  162076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162077. "lsrs r6, r5, #16\n\t"
  162078. #else
  162079. "lsr r6, r5, #16\n\t"
  162080. #endif
  162081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162082. "lsls r5, r5, #16\n\t"
  162083. #else
  162084. "lsl r5, r5, #16\n\t"
  162085. #endif
  162086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162087. "adds r2, r2, r5\n\t"
  162088. #else
  162089. "add r2, r2, r5\n\t"
  162090. #endif
  162091. #ifdef WOLFSSL_KEIL
  162092. "adcs r3, r3, r6\n\t"
  162093. #elif defined(__clang__)
  162094. "adcs r3, r6\n\t"
  162095. #else
  162096. "adc r3, r6\n\t"
  162097. #endif
  162098. #ifdef WOLFSSL_KEIL
  162099. "adcs r4, r4, %[r]\n\t"
  162100. #elif defined(__clang__)
  162101. "adcs r4, %[r]\n\t"
  162102. #else
  162103. "adc r4, %[r]\n\t"
  162104. #endif
  162105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162106. "adds r2, r2, r5\n\t"
  162107. #else
  162108. "add r2, r2, r5\n\t"
  162109. #endif
  162110. #ifdef WOLFSSL_KEIL
  162111. "adcs r3, r3, r6\n\t"
  162112. #elif defined(__clang__)
  162113. "adcs r3, r6\n\t"
  162114. #else
  162115. "adc r3, r6\n\t"
  162116. #endif
  162117. #ifdef WOLFSSL_KEIL
  162118. "adcs r4, r4, %[r]\n\t"
  162119. #elif defined(__clang__)
  162120. "adcs r4, %[r]\n\t"
  162121. #else
  162122. "adc r4, %[r]\n\t"
  162123. #endif
  162124. "# A[6] * A[6]\n\t"
  162125. "mov %[a], r9\n\t"
  162126. "ldr r7, [%[a], #24]\n\t"
  162127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162128. "lsrs r6, r7, #16\n\t"
  162129. #else
  162130. "lsr r6, r7, #16\n\t"
  162131. #endif
  162132. "uxth r5, r7\n\t"
  162133. #ifdef WOLFSSL_KEIL
  162134. "muls r5, r5, r5\n\t"
  162135. #elif defined(__clang__)
  162136. "muls r5, r5\n\t"
  162137. #else
  162138. "mul r5, r5\n\t"
  162139. #endif
  162140. #ifdef WOLFSSL_KEIL
  162141. "muls r6, r6, r6\n\t"
  162142. #elif defined(__clang__)
  162143. "muls r6, r6\n\t"
  162144. #else
  162145. "mul r6, r6\n\t"
  162146. #endif
  162147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162148. "adds r2, r2, r5\n\t"
  162149. #else
  162150. "add r2, r2, r5\n\t"
  162151. #endif
  162152. #ifdef WOLFSSL_KEIL
  162153. "adcs r3, r3, r6\n\t"
  162154. #elif defined(__clang__)
  162155. "adcs r3, r6\n\t"
  162156. #else
  162157. "adc r3, r6\n\t"
  162158. #endif
  162159. #ifdef WOLFSSL_KEIL
  162160. "adcs r4, r4, %[r]\n\t"
  162161. #elif defined(__clang__)
  162162. "adcs r4, %[r]\n\t"
  162163. #else
  162164. "adc r4, %[r]\n\t"
  162165. #endif
  162166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162167. "lsrs r6, r7, #16\n\t"
  162168. #else
  162169. "lsr r6, r7, #16\n\t"
  162170. #endif
  162171. "uxth r5, r7\n\t"
  162172. #ifdef WOLFSSL_KEIL
  162173. "muls r5, r6, r5\n\t"
  162174. #elif defined(__clang__)
  162175. "muls r5, r6\n\t"
  162176. #else
  162177. "mul r5, r6\n\t"
  162178. #endif
  162179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162180. "lsrs r6, r5, #15\n\t"
  162181. #else
  162182. "lsr r6, r5, #15\n\t"
  162183. #endif
  162184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162185. "lsls r5, r5, #17\n\t"
  162186. #else
  162187. "lsl r5, r5, #17\n\t"
  162188. #endif
  162189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162190. "adds r2, r2, r5\n\t"
  162191. #else
  162192. "add r2, r2, r5\n\t"
  162193. #endif
  162194. #ifdef WOLFSSL_KEIL
  162195. "adcs r3, r3, r6\n\t"
  162196. #elif defined(__clang__)
  162197. "adcs r3, r6\n\t"
  162198. #else
  162199. "adc r3, r6\n\t"
  162200. #endif
  162201. #ifdef WOLFSSL_KEIL
  162202. "adcs r4, r4, %[r]\n\t"
  162203. #elif defined(__clang__)
  162204. "adcs r4, %[r]\n\t"
  162205. #else
  162206. "adc r4, %[r]\n\t"
  162207. #endif
  162208. "str r2, [sp, #48]\n\t"
  162209. "# A[7] * A[6]\n\t"
  162210. "movs r2, #0\n\t"
  162211. "ldr %[a], [%[a], #28]\n\t"
  162212. "uxth r5, %[a]\n\t"
  162213. "uxth r6, r7\n\t"
  162214. #ifdef WOLFSSL_KEIL
  162215. "muls r6, r5, r6\n\t"
  162216. #elif defined(__clang__)
  162217. "muls r6, r5\n\t"
  162218. #else
  162219. "mul r6, r5\n\t"
  162220. #endif
  162221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162222. "adds r3, r3, r6\n\t"
  162223. #else
  162224. "add r3, r3, r6\n\t"
  162225. #endif
  162226. #ifdef WOLFSSL_KEIL
  162227. "adcs r4, r4, %[r]\n\t"
  162228. #elif defined(__clang__)
  162229. "adcs r4, %[r]\n\t"
  162230. #else
  162231. "adc r4, %[r]\n\t"
  162232. #endif
  162233. #ifdef WOLFSSL_KEIL
  162234. "adcs r2, r2, %[r]\n\t"
  162235. #elif defined(__clang__)
  162236. "adcs r2, %[r]\n\t"
  162237. #else
  162238. "adc r2, %[r]\n\t"
  162239. #endif
  162240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162241. "adds r3, r3, r6\n\t"
  162242. #else
  162243. "add r3, r3, r6\n\t"
  162244. #endif
  162245. #ifdef WOLFSSL_KEIL
  162246. "adcs r4, r4, %[r]\n\t"
  162247. #elif defined(__clang__)
  162248. "adcs r4, %[r]\n\t"
  162249. #else
  162250. "adc r4, %[r]\n\t"
  162251. #endif
  162252. #ifdef WOLFSSL_KEIL
  162253. "adcs r2, r2, %[r]\n\t"
  162254. #elif defined(__clang__)
  162255. "adcs r2, %[r]\n\t"
  162256. #else
  162257. "adc r2, %[r]\n\t"
  162258. #endif
  162259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162260. "lsrs r6, r7, #16\n\t"
  162261. #else
  162262. "lsr r6, r7, #16\n\t"
  162263. #endif
  162264. #ifdef WOLFSSL_KEIL
  162265. "muls r5, r6, r5\n\t"
  162266. #elif defined(__clang__)
  162267. "muls r5, r6\n\t"
  162268. #else
  162269. "mul r5, r6\n\t"
  162270. #endif
  162271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162272. "lsrs r6, r5, #16\n\t"
  162273. #else
  162274. "lsr r6, r5, #16\n\t"
  162275. #endif
  162276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162277. "lsls r5, r5, #16\n\t"
  162278. #else
  162279. "lsl r5, r5, #16\n\t"
  162280. #endif
  162281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162282. "adds r3, r3, r5\n\t"
  162283. #else
  162284. "add r3, r3, r5\n\t"
  162285. #endif
  162286. #ifdef WOLFSSL_KEIL
  162287. "adcs r4, r4, r6\n\t"
  162288. #elif defined(__clang__)
  162289. "adcs r4, r6\n\t"
  162290. #else
  162291. "adc r4, r6\n\t"
  162292. #endif
  162293. #ifdef WOLFSSL_KEIL
  162294. "adcs r2, r2, %[r]\n\t"
  162295. #elif defined(__clang__)
  162296. "adcs r2, %[r]\n\t"
  162297. #else
  162298. "adc r2, %[r]\n\t"
  162299. #endif
  162300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162301. "adds r3, r3, r5\n\t"
  162302. #else
  162303. "add r3, r3, r5\n\t"
  162304. #endif
  162305. #ifdef WOLFSSL_KEIL
  162306. "adcs r4, r4, r6\n\t"
  162307. #elif defined(__clang__)
  162308. "adcs r4, r6\n\t"
  162309. #else
  162310. "adc r4, r6\n\t"
  162311. #endif
  162312. #ifdef WOLFSSL_KEIL
  162313. "adcs r2, r2, %[r]\n\t"
  162314. #elif defined(__clang__)
  162315. "adcs r2, %[r]\n\t"
  162316. #else
  162317. "adc r2, %[r]\n\t"
  162318. #endif
  162319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162320. "lsrs r5, %[a], #16\n\t"
  162321. #else
  162322. "lsr r5, %[a], #16\n\t"
  162323. #endif
  162324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162325. "lsrs r6, r7, #16\n\t"
  162326. #else
  162327. "lsr r6, r7, #16\n\t"
  162328. #endif
  162329. #ifdef WOLFSSL_KEIL
  162330. "muls r6, r5, r6\n\t"
  162331. #elif defined(__clang__)
  162332. "muls r6, r5\n\t"
  162333. #else
  162334. "mul r6, r5\n\t"
  162335. #endif
  162336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162337. "adds r4, r4, r6\n\t"
  162338. #else
  162339. "add r4, r4, r6\n\t"
  162340. #endif
  162341. #ifdef WOLFSSL_KEIL
  162342. "adcs r2, r2, %[r]\n\t"
  162343. #elif defined(__clang__)
  162344. "adcs r2, %[r]\n\t"
  162345. #else
  162346. "adc r2, %[r]\n\t"
  162347. #endif
  162348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162349. "adds r4, r4, r6\n\t"
  162350. #else
  162351. "add r4, r4, r6\n\t"
  162352. #endif
  162353. #ifdef WOLFSSL_KEIL
  162354. "adcs r2, r2, %[r]\n\t"
  162355. #elif defined(__clang__)
  162356. "adcs r2, %[r]\n\t"
  162357. #else
  162358. "adc r2, %[r]\n\t"
  162359. #endif
  162360. "uxth r6, r7\n\t"
  162361. #ifdef WOLFSSL_KEIL
  162362. "muls r5, r6, r5\n\t"
  162363. #elif defined(__clang__)
  162364. "muls r5, r6\n\t"
  162365. #else
  162366. "mul r5, r6\n\t"
  162367. #endif
  162368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162369. "lsrs r6, r5, #16\n\t"
  162370. #else
  162371. "lsr r6, r5, #16\n\t"
  162372. #endif
  162373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162374. "lsls r5, r5, #16\n\t"
  162375. #else
  162376. "lsl r5, r5, #16\n\t"
  162377. #endif
  162378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162379. "adds r3, r3, r5\n\t"
  162380. #else
  162381. "add r3, r3, r5\n\t"
  162382. #endif
  162383. #ifdef WOLFSSL_KEIL
  162384. "adcs r4, r4, r6\n\t"
  162385. #elif defined(__clang__)
  162386. "adcs r4, r6\n\t"
  162387. #else
  162388. "adc r4, r6\n\t"
  162389. #endif
  162390. #ifdef WOLFSSL_KEIL
  162391. "adcs r2, r2, %[r]\n\t"
  162392. #elif defined(__clang__)
  162393. "adcs r2, %[r]\n\t"
  162394. #else
  162395. "adc r2, %[r]\n\t"
  162396. #endif
  162397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162398. "adds r3, r3, r5\n\t"
  162399. #else
  162400. "add r3, r3, r5\n\t"
  162401. #endif
  162402. #ifdef WOLFSSL_KEIL
  162403. "adcs r4, r4, r6\n\t"
  162404. #elif defined(__clang__)
  162405. "adcs r4, r6\n\t"
  162406. #else
  162407. "adc r4, r6\n\t"
  162408. #endif
  162409. #ifdef WOLFSSL_KEIL
  162410. "adcs r2, r2, %[r]\n\t"
  162411. #elif defined(__clang__)
  162412. "adcs r2, %[r]\n\t"
  162413. #else
  162414. "adc r2, %[r]\n\t"
  162415. #endif
  162416. "# A[8] * A[5]\n\t"
  162417. "mov %[a], r9\n\t"
  162418. "ldr r7, [%[a], #20]\n\t"
  162419. "ldr %[a], [%[a], #32]\n\t"
  162420. "uxth r5, %[a]\n\t"
  162421. "uxth r6, r7\n\t"
  162422. #ifdef WOLFSSL_KEIL
  162423. "muls r6, r5, r6\n\t"
  162424. #elif defined(__clang__)
  162425. "muls r6, r5\n\t"
  162426. #else
  162427. "mul r6, r5\n\t"
  162428. #endif
  162429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162430. "adds r3, r3, r6\n\t"
  162431. #else
  162432. "add r3, r3, r6\n\t"
  162433. #endif
  162434. #ifdef WOLFSSL_KEIL
  162435. "adcs r4, r4, %[r]\n\t"
  162436. #elif defined(__clang__)
  162437. "adcs r4, %[r]\n\t"
  162438. #else
  162439. "adc r4, %[r]\n\t"
  162440. #endif
  162441. #ifdef WOLFSSL_KEIL
  162442. "adcs r2, r2, %[r]\n\t"
  162443. #elif defined(__clang__)
  162444. "adcs r2, %[r]\n\t"
  162445. #else
  162446. "adc r2, %[r]\n\t"
  162447. #endif
  162448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162449. "adds r3, r3, r6\n\t"
  162450. #else
  162451. "add r3, r3, r6\n\t"
  162452. #endif
  162453. #ifdef WOLFSSL_KEIL
  162454. "adcs r4, r4, %[r]\n\t"
  162455. #elif defined(__clang__)
  162456. "adcs r4, %[r]\n\t"
  162457. #else
  162458. "adc r4, %[r]\n\t"
  162459. #endif
  162460. #ifdef WOLFSSL_KEIL
  162461. "adcs r2, r2, %[r]\n\t"
  162462. #elif defined(__clang__)
  162463. "adcs r2, %[r]\n\t"
  162464. #else
  162465. "adc r2, %[r]\n\t"
  162466. #endif
  162467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162468. "lsrs r6, r7, #16\n\t"
  162469. #else
  162470. "lsr r6, r7, #16\n\t"
  162471. #endif
  162472. #ifdef WOLFSSL_KEIL
  162473. "muls r5, r6, r5\n\t"
  162474. #elif defined(__clang__)
  162475. "muls r5, r6\n\t"
  162476. #else
  162477. "mul r5, r6\n\t"
  162478. #endif
  162479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162480. "lsrs r6, r5, #16\n\t"
  162481. #else
  162482. "lsr r6, r5, #16\n\t"
  162483. #endif
  162484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162485. "lsls r5, r5, #16\n\t"
  162486. #else
  162487. "lsl r5, r5, #16\n\t"
  162488. #endif
  162489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162490. "adds r3, r3, r5\n\t"
  162491. #else
  162492. "add r3, r3, r5\n\t"
  162493. #endif
  162494. #ifdef WOLFSSL_KEIL
  162495. "adcs r4, r4, r6\n\t"
  162496. #elif defined(__clang__)
  162497. "adcs r4, r6\n\t"
  162498. #else
  162499. "adc r4, r6\n\t"
  162500. #endif
  162501. #ifdef WOLFSSL_KEIL
  162502. "adcs r2, r2, %[r]\n\t"
  162503. #elif defined(__clang__)
  162504. "adcs r2, %[r]\n\t"
  162505. #else
  162506. "adc r2, %[r]\n\t"
  162507. #endif
  162508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162509. "adds r3, r3, r5\n\t"
  162510. #else
  162511. "add r3, r3, r5\n\t"
  162512. #endif
  162513. #ifdef WOLFSSL_KEIL
  162514. "adcs r4, r4, r6\n\t"
  162515. #elif defined(__clang__)
  162516. "adcs r4, r6\n\t"
  162517. #else
  162518. "adc r4, r6\n\t"
  162519. #endif
  162520. #ifdef WOLFSSL_KEIL
  162521. "adcs r2, r2, %[r]\n\t"
  162522. #elif defined(__clang__)
  162523. "adcs r2, %[r]\n\t"
  162524. #else
  162525. "adc r2, %[r]\n\t"
  162526. #endif
  162527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162528. "lsrs r5, %[a], #16\n\t"
  162529. #else
  162530. "lsr r5, %[a], #16\n\t"
  162531. #endif
  162532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162533. "lsrs r6, r7, #16\n\t"
  162534. #else
  162535. "lsr r6, r7, #16\n\t"
  162536. #endif
  162537. #ifdef WOLFSSL_KEIL
  162538. "muls r6, r5, r6\n\t"
  162539. #elif defined(__clang__)
  162540. "muls r6, r5\n\t"
  162541. #else
  162542. "mul r6, r5\n\t"
  162543. #endif
  162544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162545. "adds r4, r4, r6\n\t"
  162546. #else
  162547. "add r4, r4, r6\n\t"
  162548. #endif
  162549. #ifdef WOLFSSL_KEIL
  162550. "adcs r2, r2, %[r]\n\t"
  162551. #elif defined(__clang__)
  162552. "adcs r2, %[r]\n\t"
  162553. #else
  162554. "adc r2, %[r]\n\t"
  162555. #endif
  162556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162557. "adds r4, r4, r6\n\t"
  162558. #else
  162559. "add r4, r4, r6\n\t"
  162560. #endif
  162561. #ifdef WOLFSSL_KEIL
  162562. "adcs r2, r2, %[r]\n\t"
  162563. #elif defined(__clang__)
  162564. "adcs r2, %[r]\n\t"
  162565. #else
  162566. "adc r2, %[r]\n\t"
  162567. #endif
  162568. "uxth r6, r7\n\t"
  162569. #ifdef WOLFSSL_KEIL
  162570. "muls r5, r6, r5\n\t"
  162571. #elif defined(__clang__)
  162572. "muls r5, r6\n\t"
  162573. #else
  162574. "mul r5, r6\n\t"
  162575. #endif
  162576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162577. "lsrs r6, r5, #16\n\t"
  162578. #else
  162579. "lsr r6, r5, #16\n\t"
  162580. #endif
  162581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162582. "lsls r5, r5, #16\n\t"
  162583. #else
  162584. "lsl r5, r5, #16\n\t"
  162585. #endif
  162586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162587. "adds r3, r3, r5\n\t"
  162588. #else
  162589. "add r3, r3, r5\n\t"
  162590. #endif
  162591. #ifdef WOLFSSL_KEIL
  162592. "adcs r4, r4, r6\n\t"
  162593. #elif defined(__clang__)
  162594. "adcs r4, r6\n\t"
  162595. #else
  162596. "adc r4, r6\n\t"
  162597. #endif
  162598. #ifdef WOLFSSL_KEIL
  162599. "adcs r2, r2, %[r]\n\t"
  162600. #elif defined(__clang__)
  162601. "adcs r2, %[r]\n\t"
  162602. #else
  162603. "adc r2, %[r]\n\t"
  162604. #endif
  162605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162606. "adds r3, r3, r5\n\t"
  162607. #else
  162608. "add r3, r3, r5\n\t"
  162609. #endif
  162610. #ifdef WOLFSSL_KEIL
  162611. "adcs r4, r4, r6\n\t"
  162612. #elif defined(__clang__)
  162613. "adcs r4, r6\n\t"
  162614. #else
  162615. "adc r4, r6\n\t"
  162616. #endif
  162617. #ifdef WOLFSSL_KEIL
  162618. "adcs r2, r2, %[r]\n\t"
  162619. #elif defined(__clang__)
  162620. "adcs r2, %[r]\n\t"
  162621. #else
  162622. "adc r2, %[r]\n\t"
  162623. #endif
  162624. "# A[9] * A[4]\n\t"
  162625. "mov %[a], r9\n\t"
  162626. "ldr r7, [%[a], #16]\n\t"
  162627. "ldr %[a], [%[a], #36]\n\t"
  162628. "uxth r5, %[a]\n\t"
  162629. "uxth r6, r7\n\t"
  162630. #ifdef WOLFSSL_KEIL
  162631. "muls r6, r5, r6\n\t"
  162632. #elif defined(__clang__)
  162633. "muls r6, r5\n\t"
  162634. #else
  162635. "mul r6, r5\n\t"
  162636. #endif
  162637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162638. "adds r3, r3, r6\n\t"
  162639. #else
  162640. "add r3, r3, r6\n\t"
  162641. #endif
  162642. #ifdef WOLFSSL_KEIL
  162643. "adcs r4, r4, %[r]\n\t"
  162644. #elif defined(__clang__)
  162645. "adcs r4, %[r]\n\t"
  162646. #else
  162647. "adc r4, %[r]\n\t"
  162648. #endif
  162649. #ifdef WOLFSSL_KEIL
  162650. "adcs r2, r2, %[r]\n\t"
  162651. #elif defined(__clang__)
  162652. "adcs r2, %[r]\n\t"
  162653. #else
  162654. "adc r2, %[r]\n\t"
  162655. #endif
  162656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162657. "adds r3, r3, r6\n\t"
  162658. #else
  162659. "add r3, r3, r6\n\t"
  162660. #endif
  162661. #ifdef WOLFSSL_KEIL
  162662. "adcs r4, r4, %[r]\n\t"
  162663. #elif defined(__clang__)
  162664. "adcs r4, %[r]\n\t"
  162665. #else
  162666. "adc r4, %[r]\n\t"
  162667. #endif
  162668. #ifdef WOLFSSL_KEIL
  162669. "adcs r2, r2, %[r]\n\t"
  162670. #elif defined(__clang__)
  162671. "adcs r2, %[r]\n\t"
  162672. #else
  162673. "adc r2, %[r]\n\t"
  162674. #endif
  162675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162676. "lsrs r6, r7, #16\n\t"
  162677. #else
  162678. "lsr r6, r7, #16\n\t"
  162679. #endif
  162680. #ifdef WOLFSSL_KEIL
  162681. "muls r5, r6, r5\n\t"
  162682. #elif defined(__clang__)
  162683. "muls r5, r6\n\t"
  162684. #else
  162685. "mul r5, r6\n\t"
  162686. #endif
  162687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162688. "lsrs r6, r5, #16\n\t"
  162689. #else
  162690. "lsr r6, r5, #16\n\t"
  162691. #endif
  162692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162693. "lsls r5, r5, #16\n\t"
  162694. #else
  162695. "lsl r5, r5, #16\n\t"
  162696. #endif
  162697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162698. "adds r3, r3, r5\n\t"
  162699. #else
  162700. "add r3, r3, r5\n\t"
  162701. #endif
  162702. #ifdef WOLFSSL_KEIL
  162703. "adcs r4, r4, r6\n\t"
  162704. #elif defined(__clang__)
  162705. "adcs r4, r6\n\t"
  162706. #else
  162707. "adc r4, r6\n\t"
  162708. #endif
  162709. #ifdef WOLFSSL_KEIL
  162710. "adcs r2, r2, %[r]\n\t"
  162711. #elif defined(__clang__)
  162712. "adcs r2, %[r]\n\t"
  162713. #else
  162714. "adc r2, %[r]\n\t"
  162715. #endif
  162716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162717. "adds r3, r3, r5\n\t"
  162718. #else
  162719. "add r3, r3, r5\n\t"
  162720. #endif
  162721. #ifdef WOLFSSL_KEIL
  162722. "adcs r4, r4, r6\n\t"
  162723. #elif defined(__clang__)
  162724. "adcs r4, r6\n\t"
  162725. #else
  162726. "adc r4, r6\n\t"
  162727. #endif
  162728. #ifdef WOLFSSL_KEIL
  162729. "adcs r2, r2, %[r]\n\t"
  162730. #elif defined(__clang__)
  162731. "adcs r2, %[r]\n\t"
  162732. #else
  162733. "adc r2, %[r]\n\t"
  162734. #endif
  162735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162736. "lsrs r5, %[a], #16\n\t"
  162737. #else
  162738. "lsr r5, %[a], #16\n\t"
  162739. #endif
  162740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162741. "lsrs r6, r7, #16\n\t"
  162742. #else
  162743. "lsr r6, r7, #16\n\t"
  162744. #endif
  162745. #ifdef WOLFSSL_KEIL
  162746. "muls r6, r5, r6\n\t"
  162747. #elif defined(__clang__)
  162748. "muls r6, r5\n\t"
  162749. #else
  162750. "mul r6, r5\n\t"
  162751. #endif
  162752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162753. "adds r4, r4, r6\n\t"
  162754. #else
  162755. "add r4, r4, r6\n\t"
  162756. #endif
  162757. #ifdef WOLFSSL_KEIL
  162758. "adcs r2, r2, %[r]\n\t"
  162759. #elif defined(__clang__)
  162760. "adcs r2, %[r]\n\t"
  162761. #else
  162762. "adc r2, %[r]\n\t"
  162763. #endif
  162764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162765. "adds r4, r4, r6\n\t"
  162766. #else
  162767. "add r4, r4, r6\n\t"
  162768. #endif
  162769. #ifdef WOLFSSL_KEIL
  162770. "adcs r2, r2, %[r]\n\t"
  162771. #elif defined(__clang__)
  162772. "adcs r2, %[r]\n\t"
  162773. #else
  162774. "adc r2, %[r]\n\t"
  162775. #endif
  162776. "uxth r6, r7\n\t"
  162777. #ifdef WOLFSSL_KEIL
  162778. "muls r5, r6, r5\n\t"
  162779. #elif defined(__clang__)
  162780. "muls r5, r6\n\t"
  162781. #else
  162782. "mul r5, r6\n\t"
  162783. #endif
  162784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162785. "lsrs r6, r5, #16\n\t"
  162786. #else
  162787. "lsr r6, r5, #16\n\t"
  162788. #endif
  162789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162790. "lsls r5, r5, #16\n\t"
  162791. #else
  162792. "lsl r5, r5, #16\n\t"
  162793. #endif
  162794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162795. "adds r3, r3, r5\n\t"
  162796. #else
  162797. "add r3, r3, r5\n\t"
  162798. #endif
  162799. #ifdef WOLFSSL_KEIL
  162800. "adcs r4, r4, r6\n\t"
  162801. #elif defined(__clang__)
  162802. "adcs r4, r6\n\t"
  162803. #else
  162804. "adc r4, r6\n\t"
  162805. #endif
  162806. #ifdef WOLFSSL_KEIL
  162807. "adcs r2, r2, %[r]\n\t"
  162808. #elif defined(__clang__)
  162809. "adcs r2, %[r]\n\t"
  162810. #else
  162811. "adc r2, %[r]\n\t"
  162812. #endif
  162813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162814. "adds r3, r3, r5\n\t"
  162815. #else
  162816. "add r3, r3, r5\n\t"
  162817. #endif
  162818. #ifdef WOLFSSL_KEIL
  162819. "adcs r4, r4, r6\n\t"
  162820. #elif defined(__clang__)
  162821. "adcs r4, r6\n\t"
  162822. #else
  162823. "adc r4, r6\n\t"
  162824. #endif
  162825. #ifdef WOLFSSL_KEIL
  162826. "adcs r2, r2, %[r]\n\t"
  162827. #elif defined(__clang__)
  162828. "adcs r2, %[r]\n\t"
  162829. #else
  162830. "adc r2, %[r]\n\t"
  162831. #endif
  162832. "# A[10] * A[3]\n\t"
  162833. "mov %[a], r9\n\t"
  162834. "mov r7, lr\n\t"
  162835. "ldr %[a], [%[a], #40]\n\t"
  162836. "uxth r5, %[a]\n\t"
  162837. "uxth r6, r7\n\t"
  162838. #ifdef WOLFSSL_KEIL
  162839. "muls r6, r5, r6\n\t"
  162840. #elif defined(__clang__)
  162841. "muls r6, r5\n\t"
  162842. #else
  162843. "mul r6, r5\n\t"
  162844. #endif
  162845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162846. "adds r3, r3, r6\n\t"
  162847. #else
  162848. "add r3, r3, r6\n\t"
  162849. #endif
  162850. #ifdef WOLFSSL_KEIL
  162851. "adcs r4, r4, %[r]\n\t"
  162852. #elif defined(__clang__)
  162853. "adcs r4, %[r]\n\t"
  162854. #else
  162855. "adc r4, %[r]\n\t"
  162856. #endif
  162857. #ifdef WOLFSSL_KEIL
  162858. "adcs r2, r2, %[r]\n\t"
  162859. #elif defined(__clang__)
  162860. "adcs r2, %[r]\n\t"
  162861. #else
  162862. "adc r2, %[r]\n\t"
  162863. #endif
  162864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162865. "adds r3, r3, r6\n\t"
  162866. #else
  162867. "add r3, r3, r6\n\t"
  162868. #endif
  162869. #ifdef WOLFSSL_KEIL
  162870. "adcs r4, r4, %[r]\n\t"
  162871. #elif defined(__clang__)
  162872. "adcs r4, %[r]\n\t"
  162873. #else
  162874. "adc r4, %[r]\n\t"
  162875. #endif
  162876. #ifdef WOLFSSL_KEIL
  162877. "adcs r2, r2, %[r]\n\t"
  162878. #elif defined(__clang__)
  162879. "adcs r2, %[r]\n\t"
  162880. #else
  162881. "adc r2, %[r]\n\t"
  162882. #endif
  162883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162884. "lsrs r6, r7, #16\n\t"
  162885. #else
  162886. "lsr r6, r7, #16\n\t"
  162887. #endif
  162888. #ifdef WOLFSSL_KEIL
  162889. "muls r5, r6, r5\n\t"
  162890. #elif defined(__clang__)
  162891. "muls r5, r6\n\t"
  162892. #else
  162893. "mul r5, r6\n\t"
  162894. #endif
  162895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162896. "lsrs r6, r5, #16\n\t"
  162897. #else
  162898. "lsr r6, r5, #16\n\t"
  162899. #endif
  162900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162901. "lsls r5, r5, #16\n\t"
  162902. #else
  162903. "lsl r5, r5, #16\n\t"
  162904. #endif
  162905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162906. "adds r3, r3, r5\n\t"
  162907. #else
  162908. "add r3, r3, r5\n\t"
  162909. #endif
  162910. #ifdef WOLFSSL_KEIL
  162911. "adcs r4, r4, r6\n\t"
  162912. #elif defined(__clang__)
  162913. "adcs r4, r6\n\t"
  162914. #else
  162915. "adc r4, r6\n\t"
  162916. #endif
  162917. #ifdef WOLFSSL_KEIL
  162918. "adcs r2, r2, %[r]\n\t"
  162919. #elif defined(__clang__)
  162920. "adcs r2, %[r]\n\t"
  162921. #else
  162922. "adc r2, %[r]\n\t"
  162923. #endif
  162924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162925. "adds r3, r3, r5\n\t"
  162926. #else
  162927. "add r3, r3, r5\n\t"
  162928. #endif
  162929. #ifdef WOLFSSL_KEIL
  162930. "adcs r4, r4, r6\n\t"
  162931. #elif defined(__clang__)
  162932. "adcs r4, r6\n\t"
  162933. #else
  162934. "adc r4, r6\n\t"
  162935. #endif
  162936. #ifdef WOLFSSL_KEIL
  162937. "adcs r2, r2, %[r]\n\t"
  162938. #elif defined(__clang__)
  162939. "adcs r2, %[r]\n\t"
  162940. #else
  162941. "adc r2, %[r]\n\t"
  162942. #endif
  162943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162944. "lsrs r5, %[a], #16\n\t"
  162945. #else
  162946. "lsr r5, %[a], #16\n\t"
  162947. #endif
  162948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162949. "lsrs r6, r7, #16\n\t"
  162950. #else
  162951. "lsr r6, r7, #16\n\t"
  162952. #endif
  162953. #ifdef WOLFSSL_KEIL
  162954. "muls r6, r5, r6\n\t"
  162955. #elif defined(__clang__)
  162956. "muls r6, r5\n\t"
  162957. #else
  162958. "mul r6, r5\n\t"
  162959. #endif
  162960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162961. "adds r4, r4, r6\n\t"
  162962. #else
  162963. "add r4, r4, r6\n\t"
  162964. #endif
  162965. #ifdef WOLFSSL_KEIL
  162966. "adcs r2, r2, %[r]\n\t"
  162967. #elif defined(__clang__)
  162968. "adcs r2, %[r]\n\t"
  162969. #else
  162970. "adc r2, %[r]\n\t"
  162971. #endif
  162972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162973. "adds r4, r4, r6\n\t"
  162974. #else
  162975. "add r4, r4, r6\n\t"
  162976. #endif
  162977. #ifdef WOLFSSL_KEIL
  162978. "adcs r2, r2, %[r]\n\t"
  162979. #elif defined(__clang__)
  162980. "adcs r2, %[r]\n\t"
  162981. #else
  162982. "adc r2, %[r]\n\t"
  162983. #endif
  162984. "uxth r6, r7\n\t"
  162985. #ifdef WOLFSSL_KEIL
  162986. "muls r5, r6, r5\n\t"
  162987. #elif defined(__clang__)
  162988. "muls r5, r6\n\t"
  162989. #else
  162990. "mul r5, r6\n\t"
  162991. #endif
  162992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162993. "lsrs r6, r5, #16\n\t"
  162994. #else
  162995. "lsr r6, r5, #16\n\t"
  162996. #endif
  162997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162998. "lsls r5, r5, #16\n\t"
  162999. #else
  163000. "lsl r5, r5, #16\n\t"
  163001. #endif
  163002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163003. "adds r3, r3, r5\n\t"
  163004. #else
  163005. "add r3, r3, r5\n\t"
  163006. #endif
  163007. #ifdef WOLFSSL_KEIL
  163008. "adcs r4, r4, r6\n\t"
  163009. #elif defined(__clang__)
  163010. "adcs r4, r6\n\t"
  163011. #else
  163012. "adc r4, r6\n\t"
  163013. #endif
  163014. #ifdef WOLFSSL_KEIL
  163015. "adcs r2, r2, %[r]\n\t"
  163016. #elif defined(__clang__)
  163017. "adcs r2, %[r]\n\t"
  163018. #else
  163019. "adc r2, %[r]\n\t"
  163020. #endif
  163021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163022. "adds r3, r3, r5\n\t"
  163023. #else
  163024. "add r3, r3, r5\n\t"
  163025. #endif
  163026. #ifdef WOLFSSL_KEIL
  163027. "adcs r4, r4, r6\n\t"
  163028. #elif defined(__clang__)
  163029. "adcs r4, r6\n\t"
  163030. #else
  163031. "adc r4, r6\n\t"
  163032. #endif
  163033. #ifdef WOLFSSL_KEIL
  163034. "adcs r2, r2, %[r]\n\t"
  163035. #elif defined(__clang__)
  163036. "adcs r2, %[r]\n\t"
  163037. #else
  163038. "adc r2, %[r]\n\t"
  163039. #endif
  163040. "# A[11] * A[2]\n\t"
  163041. "mov %[a], r9\n\t"
  163042. "mov r7, r12\n\t"
  163043. "ldr %[a], [%[a], #44]\n\t"
  163044. "uxth r5, %[a]\n\t"
  163045. "uxth r6, r7\n\t"
  163046. #ifdef WOLFSSL_KEIL
  163047. "muls r6, r5, r6\n\t"
  163048. #elif defined(__clang__)
  163049. "muls r6, r5\n\t"
  163050. #else
  163051. "mul r6, r5\n\t"
  163052. #endif
  163053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163054. "adds r3, r3, r6\n\t"
  163055. #else
  163056. "add r3, r3, r6\n\t"
  163057. #endif
  163058. #ifdef WOLFSSL_KEIL
  163059. "adcs r4, r4, %[r]\n\t"
  163060. #elif defined(__clang__)
  163061. "adcs r4, %[r]\n\t"
  163062. #else
  163063. "adc r4, %[r]\n\t"
  163064. #endif
  163065. #ifdef WOLFSSL_KEIL
  163066. "adcs r2, r2, %[r]\n\t"
  163067. #elif defined(__clang__)
  163068. "adcs r2, %[r]\n\t"
  163069. #else
  163070. "adc r2, %[r]\n\t"
  163071. #endif
  163072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163073. "adds r3, r3, r6\n\t"
  163074. #else
  163075. "add r3, r3, r6\n\t"
  163076. #endif
  163077. #ifdef WOLFSSL_KEIL
  163078. "adcs r4, r4, %[r]\n\t"
  163079. #elif defined(__clang__)
  163080. "adcs r4, %[r]\n\t"
  163081. #else
  163082. "adc r4, %[r]\n\t"
  163083. #endif
  163084. #ifdef WOLFSSL_KEIL
  163085. "adcs r2, r2, %[r]\n\t"
  163086. #elif defined(__clang__)
  163087. "adcs r2, %[r]\n\t"
  163088. #else
  163089. "adc r2, %[r]\n\t"
  163090. #endif
  163091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163092. "lsrs r6, r7, #16\n\t"
  163093. #else
  163094. "lsr r6, r7, #16\n\t"
  163095. #endif
  163096. #ifdef WOLFSSL_KEIL
  163097. "muls r5, r6, r5\n\t"
  163098. #elif defined(__clang__)
  163099. "muls r5, r6\n\t"
  163100. #else
  163101. "mul r5, r6\n\t"
  163102. #endif
  163103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163104. "lsrs r6, r5, #16\n\t"
  163105. #else
  163106. "lsr r6, r5, #16\n\t"
  163107. #endif
  163108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163109. "lsls r5, r5, #16\n\t"
  163110. #else
  163111. "lsl r5, r5, #16\n\t"
  163112. #endif
  163113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163114. "adds r3, r3, r5\n\t"
  163115. #else
  163116. "add r3, r3, r5\n\t"
  163117. #endif
  163118. #ifdef WOLFSSL_KEIL
  163119. "adcs r4, r4, r6\n\t"
  163120. #elif defined(__clang__)
  163121. "adcs r4, r6\n\t"
  163122. #else
  163123. "adc r4, r6\n\t"
  163124. #endif
  163125. #ifdef WOLFSSL_KEIL
  163126. "adcs r2, r2, %[r]\n\t"
  163127. #elif defined(__clang__)
  163128. "adcs r2, %[r]\n\t"
  163129. #else
  163130. "adc r2, %[r]\n\t"
  163131. #endif
  163132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163133. "adds r3, r3, r5\n\t"
  163134. #else
  163135. "add r3, r3, r5\n\t"
  163136. #endif
  163137. #ifdef WOLFSSL_KEIL
  163138. "adcs r4, r4, r6\n\t"
  163139. #elif defined(__clang__)
  163140. "adcs r4, r6\n\t"
  163141. #else
  163142. "adc r4, r6\n\t"
  163143. #endif
  163144. #ifdef WOLFSSL_KEIL
  163145. "adcs r2, r2, %[r]\n\t"
  163146. #elif defined(__clang__)
  163147. "adcs r2, %[r]\n\t"
  163148. #else
  163149. "adc r2, %[r]\n\t"
  163150. #endif
  163151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163152. "lsrs r5, %[a], #16\n\t"
  163153. #else
  163154. "lsr r5, %[a], #16\n\t"
  163155. #endif
  163156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163157. "lsrs r6, r7, #16\n\t"
  163158. #else
  163159. "lsr r6, r7, #16\n\t"
  163160. #endif
  163161. #ifdef WOLFSSL_KEIL
  163162. "muls r6, r5, r6\n\t"
  163163. #elif defined(__clang__)
  163164. "muls r6, r5\n\t"
  163165. #else
  163166. "mul r6, r5\n\t"
  163167. #endif
  163168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163169. "adds r4, r4, r6\n\t"
  163170. #else
  163171. "add r4, r4, r6\n\t"
  163172. #endif
  163173. #ifdef WOLFSSL_KEIL
  163174. "adcs r2, r2, %[r]\n\t"
  163175. #elif defined(__clang__)
  163176. "adcs r2, %[r]\n\t"
  163177. #else
  163178. "adc r2, %[r]\n\t"
  163179. #endif
  163180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163181. "adds r4, r4, r6\n\t"
  163182. #else
  163183. "add r4, r4, r6\n\t"
  163184. #endif
  163185. #ifdef WOLFSSL_KEIL
  163186. "adcs r2, r2, %[r]\n\t"
  163187. #elif defined(__clang__)
  163188. "adcs r2, %[r]\n\t"
  163189. #else
  163190. "adc r2, %[r]\n\t"
  163191. #endif
  163192. "uxth r6, r7\n\t"
  163193. #ifdef WOLFSSL_KEIL
  163194. "muls r5, r6, r5\n\t"
  163195. #elif defined(__clang__)
  163196. "muls r5, r6\n\t"
  163197. #else
  163198. "mul r5, r6\n\t"
  163199. #endif
  163200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163201. "lsrs r6, r5, #16\n\t"
  163202. #else
  163203. "lsr r6, r5, #16\n\t"
  163204. #endif
  163205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163206. "lsls r5, r5, #16\n\t"
  163207. #else
  163208. "lsl r5, r5, #16\n\t"
  163209. #endif
  163210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163211. "adds r3, r3, r5\n\t"
  163212. #else
  163213. "add r3, r3, r5\n\t"
  163214. #endif
  163215. #ifdef WOLFSSL_KEIL
  163216. "adcs r4, r4, r6\n\t"
  163217. #elif defined(__clang__)
  163218. "adcs r4, r6\n\t"
  163219. #else
  163220. "adc r4, r6\n\t"
  163221. #endif
  163222. #ifdef WOLFSSL_KEIL
  163223. "adcs r2, r2, %[r]\n\t"
  163224. #elif defined(__clang__)
  163225. "adcs r2, %[r]\n\t"
  163226. #else
  163227. "adc r2, %[r]\n\t"
  163228. #endif
  163229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163230. "adds r3, r3, r5\n\t"
  163231. #else
  163232. "add r3, r3, r5\n\t"
  163233. #endif
  163234. #ifdef WOLFSSL_KEIL
  163235. "adcs r4, r4, r6\n\t"
  163236. #elif defined(__clang__)
  163237. "adcs r4, r6\n\t"
  163238. #else
  163239. "adc r4, r6\n\t"
  163240. #endif
  163241. #ifdef WOLFSSL_KEIL
  163242. "adcs r2, r2, %[r]\n\t"
  163243. #elif defined(__clang__)
  163244. "adcs r2, %[r]\n\t"
  163245. #else
  163246. "adc r2, %[r]\n\t"
  163247. #endif
  163248. "# A[12] * A[1]\n\t"
  163249. "mov %[a], r9\n\t"
  163250. "mov r7, r11\n\t"
  163251. "ldr %[a], [%[a], #48]\n\t"
  163252. "uxth r5, %[a]\n\t"
  163253. "uxth r6, r7\n\t"
  163254. #ifdef WOLFSSL_KEIL
  163255. "muls r6, r5, r6\n\t"
  163256. #elif defined(__clang__)
  163257. "muls r6, r5\n\t"
  163258. #else
  163259. "mul r6, r5\n\t"
  163260. #endif
  163261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163262. "adds r3, r3, r6\n\t"
  163263. #else
  163264. "add r3, r3, r6\n\t"
  163265. #endif
  163266. #ifdef WOLFSSL_KEIL
  163267. "adcs r4, r4, %[r]\n\t"
  163268. #elif defined(__clang__)
  163269. "adcs r4, %[r]\n\t"
  163270. #else
  163271. "adc r4, %[r]\n\t"
  163272. #endif
  163273. #ifdef WOLFSSL_KEIL
  163274. "adcs r2, r2, %[r]\n\t"
  163275. #elif defined(__clang__)
  163276. "adcs r2, %[r]\n\t"
  163277. #else
  163278. "adc r2, %[r]\n\t"
  163279. #endif
  163280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163281. "adds r3, r3, r6\n\t"
  163282. #else
  163283. "add r3, r3, r6\n\t"
  163284. #endif
  163285. #ifdef WOLFSSL_KEIL
  163286. "adcs r4, r4, %[r]\n\t"
  163287. #elif defined(__clang__)
  163288. "adcs r4, %[r]\n\t"
  163289. #else
  163290. "adc r4, %[r]\n\t"
  163291. #endif
  163292. #ifdef WOLFSSL_KEIL
  163293. "adcs r2, r2, %[r]\n\t"
  163294. #elif defined(__clang__)
  163295. "adcs r2, %[r]\n\t"
  163296. #else
  163297. "adc r2, %[r]\n\t"
  163298. #endif
  163299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163300. "lsrs r6, r7, #16\n\t"
  163301. #else
  163302. "lsr r6, r7, #16\n\t"
  163303. #endif
  163304. #ifdef WOLFSSL_KEIL
  163305. "muls r5, r6, r5\n\t"
  163306. #elif defined(__clang__)
  163307. "muls r5, r6\n\t"
  163308. #else
  163309. "mul r5, r6\n\t"
  163310. #endif
  163311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163312. "lsrs r6, r5, #16\n\t"
  163313. #else
  163314. "lsr r6, r5, #16\n\t"
  163315. #endif
  163316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163317. "lsls r5, r5, #16\n\t"
  163318. #else
  163319. "lsl r5, r5, #16\n\t"
  163320. #endif
  163321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163322. "adds r3, r3, r5\n\t"
  163323. #else
  163324. "add r3, r3, r5\n\t"
  163325. #endif
  163326. #ifdef WOLFSSL_KEIL
  163327. "adcs r4, r4, r6\n\t"
  163328. #elif defined(__clang__)
  163329. "adcs r4, r6\n\t"
  163330. #else
  163331. "adc r4, r6\n\t"
  163332. #endif
  163333. #ifdef WOLFSSL_KEIL
  163334. "adcs r2, r2, %[r]\n\t"
  163335. #elif defined(__clang__)
  163336. "adcs r2, %[r]\n\t"
  163337. #else
  163338. "adc r2, %[r]\n\t"
  163339. #endif
  163340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163341. "adds r3, r3, r5\n\t"
  163342. #else
  163343. "add r3, r3, r5\n\t"
  163344. #endif
  163345. #ifdef WOLFSSL_KEIL
  163346. "adcs r4, r4, r6\n\t"
  163347. #elif defined(__clang__)
  163348. "adcs r4, r6\n\t"
  163349. #else
  163350. "adc r4, r6\n\t"
  163351. #endif
  163352. #ifdef WOLFSSL_KEIL
  163353. "adcs r2, r2, %[r]\n\t"
  163354. #elif defined(__clang__)
  163355. "adcs r2, %[r]\n\t"
  163356. #else
  163357. "adc r2, %[r]\n\t"
  163358. #endif
  163359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163360. "lsrs r5, %[a], #16\n\t"
  163361. #else
  163362. "lsr r5, %[a], #16\n\t"
  163363. #endif
  163364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163365. "lsrs r6, r7, #16\n\t"
  163366. #else
  163367. "lsr r6, r7, #16\n\t"
  163368. #endif
  163369. #ifdef WOLFSSL_KEIL
  163370. "muls r6, r5, r6\n\t"
  163371. #elif defined(__clang__)
  163372. "muls r6, r5\n\t"
  163373. #else
  163374. "mul r6, r5\n\t"
  163375. #endif
  163376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163377. "adds r4, r4, r6\n\t"
  163378. #else
  163379. "add r4, r4, r6\n\t"
  163380. #endif
  163381. #ifdef WOLFSSL_KEIL
  163382. "adcs r2, r2, %[r]\n\t"
  163383. #elif defined(__clang__)
  163384. "adcs r2, %[r]\n\t"
  163385. #else
  163386. "adc r2, %[r]\n\t"
  163387. #endif
  163388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163389. "adds r4, r4, r6\n\t"
  163390. #else
  163391. "add r4, r4, r6\n\t"
  163392. #endif
  163393. #ifdef WOLFSSL_KEIL
  163394. "adcs r2, r2, %[r]\n\t"
  163395. #elif defined(__clang__)
  163396. "adcs r2, %[r]\n\t"
  163397. #else
  163398. "adc r2, %[r]\n\t"
  163399. #endif
  163400. "uxth r6, r7\n\t"
  163401. #ifdef WOLFSSL_KEIL
  163402. "muls r5, r6, r5\n\t"
  163403. #elif defined(__clang__)
  163404. "muls r5, r6\n\t"
  163405. #else
  163406. "mul r5, r6\n\t"
  163407. #endif
  163408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163409. "lsrs r6, r5, #16\n\t"
  163410. #else
  163411. "lsr r6, r5, #16\n\t"
  163412. #endif
  163413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163414. "lsls r5, r5, #16\n\t"
  163415. #else
  163416. "lsl r5, r5, #16\n\t"
  163417. #endif
  163418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163419. "adds r3, r3, r5\n\t"
  163420. #else
  163421. "add r3, r3, r5\n\t"
  163422. #endif
  163423. #ifdef WOLFSSL_KEIL
  163424. "adcs r4, r4, r6\n\t"
  163425. #elif defined(__clang__)
  163426. "adcs r4, r6\n\t"
  163427. #else
  163428. "adc r4, r6\n\t"
  163429. #endif
  163430. #ifdef WOLFSSL_KEIL
  163431. "adcs r2, r2, %[r]\n\t"
  163432. #elif defined(__clang__)
  163433. "adcs r2, %[r]\n\t"
  163434. #else
  163435. "adc r2, %[r]\n\t"
  163436. #endif
  163437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163438. "adds r3, r3, r5\n\t"
  163439. #else
  163440. "add r3, r3, r5\n\t"
  163441. #endif
  163442. #ifdef WOLFSSL_KEIL
  163443. "adcs r4, r4, r6\n\t"
  163444. #elif defined(__clang__)
  163445. "adcs r4, r6\n\t"
  163446. #else
  163447. "adc r4, r6\n\t"
  163448. #endif
  163449. #ifdef WOLFSSL_KEIL
  163450. "adcs r2, r2, %[r]\n\t"
  163451. #elif defined(__clang__)
  163452. "adcs r2, %[r]\n\t"
  163453. #else
  163454. "adc r2, %[r]\n\t"
  163455. #endif
  163456. "# A[13] * A[0]\n\t"
  163457. "mov %[a], r9\n\t"
  163458. "mov r7, r10\n\t"
  163459. "ldr %[a], [%[a], #52]\n\t"
  163460. "uxth r5, %[a]\n\t"
  163461. "uxth r6, r7\n\t"
  163462. #ifdef WOLFSSL_KEIL
  163463. "muls r6, r5, r6\n\t"
  163464. #elif defined(__clang__)
  163465. "muls r6, r5\n\t"
  163466. #else
  163467. "mul r6, r5\n\t"
  163468. #endif
  163469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163470. "adds r3, r3, r6\n\t"
  163471. #else
  163472. "add r3, r3, r6\n\t"
  163473. #endif
  163474. #ifdef WOLFSSL_KEIL
  163475. "adcs r4, r4, %[r]\n\t"
  163476. #elif defined(__clang__)
  163477. "adcs r4, %[r]\n\t"
  163478. #else
  163479. "adc r4, %[r]\n\t"
  163480. #endif
  163481. #ifdef WOLFSSL_KEIL
  163482. "adcs r2, r2, %[r]\n\t"
  163483. #elif defined(__clang__)
  163484. "adcs r2, %[r]\n\t"
  163485. #else
  163486. "adc r2, %[r]\n\t"
  163487. #endif
  163488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163489. "adds r3, r3, r6\n\t"
  163490. #else
  163491. "add r3, r3, r6\n\t"
  163492. #endif
  163493. #ifdef WOLFSSL_KEIL
  163494. "adcs r4, r4, %[r]\n\t"
  163495. #elif defined(__clang__)
  163496. "adcs r4, %[r]\n\t"
  163497. #else
  163498. "adc r4, %[r]\n\t"
  163499. #endif
  163500. #ifdef WOLFSSL_KEIL
  163501. "adcs r2, r2, %[r]\n\t"
  163502. #elif defined(__clang__)
  163503. "adcs r2, %[r]\n\t"
  163504. #else
  163505. "adc r2, %[r]\n\t"
  163506. #endif
  163507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163508. "lsrs r6, r7, #16\n\t"
  163509. #else
  163510. "lsr r6, r7, #16\n\t"
  163511. #endif
  163512. #ifdef WOLFSSL_KEIL
  163513. "muls r5, r6, r5\n\t"
  163514. #elif defined(__clang__)
  163515. "muls r5, r6\n\t"
  163516. #else
  163517. "mul r5, r6\n\t"
  163518. #endif
  163519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163520. "lsrs r6, r5, #16\n\t"
  163521. #else
  163522. "lsr r6, r5, #16\n\t"
  163523. #endif
  163524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163525. "lsls r5, r5, #16\n\t"
  163526. #else
  163527. "lsl r5, r5, #16\n\t"
  163528. #endif
  163529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163530. "adds r3, r3, r5\n\t"
  163531. #else
  163532. "add r3, r3, r5\n\t"
  163533. #endif
  163534. #ifdef WOLFSSL_KEIL
  163535. "adcs r4, r4, r6\n\t"
  163536. #elif defined(__clang__)
  163537. "adcs r4, r6\n\t"
  163538. #else
  163539. "adc r4, r6\n\t"
  163540. #endif
  163541. #ifdef WOLFSSL_KEIL
  163542. "adcs r2, r2, %[r]\n\t"
  163543. #elif defined(__clang__)
  163544. "adcs r2, %[r]\n\t"
  163545. #else
  163546. "adc r2, %[r]\n\t"
  163547. #endif
  163548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163549. "adds r3, r3, r5\n\t"
  163550. #else
  163551. "add r3, r3, r5\n\t"
  163552. #endif
  163553. #ifdef WOLFSSL_KEIL
  163554. "adcs r4, r4, r6\n\t"
  163555. #elif defined(__clang__)
  163556. "adcs r4, r6\n\t"
  163557. #else
  163558. "adc r4, r6\n\t"
  163559. #endif
  163560. #ifdef WOLFSSL_KEIL
  163561. "adcs r2, r2, %[r]\n\t"
  163562. #elif defined(__clang__)
  163563. "adcs r2, %[r]\n\t"
  163564. #else
  163565. "adc r2, %[r]\n\t"
  163566. #endif
  163567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163568. "lsrs r5, %[a], #16\n\t"
  163569. #else
  163570. "lsr r5, %[a], #16\n\t"
  163571. #endif
  163572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163573. "lsrs r6, r7, #16\n\t"
  163574. #else
  163575. "lsr r6, r7, #16\n\t"
  163576. #endif
  163577. #ifdef WOLFSSL_KEIL
  163578. "muls r6, r5, r6\n\t"
  163579. #elif defined(__clang__)
  163580. "muls r6, r5\n\t"
  163581. #else
  163582. "mul r6, r5\n\t"
  163583. #endif
  163584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163585. "adds r4, r4, r6\n\t"
  163586. #else
  163587. "add r4, r4, r6\n\t"
  163588. #endif
  163589. #ifdef WOLFSSL_KEIL
  163590. "adcs r2, r2, %[r]\n\t"
  163591. #elif defined(__clang__)
  163592. "adcs r2, %[r]\n\t"
  163593. #else
  163594. "adc r2, %[r]\n\t"
  163595. #endif
  163596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163597. "adds r4, r4, r6\n\t"
  163598. #else
  163599. "add r4, r4, r6\n\t"
  163600. #endif
  163601. #ifdef WOLFSSL_KEIL
  163602. "adcs r2, r2, %[r]\n\t"
  163603. #elif defined(__clang__)
  163604. "adcs r2, %[r]\n\t"
  163605. #else
  163606. "adc r2, %[r]\n\t"
  163607. #endif
  163608. "uxth r6, r7\n\t"
  163609. #ifdef WOLFSSL_KEIL
  163610. "muls r5, r6, r5\n\t"
  163611. #elif defined(__clang__)
  163612. "muls r5, r6\n\t"
  163613. #else
  163614. "mul r5, r6\n\t"
  163615. #endif
  163616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163617. "lsrs r6, r5, #16\n\t"
  163618. #else
  163619. "lsr r6, r5, #16\n\t"
  163620. #endif
  163621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163622. "lsls r5, r5, #16\n\t"
  163623. #else
  163624. "lsl r5, r5, #16\n\t"
  163625. #endif
  163626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163627. "adds r3, r3, r5\n\t"
  163628. #else
  163629. "add r3, r3, r5\n\t"
  163630. #endif
  163631. #ifdef WOLFSSL_KEIL
  163632. "adcs r4, r4, r6\n\t"
  163633. #elif defined(__clang__)
  163634. "adcs r4, r6\n\t"
  163635. #else
  163636. "adc r4, r6\n\t"
  163637. #endif
  163638. #ifdef WOLFSSL_KEIL
  163639. "adcs r2, r2, %[r]\n\t"
  163640. #elif defined(__clang__)
  163641. "adcs r2, %[r]\n\t"
  163642. #else
  163643. "adc r2, %[r]\n\t"
  163644. #endif
  163645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163646. "adds r3, r3, r5\n\t"
  163647. #else
  163648. "add r3, r3, r5\n\t"
  163649. #endif
  163650. #ifdef WOLFSSL_KEIL
  163651. "adcs r4, r4, r6\n\t"
  163652. #elif defined(__clang__)
  163653. "adcs r4, r6\n\t"
  163654. #else
  163655. "adc r4, r6\n\t"
  163656. #endif
  163657. #ifdef WOLFSSL_KEIL
  163658. "adcs r2, r2, %[r]\n\t"
  163659. #elif defined(__clang__)
  163660. "adcs r2, %[r]\n\t"
  163661. #else
  163662. "adc r2, %[r]\n\t"
  163663. #endif
  163664. "str r3, [sp, #52]\n\t"
  163665. "# A[14] * A[0]\n\t"
  163666. "movs r3, #0\n\t"
  163667. "mov %[a], r9\n\t"
  163668. "ldr %[a], [%[a], #56]\n\t"
  163669. "uxth r5, %[a]\n\t"
  163670. "uxth r6, r7\n\t"
  163671. #ifdef WOLFSSL_KEIL
  163672. "muls r6, r5, r6\n\t"
  163673. #elif defined(__clang__)
  163674. "muls r6, r5\n\t"
  163675. #else
  163676. "mul r6, r5\n\t"
  163677. #endif
  163678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163679. "adds r4, r4, r6\n\t"
  163680. #else
  163681. "add r4, r4, r6\n\t"
  163682. #endif
  163683. #ifdef WOLFSSL_KEIL
  163684. "adcs r2, r2, %[r]\n\t"
  163685. #elif defined(__clang__)
  163686. "adcs r2, %[r]\n\t"
  163687. #else
  163688. "adc r2, %[r]\n\t"
  163689. #endif
  163690. #ifdef WOLFSSL_KEIL
  163691. "adcs r3, r3, %[r]\n\t"
  163692. #elif defined(__clang__)
  163693. "adcs r3, %[r]\n\t"
  163694. #else
  163695. "adc r3, %[r]\n\t"
  163696. #endif
  163697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163698. "adds r4, r4, r6\n\t"
  163699. #else
  163700. "add r4, r4, r6\n\t"
  163701. #endif
  163702. #ifdef WOLFSSL_KEIL
  163703. "adcs r2, r2, %[r]\n\t"
  163704. #elif defined(__clang__)
  163705. "adcs r2, %[r]\n\t"
  163706. #else
  163707. "adc r2, %[r]\n\t"
  163708. #endif
  163709. #ifdef WOLFSSL_KEIL
  163710. "adcs r3, r3, %[r]\n\t"
  163711. #elif defined(__clang__)
  163712. "adcs r3, %[r]\n\t"
  163713. #else
  163714. "adc r3, %[r]\n\t"
  163715. #endif
  163716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163717. "lsrs r6, r7, #16\n\t"
  163718. #else
  163719. "lsr r6, r7, #16\n\t"
  163720. #endif
  163721. #ifdef WOLFSSL_KEIL
  163722. "muls r5, r6, r5\n\t"
  163723. #elif defined(__clang__)
  163724. "muls r5, r6\n\t"
  163725. #else
  163726. "mul r5, r6\n\t"
  163727. #endif
  163728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163729. "lsrs r6, r5, #16\n\t"
  163730. #else
  163731. "lsr r6, r5, #16\n\t"
  163732. #endif
  163733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163734. "lsls r5, r5, #16\n\t"
  163735. #else
  163736. "lsl r5, r5, #16\n\t"
  163737. #endif
  163738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163739. "adds r4, r4, r5\n\t"
  163740. #else
  163741. "add r4, r4, r5\n\t"
  163742. #endif
  163743. #ifdef WOLFSSL_KEIL
  163744. "adcs r2, r2, r6\n\t"
  163745. #elif defined(__clang__)
  163746. "adcs r2, r6\n\t"
  163747. #else
  163748. "adc r2, r6\n\t"
  163749. #endif
  163750. #ifdef WOLFSSL_KEIL
  163751. "adcs r3, r3, %[r]\n\t"
  163752. #elif defined(__clang__)
  163753. "adcs r3, %[r]\n\t"
  163754. #else
  163755. "adc r3, %[r]\n\t"
  163756. #endif
  163757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163758. "adds r4, r4, r5\n\t"
  163759. #else
  163760. "add r4, r4, r5\n\t"
  163761. #endif
  163762. #ifdef WOLFSSL_KEIL
  163763. "adcs r2, r2, r6\n\t"
  163764. #elif defined(__clang__)
  163765. "adcs r2, r6\n\t"
  163766. #else
  163767. "adc r2, r6\n\t"
  163768. #endif
  163769. #ifdef WOLFSSL_KEIL
  163770. "adcs r3, r3, %[r]\n\t"
  163771. #elif defined(__clang__)
  163772. "adcs r3, %[r]\n\t"
  163773. #else
  163774. "adc r3, %[r]\n\t"
  163775. #endif
  163776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163777. "lsrs r5, %[a], #16\n\t"
  163778. #else
  163779. "lsr r5, %[a], #16\n\t"
  163780. #endif
  163781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163782. "lsrs r6, r7, #16\n\t"
  163783. #else
  163784. "lsr r6, r7, #16\n\t"
  163785. #endif
  163786. #ifdef WOLFSSL_KEIL
  163787. "muls r6, r5, r6\n\t"
  163788. #elif defined(__clang__)
  163789. "muls r6, r5\n\t"
  163790. #else
  163791. "mul r6, r5\n\t"
  163792. #endif
  163793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163794. "adds r2, r2, r6\n\t"
  163795. #else
  163796. "add r2, r2, r6\n\t"
  163797. #endif
  163798. #ifdef WOLFSSL_KEIL
  163799. "adcs r3, r3, %[r]\n\t"
  163800. #elif defined(__clang__)
  163801. "adcs r3, %[r]\n\t"
  163802. #else
  163803. "adc r3, %[r]\n\t"
  163804. #endif
  163805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163806. "adds r2, r2, r6\n\t"
  163807. #else
  163808. "add r2, r2, r6\n\t"
  163809. #endif
  163810. #ifdef WOLFSSL_KEIL
  163811. "adcs r3, r3, %[r]\n\t"
  163812. #elif defined(__clang__)
  163813. "adcs r3, %[r]\n\t"
  163814. #else
  163815. "adc r3, %[r]\n\t"
  163816. #endif
  163817. "uxth r6, r7\n\t"
  163818. #ifdef WOLFSSL_KEIL
  163819. "muls r5, r6, r5\n\t"
  163820. #elif defined(__clang__)
  163821. "muls r5, r6\n\t"
  163822. #else
  163823. "mul r5, r6\n\t"
  163824. #endif
  163825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163826. "lsrs r6, r5, #16\n\t"
  163827. #else
  163828. "lsr r6, r5, #16\n\t"
  163829. #endif
  163830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163831. "lsls r5, r5, #16\n\t"
  163832. #else
  163833. "lsl r5, r5, #16\n\t"
  163834. #endif
  163835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163836. "adds r4, r4, r5\n\t"
  163837. #else
  163838. "add r4, r4, r5\n\t"
  163839. #endif
  163840. #ifdef WOLFSSL_KEIL
  163841. "adcs r2, r2, r6\n\t"
  163842. #elif defined(__clang__)
  163843. "adcs r2, r6\n\t"
  163844. #else
  163845. "adc r2, r6\n\t"
  163846. #endif
  163847. #ifdef WOLFSSL_KEIL
  163848. "adcs r3, r3, %[r]\n\t"
  163849. #elif defined(__clang__)
  163850. "adcs r3, %[r]\n\t"
  163851. #else
  163852. "adc r3, %[r]\n\t"
  163853. #endif
  163854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163855. "adds r4, r4, r5\n\t"
  163856. #else
  163857. "add r4, r4, r5\n\t"
  163858. #endif
  163859. #ifdef WOLFSSL_KEIL
  163860. "adcs r2, r2, r6\n\t"
  163861. #elif defined(__clang__)
  163862. "adcs r2, r6\n\t"
  163863. #else
  163864. "adc r2, r6\n\t"
  163865. #endif
  163866. #ifdef WOLFSSL_KEIL
  163867. "adcs r3, r3, %[r]\n\t"
  163868. #elif defined(__clang__)
  163869. "adcs r3, %[r]\n\t"
  163870. #else
  163871. "adc r3, %[r]\n\t"
  163872. #endif
  163873. "# A[13] * A[1]\n\t"
  163874. "mov %[a], r9\n\t"
  163875. "mov r7, r11\n\t"
  163876. "ldr %[a], [%[a], #52]\n\t"
  163877. "uxth r5, %[a]\n\t"
  163878. "uxth r6, r7\n\t"
  163879. #ifdef WOLFSSL_KEIL
  163880. "muls r6, r5, r6\n\t"
  163881. #elif defined(__clang__)
  163882. "muls r6, r5\n\t"
  163883. #else
  163884. "mul r6, r5\n\t"
  163885. #endif
  163886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163887. "adds r4, r4, r6\n\t"
  163888. #else
  163889. "add r4, r4, r6\n\t"
  163890. #endif
  163891. #ifdef WOLFSSL_KEIL
  163892. "adcs r2, r2, %[r]\n\t"
  163893. #elif defined(__clang__)
  163894. "adcs r2, %[r]\n\t"
  163895. #else
  163896. "adc r2, %[r]\n\t"
  163897. #endif
  163898. #ifdef WOLFSSL_KEIL
  163899. "adcs r3, r3, %[r]\n\t"
  163900. #elif defined(__clang__)
  163901. "adcs r3, %[r]\n\t"
  163902. #else
  163903. "adc r3, %[r]\n\t"
  163904. #endif
  163905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163906. "adds r4, r4, r6\n\t"
  163907. #else
  163908. "add r4, r4, r6\n\t"
  163909. #endif
  163910. #ifdef WOLFSSL_KEIL
  163911. "adcs r2, r2, %[r]\n\t"
  163912. #elif defined(__clang__)
  163913. "adcs r2, %[r]\n\t"
  163914. #else
  163915. "adc r2, %[r]\n\t"
  163916. #endif
  163917. #ifdef WOLFSSL_KEIL
  163918. "adcs r3, r3, %[r]\n\t"
  163919. #elif defined(__clang__)
  163920. "adcs r3, %[r]\n\t"
  163921. #else
  163922. "adc r3, %[r]\n\t"
  163923. #endif
  163924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163925. "lsrs r6, r7, #16\n\t"
  163926. #else
  163927. "lsr r6, r7, #16\n\t"
  163928. #endif
  163929. #ifdef WOLFSSL_KEIL
  163930. "muls r5, r6, r5\n\t"
  163931. #elif defined(__clang__)
  163932. "muls r5, r6\n\t"
  163933. #else
  163934. "mul r5, r6\n\t"
  163935. #endif
  163936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163937. "lsrs r6, r5, #16\n\t"
  163938. #else
  163939. "lsr r6, r5, #16\n\t"
  163940. #endif
  163941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163942. "lsls r5, r5, #16\n\t"
  163943. #else
  163944. "lsl r5, r5, #16\n\t"
  163945. #endif
  163946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163947. "adds r4, r4, r5\n\t"
  163948. #else
  163949. "add r4, r4, r5\n\t"
  163950. #endif
  163951. #ifdef WOLFSSL_KEIL
  163952. "adcs r2, r2, r6\n\t"
  163953. #elif defined(__clang__)
  163954. "adcs r2, r6\n\t"
  163955. #else
  163956. "adc r2, r6\n\t"
  163957. #endif
  163958. #ifdef WOLFSSL_KEIL
  163959. "adcs r3, r3, %[r]\n\t"
  163960. #elif defined(__clang__)
  163961. "adcs r3, %[r]\n\t"
  163962. #else
  163963. "adc r3, %[r]\n\t"
  163964. #endif
  163965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163966. "adds r4, r4, r5\n\t"
  163967. #else
  163968. "add r4, r4, r5\n\t"
  163969. #endif
  163970. #ifdef WOLFSSL_KEIL
  163971. "adcs r2, r2, r6\n\t"
  163972. #elif defined(__clang__)
  163973. "adcs r2, r6\n\t"
  163974. #else
  163975. "adc r2, r6\n\t"
  163976. #endif
  163977. #ifdef WOLFSSL_KEIL
  163978. "adcs r3, r3, %[r]\n\t"
  163979. #elif defined(__clang__)
  163980. "adcs r3, %[r]\n\t"
  163981. #else
  163982. "adc r3, %[r]\n\t"
  163983. #endif
  163984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163985. "lsrs r5, %[a], #16\n\t"
  163986. #else
  163987. "lsr r5, %[a], #16\n\t"
  163988. #endif
  163989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163990. "lsrs r6, r7, #16\n\t"
  163991. #else
  163992. "lsr r6, r7, #16\n\t"
  163993. #endif
  163994. #ifdef WOLFSSL_KEIL
  163995. "muls r6, r5, r6\n\t"
  163996. #elif defined(__clang__)
  163997. "muls r6, r5\n\t"
  163998. #else
  163999. "mul r6, r5\n\t"
  164000. #endif
  164001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164002. "adds r2, r2, r6\n\t"
  164003. #else
  164004. "add r2, r2, r6\n\t"
  164005. #endif
  164006. #ifdef WOLFSSL_KEIL
  164007. "adcs r3, r3, %[r]\n\t"
  164008. #elif defined(__clang__)
  164009. "adcs r3, %[r]\n\t"
  164010. #else
  164011. "adc r3, %[r]\n\t"
  164012. #endif
  164013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164014. "adds r2, r2, r6\n\t"
  164015. #else
  164016. "add r2, r2, r6\n\t"
  164017. #endif
  164018. #ifdef WOLFSSL_KEIL
  164019. "adcs r3, r3, %[r]\n\t"
  164020. #elif defined(__clang__)
  164021. "adcs r3, %[r]\n\t"
  164022. #else
  164023. "adc r3, %[r]\n\t"
  164024. #endif
  164025. "uxth r6, r7\n\t"
  164026. #ifdef WOLFSSL_KEIL
  164027. "muls r5, r6, r5\n\t"
  164028. #elif defined(__clang__)
  164029. "muls r5, r6\n\t"
  164030. #else
  164031. "mul r5, r6\n\t"
  164032. #endif
  164033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164034. "lsrs r6, r5, #16\n\t"
  164035. #else
  164036. "lsr r6, r5, #16\n\t"
  164037. #endif
  164038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164039. "lsls r5, r5, #16\n\t"
  164040. #else
  164041. "lsl r5, r5, #16\n\t"
  164042. #endif
  164043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164044. "adds r4, r4, r5\n\t"
  164045. #else
  164046. "add r4, r4, r5\n\t"
  164047. #endif
  164048. #ifdef WOLFSSL_KEIL
  164049. "adcs r2, r2, r6\n\t"
  164050. #elif defined(__clang__)
  164051. "adcs r2, r6\n\t"
  164052. #else
  164053. "adc r2, r6\n\t"
  164054. #endif
  164055. #ifdef WOLFSSL_KEIL
  164056. "adcs r3, r3, %[r]\n\t"
  164057. #elif defined(__clang__)
  164058. "adcs r3, %[r]\n\t"
  164059. #else
  164060. "adc r3, %[r]\n\t"
  164061. #endif
  164062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164063. "adds r4, r4, r5\n\t"
  164064. #else
  164065. "add r4, r4, r5\n\t"
  164066. #endif
  164067. #ifdef WOLFSSL_KEIL
  164068. "adcs r2, r2, r6\n\t"
  164069. #elif defined(__clang__)
  164070. "adcs r2, r6\n\t"
  164071. #else
  164072. "adc r2, r6\n\t"
  164073. #endif
  164074. #ifdef WOLFSSL_KEIL
  164075. "adcs r3, r3, %[r]\n\t"
  164076. #elif defined(__clang__)
  164077. "adcs r3, %[r]\n\t"
  164078. #else
  164079. "adc r3, %[r]\n\t"
  164080. #endif
  164081. "# A[12] * A[2]\n\t"
  164082. "mov %[a], r9\n\t"
  164083. "mov r7, r12\n\t"
  164084. "ldr %[a], [%[a], #48]\n\t"
  164085. "uxth r5, %[a]\n\t"
  164086. "uxth r6, r7\n\t"
  164087. #ifdef WOLFSSL_KEIL
  164088. "muls r6, r5, r6\n\t"
  164089. #elif defined(__clang__)
  164090. "muls r6, r5\n\t"
  164091. #else
  164092. "mul r6, r5\n\t"
  164093. #endif
  164094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164095. "adds r4, r4, r6\n\t"
  164096. #else
  164097. "add r4, r4, r6\n\t"
  164098. #endif
  164099. #ifdef WOLFSSL_KEIL
  164100. "adcs r2, r2, %[r]\n\t"
  164101. #elif defined(__clang__)
  164102. "adcs r2, %[r]\n\t"
  164103. #else
  164104. "adc r2, %[r]\n\t"
  164105. #endif
  164106. #ifdef WOLFSSL_KEIL
  164107. "adcs r3, r3, %[r]\n\t"
  164108. #elif defined(__clang__)
  164109. "adcs r3, %[r]\n\t"
  164110. #else
  164111. "adc r3, %[r]\n\t"
  164112. #endif
  164113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164114. "adds r4, r4, r6\n\t"
  164115. #else
  164116. "add r4, r4, r6\n\t"
  164117. #endif
  164118. #ifdef WOLFSSL_KEIL
  164119. "adcs r2, r2, %[r]\n\t"
  164120. #elif defined(__clang__)
  164121. "adcs r2, %[r]\n\t"
  164122. #else
  164123. "adc r2, %[r]\n\t"
  164124. #endif
  164125. #ifdef WOLFSSL_KEIL
  164126. "adcs r3, r3, %[r]\n\t"
  164127. #elif defined(__clang__)
  164128. "adcs r3, %[r]\n\t"
  164129. #else
  164130. "adc r3, %[r]\n\t"
  164131. #endif
  164132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164133. "lsrs r6, r7, #16\n\t"
  164134. #else
  164135. "lsr r6, r7, #16\n\t"
  164136. #endif
  164137. #ifdef WOLFSSL_KEIL
  164138. "muls r5, r6, r5\n\t"
  164139. #elif defined(__clang__)
  164140. "muls r5, r6\n\t"
  164141. #else
  164142. "mul r5, r6\n\t"
  164143. #endif
  164144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164145. "lsrs r6, r5, #16\n\t"
  164146. #else
  164147. "lsr r6, r5, #16\n\t"
  164148. #endif
  164149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164150. "lsls r5, r5, #16\n\t"
  164151. #else
  164152. "lsl r5, r5, #16\n\t"
  164153. #endif
  164154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164155. "adds r4, r4, r5\n\t"
  164156. #else
  164157. "add r4, r4, r5\n\t"
  164158. #endif
  164159. #ifdef WOLFSSL_KEIL
  164160. "adcs r2, r2, r6\n\t"
  164161. #elif defined(__clang__)
  164162. "adcs r2, r6\n\t"
  164163. #else
  164164. "adc r2, r6\n\t"
  164165. #endif
  164166. #ifdef WOLFSSL_KEIL
  164167. "adcs r3, r3, %[r]\n\t"
  164168. #elif defined(__clang__)
  164169. "adcs r3, %[r]\n\t"
  164170. #else
  164171. "adc r3, %[r]\n\t"
  164172. #endif
  164173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164174. "adds r4, r4, r5\n\t"
  164175. #else
  164176. "add r4, r4, r5\n\t"
  164177. #endif
  164178. #ifdef WOLFSSL_KEIL
  164179. "adcs r2, r2, r6\n\t"
  164180. #elif defined(__clang__)
  164181. "adcs r2, r6\n\t"
  164182. #else
  164183. "adc r2, r6\n\t"
  164184. #endif
  164185. #ifdef WOLFSSL_KEIL
  164186. "adcs r3, r3, %[r]\n\t"
  164187. #elif defined(__clang__)
  164188. "adcs r3, %[r]\n\t"
  164189. #else
  164190. "adc r3, %[r]\n\t"
  164191. #endif
  164192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164193. "lsrs r5, %[a], #16\n\t"
  164194. #else
  164195. "lsr r5, %[a], #16\n\t"
  164196. #endif
  164197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164198. "lsrs r6, r7, #16\n\t"
  164199. #else
  164200. "lsr r6, r7, #16\n\t"
  164201. #endif
  164202. #ifdef WOLFSSL_KEIL
  164203. "muls r6, r5, r6\n\t"
  164204. #elif defined(__clang__)
  164205. "muls r6, r5\n\t"
  164206. #else
  164207. "mul r6, r5\n\t"
  164208. #endif
  164209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164210. "adds r2, r2, r6\n\t"
  164211. #else
  164212. "add r2, r2, r6\n\t"
  164213. #endif
  164214. #ifdef WOLFSSL_KEIL
  164215. "adcs r3, r3, %[r]\n\t"
  164216. #elif defined(__clang__)
  164217. "adcs r3, %[r]\n\t"
  164218. #else
  164219. "adc r3, %[r]\n\t"
  164220. #endif
  164221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164222. "adds r2, r2, r6\n\t"
  164223. #else
  164224. "add r2, r2, r6\n\t"
  164225. #endif
  164226. #ifdef WOLFSSL_KEIL
  164227. "adcs r3, r3, %[r]\n\t"
  164228. #elif defined(__clang__)
  164229. "adcs r3, %[r]\n\t"
  164230. #else
  164231. "adc r3, %[r]\n\t"
  164232. #endif
  164233. "uxth r6, r7\n\t"
  164234. #ifdef WOLFSSL_KEIL
  164235. "muls r5, r6, r5\n\t"
  164236. #elif defined(__clang__)
  164237. "muls r5, r6\n\t"
  164238. #else
  164239. "mul r5, r6\n\t"
  164240. #endif
  164241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164242. "lsrs r6, r5, #16\n\t"
  164243. #else
  164244. "lsr r6, r5, #16\n\t"
  164245. #endif
  164246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164247. "lsls r5, r5, #16\n\t"
  164248. #else
  164249. "lsl r5, r5, #16\n\t"
  164250. #endif
  164251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164252. "adds r4, r4, r5\n\t"
  164253. #else
  164254. "add r4, r4, r5\n\t"
  164255. #endif
  164256. #ifdef WOLFSSL_KEIL
  164257. "adcs r2, r2, r6\n\t"
  164258. #elif defined(__clang__)
  164259. "adcs r2, r6\n\t"
  164260. #else
  164261. "adc r2, r6\n\t"
  164262. #endif
  164263. #ifdef WOLFSSL_KEIL
  164264. "adcs r3, r3, %[r]\n\t"
  164265. #elif defined(__clang__)
  164266. "adcs r3, %[r]\n\t"
  164267. #else
  164268. "adc r3, %[r]\n\t"
  164269. #endif
  164270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164271. "adds r4, r4, r5\n\t"
  164272. #else
  164273. "add r4, r4, r5\n\t"
  164274. #endif
  164275. #ifdef WOLFSSL_KEIL
  164276. "adcs r2, r2, r6\n\t"
  164277. #elif defined(__clang__)
  164278. "adcs r2, r6\n\t"
  164279. #else
  164280. "adc r2, r6\n\t"
  164281. #endif
  164282. #ifdef WOLFSSL_KEIL
  164283. "adcs r3, r3, %[r]\n\t"
  164284. #elif defined(__clang__)
  164285. "adcs r3, %[r]\n\t"
  164286. #else
  164287. "adc r3, %[r]\n\t"
  164288. #endif
  164289. "# A[11] * A[3]\n\t"
  164290. "mov %[a], r9\n\t"
  164291. "mov r7, lr\n\t"
  164292. "ldr %[a], [%[a], #44]\n\t"
  164293. "uxth r5, %[a]\n\t"
  164294. "uxth r6, r7\n\t"
  164295. #ifdef WOLFSSL_KEIL
  164296. "muls r6, r5, r6\n\t"
  164297. #elif defined(__clang__)
  164298. "muls r6, r5\n\t"
  164299. #else
  164300. "mul r6, r5\n\t"
  164301. #endif
  164302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164303. "adds r4, r4, r6\n\t"
  164304. #else
  164305. "add r4, r4, r6\n\t"
  164306. #endif
  164307. #ifdef WOLFSSL_KEIL
  164308. "adcs r2, r2, %[r]\n\t"
  164309. #elif defined(__clang__)
  164310. "adcs r2, %[r]\n\t"
  164311. #else
  164312. "adc r2, %[r]\n\t"
  164313. #endif
  164314. #ifdef WOLFSSL_KEIL
  164315. "adcs r3, r3, %[r]\n\t"
  164316. #elif defined(__clang__)
  164317. "adcs r3, %[r]\n\t"
  164318. #else
  164319. "adc r3, %[r]\n\t"
  164320. #endif
  164321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164322. "adds r4, r4, r6\n\t"
  164323. #else
  164324. "add r4, r4, r6\n\t"
  164325. #endif
  164326. #ifdef WOLFSSL_KEIL
  164327. "adcs r2, r2, %[r]\n\t"
  164328. #elif defined(__clang__)
  164329. "adcs r2, %[r]\n\t"
  164330. #else
  164331. "adc r2, %[r]\n\t"
  164332. #endif
  164333. #ifdef WOLFSSL_KEIL
  164334. "adcs r3, r3, %[r]\n\t"
  164335. #elif defined(__clang__)
  164336. "adcs r3, %[r]\n\t"
  164337. #else
  164338. "adc r3, %[r]\n\t"
  164339. #endif
  164340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164341. "lsrs r6, r7, #16\n\t"
  164342. #else
  164343. "lsr r6, r7, #16\n\t"
  164344. #endif
  164345. #ifdef WOLFSSL_KEIL
  164346. "muls r5, r6, r5\n\t"
  164347. #elif defined(__clang__)
  164348. "muls r5, r6\n\t"
  164349. #else
  164350. "mul r5, r6\n\t"
  164351. #endif
  164352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164353. "lsrs r6, r5, #16\n\t"
  164354. #else
  164355. "lsr r6, r5, #16\n\t"
  164356. #endif
  164357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164358. "lsls r5, r5, #16\n\t"
  164359. #else
  164360. "lsl r5, r5, #16\n\t"
  164361. #endif
  164362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164363. "adds r4, r4, r5\n\t"
  164364. #else
  164365. "add r4, r4, r5\n\t"
  164366. #endif
  164367. #ifdef WOLFSSL_KEIL
  164368. "adcs r2, r2, r6\n\t"
  164369. #elif defined(__clang__)
  164370. "adcs r2, r6\n\t"
  164371. #else
  164372. "adc r2, r6\n\t"
  164373. #endif
  164374. #ifdef WOLFSSL_KEIL
  164375. "adcs r3, r3, %[r]\n\t"
  164376. #elif defined(__clang__)
  164377. "adcs r3, %[r]\n\t"
  164378. #else
  164379. "adc r3, %[r]\n\t"
  164380. #endif
  164381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164382. "adds r4, r4, r5\n\t"
  164383. #else
  164384. "add r4, r4, r5\n\t"
  164385. #endif
  164386. #ifdef WOLFSSL_KEIL
  164387. "adcs r2, r2, r6\n\t"
  164388. #elif defined(__clang__)
  164389. "adcs r2, r6\n\t"
  164390. #else
  164391. "adc r2, r6\n\t"
  164392. #endif
  164393. #ifdef WOLFSSL_KEIL
  164394. "adcs r3, r3, %[r]\n\t"
  164395. #elif defined(__clang__)
  164396. "adcs r3, %[r]\n\t"
  164397. #else
  164398. "adc r3, %[r]\n\t"
  164399. #endif
  164400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164401. "lsrs r5, %[a], #16\n\t"
  164402. #else
  164403. "lsr r5, %[a], #16\n\t"
  164404. #endif
  164405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164406. "lsrs r6, r7, #16\n\t"
  164407. #else
  164408. "lsr r6, r7, #16\n\t"
  164409. #endif
  164410. #ifdef WOLFSSL_KEIL
  164411. "muls r6, r5, r6\n\t"
  164412. #elif defined(__clang__)
  164413. "muls r6, r5\n\t"
  164414. #else
  164415. "mul r6, r5\n\t"
  164416. #endif
  164417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164418. "adds r2, r2, r6\n\t"
  164419. #else
  164420. "add r2, r2, r6\n\t"
  164421. #endif
  164422. #ifdef WOLFSSL_KEIL
  164423. "adcs r3, r3, %[r]\n\t"
  164424. #elif defined(__clang__)
  164425. "adcs r3, %[r]\n\t"
  164426. #else
  164427. "adc r3, %[r]\n\t"
  164428. #endif
  164429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164430. "adds r2, r2, r6\n\t"
  164431. #else
  164432. "add r2, r2, r6\n\t"
  164433. #endif
  164434. #ifdef WOLFSSL_KEIL
  164435. "adcs r3, r3, %[r]\n\t"
  164436. #elif defined(__clang__)
  164437. "adcs r3, %[r]\n\t"
  164438. #else
  164439. "adc r3, %[r]\n\t"
  164440. #endif
  164441. "uxth r6, r7\n\t"
  164442. #ifdef WOLFSSL_KEIL
  164443. "muls r5, r6, r5\n\t"
  164444. #elif defined(__clang__)
  164445. "muls r5, r6\n\t"
  164446. #else
  164447. "mul r5, r6\n\t"
  164448. #endif
  164449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164450. "lsrs r6, r5, #16\n\t"
  164451. #else
  164452. "lsr r6, r5, #16\n\t"
  164453. #endif
  164454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164455. "lsls r5, r5, #16\n\t"
  164456. #else
  164457. "lsl r5, r5, #16\n\t"
  164458. #endif
  164459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164460. "adds r4, r4, r5\n\t"
  164461. #else
  164462. "add r4, r4, r5\n\t"
  164463. #endif
  164464. #ifdef WOLFSSL_KEIL
  164465. "adcs r2, r2, r6\n\t"
  164466. #elif defined(__clang__)
  164467. "adcs r2, r6\n\t"
  164468. #else
  164469. "adc r2, r6\n\t"
  164470. #endif
  164471. #ifdef WOLFSSL_KEIL
  164472. "adcs r3, r3, %[r]\n\t"
  164473. #elif defined(__clang__)
  164474. "adcs r3, %[r]\n\t"
  164475. #else
  164476. "adc r3, %[r]\n\t"
  164477. #endif
  164478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164479. "adds r4, r4, r5\n\t"
  164480. #else
  164481. "add r4, r4, r5\n\t"
  164482. #endif
  164483. #ifdef WOLFSSL_KEIL
  164484. "adcs r2, r2, r6\n\t"
  164485. #elif defined(__clang__)
  164486. "adcs r2, r6\n\t"
  164487. #else
  164488. "adc r2, r6\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. "# A[10] * A[4]\n\t"
  164498. "mov %[a], r9\n\t"
  164499. "ldr r7, [%[a], #16]\n\t"
  164500. "ldr %[a], [%[a], #40]\n\t"
  164501. "uxth r5, %[a]\n\t"
  164502. "uxth r6, r7\n\t"
  164503. #ifdef WOLFSSL_KEIL
  164504. "muls r6, r5, r6\n\t"
  164505. #elif defined(__clang__)
  164506. "muls r6, r5\n\t"
  164507. #else
  164508. "mul r6, r5\n\t"
  164509. #endif
  164510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164511. "adds r4, r4, r6\n\t"
  164512. #else
  164513. "add r4, r4, r6\n\t"
  164514. #endif
  164515. #ifdef WOLFSSL_KEIL
  164516. "adcs r2, r2, %[r]\n\t"
  164517. #elif defined(__clang__)
  164518. "adcs r2, %[r]\n\t"
  164519. #else
  164520. "adc r2, %[r]\n\t"
  164521. #endif
  164522. #ifdef WOLFSSL_KEIL
  164523. "adcs r3, r3, %[r]\n\t"
  164524. #elif defined(__clang__)
  164525. "adcs r3, %[r]\n\t"
  164526. #else
  164527. "adc r3, %[r]\n\t"
  164528. #endif
  164529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164530. "adds r4, r4, r6\n\t"
  164531. #else
  164532. "add r4, r4, r6\n\t"
  164533. #endif
  164534. #ifdef WOLFSSL_KEIL
  164535. "adcs r2, r2, %[r]\n\t"
  164536. #elif defined(__clang__)
  164537. "adcs r2, %[r]\n\t"
  164538. #else
  164539. "adc r2, %[r]\n\t"
  164540. #endif
  164541. #ifdef WOLFSSL_KEIL
  164542. "adcs r3, r3, %[r]\n\t"
  164543. #elif defined(__clang__)
  164544. "adcs r3, %[r]\n\t"
  164545. #else
  164546. "adc r3, %[r]\n\t"
  164547. #endif
  164548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164549. "lsrs r6, r7, #16\n\t"
  164550. #else
  164551. "lsr r6, r7, #16\n\t"
  164552. #endif
  164553. #ifdef WOLFSSL_KEIL
  164554. "muls r5, r6, r5\n\t"
  164555. #elif defined(__clang__)
  164556. "muls r5, r6\n\t"
  164557. #else
  164558. "mul r5, r6\n\t"
  164559. #endif
  164560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164561. "lsrs r6, r5, #16\n\t"
  164562. #else
  164563. "lsr r6, r5, #16\n\t"
  164564. #endif
  164565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164566. "lsls r5, r5, #16\n\t"
  164567. #else
  164568. "lsl r5, r5, #16\n\t"
  164569. #endif
  164570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164571. "adds r4, r4, r5\n\t"
  164572. #else
  164573. "add r4, r4, r5\n\t"
  164574. #endif
  164575. #ifdef WOLFSSL_KEIL
  164576. "adcs r2, r2, r6\n\t"
  164577. #elif defined(__clang__)
  164578. "adcs r2, r6\n\t"
  164579. #else
  164580. "adc r2, r6\n\t"
  164581. #endif
  164582. #ifdef WOLFSSL_KEIL
  164583. "adcs r3, r3, %[r]\n\t"
  164584. #elif defined(__clang__)
  164585. "adcs r3, %[r]\n\t"
  164586. #else
  164587. "adc r3, %[r]\n\t"
  164588. #endif
  164589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164590. "adds r4, r4, r5\n\t"
  164591. #else
  164592. "add r4, r4, r5\n\t"
  164593. #endif
  164594. #ifdef WOLFSSL_KEIL
  164595. "adcs r2, r2, r6\n\t"
  164596. #elif defined(__clang__)
  164597. "adcs r2, r6\n\t"
  164598. #else
  164599. "adc r2, r6\n\t"
  164600. #endif
  164601. #ifdef WOLFSSL_KEIL
  164602. "adcs r3, r3, %[r]\n\t"
  164603. #elif defined(__clang__)
  164604. "adcs r3, %[r]\n\t"
  164605. #else
  164606. "adc r3, %[r]\n\t"
  164607. #endif
  164608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164609. "lsrs r5, %[a], #16\n\t"
  164610. #else
  164611. "lsr r5, %[a], #16\n\t"
  164612. #endif
  164613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164614. "lsrs r6, r7, #16\n\t"
  164615. #else
  164616. "lsr r6, r7, #16\n\t"
  164617. #endif
  164618. #ifdef WOLFSSL_KEIL
  164619. "muls r6, r5, r6\n\t"
  164620. #elif defined(__clang__)
  164621. "muls r6, r5\n\t"
  164622. #else
  164623. "mul r6, r5\n\t"
  164624. #endif
  164625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164626. "adds r2, r2, r6\n\t"
  164627. #else
  164628. "add r2, r2, r6\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. "adds r2, r2, r6\n\t"
  164639. #else
  164640. "add r2, r2, r6\n\t"
  164641. #endif
  164642. #ifdef WOLFSSL_KEIL
  164643. "adcs r3, r3, %[r]\n\t"
  164644. #elif defined(__clang__)
  164645. "adcs r3, %[r]\n\t"
  164646. #else
  164647. "adc r3, %[r]\n\t"
  164648. #endif
  164649. "uxth r6, r7\n\t"
  164650. #ifdef WOLFSSL_KEIL
  164651. "muls r5, r6, r5\n\t"
  164652. #elif defined(__clang__)
  164653. "muls r5, r6\n\t"
  164654. #else
  164655. "mul r5, r6\n\t"
  164656. #endif
  164657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164658. "lsrs r6, r5, #16\n\t"
  164659. #else
  164660. "lsr r6, r5, #16\n\t"
  164661. #endif
  164662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164663. "lsls r5, r5, #16\n\t"
  164664. #else
  164665. "lsl r5, r5, #16\n\t"
  164666. #endif
  164667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164668. "adds r4, r4, r5\n\t"
  164669. #else
  164670. "add r4, r4, r5\n\t"
  164671. #endif
  164672. #ifdef WOLFSSL_KEIL
  164673. "adcs r2, r2, r6\n\t"
  164674. #elif defined(__clang__)
  164675. "adcs r2, r6\n\t"
  164676. #else
  164677. "adc r2, r6\n\t"
  164678. #endif
  164679. #ifdef WOLFSSL_KEIL
  164680. "adcs r3, r3, %[r]\n\t"
  164681. #elif defined(__clang__)
  164682. "adcs r3, %[r]\n\t"
  164683. #else
  164684. "adc r3, %[r]\n\t"
  164685. #endif
  164686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164687. "adds r4, r4, r5\n\t"
  164688. #else
  164689. "add r4, r4, r5\n\t"
  164690. #endif
  164691. #ifdef WOLFSSL_KEIL
  164692. "adcs r2, r2, r6\n\t"
  164693. #elif defined(__clang__)
  164694. "adcs r2, r6\n\t"
  164695. #else
  164696. "adc r2, r6\n\t"
  164697. #endif
  164698. #ifdef WOLFSSL_KEIL
  164699. "adcs r3, r3, %[r]\n\t"
  164700. #elif defined(__clang__)
  164701. "adcs r3, %[r]\n\t"
  164702. #else
  164703. "adc r3, %[r]\n\t"
  164704. #endif
  164705. "# A[9] * A[5]\n\t"
  164706. "mov %[a], r9\n\t"
  164707. "ldr r7, [%[a], #20]\n\t"
  164708. "ldr %[a], [%[a], #36]\n\t"
  164709. "uxth r5, %[a]\n\t"
  164710. "uxth r6, r7\n\t"
  164711. #ifdef WOLFSSL_KEIL
  164712. "muls r6, r5, r6\n\t"
  164713. #elif defined(__clang__)
  164714. "muls r6, r5\n\t"
  164715. #else
  164716. "mul r6, r5\n\t"
  164717. #endif
  164718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164719. "adds r4, r4, r6\n\t"
  164720. #else
  164721. "add r4, r4, r6\n\t"
  164722. #endif
  164723. #ifdef WOLFSSL_KEIL
  164724. "adcs r2, r2, %[r]\n\t"
  164725. #elif defined(__clang__)
  164726. "adcs r2, %[r]\n\t"
  164727. #else
  164728. "adc r2, %[r]\n\t"
  164729. #endif
  164730. #ifdef WOLFSSL_KEIL
  164731. "adcs r3, r3, %[r]\n\t"
  164732. #elif defined(__clang__)
  164733. "adcs r3, %[r]\n\t"
  164734. #else
  164735. "adc r3, %[r]\n\t"
  164736. #endif
  164737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164738. "adds r4, r4, r6\n\t"
  164739. #else
  164740. "add r4, r4, r6\n\t"
  164741. #endif
  164742. #ifdef WOLFSSL_KEIL
  164743. "adcs r2, r2, %[r]\n\t"
  164744. #elif defined(__clang__)
  164745. "adcs r2, %[r]\n\t"
  164746. #else
  164747. "adc r2, %[r]\n\t"
  164748. #endif
  164749. #ifdef WOLFSSL_KEIL
  164750. "adcs r3, r3, %[r]\n\t"
  164751. #elif defined(__clang__)
  164752. "adcs r3, %[r]\n\t"
  164753. #else
  164754. "adc r3, %[r]\n\t"
  164755. #endif
  164756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164757. "lsrs r6, r7, #16\n\t"
  164758. #else
  164759. "lsr r6, r7, #16\n\t"
  164760. #endif
  164761. #ifdef WOLFSSL_KEIL
  164762. "muls r5, r6, r5\n\t"
  164763. #elif defined(__clang__)
  164764. "muls r5, r6\n\t"
  164765. #else
  164766. "mul r5, r6\n\t"
  164767. #endif
  164768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164769. "lsrs r6, r5, #16\n\t"
  164770. #else
  164771. "lsr r6, r5, #16\n\t"
  164772. #endif
  164773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164774. "lsls r5, r5, #16\n\t"
  164775. #else
  164776. "lsl r5, r5, #16\n\t"
  164777. #endif
  164778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164779. "adds r4, r4, r5\n\t"
  164780. #else
  164781. "add r4, r4, r5\n\t"
  164782. #endif
  164783. #ifdef WOLFSSL_KEIL
  164784. "adcs r2, r2, r6\n\t"
  164785. #elif defined(__clang__)
  164786. "adcs r2, r6\n\t"
  164787. #else
  164788. "adc r2, r6\n\t"
  164789. #endif
  164790. #ifdef WOLFSSL_KEIL
  164791. "adcs r3, r3, %[r]\n\t"
  164792. #elif defined(__clang__)
  164793. "adcs r3, %[r]\n\t"
  164794. #else
  164795. "adc r3, %[r]\n\t"
  164796. #endif
  164797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164798. "adds r4, r4, r5\n\t"
  164799. #else
  164800. "add r4, r4, r5\n\t"
  164801. #endif
  164802. #ifdef WOLFSSL_KEIL
  164803. "adcs r2, r2, r6\n\t"
  164804. #elif defined(__clang__)
  164805. "adcs r2, r6\n\t"
  164806. #else
  164807. "adc r2, r6\n\t"
  164808. #endif
  164809. #ifdef WOLFSSL_KEIL
  164810. "adcs r3, r3, %[r]\n\t"
  164811. #elif defined(__clang__)
  164812. "adcs r3, %[r]\n\t"
  164813. #else
  164814. "adc r3, %[r]\n\t"
  164815. #endif
  164816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164817. "lsrs r5, %[a], #16\n\t"
  164818. #else
  164819. "lsr r5, %[a], #16\n\t"
  164820. #endif
  164821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164822. "lsrs r6, r7, #16\n\t"
  164823. #else
  164824. "lsr r6, r7, #16\n\t"
  164825. #endif
  164826. #ifdef WOLFSSL_KEIL
  164827. "muls r6, r5, r6\n\t"
  164828. #elif defined(__clang__)
  164829. "muls r6, r5\n\t"
  164830. #else
  164831. "mul r6, r5\n\t"
  164832. #endif
  164833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164834. "adds r2, r2, r6\n\t"
  164835. #else
  164836. "add r2, r2, r6\n\t"
  164837. #endif
  164838. #ifdef WOLFSSL_KEIL
  164839. "adcs r3, r3, %[r]\n\t"
  164840. #elif defined(__clang__)
  164841. "adcs r3, %[r]\n\t"
  164842. #else
  164843. "adc r3, %[r]\n\t"
  164844. #endif
  164845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164846. "adds r2, r2, r6\n\t"
  164847. #else
  164848. "add r2, r2, r6\n\t"
  164849. #endif
  164850. #ifdef WOLFSSL_KEIL
  164851. "adcs r3, r3, %[r]\n\t"
  164852. #elif defined(__clang__)
  164853. "adcs r3, %[r]\n\t"
  164854. #else
  164855. "adc r3, %[r]\n\t"
  164856. #endif
  164857. "uxth r6, r7\n\t"
  164858. #ifdef WOLFSSL_KEIL
  164859. "muls r5, r6, r5\n\t"
  164860. #elif defined(__clang__)
  164861. "muls r5, r6\n\t"
  164862. #else
  164863. "mul r5, r6\n\t"
  164864. #endif
  164865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164866. "lsrs r6, r5, #16\n\t"
  164867. #else
  164868. "lsr r6, r5, #16\n\t"
  164869. #endif
  164870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164871. "lsls r5, r5, #16\n\t"
  164872. #else
  164873. "lsl r5, r5, #16\n\t"
  164874. #endif
  164875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164876. "adds r4, r4, r5\n\t"
  164877. #else
  164878. "add r4, r4, r5\n\t"
  164879. #endif
  164880. #ifdef WOLFSSL_KEIL
  164881. "adcs r2, r2, r6\n\t"
  164882. #elif defined(__clang__)
  164883. "adcs r2, r6\n\t"
  164884. #else
  164885. "adc r2, r6\n\t"
  164886. #endif
  164887. #ifdef WOLFSSL_KEIL
  164888. "adcs r3, r3, %[r]\n\t"
  164889. #elif defined(__clang__)
  164890. "adcs r3, %[r]\n\t"
  164891. #else
  164892. "adc r3, %[r]\n\t"
  164893. #endif
  164894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164895. "adds r4, r4, r5\n\t"
  164896. #else
  164897. "add r4, r4, r5\n\t"
  164898. #endif
  164899. #ifdef WOLFSSL_KEIL
  164900. "adcs r2, r2, r6\n\t"
  164901. #elif defined(__clang__)
  164902. "adcs r2, r6\n\t"
  164903. #else
  164904. "adc r2, r6\n\t"
  164905. #endif
  164906. #ifdef WOLFSSL_KEIL
  164907. "adcs r3, r3, %[r]\n\t"
  164908. #elif defined(__clang__)
  164909. "adcs r3, %[r]\n\t"
  164910. #else
  164911. "adc r3, %[r]\n\t"
  164912. #endif
  164913. "# A[8] * A[6]\n\t"
  164914. "mov %[a], r9\n\t"
  164915. "ldr r7, [%[a], #24]\n\t"
  164916. "ldr %[a], [%[a], #32]\n\t"
  164917. "uxth r5, %[a]\n\t"
  164918. "uxth r6, r7\n\t"
  164919. #ifdef WOLFSSL_KEIL
  164920. "muls r6, r5, r6\n\t"
  164921. #elif defined(__clang__)
  164922. "muls r6, r5\n\t"
  164923. #else
  164924. "mul r6, r5\n\t"
  164925. #endif
  164926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164927. "adds r4, r4, r6\n\t"
  164928. #else
  164929. "add r4, r4, r6\n\t"
  164930. #endif
  164931. #ifdef WOLFSSL_KEIL
  164932. "adcs r2, r2, %[r]\n\t"
  164933. #elif defined(__clang__)
  164934. "adcs r2, %[r]\n\t"
  164935. #else
  164936. "adc r2, %[r]\n\t"
  164937. #endif
  164938. #ifdef WOLFSSL_KEIL
  164939. "adcs r3, r3, %[r]\n\t"
  164940. #elif defined(__clang__)
  164941. "adcs r3, %[r]\n\t"
  164942. #else
  164943. "adc r3, %[r]\n\t"
  164944. #endif
  164945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164946. "adds r4, r4, r6\n\t"
  164947. #else
  164948. "add r4, r4, r6\n\t"
  164949. #endif
  164950. #ifdef WOLFSSL_KEIL
  164951. "adcs r2, r2, %[r]\n\t"
  164952. #elif defined(__clang__)
  164953. "adcs r2, %[r]\n\t"
  164954. #else
  164955. "adc r2, %[r]\n\t"
  164956. #endif
  164957. #ifdef WOLFSSL_KEIL
  164958. "adcs r3, r3, %[r]\n\t"
  164959. #elif defined(__clang__)
  164960. "adcs r3, %[r]\n\t"
  164961. #else
  164962. "adc r3, %[r]\n\t"
  164963. #endif
  164964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164965. "lsrs r6, r7, #16\n\t"
  164966. #else
  164967. "lsr r6, r7, #16\n\t"
  164968. #endif
  164969. #ifdef WOLFSSL_KEIL
  164970. "muls r5, r6, r5\n\t"
  164971. #elif defined(__clang__)
  164972. "muls r5, r6\n\t"
  164973. #else
  164974. "mul r5, r6\n\t"
  164975. #endif
  164976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164977. "lsrs r6, r5, #16\n\t"
  164978. #else
  164979. "lsr r6, r5, #16\n\t"
  164980. #endif
  164981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164982. "lsls r5, r5, #16\n\t"
  164983. #else
  164984. "lsl r5, r5, #16\n\t"
  164985. #endif
  164986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164987. "adds r4, r4, r5\n\t"
  164988. #else
  164989. "add r4, r4, r5\n\t"
  164990. #endif
  164991. #ifdef WOLFSSL_KEIL
  164992. "adcs r2, r2, r6\n\t"
  164993. #elif defined(__clang__)
  164994. "adcs r2, r6\n\t"
  164995. #else
  164996. "adc r2, r6\n\t"
  164997. #endif
  164998. #ifdef WOLFSSL_KEIL
  164999. "adcs r3, r3, %[r]\n\t"
  165000. #elif defined(__clang__)
  165001. "adcs r3, %[r]\n\t"
  165002. #else
  165003. "adc r3, %[r]\n\t"
  165004. #endif
  165005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165006. "adds r4, r4, r5\n\t"
  165007. #else
  165008. "add r4, r4, r5\n\t"
  165009. #endif
  165010. #ifdef WOLFSSL_KEIL
  165011. "adcs r2, r2, r6\n\t"
  165012. #elif defined(__clang__)
  165013. "adcs r2, r6\n\t"
  165014. #else
  165015. "adc r2, r6\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165025. "lsrs r5, %[a], #16\n\t"
  165026. #else
  165027. "lsr r5, %[a], #16\n\t"
  165028. #endif
  165029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165030. "lsrs r6, r7, #16\n\t"
  165031. #else
  165032. "lsr r6, r7, #16\n\t"
  165033. #endif
  165034. #ifdef WOLFSSL_KEIL
  165035. "muls r6, r5, r6\n\t"
  165036. #elif defined(__clang__)
  165037. "muls r6, r5\n\t"
  165038. #else
  165039. "mul r6, r5\n\t"
  165040. #endif
  165041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165042. "adds r2, r2, r6\n\t"
  165043. #else
  165044. "add r2, r2, r6\n\t"
  165045. #endif
  165046. #ifdef WOLFSSL_KEIL
  165047. "adcs r3, r3, %[r]\n\t"
  165048. #elif defined(__clang__)
  165049. "adcs r3, %[r]\n\t"
  165050. #else
  165051. "adc r3, %[r]\n\t"
  165052. #endif
  165053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165054. "adds r2, r2, r6\n\t"
  165055. #else
  165056. "add r2, r2, r6\n\t"
  165057. #endif
  165058. #ifdef WOLFSSL_KEIL
  165059. "adcs r3, r3, %[r]\n\t"
  165060. #elif defined(__clang__)
  165061. "adcs r3, %[r]\n\t"
  165062. #else
  165063. "adc r3, %[r]\n\t"
  165064. #endif
  165065. "uxth r6, r7\n\t"
  165066. #ifdef WOLFSSL_KEIL
  165067. "muls r5, r6, r5\n\t"
  165068. #elif defined(__clang__)
  165069. "muls r5, r6\n\t"
  165070. #else
  165071. "mul r5, r6\n\t"
  165072. #endif
  165073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165074. "lsrs r6, r5, #16\n\t"
  165075. #else
  165076. "lsr r6, r5, #16\n\t"
  165077. #endif
  165078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165079. "lsls r5, r5, #16\n\t"
  165080. #else
  165081. "lsl r5, r5, #16\n\t"
  165082. #endif
  165083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165084. "adds r4, r4, r5\n\t"
  165085. #else
  165086. "add r4, r4, r5\n\t"
  165087. #endif
  165088. #ifdef WOLFSSL_KEIL
  165089. "adcs r2, r2, r6\n\t"
  165090. #elif defined(__clang__)
  165091. "adcs r2, r6\n\t"
  165092. #else
  165093. "adc r2, r6\n\t"
  165094. #endif
  165095. #ifdef WOLFSSL_KEIL
  165096. "adcs r3, r3, %[r]\n\t"
  165097. #elif defined(__clang__)
  165098. "adcs r3, %[r]\n\t"
  165099. #else
  165100. "adc r3, %[r]\n\t"
  165101. #endif
  165102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165103. "adds r4, r4, r5\n\t"
  165104. #else
  165105. "add r4, r4, r5\n\t"
  165106. #endif
  165107. #ifdef WOLFSSL_KEIL
  165108. "adcs r2, r2, r6\n\t"
  165109. #elif defined(__clang__)
  165110. "adcs r2, r6\n\t"
  165111. #else
  165112. "adc r2, r6\n\t"
  165113. #endif
  165114. #ifdef WOLFSSL_KEIL
  165115. "adcs r3, r3, %[r]\n\t"
  165116. #elif defined(__clang__)
  165117. "adcs r3, %[r]\n\t"
  165118. #else
  165119. "adc r3, %[r]\n\t"
  165120. #endif
  165121. "# A[7] * A[7]\n\t"
  165122. "mov %[a], r9\n\t"
  165123. "ldr r7, [%[a], #28]\n\t"
  165124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165125. "lsrs r6, r7, #16\n\t"
  165126. #else
  165127. "lsr r6, r7, #16\n\t"
  165128. #endif
  165129. "uxth r5, r7\n\t"
  165130. #ifdef WOLFSSL_KEIL
  165131. "muls r5, r5, r5\n\t"
  165132. #elif defined(__clang__)
  165133. "muls r5, r5\n\t"
  165134. #else
  165135. "mul r5, r5\n\t"
  165136. #endif
  165137. #ifdef WOLFSSL_KEIL
  165138. "muls r6, r6, r6\n\t"
  165139. #elif defined(__clang__)
  165140. "muls r6, r6\n\t"
  165141. #else
  165142. "mul r6, r6\n\t"
  165143. #endif
  165144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165145. "adds r4, r4, r5\n\t"
  165146. #else
  165147. "add r4, r4, r5\n\t"
  165148. #endif
  165149. #ifdef WOLFSSL_KEIL
  165150. "adcs r2, r2, r6\n\t"
  165151. #elif defined(__clang__)
  165152. "adcs r2, r6\n\t"
  165153. #else
  165154. "adc r2, r6\n\t"
  165155. #endif
  165156. #ifdef WOLFSSL_KEIL
  165157. "adcs r3, r3, %[r]\n\t"
  165158. #elif defined(__clang__)
  165159. "adcs r3, %[r]\n\t"
  165160. #else
  165161. "adc r3, %[r]\n\t"
  165162. #endif
  165163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165164. "lsrs r6, r7, #16\n\t"
  165165. #else
  165166. "lsr r6, r7, #16\n\t"
  165167. #endif
  165168. "uxth r5, r7\n\t"
  165169. #ifdef WOLFSSL_KEIL
  165170. "muls r5, r6, r5\n\t"
  165171. #elif defined(__clang__)
  165172. "muls r5, r6\n\t"
  165173. #else
  165174. "mul r5, r6\n\t"
  165175. #endif
  165176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165177. "lsrs r6, r5, #15\n\t"
  165178. #else
  165179. "lsr r6, r5, #15\n\t"
  165180. #endif
  165181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165182. "lsls r5, r5, #17\n\t"
  165183. #else
  165184. "lsl r5, r5, #17\n\t"
  165185. #endif
  165186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165187. "adds r4, r4, r5\n\t"
  165188. #else
  165189. "add r4, r4, r5\n\t"
  165190. #endif
  165191. #ifdef WOLFSSL_KEIL
  165192. "adcs r2, r2, r6\n\t"
  165193. #elif defined(__clang__)
  165194. "adcs r2, r6\n\t"
  165195. #else
  165196. "adc r2, r6\n\t"
  165197. #endif
  165198. #ifdef WOLFSSL_KEIL
  165199. "adcs r3, r3, %[r]\n\t"
  165200. #elif defined(__clang__)
  165201. "adcs r3, %[r]\n\t"
  165202. #else
  165203. "adc r3, %[r]\n\t"
  165204. #endif
  165205. "str r4, [sp, #56]\n\t"
  165206. "# A[8] * A[7]\n\t"
  165207. "movs r4, #0\n\t"
  165208. "ldr %[a], [%[a], #32]\n\t"
  165209. "uxth r5, %[a]\n\t"
  165210. "uxth r6, r7\n\t"
  165211. #ifdef WOLFSSL_KEIL
  165212. "muls r6, r5, r6\n\t"
  165213. #elif defined(__clang__)
  165214. "muls r6, r5\n\t"
  165215. #else
  165216. "mul r6, r5\n\t"
  165217. #endif
  165218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165219. "adds r2, r2, r6\n\t"
  165220. #else
  165221. "add r2, r2, r6\n\t"
  165222. #endif
  165223. #ifdef WOLFSSL_KEIL
  165224. "adcs r3, r3, %[r]\n\t"
  165225. #elif defined(__clang__)
  165226. "adcs r3, %[r]\n\t"
  165227. #else
  165228. "adc r3, %[r]\n\t"
  165229. #endif
  165230. #ifdef WOLFSSL_KEIL
  165231. "adcs r4, r4, %[r]\n\t"
  165232. #elif defined(__clang__)
  165233. "adcs r4, %[r]\n\t"
  165234. #else
  165235. "adc r4, %[r]\n\t"
  165236. #endif
  165237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165238. "adds r2, r2, r6\n\t"
  165239. #else
  165240. "add r2, r2, r6\n\t"
  165241. #endif
  165242. #ifdef WOLFSSL_KEIL
  165243. "adcs r3, r3, %[r]\n\t"
  165244. #elif defined(__clang__)
  165245. "adcs r3, %[r]\n\t"
  165246. #else
  165247. "adc r3, %[r]\n\t"
  165248. #endif
  165249. #ifdef WOLFSSL_KEIL
  165250. "adcs r4, r4, %[r]\n\t"
  165251. #elif defined(__clang__)
  165252. "adcs r4, %[r]\n\t"
  165253. #else
  165254. "adc r4, %[r]\n\t"
  165255. #endif
  165256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165257. "lsrs r6, r7, #16\n\t"
  165258. #else
  165259. "lsr r6, r7, #16\n\t"
  165260. #endif
  165261. #ifdef WOLFSSL_KEIL
  165262. "muls r5, r6, r5\n\t"
  165263. #elif defined(__clang__)
  165264. "muls r5, r6\n\t"
  165265. #else
  165266. "mul r5, r6\n\t"
  165267. #endif
  165268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165269. "lsrs r6, r5, #16\n\t"
  165270. #else
  165271. "lsr r6, r5, #16\n\t"
  165272. #endif
  165273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165274. "lsls r5, r5, #16\n\t"
  165275. #else
  165276. "lsl r5, r5, #16\n\t"
  165277. #endif
  165278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165279. "adds r2, r2, r5\n\t"
  165280. #else
  165281. "add r2, r2, r5\n\t"
  165282. #endif
  165283. #ifdef WOLFSSL_KEIL
  165284. "adcs r3, r3, r6\n\t"
  165285. #elif defined(__clang__)
  165286. "adcs r3, r6\n\t"
  165287. #else
  165288. "adc r3, r6\n\t"
  165289. #endif
  165290. #ifdef WOLFSSL_KEIL
  165291. "adcs r4, r4, %[r]\n\t"
  165292. #elif defined(__clang__)
  165293. "adcs r4, %[r]\n\t"
  165294. #else
  165295. "adc r4, %[r]\n\t"
  165296. #endif
  165297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165298. "adds r2, r2, r5\n\t"
  165299. #else
  165300. "add r2, r2, r5\n\t"
  165301. #endif
  165302. #ifdef WOLFSSL_KEIL
  165303. "adcs r3, r3, r6\n\t"
  165304. #elif defined(__clang__)
  165305. "adcs r3, r6\n\t"
  165306. #else
  165307. "adc r3, r6\n\t"
  165308. #endif
  165309. #ifdef WOLFSSL_KEIL
  165310. "adcs r4, r4, %[r]\n\t"
  165311. #elif defined(__clang__)
  165312. "adcs r4, %[r]\n\t"
  165313. #else
  165314. "adc r4, %[r]\n\t"
  165315. #endif
  165316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165317. "lsrs r5, %[a], #16\n\t"
  165318. #else
  165319. "lsr r5, %[a], #16\n\t"
  165320. #endif
  165321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165322. "lsrs r6, r7, #16\n\t"
  165323. #else
  165324. "lsr r6, r7, #16\n\t"
  165325. #endif
  165326. #ifdef WOLFSSL_KEIL
  165327. "muls r6, r5, r6\n\t"
  165328. #elif defined(__clang__)
  165329. "muls r6, r5\n\t"
  165330. #else
  165331. "mul r6, r5\n\t"
  165332. #endif
  165333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165334. "adds r3, r3, r6\n\t"
  165335. #else
  165336. "add r3, r3, r6\n\t"
  165337. #endif
  165338. #ifdef WOLFSSL_KEIL
  165339. "adcs r4, r4, %[r]\n\t"
  165340. #elif defined(__clang__)
  165341. "adcs r4, %[r]\n\t"
  165342. #else
  165343. "adc r4, %[r]\n\t"
  165344. #endif
  165345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165346. "adds r3, r3, r6\n\t"
  165347. #else
  165348. "add r3, r3, r6\n\t"
  165349. #endif
  165350. #ifdef WOLFSSL_KEIL
  165351. "adcs r4, r4, %[r]\n\t"
  165352. #elif defined(__clang__)
  165353. "adcs r4, %[r]\n\t"
  165354. #else
  165355. "adc r4, %[r]\n\t"
  165356. #endif
  165357. "uxth r6, r7\n\t"
  165358. #ifdef WOLFSSL_KEIL
  165359. "muls r5, r6, r5\n\t"
  165360. #elif defined(__clang__)
  165361. "muls r5, r6\n\t"
  165362. #else
  165363. "mul r5, r6\n\t"
  165364. #endif
  165365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165366. "lsrs r6, r5, #16\n\t"
  165367. #else
  165368. "lsr r6, r5, #16\n\t"
  165369. #endif
  165370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165371. "lsls r5, r5, #16\n\t"
  165372. #else
  165373. "lsl r5, r5, #16\n\t"
  165374. #endif
  165375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165376. "adds r2, r2, r5\n\t"
  165377. #else
  165378. "add r2, r2, r5\n\t"
  165379. #endif
  165380. #ifdef WOLFSSL_KEIL
  165381. "adcs r3, r3, r6\n\t"
  165382. #elif defined(__clang__)
  165383. "adcs r3, r6\n\t"
  165384. #else
  165385. "adc r3, r6\n\t"
  165386. #endif
  165387. #ifdef WOLFSSL_KEIL
  165388. "adcs r4, r4, %[r]\n\t"
  165389. #elif defined(__clang__)
  165390. "adcs r4, %[r]\n\t"
  165391. #else
  165392. "adc r4, %[r]\n\t"
  165393. #endif
  165394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165395. "adds r2, r2, r5\n\t"
  165396. #else
  165397. "add r2, r2, r5\n\t"
  165398. #endif
  165399. #ifdef WOLFSSL_KEIL
  165400. "adcs r3, r3, r6\n\t"
  165401. #elif defined(__clang__)
  165402. "adcs r3, r6\n\t"
  165403. #else
  165404. "adc r3, r6\n\t"
  165405. #endif
  165406. #ifdef WOLFSSL_KEIL
  165407. "adcs r4, r4, %[r]\n\t"
  165408. #elif defined(__clang__)
  165409. "adcs r4, %[r]\n\t"
  165410. #else
  165411. "adc r4, %[r]\n\t"
  165412. #endif
  165413. "# A[9] * A[6]\n\t"
  165414. "mov %[a], r9\n\t"
  165415. "ldr r7, [%[a], #24]\n\t"
  165416. "ldr %[a], [%[a], #36]\n\t"
  165417. "uxth r5, %[a]\n\t"
  165418. "uxth r6, r7\n\t"
  165419. #ifdef WOLFSSL_KEIL
  165420. "muls r6, r5, r6\n\t"
  165421. #elif defined(__clang__)
  165422. "muls r6, r5\n\t"
  165423. #else
  165424. "mul r6, r5\n\t"
  165425. #endif
  165426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165427. "adds r2, r2, r6\n\t"
  165428. #else
  165429. "add r2, r2, r6\n\t"
  165430. #endif
  165431. #ifdef WOLFSSL_KEIL
  165432. "adcs r3, r3, %[r]\n\t"
  165433. #elif defined(__clang__)
  165434. "adcs r3, %[r]\n\t"
  165435. #else
  165436. "adc r3, %[r]\n\t"
  165437. #endif
  165438. #ifdef WOLFSSL_KEIL
  165439. "adcs r4, r4, %[r]\n\t"
  165440. #elif defined(__clang__)
  165441. "adcs r4, %[r]\n\t"
  165442. #else
  165443. "adc r4, %[r]\n\t"
  165444. #endif
  165445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165446. "adds r2, r2, r6\n\t"
  165447. #else
  165448. "add r2, r2, r6\n\t"
  165449. #endif
  165450. #ifdef WOLFSSL_KEIL
  165451. "adcs r3, r3, %[r]\n\t"
  165452. #elif defined(__clang__)
  165453. "adcs r3, %[r]\n\t"
  165454. #else
  165455. "adc r3, %[r]\n\t"
  165456. #endif
  165457. #ifdef WOLFSSL_KEIL
  165458. "adcs r4, r4, %[r]\n\t"
  165459. #elif defined(__clang__)
  165460. "adcs r4, %[r]\n\t"
  165461. #else
  165462. "adc r4, %[r]\n\t"
  165463. #endif
  165464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165465. "lsrs r6, r7, #16\n\t"
  165466. #else
  165467. "lsr r6, r7, #16\n\t"
  165468. #endif
  165469. #ifdef WOLFSSL_KEIL
  165470. "muls r5, r6, r5\n\t"
  165471. #elif defined(__clang__)
  165472. "muls r5, r6\n\t"
  165473. #else
  165474. "mul r5, r6\n\t"
  165475. #endif
  165476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165477. "lsrs r6, r5, #16\n\t"
  165478. #else
  165479. "lsr r6, r5, #16\n\t"
  165480. #endif
  165481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165482. "lsls r5, r5, #16\n\t"
  165483. #else
  165484. "lsl r5, r5, #16\n\t"
  165485. #endif
  165486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165487. "adds r2, r2, r5\n\t"
  165488. #else
  165489. "add r2, r2, r5\n\t"
  165490. #endif
  165491. #ifdef WOLFSSL_KEIL
  165492. "adcs r3, r3, r6\n\t"
  165493. #elif defined(__clang__)
  165494. "adcs r3, r6\n\t"
  165495. #else
  165496. "adc r3, r6\n\t"
  165497. #endif
  165498. #ifdef WOLFSSL_KEIL
  165499. "adcs r4, r4, %[r]\n\t"
  165500. #elif defined(__clang__)
  165501. "adcs r4, %[r]\n\t"
  165502. #else
  165503. "adc r4, %[r]\n\t"
  165504. #endif
  165505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165506. "adds r2, r2, r5\n\t"
  165507. #else
  165508. "add r2, r2, r5\n\t"
  165509. #endif
  165510. #ifdef WOLFSSL_KEIL
  165511. "adcs r3, r3, r6\n\t"
  165512. #elif defined(__clang__)
  165513. "adcs r3, r6\n\t"
  165514. #else
  165515. "adc r3, r6\n\t"
  165516. #endif
  165517. #ifdef WOLFSSL_KEIL
  165518. "adcs r4, r4, %[r]\n\t"
  165519. #elif defined(__clang__)
  165520. "adcs r4, %[r]\n\t"
  165521. #else
  165522. "adc r4, %[r]\n\t"
  165523. #endif
  165524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165525. "lsrs r5, %[a], #16\n\t"
  165526. #else
  165527. "lsr r5, %[a], #16\n\t"
  165528. #endif
  165529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165530. "lsrs r6, r7, #16\n\t"
  165531. #else
  165532. "lsr r6, r7, #16\n\t"
  165533. #endif
  165534. #ifdef WOLFSSL_KEIL
  165535. "muls r6, r5, r6\n\t"
  165536. #elif defined(__clang__)
  165537. "muls r6, r5\n\t"
  165538. #else
  165539. "mul r6, r5\n\t"
  165540. #endif
  165541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165542. "adds r3, r3, r6\n\t"
  165543. #else
  165544. "add r3, r3, r6\n\t"
  165545. #endif
  165546. #ifdef WOLFSSL_KEIL
  165547. "adcs r4, r4, %[r]\n\t"
  165548. #elif defined(__clang__)
  165549. "adcs r4, %[r]\n\t"
  165550. #else
  165551. "adc r4, %[r]\n\t"
  165552. #endif
  165553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165554. "adds r3, r3, r6\n\t"
  165555. #else
  165556. "add r3, r3, r6\n\t"
  165557. #endif
  165558. #ifdef WOLFSSL_KEIL
  165559. "adcs r4, r4, %[r]\n\t"
  165560. #elif defined(__clang__)
  165561. "adcs r4, %[r]\n\t"
  165562. #else
  165563. "adc r4, %[r]\n\t"
  165564. #endif
  165565. "uxth r6, r7\n\t"
  165566. #ifdef WOLFSSL_KEIL
  165567. "muls r5, r6, r5\n\t"
  165568. #elif defined(__clang__)
  165569. "muls r5, r6\n\t"
  165570. #else
  165571. "mul r5, r6\n\t"
  165572. #endif
  165573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165574. "lsrs r6, r5, #16\n\t"
  165575. #else
  165576. "lsr r6, r5, #16\n\t"
  165577. #endif
  165578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165579. "lsls r5, r5, #16\n\t"
  165580. #else
  165581. "lsl r5, r5, #16\n\t"
  165582. #endif
  165583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165584. "adds r2, r2, r5\n\t"
  165585. #else
  165586. "add r2, r2, r5\n\t"
  165587. #endif
  165588. #ifdef WOLFSSL_KEIL
  165589. "adcs r3, r3, r6\n\t"
  165590. #elif defined(__clang__)
  165591. "adcs r3, r6\n\t"
  165592. #else
  165593. "adc r3, r6\n\t"
  165594. #endif
  165595. #ifdef WOLFSSL_KEIL
  165596. "adcs r4, r4, %[r]\n\t"
  165597. #elif defined(__clang__)
  165598. "adcs r4, %[r]\n\t"
  165599. #else
  165600. "adc r4, %[r]\n\t"
  165601. #endif
  165602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165603. "adds r2, r2, r5\n\t"
  165604. #else
  165605. "add r2, r2, r5\n\t"
  165606. #endif
  165607. #ifdef WOLFSSL_KEIL
  165608. "adcs r3, r3, r6\n\t"
  165609. #elif defined(__clang__)
  165610. "adcs r3, r6\n\t"
  165611. #else
  165612. "adc r3, r6\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. "# A[10] * A[5]\n\t"
  165622. "mov %[a], r9\n\t"
  165623. "ldr r7, [%[a], #20]\n\t"
  165624. "ldr %[a], [%[a], #40]\n\t"
  165625. "uxth r5, %[a]\n\t"
  165626. "uxth r6, r7\n\t"
  165627. #ifdef WOLFSSL_KEIL
  165628. "muls r6, r5, r6\n\t"
  165629. #elif defined(__clang__)
  165630. "muls r6, r5\n\t"
  165631. #else
  165632. "mul r6, r5\n\t"
  165633. #endif
  165634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165635. "adds r2, r2, r6\n\t"
  165636. #else
  165637. "add r2, r2, r6\n\t"
  165638. #endif
  165639. #ifdef WOLFSSL_KEIL
  165640. "adcs r3, r3, %[r]\n\t"
  165641. #elif defined(__clang__)
  165642. "adcs r3, %[r]\n\t"
  165643. #else
  165644. "adc r3, %[r]\n\t"
  165645. #endif
  165646. #ifdef WOLFSSL_KEIL
  165647. "adcs r4, r4, %[r]\n\t"
  165648. #elif defined(__clang__)
  165649. "adcs r4, %[r]\n\t"
  165650. #else
  165651. "adc r4, %[r]\n\t"
  165652. #endif
  165653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165654. "adds r2, r2, r6\n\t"
  165655. #else
  165656. "add r2, r2, r6\n\t"
  165657. #endif
  165658. #ifdef WOLFSSL_KEIL
  165659. "adcs r3, r3, %[r]\n\t"
  165660. #elif defined(__clang__)
  165661. "adcs r3, %[r]\n\t"
  165662. #else
  165663. "adc r3, %[r]\n\t"
  165664. #endif
  165665. #ifdef WOLFSSL_KEIL
  165666. "adcs r4, r4, %[r]\n\t"
  165667. #elif defined(__clang__)
  165668. "adcs r4, %[r]\n\t"
  165669. #else
  165670. "adc r4, %[r]\n\t"
  165671. #endif
  165672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165673. "lsrs r6, r7, #16\n\t"
  165674. #else
  165675. "lsr r6, r7, #16\n\t"
  165676. #endif
  165677. #ifdef WOLFSSL_KEIL
  165678. "muls r5, r6, r5\n\t"
  165679. #elif defined(__clang__)
  165680. "muls r5, r6\n\t"
  165681. #else
  165682. "mul r5, r6\n\t"
  165683. #endif
  165684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165685. "lsrs r6, r5, #16\n\t"
  165686. #else
  165687. "lsr r6, r5, #16\n\t"
  165688. #endif
  165689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165690. "lsls r5, r5, #16\n\t"
  165691. #else
  165692. "lsl r5, r5, #16\n\t"
  165693. #endif
  165694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165695. "adds r2, r2, r5\n\t"
  165696. #else
  165697. "add r2, r2, r5\n\t"
  165698. #endif
  165699. #ifdef WOLFSSL_KEIL
  165700. "adcs r3, r3, r6\n\t"
  165701. #elif defined(__clang__)
  165702. "adcs r3, r6\n\t"
  165703. #else
  165704. "adc r3, r6\n\t"
  165705. #endif
  165706. #ifdef WOLFSSL_KEIL
  165707. "adcs r4, r4, %[r]\n\t"
  165708. #elif defined(__clang__)
  165709. "adcs r4, %[r]\n\t"
  165710. #else
  165711. "adc r4, %[r]\n\t"
  165712. #endif
  165713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165714. "adds r2, r2, r5\n\t"
  165715. #else
  165716. "add r2, r2, r5\n\t"
  165717. #endif
  165718. #ifdef WOLFSSL_KEIL
  165719. "adcs r3, r3, r6\n\t"
  165720. #elif defined(__clang__)
  165721. "adcs r3, r6\n\t"
  165722. #else
  165723. "adc r3, r6\n\t"
  165724. #endif
  165725. #ifdef WOLFSSL_KEIL
  165726. "adcs r4, r4, %[r]\n\t"
  165727. #elif defined(__clang__)
  165728. "adcs r4, %[r]\n\t"
  165729. #else
  165730. "adc r4, %[r]\n\t"
  165731. #endif
  165732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165733. "lsrs r5, %[a], #16\n\t"
  165734. #else
  165735. "lsr r5, %[a], #16\n\t"
  165736. #endif
  165737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165738. "lsrs r6, r7, #16\n\t"
  165739. #else
  165740. "lsr r6, r7, #16\n\t"
  165741. #endif
  165742. #ifdef WOLFSSL_KEIL
  165743. "muls r6, r5, r6\n\t"
  165744. #elif defined(__clang__)
  165745. "muls r6, r5\n\t"
  165746. #else
  165747. "mul r6, r5\n\t"
  165748. #endif
  165749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165750. "adds r3, r3, r6\n\t"
  165751. #else
  165752. "add r3, r3, r6\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. "adds r3, r3, r6\n\t"
  165763. #else
  165764. "add r3, r3, r6\n\t"
  165765. #endif
  165766. #ifdef WOLFSSL_KEIL
  165767. "adcs r4, r4, %[r]\n\t"
  165768. #elif defined(__clang__)
  165769. "adcs r4, %[r]\n\t"
  165770. #else
  165771. "adc r4, %[r]\n\t"
  165772. #endif
  165773. "uxth r6, r7\n\t"
  165774. #ifdef WOLFSSL_KEIL
  165775. "muls r5, r6, r5\n\t"
  165776. #elif defined(__clang__)
  165777. "muls r5, r6\n\t"
  165778. #else
  165779. "mul r5, r6\n\t"
  165780. #endif
  165781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165782. "lsrs r6, r5, #16\n\t"
  165783. #else
  165784. "lsr r6, r5, #16\n\t"
  165785. #endif
  165786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165787. "lsls r5, r5, #16\n\t"
  165788. #else
  165789. "lsl r5, r5, #16\n\t"
  165790. #endif
  165791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165792. "adds r2, r2, r5\n\t"
  165793. #else
  165794. "add r2, r2, r5\n\t"
  165795. #endif
  165796. #ifdef WOLFSSL_KEIL
  165797. "adcs r3, r3, r6\n\t"
  165798. #elif defined(__clang__)
  165799. "adcs r3, r6\n\t"
  165800. #else
  165801. "adc r3, r6\n\t"
  165802. #endif
  165803. #ifdef WOLFSSL_KEIL
  165804. "adcs r4, r4, %[r]\n\t"
  165805. #elif defined(__clang__)
  165806. "adcs r4, %[r]\n\t"
  165807. #else
  165808. "adc r4, %[r]\n\t"
  165809. #endif
  165810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165811. "adds r2, r2, r5\n\t"
  165812. #else
  165813. "add r2, r2, r5\n\t"
  165814. #endif
  165815. #ifdef WOLFSSL_KEIL
  165816. "adcs r3, r3, r6\n\t"
  165817. #elif defined(__clang__)
  165818. "adcs r3, r6\n\t"
  165819. #else
  165820. "adc r3, r6\n\t"
  165821. #endif
  165822. #ifdef WOLFSSL_KEIL
  165823. "adcs r4, r4, %[r]\n\t"
  165824. #elif defined(__clang__)
  165825. "adcs r4, %[r]\n\t"
  165826. #else
  165827. "adc r4, %[r]\n\t"
  165828. #endif
  165829. "# A[11] * A[4]\n\t"
  165830. "mov %[a], r9\n\t"
  165831. "ldr r7, [%[a], #16]\n\t"
  165832. "ldr %[a], [%[a], #44]\n\t"
  165833. "uxth r5, %[a]\n\t"
  165834. "uxth r6, r7\n\t"
  165835. #ifdef WOLFSSL_KEIL
  165836. "muls r6, r5, r6\n\t"
  165837. #elif defined(__clang__)
  165838. "muls r6, r5\n\t"
  165839. #else
  165840. "mul r6, r5\n\t"
  165841. #endif
  165842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165843. "adds r2, r2, r6\n\t"
  165844. #else
  165845. "add r2, r2, r6\n\t"
  165846. #endif
  165847. #ifdef WOLFSSL_KEIL
  165848. "adcs r3, r3, %[r]\n\t"
  165849. #elif defined(__clang__)
  165850. "adcs r3, %[r]\n\t"
  165851. #else
  165852. "adc r3, %[r]\n\t"
  165853. #endif
  165854. #ifdef WOLFSSL_KEIL
  165855. "adcs r4, r4, %[r]\n\t"
  165856. #elif defined(__clang__)
  165857. "adcs r4, %[r]\n\t"
  165858. #else
  165859. "adc r4, %[r]\n\t"
  165860. #endif
  165861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165862. "adds r2, r2, r6\n\t"
  165863. #else
  165864. "add r2, r2, r6\n\t"
  165865. #endif
  165866. #ifdef WOLFSSL_KEIL
  165867. "adcs r3, r3, %[r]\n\t"
  165868. #elif defined(__clang__)
  165869. "adcs r3, %[r]\n\t"
  165870. #else
  165871. "adc r3, %[r]\n\t"
  165872. #endif
  165873. #ifdef WOLFSSL_KEIL
  165874. "adcs r4, r4, %[r]\n\t"
  165875. #elif defined(__clang__)
  165876. "adcs r4, %[r]\n\t"
  165877. #else
  165878. "adc r4, %[r]\n\t"
  165879. #endif
  165880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165881. "lsrs r6, r7, #16\n\t"
  165882. #else
  165883. "lsr r6, r7, #16\n\t"
  165884. #endif
  165885. #ifdef WOLFSSL_KEIL
  165886. "muls r5, r6, r5\n\t"
  165887. #elif defined(__clang__)
  165888. "muls r5, r6\n\t"
  165889. #else
  165890. "mul r5, r6\n\t"
  165891. #endif
  165892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165893. "lsrs r6, r5, #16\n\t"
  165894. #else
  165895. "lsr r6, r5, #16\n\t"
  165896. #endif
  165897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165898. "lsls r5, r5, #16\n\t"
  165899. #else
  165900. "lsl r5, r5, #16\n\t"
  165901. #endif
  165902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165903. "adds r2, r2, r5\n\t"
  165904. #else
  165905. "add r2, r2, r5\n\t"
  165906. #endif
  165907. #ifdef WOLFSSL_KEIL
  165908. "adcs r3, r3, r6\n\t"
  165909. #elif defined(__clang__)
  165910. "adcs r3, r6\n\t"
  165911. #else
  165912. "adc r3, r6\n\t"
  165913. #endif
  165914. #ifdef WOLFSSL_KEIL
  165915. "adcs r4, r4, %[r]\n\t"
  165916. #elif defined(__clang__)
  165917. "adcs r4, %[r]\n\t"
  165918. #else
  165919. "adc r4, %[r]\n\t"
  165920. #endif
  165921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165922. "adds r2, r2, r5\n\t"
  165923. #else
  165924. "add r2, r2, r5\n\t"
  165925. #endif
  165926. #ifdef WOLFSSL_KEIL
  165927. "adcs r3, r3, r6\n\t"
  165928. #elif defined(__clang__)
  165929. "adcs r3, r6\n\t"
  165930. #else
  165931. "adc r3, r6\n\t"
  165932. #endif
  165933. #ifdef WOLFSSL_KEIL
  165934. "adcs r4, r4, %[r]\n\t"
  165935. #elif defined(__clang__)
  165936. "adcs r4, %[r]\n\t"
  165937. #else
  165938. "adc r4, %[r]\n\t"
  165939. #endif
  165940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165941. "lsrs r5, %[a], #16\n\t"
  165942. #else
  165943. "lsr r5, %[a], #16\n\t"
  165944. #endif
  165945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165946. "lsrs r6, r7, #16\n\t"
  165947. #else
  165948. "lsr r6, r7, #16\n\t"
  165949. #endif
  165950. #ifdef WOLFSSL_KEIL
  165951. "muls r6, r5, r6\n\t"
  165952. #elif defined(__clang__)
  165953. "muls r6, r5\n\t"
  165954. #else
  165955. "mul r6, r5\n\t"
  165956. #endif
  165957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165958. "adds r3, r3, r6\n\t"
  165959. #else
  165960. "add r3, r3, r6\n\t"
  165961. #endif
  165962. #ifdef WOLFSSL_KEIL
  165963. "adcs r4, r4, %[r]\n\t"
  165964. #elif defined(__clang__)
  165965. "adcs r4, %[r]\n\t"
  165966. #else
  165967. "adc r4, %[r]\n\t"
  165968. #endif
  165969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165970. "adds r3, r3, r6\n\t"
  165971. #else
  165972. "add r3, r3, r6\n\t"
  165973. #endif
  165974. #ifdef WOLFSSL_KEIL
  165975. "adcs r4, r4, %[r]\n\t"
  165976. #elif defined(__clang__)
  165977. "adcs r4, %[r]\n\t"
  165978. #else
  165979. "adc r4, %[r]\n\t"
  165980. #endif
  165981. "uxth r6, r7\n\t"
  165982. #ifdef WOLFSSL_KEIL
  165983. "muls r5, r6, r5\n\t"
  165984. #elif defined(__clang__)
  165985. "muls r5, r6\n\t"
  165986. #else
  165987. "mul r5, r6\n\t"
  165988. #endif
  165989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165990. "lsrs r6, r5, #16\n\t"
  165991. #else
  165992. "lsr r6, r5, #16\n\t"
  165993. #endif
  165994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165995. "lsls r5, r5, #16\n\t"
  165996. #else
  165997. "lsl r5, r5, #16\n\t"
  165998. #endif
  165999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166000. "adds r2, r2, r5\n\t"
  166001. #else
  166002. "add r2, r2, r5\n\t"
  166003. #endif
  166004. #ifdef WOLFSSL_KEIL
  166005. "adcs r3, r3, r6\n\t"
  166006. #elif defined(__clang__)
  166007. "adcs r3, r6\n\t"
  166008. #else
  166009. "adc r3, r6\n\t"
  166010. #endif
  166011. #ifdef WOLFSSL_KEIL
  166012. "adcs r4, r4, %[r]\n\t"
  166013. #elif defined(__clang__)
  166014. "adcs r4, %[r]\n\t"
  166015. #else
  166016. "adc r4, %[r]\n\t"
  166017. #endif
  166018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166019. "adds r2, r2, r5\n\t"
  166020. #else
  166021. "add r2, r2, r5\n\t"
  166022. #endif
  166023. #ifdef WOLFSSL_KEIL
  166024. "adcs r3, r3, r6\n\t"
  166025. #elif defined(__clang__)
  166026. "adcs r3, r6\n\t"
  166027. #else
  166028. "adc r3, r6\n\t"
  166029. #endif
  166030. #ifdef WOLFSSL_KEIL
  166031. "adcs r4, r4, %[r]\n\t"
  166032. #elif defined(__clang__)
  166033. "adcs r4, %[r]\n\t"
  166034. #else
  166035. "adc r4, %[r]\n\t"
  166036. #endif
  166037. "# A[12] * A[3]\n\t"
  166038. "mov %[a], r9\n\t"
  166039. "mov r7, lr\n\t"
  166040. "ldr %[a], [%[a], #48]\n\t"
  166041. "uxth r5, %[a]\n\t"
  166042. "uxth r6, r7\n\t"
  166043. #ifdef WOLFSSL_KEIL
  166044. "muls r6, r5, r6\n\t"
  166045. #elif defined(__clang__)
  166046. "muls r6, r5\n\t"
  166047. #else
  166048. "mul r6, r5\n\t"
  166049. #endif
  166050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166051. "adds r2, r2, r6\n\t"
  166052. #else
  166053. "add r2, r2, r6\n\t"
  166054. #endif
  166055. #ifdef WOLFSSL_KEIL
  166056. "adcs r3, r3, %[r]\n\t"
  166057. #elif defined(__clang__)
  166058. "adcs r3, %[r]\n\t"
  166059. #else
  166060. "adc r3, %[r]\n\t"
  166061. #endif
  166062. #ifdef WOLFSSL_KEIL
  166063. "adcs r4, r4, %[r]\n\t"
  166064. #elif defined(__clang__)
  166065. "adcs r4, %[r]\n\t"
  166066. #else
  166067. "adc r4, %[r]\n\t"
  166068. #endif
  166069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166070. "adds r2, r2, r6\n\t"
  166071. #else
  166072. "add r2, r2, r6\n\t"
  166073. #endif
  166074. #ifdef WOLFSSL_KEIL
  166075. "adcs r3, r3, %[r]\n\t"
  166076. #elif defined(__clang__)
  166077. "adcs r3, %[r]\n\t"
  166078. #else
  166079. "adc r3, %[r]\n\t"
  166080. #endif
  166081. #ifdef WOLFSSL_KEIL
  166082. "adcs r4, r4, %[r]\n\t"
  166083. #elif defined(__clang__)
  166084. "adcs r4, %[r]\n\t"
  166085. #else
  166086. "adc r4, %[r]\n\t"
  166087. #endif
  166088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166089. "lsrs r6, r7, #16\n\t"
  166090. #else
  166091. "lsr r6, r7, #16\n\t"
  166092. #endif
  166093. #ifdef WOLFSSL_KEIL
  166094. "muls r5, r6, r5\n\t"
  166095. #elif defined(__clang__)
  166096. "muls r5, r6\n\t"
  166097. #else
  166098. "mul r5, r6\n\t"
  166099. #endif
  166100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166101. "lsrs r6, r5, #16\n\t"
  166102. #else
  166103. "lsr r6, r5, #16\n\t"
  166104. #endif
  166105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166106. "lsls r5, r5, #16\n\t"
  166107. #else
  166108. "lsl r5, r5, #16\n\t"
  166109. #endif
  166110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166111. "adds r2, r2, r5\n\t"
  166112. #else
  166113. "add r2, r2, r5\n\t"
  166114. #endif
  166115. #ifdef WOLFSSL_KEIL
  166116. "adcs r3, r3, r6\n\t"
  166117. #elif defined(__clang__)
  166118. "adcs r3, r6\n\t"
  166119. #else
  166120. "adc r3, r6\n\t"
  166121. #endif
  166122. #ifdef WOLFSSL_KEIL
  166123. "adcs r4, r4, %[r]\n\t"
  166124. #elif defined(__clang__)
  166125. "adcs r4, %[r]\n\t"
  166126. #else
  166127. "adc r4, %[r]\n\t"
  166128. #endif
  166129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166130. "adds r2, r2, r5\n\t"
  166131. #else
  166132. "add r2, r2, r5\n\t"
  166133. #endif
  166134. #ifdef WOLFSSL_KEIL
  166135. "adcs r3, r3, r6\n\t"
  166136. #elif defined(__clang__)
  166137. "adcs r3, r6\n\t"
  166138. #else
  166139. "adc r3, r6\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166149. "lsrs r5, %[a], #16\n\t"
  166150. #else
  166151. "lsr r5, %[a], #16\n\t"
  166152. #endif
  166153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166154. "lsrs r6, r7, #16\n\t"
  166155. #else
  166156. "lsr r6, r7, #16\n\t"
  166157. #endif
  166158. #ifdef WOLFSSL_KEIL
  166159. "muls r6, r5, r6\n\t"
  166160. #elif defined(__clang__)
  166161. "muls r6, r5\n\t"
  166162. #else
  166163. "mul r6, r5\n\t"
  166164. #endif
  166165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166166. "adds r3, r3, r6\n\t"
  166167. #else
  166168. "add r3, r3, r6\n\t"
  166169. #endif
  166170. #ifdef WOLFSSL_KEIL
  166171. "adcs r4, r4, %[r]\n\t"
  166172. #elif defined(__clang__)
  166173. "adcs r4, %[r]\n\t"
  166174. #else
  166175. "adc r4, %[r]\n\t"
  166176. #endif
  166177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166178. "adds r3, r3, r6\n\t"
  166179. #else
  166180. "add r3, r3, r6\n\t"
  166181. #endif
  166182. #ifdef WOLFSSL_KEIL
  166183. "adcs r4, r4, %[r]\n\t"
  166184. #elif defined(__clang__)
  166185. "adcs r4, %[r]\n\t"
  166186. #else
  166187. "adc r4, %[r]\n\t"
  166188. #endif
  166189. "uxth r6, r7\n\t"
  166190. #ifdef WOLFSSL_KEIL
  166191. "muls r5, r6, r5\n\t"
  166192. #elif defined(__clang__)
  166193. "muls r5, r6\n\t"
  166194. #else
  166195. "mul r5, r6\n\t"
  166196. #endif
  166197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166198. "lsrs r6, r5, #16\n\t"
  166199. #else
  166200. "lsr r6, r5, #16\n\t"
  166201. #endif
  166202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166203. "lsls r5, r5, #16\n\t"
  166204. #else
  166205. "lsl r5, r5, #16\n\t"
  166206. #endif
  166207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166208. "adds r2, r2, r5\n\t"
  166209. #else
  166210. "add r2, r2, r5\n\t"
  166211. #endif
  166212. #ifdef WOLFSSL_KEIL
  166213. "adcs r3, r3, r6\n\t"
  166214. #elif defined(__clang__)
  166215. "adcs r3, r6\n\t"
  166216. #else
  166217. "adc r3, r6\n\t"
  166218. #endif
  166219. #ifdef WOLFSSL_KEIL
  166220. "adcs r4, r4, %[r]\n\t"
  166221. #elif defined(__clang__)
  166222. "adcs r4, %[r]\n\t"
  166223. #else
  166224. "adc r4, %[r]\n\t"
  166225. #endif
  166226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166227. "adds r2, r2, r5\n\t"
  166228. #else
  166229. "add r2, r2, r5\n\t"
  166230. #endif
  166231. #ifdef WOLFSSL_KEIL
  166232. "adcs r3, r3, r6\n\t"
  166233. #elif defined(__clang__)
  166234. "adcs r3, r6\n\t"
  166235. #else
  166236. "adc r3, r6\n\t"
  166237. #endif
  166238. #ifdef WOLFSSL_KEIL
  166239. "adcs r4, r4, %[r]\n\t"
  166240. #elif defined(__clang__)
  166241. "adcs r4, %[r]\n\t"
  166242. #else
  166243. "adc r4, %[r]\n\t"
  166244. #endif
  166245. "# A[13] * A[2]\n\t"
  166246. "mov %[a], r9\n\t"
  166247. "mov r7, r12\n\t"
  166248. "ldr %[a], [%[a], #52]\n\t"
  166249. "uxth r5, %[a]\n\t"
  166250. "uxth r6, r7\n\t"
  166251. #ifdef WOLFSSL_KEIL
  166252. "muls r6, r5, r6\n\t"
  166253. #elif defined(__clang__)
  166254. "muls r6, r5\n\t"
  166255. #else
  166256. "mul r6, r5\n\t"
  166257. #endif
  166258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166259. "adds r2, r2, r6\n\t"
  166260. #else
  166261. "add r2, r2, r6\n\t"
  166262. #endif
  166263. #ifdef WOLFSSL_KEIL
  166264. "adcs r3, r3, %[r]\n\t"
  166265. #elif defined(__clang__)
  166266. "adcs r3, %[r]\n\t"
  166267. #else
  166268. "adc r3, %[r]\n\t"
  166269. #endif
  166270. #ifdef WOLFSSL_KEIL
  166271. "adcs r4, r4, %[r]\n\t"
  166272. #elif defined(__clang__)
  166273. "adcs r4, %[r]\n\t"
  166274. #else
  166275. "adc r4, %[r]\n\t"
  166276. #endif
  166277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166278. "adds r2, r2, r6\n\t"
  166279. #else
  166280. "add r2, r2, r6\n\t"
  166281. #endif
  166282. #ifdef WOLFSSL_KEIL
  166283. "adcs r3, r3, %[r]\n\t"
  166284. #elif defined(__clang__)
  166285. "adcs r3, %[r]\n\t"
  166286. #else
  166287. "adc r3, %[r]\n\t"
  166288. #endif
  166289. #ifdef WOLFSSL_KEIL
  166290. "adcs r4, r4, %[r]\n\t"
  166291. #elif defined(__clang__)
  166292. "adcs r4, %[r]\n\t"
  166293. #else
  166294. "adc r4, %[r]\n\t"
  166295. #endif
  166296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166297. "lsrs r6, r7, #16\n\t"
  166298. #else
  166299. "lsr r6, r7, #16\n\t"
  166300. #endif
  166301. #ifdef WOLFSSL_KEIL
  166302. "muls r5, r6, r5\n\t"
  166303. #elif defined(__clang__)
  166304. "muls r5, r6\n\t"
  166305. #else
  166306. "mul r5, r6\n\t"
  166307. #endif
  166308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166309. "lsrs r6, r5, #16\n\t"
  166310. #else
  166311. "lsr r6, r5, #16\n\t"
  166312. #endif
  166313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166314. "lsls r5, r5, #16\n\t"
  166315. #else
  166316. "lsl r5, r5, #16\n\t"
  166317. #endif
  166318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166319. "adds r2, r2, r5\n\t"
  166320. #else
  166321. "add r2, r2, r5\n\t"
  166322. #endif
  166323. #ifdef WOLFSSL_KEIL
  166324. "adcs r3, r3, r6\n\t"
  166325. #elif defined(__clang__)
  166326. "adcs r3, r6\n\t"
  166327. #else
  166328. "adc r3, r6\n\t"
  166329. #endif
  166330. #ifdef WOLFSSL_KEIL
  166331. "adcs r4, r4, %[r]\n\t"
  166332. #elif defined(__clang__)
  166333. "adcs r4, %[r]\n\t"
  166334. #else
  166335. "adc r4, %[r]\n\t"
  166336. #endif
  166337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166338. "adds r2, r2, r5\n\t"
  166339. #else
  166340. "add r2, r2, r5\n\t"
  166341. #endif
  166342. #ifdef WOLFSSL_KEIL
  166343. "adcs r3, r3, r6\n\t"
  166344. #elif defined(__clang__)
  166345. "adcs r3, r6\n\t"
  166346. #else
  166347. "adc r3, r6\n\t"
  166348. #endif
  166349. #ifdef WOLFSSL_KEIL
  166350. "adcs r4, r4, %[r]\n\t"
  166351. #elif defined(__clang__)
  166352. "adcs r4, %[r]\n\t"
  166353. #else
  166354. "adc r4, %[r]\n\t"
  166355. #endif
  166356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166357. "lsrs r5, %[a], #16\n\t"
  166358. #else
  166359. "lsr r5, %[a], #16\n\t"
  166360. #endif
  166361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166362. "lsrs r6, r7, #16\n\t"
  166363. #else
  166364. "lsr r6, r7, #16\n\t"
  166365. #endif
  166366. #ifdef WOLFSSL_KEIL
  166367. "muls r6, r5, r6\n\t"
  166368. #elif defined(__clang__)
  166369. "muls r6, r5\n\t"
  166370. #else
  166371. "mul r6, r5\n\t"
  166372. #endif
  166373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166374. "adds r3, r3, r6\n\t"
  166375. #else
  166376. "add r3, r3, r6\n\t"
  166377. #endif
  166378. #ifdef WOLFSSL_KEIL
  166379. "adcs r4, r4, %[r]\n\t"
  166380. #elif defined(__clang__)
  166381. "adcs r4, %[r]\n\t"
  166382. #else
  166383. "adc r4, %[r]\n\t"
  166384. #endif
  166385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166386. "adds r3, r3, r6\n\t"
  166387. #else
  166388. "add r3, r3, r6\n\t"
  166389. #endif
  166390. #ifdef WOLFSSL_KEIL
  166391. "adcs r4, r4, %[r]\n\t"
  166392. #elif defined(__clang__)
  166393. "adcs r4, %[r]\n\t"
  166394. #else
  166395. "adc r4, %[r]\n\t"
  166396. #endif
  166397. "uxth r6, r7\n\t"
  166398. #ifdef WOLFSSL_KEIL
  166399. "muls r5, r6, r5\n\t"
  166400. #elif defined(__clang__)
  166401. "muls r5, r6\n\t"
  166402. #else
  166403. "mul r5, r6\n\t"
  166404. #endif
  166405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166406. "lsrs r6, r5, #16\n\t"
  166407. #else
  166408. "lsr r6, r5, #16\n\t"
  166409. #endif
  166410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166411. "lsls r5, r5, #16\n\t"
  166412. #else
  166413. "lsl r5, r5, #16\n\t"
  166414. #endif
  166415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166416. "adds r2, r2, r5\n\t"
  166417. #else
  166418. "add r2, r2, r5\n\t"
  166419. #endif
  166420. #ifdef WOLFSSL_KEIL
  166421. "adcs r3, r3, r6\n\t"
  166422. #elif defined(__clang__)
  166423. "adcs r3, r6\n\t"
  166424. #else
  166425. "adc r3, r6\n\t"
  166426. #endif
  166427. #ifdef WOLFSSL_KEIL
  166428. "adcs r4, r4, %[r]\n\t"
  166429. #elif defined(__clang__)
  166430. "adcs r4, %[r]\n\t"
  166431. #else
  166432. "adc r4, %[r]\n\t"
  166433. #endif
  166434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166435. "adds r2, r2, r5\n\t"
  166436. #else
  166437. "add r2, r2, r5\n\t"
  166438. #endif
  166439. #ifdef WOLFSSL_KEIL
  166440. "adcs r3, r3, r6\n\t"
  166441. #elif defined(__clang__)
  166442. "adcs r3, r6\n\t"
  166443. #else
  166444. "adc r3, r6\n\t"
  166445. #endif
  166446. #ifdef WOLFSSL_KEIL
  166447. "adcs r4, r4, %[r]\n\t"
  166448. #elif defined(__clang__)
  166449. "adcs r4, %[r]\n\t"
  166450. #else
  166451. "adc r4, %[r]\n\t"
  166452. #endif
  166453. "# A[14] * A[1]\n\t"
  166454. "mov %[a], r9\n\t"
  166455. "mov r7, r11\n\t"
  166456. "ldr %[a], [%[a], #56]\n\t"
  166457. "uxth r5, %[a]\n\t"
  166458. "uxth r6, r7\n\t"
  166459. #ifdef WOLFSSL_KEIL
  166460. "muls r6, r5, r6\n\t"
  166461. #elif defined(__clang__)
  166462. "muls r6, r5\n\t"
  166463. #else
  166464. "mul r6, r5\n\t"
  166465. #endif
  166466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166467. "adds r2, r2, r6\n\t"
  166468. #else
  166469. "add r2, r2, r6\n\t"
  166470. #endif
  166471. #ifdef WOLFSSL_KEIL
  166472. "adcs r3, r3, %[r]\n\t"
  166473. #elif defined(__clang__)
  166474. "adcs r3, %[r]\n\t"
  166475. #else
  166476. "adc r3, %[r]\n\t"
  166477. #endif
  166478. #ifdef WOLFSSL_KEIL
  166479. "adcs r4, r4, %[r]\n\t"
  166480. #elif defined(__clang__)
  166481. "adcs r4, %[r]\n\t"
  166482. #else
  166483. "adc r4, %[r]\n\t"
  166484. #endif
  166485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166486. "adds r2, r2, r6\n\t"
  166487. #else
  166488. "add r2, r2, r6\n\t"
  166489. #endif
  166490. #ifdef WOLFSSL_KEIL
  166491. "adcs r3, r3, %[r]\n\t"
  166492. #elif defined(__clang__)
  166493. "adcs r3, %[r]\n\t"
  166494. #else
  166495. "adc r3, %[r]\n\t"
  166496. #endif
  166497. #ifdef WOLFSSL_KEIL
  166498. "adcs r4, r4, %[r]\n\t"
  166499. #elif defined(__clang__)
  166500. "adcs r4, %[r]\n\t"
  166501. #else
  166502. "adc r4, %[r]\n\t"
  166503. #endif
  166504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166505. "lsrs r6, r7, #16\n\t"
  166506. #else
  166507. "lsr r6, r7, #16\n\t"
  166508. #endif
  166509. #ifdef WOLFSSL_KEIL
  166510. "muls r5, r6, r5\n\t"
  166511. #elif defined(__clang__)
  166512. "muls r5, r6\n\t"
  166513. #else
  166514. "mul r5, r6\n\t"
  166515. #endif
  166516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166517. "lsrs r6, r5, #16\n\t"
  166518. #else
  166519. "lsr r6, r5, #16\n\t"
  166520. #endif
  166521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166522. "lsls r5, r5, #16\n\t"
  166523. #else
  166524. "lsl r5, r5, #16\n\t"
  166525. #endif
  166526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166527. "adds r2, r2, r5\n\t"
  166528. #else
  166529. "add r2, r2, r5\n\t"
  166530. #endif
  166531. #ifdef WOLFSSL_KEIL
  166532. "adcs r3, r3, r6\n\t"
  166533. #elif defined(__clang__)
  166534. "adcs r3, r6\n\t"
  166535. #else
  166536. "adc r3, r6\n\t"
  166537. #endif
  166538. #ifdef WOLFSSL_KEIL
  166539. "adcs r4, r4, %[r]\n\t"
  166540. #elif defined(__clang__)
  166541. "adcs r4, %[r]\n\t"
  166542. #else
  166543. "adc r4, %[r]\n\t"
  166544. #endif
  166545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166546. "adds r2, r2, r5\n\t"
  166547. #else
  166548. "add r2, r2, r5\n\t"
  166549. #endif
  166550. #ifdef WOLFSSL_KEIL
  166551. "adcs r3, r3, r6\n\t"
  166552. #elif defined(__clang__)
  166553. "adcs r3, r6\n\t"
  166554. #else
  166555. "adc r3, r6\n\t"
  166556. #endif
  166557. #ifdef WOLFSSL_KEIL
  166558. "adcs r4, r4, %[r]\n\t"
  166559. #elif defined(__clang__)
  166560. "adcs r4, %[r]\n\t"
  166561. #else
  166562. "adc r4, %[r]\n\t"
  166563. #endif
  166564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166565. "lsrs r5, %[a], #16\n\t"
  166566. #else
  166567. "lsr r5, %[a], #16\n\t"
  166568. #endif
  166569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166570. "lsrs r6, r7, #16\n\t"
  166571. #else
  166572. "lsr r6, r7, #16\n\t"
  166573. #endif
  166574. #ifdef WOLFSSL_KEIL
  166575. "muls r6, r5, r6\n\t"
  166576. #elif defined(__clang__)
  166577. "muls r6, r5\n\t"
  166578. #else
  166579. "mul r6, r5\n\t"
  166580. #endif
  166581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166582. "adds r3, r3, r6\n\t"
  166583. #else
  166584. "add r3, r3, r6\n\t"
  166585. #endif
  166586. #ifdef WOLFSSL_KEIL
  166587. "adcs r4, r4, %[r]\n\t"
  166588. #elif defined(__clang__)
  166589. "adcs r4, %[r]\n\t"
  166590. #else
  166591. "adc r4, %[r]\n\t"
  166592. #endif
  166593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166594. "adds r3, r3, r6\n\t"
  166595. #else
  166596. "add r3, r3, r6\n\t"
  166597. #endif
  166598. #ifdef WOLFSSL_KEIL
  166599. "adcs r4, r4, %[r]\n\t"
  166600. #elif defined(__clang__)
  166601. "adcs r4, %[r]\n\t"
  166602. #else
  166603. "adc r4, %[r]\n\t"
  166604. #endif
  166605. "uxth r6, r7\n\t"
  166606. #ifdef WOLFSSL_KEIL
  166607. "muls r5, r6, r5\n\t"
  166608. #elif defined(__clang__)
  166609. "muls r5, r6\n\t"
  166610. #else
  166611. "mul r5, r6\n\t"
  166612. #endif
  166613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166614. "lsrs r6, r5, #16\n\t"
  166615. #else
  166616. "lsr r6, r5, #16\n\t"
  166617. #endif
  166618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166619. "lsls r5, r5, #16\n\t"
  166620. #else
  166621. "lsl r5, r5, #16\n\t"
  166622. #endif
  166623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166624. "adds r2, r2, r5\n\t"
  166625. #else
  166626. "add r2, r2, r5\n\t"
  166627. #endif
  166628. #ifdef WOLFSSL_KEIL
  166629. "adcs r3, r3, r6\n\t"
  166630. #elif defined(__clang__)
  166631. "adcs r3, r6\n\t"
  166632. #else
  166633. "adc r3, r6\n\t"
  166634. #endif
  166635. #ifdef WOLFSSL_KEIL
  166636. "adcs r4, r4, %[r]\n\t"
  166637. #elif defined(__clang__)
  166638. "adcs r4, %[r]\n\t"
  166639. #else
  166640. "adc r4, %[r]\n\t"
  166641. #endif
  166642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166643. "adds r2, r2, r5\n\t"
  166644. #else
  166645. "add r2, r2, r5\n\t"
  166646. #endif
  166647. #ifdef WOLFSSL_KEIL
  166648. "adcs r3, r3, r6\n\t"
  166649. #elif defined(__clang__)
  166650. "adcs r3, r6\n\t"
  166651. #else
  166652. "adc r3, r6\n\t"
  166653. #endif
  166654. #ifdef WOLFSSL_KEIL
  166655. "adcs r4, r4, %[r]\n\t"
  166656. #elif defined(__clang__)
  166657. "adcs r4, %[r]\n\t"
  166658. #else
  166659. "adc r4, %[r]\n\t"
  166660. #endif
  166661. "# A[15] * A[0]\n\t"
  166662. "mov %[a], r9\n\t"
  166663. "mov r7, r10\n\t"
  166664. "ldr %[a], [%[a], #60]\n\t"
  166665. "uxth r5, %[a]\n\t"
  166666. "uxth r6, r7\n\t"
  166667. #ifdef WOLFSSL_KEIL
  166668. "muls r6, r5, r6\n\t"
  166669. #elif defined(__clang__)
  166670. "muls r6, r5\n\t"
  166671. #else
  166672. "mul r6, r5\n\t"
  166673. #endif
  166674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166675. "adds r2, r2, r6\n\t"
  166676. #else
  166677. "add r2, r2, r6\n\t"
  166678. #endif
  166679. #ifdef WOLFSSL_KEIL
  166680. "adcs r3, r3, %[r]\n\t"
  166681. #elif defined(__clang__)
  166682. "adcs r3, %[r]\n\t"
  166683. #else
  166684. "adc r3, %[r]\n\t"
  166685. #endif
  166686. #ifdef WOLFSSL_KEIL
  166687. "adcs r4, r4, %[r]\n\t"
  166688. #elif defined(__clang__)
  166689. "adcs r4, %[r]\n\t"
  166690. #else
  166691. "adc r4, %[r]\n\t"
  166692. #endif
  166693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166694. "adds r2, r2, r6\n\t"
  166695. #else
  166696. "add r2, r2, r6\n\t"
  166697. #endif
  166698. #ifdef WOLFSSL_KEIL
  166699. "adcs r3, r3, %[r]\n\t"
  166700. #elif defined(__clang__)
  166701. "adcs r3, %[r]\n\t"
  166702. #else
  166703. "adc r3, %[r]\n\t"
  166704. #endif
  166705. #ifdef WOLFSSL_KEIL
  166706. "adcs r4, r4, %[r]\n\t"
  166707. #elif defined(__clang__)
  166708. "adcs r4, %[r]\n\t"
  166709. #else
  166710. "adc r4, %[r]\n\t"
  166711. #endif
  166712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166713. "lsrs r6, r7, #16\n\t"
  166714. #else
  166715. "lsr r6, r7, #16\n\t"
  166716. #endif
  166717. #ifdef WOLFSSL_KEIL
  166718. "muls r5, r6, r5\n\t"
  166719. #elif defined(__clang__)
  166720. "muls r5, r6\n\t"
  166721. #else
  166722. "mul r5, r6\n\t"
  166723. #endif
  166724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166725. "lsrs r6, r5, #16\n\t"
  166726. #else
  166727. "lsr r6, r5, #16\n\t"
  166728. #endif
  166729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166730. "lsls r5, r5, #16\n\t"
  166731. #else
  166732. "lsl r5, r5, #16\n\t"
  166733. #endif
  166734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166735. "adds r2, r2, r5\n\t"
  166736. #else
  166737. "add r2, r2, r5\n\t"
  166738. #endif
  166739. #ifdef WOLFSSL_KEIL
  166740. "adcs r3, r3, r6\n\t"
  166741. #elif defined(__clang__)
  166742. "adcs r3, r6\n\t"
  166743. #else
  166744. "adc r3, r6\n\t"
  166745. #endif
  166746. #ifdef WOLFSSL_KEIL
  166747. "adcs r4, r4, %[r]\n\t"
  166748. #elif defined(__clang__)
  166749. "adcs r4, %[r]\n\t"
  166750. #else
  166751. "adc r4, %[r]\n\t"
  166752. #endif
  166753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166754. "adds r2, r2, r5\n\t"
  166755. #else
  166756. "add r2, r2, r5\n\t"
  166757. #endif
  166758. #ifdef WOLFSSL_KEIL
  166759. "adcs r3, r3, r6\n\t"
  166760. #elif defined(__clang__)
  166761. "adcs r3, r6\n\t"
  166762. #else
  166763. "adc r3, r6\n\t"
  166764. #endif
  166765. #ifdef WOLFSSL_KEIL
  166766. "adcs r4, r4, %[r]\n\t"
  166767. #elif defined(__clang__)
  166768. "adcs r4, %[r]\n\t"
  166769. #else
  166770. "adc r4, %[r]\n\t"
  166771. #endif
  166772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166773. "lsrs r5, %[a], #16\n\t"
  166774. #else
  166775. "lsr r5, %[a], #16\n\t"
  166776. #endif
  166777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166778. "lsrs r6, r7, #16\n\t"
  166779. #else
  166780. "lsr r6, r7, #16\n\t"
  166781. #endif
  166782. #ifdef WOLFSSL_KEIL
  166783. "muls r6, r5, r6\n\t"
  166784. #elif defined(__clang__)
  166785. "muls r6, r5\n\t"
  166786. #else
  166787. "mul r6, r5\n\t"
  166788. #endif
  166789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166790. "adds r3, r3, r6\n\t"
  166791. #else
  166792. "add r3, r3, r6\n\t"
  166793. #endif
  166794. #ifdef WOLFSSL_KEIL
  166795. "adcs r4, r4, %[r]\n\t"
  166796. #elif defined(__clang__)
  166797. "adcs r4, %[r]\n\t"
  166798. #else
  166799. "adc r4, %[r]\n\t"
  166800. #endif
  166801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166802. "adds r3, r3, r6\n\t"
  166803. #else
  166804. "add r3, r3, r6\n\t"
  166805. #endif
  166806. #ifdef WOLFSSL_KEIL
  166807. "adcs r4, r4, %[r]\n\t"
  166808. #elif defined(__clang__)
  166809. "adcs r4, %[r]\n\t"
  166810. #else
  166811. "adc r4, %[r]\n\t"
  166812. #endif
  166813. "uxth r6, r7\n\t"
  166814. #ifdef WOLFSSL_KEIL
  166815. "muls r5, r6, r5\n\t"
  166816. #elif defined(__clang__)
  166817. "muls r5, r6\n\t"
  166818. #else
  166819. "mul r5, r6\n\t"
  166820. #endif
  166821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166822. "lsrs r6, r5, #16\n\t"
  166823. #else
  166824. "lsr r6, r5, #16\n\t"
  166825. #endif
  166826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166827. "lsls r5, r5, #16\n\t"
  166828. #else
  166829. "lsl r5, r5, #16\n\t"
  166830. #endif
  166831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166832. "adds r2, r2, r5\n\t"
  166833. #else
  166834. "add r2, r2, r5\n\t"
  166835. #endif
  166836. #ifdef WOLFSSL_KEIL
  166837. "adcs r3, r3, r6\n\t"
  166838. #elif defined(__clang__)
  166839. "adcs r3, r6\n\t"
  166840. #else
  166841. "adc r3, r6\n\t"
  166842. #endif
  166843. #ifdef WOLFSSL_KEIL
  166844. "adcs r4, r4, %[r]\n\t"
  166845. #elif defined(__clang__)
  166846. "adcs r4, %[r]\n\t"
  166847. #else
  166848. "adc r4, %[r]\n\t"
  166849. #endif
  166850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166851. "adds r2, r2, r5\n\t"
  166852. #else
  166853. "add r2, r2, r5\n\t"
  166854. #endif
  166855. #ifdef WOLFSSL_KEIL
  166856. "adcs r3, r3, r6\n\t"
  166857. #elif defined(__clang__)
  166858. "adcs r3, r6\n\t"
  166859. #else
  166860. "adc r3, r6\n\t"
  166861. #endif
  166862. #ifdef WOLFSSL_KEIL
  166863. "adcs r4, r4, %[r]\n\t"
  166864. #elif defined(__clang__)
  166865. "adcs r4, %[r]\n\t"
  166866. #else
  166867. "adc r4, %[r]\n\t"
  166868. #endif
  166869. "str r2, [sp, #60]\n\t"
  166870. "# A[15] * A[1]\n\t"
  166871. "movs r2, #0\n\t"
  166872. "mov %[a], r9\n\t"
  166873. "mov r7, r11\n\t"
  166874. "ldr %[a], [%[a], #60]\n\t"
  166875. "uxth r5, %[a]\n\t"
  166876. "uxth r6, r7\n\t"
  166877. #ifdef WOLFSSL_KEIL
  166878. "muls r6, r5, r6\n\t"
  166879. #elif defined(__clang__)
  166880. "muls r6, r5\n\t"
  166881. #else
  166882. "mul r6, r5\n\t"
  166883. #endif
  166884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166885. "adds r3, r3, r6\n\t"
  166886. #else
  166887. "add r3, r3, r6\n\t"
  166888. #endif
  166889. #ifdef WOLFSSL_KEIL
  166890. "adcs r4, r4, %[r]\n\t"
  166891. #elif defined(__clang__)
  166892. "adcs r4, %[r]\n\t"
  166893. #else
  166894. "adc r4, %[r]\n\t"
  166895. #endif
  166896. #ifdef WOLFSSL_KEIL
  166897. "adcs r2, r2, %[r]\n\t"
  166898. #elif defined(__clang__)
  166899. "adcs r2, %[r]\n\t"
  166900. #else
  166901. "adc r2, %[r]\n\t"
  166902. #endif
  166903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166904. "adds r3, r3, r6\n\t"
  166905. #else
  166906. "add r3, r3, r6\n\t"
  166907. #endif
  166908. #ifdef WOLFSSL_KEIL
  166909. "adcs r4, r4, %[r]\n\t"
  166910. #elif defined(__clang__)
  166911. "adcs r4, %[r]\n\t"
  166912. #else
  166913. "adc r4, %[r]\n\t"
  166914. #endif
  166915. #ifdef WOLFSSL_KEIL
  166916. "adcs r2, r2, %[r]\n\t"
  166917. #elif defined(__clang__)
  166918. "adcs r2, %[r]\n\t"
  166919. #else
  166920. "adc r2, %[r]\n\t"
  166921. #endif
  166922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166923. "lsrs r6, r7, #16\n\t"
  166924. #else
  166925. "lsr r6, r7, #16\n\t"
  166926. #endif
  166927. #ifdef WOLFSSL_KEIL
  166928. "muls r5, r6, r5\n\t"
  166929. #elif defined(__clang__)
  166930. "muls r5, r6\n\t"
  166931. #else
  166932. "mul r5, r6\n\t"
  166933. #endif
  166934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166935. "lsrs r6, r5, #16\n\t"
  166936. #else
  166937. "lsr r6, r5, #16\n\t"
  166938. #endif
  166939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166940. "lsls r5, r5, #16\n\t"
  166941. #else
  166942. "lsl r5, r5, #16\n\t"
  166943. #endif
  166944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166945. "adds r3, r3, r5\n\t"
  166946. #else
  166947. "add r3, r3, r5\n\t"
  166948. #endif
  166949. #ifdef WOLFSSL_KEIL
  166950. "adcs r4, r4, r6\n\t"
  166951. #elif defined(__clang__)
  166952. "adcs r4, r6\n\t"
  166953. #else
  166954. "adc r4, r6\n\t"
  166955. #endif
  166956. #ifdef WOLFSSL_KEIL
  166957. "adcs r2, r2, %[r]\n\t"
  166958. #elif defined(__clang__)
  166959. "adcs r2, %[r]\n\t"
  166960. #else
  166961. "adc r2, %[r]\n\t"
  166962. #endif
  166963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166964. "adds r3, r3, r5\n\t"
  166965. #else
  166966. "add r3, r3, r5\n\t"
  166967. #endif
  166968. #ifdef WOLFSSL_KEIL
  166969. "adcs r4, r4, r6\n\t"
  166970. #elif defined(__clang__)
  166971. "adcs r4, r6\n\t"
  166972. #else
  166973. "adc r4, r6\n\t"
  166974. #endif
  166975. #ifdef WOLFSSL_KEIL
  166976. "adcs r2, r2, %[r]\n\t"
  166977. #elif defined(__clang__)
  166978. "adcs r2, %[r]\n\t"
  166979. #else
  166980. "adc r2, %[r]\n\t"
  166981. #endif
  166982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166983. "lsrs r5, %[a], #16\n\t"
  166984. #else
  166985. "lsr r5, %[a], #16\n\t"
  166986. #endif
  166987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166988. "lsrs r6, r7, #16\n\t"
  166989. #else
  166990. "lsr r6, r7, #16\n\t"
  166991. #endif
  166992. #ifdef WOLFSSL_KEIL
  166993. "muls r6, r5, r6\n\t"
  166994. #elif defined(__clang__)
  166995. "muls r6, r5\n\t"
  166996. #else
  166997. "mul r6, r5\n\t"
  166998. #endif
  166999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167000. "adds r4, r4, r6\n\t"
  167001. #else
  167002. "add r4, r4, r6\n\t"
  167003. #endif
  167004. #ifdef WOLFSSL_KEIL
  167005. "adcs r2, r2, %[r]\n\t"
  167006. #elif defined(__clang__)
  167007. "adcs r2, %[r]\n\t"
  167008. #else
  167009. "adc r2, %[r]\n\t"
  167010. #endif
  167011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167012. "adds r4, r4, r6\n\t"
  167013. #else
  167014. "add r4, r4, r6\n\t"
  167015. #endif
  167016. #ifdef WOLFSSL_KEIL
  167017. "adcs r2, r2, %[r]\n\t"
  167018. #elif defined(__clang__)
  167019. "adcs r2, %[r]\n\t"
  167020. #else
  167021. "adc r2, %[r]\n\t"
  167022. #endif
  167023. "uxth r6, r7\n\t"
  167024. #ifdef WOLFSSL_KEIL
  167025. "muls r5, r6, r5\n\t"
  167026. #elif defined(__clang__)
  167027. "muls r5, r6\n\t"
  167028. #else
  167029. "mul r5, r6\n\t"
  167030. #endif
  167031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167032. "lsrs r6, r5, #16\n\t"
  167033. #else
  167034. "lsr r6, r5, #16\n\t"
  167035. #endif
  167036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167037. "lsls r5, r5, #16\n\t"
  167038. #else
  167039. "lsl r5, r5, #16\n\t"
  167040. #endif
  167041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167042. "adds r3, r3, r5\n\t"
  167043. #else
  167044. "add r3, r3, r5\n\t"
  167045. #endif
  167046. #ifdef WOLFSSL_KEIL
  167047. "adcs r4, r4, r6\n\t"
  167048. #elif defined(__clang__)
  167049. "adcs r4, r6\n\t"
  167050. #else
  167051. "adc r4, r6\n\t"
  167052. #endif
  167053. #ifdef WOLFSSL_KEIL
  167054. "adcs r2, r2, %[r]\n\t"
  167055. #elif defined(__clang__)
  167056. "adcs r2, %[r]\n\t"
  167057. #else
  167058. "adc r2, %[r]\n\t"
  167059. #endif
  167060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167061. "adds r3, r3, r5\n\t"
  167062. #else
  167063. "add r3, r3, r5\n\t"
  167064. #endif
  167065. #ifdef WOLFSSL_KEIL
  167066. "adcs r4, r4, r6\n\t"
  167067. #elif defined(__clang__)
  167068. "adcs r4, r6\n\t"
  167069. #else
  167070. "adc r4, r6\n\t"
  167071. #endif
  167072. #ifdef WOLFSSL_KEIL
  167073. "adcs r2, r2, %[r]\n\t"
  167074. #elif defined(__clang__)
  167075. "adcs r2, %[r]\n\t"
  167076. #else
  167077. "adc r2, %[r]\n\t"
  167078. #endif
  167079. "# A[14] * A[2]\n\t"
  167080. "mov %[a], r9\n\t"
  167081. "mov r7, r12\n\t"
  167082. "ldr %[a], [%[a], #56]\n\t"
  167083. "uxth r5, %[a]\n\t"
  167084. "uxth r6, r7\n\t"
  167085. #ifdef WOLFSSL_KEIL
  167086. "muls r6, r5, r6\n\t"
  167087. #elif defined(__clang__)
  167088. "muls r6, r5\n\t"
  167089. #else
  167090. "mul r6, r5\n\t"
  167091. #endif
  167092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167093. "adds r3, r3, r6\n\t"
  167094. #else
  167095. "add r3, r3, r6\n\t"
  167096. #endif
  167097. #ifdef WOLFSSL_KEIL
  167098. "adcs r4, r4, %[r]\n\t"
  167099. #elif defined(__clang__)
  167100. "adcs r4, %[r]\n\t"
  167101. #else
  167102. "adc r4, %[r]\n\t"
  167103. #endif
  167104. #ifdef WOLFSSL_KEIL
  167105. "adcs r2, r2, %[r]\n\t"
  167106. #elif defined(__clang__)
  167107. "adcs r2, %[r]\n\t"
  167108. #else
  167109. "adc r2, %[r]\n\t"
  167110. #endif
  167111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167112. "adds r3, r3, r6\n\t"
  167113. #else
  167114. "add r3, r3, r6\n\t"
  167115. #endif
  167116. #ifdef WOLFSSL_KEIL
  167117. "adcs r4, r4, %[r]\n\t"
  167118. #elif defined(__clang__)
  167119. "adcs r4, %[r]\n\t"
  167120. #else
  167121. "adc r4, %[r]\n\t"
  167122. #endif
  167123. #ifdef WOLFSSL_KEIL
  167124. "adcs r2, r2, %[r]\n\t"
  167125. #elif defined(__clang__)
  167126. "adcs r2, %[r]\n\t"
  167127. #else
  167128. "adc r2, %[r]\n\t"
  167129. #endif
  167130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167131. "lsrs r6, r7, #16\n\t"
  167132. #else
  167133. "lsr r6, r7, #16\n\t"
  167134. #endif
  167135. #ifdef WOLFSSL_KEIL
  167136. "muls r5, r6, r5\n\t"
  167137. #elif defined(__clang__)
  167138. "muls r5, r6\n\t"
  167139. #else
  167140. "mul r5, r6\n\t"
  167141. #endif
  167142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167143. "lsrs r6, r5, #16\n\t"
  167144. #else
  167145. "lsr r6, r5, #16\n\t"
  167146. #endif
  167147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167148. "lsls r5, r5, #16\n\t"
  167149. #else
  167150. "lsl r5, r5, #16\n\t"
  167151. #endif
  167152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167153. "adds r3, r3, r5\n\t"
  167154. #else
  167155. "add r3, r3, r5\n\t"
  167156. #endif
  167157. #ifdef WOLFSSL_KEIL
  167158. "adcs r4, r4, r6\n\t"
  167159. #elif defined(__clang__)
  167160. "adcs r4, r6\n\t"
  167161. #else
  167162. "adc r4, r6\n\t"
  167163. #endif
  167164. #ifdef WOLFSSL_KEIL
  167165. "adcs r2, r2, %[r]\n\t"
  167166. #elif defined(__clang__)
  167167. "adcs r2, %[r]\n\t"
  167168. #else
  167169. "adc r2, %[r]\n\t"
  167170. #endif
  167171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167172. "adds r3, r3, r5\n\t"
  167173. #else
  167174. "add r3, r3, r5\n\t"
  167175. #endif
  167176. #ifdef WOLFSSL_KEIL
  167177. "adcs r4, r4, r6\n\t"
  167178. #elif defined(__clang__)
  167179. "adcs r4, r6\n\t"
  167180. #else
  167181. "adc r4, r6\n\t"
  167182. #endif
  167183. #ifdef WOLFSSL_KEIL
  167184. "adcs r2, r2, %[r]\n\t"
  167185. #elif defined(__clang__)
  167186. "adcs r2, %[r]\n\t"
  167187. #else
  167188. "adc r2, %[r]\n\t"
  167189. #endif
  167190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167191. "lsrs r5, %[a], #16\n\t"
  167192. #else
  167193. "lsr r5, %[a], #16\n\t"
  167194. #endif
  167195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167196. "lsrs r6, r7, #16\n\t"
  167197. #else
  167198. "lsr r6, r7, #16\n\t"
  167199. #endif
  167200. #ifdef WOLFSSL_KEIL
  167201. "muls r6, r5, r6\n\t"
  167202. #elif defined(__clang__)
  167203. "muls r6, r5\n\t"
  167204. #else
  167205. "mul r6, r5\n\t"
  167206. #endif
  167207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167208. "adds r4, r4, r6\n\t"
  167209. #else
  167210. "add r4, r4, r6\n\t"
  167211. #endif
  167212. #ifdef WOLFSSL_KEIL
  167213. "adcs r2, r2, %[r]\n\t"
  167214. #elif defined(__clang__)
  167215. "adcs r2, %[r]\n\t"
  167216. #else
  167217. "adc r2, %[r]\n\t"
  167218. #endif
  167219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167220. "adds r4, r4, r6\n\t"
  167221. #else
  167222. "add r4, r4, r6\n\t"
  167223. #endif
  167224. #ifdef WOLFSSL_KEIL
  167225. "adcs r2, r2, %[r]\n\t"
  167226. #elif defined(__clang__)
  167227. "adcs r2, %[r]\n\t"
  167228. #else
  167229. "adc r2, %[r]\n\t"
  167230. #endif
  167231. "uxth r6, r7\n\t"
  167232. #ifdef WOLFSSL_KEIL
  167233. "muls r5, r6, r5\n\t"
  167234. #elif defined(__clang__)
  167235. "muls r5, r6\n\t"
  167236. #else
  167237. "mul r5, r6\n\t"
  167238. #endif
  167239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167240. "lsrs r6, r5, #16\n\t"
  167241. #else
  167242. "lsr r6, r5, #16\n\t"
  167243. #endif
  167244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167245. "lsls r5, r5, #16\n\t"
  167246. #else
  167247. "lsl r5, r5, #16\n\t"
  167248. #endif
  167249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167250. "adds r3, r3, r5\n\t"
  167251. #else
  167252. "add r3, r3, r5\n\t"
  167253. #endif
  167254. #ifdef WOLFSSL_KEIL
  167255. "adcs r4, r4, r6\n\t"
  167256. #elif defined(__clang__)
  167257. "adcs r4, r6\n\t"
  167258. #else
  167259. "adc r4, r6\n\t"
  167260. #endif
  167261. #ifdef WOLFSSL_KEIL
  167262. "adcs r2, r2, %[r]\n\t"
  167263. #elif defined(__clang__)
  167264. "adcs r2, %[r]\n\t"
  167265. #else
  167266. "adc r2, %[r]\n\t"
  167267. #endif
  167268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167269. "adds r3, r3, r5\n\t"
  167270. #else
  167271. "add r3, r3, r5\n\t"
  167272. #endif
  167273. #ifdef WOLFSSL_KEIL
  167274. "adcs r4, r4, r6\n\t"
  167275. #elif defined(__clang__)
  167276. "adcs r4, r6\n\t"
  167277. #else
  167278. "adc r4, r6\n\t"
  167279. #endif
  167280. #ifdef WOLFSSL_KEIL
  167281. "adcs r2, r2, %[r]\n\t"
  167282. #elif defined(__clang__)
  167283. "adcs r2, %[r]\n\t"
  167284. #else
  167285. "adc r2, %[r]\n\t"
  167286. #endif
  167287. "# A[13] * A[3]\n\t"
  167288. "mov %[a], r9\n\t"
  167289. "mov r7, lr\n\t"
  167290. "ldr %[a], [%[a], #52]\n\t"
  167291. "uxth r5, %[a]\n\t"
  167292. "uxth r6, r7\n\t"
  167293. #ifdef WOLFSSL_KEIL
  167294. "muls r6, r5, r6\n\t"
  167295. #elif defined(__clang__)
  167296. "muls r6, r5\n\t"
  167297. #else
  167298. "mul r6, r5\n\t"
  167299. #endif
  167300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167301. "adds r3, r3, r6\n\t"
  167302. #else
  167303. "add r3, r3, r6\n\t"
  167304. #endif
  167305. #ifdef WOLFSSL_KEIL
  167306. "adcs r4, r4, %[r]\n\t"
  167307. #elif defined(__clang__)
  167308. "adcs r4, %[r]\n\t"
  167309. #else
  167310. "adc r4, %[r]\n\t"
  167311. #endif
  167312. #ifdef WOLFSSL_KEIL
  167313. "adcs r2, r2, %[r]\n\t"
  167314. #elif defined(__clang__)
  167315. "adcs r2, %[r]\n\t"
  167316. #else
  167317. "adc r2, %[r]\n\t"
  167318. #endif
  167319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167320. "adds r3, r3, r6\n\t"
  167321. #else
  167322. "add r3, r3, r6\n\t"
  167323. #endif
  167324. #ifdef WOLFSSL_KEIL
  167325. "adcs r4, r4, %[r]\n\t"
  167326. #elif defined(__clang__)
  167327. "adcs r4, %[r]\n\t"
  167328. #else
  167329. "adc r4, %[r]\n\t"
  167330. #endif
  167331. #ifdef WOLFSSL_KEIL
  167332. "adcs r2, r2, %[r]\n\t"
  167333. #elif defined(__clang__)
  167334. "adcs r2, %[r]\n\t"
  167335. #else
  167336. "adc r2, %[r]\n\t"
  167337. #endif
  167338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167339. "lsrs r6, r7, #16\n\t"
  167340. #else
  167341. "lsr r6, r7, #16\n\t"
  167342. #endif
  167343. #ifdef WOLFSSL_KEIL
  167344. "muls r5, r6, r5\n\t"
  167345. #elif defined(__clang__)
  167346. "muls r5, r6\n\t"
  167347. #else
  167348. "mul r5, r6\n\t"
  167349. #endif
  167350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167351. "lsrs r6, r5, #16\n\t"
  167352. #else
  167353. "lsr r6, r5, #16\n\t"
  167354. #endif
  167355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167356. "lsls r5, r5, #16\n\t"
  167357. #else
  167358. "lsl r5, r5, #16\n\t"
  167359. #endif
  167360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167361. "adds r3, r3, r5\n\t"
  167362. #else
  167363. "add r3, r3, r5\n\t"
  167364. #endif
  167365. #ifdef WOLFSSL_KEIL
  167366. "adcs r4, r4, r6\n\t"
  167367. #elif defined(__clang__)
  167368. "adcs r4, r6\n\t"
  167369. #else
  167370. "adc r4, r6\n\t"
  167371. #endif
  167372. #ifdef WOLFSSL_KEIL
  167373. "adcs r2, r2, %[r]\n\t"
  167374. #elif defined(__clang__)
  167375. "adcs r2, %[r]\n\t"
  167376. #else
  167377. "adc r2, %[r]\n\t"
  167378. #endif
  167379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167380. "adds r3, r3, r5\n\t"
  167381. #else
  167382. "add r3, r3, r5\n\t"
  167383. #endif
  167384. #ifdef WOLFSSL_KEIL
  167385. "adcs r4, r4, r6\n\t"
  167386. #elif defined(__clang__)
  167387. "adcs r4, r6\n\t"
  167388. #else
  167389. "adc r4, r6\n\t"
  167390. #endif
  167391. #ifdef WOLFSSL_KEIL
  167392. "adcs r2, r2, %[r]\n\t"
  167393. #elif defined(__clang__)
  167394. "adcs r2, %[r]\n\t"
  167395. #else
  167396. "adc r2, %[r]\n\t"
  167397. #endif
  167398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167399. "lsrs r5, %[a], #16\n\t"
  167400. #else
  167401. "lsr r5, %[a], #16\n\t"
  167402. #endif
  167403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167404. "lsrs r6, r7, #16\n\t"
  167405. #else
  167406. "lsr r6, r7, #16\n\t"
  167407. #endif
  167408. #ifdef WOLFSSL_KEIL
  167409. "muls r6, r5, r6\n\t"
  167410. #elif defined(__clang__)
  167411. "muls r6, r5\n\t"
  167412. #else
  167413. "mul r6, r5\n\t"
  167414. #endif
  167415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167416. "adds r4, r4, r6\n\t"
  167417. #else
  167418. "add r4, r4, r6\n\t"
  167419. #endif
  167420. #ifdef WOLFSSL_KEIL
  167421. "adcs r2, r2, %[r]\n\t"
  167422. #elif defined(__clang__)
  167423. "adcs r2, %[r]\n\t"
  167424. #else
  167425. "adc r2, %[r]\n\t"
  167426. #endif
  167427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167428. "adds r4, r4, r6\n\t"
  167429. #else
  167430. "add r4, r4, r6\n\t"
  167431. #endif
  167432. #ifdef WOLFSSL_KEIL
  167433. "adcs r2, r2, %[r]\n\t"
  167434. #elif defined(__clang__)
  167435. "adcs r2, %[r]\n\t"
  167436. #else
  167437. "adc r2, %[r]\n\t"
  167438. #endif
  167439. "uxth r6, r7\n\t"
  167440. #ifdef WOLFSSL_KEIL
  167441. "muls r5, r6, r5\n\t"
  167442. #elif defined(__clang__)
  167443. "muls r5, r6\n\t"
  167444. #else
  167445. "mul r5, r6\n\t"
  167446. #endif
  167447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167448. "lsrs r6, r5, #16\n\t"
  167449. #else
  167450. "lsr r6, r5, #16\n\t"
  167451. #endif
  167452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167453. "lsls r5, r5, #16\n\t"
  167454. #else
  167455. "lsl r5, r5, #16\n\t"
  167456. #endif
  167457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167458. "adds r3, r3, r5\n\t"
  167459. #else
  167460. "add r3, r3, r5\n\t"
  167461. #endif
  167462. #ifdef WOLFSSL_KEIL
  167463. "adcs r4, r4, r6\n\t"
  167464. #elif defined(__clang__)
  167465. "adcs r4, r6\n\t"
  167466. #else
  167467. "adc r4, r6\n\t"
  167468. #endif
  167469. #ifdef WOLFSSL_KEIL
  167470. "adcs r2, r2, %[r]\n\t"
  167471. #elif defined(__clang__)
  167472. "adcs r2, %[r]\n\t"
  167473. #else
  167474. "adc r2, %[r]\n\t"
  167475. #endif
  167476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167477. "adds r3, r3, r5\n\t"
  167478. #else
  167479. "add r3, r3, r5\n\t"
  167480. #endif
  167481. #ifdef WOLFSSL_KEIL
  167482. "adcs r4, r4, r6\n\t"
  167483. #elif defined(__clang__)
  167484. "adcs r4, r6\n\t"
  167485. #else
  167486. "adc r4, r6\n\t"
  167487. #endif
  167488. #ifdef WOLFSSL_KEIL
  167489. "adcs r2, r2, %[r]\n\t"
  167490. #elif defined(__clang__)
  167491. "adcs r2, %[r]\n\t"
  167492. #else
  167493. "adc r2, %[r]\n\t"
  167494. #endif
  167495. "# A[12] * A[4]\n\t"
  167496. "mov %[a], r9\n\t"
  167497. "ldr r7, [%[a], #16]\n\t"
  167498. "ldr %[a], [%[a], #48]\n\t"
  167499. "uxth r5, %[a]\n\t"
  167500. "uxth r6, r7\n\t"
  167501. #ifdef WOLFSSL_KEIL
  167502. "muls r6, r5, r6\n\t"
  167503. #elif defined(__clang__)
  167504. "muls r6, r5\n\t"
  167505. #else
  167506. "mul r6, r5\n\t"
  167507. #endif
  167508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167509. "adds r3, r3, r6\n\t"
  167510. #else
  167511. "add r3, r3, r6\n\t"
  167512. #endif
  167513. #ifdef WOLFSSL_KEIL
  167514. "adcs r4, r4, %[r]\n\t"
  167515. #elif defined(__clang__)
  167516. "adcs r4, %[r]\n\t"
  167517. #else
  167518. "adc r4, %[r]\n\t"
  167519. #endif
  167520. #ifdef WOLFSSL_KEIL
  167521. "adcs r2, r2, %[r]\n\t"
  167522. #elif defined(__clang__)
  167523. "adcs r2, %[r]\n\t"
  167524. #else
  167525. "adc r2, %[r]\n\t"
  167526. #endif
  167527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167528. "adds r3, r3, r6\n\t"
  167529. #else
  167530. "add r3, r3, r6\n\t"
  167531. #endif
  167532. #ifdef WOLFSSL_KEIL
  167533. "adcs r4, r4, %[r]\n\t"
  167534. #elif defined(__clang__)
  167535. "adcs r4, %[r]\n\t"
  167536. #else
  167537. "adc r4, %[r]\n\t"
  167538. #endif
  167539. #ifdef WOLFSSL_KEIL
  167540. "adcs r2, r2, %[r]\n\t"
  167541. #elif defined(__clang__)
  167542. "adcs r2, %[r]\n\t"
  167543. #else
  167544. "adc r2, %[r]\n\t"
  167545. #endif
  167546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167547. "lsrs r6, r7, #16\n\t"
  167548. #else
  167549. "lsr r6, r7, #16\n\t"
  167550. #endif
  167551. #ifdef WOLFSSL_KEIL
  167552. "muls r5, r6, r5\n\t"
  167553. #elif defined(__clang__)
  167554. "muls r5, r6\n\t"
  167555. #else
  167556. "mul r5, r6\n\t"
  167557. #endif
  167558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167559. "lsrs r6, r5, #16\n\t"
  167560. #else
  167561. "lsr r6, r5, #16\n\t"
  167562. #endif
  167563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167564. "lsls r5, r5, #16\n\t"
  167565. #else
  167566. "lsl r5, r5, #16\n\t"
  167567. #endif
  167568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167569. "adds r3, r3, r5\n\t"
  167570. #else
  167571. "add r3, r3, r5\n\t"
  167572. #endif
  167573. #ifdef WOLFSSL_KEIL
  167574. "adcs r4, r4, r6\n\t"
  167575. #elif defined(__clang__)
  167576. "adcs r4, r6\n\t"
  167577. #else
  167578. "adc r4, r6\n\t"
  167579. #endif
  167580. #ifdef WOLFSSL_KEIL
  167581. "adcs r2, r2, %[r]\n\t"
  167582. #elif defined(__clang__)
  167583. "adcs r2, %[r]\n\t"
  167584. #else
  167585. "adc r2, %[r]\n\t"
  167586. #endif
  167587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167588. "adds r3, r3, r5\n\t"
  167589. #else
  167590. "add r3, r3, r5\n\t"
  167591. #endif
  167592. #ifdef WOLFSSL_KEIL
  167593. "adcs r4, r4, r6\n\t"
  167594. #elif defined(__clang__)
  167595. "adcs r4, r6\n\t"
  167596. #else
  167597. "adc r4, r6\n\t"
  167598. #endif
  167599. #ifdef WOLFSSL_KEIL
  167600. "adcs r2, r2, %[r]\n\t"
  167601. #elif defined(__clang__)
  167602. "adcs r2, %[r]\n\t"
  167603. #else
  167604. "adc r2, %[r]\n\t"
  167605. #endif
  167606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167607. "lsrs r5, %[a], #16\n\t"
  167608. #else
  167609. "lsr r5, %[a], #16\n\t"
  167610. #endif
  167611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167612. "lsrs r6, r7, #16\n\t"
  167613. #else
  167614. "lsr r6, r7, #16\n\t"
  167615. #endif
  167616. #ifdef WOLFSSL_KEIL
  167617. "muls r6, r5, r6\n\t"
  167618. #elif defined(__clang__)
  167619. "muls r6, r5\n\t"
  167620. #else
  167621. "mul r6, r5\n\t"
  167622. #endif
  167623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167624. "adds r4, r4, r6\n\t"
  167625. #else
  167626. "add r4, r4, r6\n\t"
  167627. #endif
  167628. #ifdef WOLFSSL_KEIL
  167629. "adcs r2, r2, %[r]\n\t"
  167630. #elif defined(__clang__)
  167631. "adcs r2, %[r]\n\t"
  167632. #else
  167633. "adc r2, %[r]\n\t"
  167634. #endif
  167635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167636. "adds r4, r4, r6\n\t"
  167637. #else
  167638. "add r4, r4, r6\n\t"
  167639. #endif
  167640. #ifdef WOLFSSL_KEIL
  167641. "adcs r2, r2, %[r]\n\t"
  167642. #elif defined(__clang__)
  167643. "adcs r2, %[r]\n\t"
  167644. #else
  167645. "adc r2, %[r]\n\t"
  167646. #endif
  167647. "uxth r6, r7\n\t"
  167648. #ifdef WOLFSSL_KEIL
  167649. "muls r5, r6, r5\n\t"
  167650. #elif defined(__clang__)
  167651. "muls r5, r6\n\t"
  167652. #else
  167653. "mul r5, r6\n\t"
  167654. #endif
  167655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167656. "lsrs r6, r5, #16\n\t"
  167657. #else
  167658. "lsr r6, r5, #16\n\t"
  167659. #endif
  167660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167661. "lsls r5, r5, #16\n\t"
  167662. #else
  167663. "lsl r5, r5, #16\n\t"
  167664. #endif
  167665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167666. "adds r3, r3, r5\n\t"
  167667. #else
  167668. "add r3, r3, r5\n\t"
  167669. #endif
  167670. #ifdef WOLFSSL_KEIL
  167671. "adcs r4, r4, r6\n\t"
  167672. #elif defined(__clang__)
  167673. "adcs r4, r6\n\t"
  167674. #else
  167675. "adc r4, r6\n\t"
  167676. #endif
  167677. #ifdef WOLFSSL_KEIL
  167678. "adcs r2, r2, %[r]\n\t"
  167679. #elif defined(__clang__)
  167680. "adcs r2, %[r]\n\t"
  167681. #else
  167682. "adc r2, %[r]\n\t"
  167683. #endif
  167684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167685. "adds r3, r3, r5\n\t"
  167686. #else
  167687. "add r3, r3, r5\n\t"
  167688. #endif
  167689. #ifdef WOLFSSL_KEIL
  167690. "adcs r4, r4, r6\n\t"
  167691. #elif defined(__clang__)
  167692. "adcs r4, r6\n\t"
  167693. #else
  167694. "adc r4, r6\n\t"
  167695. #endif
  167696. #ifdef WOLFSSL_KEIL
  167697. "adcs r2, r2, %[r]\n\t"
  167698. #elif defined(__clang__)
  167699. "adcs r2, %[r]\n\t"
  167700. #else
  167701. "adc r2, %[r]\n\t"
  167702. #endif
  167703. "# A[11] * A[5]\n\t"
  167704. "mov %[a], r9\n\t"
  167705. "ldr r7, [%[a], #20]\n\t"
  167706. "ldr %[a], [%[a], #44]\n\t"
  167707. "uxth r5, %[a]\n\t"
  167708. "uxth r6, r7\n\t"
  167709. #ifdef WOLFSSL_KEIL
  167710. "muls r6, r5, r6\n\t"
  167711. #elif defined(__clang__)
  167712. "muls r6, r5\n\t"
  167713. #else
  167714. "mul r6, r5\n\t"
  167715. #endif
  167716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167717. "adds r3, r3, r6\n\t"
  167718. #else
  167719. "add r3, r3, r6\n\t"
  167720. #endif
  167721. #ifdef WOLFSSL_KEIL
  167722. "adcs r4, r4, %[r]\n\t"
  167723. #elif defined(__clang__)
  167724. "adcs r4, %[r]\n\t"
  167725. #else
  167726. "adc r4, %[r]\n\t"
  167727. #endif
  167728. #ifdef WOLFSSL_KEIL
  167729. "adcs r2, r2, %[r]\n\t"
  167730. #elif defined(__clang__)
  167731. "adcs r2, %[r]\n\t"
  167732. #else
  167733. "adc r2, %[r]\n\t"
  167734. #endif
  167735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167736. "adds r3, r3, r6\n\t"
  167737. #else
  167738. "add r3, r3, r6\n\t"
  167739. #endif
  167740. #ifdef WOLFSSL_KEIL
  167741. "adcs r4, r4, %[r]\n\t"
  167742. #elif defined(__clang__)
  167743. "adcs r4, %[r]\n\t"
  167744. #else
  167745. "adc r4, %[r]\n\t"
  167746. #endif
  167747. #ifdef WOLFSSL_KEIL
  167748. "adcs r2, r2, %[r]\n\t"
  167749. #elif defined(__clang__)
  167750. "adcs r2, %[r]\n\t"
  167751. #else
  167752. "adc r2, %[r]\n\t"
  167753. #endif
  167754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167755. "lsrs r6, r7, #16\n\t"
  167756. #else
  167757. "lsr r6, r7, #16\n\t"
  167758. #endif
  167759. #ifdef WOLFSSL_KEIL
  167760. "muls r5, r6, r5\n\t"
  167761. #elif defined(__clang__)
  167762. "muls r5, r6\n\t"
  167763. #else
  167764. "mul r5, r6\n\t"
  167765. #endif
  167766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167767. "lsrs r6, r5, #16\n\t"
  167768. #else
  167769. "lsr r6, r5, #16\n\t"
  167770. #endif
  167771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167772. "lsls r5, r5, #16\n\t"
  167773. #else
  167774. "lsl r5, r5, #16\n\t"
  167775. #endif
  167776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167777. "adds r3, r3, r5\n\t"
  167778. #else
  167779. "add r3, r3, r5\n\t"
  167780. #endif
  167781. #ifdef WOLFSSL_KEIL
  167782. "adcs r4, r4, r6\n\t"
  167783. #elif defined(__clang__)
  167784. "adcs r4, r6\n\t"
  167785. #else
  167786. "adc r4, r6\n\t"
  167787. #endif
  167788. #ifdef WOLFSSL_KEIL
  167789. "adcs r2, r2, %[r]\n\t"
  167790. #elif defined(__clang__)
  167791. "adcs r2, %[r]\n\t"
  167792. #else
  167793. "adc r2, %[r]\n\t"
  167794. #endif
  167795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167796. "adds r3, r3, r5\n\t"
  167797. #else
  167798. "add r3, r3, r5\n\t"
  167799. #endif
  167800. #ifdef WOLFSSL_KEIL
  167801. "adcs r4, r4, r6\n\t"
  167802. #elif defined(__clang__)
  167803. "adcs r4, r6\n\t"
  167804. #else
  167805. "adc r4, r6\n\t"
  167806. #endif
  167807. #ifdef WOLFSSL_KEIL
  167808. "adcs r2, r2, %[r]\n\t"
  167809. #elif defined(__clang__)
  167810. "adcs r2, %[r]\n\t"
  167811. #else
  167812. "adc r2, %[r]\n\t"
  167813. #endif
  167814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167815. "lsrs r5, %[a], #16\n\t"
  167816. #else
  167817. "lsr r5, %[a], #16\n\t"
  167818. #endif
  167819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167820. "lsrs r6, r7, #16\n\t"
  167821. #else
  167822. "lsr r6, r7, #16\n\t"
  167823. #endif
  167824. #ifdef WOLFSSL_KEIL
  167825. "muls r6, r5, r6\n\t"
  167826. #elif defined(__clang__)
  167827. "muls r6, r5\n\t"
  167828. #else
  167829. "mul r6, r5\n\t"
  167830. #endif
  167831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167832. "adds r4, r4, r6\n\t"
  167833. #else
  167834. "add r4, r4, r6\n\t"
  167835. #endif
  167836. #ifdef WOLFSSL_KEIL
  167837. "adcs r2, r2, %[r]\n\t"
  167838. #elif defined(__clang__)
  167839. "adcs r2, %[r]\n\t"
  167840. #else
  167841. "adc r2, %[r]\n\t"
  167842. #endif
  167843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167844. "adds r4, r4, r6\n\t"
  167845. #else
  167846. "add r4, r4, r6\n\t"
  167847. #endif
  167848. #ifdef WOLFSSL_KEIL
  167849. "adcs r2, r2, %[r]\n\t"
  167850. #elif defined(__clang__)
  167851. "adcs r2, %[r]\n\t"
  167852. #else
  167853. "adc r2, %[r]\n\t"
  167854. #endif
  167855. "uxth r6, r7\n\t"
  167856. #ifdef WOLFSSL_KEIL
  167857. "muls r5, r6, r5\n\t"
  167858. #elif defined(__clang__)
  167859. "muls r5, r6\n\t"
  167860. #else
  167861. "mul r5, r6\n\t"
  167862. #endif
  167863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167864. "lsrs r6, r5, #16\n\t"
  167865. #else
  167866. "lsr r6, r5, #16\n\t"
  167867. #endif
  167868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167869. "lsls r5, r5, #16\n\t"
  167870. #else
  167871. "lsl r5, r5, #16\n\t"
  167872. #endif
  167873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167874. "adds r3, r3, r5\n\t"
  167875. #else
  167876. "add r3, r3, r5\n\t"
  167877. #endif
  167878. #ifdef WOLFSSL_KEIL
  167879. "adcs r4, r4, r6\n\t"
  167880. #elif defined(__clang__)
  167881. "adcs r4, r6\n\t"
  167882. #else
  167883. "adc r4, r6\n\t"
  167884. #endif
  167885. #ifdef WOLFSSL_KEIL
  167886. "adcs r2, r2, %[r]\n\t"
  167887. #elif defined(__clang__)
  167888. "adcs r2, %[r]\n\t"
  167889. #else
  167890. "adc r2, %[r]\n\t"
  167891. #endif
  167892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167893. "adds r3, r3, r5\n\t"
  167894. #else
  167895. "add r3, r3, r5\n\t"
  167896. #endif
  167897. #ifdef WOLFSSL_KEIL
  167898. "adcs r4, r4, r6\n\t"
  167899. #elif defined(__clang__)
  167900. "adcs r4, r6\n\t"
  167901. #else
  167902. "adc r4, r6\n\t"
  167903. #endif
  167904. #ifdef WOLFSSL_KEIL
  167905. "adcs r2, r2, %[r]\n\t"
  167906. #elif defined(__clang__)
  167907. "adcs r2, %[r]\n\t"
  167908. #else
  167909. "adc r2, %[r]\n\t"
  167910. #endif
  167911. "# A[10] * A[6]\n\t"
  167912. "mov %[a], r9\n\t"
  167913. "ldr r7, [%[a], #24]\n\t"
  167914. "ldr %[a], [%[a], #40]\n\t"
  167915. "uxth r5, %[a]\n\t"
  167916. "uxth r6, r7\n\t"
  167917. #ifdef WOLFSSL_KEIL
  167918. "muls r6, r5, r6\n\t"
  167919. #elif defined(__clang__)
  167920. "muls r6, r5\n\t"
  167921. #else
  167922. "mul r6, r5\n\t"
  167923. #endif
  167924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167925. "adds r3, r3, r6\n\t"
  167926. #else
  167927. "add r3, r3, r6\n\t"
  167928. #endif
  167929. #ifdef WOLFSSL_KEIL
  167930. "adcs r4, r4, %[r]\n\t"
  167931. #elif defined(__clang__)
  167932. "adcs r4, %[r]\n\t"
  167933. #else
  167934. "adc r4, %[r]\n\t"
  167935. #endif
  167936. #ifdef WOLFSSL_KEIL
  167937. "adcs r2, r2, %[r]\n\t"
  167938. #elif defined(__clang__)
  167939. "adcs r2, %[r]\n\t"
  167940. #else
  167941. "adc r2, %[r]\n\t"
  167942. #endif
  167943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167944. "adds r3, r3, r6\n\t"
  167945. #else
  167946. "add r3, r3, r6\n\t"
  167947. #endif
  167948. #ifdef WOLFSSL_KEIL
  167949. "adcs r4, r4, %[r]\n\t"
  167950. #elif defined(__clang__)
  167951. "adcs r4, %[r]\n\t"
  167952. #else
  167953. "adc r4, %[r]\n\t"
  167954. #endif
  167955. #ifdef WOLFSSL_KEIL
  167956. "adcs r2, r2, %[r]\n\t"
  167957. #elif defined(__clang__)
  167958. "adcs r2, %[r]\n\t"
  167959. #else
  167960. "adc r2, %[r]\n\t"
  167961. #endif
  167962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167963. "lsrs r6, r7, #16\n\t"
  167964. #else
  167965. "lsr r6, r7, #16\n\t"
  167966. #endif
  167967. #ifdef WOLFSSL_KEIL
  167968. "muls r5, r6, r5\n\t"
  167969. #elif defined(__clang__)
  167970. "muls r5, r6\n\t"
  167971. #else
  167972. "mul r5, r6\n\t"
  167973. #endif
  167974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167975. "lsrs r6, r5, #16\n\t"
  167976. #else
  167977. "lsr r6, r5, #16\n\t"
  167978. #endif
  167979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167980. "lsls r5, r5, #16\n\t"
  167981. #else
  167982. "lsl r5, r5, #16\n\t"
  167983. #endif
  167984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167985. "adds r3, r3, r5\n\t"
  167986. #else
  167987. "add r3, r3, r5\n\t"
  167988. #endif
  167989. #ifdef WOLFSSL_KEIL
  167990. "adcs r4, r4, r6\n\t"
  167991. #elif defined(__clang__)
  167992. "adcs r4, r6\n\t"
  167993. #else
  167994. "adc r4, r6\n\t"
  167995. #endif
  167996. #ifdef WOLFSSL_KEIL
  167997. "adcs r2, r2, %[r]\n\t"
  167998. #elif defined(__clang__)
  167999. "adcs r2, %[r]\n\t"
  168000. #else
  168001. "adc r2, %[r]\n\t"
  168002. #endif
  168003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168004. "adds r3, r3, r5\n\t"
  168005. #else
  168006. "add r3, r3, r5\n\t"
  168007. #endif
  168008. #ifdef WOLFSSL_KEIL
  168009. "adcs r4, r4, r6\n\t"
  168010. #elif defined(__clang__)
  168011. "adcs r4, r6\n\t"
  168012. #else
  168013. "adc r4, r6\n\t"
  168014. #endif
  168015. #ifdef WOLFSSL_KEIL
  168016. "adcs r2, r2, %[r]\n\t"
  168017. #elif defined(__clang__)
  168018. "adcs r2, %[r]\n\t"
  168019. #else
  168020. "adc r2, %[r]\n\t"
  168021. #endif
  168022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168023. "lsrs r5, %[a], #16\n\t"
  168024. #else
  168025. "lsr r5, %[a], #16\n\t"
  168026. #endif
  168027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168028. "lsrs r6, r7, #16\n\t"
  168029. #else
  168030. "lsr r6, r7, #16\n\t"
  168031. #endif
  168032. #ifdef WOLFSSL_KEIL
  168033. "muls r6, r5, r6\n\t"
  168034. #elif defined(__clang__)
  168035. "muls r6, r5\n\t"
  168036. #else
  168037. "mul r6, r5\n\t"
  168038. #endif
  168039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168040. "adds r4, r4, r6\n\t"
  168041. #else
  168042. "add r4, r4, r6\n\t"
  168043. #endif
  168044. #ifdef WOLFSSL_KEIL
  168045. "adcs r2, r2, %[r]\n\t"
  168046. #elif defined(__clang__)
  168047. "adcs r2, %[r]\n\t"
  168048. #else
  168049. "adc r2, %[r]\n\t"
  168050. #endif
  168051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168052. "adds r4, r4, r6\n\t"
  168053. #else
  168054. "add r4, r4, r6\n\t"
  168055. #endif
  168056. #ifdef WOLFSSL_KEIL
  168057. "adcs r2, r2, %[r]\n\t"
  168058. #elif defined(__clang__)
  168059. "adcs r2, %[r]\n\t"
  168060. #else
  168061. "adc r2, %[r]\n\t"
  168062. #endif
  168063. "uxth r6, r7\n\t"
  168064. #ifdef WOLFSSL_KEIL
  168065. "muls r5, r6, r5\n\t"
  168066. #elif defined(__clang__)
  168067. "muls r5, r6\n\t"
  168068. #else
  168069. "mul r5, r6\n\t"
  168070. #endif
  168071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168072. "lsrs r6, r5, #16\n\t"
  168073. #else
  168074. "lsr r6, r5, #16\n\t"
  168075. #endif
  168076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168077. "lsls r5, r5, #16\n\t"
  168078. #else
  168079. "lsl r5, r5, #16\n\t"
  168080. #endif
  168081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168082. "adds r3, r3, r5\n\t"
  168083. #else
  168084. "add r3, r3, r5\n\t"
  168085. #endif
  168086. #ifdef WOLFSSL_KEIL
  168087. "adcs r4, r4, r6\n\t"
  168088. #elif defined(__clang__)
  168089. "adcs r4, r6\n\t"
  168090. #else
  168091. "adc r4, r6\n\t"
  168092. #endif
  168093. #ifdef WOLFSSL_KEIL
  168094. "adcs r2, r2, %[r]\n\t"
  168095. #elif defined(__clang__)
  168096. "adcs r2, %[r]\n\t"
  168097. #else
  168098. "adc r2, %[r]\n\t"
  168099. #endif
  168100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168101. "adds r3, r3, r5\n\t"
  168102. #else
  168103. "add r3, r3, r5\n\t"
  168104. #endif
  168105. #ifdef WOLFSSL_KEIL
  168106. "adcs r4, r4, r6\n\t"
  168107. #elif defined(__clang__)
  168108. "adcs r4, r6\n\t"
  168109. #else
  168110. "adc r4, r6\n\t"
  168111. #endif
  168112. #ifdef WOLFSSL_KEIL
  168113. "adcs r2, r2, %[r]\n\t"
  168114. #elif defined(__clang__)
  168115. "adcs r2, %[r]\n\t"
  168116. #else
  168117. "adc r2, %[r]\n\t"
  168118. #endif
  168119. "# A[9] * A[7]\n\t"
  168120. "mov %[a], r9\n\t"
  168121. "ldr r7, [%[a], #28]\n\t"
  168122. "ldr %[a], [%[a], #36]\n\t"
  168123. "uxth r5, %[a]\n\t"
  168124. "uxth r6, r7\n\t"
  168125. #ifdef WOLFSSL_KEIL
  168126. "muls r6, r5, r6\n\t"
  168127. #elif defined(__clang__)
  168128. "muls r6, r5\n\t"
  168129. #else
  168130. "mul r6, r5\n\t"
  168131. #endif
  168132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168133. "adds r3, r3, r6\n\t"
  168134. #else
  168135. "add r3, r3, r6\n\t"
  168136. #endif
  168137. #ifdef WOLFSSL_KEIL
  168138. "adcs r4, r4, %[r]\n\t"
  168139. #elif defined(__clang__)
  168140. "adcs r4, %[r]\n\t"
  168141. #else
  168142. "adc r4, %[r]\n\t"
  168143. #endif
  168144. #ifdef WOLFSSL_KEIL
  168145. "adcs r2, r2, %[r]\n\t"
  168146. #elif defined(__clang__)
  168147. "adcs r2, %[r]\n\t"
  168148. #else
  168149. "adc r2, %[r]\n\t"
  168150. #endif
  168151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168152. "adds r3, r3, r6\n\t"
  168153. #else
  168154. "add r3, r3, r6\n\t"
  168155. #endif
  168156. #ifdef WOLFSSL_KEIL
  168157. "adcs r4, r4, %[r]\n\t"
  168158. #elif defined(__clang__)
  168159. "adcs r4, %[r]\n\t"
  168160. #else
  168161. "adc r4, %[r]\n\t"
  168162. #endif
  168163. #ifdef WOLFSSL_KEIL
  168164. "adcs r2, r2, %[r]\n\t"
  168165. #elif defined(__clang__)
  168166. "adcs r2, %[r]\n\t"
  168167. #else
  168168. "adc r2, %[r]\n\t"
  168169. #endif
  168170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168171. "lsrs r6, r7, #16\n\t"
  168172. #else
  168173. "lsr r6, r7, #16\n\t"
  168174. #endif
  168175. #ifdef WOLFSSL_KEIL
  168176. "muls r5, r6, r5\n\t"
  168177. #elif defined(__clang__)
  168178. "muls r5, r6\n\t"
  168179. #else
  168180. "mul r5, r6\n\t"
  168181. #endif
  168182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168183. "lsrs r6, r5, #16\n\t"
  168184. #else
  168185. "lsr r6, r5, #16\n\t"
  168186. #endif
  168187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168188. "lsls r5, r5, #16\n\t"
  168189. #else
  168190. "lsl r5, r5, #16\n\t"
  168191. #endif
  168192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168193. "adds r3, r3, r5\n\t"
  168194. #else
  168195. "add r3, r3, r5\n\t"
  168196. #endif
  168197. #ifdef WOLFSSL_KEIL
  168198. "adcs r4, r4, r6\n\t"
  168199. #elif defined(__clang__)
  168200. "adcs r4, r6\n\t"
  168201. #else
  168202. "adc r4, r6\n\t"
  168203. #endif
  168204. #ifdef WOLFSSL_KEIL
  168205. "adcs r2, r2, %[r]\n\t"
  168206. #elif defined(__clang__)
  168207. "adcs r2, %[r]\n\t"
  168208. #else
  168209. "adc r2, %[r]\n\t"
  168210. #endif
  168211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168212. "adds r3, r3, r5\n\t"
  168213. #else
  168214. "add r3, r3, r5\n\t"
  168215. #endif
  168216. #ifdef WOLFSSL_KEIL
  168217. "adcs r4, r4, r6\n\t"
  168218. #elif defined(__clang__)
  168219. "adcs r4, r6\n\t"
  168220. #else
  168221. "adc r4, r6\n\t"
  168222. #endif
  168223. #ifdef WOLFSSL_KEIL
  168224. "adcs r2, r2, %[r]\n\t"
  168225. #elif defined(__clang__)
  168226. "adcs r2, %[r]\n\t"
  168227. #else
  168228. "adc r2, %[r]\n\t"
  168229. #endif
  168230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168231. "lsrs r5, %[a], #16\n\t"
  168232. #else
  168233. "lsr r5, %[a], #16\n\t"
  168234. #endif
  168235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168236. "lsrs r6, r7, #16\n\t"
  168237. #else
  168238. "lsr r6, r7, #16\n\t"
  168239. #endif
  168240. #ifdef WOLFSSL_KEIL
  168241. "muls r6, r5, r6\n\t"
  168242. #elif defined(__clang__)
  168243. "muls r6, r5\n\t"
  168244. #else
  168245. "mul r6, r5\n\t"
  168246. #endif
  168247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168248. "adds r4, r4, r6\n\t"
  168249. #else
  168250. "add r4, r4, r6\n\t"
  168251. #endif
  168252. #ifdef WOLFSSL_KEIL
  168253. "adcs r2, r2, %[r]\n\t"
  168254. #elif defined(__clang__)
  168255. "adcs r2, %[r]\n\t"
  168256. #else
  168257. "adc r2, %[r]\n\t"
  168258. #endif
  168259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168260. "adds r4, r4, r6\n\t"
  168261. #else
  168262. "add r4, r4, r6\n\t"
  168263. #endif
  168264. #ifdef WOLFSSL_KEIL
  168265. "adcs r2, r2, %[r]\n\t"
  168266. #elif defined(__clang__)
  168267. "adcs r2, %[r]\n\t"
  168268. #else
  168269. "adc r2, %[r]\n\t"
  168270. #endif
  168271. "uxth r6, r7\n\t"
  168272. #ifdef WOLFSSL_KEIL
  168273. "muls r5, r6, r5\n\t"
  168274. #elif defined(__clang__)
  168275. "muls r5, r6\n\t"
  168276. #else
  168277. "mul r5, r6\n\t"
  168278. #endif
  168279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168280. "lsrs r6, r5, #16\n\t"
  168281. #else
  168282. "lsr r6, r5, #16\n\t"
  168283. #endif
  168284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168285. "lsls r5, r5, #16\n\t"
  168286. #else
  168287. "lsl r5, r5, #16\n\t"
  168288. #endif
  168289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168290. "adds r3, r3, r5\n\t"
  168291. #else
  168292. "add r3, r3, r5\n\t"
  168293. #endif
  168294. #ifdef WOLFSSL_KEIL
  168295. "adcs r4, r4, r6\n\t"
  168296. #elif defined(__clang__)
  168297. "adcs r4, r6\n\t"
  168298. #else
  168299. "adc r4, r6\n\t"
  168300. #endif
  168301. #ifdef WOLFSSL_KEIL
  168302. "adcs r2, r2, %[r]\n\t"
  168303. #elif defined(__clang__)
  168304. "adcs r2, %[r]\n\t"
  168305. #else
  168306. "adc r2, %[r]\n\t"
  168307. #endif
  168308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168309. "adds r3, r3, r5\n\t"
  168310. #else
  168311. "add r3, r3, r5\n\t"
  168312. #endif
  168313. #ifdef WOLFSSL_KEIL
  168314. "adcs r4, r4, r6\n\t"
  168315. #elif defined(__clang__)
  168316. "adcs r4, r6\n\t"
  168317. #else
  168318. "adc r4, r6\n\t"
  168319. #endif
  168320. #ifdef WOLFSSL_KEIL
  168321. "adcs r2, r2, %[r]\n\t"
  168322. #elif defined(__clang__)
  168323. "adcs r2, %[r]\n\t"
  168324. #else
  168325. "adc r2, %[r]\n\t"
  168326. #endif
  168327. "# A[8] * A[8]\n\t"
  168328. "mov %[a], r9\n\t"
  168329. "ldr r7, [%[a], #32]\n\t"
  168330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168331. "lsrs r6, r7, #16\n\t"
  168332. #else
  168333. "lsr r6, r7, #16\n\t"
  168334. #endif
  168335. "uxth r5, r7\n\t"
  168336. #ifdef WOLFSSL_KEIL
  168337. "muls r5, r5, r5\n\t"
  168338. #elif defined(__clang__)
  168339. "muls r5, r5\n\t"
  168340. #else
  168341. "mul r5, r5\n\t"
  168342. #endif
  168343. #ifdef WOLFSSL_KEIL
  168344. "muls r6, r6, r6\n\t"
  168345. #elif defined(__clang__)
  168346. "muls r6, r6\n\t"
  168347. #else
  168348. "mul r6, r6\n\t"
  168349. #endif
  168350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168351. "adds r3, r3, r5\n\t"
  168352. #else
  168353. "add r3, r3, r5\n\t"
  168354. #endif
  168355. #ifdef WOLFSSL_KEIL
  168356. "adcs r4, r4, r6\n\t"
  168357. #elif defined(__clang__)
  168358. "adcs r4, r6\n\t"
  168359. #else
  168360. "adc r4, r6\n\t"
  168361. #endif
  168362. #ifdef WOLFSSL_KEIL
  168363. "adcs r2, r2, %[r]\n\t"
  168364. #elif defined(__clang__)
  168365. "adcs r2, %[r]\n\t"
  168366. #else
  168367. "adc r2, %[r]\n\t"
  168368. #endif
  168369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168370. "lsrs r6, r7, #16\n\t"
  168371. #else
  168372. "lsr r6, r7, #16\n\t"
  168373. #endif
  168374. "uxth r5, r7\n\t"
  168375. #ifdef WOLFSSL_KEIL
  168376. "muls r5, r6, r5\n\t"
  168377. #elif defined(__clang__)
  168378. "muls r5, r6\n\t"
  168379. #else
  168380. "mul r5, r6\n\t"
  168381. #endif
  168382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168383. "lsrs r6, r5, #15\n\t"
  168384. #else
  168385. "lsr r6, r5, #15\n\t"
  168386. #endif
  168387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168388. "lsls r5, r5, #17\n\t"
  168389. #else
  168390. "lsl r5, r5, #17\n\t"
  168391. #endif
  168392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168393. "adds r3, r3, r5\n\t"
  168394. #else
  168395. "add r3, r3, r5\n\t"
  168396. #endif
  168397. #ifdef WOLFSSL_KEIL
  168398. "adcs r4, r4, r6\n\t"
  168399. #elif defined(__clang__)
  168400. "adcs r4, r6\n\t"
  168401. #else
  168402. "adc r4, r6\n\t"
  168403. #endif
  168404. #ifdef WOLFSSL_KEIL
  168405. "adcs r2, r2, %[r]\n\t"
  168406. #elif defined(__clang__)
  168407. "adcs r2, %[r]\n\t"
  168408. #else
  168409. "adc r2, %[r]\n\t"
  168410. #endif
  168411. "mov %[r], r8\n\t"
  168412. "str r3, [%[r], #64]\n\t"
  168413. "movs %[r], #0\n\t"
  168414. "movs %[a], #48\n\t"
  168415. "add %[a], %[a], r9\n\t"
  168416. "ldm %[a]!, {r5, r6}\n\t"
  168417. "mov r10, r5\n\t"
  168418. "mov r11, r6\n\t"
  168419. "ldm %[a]!, {r5, r6}\n\t"
  168420. "mov r12, r5\n\t"
  168421. "mov lr, r6\n\t"
  168422. "mov %[a], r9\n\t"
  168423. "# A[9] * A[8]\n\t"
  168424. "movs r3, #0\n\t"
  168425. "ldr %[a], [%[a], #36]\n\t"
  168426. "uxth r5, %[a]\n\t"
  168427. "uxth r6, r7\n\t"
  168428. #ifdef WOLFSSL_KEIL
  168429. "muls r6, r5, r6\n\t"
  168430. #elif defined(__clang__)
  168431. "muls r6, r5\n\t"
  168432. #else
  168433. "mul r6, r5\n\t"
  168434. #endif
  168435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168436. "adds r4, r4, r6\n\t"
  168437. #else
  168438. "add r4, r4, r6\n\t"
  168439. #endif
  168440. #ifdef WOLFSSL_KEIL
  168441. "adcs r2, r2, %[r]\n\t"
  168442. #elif defined(__clang__)
  168443. "adcs r2, %[r]\n\t"
  168444. #else
  168445. "adc r2, %[r]\n\t"
  168446. #endif
  168447. #ifdef WOLFSSL_KEIL
  168448. "adcs r3, r3, %[r]\n\t"
  168449. #elif defined(__clang__)
  168450. "adcs r3, %[r]\n\t"
  168451. #else
  168452. "adc r3, %[r]\n\t"
  168453. #endif
  168454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168455. "adds r4, r4, r6\n\t"
  168456. #else
  168457. "add r4, r4, r6\n\t"
  168458. #endif
  168459. #ifdef WOLFSSL_KEIL
  168460. "adcs r2, r2, %[r]\n\t"
  168461. #elif defined(__clang__)
  168462. "adcs r2, %[r]\n\t"
  168463. #else
  168464. "adc r2, %[r]\n\t"
  168465. #endif
  168466. #ifdef WOLFSSL_KEIL
  168467. "adcs r3, r3, %[r]\n\t"
  168468. #elif defined(__clang__)
  168469. "adcs r3, %[r]\n\t"
  168470. #else
  168471. "adc r3, %[r]\n\t"
  168472. #endif
  168473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168474. "lsrs r6, r7, #16\n\t"
  168475. #else
  168476. "lsr r6, r7, #16\n\t"
  168477. #endif
  168478. #ifdef WOLFSSL_KEIL
  168479. "muls r5, r6, r5\n\t"
  168480. #elif defined(__clang__)
  168481. "muls r5, r6\n\t"
  168482. #else
  168483. "mul r5, r6\n\t"
  168484. #endif
  168485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168486. "lsrs r6, r5, #16\n\t"
  168487. #else
  168488. "lsr r6, r5, #16\n\t"
  168489. #endif
  168490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168491. "lsls r5, r5, #16\n\t"
  168492. #else
  168493. "lsl r5, r5, #16\n\t"
  168494. #endif
  168495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168496. "adds r4, r4, r5\n\t"
  168497. #else
  168498. "add r4, r4, r5\n\t"
  168499. #endif
  168500. #ifdef WOLFSSL_KEIL
  168501. "adcs r2, r2, r6\n\t"
  168502. #elif defined(__clang__)
  168503. "adcs r2, r6\n\t"
  168504. #else
  168505. "adc r2, r6\n\t"
  168506. #endif
  168507. #ifdef WOLFSSL_KEIL
  168508. "adcs r3, r3, %[r]\n\t"
  168509. #elif defined(__clang__)
  168510. "adcs r3, %[r]\n\t"
  168511. #else
  168512. "adc r3, %[r]\n\t"
  168513. #endif
  168514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168515. "adds r4, r4, r5\n\t"
  168516. #else
  168517. "add r4, r4, r5\n\t"
  168518. #endif
  168519. #ifdef WOLFSSL_KEIL
  168520. "adcs r2, r2, r6\n\t"
  168521. #elif defined(__clang__)
  168522. "adcs r2, r6\n\t"
  168523. #else
  168524. "adc r2, r6\n\t"
  168525. #endif
  168526. #ifdef WOLFSSL_KEIL
  168527. "adcs r3, r3, %[r]\n\t"
  168528. #elif defined(__clang__)
  168529. "adcs r3, %[r]\n\t"
  168530. #else
  168531. "adc r3, %[r]\n\t"
  168532. #endif
  168533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168534. "lsrs r5, %[a], #16\n\t"
  168535. #else
  168536. "lsr r5, %[a], #16\n\t"
  168537. #endif
  168538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168539. "lsrs r6, r7, #16\n\t"
  168540. #else
  168541. "lsr r6, r7, #16\n\t"
  168542. #endif
  168543. #ifdef WOLFSSL_KEIL
  168544. "muls r6, r5, r6\n\t"
  168545. #elif defined(__clang__)
  168546. "muls r6, r5\n\t"
  168547. #else
  168548. "mul r6, r5\n\t"
  168549. #endif
  168550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168551. "adds r2, r2, r6\n\t"
  168552. #else
  168553. "add r2, r2, r6\n\t"
  168554. #endif
  168555. #ifdef WOLFSSL_KEIL
  168556. "adcs r3, r3, %[r]\n\t"
  168557. #elif defined(__clang__)
  168558. "adcs r3, %[r]\n\t"
  168559. #else
  168560. "adc r3, %[r]\n\t"
  168561. #endif
  168562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168563. "adds r2, r2, r6\n\t"
  168564. #else
  168565. "add r2, r2, r6\n\t"
  168566. #endif
  168567. #ifdef WOLFSSL_KEIL
  168568. "adcs r3, r3, %[r]\n\t"
  168569. #elif defined(__clang__)
  168570. "adcs r3, %[r]\n\t"
  168571. #else
  168572. "adc r3, %[r]\n\t"
  168573. #endif
  168574. "uxth r6, r7\n\t"
  168575. #ifdef WOLFSSL_KEIL
  168576. "muls r5, r6, r5\n\t"
  168577. #elif defined(__clang__)
  168578. "muls r5, r6\n\t"
  168579. #else
  168580. "mul r5, r6\n\t"
  168581. #endif
  168582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168583. "lsrs r6, r5, #16\n\t"
  168584. #else
  168585. "lsr r6, r5, #16\n\t"
  168586. #endif
  168587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168588. "lsls r5, r5, #16\n\t"
  168589. #else
  168590. "lsl r5, r5, #16\n\t"
  168591. #endif
  168592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168593. "adds r4, r4, r5\n\t"
  168594. #else
  168595. "add r4, r4, r5\n\t"
  168596. #endif
  168597. #ifdef WOLFSSL_KEIL
  168598. "adcs r2, r2, r6\n\t"
  168599. #elif defined(__clang__)
  168600. "adcs r2, r6\n\t"
  168601. #else
  168602. "adc r2, r6\n\t"
  168603. #endif
  168604. #ifdef WOLFSSL_KEIL
  168605. "adcs r3, r3, %[r]\n\t"
  168606. #elif defined(__clang__)
  168607. "adcs r3, %[r]\n\t"
  168608. #else
  168609. "adc r3, %[r]\n\t"
  168610. #endif
  168611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168612. "adds r4, r4, r5\n\t"
  168613. #else
  168614. "add r4, r4, r5\n\t"
  168615. #endif
  168616. #ifdef WOLFSSL_KEIL
  168617. "adcs r2, r2, r6\n\t"
  168618. #elif defined(__clang__)
  168619. "adcs r2, r6\n\t"
  168620. #else
  168621. "adc r2, r6\n\t"
  168622. #endif
  168623. #ifdef WOLFSSL_KEIL
  168624. "adcs r3, r3, %[r]\n\t"
  168625. #elif defined(__clang__)
  168626. "adcs r3, %[r]\n\t"
  168627. #else
  168628. "adc r3, %[r]\n\t"
  168629. #endif
  168630. "# A[10] * A[7]\n\t"
  168631. "mov %[a], r9\n\t"
  168632. "ldr r7, [%[a], #28]\n\t"
  168633. "ldr %[a], [%[a], #40]\n\t"
  168634. "uxth r5, %[a]\n\t"
  168635. "uxth r6, r7\n\t"
  168636. #ifdef WOLFSSL_KEIL
  168637. "muls r6, r5, r6\n\t"
  168638. #elif defined(__clang__)
  168639. "muls r6, r5\n\t"
  168640. #else
  168641. "mul r6, r5\n\t"
  168642. #endif
  168643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168644. "adds r4, r4, r6\n\t"
  168645. #else
  168646. "add r4, r4, r6\n\t"
  168647. #endif
  168648. #ifdef WOLFSSL_KEIL
  168649. "adcs r2, r2, %[r]\n\t"
  168650. #elif defined(__clang__)
  168651. "adcs r2, %[r]\n\t"
  168652. #else
  168653. "adc r2, %[r]\n\t"
  168654. #endif
  168655. #ifdef WOLFSSL_KEIL
  168656. "adcs r3, r3, %[r]\n\t"
  168657. #elif defined(__clang__)
  168658. "adcs r3, %[r]\n\t"
  168659. #else
  168660. "adc r3, %[r]\n\t"
  168661. #endif
  168662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168663. "adds r4, r4, r6\n\t"
  168664. #else
  168665. "add r4, r4, r6\n\t"
  168666. #endif
  168667. #ifdef WOLFSSL_KEIL
  168668. "adcs r2, r2, %[r]\n\t"
  168669. #elif defined(__clang__)
  168670. "adcs r2, %[r]\n\t"
  168671. #else
  168672. "adc r2, %[r]\n\t"
  168673. #endif
  168674. #ifdef WOLFSSL_KEIL
  168675. "adcs r3, r3, %[r]\n\t"
  168676. #elif defined(__clang__)
  168677. "adcs r3, %[r]\n\t"
  168678. #else
  168679. "adc r3, %[r]\n\t"
  168680. #endif
  168681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168682. "lsrs r6, r7, #16\n\t"
  168683. #else
  168684. "lsr r6, r7, #16\n\t"
  168685. #endif
  168686. #ifdef WOLFSSL_KEIL
  168687. "muls r5, r6, r5\n\t"
  168688. #elif defined(__clang__)
  168689. "muls r5, r6\n\t"
  168690. #else
  168691. "mul r5, r6\n\t"
  168692. #endif
  168693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168694. "lsrs r6, r5, #16\n\t"
  168695. #else
  168696. "lsr r6, r5, #16\n\t"
  168697. #endif
  168698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168699. "lsls r5, r5, #16\n\t"
  168700. #else
  168701. "lsl r5, r5, #16\n\t"
  168702. #endif
  168703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168704. "adds r4, r4, r5\n\t"
  168705. #else
  168706. "add r4, r4, r5\n\t"
  168707. #endif
  168708. #ifdef WOLFSSL_KEIL
  168709. "adcs r2, r2, r6\n\t"
  168710. #elif defined(__clang__)
  168711. "adcs r2, r6\n\t"
  168712. #else
  168713. "adc r2, r6\n\t"
  168714. #endif
  168715. #ifdef WOLFSSL_KEIL
  168716. "adcs r3, r3, %[r]\n\t"
  168717. #elif defined(__clang__)
  168718. "adcs r3, %[r]\n\t"
  168719. #else
  168720. "adc r3, %[r]\n\t"
  168721. #endif
  168722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168723. "adds r4, r4, r5\n\t"
  168724. #else
  168725. "add r4, r4, r5\n\t"
  168726. #endif
  168727. #ifdef WOLFSSL_KEIL
  168728. "adcs r2, r2, r6\n\t"
  168729. #elif defined(__clang__)
  168730. "adcs r2, r6\n\t"
  168731. #else
  168732. "adc r2, r6\n\t"
  168733. #endif
  168734. #ifdef WOLFSSL_KEIL
  168735. "adcs r3, r3, %[r]\n\t"
  168736. #elif defined(__clang__)
  168737. "adcs r3, %[r]\n\t"
  168738. #else
  168739. "adc r3, %[r]\n\t"
  168740. #endif
  168741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168742. "lsrs r5, %[a], #16\n\t"
  168743. #else
  168744. "lsr r5, %[a], #16\n\t"
  168745. #endif
  168746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168747. "lsrs r6, r7, #16\n\t"
  168748. #else
  168749. "lsr r6, r7, #16\n\t"
  168750. #endif
  168751. #ifdef WOLFSSL_KEIL
  168752. "muls r6, r5, r6\n\t"
  168753. #elif defined(__clang__)
  168754. "muls r6, r5\n\t"
  168755. #else
  168756. "mul r6, r5\n\t"
  168757. #endif
  168758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168759. "adds r2, r2, r6\n\t"
  168760. #else
  168761. "add r2, r2, r6\n\t"
  168762. #endif
  168763. #ifdef WOLFSSL_KEIL
  168764. "adcs r3, r3, %[r]\n\t"
  168765. #elif defined(__clang__)
  168766. "adcs r3, %[r]\n\t"
  168767. #else
  168768. "adc r3, %[r]\n\t"
  168769. #endif
  168770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168771. "adds r2, r2, r6\n\t"
  168772. #else
  168773. "add r2, r2, r6\n\t"
  168774. #endif
  168775. #ifdef WOLFSSL_KEIL
  168776. "adcs r3, r3, %[r]\n\t"
  168777. #elif defined(__clang__)
  168778. "adcs r3, %[r]\n\t"
  168779. #else
  168780. "adc r3, %[r]\n\t"
  168781. #endif
  168782. "uxth r6, r7\n\t"
  168783. #ifdef WOLFSSL_KEIL
  168784. "muls r5, r6, r5\n\t"
  168785. #elif defined(__clang__)
  168786. "muls r5, r6\n\t"
  168787. #else
  168788. "mul r5, r6\n\t"
  168789. #endif
  168790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168791. "lsrs r6, r5, #16\n\t"
  168792. #else
  168793. "lsr r6, r5, #16\n\t"
  168794. #endif
  168795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168796. "lsls r5, r5, #16\n\t"
  168797. #else
  168798. "lsl r5, r5, #16\n\t"
  168799. #endif
  168800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168801. "adds r4, r4, r5\n\t"
  168802. #else
  168803. "add r4, r4, r5\n\t"
  168804. #endif
  168805. #ifdef WOLFSSL_KEIL
  168806. "adcs r2, r2, r6\n\t"
  168807. #elif defined(__clang__)
  168808. "adcs r2, r6\n\t"
  168809. #else
  168810. "adc r2, r6\n\t"
  168811. #endif
  168812. #ifdef WOLFSSL_KEIL
  168813. "adcs r3, r3, %[r]\n\t"
  168814. #elif defined(__clang__)
  168815. "adcs r3, %[r]\n\t"
  168816. #else
  168817. "adc r3, %[r]\n\t"
  168818. #endif
  168819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168820. "adds r4, r4, r5\n\t"
  168821. #else
  168822. "add r4, r4, r5\n\t"
  168823. #endif
  168824. #ifdef WOLFSSL_KEIL
  168825. "adcs r2, r2, r6\n\t"
  168826. #elif defined(__clang__)
  168827. "adcs r2, r6\n\t"
  168828. #else
  168829. "adc r2, r6\n\t"
  168830. #endif
  168831. #ifdef WOLFSSL_KEIL
  168832. "adcs r3, r3, %[r]\n\t"
  168833. #elif defined(__clang__)
  168834. "adcs r3, %[r]\n\t"
  168835. #else
  168836. "adc r3, %[r]\n\t"
  168837. #endif
  168838. "# A[11] * A[6]\n\t"
  168839. "mov %[a], r9\n\t"
  168840. "ldr r7, [%[a], #24]\n\t"
  168841. "ldr %[a], [%[a], #44]\n\t"
  168842. "uxth r5, %[a]\n\t"
  168843. "uxth r6, r7\n\t"
  168844. #ifdef WOLFSSL_KEIL
  168845. "muls r6, r5, r6\n\t"
  168846. #elif defined(__clang__)
  168847. "muls r6, r5\n\t"
  168848. #else
  168849. "mul r6, r5\n\t"
  168850. #endif
  168851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168852. "adds r4, r4, r6\n\t"
  168853. #else
  168854. "add r4, r4, r6\n\t"
  168855. #endif
  168856. #ifdef WOLFSSL_KEIL
  168857. "adcs r2, r2, %[r]\n\t"
  168858. #elif defined(__clang__)
  168859. "adcs r2, %[r]\n\t"
  168860. #else
  168861. "adc r2, %[r]\n\t"
  168862. #endif
  168863. #ifdef WOLFSSL_KEIL
  168864. "adcs r3, r3, %[r]\n\t"
  168865. #elif defined(__clang__)
  168866. "adcs r3, %[r]\n\t"
  168867. #else
  168868. "adc r3, %[r]\n\t"
  168869. #endif
  168870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168871. "adds r4, r4, r6\n\t"
  168872. #else
  168873. "add r4, r4, r6\n\t"
  168874. #endif
  168875. #ifdef WOLFSSL_KEIL
  168876. "adcs r2, r2, %[r]\n\t"
  168877. #elif defined(__clang__)
  168878. "adcs r2, %[r]\n\t"
  168879. #else
  168880. "adc r2, %[r]\n\t"
  168881. #endif
  168882. #ifdef WOLFSSL_KEIL
  168883. "adcs r3, r3, %[r]\n\t"
  168884. #elif defined(__clang__)
  168885. "adcs r3, %[r]\n\t"
  168886. #else
  168887. "adc r3, %[r]\n\t"
  168888. #endif
  168889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168890. "lsrs r6, r7, #16\n\t"
  168891. #else
  168892. "lsr r6, r7, #16\n\t"
  168893. #endif
  168894. #ifdef WOLFSSL_KEIL
  168895. "muls r5, r6, r5\n\t"
  168896. #elif defined(__clang__)
  168897. "muls r5, r6\n\t"
  168898. #else
  168899. "mul r5, r6\n\t"
  168900. #endif
  168901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168902. "lsrs r6, r5, #16\n\t"
  168903. #else
  168904. "lsr r6, r5, #16\n\t"
  168905. #endif
  168906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168907. "lsls r5, r5, #16\n\t"
  168908. #else
  168909. "lsl r5, r5, #16\n\t"
  168910. #endif
  168911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168912. "adds r4, r4, r5\n\t"
  168913. #else
  168914. "add r4, r4, r5\n\t"
  168915. #endif
  168916. #ifdef WOLFSSL_KEIL
  168917. "adcs r2, r2, r6\n\t"
  168918. #elif defined(__clang__)
  168919. "adcs r2, r6\n\t"
  168920. #else
  168921. "adc r2, r6\n\t"
  168922. #endif
  168923. #ifdef WOLFSSL_KEIL
  168924. "adcs r3, r3, %[r]\n\t"
  168925. #elif defined(__clang__)
  168926. "adcs r3, %[r]\n\t"
  168927. #else
  168928. "adc r3, %[r]\n\t"
  168929. #endif
  168930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168931. "adds r4, r4, r5\n\t"
  168932. #else
  168933. "add r4, r4, r5\n\t"
  168934. #endif
  168935. #ifdef WOLFSSL_KEIL
  168936. "adcs r2, r2, r6\n\t"
  168937. #elif defined(__clang__)
  168938. "adcs r2, r6\n\t"
  168939. #else
  168940. "adc r2, r6\n\t"
  168941. #endif
  168942. #ifdef WOLFSSL_KEIL
  168943. "adcs r3, r3, %[r]\n\t"
  168944. #elif defined(__clang__)
  168945. "adcs r3, %[r]\n\t"
  168946. #else
  168947. "adc r3, %[r]\n\t"
  168948. #endif
  168949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168950. "lsrs r5, %[a], #16\n\t"
  168951. #else
  168952. "lsr r5, %[a], #16\n\t"
  168953. #endif
  168954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168955. "lsrs r6, r7, #16\n\t"
  168956. #else
  168957. "lsr r6, r7, #16\n\t"
  168958. #endif
  168959. #ifdef WOLFSSL_KEIL
  168960. "muls r6, r5, r6\n\t"
  168961. #elif defined(__clang__)
  168962. "muls r6, r5\n\t"
  168963. #else
  168964. "mul r6, r5\n\t"
  168965. #endif
  168966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168967. "adds r2, r2, r6\n\t"
  168968. #else
  168969. "add r2, r2, r6\n\t"
  168970. #endif
  168971. #ifdef WOLFSSL_KEIL
  168972. "adcs r3, r3, %[r]\n\t"
  168973. #elif defined(__clang__)
  168974. "adcs r3, %[r]\n\t"
  168975. #else
  168976. "adc r3, %[r]\n\t"
  168977. #endif
  168978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168979. "adds r2, r2, r6\n\t"
  168980. #else
  168981. "add r2, r2, r6\n\t"
  168982. #endif
  168983. #ifdef WOLFSSL_KEIL
  168984. "adcs r3, r3, %[r]\n\t"
  168985. #elif defined(__clang__)
  168986. "adcs r3, %[r]\n\t"
  168987. #else
  168988. "adc r3, %[r]\n\t"
  168989. #endif
  168990. "uxth r6, r7\n\t"
  168991. #ifdef WOLFSSL_KEIL
  168992. "muls r5, r6, r5\n\t"
  168993. #elif defined(__clang__)
  168994. "muls r5, r6\n\t"
  168995. #else
  168996. "mul r5, r6\n\t"
  168997. #endif
  168998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168999. "lsrs r6, r5, #16\n\t"
  169000. #else
  169001. "lsr r6, r5, #16\n\t"
  169002. #endif
  169003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169004. "lsls r5, r5, #16\n\t"
  169005. #else
  169006. "lsl r5, r5, #16\n\t"
  169007. #endif
  169008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169009. "adds r4, r4, r5\n\t"
  169010. #else
  169011. "add r4, r4, r5\n\t"
  169012. #endif
  169013. #ifdef WOLFSSL_KEIL
  169014. "adcs r2, r2, r6\n\t"
  169015. #elif defined(__clang__)
  169016. "adcs r2, r6\n\t"
  169017. #else
  169018. "adc r2, r6\n\t"
  169019. #endif
  169020. #ifdef WOLFSSL_KEIL
  169021. "adcs r3, r3, %[r]\n\t"
  169022. #elif defined(__clang__)
  169023. "adcs r3, %[r]\n\t"
  169024. #else
  169025. "adc r3, %[r]\n\t"
  169026. #endif
  169027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169028. "adds r4, r4, r5\n\t"
  169029. #else
  169030. "add r4, r4, r5\n\t"
  169031. #endif
  169032. #ifdef WOLFSSL_KEIL
  169033. "adcs r2, r2, r6\n\t"
  169034. #elif defined(__clang__)
  169035. "adcs r2, r6\n\t"
  169036. #else
  169037. "adc r2, r6\n\t"
  169038. #endif
  169039. #ifdef WOLFSSL_KEIL
  169040. "adcs r3, r3, %[r]\n\t"
  169041. #elif defined(__clang__)
  169042. "adcs r3, %[r]\n\t"
  169043. #else
  169044. "adc r3, %[r]\n\t"
  169045. #endif
  169046. "# A[12] * A[5]\n\t"
  169047. "mov %[a], r9\n\t"
  169048. "ldr r7, [%[a], #20]\n\t"
  169049. "mov %[a], r10\n\t"
  169050. "uxth r5, %[a]\n\t"
  169051. "uxth r6, r7\n\t"
  169052. #ifdef WOLFSSL_KEIL
  169053. "muls r6, r5, r6\n\t"
  169054. #elif defined(__clang__)
  169055. "muls r6, r5\n\t"
  169056. #else
  169057. "mul r6, r5\n\t"
  169058. #endif
  169059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169060. "adds r4, r4, r6\n\t"
  169061. #else
  169062. "add r4, r4, r6\n\t"
  169063. #endif
  169064. #ifdef WOLFSSL_KEIL
  169065. "adcs r2, r2, %[r]\n\t"
  169066. #elif defined(__clang__)
  169067. "adcs r2, %[r]\n\t"
  169068. #else
  169069. "adc r2, %[r]\n\t"
  169070. #endif
  169071. #ifdef WOLFSSL_KEIL
  169072. "adcs r3, r3, %[r]\n\t"
  169073. #elif defined(__clang__)
  169074. "adcs r3, %[r]\n\t"
  169075. #else
  169076. "adc r3, %[r]\n\t"
  169077. #endif
  169078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169079. "adds r4, r4, r6\n\t"
  169080. #else
  169081. "add r4, r4, r6\n\t"
  169082. #endif
  169083. #ifdef WOLFSSL_KEIL
  169084. "adcs r2, r2, %[r]\n\t"
  169085. #elif defined(__clang__)
  169086. "adcs r2, %[r]\n\t"
  169087. #else
  169088. "adc r2, %[r]\n\t"
  169089. #endif
  169090. #ifdef WOLFSSL_KEIL
  169091. "adcs r3, r3, %[r]\n\t"
  169092. #elif defined(__clang__)
  169093. "adcs r3, %[r]\n\t"
  169094. #else
  169095. "adc r3, %[r]\n\t"
  169096. #endif
  169097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169098. "lsrs r6, r7, #16\n\t"
  169099. #else
  169100. "lsr r6, r7, #16\n\t"
  169101. #endif
  169102. #ifdef WOLFSSL_KEIL
  169103. "muls r5, r6, r5\n\t"
  169104. #elif defined(__clang__)
  169105. "muls r5, r6\n\t"
  169106. #else
  169107. "mul r5, r6\n\t"
  169108. #endif
  169109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169110. "lsrs r6, r5, #16\n\t"
  169111. #else
  169112. "lsr r6, r5, #16\n\t"
  169113. #endif
  169114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169115. "lsls r5, r5, #16\n\t"
  169116. #else
  169117. "lsl r5, r5, #16\n\t"
  169118. #endif
  169119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169120. "adds r4, r4, r5\n\t"
  169121. #else
  169122. "add r4, r4, r5\n\t"
  169123. #endif
  169124. #ifdef WOLFSSL_KEIL
  169125. "adcs r2, r2, r6\n\t"
  169126. #elif defined(__clang__)
  169127. "adcs r2, r6\n\t"
  169128. #else
  169129. "adc r2, r6\n\t"
  169130. #endif
  169131. #ifdef WOLFSSL_KEIL
  169132. "adcs r3, r3, %[r]\n\t"
  169133. #elif defined(__clang__)
  169134. "adcs r3, %[r]\n\t"
  169135. #else
  169136. "adc r3, %[r]\n\t"
  169137. #endif
  169138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169139. "adds r4, r4, r5\n\t"
  169140. #else
  169141. "add r4, r4, r5\n\t"
  169142. #endif
  169143. #ifdef WOLFSSL_KEIL
  169144. "adcs r2, r2, r6\n\t"
  169145. #elif defined(__clang__)
  169146. "adcs r2, r6\n\t"
  169147. #else
  169148. "adc r2, r6\n\t"
  169149. #endif
  169150. #ifdef WOLFSSL_KEIL
  169151. "adcs r3, r3, %[r]\n\t"
  169152. #elif defined(__clang__)
  169153. "adcs r3, %[r]\n\t"
  169154. #else
  169155. "adc r3, %[r]\n\t"
  169156. #endif
  169157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169158. "lsrs r5, %[a], #16\n\t"
  169159. #else
  169160. "lsr r5, %[a], #16\n\t"
  169161. #endif
  169162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169163. "lsrs r6, r7, #16\n\t"
  169164. #else
  169165. "lsr r6, r7, #16\n\t"
  169166. #endif
  169167. #ifdef WOLFSSL_KEIL
  169168. "muls r6, r5, r6\n\t"
  169169. #elif defined(__clang__)
  169170. "muls r6, r5\n\t"
  169171. #else
  169172. "mul r6, r5\n\t"
  169173. #endif
  169174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169175. "adds r2, r2, r6\n\t"
  169176. #else
  169177. "add r2, r2, r6\n\t"
  169178. #endif
  169179. #ifdef WOLFSSL_KEIL
  169180. "adcs r3, r3, %[r]\n\t"
  169181. #elif defined(__clang__)
  169182. "adcs r3, %[r]\n\t"
  169183. #else
  169184. "adc r3, %[r]\n\t"
  169185. #endif
  169186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169187. "adds r2, r2, r6\n\t"
  169188. #else
  169189. "add r2, r2, r6\n\t"
  169190. #endif
  169191. #ifdef WOLFSSL_KEIL
  169192. "adcs r3, r3, %[r]\n\t"
  169193. #elif defined(__clang__)
  169194. "adcs r3, %[r]\n\t"
  169195. #else
  169196. "adc r3, %[r]\n\t"
  169197. #endif
  169198. "uxth r6, r7\n\t"
  169199. #ifdef WOLFSSL_KEIL
  169200. "muls r5, r6, r5\n\t"
  169201. #elif defined(__clang__)
  169202. "muls r5, r6\n\t"
  169203. #else
  169204. "mul r5, r6\n\t"
  169205. #endif
  169206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169207. "lsrs r6, r5, #16\n\t"
  169208. #else
  169209. "lsr r6, r5, #16\n\t"
  169210. #endif
  169211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169212. "lsls r5, r5, #16\n\t"
  169213. #else
  169214. "lsl r5, r5, #16\n\t"
  169215. #endif
  169216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169217. "adds r4, r4, r5\n\t"
  169218. #else
  169219. "add r4, r4, r5\n\t"
  169220. #endif
  169221. #ifdef WOLFSSL_KEIL
  169222. "adcs r2, r2, r6\n\t"
  169223. #elif defined(__clang__)
  169224. "adcs r2, r6\n\t"
  169225. #else
  169226. "adc r2, r6\n\t"
  169227. #endif
  169228. #ifdef WOLFSSL_KEIL
  169229. "adcs r3, r3, %[r]\n\t"
  169230. #elif defined(__clang__)
  169231. "adcs r3, %[r]\n\t"
  169232. #else
  169233. "adc r3, %[r]\n\t"
  169234. #endif
  169235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169236. "adds r4, r4, r5\n\t"
  169237. #else
  169238. "add r4, r4, r5\n\t"
  169239. #endif
  169240. #ifdef WOLFSSL_KEIL
  169241. "adcs r2, r2, r6\n\t"
  169242. #elif defined(__clang__)
  169243. "adcs r2, r6\n\t"
  169244. #else
  169245. "adc r2, r6\n\t"
  169246. #endif
  169247. #ifdef WOLFSSL_KEIL
  169248. "adcs r3, r3, %[r]\n\t"
  169249. #elif defined(__clang__)
  169250. "adcs r3, %[r]\n\t"
  169251. #else
  169252. "adc r3, %[r]\n\t"
  169253. #endif
  169254. "# A[13] * A[4]\n\t"
  169255. "mov %[a], r9\n\t"
  169256. "ldr r7, [%[a], #16]\n\t"
  169257. "mov %[a], r11\n\t"
  169258. "uxth r5, %[a]\n\t"
  169259. "uxth r6, r7\n\t"
  169260. #ifdef WOLFSSL_KEIL
  169261. "muls r6, r5, r6\n\t"
  169262. #elif defined(__clang__)
  169263. "muls r6, r5\n\t"
  169264. #else
  169265. "mul r6, r5\n\t"
  169266. #endif
  169267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169268. "adds r4, r4, r6\n\t"
  169269. #else
  169270. "add r4, r4, r6\n\t"
  169271. #endif
  169272. #ifdef WOLFSSL_KEIL
  169273. "adcs r2, r2, %[r]\n\t"
  169274. #elif defined(__clang__)
  169275. "adcs r2, %[r]\n\t"
  169276. #else
  169277. "adc r2, %[r]\n\t"
  169278. #endif
  169279. #ifdef WOLFSSL_KEIL
  169280. "adcs r3, r3, %[r]\n\t"
  169281. #elif defined(__clang__)
  169282. "adcs r3, %[r]\n\t"
  169283. #else
  169284. "adc r3, %[r]\n\t"
  169285. #endif
  169286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169287. "adds r4, r4, r6\n\t"
  169288. #else
  169289. "add r4, r4, r6\n\t"
  169290. #endif
  169291. #ifdef WOLFSSL_KEIL
  169292. "adcs r2, r2, %[r]\n\t"
  169293. #elif defined(__clang__)
  169294. "adcs r2, %[r]\n\t"
  169295. #else
  169296. "adc r2, %[r]\n\t"
  169297. #endif
  169298. #ifdef WOLFSSL_KEIL
  169299. "adcs r3, r3, %[r]\n\t"
  169300. #elif defined(__clang__)
  169301. "adcs r3, %[r]\n\t"
  169302. #else
  169303. "adc r3, %[r]\n\t"
  169304. #endif
  169305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169306. "lsrs r6, r7, #16\n\t"
  169307. #else
  169308. "lsr r6, r7, #16\n\t"
  169309. #endif
  169310. #ifdef WOLFSSL_KEIL
  169311. "muls r5, r6, r5\n\t"
  169312. #elif defined(__clang__)
  169313. "muls r5, r6\n\t"
  169314. #else
  169315. "mul r5, r6\n\t"
  169316. #endif
  169317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169318. "lsrs r6, r5, #16\n\t"
  169319. #else
  169320. "lsr r6, r5, #16\n\t"
  169321. #endif
  169322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169323. "lsls r5, r5, #16\n\t"
  169324. #else
  169325. "lsl r5, r5, #16\n\t"
  169326. #endif
  169327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169328. "adds r4, r4, r5\n\t"
  169329. #else
  169330. "add r4, r4, r5\n\t"
  169331. #endif
  169332. #ifdef WOLFSSL_KEIL
  169333. "adcs r2, r2, r6\n\t"
  169334. #elif defined(__clang__)
  169335. "adcs r2, r6\n\t"
  169336. #else
  169337. "adc r2, r6\n\t"
  169338. #endif
  169339. #ifdef WOLFSSL_KEIL
  169340. "adcs r3, r3, %[r]\n\t"
  169341. #elif defined(__clang__)
  169342. "adcs r3, %[r]\n\t"
  169343. #else
  169344. "adc r3, %[r]\n\t"
  169345. #endif
  169346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169347. "adds r4, r4, r5\n\t"
  169348. #else
  169349. "add r4, r4, r5\n\t"
  169350. #endif
  169351. #ifdef WOLFSSL_KEIL
  169352. "adcs r2, r2, r6\n\t"
  169353. #elif defined(__clang__)
  169354. "adcs r2, r6\n\t"
  169355. #else
  169356. "adc r2, r6\n\t"
  169357. #endif
  169358. #ifdef WOLFSSL_KEIL
  169359. "adcs r3, r3, %[r]\n\t"
  169360. #elif defined(__clang__)
  169361. "adcs r3, %[r]\n\t"
  169362. #else
  169363. "adc r3, %[r]\n\t"
  169364. #endif
  169365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169366. "lsrs r5, %[a], #16\n\t"
  169367. #else
  169368. "lsr r5, %[a], #16\n\t"
  169369. #endif
  169370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169371. "lsrs r6, r7, #16\n\t"
  169372. #else
  169373. "lsr r6, r7, #16\n\t"
  169374. #endif
  169375. #ifdef WOLFSSL_KEIL
  169376. "muls r6, r5, r6\n\t"
  169377. #elif defined(__clang__)
  169378. "muls r6, r5\n\t"
  169379. #else
  169380. "mul r6, r5\n\t"
  169381. #endif
  169382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169383. "adds r2, r2, r6\n\t"
  169384. #else
  169385. "add r2, r2, r6\n\t"
  169386. #endif
  169387. #ifdef WOLFSSL_KEIL
  169388. "adcs r3, r3, %[r]\n\t"
  169389. #elif defined(__clang__)
  169390. "adcs r3, %[r]\n\t"
  169391. #else
  169392. "adc r3, %[r]\n\t"
  169393. #endif
  169394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169395. "adds r2, r2, r6\n\t"
  169396. #else
  169397. "add r2, r2, r6\n\t"
  169398. #endif
  169399. #ifdef WOLFSSL_KEIL
  169400. "adcs r3, r3, %[r]\n\t"
  169401. #elif defined(__clang__)
  169402. "adcs r3, %[r]\n\t"
  169403. #else
  169404. "adc r3, %[r]\n\t"
  169405. #endif
  169406. "uxth r6, r7\n\t"
  169407. #ifdef WOLFSSL_KEIL
  169408. "muls r5, r6, r5\n\t"
  169409. #elif defined(__clang__)
  169410. "muls r5, r6\n\t"
  169411. #else
  169412. "mul r5, r6\n\t"
  169413. #endif
  169414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169415. "lsrs r6, r5, #16\n\t"
  169416. #else
  169417. "lsr r6, r5, #16\n\t"
  169418. #endif
  169419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169420. "lsls r5, r5, #16\n\t"
  169421. #else
  169422. "lsl r5, r5, #16\n\t"
  169423. #endif
  169424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169425. "adds r4, r4, r5\n\t"
  169426. #else
  169427. "add r4, r4, r5\n\t"
  169428. #endif
  169429. #ifdef WOLFSSL_KEIL
  169430. "adcs r2, r2, r6\n\t"
  169431. #elif defined(__clang__)
  169432. "adcs r2, r6\n\t"
  169433. #else
  169434. "adc r2, r6\n\t"
  169435. #endif
  169436. #ifdef WOLFSSL_KEIL
  169437. "adcs r3, r3, %[r]\n\t"
  169438. #elif defined(__clang__)
  169439. "adcs r3, %[r]\n\t"
  169440. #else
  169441. "adc r3, %[r]\n\t"
  169442. #endif
  169443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169444. "adds r4, r4, r5\n\t"
  169445. #else
  169446. "add r4, r4, r5\n\t"
  169447. #endif
  169448. #ifdef WOLFSSL_KEIL
  169449. "adcs r2, r2, r6\n\t"
  169450. #elif defined(__clang__)
  169451. "adcs r2, r6\n\t"
  169452. #else
  169453. "adc r2, r6\n\t"
  169454. #endif
  169455. #ifdef WOLFSSL_KEIL
  169456. "adcs r3, r3, %[r]\n\t"
  169457. #elif defined(__clang__)
  169458. "adcs r3, %[r]\n\t"
  169459. #else
  169460. "adc r3, %[r]\n\t"
  169461. #endif
  169462. "# A[14] * A[3]\n\t"
  169463. "mov %[a], r9\n\t"
  169464. "ldr r7, [%[a], #12]\n\t"
  169465. "mov %[a], r12\n\t"
  169466. "uxth r5, %[a]\n\t"
  169467. "uxth r6, r7\n\t"
  169468. #ifdef WOLFSSL_KEIL
  169469. "muls r6, r5, r6\n\t"
  169470. #elif defined(__clang__)
  169471. "muls r6, r5\n\t"
  169472. #else
  169473. "mul r6, r5\n\t"
  169474. #endif
  169475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169476. "adds r4, r4, r6\n\t"
  169477. #else
  169478. "add r4, r4, r6\n\t"
  169479. #endif
  169480. #ifdef WOLFSSL_KEIL
  169481. "adcs r2, r2, %[r]\n\t"
  169482. #elif defined(__clang__)
  169483. "adcs r2, %[r]\n\t"
  169484. #else
  169485. "adc r2, %[r]\n\t"
  169486. #endif
  169487. #ifdef WOLFSSL_KEIL
  169488. "adcs r3, r3, %[r]\n\t"
  169489. #elif defined(__clang__)
  169490. "adcs r3, %[r]\n\t"
  169491. #else
  169492. "adc r3, %[r]\n\t"
  169493. #endif
  169494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169495. "adds r4, r4, r6\n\t"
  169496. #else
  169497. "add r4, r4, r6\n\t"
  169498. #endif
  169499. #ifdef WOLFSSL_KEIL
  169500. "adcs r2, r2, %[r]\n\t"
  169501. #elif defined(__clang__)
  169502. "adcs r2, %[r]\n\t"
  169503. #else
  169504. "adc r2, %[r]\n\t"
  169505. #endif
  169506. #ifdef WOLFSSL_KEIL
  169507. "adcs r3, r3, %[r]\n\t"
  169508. #elif defined(__clang__)
  169509. "adcs r3, %[r]\n\t"
  169510. #else
  169511. "adc r3, %[r]\n\t"
  169512. #endif
  169513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169514. "lsrs r6, r7, #16\n\t"
  169515. #else
  169516. "lsr r6, r7, #16\n\t"
  169517. #endif
  169518. #ifdef WOLFSSL_KEIL
  169519. "muls r5, r6, r5\n\t"
  169520. #elif defined(__clang__)
  169521. "muls r5, r6\n\t"
  169522. #else
  169523. "mul r5, r6\n\t"
  169524. #endif
  169525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169526. "lsrs r6, r5, #16\n\t"
  169527. #else
  169528. "lsr r6, r5, #16\n\t"
  169529. #endif
  169530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169531. "lsls r5, r5, #16\n\t"
  169532. #else
  169533. "lsl r5, r5, #16\n\t"
  169534. #endif
  169535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169536. "adds r4, r4, r5\n\t"
  169537. #else
  169538. "add r4, r4, r5\n\t"
  169539. #endif
  169540. #ifdef WOLFSSL_KEIL
  169541. "adcs r2, r2, r6\n\t"
  169542. #elif defined(__clang__)
  169543. "adcs r2, r6\n\t"
  169544. #else
  169545. "adc r2, r6\n\t"
  169546. #endif
  169547. #ifdef WOLFSSL_KEIL
  169548. "adcs r3, r3, %[r]\n\t"
  169549. #elif defined(__clang__)
  169550. "adcs r3, %[r]\n\t"
  169551. #else
  169552. "adc r3, %[r]\n\t"
  169553. #endif
  169554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169555. "adds r4, r4, r5\n\t"
  169556. #else
  169557. "add r4, r4, r5\n\t"
  169558. #endif
  169559. #ifdef WOLFSSL_KEIL
  169560. "adcs r2, r2, r6\n\t"
  169561. #elif defined(__clang__)
  169562. "adcs r2, r6\n\t"
  169563. #else
  169564. "adc r2, r6\n\t"
  169565. #endif
  169566. #ifdef WOLFSSL_KEIL
  169567. "adcs r3, r3, %[r]\n\t"
  169568. #elif defined(__clang__)
  169569. "adcs r3, %[r]\n\t"
  169570. #else
  169571. "adc r3, %[r]\n\t"
  169572. #endif
  169573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169574. "lsrs r5, %[a], #16\n\t"
  169575. #else
  169576. "lsr r5, %[a], #16\n\t"
  169577. #endif
  169578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169579. "lsrs r6, r7, #16\n\t"
  169580. #else
  169581. "lsr r6, r7, #16\n\t"
  169582. #endif
  169583. #ifdef WOLFSSL_KEIL
  169584. "muls r6, r5, r6\n\t"
  169585. #elif defined(__clang__)
  169586. "muls r6, r5\n\t"
  169587. #else
  169588. "mul r6, r5\n\t"
  169589. #endif
  169590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169591. "adds r2, r2, r6\n\t"
  169592. #else
  169593. "add r2, r2, r6\n\t"
  169594. #endif
  169595. #ifdef WOLFSSL_KEIL
  169596. "adcs r3, r3, %[r]\n\t"
  169597. #elif defined(__clang__)
  169598. "adcs r3, %[r]\n\t"
  169599. #else
  169600. "adc r3, %[r]\n\t"
  169601. #endif
  169602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169603. "adds r2, r2, r6\n\t"
  169604. #else
  169605. "add r2, r2, r6\n\t"
  169606. #endif
  169607. #ifdef WOLFSSL_KEIL
  169608. "adcs r3, r3, %[r]\n\t"
  169609. #elif defined(__clang__)
  169610. "adcs r3, %[r]\n\t"
  169611. #else
  169612. "adc r3, %[r]\n\t"
  169613. #endif
  169614. "uxth r6, r7\n\t"
  169615. #ifdef WOLFSSL_KEIL
  169616. "muls r5, r6, r5\n\t"
  169617. #elif defined(__clang__)
  169618. "muls r5, r6\n\t"
  169619. #else
  169620. "mul r5, r6\n\t"
  169621. #endif
  169622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169623. "lsrs r6, r5, #16\n\t"
  169624. #else
  169625. "lsr r6, r5, #16\n\t"
  169626. #endif
  169627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169628. "lsls r5, r5, #16\n\t"
  169629. #else
  169630. "lsl r5, r5, #16\n\t"
  169631. #endif
  169632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169633. "adds r4, r4, r5\n\t"
  169634. #else
  169635. "add r4, r4, r5\n\t"
  169636. #endif
  169637. #ifdef WOLFSSL_KEIL
  169638. "adcs r2, r2, r6\n\t"
  169639. #elif defined(__clang__)
  169640. "adcs r2, r6\n\t"
  169641. #else
  169642. "adc r2, r6\n\t"
  169643. #endif
  169644. #ifdef WOLFSSL_KEIL
  169645. "adcs r3, r3, %[r]\n\t"
  169646. #elif defined(__clang__)
  169647. "adcs r3, %[r]\n\t"
  169648. #else
  169649. "adc r3, %[r]\n\t"
  169650. #endif
  169651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169652. "adds r4, r4, r5\n\t"
  169653. #else
  169654. "add r4, r4, r5\n\t"
  169655. #endif
  169656. #ifdef WOLFSSL_KEIL
  169657. "adcs r2, r2, r6\n\t"
  169658. #elif defined(__clang__)
  169659. "adcs r2, r6\n\t"
  169660. #else
  169661. "adc r2, r6\n\t"
  169662. #endif
  169663. #ifdef WOLFSSL_KEIL
  169664. "adcs r3, r3, %[r]\n\t"
  169665. #elif defined(__clang__)
  169666. "adcs r3, %[r]\n\t"
  169667. #else
  169668. "adc r3, %[r]\n\t"
  169669. #endif
  169670. "# A[15] * A[2]\n\t"
  169671. "mov %[a], r9\n\t"
  169672. "ldr r7, [%[a], #8]\n\t"
  169673. "mov %[a], lr\n\t"
  169674. "uxth r5, %[a]\n\t"
  169675. "uxth r6, r7\n\t"
  169676. #ifdef WOLFSSL_KEIL
  169677. "muls r6, r5, r6\n\t"
  169678. #elif defined(__clang__)
  169679. "muls r6, r5\n\t"
  169680. #else
  169681. "mul r6, r5\n\t"
  169682. #endif
  169683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169684. "adds r4, r4, r6\n\t"
  169685. #else
  169686. "add r4, r4, r6\n\t"
  169687. #endif
  169688. #ifdef WOLFSSL_KEIL
  169689. "adcs r2, r2, %[r]\n\t"
  169690. #elif defined(__clang__)
  169691. "adcs r2, %[r]\n\t"
  169692. #else
  169693. "adc r2, %[r]\n\t"
  169694. #endif
  169695. #ifdef WOLFSSL_KEIL
  169696. "adcs r3, r3, %[r]\n\t"
  169697. #elif defined(__clang__)
  169698. "adcs r3, %[r]\n\t"
  169699. #else
  169700. "adc r3, %[r]\n\t"
  169701. #endif
  169702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169703. "adds r4, r4, r6\n\t"
  169704. #else
  169705. "add r4, r4, r6\n\t"
  169706. #endif
  169707. #ifdef WOLFSSL_KEIL
  169708. "adcs r2, r2, %[r]\n\t"
  169709. #elif defined(__clang__)
  169710. "adcs r2, %[r]\n\t"
  169711. #else
  169712. "adc r2, %[r]\n\t"
  169713. #endif
  169714. #ifdef WOLFSSL_KEIL
  169715. "adcs r3, r3, %[r]\n\t"
  169716. #elif defined(__clang__)
  169717. "adcs r3, %[r]\n\t"
  169718. #else
  169719. "adc r3, %[r]\n\t"
  169720. #endif
  169721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169722. "lsrs r6, r7, #16\n\t"
  169723. #else
  169724. "lsr r6, r7, #16\n\t"
  169725. #endif
  169726. #ifdef WOLFSSL_KEIL
  169727. "muls r5, r6, r5\n\t"
  169728. #elif defined(__clang__)
  169729. "muls r5, r6\n\t"
  169730. #else
  169731. "mul r5, r6\n\t"
  169732. #endif
  169733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169734. "lsrs r6, r5, #16\n\t"
  169735. #else
  169736. "lsr r6, r5, #16\n\t"
  169737. #endif
  169738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169739. "lsls r5, r5, #16\n\t"
  169740. #else
  169741. "lsl r5, r5, #16\n\t"
  169742. #endif
  169743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169744. "adds r4, r4, r5\n\t"
  169745. #else
  169746. "add r4, r4, r5\n\t"
  169747. #endif
  169748. #ifdef WOLFSSL_KEIL
  169749. "adcs r2, r2, r6\n\t"
  169750. #elif defined(__clang__)
  169751. "adcs r2, r6\n\t"
  169752. #else
  169753. "adc r2, r6\n\t"
  169754. #endif
  169755. #ifdef WOLFSSL_KEIL
  169756. "adcs r3, r3, %[r]\n\t"
  169757. #elif defined(__clang__)
  169758. "adcs r3, %[r]\n\t"
  169759. #else
  169760. "adc r3, %[r]\n\t"
  169761. #endif
  169762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169763. "adds r4, r4, r5\n\t"
  169764. #else
  169765. "add r4, r4, r5\n\t"
  169766. #endif
  169767. #ifdef WOLFSSL_KEIL
  169768. "adcs r2, r2, r6\n\t"
  169769. #elif defined(__clang__)
  169770. "adcs r2, r6\n\t"
  169771. #else
  169772. "adc r2, r6\n\t"
  169773. #endif
  169774. #ifdef WOLFSSL_KEIL
  169775. "adcs r3, r3, %[r]\n\t"
  169776. #elif defined(__clang__)
  169777. "adcs r3, %[r]\n\t"
  169778. #else
  169779. "adc r3, %[r]\n\t"
  169780. #endif
  169781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169782. "lsrs r5, %[a], #16\n\t"
  169783. #else
  169784. "lsr r5, %[a], #16\n\t"
  169785. #endif
  169786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169787. "lsrs r6, r7, #16\n\t"
  169788. #else
  169789. "lsr r6, r7, #16\n\t"
  169790. #endif
  169791. #ifdef WOLFSSL_KEIL
  169792. "muls r6, r5, r6\n\t"
  169793. #elif defined(__clang__)
  169794. "muls r6, r5\n\t"
  169795. #else
  169796. "mul r6, r5\n\t"
  169797. #endif
  169798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169799. "adds r2, r2, r6\n\t"
  169800. #else
  169801. "add r2, r2, r6\n\t"
  169802. #endif
  169803. #ifdef WOLFSSL_KEIL
  169804. "adcs r3, r3, %[r]\n\t"
  169805. #elif defined(__clang__)
  169806. "adcs r3, %[r]\n\t"
  169807. #else
  169808. "adc r3, %[r]\n\t"
  169809. #endif
  169810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169811. "adds r2, r2, r6\n\t"
  169812. #else
  169813. "add r2, r2, r6\n\t"
  169814. #endif
  169815. #ifdef WOLFSSL_KEIL
  169816. "adcs r3, r3, %[r]\n\t"
  169817. #elif defined(__clang__)
  169818. "adcs r3, %[r]\n\t"
  169819. #else
  169820. "adc r3, %[r]\n\t"
  169821. #endif
  169822. "uxth r6, r7\n\t"
  169823. #ifdef WOLFSSL_KEIL
  169824. "muls r5, r6, r5\n\t"
  169825. #elif defined(__clang__)
  169826. "muls r5, r6\n\t"
  169827. #else
  169828. "mul r5, r6\n\t"
  169829. #endif
  169830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169831. "lsrs r6, r5, #16\n\t"
  169832. #else
  169833. "lsr r6, r5, #16\n\t"
  169834. #endif
  169835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169836. "lsls r5, r5, #16\n\t"
  169837. #else
  169838. "lsl r5, r5, #16\n\t"
  169839. #endif
  169840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169841. "adds r4, r4, r5\n\t"
  169842. #else
  169843. "add r4, r4, r5\n\t"
  169844. #endif
  169845. #ifdef WOLFSSL_KEIL
  169846. "adcs r2, r2, r6\n\t"
  169847. #elif defined(__clang__)
  169848. "adcs r2, r6\n\t"
  169849. #else
  169850. "adc r2, r6\n\t"
  169851. #endif
  169852. #ifdef WOLFSSL_KEIL
  169853. "adcs r3, r3, %[r]\n\t"
  169854. #elif defined(__clang__)
  169855. "adcs r3, %[r]\n\t"
  169856. #else
  169857. "adc r3, %[r]\n\t"
  169858. #endif
  169859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169860. "adds r4, r4, r5\n\t"
  169861. #else
  169862. "add r4, r4, r5\n\t"
  169863. #endif
  169864. #ifdef WOLFSSL_KEIL
  169865. "adcs r2, r2, r6\n\t"
  169866. #elif defined(__clang__)
  169867. "adcs r2, r6\n\t"
  169868. #else
  169869. "adc r2, r6\n\t"
  169870. #endif
  169871. #ifdef WOLFSSL_KEIL
  169872. "adcs r3, r3, %[r]\n\t"
  169873. #elif defined(__clang__)
  169874. "adcs r3, %[r]\n\t"
  169875. #else
  169876. "adc r3, %[r]\n\t"
  169877. #endif
  169878. "mov %[r], r8\n\t"
  169879. "str r4, [%[r], #68]\n\t"
  169880. "movs %[r], #0\n\t"
  169881. "# A[15] * A[3]\n\t"
  169882. "movs r4, #0\n\t"
  169883. "mov %[a], r9\n\t"
  169884. "ldr r7, [%[a], #12]\n\t"
  169885. "mov %[a], lr\n\t"
  169886. "uxth r5, %[a]\n\t"
  169887. "uxth r6, r7\n\t"
  169888. #ifdef WOLFSSL_KEIL
  169889. "muls r6, r5, r6\n\t"
  169890. #elif defined(__clang__)
  169891. "muls r6, r5\n\t"
  169892. #else
  169893. "mul r6, r5\n\t"
  169894. #endif
  169895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169896. "adds r2, r2, r6\n\t"
  169897. #else
  169898. "add r2, r2, r6\n\t"
  169899. #endif
  169900. #ifdef WOLFSSL_KEIL
  169901. "adcs r3, r3, %[r]\n\t"
  169902. #elif defined(__clang__)
  169903. "adcs r3, %[r]\n\t"
  169904. #else
  169905. "adc r3, %[r]\n\t"
  169906. #endif
  169907. #ifdef WOLFSSL_KEIL
  169908. "adcs r4, r4, %[r]\n\t"
  169909. #elif defined(__clang__)
  169910. "adcs r4, %[r]\n\t"
  169911. #else
  169912. "adc r4, %[r]\n\t"
  169913. #endif
  169914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169915. "adds r2, r2, r6\n\t"
  169916. #else
  169917. "add r2, r2, r6\n\t"
  169918. #endif
  169919. #ifdef WOLFSSL_KEIL
  169920. "adcs r3, r3, %[r]\n\t"
  169921. #elif defined(__clang__)
  169922. "adcs r3, %[r]\n\t"
  169923. #else
  169924. "adc r3, %[r]\n\t"
  169925. #endif
  169926. #ifdef WOLFSSL_KEIL
  169927. "adcs r4, r4, %[r]\n\t"
  169928. #elif defined(__clang__)
  169929. "adcs r4, %[r]\n\t"
  169930. #else
  169931. "adc r4, %[r]\n\t"
  169932. #endif
  169933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169934. "lsrs r6, r7, #16\n\t"
  169935. #else
  169936. "lsr r6, r7, #16\n\t"
  169937. #endif
  169938. #ifdef WOLFSSL_KEIL
  169939. "muls r5, r6, r5\n\t"
  169940. #elif defined(__clang__)
  169941. "muls r5, r6\n\t"
  169942. #else
  169943. "mul r5, r6\n\t"
  169944. #endif
  169945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169946. "lsrs r6, r5, #16\n\t"
  169947. #else
  169948. "lsr r6, r5, #16\n\t"
  169949. #endif
  169950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169951. "lsls r5, r5, #16\n\t"
  169952. #else
  169953. "lsl r5, r5, #16\n\t"
  169954. #endif
  169955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169956. "adds r2, r2, r5\n\t"
  169957. #else
  169958. "add r2, r2, r5\n\t"
  169959. #endif
  169960. #ifdef WOLFSSL_KEIL
  169961. "adcs r3, r3, r6\n\t"
  169962. #elif defined(__clang__)
  169963. "adcs r3, r6\n\t"
  169964. #else
  169965. "adc r3, r6\n\t"
  169966. #endif
  169967. #ifdef WOLFSSL_KEIL
  169968. "adcs r4, r4, %[r]\n\t"
  169969. #elif defined(__clang__)
  169970. "adcs r4, %[r]\n\t"
  169971. #else
  169972. "adc r4, %[r]\n\t"
  169973. #endif
  169974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169975. "adds r2, r2, r5\n\t"
  169976. #else
  169977. "add r2, r2, r5\n\t"
  169978. #endif
  169979. #ifdef WOLFSSL_KEIL
  169980. "adcs r3, r3, r6\n\t"
  169981. #elif defined(__clang__)
  169982. "adcs r3, r6\n\t"
  169983. #else
  169984. "adc r3, r6\n\t"
  169985. #endif
  169986. #ifdef WOLFSSL_KEIL
  169987. "adcs r4, r4, %[r]\n\t"
  169988. #elif defined(__clang__)
  169989. "adcs r4, %[r]\n\t"
  169990. #else
  169991. "adc r4, %[r]\n\t"
  169992. #endif
  169993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169994. "lsrs r5, %[a], #16\n\t"
  169995. #else
  169996. "lsr r5, %[a], #16\n\t"
  169997. #endif
  169998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169999. "lsrs r6, r7, #16\n\t"
  170000. #else
  170001. "lsr r6, r7, #16\n\t"
  170002. #endif
  170003. #ifdef WOLFSSL_KEIL
  170004. "muls r6, r5, r6\n\t"
  170005. #elif defined(__clang__)
  170006. "muls r6, r5\n\t"
  170007. #else
  170008. "mul r6, r5\n\t"
  170009. #endif
  170010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170011. "adds r3, r3, r6\n\t"
  170012. #else
  170013. "add r3, r3, r6\n\t"
  170014. #endif
  170015. #ifdef WOLFSSL_KEIL
  170016. "adcs r4, r4, %[r]\n\t"
  170017. #elif defined(__clang__)
  170018. "adcs r4, %[r]\n\t"
  170019. #else
  170020. "adc r4, %[r]\n\t"
  170021. #endif
  170022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170023. "adds r3, r3, r6\n\t"
  170024. #else
  170025. "add r3, r3, r6\n\t"
  170026. #endif
  170027. #ifdef WOLFSSL_KEIL
  170028. "adcs r4, r4, %[r]\n\t"
  170029. #elif defined(__clang__)
  170030. "adcs r4, %[r]\n\t"
  170031. #else
  170032. "adc r4, %[r]\n\t"
  170033. #endif
  170034. "uxth r6, r7\n\t"
  170035. #ifdef WOLFSSL_KEIL
  170036. "muls r5, r6, r5\n\t"
  170037. #elif defined(__clang__)
  170038. "muls r5, r6\n\t"
  170039. #else
  170040. "mul r5, r6\n\t"
  170041. #endif
  170042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170043. "lsrs r6, r5, #16\n\t"
  170044. #else
  170045. "lsr r6, r5, #16\n\t"
  170046. #endif
  170047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170048. "lsls r5, r5, #16\n\t"
  170049. #else
  170050. "lsl r5, r5, #16\n\t"
  170051. #endif
  170052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170053. "adds r2, r2, r5\n\t"
  170054. #else
  170055. "add r2, r2, r5\n\t"
  170056. #endif
  170057. #ifdef WOLFSSL_KEIL
  170058. "adcs r3, r3, r6\n\t"
  170059. #elif defined(__clang__)
  170060. "adcs r3, r6\n\t"
  170061. #else
  170062. "adc r3, r6\n\t"
  170063. #endif
  170064. #ifdef WOLFSSL_KEIL
  170065. "adcs r4, r4, %[r]\n\t"
  170066. #elif defined(__clang__)
  170067. "adcs r4, %[r]\n\t"
  170068. #else
  170069. "adc r4, %[r]\n\t"
  170070. #endif
  170071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170072. "adds r2, r2, r5\n\t"
  170073. #else
  170074. "add r2, r2, r5\n\t"
  170075. #endif
  170076. #ifdef WOLFSSL_KEIL
  170077. "adcs r3, r3, r6\n\t"
  170078. #elif defined(__clang__)
  170079. "adcs r3, r6\n\t"
  170080. #else
  170081. "adc r3, r6\n\t"
  170082. #endif
  170083. #ifdef WOLFSSL_KEIL
  170084. "adcs r4, r4, %[r]\n\t"
  170085. #elif defined(__clang__)
  170086. "adcs r4, %[r]\n\t"
  170087. #else
  170088. "adc r4, %[r]\n\t"
  170089. #endif
  170090. "# A[14] * A[4]\n\t"
  170091. "mov %[a], r9\n\t"
  170092. "ldr r7, [%[a], #16]\n\t"
  170093. "mov %[a], r12\n\t"
  170094. "uxth r5, %[a]\n\t"
  170095. "uxth r6, r7\n\t"
  170096. #ifdef WOLFSSL_KEIL
  170097. "muls r6, r5, r6\n\t"
  170098. #elif defined(__clang__)
  170099. "muls r6, r5\n\t"
  170100. #else
  170101. "mul r6, r5\n\t"
  170102. #endif
  170103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170104. "adds r2, r2, r6\n\t"
  170105. #else
  170106. "add r2, r2, r6\n\t"
  170107. #endif
  170108. #ifdef WOLFSSL_KEIL
  170109. "adcs r3, r3, %[r]\n\t"
  170110. #elif defined(__clang__)
  170111. "adcs r3, %[r]\n\t"
  170112. #else
  170113. "adc r3, %[r]\n\t"
  170114. #endif
  170115. #ifdef WOLFSSL_KEIL
  170116. "adcs r4, r4, %[r]\n\t"
  170117. #elif defined(__clang__)
  170118. "adcs r4, %[r]\n\t"
  170119. #else
  170120. "adc r4, %[r]\n\t"
  170121. #endif
  170122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170123. "adds r2, r2, r6\n\t"
  170124. #else
  170125. "add r2, r2, r6\n\t"
  170126. #endif
  170127. #ifdef WOLFSSL_KEIL
  170128. "adcs r3, r3, %[r]\n\t"
  170129. #elif defined(__clang__)
  170130. "adcs r3, %[r]\n\t"
  170131. #else
  170132. "adc r3, %[r]\n\t"
  170133. #endif
  170134. #ifdef WOLFSSL_KEIL
  170135. "adcs r4, r4, %[r]\n\t"
  170136. #elif defined(__clang__)
  170137. "adcs r4, %[r]\n\t"
  170138. #else
  170139. "adc r4, %[r]\n\t"
  170140. #endif
  170141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170142. "lsrs r6, r7, #16\n\t"
  170143. #else
  170144. "lsr r6, r7, #16\n\t"
  170145. #endif
  170146. #ifdef WOLFSSL_KEIL
  170147. "muls r5, r6, r5\n\t"
  170148. #elif defined(__clang__)
  170149. "muls r5, r6\n\t"
  170150. #else
  170151. "mul r5, r6\n\t"
  170152. #endif
  170153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170154. "lsrs r6, r5, #16\n\t"
  170155. #else
  170156. "lsr r6, r5, #16\n\t"
  170157. #endif
  170158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170159. "lsls r5, r5, #16\n\t"
  170160. #else
  170161. "lsl r5, r5, #16\n\t"
  170162. #endif
  170163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170164. "adds r2, r2, r5\n\t"
  170165. #else
  170166. "add r2, r2, r5\n\t"
  170167. #endif
  170168. #ifdef WOLFSSL_KEIL
  170169. "adcs r3, r3, r6\n\t"
  170170. #elif defined(__clang__)
  170171. "adcs r3, r6\n\t"
  170172. #else
  170173. "adc r3, r6\n\t"
  170174. #endif
  170175. #ifdef WOLFSSL_KEIL
  170176. "adcs r4, r4, %[r]\n\t"
  170177. #elif defined(__clang__)
  170178. "adcs r4, %[r]\n\t"
  170179. #else
  170180. "adc r4, %[r]\n\t"
  170181. #endif
  170182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170183. "adds r2, r2, r5\n\t"
  170184. #else
  170185. "add r2, r2, r5\n\t"
  170186. #endif
  170187. #ifdef WOLFSSL_KEIL
  170188. "adcs r3, r3, r6\n\t"
  170189. #elif defined(__clang__)
  170190. "adcs r3, r6\n\t"
  170191. #else
  170192. "adc r3, r6\n\t"
  170193. #endif
  170194. #ifdef WOLFSSL_KEIL
  170195. "adcs r4, r4, %[r]\n\t"
  170196. #elif defined(__clang__)
  170197. "adcs r4, %[r]\n\t"
  170198. #else
  170199. "adc r4, %[r]\n\t"
  170200. #endif
  170201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170202. "lsrs r5, %[a], #16\n\t"
  170203. #else
  170204. "lsr r5, %[a], #16\n\t"
  170205. #endif
  170206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170207. "lsrs r6, r7, #16\n\t"
  170208. #else
  170209. "lsr r6, r7, #16\n\t"
  170210. #endif
  170211. #ifdef WOLFSSL_KEIL
  170212. "muls r6, r5, r6\n\t"
  170213. #elif defined(__clang__)
  170214. "muls r6, r5\n\t"
  170215. #else
  170216. "mul r6, r5\n\t"
  170217. #endif
  170218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170219. "adds r3, r3, r6\n\t"
  170220. #else
  170221. "add r3, r3, r6\n\t"
  170222. #endif
  170223. #ifdef WOLFSSL_KEIL
  170224. "adcs r4, r4, %[r]\n\t"
  170225. #elif defined(__clang__)
  170226. "adcs r4, %[r]\n\t"
  170227. #else
  170228. "adc r4, %[r]\n\t"
  170229. #endif
  170230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170231. "adds r3, r3, r6\n\t"
  170232. #else
  170233. "add r3, r3, r6\n\t"
  170234. #endif
  170235. #ifdef WOLFSSL_KEIL
  170236. "adcs r4, r4, %[r]\n\t"
  170237. #elif defined(__clang__)
  170238. "adcs r4, %[r]\n\t"
  170239. #else
  170240. "adc r4, %[r]\n\t"
  170241. #endif
  170242. "uxth r6, r7\n\t"
  170243. #ifdef WOLFSSL_KEIL
  170244. "muls r5, r6, r5\n\t"
  170245. #elif defined(__clang__)
  170246. "muls r5, r6\n\t"
  170247. #else
  170248. "mul r5, r6\n\t"
  170249. #endif
  170250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170251. "lsrs r6, r5, #16\n\t"
  170252. #else
  170253. "lsr r6, r5, #16\n\t"
  170254. #endif
  170255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170256. "lsls r5, r5, #16\n\t"
  170257. #else
  170258. "lsl r5, r5, #16\n\t"
  170259. #endif
  170260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170261. "adds r2, r2, r5\n\t"
  170262. #else
  170263. "add r2, r2, r5\n\t"
  170264. #endif
  170265. #ifdef WOLFSSL_KEIL
  170266. "adcs r3, r3, r6\n\t"
  170267. #elif defined(__clang__)
  170268. "adcs r3, r6\n\t"
  170269. #else
  170270. "adc r3, r6\n\t"
  170271. #endif
  170272. #ifdef WOLFSSL_KEIL
  170273. "adcs r4, r4, %[r]\n\t"
  170274. #elif defined(__clang__)
  170275. "adcs r4, %[r]\n\t"
  170276. #else
  170277. "adc r4, %[r]\n\t"
  170278. #endif
  170279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170280. "adds r2, r2, r5\n\t"
  170281. #else
  170282. "add r2, r2, r5\n\t"
  170283. #endif
  170284. #ifdef WOLFSSL_KEIL
  170285. "adcs r3, r3, r6\n\t"
  170286. #elif defined(__clang__)
  170287. "adcs r3, r6\n\t"
  170288. #else
  170289. "adc r3, r6\n\t"
  170290. #endif
  170291. #ifdef WOLFSSL_KEIL
  170292. "adcs r4, r4, %[r]\n\t"
  170293. #elif defined(__clang__)
  170294. "adcs r4, %[r]\n\t"
  170295. #else
  170296. "adc r4, %[r]\n\t"
  170297. #endif
  170298. "# A[13] * A[5]\n\t"
  170299. "mov %[a], r9\n\t"
  170300. "ldr r7, [%[a], #20]\n\t"
  170301. "mov %[a], r11\n\t"
  170302. "uxth r5, %[a]\n\t"
  170303. "uxth r6, r7\n\t"
  170304. #ifdef WOLFSSL_KEIL
  170305. "muls r6, r5, r6\n\t"
  170306. #elif defined(__clang__)
  170307. "muls r6, r5\n\t"
  170308. #else
  170309. "mul r6, r5\n\t"
  170310. #endif
  170311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170312. "adds r2, r2, r6\n\t"
  170313. #else
  170314. "add r2, r2, r6\n\t"
  170315. #endif
  170316. #ifdef WOLFSSL_KEIL
  170317. "adcs r3, r3, %[r]\n\t"
  170318. #elif defined(__clang__)
  170319. "adcs r3, %[r]\n\t"
  170320. #else
  170321. "adc r3, %[r]\n\t"
  170322. #endif
  170323. #ifdef WOLFSSL_KEIL
  170324. "adcs r4, r4, %[r]\n\t"
  170325. #elif defined(__clang__)
  170326. "adcs r4, %[r]\n\t"
  170327. #else
  170328. "adc r4, %[r]\n\t"
  170329. #endif
  170330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170331. "adds r2, r2, r6\n\t"
  170332. #else
  170333. "add r2, r2, r6\n\t"
  170334. #endif
  170335. #ifdef WOLFSSL_KEIL
  170336. "adcs r3, r3, %[r]\n\t"
  170337. #elif defined(__clang__)
  170338. "adcs r3, %[r]\n\t"
  170339. #else
  170340. "adc r3, %[r]\n\t"
  170341. #endif
  170342. #ifdef WOLFSSL_KEIL
  170343. "adcs r4, r4, %[r]\n\t"
  170344. #elif defined(__clang__)
  170345. "adcs r4, %[r]\n\t"
  170346. #else
  170347. "adc r4, %[r]\n\t"
  170348. #endif
  170349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170350. "lsrs r6, r7, #16\n\t"
  170351. #else
  170352. "lsr r6, r7, #16\n\t"
  170353. #endif
  170354. #ifdef WOLFSSL_KEIL
  170355. "muls r5, r6, r5\n\t"
  170356. #elif defined(__clang__)
  170357. "muls r5, r6\n\t"
  170358. #else
  170359. "mul r5, r6\n\t"
  170360. #endif
  170361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170362. "lsrs r6, r5, #16\n\t"
  170363. #else
  170364. "lsr r6, r5, #16\n\t"
  170365. #endif
  170366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170367. "lsls r5, r5, #16\n\t"
  170368. #else
  170369. "lsl r5, r5, #16\n\t"
  170370. #endif
  170371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170372. "adds r2, r2, r5\n\t"
  170373. #else
  170374. "add r2, r2, r5\n\t"
  170375. #endif
  170376. #ifdef WOLFSSL_KEIL
  170377. "adcs r3, r3, r6\n\t"
  170378. #elif defined(__clang__)
  170379. "adcs r3, r6\n\t"
  170380. #else
  170381. "adc r3, r6\n\t"
  170382. #endif
  170383. #ifdef WOLFSSL_KEIL
  170384. "adcs r4, r4, %[r]\n\t"
  170385. #elif defined(__clang__)
  170386. "adcs r4, %[r]\n\t"
  170387. #else
  170388. "adc r4, %[r]\n\t"
  170389. #endif
  170390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170391. "adds r2, r2, r5\n\t"
  170392. #else
  170393. "add r2, r2, r5\n\t"
  170394. #endif
  170395. #ifdef WOLFSSL_KEIL
  170396. "adcs r3, r3, r6\n\t"
  170397. #elif defined(__clang__)
  170398. "adcs r3, r6\n\t"
  170399. #else
  170400. "adc r3, r6\n\t"
  170401. #endif
  170402. #ifdef WOLFSSL_KEIL
  170403. "adcs r4, r4, %[r]\n\t"
  170404. #elif defined(__clang__)
  170405. "adcs r4, %[r]\n\t"
  170406. #else
  170407. "adc r4, %[r]\n\t"
  170408. #endif
  170409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170410. "lsrs r5, %[a], #16\n\t"
  170411. #else
  170412. "lsr r5, %[a], #16\n\t"
  170413. #endif
  170414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170415. "lsrs r6, r7, #16\n\t"
  170416. #else
  170417. "lsr r6, r7, #16\n\t"
  170418. #endif
  170419. #ifdef WOLFSSL_KEIL
  170420. "muls r6, r5, r6\n\t"
  170421. #elif defined(__clang__)
  170422. "muls r6, r5\n\t"
  170423. #else
  170424. "mul r6, r5\n\t"
  170425. #endif
  170426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170427. "adds r3, r3, r6\n\t"
  170428. #else
  170429. "add r3, r3, r6\n\t"
  170430. #endif
  170431. #ifdef WOLFSSL_KEIL
  170432. "adcs r4, r4, %[r]\n\t"
  170433. #elif defined(__clang__)
  170434. "adcs r4, %[r]\n\t"
  170435. #else
  170436. "adc r4, %[r]\n\t"
  170437. #endif
  170438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170439. "adds r3, r3, r6\n\t"
  170440. #else
  170441. "add r3, r3, r6\n\t"
  170442. #endif
  170443. #ifdef WOLFSSL_KEIL
  170444. "adcs r4, r4, %[r]\n\t"
  170445. #elif defined(__clang__)
  170446. "adcs r4, %[r]\n\t"
  170447. #else
  170448. "adc r4, %[r]\n\t"
  170449. #endif
  170450. "uxth r6, r7\n\t"
  170451. #ifdef WOLFSSL_KEIL
  170452. "muls r5, r6, r5\n\t"
  170453. #elif defined(__clang__)
  170454. "muls r5, r6\n\t"
  170455. #else
  170456. "mul r5, r6\n\t"
  170457. #endif
  170458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170459. "lsrs r6, r5, #16\n\t"
  170460. #else
  170461. "lsr r6, r5, #16\n\t"
  170462. #endif
  170463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170464. "lsls r5, r5, #16\n\t"
  170465. #else
  170466. "lsl r5, r5, #16\n\t"
  170467. #endif
  170468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170469. "adds r2, r2, r5\n\t"
  170470. #else
  170471. "add r2, r2, r5\n\t"
  170472. #endif
  170473. #ifdef WOLFSSL_KEIL
  170474. "adcs r3, r3, r6\n\t"
  170475. #elif defined(__clang__)
  170476. "adcs r3, r6\n\t"
  170477. #else
  170478. "adc r3, r6\n\t"
  170479. #endif
  170480. #ifdef WOLFSSL_KEIL
  170481. "adcs r4, r4, %[r]\n\t"
  170482. #elif defined(__clang__)
  170483. "adcs r4, %[r]\n\t"
  170484. #else
  170485. "adc r4, %[r]\n\t"
  170486. #endif
  170487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170488. "adds r2, r2, r5\n\t"
  170489. #else
  170490. "add r2, r2, r5\n\t"
  170491. #endif
  170492. #ifdef WOLFSSL_KEIL
  170493. "adcs r3, r3, r6\n\t"
  170494. #elif defined(__clang__)
  170495. "adcs r3, r6\n\t"
  170496. #else
  170497. "adc r3, r6\n\t"
  170498. #endif
  170499. #ifdef WOLFSSL_KEIL
  170500. "adcs r4, r4, %[r]\n\t"
  170501. #elif defined(__clang__)
  170502. "adcs r4, %[r]\n\t"
  170503. #else
  170504. "adc r4, %[r]\n\t"
  170505. #endif
  170506. "# A[12] * A[6]\n\t"
  170507. "mov %[a], r9\n\t"
  170508. "ldr r7, [%[a], #24]\n\t"
  170509. "mov %[a], r10\n\t"
  170510. "uxth r5, %[a]\n\t"
  170511. "uxth r6, r7\n\t"
  170512. #ifdef WOLFSSL_KEIL
  170513. "muls r6, r5, r6\n\t"
  170514. #elif defined(__clang__)
  170515. "muls r6, r5\n\t"
  170516. #else
  170517. "mul r6, r5\n\t"
  170518. #endif
  170519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170520. "adds r2, r2, r6\n\t"
  170521. #else
  170522. "add r2, r2, r6\n\t"
  170523. #endif
  170524. #ifdef WOLFSSL_KEIL
  170525. "adcs r3, r3, %[r]\n\t"
  170526. #elif defined(__clang__)
  170527. "adcs r3, %[r]\n\t"
  170528. #else
  170529. "adc r3, %[r]\n\t"
  170530. #endif
  170531. #ifdef WOLFSSL_KEIL
  170532. "adcs r4, r4, %[r]\n\t"
  170533. #elif defined(__clang__)
  170534. "adcs r4, %[r]\n\t"
  170535. #else
  170536. "adc r4, %[r]\n\t"
  170537. #endif
  170538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170539. "adds r2, r2, r6\n\t"
  170540. #else
  170541. "add r2, r2, r6\n\t"
  170542. #endif
  170543. #ifdef WOLFSSL_KEIL
  170544. "adcs r3, r3, %[r]\n\t"
  170545. #elif defined(__clang__)
  170546. "adcs r3, %[r]\n\t"
  170547. #else
  170548. "adc r3, %[r]\n\t"
  170549. #endif
  170550. #ifdef WOLFSSL_KEIL
  170551. "adcs r4, r4, %[r]\n\t"
  170552. #elif defined(__clang__)
  170553. "adcs r4, %[r]\n\t"
  170554. #else
  170555. "adc r4, %[r]\n\t"
  170556. #endif
  170557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170558. "lsrs r6, r7, #16\n\t"
  170559. #else
  170560. "lsr r6, r7, #16\n\t"
  170561. #endif
  170562. #ifdef WOLFSSL_KEIL
  170563. "muls r5, r6, r5\n\t"
  170564. #elif defined(__clang__)
  170565. "muls r5, r6\n\t"
  170566. #else
  170567. "mul r5, r6\n\t"
  170568. #endif
  170569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170570. "lsrs r6, r5, #16\n\t"
  170571. #else
  170572. "lsr r6, r5, #16\n\t"
  170573. #endif
  170574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170575. "lsls r5, r5, #16\n\t"
  170576. #else
  170577. "lsl r5, r5, #16\n\t"
  170578. #endif
  170579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170580. "adds r2, r2, r5\n\t"
  170581. #else
  170582. "add r2, r2, r5\n\t"
  170583. #endif
  170584. #ifdef WOLFSSL_KEIL
  170585. "adcs r3, r3, r6\n\t"
  170586. #elif defined(__clang__)
  170587. "adcs r3, r6\n\t"
  170588. #else
  170589. "adc r3, r6\n\t"
  170590. #endif
  170591. #ifdef WOLFSSL_KEIL
  170592. "adcs r4, r4, %[r]\n\t"
  170593. #elif defined(__clang__)
  170594. "adcs r4, %[r]\n\t"
  170595. #else
  170596. "adc r4, %[r]\n\t"
  170597. #endif
  170598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170599. "adds r2, r2, r5\n\t"
  170600. #else
  170601. "add r2, r2, r5\n\t"
  170602. #endif
  170603. #ifdef WOLFSSL_KEIL
  170604. "adcs r3, r3, r6\n\t"
  170605. #elif defined(__clang__)
  170606. "adcs r3, r6\n\t"
  170607. #else
  170608. "adc r3, r6\n\t"
  170609. #endif
  170610. #ifdef WOLFSSL_KEIL
  170611. "adcs r4, r4, %[r]\n\t"
  170612. #elif defined(__clang__)
  170613. "adcs r4, %[r]\n\t"
  170614. #else
  170615. "adc r4, %[r]\n\t"
  170616. #endif
  170617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170618. "lsrs r5, %[a], #16\n\t"
  170619. #else
  170620. "lsr r5, %[a], #16\n\t"
  170621. #endif
  170622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170623. "lsrs r6, r7, #16\n\t"
  170624. #else
  170625. "lsr r6, r7, #16\n\t"
  170626. #endif
  170627. #ifdef WOLFSSL_KEIL
  170628. "muls r6, r5, r6\n\t"
  170629. #elif defined(__clang__)
  170630. "muls r6, r5\n\t"
  170631. #else
  170632. "mul r6, r5\n\t"
  170633. #endif
  170634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170635. "adds r3, r3, r6\n\t"
  170636. #else
  170637. "add r3, r3, r6\n\t"
  170638. #endif
  170639. #ifdef WOLFSSL_KEIL
  170640. "adcs r4, r4, %[r]\n\t"
  170641. #elif defined(__clang__)
  170642. "adcs r4, %[r]\n\t"
  170643. #else
  170644. "adc r4, %[r]\n\t"
  170645. #endif
  170646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170647. "adds r3, r3, r6\n\t"
  170648. #else
  170649. "add r3, r3, r6\n\t"
  170650. #endif
  170651. #ifdef WOLFSSL_KEIL
  170652. "adcs r4, r4, %[r]\n\t"
  170653. #elif defined(__clang__)
  170654. "adcs r4, %[r]\n\t"
  170655. #else
  170656. "adc r4, %[r]\n\t"
  170657. #endif
  170658. "uxth r6, r7\n\t"
  170659. #ifdef WOLFSSL_KEIL
  170660. "muls r5, r6, r5\n\t"
  170661. #elif defined(__clang__)
  170662. "muls r5, r6\n\t"
  170663. #else
  170664. "mul r5, r6\n\t"
  170665. #endif
  170666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170667. "lsrs r6, r5, #16\n\t"
  170668. #else
  170669. "lsr r6, r5, #16\n\t"
  170670. #endif
  170671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170672. "lsls r5, r5, #16\n\t"
  170673. #else
  170674. "lsl r5, r5, #16\n\t"
  170675. #endif
  170676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170677. "adds r2, r2, r5\n\t"
  170678. #else
  170679. "add r2, r2, r5\n\t"
  170680. #endif
  170681. #ifdef WOLFSSL_KEIL
  170682. "adcs r3, r3, r6\n\t"
  170683. #elif defined(__clang__)
  170684. "adcs r3, r6\n\t"
  170685. #else
  170686. "adc r3, r6\n\t"
  170687. #endif
  170688. #ifdef WOLFSSL_KEIL
  170689. "adcs r4, r4, %[r]\n\t"
  170690. #elif defined(__clang__)
  170691. "adcs r4, %[r]\n\t"
  170692. #else
  170693. "adc r4, %[r]\n\t"
  170694. #endif
  170695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170696. "adds r2, r2, r5\n\t"
  170697. #else
  170698. "add r2, r2, r5\n\t"
  170699. #endif
  170700. #ifdef WOLFSSL_KEIL
  170701. "adcs r3, r3, r6\n\t"
  170702. #elif defined(__clang__)
  170703. "adcs r3, r6\n\t"
  170704. #else
  170705. "adc r3, r6\n\t"
  170706. #endif
  170707. #ifdef WOLFSSL_KEIL
  170708. "adcs r4, r4, %[r]\n\t"
  170709. #elif defined(__clang__)
  170710. "adcs r4, %[r]\n\t"
  170711. #else
  170712. "adc r4, %[r]\n\t"
  170713. #endif
  170714. "# A[11] * A[7]\n\t"
  170715. "mov %[a], r9\n\t"
  170716. "ldr r7, [%[a], #28]\n\t"
  170717. "ldr %[a], [%[a], #44]\n\t"
  170718. "uxth r5, %[a]\n\t"
  170719. "uxth r6, r7\n\t"
  170720. #ifdef WOLFSSL_KEIL
  170721. "muls r6, r5, r6\n\t"
  170722. #elif defined(__clang__)
  170723. "muls r6, r5\n\t"
  170724. #else
  170725. "mul r6, r5\n\t"
  170726. #endif
  170727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170728. "adds r2, r2, r6\n\t"
  170729. #else
  170730. "add r2, r2, r6\n\t"
  170731. #endif
  170732. #ifdef WOLFSSL_KEIL
  170733. "adcs r3, r3, %[r]\n\t"
  170734. #elif defined(__clang__)
  170735. "adcs r3, %[r]\n\t"
  170736. #else
  170737. "adc r3, %[r]\n\t"
  170738. #endif
  170739. #ifdef WOLFSSL_KEIL
  170740. "adcs r4, r4, %[r]\n\t"
  170741. #elif defined(__clang__)
  170742. "adcs r4, %[r]\n\t"
  170743. #else
  170744. "adc r4, %[r]\n\t"
  170745. #endif
  170746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170747. "adds r2, r2, r6\n\t"
  170748. #else
  170749. "add r2, r2, r6\n\t"
  170750. #endif
  170751. #ifdef WOLFSSL_KEIL
  170752. "adcs r3, r3, %[r]\n\t"
  170753. #elif defined(__clang__)
  170754. "adcs r3, %[r]\n\t"
  170755. #else
  170756. "adc r3, %[r]\n\t"
  170757. #endif
  170758. #ifdef WOLFSSL_KEIL
  170759. "adcs r4, r4, %[r]\n\t"
  170760. #elif defined(__clang__)
  170761. "adcs r4, %[r]\n\t"
  170762. #else
  170763. "adc r4, %[r]\n\t"
  170764. #endif
  170765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170766. "lsrs r6, r7, #16\n\t"
  170767. #else
  170768. "lsr r6, r7, #16\n\t"
  170769. #endif
  170770. #ifdef WOLFSSL_KEIL
  170771. "muls r5, r6, r5\n\t"
  170772. #elif defined(__clang__)
  170773. "muls r5, r6\n\t"
  170774. #else
  170775. "mul r5, r6\n\t"
  170776. #endif
  170777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170778. "lsrs r6, r5, #16\n\t"
  170779. #else
  170780. "lsr r6, r5, #16\n\t"
  170781. #endif
  170782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170783. "lsls r5, r5, #16\n\t"
  170784. #else
  170785. "lsl r5, r5, #16\n\t"
  170786. #endif
  170787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170788. "adds r2, r2, r5\n\t"
  170789. #else
  170790. "add r2, r2, r5\n\t"
  170791. #endif
  170792. #ifdef WOLFSSL_KEIL
  170793. "adcs r3, r3, r6\n\t"
  170794. #elif defined(__clang__)
  170795. "adcs r3, r6\n\t"
  170796. #else
  170797. "adc r3, r6\n\t"
  170798. #endif
  170799. #ifdef WOLFSSL_KEIL
  170800. "adcs r4, r4, %[r]\n\t"
  170801. #elif defined(__clang__)
  170802. "adcs r4, %[r]\n\t"
  170803. #else
  170804. "adc r4, %[r]\n\t"
  170805. #endif
  170806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170807. "adds r2, r2, r5\n\t"
  170808. #else
  170809. "add r2, r2, r5\n\t"
  170810. #endif
  170811. #ifdef WOLFSSL_KEIL
  170812. "adcs r3, r3, r6\n\t"
  170813. #elif defined(__clang__)
  170814. "adcs r3, r6\n\t"
  170815. #else
  170816. "adc r3, r6\n\t"
  170817. #endif
  170818. #ifdef WOLFSSL_KEIL
  170819. "adcs r4, r4, %[r]\n\t"
  170820. #elif defined(__clang__)
  170821. "adcs r4, %[r]\n\t"
  170822. #else
  170823. "adc r4, %[r]\n\t"
  170824. #endif
  170825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170826. "lsrs r5, %[a], #16\n\t"
  170827. #else
  170828. "lsr r5, %[a], #16\n\t"
  170829. #endif
  170830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170831. "lsrs r6, r7, #16\n\t"
  170832. #else
  170833. "lsr r6, r7, #16\n\t"
  170834. #endif
  170835. #ifdef WOLFSSL_KEIL
  170836. "muls r6, r5, r6\n\t"
  170837. #elif defined(__clang__)
  170838. "muls r6, r5\n\t"
  170839. #else
  170840. "mul r6, r5\n\t"
  170841. #endif
  170842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170843. "adds r3, r3, r6\n\t"
  170844. #else
  170845. "add r3, r3, r6\n\t"
  170846. #endif
  170847. #ifdef WOLFSSL_KEIL
  170848. "adcs r4, r4, %[r]\n\t"
  170849. #elif defined(__clang__)
  170850. "adcs r4, %[r]\n\t"
  170851. #else
  170852. "adc r4, %[r]\n\t"
  170853. #endif
  170854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170855. "adds r3, r3, r6\n\t"
  170856. #else
  170857. "add r3, r3, r6\n\t"
  170858. #endif
  170859. #ifdef WOLFSSL_KEIL
  170860. "adcs r4, r4, %[r]\n\t"
  170861. #elif defined(__clang__)
  170862. "adcs r4, %[r]\n\t"
  170863. #else
  170864. "adc r4, %[r]\n\t"
  170865. #endif
  170866. "uxth r6, r7\n\t"
  170867. #ifdef WOLFSSL_KEIL
  170868. "muls r5, r6, r5\n\t"
  170869. #elif defined(__clang__)
  170870. "muls r5, r6\n\t"
  170871. #else
  170872. "mul r5, r6\n\t"
  170873. #endif
  170874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170875. "lsrs r6, r5, #16\n\t"
  170876. #else
  170877. "lsr r6, r5, #16\n\t"
  170878. #endif
  170879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170880. "lsls r5, r5, #16\n\t"
  170881. #else
  170882. "lsl r5, r5, #16\n\t"
  170883. #endif
  170884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170885. "adds r2, r2, r5\n\t"
  170886. #else
  170887. "add r2, r2, r5\n\t"
  170888. #endif
  170889. #ifdef WOLFSSL_KEIL
  170890. "adcs r3, r3, r6\n\t"
  170891. #elif defined(__clang__)
  170892. "adcs r3, r6\n\t"
  170893. #else
  170894. "adc r3, r6\n\t"
  170895. #endif
  170896. #ifdef WOLFSSL_KEIL
  170897. "adcs r4, r4, %[r]\n\t"
  170898. #elif defined(__clang__)
  170899. "adcs r4, %[r]\n\t"
  170900. #else
  170901. "adc r4, %[r]\n\t"
  170902. #endif
  170903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170904. "adds r2, r2, r5\n\t"
  170905. #else
  170906. "add r2, r2, r5\n\t"
  170907. #endif
  170908. #ifdef WOLFSSL_KEIL
  170909. "adcs r3, r3, r6\n\t"
  170910. #elif defined(__clang__)
  170911. "adcs r3, r6\n\t"
  170912. #else
  170913. "adc r3, r6\n\t"
  170914. #endif
  170915. #ifdef WOLFSSL_KEIL
  170916. "adcs r4, r4, %[r]\n\t"
  170917. #elif defined(__clang__)
  170918. "adcs r4, %[r]\n\t"
  170919. #else
  170920. "adc r4, %[r]\n\t"
  170921. #endif
  170922. "# A[10] * A[8]\n\t"
  170923. "mov %[a], r9\n\t"
  170924. "ldr r7, [%[a], #32]\n\t"
  170925. "ldr %[a], [%[a], #40]\n\t"
  170926. "uxth r5, %[a]\n\t"
  170927. "uxth r6, r7\n\t"
  170928. #ifdef WOLFSSL_KEIL
  170929. "muls r6, r5, r6\n\t"
  170930. #elif defined(__clang__)
  170931. "muls r6, r5\n\t"
  170932. #else
  170933. "mul r6, r5\n\t"
  170934. #endif
  170935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170936. "adds r2, r2, r6\n\t"
  170937. #else
  170938. "add r2, r2, r6\n\t"
  170939. #endif
  170940. #ifdef WOLFSSL_KEIL
  170941. "adcs r3, r3, %[r]\n\t"
  170942. #elif defined(__clang__)
  170943. "adcs r3, %[r]\n\t"
  170944. #else
  170945. "adc r3, %[r]\n\t"
  170946. #endif
  170947. #ifdef WOLFSSL_KEIL
  170948. "adcs r4, r4, %[r]\n\t"
  170949. #elif defined(__clang__)
  170950. "adcs r4, %[r]\n\t"
  170951. #else
  170952. "adc r4, %[r]\n\t"
  170953. #endif
  170954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170955. "adds r2, r2, r6\n\t"
  170956. #else
  170957. "add r2, r2, r6\n\t"
  170958. #endif
  170959. #ifdef WOLFSSL_KEIL
  170960. "adcs r3, r3, %[r]\n\t"
  170961. #elif defined(__clang__)
  170962. "adcs r3, %[r]\n\t"
  170963. #else
  170964. "adc r3, %[r]\n\t"
  170965. #endif
  170966. #ifdef WOLFSSL_KEIL
  170967. "adcs r4, r4, %[r]\n\t"
  170968. #elif defined(__clang__)
  170969. "adcs r4, %[r]\n\t"
  170970. #else
  170971. "adc r4, %[r]\n\t"
  170972. #endif
  170973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170974. "lsrs r6, r7, #16\n\t"
  170975. #else
  170976. "lsr r6, r7, #16\n\t"
  170977. #endif
  170978. #ifdef WOLFSSL_KEIL
  170979. "muls r5, r6, r5\n\t"
  170980. #elif defined(__clang__)
  170981. "muls r5, r6\n\t"
  170982. #else
  170983. "mul r5, r6\n\t"
  170984. #endif
  170985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170986. "lsrs r6, r5, #16\n\t"
  170987. #else
  170988. "lsr r6, r5, #16\n\t"
  170989. #endif
  170990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170991. "lsls r5, r5, #16\n\t"
  170992. #else
  170993. "lsl r5, r5, #16\n\t"
  170994. #endif
  170995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170996. "adds r2, r2, r5\n\t"
  170997. #else
  170998. "add r2, r2, r5\n\t"
  170999. #endif
  171000. #ifdef WOLFSSL_KEIL
  171001. "adcs r3, r3, r6\n\t"
  171002. #elif defined(__clang__)
  171003. "adcs r3, r6\n\t"
  171004. #else
  171005. "adc r3, r6\n\t"
  171006. #endif
  171007. #ifdef WOLFSSL_KEIL
  171008. "adcs r4, r4, %[r]\n\t"
  171009. #elif defined(__clang__)
  171010. "adcs r4, %[r]\n\t"
  171011. #else
  171012. "adc r4, %[r]\n\t"
  171013. #endif
  171014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171015. "adds r2, r2, r5\n\t"
  171016. #else
  171017. "add r2, r2, r5\n\t"
  171018. #endif
  171019. #ifdef WOLFSSL_KEIL
  171020. "adcs r3, r3, r6\n\t"
  171021. #elif defined(__clang__)
  171022. "adcs r3, r6\n\t"
  171023. #else
  171024. "adc r3, r6\n\t"
  171025. #endif
  171026. #ifdef WOLFSSL_KEIL
  171027. "adcs r4, r4, %[r]\n\t"
  171028. #elif defined(__clang__)
  171029. "adcs r4, %[r]\n\t"
  171030. #else
  171031. "adc r4, %[r]\n\t"
  171032. #endif
  171033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171034. "lsrs r5, %[a], #16\n\t"
  171035. #else
  171036. "lsr r5, %[a], #16\n\t"
  171037. #endif
  171038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171039. "lsrs r6, r7, #16\n\t"
  171040. #else
  171041. "lsr r6, r7, #16\n\t"
  171042. #endif
  171043. #ifdef WOLFSSL_KEIL
  171044. "muls r6, r5, r6\n\t"
  171045. #elif defined(__clang__)
  171046. "muls r6, r5\n\t"
  171047. #else
  171048. "mul r6, r5\n\t"
  171049. #endif
  171050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171051. "adds r3, r3, r6\n\t"
  171052. #else
  171053. "add r3, r3, r6\n\t"
  171054. #endif
  171055. #ifdef WOLFSSL_KEIL
  171056. "adcs r4, r4, %[r]\n\t"
  171057. #elif defined(__clang__)
  171058. "adcs r4, %[r]\n\t"
  171059. #else
  171060. "adc r4, %[r]\n\t"
  171061. #endif
  171062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171063. "adds r3, r3, r6\n\t"
  171064. #else
  171065. "add r3, r3, r6\n\t"
  171066. #endif
  171067. #ifdef WOLFSSL_KEIL
  171068. "adcs r4, r4, %[r]\n\t"
  171069. #elif defined(__clang__)
  171070. "adcs r4, %[r]\n\t"
  171071. #else
  171072. "adc r4, %[r]\n\t"
  171073. #endif
  171074. "uxth r6, r7\n\t"
  171075. #ifdef WOLFSSL_KEIL
  171076. "muls r5, r6, r5\n\t"
  171077. #elif defined(__clang__)
  171078. "muls r5, r6\n\t"
  171079. #else
  171080. "mul r5, r6\n\t"
  171081. #endif
  171082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171083. "lsrs r6, r5, #16\n\t"
  171084. #else
  171085. "lsr r6, r5, #16\n\t"
  171086. #endif
  171087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171088. "lsls r5, r5, #16\n\t"
  171089. #else
  171090. "lsl r5, r5, #16\n\t"
  171091. #endif
  171092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171093. "adds r2, r2, r5\n\t"
  171094. #else
  171095. "add r2, r2, r5\n\t"
  171096. #endif
  171097. #ifdef WOLFSSL_KEIL
  171098. "adcs r3, r3, r6\n\t"
  171099. #elif defined(__clang__)
  171100. "adcs r3, r6\n\t"
  171101. #else
  171102. "adc r3, r6\n\t"
  171103. #endif
  171104. #ifdef WOLFSSL_KEIL
  171105. "adcs r4, r4, %[r]\n\t"
  171106. #elif defined(__clang__)
  171107. "adcs r4, %[r]\n\t"
  171108. #else
  171109. "adc r4, %[r]\n\t"
  171110. #endif
  171111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171112. "adds r2, r2, r5\n\t"
  171113. #else
  171114. "add r2, r2, r5\n\t"
  171115. #endif
  171116. #ifdef WOLFSSL_KEIL
  171117. "adcs r3, r3, r6\n\t"
  171118. #elif defined(__clang__)
  171119. "adcs r3, r6\n\t"
  171120. #else
  171121. "adc r3, r6\n\t"
  171122. #endif
  171123. #ifdef WOLFSSL_KEIL
  171124. "adcs r4, r4, %[r]\n\t"
  171125. #elif defined(__clang__)
  171126. "adcs r4, %[r]\n\t"
  171127. #else
  171128. "adc r4, %[r]\n\t"
  171129. #endif
  171130. "# A[9] * A[9]\n\t"
  171131. "mov %[a], r9\n\t"
  171132. "ldr r7, [%[a], #36]\n\t"
  171133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171134. "lsrs r6, r7, #16\n\t"
  171135. #else
  171136. "lsr r6, r7, #16\n\t"
  171137. #endif
  171138. "uxth r5, r7\n\t"
  171139. #ifdef WOLFSSL_KEIL
  171140. "muls r5, r5, r5\n\t"
  171141. #elif defined(__clang__)
  171142. "muls r5, r5\n\t"
  171143. #else
  171144. "mul r5, r5\n\t"
  171145. #endif
  171146. #ifdef WOLFSSL_KEIL
  171147. "muls r6, r6, r6\n\t"
  171148. #elif defined(__clang__)
  171149. "muls r6, r6\n\t"
  171150. #else
  171151. "mul r6, r6\n\t"
  171152. #endif
  171153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171154. "adds r2, r2, r5\n\t"
  171155. #else
  171156. "add r2, r2, r5\n\t"
  171157. #endif
  171158. #ifdef WOLFSSL_KEIL
  171159. "adcs r3, r3, r6\n\t"
  171160. #elif defined(__clang__)
  171161. "adcs r3, r6\n\t"
  171162. #else
  171163. "adc r3, r6\n\t"
  171164. #endif
  171165. #ifdef WOLFSSL_KEIL
  171166. "adcs r4, r4, %[r]\n\t"
  171167. #elif defined(__clang__)
  171168. "adcs r4, %[r]\n\t"
  171169. #else
  171170. "adc r4, %[r]\n\t"
  171171. #endif
  171172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171173. "lsrs r6, r7, #16\n\t"
  171174. #else
  171175. "lsr r6, r7, #16\n\t"
  171176. #endif
  171177. "uxth r5, r7\n\t"
  171178. #ifdef WOLFSSL_KEIL
  171179. "muls r5, r6, r5\n\t"
  171180. #elif defined(__clang__)
  171181. "muls r5, r6\n\t"
  171182. #else
  171183. "mul r5, r6\n\t"
  171184. #endif
  171185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171186. "lsrs r6, r5, #15\n\t"
  171187. #else
  171188. "lsr r6, r5, #15\n\t"
  171189. #endif
  171190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171191. "lsls r5, r5, #17\n\t"
  171192. #else
  171193. "lsl r5, r5, #17\n\t"
  171194. #endif
  171195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171196. "adds r2, r2, r5\n\t"
  171197. #else
  171198. "add r2, r2, r5\n\t"
  171199. #endif
  171200. #ifdef WOLFSSL_KEIL
  171201. "adcs r3, r3, r6\n\t"
  171202. #elif defined(__clang__)
  171203. "adcs r3, r6\n\t"
  171204. #else
  171205. "adc r3, r6\n\t"
  171206. #endif
  171207. #ifdef WOLFSSL_KEIL
  171208. "adcs r4, r4, %[r]\n\t"
  171209. #elif defined(__clang__)
  171210. "adcs r4, %[r]\n\t"
  171211. #else
  171212. "adc r4, %[r]\n\t"
  171213. #endif
  171214. "mov %[r], r8\n\t"
  171215. "str r2, [%[r], #72]\n\t"
  171216. "movs %[r], #0\n\t"
  171217. "# A[10] * A[9]\n\t"
  171218. "movs r2, #0\n\t"
  171219. "ldr %[a], [%[a], #40]\n\t"
  171220. "uxth r5, %[a]\n\t"
  171221. "uxth r6, r7\n\t"
  171222. #ifdef WOLFSSL_KEIL
  171223. "muls r6, r5, r6\n\t"
  171224. #elif defined(__clang__)
  171225. "muls r6, r5\n\t"
  171226. #else
  171227. "mul r6, r5\n\t"
  171228. #endif
  171229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171230. "adds r3, r3, r6\n\t"
  171231. #else
  171232. "add r3, r3, r6\n\t"
  171233. #endif
  171234. #ifdef WOLFSSL_KEIL
  171235. "adcs r4, r4, %[r]\n\t"
  171236. #elif defined(__clang__)
  171237. "adcs r4, %[r]\n\t"
  171238. #else
  171239. "adc r4, %[r]\n\t"
  171240. #endif
  171241. #ifdef WOLFSSL_KEIL
  171242. "adcs r2, r2, %[r]\n\t"
  171243. #elif defined(__clang__)
  171244. "adcs r2, %[r]\n\t"
  171245. #else
  171246. "adc r2, %[r]\n\t"
  171247. #endif
  171248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171249. "adds r3, r3, r6\n\t"
  171250. #else
  171251. "add r3, r3, r6\n\t"
  171252. #endif
  171253. #ifdef WOLFSSL_KEIL
  171254. "adcs r4, r4, %[r]\n\t"
  171255. #elif defined(__clang__)
  171256. "adcs r4, %[r]\n\t"
  171257. #else
  171258. "adc r4, %[r]\n\t"
  171259. #endif
  171260. #ifdef WOLFSSL_KEIL
  171261. "adcs r2, r2, %[r]\n\t"
  171262. #elif defined(__clang__)
  171263. "adcs r2, %[r]\n\t"
  171264. #else
  171265. "adc r2, %[r]\n\t"
  171266. #endif
  171267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171268. "lsrs r6, r7, #16\n\t"
  171269. #else
  171270. "lsr r6, r7, #16\n\t"
  171271. #endif
  171272. #ifdef WOLFSSL_KEIL
  171273. "muls r5, r6, r5\n\t"
  171274. #elif defined(__clang__)
  171275. "muls r5, r6\n\t"
  171276. #else
  171277. "mul r5, r6\n\t"
  171278. #endif
  171279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171280. "lsrs r6, r5, #16\n\t"
  171281. #else
  171282. "lsr r6, r5, #16\n\t"
  171283. #endif
  171284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171285. "lsls r5, r5, #16\n\t"
  171286. #else
  171287. "lsl r5, r5, #16\n\t"
  171288. #endif
  171289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171290. "adds r3, r3, r5\n\t"
  171291. #else
  171292. "add r3, r3, r5\n\t"
  171293. #endif
  171294. #ifdef WOLFSSL_KEIL
  171295. "adcs r4, r4, r6\n\t"
  171296. #elif defined(__clang__)
  171297. "adcs r4, r6\n\t"
  171298. #else
  171299. "adc r4, r6\n\t"
  171300. #endif
  171301. #ifdef WOLFSSL_KEIL
  171302. "adcs r2, r2, %[r]\n\t"
  171303. #elif defined(__clang__)
  171304. "adcs r2, %[r]\n\t"
  171305. #else
  171306. "adc r2, %[r]\n\t"
  171307. #endif
  171308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171309. "adds r3, r3, r5\n\t"
  171310. #else
  171311. "add r3, r3, r5\n\t"
  171312. #endif
  171313. #ifdef WOLFSSL_KEIL
  171314. "adcs r4, r4, r6\n\t"
  171315. #elif defined(__clang__)
  171316. "adcs r4, r6\n\t"
  171317. #else
  171318. "adc r4, r6\n\t"
  171319. #endif
  171320. #ifdef WOLFSSL_KEIL
  171321. "adcs r2, r2, %[r]\n\t"
  171322. #elif defined(__clang__)
  171323. "adcs r2, %[r]\n\t"
  171324. #else
  171325. "adc r2, %[r]\n\t"
  171326. #endif
  171327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171328. "lsrs r5, %[a], #16\n\t"
  171329. #else
  171330. "lsr r5, %[a], #16\n\t"
  171331. #endif
  171332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171333. "lsrs r6, r7, #16\n\t"
  171334. #else
  171335. "lsr r6, r7, #16\n\t"
  171336. #endif
  171337. #ifdef WOLFSSL_KEIL
  171338. "muls r6, r5, r6\n\t"
  171339. #elif defined(__clang__)
  171340. "muls r6, r5\n\t"
  171341. #else
  171342. "mul r6, r5\n\t"
  171343. #endif
  171344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171345. "adds r4, r4, r6\n\t"
  171346. #else
  171347. "add r4, r4, r6\n\t"
  171348. #endif
  171349. #ifdef WOLFSSL_KEIL
  171350. "adcs r2, r2, %[r]\n\t"
  171351. #elif defined(__clang__)
  171352. "adcs r2, %[r]\n\t"
  171353. #else
  171354. "adc r2, %[r]\n\t"
  171355. #endif
  171356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171357. "adds r4, r4, r6\n\t"
  171358. #else
  171359. "add r4, r4, r6\n\t"
  171360. #endif
  171361. #ifdef WOLFSSL_KEIL
  171362. "adcs r2, r2, %[r]\n\t"
  171363. #elif defined(__clang__)
  171364. "adcs r2, %[r]\n\t"
  171365. #else
  171366. "adc r2, %[r]\n\t"
  171367. #endif
  171368. "uxth r6, r7\n\t"
  171369. #ifdef WOLFSSL_KEIL
  171370. "muls r5, r6, r5\n\t"
  171371. #elif defined(__clang__)
  171372. "muls r5, r6\n\t"
  171373. #else
  171374. "mul r5, r6\n\t"
  171375. #endif
  171376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171377. "lsrs r6, r5, #16\n\t"
  171378. #else
  171379. "lsr r6, r5, #16\n\t"
  171380. #endif
  171381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171382. "lsls r5, r5, #16\n\t"
  171383. #else
  171384. "lsl r5, r5, #16\n\t"
  171385. #endif
  171386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171387. "adds r3, r3, r5\n\t"
  171388. #else
  171389. "add r3, r3, r5\n\t"
  171390. #endif
  171391. #ifdef WOLFSSL_KEIL
  171392. "adcs r4, r4, r6\n\t"
  171393. #elif defined(__clang__)
  171394. "adcs r4, r6\n\t"
  171395. #else
  171396. "adc r4, r6\n\t"
  171397. #endif
  171398. #ifdef WOLFSSL_KEIL
  171399. "adcs r2, r2, %[r]\n\t"
  171400. #elif defined(__clang__)
  171401. "adcs r2, %[r]\n\t"
  171402. #else
  171403. "adc r2, %[r]\n\t"
  171404. #endif
  171405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171406. "adds r3, r3, r5\n\t"
  171407. #else
  171408. "add r3, r3, r5\n\t"
  171409. #endif
  171410. #ifdef WOLFSSL_KEIL
  171411. "adcs r4, r4, r6\n\t"
  171412. #elif defined(__clang__)
  171413. "adcs r4, r6\n\t"
  171414. #else
  171415. "adc r4, r6\n\t"
  171416. #endif
  171417. #ifdef WOLFSSL_KEIL
  171418. "adcs r2, r2, %[r]\n\t"
  171419. #elif defined(__clang__)
  171420. "adcs r2, %[r]\n\t"
  171421. #else
  171422. "adc r2, %[r]\n\t"
  171423. #endif
  171424. "# A[11] * A[8]\n\t"
  171425. "mov %[a], r9\n\t"
  171426. "ldr r7, [%[a], #32]\n\t"
  171427. "ldr %[a], [%[a], #44]\n\t"
  171428. "uxth r5, %[a]\n\t"
  171429. "uxth r6, r7\n\t"
  171430. #ifdef WOLFSSL_KEIL
  171431. "muls r6, r5, r6\n\t"
  171432. #elif defined(__clang__)
  171433. "muls r6, r5\n\t"
  171434. #else
  171435. "mul r6, r5\n\t"
  171436. #endif
  171437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171438. "adds r3, r3, r6\n\t"
  171439. #else
  171440. "add r3, r3, r6\n\t"
  171441. #endif
  171442. #ifdef WOLFSSL_KEIL
  171443. "adcs r4, r4, %[r]\n\t"
  171444. #elif defined(__clang__)
  171445. "adcs r4, %[r]\n\t"
  171446. #else
  171447. "adc r4, %[r]\n\t"
  171448. #endif
  171449. #ifdef WOLFSSL_KEIL
  171450. "adcs r2, r2, %[r]\n\t"
  171451. #elif defined(__clang__)
  171452. "adcs r2, %[r]\n\t"
  171453. #else
  171454. "adc r2, %[r]\n\t"
  171455. #endif
  171456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171457. "adds r3, r3, r6\n\t"
  171458. #else
  171459. "add r3, r3, r6\n\t"
  171460. #endif
  171461. #ifdef WOLFSSL_KEIL
  171462. "adcs r4, r4, %[r]\n\t"
  171463. #elif defined(__clang__)
  171464. "adcs r4, %[r]\n\t"
  171465. #else
  171466. "adc r4, %[r]\n\t"
  171467. #endif
  171468. #ifdef WOLFSSL_KEIL
  171469. "adcs r2, r2, %[r]\n\t"
  171470. #elif defined(__clang__)
  171471. "adcs r2, %[r]\n\t"
  171472. #else
  171473. "adc r2, %[r]\n\t"
  171474. #endif
  171475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171476. "lsrs r6, r7, #16\n\t"
  171477. #else
  171478. "lsr r6, r7, #16\n\t"
  171479. #endif
  171480. #ifdef WOLFSSL_KEIL
  171481. "muls r5, r6, r5\n\t"
  171482. #elif defined(__clang__)
  171483. "muls r5, r6\n\t"
  171484. #else
  171485. "mul r5, r6\n\t"
  171486. #endif
  171487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171488. "lsrs r6, r5, #16\n\t"
  171489. #else
  171490. "lsr r6, r5, #16\n\t"
  171491. #endif
  171492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171493. "lsls r5, r5, #16\n\t"
  171494. #else
  171495. "lsl r5, r5, #16\n\t"
  171496. #endif
  171497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171498. "adds r3, r3, r5\n\t"
  171499. #else
  171500. "add r3, r3, r5\n\t"
  171501. #endif
  171502. #ifdef WOLFSSL_KEIL
  171503. "adcs r4, r4, r6\n\t"
  171504. #elif defined(__clang__)
  171505. "adcs r4, r6\n\t"
  171506. #else
  171507. "adc r4, r6\n\t"
  171508. #endif
  171509. #ifdef WOLFSSL_KEIL
  171510. "adcs r2, r2, %[r]\n\t"
  171511. #elif defined(__clang__)
  171512. "adcs r2, %[r]\n\t"
  171513. #else
  171514. "adc r2, %[r]\n\t"
  171515. #endif
  171516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171517. "adds r3, r3, r5\n\t"
  171518. #else
  171519. "add r3, r3, r5\n\t"
  171520. #endif
  171521. #ifdef WOLFSSL_KEIL
  171522. "adcs r4, r4, r6\n\t"
  171523. #elif defined(__clang__)
  171524. "adcs r4, r6\n\t"
  171525. #else
  171526. "adc r4, r6\n\t"
  171527. #endif
  171528. #ifdef WOLFSSL_KEIL
  171529. "adcs r2, r2, %[r]\n\t"
  171530. #elif defined(__clang__)
  171531. "adcs r2, %[r]\n\t"
  171532. #else
  171533. "adc r2, %[r]\n\t"
  171534. #endif
  171535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171536. "lsrs r5, %[a], #16\n\t"
  171537. #else
  171538. "lsr r5, %[a], #16\n\t"
  171539. #endif
  171540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171541. "lsrs r6, r7, #16\n\t"
  171542. #else
  171543. "lsr r6, r7, #16\n\t"
  171544. #endif
  171545. #ifdef WOLFSSL_KEIL
  171546. "muls r6, r5, r6\n\t"
  171547. #elif defined(__clang__)
  171548. "muls r6, r5\n\t"
  171549. #else
  171550. "mul r6, r5\n\t"
  171551. #endif
  171552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171553. "adds r4, r4, r6\n\t"
  171554. #else
  171555. "add r4, r4, r6\n\t"
  171556. #endif
  171557. #ifdef WOLFSSL_KEIL
  171558. "adcs r2, r2, %[r]\n\t"
  171559. #elif defined(__clang__)
  171560. "adcs r2, %[r]\n\t"
  171561. #else
  171562. "adc r2, %[r]\n\t"
  171563. #endif
  171564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171565. "adds r4, r4, r6\n\t"
  171566. #else
  171567. "add r4, r4, r6\n\t"
  171568. #endif
  171569. #ifdef WOLFSSL_KEIL
  171570. "adcs r2, r2, %[r]\n\t"
  171571. #elif defined(__clang__)
  171572. "adcs r2, %[r]\n\t"
  171573. #else
  171574. "adc r2, %[r]\n\t"
  171575. #endif
  171576. "uxth r6, r7\n\t"
  171577. #ifdef WOLFSSL_KEIL
  171578. "muls r5, r6, r5\n\t"
  171579. #elif defined(__clang__)
  171580. "muls r5, r6\n\t"
  171581. #else
  171582. "mul r5, r6\n\t"
  171583. #endif
  171584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171585. "lsrs r6, r5, #16\n\t"
  171586. #else
  171587. "lsr r6, r5, #16\n\t"
  171588. #endif
  171589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171590. "lsls r5, r5, #16\n\t"
  171591. #else
  171592. "lsl r5, r5, #16\n\t"
  171593. #endif
  171594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171595. "adds r3, r3, r5\n\t"
  171596. #else
  171597. "add r3, r3, r5\n\t"
  171598. #endif
  171599. #ifdef WOLFSSL_KEIL
  171600. "adcs r4, r4, r6\n\t"
  171601. #elif defined(__clang__)
  171602. "adcs r4, r6\n\t"
  171603. #else
  171604. "adc r4, r6\n\t"
  171605. #endif
  171606. #ifdef WOLFSSL_KEIL
  171607. "adcs r2, r2, %[r]\n\t"
  171608. #elif defined(__clang__)
  171609. "adcs r2, %[r]\n\t"
  171610. #else
  171611. "adc r2, %[r]\n\t"
  171612. #endif
  171613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171614. "adds r3, r3, r5\n\t"
  171615. #else
  171616. "add r3, r3, r5\n\t"
  171617. #endif
  171618. #ifdef WOLFSSL_KEIL
  171619. "adcs r4, r4, r6\n\t"
  171620. #elif defined(__clang__)
  171621. "adcs r4, r6\n\t"
  171622. #else
  171623. "adc r4, r6\n\t"
  171624. #endif
  171625. #ifdef WOLFSSL_KEIL
  171626. "adcs r2, r2, %[r]\n\t"
  171627. #elif defined(__clang__)
  171628. "adcs r2, %[r]\n\t"
  171629. #else
  171630. "adc r2, %[r]\n\t"
  171631. #endif
  171632. "# A[12] * A[7]\n\t"
  171633. "mov %[a], r9\n\t"
  171634. "ldr r7, [%[a], #28]\n\t"
  171635. "mov %[a], r10\n\t"
  171636. "uxth r5, %[a]\n\t"
  171637. "uxth r6, r7\n\t"
  171638. #ifdef WOLFSSL_KEIL
  171639. "muls r6, r5, r6\n\t"
  171640. #elif defined(__clang__)
  171641. "muls r6, r5\n\t"
  171642. #else
  171643. "mul r6, r5\n\t"
  171644. #endif
  171645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171646. "adds r3, r3, r6\n\t"
  171647. #else
  171648. "add r3, r3, r6\n\t"
  171649. #endif
  171650. #ifdef WOLFSSL_KEIL
  171651. "adcs r4, r4, %[r]\n\t"
  171652. #elif defined(__clang__)
  171653. "adcs r4, %[r]\n\t"
  171654. #else
  171655. "adc r4, %[r]\n\t"
  171656. #endif
  171657. #ifdef WOLFSSL_KEIL
  171658. "adcs r2, r2, %[r]\n\t"
  171659. #elif defined(__clang__)
  171660. "adcs r2, %[r]\n\t"
  171661. #else
  171662. "adc r2, %[r]\n\t"
  171663. #endif
  171664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171665. "adds r3, r3, r6\n\t"
  171666. #else
  171667. "add r3, r3, r6\n\t"
  171668. #endif
  171669. #ifdef WOLFSSL_KEIL
  171670. "adcs r4, r4, %[r]\n\t"
  171671. #elif defined(__clang__)
  171672. "adcs r4, %[r]\n\t"
  171673. #else
  171674. "adc r4, %[r]\n\t"
  171675. #endif
  171676. #ifdef WOLFSSL_KEIL
  171677. "adcs r2, r2, %[r]\n\t"
  171678. #elif defined(__clang__)
  171679. "adcs r2, %[r]\n\t"
  171680. #else
  171681. "adc r2, %[r]\n\t"
  171682. #endif
  171683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171684. "lsrs r6, r7, #16\n\t"
  171685. #else
  171686. "lsr r6, r7, #16\n\t"
  171687. #endif
  171688. #ifdef WOLFSSL_KEIL
  171689. "muls r5, r6, r5\n\t"
  171690. #elif defined(__clang__)
  171691. "muls r5, r6\n\t"
  171692. #else
  171693. "mul r5, r6\n\t"
  171694. #endif
  171695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171696. "lsrs r6, r5, #16\n\t"
  171697. #else
  171698. "lsr r6, r5, #16\n\t"
  171699. #endif
  171700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171701. "lsls r5, r5, #16\n\t"
  171702. #else
  171703. "lsl r5, r5, #16\n\t"
  171704. #endif
  171705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171706. "adds r3, r3, r5\n\t"
  171707. #else
  171708. "add r3, r3, r5\n\t"
  171709. #endif
  171710. #ifdef WOLFSSL_KEIL
  171711. "adcs r4, r4, r6\n\t"
  171712. #elif defined(__clang__)
  171713. "adcs r4, r6\n\t"
  171714. #else
  171715. "adc r4, r6\n\t"
  171716. #endif
  171717. #ifdef WOLFSSL_KEIL
  171718. "adcs r2, r2, %[r]\n\t"
  171719. #elif defined(__clang__)
  171720. "adcs r2, %[r]\n\t"
  171721. #else
  171722. "adc r2, %[r]\n\t"
  171723. #endif
  171724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171725. "adds r3, r3, r5\n\t"
  171726. #else
  171727. "add r3, r3, r5\n\t"
  171728. #endif
  171729. #ifdef WOLFSSL_KEIL
  171730. "adcs r4, r4, r6\n\t"
  171731. #elif defined(__clang__)
  171732. "adcs r4, r6\n\t"
  171733. #else
  171734. "adc r4, r6\n\t"
  171735. #endif
  171736. #ifdef WOLFSSL_KEIL
  171737. "adcs r2, r2, %[r]\n\t"
  171738. #elif defined(__clang__)
  171739. "adcs r2, %[r]\n\t"
  171740. #else
  171741. "adc r2, %[r]\n\t"
  171742. #endif
  171743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171744. "lsrs r5, %[a], #16\n\t"
  171745. #else
  171746. "lsr r5, %[a], #16\n\t"
  171747. #endif
  171748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171749. "lsrs r6, r7, #16\n\t"
  171750. #else
  171751. "lsr r6, r7, #16\n\t"
  171752. #endif
  171753. #ifdef WOLFSSL_KEIL
  171754. "muls r6, r5, r6\n\t"
  171755. #elif defined(__clang__)
  171756. "muls r6, r5\n\t"
  171757. #else
  171758. "mul r6, r5\n\t"
  171759. #endif
  171760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171761. "adds r4, r4, r6\n\t"
  171762. #else
  171763. "add r4, r4, r6\n\t"
  171764. #endif
  171765. #ifdef WOLFSSL_KEIL
  171766. "adcs r2, r2, %[r]\n\t"
  171767. #elif defined(__clang__)
  171768. "adcs r2, %[r]\n\t"
  171769. #else
  171770. "adc r2, %[r]\n\t"
  171771. #endif
  171772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171773. "adds r4, r4, r6\n\t"
  171774. #else
  171775. "add r4, r4, r6\n\t"
  171776. #endif
  171777. #ifdef WOLFSSL_KEIL
  171778. "adcs r2, r2, %[r]\n\t"
  171779. #elif defined(__clang__)
  171780. "adcs r2, %[r]\n\t"
  171781. #else
  171782. "adc r2, %[r]\n\t"
  171783. #endif
  171784. "uxth r6, r7\n\t"
  171785. #ifdef WOLFSSL_KEIL
  171786. "muls r5, r6, r5\n\t"
  171787. #elif defined(__clang__)
  171788. "muls r5, r6\n\t"
  171789. #else
  171790. "mul r5, r6\n\t"
  171791. #endif
  171792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171793. "lsrs r6, r5, #16\n\t"
  171794. #else
  171795. "lsr r6, r5, #16\n\t"
  171796. #endif
  171797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171798. "lsls r5, r5, #16\n\t"
  171799. #else
  171800. "lsl r5, r5, #16\n\t"
  171801. #endif
  171802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171803. "adds r3, r3, r5\n\t"
  171804. #else
  171805. "add r3, r3, r5\n\t"
  171806. #endif
  171807. #ifdef WOLFSSL_KEIL
  171808. "adcs r4, r4, r6\n\t"
  171809. #elif defined(__clang__)
  171810. "adcs r4, r6\n\t"
  171811. #else
  171812. "adc r4, r6\n\t"
  171813. #endif
  171814. #ifdef WOLFSSL_KEIL
  171815. "adcs r2, r2, %[r]\n\t"
  171816. #elif defined(__clang__)
  171817. "adcs r2, %[r]\n\t"
  171818. #else
  171819. "adc r2, %[r]\n\t"
  171820. #endif
  171821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171822. "adds r3, r3, r5\n\t"
  171823. #else
  171824. "add r3, r3, r5\n\t"
  171825. #endif
  171826. #ifdef WOLFSSL_KEIL
  171827. "adcs r4, r4, r6\n\t"
  171828. #elif defined(__clang__)
  171829. "adcs r4, r6\n\t"
  171830. #else
  171831. "adc r4, r6\n\t"
  171832. #endif
  171833. #ifdef WOLFSSL_KEIL
  171834. "adcs r2, r2, %[r]\n\t"
  171835. #elif defined(__clang__)
  171836. "adcs r2, %[r]\n\t"
  171837. #else
  171838. "adc r2, %[r]\n\t"
  171839. #endif
  171840. "# A[13] * A[6]\n\t"
  171841. "mov %[a], r9\n\t"
  171842. "ldr r7, [%[a], #24]\n\t"
  171843. "mov %[a], r11\n\t"
  171844. "uxth r5, %[a]\n\t"
  171845. "uxth r6, r7\n\t"
  171846. #ifdef WOLFSSL_KEIL
  171847. "muls r6, r5, r6\n\t"
  171848. #elif defined(__clang__)
  171849. "muls r6, r5\n\t"
  171850. #else
  171851. "mul r6, r5\n\t"
  171852. #endif
  171853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171854. "adds r3, r3, r6\n\t"
  171855. #else
  171856. "add r3, r3, r6\n\t"
  171857. #endif
  171858. #ifdef WOLFSSL_KEIL
  171859. "adcs r4, r4, %[r]\n\t"
  171860. #elif defined(__clang__)
  171861. "adcs r4, %[r]\n\t"
  171862. #else
  171863. "adc r4, %[r]\n\t"
  171864. #endif
  171865. #ifdef WOLFSSL_KEIL
  171866. "adcs r2, r2, %[r]\n\t"
  171867. #elif defined(__clang__)
  171868. "adcs r2, %[r]\n\t"
  171869. #else
  171870. "adc r2, %[r]\n\t"
  171871. #endif
  171872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171873. "adds r3, r3, r6\n\t"
  171874. #else
  171875. "add r3, r3, r6\n\t"
  171876. #endif
  171877. #ifdef WOLFSSL_KEIL
  171878. "adcs r4, r4, %[r]\n\t"
  171879. #elif defined(__clang__)
  171880. "adcs r4, %[r]\n\t"
  171881. #else
  171882. "adc r4, %[r]\n\t"
  171883. #endif
  171884. #ifdef WOLFSSL_KEIL
  171885. "adcs r2, r2, %[r]\n\t"
  171886. #elif defined(__clang__)
  171887. "adcs r2, %[r]\n\t"
  171888. #else
  171889. "adc r2, %[r]\n\t"
  171890. #endif
  171891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171892. "lsrs r6, r7, #16\n\t"
  171893. #else
  171894. "lsr r6, r7, #16\n\t"
  171895. #endif
  171896. #ifdef WOLFSSL_KEIL
  171897. "muls r5, r6, r5\n\t"
  171898. #elif defined(__clang__)
  171899. "muls r5, r6\n\t"
  171900. #else
  171901. "mul r5, r6\n\t"
  171902. #endif
  171903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171904. "lsrs r6, r5, #16\n\t"
  171905. #else
  171906. "lsr r6, r5, #16\n\t"
  171907. #endif
  171908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171909. "lsls r5, r5, #16\n\t"
  171910. #else
  171911. "lsl r5, r5, #16\n\t"
  171912. #endif
  171913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171914. "adds r3, r3, r5\n\t"
  171915. #else
  171916. "add r3, r3, r5\n\t"
  171917. #endif
  171918. #ifdef WOLFSSL_KEIL
  171919. "adcs r4, r4, r6\n\t"
  171920. #elif defined(__clang__)
  171921. "adcs r4, r6\n\t"
  171922. #else
  171923. "adc r4, r6\n\t"
  171924. #endif
  171925. #ifdef WOLFSSL_KEIL
  171926. "adcs r2, r2, %[r]\n\t"
  171927. #elif defined(__clang__)
  171928. "adcs r2, %[r]\n\t"
  171929. #else
  171930. "adc r2, %[r]\n\t"
  171931. #endif
  171932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171933. "adds r3, r3, r5\n\t"
  171934. #else
  171935. "add r3, r3, r5\n\t"
  171936. #endif
  171937. #ifdef WOLFSSL_KEIL
  171938. "adcs r4, r4, r6\n\t"
  171939. #elif defined(__clang__)
  171940. "adcs r4, r6\n\t"
  171941. #else
  171942. "adc r4, r6\n\t"
  171943. #endif
  171944. #ifdef WOLFSSL_KEIL
  171945. "adcs r2, r2, %[r]\n\t"
  171946. #elif defined(__clang__)
  171947. "adcs r2, %[r]\n\t"
  171948. #else
  171949. "adc r2, %[r]\n\t"
  171950. #endif
  171951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171952. "lsrs r5, %[a], #16\n\t"
  171953. #else
  171954. "lsr r5, %[a], #16\n\t"
  171955. #endif
  171956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171957. "lsrs r6, r7, #16\n\t"
  171958. #else
  171959. "lsr r6, r7, #16\n\t"
  171960. #endif
  171961. #ifdef WOLFSSL_KEIL
  171962. "muls r6, r5, r6\n\t"
  171963. #elif defined(__clang__)
  171964. "muls r6, r5\n\t"
  171965. #else
  171966. "mul r6, r5\n\t"
  171967. #endif
  171968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171969. "adds r4, r4, r6\n\t"
  171970. #else
  171971. "add r4, r4, r6\n\t"
  171972. #endif
  171973. #ifdef WOLFSSL_KEIL
  171974. "adcs r2, r2, %[r]\n\t"
  171975. #elif defined(__clang__)
  171976. "adcs r2, %[r]\n\t"
  171977. #else
  171978. "adc r2, %[r]\n\t"
  171979. #endif
  171980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171981. "adds r4, r4, r6\n\t"
  171982. #else
  171983. "add r4, r4, r6\n\t"
  171984. #endif
  171985. #ifdef WOLFSSL_KEIL
  171986. "adcs r2, r2, %[r]\n\t"
  171987. #elif defined(__clang__)
  171988. "adcs r2, %[r]\n\t"
  171989. #else
  171990. "adc r2, %[r]\n\t"
  171991. #endif
  171992. "uxth r6, r7\n\t"
  171993. #ifdef WOLFSSL_KEIL
  171994. "muls r5, r6, r5\n\t"
  171995. #elif defined(__clang__)
  171996. "muls r5, r6\n\t"
  171997. #else
  171998. "mul r5, r6\n\t"
  171999. #endif
  172000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172001. "lsrs r6, r5, #16\n\t"
  172002. #else
  172003. "lsr r6, r5, #16\n\t"
  172004. #endif
  172005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172006. "lsls r5, r5, #16\n\t"
  172007. #else
  172008. "lsl r5, r5, #16\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. "adds r3, r3, r5\n\t"
  172031. #else
  172032. "add r3, r3, r5\n\t"
  172033. #endif
  172034. #ifdef WOLFSSL_KEIL
  172035. "adcs r4, r4, r6\n\t"
  172036. #elif defined(__clang__)
  172037. "adcs r4, r6\n\t"
  172038. #else
  172039. "adc r4, r6\n\t"
  172040. #endif
  172041. #ifdef WOLFSSL_KEIL
  172042. "adcs r2, r2, %[r]\n\t"
  172043. #elif defined(__clang__)
  172044. "adcs r2, %[r]\n\t"
  172045. #else
  172046. "adc r2, %[r]\n\t"
  172047. #endif
  172048. "# A[14] * A[5]\n\t"
  172049. "mov %[a], r9\n\t"
  172050. "ldr r7, [%[a], #20]\n\t"
  172051. "mov %[a], r12\n\t"
  172052. "uxth r5, %[a]\n\t"
  172053. "uxth r6, r7\n\t"
  172054. #ifdef WOLFSSL_KEIL
  172055. "muls r6, r5, r6\n\t"
  172056. #elif defined(__clang__)
  172057. "muls r6, r5\n\t"
  172058. #else
  172059. "mul r6, r5\n\t"
  172060. #endif
  172061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172062. "adds r3, r3, r6\n\t"
  172063. #else
  172064. "add r3, r3, r6\n\t"
  172065. #endif
  172066. #ifdef WOLFSSL_KEIL
  172067. "adcs r4, r4, %[r]\n\t"
  172068. #elif defined(__clang__)
  172069. "adcs r4, %[r]\n\t"
  172070. #else
  172071. "adc r4, %[r]\n\t"
  172072. #endif
  172073. #ifdef WOLFSSL_KEIL
  172074. "adcs r2, r2, %[r]\n\t"
  172075. #elif defined(__clang__)
  172076. "adcs r2, %[r]\n\t"
  172077. #else
  172078. "adc r2, %[r]\n\t"
  172079. #endif
  172080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172081. "adds r3, r3, r6\n\t"
  172082. #else
  172083. "add r3, r3, r6\n\t"
  172084. #endif
  172085. #ifdef WOLFSSL_KEIL
  172086. "adcs r4, r4, %[r]\n\t"
  172087. #elif defined(__clang__)
  172088. "adcs r4, %[r]\n\t"
  172089. #else
  172090. "adc r4, %[r]\n\t"
  172091. #endif
  172092. #ifdef WOLFSSL_KEIL
  172093. "adcs r2, r2, %[r]\n\t"
  172094. #elif defined(__clang__)
  172095. "adcs r2, %[r]\n\t"
  172096. #else
  172097. "adc r2, %[r]\n\t"
  172098. #endif
  172099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172100. "lsrs r6, r7, #16\n\t"
  172101. #else
  172102. "lsr r6, r7, #16\n\t"
  172103. #endif
  172104. #ifdef WOLFSSL_KEIL
  172105. "muls r5, r6, r5\n\t"
  172106. #elif defined(__clang__)
  172107. "muls r5, r6\n\t"
  172108. #else
  172109. "mul r5, r6\n\t"
  172110. #endif
  172111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172112. "lsrs r6, r5, #16\n\t"
  172113. #else
  172114. "lsr r6, r5, #16\n\t"
  172115. #endif
  172116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172117. "lsls r5, r5, #16\n\t"
  172118. #else
  172119. "lsl r5, r5, #16\n\t"
  172120. #endif
  172121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172122. "adds r3, r3, r5\n\t"
  172123. #else
  172124. "add r3, r3, r5\n\t"
  172125. #endif
  172126. #ifdef WOLFSSL_KEIL
  172127. "adcs r4, r4, r6\n\t"
  172128. #elif defined(__clang__)
  172129. "adcs r4, r6\n\t"
  172130. #else
  172131. "adc r4, r6\n\t"
  172132. #endif
  172133. #ifdef WOLFSSL_KEIL
  172134. "adcs r2, r2, %[r]\n\t"
  172135. #elif defined(__clang__)
  172136. "adcs r2, %[r]\n\t"
  172137. #else
  172138. "adc r2, %[r]\n\t"
  172139. #endif
  172140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172141. "adds r3, r3, r5\n\t"
  172142. #else
  172143. "add r3, r3, r5\n\t"
  172144. #endif
  172145. #ifdef WOLFSSL_KEIL
  172146. "adcs r4, r4, r6\n\t"
  172147. #elif defined(__clang__)
  172148. "adcs r4, r6\n\t"
  172149. #else
  172150. "adc r4, r6\n\t"
  172151. #endif
  172152. #ifdef WOLFSSL_KEIL
  172153. "adcs r2, r2, %[r]\n\t"
  172154. #elif defined(__clang__)
  172155. "adcs r2, %[r]\n\t"
  172156. #else
  172157. "adc r2, %[r]\n\t"
  172158. #endif
  172159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172160. "lsrs r5, %[a], #16\n\t"
  172161. #else
  172162. "lsr r5, %[a], #16\n\t"
  172163. #endif
  172164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172165. "lsrs r6, r7, #16\n\t"
  172166. #else
  172167. "lsr r6, r7, #16\n\t"
  172168. #endif
  172169. #ifdef WOLFSSL_KEIL
  172170. "muls r6, r5, r6\n\t"
  172171. #elif defined(__clang__)
  172172. "muls r6, r5\n\t"
  172173. #else
  172174. "mul r6, r5\n\t"
  172175. #endif
  172176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172177. "adds r4, r4, r6\n\t"
  172178. #else
  172179. "add r4, r4, r6\n\t"
  172180. #endif
  172181. #ifdef WOLFSSL_KEIL
  172182. "adcs r2, r2, %[r]\n\t"
  172183. #elif defined(__clang__)
  172184. "adcs r2, %[r]\n\t"
  172185. #else
  172186. "adc r2, %[r]\n\t"
  172187. #endif
  172188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172189. "adds r4, r4, r6\n\t"
  172190. #else
  172191. "add r4, r4, r6\n\t"
  172192. #endif
  172193. #ifdef WOLFSSL_KEIL
  172194. "adcs r2, r2, %[r]\n\t"
  172195. #elif defined(__clang__)
  172196. "adcs r2, %[r]\n\t"
  172197. #else
  172198. "adc r2, %[r]\n\t"
  172199. #endif
  172200. "uxth r6, r7\n\t"
  172201. #ifdef WOLFSSL_KEIL
  172202. "muls r5, r6, r5\n\t"
  172203. #elif defined(__clang__)
  172204. "muls r5, r6\n\t"
  172205. #else
  172206. "mul r5, r6\n\t"
  172207. #endif
  172208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172209. "lsrs r6, r5, #16\n\t"
  172210. #else
  172211. "lsr r6, r5, #16\n\t"
  172212. #endif
  172213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172214. "lsls r5, r5, #16\n\t"
  172215. #else
  172216. "lsl r5, r5, #16\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. "adds r3, r3, r5\n\t"
  172239. #else
  172240. "add r3, r3, r5\n\t"
  172241. #endif
  172242. #ifdef WOLFSSL_KEIL
  172243. "adcs r4, r4, r6\n\t"
  172244. #elif defined(__clang__)
  172245. "adcs r4, r6\n\t"
  172246. #else
  172247. "adc r4, r6\n\t"
  172248. #endif
  172249. #ifdef WOLFSSL_KEIL
  172250. "adcs r2, r2, %[r]\n\t"
  172251. #elif defined(__clang__)
  172252. "adcs r2, %[r]\n\t"
  172253. #else
  172254. "adc r2, %[r]\n\t"
  172255. #endif
  172256. "# A[15] * A[4]\n\t"
  172257. "mov %[a], r9\n\t"
  172258. "ldr r7, [%[a], #16]\n\t"
  172259. "mov %[a], lr\n\t"
  172260. "uxth r5, %[a]\n\t"
  172261. "uxth r6, r7\n\t"
  172262. #ifdef WOLFSSL_KEIL
  172263. "muls r6, r5, r6\n\t"
  172264. #elif defined(__clang__)
  172265. "muls r6, r5\n\t"
  172266. #else
  172267. "mul r6, r5\n\t"
  172268. #endif
  172269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172270. "adds r3, r3, r6\n\t"
  172271. #else
  172272. "add r3, r3, r6\n\t"
  172273. #endif
  172274. #ifdef WOLFSSL_KEIL
  172275. "adcs r4, r4, %[r]\n\t"
  172276. #elif defined(__clang__)
  172277. "adcs r4, %[r]\n\t"
  172278. #else
  172279. "adc r4, %[r]\n\t"
  172280. #endif
  172281. #ifdef WOLFSSL_KEIL
  172282. "adcs r2, r2, %[r]\n\t"
  172283. #elif defined(__clang__)
  172284. "adcs r2, %[r]\n\t"
  172285. #else
  172286. "adc r2, %[r]\n\t"
  172287. #endif
  172288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172289. "adds r3, r3, r6\n\t"
  172290. #else
  172291. "add r3, r3, r6\n\t"
  172292. #endif
  172293. #ifdef WOLFSSL_KEIL
  172294. "adcs r4, r4, %[r]\n\t"
  172295. #elif defined(__clang__)
  172296. "adcs r4, %[r]\n\t"
  172297. #else
  172298. "adc r4, %[r]\n\t"
  172299. #endif
  172300. #ifdef WOLFSSL_KEIL
  172301. "adcs r2, r2, %[r]\n\t"
  172302. #elif defined(__clang__)
  172303. "adcs r2, %[r]\n\t"
  172304. #else
  172305. "adc r2, %[r]\n\t"
  172306. #endif
  172307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172308. "lsrs r6, r7, #16\n\t"
  172309. #else
  172310. "lsr r6, r7, #16\n\t"
  172311. #endif
  172312. #ifdef WOLFSSL_KEIL
  172313. "muls r5, r6, r5\n\t"
  172314. #elif defined(__clang__)
  172315. "muls r5, r6\n\t"
  172316. #else
  172317. "mul r5, r6\n\t"
  172318. #endif
  172319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172320. "lsrs r6, r5, #16\n\t"
  172321. #else
  172322. "lsr r6, r5, #16\n\t"
  172323. #endif
  172324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172325. "lsls r5, r5, #16\n\t"
  172326. #else
  172327. "lsl r5, r5, #16\n\t"
  172328. #endif
  172329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172330. "adds r3, r3, r5\n\t"
  172331. #else
  172332. "add r3, r3, r5\n\t"
  172333. #endif
  172334. #ifdef WOLFSSL_KEIL
  172335. "adcs r4, r4, r6\n\t"
  172336. #elif defined(__clang__)
  172337. "adcs r4, r6\n\t"
  172338. #else
  172339. "adc r4, r6\n\t"
  172340. #endif
  172341. #ifdef WOLFSSL_KEIL
  172342. "adcs r2, r2, %[r]\n\t"
  172343. #elif defined(__clang__)
  172344. "adcs r2, %[r]\n\t"
  172345. #else
  172346. "adc r2, %[r]\n\t"
  172347. #endif
  172348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172349. "adds r3, r3, r5\n\t"
  172350. #else
  172351. "add r3, r3, r5\n\t"
  172352. #endif
  172353. #ifdef WOLFSSL_KEIL
  172354. "adcs r4, r4, r6\n\t"
  172355. #elif defined(__clang__)
  172356. "adcs r4, r6\n\t"
  172357. #else
  172358. "adc r4, r6\n\t"
  172359. #endif
  172360. #ifdef WOLFSSL_KEIL
  172361. "adcs r2, r2, %[r]\n\t"
  172362. #elif defined(__clang__)
  172363. "adcs r2, %[r]\n\t"
  172364. #else
  172365. "adc r2, %[r]\n\t"
  172366. #endif
  172367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172368. "lsrs r5, %[a], #16\n\t"
  172369. #else
  172370. "lsr r5, %[a], #16\n\t"
  172371. #endif
  172372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172373. "lsrs r6, r7, #16\n\t"
  172374. #else
  172375. "lsr r6, r7, #16\n\t"
  172376. #endif
  172377. #ifdef WOLFSSL_KEIL
  172378. "muls r6, r5, r6\n\t"
  172379. #elif defined(__clang__)
  172380. "muls r6, r5\n\t"
  172381. #else
  172382. "mul r6, r5\n\t"
  172383. #endif
  172384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172385. "adds r4, r4, r6\n\t"
  172386. #else
  172387. "add r4, r4, r6\n\t"
  172388. #endif
  172389. #ifdef WOLFSSL_KEIL
  172390. "adcs r2, r2, %[r]\n\t"
  172391. #elif defined(__clang__)
  172392. "adcs r2, %[r]\n\t"
  172393. #else
  172394. "adc r2, %[r]\n\t"
  172395. #endif
  172396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172397. "adds r4, r4, r6\n\t"
  172398. #else
  172399. "add r4, r4, r6\n\t"
  172400. #endif
  172401. #ifdef WOLFSSL_KEIL
  172402. "adcs r2, r2, %[r]\n\t"
  172403. #elif defined(__clang__)
  172404. "adcs r2, %[r]\n\t"
  172405. #else
  172406. "adc r2, %[r]\n\t"
  172407. #endif
  172408. "uxth r6, r7\n\t"
  172409. #ifdef WOLFSSL_KEIL
  172410. "muls r5, r6, r5\n\t"
  172411. #elif defined(__clang__)
  172412. "muls r5, r6\n\t"
  172413. #else
  172414. "mul r5, r6\n\t"
  172415. #endif
  172416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172417. "lsrs r6, r5, #16\n\t"
  172418. #else
  172419. "lsr r6, r5, #16\n\t"
  172420. #endif
  172421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172422. "lsls r5, r5, #16\n\t"
  172423. #else
  172424. "lsl r5, r5, #16\n\t"
  172425. #endif
  172426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172427. "adds r3, r3, r5\n\t"
  172428. #else
  172429. "add r3, r3, r5\n\t"
  172430. #endif
  172431. #ifdef WOLFSSL_KEIL
  172432. "adcs r4, r4, r6\n\t"
  172433. #elif defined(__clang__)
  172434. "adcs r4, r6\n\t"
  172435. #else
  172436. "adc r4, r6\n\t"
  172437. #endif
  172438. #ifdef WOLFSSL_KEIL
  172439. "adcs r2, r2, %[r]\n\t"
  172440. #elif defined(__clang__)
  172441. "adcs r2, %[r]\n\t"
  172442. #else
  172443. "adc r2, %[r]\n\t"
  172444. #endif
  172445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172446. "adds r3, r3, r5\n\t"
  172447. #else
  172448. "add r3, r3, r5\n\t"
  172449. #endif
  172450. #ifdef WOLFSSL_KEIL
  172451. "adcs r4, r4, r6\n\t"
  172452. #elif defined(__clang__)
  172453. "adcs r4, r6\n\t"
  172454. #else
  172455. "adc r4, r6\n\t"
  172456. #endif
  172457. #ifdef WOLFSSL_KEIL
  172458. "adcs r2, r2, %[r]\n\t"
  172459. #elif defined(__clang__)
  172460. "adcs r2, %[r]\n\t"
  172461. #else
  172462. "adc r2, %[r]\n\t"
  172463. #endif
  172464. "mov %[r], r8\n\t"
  172465. "str r3, [%[r], #76]\n\t"
  172466. "movs %[r], #0\n\t"
  172467. "# A[15] * A[5]\n\t"
  172468. "movs r3, #0\n\t"
  172469. "mov %[a], r9\n\t"
  172470. "ldr r7, [%[a], #20]\n\t"
  172471. "mov %[a], lr\n\t"
  172472. "uxth r5, %[a]\n\t"
  172473. "uxth r6, r7\n\t"
  172474. #ifdef WOLFSSL_KEIL
  172475. "muls r6, r5, r6\n\t"
  172476. #elif defined(__clang__)
  172477. "muls r6, r5\n\t"
  172478. #else
  172479. "mul r6, r5\n\t"
  172480. #endif
  172481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172482. "adds r4, r4, r6\n\t"
  172483. #else
  172484. "add r4, r4, r6\n\t"
  172485. #endif
  172486. #ifdef WOLFSSL_KEIL
  172487. "adcs r2, r2, %[r]\n\t"
  172488. #elif defined(__clang__)
  172489. "adcs r2, %[r]\n\t"
  172490. #else
  172491. "adc r2, %[r]\n\t"
  172492. #endif
  172493. #ifdef WOLFSSL_KEIL
  172494. "adcs r3, r3, %[r]\n\t"
  172495. #elif defined(__clang__)
  172496. "adcs r3, %[r]\n\t"
  172497. #else
  172498. "adc r3, %[r]\n\t"
  172499. #endif
  172500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172501. "adds r4, r4, r6\n\t"
  172502. #else
  172503. "add r4, r4, r6\n\t"
  172504. #endif
  172505. #ifdef WOLFSSL_KEIL
  172506. "adcs r2, r2, %[r]\n\t"
  172507. #elif defined(__clang__)
  172508. "adcs r2, %[r]\n\t"
  172509. #else
  172510. "adc r2, %[r]\n\t"
  172511. #endif
  172512. #ifdef WOLFSSL_KEIL
  172513. "adcs r3, r3, %[r]\n\t"
  172514. #elif defined(__clang__)
  172515. "adcs r3, %[r]\n\t"
  172516. #else
  172517. "adc r3, %[r]\n\t"
  172518. #endif
  172519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172520. "lsrs r6, r7, #16\n\t"
  172521. #else
  172522. "lsr r6, r7, #16\n\t"
  172523. #endif
  172524. #ifdef WOLFSSL_KEIL
  172525. "muls r5, r6, r5\n\t"
  172526. #elif defined(__clang__)
  172527. "muls r5, r6\n\t"
  172528. #else
  172529. "mul r5, r6\n\t"
  172530. #endif
  172531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172532. "lsrs r6, r5, #16\n\t"
  172533. #else
  172534. "lsr r6, r5, #16\n\t"
  172535. #endif
  172536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172537. "lsls r5, r5, #16\n\t"
  172538. #else
  172539. "lsl r5, r5, #16\n\t"
  172540. #endif
  172541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172542. "adds r4, r4, r5\n\t"
  172543. #else
  172544. "add r4, r4, r5\n\t"
  172545. #endif
  172546. #ifdef WOLFSSL_KEIL
  172547. "adcs r2, r2, r6\n\t"
  172548. #elif defined(__clang__)
  172549. "adcs r2, r6\n\t"
  172550. #else
  172551. "adc r2, r6\n\t"
  172552. #endif
  172553. #ifdef WOLFSSL_KEIL
  172554. "adcs r3, r3, %[r]\n\t"
  172555. #elif defined(__clang__)
  172556. "adcs r3, %[r]\n\t"
  172557. #else
  172558. "adc r3, %[r]\n\t"
  172559. #endif
  172560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172561. "adds r4, r4, r5\n\t"
  172562. #else
  172563. "add r4, r4, r5\n\t"
  172564. #endif
  172565. #ifdef WOLFSSL_KEIL
  172566. "adcs r2, r2, r6\n\t"
  172567. #elif defined(__clang__)
  172568. "adcs r2, r6\n\t"
  172569. #else
  172570. "adc r2, r6\n\t"
  172571. #endif
  172572. #ifdef WOLFSSL_KEIL
  172573. "adcs r3, r3, %[r]\n\t"
  172574. #elif defined(__clang__)
  172575. "adcs r3, %[r]\n\t"
  172576. #else
  172577. "adc r3, %[r]\n\t"
  172578. #endif
  172579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172580. "lsrs r5, %[a], #16\n\t"
  172581. #else
  172582. "lsr r5, %[a], #16\n\t"
  172583. #endif
  172584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172585. "lsrs r6, r7, #16\n\t"
  172586. #else
  172587. "lsr r6, r7, #16\n\t"
  172588. #endif
  172589. #ifdef WOLFSSL_KEIL
  172590. "muls r6, r5, r6\n\t"
  172591. #elif defined(__clang__)
  172592. "muls r6, r5\n\t"
  172593. #else
  172594. "mul r6, r5\n\t"
  172595. #endif
  172596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172597. "adds r2, r2, r6\n\t"
  172598. #else
  172599. "add r2, r2, r6\n\t"
  172600. #endif
  172601. #ifdef WOLFSSL_KEIL
  172602. "adcs r3, r3, %[r]\n\t"
  172603. #elif defined(__clang__)
  172604. "adcs r3, %[r]\n\t"
  172605. #else
  172606. "adc r3, %[r]\n\t"
  172607. #endif
  172608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172609. "adds r2, r2, r6\n\t"
  172610. #else
  172611. "add r2, r2, r6\n\t"
  172612. #endif
  172613. #ifdef WOLFSSL_KEIL
  172614. "adcs r3, r3, %[r]\n\t"
  172615. #elif defined(__clang__)
  172616. "adcs r3, %[r]\n\t"
  172617. #else
  172618. "adc r3, %[r]\n\t"
  172619. #endif
  172620. "uxth r6, r7\n\t"
  172621. #ifdef WOLFSSL_KEIL
  172622. "muls r5, r6, r5\n\t"
  172623. #elif defined(__clang__)
  172624. "muls r5, r6\n\t"
  172625. #else
  172626. "mul r5, r6\n\t"
  172627. #endif
  172628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172629. "lsrs r6, r5, #16\n\t"
  172630. #else
  172631. "lsr r6, r5, #16\n\t"
  172632. #endif
  172633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172634. "lsls r5, r5, #16\n\t"
  172635. #else
  172636. "lsl r5, r5, #16\n\t"
  172637. #endif
  172638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172639. "adds r4, r4, r5\n\t"
  172640. #else
  172641. "add r4, r4, r5\n\t"
  172642. #endif
  172643. #ifdef WOLFSSL_KEIL
  172644. "adcs r2, r2, r6\n\t"
  172645. #elif defined(__clang__)
  172646. "adcs r2, r6\n\t"
  172647. #else
  172648. "adc r2, r6\n\t"
  172649. #endif
  172650. #ifdef WOLFSSL_KEIL
  172651. "adcs r3, r3, %[r]\n\t"
  172652. #elif defined(__clang__)
  172653. "adcs r3, %[r]\n\t"
  172654. #else
  172655. "adc r3, %[r]\n\t"
  172656. #endif
  172657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172658. "adds r4, r4, r5\n\t"
  172659. #else
  172660. "add r4, r4, r5\n\t"
  172661. #endif
  172662. #ifdef WOLFSSL_KEIL
  172663. "adcs r2, r2, r6\n\t"
  172664. #elif defined(__clang__)
  172665. "adcs r2, r6\n\t"
  172666. #else
  172667. "adc r2, r6\n\t"
  172668. #endif
  172669. #ifdef WOLFSSL_KEIL
  172670. "adcs r3, r3, %[r]\n\t"
  172671. #elif defined(__clang__)
  172672. "adcs r3, %[r]\n\t"
  172673. #else
  172674. "adc r3, %[r]\n\t"
  172675. #endif
  172676. "# A[14] * A[6]\n\t"
  172677. "mov %[a], r9\n\t"
  172678. "ldr r7, [%[a], #24]\n\t"
  172679. "mov %[a], r12\n\t"
  172680. "uxth r5, %[a]\n\t"
  172681. "uxth r6, r7\n\t"
  172682. #ifdef WOLFSSL_KEIL
  172683. "muls r6, r5, r6\n\t"
  172684. #elif defined(__clang__)
  172685. "muls r6, r5\n\t"
  172686. #else
  172687. "mul r6, r5\n\t"
  172688. #endif
  172689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172690. "adds r4, r4, r6\n\t"
  172691. #else
  172692. "add r4, r4, r6\n\t"
  172693. #endif
  172694. #ifdef WOLFSSL_KEIL
  172695. "adcs r2, r2, %[r]\n\t"
  172696. #elif defined(__clang__)
  172697. "adcs r2, %[r]\n\t"
  172698. #else
  172699. "adc r2, %[r]\n\t"
  172700. #endif
  172701. #ifdef WOLFSSL_KEIL
  172702. "adcs r3, r3, %[r]\n\t"
  172703. #elif defined(__clang__)
  172704. "adcs r3, %[r]\n\t"
  172705. #else
  172706. "adc r3, %[r]\n\t"
  172707. #endif
  172708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172709. "adds r4, r4, r6\n\t"
  172710. #else
  172711. "add r4, r4, r6\n\t"
  172712. #endif
  172713. #ifdef WOLFSSL_KEIL
  172714. "adcs r2, r2, %[r]\n\t"
  172715. #elif defined(__clang__)
  172716. "adcs r2, %[r]\n\t"
  172717. #else
  172718. "adc r2, %[r]\n\t"
  172719. #endif
  172720. #ifdef WOLFSSL_KEIL
  172721. "adcs r3, r3, %[r]\n\t"
  172722. #elif defined(__clang__)
  172723. "adcs r3, %[r]\n\t"
  172724. #else
  172725. "adc r3, %[r]\n\t"
  172726. #endif
  172727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172728. "lsrs r6, r7, #16\n\t"
  172729. #else
  172730. "lsr r6, r7, #16\n\t"
  172731. #endif
  172732. #ifdef WOLFSSL_KEIL
  172733. "muls r5, r6, r5\n\t"
  172734. #elif defined(__clang__)
  172735. "muls r5, r6\n\t"
  172736. #else
  172737. "mul r5, r6\n\t"
  172738. #endif
  172739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172740. "lsrs r6, r5, #16\n\t"
  172741. #else
  172742. "lsr r6, r5, #16\n\t"
  172743. #endif
  172744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172745. "lsls r5, r5, #16\n\t"
  172746. #else
  172747. "lsl r5, r5, #16\n\t"
  172748. #endif
  172749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172750. "adds r4, r4, r5\n\t"
  172751. #else
  172752. "add r4, r4, r5\n\t"
  172753. #endif
  172754. #ifdef WOLFSSL_KEIL
  172755. "adcs r2, r2, r6\n\t"
  172756. #elif defined(__clang__)
  172757. "adcs r2, r6\n\t"
  172758. #else
  172759. "adc r2, r6\n\t"
  172760. #endif
  172761. #ifdef WOLFSSL_KEIL
  172762. "adcs r3, r3, %[r]\n\t"
  172763. #elif defined(__clang__)
  172764. "adcs r3, %[r]\n\t"
  172765. #else
  172766. "adc r3, %[r]\n\t"
  172767. #endif
  172768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172769. "adds r4, r4, r5\n\t"
  172770. #else
  172771. "add r4, r4, r5\n\t"
  172772. #endif
  172773. #ifdef WOLFSSL_KEIL
  172774. "adcs r2, r2, r6\n\t"
  172775. #elif defined(__clang__)
  172776. "adcs r2, r6\n\t"
  172777. #else
  172778. "adc r2, r6\n\t"
  172779. #endif
  172780. #ifdef WOLFSSL_KEIL
  172781. "adcs r3, r3, %[r]\n\t"
  172782. #elif defined(__clang__)
  172783. "adcs r3, %[r]\n\t"
  172784. #else
  172785. "adc r3, %[r]\n\t"
  172786. #endif
  172787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172788. "lsrs r5, %[a], #16\n\t"
  172789. #else
  172790. "lsr r5, %[a], #16\n\t"
  172791. #endif
  172792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172793. "lsrs r6, r7, #16\n\t"
  172794. #else
  172795. "lsr r6, r7, #16\n\t"
  172796. #endif
  172797. #ifdef WOLFSSL_KEIL
  172798. "muls r6, r5, r6\n\t"
  172799. #elif defined(__clang__)
  172800. "muls r6, r5\n\t"
  172801. #else
  172802. "mul r6, r5\n\t"
  172803. #endif
  172804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172805. "adds r2, r2, r6\n\t"
  172806. #else
  172807. "add r2, r2, r6\n\t"
  172808. #endif
  172809. #ifdef WOLFSSL_KEIL
  172810. "adcs r3, r3, %[r]\n\t"
  172811. #elif defined(__clang__)
  172812. "adcs r3, %[r]\n\t"
  172813. #else
  172814. "adc r3, %[r]\n\t"
  172815. #endif
  172816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172817. "adds r2, r2, r6\n\t"
  172818. #else
  172819. "add r2, r2, r6\n\t"
  172820. #endif
  172821. #ifdef WOLFSSL_KEIL
  172822. "adcs r3, r3, %[r]\n\t"
  172823. #elif defined(__clang__)
  172824. "adcs r3, %[r]\n\t"
  172825. #else
  172826. "adc r3, %[r]\n\t"
  172827. #endif
  172828. "uxth r6, r7\n\t"
  172829. #ifdef WOLFSSL_KEIL
  172830. "muls r5, r6, r5\n\t"
  172831. #elif defined(__clang__)
  172832. "muls r5, r6\n\t"
  172833. #else
  172834. "mul r5, r6\n\t"
  172835. #endif
  172836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172837. "lsrs r6, r5, #16\n\t"
  172838. #else
  172839. "lsr r6, r5, #16\n\t"
  172840. #endif
  172841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172842. "lsls r5, r5, #16\n\t"
  172843. #else
  172844. "lsl r5, r5, #16\n\t"
  172845. #endif
  172846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172847. "adds r4, r4, r5\n\t"
  172848. #else
  172849. "add r4, r4, r5\n\t"
  172850. #endif
  172851. #ifdef WOLFSSL_KEIL
  172852. "adcs r2, r2, r6\n\t"
  172853. #elif defined(__clang__)
  172854. "adcs r2, r6\n\t"
  172855. #else
  172856. "adc r2, r6\n\t"
  172857. #endif
  172858. #ifdef WOLFSSL_KEIL
  172859. "adcs r3, r3, %[r]\n\t"
  172860. #elif defined(__clang__)
  172861. "adcs r3, %[r]\n\t"
  172862. #else
  172863. "adc r3, %[r]\n\t"
  172864. #endif
  172865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172866. "adds r4, r4, r5\n\t"
  172867. #else
  172868. "add r4, r4, r5\n\t"
  172869. #endif
  172870. #ifdef WOLFSSL_KEIL
  172871. "adcs r2, r2, r6\n\t"
  172872. #elif defined(__clang__)
  172873. "adcs r2, r6\n\t"
  172874. #else
  172875. "adc r2, r6\n\t"
  172876. #endif
  172877. #ifdef WOLFSSL_KEIL
  172878. "adcs r3, r3, %[r]\n\t"
  172879. #elif defined(__clang__)
  172880. "adcs r3, %[r]\n\t"
  172881. #else
  172882. "adc r3, %[r]\n\t"
  172883. #endif
  172884. "# A[13] * A[7]\n\t"
  172885. "mov %[a], r9\n\t"
  172886. "ldr r7, [%[a], #28]\n\t"
  172887. "mov %[a], r11\n\t"
  172888. "uxth r5, %[a]\n\t"
  172889. "uxth r6, r7\n\t"
  172890. #ifdef WOLFSSL_KEIL
  172891. "muls r6, r5, r6\n\t"
  172892. #elif defined(__clang__)
  172893. "muls r6, r5\n\t"
  172894. #else
  172895. "mul r6, r5\n\t"
  172896. #endif
  172897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172898. "adds r4, r4, r6\n\t"
  172899. #else
  172900. "add r4, r4, r6\n\t"
  172901. #endif
  172902. #ifdef WOLFSSL_KEIL
  172903. "adcs r2, r2, %[r]\n\t"
  172904. #elif defined(__clang__)
  172905. "adcs r2, %[r]\n\t"
  172906. #else
  172907. "adc r2, %[r]\n\t"
  172908. #endif
  172909. #ifdef WOLFSSL_KEIL
  172910. "adcs r3, r3, %[r]\n\t"
  172911. #elif defined(__clang__)
  172912. "adcs r3, %[r]\n\t"
  172913. #else
  172914. "adc r3, %[r]\n\t"
  172915. #endif
  172916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172917. "adds r4, r4, r6\n\t"
  172918. #else
  172919. "add r4, r4, r6\n\t"
  172920. #endif
  172921. #ifdef WOLFSSL_KEIL
  172922. "adcs r2, r2, %[r]\n\t"
  172923. #elif defined(__clang__)
  172924. "adcs r2, %[r]\n\t"
  172925. #else
  172926. "adc r2, %[r]\n\t"
  172927. #endif
  172928. #ifdef WOLFSSL_KEIL
  172929. "adcs r3, r3, %[r]\n\t"
  172930. #elif defined(__clang__)
  172931. "adcs r3, %[r]\n\t"
  172932. #else
  172933. "adc r3, %[r]\n\t"
  172934. #endif
  172935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172936. "lsrs r6, r7, #16\n\t"
  172937. #else
  172938. "lsr r6, r7, #16\n\t"
  172939. #endif
  172940. #ifdef WOLFSSL_KEIL
  172941. "muls r5, r6, r5\n\t"
  172942. #elif defined(__clang__)
  172943. "muls r5, r6\n\t"
  172944. #else
  172945. "mul r5, r6\n\t"
  172946. #endif
  172947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172948. "lsrs r6, r5, #16\n\t"
  172949. #else
  172950. "lsr r6, r5, #16\n\t"
  172951. #endif
  172952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172953. "lsls r5, r5, #16\n\t"
  172954. #else
  172955. "lsl r5, r5, #16\n\t"
  172956. #endif
  172957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172958. "adds r4, r4, r5\n\t"
  172959. #else
  172960. "add r4, r4, r5\n\t"
  172961. #endif
  172962. #ifdef WOLFSSL_KEIL
  172963. "adcs r2, r2, r6\n\t"
  172964. #elif defined(__clang__)
  172965. "adcs r2, r6\n\t"
  172966. #else
  172967. "adc r2, r6\n\t"
  172968. #endif
  172969. #ifdef WOLFSSL_KEIL
  172970. "adcs r3, r3, %[r]\n\t"
  172971. #elif defined(__clang__)
  172972. "adcs r3, %[r]\n\t"
  172973. #else
  172974. "adc r3, %[r]\n\t"
  172975. #endif
  172976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172977. "adds r4, r4, r5\n\t"
  172978. #else
  172979. "add r4, r4, r5\n\t"
  172980. #endif
  172981. #ifdef WOLFSSL_KEIL
  172982. "adcs r2, r2, r6\n\t"
  172983. #elif defined(__clang__)
  172984. "adcs r2, r6\n\t"
  172985. #else
  172986. "adc r2, r6\n\t"
  172987. #endif
  172988. #ifdef WOLFSSL_KEIL
  172989. "adcs r3, r3, %[r]\n\t"
  172990. #elif defined(__clang__)
  172991. "adcs r3, %[r]\n\t"
  172992. #else
  172993. "adc r3, %[r]\n\t"
  172994. #endif
  172995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172996. "lsrs r5, %[a], #16\n\t"
  172997. #else
  172998. "lsr r5, %[a], #16\n\t"
  172999. #endif
  173000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173001. "lsrs r6, r7, #16\n\t"
  173002. #else
  173003. "lsr r6, r7, #16\n\t"
  173004. #endif
  173005. #ifdef WOLFSSL_KEIL
  173006. "muls r6, r5, r6\n\t"
  173007. #elif defined(__clang__)
  173008. "muls r6, r5\n\t"
  173009. #else
  173010. "mul r6, r5\n\t"
  173011. #endif
  173012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173013. "adds r2, r2, r6\n\t"
  173014. #else
  173015. "add r2, r2, r6\n\t"
  173016. #endif
  173017. #ifdef WOLFSSL_KEIL
  173018. "adcs r3, r3, %[r]\n\t"
  173019. #elif defined(__clang__)
  173020. "adcs r3, %[r]\n\t"
  173021. #else
  173022. "adc r3, %[r]\n\t"
  173023. #endif
  173024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173025. "adds r2, r2, r6\n\t"
  173026. #else
  173027. "add r2, r2, r6\n\t"
  173028. #endif
  173029. #ifdef WOLFSSL_KEIL
  173030. "adcs r3, r3, %[r]\n\t"
  173031. #elif defined(__clang__)
  173032. "adcs r3, %[r]\n\t"
  173033. #else
  173034. "adc r3, %[r]\n\t"
  173035. #endif
  173036. "uxth r6, r7\n\t"
  173037. #ifdef WOLFSSL_KEIL
  173038. "muls r5, r6, r5\n\t"
  173039. #elif defined(__clang__)
  173040. "muls r5, r6\n\t"
  173041. #else
  173042. "mul r5, r6\n\t"
  173043. #endif
  173044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173045. "lsrs r6, r5, #16\n\t"
  173046. #else
  173047. "lsr r6, r5, #16\n\t"
  173048. #endif
  173049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173050. "lsls r5, r5, #16\n\t"
  173051. #else
  173052. "lsl r5, r5, #16\n\t"
  173053. #endif
  173054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173055. "adds r4, r4, r5\n\t"
  173056. #else
  173057. "add r4, r4, r5\n\t"
  173058. #endif
  173059. #ifdef WOLFSSL_KEIL
  173060. "adcs r2, r2, r6\n\t"
  173061. #elif defined(__clang__)
  173062. "adcs r2, r6\n\t"
  173063. #else
  173064. "adc r2, r6\n\t"
  173065. #endif
  173066. #ifdef WOLFSSL_KEIL
  173067. "adcs r3, r3, %[r]\n\t"
  173068. #elif defined(__clang__)
  173069. "adcs r3, %[r]\n\t"
  173070. #else
  173071. "adc r3, %[r]\n\t"
  173072. #endif
  173073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173074. "adds r4, r4, r5\n\t"
  173075. #else
  173076. "add r4, r4, r5\n\t"
  173077. #endif
  173078. #ifdef WOLFSSL_KEIL
  173079. "adcs r2, r2, r6\n\t"
  173080. #elif defined(__clang__)
  173081. "adcs r2, r6\n\t"
  173082. #else
  173083. "adc r2, r6\n\t"
  173084. #endif
  173085. #ifdef WOLFSSL_KEIL
  173086. "adcs r3, r3, %[r]\n\t"
  173087. #elif defined(__clang__)
  173088. "adcs r3, %[r]\n\t"
  173089. #else
  173090. "adc r3, %[r]\n\t"
  173091. #endif
  173092. "# A[12] * A[8]\n\t"
  173093. "mov %[a], r9\n\t"
  173094. "ldr r7, [%[a], #32]\n\t"
  173095. "mov %[a], r10\n\t"
  173096. "uxth r5, %[a]\n\t"
  173097. "uxth r6, r7\n\t"
  173098. #ifdef WOLFSSL_KEIL
  173099. "muls r6, r5, r6\n\t"
  173100. #elif defined(__clang__)
  173101. "muls r6, r5\n\t"
  173102. #else
  173103. "mul r6, r5\n\t"
  173104. #endif
  173105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173106. "adds r4, r4, r6\n\t"
  173107. #else
  173108. "add r4, r4, r6\n\t"
  173109. #endif
  173110. #ifdef WOLFSSL_KEIL
  173111. "adcs r2, r2, %[r]\n\t"
  173112. #elif defined(__clang__)
  173113. "adcs r2, %[r]\n\t"
  173114. #else
  173115. "adc r2, %[r]\n\t"
  173116. #endif
  173117. #ifdef WOLFSSL_KEIL
  173118. "adcs r3, r3, %[r]\n\t"
  173119. #elif defined(__clang__)
  173120. "adcs r3, %[r]\n\t"
  173121. #else
  173122. "adc r3, %[r]\n\t"
  173123. #endif
  173124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173125. "adds r4, r4, r6\n\t"
  173126. #else
  173127. "add r4, r4, r6\n\t"
  173128. #endif
  173129. #ifdef WOLFSSL_KEIL
  173130. "adcs r2, r2, %[r]\n\t"
  173131. #elif defined(__clang__)
  173132. "adcs r2, %[r]\n\t"
  173133. #else
  173134. "adc r2, %[r]\n\t"
  173135. #endif
  173136. #ifdef WOLFSSL_KEIL
  173137. "adcs r3, r3, %[r]\n\t"
  173138. #elif defined(__clang__)
  173139. "adcs r3, %[r]\n\t"
  173140. #else
  173141. "adc r3, %[r]\n\t"
  173142. #endif
  173143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173144. "lsrs r6, r7, #16\n\t"
  173145. #else
  173146. "lsr r6, r7, #16\n\t"
  173147. #endif
  173148. #ifdef WOLFSSL_KEIL
  173149. "muls r5, r6, r5\n\t"
  173150. #elif defined(__clang__)
  173151. "muls r5, r6\n\t"
  173152. #else
  173153. "mul r5, r6\n\t"
  173154. #endif
  173155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173156. "lsrs r6, r5, #16\n\t"
  173157. #else
  173158. "lsr r6, r5, #16\n\t"
  173159. #endif
  173160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173161. "lsls r5, r5, #16\n\t"
  173162. #else
  173163. "lsl r5, r5, #16\n\t"
  173164. #endif
  173165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173166. "adds r4, r4, r5\n\t"
  173167. #else
  173168. "add r4, r4, r5\n\t"
  173169. #endif
  173170. #ifdef WOLFSSL_KEIL
  173171. "adcs r2, r2, r6\n\t"
  173172. #elif defined(__clang__)
  173173. "adcs r2, r6\n\t"
  173174. #else
  173175. "adc r2, r6\n\t"
  173176. #endif
  173177. #ifdef WOLFSSL_KEIL
  173178. "adcs r3, r3, %[r]\n\t"
  173179. #elif defined(__clang__)
  173180. "adcs r3, %[r]\n\t"
  173181. #else
  173182. "adc r3, %[r]\n\t"
  173183. #endif
  173184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173185. "adds r4, r4, r5\n\t"
  173186. #else
  173187. "add r4, r4, r5\n\t"
  173188. #endif
  173189. #ifdef WOLFSSL_KEIL
  173190. "adcs r2, r2, r6\n\t"
  173191. #elif defined(__clang__)
  173192. "adcs r2, r6\n\t"
  173193. #else
  173194. "adc r2, r6\n\t"
  173195. #endif
  173196. #ifdef WOLFSSL_KEIL
  173197. "adcs r3, r3, %[r]\n\t"
  173198. #elif defined(__clang__)
  173199. "adcs r3, %[r]\n\t"
  173200. #else
  173201. "adc r3, %[r]\n\t"
  173202. #endif
  173203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173204. "lsrs r5, %[a], #16\n\t"
  173205. #else
  173206. "lsr r5, %[a], #16\n\t"
  173207. #endif
  173208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173209. "lsrs r6, r7, #16\n\t"
  173210. #else
  173211. "lsr r6, r7, #16\n\t"
  173212. #endif
  173213. #ifdef WOLFSSL_KEIL
  173214. "muls r6, r5, r6\n\t"
  173215. #elif defined(__clang__)
  173216. "muls r6, r5\n\t"
  173217. #else
  173218. "mul r6, r5\n\t"
  173219. #endif
  173220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173221. "adds r2, r2, r6\n\t"
  173222. #else
  173223. "add r2, r2, r6\n\t"
  173224. #endif
  173225. #ifdef WOLFSSL_KEIL
  173226. "adcs r3, r3, %[r]\n\t"
  173227. #elif defined(__clang__)
  173228. "adcs r3, %[r]\n\t"
  173229. #else
  173230. "adc r3, %[r]\n\t"
  173231. #endif
  173232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173233. "adds r2, r2, r6\n\t"
  173234. #else
  173235. "add r2, r2, r6\n\t"
  173236. #endif
  173237. #ifdef WOLFSSL_KEIL
  173238. "adcs r3, r3, %[r]\n\t"
  173239. #elif defined(__clang__)
  173240. "adcs r3, %[r]\n\t"
  173241. #else
  173242. "adc r3, %[r]\n\t"
  173243. #endif
  173244. "uxth r6, r7\n\t"
  173245. #ifdef WOLFSSL_KEIL
  173246. "muls r5, r6, r5\n\t"
  173247. #elif defined(__clang__)
  173248. "muls r5, r6\n\t"
  173249. #else
  173250. "mul r5, r6\n\t"
  173251. #endif
  173252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173253. "lsrs r6, r5, #16\n\t"
  173254. #else
  173255. "lsr r6, r5, #16\n\t"
  173256. #endif
  173257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173258. "lsls r5, r5, #16\n\t"
  173259. #else
  173260. "lsl r5, r5, #16\n\t"
  173261. #endif
  173262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173263. "adds r4, r4, r5\n\t"
  173264. #else
  173265. "add r4, r4, r5\n\t"
  173266. #endif
  173267. #ifdef WOLFSSL_KEIL
  173268. "adcs r2, r2, r6\n\t"
  173269. #elif defined(__clang__)
  173270. "adcs r2, r6\n\t"
  173271. #else
  173272. "adc r2, r6\n\t"
  173273. #endif
  173274. #ifdef WOLFSSL_KEIL
  173275. "adcs r3, r3, %[r]\n\t"
  173276. #elif defined(__clang__)
  173277. "adcs r3, %[r]\n\t"
  173278. #else
  173279. "adc r3, %[r]\n\t"
  173280. #endif
  173281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173282. "adds r4, r4, r5\n\t"
  173283. #else
  173284. "add r4, r4, r5\n\t"
  173285. #endif
  173286. #ifdef WOLFSSL_KEIL
  173287. "adcs r2, r2, r6\n\t"
  173288. #elif defined(__clang__)
  173289. "adcs r2, r6\n\t"
  173290. #else
  173291. "adc r2, r6\n\t"
  173292. #endif
  173293. #ifdef WOLFSSL_KEIL
  173294. "adcs r3, r3, %[r]\n\t"
  173295. #elif defined(__clang__)
  173296. "adcs r3, %[r]\n\t"
  173297. #else
  173298. "adc r3, %[r]\n\t"
  173299. #endif
  173300. "# A[11] * A[9]\n\t"
  173301. "mov %[a], r9\n\t"
  173302. "ldr r7, [%[a], #36]\n\t"
  173303. "ldr %[a], [%[a], #44]\n\t"
  173304. "uxth r5, %[a]\n\t"
  173305. "uxth r6, r7\n\t"
  173306. #ifdef WOLFSSL_KEIL
  173307. "muls r6, r5, r6\n\t"
  173308. #elif defined(__clang__)
  173309. "muls r6, r5\n\t"
  173310. #else
  173311. "mul r6, r5\n\t"
  173312. #endif
  173313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173314. "adds r4, r4, r6\n\t"
  173315. #else
  173316. "add r4, r4, r6\n\t"
  173317. #endif
  173318. #ifdef WOLFSSL_KEIL
  173319. "adcs r2, r2, %[r]\n\t"
  173320. #elif defined(__clang__)
  173321. "adcs r2, %[r]\n\t"
  173322. #else
  173323. "adc r2, %[r]\n\t"
  173324. #endif
  173325. #ifdef WOLFSSL_KEIL
  173326. "adcs r3, r3, %[r]\n\t"
  173327. #elif defined(__clang__)
  173328. "adcs r3, %[r]\n\t"
  173329. #else
  173330. "adc r3, %[r]\n\t"
  173331. #endif
  173332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173333. "adds r4, r4, r6\n\t"
  173334. #else
  173335. "add r4, r4, r6\n\t"
  173336. #endif
  173337. #ifdef WOLFSSL_KEIL
  173338. "adcs r2, r2, %[r]\n\t"
  173339. #elif defined(__clang__)
  173340. "adcs r2, %[r]\n\t"
  173341. #else
  173342. "adc r2, %[r]\n\t"
  173343. #endif
  173344. #ifdef WOLFSSL_KEIL
  173345. "adcs r3, r3, %[r]\n\t"
  173346. #elif defined(__clang__)
  173347. "adcs r3, %[r]\n\t"
  173348. #else
  173349. "adc r3, %[r]\n\t"
  173350. #endif
  173351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173352. "lsrs r6, r7, #16\n\t"
  173353. #else
  173354. "lsr r6, r7, #16\n\t"
  173355. #endif
  173356. #ifdef WOLFSSL_KEIL
  173357. "muls r5, r6, r5\n\t"
  173358. #elif defined(__clang__)
  173359. "muls r5, r6\n\t"
  173360. #else
  173361. "mul r5, r6\n\t"
  173362. #endif
  173363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173364. "lsrs r6, r5, #16\n\t"
  173365. #else
  173366. "lsr r6, r5, #16\n\t"
  173367. #endif
  173368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173369. "lsls r5, r5, #16\n\t"
  173370. #else
  173371. "lsl r5, r5, #16\n\t"
  173372. #endif
  173373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173374. "adds r4, r4, r5\n\t"
  173375. #else
  173376. "add r4, r4, r5\n\t"
  173377. #endif
  173378. #ifdef WOLFSSL_KEIL
  173379. "adcs r2, r2, r6\n\t"
  173380. #elif defined(__clang__)
  173381. "adcs r2, r6\n\t"
  173382. #else
  173383. "adc r2, r6\n\t"
  173384. #endif
  173385. #ifdef WOLFSSL_KEIL
  173386. "adcs r3, r3, %[r]\n\t"
  173387. #elif defined(__clang__)
  173388. "adcs r3, %[r]\n\t"
  173389. #else
  173390. "adc r3, %[r]\n\t"
  173391. #endif
  173392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173393. "adds r4, r4, r5\n\t"
  173394. #else
  173395. "add r4, r4, r5\n\t"
  173396. #endif
  173397. #ifdef WOLFSSL_KEIL
  173398. "adcs r2, r2, r6\n\t"
  173399. #elif defined(__clang__)
  173400. "adcs r2, r6\n\t"
  173401. #else
  173402. "adc r2, r6\n\t"
  173403. #endif
  173404. #ifdef WOLFSSL_KEIL
  173405. "adcs r3, r3, %[r]\n\t"
  173406. #elif defined(__clang__)
  173407. "adcs r3, %[r]\n\t"
  173408. #else
  173409. "adc r3, %[r]\n\t"
  173410. #endif
  173411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173412. "lsrs r5, %[a], #16\n\t"
  173413. #else
  173414. "lsr r5, %[a], #16\n\t"
  173415. #endif
  173416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173417. "lsrs r6, r7, #16\n\t"
  173418. #else
  173419. "lsr r6, r7, #16\n\t"
  173420. #endif
  173421. #ifdef WOLFSSL_KEIL
  173422. "muls r6, r5, r6\n\t"
  173423. #elif defined(__clang__)
  173424. "muls r6, r5\n\t"
  173425. #else
  173426. "mul r6, r5\n\t"
  173427. #endif
  173428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173429. "adds r2, r2, r6\n\t"
  173430. #else
  173431. "add r2, r2, r6\n\t"
  173432. #endif
  173433. #ifdef WOLFSSL_KEIL
  173434. "adcs r3, r3, %[r]\n\t"
  173435. #elif defined(__clang__)
  173436. "adcs r3, %[r]\n\t"
  173437. #else
  173438. "adc r3, %[r]\n\t"
  173439. #endif
  173440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173441. "adds r2, r2, r6\n\t"
  173442. #else
  173443. "add r2, r2, r6\n\t"
  173444. #endif
  173445. #ifdef WOLFSSL_KEIL
  173446. "adcs r3, r3, %[r]\n\t"
  173447. #elif defined(__clang__)
  173448. "adcs r3, %[r]\n\t"
  173449. #else
  173450. "adc r3, %[r]\n\t"
  173451. #endif
  173452. "uxth r6, r7\n\t"
  173453. #ifdef WOLFSSL_KEIL
  173454. "muls r5, r6, r5\n\t"
  173455. #elif defined(__clang__)
  173456. "muls r5, r6\n\t"
  173457. #else
  173458. "mul r5, r6\n\t"
  173459. #endif
  173460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173461. "lsrs r6, r5, #16\n\t"
  173462. #else
  173463. "lsr r6, r5, #16\n\t"
  173464. #endif
  173465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173466. "lsls r5, r5, #16\n\t"
  173467. #else
  173468. "lsl r5, r5, #16\n\t"
  173469. #endif
  173470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173471. "adds r4, r4, r5\n\t"
  173472. #else
  173473. "add r4, r4, r5\n\t"
  173474. #endif
  173475. #ifdef WOLFSSL_KEIL
  173476. "adcs r2, r2, r6\n\t"
  173477. #elif defined(__clang__)
  173478. "adcs r2, r6\n\t"
  173479. #else
  173480. "adc r2, r6\n\t"
  173481. #endif
  173482. #ifdef WOLFSSL_KEIL
  173483. "adcs r3, r3, %[r]\n\t"
  173484. #elif defined(__clang__)
  173485. "adcs r3, %[r]\n\t"
  173486. #else
  173487. "adc r3, %[r]\n\t"
  173488. #endif
  173489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173490. "adds r4, r4, r5\n\t"
  173491. #else
  173492. "add r4, r4, r5\n\t"
  173493. #endif
  173494. #ifdef WOLFSSL_KEIL
  173495. "adcs r2, r2, r6\n\t"
  173496. #elif defined(__clang__)
  173497. "adcs r2, r6\n\t"
  173498. #else
  173499. "adc r2, r6\n\t"
  173500. #endif
  173501. #ifdef WOLFSSL_KEIL
  173502. "adcs r3, r3, %[r]\n\t"
  173503. #elif defined(__clang__)
  173504. "adcs r3, %[r]\n\t"
  173505. #else
  173506. "adc r3, %[r]\n\t"
  173507. #endif
  173508. "# A[10] * A[10]\n\t"
  173509. "mov %[a], r9\n\t"
  173510. "ldr r7, [%[a], #40]\n\t"
  173511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173512. "lsrs r6, r7, #16\n\t"
  173513. #else
  173514. "lsr r6, r7, #16\n\t"
  173515. #endif
  173516. "uxth r5, r7\n\t"
  173517. #ifdef WOLFSSL_KEIL
  173518. "muls r5, r5, r5\n\t"
  173519. #elif defined(__clang__)
  173520. "muls r5, r5\n\t"
  173521. #else
  173522. "mul r5, r5\n\t"
  173523. #endif
  173524. #ifdef WOLFSSL_KEIL
  173525. "muls r6, r6, r6\n\t"
  173526. #elif defined(__clang__)
  173527. "muls r6, r6\n\t"
  173528. #else
  173529. "mul r6, r6\n\t"
  173530. #endif
  173531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173532. "adds r4, r4, r5\n\t"
  173533. #else
  173534. "add r4, r4, r5\n\t"
  173535. #endif
  173536. #ifdef WOLFSSL_KEIL
  173537. "adcs r2, r2, r6\n\t"
  173538. #elif defined(__clang__)
  173539. "adcs r2, r6\n\t"
  173540. #else
  173541. "adc r2, r6\n\t"
  173542. #endif
  173543. #ifdef WOLFSSL_KEIL
  173544. "adcs r3, r3, %[r]\n\t"
  173545. #elif defined(__clang__)
  173546. "adcs r3, %[r]\n\t"
  173547. #else
  173548. "adc r3, %[r]\n\t"
  173549. #endif
  173550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173551. "lsrs r6, r7, #16\n\t"
  173552. #else
  173553. "lsr r6, r7, #16\n\t"
  173554. #endif
  173555. "uxth r5, r7\n\t"
  173556. #ifdef WOLFSSL_KEIL
  173557. "muls r5, r6, r5\n\t"
  173558. #elif defined(__clang__)
  173559. "muls r5, r6\n\t"
  173560. #else
  173561. "mul r5, r6\n\t"
  173562. #endif
  173563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173564. "lsrs r6, r5, #15\n\t"
  173565. #else
  173566. "lsr r6, r5, #15\n\t"
  173567. #endif
  173568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173569. "lsls r5, r5, #17\n\t"
  173570. #else
  173571. "lsl r5, r5, #17\n\t"
  173572. #endif
  173573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173574. "adds r4, r4, r5\n\t"
  173575. #else
  173576. "add r4, r4, r5\n\t"
  173577. #endif
  173578. #ifdef WOLFSSL_KEIL
  173579. "adcs r2, r2, r6\n\t"
  173580. #elif defined(__clang__)
  173581. "adcs r2, r6\n\t"
  173582. #else
  173583. "adc r2, r6\n\t"
  173584. #endif
  173585. #ifdef WOLFSSL_KEIL
  173586. "adcs r3, r3, %[r]\n\t"
  173587. #elif defined(__clang__)
  173588. "adcs r3, %[r]\n\t"
  173589. #else
  173590. "adc r3, %[r]\n\t"
  173591. #endif
  173592. "mov %[r], r8\n\t"
  173593. "str r4, [%[r], #80]\n\t"
  173594. "movs %[r], #0\n\t"
  173595. "# A[11] * A[10]\n\t"
  173596. "movs r4, #0\n\t"
  173597. "ldr %[a], [%[a], #44]\n\t"
  173598. "uxth r5, %[a]\n\t"
  173599. "uxth r6, r7\n\t"
  173600. #ifdef WOLFSSL_KEIL
  173601. "muls r6, r5, r6\n\t"
  173602. #elif defined(__clang__)
  173603. "muls r6, r5\n\t"
  173604. #else
  173605. "mul r6, r5\n\t"
  173606. #endif
  173607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173608. "adds r2, r2, r6\n\t"
  173609. #else
  173610. "add r2, r2, r6\n\t"
  173611. #endif
  173612. #ifdef WOLFSSL_KEIL
  173613. "adcs r3, r3, %[r]\n\t"
  173614. #elif defined(__clang__)
  173615. "adcs r3, %[r]\n\t"
  173616. #else
  173617. "adc r3, %[r]\n\t"
  173618. #endif
  173619. #ifdef WOLFSSL_KEIL
  173620. "adcs r4, r4, %[r]\n\t"
  173621. #elif defined(__clang__)
  173622. "adcs r4, %[r]\n\t"
  173623. #else
  173624. "adc r4, %[r]\n\t"
  173625. #endif
  173626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173627. "adds r2, r2, r6\n\t"
  173628. #else
  173629. "add r2, r2, r6\n\t"
  173630. #endif
  173631. #ifdef WOLFSSL_KEIL
  173632. "adcs r3, r3, %[r]\n\t"
  173633. #elif defined(__clang__)
  173634. "adcs r3, %[r]\n\t"
  173635. #else
  173636. "adc r3, %[r]\n\t"
  173637. #endif
  173638. #ifdef WOLFSSL_KEIL
  173639. "adcs r4, r4, %[r]\n\t"
  173640. #elif defined(__clang__)
  173641. "adcs r4, %[r]\n\t"
  173642. #else
  173643. "adc r4, %[r]\n\t"
  173644. #endif
  173645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173646. "lsrs r6, r7, #16\n\t"
  173647. #else
  173648. "lsr r6, r7, #16\n\t"
  173649. #endif
  173650. #ifdef WOLFSSL_KEIL
  173651. "muls r5, r6, r5\n\t"
  173652. #elif defined(__clang__)
  173653. "muls r5, r6\n\t"
  173654. #else
  173655. "mul r5, r6\n\t"
  173656. #endif
  173657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173658. "lsrs r6, r5, #16\n\t"
  173659. #else
  173660. "lsr r6, r5, #16\n\t"
  173661. #endif
  173662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173663. "lsls r5, r5, #16\n\t"
  173664. #else
  173665. "lsl r5, r5, #16\n\t"
  173666. #endif
  173667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173668. "adds r2, r2, r5\n\t"
  173669. #else
  173670. "add r2, r2, r5\n\t"
  173671. #endif
  173672. #ifdef WOLFSSL_KEIL
  173673. "adcs r3, r3, r6\n\t"
  173674. #elif defined(__clang__)
  173675. "adcs r3, r6\n\t"
  173676. #else
  173677. "adc r3, r6\n\t"
  173678. #endif
  173679. #ifdef WOLFSSL_KEIL
  173680. "adcs r4, r4, %[r]\n\t"
  173681. #elif defined(__clang__)
  173682. "adcs r4, %[r]\n\t"
  173683. #else
  173684. "adc r4, %[r]\n\t"
  173685. #endif
  173686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173687. "adds r2, r2, r5\n\t"
  173688. #else
  173689. "add r2, r2, r5\n\t"
  173690. #endif
  173691. #ifdef WOLFSSL_KEIL
  173692. "adcs r3, r3, r6\n\t"
  173693. #elif defined(__clang__)
  173694. "adcs r3, r6\n\t"
  173695. #else
  173696. "adc r3, r6\n\t"
  173697. #endif
  173698. #ifdef WOLFSSL_KEIL
  173699. "adcs r4, r4, %[r]\n\t"
  173700. #elif defined(__clang__)
  173701. "adcs r4, %[r]\n\t"
  173702. #else
  173703. "adc r4, %[r]\n\t"
  173704. #endif
  173705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173706. "lsrs r5, %[a], #16\n\t"
  173707. #else
  173708. "lsr r5, %[a], #16\n\t"
  173709. #endif
  173710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173711. "lsrs r6, r7, #16\n\t"
  173712. #else
  173713. "lsr r6, r7, #16\n\t"
  173714. #endif
  173715. #ifdef WOLFSSL_KEIL
  173716. "muls r6, r5, r6\n\t"
  173717. #elif defined(__clang__)
  173718. "muls r6, r5\n\t"
  173719. #else
  173720. "mul r6, r5\n\t"
  173721. #endif
  173722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173723. "adds r3, r3, r6\n\t"
  173724. #else
  173725. "add r3, r3, r6\n\t"
  173726. #endif
  173727. #ifdef WOLFSSL_KEIL
  173728. "adcs r4, r4, %[r]\n\t"
  173729. #elif defined(__clang__)
  173730. "adcs r4, %[r]\n\t"
  173731. #else
  173732. "adc r4, %[r]\n\t"
  173733. #endif
  173734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173735. "adds r3, r3, r6\n\t"
  173736. #else
  173737. "add r3, r3, r6\n\t"
  173738. #endif
  173739. #ifdef WOLFSSL_KEIL
  173740. "adcs r4, r4, %[r]\n\t"
  173741. #elif defined(__clang__)
  173742. "adcs r4, %[r]\n\t"
  173743. #else
  173744. "adc r4, %[r]\n\t"
  173745. #endif
  173746. "uxth r6, r7\n\t"
  173747. #ifdef WOLFSSL_KEIL
  173748. "muls r5, r6, r5\n\t"
  173749. #elif defined(__clang__)
  173750. "muls r5, r6\n\t"
  173751. #else
  173752. "mul r5, r6\n\t"
  173753. #endif
  173754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173755. "lsrs r6, r5, #16\n\t"
  173756. #else
  173757. "lsr r6, r5, #16\n\t"
  173758. #endif
  173759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173760. "lsls r5, r5, #16\n\t"
  173761. #else
  173762. "lsl r5, r5, #16\n\t"
  173763. #endif
  173764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173765. "adds r2, r2, r5\n\t"
  173766. #else
  173767. "add r2, r2, r5\n\t"
  173768. #endif
  173769. #ifdef WOLFSSL_KEIL
  173770. "adcs r3, r3, r6\n\t"
  173771. #elif defined(__clang__)
  173772. "adcs r3, r6\n\t"
  173773. #else
  173774. "adc r3, r6\n\t"
  173775. #endif
  173776. #ifdef WOLFSSL_KEIL
  173777. "adcs r4, r4, %[r]\n\t"
  173778. #elif defined(__clang__)
  173779. "adcs r4, %[r]\n\t"
  173780. #else
  173781. "adc r4, %[r]\n\t"
  173782. #endif
  173783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173784. "adds r2, r2, r5\n\t"
  173785. #else
  173786. "add r2, r2, r5\n\t"
  173787. #endif
  173788. #ifdef WOLFSSL_KEIL
  173789. "adcs r3, r3, r6\n\t"
  173790. #elif defined(__clang__)
  173791. "adcs r3, r6\n\t"
  173792. #else
  173793. "adc r3, r6\n\t"
  173794. #endif
  173795. #ifdef WOLFSSL_KEIL
  173796. "adcs r4, r4, %[r]\n\t"
  173797. #elif defined(__clang__)
  173798. "adcs r4, %[r]\n\t"
  173799. #else
  173800. "adc r4, %[r]\n\t"
  173801. #endif
  173802. "# A[12] * A[9]\n\t"
  173803. "mov %[a], r9\n\t"
  173804. "ldr r7, [%[a], #36]\n\t"
  173805. "mov %[a], r10\n\t"
  173806. "uxth r5, %[a]\n\t"
  173807. "uxth r6, r7\n\t"
  173808. #ifdef WOLFSSL_KEIL
  173809. "muls r6, r5, r6\n\t"
  173810. #elif defined(__clang__)
  173811. "muls r6, r5\n\t"
  173812. #else
  173813. "mul r6, r5\n\t"
  173814. #endif
  173815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173816. "adds r2, r2, r6\n\t"
  173817. #else
  173818. "add r2, r2, r6\n\t"
  173819. #endif
  173820. #ifdef WOLFSSL_KEIL
  173821. "adcs r3, r3, %[r]\n\t"
  173822. #elif defined(__clang__)
  173823. "adcs r3, %[r]\n\t"
  173824. #else
  173825. "adc r3, %[r]\n\t"
  173826. #endif
  173827. #ifdef WOLFSSL_KEIL
  173828. "adcs r4, r4, %[r]\n\t"
  173829. #elif defined(__clang__)
  173830. "adcs r4, %[r]\n\t"
  173831. #else
  173832. "adc r4, %[r]\n\t"
  173833. #endif
  173834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173835. "adds r2, r2, r6\n\t"
  173836. #else
  173837. "add r2, r2, r6\n\t"
  173838. #endif
  173839. #ifdef WOLFSSL_KEIL
  173840. "adcs r3, r3, %[r]\n\t"
  173841. #elif defined(__clang__)
  173842. "adcs r3, %[r]\n\t"
  173843. #else
  173844. "adc r3, %[r]\n\t"
  173845. #endif
  173846. #ifdef WOLFSSL_KEIL
  173847. "adcs r4, r4, %[r]\n\t"
  173848. #elif defined(__clang__)
  173849. "adcs r4, %[r]\n\t"
  173850. #else
  173851. "adc r4, %[r]\n\t"
  173852. #endif
  173853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173854. "lsrs r6, r7, #16\n\t"
  173855. #else
  173856. "lsr r6, r7, #16\n\t"
  173857. #endif
  173858. #ifdef WOLFSSL_KEIL
  173859. "muls r5, r6, r5\n\t"
  173860. #elif defined(__clang__)
  173861. "muls r5, r6\n\t"
  173862. #else
  173863. "mul r5, r6\n\t"
  173864. #endif
  173865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173866. "lsrs r6, r5, #16\n\t"
  173867. #else
  173868. "lsr r6, r5, #16\n\t"
  173869. #endif
  173870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173871. "lsls r5, r5, #16\n\t"
  173872. #else
  173873. "lsl r5, r5, #16\n\t"
  173874. #endif
  173875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173876. "adds r2, r2, r5\n\t"
  173877. #else
  173878. "add r2, r2, r5\n\t"
  173879. #endif
  173880. #ifdef WOLFSSL_KEIL
  173881. "adcs r3, r3, r6\n\t"
  173882. #elif defined(__clang__)
  173883. "adcs r3, r6\n\t"
  173884. #else
  173885. "adc r3, r6\n\t"
  173886. #endif
  173887. #ifdef WOLFSSL_KEIL
  173888. "adcs r4, r4, %[r]\n\t"
  173889. #elif defined(__clang__)
  173890. "adcs r4, %[r]\n\t"
  173891. #else
  173892. "adc r4, %[r]\n\t"
  173893. #endif
  173894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173895. "adds r2, r2, r5\n\t"
  173896. #else
  173897. "add r2, r2, r5\n\t"
  173898. #endif
  173899. #ifdef WOLFSSL_KEIL
  173900. "adcs r3, r3, r6\n\t"
  173901. #elif defined(__clang__)
  173902. "adcs r3, r6\n\t"
  173903. #else
  173904. "adc r3, r6\n\t"
  173905. #endif
  173906. #ifdef WOLFSSL_KEIL
  173907. "adcs r4, r4, %[r]\n\t"
  173908. #elif defined(__clang__)
  173909. "adcs r4, %[r]\n\t"
  173910. #else
  173911. "adc r4, %[r]\n\t"
  173912. #endif
  173913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173914. "lsrs r5, %[a], #16\n\t"
  173915. #else
  173916. "lsr r5, %[a], #16\n\t"
  173917. #endif
  173918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173919. "lsrs r6, r7, #16\n\t"
  173920. #else
  173921. "lsr r6, r7, #16\n\t"
  173922. #endif
  173923. #ifdef WOLFSSL_KEIL
  173924. "muls r6, r5, r6\n\t"
  173925. #elif defined(__clang__)
  173926. "muls r6, r5\n\t"
  173927. #else
  173928. "mul r6, r5\n\t"
  173929. #endif
  173930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173931. "adds r3, r3, r6\n\t"
  173932. #else
  173933. "add r3, r3, r6\n\t"
  173934. #endif
  173935. #ifdef WOLFSSL_KEIL
  173936. "adcs r4, r4, %[r]\n\t"
  173937. #elif defined(__clang__)
  173938. "adcs r4, %[r]\n\t"
  173939. #else
  173940. "adc r4, %[r]\n\t"
  173941. #endif
  173942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173943. "adds r3, r3, r6\n\t"
  173944. #else
  173945. "add r3, r3, r6\n\t"
  173946. #endif
  173947. #ifdef WOLFSSL_KEIL
  173948. "adcs r4, r4, %[r]\n\t"
  173949. #elif defined(__clang__)
  173950. "adcs r4, %[r]\n\t"
  173951. #else
  173952. "adc r4, %[r]\n\t"
  173953. #endif
  173954. "uxth r6, r7\n\t"
  173955. #ifdef WOLFSSL_KEIL
  173956. "muls r5, r6, r5\n\t"
  173957. #elif defined(__clang__)
  173958. "muls r5, r6\n\t"
  173959. #else
  173960. "mul r5, r6\n\t"
  173961. #endif
  173962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173963. "lsrs r6, r5, #16\n\t"
  173964. #else
  173965. "lsr r6, r5, #16\n\t"
  173966. #endif
  173967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173968. "lsls r5, r5, #16\n\t"
  173969. #else
  173970. "lsl r5, r5, #16\n\t"
  173971. #endif
  173972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173973. "adds r2, r2, r5\n\t"
  173974. #else
  173975. "add r2, r2, r5\n\t"
  173976. #endif
  173977. #ifdef WOLFSSL_KEIL
  173978. "adcs r3, r3, r6\n\t"
  173979. #elif defined(__clang__)
  173980. "adcs r3, r6\n\t"
  173981. #else
  173982. "adc r3, r6\n\t"
  173983. #endif
  173984. #ifdef WOLFSSL_KEIL
  173985. "adcs r4, r4, %[r]\n\t"
  173986. #elif defined(__clang__)
  173987. "adcs r4, %[r]\n\t"
  173988. #else
  173989. "adc r4, %[r]\n\t"
  173990. #endif
  173991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173992. "adds r2, r2, r5\n\t"
  173993. #else
  173994. "add r2, r2, r5\n\t"
  173995. #endif
  173996. #ifdef WOLFSSL_KEIL
  173997. "adcs r3, r3, r6\n\t"
  173998. #elif defined(__clang__)
  173999. "adcs r3, r6\n\t"
  174000. #else
  174001. "adc r3, r6\n\t"
  174002. #endif
  174003. #ifdef WOLFSSL_KEIL
  174004. "adcs r4, r4, %[r]\n\t"
  174005. #elif defined(__clang__)
  174006. "adcs r4, %[r]\n\t"
  174007. #else
  174008. "adc r4, %[r]\n\t"
  174009. #endif
  174010. "# A[13] * A[8]\n\t"
  174011. "mov %[a], r9\n\t"
  174012. "ldr r7, [%[a], #32]\n\t"
  174013. "mov %[a], r11\n\t"
  174014. "uxth r5, %[a]\n\t"
  174015. "uxth r6, r7\n\t"
  174016. #ifdef WOLFSSL_KEIL
  174017. "muls r6, r5, r6\n\t"
  174018. #elif defined(__clang__)
  174019. "muls r6, r5\n\t"
  174020. #else
  174021. "mul r6, r5\n\t"
  174022. #endif
  174023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174024. "adds r2, r2, r6\n\t"
  174025. #else
  174026. "add r2, r2, r6\n\t"
  174027. #endif
  174028. #ifdef WOLFSSL_KEIL
  174029. "adcs r3, r3, %[r]\n\t"
  174030. #elif defined(__clang__)
  174031. "adcs r3, %[r]\n\t"
  174032. #else
  174033. "adc r3, %[r]\n\t"
  174034. #endif
  174035. #ifdef WOLFSSL_KEIL
  174036. "adcs r4, r4, %[r]\n\t"
  174037. #elif defined(__clang__)
  174038. "adcs r4, %[r]\n\t"
  174039. #else
  174040. "adc r4, %[r]\n\t"
  174041. #endif
  174042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174043. "adds r2, r2, r6\n\t"
  174044. #else
  174045. "add r2, r2, r6\n\t"
  174046. #endif
  174047. #ifdef WOLFSSL_KEIL
  174048. "adcs r3, r3, %[r]\n\t"
  174049. #elif defined(__clang__)
  174050. "adcs r3, %[r]\n\t"
  174051. #else
  174052. "adc r3, %[r]\n\t"
  174053. #endif
  174054. #ifdef WOLFSSL_KEIL
  174055. "adcs r4, r4, %[r]\n\t"
  174056. #elif defined(__clang__)
  174057. "adcs r4, %[r]\n\t"
  174058. #else
  174059. "adc r4, %[r]\n\t"
  174060. #endif
  174061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174062. "lsrs r6, r7, #16\n\t"
  174063. #else
  174064. "lsr r6, r7, #16\n\t"
  174065. #endif
  174066. #ifdef WOLFSSL_KEIL
  174067. "muls r5, r6, r5\n\t"
  174068. #elif defined(__clang__)
  174069. "muls r5, r6\n\t"
  174070. #else
  174071. "mul r5, r6\n\t"
  174072. #endif
  174073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174074. "lsrs r6, r5, #16\n\t"
  174075. #else
  174076. "lsr r6, r5, #16\n\t"
  174077. #endif
  174078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174079. "lsls r5, r5, #16\n\t"
  174080. #else
  174081. "lsl r5, r5, #16\n\t"
  174082. #endif
  174083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174084. "adds r2, r2, r5\n\t"
  174085. #else
  174086. "add r2, r2, r5\n\t"
  174087. #endif
  174088. #ifdef WOLFSSL_KEIL
  174089. "adcs r3, r3, r6\n\t"
  174090. #elif defined(__clang__)
  174091. "adcs r3, r6\n\t"
  174092. #else
  174093. "adc r3, r6\n\t"
  174094. #endif
  174095. #ifdef WOLFSSL_KEIL
  174096. "adcs r4, r4, %[r]\n\t"
  174097. #elif defined(__clang__)
  174098. "adcs r4, %[r]\n\t"
  174099. #else
  174100. "adc r4, %[r]\n\t"
  174101. #endif
  174102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174103. "adds r2, r2, r5\n\t"
  174104. #else
  174105. "add r2, r2, r5\n\t"
  174106. #endif
  174107. #ifdef WOLFSSL_KEIL
  174108. "adcs r3, r3, r6\n\t"
  174109. #elif defined(__clang__)
  174110. "adcs r3, r6\n\t"
  174111. #else
  174112. "adc r3, r6\n\t"
  174113. #endif
  174114. #ifdef WOLFSSL_KEIL
  174115. "adcs r4, r4, %[r]\n\t"
  174116. #elif defined(__clang__)
  174117. "adcs r4, %[r]\n\t"
  174118. #else
  174119. "adc r4, %[r]\n\t"
  174120. #endif
  174121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174122. "lsrs r5, %[a], #16\n\t"
  174123. #else
  174124. "lsr r5, %[a], #16\n\t"
  174125. #endif
  174126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174127. "lsrs r6, r7, #16\n\t"
  174128. #else
  174129. "lsr r6, r7, #16\n\t"
  174130. #endif
  174131. #ifdef WOLFSSL_KEIL
  174132. "muls r6, r5, r6\n\t"
  174133. #elif defined(__clang__)
  174134. "muls r6, r5\n\t"
  174135. #else
  174136. "mul r6, r5\n\t"
  174137. #endif
  174138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174139. "adds r3, r3, r6\n\t"
  174140. #else
  174141. "add r3, r3, r6\n\t"
  174142. #endif
  174143. #ifdef WOLFSSL_KEIL
  174144. "adcs r4, r4, %[r]\n\t"
  174145. #elif defined(__clang__)
  174146. "adcs r4, %[r]\n\t"
  174147. #else
  174148. "adc r4, %[r]\n\t"
  174149. #endif
  174150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174151. "adds r3, r3, r6\n\t"
  174152. #else
  174153. "add r3, r3, r6\n\t"
  174154. #endif
  174155. #ifdef WOLFSSL_KEIL
  174156. "adcs r4, r4, %[r]\n\t"
  174157. #elif defined(__clang__)
  174158. "adcs r4, %[r]\n\t"
  174159. #else
  174160. "adc r4, %[r]\n\t"
  174161. #endif
  174162. "uxth r6, r7\n\t"
  174163. #ifdef WOLFSSL_KEIL
  174164. "muls r5, r6, r5\n\t"
  174165. #elif defined(__clang__)
  174166. "muls r5, r6\n\t"
  174167. #else
  174168. "mul r5, r6\n\t"
  174169. #endif
  174170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174171. "lsrs r6, r5, #16\n\t"
  174172. #else
  174173. "lsr r6, r5, #16\n\t"
  174174. #endif
  174175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174176. "lsls r5, r5, #16\n\t"
  174177. #else
  174178. "lsl r5, r5, #16\n\t"
  174179. #endif
  174180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174181. "adds r2, r2, r5\n\t"
  174182. #else
  174183. "add r2, r2, r5\n\t"
  174184. #endif
  174185. #ifdef WOLFSSL_KEIL
  174186. "adcs r3, r3, r6\n\t"
  174187. #elif defined(__clang__)
  174188. "adcs r3, r6\n\t"
  174189. #else
  174190. "adc r3, r6\n\t"
  174191. #endif
  174192. #ifdef WOLFSSL_KEIL
  174193. "adcs r4, r4, %[r]\n\t"
  174194. #elif defined(__clang__)
  174195. "adcs r4, %[r]\n\t"
  174196. #else
  174197. "adc r4, %[r]\n\t"
  174198. #endif
  174199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174200. "adds r2, r2, r5\n\t"
  174201. #else
  174202. "add r2, r2, r5\n\t"
  174203. #endif
  174204. #ifdef WOLFSSL_KEIL
  174205. "adcs r3, r3, r6\n\t"
  174206. #elif defined(__clang__)
  174207. "adcs r3, r6\n\t"
  174208. #else
  174209. "adc r3, r6\n\t"
  174210. #endif
  174211. #ifdef WOLFSSL_KEIL
  174212. "adcs r4, r4, %[r]\n\t"
  174213. #elif defined(__clang__)
  174214. "adcs r4, %[r]\n\t"
  174215. #else
  174216. "adc r4, %[r]\n\t"
  174217. #endif
  174218. "# A[14] * A[7]\n\t"
  174219. "mov %[a], r9\n\t"
  174220. "ldr r7, [%[a], #28]\n\t"
  174221. "mov %[a], r12\n\t"
  174222. "uxth r5, %[a]\n\t"
  174223. "uxth r6, r7\n\t"
  174224. #ifdef WOLFSSL_KEIL
  174225. "muls r6, r5, r6\n\t"
  174226. #elif defined(__clang__)
  174227. "muls r6, r5\n\t"
  174228. #else
  174229. "mul r6, r5\n\t"
  174230. #endif
  174231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174232. "adds r2, r2, r6\n\t"
  174233. #else
  174234. "add r2, r2, r6\n\t"
  174235. #endif
  174236. #ifdef WOLFSSL_KEIL
  174237. "adcs r3, r3, %[r]\n\t"
  174238. #elif defined(__clang__)
  174239. "adcs r3, %[r]\n\t"
  174240. #else
  174241. "adc r3, %[r]\n\t"
  174242. #endif
  174243. #ifdef WOLFSSL_KEIL
  174244. "adcs r4, r4, %[r]\n\t"
  174245. #elif defined(__clang__)
  174246. "adcs r4, %[r]\n\t"
  174247. #else
  174248. "adc r4, %[r]\n\t"
  174249. #endif
  174250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174251. "adds r2, r2, r6\n\t"
  174252. #else
  174253. "add r2, r2, r6\n\t"
  174254. #endif
  174255. #ifdef WOLFSSL_KEIL
  174256. "adcs r3, r3, %[r]\n\t"
  174257. #elif defined(__clang__)
  174258. "adcs r3, %[r]\n\t"
  174259. #else
  174260. "adc r3, %[r]\n\t"
  174261. #endif
  174262. #ifdef WOLFSSL_KEIL
  174263. "adcs r4, r4, %[r]\n\t"
  174264. #elif defined(__clang__)
  174265. "adcs r4, %[r]\n\t"
  174266. #else
  174267. "adc r4, %[r]\n\t"
  174268. #endif
  174269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174270. "lsrs r6, r7, #16\n\t"
  174271. #else
  174272. "lsr r6, r7, #16\n\t"
  174273. #endif
  174274. #ifdef WOLFSSL_KEIL
  174275. "muls r5, r6, r5\n\t"
  174276. #elif defined(__clang__)
  174277. "muls r5, r6\n\t"
  174278. #else
  174279. "mul r5, r6\n\t"
  174280. #endif
  174281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174282. "lsrs r6, r5, #16\n\t"
  174283. #else
  174284. "lsr r6, r5, #16\n\t"
  174285. #endif
  174286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174287. "lsls r5, r5, #16\n\t"
  174288. #else
  174289. "lsl r5, r5, #16\n\t"
  174290. #endif
  174291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174292. "adds r2, r2, r5\n\t"
  174293. #else
  174294. "add r2, r2, r5\n\t"
  174295. #endif
  174296. #ifdef WOLFSSL_KEIL
  174297. "adcs r3, r3, r6\n\t"
  174298. #elif defined(__clang__)
  174299. "adcs r3, r6\n\t"
  174300. #else
  174301. "adc r3, r6\n\t"
  174302. #endif
  174303. #ifdef WOLFSSL_KEIL
  174304. "adcs r4, r4, %[r]\n\t"
  174305. #elif defined(__clang__)
  174306. "adcs r4, %[r]\n\t"
  174307. #else
  174308. "adc r4, %[r]\n\t"
  174309. #endif
  174310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174311. "adds r2, r2, r5\n\t"
  174312. #else
  174313. "add r2, r2, r5\n\t"
  174314. #endif
  174315. #ifdef WOLFSSL_KEIL
  174316. "adcs r3, r3, r6\n\t"
  174317. #elif defined(__clang__)
  174318. "adcs r3, r6\n\t"
  174319. #else
  174320. "adc r3, r6\n\t"
  174321. #endif
  174322. #ifdef WOLFSSL_KEIL
  174323. "adcs r4, r4, %[r]\n\t"
  174324. #elif defined(__clang__)
  174325. "adcs r4, %[r]\n\t"
  174326. #else
  174327. "adc r4, %[r]\n\t"
  174328. #endif
  174329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174330. "lsrs r5, %[a], #16\n\t"
  174331. #else
  174332. "lsr r5, %[a], #16\n\t"
  174333. #endif
  174334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174335. "lsrs r6, r7, #16\n\t"
  174336. #else
  174337. "lsr r6, r7, #16\n\t"
  174338. #endif
  174339. #ifdef WOLFSSL_KEIL
  174340. "muls r6, r5, r6\n\t"
  174341. #elif defined(__clang__)
  174342. "muls r6, r5\n\t"
  174343. #else
  174344. "mul r6, r5\n\t"
  174345. #endif
  174346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174347. "adds r3, r3, r6\n\t"
  174348. #else
  174349. "add r3, r3, r6\n\t"
  174350. #endif
  174351. #ifdef WOLFSSL_KEIL
  174352. "adcs r4, r4, %[r]\n\t"
  174353. #elif defined(__clang__)
  174354. "adcs r4, %[r]\n\t"
  174355. #else
  174356. "adc r4, %[r]\n\t"
  174357. #endif
  174358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174359. "adds r3, r3, r6\n\t"
  174360. #else
  174361. "add r3, r3, r6\n\t"
  174362. #endif
  174363. #ifdef WOLFSSL_KEIL
  174364. "adcs r4, r4, %[r]\n\t"
  174365. #elif defined(__clang__)
  174366. "adcs r4, %[r]\n\t"
  174367. #else
  174368. "adc r4, %[r]\n\t"
  174369. #endif
  174370. "uxth r6, r7\n\t"
  174371. #ifdef WOLFSSL_KEIL
  174372. "muls r5, r6, r5\n\t"
  174373. #elif defined(__clang__)
  174374. "muls r5, r6\n\t"
  174375. #else
  174376. "mul r5, r6\n\t"
  174377. #endif
  174378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174379. "lsrs r6, r5, #16\n\t"
  174380. #else
  174381. "lsr r6, r5, #16\n\t"
  174382. #endif
  174383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174384. "lsls r5, r5, #16\n\t"
  174385. #else
  174386. "lsl r5, r5, #16\n\t"
  174387. #endif
  174388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174389. "adds r2, r2, r5\n\t"
  174390. #else
  174391. "add r2, r2, r5\n\t"
  174392. #endif
  174393. #ifdef WOLFSSL_KEIL
  174394. "adcs r3, r3, r6\n\t"
  174395. #elif defined(__clang__)
  174396. "adcs r3, r6\n\t"
  174397. #else
  174398. "adc r3, r6\n\t"
  174399. #endif
  174400. #ifdef WOLFSSL_KEIL
  174401. "adcs r4, r4, %[r]\n\t"
  174402. #elif defined(__clang__)
  174403. "adcs r4, %[r]\n\t"
  174404. #else
  174405. "adc r4, %[r]\n\t"
  174406. #endif
  174407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174408. "adds r2, r2, r5\n\t"
  174409. #else
  174410. "add r2, r2, r5\n\t"
  174411. #endif
  174412. #ifdef WOLFSSL_KEIL
  174413. "adcs r3, r3, r6\n\t"
  174414. #elif defined(__clang__)
  174415. "adcs r3, r6\n\t"
  174416. #else
  174417. "adc r3, r6\n\t"
  174418. #endif
  174419. #ifdef WOLFSSL_KEIL
  174420. "adcs r4, r4, %[r]\n\t"
  174421. #elif defined(__clang__)
  174422. "adcs r4, %[r]\n\t"
  174423. #else
  174424. "adc r4, %[r]\n\t"
  174425. #endif
  174426. "# A[15] * A[6]\n\t"
  174427. "mov %[a], r9\n\t"
  174428. "ldr r7, [%[a], #24]\n\t"
  174429. "mov %[a], lr\n\t"
  174430. "uxth r5, %[a]\n\t"
  174431. "uxth r6, r7\n\t"
  174432. #ifdef WOLFSSL_KEIL
  174433. "muls r6, r5, r6\n\t"
  174434. #elif defined(__clang__)
  174435. "muls r6, r5\n\t"
  174436. #else
  174437. "mul r6, r5\n\t"
  174438. #endif
  174439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174440. "adds r2, r2, r6\n\t"
  174441. #else
  174442. "add r2, r2, r6\n\t"
  174443. #endif
  174444. #ifdef WOLFSSL_KEIL
  174445. "adcs r3, r3, %[r]\n\t"
  174446. #elif defined(__clang__)
  174447. "adcs r3, %[r]\n\t"
  174448. #else
  174449. "adc r3, %[r]\n\t"
  174450. #endif
  174451. #ifdef WOLFSSL_KEIL
  174452. "adcs r4, r4, %[r]\n\t"
  174453. #elif defined(__clang__)
  174454. "adcs r4, %[r]\n\t"
  174455. #else
  174456. "adc r4, %[r]\n\t"
  174457. #endif
  174458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174459. "adds r2, r2, r6\n\t"
  174460. #else
  174461. "add r2, r2, r6\n\t"
  174462. #endif
  174463. #ifdef WOLFSSL_KEIL
  174464. "adcs r3, r3, %[r]\n\t"
  174465. #elif defined(__clang__)
  174466. "adcs r3, %[r]\n\t"
  174467. #else
  174468. "adc r3, %[r]\n\t"
  174469. #endif
  174470. #ifdef WOLFSSL_KEIL
  174471. "adcs r4, r4, %[r]\n\t"
  174472. #elif defined(__clang__)
  174473. "adcs r4, %[r]\n\t"
  174474. #else
  174475. "adc r4, %[r]\n\t"
  174476. #endif
  174477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174478. "lsrs r6, r7, #16\n\t"
  174479. #else
  174480. "lsr r6, r7, #16\n\t"
  174481. #endif
  174482. #ifdef WOLFSSL_KEIL
  174483. "muls r5, r6, r5\n\t"
  174484. #elif defined(__clang__)
  174485. "muls r5, r6\n\t"
  174486. #else
  174487. "mul r5, r6\n\t"
  174488. #endif
  174489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174490. "lsrs r6, r5, #16\n\t"
  174491. #else
  174492. "lsr r6, r5, #16\n\t"
  174493. #endif
  174494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174495. "lsls r5, r5, #16\n\t"
  174496. #else
  174497. "lsl r5, r5, #16\n\t"
  174498. #endif
  174499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174500. "adds r2, r2, r5\n\t"
  174501. #else
  174502. "add r2, r2, r5\n\t"
  174503. #endif
  174504. #ifdef WOLFSSL_KEIL
  174505. "adcs r3, r3, r6\n\t"
  174506. #elif defined(__clang__)
  174507. "adcs r3, r6\n\t"
  174508. #else
  174509. "adc r3, r6\n\t"
  174510. #endif
  174511. #ifdef WOLFSSL_KEIL
  174512. "adcs r4, r4, %[r]\n\t"
  174513. #elif defined(__clang__)
  174514. "adcs r4, %[r]\n\t"
  174515. #else
  174516. "adc r4, %[r]\n\t"
  174517. #endif
  174518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174519. "adds r2, r2, r5\n\t"
  174520. #else
  174521. "add r2, r2, r5\n\t"
  174522. #endif
  174523. #ifdef WOLFSSL_KEIL
  174524. "adcs r3, r3, r6\n\t"
  174525. #elif defined(__clang__)
  174526. "adcs r3, r6\n\t"
  174527. #else
  174528. "adc r3, r6\n\t"
  174529. #endif
  174530. #ifdef WOLFSSL_KEIL
  174531. "adcs r4, r4, %[r]\n\t"
  174532. #elif defined(__clang__)
  174533. "adcs r4, %[r]\n\t"
  174534. #else
  174535. "adc r4, %[r]\n\t"
  174536. #endif
  174537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174538. "lsrs r5, %[a], #16\n\t"
  174539. #else
  174540. "lsr r5, %[a], #16\n\t"
  174541. #endif
  174542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174543. "lsrs r6, r7, #16\n\t"
  174544. #else
  174545. "lsr r6, r7, #16\n\t"
  174546. #endif
  174547. #ifdef WOLFSSL_KEIL
  174548. "muls r6, r5, r6\n\t"
  174549. #elif defined(__clang__)
  174550. "muls r6, r5\n\t"
  174551. #else
  174552. "mul r6, r5\n\t"
  174553. #endif
  174554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174555. "adds r3, r3, r6\n\t"
  174556. #else
  174557. "add r3, r3, r6\n\t"
  174558. #endif
  174559. #ifdef WOLFSSL_KEIL
  174560. "adcs r4, r4, %[r]\n\t"
  174561. #elif defined(__clang__)
  174562. "adcs r4, %[r]\n\t"
  174563. #else
  174564. "adc r4, %[r]\n\t"
  174565. #endif
  174566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174567. "adds r3, r3, r6\n\t"
  174568. #else
  174569. "add r3, r3, r6\n\t"
  174570. #endif
  174571. #ifdef WOLFSSL_KEIL
  174572. "adcs r4, r4, %[r]\n\t"
  174573. #elif defined(__clang__)
  174574. "adcs r4, %[r]\n\t"
  174575. #else
  174576. "adc r4, %[r]\n\t"
  174577. #endif
  174578. "uxth r6, r7\n\t"
  174579. #ifdef WOLFSSL_KEIL
  174580. "muls r5, r6, r5\n\t"
  174581. #elif defined(__clang__)
  174582. "muls r5, r6\n\t"
  174583. #else
  174584. "mul r5, r6\n\t"
  174585. #endif
  174586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174587. "lsrs r6, r5, #16\n\t"
  174588. #else
  174589. "lsr r6, r5, #16\n\t"
  174590. #endif
  174591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174592. "lsls r5, r5, #16\n\t"
  174593. #else
  174594. "lsl r5, r5, #16\n\t"
  174595. #endif
  174596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174597. "adds r2, r2, r5\n\t"
  174598. #else
  174599. "add r2, r2, r5\n\t"
  174600. #endif
  174601. #ifdef WOLFSSL_KEIL
  174602. "adcs r3, r3, r6\n\t"
  174603. #elif defined(__clang__)
  174604. "adcs r3, r6\n\t"
  174605. #else
  174606. "adc r3, r6\n\t"
  174607. #endif
  174608. #ifdef WOLFSSL_KEIL
  174609. "adcs r4, r4, %[r]\n\t"
  174610. #elif defined(__clang__)
  174611. "adcs r4, %[r]\n\t"
  174612. #else
  174613. "adc r4, %[r]\n\t"
  174614. #endif
  174615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174616. "adds r2, r2, r5\n\t"
  174617. #else
  174618. "add r2, r2, r5\n\t"
  174619. #endif
  174620. #ifdef WOLFSSL_KEIL
  174621. "adcs r3, r3, r6\n\t"
  174622. #elif defined(__clang__)
  174623. "adcs r3, r6\n\t"
  174624. #else
  174625. "adc r3, r6\n\t"
  174626. #endif
  174627. #ifdef WOLFSSL_KEIL
  174628. "adcs r4, r4, %[r]\n\t"
  174629. #elif defined(__clang__)
  174630. "adcs r4, %[r]\n\t"
  174631. #else
  174632. "adc r4, %[r]\n\t"
  174633. #endif
  174634. "mov %[r], r8\n\t"
  174635. "str r2, [%[r], #84]\n\t"
  174636. "movs %[r], #0\n\t"
  174637. "# A[15] * A[7]\n\t"
  174638. "movs r2, #0\n\t"
  174639. "mov %[a], r9\n\t"
  174640. "ldr r7, [%[a], #28]\n\t"
  174641. "mov %[a], lr\n\t"
  174642. "uxth r5, %[a]\n\t"
  174643. "uxth r6, r7\n\t"
  174644. #ifdef WOLFSSL_KEIL
  174645. "muls r6, r5, r6\n\t"
  174646. #elif defined(__clang__)
  174647. "muls r6, r5\n\t"
  174648. #else
  174649. "mul r6, r5\n\t"
  174650. #endif
  174651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174652. "adds r3, r3, r6\n\t"
  174653. #else
  174654. "add r3, r3, r6\n\t"
  174655. #endif
  174656. #ifdef WOLFSSL_KEIL
  174657. "adcs r4, r4, %[r]\n\t"
  174658. #elif defined(__clang__)
  174659. "adcs r4, %[r]\n\t"
  174660. #else
  174661. "adc r4, %[r]\n\t"
  174662. #endif
  174663. #ifdef WOLFSSL_KEIL
  174664. "adcs r2, r2, %[r]\n\t"
  174665. #elif defined(__clang__)
  174666. "adcs r2, %[r]\n\t"
  174667. #else
  174668. "adc r2, %[r]\n\t"
  174669. #endif
  174670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174671. "adds r3, r3, r6\n\t"
  174672. #else
  174673. "add r3, r3, r6\n\t"
  174674. #endif
  174675. #ifdef WOLFSSL_KEIL
  174676. "adcs r4, r4, %[r]\n\t"
  174677. #elif defined(__clang__)
  174678. "adcs r4, %[r]\n\t"
  174679. #else
  174680. "adc r4, %[r]\n\t"
  174681. #endif
  174682. #ifdef WOLFSSL_KEIL
  174683. "adcs r2, r2, %[r]\n\t"
  174684. #elif defined(__clang__)
  174685. "adcs r2, %[r]\n\t"
  174686. #else
  174687. "adc r2, %[r]\n\t"
  174688. #endif
  174689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174690. "lsrs r6, r7, #16\n\t"
  174691. #else
  174692. "lsr r6, r7, #16\n\t"
  174693. #endif
  174694. #ifdef WOLFSSL_KEIL
  174695. "muls r5, r6, r5\n\t"
  174696. #elif defined(__clang__)
  174697. "muls r5, r6\n\t"
  174698. #else
  174699. "mul r5, r6\n\t"
  174700. #endif
  174701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174702. "lsrs r6, r5, #16\n\t"
  174703. #else
  174704. "lsr r6, r5, #16\n\t"
  174705. #endif
  174706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174707. "lsls r5, r5, #16\n\t"
  174708. #else
  174709. "lsl r5, r5, #16\n\t"
  174710. #endif
  174711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174712. "adds r3, r3, r5\n\t"
  174713. #else
  174714. "add r3, r3, r5\n\t"
  174715. #endif
  174716. #ifdef WOLFSSL_KEIL
  174717. "adcs r4, r4, r6\n\t"
  174718. #elif defined(__clang__)
  174719. "adcs r4, r6\n\t"
  174720. #else
  174721. "adc r4, r6\n\t"
  174722. #endif
  174723. #ifdef WOLFSSL_KEIL
  174724. "adcs r2, r2, %[r]\n\t"
  174725. #elif defined(__clang__)
  174726. "adcs r2, %[r]\n\t"
  174727. #else
  174728. "adc r2, %[r]\n\t"
  174729. #endif
  174730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174731. "adds r3, r3, r5\n\t"
  174732. #else
  174733. "add r3, r3, r5\n\t"
  174734. #endif
  174735. #ifdef WOLFSSL_KEIL
  174736. "adcs r4, r4, r6\n\t"
  174737. #elif defined(__clang__)
  174738. "adcs r4, r6\n\t"
  174739. #else
  174740. "adc r4, r6\n\t"
  174741. #endif
  174742. #ifdef WOLFSSL_KEIL
  174743. "adcs r2, r2, %[r]\n\t"
  174744. #elif defined(__clang__)
  174745. "adcs r2, %[r]\n\t"
  174746. #else
  174747. "adc r2, %[r]\n\t"
  174748. #endif
  174749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174750. "lsrs r5, %[a], #16\n\t"
  174751. #else
  174752. "lsr r5, %[a], #16\n\t"
  174753. #endif
  174754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174755. "lsrs r6, r7, #16\n\t"
  174756. #else
  174757. "lsr r6, r7, #16\n\t"
  174758. #endif
  174759. #ifdef WOLFSSL_KEIL
  174760. "muls r6, r5, r6\n\t"
  174761. #elif defined(__clang__)
  174762. "muls r6, r5\n\t"
  174763. #else
  174764. "mul r6, r5\n\t"
  174765. #endif
  174766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174767. "adds r4, r4, r6\n\t"
  174768. #else
  174769. "add r4, r4, r6\n\t"
  174770. #endif
  174771. #ifdef WOLFSSL_KEIL
  174772. "adcs r2, r2, %[r]\n\t"
  174773. #elif defined(__clang__)
  174774. "adcs r2, %[r]\n\t"
  174775. #else
  174776. "adc r2, %[r]\n\t"
  174777. #endif
  174778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174779. "adds r4, r4, r6\n\t"
  174780. #else
  174781. "add r4, r4, r6\n\t"
  174782. #endif
  174783. #ifdef WOLFSSL_KEIL
  174784. "adcs r2, r2, %[r]\n\t"
  174785. #elif defined(__clang__)
  174786. "adcs r2, %[r]\n\t"
  174787. #else
  174788. "adc r2, %[r]\n\t"
  174789. #endif
  174790. "uxth r6, r7\n\t"
  174791. #ifdef WOLFSSL_KEIL
  174792. "muls r5, r6, r5\n\t"
  174793. #elif defined(__clang__)
  174794. "muls r5, r6\n\t"
  174795. #else
  174796. "mul r5, r6\n\t"
  174797. #endif
  174798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174799. "lsrs r6, r5, #16\n\t"
  174800. #else
  174801. "lsr r6, r5, #16\n\t"
  174802. #endif
  174803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174804. "lsls r5, r5, #16\n\t"
  174805. #else
  174806. "lsl r5, r5, #16\n\t"
  174807. #endif
  174808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174809. "adds r3, r3, r5\n\t"
  174810. #else
  174811. "add r3, r3, r5\n\t"
  174812. #endif
  174813. #ifdef WOLFSSL_KEIL
  174814. "adcs r4, r4, r6\n\t"
  174815. #elif defined(__clang__)
  174816. "adcs r4, r6\n\t"
  174817. #else
  174818. "adc r4, r6\n\t"
  174819. #endif
  174820. #ifdef WOLFSSL_KEIL
  174821. "adcs r2, r2, %[r]\n\t"
  174822. #elif defined(__clang__)
  174823. "adcs r2, %[r]\n\t"
  174824. #else
  174825. "adc r2, %[r]\n\t"
  174826. #endif
  174827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174828. "adds r3, r3, r5\n\t"
  174829. #else
  174830. "add r3, r3, r5\n\t"
  174831. #endif
  174832. #ifdef WOLFSSL_KEIL
  174833. "adcs r4, r4, r6\n\t"
  174834. #elif defined(__clang__)
  174835. "adcs r4, r6\n\t"
  174836. #else
  174837. "adc r4, r6\n\t"
  174838. #endif
  174839. #ifdef WOLFSSL_KEIL
  174840. "adcs r2, r2, %[r]\n\t"
  174841. #elif defined(__clang__)
  174842. "adcs r2, %[r]\n\t"
  174843. #else
  174844. "adc r2, %[r]\n\t"
  174845. #endif
  174846. "# A[14] * A[8]\n\t"
  174847. "mov %[a], r9\n\t"
  174848. "ldr r7, [%[a], #32]\n\t"
  174849. "mov %[a], r12\n\t"
  174850. "uxth r5, %[a]\n\t"
  174851. "uxth r6, r7\n\t"
  174852. #ifdef WOLFSSL_KEIL
  174853. "muls r6, r5, r6\n\t"
  174854. #elif defined(__clang__)
  174855. "muls r6, r5\n\t"
  174856. #else
  174857. "mul r6, r5\n\t"
  174858. #endif
  174859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174860. "adds r3, r3, r6\n\t"
  174861. #else
  174862. "add r3, r3, r6\n\t"
  174863. #endif
  174864. #ifdef WOLFSSL_KEIL
  174865. "adcs r4, r4, %[r]\n\t"
  174866. #elif defined(__clang__)
  174867. "adcs r4, %[r]\n\t"
  174868. #else
  174869. "adc r4, %[r]\n\t"
  174870. #endif
  174871. #ifdef WOLFSSL_KEIL
  174872. "adcs r2, r2, %[r]\n\t"
  174873. #elif defined(__clang__)
  174874. "adcs r2, %[r]\n\t"
  174875. #else
  174876. "adc r2, %[r]\n\t"
  174877. #endif
  174878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174879. "adds r3, r3, r6\n\t"
  174880. #else
  174881. "add r3, r3, r6\n\t"
  174882. #endif
  174883. #ifdef WOLFSSL_KEIL
  174884. "adcs r4, r4, %[r]\n\t"
  174885. #elif defined(__clang__)
  174886. "adcs r4, %[r]\n\t"
  174887. #else
  174888. "adc r4, %[r]\n\t"
  174889. #endif
  174890. #ifdef WOLFSSL_KEIL
  174891. "adcs r2, r2, %[r]\n\t"
  174892. #elif defined(__clang__)
  174893. "adcs r2, %[r]\n\t"
  174894. #else
  174895. "adc r2, %[r]\n\t"
  174896. #endif
  174897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174898. "lsrs r6, r7, #16\n\t"
  174899. #else
  174900. "lsr r6, r7, #16\n\t"
  174901. #endif
  174902. #ifdef WOLFSSL_KEIL
  174903. "muls r5, r6, r5\n\t"
  174904. #elif defined(__clang__)
  174905. "muls r5, r6\n\t"
  174906. #else
  174907. "mul r5, r6\n\t"
  174908. #endif
  174909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174910. "lsrs r6, r5, #16\n\t"
  174911. #else
  174912. "lsr r6, r5, #16\n\t"
  174913. #endif
  174914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174915. "lsls r5, r5, #16\n\t"
  174916. #else
  174917. "lsl r5, r5, #16\n\t"
  174918. #endif
  174919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174920. "adds r3, r3, r5\n\t"
  174921. #else
  174922. "add r3, r3, r5\n\t"
  174923. #endif
  174924. #ifdef WOLFSSL_KEIL
  174925. "adcs r4, r4, r6\n\t"
  174926. #elif defined(__clang__)
  174927. "adcs r4, r6\n\t"
  174928. #else
  174929. "adc r4, r6\n\t"
  174930. #endif
  174931. #ifdef WOLFSSL_KEIL
  174932. "adcs r2, r2, %[r]\n\t"
  174933. #elif defined(__clang__)
  174934. "adcs r2, %[r]\n\t"
  174935. #else
  174936. "adc r2, %[r]\n\t"
  174937. #endif
  174938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174939. "adds r3, r3, r5\n\t"
  174940. #else
  174941. "add r3, r3, r5\n\t"
  174942. #endif
  174943. #ifdef WOLFSSL_KEIL
  174944. "adcs r4, r4, r6\n\t"
  174945. #elif defined(__clang__)
  174946. "adcs r4, r6\n\t"
  174947. #else
  174948. "adc r4, r6\n\t"
  174949. #endif
  174950. #ifdef WOLFSSL_KEIL
  174951. "adcs r2, r2, %[r]\n\t"
  174952. #elif defined(__clang__)
  174953. "adcs r2, %[r]\n\t"
  174954. #else
  174955. "adc r2, %[r]\n\t"
  174956. #endif
  174957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174958. "lsrs r5, %[a], #16\n\t"
  174959. #else
  174960. "lsr r5, %[a], #16\n\t"
  174961. #endif
  174962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174963. "lsrs r6, r7, #16\n\t"
  174964. #else
  174965. "lsr r6, r7, #16\n\t"
  174966. #endif
  174967. #ifdef WOLFSSL_KEIL
  174968. "muls r6, r5, r6\n\t"
  174969. #elif defined(__clang__)
  174970. "muls r6, r5\n\t"
  174971. #else
  174972. "mul r6, r5\n\t"
  174973. #endif
  174974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174975. "adds r4, r4, r6\n\t"
  174976. #else
  174977. "add r4, r4, r6\n\t"
  174978. #endif
  174979. #ifdef WOLFSSL_KEIL
  174980. "adcs r2, r2, %[r]\n\t"
  174981. #elif defined(__clang__)
  174982. "adcs r2, %[r]\n\t"
  174983. #else
  174984. "adc r2, %[r]\n\t"
  174985. #endif
  174986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174987. "adds r4, r4, r6\n\t"
  174988. #else
  174989. "add r4, r4, r6\n\t"
  174990. #endif
  174991. #ifdef WOLFSSL_KEIL
  174992. "adcs r2, r2, %[r]\n\t"
  174993. #elif defined(__clang__)
  174994. "adcs r2, %[r]\n\t"
  174995. #else
  174996. "adc r2, %[r]\n\t"
  174997. #endif
  174998. "uxth r6, r7\n\t"
  174999. #ifdef WOLFSSL_KEIL
  175000. "muls r5, r6, r5\n\t"
  175001. #elif defined(__clang__)
  175002. "muls r5, r6\n\t"
  175003. #else
  175004. "mul r5, r6\n\t"
  175005. #endif
  175006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175007. "lsrs r6, r5, #16\n\t"
  175008. #else
  175009. "lsr r6, r5, #16\n\t"
  175010. #endif
  175011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175012. "lsls r5, r5, #16\n\t"
  175013. #else
  175014. "lsl r5, r5, #16\n\t"
  175015. #endif
  175016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175017. "adds r3, r3, r5\n\t"
  175018. #else
  175019. "add r3, r3, r5\n\t"
  175020. #endif
  175021. #ifdef WOLFSSL_KEIL
  175022. "adcs r4, r4, r6\n\t"
  175023. #elif defined(__clang__)
  175024. "adcs r4, r6\n\t"
  175025. #else
  175026. "adc r4, r6\n\t"
  175027. #endif
  175028. #ifdef WOLFSSL_KEIL
  175029. "adcs r2, r2, %[r]\n\t"
  175030. #elif defined(__clang__)
  175031. "adcs r2, %[r]\n\t"
  175032. #else
  175033. "adc r2, %[r]\n\t"
  175034. #endif
  175035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175036. "adds r3, r3, r5\n\t"
  175037. #else
  175038. "add r3, r3, r5\n\t"
  175039. #endif
  175040. #ifdef WOLFSSL_KEIL
  175041. "adcs r4, r4, r6\n\t"
  175042. #elif defined(__clang__)
  175043. "adcs r4, r6\n\t"
  175044. #else
  175045. "adc r4, r6\n\t"
  175046. #endif
  175047. #ifdef WOLFSSL_KEIL
  175048. "adcs r2, r2, %[r]\n\t"
  175049. #elif defined(__clang__)
  175050. "adcs r2, %[r]\n\t"
  175051. #else
  175052. "adc r2, %[r]\n\t"
  175053. #endif
  175054. "# A[13] * A[9]\n\t"
  175055. "mov %[a], r9\n\t"
  175056. "ldr r7, [%[a], #36]\n\t"
  175057. "mov %[a], r11\n\t"
  175058. "uxth r5, %[a]\n\t"
  175059. "uxth r6, r7\n\t"
  175060. #ifdef WOLFSSL_KEIL
  175061. "muls r6, r5, r6\n\t"
  175062. #elif defined(__clang__)
  175063. "muls r6, r5\n\t"
  175064. #else
  175065. "mul r6, r5\n\t"
  175066. #endif
  175067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175068. "adds r3, r3, r6\n\t"
  175069. #else
  175070. "add r3, r3, r6\n\t"
  175071. #endif
  175072. #ifdef WOLFSSL_KEIL
  175073. "adcs r4, r4, %[r]\n\t"
  175074. #elif defined(__clang__)
  175075. "adcs r4, %[r]\n\t"
  175076. #else
  175077. "adc r4, %[r]\n\t"
  175078. #endif
  175079. #ifdef WOLFSSL_KEIL
  175080. "adcs r2, r2, %[r]\n\t"
  175081. #elif defined(__clang__)
  175082. "adcs r2, %[r]\n\t"
  175083. #else
  175084. "adc r2, %[r]\n\t"
  175085. #endif
  175086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175087. "adds r3, r3, r6\n\t"
  175088. #else
  175089. "add r3, r3, r6\n\t"
  175090. #endif
  175091. #ifdef WOLFSSL_KEIL
  175092. "adcs r4, r4, %[r]\n\t"
  175093. #elif defined(__clang__)
  175094. "adcs r4, %[r]\n\t"
  175095. #else
  175096. "adc r4, %[r]\n\t"
  175097. #endif
  175098. #ifdef WOLFSSL_KEIL
  175099. "adcs r2, r2, %[r]\n\t"
  175100. #elif defined(__clang__)
  175101. "adcs r2, %[r]\n\t"
  175102. #else
  175103. "adc r2, %[r]\n\t"
  175104. #endif
  175105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175106. "lsrs r6, r7, #16\n\t"
  175107. #else
  175108. "lsr r6, r7, #16\n\t"
  175109. #endif
  175110. #ifdef WOLFSSL_KEIL
  175111. "muls r5, r6, r5\n\t"
  175112. #elif defined(__clang__)
  175113. "muls r5, r6\n\t"
  175114. #else
  175115. "mul r5, r6\n\t"
  175116. #endif
  175117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175118. "lsrs r6, r5, #16\n\t"
  175119. #else
  175120. "lsr r6, r5, #16\n\t"
  175121. #endif
  175122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175123. "lsls r5, r5, #16\n\t"
  175124. #else
  175125. "lsl r5, r5, #16\n\t"
  175126. #endif
  175127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175128. "adds r3, r3, r5\n\t"
  175129. #else
  175130. "add r3, r3, r5\n\t"
  175131. #endif
  175132. #ifdef WOLFSSL_KEIL
  175133. "adcs r4, r4, r6\n\t"
  175134. #elif defined(__clang__)
  175135. "adcs r4, r6\n\t"
  175136. #else
  175137. "adc r4, r6\n\t"
  175138. #endif
  175139. #ifdef WOLFSSL_KEIL
  175140. "adcs r2, r2, %[r]\n\t"
  175141. #elif defined(__clang__)
  175142. "adcs r2, %[r]\n\t"
  175143. #else
  175144. "adc r2, %[r]\n\t"
  175145. #endif
  175146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175147. "adds r3, r3, r5\n\t"
  175148. #else
  175149. "add r3, r3, r5\n\t"
  175150. #endif
  175151. #ifdef WOLFSSL_KEIL
  175152. "adcs r4, r4, r6\n\t"
  175153. #elif defined(__clang__)
  175154. "adcs r4, r6\n\t"
  175155. #else
  175156. "adc r4, r6\n\t"
  175157. #endif
  175158. #ifdef WOLFSSL_KEIL
  175159. "adcs r2, r2, %[r]\n\t"
  175160. #elif defined(__clang__)
  175161. "adcs r2, %[r]\n\t"
  175162. #else
  175163. "adc r2, %[r]\n\t"
  175164. #endif
  175165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175166. "lsrs r5, %[a], #16\n\t"
  175167. #else
  175168. "lsr r5, %[a], #16\n\t"
  175169. #endif
  175170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175171. "lsrs r6, r7, #16\n\t"
  175172. #else
  175173. "lsr r6, r7, #16\n\t"
  175174. #endif
  175175. #ifdef WOLFSSL_KEIL
  175176. "muls r6, r5, r6\n\t"
  175177. #elif defined(__clang__)
  175178. "muls r6, r5\n\t"
  175179. #else
  175180. "mul r6, r5\n\t"
  175181. #endif
  175182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175183. "adds r4, r4, r6\n\t"
  175184. #else
  175185. "add r4, r4, r6\n\t"
  175186. #endif
  175187. #ifdef WOLFSSL_KEIL
  175188. "adcs r2, r2, %[r]\n\t"
  175189. #elif defined(__clang__)
  175190. "adcs r2, %[r]\n\t"
  175191. #else
  175192. "adc r2, %[r]\n\t"
  175193. #endif
  175194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175195. "adds r4, r4, r6\n\t"
  175196. #else
  175197. "add r4, r4, r6\n\t"
  175198. #endif
  175199. #ifdef WOLFSSL_KEIL
  175200. "adcs r2, r2, %[r]\n\t"
  175201. #elif defined(__clang__)
  175202. "adcs r2, %[r]\n\t"
  175203. #else
  175204. "adc r2, %[r]\n\t"
  175205. #endif
  175206. "uxth r6, r7\n\t"
  175207. #ifdef WOLFSSL_KEIL
  175208. "muls r5, r6, r5\n\t"
  175209. #elif defined(__clang__)
  175210. "muls r5, r6\n\t"
  175211. #else
  175212. "mul r5, r6\n\t"
  175213. #endif
  175214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175215. "lsrs r6, r5, #16\n\t"
  175216. #else
  175217. "lsr r6, r5, #16\n\t"
  175218. #endif
  175219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175220. "lsls r5, r5, #16\n\t"
  175221. #else
  175222. "lsl r5, r5, #16\n\t"
  175223. #endif
  175224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175225. "adds r3, r3, r5\n\t"
  175226. #else
  175227. "add r3, r3, r5\n\t"
  175228. #endif
  175229. #ifdef WOLFSSL_KEIL
  175230. "adcs r4, r4, r6\n\t"
  175231. #elif defined(__clang__)
  175232. "adcs r4, r6\n\t"
  175233. #else
  175234. "adc r4, r6\n\t"
  175235. #endif
  175236. #ifdef WOLFSSL_KEIL
  175237. "adcs r2, r2, %[r]\n\t"
  175238. #elif defined(__clang__)
  175239. "adcs r2, %[r]\n\t"
  175240. #else
  175241. "adc r2, %[r]\n\t"
  175242. #endif
  175243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175244. "adds r3, r3, r5\n\t"
  175245. #else
  175246. "add r3, r3, r5\n\t"
  175247. #endif
  175248. #ifdef WOLFSSL_KEIL
  175249. "adcs r4, r4, r6\n\t"
  175250. #elif defined(__clang__)
  175251. "adcs r4, r6\n\t"
  175252. #else
  175253. "adc r4, r6\n\t"
  175254. #endif
  175255. #ifdef WOLFSSL_KEIL
  175256. "adcs r2, r2, %[r]\n\t"
  175257. #elif defined(__clang__)
  175258. "adcs r2, %[r]\n\t"
  175259. #else
  175260. "adc r2, %[r]\n\t"
  175261. #endif
  175262. "# A[12] * A[10]\n\t"
  175263. "mov %[a], r9\n\t"
  175264. "ldr r7, [%[a], #40]\n\t"
  175265. "mov %[a], r10\n\t"
  175266. "uxth r5, %[a]\n\t"
  175267. "uxth r6, r7\n\t"
  175268. #ifdef WOLFSSL_KEIL
  175269. "muls r6, r5, r6\n\t"
  175270. #elif defined(__clang__)
  175271. "muls r6, r5\n\t"
  175272. #else
  175273. "mul r6, r5\n\t"
  175274. #endif
  175275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175276. "adds r3, r3, r6\n\t"
  175277. #else
  175278. "add r3, r3, r6\n\t"
  175279. #endif
  175280. #ifdef WOLFSSL_KEIL
  175281. "adcs r4, r4, %[r]\n\t"
  175282. #elif defined(__clang__)
  175283. "adcs r4, %[r]\n\t"
  175284. #else
  175285. "adc r4, %[r]\n\t"
  175286. #endif
  175287. #ifdef WOLFSSL_KEIL
  175288. "adcs r2, r2, %[r]\n\t"
  175289. #elif defined(__clang__)
  175290. "adcs r2, %[r]\n\t"
  175291. #else
  175292. "adc r2, %[r]\n\t"
  175293. #endif
  175294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175295. "adds r3, r3, r6\n\t"
  175296. #else
  175297. "add r3, r3, r6\n\t"
  175298. #endif
  175299. #ifdef WOLFSSL_KEIL
  175300. "adcs r4, r4, %[r]\n\t"
  175301. #elif defined(__clang__)
  175302. "adcs r4, %[r]\n\t"
  175303. #else
  175304. "adc r4, %[r]\n\t"
  175305. #endif
  175306. #ifdef WOLFSSL_KEIL
  175307. "adcs r2, r2, %[r]\n\t"
  175308. #elif defined(__clang__)
  175309. "adcs r2, %[r]\n\t"
  175310. #else
  175311. "adc r2, %[r]\n\t"
  175312. #endif
  175313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175314. "lsrs r6, r7, #16\n\t"
  175315. #else
  175316. "lsr r6, r7, #16\n\t"
  175317. #endif
  175318. #ifdef WOLFSSL_KEIL
  175319. "muls r5, r6, r5\n\t"
  175320. #elif defined(__clang__)
  175321. "muls r5, r6\n\t"
  175322. #else
  175323. "mul r5, r6\n\t"
  175324. #endif
  175325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175326. "lsrs r6, r5, #16\n\t"
  175327. #else
  175328. "lsr r6, r5, #16\n\t"
  175329. #endif
  175330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175331. "lsls r5, r5, #16\n\t"
  175332. #else
  175333. "lsl r5, r5, #16\n\t"
  175334. #endif
  175335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175336. "adds r3, r3, r5\n\t"
  175337. #else
  175338. "add r3, r3, r5\n\t"
  175339. #endif
  175340. #ifdef WOLFSSL_KEIL
  175341. "adcs r4, r4, r6\n\t"
  175342. #elif defined(__clang__)
  175343. "adcs r4, r6\n\t"
  175344. #else
  175345. "adc r4, r6\n\t"
  175346. #endif
  175347. #ifdef WOLFSSL_KEIL
  175348. "adcs r2, r2, %[r]\n\t"
  175349. #elif defined(__clang__)
  175350. "adcs r2, %[r]\n\t"
  175351. #else
  175352. "adc r2, %[r]\n\t"
  175353. #endif
  175354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175355. "adds r3, r3, r5\n\t"
  175356. #else
  175357. "add r3, r3, r5\n\t"
  175358. #endif
  175359. #ifdef WOLFSSL_KEIL
  175360. "adcs r4, r4, r6\n\t"
  175361. #elif defined(__clang__)
  175362. "adcs r4, r6\n\t"
  175363. #else
  175364. "adc r4, r6\n\t"
  175365. #endif
  175366. #ifdef WOLFSSL_KEIL
  175367. "adcs r2, r2, %[r]\n\t"
  175368. #elif defined(__clang__)
  175369. "adcs r2, %[r]\n\t"
  175370. #else
  175371. "adc r2, %[r]\n\t"
  175372. #endif
  175373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175374. "lsrs r5, %[a], #16\n\t"
  175375. #else
  175376. "lsr r5, %[a], #16\n\t"
  175377. #endif
  175378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175379. "lsrs r6, r7, #16\n\t"
  175380. #else
  175381. "lsr r6, r7, #16\n\t"
  175382. #endif
  175383. #ifdef WOLFSSL_KEIL
  175384. "muls r6, r5, r6\n\t"
  175385. #elif defined(__clang__)
  175386. "muls r6, r5\n\t"
  175387. #else
  175388. "mul r6, r5\n\t"
  175389. #endif
  175390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175391. "adds r4, r4, r6\n\t"
  175392. #else
  175393. "add r4, r4, r6\n\t"
  175394. #endif
  175395. #ifdef WOLFSSL_KEIL
  175396. "adcs r2, r2, %[r]\n\t"
  175397. #elif defined(__clang__)
  175398. "adcs r2, %[r]\n\t"
  175399. #else
  175400. "adc r2, %[r]\n\t"
  175401. #endif
  175402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175403. "adds r4, r4, r6\n\t"
  175404. #else
  175405. "add r4, r4, r6\n\t"
  175406. #endif
  175407. #ifdef WOLFSSL_KEIL
  175408. "adcs r2, r2, %[r]\n\t"
  175409. #elif defined(__clang__)
  175410. "adcs r2, %[r]\n\t"
  175411. #else
  175412. "adc r2, %[r]\n\t"
  175413. #endif
  175414. "uxth r6, r7\n\t"
  175415. #ifdef WOLFSSL_KEIL
  175416. "muls r5, r6, r5\n\t"
  175417. #elif defined(__clang__)
  175418. "muls r5, r6\n\t"
  175419. #else
  175420. "mul r5, r6\n\t"
  175421. #endif
  175422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175423. "lsrs r6, r5, #16\n\t"
  175424. #else
  175425. "lsr r6, r5, #16\n\t"
  175426. #endif
  175427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175428. "lsls r5, r5, #16\n\t"
  175429. #else
  175430. "lsl r5, r5, #16\n\t"
  175431. #endif
  175432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175433. "adds r3, r3, r5\n\t"
  175434. #else
  175435. "add r3, r3, r5\n\t"
  175436. #endif
  175437. #ifdef WOLFSSL_KEIL
  175438. "adcs r4, r4, r6\n\t"
  175439. #elif defined(__clang__)
  175440. "adcs r4, r6\n\t"
  175441. #else
  175442. "adc r4, r6\n\t"
  175443. #endif
  175444. #ifdef WOLFSSL_KEIL
  175445. "adcs r2, r2, %[r]\n\t"
  175446. #elif defined(__clang__)
  175447. "adcs r2, %[r]\n\t"
  175448. #else
  175449. "adc r2, %[r]\n\t"
  175450. #endif
  175451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175452. "adds r3, r3, r5\n\t"
  175453. #else
  175454. "add r3, r3, r5\n\t"
  175455. #endif
  175456. #ifdef WOLFSSL_KEIL
  175457. "adcs r4, r4, r6\n\t"
  175458. #elif defined(__clang__)
  175459. "adcs r4, r6\n\t"
  175460. #else
  175461. "adc r4, r6\n\t"
  175462. #endif
  175463. #ifdef WOLFSSL_KEIL
  175464. "adcs r2, r2, %[r]\n\t"
  175465. #elif defined(__clang__)
  175466. "adcs r2, %[r]\n\t"
  175467. #else
  175468. "adc r2, %[r]\n\t"
  175469. #endif
  175470. "# A[11] * A[11]\n\t"
  175471. "mov %[a], r9\n\t"
  175472. "ldr r7, [%[a], #44]\n\t"
  175473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175474. "lsrs r6, r7, #16\n\t"
  175475. #else
  175476. "lsr r6, r7, #16\n\t"
  175477. #endif
  175478. "uxth r5, r7\n\t"
  175479. #ifdef WOLFSSL_KEIL
  175480. "muls r5, r5, r5\n\t"
  175481. #elif defined(__clang__)
  175482. "muls r5, r5\n\t"
  175483. #else
  175484. "mul r5, r5\n\t"
  175485. #endif
  175486. #ifdef WOLFSSL_KEIL
  175487. "muls r6, r6, r6\n\t"
  175488. #elif defined(__clang__)
  175489. "muls r6, r6\n\t"
  175490. #else
  175491. "mul r6, r6\n\t"
  175492. #endif
  175493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175494. "adds r3, r3, r5\n\t"
  175495. #else
  175496. "add r3, r3, r5\n\t"
  175497. #endif
  175498. #ifdef WOLFSSL_KEIL
  175499. "adcs r4, r4, r6\n\t"
  175500. #elif defined(__clang__)
  175501. "adcs r4, r6\n\t"
  175502. #else
  175503. "adc r4, r6\n\t"
  175504. #endif
  175505. #ifdef WOLFSSL_KEIL
  175506. "adcs r2, r2, %[r]\n\t"
  175507. #elif defined(__clang__)
  175508. "adcs r2, %[r]\n\t"
  175509. #else
  175510. "adc r2, %[r]\n\t"
  175511. #endif
  175512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175513. "lsrs r6, r7, #16\n\t"
  175514. #else
  175515. "lsr r6, r7, #16\n\t"
  175516. #endif
  175517. "uxth r5, r7\n\t"
  175518. #ifdef WOLFSSL_KEIL
  175519. "muls r5, r6, r5\n\t"
  175520. #elif defined(__clang__)
  175521. "muls r5, r6\n\t"
  175522. #else
  175523. "mul r5, r6\n\t"
  175524. #endif
  175525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175526. "lsrs r6, r5, #15\n\t"
  175527. #else
  175528. "lsr r6, r5, #15\n\t"
  175529. #endif
  175530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175531. "lsls r5, r5, #17\n\t"
  175532. #else
  175533. "lsl r5, r5, #17\n\t"
  175534. #endif
  175535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175536. "adds r3, r3, r5\n\t"
  175537. #else
  175538. "add r3, r3, r5\n\t"
  175539. #endif
  175540. #ifdef WOLFSSL_KEIL
  175541. "adcs r4, r4, r6\n\t"
  175542. #elif defined(__clang__)
  175543. "adcs r4, r6\n\t"
  175544. #else
  175545. "adc r4, r6\n\t"
  175546. #endif
  175547. #ifdef WOLFSSL_KEIL
  175548. "adcs r2, r2, %[r]\n\t"
  175549. #elif defined(__clang__)
  175550. "adcs r2, %[r]\n\t"
  175551. #else
  175552. "adc r2, %[r]\n\t"
  175553. #endif
  175554. "mov %[r], r8\n\t"
  175555. "str r3, [%[r], #88]\n\t"
  175556. "movs %[r], #0\n\t"
  175557. "# A[12] * A[11]\n\t"
  175558. "movs r3, #0\n\t"
  175559. "mov %[a], r10\n\t"
  175560. "uxth r5, %[a]\n\t"
  175561. "uxth r6, r7\n\t"
  175562. #ifdef WOLFSSL_KEIL
  175563. "muls r6, r5, r6\n\t"
  175564. #elif defined(__clang__)
  175565. "muls r6, r5\n\t"
  175566. #else
  175567. "mul r6, r5\n\t"
  175568. #endif
  175569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175570. "adds r4, r4, r6\n\t"
  175571. #else
  175572. "add r4, r4, r6\n\t"
  175573. #endif
  175574. #ifdef WOLFSSL_KEIL
  175575. "adcs r2, r2, %[r]\n\t"
  175576. #elif defined(__clang__)
  175577. "adcs r2, %[r]\n\t"
  175578. #else
  175579. "adc r2, %[r]\n\t"
  175580. #endif
  175581. #ifdef WOLFSSL_KEIL
  175582. "adcs r3, r3, %[r]\n\t"
  175583. #elif defined(__clang__)
  175584. "adcs r3, %[r]\n\t"
  175585. #else
  175586. "adc r3, %[r]\n\t"
  175587. #endif
  175588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175589. "adds r4, r4, r6\n\t"
  175590. #else
  175591. "add r4, r4, r6\n\t"
  175592. #endif
  175593. #ifdef WOLFSSL_KEIL
  175594. "adcs r2, r2, %[r]\n\t"
  175595. #elif defined(__clang__)
  175596. "adcs r2, %[r]\n\t"
  175597. #else
  175598. "adc r2, %[r]\n\t"
  175599. #endif
  175600. #ifdef WOLFSSL_KEIL
  175601. "adcs r3, r3, %[r]\n\t"
  175602. #elif defined(__clang__)
  175603. "adcs r3, %[r]\n\t"
  175604. #else
  175605. "adc r3, %[r]\n\t"
  175606. #endif
  175607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175608. "lsrs r6, r7, #16\n\t"
  175609. #else
  175610. "lsr r6, r7, #16\n\t"
  175611. #endif
  175612. #ifdef WOLFSSL_KEIL
  175613. "muls r5, r6, r5\n\t"
  175614. #elif defined(__clang__)
  175615. "muls r5, r6\n\t"
  175616. #else
  175617. "mul r5, r6\n\t"
  175618. #endif
  175619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175620. "lsrs r6, r5, #16\n\t"
  175621. #else
  175622. "lsr r6, r5, #16\n\t"
  175623. #endif
  175624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175625. "lsls r5, r5, #16\n\t"
  175626. #else
  175627. "lsl r5, r5, #16\n\t"
  175628. #endif
  175629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175630. "adds r4, r4, r5\n\t"
  175631. #else
  175632. "add r4, r4, r5\n\t"
  175633. #endif
  175634. #ifdef WOLFSSL_KEIL
  175635. "adcs r2, r2, r6\n\t"
  175636. #elif defined(__clang__)
  175637. "adcs r2, r6\n\t"
  175638. #else
  175639. "adc r2, r6\n\t"
  175640. #endif
  175641. #ifdef WOLFSSL_KEIL
  175642. "adcs r3, r3, %[r]\n\t"
  175643. #elif defined(__clang__)
  175644. "adcs r3, %[r]\n\t"
  175645. #else
  175646. "adc r3, %[r]\n\t"
  175647. #endif
  175648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175649. "adds r4, r4, r5\n\t"
  175650. #else
  175651. "add r4, r4, r5\n\t"
  175652. #endif
  175653. #ifdef WOLFSSL_KEIL
  175654. "adcs r2, r2, r6\n\t"
  175655. #elif defined(__clang__)
  175656. "adcs r2, r6\n\t"
  175657. #else
  175658. "adc r2, r6\n\t"
  175659. #endif
  175660. #ifdef WOLFSSL_KEIL
  175661. "adcs r3, r3, %[r]\n\t"
  175662. #elif defined(__clang__)
  175663. "adcs r3, %[r]\n\t"
  175664. #else
  175665. "adc r3, %[r]\n\t"
  175666. #endif
  175667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175668. "lsrs r5, %[a], #16\n\t"
  175669. #else
  175670. "lsr r5, %[a], #16\n\t"
  175671. #endif
  175672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175673. "lsrs r6, r7, #16\n\t"
  175674. #else
  175675. "lsr r6, r7, #16\n\t"
  175676. #endif
  175677. #ifdef WOLFSSL_KEIL
  175678. "muls r6, r5, r6\n\t"
  175679. #elif defined(__clang__)
  175680. "muls r6, r5\n\t"
  175681. #else
  175682. "mul r6, r5\n\t"
  175683. #endif
  175684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175685. "adds r2, r2, r6\n\t"
  175686. #else
  175687. "add r2, r2, r6\n\t"
  175688. #endif
  175689. #ifdef WOLFSSL_KEIL
  175690. "adcs r3, r3, %[r]\n\t"
  175691. #elif defined(__clang__)
  175692. "adcs r3, %[r]\n\t"
  175693. #else
  175694. "adc r3, %[r]\n\t"
  175695. #endif
  175696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175697. "adds r2, r2, r6\n\t"
  175698. #else
  175699. "add r2, r2, r6\n\t"
  175700. #endif
  175701. #ifdef WOLFSSL_KEIL
  175702. "adcs r3, r3, %[r]\n\t"
  175703. #elif defined(__clang__)
  175704. "adcs r3, %[r]\n\t"
  175705. #else
  175706. "adc r3, %[r]\n\t"
  175707. #endif
  175708. "uxth r6, r7\n\t"
  175709. #ifdef WOLFSSL_KEIL
  175710. "muls r5, r6, r5\n\t"
  175711. #elif defined(__clang__)
  175712. "muls r5, r6\n\t"
  175713. #else
  175714. "mul r5, r6\n\t"
  175715. #endif
  175716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175717. "lsrs r6, r5, #16\n\t"
  175718. #else
  175719. "lsr r6, r5, #16\n\t"
  175720. #endif
  175721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175722. "lsls r5, r5, #16\n\t"
  175723. #else
  175724. "lsl r5, r5, #16\n\t"
  175725. #endif
  175726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175727. "adds r4, r4, r5\n\t"
  175728. #else
  175729. "add r4, r4, r5\n\t"
  175730. #endif
  175731. #ifdef WOLFSSL_KEIL
  175732. "adcs r2, r2, r6\n\t"
  175733. #elif defined(__clang__)
  175734. "adcs r2, r6\n\t"
  175735. #else
  175736. "adc r2, r6\n\t"
  175737. #endif
  175738. #ifdef WOLFSSL_KEIL
  175739. "adcs r3, r3, %[r]\n\t"
  175740. #elif defined(__clang__)
  175741. "adcs r3, %[r]\n\t"
  175742. #else
  175743. "adc r3, %[r]\n\t"
  175744. #endif
  175745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175746. "adds r4, r4, r5\n\t"
  175747. #else
  175748. "add r4, r4, r5\n\t"
  175749. #endif
  175750. #ifdef WOLFSSL_KEIL
  175751. "adcs r2, r2, r6\n\t"
  175752. #elif defined(__clang__)
  175753. "adcs r2, r6\n\t"
  175754. #else
  175755. "adc r2, r6\n\t"
  175756. #endif
  175757. #ifdef WOLFSSL_KEIL
  175758. "adcs r3, r3, %[r]\n\t"
  175759. #elif defined(__clang__)
  175760. "adcs r3, %[r]\n\t"
  175761. #else
  175762. "adc r3, %[r]\n\t"
  175763. #endif
  175764. "# A[13] * A[10]\n\t"
  175765. "mov %[a], r9\n\t"
  175766. "ldr r7, [%[a], #40]\n\t"
  175767. "mov %[a], r11\n\t"
  175768. "uxth r5, %[a]\n\t"
  175769. "uxth r6, r7\n\t"
  175770. #ifdef WOLFSSL_KEIL
  175771. "muls r6, r5, r6\n\t"
  175772. #elif defined(__clang__)
  175773. "muls r6, r5\n\t"
  175774. #else
  175775. "mul r6, r5\n\t"
  175776. #endif
  175777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175778. "adds r4, r4, r6\n\t"
  175779. #else
  175780. "add r4, r4, r6\n\t"
  175781. #endif
  175782. #ifdef WOLFSSL_KEIL
  175783. "adcs r2, r2, %[r]\n\t"
  175784. #elif defined(__clang__)
  175785. "adcs r2, %[r]\n\t"
  175786. #else
  175787. "adc r2, %[r]\n\t"
  175788. #endif
  175789. #ifdef WOLFSSL_KEIL
  175790. "adcs r3, r3, %[r]\n\t"
  175791. #elif defined(__clang__)
  175792. "adcs r3, %[r]\n\t"
  175793. #else
  175794. "adc r3, %[r]\n\t"
  175795. #endif
  175796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175797. "adds r4, r4, r6\n\t"
  175798. #else
  175799. "add r4, r4, r6\n\t"
  175800. #endif
  175801. #ifdef WOLFSSL_KEIL
  175802. "adcs r2, r2, %[r]\n\t"
  175803. #elif defined(__clang__)
  175804. "adcs r2, %[r]\n\t"
  175805. #else
  175806. "adc r2, %[r]\n\t"
  175807. #endif
  175808. #ifdef WOLFSSL_KEIL
  175809. "adcs r3, r3, %[r]\n\t"
  175810. #elif defined(__clang__)
  175811. "adcs r3, %[r]\n\t"
  175812. #else
  175813. "adc r3, %[r]\n\t"
  175814. #endif
  175815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175816. "lsrs r6, r7, #16\n\t"
  175817. #else
  175818. "lsr r6, r7, #16\n\t"
  175819. #endif
  175820. #ifdef WOLFSSL_KEIL
  175821. "muls r5, r6, r5\n\t"
  175822. #elif defined(__clang__)
  175823. "muls r5, r6\n\t"
  175824. #else
  175825. "mul r5, r6\n\t"
  175826. #endif
  175827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175828. "lsrs r6, r5, #16\n\t"
  175829. #else
  175830. "lsr r6, r5, #16\n\t"
  175831. #endif
  175832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175833. "lsls r5, r5, #16\n\t"
  175834. #else
  175835. "lsl r5, r5, #16\n\t"
  175836. #endif
  175837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175838. "adds r4, r4, r5\n\t"
  175839. #else
  175840. "add r4, r4, r5\n\t"
  175841. #endif
  175842. #ifdef WOLFSSL_KEIL
  175843. "adcs r2, r2, r6\n\t"
  175844. #elif defined(__clang__)
  175845. "adcs r2, r6\n\t"
  175846. #else
  175847. "adc r2, r6\n\t"
  175848. #endif
  175849. #ifdef WOLFSSL_KEIL
  175850. "adcs r3, r3, %[r]\n\t"
  175851. #elif defined(__clang__)
  175852. "adcs r3, %[r]\n\t"
  175853. #else
  175854. "adc r3, %[r]\n\t"
  175855. #endif
  175856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175857. "adds r4, r4, r5\n\t"
  175858. #else
  175859. "add r4, r4, r5\n\t"
  175860. #endif
  175861. #ifdef WOLFSSL_KEIL
  175862. "adcs r2, r2, r6\n\t"
  175863. #elif defined(__clang__)
  175864. "adcs r2, r6\n\t"
  175865. #else
  175866. "adc r2, r6\n\t"
  175867. #endif
  175868. #ifdef WOLFSSL_KEIL
  175869. "adcs r3, r3, %[r]\n\t"
  175870. #elif defined(__clang__)
  175871. "adcs r3, %[r]\n\t"
  175872. #else
  175873. "adc r3, %[r]\n\t"
  175874. #endif
  175875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175876. "lsrs r5, %[a], #16\n\t"
  175877. #else
  175878. "lsr r5, %[a], #16\n\t"
  175879. #endif
  175880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175881. "lsrs r6, r7, #16\n\t"
  175882. #else
  175883. "lsr r6, r7, #16\n\t"
  175884. #endif
  175885. #ifdef WOLFSSL_KEIL
  175886. "muls r6, r5, r6\n\t"
  175887. #elif defined(__clang__)
  175888. "muls r6, r5\n\t"
  175889. #else
  175890. "mul r6, r5\n\t"
  175891. #endif
  175892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175893. "adds r2, r2, r6\n\t"
  175894. #else
  175895. "add r2, r2, r6\n\t"
  175896. #endif
  175897. #ifdef WOLFSSL_KEIL
  175898. "adcs r3, r3, %[r]\n\t"
  175899. #elif defined(__clang__)
  175900. "adcs r3, %[r]\n\t"
  175901. #else
  175902. "adc r3, %[r]\n\t"
  175903. #endif
  175904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175905. "adds r2, r2, r6\n\t"
  175906. #else
  175907. "add r2, r2, r6\n\t"
  175908. #endif
  175909. #ifdef WOLFSSL_KEIL
  175910. "adcs r3, r3, %[r]\n\t"
  175911. #elif defined(__clang__)
  175912. "adcs r3, %[r]\n\t"
  175913. #else
  175914. "adc r3, %[r]\n\t"
  175915. #endif
  175916. "uxth r6, r7\n\t"
  175917. #ifdef WOLFSSL_KEIL
  175918. "muls r5, r6, r5\n\t"
  175919. #elif defined(__clang__)
  175920. "muls r5, r6\n\t"
  175921. #else
  175922. "mul r5, r6\n\t"
  175923. #endif
  175924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175925. "lsrs r6, r5, #16\n\t"
  175926. #else
  175927. "lsr r6, r5, #16\n\t"
  175928. #endif
  175929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175930. "lsls r5, r5, #16\n\t"
  175931. #else
  175932. "lsl r5, r5, #16\n\t"
  175933. #endif
  175934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175935. "adds r4, r4, r5\n\t"
  175936. #else
  175937. "add r4, r4, r5\n\t"
  175938. #endif
  175939. #ifdef WOLFSSL_KEIL
  175940. "adcs r2, r2, r6\n\t"
  175941. #elif defined(__clang__)
  175942. "adcs r2, r6\n\t"
  175943. #else
  175944. "adc r2, r6\n\t"
  175945. #endif
  175946. #ifdef WOLFSSL_KEIL
  175947. "adcs r3, r3, %[r]\n\t"
  175948. #elif defined(__clang__)
  175949. "adcs r3, %[r]\n\t"
  175950. #else
  175951. "adc r3, %[r]\n\t"
  175952. #endif
  175953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175954. "adds r4, r4, r5\n\t"
  175955. #else
  175956. "add r4, r4, r5\n\t"
  175957. #endif
  175958. #ifdef WOLFSSL_KEIL
  175959. "adcs r2, r2, r6\n\t"
  175960. #elif defined(__clang__)
  175961. "adcs r2, r6\n\t"
  175962. #else
  175963. "adc r2, r6\n\t"
  175964. #endif
  175965. #ifdef WOLFSSL_KEIL
  175966. "adcs r3, r3, %[r]\n\t"
  175967. #elif defined(__clang__)
  175968. "adcs r3, %[r]\n\t"
  175969. #else
  175970. "adc r3, %[r]\n\t"
  175971. #endif
  175972. "# A[14] * A[9]\n\t"
  175973. "mov %[a], r9\n\t"
  175974. "ldr r7, [%[a], #36]\n\t"
  175975. "mov %[a], r12\n\t"
  175976. "uxth r5, %[a]\n\t"
  175977. "uxth r6, r7\n\t"
  175978. #ifdef WOLFSSL_KEIL
  175979. "muls r6, r5, r6\n\t"
  175980. #elif defined(__clang__)
  175981. "muls r6, r5\n\t"
  175982. #else
  175983. "mul r6, r5\n\t"
  175984. #endif
  175985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175986. "adds r4, r4, r6\n\t"
  175987. #else
  175988. "add r4, r4, r6\n\t"
  175989. #endif
  175990. #ifdef WOLFSSL_KEIL
  175991. "adcs r2, r2, %[r]\n\t"
  175992. #elif defined(__clang__)
  175993. "adcs r2, %[r]\n\t"
  175994. #else
  175995. "adc r2, %[r]\n\t"
  175996. #endif
  175997. #ifdef WOLFSSL_KEIL
  175998. "adcs r3, r3, %[r]\n\t"
  175999. #elif defined(__clang__)
  176000. "adcs r3, %[r]\n\t"
  176001. #else
  176002. "adc r3, %[r]\n\t"
  176003. #endif
  176004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176005. "adds r4, r4, r6\n\t"
  176006. #else
  176007. "add r4, r4, r6\n\t"
  176008. #endif
  176009. #ifdef WOLFSSL_KEIL
  176010. "adcs r2, r2, %[r]\n\t"
  176011. #elif defined(__clang__)
  176012. "adcs r2, %[r]\n\t"
  176013. #else
  176014. "adc r2, %[r]\n\t"
  176015. #endif
  176016. #ifdef WOLFSSL_KEIL
  176017. "adcs r3, r3, %[r]\n\t"
  176018. #elif defined(__clang__)
  176019. "adcs r3, %[r]\n\t"
  176020. #else
  176021. "adc r3, %[r]\n\t"
  176022. #endif
  176023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176024. "lsrs r6, r7, #16\n\t"
  176025. #else
  176026. "lsr r6, r7, #16\n\t"
  176027. #endif
  176028. #ifdef WOLFSSL_KEIL
  176029. "muls r5, r6, r5\n\t"
  176030. #elif defined(__clang__)
  176031. "muls r5, r6\n\t"
  176032. #else
  176033. "mul r5, r6\n\t"
  176034. #endif
  176035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176036. "lsrs r6, r5, #16\n\t"
  176037. #else
  176038. "lsr r6, r5, #16\n\t"
  176039. #endif
  176040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176041. "lsls r5, r5, #16\n\t"
  176042. #else
  176043. "lsl r5, r5, #16\n\t"
  176044. #endif
  176045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176046. "adds r4, r4, r5\n\t"
  176047. #else
  176048. "add r4, r4, r5\n\t"
  176049. #endif
  176050. #ifdef WOLFSSL_KEIL
  176051. "adcs r2, r2, r6\n\t"
  176052. #elif defined(__clang__)
  176053. "adcs r2, r6\n\t"
  176054. #else
  176055. "adc r2, r6\n\t"
  176056. #endif
  176057. #ifdef WOLFSSL_KEIL
  176058. "adcs r3, r3, %[r]\n\t"
  176059. #elif defined(__clang__)
  176060. "adcs r3, %[r]\n\t"
  176061. #else
  176062. "adc r3, %[r]\n\t"
  176063. #endif
  176064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176065. "adds r4, r4, r5\n\t"
  176066. #else
  176067. "add r4, r4, r5\n\t"
  176068. #endif
  176069. #ifdef WOLFSSL_KEIL
  176070. "adcs r2, r2, r6\n\t"
  176071. #elif defined(__clang__)
  176072. "adcs r2, r6\n\t"
  176073. #else
  176074. "adc r2, r6\n\t"
  176075. #endif
  176076. #ifdef WOLFSSL_KEIL
  176077. "adcs r3, r3, %[r]\n\t"
  176078. #elif defined(__clang__)
  176079. "adcs r3, %[r]\n\t"
  176080. #else
  176081. "adc r3, %[r]\n\t"
  176082. #endif
  176083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176084. "lsrs r5, %[a], #16\n\t"
  176085. #else
  176086. "lsr r5, %[a], #16\n\t"
  176087. #endif
  176088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176089. "lsrs r6, r7, #16\n\t"
  176090. #else
  176091. "lsr r6, r7, #16\n\t"
  176092. #endif
  176093. #ifdef WOLFSSL_KEIL
  176094. "muls r6, r5, r6\n\t"
  176095. #elif defined(__clang__)
  176096. "muls r6, r5\n\t"
  176097. #else
  176098. "mul r6, r5\n\t"
  176099. #endif
  176100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176101. "adds r2, r2, r6\n\t"
  176102. #else
  176103. "add r2, r2, r6\n\t"
  176104. #endif
  176105. #ifdef WOLFSSL_KEIL
  176106. "adcs r3, r3, %[r]\n\t"
  176107. #elif defined(__clang__)
  176108. "adcs r3, %[r]\n\t"
  176109. #else
  176110. "adc r3, %[r]\n\t"
  176111. #endif
  176112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176113. "adds r2, r2, r6\n\t"
  176114. #else
  176115. "add r2, r2, r6\n\t"
  176116. #endif
  176117. #ifdef WOLFSSL_KEIL
  176118. "adcs r3, r3, %[r]\n\t"
  176119. #elif defined(__clang__)
  176120. "adcs r3, %[r]\n\t"
  176121. #else
  176122. "adc r3, %[r]\n\t"
  176123. #endif
  176124. "uxth r6, r7\n\t"
  176125. #ifdef WOLFSSL_KEIL
  176126. "muls r5, r6, r5\n\t"
  176127. #elif defined(__clang__)
  176128. "muls r5, r6\n\t"
  176129. #else
  176130. "mul r5, r6\n\t"
  176131. #endif
  176132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176133. "lsrs r6, r5, #16\n\t"
  176134. #else
  176135. "lsr r6, r5, #16\n\t"
  176136. #endif
  176137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176138. "lsls r5, r5, #16\n\t"
  176139. #else
  176140. "lsl r5, r5, #16\n\t"
  176141. #endif
  176142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176143. "adds r4, r4, r5\n\t"
  176144. #else
  176145. "add r4, r4, r5\n\t"
  176146. #endif
  176147. #ifdef WOLFSSL_KEIL
  176148. "adcs r2, r2, r6\n\t"
  176149. #elif defined(__clang__)
  176150. "adcs r2, r6\n\t"
  176151. #else
  176152. "adc r2, r6\n\t"
  176153. #endif
  176154. #ifdef WOLFSSL_KEIL
  176155. "adcs r3, r3, %[r]\n\t"
  176156. #elif defined(__clang__)
  176157. "adcs r3, %[r]\n\t"
  176158. #else
  176159. "adc r3, %[r]\n\t"
  176160. #endif
  176161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176162. "adds r4, r4, r5\n\t"
  176163. #else
  176164. "add r4, r4, r5\n\t"
  176165. #endif
  176166. #ifdef WOLFSSL_KEIL
  176167. "adcs r2, r2, r6\n\t"
  176168. #elif defined(__clang__)
  176169. "adcs r2, r6\n\t"
  176170. #else
  176171. "adc r2, r6\n\t"
  176172. #endif
  176173. #ifdef WOLFSSL_KEIL
  176174. "adcs r3, r3, %[r]\n\t"
  176175. #elif defined(__clang__)
  176176. "adcs r3, %[r]\n\t"
  176177. #else
  176178. "adc r3, %[r]\n\t"
  176179. #endif
  176180. "# A[15] * A[8]\n\t"
  176181. "mov %[a], r9\n\t"
  176182. "ldr r7, [%[a], #32]\n\t"
  176183. "mov %[a], lr\n\t"
  176184. "uxth r5, %[a]\n\t"
  176185. "uxth r6, r7\n\t"
  176186. #ifdef WOLFSSL_KEIL
  176187. "muls r6, r5, r6\n\t"
  176188. #elif defined(__clang__)
  176189. "muls r6, r5\n\t"
  176190. #else
  176191. "mul r6, r5\n\t"
  176192. #endif
  176193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176194. "adds r4, r4, r6\n\t"
  176195. #else
  176196. "add r4, r4, r6\n\t"
  176197. #endif
  176198. #ifdef WOLFSSL_KEIL
  176199. "adcs r2, r2, %[r]\n\t"
  176200. #elif defined(__clang__)
  176201. "adcs r2, %[r]\n\t"
  176202. #else
  176203. "adc r2, %[r]\n\t"
  176204. #endif
  176205. #ifdef WOLFSSL_KEIL
  176206. "adcs r3, r3, %[r]\n\t"
  176207. #elif defined(__clang__)
  176208. "adcs r3, %[r]\n\t"
  176209. #else
  176210. "adc r3, %[r]\n\t"
  176211. #endif
  176212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176213. "adds r4, r4, r6\n\t"
  176214. #else
  176215. "add r4, r4, r6\n\t"
  176216. #endif
  176217. #ifdef WOLFSSL_KEIL
  176218. "adcs r2, r2, %[r]\n\t"
  176219. #elif defined(__clang__)
  176220. "adcs r2, %[r]\n\t"
  176221. #else
  176222. "adc r2, %[r]\n\t"
  176223. #endif
  176224. #ifdef WOLFSSL_KEIL
  176225. "adcs r3, r3, %[r]\n\t"
  176226. #elif defined(__clang__)
  176227. "adcs r3, %[r]\n\t"
  176228. #else
  176229. "adc r3, %[r]\n\t"
  176230. #endif
  176231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176232. "lsrs r6, r7, #16\n\t"
  176233. #else
  176234. "lsr r6, r7, #16\n\t"
  176235. #endif
  176236. #ifdef WOLFSSL_KEIL
  176237. "muls r5, r6, r5\n\t"
  176238. #elif defined(__clang__)
  176239. "muls r5, r6\n\t"
  176240. #else
  176241. "mul r5, r6\n\t"
  176242. #endif
  176243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176244. "lsrs r6, r5, #16\n\t"
  176245. #else
  176246. "lsr r6, r5, #16\n\t"
  176247. #endif
  176248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176249. "lsls r5, r5, #16\n\t"
  176250. #else
  176251. "lsl r5, r5, #16\n\t"
  176252. #endif
  176253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176254. "adds r4, r4, r5\n\t"
  176255. #else
  176256. "add r4, r4, r5\n\t"
  176257. #endif
  176258. #ifdef WOLFSSL_KEIL
  176259. "adcs r2, r2, r6\n\t"
  176260. #elif defined(__clang__)
  176261. "adcs r2, r6\n\t"
  176262. #else
  176263. "adc r2, r6\n\t"
  176264. #endif
  176265. #ifdef WOLFSSL_KEIL
  176266. "adcs r3, r3, %[r]\n\t"
  176267. #elif defined(__clang__)
  176268. "adcs r3, %[r]\n\t"
  176269. #else
  176270. "adc r3, %[r]\n\t"
  176271. #endif
  176272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176273. "adds r4, r4, r5\n\t"
  176274. #else
  176275. "add r4, r4, r5\n\t"
  176276. #endif
  176277. #ifdef WOLFSSL_KEIL
  176278. "adcs r2, r2, r6\n\t"
  176279. #elif defined(__clang__)
  176280. "adcs r2, r6\n\t"
  176281. #else
  176282. "adc r2, r6\n\t"
  176283. #endif
  176284. #ifdef WOLFSSL_KEIL
  176285. "adcs r3, r3, %[r]\n\t"
  176286. #elif defined(__clang__)
  176287. "adcs r3, %[r]\n\t"
  176288. #else
  176289. "adc r3, %[r]\n\t"
  176290. #endif
  176291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176292. "lsrs r5, %[a], #16\n\t"
  176293. #else
  176294. "lsr r5, %[a], #16\n\t"
  176295. #endif
  176296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176297. "lsrs r6, r7, #16\n\t"
  176298. #else
  176299. "lsr r6, r7, #16\n\t"
  176300. #endif
  176301. #ifdef WOLFSSL_KEIL
  176302. "muls r6, r5, r6\n\t"
  176303. #elif defined(__clang__)
  176304. "muls r6, r5\n\t"
  176305. #else
  176306. "mul r6, r5\n\t"
  176307. #endif
  176308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176309. "adds r2, r2, r6\n\t"
  176310. #else
  176311. "add r2, r2, r6\n\t"
  176312. #endif
  176313. #ifdef WOLFSSL_KEIL
  176314. "adcs r3, r3, %[r]\n\t"
  176315. #elif defined(__clang__)
  176316. "adcs r3, %[r]\n\t"
  176317. #else
  176318. "adc r3, %[r]\n\t"
  176319. #endif
  176320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176321. "adds r2, r2, r6\n\t"
  176322. #else
  176323. "add r2, r2, r6\n\t"
  176324. #endif
  176325. #ifdef WOLFSSL_KEIL
  176326. "adcs r3, r3, %[r]\n\t"
  176327. #elif defined(__clang__)
  176328. "adcs r3, %[r]\n\t"
  176329. #else
  176330. "adc r3, %[r]\n\t"
  176331. #endif
  176332. "uxth r6, r7\n\t"
  176333. #ifdef WOLFSSL_KEIL
  176334. "muls r5, r6, r5\n\t"
  176335. #elif defined(__clang__)
  176336. "muls r5, r6\n\t"
  176337. #else
  176338. "mul r5, r6\n\t"
  176339. #endif
  176340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176341. "lsrs r6, r5, #16\n\t"
  176342. #else
  176343. "lsr r6, r5, #16\n\t"
  176344. #endif
  176345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176346. "lsls r5, r5, #16\n\t"
  176347. #else
  176348. "lsl r5, r5, #16\n\t"
  176349. #endif
  176350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176351. "adds r4, r4, r5\n\t"
  176352. #else
  176353. "add r4, r4, r5\n\t"
  176354. #endif
  176355. #ifdef WOLFSSL_KEIL
  176356. "adcs r2, r2, r6\n\t"
  176357. #elif defined(__clang__)
  176358. "adcs r2, r6\n\t"
  176359. #else
  176360. "adc r2, r6\n\t"
  176361. #endif
  176362. #ifdef WOLFSSL_KEIL
  176363. "adcs r3, r3, %[r]\n\t"
  176364. #elif defined(__clang__)
  176365. "adcs r3, %[r]\n\t"
  176366. #else
  176367. "adc r3, %[r]\n\t"
  176368. #endif
  176369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176370. "adds r4, r4, r5\n\t"
  176371. #else
  176372. "add r4, r4, r5\n\t"
  176373. #endif
  176374. #ifdef WOLFSSL_KEIL
  176375. "adcs r2, r2, r6\n\t"
  176376. #elif defined(__clang__)
  176377. "adcs r2, r6\n\t"
  176378. #else
  176379. "adc r2, r6\n\t"
  176380. #endif
  176381. #ifdef WOLFSSL_KEIL
  176382. "adcs r3, r3, %[r]\n\t"
  176383. #elif defined(__clang__)
  176384. "adcs r3, %[r]\n\t"
  176385. #else
  176386. "adc r3, %[r]\n\t"
  176387. #endif
  176388. "mov %[r], r8\n\t"
  176389. "str r4, [%[r], #92]\n\t"
  176390. "movs %[r], #0\n\t"
  176391. "# A[15] * A[9]\n\t"
  176392. "movs r4, #0\n\t"
  176393. "mov %[a], r9\n\t"
  176394. "ldr r7, [%[a], #36]\n\t"
  176395. "mov %[a], lr\n\t"
  176396. "uxth r5, %[a]\n\t"
  176397. "uxth r6, r7\n\t"
  176398. #ifdef WOLFSSL_KEIL
  176399. "muls r6, r5, r6\n\t"
  176400. #elif defined(__clang__)
  176401. "muls r6, r5\n\t"
  176402. #else
  176403. "mul r6, r5\n\t"
  176404. #endif
  176405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176406. "adds r2, r2, r6\n\t"
  176407. #else
  176408. "add r2, r2, r6\n\t"
  176409. #endif
  176410. #ifdef WOLFSSL_KEIL
  176411. "adcs r3, r3, %[r]\n\t"
  176412. #elif defined(__clang__)
  176413. "adcs r3, %[r]\n\t"
  176414. #else
  176415. "adc r3, %[r]\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, r6\n\t"
  176426. #else
  176427. "add r2, r2, r6\n\t"
  176428. #endif
  176429. #ifdef WOLFSSL_KEIL
  176430. "adcs r3, r3, %[r]\n\t"
  176431. #elif defined(__clang__)
  176432. "adcs r3, %[r]\n\t"
  176433. #else
  176434. "adc r3, %[r]\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 r6, r7, #16\n\t"
  176445. #else
  176446. "lsr r6, r7, #16\n\t"
  176447. #endif
  176448. #ifdef WOLFSSL_KEIL
  176449. "muls r5, r6, r5\n\t"
  176450. #elif defined(__clang__)
  176451. "muls r5, r6\n\t"
  176452. #else
  176453. "mul r5, r6\n\t"
  176454. #endif
  176455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176456. "lsrs r6, r5, #16\n\t"
  176457. #else
  176458. "lsr r6, r5, #16\n\t"
  176459. #endif
  176460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176461. "lsls r5, r5, #16\n\t"
  176462. #else
  176463. "lsl r5, r5, #16\n\t"
  176464. #endif
  176465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176466. "adds r2, r2, r5\n\t"
  176467. #else
  176468. "add r2, r2, r5\n\t"
  176469. #endif
  176470. #ifdef WOLFSSL_KEIL
  176471. "adcs r3, r3, r6\n\t"
  176472. #elif defined(__clang__)
  176473. "adcs r3, r6\n\t"
  176474. #else
  176475. "adc 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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176485. "adds r2, r2, r5\n\t"
  176486. #else
  176487. "add r2, r2, r5\n\t"
  176488. #endif
  176489. #ifdef WOLFSSL_KEIL
  176490. "adcs r3, r3, r6\n\t"
  176491. #elif defined(__clang__)
  176492. "adcs r3, r6\n\t"
  176493. #else
  176494. "adc r3, r6\n\t"
  176495. #endif
  176496. #ifdef WOLFSSL_KEIL
  176497. "adcs r4, r4, %[r]\n\t"
  176498. #elif defined(__clang__)
  176499. "adcs r4, %[r]\n\t"
  176500. #else
  176501. "adc r4, %[r]\n\t"
  176502. #endif
  176503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176504. "lsrs r5, %[a], #16\n\t"
  176505. #else
  176506. "lsr r5, %[a], #16\n\t"
  176507. #endif
  176508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176509. "lsrs r6, r7, #16\n\t"
  176510. #else
  176511. "lsr r6, r7, #16\n\t"
  176512. #endif
  176513. #ifdef WOLFSSL_KEIL
  176514. "muls r6, r5, r6\n\t"
  176515. #elif defined(__clang__)
  176516. "muls r6, r5\n\t"
  176517. #else
  176518. "mul r6, r5\n\t"
  176519. #endif
  176520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176521. "adds r3, r3, r6\n\t"
  176522. #else
  176523. "add r3, r3, r6\n\t"
  176524. #endif
  176525. #ifdef WOLFSSL_KEIL
  176526. "adcs r4, r4, %[r]\n\t"
  176527. #elif defined(__clang__)
  176528. "adcs r4, %[r]\n\t"
  176529. #else
  176530. "adc r4, %[r]\n\t"
  176531. #endif
  176532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176533. "adds r3, r3, r6\n\t"
  176534. #else
  176535. "add r3, r3, r6\n\t"
  176536. #endif
  176537. #ifdef WOLFSSL_KEIL
  176538. "adcs r4, r4, %[r]\n\t"
  176539. #elif defined(__clang__)
  176540. "adcs r4, %[r]\n\t"
  176541. #else
  176542. "adc r4, %[r]\n\t"
  176543. #endif
  176544. "uxth r6, r7\n\t"
  176545. #ifdef WOLFSSL_KEIL
  176546. "muls r5, r6, r5\n\t"
  176547. #elif defined(__clang__)
  176548. "muls r5, r6\n\t"
  176549. #else
  176550. "mul r5, r6\n\t"
  176551. #endif
  176552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176553. "lsrs r6, r5, #16\n\t"
  176554. #else
  176555. "lsr r6, r5, #16\n\t"
  176556. #endif
  176557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176558. "lsls r5, r5, #16\n\t"
  176559. #else
  176560. "lsl r5, r5, #16\n\t"
  176561. #endif
  176562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176563. "adds r2, r2, r5\n\t"
  176564. #else
  176565. "add r2, r2, r5\n\t"
  176566. #endif
  176567. #ifdef WOLFSSL_KEIL
  176568. "adcs r3, r3, r6\n\t"
  176569. #elif defined(__clang__)
  176570. "adcs r3, r6\n\t"
  176571. #else
  176572. "adc r3, r6\n\t"
  176573. #endif
  176574. #ifdef WOLFSSL_KEIL
  176575. "adcs r4, r4, %[r]\n\t"
  176576. #elif defined(__clang__)
  176577. "adcs r4, %[r]\n\t"
  176578. #else
  176579. "adc r4, %[r]\n\t"
  176580. #endif
  176581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176582. "adds r2, r2, r5\n\t"
  176583. #else
  176584. "add r2, r2, r5\n\t"
  176585. #endif
  176586. #ifdef WOLFSSL_KEIL
  176587. "adcs r3, r3, r6\n\t"
  176588. #elif defined(__clang__)
  176589. "adcs r3, r6\n\t"
  176590. #else
  176591. "adc r3, r6\n\t"
  176592. #endif
  176593. #ifdef WOLFSSL_KEIL
  176594. "adcs r4, r4, %[r]\n\t"
  176595. #elif defined(__clang__)
  176596. "adcs r4, %[r]\n\t"
  176597. #else
  176598. "adc r4, %[r]\n\t"
  176599. #endif
  176600. "# A[14] * A[10]\n\t"
  176601. "mov %[a], r9\n\t"
  176602. "ldr r7, [%[a], #40]\n\t"
  176603. "mov %[a], r12\n\t"
  176604. "uxth r5, %[a]\n\t"
  176605. "uxth r6, r7\n\t"
  176606. #ifdef WOLFSSL_KEIL
  176607. "muls r6, r5, r6\n\t"
  176608. #elif defined(__clang__)
  176609. "muls r6, r5\n\t"
  176610. #else
  176611. "mul r6, r5\n\t"
  176612. #endif
  176613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176614. "adds r2, r2, r6\n\t"
  176615. #else
  176616. "add r2, r2, r6\n\t"
  176617. #endif
  176618. #ifdef WOLFSSL_KEIL
  176619. "adcs r3, r3, %[r]\n\t"
  176620. #elif defined(__clang__)
  176621. "adcs r3, %[r]\n\t"
  176622. #else
  176623. "adc r3, %[r]\n\t"
  176624. #endif
  176625. #ifdef WOLFSSL_KEIL
  176626. "adcs r4, r4, %[r]\n\t"
  176627. #elif defined(__clang__)
  176628. "adcs r4, %[r]\n\t"
  176629. #else
  176630. "adc r4, %[r]\n\t"
  176631. #endif
  176632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176633. "adds r2, r2, r6\n\t"
  176634. #else
  176635. "add r2, r2, r6\n\t"
  176636. #endif
  176637. #ifdef WOLFSSL_KEIL
  176638. "adcs r3, r3, %[r]\n\t"
  176639. #elif defined(__clang__)
  176640. "adcs r3, %[r]\n\t"
  176641. #else
  176642. "adc r3, %[r]\n\t"
  176643. #endif
  176644. #ifdef WOLFSSL_KEIL
  176645. "adcs r4, r4, %[r]\n\t"
  176646. #elif defined(__clang__)
  176647. "adcs r4, %[r]\n\t"
  176648. #else
  176649. "adc r4, %[r]\n\t"
  176650. #endif
  176651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176652. "lsrs r6, r7, #16\n\t"
  176653. #else
  176654. "lsr r6, r7, #16\n\t"
  176655. #endif
  176656. #ifdef WOLFSSL_KEIL
  176657. "muls r5, r6, r5\n\t"
  176658. #elif defined(__clang__)
  176659. "muls r5, r6\n\t"
  176660. #else
  176661. "mul r5, r6\n\t"
  176662. #endif
  176663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176664. "lsrs r6, r5, #16\n\t"
  176665. #else
  176666. "lsr r6, r5, #16\n\t"
  176667. #endif
  176668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176669. "lsls r5, r5, #16\n\t"
  176670. #else
  176671. "lsl r5, r5, #16\n\t"
  176672. #endif
  176673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176674. "adds r2, r2, r5\n\t"
  176675. #else
  176676. "add r2, r2, r5\n\t"
  176677. #endif
  176678. #ifdef WOLFSSL_KEIL
  176679. "adcs r3, r3, r6\n\t"
  176680. #elif defined(__clang__)
  176681. "adcs r3, r6\n\t"
  176682. #else
  176683. "adc r3, r6\n\t"
  176684. #endif
  176685. #ifdef WOLFSSL_KEIL
  176686. "adcs r4, r4, %[r]\n\t"
  176687. #elif defined(__clang__)
  176688. "adcs r4, %[r]\n\t"
  176689. #else
  176690. "adc r4, %[r]\n\t"
  176691. #endif
  176692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176693. "adds r2, r2, r5\n\t"
  176694. #else
  176695. "add r2, r2, r5\n\t"
  176696. #endif
  176697. #ifdef WOLFSSL_KEIL
  176698. "adcs r3, r3, r6\n\t"
  176699. #elif defined(__clang__)
  176700. "adcs r3, r6\n\t"
  176701. #else
  176702. "adc r3, r6\n\t"
  176703. #endif
  176704. #ifdef WOLFSSL_KEIL
  176705. "adcs r4, r4, %[r]\n\t"
  176706. #elif defined(__clang__)
  176707. "adcs r4, %[r]\n\t"
  176708. #else
  176709. "adc r4, %[r]\n\t"
  176710. #endif
  176711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176712. "lsrs r5, %[a], #16\n\t"
  176713. #else
  176714. "lsr r5, %[a], #16\n\t"
  176715. #endif
  176716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176717. "lsrs r6, r7, #16\n\t"
  176718. #else
  176719. "lsr r6, r7, #16\n\t"
  176720. #endif
  176721. #ifdef WOLFSSL_KEIL
  176722. "muls r6, r5, r6\n\t"
  176723. #elif defined(__clang__)
  176724. "muls r6, r5\n\t"
  176725. #else
  176726. "mul r6, r5\n\t"
  176727. #endif
  176728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176729. "adds r3, r3, r6\n\t"
  176730. #else
  176731. "add r3, r3, r6\n\t"
  176732. #endif
  176733. #ifdef WOLFSSL_KEIL
  176734. "adcs r4, r4, %[r]\n\t"
  176735. #elif defined(__clang__)
  176736. "adcs r4, %[r]\n\t"
  176737. #else
  176738. "adc r4, %[r]\n\t"
  176739. #endif
  176740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176741. "adds r3, r3, r6\n\t"
  176742. #else
  176743. "add r3, r3, r6\n\t"
  176744. #endif
  176745. #ifdef WOLFSSL_KEIL
  176746. "adcs r4, r4, %[r]\n\t"
  176747. #elif defined(__clang__)
  176748. "adcs r4, %[r]\n\t"
  176749. #else
  176750. "adc r4, %[r]\n\t"
  176751. #endif
  176752. "uxth r6, r7\n\t"
  176753. #ifdef WOLFSSL_KEIL
  176754. "muls r5, r6, r5\n\t"
  176755. #elif defined(__clang__)
  176756. "muls r5, r6\n\t"
  176757. #else
  176758. "mul r5, r6\n\t"
  176759. #endif
  176760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176761. "lsrs r6, r5, #16\n\t"
  176762. #else
  176763. "lsr r6, r5, #16\n\t"
  176764. #endif
  176765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176766. "lsls r5, r5, #16\n\t"
  176767. #else
  176768. "lsl r5, r5, #16\n\t"
  176769. #endif
  176770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176771. "adds r2, r2, r5\n\t"
  176772. #else
  176773. "add r2, r2, r5\n\t"
  176774. #endif
  176775. #ifdef WOLFSSL_KEIL
  176776. "adcs r3, r3, r6\n\t"
  176777. #elif defined(__clang__)
  176778. "adcs r3, r6\n\t"
  176779. #else
  176780. "adc r3, r6\n\t"
  176781. #endif
  176782. #ifdef WOLFSSL_KEIL
  176783. "adcs r4, r4, %[r]\n\t"
  176784. #elif defined(__clang__)
  176785. "adcs r4, %[r]\n\t"
  176786. #else
  176787. "adc r4, %[r]\n\t"
  176788. #endif
  176789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176790. "adds r2, r2, r5\n\t"
  176791. #else
  176792. "add r2, r2, r5\n\t"
  176793. #endif
  176794. #ifdef WOLFSSL_KEIL
  176795. "adcs r3, r3, r6\n\t"
  176796. #elif defined(__clang__)
  176797. "adcs r3, r6\n\t"
  176798. #else
  176799. "adc r3, r6\n\t"
  176800. #endif
  176801. #ifdef WOLFSSL_KEIL
  176802. "adcs r4, r4, %[r]\n\t"
  176803. #elif defined(__clang__)
  176804. "adcs r4, %[r]\n\t"
  176805. #else
  176806. "adc r4, %[r]\n\t"
  176807. #endif
  176808. "# A[13] * A[11]\n\t"
  176809. "mov %[a], r9\n\t"
  176810. "ldr r7, [%[a], #44]\n\t"
  176811. "mov %[a], r11\n\t"
  176812. "uxth r5, %[a]\n\t"
  176813. "uxth r6, r7\n\t"
  176814. #ifdef WOLFSSL_KEIL
  176815. "muls r6, r5, r6\n\t"
  176816. #elif defined(__clang__)
  176817. "muls r6, r5\n\t"
  176818. #else
  176819. "mul r6, r5\n\t"
  176820. #endif
  176821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176822. "adds r2, r2, r6\n\t"
  176823. #else
  176824. "add r2, r2, r6\n\t"
  176825. #endif
  176826. #ifdef WOLFSSL_KEIL
  176827. "adcs r3, r3, %[r]\n\t"
  176828. #elif defined(__clang__)
  176829. "adcs r3, %[r]\n\t"
  176830. #else
  176831. "adc r3, %[r]\n\t"
  176832. #endif
  176833. #ifdef WOLFSSL_KEIL
  176834. "adcs r4, r4, %[r]\n\t"
  176835. #elif defined(__clang__)
  176836. "adcs r4, %[r]\n\t"
  176837. #else
  176838. "adc r4, %[r]\n\t"
  176839. #endif
  176840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176841. "adds r2, r2, r6\n\t"
  176842. #else
  176843. "add r2, r2, r6\n\t"
  176844. #endif
  176845. #ifdef WOLFSSL_KEIL
  176846. "adcs r3, r3, %[r]\n\t"
  176847. #elif defined(__clang__)
  176848. "adcs r3, %[r]\n\t"
  176849. #else
  176850. "adc r3, %[r]\n\t"
  176851. #endif
  176852. #ifdef WOLFSSL_KEIL
  176853. "adcs r4, r4, %[r]\n\t"
  176854. #elif defined(__clang__)
  176855. "adcs r4, %[r]\n\t"
  176856. #else
  176857. "adc r4, %[r]\n\t"
  176858. #endif
  176859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176860. "lsrs r6, r7, #16\n\t"
  176861. #else
  176862. "lsr r6, r7, #16\n\t"
  176863. #endif
  176864. #ifdef WOLFSSL_KEIL
  176865. "muls r5, r6, r5\n\t"
  176866. #elif defined(__clang__)
  176867. "muls r5, r6\n\t"
  176868. #else
  176869. "mul r5, r6\n\t"
  176870. #endif
  176871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176872. "lsrs r6, r5, #16\n\t"
  176873. #else
  176874. "lsr r6, r5, #16\n\t"
  176875. #endif
  176876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176877. "lsls r5, r5, #16\n\t"
  176878. #else
  176879. "lsl r5, r5, #16\n\t"
  176880. #endif
  176881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176882. "adds r2, r2, r5\n\t"
  176883. #else
  176884. "add r2, r2, r5\n\t"
  176885. #endif
  176886. #ifdef WOLFSSL_KEIL
  176887. "adcs r3, r3, r6\n\t"
  176888. #elif defined(__clang__)
  176889. "adcs r3, r6\n\t"
  176890. #else
  176891. "adc r3, r6\n\t"
  176892. #endif
  176893. #ifdef WOLFSSL_KEIL
  176894. "adcs r4, r4, %[r]\n\t"
  176895. #elif defined(__clang__)
  176896. "adcs r4, %[r]\n\t"
  176897. #else
  176898. "adc r4, %[r]\n\t"
  176899. #endif
  176900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176901. "adds r2, r2, r5\n\t"
  176902. #else
  176903. "add r2, r2, r5\n\t"
  176904. #endif
  176905. #ifdef WOLFSSL_KEIL
  176906. "adcs r3, r3, r6\n\t"
  176907. #elif defined(__clang__)
  176908. "adcs r3, r6\n\t"
  176909. #else
  176910. "adc r3, r6\n\t"
  176911. #endif
  176912. #ifdef WOLFSSL_KEIL
  176913. "adcs r4, r4, %[r]\n\t"
  176914. #elif defined(__clang__)
  176915. "adcs r4, %[r]\n\t"
  176916. #else
  176917. "adc r4, %[r]\n\t"
  176918. #endif
  176919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176920. "lsrs r5, %[a], #16\n\t"
  176921. #else
  176922. "lsr r5, %[a], #16\n\t"
  176923. #endif
  176924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176925. "lsrs r6, r7, #16\n\t"
  176926. #else
  176927. "lsr r6, r7, #16\n\t"
  176928. #endif
  176929. #ifdef WOLFSSL_KEIL
  176930. "muls r6, r5, r6\n\t"
  176931. #elif defined(__clang__)
  176932. "muls r6, r5\n\t"
  176933. #else
  176934. "mul r6, r5\n\t"
  176935. #endif
  176936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176937. "adds r3, r3, r6\n\t"
  176938. #else
  176939. "add r3, r3, r6\n\t"
  176940. #endif
  176941. #ifdef WOLFSSL_KEIL
  176942. "adcs r4, r4, %[r]\n\t"
  176943. #elif defined(__clang__)
  176944. "adcs r4, %[r]\n\t"
  176945. #else
  176946. "adc r4, %[r]\n\t"
  176947. #endif
  176948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176949. "adds r3, r3, r6\n\t"
  176950. #else
  176951. "add r3, r3, r6\n\t"
  176952. #endif
  176953. #ifdef WOLFSSL_KEIL
  176954. "adcs r4, r4, %[r]\n\t"
  176955. #elif defined(__clang__)
  176956. "adcs r4, %[r]\n\t"
  176957. #else
  176958. "adc r4, %[r]\n\t"
  176959. #endif
  176960. "uxth r6, r7\n\t"
  176961. #ifdef WOLFSSL_KEIL
  176962. "muls r5, r6, r5\n\t"
  176963. #elif defined(__clang__)
  176964. "muls r5, r6\n\t"
  176965. #else
  176966. "mul r5, r6\n\t"
  176967. #endif
  176968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176969. "lsrs r6, r5, #16\n\t"
  176970. #else
  176971. "lsr r6, r5, #16\n\t"
  176972. #endif
  176973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176974. "lsls r5, r5, #16\n\t"
  176975. #else
  176976. "lsl r5, r5, #16\n\t"
  176977. #endif
  176978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176979. "adds r2, r2, r5\n\t"
  176980. #else
  176981. "add r2, r2, r5\n\t"
  176982. #endif
  176983. #ifdef WOLFSSL_KEIL
  176984. "adcs r3, r3, r6\n\t"
  176985. #elif defined(__clang__)
  176986. "adcs r3, r6\n\t"
  176987. #else
  176988. "adc r3, r6\n\t"
  176989. #endif
  176990. #ifdef WOLFSSL_KEIL
  176991. "adcs r4, r4, %[r]\n\t"
  176992. #elif defined(__clang__)
  176993. "adcs r4, %[r]\n\t"
  176994. #else
  176995. "adc r4, %[r]\n\t"
  176996. #endif
  176997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176998. "adds r2, r2, r5\n\t"
  176999. #else
  177000. "add r2, r2, r5\n\t"
  177001. #endif
  177002. #ifdef WOLFSSL_KEIL
  177003. "adcs r3, r3, r6\n\t"
  177004. #elif defined(__clang__)
  177005. "adcs r3, r6\n\t"
  177006. #else
  177007. "adc r3, r6\n\t"
  177008. #endif
  177009. #ifdef WOLFSSL_KEIL
  177010. "adcs r4, r4, %[r]\n\t"
  177011. #elif defined(__clang__)
  177012. "adcs r4, %[r]\n\t"
  177013. #else
  177014. "adc r4, %[r]\n\t"
  177015. #endif
  177016. "# A[12] * A[12]\n\t"
  177017. "mov r7, r10\n\t"
  177018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177019. "lsrs r6, r7, #16\n\t"
  177020. #else
  177021. "lsr r6, r7, #16\n\t"
  177022. #endif
  177023. "uxth r5, r7\n\t"
  177024. #ifdef WOLFSSL_KEIL
  177025. "muls r5, r5, r5\n\t"
  177026. #elif defined(__clang__)
  177027. "muls r5, r5\n\t"
  177028. #else
  177029. "mul r5, r5\n\t"
  177030. #endif
  177031. #ifdef WOLFSSL_KEIL
  177032. "muls r6, r6, r6\n\t"
  177033. #elif defined(__clang__)
  177034. "muls r6, r6\n\t"
  177035. #else
  177036. "mul r6, r6\n\t"
  177037. #endif
  177038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177039. "adds r2, r2, r5\n\t"
  177040. #else
  177041. "add r2, r2, r5\n\t"
  177042. #endif
  177043. #ifdef WOLFSSL_KEIL
  177044. "adcs r3, r3, r6\n\t"
  177045. #elif defined(__clang__)
  177046. "adcs r3, r6\n\t"
  177047. #else
  177048. "adc r3, r6\n\t"
  177049. #endif
  177050. #ifdef WOLFSSL_KEIL
  177051. "adcs r4, r4, %[r]\n\t"
  177052. #elif defined(__clang__)
  177053. "adcs r4, %[r]\n\t"
  177054. #else
  177055. "adc r4, %[r]\n\t"
  177056. #endif
  177057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177058. "lsrs r6, r7, #16\n\t"
  177059. #else
  177060. "lsr r6, r7, #16\n\t"
  177061. #endif
  177062. "uxth r5, r7\n\t"
  177063. #ifdef WOLFSSL_KEIL
  177064. "muls r5, r6, r5\n\t"
  177065. #elif defined(__clang__)
  177066. "muls r5, r6\n\t"
  177067. #else
  177068. "mul r5, r6\n\t"
  177069. #endif
  177070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177071. "lsrs r6, r5, #15\n\t"
  177072. #else
  177073. "lsr r6, r5, #15\n\t"
  177074. #endif
  177075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177076. "lsls r5, r5, #17\n\t"
  177077. #else
  177078. "lsl r5, r5, #17\n\t"
  177079. #endif
  177080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177081. "adds r2, r2, r5\n\t"
  177082. #else
  177083. "add r2, r2, r5\n\t"
  177084. #endif
  177085. #ifdef WOLFSSL_KEIL
  177086. "adcs r3, r3, r6\n\t"
  177087. #elif defined(__clang__)
  177088. "adcs r3, r6\n\t"
  177089. #else
  177090. "adc r3, r6\n\t"
  177091. #endif
  177092. #ifdef WOLFSSL_KEIL
  177093. "adcs r4, r4, %[r]\n\t"
  177094. #elif defined(__clang__)
  177095. "adcs r4, %[r]\n\t"
  177096. #else
  177097. "adc r4, %[r]\n\t"
  177098. #endif
  177099. "mov %[r], r8\n\t"
  177100. "str r2, [%[r], #96]\n\t"
  177101. "movs %[r], #0\n\t"
  177102. "# A[13] * A[12]\n\t"
  177103. "movs r2, #0\n\t"
  177104. "mov %[a], r9\n\t"
  177105. "mov %[a], r11\n\t"
  177106. "uxth r5, %[a]\n\t"
  177107. "uxth r6, r7\n\t"
  177108. #ifdef WOLFSSL_KEIL
  177109. "muls r6, r5, r6\n\t"
  177110. #elif defined(__clang__)
  177111. "muls r6, r5\n\t"
  177112. #else
  177113. "mul r6, r5\n\t"
  177114. #endif
  177115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177116. "adds r3, r3, r6\n\t"
  177117. #else
  177118. "add r3, r3, r6\n\t"
  177119. #endif
  177120. #ifdef WOLFSSL_KEIL
  177121. "adcs r4, r4, %[r]\n\t"
  177122. #elif defined(__clang__)
  177123. "adcs r4, %[r]\n\t"
  177124. #else
  177125. "adc r4, %[r]\n\t"
  177126. #endif
  177127. #ifdef WOLFSSL_KEIL
  177128. "adcs r2, r2, %[r]\n\t"
  177129. #elif defined(__clang__)
  177130. "adcs r2, %[r]\n\t"
  177131. #else
  177132. "adc r2, %[r]\n\t"
  177133. #endif
  177134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177135. "adds r3, r3, r6\n\t"
  177136. #else
  177137. "add r3, r3, r6\n\t"
  177138. #endif
  177139. #ifdef WOLFSSL_KEIL
  177140. "adcs r4, r4, %[r]\n\t"
  177141. #elif defined(__clang__)
  177142. "adcs r4, %[r]\n\t"
  177143. #else
  177144. "adc r4, %[r]\n\t"
  177145. #endif
  177146. #ifdef WOLFSSL_KEIL
  177147. "adcs r2, r2, %[r]\n\t"
  177148. #elif defined(__clang__)
  177149. "adcs r2, %[r]\n\t"
  177150. #else
  177151. "adc r2, %[r]\n\t"
  177152. #endif
  177153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177154. "lsrs r6, r7, #16\n\t"
  177155. #else
  177156. "lsr r6, r7, #16\n\t"
  177157. #endif
  177158. #ifdef WOLFSSL_KEIL
  177159. "muls r5, r6, r5\n\t"
  177160. #elif defined(__clang__)
  177161. "muls r5, r6\n\t"
  177162. #else
  177163. "mul r5, r6\n\t"
  177164. #endif
  177165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177166. "lsrs r6, r5, #16\n\t"
  177167. #else
  177168. "lsr r6, r5, #16\n\t"
  177169. #endif
  177170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177171. "lsls r5, r5, #16\n\t"
  177172. #else
  177173. "lsl r5, r5, #16\n\t"
  177174. #endif
  177175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177176. "adds r3, r3, r5\n\t"
  177177. #else
  177178. "add r3, r3, r5\n\t"
  177179. #endif
  177180. #ifdef WOLFSSL_KEIL
  177181. "adcs r4, r4, r6\n\t"
  177182. #elif defined(__clang__)
  177183. "adcs r4, r6\n\t"
  177184. #else
  177185. "adc r4, r6\n\t"
  177186. #endif
  177187. #ifdef WOLFSSL_KEIL
  177188. "adcs r2, r2, %[r]\n\t"
  177189. #elif defined(__clang__)
  177190. "adcs r2, %[r]\n\t"
  177191. #else
  177192. "adc r2, %[r]\n\t"
  177193. #endif
  177194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177195. "adds r3, r3, r5\n\t"
  177196. #else
  177197. "add r3, r3, r5\n\t"
  177198. #endif
  177199. #ifdef WOLFSSL_KEIL
  177200. "adcs r4, r4, r6\n\t"
  177201. #elif defined(__clang__)
  177202. "adcs r4, r6\n\t"
  177203. #else
  177204. "adc r4, r6\n\t"
  177205. #endif
  177206. #ifdef WOLFSSL_KEIL
  177207. "adcs r2, r2, %[r]\n\t"
  177208. #elif defined(__clang__)
  177209. "adcs r2, %[r]\n\t"
  177210. #else
  177211. "adc r2, %[r]\n\t"
  177212. #endif
  177213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177214. "lsrs r5, %[a], #16\n\t"
  177215. #else
  177216. "lsr r5, %[a], #16\n\t"
  177217. #endif
  177218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177219. "lsrs r6, r7, #16\n\t"
  177220. #else
  177221. "lsr r6, r7, #16\n\t"
  177222. #endif
  177223. #ifdef WOLFSSL_KEIL
  177224. "muls r6, r5, r6\n\t"
  177225. #elif defined(__clang__)
  177226. "muls r6, r5\n\t"
  177227. #else
  177228. "mul r6, r5\n\t"
  177229. #endif
  177230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177231. "adds r4, r4, r6\n\t"
  177232. #else
  177233. "add r4, r4, r6\n\t"
  177234. #endif
  177235. #ifdef WOLFSSL_KEIL
  177236. "adcs r2, r2, %[r]\n\t"
  177237. #elif defined(__clang__)
  177238. "adcs r2, %[r]\n\t"
  177239. #else
  177240. "adc r2, %[r]\n\t"
  177241. #endif
  177242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177243. "adds r4, r4, r6\n\t"
  177244. #else
  177245. "add r4, r4, r6\n\t"
  177246. #endif
  177247. #ifdef WOLFSSL_KEIL
  177248. "adcs r2, r2, %[r]\n\t"
  177249. #elif defined(__clang__)
  177250. "adcs r2, %[r]\n\t"
  177251. #else
  177252. "adc r2, %[r]\n\t"
  177253. #endif
  177254. "uxth r6, r7\n\t"
  177255. #ifdef WOLFSSL_KEIL
  177256. "muls r5, r6, r5\n\t"
  177257. #elif defined(__clang__)
  177258. "muls r5, r6\n\t"
  177259. #else
  177260. "mul r5, r6\n\t"
  177261. #endif
  177262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177263. "lsrs r6, r5, #16\n\t"
  177264. #else
  177265. "lsr r6, r5, #16\n\t"
  177266. #endif
  177267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177268. "lsls r5, r5, #16\n\t"
  177269. #else
  177270. "lsl r5, r5, #16\n\t"
  177271. #endif
  177272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177273. "adds r3, r3, r5\n\t"
  177274. #else
  177275. "add r3, r3, r5\n\t"
  177276. #endif
  177277. #ifdef WOLFSSL_KEIL
  177278. "adcs r4, r4, r6\n\t"
  177279. #elif defined(__clang__)
  177280. "adcs r4, r6\n\t"
  177281. #else
  177282. "adc r4, r6\n\t"
  177283. #endif
  177284. #ifdef WOLFSSL_KEIL
  177285. "adcs r2, r2, %[r]\n\t"
  177286. #elif defined(__clang__)
  177287. "adcs r2, %[r]\n\t"
  177288. #else
  177289. "adc r2, %[r]\n\t"
  177290. #endif
  177291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177292. "adds r3, r3, r5\n\t"
  177293. #else
  177294. "add r3, r3, r5\n\t"
  177295. #endif
  177296. #ifdef WOLFSSL_KEIL
  177297. "adcs r4, r4, r6\n\t"
  177298. #elif defined(__clang__)
  177299. "adcs r4, r6\n\t"
  177300. #else
  177301. "adc r4, r6\n\t"
  177302. #endif
  177303. #ifdef WOLFSSL_KEIL
  177304. "adcs r2, r2, %[r]\n\t"
  177305. #elif defined(__clang__)
  177306. "adcs r2, %[r]\n\t"
  177307. #else
  177308. "adc r2, %[r]\n\t"
  177309. #endif
  177310. "# A[14] * A[11]\n\t"
  177311. "mov %[a], r9\n\t"
  177312. "ldr r7, [%[a], #44]\n\t"
  177313. "mov %[a], r12\n\t"
  177314. "uxth r5, %[a]\n\t"
  177315. "uxth r6, r7\n\t"
  177316. #ifdef WOLFSSL_KEIL
  177317. "muls r6, r5, r6\n\t"
  177318. #elif defined(__clang__)
  177319. "muls r6, r5\n\t"
  177320. #else
  177321. "mul r6, r5\n\t"
  177322. #endif
  177323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177324. "adds r3, r3, r6\n\t"
  177325. #else
  177326. "add r3, r3, r6\n\t"
  177327. #endif
  177328. #ifdef WOLFSSL_KEIL
  177329. "adcs r4, r4, %[r]\n\t"
  177330. #elif defined(__clang__)
  177331. "adcs r4, %[r]\n\t"
  177332. #else
  177333. "adc r4, %[r]\n\t"
  177334. #endif
  177335. #ifdef WOLFSSL_KEIL
  177336. "adcs r2, r2, %[r]\n\t"
  177337. #elif defined(__clang__)
  177338. "adcs r2, %[r]\n\t"
  177339. #else
  177340. "adc r2, %[r]\n\t"
  177341. #endif
  177342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177343. "adds r3, r3, r6\n\t"
  177344. #else
  177345. "add r3, r3, r6\n\t"
  177346. #endif
  177347. #ifdef WOLFSSL_KEIL
  177348. "adcs r4, r4, %[r]\n\t"
  177349. #elif defined(__clang__)
  177350. "adcs r4, %[r]\n\t"
  177351. #else
  177352. "adc r4, %[r]\n\t"
  177353. #endif
  177354. #ifdef WOLFSSL_KEIL
  177355. "adcs r2, r2, %[r]\n\t"
  177356. #elif defined(__clang__)
  177357. "adcs r2, %[r]\n\t"
  177358. #else
  177359. "adc r2, %[r]\n\t"
  177360. #endif
  177361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177362. "lsrs r6, r7, #16\n\t"
  177363. #else
  177364. "lsr r6, r7, #16\n\t"
  177365. #endif
  177366. #ifdef WOLFSSL_KEIL
  177367. "muls r5, r6, r5\n\t"
  177368. #elif defined(__clang__)
  177369. "muls r5, r6\n\t"
  177370. #else
  177371. "mul r5, r6\n\t"
  177372. #endif
  177373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177374. "lsrs r6, r5, #16\n\t"
  177375. #else
  177376. "lsr r6, r5, #16\n\t"
  177377. #endif
  177378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177379. "lsls r5, r5, #16\n\t"
  177380. #else
  177381. "lsl r5, r5, #16\n\t"
  177382. #endif
  177383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177384. "adds r3, r3, r5\n\t"
  177385. #else
  177386. "add r3, r3, r5\n\t"
  177387. #endif
  177388. #ifdef WOLFSSL_KEIL
  177389. "adcs r4, r4, r6\n\t"
  177390. #elif defined(__clang__)
  177391. "adcs r4, r6\n\t"
  177392. #else
  177393. "adc r4, r6\n\t"
  177394. #endif
  177395. #ifdef WOLFSSL_KEIL
  177396. "adcs r2, r2, %[r]\n\t"
  177397. #elif defined(__clang__)
  177398. "adcs r2, %[r]\n\t"
  177399. #else
  177400. "adc r2, %[r]\n\t"
  177401. #endif
  177402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177403. "adds r3, r3, r5\n\t"
  177404. #else
  177405. "add r3, r3, r5\n\t"
  177406. #endif
  177407. #ifdef WOLFSSL_KEIL
  177408. "adcs r4, r4, r6\n\t"
  177409. #elif defined(__clang__)
  177410. "adcs r4, r6\n\t"
  177411. #else
  177412. "adc r4, r6\n\t"
  177413. #endif
  177414. #ifdef WOLFSSL_KEIL
  177415. "adcs r2, r2, %[r]\n\t"
  177416. #elif defined(__clang__)
  177417. "adcs r2, %[r]\n\t"
  177418. #else
  177419. "adc r2, %[r]\n\t"
  177420. #endif
  177421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177422. "lsrs r5, %[a], #16\n\t"
  177423. #else
  177424. "lsr r5, %[a], #16\n\t"
  177425. #endif
  177426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177427. "lsrs r6, r7, #16\n\t"
  177428. #else
  177429. "lsr r6, r7, #16\n\t"
  177430. #endif
  177431. #ifdef WOLFSSL_KEIL
  177432. "muls r6, r5, r6\n\t"
  177433. #elif defined(__clang__)
  177434. "muls r6, r5\n\t"
  177435. #else
  177436. "mul r6, r5\n\t"
  177437. #endif
  177438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177439. "adds r4, r4, r6\n\t"
  177440. #else
  177441. "add r4, r4, r6\n\t"
  177442. #endif
  177443. #ifdef WOLFSSL_KEIL
  177444. "adcs r2, r2, %[r]\n\t"
  177445. #elif defined(__clang__)
  177446. "adcs r2, %[r]\n\t"
  177447. #else
  177448. "adc r2, %[r]\n\t"
  177449. #endif
  177450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177451. "adds r4, r4, r6\n\t"
  177452. #else
  177453. "add r4, r4, r6\n\t"
  177454. #endif
  177455. #ifdef WOLFSSL_KEIL
  177456. "adcs r2, r2, %[r]\n\t"
  177457. #elif defined(__clang__)
  177458. "adcs r2, %[r]\n\t"
  177459. #else
  177460. "adc r2, %[r]\n\t"
  177461. #endif
  177462. "uxth r6, r7\n\t"
  177463. #ifdef WOLFSSL_KEIL
  177464. "muls r5, r6, r5\n\t"
  177465. #elif defined(__clang__)
  177466. "muls r5, r6\n\t"
  177467. #else
  177468. "mul r5, r6\n\t"
  177469. #endif
  177470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177471. "lsrs r6, r5, #16\n\t"
  177472. #else
  177473. "lsr r6, r5, #16\n\t"
  177474. #endif
  177475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177476. "lsls r5, r5, #16\n\t"
  177477. #else
  177478. "lsl r5, r5, #16\n\t"
  177479. #endif
  177480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177481. "adds r3, r3, r5\n\t"
  177482. #else
  177483. "add r3, r3, r5\n\t"
  177484. #endif
  177485. #ifdef WOLFSSL_KEIL
  177486. "adcs r4, r4, r6\n\t"
  177487. #elif defined(__clang__)
  177488. "adcs r4, r6\n\t"
  177489. #else
  177490. "adc r4, r6\n\t"
  177491. #endif
  177492. #ifdef WOLFSSL_KEIL
  177493. "adcs r2, r2, %[r]\n\t"
  177494. #elif defined(__clang__)
  177495. "adcs r2, %[r]\n\t"
  177496. #else
  177497. "adc r2, %[r]\n\t"
  177498. #endif
  177499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177500. "adds r3, r3, r5\n\t"
  177501. #else
  177502. "add r3, r3, r5\n\t"
  177503. #endif
  177504. #ifdef WOLFSSL_KEIL
  177505. "adcs r4, r4, r6\n\t"
  177506. #elif defined(__clang__)
  177507. "adcs r4, r6\n\t"
  177508. #else
  177509. "adc r4, r6\n\t"
  177510. #endif
  177511. #ifdef WOLFSSL_KEIL
  177512. "adcs r2, r2, %[r]\n\t"
  177513. #elif defined(__clang__)
  177514. "adcs r2, %[r]\n\t"
  177515. #else
  177516. "adc r2, %[r]\n\t"
  177517. #endif
  177518. "# A[15] * A[10]\n\t"
  177519. "mov %[a], r9\n\t"
  177520. "ldr r7, [%[a], #40]\n\t"
  177521. "mov %[a], lr\n\t"
  177522. "uxth r5, %[a]\n\t"
  177523. "uxth r6, r7\n\t"
  177524. #ifdef WOLFSSL_KEIL
  177525. "muls r6, r5, r6\n\t"
  177526. #elif defined(__clang__)
  177527. "muls r6, r5\n\t"
  177528. #else
  177529. "mul r6, r5\n\t"
  177530. #endif
  177531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177532. "adds r3, r3, r6\n\t"
  177533. #else
  177534. "add r3, r3, r6\n\t"
  177535. #endif
  177536. #ifdef WOLFSSL_KEIL
  177537. "adcs r4, r4, %[r]\n\t"
  177538. #elif defined(__clang__)
  177539. "adcs r4, %[r]\n\t"
  177540. #else
  177541. "adc r4, %[r]\n\t"
  177542. #endif
  177543. #ifdef WOLFSSL_KEIL
  177544. "adcs r2, r2, %[r]\n\t"
  177545. #elif defined(__clang__)
  177546. "adcs r2, %[r]\n\t"
  177547. #else
  177548. "adc r2, %[r]\n\t"
  177549. #endif
  177550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177551. "adds r3, r3, r6\n\t"
  177552. #else
  177553. "add r3, r3, r6\n\t"
  177554. #endif
  177555. #ifdef WOLFSSL_KEIL
  177556. "adcs r4, r4, %[r]\n\t"
  177557. #elif defined(__clang__)
  177558. "adcs r4, %[r]\n\t"
  177559. #else
  177560. "adc r4, %[r]\n\t"
  177561. #endif
  177562. #ifdef WOLFSSL_KEIL
  177563. "adcs r2, r2, %[r]\n\t"
  177564. #elif defined(__clang__)
  177565. "adcs r2, %[r]\n\t"
  177566. #else
  177567. "adc r2, %[r]\n\t"
  177568. #endif
  177569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177570. "lsrs r6, r7, #16\n\t"
  177571. #else
  177572. "lsr r6, r7, #16\n\t"
  177573. #endif
  177574. #ifdef WOLFSSL_KEIL
  177575. "muls r5, r6, r5\n\t"
  177576. #elif defined(__clang__)
  177577. "muls r5, r6\n\t"
  177578. #else
  177579. "mul r5, r6\n\t"
  177580. #endif
  177581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177582. "lsrs r6, r5, #16\n\t"
  177583. #else
  177584. "lsr r6, r5, #16\n\t"
  177585. #endif
  177586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177587. "lsls r5, r5, #16\n\t"
  177588. #else
  177589. "lsl r5, r5, #16\n\t"
  177590. #endif
  177591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177592. "adds r3, r3, r5\n\t"
  177593. #else
  177594. "add r3, r3, r5\n\t"
  177595. #endif
  177596. #ifdef WOLFSSL_KEIL
  177597. "adcs r4, r4, r6\n\t"
  177598. #elif defined(__clang__)
  177599. "adcs r4, r6\n\t"
  177600. #else
  177601. "adc r4, r6\n\t"
  177602. #endif
  177603. #ifdef WOLFSSL_KEIL
  177604. "adcs r2, r2, %[r]\n\t"
  177605. #elif defined(__clang__)
  177606. "adcs r2, %[r]\n\t"
  177607. #else
  177608. "adc r2, %[r]\n\t"
  177609. #endif
  177610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177611. "adds r3, r3, r5\n\t"
  177612. #else
  177613. "add r3, r3, r5\n\t"
  177614. #endif
  177615. #ifdef WOLFSSL_KEIL
  177616. "adcs r4, r4, r6\n\t"
  177617. #elif defined(__clang__)
  177618. "adcs r4, r6\n\t"
  177619. #else
  177620. "adc r4, r6\n\t"
  177621. #endif
  177622. #ifdef WOLFSSL_KEIL
  177623. "adcs r2, r2, %[r]\n\t"
  177624. #elif defined(__clang__)
  177625. "adcs r2, %[r]\n\t"
  177626. #else
  177627. "adc r2, %[r]\n\t"
  177628. #endif
  177629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177630. "lsrs r5, %[a], #16\n\t"
  177631. #else
  177632. "lsr r5, %[a], #16\n\t"
  177633. #endif
  177634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177635. "lsrs r6, r7, #16\n\t"
  177636. #else
  177637. "lsr r6, r7, #16\n\t"
  177638. #endif
  177639. #ifdef WOLFSSL_KEIL
  177640. "muls r6, r5, r6\n\t"
  177641. #elif defined(__clang__)
  177642. "muls r6, r5\n\t"
  177643. #else
  177644. "mul r6, r5\n\t"
  177645. #endif
  177646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177647. "adds r4, r4, r6\n\t"
  177648. #else
  177649. "add r4, r4, r6\n\t"
  177650. #endif
  177651. #ifdef WOLFSSL_KEIL
  177652. "adcs r2, r2, %[r]\n\t"
  177653. #elif defined(__clang__)
  177654. "adcs r2, %[r]\n\t"
  177655. #else
  177656. "adc r2, %[r]\n\t"
  177657. #endif
  177658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177659. "adds r4, r4, r6\n\t"
  177660. #else
  177661. "add r4, r4, r6\n\t"
  177662. #endif
  177663. #ifdef WOLFSSL_KEIL
  177664. "adcs r2, r2, %[r]\n\t"
  177665. #elif defined(__clang__)
  177666. "adcs r2, %[r]\n\t"
  177667. #else
  177668. "adc r2, %[r]\n\t"
  177669. #endif
  177670. "uxth r6, r7\n\t"
  177671. #ifdef WOLFSSL_KEIL
  177672. "muls r5, r6, r5\n\t"
  177673. #elif defined(__clang__)
  177674. "muls r5, r6\n\t"
  177675. #else
  177676. "mul r5, r6\n\t"
  177677. #endif
  177678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177679. "lsrs r6, r5, #16\n\t"
  177680. #else
  177681. "lsr r6, r5, #16\n\t"
  177682. #endif
  177683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177684. "lsls r5, r5, #16\n\t"
  177685. #else
  177686. "lsl r5, r5, #16\n\t"
  177687. #endif
  177688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177689. "adds r3, r3, r5\n\t"
  177690. #else
  177691. "add r3, r3, r5\n\t"
  177692. #endif
  177693. #ifdef WOLFSSL_KEIL
  177694. "adcs r4, r4, r6\n\t"
  177695. #elif defined(__clang__)
  177696. "adcs r4, r6\n\t"
  177697. #else
  177698. "adc r4, r6\n\t"
  177699. #endif
  177700. #ifdef WOLFSSL_KEIL
  177701. "adcs r2, r2, %[r]\n\t"
  177702. #elif defined(__clang__)
  177703. "adcs r2, %[r]\n\t"
  177704. #else
  177705. "adc r2, %[r]\n\t"
  177706. #endif
  177707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177708. "adds r3, r3, r5\n\t"
  177709. #else
  177710. "add r3, r3, r5\n\t"
  177711. #endif
  177712. #ifdef WOLFSSL_KEIL
  177713. "adcs r4, r4, r6\n\t"
  177714. #elif defined(__clang__)
  177715. "adcs r4, r6\n\t"
  177716. #else
  177717. "adc r4, r6\n\t"
  177718. #endif
  177719. #ifdef WOLFSSL_KEIL
  177720. "adcs r2, r2, %[r]\n\t"
  177721. #elif defined(__clang__)
  177722. "adcs r2, %[r]\n\t"
  177723. #else
  177724. "adc r2, %[r]\n\t"
  177725. #endif
  177726. "mov %[r], r8\n\t"
  177727. "str r3, [%[r], #100]\n\t"
  177728. "movs %[r], #0\n\t"
  177729. "# A[15] * A[11]\n\t"
  177730. "movs r3, #0\n\t"
  177731. "mov %[a], r9\n\t"
  177732. "ldr r7, [%[a], #44]\n\t"
  177733. "mov %[a], lr\n\t"
  177734. "uxth r5, %[a]\n\t"
  177735. "uxth r6, r7\n\t"
  177736. #ifdef WOLFSSL_KEIL
  177737. "muls r6, r5, r6\n\t"
  177738. #elif defined(__clang__)
  177739. "muls r6, r5\n\t"
  177740. #else
  177741. "mul r6, r5\n\t"
  177742. #endif
  177743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177744. "adds r4, r4, r6\n\t"
  177745. #else
  177746. "add r4, r4, r6\n\t"
  177747. #endif
  177748. #ifdef WOLFSSL_KEIL
  177749. "adcs r2, r2, %[r]\n\t"
  177750. #elif defined(__clang__)
  177751. "adcs r2, %[r]\n\t"
  177752. #else
  177753. "adc r2, %[r]\n\t"
  177754. #endif
  177755. #ifdef WOLFSSL_KEIL
  177756. "adcs r3, r3, %[r]\n\t"
  177757. #elif defined(__clang__)
  177758. "adcs r3, %[r]\n\t"
  177759. #else
  177760. "adc r3, %[r]\n\t"
  177761. #endif
  177762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177763. "adds r4, r4, r6\n\t"
  177764. #else
  177765. "add r4, r4, r6\n\t"
  177766. #endif
  177767. #ifdef WOLFSSL_KEIL
  177768. "adcs r2, r2, %[r]\n\t"
  177769. #elif defined(__clang__)
  177770. "adcs r2, %[r]\n\t"
  177771. #else
  177772. "adc r2, %[r]\n\t"
  177773. #endif
  177774. #ifdef WOLFSSL_KEIL
  177775. "adcs r3, r3, %[r]\n\t"
  177776. #elif defined(__clang__)
  177777. "adcs r3, %[r]\n\t"
  177778. #else
  177779. "adc r3, %[r]\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 r5, r6, r5\n\t"
  177788. #elif defined(__clang__)
  177789. "muls r5, r6\n\t"
  177790. #else
  177791. "mul r5, r6\n\t"
  177792. #endif
  177793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177794. "lsrs r6, r5, #16\n\t"
  177795. #else
  177796. "lsr r6, r5, #16\n\t"
  177797. #endif
  177798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177799. "lsls r5, r5, #16\n\t"
  177800. #else
  177801. "lsl r5, r5, #16\n\t"
  177802. #endif
  177803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177804. "adds r4, r4, r5\n\t"
  177805. #else
  177806. "add r4, r4, r5\n\t"
  177807. #endif
  177808. #ifdef WOLFSSL_KEIL
  177809. "adcs r2, r2, r6\n\t"
  177810. #elif defined(__clang__)
  177811. "adcs r2, r6\n\t"
  177812. #else
  177813. "adc r2, r6\n\t"
  177814. #endif
  177815. #ifdef WOLFSSL_KEIL
  177816. "adcs r3, r3, %[r]\n\t"
  177817. #elif defined(__clang__)
  177818. "adcs r3, %[r]\n\t"
  177819. #else
  177820. "adc r3, %[r]\n\t"
  177821. #endif
  177822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177823. "adds r4, r4, r5\n\t"
  177824. #else
  177825. "add r4, r4, r5\n\t"
  177826. #endif
  177827. #ifdef WOLFSSL_KEIL
  177828. "adcs r2, r2, r6\n\t"
  177829. #elif defined(__clang__)
  177830. "adcs r2, r6\n\t"
  177831. #else
  177832. "adc r2, r6\n\t"
  177833. #endif
  177834. #ifdef WOLFSSL_KEIL
  177835. "adcs r3, r3, %[r]\n\t"
  177836. #elif defined(__clang__)
  177837. "adcs r3, %[r]\n\t"
  177838. #else
  177839. "adc r3, %[r]\n\t"
  177840. #endif
  177841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177842. "lsrs r5, %[a], #16\n\t"
  177843. #else
  177844. "lsr r5, %[a], #16\n\t"
  177845. #endif
  177846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177847. "lsrs r6, r7, #16\n\t"
  177848. #else
  177849. "lsr r6, r7, #16\n\t"
  177850. #endif
  177851. #ifdef WOLFSSL_KEIL
  177852. "muls r6, r5, r6\n\t"
  177853. #elif defined(__clang__)
  177854. "muls r6, r5\n\t"
  177855. #else
  177856. "mul r6, r5\n\t"
  177857. #endif
  177858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177859. "adds r2, r2, r6\n\t"
  177860. #else
  177861. "add r2, r2, r6\n\t"
  177862. #endif
  177863. #ifdef WOLFSSL_KEIL
  177864. "adcs r3, r3, %[r]\n\t"
  177865. #elif defined(__clang__)
  177866. "adcs r3, %[r]\n\t"
  177867. #else
  177868. "adc r3, %[r]\n\t"
  177869. #endif
  177870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177871. "adds r2, r2, r6\n\t"
  177872. #else
  177873. "add r2, r2, r6\n\t"
  177874. #endif
  177875. #ifdef WOLFSSL_KEIL
  177876. "adcs r3, r3, %[r]\n\t"
  177877. #elif defined(__clang__)
  177878. "adcs r3, %[r]\n\t"
  177879. #else
  177880. "adc r3, %[r]\n\t"
  177881. #endif
  177882. "uxth r6, r7\n\t"
  177883. #ifdef WOLFSSL_KEIL
  177884. "muls r5, r6, r5\n\t"
  177885. #elif defined(__clang__)
  177886. "muls r5, r6\n\t"
  177887. #else
  177888. "mul r5, r6\n\t"
  177889. #endif
  177890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177891. "lsrs r6, r5, #16\n\t"
  177892. #else
  177893. "lsr r6, r5, #16\n\t"
  177894. #endif
  177895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177896. "lsls r5, r5, #16\n\t"
  177897. #else
  177898. "lsl r5, r5, #16\n\t"
  177899. #endif
  177900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177901. "adds r4, r4, r5\n\t"
  177902. #else
  177903. "add r4, r4, r5\n\t"
  177904. #endif
  177905. #ifdef WOLFSSL_KEIL
  177906. "adcs r2, r2, r6\n\t"
  177907. #elif defined(__clang__)
  177908. "adcs r2, r6\n\t"
  177909. #else
  177910. "adc r2, r6\n\t"
  177911. #endif
  177912. #ifdef WOLFSSL_KEIL
  177913. "adcs r3, r3, %[r]\n\t"
  177914. #elif defined(__clang__)
  177915. "adcs r3, %[r]\n\t"
  177916. #else
  177917. "adc r3, %[r]\n\t"
  177918. #endif
  177919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177920. "adds r4, r4, r5\n\t"
  177921. #else
  177922. "add r4, r4, r5\n\t"
  177923. #endif
  177924. #ifdef WOLFSSL_KEIL
  177925. "adcs r2, r2, r6\n\t"
  177926. #elif defined(__clang__)
  177927. "adcs r2, r6\n\t"
  177928. #else
  177929. "adc r2, r6\n\t"
  177930. #endif
  177931. #ifdef WOLFSSL_KEIL
  177932. "adcs r3, r3, %[r]\n\t"
  177933. #elif defined(__clang__)
  177934. "adcs r3, %[r]\n\t"
  177935. #else
  177936. "adc r3, %[r]\n\t"
  177937. #endif
  177938. "# A[14] * A[12]\n\t"
  177939. "mov %[a], r9\n\t"
  177940. "mov r7, r10\n\t"
  177941. "mov %[a], r12\n\t"
  177942. "uxth r5, %[a]\n\t"
  177943. "uxth r6, r7\n\t"
  177944. #ifdef WOLFSSL_KEIL
  177945. "muls r6, r5, r6\n\t"
  177946. #elif defined(__clang__)
  177947. "muls r6, r5\n\t"
  177948. #else
  177949. "mul r6, r5\n\t"
  177950. #endif
  177951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177952. "adds r4, r4, r6\n\t"
  177953. #else
  177954. "add r4, r4, r6\n\t"
  177955. #endif
  177956. #ifdef WOLFSSL_KEIL
  177957. "adcs r2, r2, %[r]\n\t"
  177958. #elif defined(__clang__)
  177959. "adcs r2, %[r]\n\t"
  177960. #else
  177961. "adc r2, %[r]\n\t"
  177962. #endif
  177963. #ifdef WOLFSSL_KEIL
  177964. "adcs r3, r3, %[r]\n\t"
  177965. #elif defined(__clang__)
  177966. "adcs r3, %[r]\n\t"
  177967. #else
  177968. "adc r3, %[r]\n\t"
  177969. #endif
  177970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177971. "adds r4, r4, r6\n\t"
  177972. #else
  177973. "add r4, r4, r6\n\t"
  177974. #endif
  177975. #ifdef WOLFSSL_KEIL
  177976. "adcs r2, r2, %[r]\n\t"
  177977. #elif defined(__clang__)
  177978. "adcs r2, %[r]\n\t"
  177979. #else
  177980. "adc r2, %[r]\n\t"
  177981. #endif
  177982. #ifdef WOLFSSL_KEIL
  177983. "adcs r3, r3, %[r]\n\t"
  177984. #elif defined(__clang__)
  177985. "adcs r3, %[r]\n\t"
  177986. #else
  177987. "adc r3, %[r]\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 r5, r6, r5\n\t"
  177996. #elif defined(__clang__)
  177997. "muls r5, r6\n\t"
  177998. #else
  177999. "mul r5, r6\n\t"
  178000. #endif
  178001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178002. "lsrs r6, r5, #16\n\t"
  178003. #else
  178004. "lsr r6, r5, #16\n\t"
  178005. #endif
  178006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178007. "lsls r5, r5, #16\n\t"
  178008. #else
  178009. "lsl r5, r5, #16\n\t"
  178010. #endif
  178011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178012. "adds r4, r4, r5\n\t"
  178013. #else
  178014. "add r4, r4, r5\n\t"
  178015. #endif
  178016. #ifdef WOLFSSL_KEIL
  178017. "adcs r2, r2, r6\n\t"
  178018. #elif defined(__clang__)
  178019. "adcs r2, r6\n\t"
  178020. #else
  178021. "adc r2, r6\n\t"
  178022. #endif
  178023. #ifdef WOLFSSL_KEIL
  178024. "adcs r3, r3, %[r]\n\t"
  178025. #elif defined(__clang__)
  178026. "adcs r3, %[r]\n\t"
  178027. #else
  178028. "adc r3, %[r]\n\t"
  178029. #endif
  178030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178031. "adds r4, r4, r5\n\t"
  178032. #else
  178033. "add r4, r4, r5\n\t"
  178034. #endif
  178035. #ifdef WOLFSSL_KEIL
  178036. "adcs r2, r2, r6\n\t"
  178037. #elif defined(__clang__)
  178038. "adcs r2, r6\n\t"
  178039. #else
  178040. "adc r2, r6\n\t"
  178041. #endif
  178042. #ifdef WOLFSSL_KEIL
  178043. "adcs r3, r3, %[r]\n\t"
  178044. #elif defined(__clang__)
  178045. "adcs r3, %[r]\n\t"
  178046. #else
  178047. "adc r3, %[r]\n\t"
  178048. #endif
  178049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178050. "lsrs r5, %[a], #16\n\t"
  178051. #else
  178052. "lsr r5, %[a], #16\n\t"
  178053. #endif
  178054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178055. "lsrs r6, r7, #16\n\t"
  178056. #else
  178057. "lsr r6, r7, #16\n\t"
  178058. #endif
  178059. #ifdef WOLFSSL_KEIL
  178060. "muls r6, r5, r6\n\t"
  178061. #elif defined(__clang__)
  178062. "muls r6, r5\n\t"
  178063. #else
  178064. "mul r6, r5\n\t"
  178065. #endif
  178066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178067. "adds r2, r2, r6\n\t"
  178068. #else
  178069. "add r2, r2, r6\n\t"
  178070. #endif
  178071. #ifdef WOLFSSL_KEIL
  178072. "adcs r3, r3, %[r]\n\t"
  178073. #elif defined(__clang__)
  178074. "adcs r3, %[r]\n\t"
  178075. #else
  178076. "adc r3, %[r]\n\t"
  178077. #endif
  178078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178079. "adds r2, r2, r6\n\t"
  178080. #else
  178081. "add r2, r2, r6\n\t"
  178082. #endif
  178083. #ifdef WOLFSSL_KEIL
  178084. "adcs r3, r3, %[r]\n\t"
  178085. #elif defined(__clang__)
  178086. "adcs r3, %[r]\n\t"
  178087. #else
  178088. "adc r3, %[r]\n\t"
  178089. #endif
  178090. "uxth r6, r7\n\t"
  178091. #ifdef WOLFSSL_KEIL
  178092. "muls r5, r6, r5\n\t"
  178093. #elif defined(__clang__)
  178094. "muls r5, r6\n\t"
  178095. #else
  178096. "mul r5, r6\n\t"
  178097. #endif
  178098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178099. "lsrs r6, r5, #16\n\t"
  178100. #else
  178101. "lsr r6, r5, #16\n\t"
  178102. #endif
  178103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178104. "lsls r5, r5, #16\n\t"
  178105. #else
  178106. "lsl r5, r5, #16\n\t"
  178107. #endif
  178108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178109. "adds r4, r4, r5\n\t"
  178110. #else
  178111. "add r4, r4, r5\n\t"
  178112. #endif
  178113. #ifdef WOLFSSL_KEIL
  178114. "adcs r2, r2, r6\n\t"
  178115. #elif defined(__clang__)
  178116. "adcs r2, r6\n\t"
  178117. #else
  178118. "adc r2, r6\n\t"
  178119. #endif
  178120. #ifdef WOLFSSL_KEIL
  178121. "adcs r3, r3, %[r]\n\t"
  178122. #elif defined(__clang__)
  178123. "adcs r3, %[r]\n\t"
  178124. #else
  178125. "adc r3, %[r]\n\t"
  178126. #endif
  178127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178128. "adds r4, r4, r5\n\t"
  178129. #else
  178130. "add r4, r4, r5\n\t"
  178131. #endif
  178132. #ifdef WOLFSSL_KEIL
  178133. "adcs r2, r2, r6\n\t"
  178134. #elif defined(__clang__)
  178135. "adcs r2, r6\n\t"
  178136. #else
  178137. "adc r2, r6\n\t"
  178138. #endif
  178139. #ifdef WOLFSSL_KEIL
  178140. "adcs r3, r3, %[r]\n\t"
  178141. #elif defined(__clang__)
  178142. "adcs r3, %[r]\n\t"
  178143. #else
  178144. "adc r3, %[r]\n\t"
  178145. #endif
  178146. "# A[13] * A[13]\n\t"
  178147. "mov r7, r11\n\t"
  178148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178149. "lsrs r6, r7, #16\n\t"
  178150. #else
  178151. "lsr r6, r7, #16\n\t"
  178152. #endif
  178153. "uxth r5, r7\n\t"
  178154. #ifdef WOLFSSL_KEIL
  178155. "muls r5, r5, r5\n\t"
  178156. #elif defined(__clang__)
  178157. "muls r5, r5\n\t"
  178158. #else
  178159. "mul r5, r5\n\t"
  178160. #endif
  178161. #ifdef WOLFSSL_KEIL
  178162. "muls r6, r6, r6\n\t"
  178163. #elif defined(__clang__)
  178164. "muls r6, r6\n\t"
  178165. #else
  178166. "mul r6, r6\n\t"
  178167. #endif
  178168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178169. "adds r4, r4, r5\n\t"
  178170. #else
  178171. "add r4, r4, r5\n\t"
  178172. #endif
  178173. #ifdef WOLFSSL_KEIL
  178174. "adcs r2, r2, r6\n\t"
  178175. #elif defined(__clang__)
  178176. "adcs r2, r6\n\t"
  178177. #else
  178178. "adc r2, r6\n\t"
  178179. #endif
  178180. #ifdef WOLFSSL_KEIL
  178181. "adcs r3, r3, %[r]\n\t"
  178182. #elif defined(__clang__)
  178183. "adcs r3, %[r]\n\t"
  178184. #else
  178185. "adc r3, %[r]\n\t"
  178186. #endif
  178187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178188. "lsrs r6, r7, #16\n\t"
  178189. #else
  178190. "lsr r6, r7, #16\n\t"
  178191. #endif
  178192. "uxth r5, r7\n\t"
  178193. #ifdef WOLFSSL_KEIL
  178194. "muls r5, r6, r5\n\t"
  178195. #elif defined(__clang__)
  178196. "muls r5, r6\n\t"
  178197. #else
  178198. "mul r5, r6\n\t"
  178199. #endif
  178200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178201. "lsrs r6, r5, #15\n\t"
  178202. #else
  178203. "lsr r6, r5, #15\n\t"
  178204. #endif
  178205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178206. "lsls r5, r5, #17\n\t"
  178207. #else
  178208. "lsl r5, r5, #17\n\t"
  178209. #endif
  178210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178211. "adds r4, r4, r5\n\t"
  178212. #else
  178213. "add r4, r4, r5\n\t"
  178214. #endif
  178215. #ifdef WOLFSSL_KEIL
  178216. "adcs r2, r2, r6\n\t"
  178217. #elif defined(__clang__)
  178218. "adcs r2, r6\n\t"
  178219. #else
  178220. "adc r2, r6\n\t"
  178221. #endif
  178222. #ifdef WOLFSSL_KEIL
  178223. "adcs r3, r3, %[r]\n\t"
  178224. #elif defined(__clang__)
  178225. "adcs r3, %[r]\n\t"
  178226. #else
  178227. "adc r3, %[r]\n\t"
  178228. #endif
  178229. "mov %[r], r8\n\t"
  178230. "str r4, [%[r], #104]\n\t"
  178231. "movs %[r], #0\n\t"
  178232. "# A[14] * A[13]\n\t"
  178233. "movs r4, #0\n\t"
  178234. "mov %[a], r9\n\t"
  178235. "mov %[a], r12\n\t"
  178236. "uxth r5, %[a]\n\t"
  178237. "uxth r6, r7\n\t"
  178238. #ifdef WOLFSSL_KEIL
  178239. "muls r6, r5, r6\n\t"
  178240. #elif defined(__clang__)
  178241. "muls r6, r5\n\t"
  178242. #else
  178243. "mul r6, r5\n\t"
  178244. #endif
  178245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178246. "adds r2, r2, r6\n\t"
  178247. #else
  178248. "add r2, r2, r6\n\t"
  178249. #endif
  178250. #ifdef WOLFSSL_KEIL
  178251. "adcs r3, r3, %[r]\n\t"
  178252. #elif defined(__clang__)
  178253. "adcs r3, %[r]\n\t"
  178254. #else
  178255. "adc r3, %[r]\n\t"
  178256. #endif
  178257. #ifdef WOLFSSL_KEIL
  178258. "adcs r4, r4, %[r]\n\t"
  178259. #elif defined(__clang__)
  178260. "adcs r4, %[r]\n\t"
  178261. #else
  178262. "adc r4, %[r]\n\t"
  178263. #endif
  178264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178265. "adds r2, r2, r6\n\t"
  178266. #else
  178267. "add r2, r2, r6\n\t"
  178268. #endif
  178269. #ifdef WOLFSSL_KEIL
  178270. "adcs r3, r3, %[r]\n\t"
  178271. #elif defined(__clang__)
  178272. "adcs r3, %[r]\n\t"
  178273. #else
  178274. "adc r3, %[r]\n\t"
  178275. #endif
  178276. #ifdef WOLFSSL_KEIL
  178277. "adcs r4, r4, %[r]\n\t"
  178278. #elif defined(__clang__)
  178279. "adcs r4, %[r]\n\t"
  178280. #else
  178281. "adc r4, %[r]\n\t"
  178282. #endif
  178283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178284. "lsrs r6, r7, #16\n\t"
  178285. #else
  178286. "lsr r6, r7, #16\n\t"
  178287. #endif
  178288. #ifdef WOLFSSL_KEIL
  178289. "muls r5, r6, r5\n\t"
  178290. #elif defined(__clang__)
  178291. "muls r5, r6\n\t"
  178292. #else
  178293. "mul r5, r6\n\t"
  178294. #endif
  178295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178296. "lsrs r6, r5, #16\n\t"
  178297. #else
  178298. "lsr r6, r5, #16\n\t"
  178299. #endif
  178300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178301. "lsls r5, r5, #16\n\t"
  178302. #else
  178303. "lsl r5, r5, #16\n\t"
  178304. #endif
  178305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178306. "adds r2, r2, r5\n\t"
  178307. #else
  178308. "add r2, r2, r5\n\t"
  178309. #endif
  178310. #ifdef WOLFSSL_KEIL
  178311. "adcs r3, r3, r6\n\t"
  178312. #elif defined(__clang__)
  178313. "adcs r3, r6\n\t"
  178314. #else
  178315. "adc r3, r6\n\t"
  178316. #endif
  178317. #ifdef WOLFSSL_KEIL
  178318. "adcs r4, r4, %[r]\n\t"
  178319. #elif defined(__clang__)
  178320. "adcs r4, %[r]\n\t"
  178321. #else
  178322. "adc r4, %[r]\n\t"
  178323. #endif
  178324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178325. "adds r2, r2, r5\n\t"
  178326. #else
  178327. "add r2, r2, r5\n\t"
  178328. #endif
  178329. #ifdef WOLFSSL_KEIL
  178330. "adcs r3, r3, r6\n\t"
  178331. #elif defined(__clang__)
  178332. "adcs r3, r6\n\t"
  178333. #else
  178334. "adc r3, r6\n\t"
  178335. #endif
  178336. #ifdef WOLFSSL_KEIL
  178337. "adcs r4, r4, %[r]\n\t"
  178338. #elif defined(__clang__)
  178339. "adcs r4, %[r]\n\t"
  178340. #else
  178341. "adc r4, %[r]\n\t"
  178342. #endif
  178343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178344. "lsrs r5, %[a], #16\n\t"
  178345. #else
  178346. "lsr r5, %[a], #16\n\t"
  178347. #endif
  178348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178349. "lsrs r6, r7, #16\n\t"
  178350. #else
  178351. "lsr r6, r7, #16\n\t"
  178352. #endif
  178353. #ifdef WOLFSSL_KEIL
  178354. "muls r6, r5, r6\n\t"
  178355. #elif defined(__clang__)
  178356. "muls r6, r5\n\t"
  178357. #else
  178358. "mul r6, r5\n\t"
  178359. #endif
  178360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178361. "adds r3, r3, r6\n\t"
  178362. #else
  178363. "add r3, r3, r6\n\t"
  178364. #endif
  178365. #ifdef WOLFSSL_KEIL
  178366. "adcs r4, r4, %[r]\n\t"
  178367. #elif defined(__clang__)
  178368. "adcs r4, %[r]\n\t"
  178369. #else
  178370. "adc r4, %[r]\n\t"
  178371. #endif
  178372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178373. "adds r3, r3, r6\n\t"
  178374. #else
  178375. "add r3, r3, r6\n\t"
  178376. #endif
  178377. #ifdef WOLFSSL_KEIL
  178378. "adcs r4, r4, %[r]\n\t"
  178379. #elif defined(__clang__)
  178380. "adcs r4, %[r]\n\t"
  178381. #else
  178382. "adc r4, %[r]\n\t"
  178383. #endif
  178384. "uxth r6, r7\n\t"
  178385. #ifdef WOLFSSL_KEIL
  178386. "muls r5, r6, r5\n\t"
  178387. #elif defined(__clang__)
  178388. "muls r5, r6\n\t"
  178389. #else
  178390. "mul r5, r6\n\t"
  178391. #endif
  178392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178393. "lsrs r6, r5, #16\n\t"
  178394. #else
  178395. "lsr r6, r5, #16\n\t"
  178396. #endif
  178397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178398. "lsls r5, r5, #16\n\t"
  178399. #else
  178400. "lsl r5, r5, #16\n\t"
  178401. #endif
  178402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178403. "adds r2, r2, r5\n\t"
  178404. #else
  178405. "add r2, r2, r5\n\t"
  178406. #endif
  178407. #ifdef WOLFSSL_KEIL
  178408. "adcs r3, r3, r6\n\t"
  178409. #elif defined(__clang__)
  178410. "adcs r3, r6\n\t"
  178411. #else
  178412. "adc r3, r6\n\t"
  178413. #endif
  178414. #ifdef WOLFSSL_KEIL
  178415. "adcs r4, r4, %[r]\n\t"
  178416. #elif defined(__clang__)
  178417. "adcs r4, %[r]\n\t"
  178418. #else
  178419. "adc r4, %[r]\n\t"
  178420. #endif
  178421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178422. "adds r2, r2, r5\n\t"
  178423. #else
  178424. "add r2, r2, r5\n\t"
  178425. #endif
  178426. #ifdef WOLFSSL_KEIL
  178427. "adcs r3, r3, r6\n\t"
  178428. #elif defined(__clang__)
  178429. "adcs r3, r6\n\t"
  178430. #else
  178431. "adc r3, r6\n\t"
  178432. #endif
  178433. #ifdef WOLFSSL_KEIL
  178434. "adcs r4, r4, %[r]\n\t"
  178435. #elif defined(__clang__)
  178436. "adcs r4, %[r]\n\t"
  178437. #else
  178438. "adc r4, %[r]\n\t"
  178439. #endif
  178440. "# A[15] * A[12]\n\t"
  178441. "mov %[a], r9\n\t"
  178442. "mov r7, r10\n\t"
  178443. "mov %[a], lr\n\t"
  178444. "uxth r5, %[a]\n\t"
  178445. "uxth r6, r7\n\t"
  178446. #ifdef WOLFSSL_KEIL
  178447. "muls r6, r5, r6\n\t"
  178448. #elif defined(__clang__)
  178449. "muls r6, r5\n\t"
  178450. #else
  178451. "mul r6, r5\n\t"
  178452. #endif
  178453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178454. "adds r2, r2, r6\n\t"
  178455. #else
  178456. "add r2, r2, r6\n\t"
  178457. #endif
  178458. #ifdef WOLFSSL_KEIL
  178459. "adcs r3, r3, %[r]\n\t"
  178460. #elif defined(__clang__)
  178461. "adcs r3, %[r]\n\t"
  178462. #else
  178463. "adc r3, %[r]\n\t"
  178464. #endif
  178465. #ifdef WOLFSSL_KEIL
  178466. "adcs r4, r4, %[r]\n\t"
  178467. #elif defined(__clang__)
  178468. "adcs r4, %[r]\n\t"
  178469. #else
  178470. "adc r4, %[r]\n\t"
  178471. #endif
  178472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178473. "adds r2, r2, r6\n\t"
  178474. #else
  178475. "add r2, r2, r6\n\t"
  178476. #endif
  178477. #ifdef WOLFSSL_KEIL
  178478. "adcs r3, r3, %[r]\n\t"
  178479. #elif defined(__clang__)
  178480. "adcs r3, %[r]\n\t"
  178481. #else
  178482. "adc r3, %[r]\n\t"
  178483. #endif
  178484. #ifdef WOLFSSL_KEIL
  178485. "adcs r4, r4, %[r]\n\t"
  178486. #elif defined(__clang__)
  178487. "adcs r4, %[r]\n\t"
  178488. #else
  178489. "adc r4, %[r]\n\t"
  178490. #endif
  178491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178492. "lsrs r6, r7, #16\n\t"
  178493. #else
  178494. "lsr r6, r7, #16\n\t"
  178495. #endif
  178496. #ifdef WOLFSSL_KEIL
  178497. "muls r5, r6, r5\n\t"
  178498. #elif defined(__clang__)
  178499. "muls r5, r6\n\t"
  178500. #else
  178501. "mul r5, r6\n\t"
  178502. #endif
  178503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178504. "lsrs r6, r5, #16\n\t"
  178505. #else
  178506. "lsr r6, r5, #16\n\t"
  178507. #endif
  178508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178509. "lsls r5, r5, #16\n\t"
  178510. #else
  178511. "lsl r5, r5, #16\n\t"
  178512. #endif
  178513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178514. "adds r2, r2, r5\n\t"
  178515. #else
  178516. "add r2, r2, r5\n\t"
  178517. #endif
  178518. #ifdef WOLFSSL_KEIL
  178519. "adcs r3, r3, r6\n\t"
  178520. #elif defined(__clang__)
  178521. "adcs r3, r6\n\t"
  178522. #else
  178523. "adc r3, r6\n\t"
  178524. #endif
  178525. #ifdef WOLFSSL_KEIL
  178526. "adcs r4, r4, %[r]\n\t"
  178527. #elif defined(__clang__)
  178528. "adcs r4, %[r]\n\t"
  178529. #else
  178530. "adc r4, %[r]\n\t"
  178531. #endif
  178532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178533. "adds r2, r2, r5\n\t"
  178534. #else
  178535. "add r2, r2, r5\n\t"
  178536. #endif
  178537. #ifdef WOLFSSL_KEIL
  178538. "adcs r3, r3, r6\n\t"
  178539. #elif defined(__clang__)
  178540. "adcs r3, r6\n\t"
  178541. #else
  178542. "adc r3, r6\n\t"
  178543. #endif
  178544. #ifdef WOLFSSL_KEIL
  178545. "adcs r4, r4, %[r]\n\t"
  178546. #elif defined(__clang__)
  178547. "adcs r4, %[r]\n\t"
  178548. #else
  178549. "adc r4, %[r]\n\t"
  178550. #endif
  178551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178552. "lsrs r5, %[a], #16\n\t"
  178553. #else
  178554. "lsr r5, %[a], #16\n\t"
  178555. #endif
  178556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178557. "lsrs r6, r7, #16\n\t"
  178558. #else
  178559. "lsr r6, r7, #16\n\t"
  178560. #endif
  178561. #ifdef WOLFSSL_KEIL
  178562. "muls r6, r5, r6\n\t"
  178563. #elif defined(__clang__)
  178564. "muls r6, r5\n\t"
  178565. #else
  178566. "mul r6, r5\n\t"
  178567. #endif
  178568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178569. "adds r3, r3, r6\n\t"
  178570. #else
  178571. "add r3, r3, r6\n\t"
  178572. #endif
  178573. #ifdef WOLFSSL_KEIL
  178574. "adcs r4, r4, %[r]\n\t"
  178575. #elif defined(__clang__)
  178576. "adcs r4, %[r]\n\t"
  178577. #else
  178578. "adc r4, %[r]\n\t"
  178579. #endif
  178580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178581. "adds r3, r3, r6\n\t"
  178582. #else
  178583. "add r3, r3, r6\n\t"
  178584. #endif
  178585. #ifdef WOLFSSL_KEIL
  178586. "adcs r4, r4, %[r]\n\t"
  178587. #elif defined(__clang__)
  178588. "adcs r4, %[r]\n\t"
  178589. #else
  178590. "adc r4, %[r]\n\t"
  178591. #endif
  178592. "uxth r6, r7\n\t"
  178593. #ifdef WOLFSSL_KEIL
  178594. "muls r5, r6, r5\n\t"
  178595. #elif defined(__clang__)
  178596. "muls r5, r6\n\t"
  178597. #else
  178598. "mul r5, r6\n\t"
  178599. #endif
  178600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178601. "lsrs r6, r5, #16\n\t"
  178602. #else
  178603. "lsr r6, r5, #16\n\t"
  178604. #endif
  178605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178606. "lsls r5, r5, #16\n\t"
  178607. #else
  178608. "lsl r5, r5, #16\n\t"
  178609. #endif
  178610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178611. "adds r2, r2, r5\n\t"
  178612. #else
  178613. "add r2, r2, r5\n\t"
  178614. #endif
  178615. #ifdef WOLFSSL_KEIL
  178616. "adcs r3, r3, r6\n\t"
  178617. #elif defined(__clang__)
  178618. "adcs r3, r6\n\t"
  178619. #else
  178620. "adc r3, r6\n\t"
  178621. #endif
  178622. #ifdef WOLFSSL_KEIL
  178623. "adcs r4, r4, %[r]\n\t"
  178624. #elif defined(__clang__)
  178625. "adcs r4, %[r]\n\t"
  178626. #else
  178627. "adc r4, %[r]\n\t"
  178628. #endif
  178629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178630. "adds r2, r2, r5\n\t"
  178631. #else
  178632. "add r2, r2, r5\n\t"
  178633. #endif
  178634. #ifdef WOLFSSL_KEIL
  178635. "adcs r3, r3, r6\n\t"
  178636. #elif defined(__clang__)
  178637. "adcs r3, r6\n\t"
  178638. #else
  178639. "adc r3, r6\n\t"
  178640. #endif
  178641. #ifdef WOLFSSL_KEIL
  178642. "adcs r4, r4, %[r]\n\t"
  178643. #elif defined(__clang__)
  178644. "adcs r4, %[r]\n\t"
  178645. #else
  178646. "adc r4, %[r]\n\t"
  178647. #endif
  178648. "mov %[r], r8\n\t"
  178649. "str r2, [%[r], #108]\n\t"
  178650. "movs %[r], #0\n\t"
  178651. "# A[15] * A[13]\n\t"
  178652. "movs r2, #0\n\t"
  178653. "mov %[a], r9\n\t"
  178654. "mov r7, r11\n\t"
  178655. "mov %[a], lr\n\t"
  178656. "uxth r5, %[a]\n\t"
  178657. "uxth r6, r7\n\t"
  178658. #ifdef WOLFSSL_KEIL
  178659. "muls r6, r5, r6\n\t"
  178660. #elif defined(__clang__)
  178661. "muls r6, r5\n\t"
  178662. #else
  178663. "mul r6, r5\n\t"
  178664. #endif
  178665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178666. "adds r3, r3, r6\n\t"
  178667. #else
  178668. "add r3, r3, r6\n\t"
  178669. #endif
  178670. #ifdef WOLFSSL_KEIL
  178671. "adcs r4, r4, %[r]\n\t"
  178672. #elif defined(__clang__)
  178673. "adcs r4, %[r]\n\t"
  178674. #else
  178675. "adc r4, %[r]\n\t"
  178676. #endif
  178677. #ifdef WOLFSSL_KEIL
  178678. "adcs r2, r2, %[r]\n\t"
  178679. #elif defined(__clang__)
  178680. "adcs r2, %[r]\n\t"
  178681. #else
  178682. "adc r2, %[r]\n\t"
  178683. #endif
  178684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178685. "adds r3, r3, r6\n\t"
  178686. #else
  178687. "add r3, r3, r6\n\t"
  178688. #endif
  178689. #ifdef WOLFSSL_KEIL
  178690. "adcs r4, r4, %[r]\n\t"
  178691. #elif defined(__clang__)
  178692. "adcs r4, %[r]\n\t"
  178693. #else
  178694. "adc r4, %[r]\n\t"
  178695. #endif
  178696. #ifdef WOLFSSL_KEIL
  178697. "adcs r2, r2, %[r]\n\t"
  178698. #elif defined(__clang__)
  178699. "adcs r2, %[r]\n\t"
  178700. #else
  178701. "adc r2, %[r]\n\t"
  178702. #endif
  178703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178704. "lsrs r6, r7, #16\n\t"
  178705. #else
  178706. "lsr r6, r7, #16\n\t"
  178707. #endif
  178708. #ifdef WOLFSSL_KEIL
  178709. "muls r5, r6, r5\n\t"
  178710. #elif defined(__clang__)
  178711. "muls r5, r6\n\t"
  178712. #else
  178713. "mul r5, r6\n\t"
  178714. #endif
  178715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178716. "lsrs r6, r5, #16\n\t"
  178717. #else
  178718. "lsr r6, r5, #16\n\t"
  178719. #endif
  178720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178721. "lsls r5, r5, #16\n\t"
  178722. #else
  178723. "lsl r5, r5, #16\n\t"
  178724. #endif
  178725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178726. "adds r3, r3, r5\n\t"
  178727. #else
  178728. "add r3, r3, r5\n\t"
  178729. #endif
  178730. #ifdef WOLFSSL_KEIL
  178731. "adcs r4, r4, r6\n\t"
  178732. #elif defined(__clang__)
  178733. "adcs r4, r6\n\t"
  178734. #else
  178735. "adc r4, r6\n\t"
  178736. #endif
  178737. #ifdef WOLFSSL_KEIL
  178738. "adcs r2, r2, %[r]\n\t"
  178739. #elif defined(__clang__)
  178740. "adcs r2, %[r]\n\t"
  178741. #else
  178742. "adc r2, %[r]\n\t"
  178743. #endif
  178744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178745. "adds r3, r3, r5\n\t"
  178746. #else
  178747. "add r3, r3, r5\n\t"
  178748. #endif
  178749. #ifdef WOLFSSL_KEIL
  178750. "adcs r4, r4, r6\n\t"
  178751. #elif defined(__clang__)
  178752. "adcs r4, r6\n\t"
  178753. #else
  178754. "adc r4, r6\n\t"
  178755. #endif
  178756. #ifdef WOLFSSL_KEIL
  178757. "adcs r2, r2, %[r]\n\t"
  178758. #elif defined(__clang__)
  178759. "adcs r2, %[r]\n\t"
  178760. #else
  178761. "adc r2, %[r]\n\t"
  178762. #endif
  178763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178764. "lsrs r5, %[a], #16\n\t"
  178765. #else
  178766. "lsr r5, %[a], #16\n\t"
  178767. #endif
  178768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178769. "lsrs r6, r7, #16\n\t"
  178770. #else
  178771. "lsr r6, r7, #16\n\t"
  178772. #endif
  178773. #ifdef WOLFSSL_KEIL
  178774. "muls r6, r5, r6\n\t"
  178775. #elif defined(__clang__)
  178776. "muls r6, r5\n\t"
  178777. #else
  178778. "mul r6, r5\n\t"
  178779. #endif
  178780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178781. "adds r4, r4, r6\n\t"
  178782. #else
  178783. "add r4, r4, r6\n\t"
  178784. #endif
  178785. #ifdef WOLFSSL_KEIL
  178786. "adcs r2, r2, %[r]\n\t"
  178787. #elif defined(__clang__)
  178788. "adcs r2, %[r]\n\t"
  178789. #else
  178790. "adc r2, %[r]\n\t"
  178791. #endif
  178792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178793. "adds r4, r4, r6\n\t"
  178794. #else
  178795. "add r4, r4, r6\n\t"
  178796. #endif
  178797. #ifdef WOLFSSL_KEIL
  178798. "adcs r2, r2, %[r]\n\t"
  178799. #elif defined(__clang__)
  178800. "adcs r2, %[r]\n\t"
  178801. #else
  178802. "adc r2, %[r]\n\t"
  178803. #endif
  178804. "uxth r6, r7\n\t"
  178805. #ifdef WOLFSSL_KEIL
  178806. "muls r5, r6, r5\n\t"
  178807. #elif defined(__clang__)
  178808. "muls r5, r6\n\t"
  178809. #else
  178810. "mul r5, r6\n\t"
  178811. #endif
  178812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178813. "lsrs r6, r5, #16\n\t"
  178814. #else
  178815. "lsr r6, r5, #16\n\t"
  178816. #endif
  178817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178818. "lsls r5, r5, #16\n\t"
  178819. #else
  178820. "lsl r5, r5, #16\n\t"
  178821. #endif
  178822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178823. "adds r3, r3, r5\n\t"
  178824. #else
  178825. "add r3, r3, r5\n\t"
  178826. #endif
  178827. #ifdef WOLFSSL_KEIL
  178828. "adcs r4, r4, r6\n\t"
  178829. #elif defined(__clang__)
  178830. "adcs r4, r6\n\t"
  178831. #else
  178832. "adc r4, r6\n\t"
  178833. #endif
  178834. #ifdef WOLFSSL_KEIL
  178835. "adcs r2, r2, %[r]\n\t"
  178836. #elif defined(__clang__)
  178837. "adcs r2, %[r]\n\t"
  178838. #else
  178839. "adc r2, %[r]\n\t"
  178840. #endif
  178841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178842. "adds r3, r3, r5\n\t"
  178843. #else
  178844. "add r3, r3, r5\n\t"
  178845. #endif
  178846. #ifdef WOLFSSL_KEIL
  178847. "adcs r4, r4, r6\n\t"
  178848. #elif defined(__clang__)
  178849. "adcs r4, r6\n\t"
  178850. #else
  178851. "adc r4, r6\n\t"
  178852. #endif
  178853. #ifdef WOLFSSL_KEIL
  178854. "adcs r2, r2, %[r]\n\t"
  178855. #elif defined(__clang__)
  178856. "adcs r2, %[r]\n\t"
  178857. #else
  178858. "adc r2, %[r]\n\t"
  178859. #endif
  178860. "# A[14] * A[14]\n\t"
  178861. "mov r7, r12\n\t"
  178862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178863. "lsrs r6, r7, #16\n\t"
  178864. #else
  178865. "lsr r6, r7, #16\n\t"
  178866. #endif
  178867. "uxth r5, r7\n\t"
  178868. #ifdef WOLFSSL_KEIL
  178869. "muls r5, r5, r5\n\t"
  178870. #elif defined(__clang__)
  178871. "muls r5, r5\n\t"
  178872. #else
  178873. "mul r5, r5\n\t"
  178874. #endif
  178875. #ifdef WOLFSSL_KEIL
  178876. "muls r6, r6, r6\n\t"
  178877. #elif defined(__clang__)
  178878. "muls r6, r6\n\t"
  178879. #else
  178880. "mul r6, r6\n\t"
  178881. #endif
  178882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178883. "adds r3, r3, r5\n\t"
  178884. #else
  178885. "add r3, r3, r5\n\t"
  178886. #endif
  178887. #ifdef WOLFSSL_KEIL
  178888. "adcs r4, r4, r6\n\t"
  178889. #elif defined(__clang__)
  178890. "adcs r4, r6\n\t"
  178891. #else
  178892. "adc r4, r6\n\t"
  178893. #endif
  178894. #ifdef WOLFSSL_KEIL
  178895. "adcs r2, r2, %[r]\n\t"
  178896. #elif defined(__clang__)
  178897. "adcs r2, %[r]\n\t"
  178898. #else
  178899. "adc r2, %[r]\n\t"
  178900. #endif
  178901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178902. "lsrs r6, r7, #16\n\t"
  178903. #else
  178904. "lsr r6, r7, #16\n\t"
  178905. #endif
  178906. "uxth r5, r7\n\t"
  178907. #ifdef WOLFSSL_KEIL
  178908. "muls r5, r6, r5\n\t"
  178909. #elif defined(__clang__)
  178910. "muls r5, r6\n\t"
  178911. #else
  178912. "mul r5, r6\n\t"
  178913. #endif
  178914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178915. "lsrs r6, r5, #15\n\t"
  178916. #else
  178917. "lsr r6, r5, #15\n\t"
  178918. #endif
  178919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178920. "lsls r5, r5, #17\n\t"
  178921. #else
  178922. "lsl r5, r5, #17\n\t"
  178923. #endif
  178924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178925. "adds r3, r3, r5\n\t"
  178926. #else
  178927. "add r3, r3, r5\n\t"
  178928. #endif
  178929. #ifdef WOLFSSL_KEIL
  178930. "adcs r4, r4, r6\n\t"
  178931. #elif defined(__clang__)
  178932. "adcs r4, r6\n\t"
  178933. #else
  178934. "adc r4, r6\n\t"
  178935. #endif
  178936. #ifdef WOLFSSL_KEIL
  178937. "adcs r2, r2, %[r]\n\t"
  178938. #elif defined(__clang__)
  178939. "adcs r2, %[r]\n\t"
  178940. #else
  178941. "adc r2, %[r]\n\t"
  178942. #endif
  178943. "mov %[r], r8\n\t"
  178944. "str r3, [%[r], #112]\n\t"
  178945. "movs %[r], #0\n\t"
  178946. "# A[15] * A[14]\n\t"
  178947. "movs r3, #0\n\t"
  178948. "mov %[a], r9\n\t"
  178949. "mov %[a], lr\n\t"
  178950. "uxth r5, %[a]\n\t"
  178951. "uxth r6, r7\n\t"
  178952. #ifdef WOLFSSL_KEIL
  178953. "muls r6, r5, r6\n\t"
  178954. #elif defined(__clang__)
  178955. "muls r6, r5\n\t"
  178956. #else
  178957. "mul r6, r5\n\t"
  178958. #endif
  178959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178960. "adds r4, r4, r6\n\t"
  178961. #else
  178962. "add r4, r4, r6\n\t"
  178963. #endif
  178964. #ifdef WOLFSSL_KEIL
  178965. "adcs r2, r2, %[r]\n\t"
  178966. #elif defined(__clang__)
  178967. "adcs r2, %[r]\n\t"
  178968. #else
  178969. "adc r2, %[r]\n\t"
  178970. #endif
  178971. #ifdef WOLFSSL_KEIL
  178972. "adcs r3, r3, %[r]\n\t"
  178973. #elif defined(__clang__)
  178974. "adcs r3, %[r]\n\t"
  178975. #else
  178976. "adc r3, %[r]\n\t"
  178977. #endif
  178978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178979. "adds r4, r4, r6\n\t"
  178980. #else
  178981. "add r4, r4, r6\n\t"
  178982. #endif
  178983. #ifdef WOLFSSL_KEIL
  178984. "adcs r2, r2, %[r]\n\t"
  178985. #elif defined(__clang__)
  178986. "adcs r2, %[r]\n\t"
  178987. #else
  178988. "adc r2, %[r]\n\t"
  178989. #endif
  178990. #ifdef WOLFSSL_KEIL
  178991. "adcs r3, r3, %[r]\n\t"
  178992. #elif defined(__clang__)
  178993. "adcs r3, %[r]\n\t"
  178994. #else
  178995. "adc r3, %[r]\n\t"
  178996. #endif
  178997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178998. "lsrs r6, r7, #16\n\t"
  178999. #else
  179000. "lsr r6, r7, #16\n\t"
  179001. #endif
  179002. #ifdef WOLFSSL_KEIL
  179003. "muls r5, r6, r5\n\t"
  179004. #elif defined(__clang__)
  179005. "muls r5, r6\n\t"
  179006. #else
  179007. "mul r5, r6\n\t"
  179008. #endif
  179009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179010. "lsrs r6, r5, #16\n\t"
  179011. #else
  179012. "lsr r6, r5, #16\n\t"
  179013. #endif
  179014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179015. "lsls r5, r5, #16\n\t"
  179016. #else
  179017. "lsl r5, r5, #16\n\t"
  179018. #endif
  179019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179020. "adds r4, r4, r5\n\t"
  179021. #else
  179022. "add r4, r4, r5\n\t"
  179023. #endif
  179024. #ifdef WOLFSSL_KEIL
  179025. "adcs r2, r2, r6\n\t"
  179026. #elif defined(__clang__)
  179027. "adcs r2, r6\n\t"
  179028. #else
  179029. "adc r2, r6\n\t"
  179030. #endif
  179031. #ifdef WOLFSSL_KEIL
  179032. "adcs r3, r3, %[r]\n\t"
  179033. #elif defined(__clang__)
  179034. "adcs r3, %[r]\n\t"
  179035. #else
  179036. "adc r3, %[r]\n\t"
  179037. #endif
  179038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179039. "adds r4, r4, r5\n\t"
  179040. #else
  179041. "add r4, r4, r5\n\t"
  179042. #endif
  179043. #ifdef WOLFSSL_KEIL
  179044. "adcs r2, r2, r6\n\t"
  179045. #elif defined(__clang__)
  179046. "adcs r2, r6\n\t"
  179047. #else
  179048. "adc r2, r6\n\t"
  179049. #endif
  179050. #ifdef WOLFSSL_KEIL
  179051. "adcs r3, r3, %[r]\n\t"
  179052. #elif defined(__clang__)
  179053. "adcs r3, %[r]\n\t"
  179054. #else
  179055. "adc r3, %[r]\n\t"
  179056. #endif
  179057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179058. "lsrs r5, %[a], #16\n\t"
  179059. #else
  179060. "lsr r5, %[a], #16\n\t"
  179061. #endif
  179062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179063. "lsrs r6, r7, #16\n\t"
  179064. #else
  179065. "lsr r6, r7, #16\n\t"
  179066. #endif
  179067. #ifdef WOLFSSL_KEIL
  179068. "muls r6, r5, r6\n\t"
  179069. #elif defined(__clang__)
  179070. "muls r6, r5\n\t"
  179071. #else
  179072. "mul r6, r5\n\t"
  179073. #endif
  179074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179075. "adds r2, r2, r6\n\t"
  179076. #else
  179077. "add r2, r2, r6\n\t"
  179078. #endif
  179079. #ifdef WOLFSSL_KEIL
  179080. "adcs r3, r3, %[r]\n\t"
  179081. #elif defined(__clang__)
  179082. "adcs r3, %[r]\n\t"
  179083. #else
  179084. "adc r3, %[r]\n\t"
  179085. #endif
  179086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179087. "adds r2, r2, r6\n\t"
  179088. #else
  179089. "add r2, r2, r6\n\t"
  179090. #endif
  179091. #ifdef WOLFSSL_KEIL
  179092. "adcs r3, r3, %[r]\n\t"
  179093. #elif defined(__clang__)
  179094. "adcs r3, %[r]\n\t"
  179095. #else
  179096. "adc r3, %[r]\n\t"
  179097. #endif
  179098. "uxth r6, r7\n\t"
  179099. #ifdef WOLFSSL_KEIL
  179100. "muls r5, r6, r5\n\t"
  179101. #elif defined(__clang__)
  179102. "muls r5, r6\n\t"
  179103. #else
  179104. "mul r5, r6\n\t"
  179105. #endif
  179106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179107. "lsrs r6, r5, #16\n\t"
  179108. #else
  179109. "lsr r6, r5, #16\n\t"
  179110. #endif
  179111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179112. "lsls r5, r5, #16\n\t"
  179113. #else
  179114. "lsl r5, r5, #16\n\t"
  179115. #endif
  179116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179117. "adds r4, r4, r5\n\t"
  179118. #else
  179119. "add r4, r4, r5\n\t"
  179120. #endif
  179121. #ifdef WOLFSSL_KEIL
  179122. "adcs r2, r2, r6\n\t"
  179123. #elif defined(__clang__)
  179124. "adcs r2, r6\n\t"
  179125. #else
  179126. "adc r2, r6\n\t"
  179127. #endif
  179128. #ifdef WOLFSSL_KEIL
  179129. "adcs r3, r3, %[r]\n\t"
  179130. #elif defined(__clang__)
  179131. "adcs r3, %[r]\n\t"
  179132. #else
  179133. "adc r3, %[r]\n\t"
  179134. #endif
  179135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179136. "adds r4, r4, r5\n\t"
  179137. #else
  179138. "add r4, r4, r5\n\t"
  179139. #endif
  179140. #ifdef WOLFSSL_KEIL
  179141. "adcs r2, r2, r6\n\t"
  179142. #elif defined(__clang__)
  179143. "adcs r2, r6\n\t"
  179144. #else
  179145. "adc r2, r6\n\t"
  179146. #endif
  179147. #ifdef WOLFSSL_KEIL
  179148. "adcs r3, r3, %[r]\n\t"
  179149. #elif defined(__clang__)
  179150. "adcs r3, %[r]\n\t"
  179151. #else
  179152. "adc r3, %[r]\n\t"
  179153. #endif
  179154. "mov %[r], r8\n\t"
  179155. "str r4, [%[r], #116]\n\t"
  179156. "movs %[r], #0\n\t"
  179157. "# A[15] * A[15]\n\t"
  179158. "mov %[a], r9\n\t"
  179159. "mov r7, lr\n\t"
  179160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179161. "lsrs r6, r7, #16\n\t"
  179162. #else
  179163. "lsr r6, r7, #16\n\t"
  179164. #endif
  179165. "uxth r5, r7\n\t"
  179166. #ifdef WOLFSSL_KEIL
  179167. "muls r5, r5, r5\n\t"
  179168. #elif defined(__clang__)
  179169. "muls r5, r5\n\t"
  179170. #else
  179171. "mul r5, r5\n\t"
  179172. #endif
  179173. #ifdef WOLFSSL_KEIL
  179174. "muls r6, r6, r6\n\t"
  179175. #elif defined(__clang__)
  179176. "muls r6, r6\n\t"
  179177. #else
  179178. "mul r6, r6\n\t"
  179179. #endif
  179180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179181. "adds r2, r2, r5\n\t"
  179182. #else
  179183. "add r2, r2, r5\n\t"
  179184. #endif
  179185. #ifdef WOLFSSL_KEIL
  179186. "adcs r3, r3, r6\n\t"
  179187. #elif defined(__clang__)
  179188. "adcs r3, r6\n\t"
  179189. #else
  179190. "adc r3, r6\n\t"
  179191. #endif
  179192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179193. "lsrs r6, r7, #16\n\t"
  179194. #else
  179195. "lsr r6, r7, #16\n\t"
  179196. #endif
  179197. "uxth r5, r7\n\t"
  179198. #ifdef WOLFSSL_KEIL
  179199. "muls r5, r6, r5\n\t"
  179200. #elif defined(__clang__)
  179201. "muls r5, r6\n\t"
  179202. #else
  179203. "mul r5, r6\n\t"
  179204. #endif
  179205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179206. "lsrs r6, r5, #15\n\t"
  179207. #else
  179208. "lsr r6, r5, #15\n\t"
  179209. #endif
  179210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179211. "lsls r5, r5, #17\n\t"
  179212. #else
  179213. "lsl r5, r5, #17\n\t"
  179214. #endif
  179215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179216. "adds r2, r2, r5\n\t"
  179217. #else
  179218. "add r2, r2, r5\n\t"
  179219. #endif
  179220. #ifdef WOLFSSL_KEIL
  179221. "adcs r3, r3, r6\n\t"
  179222. #elif defined(__clang__)
  179223. "adcs r3, r6\n\t"
  179224. #else
  179225. "adc r3, r6\n\t"
  179226. #endif
  179227. "mov %[r], r8\n\t"
  179228. "str r2, [%[r], #120]\n\t"
  179229. "str r3, [%[r], #124]\n\t"
  179230. "pop {r2, r3, r4, r5}\n\t"
  179231. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  179232. "pop {r2, r3, r4, r5}\n\t"
  179233. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  179234. "pop {r2, r3, r4, r5}\n\t"
  179235. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  179236. "pop {r2, r3, r4, r5}\n\t"
  179237. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  179238. : [r] "+r" (r), [a] "+r" (a)
  179239. :
  179240. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  179241. );
  179242. }
  179243. #endif /* !WOLFSSL_SP_LARGE_CODE */
  179244. /* Add b to a into r. (r = a + b)
  179245. *
  179246. * r A single precision integer.
  179247. * a A single precision integer.
  179248. * b A single precision integer.
  179249. */
  179250. SP_NOINLINE static sp_digit sp_1024_add_16(sp_digit* r, const sp_digit* a,
  179251. const sp_digit* b)
  179252. {
  179253. __asm__ __volatile__ (
  179254. "ldm %[b]!, {r5, r6}\n\t"
  179255. "ldm %[a]!, {r3, r4}\n\t"
  179256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179257. "adds r3, r3, r5\n\t"
  179258. #else
  179259. "add r3, r3, r5\n\t"
  179260. #endif
  179261. #ifdef WOLFSSL_KEIL
  179262. "adcs r4, r4, r6\n\t"
  179263. #elif defined(__clang__)
  179264. "adcs r4, r6\n\t"
  179265. #else
  179266. "adc r4, r6\n\t"
  179267. #endif
  179268. "stm %[r]!, {r3, r4}\n\t"
  179269. "ldm %[b]!, {r5, r6}\n\t"
  179270. "ldm %[a]!, {r3, r4}\n\t"
  179271. #ifdef WOLFSSL_KEIL
  179272. "adcs r3, r3, r5\n\t"
  179273. #elif defined(__clang__)
  179274. "adcs r3, r5\n\t"
  179275. #else
  179276. "adc r3, r5\n\t"
  179277. #endif
  179278. #ifdef WOLFSSL_KEIL
  179279. "adcs r4, r4, r6\n\t"
  179280. #elif defined(__clang__)
  179281. "adcs r4, r6\n\t"
  179282. #else
  179283. "adc r4, r6\n\t"
  179284. #endif
  179285. "stm %[r]!, {r3, r4}\n\t"
  179286. "ldm %[b]!, {r5, r6}\n\t"
  179287. "ldm %[a]!, {r3, r4}\n\t"
  179288. #ifdef WOLFSSL_KEIL
  179289. "adcs r3, r3, r5\n\t"
  179290. #elif defined(__clang__)
  179291. "adcs r3, r5\n\t"
  179292. #else
  179293. "adc r3, r5\n\t"
  179294. #endif
  179295. #ifdef WOLFSSL_KEIL
  179296. "adcs r4, r4, r6\n\t"
  179297. #elif defined(__clang__)
  179298. "adcs r4, r6\n\t"
  179299. #else
  179300. "adc r4, r6\n\t"
  179301. #endif
  179302. "stm %[r]!, {r3, r4}\n\t"
  179303. "ldm %[b]!, {r5, r6}\n\t"
  179304. "ldm %[a]!, {r3, r4}\n\t"
  179305. #ifdef WOLFSSL_KEIL
  179306. "adcs r3, r3, r5\n\t"
  179307. #elif defined(__clang__)
  179308. "adcs r3, r5\n\t"
  179309. #else
  179310. "adc r3, r5\n\t"
  179311. #endif
  179312. #ifdef WOLFSSL_KEIL
  179313. "adcs r4, r4, r6\n\t"
  179314. #elif defined(__clang__)
  179315. "adcs r4, r6\n\t"
  179316. #else
  179317. "adc r4, r6\n\t"
  179318. #endif
  179319. "stm %[r]!, {r3, r4}\n\t"
  179320. "ldm %[b]!, {r5, r6}\n\t"
  179321. "ldm %[a]!, {r3, r4}\n\t"
  179322. #ifdef WOLFSSL_KEIL
  179323. "adcs r3, r3, r5\n\t"
  179324. #elif defined(__clang__)
  179325. "adcs r3, r5\n\t"
  179326. #else
  179327. "adc r3, r5\n\t"
  179328. #endif
  179329. #ifdef WOLFSSL_KEIL
  179330. "adcs r4, r4, r6\n\t"
  179331. #elif defined(__clang__)
  179332. "adcs r4, r6\n\t"
  179333. #else
  179334. "adc r4, r6\n\t"
  179335. #endif
  179336. "stm %[r]!, {r3, r4}\n\t"
  179337. "ldm %[b]!, {r5, r6}\n\t"
  179338. "ldm %[a]!, {r3, r4}\n\t"
  179339. #ifdef WOLFSSL_KEIL
  179340. "adcs r3, r3, r5\n\t"
  179341. #elif defined(__clang__)
  179342. "adcs r3, r5\n\t"
  179343. #else
  179344. "adc r3, r5\n\t"
  179345. #endif
  179346. #ifdef WOLFSSL_KEIL
  179347. "adcs r4, r4, r6\n\t"
  179348. #elif defined(__clang__)
  179349. "adcs r4, r6\n\t"
  179350. #else
  179351. "adc r4, r6\n\t"
  179352. #endif
  179353. "stm %[r]!, {r3, r4}\n\t"
  179354. "ldm %[b]!, {r5, r6}\n\t"
  179355. "ldm %[a]!, {r3, r4}\n\t"
  179356. #ifdef WOLFSSL_KEIL
  179357. "adcs r3, r3, r5\n\t"
  179358. #elif defined(__clang__)
  179359. "adcs r3, r5\n\t"
  179360. #else
  179361. "adc r3, r5\n\t"
  179362. #endif
  179363. #ifdef WOLFSSL_KEIL
  179364. "adcs r4, r4, r6\n\t"
  179365. #elif defined(__clang__)
  179366. "adcs r4, r6\n\t"
  179367. #else
  179368. "adc r4, r6\n\t"
  179369. #endif
  179370. "stm %[r]!, {r3, r4}\n\t"
  179371. "ldm %[b]!, {r5, r6}\n\t"
  179372. "ldm %[a]!, {r3, r4}\n\t"
  179373. #ifdef WOLFSSL_KEIL
  179374. "adcs r3, r3, r5\n\t"
  179375. #elif defined(__clang__)
  179376. "adcs r3, r5\n\t"
  179377. #else
  179378. "adc r3, r5\n\t"
  179379. #endif
  179380. #ifdef WOLFSSL_KEIL
  179381. "adcs r4, r4, r6\n\t"
  179382. #elif defined(__clang__)
  179383. "adcs r4, r6\n\t"
  179384. #else
  179385. "adc r4, r6\n\t"
  179386. #endif
  179387. "stm %[r]!, {r3, r4}\n\t"
  179388. "movs %[r], #0\n\t"
  179389. #ifdef WOLFSSL_KEIL
  179390. "adcs %[r], %[r], %[r]\n\t"
  179391. #elif defined(__clang__)
  179392. "adcs %[r], %[r]\n\t"
  179393. #else
  179394. "adc %[r], %[r]\n\t"
  179395. #endif
  179396. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  179397. :
  179398. : "memory", "r3", "r4", "r5", "r6"
  179399. );
  179400. return (uint32_t)(size_t)r;
  179401. }
  179402. /* Sub b from a into a. (a -= b)
  179403. *
  179404. * a A single precision integer.
  179405. * b A single precision integer.
  179406. */
  179407. SP_NOINLINE static sp_digit sp_1024_sub_in_place_32(sp_digit* a,
  179408. const sp_digit* b)
  179409. {
  179410. __asm__ __volatile__ (
  179411. "ldm %[b]!, {r4, r5}\n\t"
  179412. "ldr r2, [%[a]]\n\t"
  179413. "ldr r3, [%[a], #4]\n\t"
  179414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179415. "subs r2, r2, r4\n\t"
  179416. #else
  179417. "sub r2, r2, r4\n\t"
  179418. #endif
  179419. #ifdef WOLFSSL_KEIL
  179420. "sbcs r3, r3, r5\n\t"
  179421. #elif defined(__clang__)
  179422. "sbcs r3, r5\n\t"
  179423. #else
  179424. "sbc r3, r5\n\t"
  179425. #endif
  179426. "stm %[a]!, {r2, r3}\n\t"
  179427. "ldm %[b]!, {r4, r5}\n\t"
  179428. "ldr r2, [%[a]]\n\t"
  179429. "ldr r3, [%[a], #4]\n\t"
  179430. #ifdef WOLFSSL_KEIL
  179431. "sbcs r2, r2, r4\n\t"
  179432. #elif defined(__clang__)
  179433. "sbcs r2, r4\n\t"
  179434. #else
  179435. "sbc r2, r4\n\t"
  179436. #endif
  179437. #ifdef WOLFSSL_KEIL
  179438. "sbcs r3, r3, r5\n\t"
  179439. #elif defined(__clang__)
  179440. "sbcs r3, r5\n\t"
  179441. #else
  179442. "sbc r3, r5\n\t"
  179443. #endif
  179444. "stm %[a]!, {r2, r3}\n\t"
  179445. "ldm %[b]!, {r4, r5}\n\t"
  179446. "ldr r2, [%[a]]\n\t"
  179447. "ldr r3, [%[a], #4]\n\t"
  179448. #ifdef WOLFSSL_KEIL
  179449. "sbcs r2, r2, r4\n\t"
  179450. #elif defined(__clang__)
  179451. "sbcs r2, r4\n\t"
  179452. #else
  179453. "sbc r2, r4\n\t"
  179454. #endif
  179455. #ifdef WOLFSSL_KEIL
  179456. "sbcs r3, r3, r5\n\t"
  179457. #elif defined(__clang__)
  179458. "sbcs r3, r5\n\t"
  179459. #else
  179460. "sbc r3, r5\n\t"
  179461. #endif
  179462. "stm %[a]!, {r2, r3}\n\t"
  179463. "ldm %[b]!, {r4, r5}\n\t"
  179464. "ldr r2, [%[a]]\n\t"
  179465. "ldr r3, [%[a], #4]\n\t"
  179466. #ifdef WOLFSSL_KEIL
  179467. "sbcs r2, r2, r4\n\t"
  179468. #elif defined(__clang__)
  179469. "sbcs r2, r4\n\t"
  179470. #else
  179471. "sbc r2, r4\n\t"
  179472. #endif
  179473. #ifdef WOLFSSL_KEIL
  179474. "sbcs r3, r3, r5\n\t"
  179475. #elif defined(__clang__)
  179476. "sbcs r3, r5\n\t"
  179477. #else
  179478. "sbc r3, r5\n\t"
  179479. #endif
  179480. "stm %[a]!, {r2, r3}\n\t"
  179481. "ldm %[b]!, {r4, r5}\n\t"
  179482. "ldr r2, [%[a]]\n\t"
  179483. "ldr r3, [%[a], #4]\n\t"
  179484. #ifdef WOLFSSL_KEIL
  179485. "sbcs r2, r2, r4\n\t"
  179486. #elif defined(__clang__)
  179487. "sbcs r2, r4\n\t"
  179488. #else
  179489. "sbc r2, r4\n\t"
  179490. #endif
  179491. #ifdef WOLFSSL_KEIL
  179492. "sbcs r3, r3, r5\n\t"
  179493. #elif defined(__clang__)
  179494. "sbcs r3, r5\n\t"
  179495. #else
  179496. "sbc r3, r5\n\t"
  179497. #endif
  179498. "stm %[a]!, {r2, r3}\n\t"
  179499. "ldm %[b]!, {r4, r5}\n\t"
  179500. "ldr r2, [%[a]]\n\t"
  179501. "ldr r3, [%[a], #4]\n\t"
  179502. #ifdef WOLFSSL_KEIL
  179503. "sbcs r2, r2, r4\n\t"
  179504. #elif defined(__clang__)
  179505. "sbcs r2, r4\n\t"
  179506. #else
  179507. "sbc r2, r4\n\t"
  179508. #endif
  179509. #ifdef WOLFSSL_KEIL
  179510. "sbcs r3, r3, r5\n\t"
  179511. #elif defined(__clang__)
  179512. "sbcs r3, r5\n\t"
  179513. #else
  179514. "sbc r3, r5\n\t"
  179515. #endif
  179516. "stm %[a]!, {r2, r3}\n\t"
  179517. "ldm %[b]!, {r4, r5}\n\t"
  179518. "ldr r2, [%[a]]\n\t"
  179519. "ldr r3, [%[a], #4]\n\t"
  179520. #ifdef WOLFSSL_KEIL
  179521. "sbcs r2, r2, r4\n\t"
  179522. #elif defined(__clang__)
  179523. "sbcs r2, r4\n\t"
  179524. #else
  179525. "sbc r2, r4\n\t"
  179526. #endif
  179527. #ifdef WOLFSSL_KEIL
  179528. "sbcs r3, r3, r5\n\t"
  179529. #elif defined(__clang__)
  179530. "sbcs r3, r5\n\t"
  179531. #else
  179532. "sbc r3, r5\n\t"
  179533. #endif
  179534. "stm %[a]!, {r2, r3}\n\t"
  179535. "ldm %[b]!, {r4, r5}\n\t"
  179536. "ldr r2, [%[a]]\n\t"
  179537. "ldr r3, [%[a], #4]\n\t"
  179538. #ifdef WOLFSSL_KEIL
  179539. "sbcs r2, r2, r4\n\t"
  179540. #elif defined(__clang__)
  179541. "sbcs r2, r4\n\t"
  179542. #else
  179543. "sbc r2, r4\n\t"
  179544. #endif
  179545. #ifdef WOLFSSL_KEIL
  179546. "sbcs r3, r3, r5\n\t"
  179547. #elif defined(__clang__)
  179548. "sbcs r3, r5\n\t"
  179549. #else
  179550. "sbc r3, r5\n\t"
  179551. #endif
  179552. "stm %[a]!, {r2, r3}\n\t"
  179553. "ldm %[b]!, {r4, r5}\n\t"
  179554. "ldr r2, [%[a]]\n\t"
  179555. "ldr r3, [%[a], #4]\n\t"
  179556. #ifdef WOLFSSL_KEIL
  179557. "sbcs r2, r2, r4\n\t"
  179558. #elif defined(__clang__)
  179559. "sbcs r2, r4\n\t"
  179560. #else
  179561. "sbc r2, r4\n\t"
  179562. #endif
  179563. #ifdef WOLFSSL_KEIL
  179564. "sbcs r3, r3, r5\n\t"
  179565. #elif defined(__clang__)
  179566. "sbcs r3, r5\n\t"
  179567. #else
  179568. "sbc r3, r5\n\t"
  179569. #endif
  179570. "stm %[a]!, {r2, r3}\n\t"
  179571. "ldm %[b]!, {r4, r5}\n\t"
  179572. "ldr r2, [%[a]]\n\t"
  179573. "ldr r3, [%[a], #4]\n\t"
  179574. #ifdef WOLFSSL_KEIL
  179575. "sbcs r2, r2, r4\n\t"
  179576. #elif defined(__clang__)
  179577. "sbcs r2, r4\n\t"
  179578. #else
  179579. "sbc r2, r4\n\t"
  179580. #endif
  179581. #ifdef WOLFSSL_KEIL
  179582. "sbcs r3, r3, r5\n\t"
  179583. #elif defined(__clang__)
  179584. "sbcs r3, r5\n\t"
  179585. #else
  179586. "sbc r3, r5\n\t"
  179587. #endif
  179588. "stm %[a]!, {r2, r3}\n\t"
  179589. "ldm %[b]!, {r4, r5}\n\t"
  179590. "ldr r2, [%[a]]\n\t"
  179591. "ldr r3, [%[a], #4]\n\t"
  179592. #ifdef WOLFSSL_KEIL
  179593. "sbcs r2, r2, r4\n\t"
  179594. #elif defined(__clang__)
  179595. "sbcs r2, r4\n\t"
  179596. #else
  179597. "sbc r2, r4\n\t"
  179598. #endif
  179599. #ifdef WOLFSSL_KEIL
  179600. "sbcs r3, r3, r5\n\t"
  179601. #elif defined(__clang__)
  179602. "sbcs r3, r5\n\t"
  179603. #else
  179604. "sbc r3, r5\n\t"
  179605. #endif
  179606. "stm %[a]!, {r2, r3}\n\t"
  179607. "ldm %[b]!, {r4, r5}\n\t"
  179608. "ldr r2, [%[a]]\n\t"
  179609. "ldr r3, [%[a], #4]\n\t"
  179610. #ifdef WOLFSSL_KEIL
  179611. "sbcs r2, r2, r4\n\t"
  179612. #elif defined(__clang__)
  179613. "sbcs r2, r4\n\t"
  179614. #else
  179615. "sbc r2, r4\n\t"
  179616. #endif
  179617. #ifdef WOLFSSL_KEIL
  179618. "sbcs r3, r3, r5\n\t"
  179619. #elif defined(__clang__)
  179620. "sbcs r3, r5\n\t"
  179621. #else
  179622. "sbc r3, r5\n\t"
  179623. #endif
  179624. "stm %[a]!, {r2, r3}\n\t"
  179625. "ldm %[b]!, {r4, r5}\n\t"
  179626. "ldr r2, [%[a]]\n\t"
  179627. "ldr r3, [%[a], #4]\n\t"
  179628. #ifdef WOLFSSL_KEIL
  179629. "sbcs r2, r2, r4\n\t"
  179630. #elif defined(__clang__)
  179631. "sbcs r2, r4\n\t"
  179632. #else
  179633. "sbc r2, r4\n\t"
  179634. #endif
  179635. #ifdef WOLFSSL_KEIL
  179636. "sbcs r3, r3, r5\n\t"
  179637. #elif defined(__clang__)
  179638. "sbcs r3, r5\n\t"
  179639. #else
  179640. "sbc r3, r5\n\t"
  179641. #endif
  179642. "stm %[a]!, {r2, r3}\n\t"
  179643. "ldm %[b]!, {r4, r5}\n\t"
  179644. "ldr r2, [%[a]]\n\t"
  179645. "ldr r3, [%[a], #4]\n\t"
  179646. #ifdef WOLFSSL_KEIL
  179647. "sbcs r2, r2, r4\n\t"
  179648. #elif defined(__clang__)
  179649. "sbcs r2, r4\n\t"
  179650. #else
  179651. "sbc r2, r4\n\t"
  179652. #endif
  179653. #ifdef WOLFSSL_KEIL
  179654. "sbcs r3, r3, r5\n\t"
  179655. #elif defined(__clang__)
  179656. "sbcs r3, r5\n\t"
  179657. #else
  179658. "sbc r3, r5\n\t"
  179659. #endif
  179660. "stm %[a]!, {r2, r3}\n\t"
  179661. "ldm %[b]!, {r4, r5}\n\t"
  179662. "ldr r2, [%[a]]\n\t"
  179663. "ldr r3, [%[a], #4]\n\t"
  179664. #ifdef WOLFSSL_KEIL
  179665. "sbcs r2, r2, r4\n\t"
  179666. #elif defined(__clang__)
  179667. "sbcs r2, r4\n\t"
  179668. #else
  179669. "sbc r2, r4\n\t"
  179670. #endif
  179671. #ifdef WOLFSSL_KEIL
  179672. "sbcs r3, r3, r5\n\t"
  179673. #elif defined(__clang__)
  179674. "sbcs r3, r5\n\t"
  179675. #else
  179676. "sbc r3, r5\n\t"
  179677. #endif
  179678. "stm %[a]!, {r2, r3}\n\t"
  179679. "ldm %[b]!, {r4, r5}\n\t"
  179680. "ldr r2, [%[a]]\n\t"
  179681. "ldr r3, [%[a], #4]\n\t"
  179682. #ifdef WOLFSSL_KEIL
  179683. "sbcs r2, r2, r4\n\t"
  179684. #elif defined(__clang__)
  179685. "sbcs r2, r4\n\t"
  179686. #else
  179687. "sbc r2, r4\n\t"
  179688. #endif
  179689. #ifdef WOLFSSL_KEIL
  179690. "sbcs r3, r3, r5\n\t"
  179691. #elif defined(__clang__)
  179692. "sbcs r3, r5\n\t"
  179693. #else
  179694. "sbc r3, r5\n\t"
  179695. #endif
  179696. "stm %[a]!, {r2, r3}\n\t"
  179697. #ifdef WOLFSSL_KEIL
  179698. "sbcs %[a], %[a], %[a]\n\t"
  179699. #elif defined(__clang__)
  179700. "sbcs %[a], %[a]\n\t"
  179701. #else
  179702. "sbc %[a], %[a]\n\t"
  179703. #endif
  179704. : [a] "+r" (a), [b] "+r" (b)
  179705. :
  179706. : "memory", "r2", "r3", "r4", "r5"
  179707. );
  179708. return (uint32_t)(size_t)a;
  179709. }
  179710. /* Add b to a into r. (r = a + b)
  179711. *
  179712. * r A single precision integer.
  179713. * a A single precision integer.
  179714. * b A single precision integer.
  179715. */
  179716. SP_NOINLINE static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a,
  179717. const sp_digit* b)
  179718. {
  179719. __asm__ __volatile__ (
  179720. "ldm %[b]!, {r5, r6}\n\t"
  179721. "ldm %[a]!, {r3, r4}\n\t"
  179722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179723. "adds r3, r3, r5\n\t"
  179724. #else
  179725. "add r3, r3, r5\n\t"
  179726. #endif
  179727. #ifdef WOLFSSL_KEIL
  179728. "adcs r4, r4, r6\n\t"
  179729. #elif defined(__clang__)
  179730. "adcs r4, r6\n\t"
  179731. #else
  179732. "adc r4, r6\n\t"
  179733. #endif
  179734. "stm %[r]!, {r3, r4}\n\t"
  179735. "ldm %[b]!, {r5, r6}\n\t"
  179736. "ldm %[a]!, {r3, r4}\n\t"
  179737. #ifdef WOLFSSL_KEIL
  179738. "adcs r3, r3, r5\n\t"
  179739. #elif defined(__clang__)
  179740. "adcs r3, r5\n\t"
  179741. #else
  179742. "adc r3, r5\n\t"
  179743. #endif
  179744. #ifdef WOLFSSL_KEIL
  179745. "adcs r4, r4, r6\n\t"
  179746. #elif defined(__clang__)
  179747. "adcs r4, r6\n\t"
  179748. #else
  179749. "adc r4, r6\n\t"
  179750. #endif
  179751. "stm %[r]!, {r3, r4}\n\t"
  179752. "ldm %[b]!, {r5, r6}\n\t"
  179753. "ldm %[a]!, {r3, r4}\n\t"
  179754. #ifdef WOLFSSL_KEIL
  179755. "adcs r3, r3, r5\n\t"
  179756. #elif defined(__clang__)
  179757. "adcs r3, r5\n\t"
  179758. #else
  179759. "adc r3, r5\n\t"
  179760. #endif
  179761. #ifdef WOLFSSL_KEIL
  179762. "adcs r4, r4, r6\n\t"
  179763. #elif defined(__clang__)
  179764. "adcs r4, r6\n\t"
  179765. #else
  179766. "adc r4, r6\n\t"
  179767. #endif
  179768. "stm %[r]!, {r3, r4}\n\t"
  179769. "ldm %[b]!, {r5, r6}\n\t"
  179770. "ldm %[a]!, {r3, r4}\n\t"
  179771. #ifdef WOLFSSL_KEIL
  179772. "adcs r3, r3, r5\n\t"
  179773. #elif defined(__clang__)
  179774. "adcs r3, r5\n\t"
  179775. #else
  179776. "adc r3, r5\n\t"
  179777. #endif
  179778. #ifdef WOLFSSL_KEIL
  179779. "adcs r4, r4, r6\n\t"
  179780. #elif defined(__clang__)
  179781. "adcs r4, r6\n\t"
  179782. #else
  179783. "adc r4, r6\n\t"
  179784. #endif
  179785. "stm %[r]!, {r3, r4}\n\t"
  179786. "ldm %[b]!, {r5, r6}\n\t"
  179787. "ldm %[a]!, {r3, r4}\n\t"
  179788. #ifdef WOLFSSL_KEIL
  179789. "adcs r3, r3, r5\n\t"
  179790. #elif defined(__clang__)
  179791. "adcs r3, r5\n\t"
  179792. #else
  179793. "adc r3, r5\n\t"
  179794. #endif
  179795. #ifdef WOLFSSL_KEIL
  179796. "adcs r4, r4, r6\n\t"
  179797. #elif defined(__clang__)
  179798. "adcs r4, r6\n\t"
  179799. #else
  179800. "adc r4, r6\n\t"
  179801. #endif
  179802. "stm %[r]!, {r3, r4}\n\t"
  179803. "ldm %[b]!, {r5, r6}\n\t"
  179804. "ldm %[a]!, {r3, r4}\n\t"
  179805. #ifdef WOLFSSL_KEIL
  179806. "adcs r3, r3, r5\n\t"
  179807. #elif defined(__clang__)
  179808. "adcs r3, r5\n\t"
  179809. #else
  179810. "adc r3, r5\n\t"
  179811. #endif
  179812. #ifdef WOLFSSL_KEIL
  179813. "adcs r4, r4, r6\n\t"
  179814. #elif defined(__clang__)
  179815. "adcs r4, r6\n\t"
  179816. #else
  179817. "adc r4, r6\n\t"
  179818. #endif
  179819. "stm %[r]!, {r3, r4}\n\t"
  179820. "ldm %[b]!, {r5, r6}\n\t"
  179821. "ldm %[a]!, {r3, r4}\n\t"
  179822. #ifdef WOLFSSL_KEIL
  179823. "adcs r3, r3, r5\n\t"
  179824. #elif defined(__clang__)
  179825. "adcs r3, r5\n\t"
  179826. #else
  179827. "adc r3, r5\n\t"
  179828. #endif
  179829. #ifdef WOLFSSL_KEIL
  179830. "adcs r4, r4, r6\n\t"
  179831. #elif defined(__clang__)
  179832. "adcs r4, r6\n\t"
  179833. #else
  179834. "adc r4, r6\n\t"
  179835. #endif
  179836. "stm %[r]!, {r3, r4}\n\t"
  179837. "ldm %[b]!, {r5, r6}\n\t"
  179838. "ldm %[a]!, {r3, r4}\n\t"
  179839. #ifdef WOLFSSL_KEIL
  179840. "adcs r3, r3, r5\n\t"
  179841. #elif defined(__clang__)
  179842. "adcs r3, r5\n\t"
  179843. #else
  179844. "adc r3, r5\n\t"
  179845. #endif
  179846. #ifdef WOLFSSL_KEIL
  179847. "adcs r4, r4, r6\n\t"
  179848. #elif defined(__clang__)
  179849. "adcs r4, r6\n\t"
  179850. #else
  179851. "adc r4, r6\n\t"
  179852. #endif
  179853. "stm %[r]!, {r3, r4}\n\t"
  179854. "ldm %[b]!, {r5, r6}\n\t"
  179855. "ldm %[a]!, {r3, r4}\n\t"
  179856. #ifdef WOLFSSL_KEIL
  179857. "adcs r3, r3, r5\n\t"
  179858. #elif defined(__clang__)
  179859. "adcs r3, r5\n\t"
  179860. #else
  179861. "adc r3, r5\n\t"
  179862. #endif
  179863. #ifdef WOLFSSL_KEIL
  179864. "adcs r4, r4, r6\n\t"
  179865. #elif defined(__clang__)
  179866. "adcs r4, r6\n\t"
  179867. #else
  179868. "adc r4, r6\n\t"
  179869. #endif
  179870. "stm %[r]!, {r3, r4}\n\t"
  179871. "ldm %[b]!, {r5, r6}\n\t"
  179872. "ldm %[a]!, {r3, r4}\n\t"
  179873. #ifdef WOLFSSL_KEIL
  179874. "adcs r3, r3, r5\n\t"
  179875. #elif defined(__clang__)
  179876. "adcs r3, r5\n\t"
  179877. #else
  179878. "adc r3, r5\n\t"
  179879. #endif
  179880. #ifdef WOLFSSL_KEIL
  179881. "adcs r4, r4, r6\n\t"
  179882. #elif defined(__clang__)
  179883. "adcs r4, r6\n\t"
  179884. #else
  179885. "adc r4, r6\n\t"
  179886. #endif
  179887. "stm %[r]!, {r3, r4}\n\t"
  179888. "ldm %[b]!, {r5, r6}\n\t"
  179889. "ldm %[a]!, {r3, r4}\n\t"
  179890. #ifdef WOLFSSL_KEIL
  179891. "adcs r3, r3, r5\n\t"
  179892. #elif defined(__clang__)
  179893. "adcs r3, r5\n\t"
  179894. #else
  179895. "adc r3, r5\n\t"
  179896. #endif
  179897. #ifdef WOLFSSL_KEIL
  179898. "adcs r4, r4, r6\n\t"
  179899. #elif defined(__clang__)
  179900. "adcs r4, r6\n\t"
  179901. #else
  179902. "adc r4, r6\n\t"
  179903. #endif
  179904. "stm %[r]!, {r3, r4}\n\t"
  179905. "ldm %[b]!, {r5, r6}\n\t"
  179906. "ldm %[a]!, {r3, r4}\n\t"
  179907. #ifdef WOLFSSL_KEIL
  179908. "adcs r3, r3, r5\n\t"
  179909. #elif defined(__clang__)
  179910. "adcs r3, r5\n\t"
  179911. #else
  179912. "adc r3, r5\n\t"
  179913. #endif
  179914. #ifdef WOLFSSL_KEIL
  179915. "adcs r4, r4, r6\n\t"
  179916. #elif defined(__clang__)
  179917. "adcs r4, r6\n\t"
  179918. #else
  179919. "adc r4, r6\n\t"
  179920. #endif
  179921. "stm %[r]!, {r3, r4}\n\t"
  179922. "ldm %[b]!, {r5, r6}\n\t"
  179923. "ldm %[a]!, {r3, r4}\n\t"
  179924. #ifdef WOLFSSL_KEIL
  179925. "adcs r3, r3, r5\n\t"
  179926. #elif defined(__clang__)
  179927. "adcs r3, r5\n\t"
  179928. #else
  179929. "adc r3, r5\n\t"
  179930. #endif
  179931. #ifdef WOLFSSL_KEIL
  179932. "adcs r4, r4, r6\n\t"
  179933. #elif defined(__clang__)
  179934. "adcs r4, r6\n\t"
  179935. #else
  179936. "adc r4, r6\n\t"
  179937. #endif
  179938. "stm %[r]!, {r3, r4}\n\t"
  179939. "ldm %[b]!, {r5, r6}\n\t"
  179940. "ldm %[a]!, {r3, r4}\n\t"
  179941. #ifdef WOLFSSL_KEIL
  179942. "adcs r3, r3, r5\n\t"
  179943. #elif defined(__clang__)
  179944. "adcs r3, r5\n\t"
  179945. #else
  179946. "adc r3, r5\n\t"
  179947. #endif
  179948. #ifdef WOLFSSL_KEIL
  179949. "adcs r4, r4, r6\n\t"
  179950. #elif defined(__clang__)
  179951. "adcs r4, r6\n\t"
  179952. #else
  179953. "adc r4, r6\n\t"
  179954. #endif
  179955. "stm %[r]!, {r3, r4}\n\t"
  179956. "ldm %[b]!, {r5, r6}\n\t"
  179957. "ldm %[a]!, {r3, r4}\n\t"
  179958. #ifdef WOLFSSL_KEIL
  179959. "adcs r3, r3, r5\n\t"
  179960. #elif defined(__clang__)
  179961. "adcs r3, r5\n\t"
  179962. #else
  179963. "adc r3, r5\n\t"
  179964. #endif
  179965. #ifdef WOLFSSL_KEIL
  179966. "adcs r4, r4, r6\n\t"
  179967. #elif defined(__clang__)
  179968. "adcs r4, r6\n\t"
  179969. #else
  179970. "adc r4, r6\n\t"
  179971. #endif
  179972. "stm %[r]!, {r3, r4}\n\t"
  179973. "ldm %[b]!, {r5, r6}\n\t"
  179974. "ldm %[a]!, {r3, r4}\n\t"
  179975. #ifdef WOLFSSL_KEIL
  179976. "adcs r3, r3, r5\n\t"
  179977. #elif defined(__clang__)
  179978. "adcs r3, r5\n\t"
  179979. #else
  179980. "adc r3, r5\n\t"
  179981. #endif
  179982. #ifdef WOLFSSL_KEIL
  179983. "adcs r4, r4, r6\n\t"
  179984. #elif defined(__clang__)
  179985. "adcs r4, r6\n\t"
  179986. #else
  179987. "adc r4, r6\n\t"
  179988. #endif
  179989. "stm %[r]!, {r3, r4}\n\t"
  179990. "movs %[r], #0\n\t"
  179991. #ifdef WOLFSSL_KEIL
  179992. "adcs %[r], %[r], %[r]\n\t"
  179993. #elif defined(__clang__)
  179994. "adcs %[r], %[r]\n\t"
  179995. #else
  179996. "adc %[r], %[r]\n\t"
  179997. #endif
  179998. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  179999. :
  180000. : "memory", "r3", "r4", "r5", "r6"
  180001. );
  180002. return (uint32_t)(size_t)r;
  180003. }
  180004. /* AND m into each word of a and store in r.
  180005. *
  180006. * r A single precision integer.
  180007. * a A single precision integer.
  180008. * m Mask to AND against each digit.
  180009. */
  180010. static void sp_1024_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  180011. {
  180012. #ifdef WOLFSSL_SP_SMALL
  180013. int i;
  180014. for (i=0; i<16; i++) {
  180015. r[i] = a[i] & m;
  180016. }
  180017. #else
  180018. int i;
  180019. for (i = 0; i < 16; i += 8) {
  180020. r[i+0] = a[i+0] & m;
  180021. r[i+1] = a[i+1] & m;
  180022. r[i+2] = a[i+2] & m;
  180023. r[i+3] = a[i+3] & m;
  180024. r[i+4] = a[i+4] & m;
  180025. r[i+5] = a[i+5] & m;
  180026. r[i+6] = a[i+6] & m;
  180027. r[i+7] = a[i+7] & m;
  180028. }
  180029. #endif
  180030. }
  180031. /* Multiply a and b into r. (r = a * b)
  180032. *
  180033. * r A single precision integer.
  180034. * a A single precision integer.
  180035. * b A single precision integer.
  180036. */
  180037. SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a,
  180038. const sp_digit* b)
  180039. {
  180040. sp_digit* z0 = r;
  180041. sp_digit z1[32];
  180042. sp_digit a1[16];
  180043. sp_digit b1[16];
  180044. sp_digit z2[32];
  180045. sp_digit u;
  180046. sp_digit ca;
  180047. sp_digit cb;
  180048. ca = sp_1024_add_16(a1, a, &a[16]);
  180049. cb = sp_1024_add_16(b1, b, &b[16]);
  180050. u = ca & cb;
  180051. sp_1024_mul_16(z1, a1, b1);
  180052. sp_1024_mul_16(z2, &a[16], &b[16]);
  180053. sp_1024_mul_16(z0, a, b);
  180054. sp_1024_mask_16(r + 32, a1, 0 - cb);
  180055. sp_1024_mask_16(b1, b1, 0 - ca);
  180056. u += sp_1024_add_16(r + 32, r + 32, b1);
  180057. u += sp_1024_sub_in_place_32(z1, z2);
  180058. u += sp_1024_sub_in_place_32(z1, z0);
  180059. u += sp_1024_add_32(r + 16, r + 16, z1);
  180060. u += sp_1024_add_16(r + 32, r + 32, z2);
  180061. (void)sp_1024_add_to_word_16(r + 48, u, z2 + 16);
  180062. }
  180063. /* Square a and put result in r. (r = a * a)
  180064. *
  180065. * r A single precision integer.
  180066. * a A single precision integer.
  180067. */
  180068. SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a)
  180069. {
  180070. sp_digit* z0 = r;
  180071. sp_digit z2[32];
  180072. sp_digit z1[32];
  180073. sp_digit a1[16];
  180074. sp_digit u;
  180075. u = sp_1024_add_16(a1, a, &a[16]);
  180076. sp_1024_sqr_16(z1, a1);
  180077. sp_1024_sqr_16(z2, &a[16]);
  180078. sp_1024_sqr_16(z0, a);
  180079. sp_1024_mask_16(r + 32, a1, 0 - u);
  180080. u += sp_1024_dbl_16(r + 32, r + 32);
  180081. u += sp_1024_sub_in_place_32(z1, z2);
  180082. u += sp_1024_sub_in_place_32(z1, z0);
  180083. u += sp_1024_add_32(r + 16, r + 16, z1);
  180084. u += sp_1024_add_16(r + 32, r + 32, z2);
  180085. (void)sp_1024_add_to_word_16(r + 48, u, z2 + 16);
  180086. }
  180087. #else
  180088. /* Multiply a and b into r. (r = a * b)
  180089. *
  180090. * r A single precision integer.
  180091. * a A single precision integer.
  180092. * b A single precision integer.
  180093. */
  180094. SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a,
  180095. const sp_digit* b)
  180096. {
  180097. sp_digit t[32 * 2];
  180098. sp_digit* tmp = t;
  180099. __asm__ __volatile__ (
  180100. "movs r3, #0\n\t"
  180101. "movs r4, #0\n\t"
  180102. "mov r8, r3\n\t"
  180103. "mov r11, %[tmp]\n\t"
  180104. "mov r9, %[a]\n\t"
  180105. "mov r10, %[b]\n\t"
  180106. "movs r6, #0x80\n\t"
  180107. "add r6, r6, r9\n\t"
  180108. "mov r12, r6\n\t"
  180109. "\n"
  180110. "L_sp_1024_mul_32_words_%=:\n\t"
  180111. "movs %[tmp], #0\n\t"
  180112. "movs r5, #0\n\t"
  180113. "movs r6, #0x7c\n\t"
  180114. "mov %[a], r8\n\t"
  180115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180116. "subs %[a], %[a], r6\n\t"
  180117. #else
  180118. "sub %[a], %[a], r6\n\t"
  180119. #endif
  180120. #ifdef WOLFSSL_KEIL
  180121. "sbcs r6, r6, r6\n\t"
  180122. #elif defined(__clang__)
  180123. "sbcs r6, r6\n\t"
  180124. #else
  180125. "sbc r6, r6\n\t"
  180126. #endif
  180127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180128. "mvns r6, r6\n\t"
  180129. #else
  180130. "mvn r6, r6\n\t"
  180131. #endif
  180132. #ifdef WOLFSSL_KEIL
  180133. "ands %[a], %[a], r6\n\t"
  180134. #elif defined(__clang__)
  180135. "ands %[a], r6\n\t"
  180136. #else
  180137. "and %[a], r6\n\t"
  180138. #endif
  180139. "mov %[b], r8\n\t"
  180140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180141. "subs %[b], %[b], %[a]\n\t"
  180142. #else
  180143. "sub %[b], %[b], %[a]\n\t"
  180144. #endif
  180145. "add %[a], %[a], r9\n\t"
  180146. "add %[b], %[b], r10\n\t"
  180147. "\n"
  180148. "L_sp_1024_mul_32_mul_%=:\n\t"
  180149. "# Multiply Start\n\t"
  180150. "ldrh r6, [%[a]]\n\t"
  180151. "ldrh r7, [%[b]]\n\t"
  180152. #ifdef WOLFSSL_KEIL
  180153. "muls r7, r6, r7\n\t"
  180154. #elif defined(__clang__)
  180155. "muls r7, r6\n\t"
  180156. #else
  180157. "mul r7, r6\n\t"
  180158. #endif
  180159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180160. "adds r3, r3, r7\n\t"
  180161. #else
  180162. "add r3, r3, r7\n\t"
  180163. #endif
  180164. #ifdef WOLFSSL_KEIL
  180165. "adcs r4, r4, %[tmp]\n\t"
  180166. #elif defined(__clang__)
  180167. "adcs r4, %[tmp]\n\t"
  180168. #else
  180169. "adc r4, %[tmp]\n\t"
  180170. #endif
  180171. #ifdef WOLFSSL_KEIL
  180172. "adcs r5, r5, %[tmp]\n\t"
  180173. #elif defined(__clang__)
  180174. "adcs r5, %[tmp]\n\t"
  180175. #else
  180176. "adc r5, %[tmp]\n\t"
  180177. #endif
  180178. "ldr r7, [%[b]]\n\t"
  180179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180180. "lsrs r7, r7, #16\n\t"
  180181. #else
  180182. "lsr r7, r7, #16\n\t"
  180183. #endif
  180184. #ifdef WOLFSSL_KEIL
  180185. "muls r6, r7, r6\n\t"
  180186. #elif defined(__clang__)
  180187. "muls r6, r7\n\t"
  180188. #else
  180189. "mul r6, r7\n\t"
  180190. #endif
  180191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180192. "lsrs r7, r6, #16\n\t"
  180193. #else
  180194. "lsr r7, r6, #16\n\t"
  180195. #endif
  180196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180197. "lsls r6, r6, #16\n\t"
  180198. #else
  180199. "lsl r6, r6, #16\n\t"
  180200. #endif
  180201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180202. "adds r3, r3, r6\n\t"
  180203. #else
  180204. "add r3, r3, r6\n\t"
  180205. #endif
  180206. #ifdef WOLFSSL_KEIL
  180207. "adcs r4, r4, r7\n\t"
  180208. #elif defined(__clang__)
  180209. "adcs r4, r7\n\t"
  180210. #else
  180211. "adc r4, r7\n\t"
  180212. #endif
  180213. #ifdef WOLFSSL_KEIL
  180214. "adcs r5, r5, %[tmp]\n\t"
  180215. #elif defined(__clang__)
  180216. "adcs r5, %[tmp]\n\t"
  180217. #else
  180218. "adc r5, %[tmp]\n\t"
  180219. #endif
  180220. "ldr r6, [%[a]]\n\t"
  180221. "ldr r7, [%[b]]\n\t"
  180222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180223. "lsrs r6, r6, #16\n\t"
  180224. #else
  180225. "lsr r6, r6, #16\n\t"
  180226. #endif
  180227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180228. "lsrs r7, r7, #16\n\t"
  180229. #else
  180230. "lsr r7, r7, #16\n\t"
  180231. #endif
  180232. #ifdef WOLFSSL_KEIL
  180233. "muls r7, r6, r7\n\t"
  180234. #elif defined(__clang__)
  180235. "muls r7, r6\n\t"
  180236. #else
  180237. "mul r7, r6\n\t"
  180238. #endif
  180239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180240. "adds r4, r4, r7\n\t"
  180241. #else
  180242. "add r4, r4, r7\n\t"
  180243. #endif
  180244. #ifdef WOLFSSL_KEIL
  180245. "adcs r5, r5, %[tmp]\n\t"
  180246. #elif defined(__clang__)
  180247. "adcs r5, %[tmp]\n\t"
  180248. #else
  180249. "adc r5, %[tmp]\n\t"
  180250. #endif
  180251. "ldrh r7, [%[b]]\n\t"
  180252. #ifdef WOLFSSL_KEIL
  180253. "muls r6, r7, r6\n\t"
  180254. #elif defined(__clang__)
  180255. "muls r6, r7\n\t"
  180256. #else
  180257. "mul r6, r7\n\t"
  180258. #endif
  180259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180260. "lsrs r7, r6, #16\n\t"
  180261. #else
  180262. "lsr r7, r6, #16\n\t"
  180263. #endif
  180264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180265. "lsls r6, r6, #16\n\t"
  180266. #else
  180267. "lsl r6, r6, #16\n\t"
  180268. #endif
  180269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180270. "adds r3, r3, r6\n\t"
  180271. #else
  180272. "add r3, r3, r6\n\t"
  180273. #endif
  180274. #ifdef WOLFSSL_KEIL
  180275. "adcs r4, r4, r7\n\t"
  180276. #elif defined(__clang__)
  180277. "adcs r4, r7\n\t"
  180278. #else
  180279. "adc r4, r7\n\t"
  180280. #endif
  180281. #ifdef WOLFSSL_KEIL
  180282. "adcs r5, r5, %[tmp]\n\t"
  180283. #elif defined(__clang__)
  180284. "adcs r5, %[tmp]\n\t"
  180285. #else
  180286. "adc r5, %[tmp]\n\t"
  180287. #endif
  180288. "# Multiply Done\n\t"
  180289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180290. "adds %[a], %[a], #4\n\t"
  180291. #else
  180292. "add %[a], %[a], #4\n\t"
  180293. #endif
  180294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180295. "subs %[b], %[b], #4\n\t"
  180296. #else
  180297. "sub %[b], %[b], #4\n\t"
  180298. #endif
  180299. "cmp %[a], r12\n\t"
  180300. "beq L_sp_1024_mul_32_done_mul_%=\n\t"
  180301. "mov r6, r8\n\t"
  180302. "add r6, r6, r9\n\t"
  180303. "cmp %[a], r6\n\t"
  180304. "ble L_sp_1024_mul_32_mul_%=\n\t"
  180305. "\n"
  180306. "L_sp_1024_mul_32_done_mul_%=:\n\t"
  180307. "mov %[tmp], r11\n\t"
  180308. "mov r7, r8\n\t"
  180309. "str r3, [%[tmp], r7]\n\t"
  180310. "movs r3, r4\n\t"
  180311. "movs r4, r5\n\t"
  180312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180313. "adds r7, r7, #4\n\t"
  180314. #else
  180315. "add r7, r7, #4\n\t"
  180316. #endif
  180317. "mov r8, r7\n\t"
  180318. "movs r6, #0xf8\n\t"
  180319. "cmp r7, r6\n\t"
  180320. "ble L_sp_1024_mul_32_words_%=\n\t"
  180321. "str r3, [%[tmp], r7]\n\t"
  180322. "mov %[a], r9\n\t"
  180323. "mov %[b], r10\n\t"
  180324. : [a] "+r" (a), [b] "+r" (b), [tmp] "+r" (tmp)
  180325. :
  180326. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  180327. );
  180328. XMEMCPY(r, t, sizeof(t));
  180329. }
  180330. /* Square a and put result in r. (r = a * a)
  180331. *
  180332. * r A single precision integer.
  180333. * a A single precision integer.
  180334. */
  180335. SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a)
  180336. {
  180337. __asm__ __volatile__ (
  180338. "movs r3, #0\n\t"
  180339. "movs r4, #0\n\t"
  180340. "movs r5, #0\n\t"
  180341. "mov r8, r3\n\t"
  180342. "mov r11, %[r]\n\t"
  180343. "movs r6, #0xff\n\t"
  180344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180345. "adds r6, r6, #1\n\t"
  180346. #else
  180347. "add r6, r6, #1\n\t"
  180348. #endif
  180349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180350. "negs r6, r6\n\t"
  180351. #else
  180352. "neg r6, r6\n\t"
  180353. #endif
  180354. "add sp, sp, r6\n\t"
  180355. "mov r10, sp\n\t"
  180356. "mov r9, %[a]\n\t"
  180357. "\n"
  180358. "L_sp_1024_sqr_32_words_%=:\n\t"
  180359. "movs %[r], #0\n\t"
  180360. "movs r6, #0x7c\n\t"
  180361. "mov %[a], r8\n\t"
  180362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180363. "subs %[a], %[a], r6\n\t"
  180364. #else
  180365. "sub %[a], %[a], r6\n\t"
  180366. #endif
  180367. #ifdef WOLFSSL_KEIL
  180368. "sbcs r6, r6, r6\n\t"
  180369. #elif defined(__clang__)
  180370. "sbcs r6, r6\n\t"
  180371. #else
  180372. "sbc r6, r6\n\t"
  180373. #endif
  180374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180375. "mvns r6, r6\n\t"
  180376. #else
  180377. "mvn r6, r6\n\t"
  180378. #endif
  180379. #ifdef WOLFSSL_KEIL
  180380. "ands %[a], %[a], r6\n\t"
  180381. #elif defined(__clang__)
  180382. "ands %[a], r6\n\t"
  180383. #else
  180384. "and %[a], r6\n\t"
  180385. #endif
  180386. "mov r2, r8\n\t"
  180387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180388. "subs r2, r2, %[a]\n\t"
  180389. #else
  180390. "sub r2, r2, %[a]\n\t"
  180391. #endif
  180392. "add %[a], %[a], r9\n\t"
  180393. "add r2, r2, r9\n\t"
  180394. "\n"
  180395. "L_sp_1024_sqr_32_mul_%=:\n\t"
  180396. "cmp r2, %[a]\n\t"
  180397. "beq L_sp_1024_sqr_32_sqr_%=\n\t"
  180398. "# Multiply * 2: Start\n\t"
  180399. "ldrh r6, [%[a]]\n\t"
  180400. "ldrh r7, [r2]\n\t"
  180401. #ifdef WOLFSSL_KEIL
  180402. "muls r7, r6, r7\n\t"
  180403. #elif defined(__clang__)
  180404. "muls r7, r6\n\t"
  180405. #else
  180406. "mul r7, r6\n\t"
  180407. #endif
  180408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180409. "adds r3, r3, r7\n\t"
  180410. #else
  180411. "add r3, r3, r7\n\t"
  180412. #endif
  180413. #ifdef WOLFSSL_KEIL
  180414. "adcs r4, r4, %[r]\n\t"
  180415. #elif defined(__clang__)
  180416. "adcs r4, %[r]\n\t"
  180417. #else
  180418. "adc r4, %[r]\n\t"
  180419. #endif
  180420. #ifdef WOLFSSL_KEIL
  180421. "adcs r5, r5, %[r]\n\t"
  180422. #elif defined(__clang__)
  180423. "adcs r5, %[r]\n\t"
  180424. #else
  180425. "adc r5, %[r]\n\t"
  180426. #endif
  180427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180428. "adds r3, r3, r7\n\t"
  180429. #else
  180430. "add r3, r3, r7\n\t"
  180431. #endif
  180432. #ifdef WOLFSSL_KEIL
  180433. "adcs r4, r4, %[r]\n\t"
  180434. #elif defined(__clang__)
  180435. "adcs r4, %[r]\n\t"
  180436. #else
  180437. "adc r4, %[r]\n\t"
  180438. #endif
  180439. #ifdef WOLFSSL_KEIL
  180440. "adcs r5, r5, %[r]\n\t"
  180441. #elif defined(__clang__)
  180442. "adcs r5, %[r]\n\t"
  180443. #else
  180444. "adc r5, %[r]\n\t"
  180445. #endif
  180446. "ldr r7, [r2]\n\t"
  180447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180448. "lsrs r7, r7, #16\n\t"
  180449. #else
  180450. "lsr r7, r7, #16\n\t"
  180451. #endif
  180452. #ifdef WOLFSSL_KEIL
  180453. "muls r6, r7, r6\n\t"
  180454. #elif defined(__clang__)
  180455. "muls r6, r7\n\t"
  180456. #else
  180457. "mul r6, r7\n\t"
  180458. #endif
  180459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180460. "lsrs r7, r6, #16\n\t"
  180461. #else
  180462. "lsr r7, r6, #16\n\t"
  180463. #endif
  180464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180465. "lsls r6, r6, #16\n\t"
  180466. #else
  180467. "lsl r6, r6, #16\n\t"
  180468. #endif
  180469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180470. "adds r3, r3, r6\n\t"
  180471. #else
  180472. "add r3, r3, r6\n\t"
  180473. #endif
  180474. #ifdef WOLFSSL_KEIL
  180475. "adcs r4, r4, r7\n\t"
  180476. #elif defined(__clang__)
  180477. "adcs r4, r7\n\t"
  180478. #else
  180479. "adc r4, r7\n\t"
  180480. #endif
  180481. #ifdef WOLFSSL_KEIL
  180482. "adcs r5, r5, %[r]\n\t"
  180483. #elif defined(__clang__)
  180484. "adcs r5, %[r]\n\t"
  180485. #else
  180486. "adc r5, %[r]\n\t"
  180487. #endif
  180488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180489. "adds r3, r3, r6\n\t"
  180490. #else
  180491. "add r3, r3, r6\n\t"
  180492. #endif
  180493. #ifdef WOLFSSL_KEIL
  180494. "adcs r4, r4, r7\n\t"
  180495. #elif defined(__clang__)
  180496. "adcs r4, r7\n\t"
  180497. #else
  180498. "adc r4, r7\n\t"
  180499. #endif
  180500. #ifdef WOLFSSL_KEIL
  180501. "adcs r5, r5, %[r]\n\t"
  180502. #elif defined(__clang__)
  180503. "adcs r5, %[r]\n\t"
  180504. #else
  180505. "adc r5, %[r]\n\t"
  180506. #endif
  180507. "ldr r6, [%[a]]\n\t"
  180508. "ldr r7, [r2]\n\t"
  180509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180510. "lsrs r6, r6, #16\n\t"
  180511. #else
  180512. "lsr r6, r6, #16\n\t"
  180513. #endif
  180514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180515. "lsrs r7, r7, #16\n\t"
  180516. #else
  180517. "lsr r7, r7, #16\n\t"
  180518. #endif
  180519. #ifdef WOLFSSL_KEIL
  180520. "muls r7, r6, r7\n\t"
  180521. #elif defined(__clang__)
  180522. "muls r7, r6\n\t"
  180523. #else
  180524. "mul r7, r6\n\t"
  180525. #endif
  180526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180527. "adds r4, r4, r7\n\t"
  180528. #else
  180529. "add r4, r4, r7\n\t"
  180530. #endif
  180531. #ifdef WOLFSSL_KEIL
  180532. "adcs r5, r5, %[r]\n\t"
  180533. #elif defined(__clang__)
  180534. "adcs r5, %[r]\n\t"
  180535. #else
  180536. "adc r5, %[r]\n\t"
  180537. #endif
  180538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180539. "adds r4, r4, r7\n\t"
  180540. #else
  180541. "add r4, r4, r7\n\t"
  180542. #endif
  180543. #ifdef WOLFSSL_KEIL
  180544. "adcs r5, r5, %[r]\n\t"
  180545. #elif defined(__clang__)
  180546. "adcs r5, %[r]\n\t"
  180547. #else
  180548. "adc r5, %[r]\n\t"
  180549. #endif
  180550. "ldrh r7, [r2]\n\t"
  180551. #ifdef WOLFSSL_KEIL
  180552. "muls r6, r7, r6\n\t"
  180553. #elif defined(__clang__)
  180554. "muls r6, r7\n\t"
  180555. #else
  180556. "mul r6, r7\n\t"
  180557. #endif
  180558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180559. "lsrs r7, r6, #16\n\t"
  180560. #else
  180561. "lsr r7, r6, #16\n\t"
  180562. #endif
  180563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180564. "lsls r6, r6, #16\n\t"
  180565. #else
  180566. "lsl r6, r6, #16\n\t"
  180567. #endif
  180568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180569. "adds r3, r3, r6\n\t"
  180570. #else
  180571. "add r3, r3, r6\n\t"
  180572. #endif
  180573. #ifdef WOLFSSL_KEIL
  180574. "adcs r4, r4, r7\n\t"
  180575. #elif defined(__clang__)
  180576. "adcs r4, r7\n\t"
  180577. #else
  180578. "adc r4, r7\n\t"
  180579. #endif
  180580. #ifdef WOLFSSL_KEIL
  180581. "adcs r5, r5, %[r]\n\t"
  180582. #elif defined(__clang__)
  180583. "adcs r5, %[r]\n\t"
  180584. #else
  180585. "adc r5, %[r]\n\t"
  180586. #endif
  180587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180588. "adds r3, r3, r6\n\t"
  180589. #else
  180590. "add r3, r3, r6\n\t"
  180591. #endif
  180592. #ifdef WOLFSSL_KEIL
  180593. "adcs r4, r4, r7\n\t"
  180594. #elif defined(__clang__)
  180595. "adcs r4, r7\n\t"
  180596. #else
  180597. "adc r4, r7\n\t"
  180598. #endif
  180599. #ifdef WOLFSSL_KEIL
  180600. "adcs r5, r5, %[r]\n\t"
  180601. #elif defined(__clang__)
  180602. "adcs r5, %[r]\n\t"
  180603. #else
  180604. "adc r5, %[r]\n\t"
  180605. #endif
  180606. "# Multiply * 2: Done\n\t"
  180607. "bal L_sp_1024_sqr_32_done_sqr_%=\n\t"
  180608. "\n"
  180609. "L_sp_1024_sqr_32_sqr_%=:\n\t"
  180610. "mov r12, r2\n\t"
  180611. "ldr r2, [%[a]]\n\t"
  180612. "# Square: Start\n\t"
  180613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180614. "lsrs r7, r2, #16\n\t"
  180615. #else
  180616. "lsr r7, r2, #16\n\t"
  180617. #endif
  180618. "uxth r6, r2\n\t"
  180619. #ifdef WOLFSSL_KEIL
  180620. "muls r6, r6, r6\n\t"
  180621. #elif defined(__clang__)
  180622. "muls r6, r6\n\t"
  180623. #else
  180624. "mul r6, r6\n\t"
  180625. #endif
  180626. #ifdef WOLFSSL_KEIL
  180627. "muls r7, r7, r7\n\t"
  180628. #elif defined(__clang__)
  180629. "muls r7, r7\n\t"
  180630. #else
  180631. "mul r7, r7\n\t"
  180632. #endif
  180633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180634. "adds r3, r3, r6\n\t"
  180635. #else
  180636. "add r3, r3, r6\n\t"
  180637. #endif
  180638. #ifdef WOLFSSL_KEIL
  180639. "adcs r4, r4, r7\n\t"
  180640. #elif defined(__clang__)
  180641. "adcs r4, r7\n\t"
  180642. #else
  180643. "adc r4, r7\n\t"
  180644. #endif
  180645. #ifdef WOLFSSL_KEIL
  180646. "adcs r5, r5, %[r]\n\t"
  180647. #elif defined(__clang__)
  180648. "adcs r5, %[r]\n\t"
  180649. #else
  180650. "adc r5, %[r]\n\t"
  180651. #endif
  180652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180653. "lsrs r7, r2, #16\n\t"
  180654. #else
  180655. "lsr r7, r2, #16\n\t"
  180656. #endif
  180657. "uxth r6, r2\n\t"
  180658. #ifdef WOLFSSL_KEIL
  180659. "muls r6, r7, r6\n\t"
  180660. #elif defined(__clang__)
  180661. "muls r6, r7\n\t"
  180662. #else
  180663. "mul r6, r7\n\t"
  180664. #endif
  180665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180666. "lsrs r7, r6, #15\n\t"
  180667. #else
  180668. "lsr r7, r6, #15\n\t"
  180669. #endif
  180670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180671. "lsls r6, r6, #17\n\t"
  180672. #else
  180673. "lsl r6, r6, #17\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, r7\n\t"
  180682. #elif defined(__clang__)
  180683. "adcs r4, r7\n\t"
  180684. #else
  180685. "adc r4, r7\n\t"
  180686. #endif
  180687. #ifdef WOLFSSL_KEIL
  180688. "adcs r5, r5, %[r]\n\t"
  180689. #elif defined(__clang__)
  180690. "adcs r5, %[r]\n\t"
  180691. #else
  180692. "adc r5, %[r]\n\t"
  180693. #endif
  180694. "# Square: Done\n\t"
  180695. "mov r2, r12\n\t"
  180696. "\n"
  180697. "L_sp_1024_sqr_32_done_sqr_%=:\n\t"
  180698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180699. "adds %[a], %[a], #4\n\t"
  180700. #else
  180701. "add %[a], %[a], #4\n\t"
  180702. #endif
  180703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180704. "subs r2, r2, #4\n\t"
  180705. #else
  180706. "sub r2, r2, #4\n\t"
  180707. #endif
  180708. "movs r6, #0x80\n\t"
  180709. "add r6, r6, r9\n\t"
  180710. "cmp %[a], r6\n\t"
  180711. "beq L_sp_1024_sqr_32_done_mul_%=\n\t"
  180712. "cmp %[a], r2\n\t"
  180713. "bgt L_sp_1024_sqr_32_done_mul_%=\n\t"
  180714. "mov r7, r8\n\t"
  180715. "add r7, r7, r9\n\t"
  180716. "cmp %[a], r7\n\t"
  180717. "ble L_sp_1024_sqr_32_mul_%=\n\t"
  180718. "\n"
  180719. "L_sp_1024_sqr_32_done_mul_%=:\n\t"
  180720. "mov %[r], r10\n\t"
  180721. "mov r7, r8\n\t"
  180722. "str r3, [%[r], r7]\n\t"
  180723. "movs r3, r4\n\t"
  180724. "movs r4, r5\n\t"
  180725. "movs r5, #0\n\t"
  180726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180727. "adds r7, r7, #4\n\t"
  180728. #else
  180729. "add r7, r7, #4\n\t"
  180730. #endif
  180731. "mov r8, r7\n\t"
  180732. "movs r6, #0xf8\n\t"
  180733. "cmp r7, r6\n\t"
  180734. "ble L_sp_1024_sqr_32_words_%=\n\t"
  180735. "mov %[a], r9\n\t"
  180736. "str r3, [%[r], r7]\n\t"
  180737. "mov %[r], r11\n\t"
  180738. "mov %[a], r10\n\t"
  180739. "movs r3, #0xfc\n\t"
  180740. "\n"
  180741. "L_sp_1024_sqr_32_store_%=:\n\t"
  180742. "ldr r6, [%[a], r3]\n\t"
  180743. "str r6, [%[r], r3]\n\t"
  180744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180745. "subs r3, r3, #4\n\t"
  180746. #else
  180747. "sub r3, r3, #4\n\t"
  180748. #endif
  180749. "bge L_sp_1024_sqr_32_store_%=\n\t"
  180750. "movs r6, #0xff\n\t"
  180751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180752. "adds r6, r6, #1\n\t"
  180753. #else
  180754. "add r6, r6, #1\n\t"
  180755. #endif
  180756. "add sp, sp, r6\n\t"
  180757. : [r] "+r" (r), [a] "+r" (a)
  180758. :
  180759. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  180760. );
  180761. }
  180762. #endif /* !WOLFSSL_SP_SMALL */
  180763. /* The modulus (prime) of the curve P1024. */
  180764. static const sp_digit p1024_mod[32] = {
  180765. 0xfea85feb,0x666d807a,0xac7ace87,0x80c5df10,0x89857db0,0xfce3e823,
  180766. 0x56971f1f,0x9f94d6af,0x1c3c09aa,0xa7cf3c52,0x31852a82,0xb6aff4a8,
  180767. 0x65681ce1,0x512ac5cd,0x326b4cd4,0xe26c6487,0xa666a6d0,0x356d27f4,
  180768. 0xf7c88a19,0xe791b39f,0x31a59cb0,0x228730d5,0xe2fc0f1b,0xf40aab27,
  180769. 0xb3e01a2e,0xbe9ae358,0x9cb48261,0x416c0ce1,0xdad0657a,0x65c61198,
  180770. 0x0a563fda,0x997abb1f
  180771. };
  180772. /* The Montgomery normalizer for modulus of the curve P1024. */
  180773. static const sp_digit p1024_norm_mod[32] = {
  180774. 0x0157a015,0x99927f85,0x53853178,0x7f3a20ef,0x767a824f,0x031c17dc,
  180775. 0xa968e0e0,0x606b2950,0xe3c3f655,0x5830c3ad,0xce7ad57d,0x49500b57,
  180776. 0x9a97e31e,0xaed53a32,0xcd94b32b,0x1d939b78,0x5999592f,0xca92d80b,
  180777. 0x083775e6,0x186e4c60,0xce5a634f,0xdd78cf2a,0x1d03f0e4,0x0bf554d8,
  180778. 0x4c1fe5d1,0x41651ca7,0x634b7d9e,0xbe93f31e,0x252f9a85,0x9a39ee67,
  180779. 0xf5a9c025,0x668544e0
  180780. };
  180781. /* The Montgomery multiplier for modulus of the curve P1024. */
  180782. static sp_digit p1024_mp_mod = 0x7c8f2f3d;
  180783. #if defined(WOLFSSL_SP_SMALL) || defined(HAVE_ECC_CHECK_KEY)
  180784. /* The order of the curve P1024. */
  180785. static const sp_digit p1024_order[32] = {
  180786. 0xbfaa17fb,0xd99b601e,0x2b1eb3a1,0x203177c4,0xe2615f6c,0xff38fa08,
  180787. 0xd5a5c7c7,0xa7e535ab,0x870f026a,0xa9f3cf14,0x0c614aa0,0x6dabfd2a,
  180788. 0x595a0738,0x144ab173,0xcc9ad335,0x389b1921,0x2999a9b4,0x4d5b49fd,
  180789. 0xfdf22286,0x39e46ce7,0x4c69672c,0xc8a1cc35,0xf8bf03c6,0xbd02aac9,
  180790. 0x2cf8068b,0x6fa6b8d6,0x672d2098,0x905b0338,0x36b4195e,0x99718466,
  180791. 0xc2958ff6,0x265eaec7
  180792. };
  180793. #endif
  180794. /* The base point of curve P1024. */
  180795. static const sp_point_1024 p1024_base = {
  180796. /* X ordinate */
  180797. {
  180798. 0xeae63895,0x880dc8ab,0x967e0979,0x80ec46c4,0xb63f73ec,0xee9163a5,
  180799. 0x80728d87,0xd5cfb4cc,0xba66910d,0xa7c1514d,0x7a60de74,0xa702c339,
  180800. 0x8b72f2e1,0x337c8654,0x5dd5bccb,0x9760af76,0x406ce890,0x718bd9e7,
  180801. 0xdb9dfa55,0x43d5f22c,0x30b09e10,0xab10db90,0xf6ce2308,0xb5edb6c0,
  180802. 0xb6ff7cbf,0x98b2f204,0x0aec69c6,0x2b1a2fd6,0x3ed9b52a,0x0a799005,
  180803. 0x332c29ad,0x53fc09ee,
  180804. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180805. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180806. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180807. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180808. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180809. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180810. (sp_digit)0, (sp_digit)0
  180811. },
  180812. /* Y ordinate */
  180813. {
  180814. 0x1bef16d7,0x75573fd7,0x6a67dcde,0xadb9b570,0xd5bb4636,0x80bdad5a,
  180815. 0xe9cb99a9,0x13515ad7,0xc5a4d5f2,0x492d979f,0x164aa989,0xac6f1e80,
  180816. 0xb7652fe0,0xcad696b5,0xad547c6c,0x70dae117,0xa9e032b9,0x416cff0c,
  180817. 0x9a140b2e,0x6b598ccf,0xf0de55f6,0xe7f7f5e5,0x654ec2b9,0xf5ea69f4,
  180818. 0x1e141178,0x3d778d82,0x02990696,0xd3e82016,0x3634a135,0xf9f1f053,
  180819. 0x3f6009f1,0x0a824906,
  180820. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180821. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180822. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180823. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180824. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180825. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180826. (sp_digit)0, (sp_digit)0
  180827. },
  180828. /* Z ordinate */
  180829. {
  180830. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  180831. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  180832. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  180833. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  180834. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  180835. 0x00000000,0x00000000,
  180836. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180837. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180838. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180839. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180840. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180841. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  180842. (sp_digit)0, (sp_digit)0
  180843. },
  180844. /* infinity */
  180845. 0
  180846. };
  180847. #ifdef WOLFSSL_SP_SMALL
  180848. /* Sub b from a into a. (a -= b)
  180849. *
  180850. * a A single precision integer.
  180851. * b A single precision integer.
  180852. */
  180853. SP_NOINLINE static sp_digit sp_1024_sub_in_place_32(sp_digit* a,
  180854. const sp_digit* b)
  180855. {
  180856. __asm__ __volatile__ (
  180857. "movs r7, %[a]\n\t"
  180858. "movs r2, #0\n\t"
  180859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180860. "adds r7, r7, #0x80\n\t"
  180861. #else
  180862. "add r7, r7, #0x80\n\t"
  180863. #endif
  180864. "\n"
  180865. "L_sp_1024_sub_in_place_32_words_%=:\n\t"
  180866. "movs r5, #0\n\t"
  180867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180868. "subs r5, r5, r2\n\t"
  180869. #else
  180870. "sub r5, r5, r2\n\t"
  180871. #endif
  180872. "ldr r3, [%[a]]\n\t"
  180873. "ldr r4, [%[a], #4]\n\t"
  180874. "ldr r5, [%[b]]\n\t"
  180875. "ldr r6, [%[b], #4]\n\t"
  180876. #ifdef WOLFSSL_KEIL
  180877. "sbcs r3, r3, r5\n\t"
  180878. #elif defined(__clang__)
  180879. "sbcs r3, r5\n\t"
  180880. #else
  180881. "sbc r3, r5\n\t"
  180882. #endif
  180883. #ifdef WOLFSSL_KEIL
  180884. "sbcs r4, r4, r6\n\t"
  180885. #elif defined(__clang__)
  180886. "sbcs r4, r6\n\t"
  180887. #else
  180888. "sbc r4, r6\n\t"
  180889. #endif
  180890. "str r3, [%[a]]\n\t"
  180891. "str r4, [%[a], #4]\n\t"
  180892. #ifdef WOLFSSL_KEIL
  180893. "sbcs r2, r2, r2\n\t"
  180894. #elif defined(__clang__)
  180895. "sbcs r2, r2\n\t"
  180896. #else
  180897. "sbc r2, r2\n\t"
  180898. #endif
  180899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180900. "adds %[a], %[a], #8\n\t"
  180901. #else
  180902. "add %[a], %[a], #8\n\t"
  180903. #endif
  180904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180905. "adds %[b], %[b], #8\n\t"
  180906. #else
  180907. "add %[b], %[b], #8\n\t"
  180908. #endif
  180909. "cmp %[a], r7\n\t"
  180910. "bne L_sp_1024_sub_in_place_32_words_%=\n\t"
  180911. "movs %[a], r2\n\t"
  180912. : [a] "+r" (a), [b] "+r" (b)
  180913. :
  180914. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  180915. );
  180916. return (uint32_t)(size_t)a;
  180917. }
  180918. #endif /* WOLFSSL_SP_SMALL */
  180919. /* Conditionally subtract b from a using the mask m.
  180920. * m is -1 to subtract and 0 when not copying.
  180921. *
  180922. * r A single precision number representing condition subtract result.
  180923. * a A single precision number to subtract from.
  180924. * b A single precision number to subtract.
  180925. * m Mask value to apply.
  180926. */
  180927. SP_NOINLINE static sp_digit sp_1024_cond_sub_32(sp_digit* r, const sp_digit* a,
  180928. const sp_digit* b, sp_digit m)
  180929. {
  180930. __asm__ __volatile__ (
  180931. "movs r4, #0\n\t"
  180932. "movs r5, #0x80\n\t"
  180933. "mov r8, r5\n\t"
  180934. "movs r7, #0\n\t"
  180935. "\n"
  180936. "L_sp_1024_cond_sub_32_words_%=:\n\t"
  180937. "ldr r6, [%[b], r7]\n\t"
  180938. #ifdef WOLFSSL_KEIL
  180939. "ands r6, r6, %[m]\n\t"
  180940. #elif defined(__clang__)
  180941. "ands r6, %[m]\n\t"
  180942. #else
  180943. "and r6, %[m]\n\t"
  180944. #endif
  180945. "movs r5, #0\n\t"
  180946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180947. "subs r5, r5, r4\n\t"
  180948. #else
  180949. "sub r5, r5, r4\n\t"
  180950. #endif
  180951. "ldr r5, [%[a], r7]\n\t"
  180952. #ifdef WOLFSSL_KEIL
  180953. "sbcs r5, r5, r6\n\t"
  180954. #elif defined(__clang__)
  180955. "sbcs r5, r6\n\t"
  180956. #else
  180957. "sbc r5, r6\n\t"
  180958. #endif
  180959. #ifdef WOLFSSL_KEIL
  180960. "sbcs r4, r4, r4\n\t"
  180961. #elif defined(__clang__)
  180962. "sbcs r4, r4\n\t"
  180963. #else
  180964. "sbc r4, r4\n\t"
  180965. #endif
  180966. "str r5, [%[r], r7]\n\t"
  180967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180968. "adds r7, r7, #4\n\t"
  180969. #else
  180970. "add r7, r7, #4\n\t"
  180971. #endif
  180972. "cmp r7, r8\n\t"
  180973. "blt L_sp_1024_cond_sub_32_words_%=\n\t"
  180974. "movs %[r], r4\n\t"
  180975. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  180976. :
  180977. : "memory", "r4", "r5", "r6", "r7", "r8"
  180978. );
  180979. return (uint32_t)(size_t)r;
  180980. }
  180981. #ifdef WOLFSSL_SP_SMALL
  180982. /* Add b to a into r. (r = a + b)
  180983. *
  180984. * r A single precision integer.
  180985. * a A single precision integer.
  180986. * b A single precision integer.
  180987. */
  180988. SP_NOINLINE static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a,
  180989. const sp_digit* b)
  180990. {
  180991. __asm__ __volatile__ (
  180992. "movs r6, %[a]\n\t"
  180993. "movs r7, #0\n\t"
  180994. "movs r3, #0\n\t"
  180995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180996. "adds r6, r6, #0x80\n\t"
  180997. #else
  180998. "add r6, r6, #0x80\n\t"
  180999. #endif
  181000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181001. "subs r7, r7, #1\n\t"
  181002. #else
  181003. "sub r7, r7, #1\n\t"
  181004. #endif
  181005. "\n"
  181006. "L_sp_1024_add_32_word_%=:\n\t"
  181007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181008. "adds r3, r3, r7\n\t"
  181009. #else
  181010. "add r3, r3, r7\n\t"
  181011. #endif
  181012. "ldr r4, [%[a]]\n\t"
  181013. "ldr r5, [%[b]]\n\t"
  181014. #ifdef WOLFSSL_KEIL
  181015. "adcs r4, r4, r5\n\t"
  181016. #elif defined(__clang__)
  181017. "adcs r4, r5\n\t"
  181018. #else
  181019. "adc r4, r5\n\t"
  181020. #endif
  181021. "str r4, [%[r]]\n\t"
  181022. "movs r3, #0\n\t"
  181023. #ifdef WOLFSSL_KEIL
  181024. "adcs r3, r3, r3\n\t"
  181025. #elif defined(__clang__)
  181026. "adcs r3, r3\n\t"
  181027. #else
  181028. "adc r3, r3\n\t"
  181029. #endif
  181030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181031. "adds %[a], %[a], #4\n\t"
  181032. #else
  181033. "add %[a], %[a], #4\n\t"
  181034. #endif
  181035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181036. "adds %[b], %[b], #4\n\t"
  181037. #else
  181038. "add %[b], %[b], #4\n\t"
  181039. #endif
  181040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181041. "adds %[r], %[r], #4\n\t"
  181042. #else
  181043. "add %[r], %[r], #4\n\t"
  181044. #endif
  181045. "cmp %[a], r6\n\t"
  181046. "bne L_sp_1024_add_32_word_%=\n\t"
  181047. "movs %[r], r3\n\t"
  181048. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  181049. :
  181050. : "memory", "r3", "r4", "r5", "r6", "r7"
  181051. );
  181052. return (uint32_t)(size_t)r;
  181053. }
  181054. #endif /* WOLFSSL_SP_SMALL */
  181055. /* Mul a by digit b into r. (r = a * b)
  181056. *
  181057. * r A single precision integer.
  181058. * a A single precision integer.
  181059. * b A single precision digit.
  181060. */
  181061. SP_NOINLINE static void sp_1024_mul_d_32(sp_digit* r, const sp_digit* a,
  181062. sp_digit b)
  181063. {
  181064. __asm__ __volatile__ (
  181065. "movs r6, #0x80\n\t"
  181066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181067. "adds r6, r6, %[a]\n\t"
  181068. #else
  181069. "add r6, r6, %[a]\n\t"
  181070. #endif
  181071. "mov r8, %[r]\n\t"
  181072. "mov r9, r6\n\t"
  181073. "movs r3, #0\n\t"
  181074. "movs r4, #0\n\t"
  181075. "\n"
  181076. "L_sp_1024_mul_d_32_%=:\n\t"
  181077. "movs %[r], #0\n\t"
  181078. "movs r5, #0\n\t"
  181079. "# A[] * B\n\t"
  181080. "ldrh r6, [%[a]]\n\t"
  181081. "uxth r7, %[b]\n\t"
  181082. #ifdef WOLFSSL_KEIL
  181083. "muls r7, r6, r7\n\t"
  181084. #elif defined(__clang__)
  181085. "muls r7, r6\n\t"
  181086. #else
  181087. "mul r7, r6\n\t"
  181088. #endif
  181089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181090. "adds r3, r3, r7\n\t"
  181091. #else
  181092. "add r3, r3, r7\n\t"
  181093. #endif
  181094. #ifdef WOLFSSL_KEIL
  181095. "adcs r4, r4, %[r]\n\t"
  181096. #elif defined(__clang__)
  181097. "adcs r4, %[r]\n\t"
  181098. #else
  181099. "adc r4, %[r]\n\t"
  181100. #endif
  181101. #ifdef WOLFSSL_KEIL
  181102. "adcs r5, r5, %[r]\n\t"
  181103. #elif defined(__clang__)
  181104. "adcs r5, %[r]\n\t"
  181105. #else
  181106. "adc r5, %[r]\n\t"
  181107. #endif
  181108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181109. "lsrs r7, %[b], #16\n\t"
  181110. #else
  181111. "lsr r7, %[b], #16\n\t"
  181112. #endif
  181113. #ifdef WOLFSSL_KEIL
  181114. "muls r6, r7, r6\n\t"
  181115. #elif defined(__clang__)
  181116. "muls r6, r7\n\t"
  181117. #else
  181118. "mul r6, r7\n\t"
  181119. #endif
  181120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181121. "lsrs r7, r6, #16\n\t"
  181122. #else
  181123. "lsr r7, r6, #16\n\t"
  181124. #endif
  181125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181126. "lsls r6, r6, #16\n\t"
  181127. #else
  181128. "lsl r6, r6, #16\n\t"
  181129. #endif
  181130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181131. "adds r3, r3, r6\n\t"
  181132. #else
  181133. "add r3, r3, r6\n\t"
  181134. #endif
  181135. #ifdef WOLFSSL_KEIL
  181136. "adcs r4, r4, r7\n\t"
  181137. #elif defined(__clang__)
  181138. "adcs r4, r7\n\t"
  181139. #else
  181140. "adc r4, r7\n\t"
  181141. #endif
  181142. #ifdef WOLFSSL_KEIL
  181143. "adcs r5, r5, %[r]\n\t"
  181144. #elif defined(__clang__)
  181145. "adcs r5, %[r]\n\t"
  181146. #else
  181147. "adc r5, %[r]\n\t"
  181148. #endif
  181149. "ldr r6, [%[a]]\n\t"
  181150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181151. "lsrs r6, r6, #16\n\t"
  181152. #else
  181153. "lsr r6, r6, #16\n\t"
  181154. #endif
  181155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181156. "lsrs r7, %[b], #16\n\t"
  181157. #else
  181158. "lsr r7, %[b], #16\n\t"
  181159. #endif
  181160. #ifdef WOLFSSL_KEIL
  181161. "muls r7, r6, r7\n\t"
  181162. #elif defined(__clang__)
  181163. "muls r7, r6\n\t"
  181164. #else
  181165. "mul r7, r6\n\t"
  181166. #endif
  181167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181168. "adds r4, r4, r7\n\t"
  181169. #else
  181170. "add r4, r4, r7\n\t"
  181171. #endif
  181172. #ifdef WOLFSSL_KEIL
  181173. "adcs r5, r5, %[r]\n\t"
  181174. #elif defined(__clang__)
  181175. "adcs r5, %[r]\n\t"
  181176. #else
  181177. "adc r5, %[r]\n\t"
  181178. #endif
  181179. "uxth r7, %[b]\n\t"
  181180. #ifdef WOLFSSL_KEIL
  181181. "muls r6, r7, r6\n\t"
  181182. #elif defined(__clang__)
  181183. "muls r6, r7\n\t"
  181184. #else
  181185. "mul r6, r7\n\t"
  181186. #endif
  181187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181188. "lsrs r7, r6, #16\n\t"
  181189. #else
  181190. "lsr r7, r6, #16\n\t"
  181191. #endif
  181192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181193. "lsls r6, r6, #16\n\t"
  181194. #else
  181195. "lsl r6, r6, #16\n\t"
  181196. #endif
  181197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181198. "adds r3, r3, r6\n\t"
  181199. #else
  181200. "add r3, r3, r6\n\t"
  181201. #endif
  181202. #ifdef WOLFSSL_KEIL
  181203. "adcs r4, r4, r7\n\t"
  181204. #elif defined(__clang__)
  181205. "adcs r4, r7\n\t"
  181206. #else
  181207. "adc r4, r7\n\t"
  181208. #endif
  181209. #ifdef WOLFSSL_KEIL
  181210. "adcs r5, r5, %[r]\n\t"
  181211. #elif defined(__clang__)
  181212. "adcs r5, %[r]\n\t"
  181213. #else
  181214. "adc r5, %[r]\n\t"
  181215. #endif
  181216. "# A[] * B - Done\n\t"
  181217. "mov %[r], r8\n\t"
  181218. "str r3, [%[r]]\n\t"
  181219. "movs r3, r4\n\t"
  181220. "movs r4, r5\n\t"
  181221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181222. "adds %[r], %[r], #4\n\t"
  181223. #else
  181224. "add %[r], %[r], #4\n\t"
  181225. #endif
  181226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181227. "adds %[a], %[a], #4\n\t"
  181228. #else
  181229. "add %[a], %[a], #4\n\t"
  181230. #endif
  181231. "mov r8, %[r]\n\t"
  181232. "cmp %[a], r9\n\t"
  181233. "blt L_sp_1024_mul_d_32_%=\n\t"
  181234. "str r3, [%[r]]\n\t"
  181235. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  181236. :
  181237. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  181238. );
  181239. }
  181240. /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
  181241. *
  181242. * d1 The high order half of the number to divide.
  181243. * d0 The low order half of the number to divide.
  181244. * div The dividend.
  181245. * returns the result of the division.
  181246. *
  181247. * Note that this is an approximate div. It may give an answer 1 larger.
  181248. */
  181249. SP_NOINLINE static sp_digit div_1024_word_32(sp_digit d1, sp_digit d0,
  181250. sp_digit div)
  181251. {
  181252. __asm__ __volatile__ (
  181253. "movs r3, #0\n\t"
  181254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181255. "lsrs r5, %[div], #1\n\t"
  181256. #else
  181257. "lsr r5, %[div], #1\n\t"
  181258. #endif
  181259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181260. "adds r5, r5, #1\n\t"
  181261. #else
  181262. "add r5, r5, #1\n\t"
  181263. #endif
  181264. "mov r8, %[d0]\n\t"
  181265. "mov r9, %[d1]\n\t"
  181266. "# Do top 32\n\t"
  181267. "movs r6, r5\n\t"
  181268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181269. "subs r6, r6, %[d1]\n\t"
  181270. #else
  181271. "sub r6, r6, %[d1]\n\t"
  181272. #endif
  181273. #ifdef WOLFSSL_KEIL
  181274. "sbcs r6, r6, r6\n\t"
  181275. #elif defined(__clang__)
  181276. "sbcs r6, r6\n\t"
  181277. #else
  181278. "sbc r6, r6\n\t"
  181279. #endif
  181280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181281. "adds r3, r3, r3\n\t"
  181282. #else
  181283. "add r3, r3, r3\n\t"
  181284. #endif
  181285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181286. "subs r3, r3, r6\n\t"
  181287. #else
  181288. "sub r3, r3, r6\n\t"
  181289. #endif
  181290. #ifdef WOLFSSL_KEIL
  181291. "ands r6, r6, r5\n\t"
  181292. #elif defined(__clang__)
  181293. "ands r6, r5\n\t"
  181294. #else
  181295. "and r6, r5\n\t"
  181296. #endif
  181297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181298. "subs %[d1], %[d1], r6\n\t"
  181299. #else
  181300. "sub %[d1], %[d1], r6\n\t"
  181301. #endif
  181302. "movs r4, #29\n\t"
  181303. "\n"
  181304. "L_div_1024_word_32_loop_%=:\n\t"
  181305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181306. "lsls %[d0], %[d0], #1\n\t"
  181307. #else
  181308. "lsl %[d0], %[d0], #1\n\t"
  181309. #endif
  181310. #ifdef WOLFSSL_KEIL
  181311. "adcs %[d1], %[d1], %[d1]\n\t"
  181312. #elif defined(__clang__)
  181313. "adcs %[d1], %[d1]\n\t"
  181314. #else
  181315. "adc %[d1], %[d1]\n\t"
  181316. #endif
  181317. "movs r6, r5\n\t"
  181318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181319. "subs r6, r6, %[d1]\n\t"
  181320. #else
  181321. "sub r6, r6, %[d1]\n\t"
  181322. #endif
  181323. #ifdef WOLFSSL_KEIL
  181324. "sbcs r6, r6, r6\n\t"
  181325. #elif defined(__clang__)
  181326. "sbcs r6, r6\n\t"
  181327. #else
  181328. "sbc r6, r6\n\t"
  181329. #endif
  181330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181331. "adds r3, r3, r3\n\t"
  181332. #else
  181333. "add r3, r3, r3\n\t"
  181334. #endif
  181335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181336. "subs r3, r3, r6\n\t"
  181337. #else
  181338. "sub r3, r3, r6\n\t"
  181339. #endif
  181340. #ifdef WOLFSSL_KEIL
  181341. "ands r6, r6, r5\n\t"
  181342. #elif defined(__clang__)
  181343. "ands r6, r5\n\t"
  181344. #else
  181345. "and r6, r5\n\t"
  181346. #endif
  181347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181348. "subs %[d1], %[d1], r6\n\t"
  181349. #else
  181350. "sub %[d1], %[d1], r6\n\t"
  181351. #endif
  181352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181353. "subs r4, r4, #1\n\t"
  181354. #else
  181355. "sub r4, r4, #1\n\t"
  181356. #endif
  181357. "bpl L_div_1024_word_32_loop_%=\n\t"
  181358. "movs r7, #0\n\t"
  181359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181360. "adds r3, r3, r3\n\t"
  181361. #else
  181362. "add r3, r3, r3\n\t"
  181363. #endif
  181364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181365. "adds r3, r3, #1\n\t"
  181366. #else
  181367. "add r3, r3, #1\n\t"
  181368. #endif
  181369. "# r * div - Start\n\t"
  181370. "uxth %[d1], r3\n\t"
  181371. "uxth r4, %[div]\n\t"
  181372. #ifdef WOLFSSL_KEIL
  181373. "muls r4, %[d1], r4\n\t"
  181374. #elif defined(__clang__)
  181375. "muls r4, %[d1]\n\t"
  181376. #else
  181377. "mul r4, %[d1]\n\t"
  181378. #endif
  181379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181380. "lsrs r6, %[div], #16\n\t"
  181381. #else
  181382. "lsr r6, %[div], #16\n\t"
  181383. #endif
  181384. #ifdef WOLFSSL_KEIL
  181385. "muls %[d1], r6, %[d1]\n\t"
  181386. #elif defined(__clang__)
  181387. "muls %[d1], r6\n\t"
  181388. #else
  181389. "mul %[d1], r6\n\t"
  181390. #endif
  181391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181392. "lsrs r5, %[d1], #16\n\t"
  181393. #else
  181394. "lsr r5, %[d1], #16\n\t"
  181395. #endif
  181396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181397. "lsls %[d1], %[d1], #16\n\t"
  181398. #else
  181399. "lsl %[d1], %[d1], #16\n\t"
  181400. #endif
  181401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181402. "adds r4, r4, %[d1]\n\t"
  181403. #else
  181404. "add r4, r4, %[d1]\n\t"
  181405. #endif
  181406. #ifdef WOLFSSL_KEIL
  181407. "adcs r5, r5, r7\n\t"
  181408. #elif defined(__clang__)
  181409. "adcs r5, r7\n\t"
  181410. #else
  181411. "adc r5, r7\n\t"
  181412. #endif
  181413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181414. "lsrs %[d1], r3, #16\n\t"
  181415. #else
  181416. "lsr %[d1], r3, #16\n\t"
  181417. #endif
  181418. #ifdef WOLFSSL_KEIL
  181419. "muls r6, %[d1], r6\n\t"
  181420. #elif defined(__clang__)
  181421. "muls r6, %[d1]\n\t"
  181422. #else
  181423. "mul r6, %[d1]\n\t"
  181424. #endif
  181425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181426. "adds r5, r5, r6\n\t"
  181427. #else
  181428. "add r5, r5, r6\n\t"
  181429. #endif
  181430. "uxth r6, %[div]\n\t"
  181431. #ifdef WOLFSSL_KEIL
  181432. "muls %[d1], r6, %[d1]\n\t"
  181433. #elif defined(__clang__)
  181434. "muls %[d1], r6\n\t"
  181435. #else
  181436. "mul %[d1], r6\n\t"
  181437. #endif
  181438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181439. "lsrs r6, %[d1], #16\n\t"
  181440. #else
  181441. "lsr r6, %[d1], #16\n\t"
  181442. #endif
  181443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181444. "lsls %[d1], %[d1], #16\n\t"
  181445. #else
  181446. "lsl %[d1], %[d1], #16\n\t"
  181447. #endif
  181448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181449. "adds r4, r4, %[d1]\n\t"
  181450. #else
  181451. "add r4, r4, %[d1]\n\t"
  181452. #endif
  181453. #ifdef WOLFSSL_KEIL
  181454. "adcs r5, r5, r6\n\t"
  181455. #elif defined(__clang__)
  181456. "adcs r5, r6\n\t"
  181457. #else
  181458. "adc r5, r6\n\t"
  181459. #endif
  181460. "# r * div - Done\n\t"
  181461. "mov %[d1], r8\n\t"
  181462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181463. "subs %[d1], %[d1], r4\n\t"
  181464. #else
  181465. "sub %[d1], %[d1], r4\n\t"
  181466. #endif
  181467. "movs r4, %[d1]\n\t"
  181468. "mov %[d1], r9\n\t"
  181469. #ifdef WOLFSSL_KEIL
  181470. "sbcs %[d1], %[d1], r5\n\t"
  181471. #elif defined(__clang__)
  181472. "sbcs %[d1], r5\n\t"
  181473. #else
  181474. "sbc %[d1], r5\n\t"
  181475. #endif
  181476. "movs r5, %[d1]\n\t"
  181477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181478. "adds r3, r3, r5\n\t"
  181479. #else
  181480. "add r3, r3, r5\n\t"
  181481. #endif
  181482. "# r * div - Start\n\t"
  181483. "uxth %[d1], r3\n\t"
  181484. "uxth r4, %[div]\n\t"
  181485. #ifdef WOLFSSL_KEIL
  181486. "muls r4, %[d1], r4\n\t"
  181487. #elif defined(__clang__)
  181488. "muls r4, %[d1]\n\t"
  181489. #else
  181490. "mul r4, %[d1]\n\t"
  181491. #endif
  181492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181493. "lsrs r6, %[div], #16\n\t"
  181494. #else
  181495. "lsr r6, %[div], #16\n\t"
  181496. #endif
  181497. #ifdef WOLFSSL_KEIL
  181498. "muls %[d1], r6, %[d1]\n\t"
  181499. #elif defined(__clang__)
  181500. "muls %[d1], r6\n\t"
  181501. #else
  181502. "mul %[d1], r6\n\t"
  181503. #endif
  181504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181505. "lsrs r5, %[d1], #16\n\t"
  181506. #else
  181507. "lsr r5, %[d1], #16\n\t"
  181508. #endif
  181509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181510. "lsls %[d1], %[d1], #16\n\t"
  181511. #else
  181512. "lsl %[d1], %[d1], #16\n\t"
  181513. #endif
  181514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181515. "adds r4, r4, %[d1]\n\t"
  181516. #else
  181517. "add r4, r4, %[d1]\n\t"
  181518. #endif
  181519. #ifdef WOLFSSL_KEIL
  181520. "adcs r5, r5, r7\n\t"
  181521. #elif defined(__clang__)
  181522. "adcs r5, r7\n\t"
  181523. #else
  181524. "adc r5, r7\n\t"
  181525. #endif
  181526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181527. "lsrs %[d1], r3, #16\n\t"
  181528. #else
  181529. "lsr %[d1], r3, #16\n\t"
  181530. #endif
  181531. #ifdef WOLFSSL_KEIL
  181532. "muls r6, %[d1], r6\n\t"
  181533. #elif defined(__clang__)
  181534. "muls r6, %[d1]\n\t"
  181535. #else
  181536. "mul r6, %[d1]\n\t"
  181537. #endif
  181538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181539. "adds r5, r5, r6\n\t"
  181540. #else
  181541. "add r5, r5, r6\n\t"
  181542. #endif
  181543. "uxth r6, %[div]\n\t"
  181544. #ifdef WOLFSSL_KEIL
  181545. "muls %[d1], r6, %[d1]\n\t"
  181546. #elif defined(__clang__)
  181547. "muls %[d1], r6\n\t"
  181548. #else
  181549. "mul %[d1], r6\n\t"
  181550. #endif
  181551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181552. "lsrs r6, %[d1], #16\n\t"
  181553. #else
  181554. "lsr r6, %[d1], #16\n\t"
  181555. #endif
  181556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181557. "lsls %[d1], %[d1], #16\n\t"
  181558. #else
  181559. "lsl %[d1], %[d1], #16\n\t"
  181560. #endif
  181561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181562. "adds r4, r4, %[d1]\n\t"
  181563. #else
  181564. "add r4, r4, %[d1]\n\t"
  181565. #endif
  181566. #ifdef WOLFSSL_KEIL
  181567. "adcs r5, r5, r6\n\t"
  181568. #elif defined(__clang__)
  181569. "adcs r5, r6\n\t"
  181570. #else
  181571. "adc r5, r6\n\t"
  181572. #endif
  181573. "# r * div - Done\n\t"
  181574. "mov %[d1], r8\n\t"
  181575. "mov r6, r9\n\t"
  181576. #ifdef WOLFSSL_KEIL
  181577. "subs r4, %[d1], r4\n\t"
  181578. #else
  181579. #ifdef __clang__
  181580. "subs r4, %[d1], r4\n\t"
  181581. #else
  181582. "sub r4, %[d1], r4\n\t"
  181583. #endif
  181584. #endif
  181585. #ifdef WOLFSSL_KEIL
  181586. "sbcs r6, r6, r5\n\t"
  181587. #elif defined(__clang__)
  181588. "sbcs r6, r5\n\t"
  181589. #else
  181590. "sbc r6, r5\n\t"
  181591. #endif
  181592. "movs r5, r6\n\t"
  181593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181594. "adds r3, r3, r5\n\t"
  181595. #else
  181596. "add r3, r3, r5\n\t"
  181597. #endif
  181598. "# r * div - Start\n\t"
  181599. "uxth %[d1], r3\n\t"
  181600. "uxth r4, %[div]\n\t"
  181601. #ifdef WOLFSSL_KEIL
  181602. "muls r4, %[d1], r4\n\t"
  181603. #elif defined(__clang__)
  181604. "muls r4, %[d1]\n\t"
  181605. #else
  181606. "mul r4, %[d1]\n\t"
  181607. #endif
  181608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181609. "lsrs r6, %[div], #16\n\t"
  181610. #else
  181611. "lsr r6, %[div], #16\n\t"
  181612. #endif
  181613. #ifdef WOLFSSL_KEIL
  181614. "muls %[d1], r6, %[d1]\n\t"
  181615. #elif defined(__clang__)
  181616. "muls %[d1], r6\n\t"
  181617. #else
  181618. "mul %[d1], r6\n\t"
  181619. #endif
  181620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181621. "lsrs r5, %[d1], #16\n\t"
  181622. #else
  181623. "lsr r5, %[d1], #16\n\t"
  181624. #endif
  181625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181626. "lsls %[d1], %[d1], #16\n\t"
  181627. #else
  181628. "lsl %[d1], %[d1], #16\n\t"
  181629. #endif
  181630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181631. "adds r4, r4, %[d1]\n\t"
  181632. #else
  181633. "add r4, r4, %[d1]\n\t"
  181634. #endif
  181635. #ifdef WOLFSSL_KEIL
  181636. "adcs r5, r5, r7\n\t"
  181637. #elif defined(__clang__)
  181638. "adcs r5, r7\n\t"
  181639. #else
  181640. "adc r5, r7\n\t"
  181641. #endif
  181642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181643. "lsrs %[d1], r3, #16\n\t"
  181644. #else
  181645. "lsr %[d1], r3, #16\n\t"
  181646. #endif
  181647. #ifdef WOLFSSL_KEIL
  181648. "muls r6, %[d1], r6\n\t"
  181649. #elif defined(__clang__)
  181650. "muls r6, %[d1]\n\t"
  181651. #else
  181652. "mul r6, %[d1]\n\t"
  181653. #endif
  181654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181655. "adds r5, r5, r6\n\t"
  181656. #else
  181657. "add r5, r5, r6\n\t"
  181658. #endif
  181659. "uxth r6, %[div]\n\t"
  181660. #ifdef WOLFSSL_KEIL
  181661. "muls %[d1], r6, %[d1]\n\t"
  181662. #elif defined(__clang__)
  181663. "muls %[d1], r6\n\t"
  181664. #else
  181665. "mul %[d1], r6\n\t"
  181666. #endif
  181667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181668. "lsrs r6, %[d1], #16\n\t"
  181669. #else
  181670. "lsr r6, %[d1], #16\n\t"
  181671. #endif
  181672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181673. "lsls %[d1], %[d1], #16\n\t"
  181674. #else
  181675. "lsl %[d1], %[d1], #16\n\t"
  181676. #endif
  181677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181678. "adds r4, r4, %[d1]\n\t"
  181679. #else
  181680. "add r4, r4, %[d1]\n\t"
  181681. #endif
  181682. #ifdef WOLFSSL_KEIL
  181683. "adcs r5, r5, r6\n\t"
  181684. #elif defined(__clang__)
  181685. "adcs r5, r6\n\t"
  181686. #else
  181687. "adc r5, r6\n\t"
  181688. #endif
  181689. "# r * div - Done\n\t"
  181690. "mov %[d1], r8\n\t"
  181691. "mov r6, r9\n\t"
  181692. #ifdef WOLFSSL_KEIL
  181693. "subs r4, %[d1], r4\n\t"
  181694. #else
  181695. #ifdef __clang__
  181696. "subs r4, %[d1], r4\n\t"
  181697. #else
  181698. "sub r4, %[d1], r4\n\t"
  181699. #endif
  181700. #endif
  181701. #ifdef WOLFSSL_KEIL
  181702. "sbcs r6, r6, r5\n\t"
  181703. #elif defined(__clang__)
  181704. "sbcs r6, r5\n\t"
  181705. #else
  181706. "sbc r6, r5\n\t"
  181707. #endif
  181708. "movs r5, r6\n\t"
  181709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181710. "adds r3, r3, r5\n\t"
  181711. #else
  181712. "add r3, r3, r5\n\t"
  181713. #endif
  181714. "movs r6, %[div]\n\t"
  181715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181716. "subs r6, r6, r4\n\t"
  181717. #else
  181718. "sub r6, r6, r4\n\t"
  181719. #endif
  181720. #ifdef WOLFSSL_KEIL
  181721. "sbcs r6, r6, r6\n\t"
  181722. #elif defined(__clang__)
  181723. "sbcs r6, r6\n\t"
  181724. #else
  181725. "sbc r6, r6\n\t"
  181726. #endif
  181727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181728. "subs r3, r3, r6\n\t"
  181729. #else
  181730. "sub r3, r3, r6\n\t"
  181731. #endif
  181732. "movs %[d1], r3\n\t"
  181733. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  181734. :
  181735. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  181736. );
  181737. return (uint32_t)(size_t)d1;
  181738. }
  181739. /* AND m into each word of a and store in r.
  181740. *
  181741. * r A single precision integer.
  181742. * a A single precision integer.
  181743. * m Mask to AND against each digit.
  181744. */
  181745. static void sp_1024_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  181746. {
  181747. #ifdef WOLFSSL_SP_SMALL
  181748. int i;
  181749. for (i=0; i<32; i++) {
  181750. r[i] = a[i] & m;
  181751. }
  181752. #else
  181753. int i;
  181754. for (i = 0; i < 32; i += 8) {
  181755. r[i+0] = a[i+0] & m;
  181756. r[i+1] = a[i+1] & m;
  181757. r[i+2] = a[i+2] & m;
  181758. r[i+3] = a[i+3] & m;
  181759. r[i+4] = a[i+4] & m;
  181760. r[i+5] = a[i+5] & m;
  181761. r[i+6] = a[i+6] & m;
  181762. r[i+7] = a[i+7] & m;
  181763. }
  181764. #endif
  181765. }
  181766. /* Compare a with b in constant time.
  181767. *
  181768. * a A single precision integer.
  181769. * b A single precision integer.
  181770. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  181771. * respectively.
  181772. */
  181773. SP_NOINLINE static sp_int32 sp_1024_cmp_32(const sp_digit* a, const sp_digit* b)
  181774. {
  181775. __asm__ __volatile__ (
  181776. "movs r2, #0\n\t"
  181777. "movs r3, #0\n\t"
  181778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181779. "mvns r3, r3\n\t"
  181780. #else
  181781. "mvn r3, r3\n\t"
  181782. #endif
  181783. "movs r6, #0x7c\n\t"
  181784. "\n"
  181785. "L_sp_1024_cmp_32_words_%=:\n\t"
  181786. "ldr r7, [%[a], r6]\n\t"
  181787. "ldr r5, [%[b], r6]\n\t"
  181788. #ifdef WOLFSSL_KEIL
  181789. "ands r7, r7, r3\n\t"
  181790. #elif defined(__clang__)
  181791. "ands r7, r3\n\t"
  181792. #else
  181793. "and r7, r3\n\t"
  181794. #endif
  181795. #ifdef WOLFSSL_KEIL
  181796. "ands r5, r5, r3\n\t"
  181797. #elif defined(__clang__)
  181798. "ands r5, r3\n\t"
  181799. #else
  181800. "and r5, r3\n\t"
  181801. #endif
  181802. "movs r4, r7\n\t"
  181803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181804. "subs r7, r7, r5\n\t"
  181805. #else
  181806. "sub r7, r7, r5\n\t"
  181807. #endif
  181808. #ifdef WOLFSSL_KEIL
  181809. "sbcs r7, r7, r7\n\t"
  181810. #elif defined(__clang__)
  181811. "sbcs r7, r7\n\t"
  181812. #else
  181813. "sbc r7, r7\n\t"
  181814. #endif
  181815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181816. "adds r2, r2, r7\n\t"
  181817. #else
  181818. "add r2, r2, r7\n\t"
  181819. #endif
  181820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181821. "mvns r7, r7\n\t"
  181822. #else
  181823. "mvn r7, r7\n\t"
  181824. #endif
  181825. #ifdef WOLFSSL_KEIL
  181826. "ands r3, r3, r7\n\t"
  181827. #elif defined(__clang__)
  181828. "ands r3, r7\n\t"
  181829. #else
  181830. "and r3, r7\n\t"
  181831. #endif
  181832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181833. "subs r5, r5, r4\n\t"
  181834. #else
  181835. "sub r5, r5, r4\n\t"
  181836. #endif
  181837. #ifdef WOLFSSL_KEIL
  181838. "sbcs r7, r7, r7\n\t"
  181839. #elif defined(__clang__)
  181840. "sbcs r7, r7\n\t"
  181841. #else
  181842. "sbc r7, r7\n\t"
  181843. #endif
  181844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181845. "subs r2, r2, r7\n\t"
  181846. #else
  181847. "sub r2, r2, r7\n\t"
  181848. #endif
  181849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181850. "mvns r7, r7\n\t"
  181851. #else
  181852. "mvn r7, r7\n\t"
  181853. #endif
  181854. #ifdef WOLFSSL_KEIL
  181855. "ands r3, r3, r7\n\t"
  181856. #elif defined(__clang__)
  181857. "ands r3, r7\n\t"
  181858. #else
  181859. "and r3, r7\n\t"
  181860. #endif
  181861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181862. "subs r6, r6, #4\n\t"
  181863. #else
  181864. "sub r6, r6, #4\n\t"
  181865. #endif
  181866. "cmp r6, #0\n\t"
  181867. "bge L_sp_1024_cmp_32_words_%=\n\t"
  181868. "movs %[a], r2\n\t"
  181869. : [a] "+r" (a), [b] "+r" (b)
  181870. :
  181871. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  181872. );
  181873. return (uint32_t)(size_t)a;
  181874. }
  181875. /* Divide d in a and put remainder into r (m*d + r = a)
  181876. * m is not calculated as it is not needed at this time.
  181877. *
  181878. * a Number to be divided.
  181879. * d Number to divide with.
  181880. * m Multiplier result.
  181881. * r Remainder from the division.
  181882. * returns MP_OKAY indicating success.
  181883. */
  181884. static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m,
  181885. sp_digit* r)
  181886. {
  181887. sp_digit t1[64], t2[33];
  181888. sp_digit div, r1;
  181889. int i;
  181890. (void)m;
  181891. div = d[31];
  181892. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  181893. for (i=31; i>=0; i--) {
  181894. sp_digit hi = t1[32 + i] - (t1[32 + i] == div);
  181895. r1 = div_1024_word_32(hi, t1[32 + i - 1], div);
  181896. sp_1024_mul_d_32(t2, d, r1);
  181897. t1[32 + i] += sp_1024_sub_in_place_32(&t1[i], t2);
  181898. t1[32 + i] -= t2[32];
  181899. sp_1024_mask_32(t2, d, t1[32 + i]);
  181900. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  181901. sp_1024_mask_32(t2, d, t1[32 + i]);
  181902. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  181903. }
  181904. r1 = sp_1024_cmp_32(t1, d) >= 0;
  181905. sp_1024_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  181906. return MP_OKAY;
  181907. }
  181908. /* Reduce a modulo m into r. (r = a mod m)
  181909. *
  181910. * r A single precision number that is the reduced result.
  181911. * a A single precision number that is to be reduced.
  181912. * m A single precision number that is the modulus to reduce with.
  181913. * returns MP_OKAY indicating success.
  181914. */
  181915. static WC_INLINE int sp_1024_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  181916. {
  181917. return sp_1024_div_32(a, m, NULL, r);
  181918. }
  181919. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  181920. *
  181921. * r The resulting Montgomery form number.
  181922. * a The number to convert.
  181923. * m The modulus (prime).
  181924. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  181925. */
  181926. static int sp_1024_mod_mul_norm_32(sp_digit* r, const sp_digit* a,
  181927. const sp_digit* m)
  181928. {
  181929. sp_1024_mul_32(r, a, p1024_norm_mod);
  181930. return sp_1024_mod_32(r, r, m);
  181931. }
  181932. #ifdef WOLFCRYPT_HAVE_SAKKE
  181933. /* Create a new point.
  181934. *
  181935. * heap [in] Buffer to allocate dynamic memory from.
  181936. * sp [in] Data for point - only if not allocating.
  181937. * p [out] New point.
  181938. * returns MEMORY_E when dynamic memory allocation fails and 0 otherwise.
  181939. */
  181940. static int sp_1024_point_new_ex_32(void* heap, sp_point_1024* sp,
  181941. sp_point_1024** p)
  181942. {
  181943. int ret = MP_OKAY;
  181944. (void)heap;
  181945. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  181946. (void)sp;
  181947. *p = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap, DYNAMIC_TYPE_ECC);
  181948. #else
  181949. *p = sp;
  181950. #endif
  181951. if (*p == NULL) {
  181952. ret = MEMORY_E;
  181953. }
  181954. return ret;
  181955. }
  181956. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  181957. /* Allocate memory for point and return error. */
  181958. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), NULL, &(p))
  181959. #else
  181960. /* Set pointer to data and return no error. */
  181961. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), &(sp), &(p))
  181962. #endif
  181963. #endif /* WOLFCRYPT_HAVE_SAKKE */
  181964. #ifdef WOLFCRYPT_HAVE_SAKKE
  181965. /* Free the point.
  181966. *
  181967. * p [in,out] Point to free.
  181968. * clear [in] Indicates whether to zeroize point.
  181969. * heap [in] Buffer from which dynamic memory was allocate from.
  181970. */
  181971. static void sp_1024_point_free_32(sp_point_1024* p, int clear, void* heap)
  181972. {
  181973. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  181974. /* If valid pointer then clear point data if requested and free data. */
  181975. if (p != NULL) {
  181976. if (clear != 0) {
  181977. XMEMSET(p, 0, sizeof(*p));
  181978. }
  181979. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  181980. }
  181981. #else
  181982. /* Clear point data if requested. */
  181983. if ((p != NULL) && (clear != 0)) {
  181984. XMEMSET(p, 0, sizeof(*p));
  181985. }
  181986. #endif
  181987. (void)heap;
  181988. }
  181989. #endif /* WOLFCRYPT_HAVE_SAKKE */
  181990. /* Convert an mp_int to an array of sp_digit.
  181991. *
  181992. * r A single precision integer.
  181993. * size Maximum number of bytes to convert
  181994. * a A multi-precision integer.
  181995. */
  181996. static void sp_1024_from_mp(sp_digit* r, int size, const mp_int* a)
  181997. {
  181998. #if DIGIT_BIT == 32
  181999. int j;
  182000. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  182001. for (j = a->used; j < size; j++) {
  182002. r[j] = 0;
  182003. }
  182004. #elif DIGIT_BIT > 32
  182005. int i;
  182006. int j = 0;
  182007. word32 s = 0;
  182008. r[0] = 0;
  182009. for (i = 0; i < a->used && j < size; i++) {
  182010. r[j] |= ((sp_digit)a->dp[i] << s);
  182011. r[j] &= 0xffffffff;
  182012. s = 32U - s;
  182013. if (j + 1 >= size) {
  182014. break;
  182015. }
  182016. /* lint allow cast of mismatch word32 and mp_digit */
  182017. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  182018. while ((s + 32U) <= (word32)DIGIT_BIT) {
  182019. s += 32U;
  182020. r[j] &= 0xffffffff;
  182021. if (j + 1 >= size) {
  182022. break;
  182023. }
  182024. if (s < (word32)DIGIT_BIT) {
  182025. /* lint allow cast of mismatch word32 and mp_digit */
  182026. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  182027. }
  182028. else {
  182029. r[++j] = (sp_digit)0;
  182030. }
  182031. }
  182032. s = (word32)DIGIT_BIT - s;
  182033. }
  182034. for (j++; j < size; j++) {
  182035. r[j] = 0;
  182036. }
  182037. #else
  182038. int i;
  182039. int j = 0;
  182040. int s = 0;
  182041. r[0] = 0;
  182042. for (i = 0; i < a->used && j < size; i++) {
  182043. r[j] |= ((sp_digit)a->dp[i]) << s;
  182044. if (s + DIGIT_BIT >= 32) {
  182045. r[j] &= 0xffffffff;
  182046. if (j + 1 >= size) {
  182047. break;
  182048. }
  182049. s = 32 - s;
  182050. if (s == DIGIT_BIT) {
  182051. r[++j] = 0;
  182052. s = 0;
  182053. }
  182054. else {
  182055. r[++j] = a->dp[i] >> s;
  182056. s = DIGIT_BIT - s;
  182057. }
  182058. }
  182059. else {
  182060. s += DIGIT_BIT;
  182061. }
  182062. }
  182063. for (j++; j < size; j++) {
  182064. r[j] = 0;
  182065. }
  182066. #endif
  182067. }
  182068. /* Convert a point of type ecc_point to type sp_point_1024.
  182069. *
  182070. * p Point of type sp_point_1024 (result).
  182071. * pm Point of type ecc_point.
  182072. */
  182073. static void sp_1024_point_from_ecc_point_32(sp_point_1024* p,
  182074. const ecc_point* pm)
  182075. {
  182076. XMEMSET(p->x, 0, sizeof(p->x));
  182077. XMEMSET(p->y, 0, sizeof(p->y));
  182078. XMEMSET(p->z, 0, sizeof(p->z));
  182079. sp_1024_from_mp(p->x, 32, pm->x);
  182080. sp_1024_from_mp(p->y, 32, pm->y);
  182081. sp_1024_from_mp(p->z, 32, pm->z);
  182082. p->infinity = 0;
  182083. }
  182084. /* Convert an array of sp_digit to an mp_int.
  182085. *
  182086. * a A single precision integer.
  182087. * r A multi-precision integer.
  182088. */
  182089. static int sp_1024_to_mp(const sp_digit* a, mp_int* r)
  182090. {
  182091. int err;
  182092. err = mp_grow(r, (1024 + DIGIT_BIT - 1) / DIGIT_BIT);
  182093. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  182094. #if DIGIT_BIT == 32
  182095. XMEMCPY(r->dp, a, sizeof(sp_digit) * 32);
  182096. r->used = 32;
  182097. mp_clamp(r);
  182098. #elif DIGIT_BIT < 32
  182099. int i;
  182100. int j = 0;
  182101. int s = 0;
  182102. r->dp[0] = 0;
  182103. for (i = 0; i < 32; i++) {
  182104. r->dp[j] |= (mp_digit)(a[i] << s);
  182105. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  182106. s = DIGIT_BIT - s;
  182107. r->dp[++j] = (mp_digit)(a[i] >> s);
  182108. while (s + DIGIT_BIT <= 32) {
  182109. s += DIGIT_BIT;
  182110. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  182111. if (s == SP_WORD_SIZE) {
  182112. r->dp[j] = 0;
  182113. }
  182114. else {
  182115. r->dp[j] = (mp_digit)(a[i] >> s);
  182116. }
  182117. }
  182118. s = 32 - s;
  182119. }
  182120. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  182121. mp_clamp(r);
  182122. #else
  182123. int i;
  182124. int j = 0;
  182125. int s = 0;
  182126. r->dp[0] = 0;
  182127. for (i = 0; i < 32; i++) {
  182128. r->dp[j] |= ((mp_digit)a[i]) << s;
  182129. if (s + 32 >= DIGIT_BIT) {
  182130. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  182131. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  182132. #endif
  182133. s = DIGIT_BIT - s;
  182134. r->dp[++j] = a[i] >> s;
  182135. s = 32 - s;
  182136. }
  182137. else {
  182138. s += 32;
  182139. }
  182140. }
  182141. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  182142. mp_clamp(r);
  182143. #endif
  182144. }
  182145. return err;
  182146. }
  182147. /* Convert a point of type sp_point_1024 to type ecc_point.
  182148. *
  182149. * p Point of type sp_point_1024.
  182150. * pm Point of type ecc_point (result).
  182151. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  182152. * MP_OKAY.
  182153. */
  182154. static int sp_1024_point_to_ecc_point_32(const sp_point_1024* p, ecc_point* pm)
  182155. {
  182156. int err;
  182157. err = sp_1024_to_mp(p->x, pm->x);
  182158. if (err == MP_OKAY) {
  182159. err = sp_1024_to_mp(p->y, pm->y);
  182160. }
  182161. if (err == MP_OKAY) {
  182162. err = sp_1024_to_mp(p->z, pm->z);
  182163. }
  182164. return err;
  182165. }
  182166. /* Reduce the number back to 1024 bits using Montgomery reduction.
  182167. *
  182168. * a A single precision number to reduce in place.
  182169. * m The single precision number representing the modulus.
  182170. * mp The digit representing the negative inverse of m mod 2^n.
  182171. */
  182172. SP_NOINLINE static void sp_1024_mont_reduce_32(sp_digit* a, const sp_digit* m,
  182173. sp_digit mp)
  182174. {
  182175. __asm__ __volatile__ (
  182176. "movs r7, #0\n\t"
  182177. "mov r8, %[mp]\n\t"
  182178. "mov r12, r7\n\t"
  182179. "mov lr, %[m]\n\t"
  182180. "mov r9, %[a]\n\t"
  182181. "mov r11, %[a]\n\t"
  182182. "movs r5, #0x7c\n\t"
  182183. "movs r6, #0x80\n\t"
  182184. "add r9, r9, r5\n\t"
  182185. "add r11, r11, r6\n\t"
  182186. "\n"
  182187. "L_sp_1024_mont_reduce_32_mod_%=:\n\t"
  182188. "movs r7, #0\n\t"
  182189. "movs r4, #0\n\t"
  182190. "# a[i] += m[0] * mu\n\t"
  182191. "ldm %[m]!, {%[mp]}\n\t"
  182192. "ldm %[a]!, {r3}\n\t"
  182193. "# mu = a[i] * mp\n\t"
  182194. "mov r5, r8\n\t"
  182195. #ifdef WOLFSSL_KEIL
  182196. "muls r5, r3, r5\n\t"
  182197. #elif defined(__clang__)
  182198. "muls r5, r3\n\t"
  182199. #else
  182200. "mul r5, r3\n\t"
  182201. #endif
  182202. "mov r10, r5\n\t"
  182203. "# Multiply m[0] and mu - Start\n\t"
  182204. "mov r5, r10\n\t"
  182205. "uxth r6, %[mp]\n\t"
  182206. "uxth r5, r5\n\t"
  182207. #ifdef WOLFSSL_KEIL
  182208. "muls r6, r5, r6\n\t"
  182209. #elif defined(__clang__)
  182210. "muls r6, r5\n\t"
  182211. #else
  182212. "mul r6, r5\n\t"
  182213. #endif
  182214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182215. "adds r3, r3, r6\n\t"
  182216. #else
  182217. "add r3, r3, r6\n\t"
  182218. #endif
  182219. #ifdef WOLFSSL_KEIL
  182220. "adcs r4, r4, r7\n\t"
  182221. #elif defined(__clang__)
  182222. "adcs r4, r7\n\t"
  182223. #else
  182224. "adc r4, r7\n\t"
  182225. #endif
  182226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182227. "lsrs r6, %[mp], #16\n\t"
  182228. #else
  182229. "lsr r6, %[mp], #16\n\t"
  182230. #endif
  182231. #ifdef WOLFSSL_KEIL
  182232. "muls r5, r6, r5\n\t"
  182233. #elif defined(__clang__)
  182234. "muls r5, r6\n\t"
  182235. #else
  182236. "mul r5, r6\n\t"
  182237. #endif
  182238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182239. "lsrs r6, r5, #16\n\t"
  182240. #else
  182241. "lsr r6, r5, #16\n\t"
  182242. #endif
  182243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182244. "lsls r5, r5, #16\n\t"
  182245. #else
  182246. "lsl r5, r5, #16\n\t"
  182247. #endif
  182248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182249. "adds r3, r3, r5\n\t"
  182250. #else
  182251. "add r3, r3, r5\n\t"
  182252. #endif
  182253. #ifdef WOLFSSL_KEIL
  182254. "adcs r4, r4, r6\n\t"
  182255. #elif defined(__clang__)
  182256. "adcs r4, r6\n\t"
  182257. #else
  182258. "adc r4, r6\n\t"
  182259. #endif
  182260. "mov r5, r10\n\t"
  182261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182262. "lsrs r6, %[mp], #16\n\t"
  182263. #else
  182264. "lsr r6, %[mp], #16\n\t"
  182265. #endif
  182266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182267. "lsrs r5, r5, #16\n\t"
  182268. #else
  182269. "lsr r5, r5, #16\n\t"
  182270. #endif
  182271. #ifdef WOLFSSL_KEIL
  182272. "muls r6, r5, r6\n\t"
  182273. #elif defined(__clang__)
  182274. "muls r6, r5\n\t"
  182275. #else
  182276. "mul r6, r5\n\t"
  182277. #endif
  182278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182279. "adds r4, r4, r6\n\t"
  182280. #else
  182281. "add r4, r4, r6\n\t"
  182282. #endif
  182283. "uxth r6, %[mp]\n\t"
  182284. #ifdef WOLFSSL_KEIL
  182285. "muls r5, r6, r5\n\t"
  182286. #elif defined(__clang__)
  182287. "muls r5, r6\n\t"
  182288. #else
  182289. "mul r5, r6\n\t"
  182290. #endif
  182291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182292. "lsrs r6, r5, #16\n\t"
  182293. #else
  182294. "lsr r6, r5, #16\n\t"
  182295. #endif
  182296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182297. "lsls r5, r5, #16\n\t"
  182298. #else
  182299. "lsl r5, r5, #16\n\t"
  182300. #endif
  182301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182302. "adds r3, r3, r5\n\t"
  182303. #else
  182304. "add r3, r3, r5\n\t"
  182305. #endif
  182306. #ifdef WOLFSSL_KEIL
  182307. "adcs r4, r4, r6\n\t"
  182308. #elif defined(__clang__)
  182309. "adcs r4, r6\n\t"
  182310. #else
  182311. "adc r4, r6\n\t"
  182312. #endif
  182313. "# Multiply m[0] and mu - Done\n\t"
  182314. "\n"
  182315. "L_sp_1024_mont_reduce_32_word_%=:\n\t"
  182316. "# a[i+j] += m[j] * mu\n\t"
  182317. "ldr r3, [%[a]]\n\t"
  182318. "ldm %[m]!, {%[mp]}\n\t"
  182319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182320. "adds r3, r3, r4\n\t"
  182321. #else
  182322. "add r3, r3, r4\n\t"
  182323. #endif
  182324. "movs r4, #0\n\t"
  182325. #ifdef WOLFSSL_KEIL
  182326. "adcs r4, r4, r7\n\t"
  182327. #elif defined(__clang__)
  182328. "adcs r4, r7\n\t"
  182329. #else
  182330. "adc r4, r7\n\t"
  182331. #endif
  182332. "# Multiply m[j] and mu - Start\n\t"
  182333. "mov r5, r10\n\t"
  182334. "uxth r6, %[mp]\n\t"
  182335. "uxth r5, r5\n\t"
  182336. #ifdef WOLFSSL_KEIL
  182337. "muls r6, r5, r6\n\t"
  182338. #elif defined(__clang__)
  182339. "muls r6, r5\n\t"
  182340. #else
  182341. "mul r6, r5\n\t"
  182342. #endif
  182343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182344. "adds r3, r3, r6\n\t"
  182345. #else
  182346. "add r3, r3, r6\n\t"
  182347. #endif
  182348. #ifdef WOLFSSL_KEIL
  182349. "adcs r4, r4, r7\n\t"
  182350. #elif defined(__clang__)
  182351. "adcs r4, r7\n\t"
  182352. #else
  182353. "adc r4, r7\n\t"
  182354. #endif
  182355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182356. "lsrs r6, %[mp], #16\n\t"
  182357. #else
  182358. "lsr r6, %[mp], #16\n\t"
  182359. #endif
  182360. #ifdef WOLFSSL_KEIL
  182361. "muls r5, r6, r5\n\t"
  182362. #elif defined(__clang__)
  182363. "muls r5, r6\n\t"
  182364. #else
  182365. "mul r5, r6\n\t"
  182366. #endif
  182367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182368. "lsrs r6, r5, #16\n\t"
  182369. #else
  182370. "lsr r6, r5, #16\n\t"
  182371. #endif
  182372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182373. "lsls r5, r5, #16\n\t"
  182374. #else
  182375. "lsl r5, r5, #16\n\t"
  182376. #endif
  182377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182378. "adds r3, r3, r5\n\t"
  182379. #else
  182380. "add r3, r3, r5\n\t"
  182381. #endif
  182382. #ifdef WOLFSSL_KEIL
  182383. "adcs r4, r4, r6\n\t"
  182384. #elif defined(__clang__)
  182385. "adcs r4, r6\n\t"
  182386. #else
  182387. "adc r4, r6\n\t"
  182388. #endif
  182389. "mov r5, r10\n\t"
  182390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182391. "lsrs r6, %[mp], #16\n\t"
  182392. #else
  182393. "lsr r6, %[mp], #16\n\t"
  182394. #endif
  182395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182396. "lsrs r5, r5, #16\n\t"
  182397. #else
  182398. "lsr r5, r5, #16\n\t"
  182399. #endif
  182400. #ifdef WOLFSSL_KEIL
  182401. "muls r6, r5, r6\n\t"
  182402. #elif defined(__clang__)
  182403. "muls r6, r5\n\t"
  182404. #else
  182405. "mul r6, r5\n\t"
  182406. #endif
  182407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182408. "adds r4, r4, r6\n\t"
  182409. #else
  182410. "add r4, r4, r6\n\t"
  182411. #endif
  182412. "uxth r6, %[mp]\n\t"
  182413. #ifdef WOLFSSL_KEIL
  182414. "muls r5, r6, r5\n\t"
  182415. #elif defined(__clang__)
  182416. "muls r5, r6\n\t"
  182417. #else
  182418. "mul r5, r6\n\t"
  182419. #endif
  182420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182421. "lsrs r6, r5, #16\n\t"
  182422. #else
  182423. "lsr r6, r5, #16\n\t"
  182424. #endif
  182425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182426. "lsls r5, r5, #16\n\t"
  182427. #else
  182428. "lsl r5, r5, #16\n\t"
  182429. #endif
  182430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182431. "adds r3, r3, r5\n\t"
  182432. #else
  182433. "add r3, r3, r5\n\t"
  182434. #endif
  182435. #ifdef WOLFSSL_KEIL
  182436. "adcs r4, r4, r6\n\t"
  182437. #elif defined(__clang__)
  182438. "adcs r4, r6\n\t"
  182439. #else
  182440. "adc r4, r6\n\t"
  182441. #endif
  182442. "# Multiply m[j] and mu - Done\n\t"
  182443. "stm %[a]!, {r3}\n\t"
  182444. "cmp %[a], r9\n\t"
  182445. "blt L_sp_1024_mont_reduce_32_word_%=\n\t"
  182446. "# a[i+31] += m[31] * mu\n\t"
  182447. "ldr %[mp], [%[m]]\n\t"
  182448. "mov r3, r12\n\t"
  182449. "# Multiply m[31] and mu - Start\n\t"
  182450. "mov r5, r10\n\t"
  182451. "uxth r6, %[mp]\n\t"
  182452. "uxth r5, r5\n\t"
  182453. #ifdef WOLFSSL_KEIL
  182454. "muls r6, r5, r6\n\t"
  182455. #elif defined(__clang__)
  182456. "muls r6, r5\n\t"
  182457. #else
  182458. "mul r6, r5\n\t"
  182459. #endif
  182460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182461. "adds r4, r4, r6\n\t"
  182462. #else
  182463. "add r4, r4, r6\n\t"
  182464. #endif
  182465. #ifdef WOLFSSL_KEIL
  182466. "adcs r3, r3, r7\n\t"
  182467. #elif defined(__clang__)
  182468. "adcs r3, r7\n\t"
  182469. #else
  182470. "adc r3, r7\n\t"
  182471. #endif
  182472. #ifdef WOLFSSL_KEIL
  182473. "adcs r7, r7, r7\n\t"
  182474. #elif defined(__clang__)
  182475. "adcs r7, r7\n\t"
  182476. #else
  182477. "adc r7, r7\n\t"
  182478. #endif
  182479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182480. "lsrs r6, %[mp], #16\n\t"
  182481. #else
  182482. "lsr r6, %[mp], #16\n\t"
  182483. #endif
  182484. #ifdef WOLFSSL_KEIL
  182485. "muls r5, r6, r5\n\t"
  182486. #elif defined(__clang__)
  182487. "muls r5, r6\n\t"
  182488. #else
  182489. "mul r5, r6\n\t"
  182490. #endif
  182491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182492. "lsrs r6, r5, #16\n\t"
  182493. #else
  182494. "lsr r6, r5, #16\n\t"
  182495. #endif
  182496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182497. "lsls r5, r5, #16\n\t"
  182498. #else
  182499. "lsl r5, r5, #16\n\t"
  182500. #endif
  182501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182502. "adds r4, r4, r5\n\t"
  182503. #else
  182504. "add r4, r4, r5\n\t"
  182505. #endif
  182506. #ifdef WOLFSSL_KEIL
  182507. "adcs r3, r3, r6\n\t"
  182508. #elif defined(__clang__)
  182509. "adcs r3, r6\n\t"
  182510. #else
  182511. "adc r3, r6\n\t"
  182512. #endif
  182513. #ifdef WOLFSSL_KEIL
  182514. "adcs r7, r7, r7\n\t"
  182515. #elif defined(__clang__)
  182516. "adcs r7, r7\n\t"
  182517. #else
  182518. "adc r7, r7\n\t"
  182519. #endif
  182520. "mov r5, r10\n\t"
  182521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182522. "lsrs r6, %[mp], #16\n\t"
  182523. #else
  182524. "lsr r6, %[mp], #16\n\t"
  182525. #endif
  182526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182527. "lsrs r5, r5, #16\n\t"
  182528. #else
  182529. "lsr r5, r5, #16\n\t"
  182530. #endif
  182531. #ifdef WOLFSSL_KEIL
  182532. "muls r6, r5, r6\n\t"
  182533. #elif defined(__clang__)
  182534. "muls r6, r5\n\t"
  182535. #else
  182536. "mul r6, r5\n\t"
  182537. #endif
  182538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182539. "adds r3, r3, r6\n\t"
  182540. #else
  182541. "add r3, r3, r6\n\t"
  182542. #endif
  182543. #ifdef WOLFSSL_KEIL
  182544. "adcs r7, r7, r7\n\t"
  182545. #elif defined(__clang__)
  182546. "adcs r7, r7\n\t"
  182547. #else
  182548. "adc r7, r7\n\t"
  182549. #endif
  182550. "uxth r6, %[mp]\n\t"
  182551. #ifdef WOLFSSL_KEIL
  182552. "muls r5, r6, r5\n\t"
  182553. #elif defined(__clang__)
  182554. "muls r5, r6\n\t"
  182555. #else
  182556. "mul r5, r6\n\t"
  182557. #endif
  182558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182559. "lsrs r6, r5, #16\n\t"
  182560. #else
  182561. "lsr r6, r5, #16\n\t"
  182562. #endif
  182563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182564. "lsls r5, r5, #16\n\t"
  182565. #else
  182566. "lsl r5, r5, #16\n\t"
  182567. #endif
  182568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182569. "adds r4, r4, r5\n\t"
  182570. #else
  182571. "add r4, r4, r5\n\t"
  182572. #endif
  182573. #ifdef WOLFSSL_KEIL
  182574. "adcs r3, r3, r6\n\t"
  182575. #elif defined(__clang__)
  182576. "adcs r3, r6\n\t"
  182577. #else
  182578. "adc r3, r6\n\t"
  182579. #endif
  182580. #ifdef WOLFSSL_KEIL
  182581. "adcs r7, r7, r7\n\t"
  182582. #elif defined(__clang__)
  182583. "adcs r7, r7\n\t"
  182584. #else
  182585. "adc r7, r7\n\t"
  182586. #endif
  182587. "# Multiply m[31] and mu - Done\n\t"
  182588. "ldr r5, [%[a]]\n\t"
  182589. "ldr r6, [%[a], #4]\n\t"
  182590. "movs %[mp], #0\n\t"
  182591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182592. "adds r5, r5, r4\n\t"
  182593. #else
  182594. "add r5, r5, r4\n\t"
  182595. #endif
  182596. #ifdef WOLFSSL_KEIL
  182597. "adcs r6, r6, r3\n\t"
  182598. #elif defined(__clang__)
  182599. "adcs r6, r3\n\t"
  182600. #else
  182601. "adc r6, r3\n\t"
  182602. #endif
  182603. #ifdef WOLFSSL_KEIL
  182604. "adcs r7, r7, %[mp]\n\t"
  182605. #elif defined(__clang__)
  182606. "adcs r7, %[mp]\n\t"
  182607. #else
  182608. "adc r7, %[mp]\n\t"
  182609. #endif
  182610. "stm %[a]!, {r5, r6}\n\t"
  182611. "# i += 1\n\t"
  182612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182613. "subs %[a], %[a], #4\n\t"
  182614. #else
  182615. "sub %[a], %[a], #4\n\t"
  182616. #endif
  182617. "movs r3, #0x7c\n\t"
  182618. "mov r9, %[a]\n\t"
  182619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182620. "subs %[a], %[a], r3\n\t"
  182621. #else
  182622. "sub %[a], %[a], r3\n\t"
  182623. #endif
  182624. "mov r12, r7\n\t"
  182625. "mov %[m], lr\n\t"
  182626. "cmp r11, %[a]\n\t"
  182627. "bgt L_sp_1024_mont_reduce_32_mod_%=\n\t"
  182628. "ldr r5, [%[m], #124]\n\t"
  182629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182630. "negs r7, r7\n\t"
  182631. #else
  182632. "neg r7, r7\n\t"
  182633. #endif
  182634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182635. "subs r5, r5, r6\n\t"
  182636. #else
  182637. "sub r5, r5, r6\n\t"
  182638. #endif
  182639. #ifdef WOLFSSL_KEIL
  182640. "sbcs r5, r5, r5\n\t"
  182641. #elif defined(__clang__)
  182642. "sbcs r5, r5\n\t"
  182643. #else
  182644. "sbc r5, r5\n\t"
  182645. #endif
  182646. #ifdef WOLFSSL_KEIL
  182647. "orrs r7, r7, r5\n\t"
  182648. #elif defined(__clang__)
  182649. "orrs r7, r5\n\t"
  182650. #else
  182651. "orr r7, r5\n\t"
  182652. #endif
  182653. "# Subtract masked modulus\n\t"
  182654. "movs r4, #0x80\n\t"
  182655. "movs %[mp], #0\n\t"
  182656. "movs r3, #0\n\t"
  182657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182658. "subs %[a], %[a], r4\n\t"
  182659. #else
  182660. "sub %[a], %[a], r4\n\t"
  182661. #endif
  182662. #ifndef WOLFSSL_SP_LARGE_CODE
  182663. "\n"
  182664. "L_sp_1024_mont_reduce_32_sub_mask_%=:\n\t"
  182665. "ldm %[m]!, {r6}\n\t"
  182666. "movs r5, #0\n\t"
  182667. #ifdef WOLFSSL_KEIL
  182668. "ands r6, r6, r7\n\t"
  182669. #elif defined(__clang__)
  182670. "ands r6, r7\n\t"
  182671. #else
  182672. "and r6, r7\n\t"
  182673. #endif
  182674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182675. "subs r5, r5, %[mp]\n\t"
  182676. #else
  182677. "sub r5, r5, %[mp]\n\t"
  182678. #endif
  182679. "ldr r5, [%[a], r4]\n\t"
  182680. #ifdef WOLFSSL_KEIL
  182681. "sbcs r5, r5, r6\n\t"
  182682. #elif defined(__clang__)
  182683. "sbcs r5, r6\n\t"
  182684. #else
  182685. "sbc r5, r6\n\t"
  182686. #endif
  182687. #ifdef WOLFSSL_KEIL
  182688. "sbcs %[mp], %[mp], %[mp]\n\t"
  182689. #elif defined(__clang__)
  182690. "sbcs %[mp], %[mp]\n\t"
  182691. #else
  182692. "sbc %[mp], %[mp]\n\t"
  182693. #endif
  182694. "stm %[a]!, {r5}\n\t"
  182695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182696. "adds r3, r3, #4\n\t"
  182697. #else
  182698. "add r3, r3, #4\n\t"
  182699. #endif
  182700. "cmp r3, r4\n\t"
  182701. "blt L_sp_1024_mont_reduce_32_sub_mask_%=\n\t"
  182702. #else /* WOLFSSL_SP_LARGE_CODE */
  182703. "ldm %[m]!, {r6}\n\t"
  182704. #ifdef WOLFSSL_KEIL
  182705. "ands r6, r6, r7\n\t"
  182706. #elif defined(__clang__)
  182707. "ands r6, r7\n\t"
  182708. #else
  182709. "and r6, r7\n\t"
  182710. #endif
  182711. "ldr r5, [%[a], r4]\n\t"
  182712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182713. "subs r5, r5, r6\n\t"
  182714. #else
  182715. "sub r5, r5, r6\n\t"
  182716. #endif
  182717. "stm %[a]!, {r5}\n\t"
  182718. "ldm %[m]!, {r6}\n\t"
  182719. #ifdef WOLFSSL_KEIL
  182720. "ands r6, r6, r7\n\t"
  182721. #elif defined(__clang__)
  182722. "ands r6, r7\n\t"
  182723. #else
  182724. "and r6, r7\n\t"
  182725. #endif
  182726. "ldr r5, [%[a], r4]\n\t"
  182727. #ifdef WOLFSSL_KEIL
  182728. "sbcs r5, r5, r6\n\t"
  182729. #elif defined(__clang__)
  182730. "sbcs r5, r6\n\t"
  182731. #else
  182732. "sbc r5, r6\n\t"
  182733. #endif
  182734. "stm %[a]!, {r5}\n\t"
  182735. "ldm %[m]!, {r6}\n\t"
  182736. #ifdef WOLFSSL_KEIL
  182737. "ands r6, r6, r7\n\t"
  182738. #elif defined(__clang__)
  182739. "ands r6, r7\n\t"
  182740. #else
  182741. "and r6, r7\n\t"
  182742. #endif
  182743. "ldr r5, [%[a], r4]\n\t"
  182744. #ifdef WOLFSSL_KEIL
  182745. "sbcs r5, r5, r6\n\t"
  182746. #elif defined(__clang__)
  182747. "sbcs r5, r6\n\t"
  182748. #else
  182749. "sbc r5, r6\n\t"
  182750. #endif
  182751. "stm %[a]!, {r5}\n\t"
  182752. "ldm %[m]!, {r6}\n\t"
  182753. #ifdef WOLFSSL_KEIL
  182754. "ands r6, r6, r7\n\t"
  182755. #elif defined(__clang__)
  182756. "ands r6, r7\n\t"
  182757. #else
  182758. "and r6, r7\n\t"
  182759. #endif
  182760. "ldr r5, [%[a], r4]\n\t"
  182761. #ifdef WOLFSSL_KEIL
  182762. "sbcs r5, r5, r6\n\t"
  182763. #elif defined(__clang__)
  182764. "sbcs r5, r6\n\t"
  182765. #else
  182766. "sbc r5, r6\n\t"
  182767. #endif
  182768. "stm %[a]!, {r5}\n\t"
  182769. "ldm %[m]!, {r6}\n\t"
  182770. #ifdef WOLFSSL_KEIL
  182771. "ands r6, r6, r7\n\t"
  182772. #elif defined(__clang__)
  182773. "ands r6, r7\n\t"
  182774. #else
  182775. "and r6, r7\n\t"
  182776. #endif
  182777. "ldr r5, [%[a], r4]\n\t"
  182778. #ifdef WOLFSSL_KEIL
  182779. "sbcs r5, r5, r6\n\t"
  182780. #elif defined(__clang__)
  182781. "sbcs r5, r6\n\t"
  182782. #else
  182783. "sbc r5, r6\n\t"
  182784. #endif
  182785. "stm %[a]!, {r5}\n\t"
  182786. "ldm %[m]!, {r6}\n\t"
  182787. #ifdef WOLFSSL_KEIL
  182788. "ands r6, r6, r7\n\t"
  182789. #elif defined(__clang__)
  182790. "ands r6, r7\n\t"
  182791. #else
  182792. "and r6, r7\n\t"
  182793. #endif
  182794. "ldr r5, [%[a], r4]\n\t"
  182795. #ifdef WOLFSSL_KEIL
  182796. "sbcs r5, r5, r6\n\t"
  182797. #elif defined(__clang__)
  182798. "sbcs r5, r6\n\t"
  182799. #else
  182800. "sbc r5, r6\n\t"
  182801. #endif
  182802. "stm %[a]!, {r5}\n\t"
  182803. "ldm %[m]!, {r6}\n\t"
  182804. #ifdef WOLFSSL_KEIL
  182805. "ands r6, r6, r7\n\t"
  182806. #elif defined(__clang__)
  182807. "ands r6, r7\n\t"
  182808. #else
  182809. "and r6, r7\n\t"
  182810. #endif
  182811. "ldr r5, [%[a], r4]\n\t"
  182812. #ifdef WOLFSSL_KEIL
  182813. "sbcs r5, r5, r6\n\t"
  182814. #elif defined(__clang__)
  182815. "sbcs r5, r6\n\t"
  182816. #else
  182817. "sbc r5, r6\n\t"
  182818. #endif
  182819. "stm %[a]!, {r5}\n\t"
  182820. "ldm %[m]!, {r6}\n\t"
  182821. #ifdef WOLFSSL_KEIL
  182822. "ands r6, r6, r7\n\t"
  182823. #elif defined(__clang__)
  182824. "ands r6, r7\n\t"
  182825. #else
  182826. "and r6, r7\n\t"
  182827. #endif
  182828. "ldr r5, [%[a], r4]\n\t"
  182829. #ifdef WOLFSSL_KEIL
  182830. "sbcs r5, r5, r6\n\t"
  182831. #elif defined(__clang__)
  182832. "sbcs r5, r6\n\t"
  182833. #else
  182834. "sbc r5, r6\n\t"
  182835. #endif
  182836. "stm %[a]!, {r5}\n\t"
  182837. "ldm %[m]!, {r6}\n\t"
  182838. #ifdef WOLFSSL_KEIL
  182839. "ands r6, r6, r7\n\t"
  182840. #elif defined(__clang__)
  182841. "ands r6, r7\n\t"
  182842. #else
  182843. "and r6, r7\n\t"
  182844. #endif
  182845. "ldr r5, [%[a], r4]\n\t"
  182846. #ifdef WOLFSSL_KEIL
  182847. "sbcs r5, r5, r6\n\t"
  182848. #elif defined(__clang__)
  182849. "sbcs r5, r6\n\t"
  182850. #else
  182851. "sbc r5, r6\n\t"
  182852. #endif
  182853. "stm %[a]!, {r5}\n\t"
  182854. "ldm %[m]!, {r6}\n\t"
  182855. #ifdef WOLFSSL_KEIL
  182856. "ands r6, r6, r7\n\t"
  182857. #elif defined(__clang__)
  182858. "ands r6, r7\n\t"
  182859. #else
  182860. "and r6, r7\n\t"
  182861. #endif
  182862. "ldr r5, [%[a], r4]\n\t"
  182863. #ifdef WOLFSSL_KEIL
  182864. "sbcs r5, r5, r6\n\t"
  182865. #elif defined(__clang__)
  182866. "sbcs r5, r6\n\t"
  182867. #else
  182868. "sbc r5, r6\n\t"
  182869. #endif
  182870. "stm %[a]!, {r5}\n\t"
  182871. "ldm %[m]!, {r6}\n\t"
  182872. #ifdef WOLFSSL_KEIL
  182873. "ands r6, r6, r7\n\t"
  182874. #elif defined(__clang__)
  182875. "ands r6, r7\n\t"
  182876. #else
  182877. "and r6, r7\n\t"
  182878. #endif
  182879. "ldr r5, [%[a], r4]\n\t"
  182880. #ifdef WOLFSSL_KEIL
  182881. "sbcs r5, r5, r6\n\t"
  182882. #elif defined(__clang__)
  182883. "sbcs r5, r6\n\t"
  182884. #else
  182885. "sbc r5, r6\n\t"
  182886. #endif
  182887. "stm %[a]!, {r5}\n\t"
  182888. "ldm %[m]!, {r6}\n\t"
  182889. #ifdef WOLFSSL_KEIL
  182890. "ands r6, r6, r7\n\t"
  182891. #elif defined(__clang__)
  182892. "ands r6, r7\n\t"
  182893. #else
  182894. "and r6, r7\n\t"
  182895. #endif
  182896. "ldr r5, [%[a], r4]\n\t"
  182897. #ifdef WOLFSSL_KEIL
  182898. "sbcs r5, r5, r6\n\t"
  182899. #elif defined(__clang__)
  182900. "sbcs r5, r6\n\t"
  182901. #else
  182902. "sbc r5, r6\n\t"
  182903. #endif
  182904. "stm %[a]!, {r5}\n\t"
  182905. "ldm %[m]!, {r6}\n\t"
  182906. #ifdef WOLFSSL_KEIL
  182907. "ands r6, r6, r7\n\t"
  182908. #elif defined(__clang__)
  182909. "ands r6, r7\n\t"
  182910. #else
  182911. "and r6, r7\n\t"
  182912. #endif
  182913. "ldr r5, [%[a], r4]\n\t"
  182914. #ifdef WOLFSSL_KEIL
  182915. "sbcs r5, r5, r6\n\t"
  182916. #elif defined(__clang__)
  182917. "sbcs r5, r6\n\t"
  182918. #else
  182919. "sbc r5, r6\n\t"
  182920. #endif
  182921. "stm %[a]!, {r5}\n\t"
  182922. "ldm %[m]!, {r6}\n\t"
  182923. #ifdef WOLFSSL_KEIL
  182924. "ands r6, r6, r7\n\t"
  182925. #elif defined(__clang__)
  182926. "ands r6, r7\n\t"
  182927. #else
  182928. "and r6, r7\n\t"
  182929. #endif
  182930. "ldr r5, [%[a], r4]\n\t"
  182931. #ifdef WOLFSSL_KEIL
  182932. "sbcs r5, r5, r6\n\t"
  182933. #elif defined(__clang__)
  182934. "sbcs r5, r6\n\t"
  182935. #else
  182936. "sbc r5, r6\n\t"
  182937. #endif
  182938. "stm %[a]!, {r5}\n\t"
  182939. "ldm %[m]!, {r6}\n\t"
  182940. #ifdef WOLFSSL_KEIL
  182941. "ands r6, r6, r7\n\t"
  182942. #elif defined(__clang__)
  182943. "ands r6, r7\n\t"
  182944. #else
  182945. "and r6, r7\n\t"
  182946. #endif
  182947. "ldr r5, [%[a], r4]\n\t"
  182948. #ifdef WOLFSSL_KEIL
  182949. "sbcs r5, r5, r6\n\t"
  182950. #elif defined(__clang__)
  182951. "sbcs r5, r6\n\t"
  182952. #else
  182953. "sbc r5, r6\n\t"
  182954. #endif
  182955. "stm %[a]!, {r5}\n\t"
  182956. "ldm %[m]!, {r6}\n\t"
  182957. #ifdef WOLFSSL_KEIL
  182958. "ands r6, r6, r7\n\t"
  182959. #elif defined(__clang__)
  182960. "ands r6, r7\n\t"
  182961. #else
  182962. "and r6, r7\n\t"
  182963. #endif
  182964. "ldr r5, [%[a], r4]\n\t"
  182965. #ifdef WOLFSSL_KEIL
  182966. "sbcs r5, r5, r6\n\t"
  182967. #elif defined(__clang__)
  182968. "sbcs r5, r6\n\t"
  182969. #else
  182970. "sbc r5, r6\n\t"
  182971. #endif
  182972. "stm %[a]!, {r5}\n\t"
  182973. "ldm %[m]!, {r6}\n\t"
  182974. #ifdef WOLFSSL_KEIL
  182975. "ands r6, r6, r7\n\t"
  182976. #elif defined(__clang__)
  182977. "ands r6, r7\n\t"
  182978. #else
  182979. "and r6, r7\n\t"
  182980. #endif
  182981. "ldr r5, [%[a], r4]\n\t"
  182982. #ifdef WOLFSSL_KEIL
  182983. "sbcs r5, r5, r6\n\t"
  182984. #elif defined(__clang__)
  182985. "sbcs r5, r6\n\t"
  182986. #else
  182987. "sbc r5, r6\n\t"
  182988. #endif
  182989. "stm %[a]!, {r5}\n\t"
  182990. "ldm %[m]!, {r6}\n\t"
  182991. #ifdef WOLFSSL_KEIL
  182992. "ands r6, r6, r7\n\t"
  182993. #elif defined(__clang__)
  182994. "ands r6, r7\n\t"
  182995. #else
  182996. "and r6, r7\n\t"
  182997. #endif
  182998. "ldr r5, [%[a], r4]\n\t"
  182999. #ifdef WOLFSSL_KEIL
  183000. "sbcs r5, r5, r6\n\t"
  183001. #elif defined(__clang__)
  183002. "sbcs r5, r6\n\t"
  183003. #else
  183004. "sbc r5, r6\n\t"
  183005. #endif
  183006. "stm %[a]!, {r5}\n\t"
  183007. "ldm %[m]!, {r6}\n\t"
  183008. #ifdef WOLFSSL_KEIL
  183009. "ands r6, r6, r7\n\t"
  183010. #elif defined(__clang__)
  183011. "ands r6, r7\n\t"
  183012. #else
  183013. "and r6, r7\n\t"
  183014. #endif
  183015. "ldr r5, [%[a], r4]\n\t"
  183016. #ifdef WOLFSSL_KEIL
  183017. "sbcs r5, r5, r6\n\t"
  183018. #elif defined(__clang__)
  183019. "sbcs r5, r6\n\t"
  183020. #else
  183021. "sbc r5, r6\n\t"
  183022. #endif
  183023. "stm %[a]!, {r5}\n\t"
  183024. "ldm %[m]!, {r6}\n\t"
  183025. #ifdef WOLFSSL_KEIL
  183026. "ands r6, r6, r7\n\t"
  183027. #elif defined(__clang__)
  183028. "ands r6, r7\n\t"
  183029. #else
  183030. "and r6, r7\n\t"
  183031. #endif
  183032. "ldr r5, [%[a], r4]\n\t"
  183033. #ifdef WOLFSSL_KEIL
  183034. "sbcs r5, r5, r6\n\t"
  183035. #elif defined(__clang__)
  183036. "sbcs r5, r6\n\t"
  183037. #else
  183038. "sbc r5, r6\n\t"
  183039. #endif
  183040. "stm %[a]!, {r5}\n\t"
  183041. "ldm %[m]!, {r6}\n\t"
  183042. #ifdef WOLFSSL_KEIL
  183043. "ands r6, r6, r7\n\t"
  183044. #elif defined(__clang__)
  183045. "ands r6, r7\n\t"
  183046. #else
  183047. "and r6, r7\n\t"
  183048. #endif
  183049. "ldr r5, [%[a], r4]\n\t"
  183050. #ifdef WOLFSSL_KEIL
  183051. "sbcs r5, r5, r6\n\t"
  183052. #elif defined(__clang__)
  183053. "sbcs r5, r6\n\t"
  183054. #else
  183055. "sbc r5, r6\n\t"
  183056. #endif
  183057. "stm %[a]!, {r5}\n\t"
  183058. "ldm %[m]!, {r6}\n\t"
  183059. #ifdef WOLFSSL_KEIL
  183060. "ands r6, r6, r7\n\t"
  183061. #elif defined(__clang__)
  183062. "ands r6, r7\n\t"
  183063. #else
  183064. "and r6, r7\n\t"
  183065. #endif
  183066. "ldr r5, [%[a], r4]\n\t"
  183067. #ifdef WOLFSSL_KEIL
  183068. "sbcs r5, r5, r6\n\t"
  183069. #elif defined(__clang__)
  183070. "sbcs r5, r6\n\t"
  183071. #else
  183072. "sbc r5, r6\n\t"
  183073. #endif
  183074. "stm %[a]!, {r5}\n\t"
  183075. "ldm %[m]!, {r6}\n\t"
  183076. #ifdef WOLFSSL_KEIL
  183077. "ands r6, r6, r7\n\t"
  183078. #elif defined(__clang__)
  183079. "ands r6, r7\n\t"
  183080. #else
  183081. "and r6, r7\n\t"
  183082. #endif
  183083. "ldr r5, [%[a], r4]\n\t"
  183084. #ifdef WOLFSSL_KEIL
  183085. "sbcs r5, r5, r6\n\t"
  183086. #elif defined(__clang__)
  183087. "sbcs r5, r6\n\t"
  183088. #else
  183089. "sbc r5, r6\n\t"
  183090. #endif
  183091. "stm %[a]!, {r5}\n\t"
  183092. "ldm %[m]!, {r6}\n\t"
  183093. #ifdef WOLFSSL_KEIL
  183094. "ands r6, r6, r7\n\t"
  183095. #elif defined(__clang__)
  183096. "ands r6, r7\n\t"
  183097. #else
  183098. "and r6, r7\n\t"
  183099. #endif
  183100. "ldr r5, [%[a], r4]\n\t"
  183101. #ifdef WOLFSSL_KEIL
  183102. "sbcs r5, r5, r6\n\t"
  183103. #elif defined(__clang__)
  183104. "sbcs r5, r6\n\t"
  183105. #else
  183106. "sbc r5, r6\n\t"
  183107. #endif
  183108. "stm %[a]!, {r5}\n\t"
  183109. "ldm %[m]!, {r6}\n\t"
  183110. #ifdef WOLFSSL_KEIL
  183111. "ands r6, r6, r7\n\t"
  183112. #elif defined(__clang__)
  183113. "ands r6, r7\n\t"
  183114. #else
  183115. "and r6, r7\n\t"
  183116. #endif
  183117. "ldr r5, [%[a], r4]\n\t"
  183118. #ifdef WOLFSSL_KEIL
  183119. "sbcs r5, r5, r6\n\t"
  183120. #elif defined(__clang__)
  183121. "sbcs r5, r6\n\t"
  183122. #else
  183123. "sbc r5, r6\n\t"
  183124. #endif
  183125. "stm %[a]!, {r5}\n\t"
  183126. "ldm %[m]!, {r6}\n\t"
  183127. #ifdef WOLFSSL_KEIL
  183128. "ands r6, r6, r7\n\t"
  183129. #elif defined(__clang__)
  183130. "ands r6, r7\n\t"
  183131. #else
  183132. "and r6, r7\n\t"
  183133. #endif
  183134. "ldr r5, [%[a], r4]\n\t"
  183135. #ifdef WOLFSSL_KEIL
  183136. "sbcs r5, r5, r6\n\t"
  183137. #elif defined(__clang__)
  183138. "sbcs r5, r6\n\t"
  183139. #else
  183140. "sbc r5, r6\n\t"
  183141. #endif
  183142. "stm %[a]!, {r5}\n\t"
  183143. "ldm %[m]!, {r6}\n\t"
  183144. #ifdef WOLFSSL_KEIL
  183145. "ands r6, r6, r7\n\t"
  183146. #elif defined(__clang__)
  183147. "ands r6, r7\n\t"
  183148. #else
  183149. "and r6, r7\n\t"
  183150. #endif
  183151. "ldr r5, [%[a], r4]\n\t"
  183152. #ifdef WOLFSSL_KEIL
  183153. "sbcs r5, r5, r6\n\t"
  183154. #elif defined(__clang__)
  183155. "sbcs r5, r6\n\t"
  183156. #else
  183157. "sbc r5, r6\n\t"
  183158. #endif
  183159. "stm %[a]!, {r5}\n\t"
  183160. "ldm %[m]!, {r6}\n\t"
  183161. #ifdef WOLFSSL_KEIL
  183162. "ands r6, r6, r7\n\t"
  183163. #elif defined(__clang__)
  183164. "ands r6, r7\n\t"
  183165. #else
  183166. "and r6, r7\n\t"
  183167. #endif
  183168. "ldr r5, [%[a], r4]\n\t"
  183169. #ifdef WOLFSSL_KEIL
  183170. "sbcs r5, r5, r6\n\t"
  183171. #elif defined(__clang__)
  183172. "sbcs r5, r6\n\t"
  183173. #else
  183174. "sbc r5, r6\n\t"
  183175. #endif
  183176. "stm %[a]!, {r5}\n\t"
  183177. "ldm %[m]!, {r6}\n\t"
  183178. #ifdef WOLFSSL_KEIL
  183179. "ands r6, r6, r7\n\t"
  183180. #elif defined(__clang__)
  183181. "ands r6, r7\n\t"
  183182. #else
  183183. "and r6, r7\n\t"
  183184. #endif
  183185. "ldr r5, [%[a], r4]\n\t"
  183186. #ifdef WOLFSSL_KEIL
  183187. "sbcs r5, r5, r6\n\t"
  183188. #elif defined(__clang__)
  183189. "sbcs r5, r6\n\t"
  183190. #else
  183191. "sbc r5, r6\n\t"
  183192. #endif
  183193. "stm %[a]!, {r5}\n\t"
  183194. "ldm %[m]!, {r6}\n\t"
  183195. #ifdef WOLFSSL_KEIL
  183196. "ands r6, r6, r7\n\t"
  183197. #elif defined(__clang__)
  183198. "ands r6, r7\n\t"
  183199. #else
  183200. "and r6, r7\n\t"
  183201. #endif
  183202. "ldr r5, [%[a], r4]\n\t"
  183203. #ifdef WOLFSSL_KEIL
  183204. "sbcs r5, r5, r6\n\t"
  183205. #elif defined(__clang__)
  183206. "sbcs r5, r6\n\t"
  183207. #else
  183208. "sbc r5, r6\n\t"
  183209. #endif
  183210. "stm %[a]!, {r5}\n\t"
  183211. "ldm %[m]!, {r6}\n\t"
  183212. #ifdef WOLFSSL_KEIL
  183213. "ands r6, r6, r7\n\t"
  183214. #elif defined(__clang__)
  183215. "ands r6, r7\n\t"
  183216. #else
  183217. "and r6, r7\n\t"
  183218. #endif
  183219. "ldr r5, [%[a], r4]\n\t"
  183220. #ifdef WOLFSSL_KEIL
  183221. "sbcs r5, r5, r6\n\t"
  183222. #elif defined(__clang__)
  183223. "sbcs r5, r6\n\t"
  183224. #else
  183225. "sbc r5, r6\n\t"
  183226. #endif
  183227. "stm %[a]!, {r5}\n\t"
  183228. "ldm %[m]!, {r6}\n\t"
  183229. #ifdef WOLFSSL_KEIL
  183230. "ands r6, r6, r7\n\t"
  183231. #elif defined(__clang__)
  183232. "ands r6, r7\n\t"
  183233. #else
  183234. "and r6, r7\n\t"
  183235. #endif
  183236. "ldr r5, [%[a], r4]\n\t"
  183237. #ifdef WOLFSSL_KEIL
  183238. "sbcs r5, r5, r6\n\t"
  183239. #elif defined(__clang__)
  183240. "sbcs r5, r6\n\t"
  183241. #else
  183242. "sbc r5, r6\n\t"
  183243. #endif
  183244. "stm %[a]!, {r5}\n\t"
  183245. #endif /* WOLFSSL_SP_LARGE_CODE */
  183246. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  183247. :
  183248. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  183249. );
  183250. }
  183251. /* Multiply two Montgomery form numbers mod the modulus (prime).
  183252. * (r = a * b mod m)
  183253. *
  183254. * r Result of multiplication.
  183255. * a First number to multiply in Montgomery form.
  183256. * b Second number to multiply in Montgomery form.
  183257. * m Modulus (prime).
  183258. * mp Montgomery mulitplier.
  183259. */
  183260. static void sp_1024_mont_mul_32(sp_digit* r, const sp_digit* a,
  183261. const sp_digit* b, const sp_digit* m, sp_digit mp)
  183262. {
  183263. sp_1024_mul_32(r, a, b);
  183264. sp_1024_mont_reduce_32(r, m, mp);
  183265. }
  183266. /* Square the Montgomery form number. (r = a * a mod m)
  183267. *
  183268. * r Result of squaring.
  183269. * a Number to square in Montgomery form.
  183270. * m Modulus (prime).
  183271. * mp Montgomery mulitplier.
  183272. */
  183273. static void sp_1024_mont_sqr_32(sp_digit* r, const sp_digit* a,
  183274. const sp_digit* m, sp_digit mp)
  183275. {
  183276. sp_1024_sqr_32(r, a);
  183277. sp_1024_mont_reduce_32(r, m, mp);
  183278. }
  183279. /* Mod-2 for the P1024 curve. */
  183280. static const uint8_t p1024_mod_minus_2[] = {
  183281. 6,0x06, 7,0x0f, 7,0x0b, 6,0x0c, 7,0x1e, 9,0x09, 7,0x0c, 7,0x1f,
  183282. 6,0x16, 6,0x06, 7,0x0e, 8,0x10, 6,0x03, 8,0x11, 6,0x0d, 7,0x14,
  183283. 9,0x12, 6,0x0f, 7,0x04, 9,0x0d, 6,0x00, 7,0x13, 6,0x01, 6,0x07,
  183284. 8,0x0d, 8,0x00, 6,0x06, 9,0x17, 6,0x14, 6,0x15, 6,0x11, 6,0x0b,
  183285. 9,0x0c, 6,0x1e, 13,0x14, 7,0x0e, 6,0x1d, 12,0x0a, 6,0x0b, 8,0x07,
  183286. 6,0x18, 6,0x0f, 6,0x10, 8,0x1c, 7,0x16, 7,0x02, 6,0x01, 6,0x13,
  183287. 10,0x15, 7,0x06, 8,0x14, 6,0x0c, 6,0x19, 7,0x10, 6,0x19, 6,0x19,
  183288. 9,0x16, 7,0x19, 6,0x1f, 6,0x17, 6,0x12, 8,0x02, 6,0x01, 6,0x04,
  183289. 6,0x15, 7,0x16, 6,0x04, 6,0x1f, 6,0x09, 7,0x06, 7,0x13, 7,0x09,
  183290. 6,0x0d, 10,0x18, 6,0x06, 6,0x11, 6,0x04, 6,0x01, 6,0x13, 8,0x06,
  183291. 6,0x0d, 8,0x13, 7,0x08, 6,0x08, 6,0x05, 7,0x0c, 7,0x0e, 7,0x15,
  183292. 6,0x05, 7,0x14, 10,0x19, 6,0x10, 6,0x16, 6,0x15, 7,0x1f, 6,0x14,
  183293. 6,0x0a, 10,0x11, 6,0x01, 7,0x05, 7,0x08, 8,0x0a, 7,0x1e, 7,0x1c,
  183294. 6,0x1c, 7,0x09, 10,0x18, 7,0x1c, 10,0x06, 6,0x0a, 6,0x07, 6,0x19,
  183295. 7,0x06, 6,0x0d, 7,0x0f, 7,0x0b, 7,0x05, 6,0x11, 6,0x1c, 7,0x1f,
  183296. 6,0x1e, 7,0x18, 6,0x1e, 6,0x00, 6,0x03, 6,0x02, 7,0x10, 6,0x0b,
  183297. 6,0x1b, 7,0x10, 6,0x00, 8,0x11, 7,0x1b, 6,0x18, 6,0x01, 7,0x0c,
  183298. 7,0x1d, 7,0x13, 6,0x08, 7,0x1b, 8,0x13, 7,0x16, 13,0x1d, 7,0x1f,
  183299. 6,0x0a, 6,0x01, 7,0x1f, 6,0x14, 1,0x01
  183300. };
  183301. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  183302. * P1024 curve. (r = 1 / a mod m)
  183303. *
  183304. * r Inverse result.
  183305. * a Number to invert.
  183306. * td Temporary data.
  183307. */
  183308. static void sp_1024_mont_inv_32(sp_digit* r, const sp_digit* a,
  183309. sp_digit* td)
  183310. {
  183311. sp_digit* t = td;
  183312. int i;
  183313. int j;
  183314. sp_digit table[32][2 * 32];
  183315. XMEMCPY(table[0], a, sizeof(sp_digit) * 32);
  183316. for (i = 1; i < 6; i++) {
  183317. sp_1024_mont_sqr_32(table[0], table[0], p1024_mod, p1024_mp_mod);
  183318. }
  183319. for (i = 1; i < 32; i++) {
  183320. sp_1024_mont_mul_32(table[i], table[i-1], a, p1024_mod, p1024_mp_mod);
  183321. }
  183322. XMEMCPY(t, table[p1024_mod_minus_2[1]], sizeof(sp_digit) * 32);
  183323. for (i = 2; i < (int)sizeof(p1024_mod_minus_2) - 2; i += 2) {
  183324. for (j = 0; j < p1024_mod_minus_2[i]; j++) {
  183325. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  183326. }
  183327. sp_1024_mont_mul_32(t, t, table[p1024_mod_minus_2[i+1]], p1024_mod,
  183328. p1024_mp_mod);
  183329. }
  183330. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  183331. sp_1024_mont_mul_32(r, t, a, p1024_mod, p1024_mp_mod);
  183332. }
  183333. /* Normalize the values in each word to 32.
  183334. *
  183335. * a Array of sp_digit to normalize.
  183336. */
  183337. #define sp_1024_norm_32(a)
  183338. /* Map the Montgomery form projective coordinate point to an affine point.
  183339. *
  183340. * r Resulting affine coordinate point.
  183341. * p Montgomery form projective coordinate point.
  183342. * t Temporary ordinate data.
  183343. */
  183344. static void sp_1024_map_32(sp_point_1024* r, const sp_point_1024* p,
  183345. sp_digit* t)
  183346. {
  183347. sp_digit* t1 = t;
  183348. sp_digit* t2 = t + 2*32;
  183349. sp_int32 n;
  183350. sp_1024_mont_inv_32(t1, p->z, t + 2*32);
  183351. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  183352. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  183353. /* x /= z^2 */
  183354. sp_1024_mont_mul_32(r->x, p->x, t2, p1024_mod, p1024_mp_mod);
  183355. XMEMSET(r->x + 32, 0, sizeof(r->x) / 2U);
  183356. sp_1024_mont_reduce_32(r->x, p1024_mod, p1024_mp_mod);
  183357. /* Reduce x to less than modulus */
  183358. n = sp_1024_cmp_32(r->x, p1024_mod);
  183359. sp_1024_cond_sub_32(r->x, r->x, p1024_mod, 0 - ((n >= 0) ?
  183360. (sp_digit)1 : (sp_digit)0));
  183361. sp_1024_norm_32(r->x);
  183362. /* y /= z^3 */
  183363. sp_1024_mont_mul_32(r->y, p->y, t1, p1024_mod, p1024_mp_mod);
  183364. XMEMSET(r->y + 32, 0, sizeof(r->y) / 2U);
  183365. sp_1024_mont_reduce_32(r->y, p1024_mod, p1024_mp_mod);
  183366. /* Reduce y to less than modulus */
  183367. n = sp_1024_cmp_32(r->y, p1024_mod);
  183368. sp_1024_cond_sub_32(r->y, r->y, p1024_mod, 0 - ((n >= 0) ?
  183369. (sp_digit)1 : (sp_digit)0));
  183370. sp_1024_norm_32(r->y);
  183371. XMEMSET(r->z, 0, sizeof(r->z));
  183372. r->z[0] = 1;
  183373. }
  183374. /* Add two Montgomery form numbers (r = a + b % m).
  183375. *
  183376. * r Result of addition.
  183377. * a First number to add in Montgomery form.
  183378. * b Second number to add in Montgomery form.
  183379. * m Modulus (prime).
  183380. */
  183381. SP_NOINLINE static void sp_1024_mont_add_32(sp_digit* r, const sp_digit* a,
  183382. const sp_digit* b, const sp_digit* m)
  183383. {
  183384. __asm__ __volatile__ (
  183385. "ldr r4, [%[a]]\n\t"
  183386. "ldr r5, [%[a], #4]\n\t"
  183387. "ldr r6, [%[b]]\n\t"
  183388. "ldr r7, [%[b], #4]\n\t"
  183389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183390. "adds r4, r4, r6\n\t"
  183391. #else
  183392. "add r4, r4, r6\n\t"
  183393. #endif
  183394. #ifdef WOLFSSL_KEIL
  183395. "adcs r5, r5, r7\n\t"
  183396. #elif defined(__clang__)
  183397. "adcs r5, r7\n\t"
  183398. #else
  183399. "adc r5, r7\n\t"
  183400. #endif
  183401. "str r4, [%[r]]\n\t"
  183402. "str r5, [%[r], #4]\n\t"
  183403. "ldr r4, [%[a], #8]\n\t"
  183404. "ldr r5, [%[a], #12]\n\t"
  183405. "ldr r6, [%[b], #8]\n\t"
  183406. "ldr r7, [%[b], #12]\n\t"
  183407. #ifdef WOLFSSL_KEIL
  183408. "adcs r4, r4, r6\n\t"
  183409. #elif defined(__clang__)
  183410. "adcs r4, r6\n\t"
  183411. #else
  183412. "adc r4, r6\n\t"
  183413. #endif
  183414. #ifdef WOLFSSL_KEIL
  183415. "adcs r5, r5, r7\n\t"
  183416. #elif defined(__clang__)
  183417. "adcs r5, r7\n\t"
  183418. #else
  183419. "adc r5, r7\n\t"
  183420. #endif
  183421. "str r4, [%[r], #8]\n\t"
  183422. "str r5, [%[r], #12]\n\t"
  183423. "ldr r4, [%[a], #16]\n\t"
  183424. "ldr r5, [%[a], #20]\n\t"
  183425. "ldr r6, [%[b], #16]\n\t"
  183426. "ldr r7, [%[b], #20]\n\t"
  183427. #ifdef WOLFSSL_KEIL
  183428. "adcs r4, r4, r6\n\t"
  183429. #elif defined(__clang__)
  183430. "adcs r4, r6\n\t"
  183431. #else
  183432. "adc r4, r6\n\t"
  183433. #endif
  183434. #ifdef WOLFSSL_KEIL
  183435. "adcs r5, r5, r7\n\t"
  183436. #elif defined(__clang__)
  183437. "adcs r5, r7\n\t"
  183438. #else
  183439. "adc r5, r7\n\t"
  183440. #endif
  183441. "str r4, [%[r], #16]\n\t"
  183442. "str r5, [%[r], #20]\n\t"
  183443. "ldr r4, [%[a], #24]\n\t"
  183444. "ldr r5, [%[a], #28]\n\t"
  183445. "ldr r6, [%[b], #24]\n\t"
  183446. "ldr r7, [%[b], #28]\n\t"
  183447. #ifdef WOLFSSL_KEIL
  183448. "adcs r4, r4, r6\n\t"
  183449. #elif defined(__clang__)
  183450. "adcs r4, r6\n\t"
  183451. #else
  183452. "adc r4, r6\n\t"
  183453. #endif
  183454. #ifdef WOLFSSL_KEIL
  183455. "adcs r5, r5, r7\n\t"
  183456. #elif defined(__clang__)
  183457. "adcs r5, r7\n\t"
  183458. #else
  183459. "adc r5, r7\n\t"
  183460. #endif
  183461. "str r4, [%[r], #24]\n\t"
  183462. "str r5, [%[r], #28]\n\t"
  183463. "ldr r4, [%[a], #32]\n\t"
  183464. "ldr r5, [%[a], #36]\n\t"
  183465. "ldr r6, [%[b], #32]\n\t"
  183466. "ldr r7, [%[b], #36]\n\t"
  183467. #ifdef WOLFSSL_KEIL
  183468. "adcs r4, r4, r6\n\t"
  183469. #elif defined(__clang__)
  183470. "adcs r4, r6\n\t"
  183471. #else
  183472. "adc r4, r6\n\t"
  183473. #endif
  183474. #ifdef WOLFSSL_KEIL
  183475. "adcs r5, r5, r7\n\t"
  183476. #elif defined(__clang__)
  183477. "adcs r5, r7\n\t"
  183478. #else
  183479. "adc r5, r7\n\t"
  183480. #endif
  183481. "str r4, [%[r], #32]\n\t"
  183482. "str r5, [%[r], #36]\n\t"
  183483. "ldr r4, [%[a], #40]\n\t"
  183484. "ldr r5, [%[a], #44]\n\t"
  183485. "ldr r6, [%[b], #40]\n\t"
  183486. "ldr r7, [%[b], #44]\n\t"
  183487. #ifdef WOLFSSL_KEIL
  183488. "adcs r4, r4, r6\n\t"
  183489. #elif defined(__clang__)
  183490. "adcs r4, r6\n\t"
  183491. #else
  183492. "adc r4, r6\n\t"
  183493. #endif
  183494. #ifdef WOLFSSL_KEIL
  183495. "adcs r5, r5, r7\n\t"
  183496. #elif defined(__clang__)
  183497. "adcs r5, r7\n\t"
  183498. #else
  183499. "adc r5, r7\n\t"
  183500. #endif
  183501. "str r4, [%[r], #40]\n\t"
  183502. "str r5, [%[r], #44]\n\t"
  183503. "ldr r4, [%[a], #48]\n\t"
  183504. "ldr r5, [%[a], #52]\n\t"
  183505. "ldr r6, [%[b], #48]\n\t"
  183506. "ldr r7, [%[b], #52]\n\t"
  183507. #ifdef WOLFSSL_KEIL
  183508. "adcs r4, r4, r6\n\t"
  183509. #elif defined(__clang__)
  183510. "adcs r4, r6\n\t"
  183511. #else
  183512. "adc r4, r6\n\t"
  183513. #endif
  183514. #ifdef WOLFSSL_KEIL
  183515. "adcs r5, r5, r7\n\t"
  183516. #elif defined(__clang__)
  183517. "adcs r5, r7\n\t"
  183518. #else
  183519. "adc r5, r7\n\t"
  183520. #endif
  183521. "str r4, [%[r], #48]\n\t"
  183522. "str r5, [%[r], #52]\n\t"
  183523. "ldr r4, [%[a], #56]\n\t"
  183524. "ldr r5, [%[a], #60]\n\t"
  183525. "ldr r6, [%[b], #56]\n\t"
  183526. "ldr r7, [%[b], #60]\n\t"
  183527. #ifdef WOLFSSL_KEIL
  183528. "adcs r4, r4, r6\n\t"
  183529. #elif defined(__clang__)
  183530. "adcs r4, r6\n\t"
  183531. #else
  183532. "adc r4, r6\n\t"
  183533. #endif
  183534. #ifdef WOLFSSL_KEIL
  183535. "adcs r5, r5, r7\n\t"
  183536. #elif defined(__clang__)
  183537. "adcs r5, r7\n\t"
  183538. #else
  183539. "adc r5, r7\n\t"
  183540. #endif
  183541. "str r4, [%[r], #56]\n\t"
  183542. "str r5, [%[r], #60]\n\t"
  183543. "ldr r4, [%[a], #64]\n\t"
  183544. "ldr r5, [%[a], #68]\n\t"
  183545. "ldr r6, [%[b], #64]\n\t"
  183546. "ldr r7, [%[b], #68]\n\t"
  183547. #ifdef WOLFSSL_KEIL
  183548. "adcs r4, r4, r6\n\t"
  183549. #elif defined(__clang__)
  183550. "adcs r4, r6\n\t"
  183551. #else
  183552. "adc r4, r6\n\t"
  183553. #endif
  183554. #ifdef WOLFSSL_KEIL
  183555. "adcs r5, r5, r7\n\t"
  183556. #elif defined(__clang__)
  183557. "adcs r5, r7\n\t"
  183558. #else
  183559. "adc r5, r7\n\t"
  183560. #endif
  183561. "str r4, [%[r], #64]\n\t"
  183562. "str r5, [%[r], #68]\n\t"
  183563. "ldr r4, [%[a], #72]\n\t"
  183564. "ldr r5, [%[a], #76]\n\t"
  183565. "ldr r6, [%[b], #72]\n\t"
  183566. "ldr r7, [%[b], #76]\n\t"
  183567. #ifdef WOLFSSL_KEIL
  183568. "adcs r4, r4, r6\n\t"
  183569. #elif defined(__clang__)
  183570. "adcs r4, r6\n\t"
  183571. #else
  183572. "adc r4, r6\n\t"
  183573. #endif
  183574. #ifdef WOLFSSL_KEIL
  183575. "adcs r5, r5, r7\n\t"
  183576. #elif defined(__clang__)
  183577. "adcs r5, r7\n\t"
  183578. #else
  183579. "adc r5, r7\n\t"
  183580. #endif
  183581. "str r4, [%[r], #72]\n\t"
  183582. "str r5, [%[r], #76]\n\t"
  183583. "ldr r4, [%[a], #80]\n\t"
  183584. "ldr r5, [%[a], #84]\n\t"
  183585. "ldr r6, [%[b], #80]\n\t"
  183586. "ldr r7, [%[b], #84]\n\t"
  183587. #ifdef WOLFSSL_KEIL
  183588. "adcs r4, r4, r6\n\t"
  183589. #elif defined(__clang__)
  183590. "adcs r4, r6\n\t"
  183591. #else
  183592. "adc r4, r6\n\t"
  183593. #endif
  183594. #ifdef WOLFSSL_KEIL
  183595. "adcs r5, r5, r7\n\t"
  183596. #elif defined(__clang__)
  183597. "adcs r5, r7\n\t"
  183598. #else
  183599. "adc r5, r7\n\t"
  183600. #endif
  183601. "str r4, [%[r], #80]\n\t"
  183602. "str r5, [%[r], #84]\n\t"
  183603. "ldr r4, [%[a], #88]\n\t"
  183604. "ldr r5, [%[a], #92]\n\t"
  183605. "ldr r6, [%[b], #88]\n\t"
  183606. "ldr r7, [%[b], #92]\n\t"
  183607. #ifdef WOLFSSL_KEIL
  183608. "adcs r4, r4, r6\n\t"
  183609. #elif defined(__clang__)
  183610. "adcs r4, r6\n\t"
  183611. #else
  183612. "adc r4, r6\n\t"
  183613. #endif
  183614. #ifdef WOLFSSL_KEIL
  183615. "adcs r5, r5, r7\n\t"
  183616. #elif defined(__clang__)
  183617. "adcs r5, r7\n\t"
  183618. #else
  183619. "adc r5, r7\n\t"
  183620. #endif
  183621. "str r4, [%[r], #88]\n\t"
  183622. "str r5, [%[r], #92]\n\t"
  183623. "ldr r4, [%[a], #96]\n\t"
  183624. "ldr r5, [%[a], #100]\n\t"
  183625. "ldr r6, [%[b], #96]\n\t"
  183626. "ldr r7, [%[b], #100]\n\t"
  183627. #ifdef WOLFSSL_KEIL
  183628. "adcs r4, r4, r6\n\t"
  183629. #elif defined(__clang__)
  183630. "adcs r4, r6\n\t"
  183631. #else
  183632. "adc r4, r6\n\t"
  183633. #endif
  183634. #ifdef WOLFSSL_KEIL
  183635. "adcs r5, r5, r7\n\t"
  183636. #elif defined(__clang__)
  183637. "adcs r5, r7\n\t"
  183638. #else
  183639. "adc r5, r7\n\t"
  183640. #endif
  183641. "str r4, [%[r], #96]\n\t"
  183642. "str r5, [%[r], #100]\n\t"
  183643. "ldr r4, [%[a], #104]\n\t"
  183644. "ldr r5, [%[a], #108]\n\t"
  183645. "ldr r6, [%[b], #104]\n\t"
  183646. "ldr r7, [%[b], #108]\n\t"
  183647. #ifdef WOLFSSL_KEIL
  183648. "adcs r4, r4, r6\n\t"
  183649. #elif defined(__clang__)
  183650. "adcs r4, r6\n\t"
  183651. #else
  183652. "adc r4, r6\n\t"
  183653. #endif
  183654. #ifdef WOLFSSL_KEIL
  183655. "adcs r5, r5, r7\n\t"
  183656. #elif defined(__clang__)
  183657. "adcs r5, r7\n\t"
  183658. #else
  183659. "adc r5, r7\n\t"
  183660. #endif
  183661. "str r4, [%[r], #104]\n\t"
  183662. "str r5, [%[r], #108]\n\t"
  183663. "ldr r4, [%[a], #112]\n\t"
  183664. "ldr r5, [%[a], #116]\n\t"
  183665. "ldr r6, [%[b], #112]\n\t"
  183666. "ldr r7, [%[b], #116]\n\t"
  183667. #ifdef WOLFSSL_KEIL
  183668. "adcs r4, r4, r6\n\t"
  183669. #elif defined(__clang__)
  183670. "adcs r4, r6\n\t"
  183671. #else
  183672. "adc r4, r6\n\t"
  183673. #endif
  183674. #ifdef WOLFSSL_KEIL
  183675. "adcs r5, r5, r7\n\t"
  183676. #elif defined(__clang__)
  183677. "adcs r5, r7\n\t"
  183678. #else
  183679. "adc r5, r7\n\t"
  183680. #endif
  183681. "str r4, [%[r], #112]\n\t"
  183682. "str r5, [%[r], #116]\n\t"
  183683. "ldr r4, [%[a], #120]\n\t"
  183684. "ldr r5, [%[a], #124]\n\t"
  183685. "ldr r6, [%[b], #120]\n\t"
  183686. "ldr r7, [%[b], #124]\n\t"
  183687. #ifdef WOLFSSL_KEIL
  183688. "adcs r4, r4, r6\n\t"
  183689. #elif defined(__clang__)
  183690. "adcs r4, r6\n\t"
  183691. #else
  183692. "adc r4, r6\n\t"
  183693. #endif
  183694. #ifdef WOLFSSL_KEIL
  183695. "adcs r5, r5, r7\n\t"
  183696. #elif defined(__clang__)
  183697. "adcs r5, r7\n\t"
  183698. #else
  183699. "adc r5, r7\n\t"
  183700. #endif
  183701. "str r4, [%[r], #120]\n\t"
  183702. "str r5, [%[r], #124]\n\t"
  183703. "movs %[b], #0\n\t"
  183704. "ldr r7, [%[m], #124]\n\t"
  183705. #ifdef WOLFSSL_KEIL
  183706. "adcs %[b], %[b], %[b]\n\t"
  183707. #elif defined(__clang__)
  183708. "adcs %[b], %[b]\n\t"
  183709. #else
  183710. "adc %[b], %[b]\n\t"
  183711. #endif
  183712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183713. "subs r7, r7, r5\n\t"
  183714. #else
  183715. "sub r7, r7, r5\n\t"
  183716. #endif
  183717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183718. "negs %[b], %[b]\n\t"
  183719. #else
  183720. "neg %[b], %[b]\n\t"
  183721. #endif
  183722. #ifdef WOLFSSL_KEIL
  183723. "sbcs r7, r7, r7\n\t"
  183724. #elif defined(__clang__)
  183725. "sbcs r7, r7\n\t"
  183726. #else
  183727. "sbc r7, r7\n\t"
  183728. #endif
  183729. #ifdef WOLFSSL_KEIL
  183730. "orrs %[b], %[b], r7\n\t"
  183731. #elif defined(__clang__)
  183732. "orrs %[b], r7\n\t"
  183733. #else
  183734. "orr %[b], r7\n\t"
  183735. #endif
  183736. "ldr r4, [%[r]]\n\t"
  183737. "ldr r5, [%[r], #4]\n\t"
  183738. "ldr r6, [%[m]]\n\t"
  183739. "ldr r7, [%[m], #4]\n\t"
  183740. #ifdef WOLFSSL_KEIL
  183741. "ands r6, r6, %[b]\n\t"
  183742. #elif defined(__clang__)
  183743. "ands r6, %[b]\n\t"
  183744. #else
  183745. "and r6, %[b]\n\t"
  183746. #endif
  183747. #ifdef WOLFSSL_KEIL
  183748. "ands r7, r7, %[b]\n\t"
  183749. #elif defined(__clang__)
  183750. "ands r7, %[b]\n\t"
  183751. #else
  183752. "and r7, %[b]\n\t"
  183753. #endif
  183754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183755. "subs r4, r4, r6\n\t"
  183756. #else
  183757. "sub r4, r4, r6\n\t"
  183758. #endif
  183759. #ifdef WOLFSSL_KEIL
  183760. "sbcs r5, r5, r7\n\t"
  183761. #elif defined(__clang__)
  183762. "sbcs r5, r7\n\t"
  183763. #else
  183764. "sbc r5, r7\n\t"
  183765. #endif
  183766. "str r4, [%[r]]\n\t"
  183767. "str r5, [%[r], #4]\n\t"
  183768. "ldr r4, [%[r], #8]\n\t"
  183769. "ldr r5, [%[r], #12]\n\t"
  183770. "ldr r6, [%[m], #8]\n\t"
  183771. "ldr r7, [%[m], #12]\n\t"
  183772. #ifdef WOLFSSL_KEIL
  183773. "ands r6, r6, %[b]\n\t"
  183774. #elif defined(__clang__)
  183775. "ands r6, %[b]\n\t"
  183776. #else
  183777. "and r6, %[b]\n\t"
  183778. #endif
  183779. #ifdef WOLFSSL_KEIL
  183780. "ands r7, r7, %[b]\n\t"
  183781. #elif defined(__clang__)
  183782. "ands r7, %[b]\n\t"
  183783. #else
  183784. "and r7, %[b]\n\t"
  183785. #endif
  183786. #ifdef WOLFSSL_KEIL
  183787. "sbcs r4, r4, r6\n\t"
  183788. #elif defined(__clang__)
  183789. "sbcs r4, r6\n\t"
  183790. #else
  183791. "sbc r4, r6\n\t"
  183792. #endif
  183793. #ifdef WOLFSSL_KEIL
  183794. "sbcs r5, r5, r7\n\t"
  183795. #elif defined(__clang__)
  183796. "sbcs r5, r7\n\t"
  183797. #else
  183798. "sbc r5, r7\n\t"
  183799. #endif
  183800. "str r4, [%[r], #8]\n\t"
  183801. "str r5, [%[r], #12]\n\t"
  183802. "ldr r4, [%[r], #16]\n\t"
  183803. "ldr r5, [%[r], #20]\n\t"
  183804. "ldr r6, [%[m], #16]\n\t"
  183805. "ldr r7, [%[m], #20]\n\t"
  183806. #ifdef WOLFSSL_KEIL
  183807. "ands r6, r6, %[b]\n\t"
  183808. #elif defined(__clang__)
  183809. "ands r6, %[b]\n\t"
  183810. #else
  183811. "and r6, %[b]\n\t"
  183812. #endif
  183813. #ifdef WOLFSSL_KEIL
  183814. "ands r7, r7, %[b]\n\t"
  183815. #elif defined(__clang__)
  183816. "ands r7, %[b]\n\t"
  183817. #else
  183818. "and r7, %[b]\n\t"
  183819. #endif
  183820. #ifdef WOLFSSL_KEIL
  183821. "sbcs r4, r4, r6\n\t"
  183822. #elif defined(__clang__)
  183823. "sbcs r4, r6\n\t"
  183824. #else
  183825. "sbc r4, r6\n\t"
  183826. #endif
  183827. #ifdef WOLFSSL_KEIL
  183828. "sbcs r5, r5, r7\n\t"
  183829. #elif defined(__clang__)
  183830. "sbcs r5, r7\n\t"
  183831. #else
  183832. "sbc r5, r7\n\t"
  183833. #endif
  183834. "str r4, [%[r], #16]\n\t"
  183835. "str r5, [%[r], #20]\n\t"
  183836. "ldr r4, [%[r], #24]\n\t"
  183837. "ldr r5, [%[r], #28]\n\t"
  183838. "ldr r6, [%[m], #24]\n\t"
  183839. "ldr r7, [%[m], #28]\n\t"
  183840. #ifdef WOLFSSL_KEIL
  183841. "ands r6, r6, %[b]\n\t"
  183842. #elif defined(__clang__)
  183843. "ands r6, %[b]\n\t"
  183844. #else
  183845. "and r6, %[b]\n\t"
  183846. #endif
  183847. #ifdef WOLFSSL_KEIL
  183848. "ands r7, r7, %[b]\n\t"
  183849. #elif defined(__clang__)
  183850. "ands r7, %[b]\n\t"
  183851. #else
  183852. "and r7, %[b]\n\t"
  183853. #endif
  183854. #ifdef WOLFSSL_KEIL
  183855. "sbcs r4, r4, r6\n\t"
  183856. #elif defined(__clang__)
  183857. "sbcs r4, r6\n\t"
  183858. #else
  183859. "sbc r4, r6\n\t"
  183860. #endif
  183861. #ifdef WOLFSSL_KEIL
  183862. "sbcs r5, r5, r7\n\t"
  183863. #elif defined(__clang__)
  183864. "sbcs r5, r7\n\t"
  183865. #else
  183866. "sbc r5, r7\n\t"
  183867. #endif
  183868. "str r4, [%[r], #24]\n\t"
  183869. "str r5, [%[r], #28]\n\t"
  183870. "ldr r4, [%[r], #32]\n\t"
  183871. "ldr r5, [%[r], #36]\n\t"
  183872. "ldr r6, [%[m], #32]\n\t"
  183873. "ldr r7, [%[m], #36]\n\t"
  183874. #ifdef WOLFSSL_KEIL
  183875. "ands r6, r6, %[b]\n\t"
  183876. #elif defined(__clang__)
  183877. "ands r6, %[b]\n\t"
  183878. #else
  183879. "and r6, %[b]\n\t"
  183880. #endif
  183881. #ifdef WOLFSSL_KEIL
  183882. "ands r7, r7, %[b]\n\t"
  183883. #elif defined(__clang__)
  183884. "ands r7, %[b]\n\t"
  183885. #else
  183886. "and r7, %[b]\n\t"
  183887. #endif
  183888. #ifdef WOLFSSL_KEIL
  183889. "sbcs r4, r4, r6\n\t"
  183890. #elif defined(__clang__)
  183891. "sbcs r4, r6\n\t"
  183892. #else
  183893. "sbc r4, r6\n\t"
  183894. #endif
  183895. #ifdef WOLFSSL_KEIL
  183896. "sbcs r5, r5, r7\n\t"
  183897. #elif defined(__clang__)
  183898. "sbcs r5, r7\n\t"
  183899. #else
  183900. "sbc r5, r7\n\t"
  183901. #endif
  183902. "str r4, [%[r], #32]\n\t"
  183903. "str r5, [%[r], #36]\n\t"
  183904. "ldr r4, [%[r], #40]\n\t"
  183905. "ldr r5, [%[r], #44]\n\t"
  183906. "ldr r6, [%[m], #40]\n\t"
  183907. "ldr r7, [%[m], #44]\n\t"
  183908. #ifdef WOLFSSL_KEIL
  183909. "ands r6, r6, %[b]\n\t"
  183910. #elif defined(__clang__)
  183911. "ands r6, %[b]\n\t"
  183912. #else
  183913. "and r6, %[b]\n\t"
  183914. #endif
  183915. #ifdef WOLFSSL_KEIL
  183916. "ands r7, r7, %[b]\n\t"
  183917. #elif defined(__clang__)
  183918. "ands r7, %[b]\n\t"
  183919. #else
  183920. "and r7, %[b]\n\t"
  183921. #endif
  183922. #ifdef WOLFSSL_KEIL
  183923. "sbcs r4, r4, r6\n\t"
  183924. #elif defined(__clang__)
  183925. "sbcs r4, r6\n\t"
  183926. #else
  183927. "sbc r4, r6\n\t"
  183928. #endif
  183929. #ifdef WOLFSSL_KEIL
  183930. "sbcs r5, r5, r7\n\t"
  183931. #elif defined(__clang__)
  183932. "sbcs r5, r7\n\t"
  183933. #else
  183934. "sbc r5, r7\n\t"
  183935. #endif
  183936. "str r4, [%[r], #40]\n\t"
  183937. "str r5, [%[r], #44]\n\t"
  183938. "ldr r4, [%[r], #48]\n\t"
  183939. "ldr r5, [%[r], #52]\n\t"
  183940. "ldr r6, [%[m], #48]\n\t"
  183941. "ldr r7, [%[m], #52]\n\t"
  183942. #ifdef WOLFSSL_KEIL
  183943. "ands r6, r6, %[b]\n\t"
  183944. #elif defined(__clang__)
  183945. "ands r6, %[b]\n\t"
  183946. #else
  183947. "and r6, %[b]\n\t"
  183948. #endif
  183949. #ifdef WOLFSSL_KEIL
  183950. "ands r7, r7, %[b]\n\t"
  183951. #elif defined(__clang__)
  183952. "ands r7, %[b]\n\t"
  183953. #else
  183954. "and r7, %[b]\n\t"
  183955. #endif
  183956. #ifdef WOLFSSL_KEIL
  183957. "sbcs r4, r4, r6\n\t"
  183958. #elif defined(__clang__)
  183959. "sbcs r4, r6\n\t"
  183960. #else
  183961. "sbc r4, r6\n\t"
  183962. #endif
  183963. #ifdef WOLFSSL_KEIL
  183964. "sbcs r5, r5, r7\n\t"
  183965. #elif defined(__clang__)
  183966. "sbcs r5, r7\n\t"
  183967. #else
  183968. "sbc r5, r7\n\t"
  183969. #endif
  183970. "str r4, [%[r], #48]\n\t"
  183971. "str r5, [%[r], #52]\n\t"
  183972. "ldr r4, [%[r], #56]\n\t"
  183973. "ldr r5, [%[r], #60]\n\t"
  183974. "ldr r6, [%[m], #56]\n\t"
  183975. "ldr r7, [%[m], #60]\n\t"
  183976. #ifdef WOLFSSL_KEIL
  183977. "ands r6, r6, %[b]\n\t"
  183978. #elif defined(__clang__)
  183979. "ands r6, %[b]\n\t"
  183980. #else
  183981. "and r6, %[b]\n\t"
  183982. #endif
  183983. #ifdef WOLFSSL_KEIL
  183984. "ands r7, r7, %[b]\n\t"
  183985. #elif defined(__clang__)
  183986. "ands r7, %[b]\n\t"
  183987. #else
  183988. "and r7, %[b]\n\t"
  183989. #endif
  183990. #ifdef WOLFSSL_KEIL
  183991. "sbcs r4, r4, r6\n\t"
  183992. #elif defined(__clang__)
  183993. "sbcs r4, r6\n\t"
  183994. #else
  183995. "sbc r4, r6\n\t"
  183996. #endif
  183997. #ifdef WOLFSSL_KEIL
  183998. "sbcs r5, r5, r7\n\t"
  183999. #elif defined(__clang__)
  184000. "sbcs r5, r7\n\t"
  184001. #else
  184002. "sbc r5, r7\n\t"
  184003. #endif
  184004. "str r4, [%[r], #56]\n\t"
  184005. "str r5, [%[r], #60]\n\t"
  184006. "ldr r4, [%[r], #64]\n\t"
  184007. "ldr r5, [%[r], #68]\n\t"
  184008. "ldr r6, [%[m], #64]\n\t"
  184009. "ldr r7, [%[m], #68]\n\t"
  184010. #ifdef WOLFSSL_KEIL
  184011. "ands r6, r6, %[b]\n\t"
  184012. #elif defined(__clang__)
  184013. "ands r6, %[b]\n\t"
  184014. #else
  184015. "and r6, %[b]\n\t"
  184016. #endif
  184017. #ifdef WOLFSSL_KEIL
  184018. "ands r7, r7, %[b]\n\t"
  184019. #elif defined(__clang__)
  184020. "ands r7, %[b]\n\t"
  184021. #else
  184022. "and r7, %[b]\n\t"
  184023. #endif
  184024. #ifdef WOLFSSL_KEIL
  184025. "sbcs r4, r4, r6\n\t"
  184026. #elif defined(__clang__)
  184027. "sbcs r4, r6\n\t"
  184028. #else
  184029. "sbc r4, r6\n\t"
  184030. #endif
  184031. #ifdef WOLFSSL_KEIL
  184032. "sbcs r5, r5, r7\n\t"
  184033. #elif defined(__clang__)
  184034. "sbcs r5, r7\n\t"
  184035. #else
  184036. "sbc r5, r7\n\t"
  184037. #endif
  184038. "str r4, [%[r], #64]\n\t"
  184039. "str r5, [%[r], #68]\n\t"
  184040. "ldr r4, [%[r], #72]\n\t"
  184041. "ldr r5, [%[r], #76]\n\t"
  184042. "ldr r6, [%[m], #72]\n\t"
  184043. "ldr r7, [%[m], #76]\n\t"
  184044. #ifdef WOLFSSL_KEIL
  184045. "ands r6, r6, %[b]\n\t"
  184046. #elif defined(__clang__)
  184047. "ands r6, %[b]\n\t"
  184048. #else
  184049. "and r6, %[b]\n\t"
  184050. #endif
  184051. #ifdef WOLFSSL_KEIL
  184052. "ands r7, r7, %[b]\n\t"
  184053. #elif defined(__clang__)
  184054. "ands r7, %[b]\n\t"
  184055. #else
  184056. "and r7, %[b]\n\t"
  184057. #endif
  184058. #ifdef WOLFSSL_KEIL
  184059. "sbcs r4, r4, r6\n\t"
  184060. #elif defined(__clang__)
  184061. "sbcs r4, r6\n\t"
  184062. #else
  184063. "sbc r4, r6\n\t"
  184064. #endif
  184065. #ifdef WOLFSSL_KEIL
  184066. "sbcs r5, r5, r7\n\t"
  184067. #elif defined(__clang__)
  184068. "sbcs r5, r7\n\t"
  184069. #else
  184070. "sbc r5, r7\n\t"
  184071. #endif
  184072. "str r4, [%[r], #72]\n\t"
  184073. "str r5, [%[r], #76]\n\t"
  184074. "ldr r4, [%[r], #80]\n\t"
  184075. "ldr r5, [%[r], #84]\n\t"
  184076. "ldr r6, [%[m], #80]\n\t"
  184077. "ldr r7, [%[m], #84]\n\t"
  184078. #ifdef WOLFSSL_KEIL
  184079. "ands r6, r6, %[b]\n\t"
  184080. #elif defined(__clang__)
  184081. "ands r6, %[b]\n\t"
  184082. #else
  184083. "and r6, %[b]\n\t"
  184084. #endif
  184085. #ifdef WOLFSSL_KEIL
  184086. "ands r7, r7, %[b]\n\t"
  184087. #elif defined(__clang__)
  184088. "ands r7, %[b]\n\t"
  184089. #else
  184090. "and r7, %[b]\n\t"
  184091. #endif
  184092. #ifdef WOLFSSL_KEIL
  184093. "sbcs r4, r4, r6\n\t"
  184094. #elif defined(__clang__)
  184095. "sbcs r4, r6\n\t"
  184096. #else
  184097. "sbc r4, r6\n\t"
  184098. #endif
  184099. #ifdef WOLFSSL_KEIL
  184100. "sbcs r5, r5, r7\n\t"
  184101. #elif defined(__clang__)
  184102. "sbcs r5, r7\n\t"
  184103. #else
  184104. "sbc r5, r7\n\t"
  184105. #endif
  184106. "str r4, [%[r], #80]\n\t"
  184107. "str r5, [%[r], #84]\n\t"
  184108. "ldr r4, [%[r], #88]\n\t"
  184109. "ldr r5, [%[r], #92]\n\t"
  184110. "ldr r6, [%[m], #88]\n\t"
  184111. "ldr r7, [%[m], #92]\n\t"
  184112. #ifdef WOLFSSL_KEIL
  184113. "ands r6, r6, %[b]\n\t"
  184114. #elif defined(__clang__)
  184115. "ands r6, %[b]\n\t"
  184116. #else
  184117. "and r6, %[b]\n\t"
  184118. #endif
  184119. #ifdef WOLFSSL_KEIL
  184120. "ands r7, r7, %[b]\n\t"
  184121. #elif defined(__clang__)
  184122. "ands r7, %[b]\n\t"
  184123. #else
  184124. "and r7, %[b]\n\t"
  184125. #endif
  184126. #ifdef WOLFSSL_KEIL
  184127. "sbcs r4, r4, r6\n\t"
  184128. #elif defined(__clang__)
  184129. "sbcs r4, r6\n\t"
  184130. #else
  184131. "sbc r4, r6\n\t"
  184132. #endif
  184133. #ifdef WOLFSSL_KEIL
  184134. "sbcs r5, r5, r7\n\t"
  184135. #elif defined(__clang__)
  184136. "sbcs r5, r7\n\t"
  184137. #else
  184138. "sbc r5, r7\n\t"
  184139. #endif
  184140. "str r4, [%[r], #88]\n\t"
  184141. "str r5, [%[r], #92]\n\t"
  184142. "ldr r4, [%[r], #96]\n\t"
  184143. "ldr r5, [%[r], #100]\n\t"
  184144. "ldr r6, [%[m], #96]\n\t"
  184145. "ldr r7, [%[m], #100]\n\t"
  184146. #ifdef WOLFSSL_KEIL
  184147. "ands r6, r6, %[b]\n\t"
  184148. #elif defined(__clang__)
  184149. "ands r6, %[b]\n\t"
  184150. #else
  184151. "and r6, %[b]\n\t"
  184152. #endif
  184153. #ifdef WOLFSSL_KEIL
  184154. "ands r7, r7, %[b]\n\t"
  184155. #elif defined(__clang__)
  184156. "ands r7, %[b]\n\t"
  184157. #else
  184158. "and r7, %[b]\n\t"
  184159. #endif
  184160. #ifdef WOLFSSL_KEIL
  184161. "sbcs r4, r4, r6\n\t"
  184162. #elif defined(__clang__)
  184163. "sbcs r4, r6\n\t"
  184164. #else
  184165. "sbc r4, r6\n\t"
  184166. #endif
  184167. #ifdef WOLFSSL_KEIL
  184168. "sbcs r5, r5, r7\n\t"
  184169. #elif defined(__clang__)
  184170. "sbcs r5, r7\n\t"
  184171. #else
  184172. "sbc r5, r7\n\t"
  184173. #endif
  184174. "str r4, [%[r], #96]\n\t"
  184175. "str r5, [%[r], #100]\n\t"
  184176. "ldr r4, [%[r], #104]\n\t"
  184177. "ldr r5, [%[r], #108]\n\t"
  184178. "ldr r6, [%[m], #104]\n\t"
  184179. "ldr r7, [%[m], #108]\n\t"
  184180. #ifdef WOLFSSL_KEIL
  184181. "ands r6, r6, %[b]\n\t"
  184182. #elif defined(__clang__)
  184183. "ands r6, %[b]\n\t"
  184184. #else
  184185. "and r6, %[b]\n\t"
  184186. #endif
  184187. #ifdef WOLFSSL_KEIL
  184188. "ands r7, r7, %[b]\n\t"
  184189. #elif defined(__clang__)
  184190. "ands r7, %[b]\n\t"
  184191. #else
  184192. "and r7, %[b]\n\t"
  184193. #endif
  184194. #ifdef WOLFSSL_KEIL
  184195. "sbcs r4, r4, r6\n\t"
  184196. #elif defined(__clang__)
  184197. "sbcs r4, r6\n\t"
  184198. #else
  184199. "sbc r4, r6\n\t"
  184200. #endif
  184201. #ifdef WOLFSSL_KEIL
  184202. "sbcs r5, r5, r7\n\t"
  184203. #elif defined(__clang__)
  184204. "sbcs r5, r7\n\t"
  184205. #else
  184206. "sbc r5, r7\n\t"
  184207. #endif
  184208. "str r4, [%[r], #104]\n\t"
  184209. "str r5, [%[r], #108]\n\t"
  184210. "ldr r4, [%[r], #112]\n\t"
  184211. "ldr r5, [%[r], #116]\n\t"
  184212. "ldr r6, [%[m], #112]\n\t"
  184213. "ldr r7, [%[m], #116]\n\t"
  184214. #ifdef WOLFSSL_KEIL
  184215. "ands r6, r6, %[b]\n\t"
  184216. #elif defined(__clang__)
  184217. "ands r6, %[b]\n\t"
  184218. #else
  184219. "and r6, %[b]\n\t"
  184220. #endif
  184221. #ifdef WOLFSSL_KEIL
  184222. "ands r7, r7, %[b]\n\t"
  184223. #elif defined(__clang__)
  184224. "ands r7, %[b]\n\t"
  184225. #else
  184226. "and r7, %[b]\n\t"
  184227. #endif
  184228. #ifdef WOLFSSL_KEIL
  184229. "sbcs r4, r4, r6\n\t"
  184230. #elif defined(__clang__)
  184231. "sbcs r4, r6\n\t"
  184232. #else
  184233. "sbc r4, r6\n\t"
  184234. #endif
  184235. #ifdef WOLFSSL_KEIL
  184236. "sbcs r5, r5, r7\n\t"
  184237. #elif defined(__clang__)
  184238. "sbcs r5, r7\n\t"
  184239. #else
  184240. "sbc r5, r7\n\t"
  184241. #endif
  184242. "str r4, [%[r], #112]\n\t"
  184243. "str r5, [%[r], #116]\n\t"
  184244. "ldr r4, [%[r], #120]\n\t"
  184245. "ldr r5, [%[r], #124]\n\t"
  184246. "ldr r6, [%[m], #120]\n\t"
  184247. "ldr r7, [%[m], #124]\n\t"
  184248. #ifdef WOLFSSL_KEIL
  184249. "ands r6, r6, %[b]\n\t"
  184250. #elif defined(__clang__)
  184251. "ands r6, %[b]\n\t"
  184252. #else
  184253. "and r6, %[b]\n\t"
  184254. #endif
  184255. #ifdef WOLFSSL_KEIL
  184256. "ands r7, r7, %[b]\n\t"
  184257. #elif defined(__clang__)
  184258. "ands r7, %[b]\n\t"
  184259. #else
  184260. "and r7, %[b]\n\t"
  184261. #endif
  184262. #ifdef WOLFSSL_KEIL
  184263. "sbcs r4, r4, r6\n\t"
  184264. #elif defined(__clang__)
  184265. "sbcs r4, r6\n\t"
  184266. #else
  184267. "sbc r4, r6\n\t"
  184268. #endif
  184269. #ifdef WOLFSSL_KEIL
  184270. "sbcs r5, r5, r7\n\t"
  184271. #elif defined(__clang__)
  184272. "sbcs r5, r7\n\t"
  184273. #else
  184274. "sbc r5, r7\n\t"
  184275. #endif
  184276. "str r4, [%[r], #120]\n\t"
  184277. "str r5, [%[r], #124]\n\t"
  184278. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  184279. :
  184280. : "memory", "r4", "r5", "r6", "r7"
  184281. );
  184282. }
  184283. /* Double a Montgomery form number (r = a + a % m).
  184284. *
  184285. * r Result of doubling.
  184286. * a Number to double in Montgomery form.
  184287. * m Modulus (prime).
  184288. */
  184289. SP_NOINLINE static void sp_1024_mont_dbl_32(sp_digit* r, const sp_digit* a,
  184290. const sp_digit* m)
  184291. {
  184292. __asm__ __volatile__ (
  184293. "ldr r4, [%[a]]\n\t"
  184294. "ldr r5, [%[a], #4]\n\t"
  184295. "ldr r6, [%[a], #8]\n\t"
  184296. "ldr r7, [%[a], #12]\n\t"
  184297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184298. "adds r4, r4, r4\n\t"
  184299. #else
  184300. "add r4, r4, r4\n\t"
  184301. #endif
  184302. #ifdef WOLFSSL_KEIL
  184303. "adcs r5, r5, r5\n\t"
  184304. #elif defined(__clang__)
  184305. "adcs r5, r5\n\t"
  184306. #else
  184307. "adc r5, r5\n\t"
  184308. #endif
  184309. #ifdef WOLFSSL_KEIL
  184310. "adcs r6, r6, r6\n\t"
  184311. #elif defined(__clang__)
  184312. "adcs r6, r6\n\t"
  184313. #else
  184314. "adc r6, r6\n\t"
  184315. #endif
  184316. #ifdef WOLFSSL_KEIL
  184317. "adcs r7, r7, r7\n\t"
  184318. #elif defined(__clang__)
  184319. "adcs r7, r7\n\t"
  184320. #else
  184321. "adc r7, r7\n\t"
  184322. #endif
  184323. "str r4, [%[r]]\n\t"
  184324. "str r5, [%[r], #4]\n\t"
  184325. "str r6, [%[r], #8]\n\t"
  184326. "str r7, [%[r], #12]\n\t"
  184327. "ldr r4, [%[a], #16]\n\t"
  184328. "ldr r5, [%[a], #20]\n\t"
  184329. "ldr r6, [%[a], #24]\n\t"
  184330. "ldr r7, [%[a], #28]\n\t"
  184331. #ifdef WOLFSSL_KEIL
  184332. "adcs r4, r4, r4\n\t"
  184333. #elif defined(__clang__)
  184334. "adcs r4, r4\n\t"
  184335. #else
  184336. "adc r4, r4\n\t"
  184337. #endif
  184338. #ifdef WOLFSSL_KEIL
  184339. "adcs r5, r5, r5\n\t"
  184340. #elif defined(__clang__)
  184341. "adcs r5, r5\n\t"
  184342. #else
  184343. "adc r5, r5\n\t"
  184344. #endif
  184345. #ifdef WOLFSSL_KEIL
  184346. "adcs r6, r6, r6\n\t"
  184347. #elif defined(__clang__)
  184348. "adcs r6, r6\n\t"
  184349. #else
  184350. "adc r6, r6\n\t"
  184351. #endif
  184352. #ifdef WOLFSSL_KEIL
  184353. "adcs r7, r7, r7\n\t"
  184354. #elif defined(__clang__)
  184355. "adcs r7, r7\n\t"
  184356. #else
  184357. "adc r7, r7\n\t"
  184358. #endif
  184359. "str r4, [%[r], #16]\n\t"
  184360. "str r5, [%[r], #20]\n\t"
  184361. "str r6, [%[r], #24]\n\t"
  184362. "str r7, [%[r], #28]\n\t"
  184363. "ldr r4, [%[a], #32]\n\t"
  184364. "ldr r5, [%[a], #36]\n\t"
  184365. "ldr r6, [%[a], #40]\n\t"
  184366. "ldr r7, [%[a], #44]\n\t"
  184367. #ifdef WOLFSSL_KEIL
  184368. "adcs r4, r4, r4\n\t"
  184369. #elif defined(__clang__)
  184370. "adcs r4, r4\n\t"
  184371. #else
  184372. "adc r4, r4\n\t"
  184373. #endif
  184374. #ifdef WOLFSSL_KEIL
  184375. "adcs r5, r5, r5\n\t"
  184376. #elif defined(__clang__)
  184377. "adcs r5, r5\n\t"
  184378. #else
  184379. "adc r5, r5\n\t"
  184380. #endif
  184381. #ifdef WOLFSSL_KEIL
  184382. "adcs r6, r6, r6\n\t"
  184383. #elif defined(__clang__)
  184384. "adcs r6, r6\n\t"
  184385. #else
  184386. "adc r6, r6\n\t"
  184387. #endif
  184388. #ifdef WOLFSSL_KEIL
  184389. "adcs r7, r7, r7\n\t"
  184390. #elif defined(__clang__)
  184391. "adcs r7, r7\n\t"
  184392. #else
  184393. "adc r7, r7\n\t"
  184394. #endif
  184395. "str r4, [%[r], #32]\n\t"
  184396. "str r5, [%[r], #36]\n\t"
  184397. "str r6, [%[r], #40]\n\t"
  184398. "str r7, [%[r], #44]\n\t"
  184399. "ldr r4, [%[a], #48]\n\t"
  184400. "ldr r5, [%[a], #52]\n\t"
  184401. "ldr r6, [%[a], #56]\n\t"
  184402. "ldr r7, [%[a], #60]\n\t"
  184403. #ifdef WOLFSSL_KEIL
  184404. "adcs r4, r4, r4\n\t"
  184405. #elif defined(__clang__)
  184406. "adcs r4, r4\n\t"
  184407. #else
  184408. "adc r4, r4\n\t"
  184409. #endif
  184410. #ifdef WOLFSSL_KEIL
  184411. "adcs r5, r5, r5\n\t"
  184412. #elif defined(__clang__)
  184413. "adcs r5, r5\n\t"
  184414. #else
  184415. "adc r5, r5\n\t"
  184416. #endif
  184417. #ifdef WOLFSSL_KEIL
  184418. "adcs r6, r6, r6\n\t"
  184419. #elif defined(__clang__)
  184420. "adcs r6, r6\n\t"
  184421. #else
  184422. "adc r6, r6\n\t"
  184423. #endif
  184424. #ifdef WOLFSSL_KEIL
  184425. "adcs r7, r7, r7\n\t"
  184426. #elif defined(__clang__)
  184427. "adcs r7, r7\n\t"
  184428. #else
  184429. "adc r7, r7\n\t"
  184430. #endif
  184431. "str r4, [%[r], #48]\n\t"
  184432. "str r5, [%[r], #52]\n\t"
  184433. "str r6, [%[r], #56]\n\t"
  184434. "str r7, [%[r], #60]\n\t"
  184435. "ldr r4, [%[a], #64]\n\t"
  184436. "ldr r5, [%[a], #68]\n\t"
  184437. "ldr r6, [%[a], #72]\n\t"
  184438. "ldr r7, [%[a], #76]\n\t"
  184439. #ifdef WOLFSSL_KEIL
  184440. "adcs r4, r4, r4\n\t"
  184441. #elif defined(__clang__)
  184442. "adcs r4, r4\n\t"
  184443. #else
  184444. "adc r4, r4\n\t"
  184445. #endif
  184446. #ifdef WOLFSSL_KEIL
  184447. "adcs r5, r5, r5\n\t"
  184448. #elif defined(__clang__)
  184449. "adcs r5, r5\n\t"
  184450. #else
  184451. "adc r5, r5\n\t"
  184452. #endif
  184453. #ifdef WOLFSSL_KEIL
  184454. "adcs r6, r6, r6\n\t"
  184455. #elif defined(__clang__)
  184456. "adcs r6, r6\n\t"
  184457. #else
  184458. "adc r6, r6\n\t"
  184459. #endif
  184460. #ifdef WOLFSSL_KEIL
  184461. "adcs r7, r7, r7\n\t"
  184462. #elif defined(__clang__)
  184463. "adcs r7, r7\n\t"
  184464. #else
  184465. "adc r7, r7\n\t"
  184466. #endif
  184467. "str r4, [%[r], #64]\n\t"
  184468. "str r5, [%[r], #68]\n\t"
  184469. "str r6, [%[r], #72]\n\t"
  184470. "str r7, [%[r], #76]\n\t"
  184471. "ldr r4, [%[a], #80]\n\t"
  184472. "ldr r5, [%[a], #84]\n\t"
  184473. "ldr r6, [%[a], #88]\n\t"
  184474. "ldr r7, [%[a], #92]\n\t"
  184475. #ifdef WOLFSSL_KEIL
  184476. "adcs r4, r4, r4\n\t"
  184477. #elif defined(__clang__)
  184478. "adcs r4, r4\n\t"
  184479. #else
  184480. "adc r4, r4\n\t"
  184481. #endif
  184482. #ifdef WOLFSSL_KEIL
  184483. "adcs r5, r5, r5\n\t"
  184484. #elif defined(__clang__)
  184485. "adcs r5, r5\n\t"
  184486. #else
  184487. "adc r5, r5\n\t"
  184488. #endif
  184489. #ifdef WOLFSSL_KEIL
  184490. "adcs r6, r6, r6\n\t"
  184491. #elif defined(__clang__)
  184492. "adcs r6, r6\n\t"
  184493. #else
  184494. "adc r6, r6\n\t"
  184495. #endif
  184496. #ifdef WOLFSSL_KEIL
  184497. "adcs r7, r7, r7\n\t"
  184498. #elif defined(__clang__)
  184499. "adcs r7, r7\n\t"
  184500. #else
  184501. "adc r7, r7\n\t"
  184502. #endif
  184503. "str r4, [%[r], #80]\n\t"
  184504. "str r5, [%[r], #84]\n\t"
  184505. "str r6, [%[r], #88]\n\t"
  184506. "str r7, [%[r], #92]\n\t"
  184507. "ldr r4, [%[a], #96]\n\t"
  184508. "ldr r5, [%[a], #100]\n\t"
  184509. "ldr r6, [%[a], #104]\n\t"
  184510. "ldr r7, [%[a], #108]\n\t"
  184511. #ifdef WOLFSSL_KEIL
  184512. "adcs r4, r4, r4\n\t"
  184513. #elif defined(__clang__)
  184514. "adcs r4, r4\n\t"
  184515. #else
  184516. "adc r4, r4\n\t"
  184517. #endif
  184518. #ifdef WOLFSSL_KEIL
  184519. "adcs r5, r5, r5\n\t"
  184520. #elif defined(__clang__)
  184521. "adcs r5, r5\n\t"
  184522. #else
  184523. "adc r5, r5\n\t"
  184524. #endif
  184525. #ifdef WOLFSSL_KEIL
  184526. "adcs r6, r6, r6\n\t"
  184527. #elif defined(__clang__)
  184528. "adcs r6, r6\n\t"
  184529. #else
  184530. "adc r6, r6\n\t"
  184531. #endif
  184532. #ifdef WOLFSSL_KEIL
  184533. "adcs r7, r7, r7\n\t"
  184534. #elif defined(__clang__)
  184535. "adcs r7, r7\n\t"
  184536. #else
  184537. "adc r7, r7\n\t"
  184538. #endif
  184539. "str r4, [%[r], #96]\n\t"
  184540. "str r5, [%[r], #100]\n\t"
  184541. "str r6, [%[r], #104]\n\t"
  184542. "str r7, [%[r], #108]\n\t"
  184543. "ldr r4, [%[a], #112]\n\t"
  184544. "ldr r5, [%[a], #116]\n\t"
  184545. "ldr r6, [%[a], #120]\n\t"
  184546. "ldr r7, [%[a], #124]\n\t"
  184547. #ifdef WOLFSSL_KEIL
  184548. "adcs r4, r4, r4\n\t"
  184549. #elif defined(__clang__)
  184550. "adcs r4, r4\n\t"
  184551. #else
  184552. "adc r4, r4\n\t"
  184553. #endif
  184554. #ifdef WOLFSSL_KEIL
  184555. "adcs r5, r5, r5\n\t"
  184556. #elif defined(__clang__)
  184557. "adcs r5, r5\n\t"
  184558. #else
  184559. "adc r5, r5\n\t"
  184560. #endif
  184561. #ifdef WOLFSSL_KEIL
  184562. "adcs r6, r6, r6\n\t"
  184563. #elif defined(__clang__)
  184564. "adcs r6, r6\n\t"
  184565. #else
  184566. "adc r6, r6\n\t"
  184567. #endif
  184568. #ifdef WOLFSSL_KEIL
  184569. "adcs r7, r7, r7\n\t"
  184570. #elif defined(__clang__)
  184571. "adcs r7, r7\n\t"
  184572. #else
  184573. "adc r7, r7\n\t"
  184574. #endif
  184575. "str r4, [%[r], #112]\n\t"
  184576. "str r5, [%[r], #116]\n\t"
  184577. "str r6, [%[r], #120]\n\t"
  184578. "str r7, [%[r], #124]\n\t"
  184579. "movs r3, #0\n\t"
  184580. "ldr r4, [%[m], #124]\n\t"
  184581. #ifdef WOLFSSL_KEIL
  184582. "adcs r3, r3, r3\n\t"
  184583. #elif defined(__clang__)
  184584. "adcs r3, r3\n\t"
  184585. #else
  184586. "adc r3, r3\n\t"
  184587. #endif
  184588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184589. "subs r4, r4, r7\n\t"
  184590. #else
  184591. "sub r4, r4, r7\n\t"
  184592. #endif
  184593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184594. "negs r3, r3\n\t"
  184595. #else
  184596. "neg r3, r3\n\t"
  184597. #endif
  184598. #ifdef WOLFSSL_KEIL
  184599. "sbcs r4, r4, r4\n\t"
  184600. #elif defined(__clang__)
  184601. "sbcs r4, r4\n\t"
  184602. #else
  184603. "sbc r4, r4\n\t"
  184604. #endif
  184605. #ifdef WOLFSSL_KEIL
  184606. "orrs r3, r3, r4\n\t"
  184607. #elif defined(__clang__)
  184608. "orrs r3, r4\n\t"
  184609. #else
  184610. "orr r3, r4\n\t"
  184611. #endif
  184612. "ldr r4, [%[r]]\n\t"
  184613. "ldr r5, [%[r], #4]\n\t"
  184614. "ldr r6, [%[m]]\n\t"
  184615. "ldr r7, [%[m], #4]\n\t"
  184616. #ifdef WOLFSSL_KEIL
  184617. "ands r6, r6, r3\n\t"
  184618. #elif defined(__clang__)
  184619. "ands r6, r3\n\t"
  184620. #else
  184621. "and r6, r3\n\t"
  184622. #endif
  184623. #ifdef WOLFSSL_KEIL
  184624. "ands r7, r7, r3\n\t"
  184625. #elif defined(__clang__)
  184626. "ands r7, r3\n\t"
  184627. #else
  184628. "and r7, r3\n\t"
  184629. #endif
  184630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184631. "subs r4, r4, r6\n\t"
  184632. #else
  184633. "sub r4, r4, r6\n\t"
  184634. #endif
  184635. #ifdef WOLFSSL_KEIL
  184636. "sbcs r5, r5, r7\n\t"
  184637. #elif defined(__clang__)
  184638. "sbcs r5, r7\n\t"
  184639. #else
  184640. "sbc r5, r7\n\t"
  184641. #endif
  184642. "str r4, [%[r]]\n\t"
  184643. "str r5, [%[r], #4]\n\t"
  184644. "ldr r4, [%[r], #8]\n\t"
  184645. "ldr r5, [%[r], #12]\n\t"
  184646. "ldr r6, [%[m], #8]\n\t"
  184647. "ldr r7, [%[m], #12]\n\t"
  184648. #ifdef WOLFSSL_KEIL
  184649. "ands r6, r6, r3\n\t"
  184650. #elif defined(__clang__)
  184651. "ands r6, r3\n\t"
  184652. #else
  184653. "and r6, r3\n\t"
  184654. #endif
  184655. #ifdef WOLFSSL_KEIL
  184656. "ands r7, r7, r3\n\t"
  184657. #elif defined(__clang__)
  184658. "ands r7, r3\n\t"
  184659. #else
  184660. "and r7, r3\n\t"
  184661. #endif
  184662. #ifdef WOLFSSL_KEIL
  184663. "sbcs r4, r4, r6\n\t"
  184664. #elif defined(__clang__)
  184665. "sbcs r4, r6\n\t"
  184666. #else
  184667. "sbc r4, r6\n\t"
  184668. #endif
  184669. #ifdef WOLFSSL_KEIL
  184670. "sbcs r5, r5, r7\n\t"
  184671. #elif defined(__clang__)
  184672. "sbcs r5, r7\n\t"
  184673. #else
  184674. "sbc r5, r7\n\t"
  184675. #endif
  184676. "str r4, [%[r], #8]\n\t"
  184677. "str r5, [%[r], #12]\n\t"
  184678. "ldr r4, [%[r], #16]\n\t"
  184679. "ldr r5, [%[r], #20]\n\t"
  184680. "ldr r6, [%[m], #16]\n\t"
  184681. "ldr r7, [%[m], #20]\n\t"
  184682. #ifdef WOLFSSL_KEIL
  184683. "ands r6, r6, r3\n\t"
  184684. #elif defined(__clang__)
  184685. "ands r6, r3\n\t"
  184686. #else
  184687. "and r6, r3\n\t"
  184688. #endif
  184689. #ifdef WOLFSSL_KEIL
  184690. "ands r7, r7, r3\n\t"
  184691. #elif defined(__clang__)
  184692. "ands r7, r3\n\t"
  184693. #else
  184694. "and r7, r3\n\t"
  184695. #endif
  184696. #ifdef WOLFSSL_KEIL
  184697. "sbcs r4, r4, r6\n\t"
  184698. #elif defined(__clang__)
  184699. "sbcs r4, r6\n\t"
  184700. #else
  184701. "sbc r4, r6\n\t"
  184702. #endif
  184703. #ifdef WOLFSSL_KEIL
  184704. "sbcs r5, r5, r7\n\t"
  184705. #elif defined(__clang__)
  184706. "sbcs r5, r7\n\t"
  184707. #else
  184708. "sbc r5, r7\n\t"
  184709. #endif
  184710. "str r4, [%[r], #16]\n\t"
  184711. "str r5, [%[r], #20]\n\t"
  184712. "ldr r4, [%[r], #24]\n\t"
  184713. "ldr r5, [%[r], #28]\n\t"
  184714. "ldr r6, [%[m], #24]\n\t"
  184715. "ldr r7, [%[m], #28]\n\t"
  184716. #ifdef WOLFSSL_KEIL
  184717. "ands r6, r6, r3\n\t"
  184718. #elif defined(__clang__)
  184719. "ands r6, r3\n\t"
  184720. #else
  184721. "and r6, r3\n\t"
  184722. #endif
  184723. #ifdef WOLFSSL_KEIL
  184724. "ands r7, r7, r3\n\t"
  184725. #elif defined(__clang__)
  184726. "ands r7, r3\n\t"
  184727. #else
  184728. "and r7, r3\n\t"
  184729. #endif
  184730. #ifdef WOLFSSL_KEIL
  184731. "sbcs r4, r4, r6\n\t"
  184732. #elif defined(__clang__)
  184733. "sbcs r4, r6\n\t"
  184734. #else
  184735. "sbc r4, r6\n\t"
  184736. #endif
  184737. #ifdef WOLFSSL_KEIL
  184738. "sbcs r5, r5, r7\n\t"
  184739. #elif defined(__clang__)
  184740. "sbcs r5, r7\n\t"
  184741. #else
  184742. "sbc r5, r7\n\t"
  184743. #endif
  184744. "str r4, [%[r], #24]\n\t"
  184745. "str r5, [%[r], #28]\n\t"
  184746. "ldr r4, [%[r], #32]\n\t"
  184747. "ldr r5, [%[r], #36]\n\t"
  184748. "ldr r6, [%[m], #32]\n\t"
  184749. "ldr r7, [%[m], #36]\n\t"
  184750. #ifdef WOLFSSL_KEIL
  184751. "ands r6, r6, r3\n\t"
  184752. #elif defined(__clang__)
  184753. "ands r6, r3\n\t"
  184754. #else
  184755. "and r6, r3\n\t"
  184756. #endif
  184757. #ifdef WOLFSSL_KEIL
  184758. "ands r7, r7, r3\n\t"
  184759. #elif defined(__clang__)
  184760. "ands r7, r3\n\t"
  184761. #else
  184762. "and r7, r3\n\t"
  184763. #endif
  184764. #ifdef WOLFSSL_KEIL
  184765. "sbcs r4, r4, r6\n\t"
  184766. #elif defined(__clang__)
  184767. "sbcs r4, r6\n\t"
  184768. #else
  184769. "sbc r4, r6\n\t"
  184770. #endif
  184771. #ifdef WOLFSSL_KEIL
  184772. "sbcs r5, r5, r7\n\t"
  184773. #elif defined(__clang__)
  184774. "sbcs r5, r7\n\t"
  184775. #else
  184776. "sbc r5, r7\n\t"
  184777. #endif
  184778. "str r4, [%[r], #32]\n\t"
  184779. "str r5, [%[r], #36]\n\t"
  184780. "ldr r4, [%[r], #40]\n\t"
  184781. "ldr r5, [%[r], #44]\n\t"
  184782. "ldr r6, [%[m], #40]\n\t"
  184783. "ldr r7, [%[m], #44]\n\t"
  184784. #ifdef WOLFSSL_KEIL
  184785. "ands r6, r6, r3\n\t"
  184786. #elif defined(__clang__)
  184787. "ands r6, r3\n\t"
  184788. #else
  184789. "and r6, r3\n\t"
  184790. #endif
  184791. #ifdef WOLFSSL_KEIL
  184792. "ands r7, r7, r3\n\t"
  184793. #elif defined(__clang__)
  184794. "ands r7, r3\n\t"
  184795. #else
  184796. "and r7, r3\n\t"
  184797. #endif
  184798. #ifdef WOLFSSL_KEIL
  184799. "sbcs r4, r4, r6\n\t"
  184800. #elif defined(__clang__)
  184801. "sbcs r4, r6\n\t"
  184802. #else
  184803. "sbc r4, r6\n\t"
  184804. #endif
  184805. #ifdef WOLFSSL_KEIL
  184806. "sbcs r5, r5, r7\n\t"
  184807. #elif defined(__clang__)
  184808. "sbcs r5, r7\n\t"
  184809. #else
  184810. "sbc r5, r7\n\t"
  184811. #endif
  184812. "str r4, [%[r], #40]\n\t"
  184813. "str r5, [%[r], #44]\n\t"
  184814. "ldr r4, [%[r], #48]\n\t"
  184815. "ldr r5, [%[r], #52]\n\t"
  184816. "ldr r6, [%[m], #48]\n\t"
  184817. "ldr r7, [%[m], #52]\n\t"
  184818. #ifdef WOLFSSL_KEIL
  184819. "ands r6, r6, r3\n\t"
  184820. #elif defined(__clang__)
  184821. "ands r6, r3\n\t"
  184822. #else
  184823. "and r6, r3\n\t"
  184824. #endif
  184825. #ifdef WOLFSSL_KEIL
  184826. "ands r7, r7, r3\n\t"
  184827. #elif defined(__clang__)
  184828. "ands r7, r3\n\t"
  184829. #else
  184830. "and r7, r3\n\t"
  184831. #endif
  184832. #ifdef WOLFSSL_KEIL
  184833. "sbcs r4, r4, r6\n\t"
  184834. #elif defined(__clang__)
  184835. "sbcs r4, r6\n\t"
  184836. #else
  184837. "sbc r4, r6\n\t"
  184838. #endif
  184839. #ifdef WOLFSSL_KEIL
  184840. "sbcs r5, r5, r7\n\t"
  184841. #elif defined(__clang__)
  184842. "sbcs r5, r7\n\t"
  184843. #else
  184844. "sbc r5, r7\n\t"
  184845. #endif
  184846. "str r4, [%[r], #48]\n\t"
  184847. "str r5, [%[r], #52]\n\t"
  184848. "ldr r4, [%[r], #56]\n\t"
  184849. "ldr r5, [%[r], #60]\n\t"
  184850. "ldr r6, [%[m], #56]\n\t"
  184851. "ldr r7, [%[m], #60]\n\t"
  184852. #ifdef WOLFSSL_KEIL
  184853. "ands r6, r6, r3\n\t"
  184854. #elif defined(__clang__)
  184855. "ands r6, r3\n\t"
  184856. #else
  184857. "and r6, r3\n\t"
  184858. #endif
  184859. #ifdef WOLFSSL_KEIL
  184860. "ands r7, r7, r3\n\t"
  184861. #elif defined(__clang__)
  184862. "ands r7, r3\n\t"
  184863. #else
  184864. "and r7, r3\n\t"
  184865. #endif
  184866. #ifdef WOLFSSL_KEIL
  184867. "sbcs r4, r4, r6\n\t"
  184868. #elif defined(__clang__)
  184869. "sbcs r4, r6\n\t"
  184870. #else
  184871. "sbc r4, r6\n\t"
  184872. #endif
  184873. #ifdef WOLFSSL_KEIL
  184874. "sbcs r5, r5, r7\n\t"
  184875. #elif defined(__clang__)
  184876. "sbcs r5, r7\n\t"
  184877. #else
  184878. "sbc r5, r7\n\t"
  184879. #endif
  184880. "str r4, [%[r], #56]\n\t"
  184881. "str r5, [%[r], #60]\n\t"
  184882. "ldr r4, [%[r], #64]\n\t"
  184883. "ldr r5, [%[r], #68]\n\t"
  184884. "ldr r6, [%[m], #64]\n\t"
  184885. "ldr r7, [%[m], #68]\n\t"
  184886. #ifdef WOLFSSL_KEIL
  184887. "ands r6, r6, r3\n\t"
  184888. #elif defined(__clang__)
  184889. "ands r6, r3\n\t"
  184890. #else
  184891. "and r6, r3\n\t"
  184892. #endif
  184893. #ifdef WOLFSSL_KEIL
  184894. "ands r7, r7, r3\n\t"
  184895. #elif defined(__clang__)
  184896. "ands r7, r3\n\t"
  184897. #else
  184898. "and r7, r3\n\t"
  184899. #endif
  184900. #ifdef WOLFSSL_KEIL
  184901. "sbcs r4, r4, r6\n\t"
  184902. #elif defined(__clang__)
  184903. "sbcs r4, r6\n\t"
  184904. #else
  184905. "sbc r4, r6\n\t"
  184906. #endif
  184907. #ifdef WOLFSSL_KEIL
  184908. "sbcs r5, r5, r7\n\t"
  184909. #elif defined(__clang__)
  184910. "sbcs r5, r7\n\t"
  184911. #else
  184912. "sbc r5, r7\n\t"
  184913. #endif
  184914. "str r4, [%[r], #64]\n\t"
  184915. "str r5, [%[r], #68]\n\t"
  184916. "ldr r4, [%[r], #72]\n\t"
  184917. "ldr r5, [%[r], #76]\n\t"
  184918. "ldr r6, [%[m], #72]\n\t"
  184919. "ldr r7, [%[m], #76]\n\t"
  184920. #ifdef WOLFSSL_KEIL
  184921. "ands r6, r6, r3\n\t"
  184922. #elif defined(__clang__)
  184923. "ands r6, r3\n\t"
  184924. #else
  184925. "and r6, r3\n\t"
  184926. #endif
  184927. #ifdef WOLFSSL_KEIL
  184928. "ands r7, r7, r3\n\t"
  184929. #elif defined(__clang__)
  184930. "ands r7, r3\n\t"
  184931. #else
  184932. "and r7, r3\n\t"
  184933. #endif
  184934. #ifdef WOLFSSL_KEIL
  184935. "sbcs r4, r4, r6\n\t"
  184936. #elif defined(__clang__)
  184937. "sbcs r4, r6\n\t"
  184938. #else
  184939. "sbc r4, r6\n\t"
  184940. #endif
  184941. #ifdef WOLFSSL_KEIL
  184942. "sbcs r5, r5, r7\n\t"
  184943. #elif defined(__clang__)
  184944. "sbcs r5, r7\n\t"
  184945. #else
  184946. "sbc r5, r7\n\t"
  184947. #endif
  184948. "str r4, [%[r], #72]\n\t"
  184949. "str r5, [%[r], #76]\n\t"
  184950. "ldr r4, [%[r], #80]\n\t"
  184951. "ldr r5, [%[r], #84]\n\t"
  184952. "ldr r6, [%[m], #80]\n\t"
  184953. "ldr r7, [%[m], #84]\n\t"
  184954. #ifdef WOLFSSL_KEIL
  184955. "ands r6, r6, r3\n\t"
  184956. #elif defined(__clang__)
  184957. "ands r6, r3\n\t"
  184958. #else
  184959. "and r6, r3\n\t"
  184960. #endif
  184961. #ifdef WOLFSSL_KEIL
  184962. "ands r7, r7, r3\n\t"
  184963. #elif defined(__clang__)
  184964. "ands r7, r3\n\t"
  184965. #else
  184966. "and r7, r3\n\t"
  184967. #endif
  184968. #ifdef WOLFSSL_KEIL
  184969. "sbcs r4, r4, r6\n\t"
  184970. #elif defined(__clang__)
  184971. "sbcs r4, r6\n\t"
  184972. #else
  184973. "sbc r4, r6\n\t"
  184974. #endif
  184975. #ifdef WOLFSSL_KEIL
  184976. "sbcs r5, r5, r7\n\t"
  184977. #elif defined(__clang__)
  184978. "sbcs r5, r7\n\t"
  184979. #else
  184980. "sbc r5, r7\n\t"
  184981. #endif
  184982. "str r4, [%[r], #80]\n\t"
  184983. "str r5, [%[r], #84]\n\t"
  184984. "ldr r4, [%[r], #88]\n\t"
  184985. "ldr r5, [%[r], #92]\n\t"
  184986. "ldr r6, [%[m], #88]\n\t"
  184987. "ldr r7, [%[m], #92]\n\t"
  184988. #ifdef WOLFSSL_KEIL
  184989. "ands r6, r6, r3\n\t"
  184990. #elif defined(__clang__)
  184991. "ands r6, r3\n\t"
  184992. #else
  184993. "and r6, r3\n\t"
  184994. #endif
  184995. #ifdef WOLFSSL_KEIL
  184996. "ands r7, r7, r3\n\t"
  184997. #elif defined(__clang__)
  184998. "ands r7, r3\n\t"
  184999. #else
  185000. "and r7, r3\n\t"
  185001. #endif
  185002. #ifdef WOLFSSL_KEIL
  185003. "sbcs r4, r4, r6\n\t"
  185004. #elif defined(__clang__)
  185005. "sbcs r4, r6\n\t"
  185006. #else
  185007. "sbc r4, r6\n\t"
  185008. #endif
  185009. #ifdef WOLFSSL_KEIL
  185010. "sbcs r5, r5, r7\n\t"
  185011. #elif defined(__clang__)
  185012. "sbcs r5, r7\n\t"
  185013. #else
  185014. "sbc r5, r7\n\t"
  185015. #endif
  185016. "str r4, [%[r], #88]\n\t"
  185017. "str r5, [%[r], #92]\n\t"
  185018. "ldr r4, [%[r], #96]\n\t"
  185019. "ldr r5, [%[r], #100]\n\t"
  185020. "ldr r6, [%[m], #96]\n\t"
  185021. "ldr r7, [%[m], #100]\n\t"
  185022. #ifdef WOLFSSL_KEIL
  185023. "ands r6, r6, r3\n\t"
  185024. #elif defined(__clang__)
  185025. "ands r6, r3\n\t"
  185026. #else
  185027. "and r6, r3\n\t"
  185028. #endif
  185029. #ifdef WOLFSSL_KEIL
  185030. "ands r7, r7, r3\n\t"
  185031. #elif defined(__clang__)
  185032. "ands r7, r3\n\t"
  185033. #else
  185034. "and r7, r3\n\t"
  185035. #endif
  185036. #ifdef WOLFSSL_KEIL
  185037. "sbcs r4, r4, r6\n\t"
  185038. #elif defined(__clang__)
  185039. "sbcs r4, r6\n\t"
  185040. #else
  185041. "sbc r4, r6\n\t"
  185042. #endif
  185043. #ifdef WOLFSSL_KEIL
  185044. "sbcs r5, r5, r7\n\t"
  185045. #elif defined(__clang__)
  185046. "sbcs r5, r7\n\t"
  185047. #else
  185048. "sbc r5, r7\n\t"
  185049. #endif
  185050. "str r4, [%[r], #96]\n\t"
  185051. "str r5, [%[r], #100]\n\t"
  185052. "ldr r4, [%[r], #104]\n\t"
  185053. "ldr r5, [%[r], #108]\n\t"
  185054. "ldr r6, [%[m], #104]\n\t"
  185055. "ldr r7, [%[m], #108]\n\t"
  185056. #ifdef WOLFSSL_KEIL
  185057. "ands r6, r6, r3\n\t"
  185058. #elif defined(__clang__)
  185059. "ands r6, r3\n\t"
  185060. #else
  185061. "and r6, r3\n\t"
  185062. #endif
  185063. #ifdef WOLFSSL_KEIL
  185064. "ands r7, r7, r3\n\t"
  185065. #elif defined(__clang__)
  185066. "ands r7, r3\n\t"
  185067. #else
  185068. "and r7, r3\n\t"
  185069. #endif
  185070. #ifdef WOLFSSL_KEIL
  185071. "sbcs r4, r4, r6\n\t"
  185072. #elif defined(__clang__)
  185073. "sbcs r4, r6\n\t"
  185074. #else
  185075. "sbc r4, r6\n\t"
  185076. #endif
  185077. #ifdef WOLFSSL_KEIL
  185078. "sbcs r5, r5, r7\n\t"
  185079. #elif defined(__clang__)
  185080. "sbcs r5, r7\n\t"
  185081. #else
  185082. "sbc r5, r7\n\t"
  185083. #endif
  185084. "str r4, [%[r], #104]\n\t"
  185085. "str r5, [%[r], #108]\n\t"
  185086. "ldr r4, [%[r], #112]\n\t"
  185087. "ldr r5, [%[r], #116]\n\t"
  185088. "ldr r6, [%[m], #112]\n\t"
  185089. "ldr r7, [%[m], #116]\n\t"
  185090. #ifdef WOLFSSL_KEIL
  185091. "ands r6, r6, r3\n\t"
  185092. #elif defined(__clang__)
  185093. "ands r6, r3\n\t"
  185094. #else
  185095. "and r6, r3\n\t"
  185096. #endif
  185097. #ifdef WOLFSSL_KEIL
  185098. "ands r7, r7, r3\n\t"
  185099. #elif defined(__clang__)
  185100. "ands r7, r3\n\t"
  185101. #else
  185102. "and r7, r3\n\t"
  185103. #endif
  185104. #ifdef WOLFSSL_KEIL
  185105. "sbcs r4, r4, r6\n\t"
  185106. #elif defined(__clang__)
  185107. "sbcs r4, r6\n\t"
  185108. #else
  185109. "sbc r4, r6\n\t"
  185110. #endif
  185111. #ifdef WOLFSSL_KEIL
  185112. "sbcs r5, r5, r7\n\t"
  185113. #elif defined(__clang__)
  185114. "sbcs r5, r7\n\t"
  185115. #else
  185116. "sbc r5, r7\n\t"
  185117. #endif
  185118. "str r4, [%[r], #112]\n\t"
  185119. "str r5, [%[r], #116]\n\t"
  185120. "ldr r4, [%[r], #120]\n\t"
  185121. "ldr r5, [%[r], #124]\n\t"
  185122. "ldr r6, [%[m], #120]\n\t"
  185123. "ldr r7, [%[m], #124]\n\t"
  185124. #ifdef WOLFSSL_KEIL
  185125. "ands r6, r6, r3\n\t"
  185126. #elif defined(__clang__)
  185127. "ands r6, r3\n\t"
  185128. #else
  185129. "and r6, r3\n\t"
  185130. #endif
  185131. #ifdef WOLFSSL_KEIL
  185132. "ands r7, r7, r3\n\t"
  185133. #elif defined(__clang__)
  185134. "ands r7, r3\n\t"
  185135. #else
  185136. "and r7, r3\n\t"
  185137. #endif
  185138. #ifdef WOLFSSL_KEIL
  185139. "sbcs r4, r4, r6\n\t"
  185140. #elif defined(__clang__)
  185141. "sbcs r4, r6\n\t"
  185142. #else
  185143. "sbc r4, r6\n\t"
  185144. #endif
  185145. #ifdef WOLFSSL_KEIL
  185146. "sbcs r5, r5, r7\n\t"
  185147. #elif defined(__clang__)
  185148. "sbcs r5, r7\n\t"
  185149. #else
  185150. "sbc r5, r7\n\t"
  185151. #endif
  185152. "str r4, [%[r], #120]\n\t"
  185153. "str r5, [%[r], #124]\n\t"
  185154. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  185155. :
  185156. : "memory", "r3", "r4", "r5", "r6", "r7"
  185157. );
  185158. }
  185159. /* Triple a Montgomery form number (r = a + a + a % m).
  185160. *
  185161. * r Result of Tripling.
  185162. * a Number to triple in Montgomery form.
  185163. * m Modulus (prime).
  185164. */
  185165. SP_NOINLINE static void sp_1024_mont_tpl_32(sp_digit* r, const sp_digit* a,
  185166. const sp_digit* m)
  185167. {
  185168. __asm__ __volatile__ (
  185169. "ldr r4, [%[a]]\n\t"
  185170. "ldr r5, [%[a], #4]\n\t"
  185171. "ldr r6, [%[a], #8]\n\t"
  185172. "ldr r7, [%[a], #12]\n\t"
  185173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185174. "adds r4, r4, r4\n\t"
  185175. #else
  185176. "add r4, r4, r4\n\t"
  185177. #endif
  185178. #ifdef WOLFSSL_KEIL
  185179. "adcs r5, r5, r5\n\t"
  185180. #elif defined(__clang__)
  185181. "adcs r5, r5\n\t"
  185182. #else
  185183. "adc r5, r5\n\t"
  185184. #endif
  185185. #ifdef WOLFSSL_KEIL
  185186. "adcs r6, r6, r6\n\t"
  185187. #elif defined(__clang__)
  185188. "adcs r6, r6\n\t"
  185189. #else
  185190. "adc r6, r6\n\t"
  185191. #endif
  185192. #ifdef WOLFSSL_KEIL
  185193. "adcs r7, r7, r7\n\t"
  185194. #elif defined(__clang__)
  185195. "adcs r7, r7\n\t"
  185196. #else
  185197. "adc r7, r7\n\t"
  185198. #endif
  185199. "str r4, [%[r]]\n\t"
  185200. "str r5, [%[r], #4]\n\t"
  185201. "str r6, [%[r], #8]\n\t"
  185202. "str r7, [%[r], #12]\n\t"
  185203. "ldr r4, [%[a], #16]\n\t"
  185204. "ldr r5, [%[a], #20]\n\t"
  185205. "ldr r6, [%[a], #24]\n\t"
  185206. "ldr r7, [%[a], #28]\n\t"
  185207. #ifdef WOLFSSL_KEIL
  185208. "adcs r4, r4, r4\n\t"
  185209. #elif defined(__clang__)
  185210. "adcs r4, r4\n\t"
  185211. #else
  185212. "adc r4, r4\n\t"
  185213. #endif
  185214. #ifdef WOLFSSL_KEIL
  185215. "adcs r5, r5, r5\n\t"
  185216. #elif defined(__clang__)
  185217. "adcs r5, r5\n\t"
  185218. #else
  185219. "adc r5, r5\n\t"
  185220. #endif
  185221. #ifdef WOLFSSL_KEIL
  185222. "adcs r6, r6, r6\n\t"
  185223. #elif defined(__clang__)
  185224. "adcs r6, r6\n\t"
  185225. #else
  185226. "adc r6, r6\n\t"
  185227. #endif
  185228. #ifdef WOLFSSL_KEIL
  185229. "adcs r7, r7, r7\n\t"
  185230. #elif defined(__clang__)
  185231. "adcs r7, r7\n\t"
  185232. #else
  185233. "adc r7, r7\n\t"
  185234. #endif
  185235. "str r4, [%[r], #16]\n\t"
  185236. "str r5, [%[r], #20]\n\t"
  185237. "str r6, [%[r], #24]\n\t"
  185238. "str r7, [%[r], #28]\n\t"
  185239. "ldr r4, [%[a], #32]\n\t"
  185240. "ldr r5, [%[a], #36]\n\t"
  185241. "ldr r6, [%[a], #40]\n\t"
  185242. "ldr r7, [%[a], #44]\n\t"
  185243. #ifdef WOLFSSL_KEIL
  185244. "adcs r4, r4, r4\n\t"
  185245. #elif defined(__clang__)
  185246. "adcs r4, r4\n\t"
  185247. #else
  185248. "adc r4, r4\n\t"
  185249. #endif
  185250. #ifdef WOLFSSL_KEIL
  185251. "adcs r5, r5, r5\n\t"
  185252. #elif defined(__clang__)
  185253. "adcs r5, r5\n\t"
  185254. #else
  185255. "adc r5, r5\n\t"
  185256. #endif
  185257. #ifdef WOLFSSL_KEIL
  185258. "adcs r6, r6, r6\n\t"
  185259. #elif defined(__clang__)
  185260. "adcs r6, r6\n\t"
  185261. #else
  185262. "adc r6, r6\n\t"
  185263. #endif
  185264. #ifdef WOLFSSL_KEIL
  185265. "adcs r7, r7, r7\n\t"
  185266. #elif defined(__clang__)
  185267. "adcs r7, r7\n\t"
  185268. #else
  185269. "adc r7, r7\n\t"
  185270. #endif
  185271. "str r4, [%[r], #32]\n\t"
  185272. "str r5, [%[r], #36]\n\t"
  185273. "str r6, [%[r], #40]\n\t"
  185274. "str r7, [%[r], #44]\n\t"
  185275. "ldr r4, [%[a], #48]\n\t"
  185276. "ldr r5, [%[a], #52]\n\t"
  185277. "ldr r6, [%[a], #56]\n\t"
  185278. "ldr r7, [%[a], #60]\n\t"
  185279. #ifdef WOLFSSL_KEIL
  185280. "adcs r4, r4, r4\n\t"
  185281. #elif defined(__clang__)
  185282. "adcs r4, r4\n\t"
  185283. #else
  185284. "adc r4, r4\n\t"
  185285. #endif
  185286. #ifdef WOLFSSL_KEIL
  185287. "adcs r5, r5, r5\n\t"
  185288. #elif defined(__clang__)
  185289. "adcs r5, r5\n\t"
  185290. #else
  185291. "adc r5, r5\n\t"
  185292. #endif
  185293. #ifdef WOLFSSL_KEIL
  185294. "adcs r6, r6, r6\n\t"
  185295. #elif defined(__clang__)
  185296. "adcs r6, r6\n\t"
  185297. #else
  185298. "adc r6, r6\n\t"
  185299. #endif
  185300. #ifdef WOLFSSL_KEIL
  185301. "adcs r7, r7, r7\n\t"
  185302. #elif defined(__clang__)
  185303. "adcs r7, r7\n\t"
  185304. #else
  185305. "adc r7, r7\n\t"
  185306. #endif
  185307. "str r4, [%[r], #48]\n\t"
  185308. "str r5, [%[r], #52]\n\t"
  185309. "str r6, [%[r], #56]\n\t"
  185310. "str r7, [%[r], #60]\n\t"
  185311. "ldr r4, [%[a], #64]\n\t"
  185312. "ldr r5, [%[a], #68]\n\t"
  185313. "ldr r6, [%[a], #72]\n\t"
  185314. "ldr r7, [%[a], #76]\n\t"
  185315. #ifdef WOLFSSL_KEIL
  185316. "adcs r4, r4, r4\n\t"
  185317. #elif defined(__clang__)
  185318. "adcs r4, r4\n\t"
  185319. #else
  185320. "adc r4, r4\n\t"
  185321. #endif
  185322. #ifdef WOLFSSL_KEIL
  185323. "adcs r5, r5, r5\n\t"
  185324. #elif defined(__clang__)
  185325. "adcs r5, r5\n\t"
  185326. #else
  185327. "adc r5, r5\n\t"
  185328. #endif
  185329. #ifdef WOLFSSL_KEIL
  185330. "adcs r6, r6, r6\n\t"
  185331. #elif defined(__clang__)
  185332. "adcs r6, r6\n\t"
  185333. #else
  185334. "adc r6, r6\n\t"
  185335. #endif
  185336. #ifdef WOLFSSL_KEIL
  185337. "adcs r7, r7, r7\n\t"
  185338. #elif defined(__clang__)
  185339. "adcs r7, r7\n\t"
  185340. #else
  185341. "adc r7, r7\n\t"
  185342. #endif
  185343. "str r4, [%[r], #64]\n\t"
  185344. "str r5, [%[r], #68]\n\t"
  185345. "str r6, [%[r], #72]\n\t"
  185346. "str r7, [%[r], #76]\n\t"
  185347. "ldr r4, [%[a], #80]\n\t"
  185348. "ldr r5, [%[a], #84]\n\t"
  185349. "ldr r6, [%[a], #88]\n\t"
  185350. "ldr r7, [%[a], #92]\n\t"
  185351. #ifdef WOLFSSL_KEIL
  185352. "adcs r4, r4, r4\n\t"
  185353. #elif defined(__clang__)
  185354. "adcs r4, r4\n\t"
  185355. #else
  185356. "adc r4, r4\n\t"
  185357. #endif
  185358. #ifdef WOLFSSL_KEIL
  185359. "adcs r5, r5, r5\n\t"
  185360. #elif defined(__clang__)
  185361. "adcs r5, r5\n\t"
  185362. #else
  185363. "adc r5, r5\n\t"
  185364. #endif
  185365. #ifdef WOLFSSL_KEIL
  185366. "adcs r6, r6, r6\n\t"
  185367. #elif defined(__clang__)
  185368. "adcs r6, r6\n\t"
  185369. #else
  185370. "adc r6, r6\n\t"
  185371. #endif
  185372. #ifdef WOLFSSL_KEIL
  185373. "adcs r7, r7, r7\n\t"
  185374. #elif defined(__clang__)
  185375. "adcs r7, r7\n\t"
  185376. #else
  185377. "adc r7, r7\n\t"
  185378. #endif
  185379. "str r4, [%[r], #80]\n\t"
  185380. "str r5, [%[r], #84]\n\t"
  185381. "str r6, [%[r], #88]\n\t"
  185382. "str r7, [%[r], #92]\n\t"
  185383. "ldr r4, [%[a], #96]\n\t"
  185384. "ldr r5, [%[a], #100]\n\t"
  185385. "ldr r6, [%[a], #104]\n\t"
  185386. "ldr r7, [%[a], #108]\n\t"
  185387. #ifdef WOLFSSL_KEIL
  185388. "adcs r4, r4, r4\n\t"
  185389. #elif defined(__clang__)
  185390. "adcs r4, r4\n\t"
  185391. #else
  185392. "adc r4, r4\n\t"
  185393. #endif
  185394. #ifdef WOLFSSL_KEIL
  185395. "adcs r5, r5, r5\n\t"
  185396. #elif defined(__clang__)
  185397. "adcs r5, r5\n\t"
  185398. #else
  185399. "adc r5, r5\n\t"
  185400. #endif
  185401. #ifdef WOLFSSL_KEIL
  185402. "adcs r6, r6, r6\n\t"
  185403. #elif defined(__clang__)
  185404. "adcs r6, r6\n\t"
  185405. #else
  185406. "adc r6, r6\n\t"
  185407. #endif
  185408. #ifdef WOLFSSL_KEIL
  185409. "adcs r7, r7, r7\n\t"
  185410. #elif defined(__clang__)
  185411. "adcs r7, r7\n\t"
  185412. #else
  185413. "adc r7, r7\n\t"
  185414. #endif
  185415. "str r4, [%[r], #96]\n\t"
  185416. "str r5, [%[r], #100]\n\t"
  185417. "str r6, [%[r], #104]\n\t"
  185418. "str r7, [%[r], #108]\n\t"
  185419. "ldr r4, [%[a], #112]\n\t"
  185420. "ldr r5, [%[a], #116]\n\t"
  185421. "ldr r6, [%[a], #120]\n\t"
  185422. "ldr r7, [%[a], #124]\n\t"
  185423. #ifdef WOLFSSL_KEIL
  185424. "adcs r4, r4, r4\n\t"
  185425. #elif defined(__clang__)
  185426. "adcs r4, r4\n\t"
  185427. #else
  185428. "adc r4, r4\n\t"
  185429. #endif
  185430. #ifdef WOLFSSL_KEIL
  185431. "adcs r5, r5, r5\n\t"
  185432. #elif defined(__clang__)
  185433. "adcs r5, r5\n\t"
  185434. #else
  185435. "adc r5, r5\n\t"
  185436. #endif
  185437. #ifdef WOLFSSL_KEIL
  185438. "adcs r6, r6, r6\n\t"
  185439. #elif defined(__clang__)
  185440. "adcs r6, r6\n\t"
  185441. #else
  185442. "adc r6, r6\n\t"
  185443. #endif
  185444. #ifdef WOLFSSL_KEIL
  185445. "adcs r7, r7, r7\n\t"
  185446. #elif defined(__clang__)
  185447. "adcs r7, r7\n\t"
  185448. #else
  185449. "adc r7, r7\n\t"
  185450. #endif
  185451. "str r4, [%[r], #112]\n\t"
  185452. "str r5, [%[r], #116]\n\t"
  185453. "str r6, [%[r], #120]\n\t"
  185454. "str r7, [%[r], #124]\n\t"
  185455. "movs r3, #0\n\t"
  185456. "ldr r4, [%[m], #124]\n\t"
  185457. #ifdef WOLFSSL_KEIL
  185458. "adcs r3, r3, r3\n\t"
  185459. #elif defined(__clang__)
  185460. "adcs r3, r3\n\t"
  185461. #else
  185462. "adc r3, r3\n\t"
  185463. #endif
  185464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185465. "subs r4, r4, r7\n\t"
  185466. #else
  185467. "sub r4, r4, r7\n\t"
  185468. #endif
  185469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185470. "negs r3, r3\n\t"
  185471. #else
  185472. "neg r3, r3\n\t"
  185473. #endif
  185474. #ifdef WOLFSSL_KEIL
  185475. "sbcs r4, r4, r4\n\t"
  185476. #elif defined(__clang__)
  185477. "sbcs r4, r4\n\t"
  185478. #else
  185479. "sbc r4, r4\n\t"
  185480. #endif
  185481. #ifdef WOLFSSL_KEIL
  185482. "orrs r3, r3, r4\n\t"
  185483. #elif defined(__clang__)
  185484. "orrs r3, r4\n\t"
  185485. #else
  185486. "orr r3, r4\n\t"
  185487. #endif
  185488. "ldr r4, [%[r]]\n\t"
  185489. "ldr r5, [%[r], #4]\n\t"
  185490. "ldr r6, [%[m]]\n\t"
  185491. "ldr r7, [%[m], #4]\n\t"
  185492. #ifdef WOLFSSL_KEIL
  185493. "ands r6, r6, r3\n\t"
  185494. #elif defined(__clang__)
  185495. "ands r6, r3\n\t"
  185496. #else
  185497. "and r6, r3\n\t"
  185498. #endif
  185499. #ifdef WOLFSSL_KEIL
  185500. "ands r7, r7, r3\n\t"
  185501. #elif defined(__clang__)
  185502. "ands r7, r3\n\t"
  185503. #else
  185504. "and r7, r3\n\t"
  185505. #endif
  185506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185507. "subs r4, r4, r6\n\t"
  185508. #else
  185509. "sub r4, r4, r6\n\t"
  185510. #endif
  185511. #ifdef WOLFSSL_KEIL
  185512. "sbcs r5, r5, r7\n\t"
  185513. #elif defined(__clang__)
  185514. "sbcs r5, r7\n\t"
  185515. #else
  185516. "sbc r5, r7\n\t"
  185517. #endif
  185518. "str r4, [%[r]]\n\t"
  185519. "str r5, [%[r], #4]\n\t"
  185520. "ldr r4, [%[r], #8]\n\t"
  185521. "ldr r5, [%[r], #12]\n\t"
  185522. "ldr r6, [%[m], #8]\n\t"
  185523. "ldr r7, [%[m], #12]\n\t"
  185524. #ifdef WOLFSSL_KEIL
  185525. "ands r6, r6, r3\n\t"
  185526. #elif defined(__clang__)
  185527. "ands r6, r3\n\t"
  185528. #else
  185529. "and r6, r3\n\t"
  185530. #endif
  185531. #ifdef WOLFSSL_KEIL
  185532. "ands r7, r7, r3\n\t"
  185533. #elif defined(__clang__)
  185534. "ands r7, r3\n\t"
  185535. #else
  185536. "and r7, r3\n\t"
  185537. #endif
  185538. #ifdef WOLFSSL_KEIL
  185539. "sbcs r4, r4, r6\n\t"
  185540. #elif defined(__clang__)
  185541. "sbcs r4, r6\n\t"
  185542. #else
  185543. "sbc r4, r6\n\t"
  185544. #endif
  185545. #ifdef WOLFSSL_KEIL
  185546. "sbcs r5, r5, r7\n\t"
  185547. #elif defined(__clang__)
  185548. "sbcs r5, r7\n\t"
  185549. #else
  185550. "sbc r5, r7\n\t"
  185551. #endif
  185552. "str r4, [%[r], #8]\n\t"
  185553. "str r5, [%[r], #12]\n\t"
  185554. "ldr r4, [%[r], #16]\n\t"
  185555. "ldr r5, [%[r], #20]\n\t"
  185556. "ldr r6, [%[m], #16]\n\t"
  185557. "ldr r7, [%[m], #20]\n\t"
  185558. #ifdef WOLFSSL_KEIL
  185559. "ands r6, r6, r3\n\t"
  185560. #elif defined(__clang__)
  185561. "ands r6, r3\n\t"
  185562. #else
  185563. "and r6, r3\n\t"
  185564. #endif
  185565. #ifdef WOLFSSL_KEIL
  185566. "ands r7, r7, r3\n\t"
  185567. #elif defined(__clang__)
  185568. "ands r7, r3\n\t"
  185569. #else
  185570. "and r7, r3\n\t"
  185571. #endif
  185572. #ifdef WOLFSSL_KEIL
  185573. "sbcs r4, r4, r6\n\t"
  185574. #elif defined(__clang__)
  185575. "sbcs r4, r6\n\t"
  185576. #else
  185577. "sbc r4, r6\n\t"
  185578. #endif
  185579. #ifdef WOLFSSL_KEIL
  185580. "sbcs r5, r5, r7\n\t"
  185581. #elif defined(__clang__)
  185582. "sbcs r5, r7\n\t"
  185583. #else
  185584. "sbc r5, r7\n\t"
  185585. #endif
  185586. "str r4, [%[r], #16]\n\t"
  185587. "str r5, [%[r], #20]\n\t"
  185588. "ldr r4, [%[r], #24]\n\t"
  185589. "ldr r5, [%[r], #28]\n\t"
  185590. "ldr r6, [%[m], #24]\n\t"
  185591. "ldr r7, [%[m], #28]\n\t"
  185592. #ifdef WOLFSSL_KEIL
  185593. "ands r6, r6, r3\n\t"
  185594. #elif defined(__clang__)
  185595. "ands r6, r3\n\t"
  185596. #else
  185597. "and r6, r3\n\t"
  185598. #endif
  185599. #ifdef WOLFSSL_KEIL
  185600. "ands r7, r7, r3\n\t"
  185601. #elif defined(__clang__)
  185602. "ands r7, r3\n\t"
  185603. #else
  185604. "and r7, r3\n\t"
  185605. #endif
  185606. #ifdef WOLFSSL_KEIL
  185607. "sbcs r4, r4, r6\n\t"
  185608. #elif defined(__clang__)
  185609. "sbcs r4, r6\n\t"
  185610. #else
  185611. "sbc r4, r6\n\t"
  185612. #endif
  185613. #ifdef WOLFSSL_KEIL
  185614. "sbcs r5, r5, r7\n\t"
  185615. #elif defined(__clang__)
  185616. "sbcs r5, r7\n\t"
  185617. #else
  185618. "sbc r5, r7\n\t"
  185619. #endif
  185620. "str r4, [%[r], #24]\n\t"
  185621. "str r5, [%[r], #28]\n\t"
  185622. "ldr r4, [%[r], #32]\n\t"
  185623. "ldr r5, [%[r], #36]\n\t"
  185624. "ldr r6, [%[m], #32]\n\t"
  185625. "ldr r7, [%[m], #36]\n\t"
  185626. #ifdef WOLFSSL_KEIL
  185627. "ands r6, r6, r3\n\t"
  185628. #elif defined(__clang__)
  185629. "ands r6, r3\n\t"
  185630. #else
  185631. "and r6, r3\n\t"
  185632. #endif
  185633. #ifdef WOLFSSL_KEIL
  185634. "ands r7, r7, r3\n\t"
  185635. #elif defined(__clang__)
  185636. "ands r7, r3\n\t"
  185637. #else
  185638. "and r7, r3\n\t"
  185639. #endif
  185640. #ifdef WOLFSSL_KEIL
  185641. "sbcs r4, r4, r6\n\t"
  185642. #elif defined(__clang__)
  185643. "sbcs r4, r6\n\t"
  185644. #else
  185645. "sbc r4, r6\n\t"
  185646. #endif
  185647. #ifdef WOLFSSL_KEIL
  185648. "sbcs r5, r5, r7\n\t"
  185649. #elif defined(__clang__)
  185650. "sbcs r5, r7\n\t"
  185651. #else
  185652. "sbc r5, r7\n\t"
  185653. #endif
  185654. "str r4, [%[r], #32]\n\t"
  185655. "str r5, [%[r], #36]\n\t"
  185656. "ldr r4, [%[r], #40]\n\t"
  185657. "ldr r5, [%[r], #44]\n\t"
  185658. "ldr r6, [%[m], #40]\n\t"
  185659. "ldr r7, [%[m], #44]\n\t"
  185660. #ifdef WOLFSSL_KEIL
  185661. "ands r6, r6, r3\n\t"
  185662. #elif defined(__clang__)
  185663. "ands r6, r3\n\t"
  185664. #else
  185665. "and r6, r3\n\t"
  185666. #endif
  185667. #ifdef WOLFSSL_KEIL
  185668. "ands r7, r7, r3\n\t"
  185669. #elif defined(__clang__)
  185670. "ands r7, r3\n\t"
  185671. #else
  185672. "and r7, r3\n\t"
  185673. #endif
  185674. #ifdef WOLFSSL_KEIL
  185675. "sbcs r4, r4, r6\n\t"
  185676. #elif defined(__clang__)
  185677. "sbcs r4, r6\n\t"
  185678. #else
  185679. "sbc r4, r6\n\t"
  185680. #endif
  185681. #ifdef WOLFSSL_KEIL
  185682. "sbcs r5, r5, r7\n\t"
  185683. #elif defined(__clang__)
  185684. "sbcs r5, r7\n\t"
  185685. #else
  185686. "sbc r5, r7\n\t"
  185687. #endif
  185688. "str r4, [%[r], #40]\n\t"
  185689. "str r5, [%[r], #44]\n\t"
  185690. "ldr r4, [%[r], #48]\n\t"
  185691. "ldr r5, [%[r], #52]\n\t"
  185692. "ldr r6, [%[m], #48]\n\t"
  185693. "ldr r7, [%[m], #52]\n\t"
  185694. #ifdef WOLFSSL_KEIL
  185695. "ands r6, r6, r3\n\t"
  185696. #elif defined(__clang__)
  185697. "ands r6, r3\n\t"
  185698. #else
  185699. "and r6, r3\n\t"
  185700. #endif
  185701. #ifdef WOLFSSL_KEIL
  185702. "ands r7, r7, r3\n\t"
  185703. #elif defined(__clang__)
  185704. "ands r7, r3\n\t"
  185705. #else
  185706. "and r7, r3\n\t"
  185707. #endif
  185708. #ifdef WOLFSSL_KEIL
  185709. "sbcs r4, r4, r6\n\t"
  185710. #elif defined(__clang__)
  185711. "sbcs r4, r6\n\t"
  185712. #else
  185713. "sbc r4, r6\n\t"
  185714. #endif
  185715. #ifdef WOLFSSL_KEIL
  185716. "sbcs r5, r5, r7\n\t"
  185717. #elif defined(__clang__)
  185718. "sbcs r5, r7\n\t"
  185719. #else
  185720. "sbc r5, r7\n\t"
  185721. #endif
  185722. "str r4, [%[r], #48]\n\t"
  185723. "str r5, [%[r], #52]\n\t"
  185724. "ldr r4, [%[r], #56]\n\t"
  185725. "ldr r5, [%[r], #60]\n\t"
  185726. "ldr r6, [%[m], #56]\n\t"
  185727. "ldr r7, [%[m], #60]\n\t"
  185728. #ifdef WOLFSSL_KEIL
  185729. "ands r6, r6, r3\n\t"
  185730. #elif defined(__clang__)
  185731. "ands r6, r3\n\t"
  185732. #else
  185733. "and r6, r3\n\t"
  185734. #endif
  185735. #ifdef WOLFSSL_KEIL
  185736. "ands r7, r7, r3\n\t"
  185737. #elif defined(__clang__)
  185738. "ands r7, r3\n\t"
  185739. #else
  185740. "and r7, r3\n\t"
  185741. #endif
  185742. #ifdef WOLFSSL_KEIL
  185743. "sbcs r4, r4, r6\n\t"
  185744. #elif defined(__clang__)
  185745. "sbcs r4, r6\n\t"
  185746. #else
  185747. "sbc r4, r6\n\t"
  185748. #endif
  185749. #ifdef WOLFSSL_KEIL
  185750. "sbcs r5, r5, r7\n\t"
  185751. #elif defined(__clang__)
  185752. "sbcs r5, r7\n\t"
  185753. #else
  185754. "sbc r5, r7\n\t"
  185755. #endif
  185756. "str r4, [%[r], #56]\n\t"
  185757. "str r5, [%[r], #60]\n\t"
  185758. "ldr r4, [%[r], #64]\n\t"
  185759. "ldr r5, [%[r], #68]\n\t"
  185760. "ldr r6, [%[m], #64]\n\t"
  185761. "ldr r7, [%[m], #68]\n\t"
  185762. #ifdef WOLFSSL_KEIL
  185763. "ands r6, r6, r3\n\t"
  185764. #elif defined(__clang__)
  185765. "ands r6, r3\n\t"
  185766. #else
  185767. "and r6, r3\n\t"
  185768. #endif
  185769. #ifdef WOLFSSL_KEIL
  185770. "ands r7, r7, r3\n\t"
  185771. #elif defined(__clang__)
  185772. "ands r7, r3\n\t"
  185773. #else
  185774. "and r7, r3\n\t"
  185775. #endif
  185776. #ifdef WOLFSSL_KEIL
  185777. "sbcs r4, r4, r6\n\t"
  185778. #elif defined(__clang__)
  185779. "sbcs r4, r6\n\t"
  185780. #else
  185781. "sbc r4, r6\n\t"
  185782. #endif
  185783. #ifdef WOLFSSL_KEIL
  185784. "sbcs r5, r5, r7\n\t"
  185785. #elif defined(__clang__)
  185786. "sbcs r5, r7\n\t"
  185787. #else
  185788. "sbc r5, r7\n\t"
  185789. #endif
  185790. "str r4, [%[r], #64]\n\t"
  185791. "str r5, [%[r], #68]\n\t"
  185792. "ldr r4, [%[r], #72]\n\t"
  185793. "ldr r5, [%[r], #76]\n\t"
  185794. "ldr r6, [%[m], #72]\n\t"
  185795. "ldr r7, [%[m], #76]\n\t"
  185796. #ifdef WOLFSSL_KEIL
  185797. "ands r6, r6, r3\n\t"
  185798. #elif defined(__clang__)
  185799. "ands r6, r3\n\t"
  185800. #else
  185801. "and r6, r3\n\t"
  185802. #endif
  185803. #ifdef WOLFSSL_KEIL
  185804. "ands r7, r7, r3\n\t"
  185805. #elif defined(__clang__)
  185806. "ands r7, r3\n\t"
  185807. #else
  185808. "and r7, r3\n\t"
  185809. #endif
  185810. #ifdef WOLFSSL_KEIL
  185811. "sbcs r4, r4, r6\n\t"
  185812. #elif defined(__clang__)
  185813. "sbcs r4, r6\n\t"
  185814. #else
  185815. "sbc r4, r6\n\t"
  185816. #endif
  185817. #ifdef WOLFSSL_KEIL
  185818. "sbcs r5, r5, r7\n\t"
  185819. #elif defined(__clang__)
  185820. "sbcs r5, r7\n\t"
  185821. #else
  185822. "sbc r5, r7\n\t"
  185823. #endif
  185824. "str r4, [%[r], #72]\n\t"
  185825. "str r5, [%[r], #76]\n\t"
  185826. "ldr r4, [%[r], #80]\n\t"
  185827. "ldr r5, [%[r], #84]\n\t"
  185828. "ldr r6, [%[m], #80]\n\t"
  185829. "ldr r7, [%[m], #84]\n\t"
  185830. #ifdef WOLFSSL_KEIL
  185831. "ands r6, r6, r3\n\t"
  185832. #elif defined(__clang__)
  185833. "ands r6, r3\n\t"
  185834. #else
  185835. "and r6, r3\n\t"
  185836. #endif
  185837. #ifdef WOLFSSL_KEIL
  185838. "ands r7, r7, r3\n\t"
  185839. #elif defined(__clang__)
  185840. "ands r7, r3\n\t"
  185841. #else
  185842. "and r7, r3\n\t"
  185843. #endif
  185844. #ifdef WOLFSSL_KEIL
  185845. "sbcs r4, r4, r6\n\t"
  185846. #elif defined(__clang__)
  185847. "sbcs r4, r6\n\t"
  185848. #else
  185849. "sbc r4, r6\n\t"
  185850. #endif
  185851. #ifdef WOLFSSL_KEIL
  185852. "sbcs r5, r5, r7\n\t"
  185853. #elif defined(__clang__)
  185854. "sbcs r5, r7\n\t"
  185855. #else
  185856. "sbc r5, r7\n\t"
  185857. #endif
  185858. "str r4, [%[r], #80]\n\t"
  185859. "str r5, [%[r], #84]\n\t"
  185860. "ldr r4, [%[r], #88]\n\t"
  185861. "ldr r5, [%[r], #92]\n\t"
  185862. "ldr r6, [%[m], #88]\n\t"
  185863. "ldr r7, [%[m], #92]\n\t"
  185864. #ifdef WOLFSSL_KEIL
  185865. "ands r6, r6, r3\n\t"
  185866. #elif defined(__clang__)
  185867. "ands r6, r3\n\t"
  185868. #else
  185869. "and r6, r3\n\t"
  185870. #endif
  185871. #ifdef WOLFSSL_KEIL
  185872. "ands r7, r7, r3\n\t"
  185873. #elif defined(__clang__)
  185874. "ands r7, r3\n\t"
  185875. #else
  185876. "and r7, r3\n\t"
  185877. #endif
  185878. #ifdef WOLFSSL_KEIL
  185879. "sbcs r4, r4, r6\n\t"
  185880. #elif defined(__clang__)
  185881. "sbcs r4, r6\n\t"
  185882. #else
  185883. "sbc r4, r6\n\t"
  185884. #endif
  185885. #ifdef WOLFSSL_KEIL
  185886. "sbcs r5, r5, r7\n\t"
  185887. #elif defined(__clang__)
  185888. "sbcs r5, r7\n\t"
  185889. #else
  185890. "sbc r5, r7\n\t"
  185891. #endif
  185892. "str r4, [%[r], #88]\n\t"
  185893. "str r5, [%[r], #92]\n\t"
  185894. "ldr r4, [%[r], #96]\n\t"
  185895. "ldr r5, [%[r], #100]\n\t"
  185896. "ldr r6, [%[m], #96]\n\t"
  185897. "ldr r7, [%[m], #100]\n\t"
  185898. #ifdef WOLFSSL_KEIL
  185899. "ands r6, r6, r3\n\t"
  185900. #elif defined(__clang__)
  185901. "ands r6, r3\n\t"
  185902. #else
  185903. "and r6, r3\n\t"
  185904. #endif
  185905. #ifdef WOLFSSL_KEIL
  185906. "ands r7, r7, r3\n\t"
  185907. #elif defined(__clang__)
  185908. "ands r7, r3\n\t"
  185909. #else
  185910. "and r7, r3\n\t"
  185911. #endif
  185912. #ifdef WOLFSSL_KEIL
  185913. "sbcs r4, r4, r6\n\t"
  185914. #elif defined(__clang__)
  185915. "sbcs r4, r6\n\t"
  185916. #else
  185917. "sbc r4, r6\n\t"
  185918. #endif
  185919. #ifdef WOLFSSL_KEIL
  185920. "sbcs r5, r5, r7\n\t"
  185921. #elif defined(__clang__)
  185922. "sbcs r5, r7\n\t"
  185923. #else
  185924. "sbc r5, r7\n\t"
  185925. #endif
  185926. "str r4, [%[r], #96]\n\t"
  185927. "str r5, [%[r], #100]\n\t"
  185928. "ldr r4, [%[r], #104]\n\t"
  185929. "ldr r5, [%[r], #108]\n\t"
  185930. "ldr r6, [%[m], #104]\n\t"
  185931. "ldr r7, [%[m], #108]\n\t"
  185932. #ifdef WOLFSSL_KEIL
  185933. "ands r6, r6, r3\n\t"
  185934. #elif defined(__clang__)
  185935. "ands r6, r3\n\t"
  185936. #else
  185937. "and r6, r3\n\t"
  185938. #endif
  185939. #ifdef WOLFSSL_KEIL
  185940. "ands r7, r7, r3\n\t"
  185941. #elif defined(__clang__)
  185942. "ands r7, r3\n\t"
  185943. #else
  185944. "and r7, r3\n\t"
  185945. #endif
  185946. #ifdef WOLFSSL_KEIL
  185947. "sbcs r4, r4, r6\n\t"
  185948. #elif defined(__clang__)
  185949. "sbcs r4, r6\n\t"
  185950. #else
  185951. "sbc r4, r6\n\t"
  185952. #endif
  185953. #ifdef WOLFSSL_KEIL
  185954. "sbcs r5, r5, r7\n\t"
  185955. #elif defined(__clang__)
  185956. "sbcs r5, r7\n\t"
  185957. #else
  185958. "sbc r5, r7\n\t"
  185959. #endif
  185960. "str r4, [%[r], #104]\n\t"
  185961. "str r5, [%[r], #108]\n\t"
  185962. "ldr r4, [%[r], #112]\n\t"
  185963. "ldr r5, [%[r], #116]\n\t"
  185964. "ldr r6, [%[m], #112]\n\t"
  185965. "ldr r7, [%[m], #116]\n\t"
  185966. #ifdef WOLFSSL_KEIL
  185967. "ands r6, r6, r3\n\t"
  185968. #elif defined(__clang__)
  185969. "ands r6, r3\n\t"
  185970. #else
  185971. "and r6, r3\n\t"
  185972. #endif
  185973. #ifdef WOLFSSL_KEIL
  185974. "ands r7, r7, r3\n\t"
  185975. #elif defined(__clang__)
  185976. "ands r7, r3\n\t"
  185977. #else
  185978. "and r7, r3\n\t"
  185979. #endif
  185980. #ifdef WOLFSSL_KEIL
  185981. "sbcs r4, r4, r6\n\t"
  185982. #elif defined(__clang__)
  185983. "sbcs r4, r6\n\t"
  185984. #else
  185985. "sbc r4, r6\n\t"
  185986. #endif
  185987. #ifdef WOLFSSL_KEIL
  185988. "sbcs r5, r5, r7\n\t"
  185989. #elif defined(__clang__)
  185990. "sbcs r5, r7\n\t"
  185991. #else
  185992. "sbc r5, r7\n\t"
  185993. #endif
  185994. "str r4, [%[r], #112]\n\t"
  185995. "str r5, [%[r], #116]\n\t"
  185996. "ldr r4, [%[r], #120]\n\t"
  185997. "ldr r5, [%[r], #124]\n\t"
  185998. "ldr r6, [%[m], #120]\n\t"
  185999. "ldr r7, [%[m], #124]\n\t"
  186000. #ifdef WOLFSSL_KEIL
  186001. "ands r6, r6, r3\n\t"
  186002. #elif defined(__clang__)
  186003. "ands r6, r3\n\t"
  186004. #else
  186005. "and r6, r3\n\t"
  186006. #endif
  186007. #ifdef WOLFSSL_KEIL
  186008. "ands r7, r7, r3\n\t"
  186009. #elif defined(__clang__)
  186010. "ands r7, r3\n\t"
  186011. #else
  186012. "and r7, r3\n\t"
  186013. #endif
  186014. #ifdef WOLFSSL_KEIL
  186015. "sbcs r4, r4, r6\n\t"
  186016. #elif defined(__clang__)
  186017. "sbcs r4, r6\n\t"
  186018. #else
  186019. "sbc r4, r6\n\t"
  186020. #endif
  186021. #ifdef WOLFSSL_KEIL
  186022. "sbcs r5, r5, r7\n\t"
  186023. #elif defined(__clang__)
  186024. "sbcs r5, r7\n\t"
  186025. #else
  186026. "sbc r5, r7\n\t"
  186027. #endif
  186028. "str r4, [%[r], #120]\n\t"
  186029. "str r5, [%[r], #124]\n\t"
  186030. "ldr r4, [%[a]]\n\t"
  186031. "ldr r5, [%[a], #4]\n\t"
  186032. "ldr r6, [%[r]]\n\t"
  186033. "ldr r7, [%[r], #4]\n\t"
  186034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186035. "adds r6, r6, r4\n\t"
  186036. #else
  186037. "add r6, r6, r4\n\t"
  186038. #endif
  186039. #ifdef WOLFSSL_KEIL
  186040. "adcs r7, r7, r5\n\t"
  186041. #elif defined(__clang__)
  186042. "adcs r7, r5\n\t"
  186043. #else
  186044. "adc r7, r5\n\t"
  186045. #endif
  186046. "str r6, [%[r]]\n\t"
  186047. "str r7, [%[r], #4]\n\t"
  186048. "ldr r4, [%[a], #8]\n\t"
  186049. "ldr r5, [%[a], #12]\n\t"
  186050. "ldr r6, [%[r], #8]\n\t"
  186051. "ldr r7, [%[r], #12]\n\t"
  186052. #ifdef WOLFSSL_KEIL
  186053. "adcs r6, r6, r4\n\t"
  186054. #elif defined(__clang__)
  186055. "adcs r6, r4\n\t"
  186056. #else
  186057. "adc r6, r4\n\t"
  186058. #endif
  186059. #ifdef WOLFSSL_KEIL
  186060. "adcs r7, r7, r5\n\t"
  186061. #elif defined(__clang__)
  186062. "adcs r7, r5\n\t"
  186063. #else
  186064. "adc r7, r5\n\t"
  186065. #endif
  186066. "str r6, [%[r], #8]\n\t"
  186067. "str r7, [%[r], #12]\n\t"
  186068. "ldr r4, [%[a], #16]\n\t"
  186069. "ldr r5, [%[a], #20]\n\t"
  186070. "ldr r6, [%[r], #16]\n\t"
  186071. "ldr r7, [%[r], #20]\n\t"
  186072. #ifdef WOLFSSL_KEIL
  186073. "adcs r6, r6, r4\n\t"
  186074. #elif defined(__clang__)
  186075. "adcs r6, r4\n\t"
  186076. #else
  186077. "adc r6, r4\n\t"
  186078. #endif
  186079. #ifdef WOLFSSL_KEIL
  186080. "adcs r7, r7, r5\n\t"
  186081. #elif defined(__clang__)
  186082. "adcs r7, r5\n\t"
  186083. #else
  186084. "adc r7, r5\n\t"
  186085. #endif
  186086. "str r6, [%[r], #16]\n\t"
  186087. "str r7, [%[r], #20]\n\t"
  186088. "ldr r4, [%[a], #24]\n\t"
  186089. "ldr r5, [%[a], #28]\n\t"
  186090. "ldr r6, [%[r], #24]\n\t"
  186091. "ldr r7, [%[r], #28]\n\t"
  186092. #ifdef WOLFSSL_KEIL
  186093. "adcs r6, r6, r4\n\t"
  186094. #elif defined(__clang__)
  186095. "adcs r6, r4\n\t"
  186096. #else
  186097. "adc r6, r4\n\t"
  186098. #endif
  186099. #ifdef WOLFSSL_KEIL
  186100. "adcs r7, r7, r5\n\t"
  186101. #elif defined(__clang__)
  186102. "adcs r7, r5\n\t"
  186103. #else
  186104. "adc r7, r5\n\t"
  186105. #endif
  186106. "str r6, [%[r], #24]\n\t"
  186107. "str r7, [%[r], #28]\n\t"
  186108. "ldr r4, [%[a], #32]\n\t"
  186109. "ldr r5, [%[a], #36]\n\t"
  186110. "ldr r6, [%[r], #32]\n\t"
  186111. "ldr r7, [%[r], #36]\n\t"
  186112. #ifdef WOLFSSL_KEIL
  186113. "adcs r6, r6, r4\n\t"
  186114. #elif defined(__clang__)
  186115. "adcs r6, r4\n\t"
  186116. #else
  186117. "adc r6, r4\n\t"
  186118. #endif
  186119. #ifdef WOLFSSL_KEIL
  186120. "adcs r7, r7, r5\n\t"
  186121. #elif defined(__clang__)
  186122. "adcs r7, r5\n\t"
  186123. #else
  186124. "adc r7, r5\n\t"
  186125. #endif
  186126. "str r6, [%[r], #32]\n\t"
  186127. "str r7, [%[r], #36]\n\t"
  186128. "ldr r4, [%[a], #40]\n\t"
  186129. "ldr r5, [%[a], #44]\n\t"
  186130. "ldr r6, [%[r], #40]\n\t"
  186131. "ldr r7, [%[r], #44]\n\t"
  186132. #ifdef WOLFSSL_KEIL
  186133. "adcs r6, r6, r4\n\t"
  186134. #elif defined(__clang__)
  186135. "adcs r6, r4\n\t"
  186136. #else
  186137. "adc r6, r4\n\t"
  186138. #endif
  186139. #ifdef WOLFSSL_KEIL
  186140. "adcs r7, r7, r5\n\t"
  186141. #elif defined(__clang__)
  186142. "adcs r7, r5\n\t"
  186143. #else
  186144. "adc r7, r5\n\t"
  186145. #endif
  186146. "str r6, [%[r], #40]\n\t"
  186147. "str r7, [%[r], #44]\n\t"
  186148. "ldr r4, [%[a], #48]\n\t"
  186149. "ldr r5, [%[a], #52]\n\t"
  186150. "ldr r6, [%[r], #48]\n\t"
  186151. "ldr r7, [%[r], #52]\n\t"
  186152. #ifdef WOLFSSL_KEIL
  186153. "adcs r6, r6, r4\n\t"
  186154. #elif defined(__clang__)
  186155. "adcs r6, r4\n\t"
  186156. #else
  186157. "adc r6, r4\n\t"
  186158. #endif
  186159. #ifdef WOLFSSL_KEIL
  186160. "adcs r7, r7, r5\n\t"
  186161. #elif defined(__clang__)
  186162. "adcs r7, r5\n\t"
  186163. #else
  186164. "adc r7, r5\n\t"
  186165. #endif
  186166. "str r6, [%[r], #48]\n\t"
  186167. "str r7, [%[r], #52]\n\t"
  186168. "ldr r4, [%[a], #56]\n\t"
  186169. "ldr r5, [%[a], #60]\n\t"
  186170. "ldr r6, [%[r], #56]\n\t"
  186171. "ldr r7, [%[r], #60]\n\t"
  186172. #ifdef WOLFSSL_KEIL
  186173. "adcs r6, r6, r4\n\t"
  186174. #elif defined(__clang__)
  186175. "adcs r6, r4\n\t"
  186176. #else
  186177. "adc r6, r4\n\t"
  186178. #endif
  186179. #ifdef WOLFSSL_KEIL
  186180. "adcs r7, r7, r5\n\t"
  186181. #elif defined(__clang__)
  186182. "adcs r7, r5\n\t"
  186183. #else
  186184. "adc r7, r5\n\t"
  186185. #endif
  186186. "str r6, [%[r], #56]\n\t"
  186187. "str r7, [%[r], #60]\n\t"
  186188. "ldr r4, [%[a], #64]\n\t"
  186189. "ldr r5, [%[a], #68]\n\t"
  186190. "ldr r6, [%[r], #64]\n\t"
  186191. "ldr r7, [%[r], #68]\n\t"
  186192. #ifdef WOLFSSL_KEIL
  186193. "adcs r6, r6, r4\n\t"
  186194. #elif defined(__clang__)
  186195. "adcs r6, r4\n\t"
  186196. #else
  186197. "adc r6, r4\n\t"
  186198. #endif
  186199. #ifdef WOLFSSL_KEIL
  186200. "adcs r7, r7, r5\n\t"
  186201. #elif defined(__clang__)
  186202. "adcs r7, r5\n\t"
  186203. #else
  186204. "adc r7, r5\n\t"
  186205. #endif
  186206. "str r6, [%[r], #64]\n\t"
  186207. "str r7, [%[r], #68]\n\t"
  186208. "ldr r4, [%[a], #72]\n\t"
  186209. "ldr r5, [%[a], #76]\n\t"
  186210. "ldr r6, [%[r], #72]\n\t"
  186211. "ldr r7, [%[r], #76]\n\t"
  186212. #ifdef WOLFSSL_KEIL
  186213. "adcs r6, r6, r4\n\t"
  186214. #elif defined(__clang__)
  186215. "adcs r6, r4\n\t"
  186216. #else
  186217. "adc r6, r4\n\t"
  186218. #endif
  186219. #ifdef WOLFSSL_KEIL
  186220. "adcs r7, r7, r5\n\t"
  186221. #elif defined(__clang__)
  186222. "adcs r7, r5\n\t"
  186223. #else
  186224. "adc r7, r5\n\t"
  186225. #endif
  186226. "str r6, [%[r], #72]\n\t"
  186227. "str r7, [%[r], #76]\n\t"
  186228. "ldr r4, [%[a], #80]\n\t"
  186229. "ldr r5, [%[a], #84]\n\t"
  186230. "ldr r6, [%[r], #80]\n\t"
  186231. "ldr r7, [%[r], #84]\n\t"
  186232. #ifdef WOLFSSL_KEIL
  186233. "adcs r6, r6, r4\n\t"
  186234. #elif defined(__clang__)
  186235. "adcs r6, r4\n\t"
  186236. #else
  186237. "adc r6, r4\n\t"
  186238. #endif
  186239. #ifdef WOLFSSL_KEIL
  186240. "adcs r7, r7, r5\n\t"
  186241. #elif defined(__clang__)
  186242. "adcs r7, r5\n\t"
  186243. #else
  186244. "adc r7, r5\n\t"
  186245. #endif
  186246. "str r6, [%[r], #80]\n\t"
  186247. "str r7, [%[r], #84]\n\t"
  186248. "ldr r4, [%[a], #88]\n\t"
  186249. "ldr r5, [%[a], #92]\n\t"
  186250. "ldr r6, [%[r], #88]\n\t"
  186251. "ldr r7, [%[r], #92]\n\t"
  186252. #ifdef WOLFSSL_KEIL
  186253. "adcs r6, r6, r4\n\t"
  186254. #elif defined(__clang__)
  186255. "adcs r6, r4\n\t"
  186256. #else
  186257. "adc r6, r4\n\t"
  186258. #endif
  186259. #ifdef WOLFSSL_KEIL
  186260. "adcs r7, r7, r5\n\t"
  186261. #elif defined(__clang__)
  186262. "adcs r7, r5\n\t"
  186263. #else
  186264. "adc r7, r5\n\t"
  186265. #endif
  186266. "str r6, [%[r], #88]\n\t"
  186267. "str r7, [%[r], #92]\n\t"
  186268. "ldr r4, [%[a], #96]\n\t"
  186269. "ldr r5, [%[a], #100]\n\t"
  186270. "ldr r6, [%[r], #96]\n\t"
  186271. "ldr r7, [%[r], #100]\n\t"
  186272. #ifdef WOLFSSL_KEIL
  186273. "adcs r6, r6, r4\n\t"
  186274. #elif defined(__clang__)
  186275. "adcs r6, r4\n\t"
  186276. #else
  186277. "adc r6, r4\n\t"
  186278. #endif
  186279. #ifdef WOLFSSL_KEIL
  186280. "adcs r7, r7, r5\n\t"
  186281. #elif defined(__clang__)
  186282. "adcs r7, r5\n\t"
  186283. #else
  186284. "adc r7, r5\n\t"
  186285. #endif
  186286. "str r6, [%[r], #96]\n\t"
  186287. "str r7, [%[r], #100]\n\t"
  186288. "ldr r4, [%[a], #104]\n\t"
  186289. "ldr r5, [%[a], #108]\n\t"
  186290. "ldr r6, [%[r], #104]\n\t"
  186291. "ldr r7, [%[r], #108]\n\t"
  186292. #ifdef WOLFSSL_KEIL
  186293. "adcs r6, r6, r4\n\t"
  186294. #elif defined(__clang__)
  186295. "adcs r6, r4\n\t"
  186296. #else
  186297. "adc r6, r4\n\t"
  186298. #endif
  186299. #ifdef WOLFSSL_KEIL
  186300. "adcs r7, r7, r5\n\t"
  186301. #elif defined(__clang__)
  186302. "adcs r7, r5\n\t"
  186303. #else
  186304. "adc r7, r5\n\t"
  186305. #endif
  186306. "str r6, [%[r], #104]\n\t"
  186307. "str r7, [%[r], #108]\n\t"
  186308. "ldr r4, [%[a], #112]\n\t"
  186309. "ldr r5, [%[a], #116]\n\t"
  186310. "ldr r6, [%[r], #112]\n\t"
  186311. "ldr r7, [%[r], #116]\n\t"
  186312. #ifdef WOLFSSL_KEIL
  186313. "adcs r6, r6, r4\n\t"
  186314. #elif defined(__clang__)
  186315. "adcs r6, r4\n\t"
  186316. #else
  186317. "adc r6, r4\n\t"
  186318. #endif
  186319. #ifdef WOLFSSL_KEIL
  186320. "adcs r7, r7, r5\n\t"
  186321. #elif defined(__clang__)
  186322. "adcs r7, r5\n\t"
  186323. #else
  186324. "adc r7, r5\n\t"
  186325. #endif
  186326. "str r6, [%[r], #112]\n\t"
  186327. "str r7, [%[r], #116]\n\t"
  186328. "ldr r4, [%[a], #120]\n\t"
  186329. "ldr r5, [%[a], #124]\n\t"
  186330. "ldr r6, [%[r], #120]\n\t"
  186331. "ldr r7, [%[r], #124]\n\t"
  186332. #ifdef WOLFSSL_KEIL
  186333. "adcs r6, r6, r4\n\t"
  186334. #elif defined(__clang__)
  186335. "adcs r6, r4\n\t"
  186336. #else
  186337. "adc r6, r4\n\t"
  186338. #endif
  186339. #ifdef WOLFSSL_KEIL
  186340. "adcs r7, r7, r5\n\t"
  186341. #elif defined(__clang__)
  186342. "adcs r7, r5\n\t"
  186343. #else
  186344. "adc r7, r5\n\t"
  186345. #endif
  186346. "str r6, [%[r], #120]\n\t"
  186347. "str r7, [%[r], #124]\n\t"
  186348. "movs r3, #0\n\t"
  186349. "ldr r5, [%[m], #124]\n\t"
  186350. #ifdef WOLFSSL_KEIL
  186351. "adcs r3, r3, r3\n\t"
  186352. #elif defined(__clang__)
  186353. "adcs r3, r3\n\t"
  186354. #else
  186355. "adc r3, r3\n\t"
  186356. #endif
  186357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186358. "subs r5, r5, r7\n\t"
  186359. #else
  186360. "sub r5, r5, r7\n\t"
  186361. #endif
  186362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186363. "negs r3, r3\n\t"
  186364. #else
  186365. "neg r3, r3\n\t"
  186366. #endif
  186367. #ifdef WOLFSSL_KEIL
  186368. "sbcs r5, r5, r5\n\t"
  186369. #elif defined(__clang__)
  186370. "sbcs r5, r5\n\t"
  186371. #else
  186372. "sbc r5, r5\n\t"
  186373. #endif
  186374. #ifdef WOLFSSL_KEIL
  186375. "orrs r3, r3, r5\n\t"
  186376. #elif defined(__clang__)
  186377. "orrs r3, r5\n\t"
  186378. #else
  186379. "orr r3, r5\n\t"
  186380. #endif
  186381. "ldr r6, [%[r]]\n\t"
  186382. "ldr r7, [%[r], #4]\n\t"
  186383. "ldr r4, [%[m]]\n\t"
  186384. "ldr r5, [%[m], #4]\n\t"
  186385. #ifdef WOLFSSL_KEIL
  186386. "ands r4, r4, r3\n\t"
  186387. #elif defined(__clang__)
  186388. "ands r4, r3\n\t"
  186389. #else
  186390. "and r4, r3\n\t"
  186391. #endif
  186392. #ifdef WOLFSSL_KEIL
  186393. "ands r5, r5, r3\n\t"
  186394. #elif defined(__clang__)
  186395. "ands r5, r3\n\t"
  186396. #else
  186397. "and r5, r3\n\t"
  186398. #endif
  186399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186400. "subs r6, r6, r4\n\t"
  186401. #else
  186402. "sub r6, r6, r4\n\t"
  186403. #endif
  186404. #ifdef WOLFSSL_KEIL
  186405. "sbcs r7, r7, r5\n\t"
  186406. #elif defined(__clang__)
  186407. "sbcs r7, r5\n\t"
  186408. #else
  186409. "sbc r7, r5\n\t"
  186410. #endif
  186411. "str r6, [%[r]]\n\t"
  186412. "str r7, [%[r], #4]\n\t"
  186413. "ldr r6, [%[r], #8]\n\t"
  186414. "ldr r7, [%[r], #12]\n\t"
  186415. "ldr r4, [%[m], #8]\n\t"
  186416. "ldr r5, [%[m], #12]\n\t"
  186417. #ifdef WOLFSSL_KEIL
  186418. "ands r4, r4, r3\n\t"
  186419. #elif defined(__clang__)
  186420. "ands r4, r3\n\t"
  186421. #else
  186422. "and r4, r3\n\t"
  186423. #endif
  186424. #ifdef WOLFSSL_KEIL
  186425. "ands r5, r5, r3\n\t"
  186426. #elif defined(__clang__)
  186427. "ands r5, r3\n\t"
  186428. #else
  186429. "and r5, r3\n\t"
  186430. #endif
  186431. #ifdef WOLFSSL_KEIL
  186432. "sbcs r6, r6, r4\n\t"
  186433. #elif defined(__clang__)
  186434. "sbcs r6, r4\n\t"
  186435. #else
  186436. "sbc r6, r4\n\t"
  186437. #endif
  186438. #ifdef WOLFSSL_KEIL
  186439. "sbcs r7, r7, r5\n\t"
  186440. #elif defined(__clang__)
  186441. "sbcs r7, r5\n\t"
  186442. #else
  186443. "sbc r7, r5\n\t"
  186444. #endif
  186445. "str r6, [%[r], #8]\n\t"
  186446. "str r7, [%[r], #12]\n\t"
  186447. "ldr r6, [%[r], #16]\n\t"
  186448. "ldr r7, [%[r], #20]\n\t"
  186449. "ldr r4, [%[m], #16]\n\t"
  186450. "ldr r5, [%[m], #20]\n\t"
  186451. #ifdef WOLFSSL_KEIL
  186452. "ands r4, r4, r3\n\t"
  186453. #elif defined(__clang__)
  186454. "ands r4, r3\n\t"
  186455. #else
  186456. "and r4, r3\n\t"
  186457. #endif
  186458. #ifdef WOLFSSL_KEIL
  186459. "ands r5, r5, r3\n\t"
  186460. #elif defined(__clang__)
  186461. "ands r5, r3\n\t"
  186462. #else
  186463. "and r5, r3\n\t"
  186464. #endif
  186465. #ifdef WOLFSSL_KEIL
  186466. "sbcs r6, r6, r4\n\t"
  186467. #elif defined(__clang__)
  186468. "sbcs r6, r4\n\t"
  186469. #else
  186470. "sbc r6, r4\n\t"
  186471. #endif
  186472. #ifdef WOLFSSL_KEIL
  186473. "sbcs r7, r7, r5\n\t"
  186474. #elif defined(__clang__)
  186475. "sbcs r7, r5\n\t"
  186476. #else
  186477. "sbc r7, r5\n\t"
  186478. #endif
  186479. "str r6, [%[r], #16]\n\t"
  186480. "str r7, [%[r], #20]\n\t"
  186481. "ldr r6, [%[r], #24]\n\t"
  186482. "ldr r7, [%[r], #28]\n\t"
  186483. "ldr r4, [%[m], #24]\n\t"
  186484. "ldr r5, [%[m], #28]\n\t"
  186485. #ifdef WOLFSSL_KEIL
  186486. "ands r4, r4, r3\n\t"
  186487. #elif defined(__clang__)
  186488. "ands r4, r3\n\t"
  186489. #else
  186490. "and r4, r3\n\t"
  186491. #endif
  186492. #ifdef WOLFSSL_KEIL
  186493. "ands r5, r5, r3\n\t"
  186494. #elif defined(__clang__)
  186495. "ands r5, r3\n\t"
  186496. #else
  186497. "and r5, r3\n\t"
  186498. #endif
  186499. #ifdef WOLFSSL_KEIL
  186500. "sbcs r6, r6, r4\n\t"
  186501. #elif defined(__clang__)
  186502. "sbcs r6, r4\n\t"
  186503. #else
  186504. "sbc r6, r4\n\t"
  186505. #endif
  186506. #ifdef WOLFSSL_KEIL
  186507. "sbcs r7, r7, r5\n\t"
  186508. #elif defined(__clang__)
  186509. "sbcs r7, r5\n\t"
  186510. #else
  186511. "sbc r7, r5\n\t"
  186512. #endif
  186513. "str r6, [%[r], #24]\n\t"
  186514. "str r7, [%[r], #28]\n\t"
  186515. "ldr r6, [%[r], #32]\n\t"
  186516. "ldr r7, [%[r], #36]\n\t"
  186517. "ldr r4, [%[m], #32]\n\t"
  186518. "ldr r5, [%[m], #36]\n\t"
  186519. #ifdef WOLFSSL_KEIL
  186520. "ands r4, r4, r3\n\t"
  186521. #elif defined(__clang__)
  186522. "ands r4, r3\n\t"
  186523. #else
  186524. "and r4, r3\n\t"
  186525. #endif
  186526. #ifdef WOLFSSL_KEIL
  186527. "ands r5, r5, r3\n\t"
  186528. #elif defined(__clang__)
  186529. "ands r5, r3\n\t"
  186530. #else
  186531. "and r5, r3\n\t"
  186532. #endif
  186533. #ifdef WOLFSSL_KEIL
  186534. "sbcs r6, r6, r4\n\t"
  186535. #elif defined(__clang__)
  186536. "sbcs r6, r4\n\t"
  186537. #else
  186538. "sbc r6, r4\n\t"
  186539. #endif
  186540. #ifdef WOLFSSL_KEIL
  186541. "sbcs r7, r7, r5\n\t"
  186542. #elif defined(__clang__)
  186543. "sbcs r7, r5\n\t"
  186544. #else
  186545. "sbc r7, r5\n\t"
  186546. #endif
  186547. "str r6, [%[r], #32]\n\t"
  186548. "str r7, [%[r], #36]\n\t"
  186549. "ldr r6, [%[r], #40]\n\t"
  186550. "ldr r7, [%[r], #44]\n\t"
  186551. "ldr r4, [%[m], #40]\n\t"
  186552. "ldr r5, [%[m], #44]\n\t"
  186553. #ifdef WOLFSSL_KEIL
  186554. "ands r4, r4, r3\n\t"
  186555. #elif defined(__clang__)
  186556. "ands r4, r3\n\t"
  186557. #else
  186558. "and r4, r3\n\t"
  186559. #endif
  186560. #ifdef WOLFSSL_KEIL
  186561. "ands r5, r5, r3\n\t"
  186562. #elif defined(__clang__)
  186563. "ands r5, r3\n\t"
  186564. #else
  186565. "and r5, r3\n\t"
  186566. #endif
  186567. #ifdef WOLFSSL_KEIL
  186568. "sbcs r6, r6, r4\n\t"
  186569. #elif defined(__clang__)
  186570. "sbcs r6, r4\n\t"
  186571. #else
  186572. "sbc r6, r4\n\t"
  186573. #endif
  186574. #ifdef WOLFSSL_KEIL
  186575. "sbcs r7, r7, r5\n\t"
  186576. #elif defined(__clang__)
  186577. "sbcs r7, r5\n\t"
  186578. #else
  186579. "sbc r7, r5\n\t"
  186580. #endif
  186581. "str r6, [%[r], #40]\n\t"
  186582. "str r7, [%[r], #44]\n\t"
  186583. "ldr r6, [%[r], #48]\n\t"
  186584. "ldr r7, [%[r], #52]\n\t"
  186585. "ldr r4, [%[m], #48]\n\t"
  186586. "ldr r5, [%[m], #52]\n\t"
  186587. #ifdef WOLFSSL_KEIL
  186588. "ands r4, r4, r3\n\t"
  186589. #elif defined(__clang__)
  186590. "ands r4, r3\n\t"
  186591. #else
  186592. "and r4, r3\n\t"
  186593. #endif
  186594. #ifdef WOLFSSL_KEIL
  186595. "ands r5, r5, r3\n\t"
  186596. #elif defined(__clang__)
  186597. "ands r5, r3\n\t"
  186598. #else
  186599. "and r5, r3\n\t"
  186600. #endif
  186601. #ifdef WOLFSSL_KEIL
  186602. "sbcs r6, r6, r4\n\t"
  186603. #elif defined(__clang__)
  186604. "sbcs r6, r4\n\t"
  186605. #else
  186606. "sbc r6, r4\n\t"
  186607. #endif
  186608. #ifdef WOLFSSL_KEIL
  186609. "sbcs r7, r7, r5\n\t"
  186610. #elif defined(__clang__)
  186611. "sbcs r7, r5\n\t"
  186612. #else
  186613. "sbc r7, r5\n\t"
  186614. #endif
  186615. "str r6, [%[r], #48]\n\t"
  186616. "str r7, [%[r], #52]\n\t"
  186617. "ldr r6, [%[r], #56]\n\t"
  186618. "ldr r7, [%[r], #60]\n\t"
  186619. "ldr r4, [%[m], #56]\n\t"
  186620. "ldr r5, [%[m], #60]\n\t"
  186621. #ifdef WOLFSSL_KEIL
  186622. "ands r4, r4, r3\n\t"
  186623. #elif defined(__clang__)
  186624. "ands r4, r3\n\t"
  186625. #else
  186626. "and r4, r3\n\t"
  186627. #endif
  186628. #ifdef WOLFSSL_KEIL
  186629. "ands r5, r5, r3\n\t"
  186630. #elif defined(__clang__)
  186631. "ands r5, r3\n\t"
  186632. #else
  186633. "and r5, r3\n\t"
  186634. #endif
  186635. #ifdef WOLFSSL_KEIL
  186636. "sbcs r6, r6, r4\n\t"
  186637. #elif defined(__clang__)
  186638. "sbcs r6, r4\n\t"
  186639. #else
  186640. "sbc r6, r4\n\t"
  186641. #endif
  186642. #ifdef WOLFSSL_KEIL
  186643. "sbcs r7, r7, r5\n\t"
  186644. #elif defined(__clang__)
  186645. "sbcs r7, r5\n\t"
  186646. #else
  186647. "sbc r7, r5\n\t"
  186648. #endif
  186649. "str r6, [%[r], #56]\n\t"
  186650. "str r7, [%[r], #60]\n\t"
  186651. "ldr r6, [%[r], #64]\n\t"
  186652. "ldr r7, [%[r], #68]\n\t"
  186653. "ldr r4, [%[m], #64]\n\t"
  186654. "ldr r5, [%[m], #68]\n\t"
  186655. #ifdef WOLFSSL_KEIL
  186656. "ands r4, r4, r3\n\t"
  186657. #elif defined(__clang__)
  186658. "ands r4, r3\n\t"
  186659. #else
  186660. "and r4, r3\n\t"
  186661. #endif
  186662. #ifdef WOLFSSL_KEIL
  186663. "ands r5, r5, r3\n\t"
  186664. #elif defined(__clang__)
  186665. "ands r5, r3\n\t"
  186666. #else
  186667. "and r5, r3\n\t"
  186668. #endif
  186669. #ifdef WOLFSSL_KEIL
  186670. "sbcs r6, r6, r4\n\t"
  186671. #elif defined(__clang__)
  186672. "sbcs r6, r4\n\t"
  186673. #else
  186674. "sbc r6, r4\n\t"
  186675. #endif
  186676. #ifdef WOLFSSL_KEIL
  186677. "sbcs r7, r7, r5\n\t"
  186678. #elif defined(__clang__)
  186679. "sbcs r7, r5\n\t"
  186680. #else
  186681. "sbc r7, r5\n\t"
  186682. #endif
  186683. "str r6, [%[r], #64]\n\t"
  186684. "str r7, [%[r], #68]\n\t"
  186685. "ldr r6, [%[r], #72]\n\t"
  186686. "ldr r7, [%[r], #76]\n\t"
  186687. "ldr r4, [%[m], #72]\n\t"
  186688. "ldr r5, [%[m], #76]\n\t"
  186689. #ifdef WOLFSSL_KEIL
  186690. "ands r4, r4, r3\n\t"
  186691. #elif defined(__clang__)
  186692. "ands r4, r3\n\t"
  186693. #else
  186694. "and r4, r3\n\t"
  186695. #endif
  186696. #ifdef WOLFSSL_KEIL
  186697. "ands r5, r5, r3\n\t"
  186698. #elif defined(__clang__)
  186699. "ands r5, r3\n\t"
  186700. #else
  186701. "and r5, r3\n\t"
  186702. #endif
  186703. #ifdef WOLFSSL_KEIL
  186704. "sbcs r6, r6, r4\n\t"
  186705. #elif defined(__clang__)
  186706. "sbcs r6, r4\n\t"
  186707. #else
  186708. "sbc r6, r4\n\t"
  186709. #endif
  186710. #ifdef WOLFSSL_KEIL
  186711. "sbcs r7, r7, r5\n\t"
  186712. #elif defined(__clang__)
  186713. "sbcs r7, r5\n\t"
  186714. #else
  186715. "sbc r7, r5\n\t"
  186716. #endif
  186717. "str r6, [%[r], #72]\n\t"
  186718. "str r7, [%[r], #76]\n\t"
  186719. "ldr r6, [%[r], #80]\n\t"
  186720. "ldr r7, [%[r], #84]\n\t"
  186721. "ldr r4, [%[m], #80]\n\t"
  186722. "ldr r5, [%[m], #84]\n\t"
  186723. #ifdef WOLFSSL_KEIL
  186724. "ands r4, r4, r3\n\t"
  186725. #elif defined(__clang__)
  186726. "ands r4, r3\n\t"
  186727. #else
  186728. "and r4, r3\n\t"
  186729. #endif
  186730. #ifdef WOLFSSL_KEIL
  186731. "ands r5, r5, r3\n\t"
  186732. #elif defined(__clang__)
  186733. "ands r5, r3\n\t"
  186734. #else
  186735. "and r5, r3\n\t"
  186736. #endif
  186737. #ifdef WOLFSSL_KEIL
  186738. "sbcs r6, r6, r4\n\t"
  186739. #elif defined(__clang__)
  186740. "sbcs r6, r4\n\t"
  186741. #else
  186742. "sbc r6, r4\n\t"
  186743. #endif
  186744. #ifdef WOLFSSL_KEIL
  186745. "sbcs r7, r7, r5\n\t"
  186746. #elif defined(__clang__)
  186747. "sbcs r7, r5\n\t"
  186748. #else
  186749. "sbc r7, r5\n\t"
  186750. #endif
  186751. "str r6, [%[r], #80]\n\t"
  186752. "str r7, [%[r], #84]\n\t"
  186753. "ldr r6, [%[r], #88]\n\t"
  186754. "ldr r7, [%[r], #92]\n\t"
  186755. "ldr r4, [%[m], #88]\n\t"
  186756. "ldr r5, [%[m], #92]\n\t"
  186757. #ifdef WOLFSSL_KEIL
  186758. "ands r4, r4, r3\n\t"
  186759. #elif defined(__clang__)
  186760. "ands r4, r3\n\t"
  186761. #else
  186762. "and r4, r3\n\t"
  186763. #endif
  186764. #ifdef WOLFSSL_KEIL
  186765. "ands r5, r5, r3\n\t"
  186766. #elif defined(__clang__)
  186767. "ands r5, r3\n\t"
  186768. #else
  186769. "and r5, r3\n\t"
  186770. #endif
  186771. #ifdef WOLFSSL_KEIL
  186772. "sbcs r6, r6, r4\n\t"
  186773. #elif defined(__clang__)
  186774. "sbcs r6, r4\n\t"
  186775. #else
  186776. "sbc r6, r4\n\t"
  186777. #endif
  186778. #ifdef WOLFSSL_KEIL
  186779. "sbcs r7, r7, r5\n\t"
  186780. #elif defined(__clang__)
  186781. "sbcs r7, r5\n\t"
  186782. #else
  186783. "sbc r7, r5\n\t"
  186784. #endif
  186785. "str r6, [%[r], #88]\n\t"
  186786. "str r7, [%[r], #92]\n\t"
  186787. "ldr r6, [%[r], #96]\n\t"
  186788. "ldr r7, [%[r], #100]\n\t"
  186789. "ldr r4, [%[m], #96]\n\t"
  186790. "ldr r5, [%[m], #100]\n\t"
  186791. #ifdef WOLFSSL_KEIL
  186792. "ands r4, r4, r3\n\t"
  186793. #elif defined(__clang__)
  186794. "ands r4, r3\n\t"
  186795. #else
  186796. "and r4, r3\n\t"
  186797. #endif
  186798. #ifdef WOLFSSL_KEIL
  186799. "ands r5, r5, r3\n\t"
  186800. #elif defined(__clang__)
  186801. "ands r5, r3\n\t"
  186802. #else
  186803. "and r5, r3\n\t"
  186804. #endif
  186805. #ifdef WOLFSSL_KEIL
  186806. "sbcs r6, r6, r4\n\t"
  186807. #elif defined(__clang__)
  186808. "sbcs r6, r4\n\t"
  186809. #else
  186810. "sbc r6, r4\n\t"
  186811. #endif
  186812. #ifdef WOLFSSL_KEIL
  186813. "sbcs r7, r7, r5\n\t"
  186814. #elif defined(__clang__)
  186815. "sbcs r7, r5\n\t"
  186816. #else
  186817. "sbc r7, r5\n\t"
  186818. #endif
  186819. "str r6, [%[r], #96]\n\t"
  186820. "str r7, [%[r], #100]\n\t"
  186821. "ldr r6, [%[r], #104]\n\t"
  186822. "ldr r7, [%[r], #108]\n\t"
  186823. "ldr r4, [%[m], #104]\n\t"
  186824. "ldr r5, [%[m], #108]\n\t"
  186825. #ifdef WOLFSSL_KEIL
  186826. "ands r4, r4, r3\n\t"
  186827. #elif defined(__clang__)
  186828. "ands r4, r3\n\t"
  186829. #else
  186830. "and r4, r3\n\t"
  186831. #endif
  186832. #ifdef WOLFSSL_KEIL
  186833. "ands r5, r5, r3\n\t"
  186834. #elif defined(__clang__)
  186835. "ands r5, r3\n\t"
  186836. #else
  186837. "and r5, r3\n\t"
  186838. #endif
  186839. #ifdef WOLFSSL_KEIL
  186840. "sbcs r6, r6, r4\n\t"
  186841. #elif defined(__clang__)
  186842. "sbcs r6, r4\n\t"
  186843. #else
  186844. "sbc r6, r4\n\t"
  186845. #endif
  186846. #ifdef WOLFSSL_KEIL
  186847. "sbcs r7, r7, r5\n\t"
  186848. #elif defined(__clang__)
  186849. "sbcs r7, r5\n\t"
  186850. #else
  186851. "sbc r7, r5\n\t"
  186852. #endif
  186853. "str r6, [%[r], #104]\n\t"
  186854. "str r7, [%[r], #108]\n\t"
  186855. "ldr r6, [%[r], #112]\n\t"
  186856. "ldr r7, [%[r], #116]\n\t"
  186857. "ldr r4, [%[m], #112]\n\t"
  186858. "ldr r5, [%[m], #116]\n\t"
  186859. #ifdef WOLFSSL_KEIL
  186860. "ands r4, r4, r3\n\t"
  186861. #elif defined(__clang__)
  186862. "ands r4, r3\n\t"
  186863. #else
  186864. "and r4, r3\n\t"
  186865. #endif
  186866. #ifdef WOLFSSL_KEIL
  186867. "ands r5, r5, r3\n\t"
  186868. #elif defined(__clang__)
  186869. "ands r5, r3\n\t"
  186870. #else
  186871. "and r5, r3\n\t"
  186872. #endif
  186873. #ifdef WOLFSSL_KEIL
  186874. "sbcs r6, r6, r4\n\t"
  186875. #elif defined(__clang__)
  186876. "sbcs r6, r4\n\t"
  186877. #else
  186878. "sbc r6, r4\n\t"
  186879. #endif
  186880. #ifdef WOLFSSL_KEIL
  186881. "sbcs r7, r7, r5\n\t"
  186882. #elif defined(__clang__)
  186883. "sbcs r7, r5\n\t"
  186884. #else
  186885. "sbc r7, r5\n\t"
  186886. #endif
  186887. "str r6, [%[r], #112]\n\t"
  186888. "str r7, [%[r], #116]\n\t"
  186889. "ldr r6, [%[r], #120]\n\t"
  186890. "ldr r7, [%[r], #124]\n\t"
  186891. "ldr r4, [%[m], #120]\n\t"
  186892. "ldr r5, [%[m], #124]\n\t"
  186893. #ifdef WOLFSSL_KEIL
  186894. "ands r4, r4, r3\n\t"
  186895. #elif defined(__clang__)
  186896. "ands r4, r3\n\t"
  186897. #else
  186898. "and r4, r3\n\t"
  186899. #endif
  186900. #ifdef WOLFSSL_KEIL
  186901. "ands r5, r5, r3\n\t"
  186902. #elif defined(__clang__)
  186903. "ands r5, r3\n\t"
  186904. #else
  186905. "and r5, r3\n\t"
  186906. #endif
  186907. #ifdef WOLFSSL_KEIL
  186908. "sbcs r6, r6, r4\n\t"
  186909. #elif defined(__clang__)
  186910. "sbcs r6, r4\n\t"
  186911. #else
  186912. "sbc r6, r4\n\t"
  186913. #endif
  186914. #ifdef WOLFSSL_KEIL
  186915. "sbcs r7, r7, r5\n\t"
  186916. #elif defined(__clang__)
  186917. "sbcs r7, r5\n\t"
  186918. #else
  186919. "sbc r7, r5\n\t"
  186920. #endif
  186921. "str r6, [%[r], #120]\n\t"
  186922. "str r7, [%[r], #124]\n\t"
  186923. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  186924. :
  186925. : "memory", "r3", "r4", "r5", "r6", "r7"
  186926. );
  186927. }
  186928. /* Subtract two Montgomery form numbers (r = a - b % m).
  186929. *
  186930. * r Result of subtration.
  186931. * a Number to subtract from in Montgomery form.
  186932. * b Number to subtract with in Montgomery form.
  186933. * m Modulus (prime).
  186934. */
  186935. SP_NOINLINE static void sp_1024_mont_sub_32(sp_digit* r, const sp_digit* a,
  186936. const sp_digit* b, const sp_digit* m)
  186937. {
  186938. __asm__ __volatile__ (
  186939. "ldr r4, [%[a]]\n\t"
  186940. "ldr r5, [%[a], #4]\n\t"
  186941. "ldr r6, [%[b]]\n\t"
  186942. "ldr r7, [%[b], #4]\n\t"
  186943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186944. "subs r4, r4, r6\n\t"
  186945. #else
  186946. "sub r4, r4, r6\n\t"
  186947. #endif
  186948. #ifdef WOLFSSL_KEIL
  186949. "sbcs r5, r5, r7\n\t"
  186950. #elif defined(__clang__)
  186951. "sbcs r5, r7\n\t"
  186952. #else
  186953. "sbc r5, r7\n\t"
  186954. #endif
  186955. "str r4, [%[r]]\n\t"
  186956. "str r5, [%[r], #4]\n\t"
  186957. "ldr r4, [%[a], #8]\n\t"
  186958. "ldr r5, [%[a], #12]\n\t"
  186959. "ldr r6, [%[b], #8]\n\t"
  186960. "ldr r7, [%[b], #12]\n\t"
  186961. #ifdef WOLFSSL_KEIL
  186962. "sbcs r4, r4, r6\n\t"
  186963. #elif defined(__clang__)
  186964. "sbcs r4, r6\n\t"
  186965. #else
  186966. "sbc r4, r6\n\t"
  186967. #endif
  186968. #ifdef WOLFSSL_KEIL
  186969. "sbcs r5, r5, r7\n\t"
  186970. #elif defined(__clang__)
  186971. "sbcs r5, r7\n\t"
  186972. #else
  186973. "sbc r5, r7\n\t"
  186974. #endif
  186975. "str r4, [%[r], #8]\n\t"
  186976. "str r5, [%[r], #12]\n\t"
  186977. "ldr r4, [%[a], #16]\n\t"
  186978. "ldr r5, [%[a], #20]\n\t"
  186979. "ldr r6, [%[b], #16]\n\t"
  186980. "ldr r7, [%[b], #20]\n\t"
  186981. #ifdef WOLFSSL_KEIL
  186982. "sbcs r4, r4, r6\n\t"
  186983. #elif defined(__clang__)
  186984. "sbcs r4, r6\n\t"
  186985. #else
  186986. "sbc r4, r6\n\t"
  186987. #endif
  186988. #ifdef WOLFSSL_KEIL
  186989. "sbcs r5, r5, r7\n\t"
  186990. #elif defined(__clang__)
  186991. "sbcs r5, r7\n\t"
  186992. #else
  186993. "sbc r5, r7\n\t"
  186994. #endif
  186995. "str r4, [%[r], #16]\n\t"
  186996. "str r5, [%[r], #20]\n\t"
  186997. "ldr r4, [%[a], #24]\n\t"
  186998. "ldr r5, [%[a], #28]\n\t"
  186999. "ldr r6, [%[b], #24]\n\t"
  187000. "ldr r7, [%[b], #28]\n\t"
  187001. #ifdef WOLFSSL_KEIL
  187002. "sbcs r4, r4, r6\n\t"
  187003. #elif defined(__clang__)
  187004. "sbcs r4, r6\n\t"
  187005. #else
  187006. "sbc r4, r6\n\t"
  187007. #endif
  187008. #ifdef WOLFSSL_KEIL
  187009. "sbcs r5, r5, r7\n\t"
  187010. #elif defined(__clang__)
  187011. "sbcs r5, r7\n\t"
  187012. #else
  187013. "sbc r5, r7\n\t"
  187014. #endif
  187015. "str r4, [%[r], #24]\n\t"
  187016. "str r5, [%[r], #28]\n\t"
  187017. "ldr r4, [%[a], #32]\n\t"
  187018. "ldr r5, [%[a], #36]\n\t"
  187019. "ldr r6, [%[b], #32]\n\t"
  187020. "ldr r7, [%[b], #36]\n\t"
  187021. #ifdef WOLFSSL_KEIL
  187022. "sbcs r4, r4, r6\n\t"
  187023. #elif defined(__clang__)
  187024. "sbcs r4, r6\n\t"
  187025. #else
  187026. "sbc r4, r6\n\t"
  187027. #endif
  187028. #ifdef WOLFSSL_KEIL
  187029. "sbcs r5, r5, r7\n\t"
  187030. #elif defined(__clang__)
  187031. "sbcs r5, r7\n\t"
  187032. #else
  187033. "sbc r5, r7\n\t"
  187034. #endif
  187035. "str r4, [%[r], #32]\n\t"
  187036. "str r5, [%[r], #36]\n\t"
  187037. "ldr r4, [%[a], #40]\n\t"
  187038. "ldr r5, [%[a], #44]\n\t"
  187039. "ldr r6, [%[b], #40]\n\t"
  187040. "ldr r7, [%[b], #44]\n\t"
  187041. #ifdef WOLFSSL_KEIL
  187042. "sbcs r4, r4, r6\n\t"
  187043. #elif defined(__clang__)
  187044. "sbcs r4, r6\n\t"
  187045. #else
  187046. "sbc r4, r6\n\t"
  187047. #endif
  187048. #ifdef WOLFSSL_KEIL
  187049. "sbcs r5, r5, r7\n\t"
  187050. #elif defined(__clang__)
  187051. "sbcs r5, r7\n\t"
  187052. #else
  187053. "sbc r5, r7\n\t"
  187054. #endif
  187055. "str r4, [%[r], #40]\n\t"
  187056. "str r5, [%[r], #44]\n\t"
  187057. "ldr r4, [%[a], #48]\n\t"
  187058. "ldr r5, [%[a], #52]\n\t"
  187059. "ldr r6, [%[b], #48]\n\t"
  187060. "ldr r7, [%[b], #52]\n\t"
  187061. #ifdef WOLFSSL_KEIL
  187062. "sbcs r4, r4, r6\n\t"
  187063. #elif defined(__clang__)
  187064. "sbcs r4, r6\n\t"
  187065. #else
  187066. "sbc r4, r6\n\t"
  187067. #endif
  187068. #ifdef WOLFSSL_KEIL
  187069. "sbcs r5, r5, r7\n\t"
  187070. #elif defined(__clang__)
  187071. "sbcs r5, r7\n\t"
  187072. #else
  187073. "sbc r5, r7\n\t"
  187074. #endif
  187075. "str r4, [%[r], #48]\n\t"
  187076. "str r5, [%[r], #52]\n\t"
  187077. "ldr r4, [%[a], #56]\n\t"
  187078. "ldr r5, [%[a], #60]\n\t"
  187079. "ldr r6, [%[b], #56]\n\t"
  187080. "ldr r7, [%[b], #60]\n\t"
  187081. #ifdef WOLFSSL_KEIL
  187082. "sbcs r4, r4, r6\n\t"
  187083. #elif defined(__clang__)
  187084. "sbcs r4, r6\n\t"
  187085. #else
  187086. "sbc r4, r6\n\t"
  187087. #endif
  187088. #ifdef WOLFSSL_KEIL
  187089. "sbcs r5, r5, r7\n\t"
  187090. #elif defined(__clang__)
  187091. "sbcs r5, r7\n\t"
  187092. #else
  187093. "sbc r5, r7\n\t"
  187094. #endif
  187095. "str r4, [%[r], #56]\n\t"
  187096. "str r5, [%[r], #60]\n\t"
  187097. "ldr r4, [%[a], #64]\n\t"
  187098. "ldr r5, [%[a], #68]\n\t"
  187099. "ldr r6, [%[b], #64]\n\t"
  187100. "ldr r7, [%[b], #68]\n\t"
  187101. #ifdef WOLFSSL_KEIL
  187102. "sbcs r4, r4, r6\n\t"
  187103. #elif defined(__clang__)
  187104. "sbcs r4, r6\n\t"
  187105. #else
  187106. "sbc r4, r6\n\t"
  187107. #endif
  187108. #ifdef WOLFSSL_KEIL
  187109. "sbcs r5, r5, r7\n\t"
  187110. #elif defined(__clang__)
  187111. "sbcs r5, r7\n\t"
  187112. #else
  187113. "sbc r5, r7\n\t"
  187114. #endif
  187115. "str r4, [%[r], #64]\n\t"
  187116. "str r5, [%[r], #68]\n\t"
  187117. "ldr r4, [%[a], #72]\n\t"
  187118. "ldr r5, [%[a], #76]\n\t"
  187119. "ldr r6, [%[b], #72]\n\t"
  187120. "ldr r7, [%[b], #76]\n\t"
  187121. #ifdef WOLFSSL_KEIL
  187122. "sbcs r4, r4, r6\n\t"
  187123. #elif defined(__clang__)
  187124. "sbcs r4, r6\n\t"
  187125. #else
  187126. "sbc r4, r6\n\t"
  187127. #endif
  187128. #ifdef WOLFSSL_KEIL
  187129. "sbcs r5, r5, r7\n\t"
  187130. #elif defined(__clang__)
  187131. "sbcs r5, r7\n\t"
  187132. #else
  187133. "sbc r5, r7\n\t"
  187134. #endif
  187135. "str r4, [%[r], #72]\n\t"
  187136. "str r5, [%[r], #76]\n\t"
  187137. "ldr r4, [%[a], #80]\n\t"
  187138. "ldr r5, [%[a], #84]\n\t"
  187139. "ldr r6, [%[b], #80]\n\t"
  187140. "ldr r7, [%[b], #84]\n\t"
  187141. #ifdef WOLFSSL_KEIL
  187142. "sbcs r4, r4, r6\n\t"
  187143. #elif defined(__clang__)
  187144. "sbcs r4, r6\n\t"
  187145. #else
  187146. "sbc r4, r6\n\t"
  187147. #endif
  187148. #ifdef WOLFSSL_KEIL
  187149. "sbcs r5, r5, r7\n\t"
  187150. #elif defined(__clang__)
  187151. "sbcs r5, r7\n\t"
  187152. #else
  187153. "sbc r5, r7\n\t"
  187154. #endif
  187155. "str r4, [%[r], #80]\n\t"
  187156. "str r5, [%[r], #84]\n\t"
  187157. "ldr r4, [%[a], #88]\n\t"
  187158. "ldr r5, [%[a], #92]\n\t"
  187159. "ldr r6, [%[b], #88]\n\t"
  187160. "ldr r7, [%[b], #92]\n\t"
  187161. #ifdef WOLFSSL_KEIL
  187162. "sbcs r4, r4, r6\n\t"
  187163. #elif defined(__clang__)
  187164. "sbcs r4, r6\n\t"
  187165. #else
  187166. "sbc r4, r6\n\t"
  187167. #endif
  187168. #ifdef WOLFSSL_KEIL
  187169. "sbcs r5, r5, r7\n\t"
  187170. #elif defined(__clang__)
  187171. "sbcs r5, r7\n\t"
  187172. #else
  187173. "sbc r5, r7\n\t"
  187174. #endif
  187175. "str r4, [%[r], #88]\n\t"
  187176. "str r5, [%[r], #92]\n\t"
  187177. "ldr r4, [%[a], #96]\n\t"
  187178. "ldr r5, [%[a], #100]\n\t"
  187179. "ldr r6, [%[b], #96]\n\t"
  187180. "ldr r7, [%[b], #100]\n\t"
  187181. #ifdef WOLFSSL_KEIL
  187182. "sbcs r4, r4, r6\n\t"
  187183. #elif defined(__clang__)
  187184. "sbcs r4, r6\n\t"
  187185. #else
  187186. "sbc r4, r6\n\t"
  187187. #endif
  187188. #ifdef WOLFSSL_KEIL
  187189. "sbcs r5, r5, r7\n\t"
  187190. #elif defined(__clang__)
  187191. "sbcs r5, r7\n\t"
  187192. #else
  187193. "sbc r5, r7\n\t"
  187194. #endif
  187195. "str r4, [%[r], #96]\n\t"
  187196. "str r5, [%[r], #100]\n\t"
  187197. "ldr r4, [%[a], #104]\n\t"
  187198. "ldr r5, [%[a], #108]\n\t"
  187199. "ldr r6, [%[b], #104]\n\t"
  187200. "ldr r7, [%[b], #108]\n\t"
  187201. #ifdef WOLFSSL_KEIL
  187202. "sbcs r4, r4, r6\n\t"
  187203. #elif defined(__clang__)
  187204. "sbcs r4, r6\n\t"
  187205. #else
  187206. "sbc r4, r6\n\t"
  187207. #endif
  187208. #ifdef WOLFSSL_KEIL
  187209. "sbcs r5, r5, r7\n\t"
  187210. #elif defined(__clang__)
  187211. "sbcs r5, r7\n\t"
  187212. #else
  187213. "sbc r5, r7\n\t"
  187214. #endif
  187215. "str r4, [%[r], #104]\n\t"
  187216. "str r5, [%[r], #108]\n\t"
  187217. "ldr r4, [%[a], #112]\n\t"
  187218. "ldr r5, [%[a], #116]\n\t"
  187219. "ldr r6, [%[b], #112]\n\t"
  187220. "ldr r7, [%[b], #116]\n\t"
  187221. #ifdef WOLFSSL_KEIL
  187222. "sbcs r4, r4, r6\n\t"
  187223. #elif defined(__clang__)
  187224. "sbcs r4, r6\n\t"
  187225. #else
  187226. "sbc r4, r6\n\t"
  187227. #endif
  187228. #ifdef WOLFSSL_KEIL
  187229. "sbcs r5, r5, r7\n\t"
  187230. #elif defined(__clang__)
  187231. "sbcs r5, r7\n\t"
  187232. #else
  187233. "sbc r5, r7\n\t"
  187234. #endif
  187235. "str r4, [%[r], #112]\n\t"
  187236. "str r5, [%[r], #116]\n\t"
  187237. "ldr r4, [%[a], #120]\n\t"
  187238. "ldr r5, [%[a], #124]\n\t"
  187239. "ldr r6, [%[b], #120]\n\t"
  187240. "ldr r7, [%[b], #124]\n\t"
  187241. #ifdef WOLFSSL_KEIL
  187242. "sbcs r4, r4, r6\n\t"
  187243. #elif defined(__clang__)
  187244. "sbcs r4, r6\n\t"
  187245. #else
  187246. "sbc r4, r6\n\t"
  187247. #endif
  187248. #ifdef WOLFSSL_KEIL
  187249. "sbcs r5, r5, r7\n\t"
  187250. #elif defined(__clang__)
  187251. "sbcs r5, r7\n\t"
  187252. #else
  187253. "sbc r5, r7\n\t"
  187254. #endif
  187255. "str r4, [%[r], #120]\n\t"
  187256. "str r5, [%[r], #124]\n\t"
  187257. #ifdef WOLFSSL_KEIL
  187258. "sbcs %[b], %[b], %[b]\n\t"
  187259. #elif defined(__clang__)
  187260. "sbcs %[b], %[b]\n\t"
  187261. #else
  187262. "sbc %[b], %[b]\n\t"
  187263. #endif
  187264. "ldr r4, [%[r]]\n\t"
  187265. "ldr r5, [%[r], #4]\n\t"
  187266. "ldr r6, [%[m]]\n\t"
  187267. "ldr r7, [%[m], #4]\n\t"
  187268. #ifdef WOLFSSL_KEIL
  187269. "ands r6, r6, %[b]\n\t"
  187270. #elif defined(__clang__)
  187271. "ands r6, %[b]\n\t"
  187272. #else
  187273. "and r6, %[b]\n\t"
  187274. #endif
  187275. #ifdef WOLFSSL_KEIL
  187276. "ands r7, r7, %[b]\n\t"
  187277. #elif defined(__clang__)
  187278. "ands r7, %[b]\n\t"
  187279. #else
  187280. "and r7, %[b]\n\t"
  187281. #endif
  187282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187283. "adds r4, r4, r6\n\t"
  187284. #else
  187285. "add r4, r4, r6\n\t"
  187286. #endif
  187287. #ifdef WOLFSSL_KEIL
  187288. "adcs r5, r5, r7\n\t"
  187289. #elif defined(__clang__)
  187290. "adcs r5, r7\n\t"
  187291. #else
  187292. "adc r5, r7\n\t"
  187293. #endif
  187294. "str r4, [%[r]]\n\t"
  187295. "str r5, [%[r], #4]\n\t"
  187296. "ldr r4, [%[r], #8]\n\t"
  187297. "ldr r5, [%[r], #12]\n\t"
  187298. "ldr r6, [%[m], #8]\n\t"
  187299. "ldr r7, [%[m], #12]\n\t"
  187300. #ifdef WOLFSSL_KEIL
  187301. "ands r6, r6, %[b]\n\t"
  187302. #elif defined(__clang__)
  187303. "ands r6, %[b]\n\t"
  187304. #else
  187305. "and r6, %[b]\n\t"
  187306. #endif
  187307. #ifdef WOLFSSL_KEIL
  187308. "ands r7, r7, %[b]\n\t"
  187309. #elif defined(__clang__)
  187310. "ands r7, %[b]\n\t"
  187311. #else
  187312. "and r7, %[b]\n\t"
  187313. #endif
  187314. #ifdef WOLFSSL_KEIL
  187315. "adcs r4, r4, r6\n\t"
  187316. #elif defined(__clang__)
  187317. "adcs r4, r6\n\t"
  187318. #else
  187319. "adc r4, r6\n\t"
  187320. #endif
  187321. #ifdef WOLFSSL_KEIL
  187322. "adcs r5, r5, r7\n\t"
  187323. #elif defined(__clang__)
  187324. "adcs r5, r7\n\t"
  187325. #else
  187326. "adc r5, r7\n\t"
  187327. #endif
  187328. "str r4, [%[r], #8]\n\t"
  187329. "str r5, [%[r], #12]\n\t"
  187330. "ldr r4, [%[r], #16]\n\t"
  187331. "ldr r5, [%[r], #20]\n\t"
  187332. "ldr r6, [%[m], #16]\n\t"
  187333. "ldr r7, [%[m], #20]\n\t"
  187334. #ifdef WOLFSSL_KEIL
  187335. "ands r6, r6, %[b]\n\t"
  187336. #elif defined(__clang__)
  187337. "ands r6, %[b]\n\t"
  187338. #else
  187339. "and r6, %[b]\n\t"
  187340. #endif
  187341. #ifdef WOLFSSL_KEIL
  187342. "ands r7, r7, %[b]\n\t"
  187343. #elif defined(__clang__)
  187344. "ands r7, %[b]\n\t"
  187345. #else
  187346. "and r7, %[b]\n\t"
  187347. #endif
  187348. #ifdef WOLFSSL_KEIL
  187349. "adcs r4, r4, r6\n\t"
  187350. #elif defined(__clang__)
  187351. "adcs r4, r6\n\t"
  187352. #else
  187353. "adc r4, r6\n\t"
  187354. #endif
  187355. #ifdef WOLFSSL_KEIL
  187356. "adcs r5, r5, r7\n\t"
  187357. #elif defined(__clang__)
  187358. "adcs r5, r7\n\t"
  187359. #else
  187360. "adc r5, r7\n\t"
  187361. #endif
  187362. "str r4, [%[r], #16]\n\t"
  187363. "str r5, [%[r], #20]\n\t"
  187364. "ldr r4, [%[r], #24]\n\t"
  187365. "ldr r5, [%[r], #28]\n\t"
  187366. "ldr r6, [%[m], #24]\n\t"
  187367. "ldr r7, [%[m], #28]\n\t"
  187368. #ifdef WOLFSSL_KEIL
  187369. "ands r6, r6, %[b]\n\t"
  187370. #elif defined(__clang__)
  187371. "ands r6, %[b]\n\t"
  187372. #else
  187373. "and r6, %[b]\n\t"
  187374. #endif
  187375. #ifdef WOLFSSL_KEIL
  187376. "ands r7, r7, %[b]\n\t"
  187377. #elif defined(__clang__)
  187378. "ands r7, %[b]\n\t"
  187379. #else
  187380. "and r7, %[b]\n\t"
  187381. #endif
  187382. #ifdef WOLFSSL_KEIL
  187383. "adcs r4, r4, r6\n\t"
  187384. #elif defined(__clang__)
  187385. "adcs r4, r6\n\t"
  187386. #else
  187387. "adc r4, r6\n\t"
  187388. #endif
  187389. #ifdef WOLFSSL_KEIL
  187390. "adcs r5, r5, r7\n\t"
  187391. #elif defined(__clang__)
  187392. "adcs r5, r7\n\t"
  187393. #else
  187394. "adc r5, r7\n\t"
  187395. #endif
  187396. "str r4, [%[r], #24]\n\t"
  187397. "str r5, [%[r], #28]\n\t"
  187398. "ldr r4, [%[r], #32]\n\t"
  187399. "ldr r5, [%[r], #36]\n\t"
  187400. "ldr r6, [%[m], #32]\n\t"
  187401. "ldr r7, [%[m], #36]\n\t"
  187402. #ifdef WOLFSSL_KEIL
  187403. "ands r6, r6, %[b]\n\t"
  187404. #elif defined(__clang__)
  187405. "ands r6, %[b]\n\t"
  187406. #else
  187407. "and r6, %[b]\n\t"
  187408. #endif
  187409. #ifdef WOLFSSL_KEIL
  187410. "ands r7, r7, %[b]\n\t"
  187411. #elif defined(__clang__)
  187412. "ands r7, %[b]\n\t"
  187413. #else
  187414. "and r7, %[b]\n\t"
  187415. #endif
  187416. #ifdef WOLFSSL_KEIL
  187417. "adcs r4, r4, r6\n\t"
  187418. #elif defined(__clang__)
  187419. "adcs r4, r6\n\t"
  187420. #else
  187421. "adc r4, r6\n\t"
  187422. #endif
  187423. #ifdef WOLFSSL_KEIL
  187424. "adcs r5, r5, r7\n\t"
  187425. #elif defined(__clang__)
  187426. "adcs r5, r7\n\t"
  187427. #else
  187428. "adc r5, r7\n\t"
  187429. #endif
  187430. "str r4, [%[r], #32]\n\t"
  187431. "str r5, [%[r], #36]\n\t"
  187432. "ldr r4, [%[r], #40]\n\t"
  187433. "ldr r5, [%[r], #44]\n\t"
  187434. "ldr r6, [%[m], #40]\n\t"
  187435. "ldr r7, [%[m], #44]\n\t"
  187436. #ifdef WOLFSSL_KEIL
  187437. "ands r6, r6, %[b]\n\t"
  187438. #elif defined(__clang__)
  187439. "ands r6, %[b]\n\t"
  187440. #else
  187441. "and r6, %[b]\n\t"
  187442. #endif
  187443. #ifdef WOLFSSL_KEIL
  187444. "ands r7, r7, %[b]\n\t"
  187445. #elif defined(__clang__)
  187446. "ands r7, %[b]\n\t"
  187447. #else
  187448. "and r7, %[b]\n\t"
  187449. #endif
  187450. #ifdef WOLFSSL_KEIL
  187451. "adcs r4, r4, r6\n\t"
  187452. #elif defined(__clang__)
  187453. "adcs r4, r6\n\t"
  187454. #else
  187455. "adc r4, r6\n\t"
  187456. #endif
  187457. #ifdef WOLFSSL_KEIL
  187458. "adcs r5, r5, r7\n\t"
  187459. #elif defined(__clang__)
  187460. "adcs r5, r7\n\t"
  187461. #else
  187462. "adc r5, r7\n\t"
  187463. #endif
  187464. "str r4, [%[r], #40]\n\t"
  187465. "str r5, [%[r], #44]\n\t"
  187466. "ldr r4, [%[r], #48]\n\t"
  187467. "ldr r5, [%[r], #52]\n\t"
  187468. "ldr r6, [%[m], #48]\n\t"
  187469. "ldr r7, [%[m], #52]\n\t"
  187470. #ifdef WOLFSSL_KEIL
  187471. "ands r6, r6, %[b]\n\t"
  187472. #elif defined(__clang__)
  187473. "ands r6, %[b]\n\t"
  187474. #else
  187475. "and r6, %[b]\n\t"
  187476. #endif
  187477. #ifdef WOLFSSL_KEIL
  187478. "ands r7, r7, %[b]\n\t"
  187479. #elif defined(__clang__)
  187480. "ands r7, %[b]\n\t"
  187481. #else
  187482. "and r7, %[b]\n\t"
  187483. #endif
  187484. #ifdef WOLFSSL_KEIL
  187485. "adcs r4, r4, r6\n\t"
  187486. #elif defined(__clang__)
  187487. "adcs r4, r6\n\t"
  187488. #else
  187489. "adc r4, r6\n\t"
  187490. #endif
  187491. #ifdef WOLFSSL_KEIL
  187492. "adcs r5, r5, r7\n\t"
  187493. #elif defined(__clang__)
  187494. "adcs r5, r7\n\t"
  187495. #else
  187496. "adc r5, r7\n\t"
  187497. #endif
  187498. "str r4, [%[r], #48]\n\t"
  187499. "str r5, [%[r], #52]\n\t"
  187500. "ldr r4, [%[r], #56]\n\t"
  187501. "ldr r5, [%[r], #60]\n\t"
  187502. "ldr r6, [%[m], #56]\n\t"
  187503. "ldr r7, [%[m], #60]\n\t"
  187504. #ifdef WOLFSSL_KEIL
  187505. "ands r6, r6, %[b]\n\t"
  187506. #elif defined(__clang__)
  187507. "ands r6, %[b]\n\t"
  187508. #else
  187509. "and r6, %[b]\n\t"
  187510. #endif
  187511. #ifdef WOLFSSL_KEIL
  187512. "ands r7, r7, %[b]\n\t"
  187513. #elif defined(__clang__)
  187514. "ands r7, %[b]\n\t"
  187515. #else
  187516. "and r7, %[b]\n\t"
  187517. #endif
  187518. #ifdef WOLFSSL_KEIL
  187519. "adcs r4, r4, r6\n\t"
  187520. #elif defined(__clang__)
  187521. "adcs r4, r6\n\t"
  187522. #else
  187523. "adc r4, r6\n\t"
  187524. #endif
  187525. #ifdef WOLFSSL_KEIL
  187526. "adcs r5, r5, r7\n\t"
  187527. #elif defined(__clang__)
  187528. "adcs r5, r7\n\t"
  187529. #else
  187530. "adc r5, r7\n\t"
  187531. #endif
  187532. "str r4, [%[r], #56]\n\t"
  187533. "str r5, [%[r], #60]\n\t"
  187534. "ldr r4, [%[r], #64]\n\t"
  187535. "ldr r5, [%[r], #68]\n\t"
  187536. "ldr r6, [%[m], #64]\n\t"
  187537. "ldr r7, [%[m], #68]\n\t"
  187538. #ifdef WOLFSSL_KEIL
  187539. "ands r6, r6, %[b]\n\t"
  187540. #elif defined(__clang__)
  187541. "ands r6, %[b]\n\t"
  187542. #else
  187543. "and r6, %[b]\n\t"
  187544. #endif
  187545. #ifdef WOLFSSL_KEIL
  187546. "ands r7, r7, %[b]\n\t"
  187547. #elif defined(__clang__)
  187548. "ands r7, %[b]\n\t"
  187549. #else
  187550. "and r7, %[b]\n\t"
  187551. #endif
  187552. #ifdef WOLFSSL_KEIL
  187553. "adcs r4, r4, r6\n\t"
  187554. #elif defined(__clang__)
  187555. "adcs r4, r6\n\t"
  187556. #else
  187557. "adc r4, r6\n\t"
  187558. #endif
  187559. #ifdef WOLFSSL_KEIL
  187560. "adcs r5, r5, r7\n\t"
  187561. #elif defined(__clang__)
  187562. "adcs r5, r7\n\t"
  187563. #else
  187564. "adc r5, r7\n\t"
  187565. #endif
  187566. "str r4, [%[r], #64]\n\t"
  187567. "str r5, [%[r], #68]\n\t"
  187568. "ldr r4, [%[r], #72]\n\t"
  187569. "ldr r5, [%[r], #76]\n\t"
  187570. "ldr r6, [%[m], #72]\n\t"
  187571. "ldr r7, [%[m], #76]\n\t"
  187572. #ifdef WOLFSSL_KEIL
  187573. "ands r6, r6, %[b]\n\t"
  187574. #elif defined(__clang__)
  187575. "ands r6, %[b]\n\t"
  187576. #else
  187577. "and r6, %[b]\n\t"
  187578. #endif
  187579. #ifdef WOLFSSL_KEIL
  187580. "ands r7, r7, %[b]\n\t"
  187581. #elif defined(__clang__)
  187582. "ands r7, %[b]\n\t"
  187583. #else
  187584. "and r7, %[b]\n\t"
  187585. #endif
  187586. #ifdef WOLFSSL_KEIL
  187587. "adcs r4, r4, r6\n\t"
  187588. #elif defined(__clang__)
  187589. "adcs r4, r6\n\t"
  187590. #else
  187591. "adc r4, r6\n\t"
  187592. #endif
  187593. #ifdef WOLFSSL_KEIL
  187594. "adcs r5, r5, r7\n\t"
  187595. #elif defined(__clang__)
  187596. "adcs r5, r7\n\t"
  187597. #else
  187598. "adc r5, r7\n\t"
  187599. #endif
  187600. "str r4, [%[r], #72]\n\t"
  187601. "str r5, [%[r], #76]\n\t"
  187602. "ldr r4, [%[r], #80]\n\t"
  187603. "ldr r5, [%[r], #84]\n\t"
  187604. "ldr r6, [%[m], #80]\n\t"
  187605. "ldr r7, [%[m], #84]\n\t"
  187606. #ifdef WOLFSSL_KEIL
  187607. "ands r6, r6, %[b]\n\t"
  187608. #elif defined(__clang__)
  187609. "ands r6, %[b]\n\t"
  187610. #else
  187611. "and r6, %[b]\n\t"
  187612. #endif
  187613. #ifdef WOLFSSL_KEIL
  187614. "ands r7, r7, %[b]\n\t"
  187615. #elif defined(__clang__)
  187616. "ands r7, %[b]\n\t"
  187617. #else
  187618. "and r7, %[b]\n\t"
  187619. #endif
  187620. #ifdef WOLFSSL_KEIL
  187621. "adcs r4, r4, r6\n\t"
  187622. #elif defined(__clang__)
  187623. "adcs r4, r6\n\t"
  187624. #else
  187625. "adc r4, r6\n\t"
  187626. #endif
  187627. #ifdef WOLFSSL_KEIL
  187628. "adcs r5, r5, r7\n\t"
  187629. #elif defined(__clang__)
  187630. "adcs r5, r7\n\t"
  187631. #else
  187632. "adc r5, r7\n\t"
  187633. #endif
  187634. "str r4, [%[r], #80]\n\t"
  187635. "str r5, [%[r], #84]\n\t"
  187636. "ldr r4, [%[r], #88]\n\t"
  187637. "ldr r5, [%[r], #92]\n\t"
  187638. "ldr r6, [%[m], #88]\n\t"
  187639. "ldr r7, [%[m], #92]\n\t"
  187640. #ifdef WOLFSSL_KEIL
  187641. "ands r6, r6, %[b]\n\t"
  187642. #elif defined(__clang__)
  187643. "ands r6, %[b]\n\t"
  187644. #else
  187645. "and r6, %[b]\n\t"
  187646. #endif
  187647. #ifdef WOLFSSL_KEIL
  187648. "ands r7, r7, %[b]\n\t"
  187649. #elif defined(__clang__)
  187650. "ands r7, %[b]\n\t"
  187651. #else
  187652. "and r7, %[b]\n\t"
  187653. #endif
  187654. #ifdef WOLFSSL_KEIL
  187655. "adcs r4, r4, r6\n\t"
  187656. #elif defined(__clang__)
  187657. "adcs r4, r6\n\t"
  187658. #else
  187659. "adc r4, r6\n\t"
  187660. #endif
  187661. #ifdef WOLFSSL_KEIL
  187662. "adcs r5, r5, r7\n\t"
  187663. #elif defined(__clang__)
  187664. "adcs r5, r7\n\t"
  187665. #else
  187666. "adc r5, r7\n\t"
  187667. #endif
  187668. "str r4, [%[r], #88]\n\t"
  187669. "str r5, [%[r], #92]\n\t"
  187670. "ldr r4, [%[r], #96]\n\t"
  187671. "ldr r5, [%[r], #100]\n\t"
  187672. "ldr r6, [%[m], #96]\n\t"
  187673. "ldr r7, [%[m], #100]\n\t"
  187674. #ifdef WOLFSSL_KEIL
  187675. "ands r6, r6, %[b]\n\t"
  187676. #elif defined(__clang__)
  187677. "ands r6, %[b]\n\t"
  187678. #else
  187679. "and r6, %[b]\n\t"
  187680. #endif
  187681. #ifdef WOLFSSL_KEIL
  187682. "ands r7, r7, %[b]\n\t"
  187683. #elif defined(__clang__)
  187684. "ands r7, %[b]\n\t"
  187685. #else
  187686. "and r7, %[b]\n\t"
  187687. #endif
  187688. #ifdef WOLFSSL_KEIL
  187689. "adcs r4, r4, r6\n\t"
  187690. #elif defined(__clang__)
  187691. "adcs r4, r6\n\t"
  187692. #else
  187693. "adc r4, r6\n\t"
  187694. #endif
  187695. #ifdef WOLFSSL_KEIL
  187696. "adcs r5, r5, r7\n\t"
  187697. #elif defined(__clang__)
  187698. "adcs r5, r7\n\t"
  187699. #else
  187700. "adc r5, r7\n\t"
  187701. #endif
  187702. "str r4, [%[r], #96]\n\t"
  187703. "str r5, [%[r], #100]\n\t"
  187704. "ldr r4, [%[r], #104]\n\t"
  187705. "ldr r5, [%[r], #108]\n\t"
  187706. "ldr r6, [%[m], #104]\n\t"
  187707. "ldr r7, [%[m], #108]\n\t"
  187708. #ifdef WOLFSSL_KEIL
  187709. "ands r6, r6, %[b]\n\t"
  187710. #elif defined(__clang__)
  187711. "ands r6, %[b]\n\t"
  187712. #else
  187713. "and r6, %[b]\n\t"
  187714. #endif
  187715. #ifdef WOLFSSL_KEIL
  187716. "ands r7, r7, %[b]\n\t"
  187717. #elif defined(__clang__)
  187718. "ands r7, %[b]\n\t"
  187719. #else
  187720. "and r7, %[b]\n\t"
  187721. #endif
  187722. #ifdef WOLFSSL_KEIL
  187723. "adcs r4, r4, r6\n\t"
  187724. #elif defined(__clang__)
  187725. "adcs r4, r6\n\t"
  187726. #else
  187727. "adc r4, r6\n\t"
  187728. #endif
  187729. #ifdef WOLFSSL_KEIL
  187730. "adcs r5, r5, r7\n\t"
  187731. #elif defined(__clang__)
  187732. "adcs r5, r7\n\t"
  187733. #else
  187734. "adc r5, r7\n\t"
  187735. #endif
  187736. "str r4, [%[r], #104]\n\t"
  187737. "str r5, [%[r], #108]\n\t"
  187738. "ldr r4, [%[r], #112]\n\t"
  187739. "ldr r5, [%[r], #116]\n\t"
  187740. "ldr r6, [%[m], #112]\n\t"
  187741. "ldr r7, [%[m], #116]\n\t"
  187742. #ifdef WOLFSSL_KEIL
  187743. "ands r6, r6, %[b]\n\t"
  187744. #elif defined(__clang__)
  187745. "ands r6, %[b]\n\t"
  187746. #else
  187747. "and r6, %[b]\n\t"
  187748. #endif
  187749. #ifdef WOLFSSL_KEIL
  187750. "ands r7, r7, %[b]\n\t"
  187751. #elif defined(__clang__)
  187752. "ands r7, %[b]\n\t"
  187753. #else
  187754. "and r7, %[b]\n\t"
  187755. #endif
  187756. #ifdef WOLFSSL_KEIL
  187757. "adcs r4, r4, r6\n\t"
  187758. #elif defined(__clang__)
  187759. "adcs r4, r6\n\t"
  187760. #else
  187761. "adc r4, r6\n\t"
  187762. #endif
  187763. #ifdef WOLFSSL_KEIL
  187764. "adcs r5, r5, r7\n\t"
  187765. #elif defined(__clang__)
  187766. "adcs r5, r7\n\t"
  187767. #else
  187768. "adc r5, r7\n\t"
  187769. #endif
  187770. "str r4, [%[r], #112]\n\t"
  187771. "str r5, [%[r], #116]\n\t"
  187772. "ldr r4, [%[r], #120]\n\t"
  187773. "ldr r5, [%[r], #124]\n\t"
  187774. "ldr r6, [%[m], #120]\n\t"
  187775. "ldr r7, [%[m], #124]\n\t"
  187776. #ifdef WOLFSSL_KEIL
  187777. "ands r6, r6, %[b]\n\t"
  187778. #elif defined(__clang__)
  187779. "ands r6, %[b]\n\t"
  187780. #else
  187781. "and r6, %[b]\n\t"
  187782. #endif
  187783. #ifdef WOLFSSL_KEIL
  187784. "ands r7, r7, %[b]\n\t"
  187785. #elif defined(__clang__)
  187786. "ands r7, %[b]\n\t"
  187787. #else
  187788. "and r7, %[b]\n\t"
  187789. #endif
  187790. #ifdef WOLFSSL_KEIL
  187791. "adcs r4, r4, r6\n\t"
  187792. #elif defined(__clang__)
  187793. "adcs r4, r6\n\t"
  187794. #else
  187795. "adc r4, r6\n\t"
  187796. #endif
  187797. #ifdef WOLFSSL_KEIL
  187798. "adcs r5, r5, r7\n\t"
  187799. #elif defined(__clang__)
  187800. "adcs r5, r7\n\t"
  187801. #else
  187802. "adc r5, r7\n\t"
  187803. #endif
  187804. "str r4, [%[r], #120]\n\t"
  187805. "str r5, [%[r], #124]\n\t"
  187806. "movs r6, #0\n\t"
  187807. #ifdef WOLFSSL_KEIL
  187808. "adcs %[b], %[b], r6\n\t"
  187809. #elif defined(__clang__)
  187810. "adcs %[b], r6\n\t"
  187811. #else
  187812. "adc %[b], r6\n\t"
  187813. #endif
  187814. "ldr r4, [%[r]]\n\t"
  187815. "ldr r5, [%[r], #4]\n\t"
  187816. "ldr r6, [%[m]]\n\t"
  187817. "ldr r7, [%[m], #4]\n\t"
  187818. #ifdef WOLFSSL_KEIL
  187819. "ands r6, r6, %[b]\n\t"
  187820. #elif defined(__clang__)
  187821. "ands r6, %[b]\n\t"
  187822. #else
  187823. "and r6, %[b]\n\t"
  187824. #endif
  187825. #ifdef WOLFSSL_KEIL
  187826. "ands r7, r7, %[b]\n\t"
  187827. #elif defined(__clang__)
  187828. "ands r7, %[b]\n\t"
  187829. #else
  187830. "and r7, %[b]\n\t"
  187831. #endif
  187832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187833. "adds r4, r4, r6\n\t"
  187834. #else
  187835. "add r4, r4, r6\n\t"
  187836. #endif
  187837. #ifdef WOLFSSL_KEIL
  187838. "adcs r5, r5, r7\n\t"
  187839. #elif defined(__clang__)
  187840. "adcs r5, r7\n\t"
  187841. #else
  187842. "adc r5, r7\n\t"
  187843. #endif
  187844. "str r4, [%[r]]\n\t"
  187845. "str r5, [%[r], #4]\n\t"
  187846. "ldr r4, [%[r], #8]\n\t"
  187847. "ldr r5, [%[r], #12]\n\t"
  187848. "ldr r6, [%[m], #8]\n\t"
  187849. "ldr r7, [%[m], #12]\n\t"
  187850. #ifdef WOLFSSL_KEIL
  187851. "ands r6, r6, %[b]\n\t"
  187852. #elif defined(__clang__)
  187853. "ands r6, %[b]\n\t"
  187854. #else
  187855. "and r6, %[b]\n\t"
  187856. #endif
  187857. #ifdef WOLFSSL_KEIL
  187858. "ands r7, r7, %[b]\n\t"
  187859. #elif defined(__clang__)
  187860. "ands r7, %[b]\n\t"
  187861. #else
  187862. "and r7, %[b]\n\t"
  187863. #endif
  187864. #ifdef WOLFSSL_KEIL
  187865. "adcs r4, r4, r6\n\t"
  187866. #elif defined(__clang__)
  187867. "adcs r4, r6\n\t"
  187868. #else
  187869. "adc r4, r6\n\t"
  187870. #endif
  187871. #ifdef WOLFSSL_KEIL
  187872. "adcs r5, r5, r7\n\t"
  187873. #elif defined(__clang__)
  187874. "adcs r5, r7\n\t"
  187875. #else
  187876. "adc r5, r7\n\t"
  187877. #endif
  187878. "str r4, [%[r], #8]\n\t"
  187879. "str r5, [%[r], #12]\n\t"
  187880. "ldr r4, [%[r], #16]\n\t"
  187881. "ldr r5, [%[r], #20]\n\t"
  187882. "ldr r6, [%[m], #16]\n\t"
  187883. "ldr r7, [%[m], #20]\n\t"
  187884. #ifdef WOLFSSL_KEIL
  187885. "ands r6, r6, %[b]\n\t"
  187886. #elif defined(__clang__)
  187887. "ands r6, %[b]\n\t"
  187888. #else
  187889. "and r6, %[b]\n\t"
  187890. #endif
  187891. #ifdef WOLFSSL_KEIL
  187892. "ands r7, r7, %[b]\n\t"
  187893. #elif defined(__clang__)
  187894. "ands r7, %[b]\n\t"
  187895. #else
  187896. "and r7, %[b]\n\t"
  187897. #endif
  187898. #ifdef WOLFSSL_KEIL
  187899. "adcs r4, r4, r6\n\t"
  187900. #elif defined(__clang__)
  187901. "adcs r4, r6\n\t"
  187902. #else
  187903. "adc r4, r6\n\t"
  187904. #endif
  187905. #ifdef WOLFSSL_KEIL
  187906. "adcs r5, r5, r7\n\t"
  187907. #elif defined(__clang__)
  187908. "adcs r5, r7\n\t"
  187909. #else
  187910. "adc r5, r7\n\t"
  187911. #endif
  187912. "str r4, [%[r], #16]\n\t"
  187913. "str r5, [%[r], #20]\n\t"
  187914. "ldr r4, [%[r], #24]\n\t"
  187915. "ldr r5, [%[r], #28]\n\t"
  187916. "ldr r6, [%[m], #24]\n\t"
  187917. "ldr r7, [%[m], #28]\n\t"
  187918. #ifdef WOLFSSL_KEIL
  187919. "ands r6, r6, %[b]\n\t"
  187920. #elif defined(__clang__)
  187921. "ands r6, %[b]\n\t"
  187922. #else
  187923. "and r6, %[b]\n\t"
  187924. #endif
  187925. #ifdef WOLFSSL_KEIL
  187926. "ands r7, r7, %[b]\n\t"
  187927. #elif defined(__clang__)
  187928. "ands r7, %[b]\n\t"
  187929. #else
  187930. "and r7, %[b]\n\t"
  187931. #endif
  187932. #ifdef WOLFSSL_KEIL
  187933. "adcs r4, r4, r6\n\t"
  187934. #elif defined(__clang__)
  187935. "adcs r4, r6\n\t"
  187936. #else
  187937. "adc r4, r6\n\t"
  187938. #endif
  187939. #ifdef WOLFSSL_KEIL
  187940. "adcs r5, r5, r7\n\t"
  187941. #elif defined(__clang__)
  187942. "adcs r5, r7\n\t"
  187943. #else
  187944. "adc r5, r7\n\t"
  187945. #endif
  187946. "str r4, [%[r], #24]\n\t"
  187947. "str r5, [%[r], #28]\n\t"
  187948. "ldr r4, [%[r], #32]\n\t"
  187949. "ldr r5, [%[r], #36]\n\t"
  187950. "ldr r6, [%[m], #32]\n\t"
  187951. "ldr r7, [%[m], #36]\n\t"
  187952. #ifdef WOLFSSL_KEIL
  187953. "ands r6, r6, %[b]\n\t"
  187954. #elif defined(__clang__)
  187955. "ands r6, %[b]\n\t"
  187956. #else
  187957. "and r6, %[b]\n\t"
  187958. #endif
  187959. #ifdef WOLFSSL_KEIL
  187960. "ands r7, r7, %[b]\n\t"
  187961. #elif defined(__clang__)
  187962. "ands r7, %[b]\n\t"
  187963. #else
  187964. "and r7, %[b]\n\t"
  187965. #endif
  187966. #ifdef WOLFSSL_KEIL
  187967. "adcs r4, r4, r6\n\t"
  187968. #elif defined(__clang__)
  187969. "adcs r4, r6\n\t"
  187970. #else
  187971. "adc r4, r6\n\t"
  187972. #endif
  187973. #ifdef WOLFSSL_KEIL
  187974. "adcs r5, r5, r7\n\t"
  187975. #elif defined(__clang__)
  187976. "adcs r5, r7\n\t"
  187977. #else
  187978. "adc r5, r7\n\t"
  187979. #endif
  187980. "str r4, [%[r], #32]\n\t"
  187981. "str r5, [%[r], #36]\n\t"
  187982. "ldr r4, [%[r], #40]\n\t"
  187983. "ldr r5, [%[r], #44]\n\t"
  187984. "ldr r6, [%[m], #40]\n\t"
  187985. "ldr r7, [%[m], #44]\n\t"
  187986. #ifdef WOLFSSL_KEIL
  187987. "ands r6, r6, %[b]\n\t"
  187988. #elif defined(__clang__)
  187989. "ands r6, %[b]\n\t"
  187990. #else
  187991. "and r6, %[b]\n\t"
  187992. #endif
  187993. #ifdef WOLFSSL_KEIL
  187994. "ands r7, r7, %[b]\n\t"
  187995. #elif defined(__clang__)
  187996. "ands r7, %[b]\n\t"
  187997. #else
  187998. "and r7, %[b]\n\t"
  187999. #endif
  188000. #ifdef WOLFSSL_KEIL
  188001. "adcs r4, r4, r6\n\t"
  188002. #elif defined(__clang__)
  188003. "adcs r4, r6\n\t"
  188004. #else
  188005. "adc r4, r6\n\t"
  188006. #endif
  188007. #ifdef WOLFSSL_KEIL
  188008. "adcs r5, r5, r7\n\t"
  188009. #elif defined(__clang__)
  188010. "adcs r5, r7\n\t"
  188011. #else
  188012. "adc r5, r7\n\t"
  188013. #endif
  188014. "str r4, [%[r], #40]\n\t"
  188015. "str r5, [%[r], #44]\n\t"
  188016. "ldr r4, [%[r], #48]\n\t"
  188017. "ldr r5, [%[r], #52]\n\t"
  188018. "ldr r6, [%[m], #48]\n\t"
  188019. "ldr r7, [%[m], #52]\n\t"
  188020. #ifdef WOLFSSL_KEIL
  188021. "ands r6, r6, %[b]\n\t"
  188022. #elif defined(__clang__)
  188023. "ands r6, %[b]\n\t"
  188024. #else
  188025. "and r6, %[b]\n\t"
  188026. #endif
  188027. #ifdef WOLFSSL_KEIL
  188028. "ands r7, r7, %[b]\n\t"
  188029. #elif defined(__clang__)
  188030. "ands r7, %[b]\n\t"
  188031. #else
  188032. "and r7, %[b]\n\t"
  188033. #endif
  188034. #ifdef WOLFSSL_KEIL
  188035. "adcs r4, r4, r6\n\t"
  188036. #elif defined(__clang__)
  188037. "adcs r4, r6\n\t"
  188038. #else
  188039. "adc r4, r6\n\t"
  188040. #endif
  188041. #ifdef WOLFSSL_KEIL
  188042. "adcs r5, r5, r7\n\t"
  188043. #elif defined(__clang__)
  188044. "adcs r5, r7\n\t"
  188045. #else
  188046. "adc r5, r7\n\t"
  188047. #endif
  188048. "str r4, [%[r], #48]\n\t"
  188049. "str r5, [%[r], #52]\n\t"
  188050. "ldr r4, [%[r], #56]\n\t"
  188051. "ldr r5, [%[r], #60]\n\t"
  188052. "ldr r6, [%[m], #56]\n\t"
  188053. "ldr r7, [%[m], #60]\n\t"
  188054. #ifdef WOLFSSL_KEIL
  188055. "ands r6, r6, %[b]\n\t"
  188056. #elif defined(__clang__)
  188057. "ands r6, %[b]\n\t"
  188058. #else
  188059. "and r6, %[b]\n\t"
  188060. #endif
  188061. #ifdef WOLFSSL_KEIL
  188062. "ands r7, r7, %[b]\n\t"
  188063. #elif defined(__clang__)
  188064. "ands r7, %[b]\n\t"
  188065. #else
  188066. "and r7, %[b]\n\t"
  188067. #endif
  188068. #ifdef WOLFSSL_KEIL
  188069. "adcs r4, r4, r6\n\t"
  188070. #elif defined(__clang__)
  188071. "adcs r4, r6\n\t"
  188072. #else
  188073. "adc r4, r6\n\t"
  188074. #endif
  188075. #ifdef WOLFSSL_KEIL
  188076. "adcs r5, r5, r7\n\t"
  188077. #elif defined(__clang__)
  188078. "adcs r5, r7\n\t"
  188079. #else
  188080. "adc r5, r7\n\t"
  188081. #endif
  188082. "str r4, [%[r], #56]\n\t"
  188083. "str r5, [%[r], #60]\n\t"
  188084. "ldr r4, [%[r], #64]\n\t"
  188085. "ldr r5, [%[r], #68]\n\t"
  188086. "ldr r6, [%[m], #64]\n\t"
  188087. "ldr r7, [%[m], #68]\n\t"
  188088. #ifdef WOLFSSL_KEIL
  188089. "ands r6, r6, %[b]\n\t"
  188090. #elif defined(__clang__)
  188091. "ands r6, %[b]\n\t"
  188092. #else
  188093. "and r6, %[b]\n\t"
  188094. #endif
  188095. #ifdef WOLFSSL_KEIL
  188096. "ands r7, r7, %[b]\n\t"
  188097. #elif defined(__clang__)
  188098. "ands r7, %[b]\n\t"
  188099. #else
  188100. "and r7, %[b]\n\t"
  188101. #endif
  188102. #ifdef WOLFSSL_KEIL
  188103. "adcs r4, r4, r6\n\t"
  188104. #elif defined(__clang__)
  188105. "adcs r4, r6\n\t"
  188106. #else
  188107. "adc r4, r6\n\t"
  188108. #endif
  188109. #ifdef WOLFSSL_KEIL
  188110. "adcs r5, r5, r7\n\t"
  188111. #elif defined(__clang__)
  188112. "adcs r5, r7\n\t"
  188113. #else
  188114. "adc r5, r7\n\t"
  188115. #endif
  188116. "str r4, [%[r], #64]\n\t"
  188117. "str r5, [%[r], #68]\n\t"
  188118. "ldr r4, [%[r], #72]\n\t"
  188119. "ldr r5, [%[r], #76]\n\t"
  188120. "ldr r6, [%[m], #72]\n\t"
  188121. "ldr r7, [%[m], #76]\n\t"
  188122. #ifdef WOLFSSL_KEIL
  188123. "ands r6, r6, %[b]\n\t"
  188124. #elif defined(__clang__)
  188125. "ands r6, %[b]\n\t"
  188126. #else
  188127. "and r6, %[b]\n\t"
  188128. #endif
  188129. #ifdef WOLFSSL_KEIL
  188130. "ands r7, r7, %[b]\n\t"
  188131. #elif defined(__clang__)
  188132. "ands r7, %[b]\n\t"
  188133. #else
  188134. "and r7, %[b]\n\t"
  188135. #endif
  188136. #ifdef WOLFSSL_KEIL
  188137. "adcs r4, r4, r6\n\t"
  188138. #elif defined(__clang__)
  188139. "adcs r4, r6\n\t"
  188140. #else
  188141. "adc r4, r6\n\t"
  188142. #endif
  188143. #ifdef WOLFSSL_KEIL
  188144. "adcs r5, r5, r7\n\t"
  188145. #elif defined(__clang__)
  188146. "adcs r5, r7\n\t"
  188147. #else
  188148. "adc r5, r7\n\t"
  188149. #endif
  188150. "str r4, [%[r], #72]\n\t"
  188151. "str r5, [%[r], #76]\n\t"
  188152. "ldr r4, [%[r], #80]\n\t"
  188153. "ldr r5, [%[r], #84]\n\t"
  188154. "ldr r6, [%[m], #80]\n\t"
  188155. "ldr r7, [%[m], #84]\n\t"
  188156. #ifdef WOLFSSL_KEIL
  188157. "ands r6, r6, %[b]\n\t"
  188158. #elif defined(__clang__)
  188159. "ands r6, %[b]\n\t"
  188160. #else
  188161. "and r6, %[b]\n\t"
  188162. #endif
  188163. #ifdef WOLFSSL_KEIL
  188164. "ands r7, r7, %[b]\n\t"
  188165. #elif defined(__clang__)
  188166. "ands r7, %[b]\n\t"
  188167. #else
  188168. "and r7, %[b]\n\t"
  188169. #endif
  188170. #ifdef WOLFSSL_KEIL
  188171. "adcs r4, r4, r6\n\t"
  188172. #elif defined(__clang__)
  188173. "adcs r4, r6\n\t"
  188174. #else
  188175. "adc r4, r6\n\t"
  188176. #endif
  188177. #ifdef WOLFSSL_KEIL
  188178. "adcs r5, r5, r7\n\t"
  188179. #elif defined(__clang__)
  188180. "adcs r5, r7\n\t"
  188181. #else
  188182. "adc r5, r7\n\t"
  188183. #endif
  188184. "str r4, [%[r], #80]\n\t"
  188185. "str r5, [%[r], #84]\n\t"
  188186. "ldr r4, [%[r], #88]\n\t"
  188187. "ldr r5, [%[r], #92]\n\t"
  188188. "ldr r6, [%[m], #88]\n\t"
  188189. "ldr r7, [%[m], #92]\n\t"
  188190. #ifdef WOLFSSL_KEIL
  188191. "ands r6, r6, %[b]\n\t"
  188192. #elif defined(__clang__)
  188193. "ands r6, %[b]\n\t"
  188194. #else
  188195. "and r6, %[b]\n\t"
  188196. #endif
  188197. #ifdef WOLFSSL_KEIL
  188198. "ands r7, r7, %[b]\n\t"
  188199. #elif defined(__clang__)
  188200. "ands r7, %[b]\n\t"
  188201. #else
  188202. "and r7, %[b]\n\t"
  188203. #endif
  188204. #ifdef WOLFSSL_KEIL
  188205. "adcs r4, r4, r6\n\t"
  188206. #elif defined(__clang__)
  188207. "adcs r4, r6\n\t"
  188208. #else
  188209. "adc r4, r6\n\t"
  188210. #endif
  188211. #ifdef WOLFSSL_KEIL
  188212. "adcs r5, r5, r7\n\t"
  188213. #elif defined(__clang__)
  188214. "adcs r5, r7\n\t"
  188215. #else
  188216. "adc r5, r7\n\t"
  188217. #endif
  188218. "str r4, [%[r], #88]\n\t"
  188219. "str r5, [%[r], #92]\n\t"
  188220. "ldr r4, [%[r], #96]\n\t"
  188221. "ldr r5, [%[r], #100]\n\t"
  188222. "ldr r6, [%[m], #96]\n\t"
  188223. "ldr r7, [%[m], #100]\n\t"
  188224. #ifdef WOLFSSL_KEIL
  188225. "ands r6, r6, %[b]\n\t"
  188226. #elif defined(__clang__)
  188227. "ands r6, %[b]\n\t"
  188228. #else
  188229. "and r6, %[b]\n\t"
  188230. #endif
  188231. #ifdef WOLFSSL_KEIL
  188232. "ands r7, r7, %[b]\n\t"
  188233. #elif defined(__clang__)
  188234. "ands r7, %[b]\n\t"
  188235. #else
  188236. "and r7, %[b]\n\t"
  188237. #endif
  188238. #ifdef WOLFSSL_KEIL
  188239. "adcs r4, r4, r6\n\t"
  188240. #elif defined(__clang__)
  188241. "adcs r4, r6\n\t"
  188242. #else
  188243. "adc r4, r6\n\t"
  188244. #endif
  188245. #ifdef WOLFSSL_KEIL
  188246. "adcs r5, r5, r7\n\t"
  188247. #elif defined(__clang__)
  188248. "adcs r5, r7\n\t"
  188249. #else
  188250. "adc r5, r7\n\t"
  188251. #endif
  188252. "str r4, [%[r], #96]\n\t"
  188253. "str r5, [%[r], #100]\n\t"
  188254. "ldr r4, [%[r], #104]\n\t"
  188255. "ldr r5, [%[r], #108]\n\t"
  188256. "ldr r6, [%[m], #104]\n\t"
  188257. "ldr r7, [%[m], #108]\n\t"
  188258. #ifdef WOLFSSL_KEIL
  188259. "ands r6, r6, %[b]\n\t"
  188260. #elif defined(__clang__)
  188261. "ands r6, %[b]\n\t"
  188262. #else
  188263. "and r6, %[b]\n\t"
  188264. #endif
  188265. #ifdef WOLFSSL_KEIL
  188266. "ands r7, r7, %[b]\n\t"
  188267. #elif defined(__clang__)
  188268. "ands r7, %[b]\n\t"
  188269. #else
  188270. "and r7, %[b]\n\t"
  188271. #endif
  188272. #ifdef WOLFSSL_KEIL
  188273. "adcs r4, r4, r6\n\t"
  188274. #elif defined(__clang__)
  188275. "adcs r4, r6\n\t"
  188276. #else
  188277. "adc r4, r6\n\t"
  188278. #endif
  188279. #ifdef WOLFSSL_KEIL
  188280. "adcs r5, r5, r7\n\t"
  188281. #elif defined(__clang__)
  188282. "adcs r5, r7\n\t"
  188283. #else
  188284. "adc r5, r7\n\t"
  188285. #endif
  188286. "str r4, [%[r], #104]\n\t"
  188287. "str r5, [%[r], #108]\n\t"
  188288. "ldr r4, [%[r], #112]\n\t"
  188289. "ldr r5, [%[r], #116]\n\t"
  188290. "ldr r6, [%[m], #112]\n\t"
  188291. "ldr r7, [%[m], #116]\n\t"
  188292. #ifdef WOLFSSL_KEIL
  188293. "ands r6, r6, %[b]\n\t"
  188294. #elif defined(__clang__)
  188295. "ands r6, %[b]\n\t"
  188296. #else
  188297. "and r6, %[b]\n\t"
  188298. #endif
  188299. #ifdef WOLFSSL_KEIL
  188300. "ands r7, r7, %[b]\n\t"
  188301. #elif defined(__clang__)
  188302. "ands r7, %[b]\n\t"
  188303. #else
  188304. "and r7, %[b]\n\t"
  188305. #endif
  188306. #ifdef WOLFSSL_KEIL
  188307. "adcs r4, r4, r6\n\t"
  188308. #elif defined(__clang__)
  188309. "adcs r4, r6\n\t"
  188310. #else
  188311. "adc r4, r6\n\t"
  188312. #endif
  188313. #ifdef WOLFSSL_KEIL
  188314. "adcs r5, r5, r7\n\t"
  188315. #elif defined(__clang__)
  188316. "adcs r5, r7\n\t"
  188317. #else
  188318. "adc r5, r7\n\t"
  188319. #endif
  188320. "str r4, [%[r], #112]\n\t"
  188321. "str r5, [%[r], #116]\n\t"
  188322. "ldr r4, [%[r], #120]\n\t"
  188323. "ldr r5, [%[r], #124]\n\t"
  188324. "ldr r6, [%[m], #120]\n\t"
  188325. "ldr r7, [%[m], #124]\n\t"
  188326. #ifdef WOLFSSL_KEIL
  188327. "ands r6, r6, %[b]\n\t"
  188328. #elif defined(__clang__)
  188329. "ands r6, %[b]\n\t"
  188330. #else
  188331. "and r6, %[b]\n\t"
  188332. #endif
  188333. #ifdef WOLFSSL_KEIL
  188334. "ands r7, r7, %[b]\n\t"
  188335. #elif defined(__clang__)
  188336. "ands r7, %[b]\n\t"
  188337. #else
  188338. "and r7, %[b]\n\t"
  188339. #endif
  188340. #ifdef WOLFSSL_KEIL
  188341. "adcs r4, r4, r6\n\t"
  188342. #elif defined(__clang__)
  188343. "adcs r4, r6\n\t"
  188344. #else
  188345. "adc r4, r6\n\t"
  188346. #endif
  188347. #ifdef WOLFSSL_KEIL
  188348. "adcs r5, r5, r7\n\t"
  188349. #elif defined(__clang__)
  188350. "adcs r5, r7\n\t"
  188351. #else
  188352. "adc r5, r7\n\t"
  188353. #endif
  188354. "str r4, [%[r], #120]\n\t"
  188355. "str r5, [%[r], #124]\n\t"
  188356. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  188357. :
  188358. : "memory", "r4", "r5", "r6", "r7"
  188359. );
  188360. }
  188361. /* Conditionally add a and b using the mask m.
  188362. * m is -1 to add and 0 when not.
  188363. *
  188364. * r A single precision number representing conditional add result.
  188365. * a A single precision number to add with.
  188366. * b A single precision number to add.
  188367. * m Mask value to apply.
  188368. */
  188369. SP_NOINLINE static sp_digit sp_1024_cond_add_32(sp_digit* r, const sp_digit* a,
  188370. const sp_digit* b, sp_digit m)
  188371. {
  188372. __asm__ __volatile__ (
  188373. "movs r4, #0\n\t"
  188374. "movs r5, #0x80\n\t"
  188375. "mov r8, r5\n\t"
  188376. "movs r7, #0\n\t"
  188377. "\n"
  188378. "L_sp_1024_cond_add_32_words_%=:\n\t"
  188379. "ldr r6, [%[b], r7]\n\t"
  188380. #ifdef WOLFSSL_KEIL
  188381. "ands r6, r6, %[m]\n\t"
  188382. #elif defined(__clang__)
  188383. "ands r6, %[m]\n\t"
  188384. #else
  188385. "and r6, %[m]\n\t"
  188386. #endif
  188387. "movs r5, #0\n\t"
  188388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188389. "subs r5, r5, #1\n\t"
  188390. #else
  188391. "sub r5, r5, #1\n\t"
  188392. #endif
  188393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188394. "adds r5, r5, r4\n\t"
  188395. #else
  188396. "add r5, r5, r4\n\t"
  188397. #endif
  188398. "ldr r5, [%[a], r7]\n\t"
  188399. #ifdef WOLFSSL_KEIL
  188400. "adcs r5, r5, r6\n\t"
  188401. #elif defined(__clang__)
  188402. "adcs r5, r6\n\t"
  188403. #else
  188404. "adc r5, r6\n\t"
  188405. #endif
  188406. "movs r4, #0\n\t"
  188407. #ifdef WOLFSSL_KEIL
  188408. "adcs r4, r4, r4\n\t"
  188409. #elif defined(__clang__)
  188410. "adcs r4, r4\n\t"
  188411. #else
  188412. "adc r4, r4\n\t"
  188413. #endif
  188414. "str r5, [%[r], r7]\n\t"
  188415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188416. "adds r7, r7, #4\n\t"
  188417. #else
  188418. "add r7, r7, #4\n\t"
  188419. #endif
  188420. "cmp r7, r8\n\t"
  188421. "blt L_sp_1024_cond_add_32_words_%=\n\t"
  188422. "movs %[r], r4\n\t"
  188423. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  188424. :
  188425. : "memory", "r4", "r5", "r6", "r7", "r8"
  188426. );
  188427. return (uint32_t)(size_t)r;
  188428. }
  188429. /* Right shift a by 1 bit into r. (r = a >> 1)
  188430. *
  188431. * r A single precision integer.
  188432. * a A single precision integer.
  188433. */
  188434. static void sp_1024_rshift1_32(sp_digit* r, const sp_digit* a)
  188435. {
  188436. __asm__ __volatile__ (
  188437. "ldr r2, [%[a]]\n\t"
  188438. "ldr r3, [%[a], #4]\n\t"
  188439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188440. "lsrs r2, r2, #1\n\t"
  188441. #else
  188442. "lsr r2, r2, #1\n\t"
  188443. #endif
  188444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188445. "lsls r5, r3, #31\n\t"
  188446. #else
  188447. "lsl r5, r3, #31\n\t"
  188448. #endif
  188449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188450. "lsrs r3, r3, #1\n\t"
  188451. #else
  188452. "lsr r3, r3, #1\n\t"
  188453. #endif
  188454. #ifdef WOLFSSL_KEIL
  188455. "orrs r2, r2, r5\n\t"
  188456. #elif defined(__clang__)
  188457. "orrs r2, r5\n\t"
  188458. #else
  188459. "orr r2, r5\n\t"
  188460. #endif
  188461. "ldr r4, [%[a], #8]\n\t"
  188462. "str r2, [%[r]]\n\t"
  188463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188464. "lsls r5, r4, #31\n\t"
  188465. #else
  188466. "lsl r5, r4, #31\n\t"
  188467. #endif
  188468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188469. "lsrs r4, r4, #1\n\t"
  188470. #else
  188471. "lsr r4, r4, #1\n\t"
  188472. #endif
  188473. #ifdef WOLFSSL_KEIL
  188474. "orrs r3, r3, r5\n\t"
  188475. #elif defined(__clang__)
  188476. "orrs r3, r5\n\t"
  188477. #else
  188478. "orr r3, r5\n\t"
  188479. #endif
  188480. "ldr r2, [%[a], #12]\n\t"
  188481. "str r3, [%[r], #4]\n\t"
  188482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188483. "lsls r5, r2, #31\n\t"
  188484. #else
  188485. "lsl r5, r2, #31\n\t"
  188486. #endif
  188487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188488. "lsrs r2, r2, #1\n\t"
  188489. #else
  188490. "lsr r2, r2, #1\n\t"
  188491. #endif
  188492. #ifdef WOLFSSL_KEIL
  188493. "orrs r4, r4, r5\n\t"
  188494. #elif defined(__clang__)
  188495. "orrs r4, r5\n\t"
  188496. #else
  188497. "orr r4, r5\n\t"
  188498. #endif
  188499. "ldr r3, [%[a], #16]\n\t"
  188500. "str r4, [%[r], #8]\n\t"
  188501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188502. "lsls r5, r3, #31\n\t"
  188503. #else
  188504. "lsl r5, r3, #31\n\t"
  188505. #endif
  188506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188507. "lsrs r3, r3, #1\n\t"
  188508. #else
  188509. "lsr r3, r3, #1\n\t"
  188510. #endif
  188511. #ifdef WOLFSSL_KEIL
  188512. "orrs r2, r2, r5\n\t"
  188513. #elif defined(__clang__)
  188514. "orrs r2, r5\n\t"
  188515. #else
  188516. "orr r2, r5\n\t"
  188517. #endif
  188518. "ldr r4, [%[a], #20]\n\t"
  188519. "str r2, [%[r], #12]\n\t"
  188520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188521. "lsls r5, r4, #31\n\t"
  188522. #else
  188523. "lsl r5, r4, #31\n\t"
  188524. #endif
  188525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188526. "lsrs r4, r4, #1\n\t"
  188527. #else
  188528. "lsr r4, r4, #1\n\t"
  188529. #endif
  188530. #ifdef WOLFSSL_KEIL
  188531. "orrs r3, r3, r5\n\t"
  188532. #elif defined(__clang__)
  188533. "orrs r3, r5\n\t"
  188534. #else
  188535. "orr r3, r5\n\t"
  188536. #endif
  188537. "ldr r2, [%[a], #24]\n\t"
  188538. "str r3, [%[r], #16]\n\t"
  188539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188540. "lsls r5, r2, #31\n\t"
  188541. #else
  188542. "lsl r5, r2, #31\n\t"
  188543. #endif
  188544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188545. "lsrs r2, r2, #1\n\t"
  188546. #else
  188547. "lsr r2, r2, #1\n\t"
  188548. #endif
  188549. #ifdef WOLFSSL_KEIL
  188550. "orrs r4, r4, r5\n\t"
  188551. #elif defined(__clang__)
  188552. "orrs r4, r5\n\t"
  188553. #else
  188554. "orr r4, r5\n\t"
  188555. #endif
  188556. "ldr r3, [%[a], #28]\n\t"
  188557. "str r4, [%[r], #20]\n\t"
  188558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188559. "lsls r5, r3, #31\n\t"
  188560. #else
  188561. "lsl r5, r3, #31\n\t"
  188562. #endif
  188563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188564. "lsrs r3, r3, #1\n\t"
  188565. #else
  188566. "lsr r3, r3, #1\n\t"
  188567. #endif
  188568. #ifdef WOLFSSL_KEIL
  188569. "orrs r2, r2, r5\n\t"
  188570. #elif defined(__clang__)
  188571. "orrs r2, r5\n\t"
  188572. #else
  188573. "orr r2, r5\n\t"
  188574. #endif
  188575. "ldr r4, [%[a], #32]\n\t"
  188576. "str r2, [%[r], #24]\n\t"
  188577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188578. "lsls r5, r4, #31\n\t"
  188579. #else
  188580. "lsl r5, r4, #31\n\t"
  188581. #endif
  188582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188583. "lsrs r4, r4, #1\n\t"
  188584. #else
  188585. "lsr r4, r4, #1\n\t"
  188586. #endif
  188587. #ifdef WOLFSSL_KEIL
  188588. "orrs r3, r3, r5\n\t"
  188589. #elif defined(__clang__)
  188590. "orrs r3, r5\n\t"
  188591. #else
  188592. "orr r3, r5\n\t"
  188593. #endif
  188594. "ldr r2, [%[a], #36]\n\t"
  188595. "str r3, [%[r], #28]\n\t"
  188596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188597. "lsls r5, r2, #31\n\t"
  188598. #else
  188599. "lsl r5, r2, #31\n\t"
  188600. #endif
  188601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188602. "lsrs r2, r2, #1\n\t"
  188603. #else
  188604. "lsr r2, r2, #1\n\t"
  188605. #endif
  188606. #ifdef WOLFSSL_KEIL
  188607. "orrs r4, r4, r5\n\t"
  188608. #elif defined(__clang__)
  188609. "orrs r4, r5\n\t"
  188610. #else
  188611. "orr r4, r5\n\t"
  188612. #endif
  188613. "ldr r3, [%[a], #40]\n\t"
  188614. "str r4, [%[r], #32]\n\t"
  188615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188616. "lsls r5, r3, #31\n\t"
  188617. #else
  188618. "lsl r5, r3, #31\n\t"
  188619. #endif
  188620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188621. "lsrs r3, r3, #1\n\t"
  188622. #else
  188623. "lsr r3, r3, #1\n\t"
  188624. #endif
  188625. #ifdef WOLFSSL_KEIL
  188626. "orrs r2, r2, r5\n\t"
  188627. #elif defined(__clang__)
  188628. "orrs r2, r5\n\t"
  188629. #else
  188630. "orr r2, r5\n\t"
  188631. #endif
  188632. "ldr r4, [%[a], #44]\n\t"
  188633. "str r2, [%[r], #36]\n\t"
  188634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188635. "lsls r5, r4, #31\n\t"
  188636. #else
  188637. "lsl r5, r4, #31\n\t"
  188638. #endif
  188639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188640. "lsrs r4, r4, #1\n\t"
  188641. #else
  188642. "lsr r4, r4, #1\n\t"
  188643. #endif
  188644. #ifdef WOLFSSL_KEIL
  188645. "orrs r3, r3, r5\n\t"
  188646. #elif defined(__clang__)
  188647. "orrs r3, r5\n\t"
  188648. #else
  188649. "orr r3, r5\n\t"
  188650. #endif
  188651. "ldr r2, [%[a], #48]\n\t"
  188652. "str r3, [%[r], #40]\n\t"
  188653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188654. "lsls r5, r2, #31\n\t"
  188655. #else
  188656. "lsl r5, r2, #31\n\t"
  188657. #endif
  188658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188659. "lsrs r2, r2, #1\n\t"
  188660. #else
  188661. "lsr r2, r2, #1\n\t"
  188662. #endif
  188663. #ifdef WOLFSSL_KEIL
  188664. "orrs r4, r4, r5\n\t"
  188665. #elif defined(__clang__)
  188666. "orrs r4, r5\n\t"
  188667. #else
  188668. "orr r4, r5\n\t"
  188669. #endif
  188670. "ldr r3, [%[a], #52]\n\t"
  188671. "str r4, [%[r], #44]\n\t"
  188672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188673. "lsls r5, r3, #31\n\t"
  188674. #else
  188675. "lsl r5, r3, #31\n\t"
  188676. #endif
  188677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188678. "lsrs r3, r3, #1\n\t"
  188679. #else
  188680. "lsr r3, r3, #1\n\t"
  188681. #endif
  188682. #ifdef WOLFSSL_KEIL
  188683. "orrs r2, r2, r5\n\t"
  188684. #elif defined(__clang__)
  188685. "orrs r2, r5\n\t"
  188686. #else
  188687. "orr r2, r5\n\t"
  188688. #endif
  188689. "ldr r4, [%[a], #56]\n\t"
  188690. "str r2, [%[r], #48]\n\t"
  188691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188692. "lsls r5, r4, #31\n\t"
  188693. #else
  188694. "lsl r5, r4, #31\n\t"
  188695. #endif
  188696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188697. "lsrs r4, r4, #1\n\t"
  188698. #else
  188699. "lsr r4, r4, #1\n\t"
  188700. #endif
  188701. #ifdef WOLFSSL_KEIL
  188702. "orrs r3, r3, r5\n\t"
  188703. #elif defined(__clang__)
  188704. "orrs r3, r5\n\t"
  188705. #else
  188706. "orr r3, r5\n\t"
  188707. #endif
  188708. "ldr r2, [%[a], #60]\n\t"
  188709. "str r3, [%[r], #52]\n\t"
  188710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188711. "lsls r5, r2, #31\n\t"
  188712. #else
  188713. "lsl r5, r2, #31\n\t"
  188714. #endif
  188715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188716. "lsrs r2, r2, #1\n\t"
  188717. #else
  188718. "lsr r2, r2, #1\n\t"
  188719. #endif
  188720. #ifdef WOLFSSL_KEIL
  188721. "orrs r4, r4, r5\n\t"
  188722. #elif defined(__clang__)
  188723. "orrs r4, r5\n\t"
  188724. #else
  188725. "orr r4, r5\n\t"
  188726. #endif
  188727. "ldr r3, [%[a], #64]\n\t"
  188728. "str r4, [%[r], #56]\n\t"
  188729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188730. "lsls r5, r3, #31\n\t"
  188731. #else
  188732. "lsl r5, r3, #31\n\t"
  188733. #endif
  188734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188735. "lsrs r3, r3, #1\n\t"
  188736. #else
  188737. "lsr r3, r3, #1\n\t"
  188738. #endif
  188739. #ifdef WOLFSSL_KEIL
  188740. "orrs r2, r2, r5\n\t"
  188741. #elif defined(__clang__)
  188742. "orrs r2, r5\n\t"
  188743. #else
  188744. "orr r2, r5\n\t"
  188745. #endif
  188746. "ldr r4, [%[a], #68]\n\t"
  188747. "str r2, [%[r], #60]\n\t"
  188748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188749. "lsls r5, r4, #31\n\t"
  188750. #else
  188751. "lsl r5, r4, #31\n\t"
  188752. #endif
  188753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188754. "lsrs r4, r4, #1\n\t"
  188755. #else
  188756. "lsr r4, r4, #1\n\t"
  188757. #endif
  188758. #ifdef WOLFSSL_KEIL
  188759. "orrs r3, r3, r5\n\t"
  188760. #elif defined(__clang__)
  188761. "orrs r3, r5\n\t"
  188762. #else
  188763. "orr r3, r5\n\t"
  188764. #endif
  188765. "ldr r2, [%[a], #72]\n\t"
  188766. "str r3, [%[r], #64]\n\t"
  188767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188768. "lsls r5, r2, #31\n\t"
  188769. #else
  188770. "lsl r5, r2, #31\n\t"
  188771. #endif
  188772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188773. "lsrs r2, r2, #1\n\t"
  188774. #else
  188775. "lsr r2, r2, #1\n\t"
  188776. #endif
  188777. #ifdef WOLFSSL_KEIL
  188778. "orrs r4, r4, r5\n\t"
  188779. #elif defined(__clang__)
  188780. "orrs r4, r5\n\t"
  188781. #else
  188782. "orr r4, r5\n\t"
  188783. #endif
  188784. "ldr r3, [%[a], #76]\n\t"
  188785. "str r4, [%[r], #68]\n\t"
  188786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188787. "lsls r5, r3, #31\n\t"
  188788. #else
  188789. "lsl r5, r3, #31\n\t"
  188790. #endif
  188791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188792. "lsrs r3, r3, #1\n\t"
  188793. #else
  188794. "lsr r3, r3, #1\n\t"
  188795. #endif
  188796. #ifdef WOLFSSL_KEIL
  188797. "orrs r2, r2, r5\n\t"
  188798. #elif defined(__clang__)
  188799. "orrs r2, r5\n\t"
  188800. #else
  188801. "orr r2, r5\n\t"
  188802. #endif
  188803. "ldr r4, [%[a], #80]\n\t"
  188804. "str r2, [%[r], #72]\n\t"
  188805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188806. "lsls r5, r4, #31\n\t"
  188807. #else
  188808. "lsl r5, r4, #31\n\t"
  188809. #endif
  188810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188811. "lsrs r4, r4, #1\n\t"
  188812. #else
  188813. "lsr r4, r4, #1\n\t"
  188814. #endif
  188815. #ifdef WOLFSSL_KEIL
  188816. "orrs r3, r3, r5\n\t"
  188817. #elif defined(__clang__)
  188818. "orrs r3, r5\n\t"
  188819. #else
  188820. "orr r3, r5\n\t"
  188821. #endif
  188822. "ldr r2, [%[a], #84]\n\t"
  188823. "str r3, [%[r], #76]\n\t"
  188824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188825. "lsls r5, r2, #31\n\t"
  188826. #else
  188827. "lsl r5, r2, #31\n\t"
  188828. #endif
  188829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188830. "lsrs r2, r2, #1\n\t"
  188831. #else
  188832. "lsr r2, r2, #1\n\t"
  188833. #endif
  188834. #ifdef WOLFSSL_KEIL
  188835. "orrs r4, r4, r5\n\t"
  188836. #elif defined(__clang__)
  188837. "orrs r4, r5\n\t"
  188838. #else
  188839. "orr r4, r5\n\t"
  188840. #endif
  188841. "ldr r3, [%[a], #88]\n\t"
  188842. "str r4, [%[r], #80]\n\t"
  188843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188844. "lsls r5, r3, #31\n\t"
  188845. #else
  188846. "lsl r5, r3, #31\n\t"
  188847. #endif
  188848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188849. "lsrs r3, r3, #1\n\t"
  188850. #else
  188851. "lsr r3, r3, #1\n\t"
  188852. #endif
  188853. #ifdef WOLFSSL_KEIL
  188854. "orrs r2, r2, r5\n\t"
  188855. #elif defined(__clang__)
  188856. "orrs r2, r5\n\t"
  188857. #else
  188858. "orr r2, r5\n\t"
  188859. #endif
  188860. "ldr r4, [%[a], #92]\n\t"
  188861. "str r2, [%[r], #84]\n\t"
  188862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188863. "lsls r5, r4, #31\n\t"
  188864. #else
  188865. "lsl r5, r4, #31\n\t"
  188866. #endif
  188867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188868. "lsrs r4, r4, #1\n\t"
  188869. #else
  188870. "lsr r4, r4, #1\n\t"
  188871. #endif
  188872. #ifdef WOLFSSL_KEIL
  188873. "orrs r3, r3, r5\n\t"
  188874. #elif defined(__clang__)
  188875. "orrs r3, r5\n\t"
  188876. #else
  188877. "orr r3, r5\n\t"
  188878. #endif
  188879. "ldr r2, [%[a], #96]\n\t"
  188880. "str r3, [%[r], #88]\n\t"
  188881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188882. "lsls r5, r2, #31\n\t"
  188883. #else
  188884. "lsl r5, r2, #31\n\t"
  188885. #endif
  188886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188887. "lsrs r2, r2, #1\n\t"
  188888. #else
  188889. "lsr r2, r2, #1\n\t"
  188890. #endif
  188891. #ifdef WOLFSSL_KEIL
  188892. "orrs r4, r4, r5\n\t"
  188893. #elif defined(__clang__)
  188894. "orrs r4, r5\n\t"
  188895. #else
  188896. "orr r4, r5\n\t"
  188897. #endif
  188898. "ldr r3, [%[a], #100]\n\t"
  188899. "str r4, [%[r], #92]\n\t"
  188900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188901. "lsls r5, r3, #31\n\t"
  188902. #else
  188903. "lsl r5, r3, #31\n\t"
  188904. #endif
  188905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188906. "lsrs r3, r3, #1\n\t"
  188907. #else
  188908. "lsr r3, r3, #1\n\t"
  188909. #endif
  188910. #ifdef WOLFSSL_KEIL
  188911. "orrs r2, r2, r5\n\t"
  188912. #elif defined(__clang__)
  188913. "orrs r2, r5\n\t"
  188914. #else
  188915. "orr r2, r5\n\t"
  188916. #endif
  188917. "ldr r4, [%[a], #104]\n\t"
  188918. "str r2, [%[r], #96]\n\t"
  188919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188920. "lsls r5, r4, #31\n\t"
  188921. #else
  188922. "lsl r5, r4, #31\n\t"
  188923. #endif
  188924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188925. "lsrs r4, r4, #1\n\t"
  188926. #else
  188927. "lsr r4, r4, #1\n\t"
  188928. #endif
  188929. #ifdef WOLFSSL_KEIL
  188930. "orrs r3, r3, r5\n\t"
  188931. #elif defined(__clang__)
  188932. "orrs r3, r5\n\t"
  188933. #else
  188934. "orr r3, r5\n\t"
  188935. #endif
  188936. "ldr r2, [%[a], #108]\n\t"
  188937. "str r3, [%[r], #100]\n\t"
  188938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188939. "lsls r5, r2, #31\n\t"
  188940. #else
  188941. "lsl r5, r2, #31\n\t"
  188942. #endif
  188943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188944. "lsrs r2, r2, #1\n\t"
  188945. #else
  188946. "lsr r2, r2, #1\n\t"
  188947. #endif
  188948. #ifdef WOLFSSL_KEIL
  188949. "orrs r4, r4, r5\n\t"
  188950. #elif defined(__clang__)
  188951. "orrs r4, r5\n\t"
  188952. #else
  188953. "orr r4, r5\n\t"
  188954. #endif
  188955. "ldr r3, [%[a], #112]\n\t"
  188956. "str r4, [%[r], #104]\n\t"
  188957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188958. "lsls r5, r3, #31\n\t"
  188959. #else
  188960. "lsl r5, r3, #31\n\t"
  188961. #endif
  188962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188963. "lsrs r3, r3, #1\n\t"
  188964. #else
  188965. "lsr r3, r3, #1\n\t"
  188966. #endif
  188967. #ifdef WOLFSSL_KEIL
  188968. "orrs r2, r2, r5\n\t"
  188969. #elif defined(__clang__)
  188970. "orrs r2, r5\n\t"
  188971. #else
  188972. "orr r2, r5\n\t"
  188973. #endif
  188974. "ldr r4, [%[a], #116]\n\t"
  188975. "str r2, [%[r], #108]\n\t"
  188976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188977. "lsls r5, r4, #31\n\t"
  188978. #else
  188979. "lsl r5, r4, #31\n\t"
  188980. #endif
  188981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188982. "lsrs r4, r4, #1\n\t"
  188983. #else
  188984. "lsr r4, r4, #1\n\t"
  188985. #endif
  188986. #ifdef WOLFSSL_KEIL
  188987. "orrs r3, r3, r5\n\t"
  188988. #elif defined(__clang__)
  188989. "orrs r3, r5\n\t"
  188990. #else
  188991. "orr r3, r5\n\t"
  188992. #endif
  188993. "ldr r2, [%[a], #120]\n\t"
  188994. "str r3, [%[r], #112]\n\t"
  188995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188996. "lsls r5, r2, #31\n\t"
  188997. #else
  188998. "lsl r5, r2, #31\n\t"
  188999. #endif
  189000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189001. "lsrs r2, r2, #1\n\t"
  189002. #else
  189003. "lsr r2, r2, #1\n\t"
  189004. #endif
  189005. #ifdef WOLFSSL_KEIL
  189006. "orrs r4, r4, r5\n\t"
  189007. #elif defined(__clang__)
  189008. "orrs r4, r5\n\t"
  189009. #else
  189010. "orr r4, r5\n\t"
  189011. #endif
  189012. "ldr r3, [%[a], #124]\n\t"
  189013. "str r4, [%[r], #116]\n\t"
  189014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189015. "lsls r5, r3, #31\n\t"
  189016. #else
  189017. "lsl r5, r3, #31\n\t"
  189018. #endif
  189019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189020. "lsrs r3, r3, #1\n\t"
  189021. #else
  189022. "lsr r3, r3, #1\n\t"
  189023. #endif
  189024. #ifdef WOLFSSL_KEIL
  189025. "orrs r2, r2, r5\n\t"
  189026. #elif defined(__clang__)
  189027. "orrs r2, r5\n\t"
  189028. #else
  189029. "orr r2, r5\n\t"
  189030. #endif
  189031. "str r2, [%[r], #120]\n\t"
  189032. "str r3, [%[r], #124]\n\t"
  189033. : [r] "+r" (r), [a] "+r" (a)
  189034. :
  189035. : "memory", "r2", "r3", "r4", "r5"
  189036. );
  189037. }
  189038. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  189039. *
  189040. * r Result of division by 2.
  189041. * a Number to divide.
  189042. * m Modulus (prime).
  189043. */
  189044. SP_NOINLINE static void sp_1024_div2_32(sp_digit* r, const sp_digit* a,
  189045. const sp_digit* m)
  189046. {
  189047. sp_digit o;
  189048. o = sp_1024_cond_add_32(r, a, m, 0 - (a[0] & 1));
  189049. sp_1024_rshift1_32(r, r);
  189050. r[31] |= o << 31;
  189051. }
  189052. /* Double the Montgomery form projective point p.
  189053. *
  189054. * r Result of doubling point.
  189055. * p Point to double.
  189056. * t Temporary ordinate data.
  189057. */
  189058. #ifdef WOLFSSL_SP_NONBLOCK
  189059. typedef struct sp_1024_proj_point_dbl_32_ctx {
  189060. int state;
  189061. sp_digit* t1;
  189062. sp_digit* t2;
  189063. sp_digit* x;
  189064. sp_digit* y;
  189065. sp_digit* z;
  189066. } sp_1024_proj_point_dbl_32_ctx;
  189067. static int sp_1024_proj_point_dbl_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, const sp_point_1024* p, sp_digit* t)
  189068. {
  189069. int err = FP_WOULDBLOCK;
  189070. sp_1024_proj_point_dbl_32_ctx* ctx = (sp_1024_proj_point_dbl_32_ctx*)sp_ctx->data;
  189071. typedef char ctx_size_test[sizeof(sp_1024_proj_point_dbl_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  189072. (void)sizeof(ctx_size_test);
  189073. switch (ctx->state) {
  189074. case 0:
  189075. ctx->t1 = t;
  189076. ctx->t2 = t + 2*32;
  189077. ctx->x = r->x;
  189078. ctx->y = r->y;
  189079. ctx->z = r->z;
  189080. /* Put infinity into result. */
  189081. if (r != p) {
  189082. r->infinity = p->infinity;
  189083. }
  189084. ctx->state = 1;
  189085. break;
  189086. case 1:
  189087. /* T1 = Z * Z */
  189088. sp_1024_mont_sqr_32(ctx->t1, p->z, p1024_mod, p1024_mp_mod);
  189089. ctx->state = 2;
  189090. break;
  189091. case 2:
  189092. /* Z = Y * Z */
  189093. sp_1024_mont_mul_32(ctx->z, p->y, p->z, p1024_mod, p1024_mp_mod);
  189094. ctx->state = 3;
  189095. break;
  189096. case 3:
  189097. /* Z = 2Z */
  189098. sp_1024_mont_dbl_32(ctx->z, ctx->z, p1024_mod);
  189099. ctx->state = 4;
  189100. break;
  189101. case 4:
  189102. /* T2 = X - T1 */
  189103. sp_1024_mont_sub_32(ctx->t2, p->x, ctx->t1, p1024_mod);
  189104. ctx->state = 5;
  189105. break;
  189106. case 5:
  189107. /* T1 = X + T1 */
  189108. sp_1024_mont_add_32(ctx->t1, p->x, ctx->t1, p1024_mod);
  189109. ctx->state = 6;
  189110. break;
  189111. case 6:
  189112. /* T2 = T1 * T2 */
  189113. sp_1024_mont_mul_32(ctx->t2, ctx->t1, ctx->t2, p1024_mod, p1024_mp_mod);
  189114. ctx->state = 7;
  189115. break;
  189116. case 7:
  189117. /* T1 = 3T2 */
  189118. sp_1024_mont_tpl_32(ctx->t1, ctx->t2, p1024_mod);
  189119. ctx->state = 8;
  189120. break;
  189121. case 8:
  189122. /* Y = 2Y */
  189123. sp_1024_mont_dbl_32(ctx->y, p->y, p1024_mod);
  189124. ctx->state = 9;
  189125. break;
  189126. case 9:
  189127. /* Y = Y * Y */
  189128. sp_1024_mont_sqr_32(ctx->y, ctx->y, p1024_mod, p1024_mp_mod);
  189129. ctx->state = 10;
  189130. break;
  189131. case 10:
  189132. /* T2 = Y * Y */
  189133. sp_1024_mont_sqr_32(ctx->t2, ctx->y, p1024_mod, p1024_mp_mod);
  189134. ctx->state = 11;
  189135. break;
  189136. case 11:
  189137. /* T2 = T2/2 */
  189138. sp_1024_div2_32(ctx->t2, ctx->t2, p1024_mod);
  189139. ctx->state = 12;
  189140. break;
  189141. case 12:
  189142. /* Y = Y * X */
  189143. sp_1024_mont_mul_32(ctx->y, ctx->y, p->x, p1024_mod, p1024_mp_mod);
  189144. ctx->state = 13;
  189145. break;
  189146. case 13:
  189147. /* X = T1 * T1 */
  189148. sp_1024_mont_sqr_32(ctx->x, ctx->t1, p1024_mod, p1024_mp_mod);
  189149. ctx->state = 14;
  189150. break;
  189151. case 14:
  189152. /* X = X - Y */
  189153. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  189154. ctx->state = 15;
  189155. break;
  189156. case 15:
  189157. /* X = X - Y */
  189158. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  189159. ctx->state = 16;
  189160. break;
  189161. case 16:
  189162. /* Y = Y - X */
  189163. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  189164. ctx->state = 17;
  189165. break;
  189166. case 17:
  189167. /* Y = Y * T1 */
  189168. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t1, p1024_mod, p1024_mp_mod);
  189169. ctx->state = 18;
  189170. break;
  189171. case 18:
  189172. /* Y = Y - T2 */
  189173. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t2, p1024_mod);
  189174. ctx->state = 19;
  189175. /* fall-through */
  189176. case 19:
  189177. err = MP_OKAY;
  189178. break;
  189179. }
  189180. if (err == MP_OKAY && ctx->state != 19) {
  189181. err = FP_WOULDBLOCK;
  189182. }
  189183. return err;
  189184. }
  189185. #endif /* WOLFSSL_SP_NONBLOCK */
  189186. static void sp_1024_proj_point_dbl_32(sp_point_1024* r, const sp_point_1024* p, sp_digit* t)
  189187. {
  189188. sp_digit* t1 = t;
  189189. sp_digit* t2 = t + 2*32;
  189190. sp_digit* x;
  189191. sp_digit* y;
  189192. sp_digit* z;
  189193. x = r->x;
  189194. y = r->y;
  189195. z = r->z;
  189196. /* Put infinity into result. */
  189197. if (r != p) {
  189198. r->infinity = p->infinity;
  189199. }
  189200. /* T1 = Z * Z */
  189201. sp_1024_mont_sqr_32(t1, p->z, p1024_mod, p1024_mp_mod);
  189202. /* Z = Y * Z */
  189203. sp_1024_mont_mul_32(z, p->y, p->z, p1024_mod, p1024_mp_mod);
  189204. /* Z = 2Z */
  189205. sp_1024_mont_dbl_32(z, z, p1024_mod);
  189206. /* T2 = X - T1 */
  189207. sp_1024_mont_sub_32(t2, p->x, t1, p1024_mod);
  189208. /* T1 = X + T1 */
  189209. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  189210. /* T2 = T1 * T2 */
  189211. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  189212. /* T1 = 3T2 */
  189213. sp_1024_mont_tpl_32(t1, t2, p1024_mod);
  189214. /* Y = 2Y */
  189215. sp_1024_mont_dbl_32(y, p->y, p1024_mod);
  189216. /* Y = Y * Y */
  189217. sp_1024_mont_sqr_32(y, y, p1024_mod, p1024_mp_mod);
  189218. /* T2 = Y * Y */
  189219. sp_1024_mont_sqr_32(t2, y, p1024_mod, p1024_mp_mod);
  189220. /* T2 = T2/2 */
  189221. sp_1024_div2_32(t2, t2, p1024_mod);
  189222. /* Y = Y * X */
  189223. sp_1024_mont_mul_32(y, y, p->x, p1024_mod, p1024_mp_mod);
  189224. /* X = T1 * T1 */
  189225. sp_1024_mont_sqr_32(x, t1, p1024_mod, p1024_mp_mod);
  189226. /* X = X - Y */
  189227. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  189228. /* X = X - Y */
  189229. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  189230. /* Y = Y - X */
  189231. sp_1024_mont_sub_32(y, y, x, p1024_mod);
  189232. /* Y = Y * T1 */
  189233. sp_1024_mont_mul_32(y, y, t1, p1024_mod, p1024_mp_mod);
  189234. /* Y = Y - T2 */
  189235. sp_1024_mont_sub_32(y, y, t2, p1024_mod);
  189236. }
  189237. #ifdef WOLFSSL_SP_SMALL
  189238. /* Sub b from a into r. (r = a - b)
  189239. *
  189240. * r A single precision integer.
  189241. * a A single precision integer.
  189242. * b A single precision integer.
  189243. */
  189244. SP_NOINLINE static sp_digit sp_1024_sub_32(sp_digit* r, const sp_digit* a,
  189245. const sp_digit* b)
  189246. {
  189247. __asm__ __volatile__ (
  189248. "movs r6, %[a]\n\t"
  189249. "movs r3, #0\n\t"
  189250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189251. "adds r6, r6, #0x80\n\t"
  189252. #else
  189253. "add r6, r6, #0x80\n\t"
  189254. #endif
  189255. "\n"
  189256. "L_sp_1024_sub_32_word_%=:\n\t"
  189257. "movs r5, #0\n\t"
  189258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189259. "subs r5, r5, r3\n\t"
  189260. #else
  189261. "sub r5, r5, r3\n\t"
  189262. #endif
  189263. "ldr r4, [%[a]]\n\t"
  189264. "ldr r5, [%[b]]\n\t"
  189265. #ifdef WOLFSSL_KEIL
  189266. "sbcs r4, r4, r5\n\t"
  189267. #elif defined(__clang__)
  189268. "sbcs r4, r5\n\t"
  189269. #else
  189270. "sbc r4, r5\n\t"
  189271. #endif
  189272. "str r4, [%[r]]\n\t"
  189273. #ifdef WOLFSSL_KEIL
  189274. "sbcs r3, r3, r3\n\t"
  189275. #elif defined(__clang__)
  189276. "sbcs r3, r3\n\t"
  189277. #else
  189278. "sbc r3, r3\n\t"
  189279. #endif
  189280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189281. "adds %[a], %[a], #4\n\t"
  189282. #else
  189283. "add %[a], %[a], #4\n\t"
  189284. #endif
  189285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189286. "adds %[b], %[b], #4\n\t"
  189287. #else
  189288. "add %[b], %[b], #4\n\t"
  189289. #endif
  189290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189291. "adds %[r], %[r], #4\n\t"
  189292. #else
  189293. "add %[r], %[r], #4\n\t"
  189294. #endif
  189295. "cmp %[a], r6\n\t"
  189296. "bne L_sp_1024_sub_32_word_%=\n\t"
  189297. "movs %[r], r3\n\t"
  189298. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  189299. :
  189300. : "memory", "r3", "r4", "r5", "r6"
  189301. );
  189302. return (uint32_t)(size_t)r;
  189303. }
  189304. #else
  189305. /* Sub b from a into r. (r = a - b)
  189306. *
  189307. * r A single precision integer.
  189308. * a A single precision integer.
  189309. * b A single precision integer.
  189310. */
  189311. SP_NOINLINE static sp_digit sp_1024_sub_32(sp_digit* r, const sp_digit* a,
  189312. const sp_digit* b)
  189313. {
  189314. __asm__ __volatile__ (
  189315. "ldm %[b]!, {r5, r6}\n\t"
  189316. "ldm %[a]!, {r3, r4}\n\t"
  189317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189318. "subs r3, r3, r5\n\t"
  189319. #else
  189320. "sub r3, r3, r5\n\t"
  189321. #endif
  189322. #ifdef WOLFSSL_KEIL
  189323. "sbcs r4, r4, r6\n\t"
  189324. #elif defined(__clang__)
  189325. "sbcs r4, r6\n\t"
  189326. #else
  189327. "sbc r4, r6\n\t"
  189328. #endif
  189329. "stm %[r]!, {r3, r4}\n\t"
  189330. "ldm %[b]!, {r5, r6}\n\t"
  189331. "ldm %[a]!, {r3, r4}\n\t"
  189332. #ifdef WOLFSSL_KEIL
  189333. "sbcs r3, r3, r5\n\t"
  189334. #elif defined(__clang__)
  189335. "sbcs r3, r5\n\t"
  189336. #else
  189337. "sbc r3, r5\n\t"
  189338. #endif
  189339. #ifdef WOLFSSL_KEIL
  189340. "sbcs r4, r4, r6\n\t"
  189341. #elif defined(__clang__)
  189342. "sbcs r4, r6\n\t"
  189343. #else
  189344. "sbc r4, r6\n\t"
  189345. #endif
  189346. "stm %[r]!, {r3, r4}\n\t"
  189347. "ldm %[b]!, {r5, r6}\n\t"
  189348. "ldm %[a]!, {r3, r4}\n\t"
  189349. #ifdef WOLFSSL_KEIL
  189350. "sbcs r3, r3, r5\n\t"
  189351. #elif defined(__clang__)
  189352. "sbcs r3, r5\n\t"
  189353. #else
  189354. "sbc r3, r5\n\t"
  189355. #endif
  189356. #ifdef WOLFSSL_KEIL
  189357. "sbcs r4, r4, r6\n\t"
  189358. #elif defined(__clang__)
  189359. "sbcs r4, r6\n\t"
  189360. #else
  189361. "sbc r4, r6\n\t"
  189362. #endif
  189363. "stm %[r]!, {r3, r4}\n\t"
  189364. "ldm %[b]!, {r5, r6}\n\t"
  189365. "ldm %[a]!, {r3, r4}\n\t"
  189366. #ifdef WOLFSSL_KEIL
  189367. "sbcs r3, r3, r5\n\t"
  189368. #elif defined(__clang__)
  189369. "sbcs r3, r5\n\t"
  189370. #else
  189371. "sbc r3, r5\n\t"
  189372. #endif
  189373. #ifdef WOLFSSL_KEIL
  189374. "sbcs r4, r4, r6\n\t"
  189375. #elif defined(__clang__)
  189376. "sbcs r4, r6\n\t"
  189377. #else
  189378. "sbc r4, r6\n\t"
  189379. #endif
  189380. "stm %[r]!, {r3, r4}\n\t"
  189381. "ldm %[b]!, {r5, r6}\n\t"
  189382. "ldm %[a]!, {r3, r4}\n\t"
  189383. #ifdef WOLFSSL_KEIL
  189384. "sbcs r3, r3, r5\n\t"
  189385. #elif defined(__clang__)
  189386. "sbcs r3, r5\n\t"
  189387. #else
  189388. "sbc r3, r5\n\t"
  189389. #endif
  189390. #ifdef WOLFSSL_KEIL
  189391. "sbcs r4, r4, r6\n\t"
  189392. #elif defined(__clang__)
  189393. "sbcs r4, r6\n\t"
  189394. #else
  189395. "sbc r4, r6\n\t"
  189396. #endif
  189397. "stm %[r]!, {r3, r4}\n\t"
  189398. "ldm %[b]!, {r5, r6}\n\t"
  189399. "ldm %[a]!, {r3, r4}\n\t"
  189400. #ifdef WOLFSSL_KEIL
  189401. "sbcs r3, r3, r5\n\t"
  189402. #elif defined(__clang__)
  189403. "sbcs r3, r5\n\t"
  189404. #else
  189405. "sbc r3, r5\n\t"
  189406. #endif
  189407. #ifdef WOLFSSL_KEIL
  189408. "sbcs r4, r4, r6\n\t"
  189409. #elif defined(__clang__)
  189410. "sbcs r4, r6\n\t"
  189411. #else
  189412. "sbc r4, r6\n\t"
  189413. #endif
  189414. "stm %[r]!, {r3, r4}\n\t"
  189415. "ldm %[b]!, {r5, r6}\n\t"
  189416. "ldm %[a]!, {r3, r4}\n\t"
  189417. #ifdef WOLFSSL_KEIL
  189418. "sbcs r3, r3, r5\n\t"
  189419. #elif defined(__clang__)
  189420. "sbcs r3, r5\n\t"
  189421. #else
  189422. "sbc r3, r5\n\t"
  189423. #endif
  189424. #ifdef WOLFSSL_KEIL
  189425. "sbcs r4, r4, r6\n\t"
  189426. #elif defined(__clang__)
  189427. "sbcs r4, r6\n\t"
  189428. #else
  189429. "sbc r4, r6\n\t"
  189430. #endif
  189431. "stm %[r]!, {r3, r4}\n\t"
  189432. "ldm %[b]!, {r5, r6}\n\t"
  189433. "ldm %[a]!, {r3, r4}\n\t"
  189434. #ifdef WOLFSSL_KEIL
  189435. "sbcs r3, r3, r5\n\t"
  189436. #elif defined(__clang__)
  189437. "sbcs r3, r5\n\t"
  189438. #else
  189439. "sbc r3, r5\n\t"
  189440. #endif
  189441. #ifdef WOLFSSL_KEIL
  189442. "sbcs r4, r4, r6\n\t"
  189443. #elif defined(__clang__)
  189444. "sbcs r4, r6\n\t"
  189445. #else
  189446. "sbc r4, r6\n\t"
  189447. #endif
  189448. "stm %[r]!, {r3, r4}\n\t"
  189449. "ldm %[b]!, {r5, r6}\n\t"
  189450. "ldm %[a]!, {r3, r4}\n\t"
  189451. #ifdef WOLFSSL_KEIL
  189452. "sbcs r3, r3, r5\n\t"
  189453. #elif defined(__clang__)
  189454. "sbcs r3, r5\n\t"
  189455. #else
  189456. "sbc r3, r5\n\t"
  189457. #endif
  189458. #ifdef WOLFSSL_KEIL
  189459. "sbcs r4, r4, r6\n\t"
  189460. #elif defined(__clang__)
  189461. "sbcs r4, r6\n\t"
  189462. #else
  189463. "sbc r4, r6\n\t"
  189464. #endif
  189465. "stm %[r]!, {r3, r4}\n\t"
  189466. "ldm %[b]!, {r5, r6}\n\t"
  189467. "ldm %[a]!, {r3, r4}\n\t"
  189468. #ifdef WOLFSSL_KEIL
  189469. "sbcs r3, r3, r5\n\t"
  189470. #elif defined(__clang__)
  189471. "sbcs r3, r5\n\t"
  189472. #else
  189473. "sbc r3, r5\n\t"
  189474. #endif
  189475. #ifdef WOLFSSL_KEIL
  189476. "sbcs r4, r4, r6\n\t"
  189477. #elif defined(__clang__)
  189478. "sbcs r4, r6\n\t"
  189479. #else
  189480. "sbc r4, r6\n\t"
  189481. #endif
  189482. "stm %[r]!, {r3, r4}\n\t"
  189483. "ldm %[b]!, {r5, r6}\n\t"
  189484. "ldm %[a]!, {r3, r4}\n\t"
  189485. #ifdef WOLFSSL_KEIL
  189486. "sbcs r3, r3, r5\n\t"
  189487. #elif defined(__clang__)
  189488. "sbcs r3, r5\n\t"
  189489. #else
  189490. "sbc r3, r5\n\t"
  189491. #endif
  189492. #ifdef WOLFSSL_KEIL
  189493. "sbcs r4, r4, r6\n\t"
  189494. #elif defined(__clang__)
  189495. "sbcs r4, r6\n\t"
  189496. #else
  189497. "sbc r4, r6\n\t"
  189498. #endif
  189499. "stm %[r]!, {r3, r4}\n\t"
  189500. "ldm %[b]!, {r5, r6}\n\t"
  189501. "ldm %[a]!, {r3, r4}\n\t"
  189502. #ifdef WOLFSSL_KEIL
  189503. "sbcs r3, r3, r5\n\t"
  189504. #elif defined(__clang__)
  189505. "sbcs r3, r5\n\t"
  189506. #else
  189507. "sbc r3, r5\n\t"
  189508. #endif
  189509. #ifdef WOLFSSL_KEIL
  189510. "sbcs r4, r4, r6\n\t"
  189511. #elif defined(__clang__)
  189512. "sbcs r4, r6\n\t"
  189513. #else
  189514. "sbc r4, r6\n\t"
  189515. #endif
  189516. "stm %[r]!, {r3, r4}\n\t"
  189517. "ldm %[b]!, {r5, r6}\n\t"
  189518. "ldm %[a]!, {r3, r4}\n\t"
  189519. #ifdef WOLFSSL_KEIL
  189520. "sbcs r3, r3, r5\n\t"
  189521. #elif defined(__clang__)
  189522. "sbcs r3, r5\n\t"
  189523. #else
  189524. "sbc r3, r5\n\t"
  189525. #endif
  189526. #ifdef WOLFSSL_KEIL
  189527. "sbcs r4, r4, r6\n\t"
  189528. #elif defined(__clang__)
  189529. "sbcs r4, r6\n\t"
  189530. #else
  189531. "sbc r4, r6\n\t"
  189532. #endif
  189533. "stm %[r]!, {r3, r4}\n\t"
  189534. "ldm %[b]!, {r5, r6}\n\t"
  189535. "ldm %[a]!, {r3, r4}\n\t"
  189536. #ifdef WOLFSSL_KEIL
  189537. "sbcs r3, r3, r5\n\t"
  189538. #elif defined(__clang__)
  189539. "sbcs r3, r5\n\t"
  189540. #else
  189541. "sbc r3, r5\n\t"
  189542. #endif
  189543. #ifdef WOLFSSL_KEIL
  189544. "sbcs r4, r4, r6\n\t"
  189545. #elif defined(__clang__)
  189546. "sbcs r4, r6\n\t"
  189547. #else
  189548. "sbc r4, r6\n\t"
  189549. #endif
  189550. "stm %[r]!, {r3, r4}\n\t"
  189551. "ldm %[b]!, {r5, r6}\n\t"
  189552. "ldm %[a]!, {r3, r4}\n\t"
  189553. #ifdef WOLFSSL_KEIL
  189554. "sbcs r3, r3, r5\n\t"
  189555. #elif defined(__clang__)
  189556. "sbcs r3, r5\n\t"
  189557. #else
  189558. "sbc r3, r5\n\t"
  189559. #endif
  189560. #ifdef WOLFSSL_KEIL
  189561. "sbcs r4, r4, r6\n\t"
  189562. #elif defined(__clang__)
  189563. "sbcs r4, r6\n\t"
  189564. #else
  189565. "sbc r4, r6\n\t"
  189566. #endif
  189567. "stm %[r]!, {r3, r4}\n\t"
  189568. "ldm %[b]!, {r5, r6}\n\t"
  189569. "ldm %[a]!, {r3, r4}\n\t"
  189570. #ifdef WOLFSSL_KEIL
  189571. "sbcs r3, r3, r5\n\t"
  189572. #elif defined(__clang__)
  189573. "sbcs r3, r5\n\t"
  189574. #else
  189575. "sbc r3, r5\n\t"
  189576. #endif
  189577. #ifdef WOLFSSL_KEIL
  189578. "sbcs r4, r4, r6\n\t"
  189579. #elif defined(__clang__)
  189580. "sbcs r4, r6\n\t"
  189581. #else
  189582. "sbc r4, r6\n\t"
  189583. #endif
  189584. "stm %[r]!, {r3, r4}\n\t"
  189585. #ifdef WOLFSSL_KEIL
  189586. "sbcs %[r], %[r], %[r]\n\t"
  189587. #elif defined(__clang__)
  189588. "sbcs %[r], %[r]\n\t"
  189589. #else
  189590. "sbc %[r], %[r]\n\t"
  189591. #endif
  189592. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  189593. :
  189594. : "memory", "r3", "r4", "r5", "r6"
  189595. );
  189596. return (uint32_t)(size_t)r;
  189597. }
  189598. #endif /* WOLFSSL_SP_SMALL */
  189599. /* Compare two numbers to determine if they are equal.
  189600. * Constant time implementation.
  189601. *
  189602. * a First number to compare.
  189603. * b Second number to compare.
  189604. * returns 1 when equal and 0 otherwise.
  189605. */
  189606. static int sp_1024_cmp_equal_32(const sp_digit* a, const sp_digit* b)
  189607. {
  189608. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  189609. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  189610. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  189611. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  189612. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  189613. (a[15] ^ b[15]) | (a[16] ^ b[16]) | (a[17] ^ b[17]) |
  189614. (a[18] ^ b[18]) | (a[19] ^ b[19]) | (a[20] ^ b[20]) |
  189615. (a[21] ^ b[21]) | (a[22] ^ b[22]) | (a[23] ^ b[23]) |
  189616. (a[24] ^ b[24]) | (a[25] ^ b[25]) | (a[26] ^ b[26]) |
  189617. (a[27] ^ b[27]) | (a[28] ^ b[28]) | (a[29] ^ b[29]) |
  189618. (a[30] ^ b[30]) | (a[31] ^ b[31])) == 0;
  189619. }
  189620. /* Add two Montgomery form projective points.
  189621. *
  189622. * r Result of addition.
  189623. * p First point to add.
  189624. * q Second point to add.
  189625. * t Temporary ordinate data.
  189626. */
  189627. #ifdef WOLFSSL_SP_NONBLOCK
  189628. typedef struct sp_1024_proj_point_add_32_ctx {
  189629. int state;
  189630. sp_1024_proj_point_dbl_32_ctx dbl_ctx;
  189631. const sp_point_1024* ap[2];
  189632. sp_point_1024* rp[2];
  189633. sp_digit* t1;
  189634. sp_digit* t2;
  189635. sp_digit* t3;
  189636. sp_digit* t4;
  189637. sp_digit* t5;
  189638. sp_digit* x;
  189639. sp_digit* y;
  189640. sp_digit* z;
  189641. } sp_1024_proj_point_add_32_ctx;
  189642. static int sp_1024_proj_point_add_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r,
  189643. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  189644. {
  189645. int err = FP_WOULDBLOCK;
  189646. sp_1024_proj_point_add_32_ctx* ctx = (sp_1024_proj_point_add_32_ctx*)sp_ctx->data;
  189647. /* Ensure only the first point is the same as the result. */
  189648. if (q == r) {
  189649. const sp_point_1024* a = p;
  189650. p = q;
  189651. q = a;
  189652. }
  189653. typedef char ctx_size_test[sizeof(sp_1024_proj_point_add_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  189654. (void)sizeof(ctx_size_test);
  189655. switch (ctx->state) {
  189656. case 0: /* INIT */
  189657. ctx->t1 = t;
  189658. ctx->t2 = t + 2*32;
  189659. ctx->t3 = t + 4*32;
  189660. ctx->t4 = t + 6*32;
  189661. ctx->t5 = t + 8*32;
  189662. ctx->state = 1;
  189663. break;
  189664. case 1:
  189665. /* Check double */
  189666. (void)sp_1024_sub_32(ctx->t1, p1024_mod, q->y);
  189667. sp_1024_norm_32(ctx->t1);
  189668. if ((sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  189669. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, ctx->t1))) != 0)
  189670. {
  189671. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  189672. ctx->state = 2;
  189673. }
  189674. else {
  189675. ctx->state = 3;
  189676. }
  189677. break;
  189678. case 2:
  189679. err = sp_1024_proj_point_dbl_32_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  189680. if (err == MP_OKAY)
  189681. ctx->state = 27; /* done */
  189682. break;
  189683. case 3:
  189684. {
  189685. int i;
  189686. ctx->rp[0] = r;
  189687. /*lint allow cast to different type of pointer*/
  189688. ctx->rp[1] = (sp_point_1024*)t; /*lint !e9087 !e740*/
  189689. XMEMSET(ctx->rp[1], 0, sizeof(sp_point_1024));
  189690. ctx->x = ctx->rp[p->infinity | q->infinity]->x;
  189691. ctx->y = ctx->rp[p->infinity | q->infinity]->y;
  189692. ctx->z = ctx->rp[p->infinity | q->infinity]->z;
  189693. ctx->ap[0] = p;
  189694. ctx->ap[1] = q;
  189695. for (i=0; i<32; i++) {
  189696. r->x[i] = ctx->ap[p->infinity]->x[i];
  189697. }
  189698. for (i=0; i<32; i++) {
  189699. r->y[i] = ctx->ap[p->infinity]->y[i];
  189700. }
  189701. for (i=0; i<32; i++) {
  189702. r->z[i] = ctx->ap[p->infinity]->z[i];
  189703. }
  189704. r->infinity = ctx->ap[p->infinity]->infinity;
  189705. ctx->state = 4;
  189706. break;
  189707. }
  189708. case 4:
  189709. /* U1 = X1*Z2^2 */
  189710. sp_1024_mont_sqr_32(ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  189711. ctx->state = 5;
  189712. break;
  189713. case 5:
  189714. sp_1024_mont_mul_32(ctx->t3, ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  189715. ctx->state = 6;
  189716. break;
  189717. case 6:
  189718. sp_1024_mont_mul_32(ctx->t1, ctx->t1, ctx->x, p1024_mod, p1024_mp_mod);
  189719. ctx->state = 7;
  189720. break;
  189721. case 7:
  189722. /* U2 = X2*Z1^2 */
  189723. sp_1024_mont_sqr_32(ctx->t2, ctx->z, p1024_mod, p1024_mp_mod);
  189724. ctx->state = 8;
  189725. break;
  189726. case 8:
  189727. sp_1024_mont_mul_32(ctx->t4, ctx->t2, ctx->z, p1024_mod, p1024_mp_mod);
  189728. ctx->state = 9;
  189729. break;
  189730. case 9:
  189731. sp_1024_mont_mul_32(ctx->t2, ctx->t2, q->x, p1024_mod, p1024_mp_mod);
  189732. ctx->state = 10;
  189733. break;
  189734. case 10:
  189735. /* S1 = Y1*Z2^3 */
  189736. sp_1024_mont_mul_32(ctx->t3, ctx->t3, ctx->y, p1024_mod, p1024_mp_mod);
  189737. ctx->state = 11;
  189738. break;
  189739. case 11:
  189740. /* S2 = Y2*Z1^3 */
  189741. sp_1024_mont_mul_32(ctx->t4, ctx->t4, q->y, p1024_mod, p1024_mp_mod);
  189742. ctx->state = 12;
  189743. break;
  189744. case 12:
  189745. /* H = U2 - U1 */
  189746. sp_1024_mont_sub_32(ctx->t2, ctx->t2, ctx->t1, p1024_mod);
  189747. ctx->state = 13;
  189748. break;
  189749. case 13:
  189750. /* R = S2 - S1 */
  189751. sp_1024_mont_sub_32(ctx->t4, ctx->t4, ctx->t3, p1024_mod);
  189752. ctx->state = 14;
  189753. break;
  189754. case 14:
  189755. /* Z3 = H*Z1*Z2 */
  189756. sp_1024_mont_mul_32(ctx->z, ctx->z, q->z, p1024_mod, p1024_mp_mod);
  189757. ctx->state = 15;
  189758. break;
  189759. case 15:
  189760. sp_1024_mont_mul_32(ctx->z, ctx->z, ctx->t2, p1024_mod, p1024_mp_mod);
  189761. ctx->state = 16;
  189762. break;
  189763. case 16:
  189764. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  189765. sp_1024_mont_sqr_32(ctx->x, ctx->t4, p1024_mod, p1024_mp_mod);
  189766. ctx->state = 17;
  189767. break;
  189768. case 17:
  189769. sp_1024_mont_sqr_32(ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  189770. ctx->state = 18;
  189771. break;
  189772. case 18:
  189773. sp_1024_mont_mul_32(ctx->y, ctx->t1, ctx->t5, p1024_mod, p1024_mp_mod);
  189774. ctx->state = 19;
  189775. break;
  189776. case 19:
  189777. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  189778. ctx->state = 20;
  189779. break;
  189780. case 20:
  189781. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t5, p1024_mod);
  189782. ctx->state = 21;
  189783. break;
  189784. case 21:
  189785. sp_1024_mont_dbl_32(ctx->t1, ctx->y, p1024_mod);
  189786. ctx->state = 22;
  189787. break;
  189788. case 22:
  189789. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t1, p1024_mod);
  189790. ctx->state = 23;
  189791. break;
  189792. case 23:
  189793. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  189794. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  189795. ctx->state = 24;
  189796. break;
  189797. case 24:
  189798. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t4, p1024_mod, p1024_mp_mod);
  189799. ctx->state = 25;
  189800. break;
  189801. case 25:
  189802. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t3, p1024_mod, p1024_mp_mod);
  189803. ctx->state = 26;
  189804. break;
  189805. case 26:
  189806. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t5, p1024_mod);
  189807. ctx->state = 27;
  189808. /* fall-through */
  189809. case 27:
  189810. err = MP_OKAY;
  189811. break;
  189812. }
  189813. if (err == MP_OKAY && ctx->state != 27) {
  189814. err = FP_WOULDBLOCK;
  189815. }
  189816. return err;
  189817. }
  189818. #endif /* WOLFSSL_SP_NONBLOCK */
  189819. static void sp_1024_proj_point_add_32(sp_point_1024* r,
  189820. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  189821. {
  189822. const sp_point_1024* ap[2];
  189823. sp_point_1024* rp[2];
  189824. sp_digit* t1 = t;
  189825. sp_digit* t2 = t + 2*32;
  189826. sp_digit* t3 = t + 4*32;
  189827. sp_digit* t4 = t + 6*32;
  189828. sp_digit* t5 = t + 8*32;
  189829. sp_digit* x;
  189830. sp_digit* y;
  189831. sp_digit* z;
  189832. int i;
  189833. /* Ensure only the first point is the same as the result. */
  189834. if (q == r) {
  189835. const sp_point_1024* a = p;
  189836. p = q;
  189837. q = a;
  189838. }
  189839. /* Check double */
  189840. (void)sp_1024_mont_sub_32(t1, p1024_mod, q->y, p1024_mod);
  189841. sp_1024_norm_32(t1);
  189842. if ((sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  189843. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, t1))) != 0) {
  189844. sp_1024_proj_point_dbl_32(r, p, t);
  189845. }
  189846. else {
  189847. rp[0] = r;
  189848. /*lint allow cast to different type of pointer*/
  189849. rp[1] = (sp_point_1024*)t; /*lint !e9087 !e740*/
  189850. XMEMSET(rp[1], 0, sizeof(sp_point_1024));
  189851. x = rp[p->infinity | q->infinity]->x;
  189852. y = rp[p->infinity | q->infinity]->y;
  189853. z = rp[p->infinity | q->infinity]->z;
  189854. ap[0] = p;
  189855. ap[1] = q;
  189856. for (i=0; i<32; i++) {
  189857. r->x[i] = ap[p->infinity]->x[i];
  189858. }
  189859. for (i=0; i<32; i++) {
  189860. r->y[i] = ap[p->infinity]->y[i];
  189861. }
  189862. for (i=0; i<32; i++) {
  189863. r->z[i] = ap[p->infinity]->z[i];
  189864. }
  189865. r->infinity = ap[p->infinity]->infinity;
  189866. /* U1 = X1*Z2^2 */
  189867. sp_1024_mont_sqr_32(t1, q->z, p1024_mod, p1024_mp_mod);
  189868. sp_1024_mont_mul_32(t3, t1, q->z, p1024_mod, p1024_mp_mod);
  189869. sp_1024_mont_mul_32(t1, t1, x, p1024_mod, p1024_mp_mod);
  189870. /* U2 = X2*Z1^2 */
  189871. sp_1024_mont_sqr_32(t2, z, p1024_mod, p1024_mp_mod);
  189872. sp_1024_mont_mul_32(t4, t2, z, p1024_mod, p1024_mp_mod);
  189873. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  189874. /* S1 = Y1*Z2^3 */
  189875. sp_1024_mont_mul_32(t3, t3, y, p1024_mod, p1024_mp_mod);
  189876. /* S2 = Y2*Z1^3 */
  189877. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  189878. /* H = U2 - U1 */
  189879. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  189880. /* R = S2 - S1 */
  189881. sp_1024_mont_sub_32(t4, t4, t3, p1024_mod);
  189882. /* Z3 = H*Z1*Z2 */
  189883. sp_1024_mont_mul_32(z, z, q->z, p1024_mod, p1024_mp_mod);
  189884. sp_1024_mont_mul_32(z, z, t2, p1024_mod, p1024_mp_mod);
  189885. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  189886. sp_1024_mont_sqr_32(x, t4, p1024_mod, p1024_mp_mod);
  189887. sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod);
  189888. sp_1024_mont_mul_32(y, t1, t5, p1024_mod, p1024_mp_mod);
  189889. sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod);
  189890. sp_1024_mont_sub_32(x, x, t5, p1024_mod);
  189891. sp_1024_mont_dbl_32(t1, y, p1024_mod);
  189892. sp_1024_mont_sub_32(x, x, t1, p1024_mod);
  189893. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  189894. sp_1024_mont_sub_32(y, y, x, p1024_mod);
  189895. sp_1024_mont_mul_32(y, y, t4, p1024_mod, p1024_mp_mod);
  189896. sp_1024_mont_mul_32(t5, t5, t3, p1024_mod, p1024_mp_mod);
  189897. sp_1024_mont_sub_32(y, y, t5, p1024_mod);
  189898. }
  189899. }
  189900. /* Multiply the point by the scalar and return the result.
  189901. * If map is true then convert result to affine coordinates.
  189902. *
  189903. * Fast implementation that generates a pre-computation table.
  189904. * 4 bits of window (no sliding!).
  189905. * Uses add and double for calculating table.
  189906. * 1024 doubles.
  189907. * 268 adds.
  189908. *
  189909. * r Resulting point.
  189910. * g Point to multiply.
  189911. * k Scalar to multiply by.
  189912. * map Indicates whether to convert result to affine.
  189913. * ct Constant time required.
  189914. * heap Heap to use for allocation.
  189915. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  189916. */
  189917. static int sp_1024_ecc_mulmod_fast_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  189918. int map, int ct, void* heap)
  189919. {
  189920. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  189921. sp_point_1024* t = NULL;
  189922. sp_digit* tmp = NULL;
  189923. #else
  189924. sp_point_1024 t[16 + 1];
  189925. sp_digit tmp[2 * 32 * 5];
  189926. #endif
  189927. sp_point_1024* rt = NULL;
  189928. sp_digit n;
  189929. int i;
  189930. int c;
  189931. int y;
  189932. int err = MP_OKAY;
  189933. /* Constant time used for cache attack resistance implementation. */
  189934. (void)ct;
  189935. (void)heap;
  189936. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  189937. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (16 + 1),
  189938. heap, DYNAMIC_TYPE_ECC);
  189939. if (t == NULL)
  189940. err = MEMORY_E;
  189941. if (err == MP_OKAY) {
  189942. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 5, heap,
  189943. DYNAMIC_TYPE_ECC);
  189944. if (tmp == NULL)
  189945. err = MEMORY_E;
  189946. }
  189947. #endif
  189948. if (err == MP_OKAY) {
  189949. rt = t + 16;
  189950. /* t[0] = {0, 0, 1} * norm */
  189951. XMEMSET(&t[0], 0, sizeof(t[0]));
  189952. t[0].infinity = 1;
  189953. /* t[1] = {g->x, g->y, g->z} * norm */
  189954. (void)sp_1024_mod_mul_norm_32(t[1].x, g->x, p1024_mod);
  189955. (void)sp_1024_mod_mul_norm_32(t[1].y, g->y, p1024_mod);
  189956. (void)sp_1024_mod_mul_norm_32(t[1].z, g->z, p1024_mod);
  189957. t[1].infinity = 0;
  189958. sp_1024_proj_point_dbl_32(&t[ 2], &t[ 1], tmp);
  189959. t[ 2].infinity = 0;
  189960. sp_1024_proj_point_add_32(&t[ 3], &t[ 2], &t[ 1], tmp);
  189961. t[ 3].infinity = 0;
  189962. sp_1024_proj_point_dbl_32(&t[ 4], &t[ 2], tmp);
  189963. t[ 4].infinity = 0;
  189964. sp_1024_proj_point_add_32(&t[ 5], &t[ 3], &t[ 2], tmp);
  189965. t[ 5].infinity = 0;
  189966. sp_1024_proj_point_dbl_32(&t[ 6], &t[ 3], tmp);
  189967. t[ 6].infinity = 0;
  189968. sp_1024_proj_point_add_32(&t[ 7], &t[ 4], &t[ 3], tmp);
  189969. t[ 7].infinity = 0;
  189970. sp_1024_proj_point_dbl_32(&t[ 8], &t[ 4], tmp);
  189971. t[ 8].infinity = 0;
  189972. sp_1024_proj_point_add_32(&t[ 9], &t[ 5], &t[ 4], tmp);
  189973. t[ 9].infinity = 0;
  189974. sp_1024_proj_point_dbl_32(&t[10], &t[ 5], tmp);
  189975. t[10].infinity = 0;
  189976. sp_1024_proj_point_add_32(&t[11], &t[ 6], &t[ 5], tmp);
  189977. t[11].infinity = 0;
  189978. sp_1024_proj_point_dbl_32(&t[12], &t[ 6], tmp);
  189979. t[12].infinity = 0;
  189980. sp_1024_proj_point_add_32(&t[13], &t[ 7], &t[ 6], tmp);
  189981. t[13].infinity = 0;
  189982. sp_1024_proj_point_dbl_32(&t[14], &t[ 7], tmp);
  189983. t[14].infinity = 0;
  189984. sp_1024_proj_point_add_32(&t[15], &t[ 8], &t[ 7], tmp);
  189985. t[15].infinity = 0;
  189986. i = 30;
  189987. n = k[i+1] << 0;
  189988. c = 28;
  189989. y = (int)(n >> 28);
  189990. XMEMCPY(rt, &t[y], sizeof(sp_point_1024));
  189991. n <<= 4;
  189992. for (; i>=0 || c>=4; ) {
  189993. if (c < 4) {
  189994. n |= k[i--];
  189995. c += 32;
  189996. }
  189997. y = (n >> 28) & 0xf;
  189998. n <<= 4;
  189999. c -= 4;
  190000. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  190001. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  190002. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  190003. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  190004. sp_1024_proj_point_add_32(rt, rt, &t[y], tmp);
  190005. }
  190006. if (map != 0) {
  190007. sp_1024_map_32(r, rt, tmp);
  190008. }
  190009. else {
  190010. XMEMCPY(r, rt, sizeof(sp_point_1024));
  190011. }
  190012. }
  190013. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190014. if (tmp != NULL)
  190015. #endif
  190016. {
  190017. ForceZero(tmp, sizeof(sp_digit) * 2 * 32 * 5);
  190018. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190019. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  190020. #endif
  190021. }
  190022. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190023. if (t != NULL)
  190024. #endif
  190025. {
  190026. ForceZero(t, sizeof(sp_point_1024) * 17);
  190027. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190028. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  190029. #endif
  190030. }
  190031. return err;
  190032. }
  190033. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  190034. /* Double the Montgomery form projective point p a number of times.
  190035. *
  190036. * r Result of repeated doubling of point.
  190037. * p Point to double.
  190038. * n Number of times to double
  190039. * t Temporary ordinate data.
  190040. */
  190041. static void sp_1024_proj_point_dbl_n_32(sp_point_1024* p, int n,
  190042. sp_digit* t)
  190043. {
  190044. sp_digit* w = t;
  190045. sp_digit* a = t + 2*32;
  190046. sp_digit* b = t + 4*32;
  190047. sp_digit* t1 = t + 6*32;
  190048. sp_digit* t2 = t + 8*32;
  190049. sp_digit* x;
  190050. sp_digit* y;
  190051. sp_digit* z;
  190052. x = p->x;
  190053. y = p->y;
  190054. z = p->z;
  190055. /* Y = 2*Y */
  190056. sp_1024_mont_dbl_32(y, y, p1024_mod);
  190057. /* W = Z^4 */
  190058. sp_1024_mont_sqr_32(w, z, p1024_mod, p1024_mp_mod);
  190059. sp_1024_mont_sqr_32(w, w, p1024_mod, p1024_mp_mod);
  190060. #ifndef WOLFSSL_SP_SMALL
  190061. while (--n > 0)
  190062. #else
  190063. while (--n >= 0)
  190064. #endif
  190065. {
  190066. /* A = 3*(X^2 - W) */
  190067. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  190068. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  190069. sp_1024_mont_tpl_32(a, t1, p1024_mod);
  190070. /* B = X*Y^2 */
  190071. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  190072. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  190073. /* X = A^2 - 2B */
  190074. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  190075. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  190076. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  190077. /* Z = Z*Y */
  190078. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  190079. /* t2 = Y^4 */
  190080. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  190081. #ifdef WOLFSSL_SP_SMALL
  190082. if (n != 0)
  190083. #endif
  190084. {
  190085. /* W = W*Y^4 */
  190086. sp_1024_mont_mul_32(w, w, t1, p1024_mod, p1024_mp_mod);
  190087. }
  190088. /* y = 2*A*(B - X) - Y^4 */
  190089. sp_1024_mont_sub_32(y, b, x, p1024_mod);
  190090. sp_1024_mont_mul_32(y, y, a, p1024_mod, p1024_mp_mod);
  190091. sp_1024_mont_dbl_32(y, y, p1024_mod);
  190092. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  190093. }
  190094. #ifndef WOLFSSL_SP_SMALL
  190095. /* A = 3*(X^2 - W) */
  190096. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  190097. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  190098. sp_1024_mont_tpl_32(a, t1, p1024_mod);
  190099. /* B = X*Y^2 */
  190100. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  190101. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  190102. /* X = A^2 - 2B */
  190103. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  190104. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  190105. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  190106. /* Z = Z*Y */
  190107. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  190108. /* t2 = Y^4 */
  190109. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  190110. /* y = 2*A*(B - X) - Y^4 */
  190111. sp_1024_mont_sub_32(y, b, x, p1024_mod);
  190112. sp_1024_mont_mul_32(y, y, a, p1024_mod, p1024_mp_mod);
  190113. sp_1024_mont_dbl_32(y, y, p1024_mod);
  190114. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  190115. #endif
  190116. /* Y = Y/2 */
  190117. sp_1024_div2_32(y, y, p1024_mod);
  190118. }
  190119. /* Convert the projective point to affine.
  190120. * Ordinates are in Montgomery form.
  190121. *
  190122. * a Point to convert.
  190123. * t Temporary data.
  190124. */
  190125. static void sp_1024_proj_to_affine_32(sp_point_1024* a, sp_digit* t)
  190126. {
  190127. sp_digit* t1 = t;
  190128. sp_digit* t2 = t + 2 * 32;
  190129. sp_digit* tmp = t + 4 * 32;
  190130. sp_1024_mont_inv_32(t1, a->z, tmp);
  190131. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  190132. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  190133. sp_1024_mont_mul_32(a->x, a->x, t2, p1024_mod, p1024_mp_mod);
  190134. sp_1024_mont_mul_32(a->y, a->y, t1, p1024_mod, p1024_mp_mod);
  190135. XMEMCPY(a->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  190136. }
  190137. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  190138. /* A table entry for pre-computed points. */
  190139. typedef struct sp_table_entry_1024 {
  190140. sp_digit x[32];
  190141. sp_digit y[32];
  190142. } sp_table_entry_1024;
  190143. #ifdef FP_ECC
  190144. #endif /* FP_ECC */
  190145. /* Add two Montgomery form projective points. The second point has a q value of
  190146. * one.
  190147. * Only the first point can be the same pointer as the result point.
  190148. *
  190149. * r Result of addition.
  190150. * p First point to add.
  190151. * q Second point to add.
  190152. * t Temporary ordinate data.
  190153. */
  190154. static void sp_1024_proj_point_add_qz1_32(sp_point_1024* r, const sp_point_1024* p,
  190155. const sp_point_1024* q, sp_digit* t)
  190156. {
  190157. const sp_point_1024* ap[2];
  190158. sp_point_1024* rp[2];
  190159. sp_digit* t1 = t;
  190160. sp_digit* t2 = t + 2*32;
  190161. sp_digit* t3 = t + 4*32;
  190162. sp_digit* t4 = t + 6*32;
  190163. sp_digit* t5 = t + 8*32;
  190164. sp_digit* x;
  190165. sp_digit* y;
  190166. sp_digit* z;
  190167. int i;
  190168. /* Check double */
  190169. (void)sp_1024_mont_sub_32(t1, p1024_mod, q->y, p1024_mod);
  190170. sp_1024_norm_32(t1);
  190171. if ((sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  190172. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, t1))) != 0) {
  190173. sp_1024_proj_point_dbl_32(r, p, t);
  190174. }
  190175. else {
  190176. rp[0] = r;
  190177. /*lint allow cast to different type of pointer*/
  190178. rp[1] = (sp_point_1024*)t; /*lint !e9087 !e740*/
  190179. XMEMSET(rp[1], 0, sizeof(sp_point_1024));
  190180. x = rp[p->infinity | q->infinity]->x;
  190181. y = rp[p->infinity | q->infinity]->y;
  190182. z = rp[p->infinity | q->infinity]->z;
  190183. ap[0] = p;
  190184. ap[1] = q;
  190185. for (i=0; i<32; i++) {
  190186. r->x[i] = ap[p->infinity]->x[i];
  190187. }
  190188. for (i=0; i<32; i++) {
  190189. r->y[i] = ap[p->infinity]->y[i];
  190190. }
  190191. for (i=0; i<32; i++) {
  190192. r->z[i] = ap[p->infinity]->z[i];
  190193. }
  190194. r->infinity = ap[p->infinity]->infinity;
  190195. /* U2 = X2*Z1^2 */
  190196. sp_1024_mont_sqr_32(t2, z, p1024_mod, p1024_mp_mod);
  190197. sp_1024_mont_mul_32(t4, t2, z, p1024_mod, p1024_mp_mod);
  190198. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  190199. /* S2 = Y2*Z1^3 */
  190200. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  190201. /* H = U2 - X1 */
  190202. sp_1024_mont_sub_32(t2, t2, x, p1024_mod);
  190203. /* R = S2 - Y1 */
  190204. sp_1024_mont_sub_32(t4, t4, y, p1024_mod);
  190205. /* Z3 = H*Z1 */
  190206. sp_1024_mont_mul_32(z, z, t2, p1024_mod, p1024_mp_mod);
  190207. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  190208. sp_1024_mont_sqr_32(t1, t4, p1024_mod, p1024_mp_mod);
  190209. sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod);
  190210. sp_1024_mont_mul_32(t3, x, t5, p1024_mod, p1024_mp_mod);
  190211. sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod);
  190212. sp_1024_mont_sub_32(x, t1, t5, p1024_mod);
  190213. sp_1024_mont_dbl_32(t1, t3, p1024_mod);
  190214. sp_1024_mont_sub_32(x, x, t1, p1024_mod);
  190215. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  190216. sp_1024_mont_sub_32(t3, t3, x, p1024_mod);
  190217. sp_1024_mont_mul_32(t3, t3, t4, p1024_mod, p1024_mp_mod);
  190218. sp_1024_mont_mul_32(t5, t5, y, p1024_mod, p1024_mp_mod);
  190219. sp_1024_mont_sub_32(y, t3, t5, p1024_mod);
  190220. }
  190221. }
  190222. #ifdef WOLFSSL_SP_SMALL
  190223. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  190224. /* Generate the pre-computed table of points for the base point.
  190225. *
  190226. * width = 4
  190227. * 16 entries
  190228. * 256 bits between
  190229. *
  190230. * a The base point.
  190231. * table Place to store generated point data.
  190232. * tmp Temporary data.
  190233. * heap Heap to use for allocation.
  190234. */
  190235. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  190236. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  190237. {
  190238. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190239. sp_point_1024* t = NULL;
  190240. #else
  190241. sp_point_1024 t[3];
  190242. #endif
  190243. sp_point_1024* s1 = NULL;
  190244. sp_point_1024* s2 = NULL;
  190245. int i;
  190246. int j;
  190247. int err = MP_OKAY;
  190248. (void)heap;
  190249. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190250. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  190251. DYNAMIC_TYPE_ECC);
  190252. if (t == NULL)
  190253. err = MEMORY_E;
  190254. #endif
  190255. if (err == MP_OKAY) {
  190256. s1 = t + 1;
  190257. s2 = t + 2;
  190258. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  190259. }
  190260. if (err == MP_OKAY) {
  190261. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  190262. }
  190263. if (err == MP_OKAY) {
  190264. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  190265. }
  190266. if (err == MP_OKAY) {
  190267. t->infinity = 0;
  190268. sp_1024_proj_to_affine_32(t, tmp);
  190269. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  190270. s1->infinity = 0;
  190271. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  190272. s2->infinity = 0;
  190273. /* table[0] = {0, 0, infinity} */
  190274. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  190275. /* table[1] = Affine version of 'a' in Montgomery form */
  190276. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  190277. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  190278. for (i=1; i<4; i++) {
  190279. sp_1024_proj_point_dbl_n_32(t, 256, tmp);
  190280. sp_1024_proj_to_affine_32(t, tmp);
  190281. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  190282. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  190283. }
  190284. for (i=1; i<4; i++) {
  190285. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  190286. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  190287. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  190288. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  190289. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  190290. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  190291. sp_1024_proj_to_affine_32(t, tmp);
  190292. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  190293. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  190294. }
  190295. }
  190296. }
  190297. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190298. if (t != NULL)
  190299. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  190300. #endif
  190301. return err;
  190302. }
  190303. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  190304. /* Multiply the point by the scalar and return the result.
  190305. * If map is true then convert result to affine coordinates.
  190306. *
  190307. * Stripe implementation.
  190308. * Pre-generated: 2^0, 2^256, ...
  190309. * Pre-generated: products of all combinations of above.
  190310. * 4 doubles and adds (with qz=1)
  190311. *
  190312. * r Resulting point.
  190313. * k Scalar to multiply by.
  190314. * table Pre-computed table.
  190315. * map Indicates whether to convert result to affine.
  190316. * ct Constant time required.
  190317. * heap Heap to use for allocation.
  190318. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  190319. */
  190320. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  190321. const sp_table_entry_1024* table, const sp_digit* k, int map,
  190322. int ct, void* heap)
  190323. {
  190324. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190325. sp_point_1024* rt = NULL;
  190326. sp_digit* t = NULL;
  190327. #else
  190328. sp_point_1024 rt[2];
  190329. sp_digit t[2 * 32 * 5];
  190330. #endif
  190331. sp_point_1024* p = NULL;
  190332. int i;
  190333. int j;
  190334. int y;
  190335. int x;
  190336. int err = MP_OKAY;
  190337. (void)g;
  190338. /* Constant time used for cache attack resistance implementation. */
  190339. (void)ct;
  190340. (void)heap;
  190341. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190342. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  190343. DYNAMIC_TYPE_ECC);
  190344. if (rt == NULL)
  190345. err = MEMORY_E;
  190346. if (err == MP_OKAY) {
  190347. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 5, heap,
  190348. DYNAMIC_TYPE_ECC);
  190349. if (t == NULL)
  190350. err = MEMORY_E;
  190351. }
  190352. #endif
  190353. if (err == MP_OKAY) {
  190354. p = rt + 1;
  190355. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  190356. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  190357. y = 0;
  190358. x = 255;
  190359. for (j=0; j<4; j++) {
  190360. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  190361. x += 256;
  190362. }
  190363. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  190364. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  190365. rt->infinity = !y;
  190366. for (i=254; i>=0; i--) {
  190367. y = 0;
  190368. x = i;
  190369. for (j=0; j<4; j++) {
  190370. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  190371. x += 256;
  190372. }
  190373. sp_1024_proj_point_dbl_32(rt, rt, t);
  190374. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  190375. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  190376. p->infinity = !y;
  190377. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  190378. }
  190379. if (map != 0) {
  190380. sp_1024_map_32(r, rt, t);
  190381. }
  190382. else {
  190383. XMEMCPY(r, rt, sizeof(sp_point_1024));
  190384. }
  190385. }
  190386. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190387. if (t != NULL)
  190388. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  190389. if (rt != NULL)
  190390. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  190391. #endif
  190392. return err;
  190393. }
  190394. #ifdef FP_ECC
  190395. #ifndef FP_ENTRIES
  190396. #define FP_ENTRIES 16
  190397. #endif
  190398. /* Cache entry - holds precomputation tables for a point. */
  190399. typedef struct sp_cache_1024_t {
  190400. /* X ordinate of point that table was generated from. */
  190401. sp_digit x[32];
  190402. /* Y ordinate of point that table was generated from. */
  190403. sp_digit y[32];
  190404. /* Precomputation table for point. */
  190405. sp_table_entry_1024 table[16];
  190406. /* Count of entries in table. */
  190407. uint32_t cnt;
  190408. /* Point and table set in entry. */
  190409. int set;
  190410. } sp_cache_1024_t;
  190411. /* Cache of tables. */
  190412. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  190413. /* Index of last entry in cache. */
  190414. static THREAD_LS_T int sp_cache_1024_last = -1;
  190415. /* Cache has been initialized. */
  190416. static THREAD_LS_T int sp_cache_1024_inited = 0;
  190417. #ifndef HAVE_THREAD_LS
  190418. static volatile int initCacheMutex_1024 = 0;
  190419. static wolfSSL_Mutex sp_cache_1024_lock;
  190420. #endif
  190421. /* Get the cache entry for the point.
  190422. *
  190423. * g [in] Point scalar multipling.
  190424. * cache [out] Cache table to use.
  190425. */
  190426. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  190427. {
  190428. int i;
  190429. int j;
  190430. uint32_t least;
  190431. if (sp_cache_1024_inited == 0) {
  190432. for (i=0; i<FP_ENTRIES; i++) {
  190433. sp_cache_1024[i].set = 0;
  190434. }
  190435. sp_cache_1024_inited = 1;
  190436. }
  190437. /* Compare point with those in cache. */
  190438. for (i=0; i<FP_ENTRIES; i++) {
  190439. if (!sp_cache_1024[i].set)
  190440. continue;
  190441. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  190442. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  190443. sp_cache_1024[i].cnt++;
  190444. break;
  190445. }
  190446. }
  190447. /* No match. */
  190448. if (i == FP_ENTRIES) {
  190449. /* Find empty entry. */
  190450. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  190451. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  190452. if (!sp_cache_1024[i].set) {
  190453. break;
  190454. }
  190455. }
  190456. /* Evict least used. */
  190457. if (i == sp_cache_1024_last) {
  190458. least = sp_cache_1024[0].cnt;
  190459. for (j=1; j<FP_ENTRIES; j++) {
  190460. if (sp_cache_1024[j].cnt < least) {
  190461. i = j;
  190462. least = sp_cache_1024[i].cnt;
  190463. }
  190464. }
  190465. }
  190466. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  190467. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  190468. sp_cache_1024[i].set = 1;
  190469. sp_cache_1024[i].cnt = 1;
  190470. }
  190471. *cache = &sp_cache_1024[i];
  190472. sp_cache_1024_last = i;
  190473. }
  190474. #endif /* FP_ECC */
  190475. /* Multiply the base point of P1024 by the scalar and return the result.
  190476. * If map is true then convert result to affine coordinates.
  190477. *
  190478. * r Resulting point.
  190479. * g Point to multiply.
  190480. * k Scalar to multiply by.
  190481. * map Indicates whether to convert result to affine.
  190482. * ct Constant time required.
  190483. * heap Heap to use for allocation.
  190484. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  190485. */
  190486. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  190487. int map, int ct, void* heap)
  190488. {
  190489. #ifndef FP_ECC
  190490. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  190491. #else
  190492. sp_digit tmp[2 * 32 * 5];
  190493. sp_cache_1024_t* cache;
  190494. int err = MP_OKAY;
  190495. #ifndef HAVE_THREAD_LS
  190496. if (initCacheMutex_1024 == 0) {
  190497. wc_InitMutex(&sp_cache_1024_lock);
  190498. initCacheMutex_1024 = 1;
  190499. }
  190500. if (wc_LockMutex(&sp_cache_1024_lock) != 0)
  190501. err = BAD_MUTEX_E;
  190502. #endif /* HAVE_THREAD_LS */
  190503. if (err == MP_OKAY) {
  190504. sp_ecc_get_cache_1024(g, &cache);
  190505. if (cache->cnt == 2)
  190506. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  190507. #ifndef HAVE_THREAD_LS
  190508. wc_UnLockMutex(&sp_cache_1024_lock);
  190509. #endif /* HAVE_THREAD_LS */
  190510. if (cache->cnt < 2) {
  190511. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  190512. }
  190513. else {
  190514. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  190515. map, ct, heap);
  190516. }
  190517. }
  190518. return err;
  190519. #endif
  190520. }
  190521. #else
  190522. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  190523. /* Generate the pre-computed table of points for the base point.
  190524. *
  190525. * width = 8
  190526. * 256 entries
  190527. * 128 bits between
  190528. *
  190529. * a The base point.
  190530. * table Place to store generated point data.
  190531. * tmp Temporary data.
  190532. * heap Heap to use for allocation.
  190533. */
  190534. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  190535. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  190536. {
  190537. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190538. sp_point_1024* t = NULL;
  190539. #else
  190540. sp_point_1024 t[3];
  190541. #endif
  190542. sp_point_1024* s1 = NULL;
  190543. sp_point_1024* s2 = NULL;
  190544. int i;
  190545. int j;
  190546. int err = MP_OKAY;
  190547. (void)heap;
  190548. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190549. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  190550. DYNAMIC_TYPE_ECC);
  190551. if (t == NULL)
  190552. err = MEMORY_E;
  190553. #endif
  190554. if (err == MP_OKAY) {
  190555. s1 = t + 1;
  190556. s2 = t + 2;
  190557. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  190558. }
  190559. if (err == MP_OKAY) {
  190560. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  190561. }
  190562. if (err == MP_OKAY) {
  190563. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  190564. }
  190565. if (err == MP_OKAY) {
  190566. t->infinity = 0;
  190567. sp_1024_proj_to_affine_32(t, tmp);
  190568. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  190569. s1->infinity = 0;
  190570. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  190571. s2->infinity = 0;
  190572. /* table[0] = {0, 0, infinity} */
  190573. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  190574. /* table[1] = Affine version of 'a' in Montgomery form */
  190575. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  190576. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  190577. for (i=1; i<8; i++) {
  190578. sp_1024_proj_point_dbl_n_32(t, 128, tmp);
  190579. sp_1024_proj_to_affine_32(t, tmp);
  190580. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  190581. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  190582. }
  190583. for (i=1; i<8; i++) {
  190584. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  190585. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  190586. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  190587. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  190588. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  190589. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  190590. sp_1024_proj_to_affine_32(t, tmp);
  190591. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  190592. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  190593. }
  190594. }
  190595. }
  190596. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190597. if (t != NULL)
  190598. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  190599. #endif
  190600. return err;
  190601. }
  190602. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  190603. /* Multiply the point by the scalar and return the result.
  190604. * If map is true then convert result to affine coordinates.
  190605. *
  190606. * Stripe implementation.
  190607. * Pre-generated: 2^0, 2^128, ...
  190608. * Pre-generated: products of all combinations of above.
  190609. * 8 doubles and adds (with qz=1)
  190610. *
  190611. * r Resulting point.
  190612. * k Scalar to multiply by.
  190613. * table Pre-computed table.
  190614. * map Indicates whether to convert result to affine.
  190615. * ct Constant time required.
  190616. * heap Heap to use for allocation.
  190617. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  190618. */
  190619. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  190620. const sp_table_entry_1024* table, const sp_digit* k, int map,
  190621. int ct, void* heap)
  190622. {
  190623. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190624. sp_point_1024* rt = NULL;
  190625. sp_digit* t = NULL;
  190626. #else
  190627. sp_point_1024 rt[2];
  190628. sp_digit t[2 * 32 * 5];
  190629. #endif
  190630. sp_point_1024* p = NULL;
  190631. int i;
  190632. int j;
  190633. int y;
  190634. int x;
  190635. int err = MP_OKAY;
  190636. (void)g;
  190637. /* Constant time used for cache attack resistance implementation. */
  190638. (void)ct;
  190639. (void)heap;
  190640. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190641. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  190642. DYNAMIC_TYPE_ECC);
  190643. if (rt == NULL)
  190644. err = MEMORY_E;
  190645. if (err == MP_OKAY) {
  190646. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 5, heap,
  190647. DYNAMIC_TYPE_ECC);
  190648. if (t == NULL)
  190649. err = MEMORY_E;
  190650. }
  190651. #endif
  190652. if (err == MP_OKAY) {
  190653. p = rt + 1;
  190654. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  190655. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  190656. y = 0;
  190657. x = 127;
  190658. for (j=0; j<8; j++) {
  190659. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  190660. x += 128;
  190661. }
  190662. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  190663. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  190664. rt->infinity = !y;
  190665. for (i=126; i>=0; i--) {
  190666. y = 0;
  190667. x = i;
  190668. for (j=0; j<8; j++) {
  190669. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  190670. x += 128;
  190671. }
  190672. sp_1024_proj_point_dbl_32(rt, rt, t);
  190673. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  190674. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  190675. p->infinity = !y;
  190676. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  190677. }
  190678. if (map != 0) {
  190679. sp_1024_map_32(r, rt, t);
  190680. }
  190681. else {
  190682. XMEMCPY(r, rt, sizeof(sp_point_1024));
  190683. }
  190684. }
  190685. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190686. if (t != NULL)
  190687. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  190688. if (rt != NULL)
  190689. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  190690. #endif
  190691. return err;
  190692. }
  190693. #ifdef FP_ECC
  190694. #ifndef FP_ENTRIES
  190695. #define FP_ENTRIES 16
  190696. #endif
  190697. /* Cache entry - holds precomputation tables for a point. */
  190698. typedef struct sp_cache_1024_t {
  190699. /* X ordinate of point that table was generated from. */
  190700. sp_digit x[32];
  190701. /* Y ordinate of point that table was generated from. */
  190702. sp_digit y[32];
  190703. /* Precomputation table for point. */
  190704. sp_table_entry_1024 table[256];
  190705. /* Count of entries in table. */
  190706. uint32_t cnt;
  190707. /* Point and table set in entry. */
  190708. int set;
  190709. } sp_cache_1024_t;
  190710. /* Cache of tables. */
  190711. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  190712. /* Index of last entry in cache. */
  190713. static THREAD_LS_T int sp_cache_1024_last = -1;
  190714. /* Cache has been initialized. */
  190715. static THREAD_LS_T int sp_cache_1024_inited = 0;
  190716. #ifndef HAVE_THREAD_LS
  190717. static volatile int initCacheMutex_1024 = 0;
  190718. static wolfSSL_Mutex sp_cache_1024_lock;
  190719. #endif
  190720. /* Get the cache entry for the point.
  190721. *
  190722. * g [in] Point scalar multipling.
  190723. * cache [out] Cache table to use.
  190724. */
  190725. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  190726. {
  190727. int i;
  190728. int j;
  190729. uint32_t least;
  190730. if (sp_cache_1024_inited == 0) {
  190731. for (i=0; i<FP_ENTRIES; i++) {
  190732. sp_cache_1024[i].set = 0;
  190733. }
  190734. sp_cache_1024_inited = 1;
  190735. }
  190736. /* Compare point with those in cache. */
  190737. for (i=0; i<FP_ENTRIES; i++) {
  190738. if (!sp_cache_1024[i].set)
  190739. continue;
  190740. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  190741. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  190742. sp_cache_1024[i].cnt++;
  190743. break;
  190744. }
  190745. }
  190746. /* No match. */
  190747. if (i == FP_ENTRIES) {
  190748. /* Find empty entry. */
  190749. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  190750. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  190751. if (!sp_cache_1024[i].set) {
  190752. break;
  190753. }
  190754. }
  190755. /* Evict least used. */
  190756. if (i == sp_cache_1024_last) {
  190757. least = sp_cache_1024[0].cnt;
  190758. for (j=1; j<FP_ENTRIES; j++) {
  190759. if (sp_cache_1024[j].cnt < least) {
  190760. i = j;
  190761. least = sp_cache_1024[i].cnt;
  190762. }
  190763. }
  190764. }
  190765. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  190766. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  190767. sp_cache_1024[i].set = 1;
  190768. sp_cache_1024[i].cnt = 1;
  190769. }
  190770. *cache = &sp_cache_1024[i];
  190771. sp_cache_1024_last = i;
  190772. }
  190773. #endif /* FP_ECC */
  190774. /* Multiply the base point of P1024 by the scalar and return the result.
  190775. * If map is true then convert result to affine coordinates.
  190776. *
  190777. * r Resulting point.
  190778. * g Point to multiply.
  190779. * k Scalar to multiply by.
  190780. * map Indicates whether to convert result to affine.
  190781. * ct Constant time required.
  190782. * heap Heap to use for allocation.
  190783. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  190784. */
  190785. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  190786. int map, int ct, void* heap)
  190787. {
  190788. #ifndef FP_ECC
  190789. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  190790. #else
  190791. sp_digit tmp[2 * 32 * 5];
  190792. sp_cache_1024_t* cache;
  190793. int err = MP_OKAY;
  190794. #ifndef HAVE_THREAD_LS
  190795. if (initCacheMutex_1024 == 0) {
  190796. wc_InitMutex(&sp_cache_1024_lock);
  190797. initCacheMutex_1024 = 1;
  190798. }
  190799. if (wc_LockMutex(&sp_cache_1024_lock) != 0)
  190800. err = BAD_MUTEX_E;
  190801. #endif /* HAVE_THREAD_LS */
  190802. if (err == MP_OKAY) {
  190803. sp_ecc_get_cache_1024(g, &cache);
  190804. if (cache->cnt == 2)
  190805. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  190806. #ifndef HAVE_THREAD_LS
  190807. wc_UnLockMutex(&sp_cache_1024_lock);
  190808. #endif /* HAVE_THREAD_LS */
  190809. if (cache->cnt < 2) {
  190810. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  190811. }
  190812. else {
  190813. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  190814. map, ct, heap);
  190815. }
  190816. }
  190817. return err;
  190818. #endif
  190819. }
  190820. #endif /* WOLFSSL_SP_SMALL */
  190821. /* Multiply the point by the scalar and return the result.
  190822. * If map is true then convert result to affine coordinates.
  190823. *
  190824. * km Scalar to multiply by.
  190825. * p Point to multiply.
  190826. * r Resulting point.
  190827. * map Indicates whether to convert result to affine.
  190828. * heap Heap to use for allocation.
  190829. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  190830. */
  190831. int sp_ecc_mulmod_1024(const mp_int* km, const ecc_point* gm, ecc_point* r,
  190832. int map, void* heap)
  190833. {
  190834. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190835. sp_point_1024* point = NULL;
  190836. sp_digit* k = NULL;
  190837. #else
  190838. sp_point_1024 point[1];
  190839. sp_digit k[32];
  190840. #endif
  190841. int err = MP_OKAY;
  190842. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190843. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  190844. DYNAMIC_TYPE_ECC);
  190845. if (point == NULL)
  190846. err = MEMORY_E;
  190847. if (err == MP_OKAY) {
  190848. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  190849. DYNAMIC_TYPE_ECC);
  190850. if (k == NULL)
  190851. err = MEMORY_E;
  190852. }
  190853. #endif
  190854. if (err == MP_OKAY) {
  190855. sp_1024_from_mp(k, 32, km);
  190856. sp_1024_point_from_ecc_point_32(point, gm);
  190857. err = sp_1024_ecc_mulmod_32(point, point, k, map, 1, heap);
  190858. }
  190859. if (err == MP_OKAY) {
  190860. err = sp_1024_point_to_ecc_point_32(point, r);
  190861. }
  190862. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  190863. if (k != NULL)
  190864. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  190865. if (point != NULL)
  190866. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  190867. #endif
  190868. return err;
  190869. }
  190870. #ifdef WOLFSSL_SP_SMALL
  190871. /* Striping precomputation table.
  190872. * 4 points combined into a table of 16 points.
  190873. * Distance of 256 between points.
  190874. */
  190875. static const sp_table_entry_1024 p1024_table[16] = {
  190876. /* 0 */
  190877. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  190878. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  190879. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  190880. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  190881. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  190882. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  190883. /* 1 */
  190884. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  190885. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  190886. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  190887. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  190888. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  190889. 0x1c49f80b,0x8dfff96a },
  190890. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  190891. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  190892. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  190893. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  190894. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  190895. 0xde3c01f3,0x2aa1207b } },
  190896. /* 2 */
  190897. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  190898. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  190899. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  190900. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  190901. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  190902. 0xdf9398a4,0x40247985 },
  190903. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  190904. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  190905. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  190906. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  190907. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  190908. 0xc8b79d80,0x1a6fd1e6 } },
  190909. /* 3 */
  190910. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  190911. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  190912. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  190913. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  190914. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  190915. 0x15614750,0x29b7d4dc },
  190916. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  190917. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  190918. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  190919. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  190920. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  190921. 0x5382497e,0x5d092802 } },
  190922. /* 4 */
  190923. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  190924. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  190925. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  190926. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  190927. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  190928. 0x0f1fa7d7,0x2ab3bd47 },
  190929. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  190930. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  190931. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  190932. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  190933. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  190934. 0x4c27d229,0x93a4b416 } },
  190935. /* 5 */
  190936. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  190937. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  190938. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  190939. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  190940. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  190941. 0x32ee7763,0x342ce0d7 },
  190942. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  190943. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  190944. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  190945. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  190946. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  190947. 0xe156fd20,0x455f4af3 } },
  190948. /* 6 */
  190949. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  190950. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  190951. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  190952. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  190953. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  190954. 0x5c37c334,0x65713c29 },
  190955. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  190956. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  190957. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  190958. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  190959. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  190960. 0x3bae3c38,0x6b0e996c } },
  190961. /* 7 */
  190962. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  190963. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  190964. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  190965. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  190966. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  190967. 0x678223f8,0x4022a205 },
  190968. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  190969. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  190970. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  190971. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  190972. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  190973. 0x24a6a956,0x312179cb } },
  190974. /* 8 */
  190975. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  190976. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  190977. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  190978. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  190979. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  190980. 0x04ecf056,0x325d2796 },
  190981. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  190982. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  190983. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  190984. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  190985. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  190986. 0xe32a79d3,0x19d48546 } },
  190987. /* 9 */
  190988. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  190989. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  190990. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  190991. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  190992. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  190993. 0xb4e453b0,0x1b3ace6c },
  190994. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  190995. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  190996. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  190997. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  190998. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  190999. 0x192f0a14,0x538ec33e } },
  191000. /* 10 */
  191001. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  191002. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  191003. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  191004. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  191005. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  191006. 0xb6f8aa25,0x13cbee76 },
  191007. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  191008. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  191009. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  191010. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  191011. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  191012. 0xe02e8967,0x4e0a1ada } },
  191013. /* 11 */
  191014. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  191015. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  191016. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  191017. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  191018. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  191019. 0x9f99c999,0x733e30d9 },
  191020. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  191021. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  191022. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  191023. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  191024. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  191025. 0xb79a5c0c,0x56facb39 } },
  191026. /* 12 */
  191027. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  191028. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  191029. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  191030. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  191031. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  191032. 0xf18c2b91,0x57ea2b4b },
  191033. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  191034. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  191035. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  191036. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  191037. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  191038. 0xea7935c9,0x60480b46 } },
  191039. /* 13 */
  191040. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  191041. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  191042. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  191043. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  191044. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  191045. 0x9a8f88cc,0x0774a0d3 },
  191046. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  191047. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  191048. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  191049. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  191050. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  191051. 0x2432014b,0x08151954 } },
  191052. /* 14 */
  191053. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  191054. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  191055. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  191056. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  191057. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  191058. 0xf0860497,0x1fe09f94 },
  191059. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  191060. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  191061. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  191062. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  191063. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  191064. 0xdb62526a,0x4de95786 } },
  191065. /* 15 */
  191066. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  191067. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  191068. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  191069. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  191070. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  191071. 0xe636980c,0x1c94418b },
  191072. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  191073. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  191074. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  191075. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  191076. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  191077. 0xb55235ba,0x611bfbb2 } },
  191078. };
  191079. /* Multiply the base point of P1024 by the scalar and return the result.
  191080. * If map is true then convert result to affine coordinates.
  191081. *
  191082. * Stripe implementation.
  191083. * Pre-generated: 2^0, 2^256, ...
  191084. * Pre-generated: products of all combinations of above.
  191085. * 4 doubles and adds (with qz=1)
  191086. *
  191087. * r Resulting point.
  191088. * k Scalar to multiply by.
  191089. * map Indicates whether to convert result to affine.
  191090. * ct Constant time required.
  191091. * heap Heap to use for allocation.
  191092. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  191093. */
  191094. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  191095. int map, int ct, void* heap)
  191096. {
  191097. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  191098. k, map, ct, heap);
  191099. }
  191100. #else
  191101. /* Striping precomputation table.
  191102. * 8 points combined into a table of 256 points.
  191103. * Distance of 128 between points.
  191104. */
  191105. static const sp_table_entry_1024 p1024_table[256] = {
  191106. /* 0 */
  191107. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  191108. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  191109. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  191110. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  191111. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  191112. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  191113. /* 1 */
  191114. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  191115. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  191116. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  191117. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  191118. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  191119. 0x1c49f80b,0x8dfff96a },
  191120. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  191121. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  191122. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  191123. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  191124. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  191125. 0xde3c01f3,0x2aa1207b } },
  191126. /* 2 */
  191127. { { 0x01900955,0xa95b6dae,0xceb4656d,0xa5dc9cc1,0xe72fe95b,0x50c78907,
  191128. 0xa040c334,0xa1ae5447,0x7952ea6e,0x91191370,0x6d097305,0x54ff7343,
  191129. 0xbda4d10f,0xa4db0074,0x91644070,0xfd5306f1,0x8b24522c,0x14b9fe73,
  191130. 0x7849f762,0x1468dad6,0xb0dcd2e4,0x87b29a18,0x5e1ad492,0xadd7f1a1,
  191131. 0xdbba2a1a,0x9ac63a81,0x81223379,0x01379c5b,0xb0e53bc8,0xf402b2f0,
  191132. 0x0bf13b61,0x8c3eb27f },
  191133. { 0xe513696f,0x9a4ad3e1,0x18c81ffa,0x0350ba5c,0x3c033d13,0x1e2fc136,
  191134. 0x17a531bc,0x53da6e71,0x1aed610d,0x42ec6490,0xe99ff567,0xd33e8df7,
  191135. 0x3deed12a,0xe4aad73e,0x180f4deb,0xd983b465,0x502f30b4,0x99365269,
  191136. 0xa8918d7f,0x7e2799ab,0x700fc79a,0x0ffe84b6,0x40bfd8c2,0x7b4400d6,
  191137. 0x5d2641bd,0xc3a21d21,0xc32621cb,0x79839442,0xb1401e83,0xace6500b,
  191138. 0x251c4310,0x7bf4163e } },
  191139. /* 3 */
  191140. { { 0xe3fd589e,0x1c174f88,0xdf974a03,0xdb501790,0x3e70549f,0xd09623e3,
  191141. 0x15924f34,0x8d091eff,0xf9b65ac5,0xeef79cad,0x3f69c2cf,0xd2cc4262,
  191142. 0x52cd82bc,0x817d9032,0xa5f1dddd,0xacf4f4d9,0x5011b6bd,0xd0612635,
  191143. 0x2ed140c9,0x9f74490d,0x4db686d2,0x64092e8c,0x776b0fcc,0x225eef16,
  191144. 0xdf16aeb6,0x0e8c01e9,0x84bbd82a,0x62836741,0x8956e337,0x757574e2,
  191145. 0x705a7f07,0x9871edc6 },
  191146. { 0x776535f7,0xbd0b76d5,0x2635b3b8,0x5214d602,0x9d216f64,0xc0c25ad9,
  191147. 0x5515bf75,0xfd4df3a7,0x5e9f1675,0x24a625bc,0x406873e7,0x3c35efb7,
  191148. 0xbb2e5c4a,0xef5c9a33,0x806b198a,0xa971b35e,0xa3c690ed,0x9f5c0ca5,
  191149. 0x8e1e2341,0xa8d5dd89,0x955ad9e4,0x4cecbcce,0x248d3416,0x2ecf4407,
  191150. 0x45c0af6e,0x1abb3811,0x1c780fff,0x3f4bee82,0xc272ed57,0xd14df768,
  191151. 0x371637ad,0x397ed10a } },
  191152. /* 4 */
  191153. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  191154. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  191155. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  191156. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  191157. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  191158. 0xdf9398a4,0x40247985 },
  191159. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  191160. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  191161. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  191162. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  191163. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  191164. 0xc8b79d80,0x1a6fd1e6 } },
  191165. /* 5 */
  191166. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  191167. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  191168. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  191169. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  191170. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  191171. 0x15614750,0x29b7d4dc },
  191172. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  191173. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  191174. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  191175. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  191176. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  191177. 0x5382497e,0x5d092802 } },
  191178. /* 6 */
  191179. { { 0xff2f780d,0x583a2b7e,0xd7d76b1d,0x34d26820,0x86f74aec,0xe3c32847,
  191180. 0x10823feb,0x0fd42212,0xfb5e7bf4,0x227e417e,0xa568f8cd,0x510d49b6,
  191181. 0x1781bbec,0x53bce7d6,0x2f3718b7,0x9cfe3f22,0xd9de6c1f,0x7f44e89f,
  191182. 0x3fac9b55,0xf1cc553f,0xe6f300bc,0x9d2d0846,0x9f0ae6b1,0x976c82a2,
  191183. 0x24b8bbe0,0xe63dbf5e,0x973a5aa7,0x4cac7f45,0x84dd33c7,0xc6eb6237,
  191184. 0x142fee5d,0x0a26e434 },
  191185. { 0xacaa9a08,0x8081339f,0x5246ece1,0x40f31105,0x61393747,0x892c8170,
  191186. 0x242f02e1,0x8d8d4103,0x3b5de98a,0x482bfd20,0x5abbe952,0x89ef946b,
  191187. 0x37698249,0xb8d218b9,0x66617c7a,0xd5268e89,0x8b7d2b91,0x962e7551,
  191188. 0xfe8d67c3,0x2c5c7973,0x2b017c51,0x42e3150a,0xc1a29469,0x6f4e5ebc,
  191189. 0x531c7083,0xa39910ce,0xb77b9e50,0xaf4f6eb4,0xda120ad0,0x68cbb175,
  191190. 0xb92636ec,0x19497c61 } },
  191191. /* 7 */
  191192. { { 0x417659a8,0x6920b0c6,0x92cb28ff,0xc77ab9c7,0xb687797f,0x55b67180,
  191193. 0xe7759363,0x4caf58c1,0x5561b186,0x5155bdb6,0x780f4946,0x2e64e355,
  191194. 0x229a8b20,0xeb0ac9b7,0x2571bd60,0x88594d78,0xe3fa78f9,0x5dcc0939,
  191195. 0x2ac2d379,0x7b8b4830,0xb90f1444,0x505fbf60,0x3ce4b3c1,0xac610e81,
  191196. 0xd59b5c18,0x39a4f27a,0x7cea0222,0x5fa33973,0x8dff1c7b,0xe578730b,
  191197. 0x517bf7a6,0x96b91b8b },
  191198. { 0x9aac087c,0xc1a991f4,0x6cfdb28d,0xce62f74e,0x5f7600d6,0x08d6ff9a,
  191199. 0xf917f9c9,0xd781cd04,0x3de52dbf,0x7796f5f6,0x2ed72180,0xe7db64e0,
  191200. 0x6fa4137d,0x0f0876f6,0x3ca1f716,0x3271ee64,0x7c4ab8a3,0xcb9b2058,
  191201. 0x39481047,0xcba17107,0x598c5c37,0xdf9a190d,0x6f20e125,0x0cb6e72a,
  191202. 0xf4f2902d,0xa3142204,0x7ce2dcfb,0x42d28cb9,0xa3d3c351,0xdf261b8a,
  191203. 0xcffc249d,0x73f3d315 } },
  191204. /* 8 */
  191205. { { 0xe6fd3673,0x5d86855b,0x9d214b7b,0x309b70af,0xdcc46cd3,0x8d332f90,
  191206. 0x595510de,0xe553c015,0x38c1251c,0x5746a096,0x85cc1bc9,0xcd7cea5b,
  191207. 0x002eba8f,0x4ffa1468,0x22fcd77c,0x10a3cb70,0xc4ea05e3,0xb6999dfb,
  191208. 0x4efa756e,0x3375a0d0,0xdced5fd8,0x4d90279e,0x251fd56e,0x48192403,
  191209. 0x82a4c5f1,0xe87633a4,0x1b34105b,0x3170d130,0x7247e578,0x93998b0f,
  191210. 0x436ba1fa,0x88934f64 },
  191211. { 0x4713eabc,0xf09f43b0,0xaccdc517,0x4ca7dd91,0xef13ca7c,0x27daa63b,
  191212. 0x2588184b,0x8b2e5a7a,0xd95dc269,0x0a8cb612,0xe1f2f14c,0x346975a2,
  191213. 0xe172935c,0x1f29b8ed,0xd40bc1e3,0xc3cbfd6e,0x132623da,0xd3f46b3f,
  191214. 0xfb0b7681,0xc115be6d,0x56da4344,0x5e31c345,0xa8e43d98,0xa7c63f18,
  191215. 0x4bddb4ea,0x55cb2083,0x4a54f58c,0xb16a0c38,0x46fd69d9,0x74eacca2,
  191216. 0x153548e1,0x0d1898bb } },
  191217. /* 9 */
  191218. { { 0xe35ef043,0x4ea73461,0x3496b564,0x107b67d9,0xd0f83a3c,0xd62c173b,
  191219. 0x51d29c35,0xfad4b038,0x71b1c1a4,0x3f42882a,0x54b43b9e,0x5d2bcf66,
  191220. 0x2abdf543,0xc77b15aa,0xdabe3dc1,0x5cb38a80,0xa481673b,0x15fda0ae,
  191221. 0xe7b90ebe,0x86996b4d,0x2bc8f3d8,0x84f87e25,0x37c4e424,0xaded03d6,
  191222. 0xd7a7afd8,0xe5ede666,0xa1ccb93a,0x80dd95a2,0x46fba391,0xa55cfd25,
  191223. 0x46f82e60,0x2bdab1dc },
  191224. { 0xfa6fed61,0x7a4de22b,0xcc8dd94e,0xca458aa5,0x071222f5,0x3e372df1,
  191225. 0xe5aff377,0x06a4b44f,0x4a738e6d,0xbc2d0ba7,0x5f31f136,0x1a470e1d,
  191226. 0xe102a911,0x77ff933a,0x310c7885,0x8b380a50,0x783fc5ac,0x9f3c0228,
  191227. 0x44725d06,0xec668925,0x5ac84221,0x878f0e16,0xcfda6e8a,0x9a3af1af,
  191228. 0x78cd2aba,0x0183ed37,0x826d0eae,0x32cdbd60,0xcbee6415,0xb3234661,
  191229. 0xb9c10120,0x353eb892 } },
  191230. /* 10 */
  191231. { { 0x10b5521e,0xc8fdcad6,0x52e702f0,0x1a11b440,0x8ffda49c,0x6302680d,
  191232. 0xcbf36bad,0xcdb9654a,0x4c10a2d7,0x7b58ce11,0xe630e7e0,0x1e5d1f7d,
  191233. 0x6760a813,0x8cbe3d7d,0x6480d77f,0xeb35866b,0x7f036219,0x58728cf3,
  191234. 0x42a8a757,0xdd5865ed,0x906a2870,0x283f1f1d,0xa51f906b,0x79e23fa4,
  191235. 0x543b20a8,0xf2ac6e83,0xb81e7754,0x4f0b6379,0x840016ee,0x57fbc0d4,
  191236. 0xe621b67d,0x8da20771 },
  191237. { 0xecce65ec,0x3c855004,0xb748185e,0x76d10d1f,0x78797ad2,0x64be7bca,
  191238. 0x77e54aad,0x43444db0,0xbe0df0ff,0x17b6b0c9,0x055086a4,0x8fc4256c,
  191239. 0xfd74d5a3,0xf952c43b,0x01c4edb8,0x501e005a,0x4a57e328,0xd5172dfc,
  191240. 0x535d6ee3,0xdb40ce4e,0x0c650918,0xbaef1e5c,0x857561fc,0xe85145e7,
  191241. 0x34a224c6,0xe468536a,0x0ec0e0a2,0x69a8e227,0x242b03fc,0xb3f52247,
  191242. 0xc3bebd5f,0x862f55e2 } },
  191243. /* 11 */
  191244. { { 0x226049fe,0x2d6a390f,0xdcbbc9fb,0xcc92a578,0x97634fb7,0xa52feca4,
  191245. 0x3dea5893,0x2b340cb6,0x2a49e916,0xa39f338a,0x949e41f3,0x26b2df3d,
  191246. 0x065a7e40,0xc71c7cdb,0x468281a2,0x4a9b84a0,0x731eeeca,0x63eeb503,
  191247. 0x76cbb725,0xe6d09134,0xb94a678c,0x0cf979a9,0x808fd9f1,0xb44d8c3b,
  191248. 0xe0afc5b9,0xe60da613,0x3ea5be69,0x52dce7de,0xdc1ee74f,0x3a5d6864,
  191249. 0x3bc80790,0x71ab2891 },
  191250. { 0x3b5b60ad,0xcf618fc4,0x4a0c3184,0x0afb5e30,0xbc403302,0xd22381cc,
  191251. 0xdb1c0c66,0x33cf8953,0xa6112a8d,0x9c994e4d,0xd1967a86,0xd7aae2c3,
  191252. 0x5b7acd29,0xc28d5493,0x6c9a57fb,0x8075bd13,0x9c8427f9,0xc9c0373e,
  191253. 0x193225f5,0x2cbca18d,0x442c018c,0x73777d13,0xfbb3a727,0xebe5ed47,
  191254. 0x1962dc18,0x70437d49,0x2dc08806,0xf39c1e09,0x15fff35c,0x03e9c6f7,
  191255. 0x5e360a65,0x8d087bb6 } },
  191256. /* 12 */
  191257. { { 0x3fdc1844,0xbe212302,0x105eac56,0x6eca27ef,0xf168a348,0x2183a606,
  191258. 0xe1d7a4cb,0x295f807d,0x7ef5d43e,0x7246a632,0xc77025c7,0xae143205,
  191259. 0xf3484e3e,0x4bdfc7ca,0xdf52c075,0xec939895,0xd7a9cac0,0x82e655f6,
  191260. 0x8baeddb0,0x985dfe20,0x527de731,0x79c817e4,0x313de1ea,0x30ce0fbc,
  191261. 0xcc4f6cbb,0x9df95b89,0xf5bb20cd,0xf2aedf1e,0x1a8cfb01,0xfc1e0a89,
  191262. 0x63edb7ec,0x225ed34a },
  191263. { 0xbabb1a85,0x3e13154d,0x1e6a565a,0xd3d8dae7,0xab4b100f,0xd3217d56,
  191264. 0xebc78e1a,0xd44d934e,0x48e73d37,0x0215321b,0x201e43cb,0xbbc90bfa,
  191265. 0x27500905,0x3c23f1d0,0xc86691a1,0x2a2e5000,0x6065841c,0x08b2bad2,
  191266. 0x30026b60,0x15d41caf,0x5276ce61,0x1712c2f4,0x15932ffb,0x01c4c3e7,
  191267. 0x6a74caf2,0x7894e13d,0x0c0537a4,0x02d6f5df,0xc2b1c97e,0xa8fb7602,
  191268. 0xd0887c7b,0x612b60e5 } },
  191269. /* 13 */
  191270. { { 0xba245d6b,0xefd495cf,0xa2ce3ff6,0x5cf0cbb7,0xdff5feee,0x24da2ac0,
  191271. 0xcf28c6a3,0x90c914f8,0x4308a56b,0x72fdb50d,0x13d72034,0x03dbf779,
  191272. 0x822ac9e9,0xcfa5ec91,0x3aea3e81,0x0dde73c8,0x66289139,0x545ba962,
  191273. 0xca6acbd3,0xa52f648b,0x98a0683a,0xff6f276e,0xa378ed52,0x2536d3ac,
  191274. 0x885ac1d9,0x353c2c54,0x00bc84a7,0xcaff52da,0x37684167,0x3971f81c,
  191275. 0xd2d7986e,0x0f7334e1 },
  191276. { 0x6596067e,0xafbb5c83,0x38c19806,0x33e54e19,0x39cb0dcc,0x8285d967,
  191277. 0x424035f9,0x2b53f43d,0xdfef9095,0x38c531f8,0xdb0f571a,0x90fbe8e4,
  191278. 0xa39ca787,0x9a0c1ed2,0x606f2620,0x2fecc1d6,0x72b7cb4a,0x9dc890b1,
  191279. 0xccbb7868,0xc33ca6fb,0xfe73ee49,0xd1b11082,0xfcb66c48,0x590b7d17,
  191280. 0x86e14573,0x9356b0a6,0x053ead85,0x75d682c4,0xc54d30fb,0xb2ae55fa,
  191281. 0xf8aee949,0x67636a72 } },
  191282. /* 14 */
  191283. { { 0xb91d6bea,0x638063bc,0x923ecb96,0xae263a2e,0xc627aca6,0x9d7b0992,
  191284. 0x77af9e7e,0xc6ed001a,0x24aafebb,0x9214accf,0x78055a90,0xa3564b96,
  191285. 0xe027499d,0x00999b1c,0xe46a06a5,0xe413a4e1,0x2e51efe7,0xa05d13f6,
  191286. 0x9ba843be,0x35e87d34,0x3183159e,0x0a633825,0x54601923,0x6023e8ba,
  191287. 0xb7fd1cf2,0x9b107721,0xfdf2fd53,0x46b5542b,0x1c18af38,0xb314f4f8,
  191288. 0x60ac8965,0x086f9876 },
  191289. { 0x8cbb9850,0x76701954,0xa20d2c8c,0x6210b730,0x5335670c,0x4084d057,
  191290. 0x0324baea,0x3ecdc595,0xc76ee9b4,0x607fc5f2,0x440ffa64,0xf393d00f,
  191291. 0x2dc1463c,0xe0111796,0x9c7725e7,0xf00b8251,0x5bd1d186,0x35e60736,
  191292. 0x2cf72aac,0xf3d8554c,0xefa3497d,0xb4dd0fde,0xf646ad11,0xd712268c,
  191293. 0x9f7b8ead,0x07c20afb,0xfc06dfe5,0x630969d4,0x7245549a,0x76b7df1c,
  191294. 0xe61ae810,0x681f9403 } },
  191295. /* 15 */
  191296. { { 0xc9a0623b,0x7cad5163,0x67fab8d4,0xdbf82957,0x81af7c7c,0x2ccab0ec,
  191297. 0xe966d5c2,0x469e38c8,0xf0d4e41c,0x34430d52,0xa52b359c,0x426075a2,
  191298. 0x33bd0127,0x242dd3e3,0x9fed2341,0xcda3f635,0xd7d52ffa,0x4df33730,
  191299. 0x7640c3ef,0x5fff56f0,0x1bbde57c,0x4783c21c,0xeb8bb336,0xd8784a2a,
  191300. 0xead08405,0x1ec7c533,0xf9b62bd4,0x4b7f1423,0x7075d4af,0x5543145c,
  191301. 0xba60590a,0x0c9de94a },
  191302. { 0x95d5682b,0x8ed72735,0x2ec276ed,0x711c4283,0x8b36a0d2,0xd1f4aed5,
  191303. 0x8498a88f,0x62ab40c4,0x4480f451,0x58c8fc62,0xb79cffe2,0x8bc8ca4b,
  191304. 0x701a359d,0x90ab583c,0x3fd5d15d,0xaee31a73,0xc912333c,0x02a5597b,
  191305. 0xb6c3e3c2,0x1019cae4,0x29938088,0xe513042c,0xf47c8199,0x0e00283d,
  191306. 0xf2a00e92,0x90d68e58,0xa775ae3b,0x69e2df41,0x871c30b2,0xb8d2eca5,
  191307. 0xbb1de396,0x733dca0e } },
  191308. /* 16 */
  191309. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  191310. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  191311. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  191312. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  191313. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  191314. 0x0f1fa7d7,0x2ab3bd47 },
  191315. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  191316. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  191317. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  191318. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  191319. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  191320. 0x4c27d229,0x93a4b416 } },
  191321. /* 17 */
  191322. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  191323. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  191324. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  191325. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  191326. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  191327. 0x32ee7763,0x342ce0d7 },
  191328. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  191329. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  191330. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  191331. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  191332. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  191333. 0xe156fd20,0x455f4af3 } },
  191334. /* 18 */
  191335. { { 0x754ec21c,0xc057f262,0xe3a1ba38,0x3eacd4c9,0x116c1fe9,0x3a0210d1,
  191336. 0xeacc8ab6,0xe4ea4e94,0xea6f32ca,0x31c00c9a,0x86b975ce,0x5cb6239d,
  191337. 0xa14ea1e9,0x654d5d8c,0x5067fc8b,0x230d31f4,0x6355fecb,0x48bb90cb,
  191338. 0xdc172e8e,0x78f81ece,0xcb006737,0x288380a8,0xe162d012,0x19b02e01,
  191339. 0xc5af145c,0x0e087a06,0xb72dc354,0xf04dc8b7,0x8de3c066,0xf70ef214,
  191340. 0x13009fb7,0x4f148243 },
  191341. { 0x6e2055e2,0x5e004fce,0x86c32067,0x89e247ea,0x5f9daaa2,0x4ebcbd95,
  191342. 0xceb7f63b,0xd15f212f,0x863784a0,0x5ecc5c1f,0x75760251,0x53b3800b,
  191343. 0x8a6a2954,0xeb9301c3,0xa13cdd19,0x0f16ba18,0x887c2d24,0x8313d251,
  191344. 0x9a9413f6,0xf9923585,0xfe3fd7c5,0x423405e6,0x16e0ee05,0x678aeb34,
  191345. 0x3fadaab0,0x1f3be7bb,0x82884471,0x7901fa2c,0x4d662ff6,0xc950db30,
  191346. 0x3c01170b,0x74d5d2d4 } },
  191347. /* 19 */
  191348. { { 0x2b5bfe11,0xa3002dc0,0x52d321e7,0x0733410d,0x9679ba89,0x15920f65,
  191349. 0x685b236e,0x0e248c14,0x346f6040,0x8cfab594,0x40c717f0,0x9f57afb7,
  191350. 0x66044576,0x0dbab28c,0x9cdc3247,0x0fa09968,0xc230ed05,0x41e02ae2,
  191351. 0xe45bef74,0x0d961554,0xce4d7b6f,0x9688a982,0x5e62d22e,0xfadefac7,
  191352. 0xbd2cba28,0xaf1512a6,0xbe7c749f,0x78868e62,0xae9f5a6b,0x88048d81,
  191353. 0xc5857a29,0x6b1a5442 },
  191354. { 0x43242066,0x9f5ab9ad,0x2ccca2ae,0x0afef1b5,0x988edc4e,0xb1b43ec7,
  191355. 0x0341b0d5,0x0d0c00f1,0xb50aab37,0x4d68b8f7,0xf3a64a99,0x9a8e4e6f,
  191356. 0x7f1a684e,0x198338fb,0x351a0f5c,0x8bc0e748,0xdac44515,0x2cacf2cd,
  191357. 0x5e9ff76b,0xc14d3999,0x16393055,0x54a01b3f,0x888d8376,0x6ac3eea5,
  191358. 0x723277b1,0xb84d9a9a,0xe11dbbbf,0x99132691,0xabb67178,0x597717ae,
  191359. 0x8bb14ac8,0x4c213526 } },
  191360. /* 20 */
  191361. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  191362. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  191363. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  191364. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  191365. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  191366. 0x5c37c334,0x65713c29 },
  191367. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  191368. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  191369. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  191370. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  191371. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  191372. 0x3bae3c38,0x6b0e996c } },
  191373. /* 21 */
  191374. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  191375. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  191376. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  191377. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  191378. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  191379. 0x678223f8,0x4022a205 },
  191380. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  191381. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  191382. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  191383. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  191384. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  191385. 0x24a6a956,0x312179cb } },
  191386. /* 22 */
  191387. { { 0x07615ac2,0xa94cc3ca,0x121ad581,0x85865e64,0xa7986b79,0xae47616f,
  191388. 0x9d5e0f1d,0x395a40eb,0x3d9457ea,0xa9143264,0xfa2865d9,0x8de6d6a3,
  191389. 0x1014ae8c,0x0771db96,0x976a87cb,0x77a7cce6,0x143a0f60,0xa7de42e1,
  191390. 0xd993d934,0xe203cc09,0x98ec4c3d,0x92018693,0x3a25df4b,0xd77546d8,
  191391. 0x62b02d6b,0x0ad9eb47,0xd05a7189,0xfaaaf208,0x431221bb,0x5238181f,
  191392. 0x733511ea,0x417d6c78 },
  191393. { 0x0e91e9a8,0x3cbd81b7,0xc370d6b3,0x73340418,0x8eaa2373,0x825db10a,
  191394. 0x6c7d6756,0x8f2b09e4,0x94c33ded,0xe288ee9b,0x1695e3fb,0xcd8426bb,
  191395. 0xdce9e888,0xa6176c86,0x6165e362,0x3f4c8922,0x6063fb09,0x514e411f,
  191396. 0xc8f9e04c,0x6907ac20,0xdfd2ad61,0xcef7469c,0x8452199a,0xba30bae4,
  191397. 0x12ac3462,0x30681293,0xc92d482d,0x011be873,0xe8330995,0xff4cbf89,
  191398. 0xd1470a0a,0x02189d52 } },
  191399. /* 23 */
  191400. { { 0x92599c69,0x73e419dd,0x7fec32ca,0x5b94221b,0x09bbfbfd,0xb2bf9bd2,
  191401. 0x63ed895b,0x61ea97a4,0x3f486f79,0x6609146b,0xfd141a39,0xbd1c7a05,
  191402. 0x83d64135,0xc79ec8cf,0x9883507b,0x7f8fd42f,0x17b3d027,0xafcb53b7,
  191403. 0x67ca5a21,0x86658dcd,0xcd149786,0xa6a6c0ac,0x34b95067,0x16f3d70e,
  191404. 0xdf44958c,0x371208e3,0xec280212,0xd2dd64e6,0x30782c71,0x33b2c4ab,
  191405. 0x521176fa,0x7bbf8abd },
  191406. { 0xa78b981a,0xbe9e4aaf,0x304ec828,0x788b4e36,0x3959dea3,0x0c45cf39,
  191407. 0x240b39c7,0x70a9bdd3,0x28383b7d,0x499cd7dd,0x307a1026,0x30690b2e,
  191408. 0xee92f1b3,0x2262d598,0xb4725a48,0xc62d77de,0x7bc3aa0e,0xa16f25bc,
  191409. 0xd15ef7fa,0x62dd8b65,0x0b96d68f,0xd979221d,0xa00f1906,0xb92885c3,
  191410. 0xeb74c740,0xfa476b9b,0xc7576222,0x217ddbb5,0x5788504f,0xc2782c30,
  191411. 0xf812716b,0x860d096c } },
  191412. /* 24 */
  191413. { { 0x4d79bbf9,0xfebc337d,0x69f74f80,0x5d53eab8,0x33104d53,0xff36a095,
  191414. 0x196f8b97,0x2ab820da,0x75ce6909,0x961d3d1f,0x04683754,0xb197ec04,
  191415. 0x93a6cb9b,0xa68ce1bf,0xc5f021a3,0x503456ff,0x8940ffdb,0xb50a2db1,
  191416. 0xef004209,0x77c50f8f,0x04965875,0xd635d177,0x8bb8770a,0x725766d9,
  191417. 0xa078e53e,0x8e19b028,0xf9fc8378,0x364d4cca,0xf0dd39a0,0x1a3df411,
  191418. 0x03adf920,0x7e80e442 },
  191419. { 0x539a1ddf,0x4b5f8a57,0xee486562,0xd248e7ae,0x816021e1,0x1c7b491d,
  191420. 0xfd36d2c4,0x2e7b871b,0x0aec00d9,0xda38b504,0x6193f1b3,0xf2827612,
  191421. 0xfb1f78d6,0x69c3fe86,0xe827ac33,0x56c8b786,0x3487c8f7,0x1687f6c7,
  191422. 0x19dee5bc,0xab8f2217,0xff399418,0x04e8473f,0xa9027c80,0xf384c014,
  191423. 0xaa1d2e28,0x9967be9a,0xe065eef1,0x869686d3,0xc7bd837c,0x737c6b08,
  191424. 0x9e8bd863,0x5dcab5d1 } },
  191425. /* 25 */
  191426. { { 0x9a7d772b,0x0784283a,0xe540959b,0x6b49e525,0x86414ab5,0x546bb008,
  191427. 0x9d74b2a9,0xd4448162,0x203b0b1b,0x267890ad,0xc8d3f86b,0x1e7a82bc,
  191428. 0xd85a83c7,0x1352bfb5,0xfad07ccf,0xf29f16e3,0x41e0c43f,0xc02a63b8,
  191429. 0x6b379fef,0x904f22c5,0xb1244f26,0x19d8a653,0x3a28bdea,0x6635b6df,
  191430. 0xf6d455ce,0x18b68851,0x9cff3735,0x74ac2818,0x8b2cbdab,0xad40f9df,
  191431. 0xadc9d498,0x08cc2d9e },
  191432. { 0xc170c84b,0x2e6a6866,0x5a49a484,0xbb989e8b,0xd04c8992,0x7b0e00e0,
  191433. 0x61b3a423,0x55ad3478,0xb0d01899,0x3c952450,0xe3100cb3,0xe3922155,
  191434. 0xf03276d0,0x19265b6e,0x76d42b53,0x0fe8595a,0xfc6353b6,0x0a96dee0,
  191435. 0x246f893e,0x761e0dc8,0xf0a74cba,0x4ec902be,0x3fdfad9b,0x61008684,
  191436. 0x4fdb6975,0x5d6a60e4,0x7ef7590a,0x3f53aac8,0x12870a37,0xd29e6be0,
  191437. 0x55aa55b0,0x991fadc1 } },
  191438. /* 26 */
  191439. { { 0xb4844ffe,0x82bc4b0f,0x60f8b871,0x73922714,0x4ce3f1f3,0x8ac000e2,
  191440. 0x163519ec,0xf0d548b4,0x88288b5f,0x7aaf842b,0x2bdc9a70,0x9e8b0c4c,
  191441. 0x4ba5fd67,0xa06d5152,0xf93cdec3,0xd0b1afa0,0xdf89f8f0,0x280955ba,
  191442. 0xeea32c92,0x86cbe92d,0x3fe05be4,0x0cae3f99,0xfa6919aa,0xf2607095,
  191443. 0x6e0f1b8b,0x0f54741e,0x30ecf988,0x2aed1f74,0x734991d7,0x9296f76b,
  191444. 0x259f0fe9,0x66cf8d28 },
  191445. { 0x226f5868,0x9b01905b,0x16909e9e,0xc102e88c,0x4a37eb54,0x2bd08916,
  191446. 0xc9816323,0xf72253e8,0x86bac53c,0x37f84e9d,0xafeaaaf7,0x2e352454,
  191447. 0x2ca0046e,0x67c86f77,0x6663372e,0x86bce50e,0xb6950a04,0xf6a3a960,
  191448. 0xfc1aba93,0x61f994d7,0xc1326e6e,0x1957c12b,0x2e56b005,0x9b658fe4,
  191449. 0x8592740c,0x9cd297fc,0x177f26a5,0x7654ce9b,0xa79d2ebb,0xaaa699db,
  191450. 0x0ecb6448,0x5fca0c5a } },
  191451. /* 27 */
  191452. { { 0x569a6663,0xe26e25f3,0xe6aa4ca7,0x09597ee7,0x8d18b80c,0x25a4cda6,
  191453. 0x22926730,0x450602b5,0x07387209,0x9af5f650,0x26733a53,0xfeeedb34,
  191454. 0x86572951,0x0f5ce768,0x8398ae9a,0x872a360b,0x2b30f6c3,0x60347a80,
  191455. 0x1a162158,0xd2113b23,0xee6c6dec,0x6fd9cf92,0x5cbcf9e6,0x85f0a5a8,
  191456. 0x2ba3fe84,0xd7a5a6e4,0x51ecd727,0xaafe6720,0xa2081a10,0xe09c6bb2,
  191457. 0xb973b0b4,0x657acbf0 },
  191458. { 0xc274c8d4,0x3130466f,0x30a994d1,0x42765176,0x7079435f,0x217258ca,
  191459. 0xeb897a06,0x44850406,0x561ee130,0xf38dfeee,0xaa1778bb,0x11f4facf,
  191460. 0xb9abb9e9,0x765c6617,0xd8f10932,0xb135499b,0xa73b9159,0xc0eb6337,
  191461. 0x6f7e8b6a,0xf2c1ccf1,0x187def53,0x5b32c03a,0x830b9c62,0x89ad1d49,
  191462. 0x2f10e538,0x1735eae3,0x9d5f55bc,0xb1cbd9c2,0xe539db0d,0x42428c47,
  191463. 0xc852b3bb,0x3d2da412 } },
  191464. /* 28 */
  191465. { { 0x871f2865,0x97702b6e,0x142920d6,0x56cb639f,0x45b58611,0x328522a0,
  191466. 0xf3b13812,0xf3943ad1,0x712206e8,0xe6c2200a,0xa34d59ea,0xc2890e5a,
  191467. 0xf6b7f759,0xab52fd40,0x180bf567,0xf522c8de,0xaccee396,0x181e97b2,
  191468. 0xc4ea5cbb,0xe0375819,0xab51d3ef,0x0d9985e8,0xbcb50fd8,0xe26c96ca,
  191469. 0x97e1c80d,0xfb9d6b13,0xf796357d,0x582b1814,0x07f4c7fb,0x89a78221,
  191470. 0xc0357e61,0x02aeef2d },
  191471. { 0x2c7ec9be,0x2ba7926f,0x7258b201,0x292f307e,0xc6fa6b4a,0x74e62a10,
  191472. 0xe2bcc5ab,0x80c08549,0x7bb8c073,0xb4160db8,0x329f194d,0xd5ef0529,
  191473. 0x6dda4a9c,0x0eb8da14,0x15ea23d1,0x0b5d43d2,0xfc34bfae,0x6cebef02,
  191474. 0x848757a7,0xacd364d0,0x2d34cca3,0xc1401368,0x1d2d95e2,0x09ca6742,
  191475. 0x786eaa28,0xc3fd1d6e,0xa2965fec,0x9eb1136d,0xc0779203,0x48871baa,
  191476. 0x4b15aeb0,0x6b446c01 } },
  191477. /* 29 */
  191478. { { 0x25e8fe80,0xc819eb2e,0x98238a17,0x2b5f7906,0x81e41849,0xd6f1e996,
  191479. 0x98ea6d45,0x58ad8ad6,0xbfd02e40,0x5bae5ad4,0xa812416d,0x016dc327,
  191480. 0xa3347ca1,0x8b31a985,0x82a65391,0x0b4da610,0xb48c35fb,0x1cb91b2d,
  191481. 0xd2aaf8c4,0x9e96817c,0xcdfdcdc0,0x1a630483,0x12b69254,0x70559361,
  191482. 0xf8a2a097,0x5fdcd712,0x35cc5281,0x59ab623a,0x932b6095,0x30c8ebe0,
  191483. 0xb08e052f,0x8613424b },
  191484. { 0xb2231d8a,0x28902063,0xd9a61667,0xb0f62329,0x071a9f27,0xaafa0fe7,
  191485. 0x603f047e,0x6bcd8960,0xfd92a1c3,0x118cca76,0x71d483b6,0x3414e62b,
  191486. 0xba705262,0xa123ccdd,0xfd9b5c5a,0x1a576437,0x4c8d0fa3,0xa5301bc2,
  191487. 0x102427cd,0x96f0ad44,0xd3aa6c02,0x0e6fb5e0,0x072a3996,0xcd8c4880,
  191488. 0x840d3fad,0x4dafca12,0xde91d541,0x29f4ca3d,0x8441734d,0x0037c598,
  191489. 0x9ccfe57c,0x86333a99 } },
  191490. /* 30 */
  191491. { { 0xecf53b40,0xd213a751,0x2f78a542,0xcff2c6f2,0xf13ae56d,0x0f59f0e2,
  191492. 0x0e61748e,0x91f8ccbf,0xd72c4145,0x0aadecb9,0x4c9cdcb7,0x6b2ed852,
  191493. 0x1eaffc70,0x8e00b72c,0xaa728102,0x89b24285,0xb679cafa,0xaa7ea7e0,
  191494. 0x4f0a6f6f,0x5d2b8c26,0x0e804397,0x7ed7b173,0xc8573049,0x5a93eb45,
  191495. 0x0986e93e,0xc92bf5d4,0x6a20c0af,0x526b5a9c,0xb99dc3af,0x0adf47c9,
  191496. 0xba202cc9,0x12b25fe2 },
  191497. { 0x33eea395,0x09b8d78a,0xf633fc5c,0xc7a93618,0x270eceef,0x7e821629,
  191498. 0xc628ed0c,0x524779b8,0xa1d68939,0x91db5ca1,0x586edc90,0x8626e18e,
  191499. 0xfeb3f3bf,0xfe023e8b,0x0250171c,0x6279fde1,0x55e172de,0xe52ec7dc,
  191500. 0xc6d4ca45,0x445e8695,0xbdbc10f1,0x42de3878,0x6fc3835e,0x2b114de8,
  191501. 0x7e10b652,0x9faba456,0x390e78fe,0x4111d82a,0xaedf0aca,0x576b61c2,
  191502. 0x74accb74,0x216279a9 } },
  191503. /* 31 */
  191504. { { 0x4047f747,0xc14cdabf,0xc1315a1e,0x03ca233d,0x40e5d0a7,0x59e7cbd3,
  191505. 0xbb413869,0x1fd0c4e9,0x0f01fbd8,0x189d08b1,0xa76b823d,0x50449c42,
  191506. 0x398b00a1,0x81c224a1,0x8e8179e4,0x08084e4f,0x698e41e9,0xfd8af994,
  191507. 0x5610bf2e,0x1e30e37c,0xa7d2790f,0x4e6a043f,0xb3195388,0x9d96e60c,
  191508. 0x03799dfd,0xe75f986d,0xf8ff902f,0x3b4a8f11,0x7588416e,0xfa945378,
  191509. 0x9827535e,0x20683e3f },
  191510. { 0xd0378878,0xcb582e26,0xa7945787,0x9e214c23,0x8f6688b3,0x13d000bf,
  191511. 0x40515270,0x7548d4f5,0x40111f5d,0x7113c15d,0xa8bff902,0x3bf5a526,
  191512. 0x9b4945cc,0xbda6b010,0xbc2f3a05,0x83dcc74e,0x43efdfa1,0x2aef6284,
  191513. 0x565c5bf4,0xd2e60ee9,0x592f243a,0x4f0fa10d,0x1bc3bf51,0x6ae58b32,
  191514. 0x60576a74,0x813b0868,0x4d73081a,0x0bc023f8,0x32dcee59,0x9fd03aa0,
  191515. 0x27d6c795,0x5e416bf5 } },
  191516. /* 32 */
  191517. { { 0x026cc23c,0x24313760,0xb5b29058,0xf819aaee,0xc5d2ee17,0xa92272f8,
  191518. 0xee5cc402,0x8048e7cb,0x77def07d,0xdbc7d6ee,0xf6af821e,0x61d69244,
  191519. 0x996cbb89,0x5f7966ed,0x96a155a4,0xf81b17ea,0x03f3ed56,0xb2d9ef70,
  191520. 0xe882a5b2,0x5e6e5906,0xae947180,0x86fa1072,0x658c76f4,0x34d9fc51,
  191521. 0xcb035aa0,0x9f603dc0,0x75be6481,0xb7b39feb,0xcf04a9ef,0xca87554a,
  191522. 0x87b4fde3,0x4ff682ec },
  191523. { 0xd0a10ad5,0x3125627f,0x968e6f45,0x7fd45c72,0x806a1163,0x2981bd6b,
  191524. 0xde5033e3,0xb92de1cd,0xbf4f8988,0x3b44b45e,0xdae7e1dc,0xca1b9896,
  191525. 0x0778d878,0x52166e5a,0xa5116847,0x82d472be,0xf2895445,0xfbdd382a,
  191526. 0x5d6ec4c9,0x22ed1602,0xb6552b02,0x3614eb1c,0xa1e6210f,0x63c5df73,
  191527. 0x021a74a7,0xe9160285,0xc65cbd4d,0xa44ca400,0x0f15e299,0x48cb187e,
  191528. 0x3402507c,0x51eb818e } },
  191529. /* 33 */
  191530. { { 0xb92100ab,0x1fc1d178,0x9605b839,0xdf2e3d60,0xb71e59d0,0x12a7c255,
  191531. 0x14fcbe04,0x3f8b6675,0x59fd06af,0x0e8a3935,0x12020d07,0x56326502,
  191532. 0x528e7be5,0x6696fcd1,0x0c7b7654,0x6588514b,0x5912a5b5,0x0cd80f8c,
  191533. 0xf324cb7f,0x8bafef04,0xc6da3d75,0x6b53eecf,0x31d1df2f,0xedef48d8,
  191534. 0x73812b6d,0xf336b965,0xee626031,0xc82eae4a,0xd244f09b,0x300abd32,
  191535. 0x31d9647f,0x8b0af955 },
  191536. { 0x2e603544,0xb770180a,0x221acd9e,0x2b573ac3,0x62407032,0x3a17f665,
  191537. 0xb89abc3d,0xad3e74ad,0xd793225a,0x8a3d2e3a,0xef02564b,0x457bba04,
  191538. 0xfc2dd2b5,0x8875652f,0xe67143e8,0xd2905d15,0x02e48d70,0x6d884b42,
  191539. 0xc7636a57,0x06f99219,0x35e378df,0xa8dc3421,0x10c64a02,0x95c1d73d,
  191540. 0xcc157a66,0xcd6a4ece,0x8e24a354,0xbadcc1c8,0x9839329d,0x8024f1b2,
  191541. 0x4da48ad0,0x5363e549 } },
  191542. /* 34 */
  191543. { { 0xe23fc641,0x1f5523b7,0x86667063,0xfe54e72f,0x8e009d2f,0x294a15f5,
  191544. 0x8c57f5e1,0xf203997f,0xb16d64dc,0xa229724c,0x4baa2ffb,0x697be4fd,
  191545. 0x0a6e8ed6,0x3f507e46,0x78508536,0x0afe3a5d,0x95408208,0xeeef6cdd,
  191546. 0xf2c4237c,0x701fd889,0x5c385253,0x496d883a,0x72a212f1,0xe25c67ed,
  191547. 0x1ff78fcd,0x4b416783,0xc16f4146,0xe9967004,0xc45b0697,0xfa45c3a1,
  191548. 0x3fbd30c3,0x63334018 },
  191549. { 0xa2fbbbce,0x39c9a0cc,0xaa0cb744,0x876f6e5c,0x3438ece3,0x9ce6010e,
  191550. 0x13802d82,0x0aad148e,0x9cd45a1b,0x9c3e5c60,0x7bcfc1e0,0x875cb859,
  191551. 0xd8584dd0,0xb19ff790,0xd81c2a2b,0x2598b81e,0x02be07e3,0x118bdf2f,
  191552. 0xb9765ce9,0x074fc8ee,0xb24f95ae,0x125e9d88,0x0c98f09d,0x3bb12cdc,
  191553. 0xa0b74b27,0x4a6aee07,0xc08077ce,0x4723d2f9,0xbea8026f,0x959447d6,
  191554. 0x16280b73,0x93a7075c } },
  191555. /* 35 */
  191556. { { 0x715b27f9,0x26bbefe2,0x2a280923,0xa935a5e2,0xfd58a26a,0x5ddf23af,
  191557. 0x7c138694,0x54c83e16,0x892a2153,0x44799bc9,0x9b8d09f5,0x4e6e4710,
  191558. 0xd588ea68,0xc63af616,0x883ab1b6,0x5e896706,0x3d209336,0x3c1393a0,
  191559. 0x92c23dda,0xd02f2921,0xdcf6ea43,0xab70cb7a,0x791559e1,0x12434ea8,
  191560. 0x6d70ff0b,0x040680db,0x2832ba45,0x1a10fe52,0xe5f0cb8f,0xd69f9c08,
  191561. 0x44b141fd,0x1a7422ac },
  191562. { 0x9f40b675,0xc3a9dd2e,0xfcc71f39,0x2a7c6603,0x1948e342,0x18939a61,
  191563. 0xed0ab484,0x8f3b6158,0xee31ca6b,0xa3aa7d97,0xf7a8db63,0xbc1e865e,
  191564. 0x2c7c62e4,0x315f8c09,0x9f5c6d0f,0xa260788f,0x4b6f3ec5,0xb1833129,
  191565. 0x36b4d849,0x73adbcd6,0xbc699a9b,0x66e14890,0x2a1175e7,0xbf3790d8,
  191566. 0xfc53ca4f,0x7f43605a,0x87ff6091,0x577f6c47,0x600c82b6,0x827c7552,
  191567. 0x9d25599c,0x0944d630 } },
  191568. /* 36 */
  191569. { { 0xe6ab9620,0xcfdeb63e,0x786cd808,0xdff4fa6d,0x456320b3,0x145edd82,
  191570. 0xc4943915,0x2ae5f862,0xb73b3f87,0x9508e813,0xe52f97a9,0x3bd805f3,
  191571. 0xc9829b62,0xf71b5c28,0x86e0cefc,0xb394c70e,0x23bdb36e,0x534fb1a9,
  191572. 0xdbe27e5a,0xd64f5862,0x83ab6169,0xbae23df3,0x27c828cb,0xdd6df1b1,
  191573. 0x3a307a8a,0x1901899f,0x811ddf66,0x36cc8659,0x79943b77,0xa3cb7774,
  191574. 0x6fd86576,0x7d89f383 },
  191575. { 0xc9f92b2b,0xf8564242,0xc46e32bd,0x700c6a75,0x7f99a5c5,0x93e768b7,
  191576. 0x03149568,0xb6efe858,0xc2ce6709,0xbbfe8a19,0xee6ec493,0x721a3b1b,
  191577. 0xc371c28d,0x26eeeea9,0x15177e1d,0xd798115e,0xb068a5a5,0xd7bf3bce,
  191578. 0x46d2b4b2,0xdf8da220,0x59be9dfc,0x3df0995b,0x77640b79,0xc96897bc,
  191579. 0x5a2bd3c5,0xce0cf4c2,0x89afe744,0x16f45d6e,0x3a8509bb,0xb53f3acb,
  191580. 0x63f2a6e6,0x449af81f } },
  191581. /* 37 */
  191582. { { 0xa16d9377,0xc2fcf132,0x7e1a2f9e,0x9ab377b3,0x86d19ae5,0x72e1a12e,
  191583. 0xd013bbb1,0xd2b12e66,0xcb5f66ba,0x0972e055,0x399eab50,0xd11de1c0,
  191584. 0xc65f5ec2,0xc1f314fd,0x8a9ff593,0xfc311841,0xe05246e6,0xdf73c1ec,
  191585. 0x1625056d,0xc28d1363,0x6fb25e19,0x30a9dbd7,0x845cd2d7,0x049ed244,
  191586. 0xd36e852d,0xc779b83f,0xf68c8a83,0x85a35fc7,0xc95e8033,0x299bf1e1,
  191587. 0x20891af5,0x0e8617c3 },
  191588. { 0x67c81b5c,0x53720602,0xe737873c,0x2fa89dcd,0xa8144fd0,0x2a7430b0,
  191589. 0x26208c83,0x3006c5a7,0xd8ea40f5,0x4e066660,0x896413a4,0x9dd025f9,
  191590. 0x46b9149f,0xbdf380cc,0x0a125cc2,0x80156619,0x52793c37,0x04d6a3b7,
  191591. 0x6b7a62f2,0xb6001374,0x585d5978,0xa9cfe268,0x8395fe66,0xdcad0cb8,
  191592. 0x46b261f6,0xbab468fc,0x9d9d9218,0xca0ef5ef,0x5e452402,0xc507d4a8,
  191593. 0x326cf687,0x6f4404f1 } },
  191594. /* 38 */
  191595. { { 0x4febd3ff,0xa3e1920b,0xfdfd2bba,0xca6234d8,0xe19a9829,0xb7d1af2a,
  191596. 0xc6f5bc20,0x23de1610,0xdaa39ca9,0xe204dbf3,0x6d8c70ab,0x2a2de9b8,
  191597. 0x7c9d370b,0x272e0c37,0xe565510e,0x80914c06,0x57cbb6b0,0xb611e7a8,
  191598. 0xd8266a6e,0x076fc6ef,0x3095801c,0xdfac34ee,0xb9e24063,0x69ff40a2,
  191599. 0x787aa5c5,0xa7ba31a9,0x33c70cd2,0x0e4d1fdf,0x6895f074,0x903e3132,
  191600. 0x7fb671e2,0x905771f8 },
  191601. { 0xa4062bee,0x5199ba0d,0x94d7d9f9,0x18e7238c,0x1e0922c0,0xf53f29bc,
  191602. 0xb12d855f,0xde9b2a81,0x6d68ca29,0x649f3eed,0xc50c097f,0x64adfc34,
  191603. 0x9db398a0,0x81964ab9,0x7a587224,0x00d59c47,0x74c5903a,0x09fea396,
  191604. 0x15043dd0,0x6aafd8ee,0x5f1ecc20,0xc5721a6e,0x0db9b7b4,0xb6d6a483,
  191605. 0x66c8d52a,0x06ffc617,0xacc82a27,0x3de241d6,0x27f2f7a8,0x0605f052,
  191606. 0x6404decc,0x6a22953b } },
  191607. /* 39 */
  191608. { { 0x74fce389,0x92452d8f,0x2afa5564,0x059634c0,0xf0ed7825,0x9377ccbb,
  191609. 0x37718e0d,0x89f4045b,0x9fa69a4d,0x11074e7d,0x7295b0ba,0x5d70bb07,
  191610. 0xf107ede6,0xb22d54ad,0xa1a29c7b,0x5c39a3d8,0xd795e3ab,0x37236c02,
  191611. 0x2b589951,0xf7282d00,0x5790bee2,0x5e2265be,0xa8e65ea2,0x91e0ea11,
  191612. 0x6001cebd,0x0e71a708,0x2c1c5402,0x16900f5a,0x357f6981,0xc3b2d5c0,
  191613. 0x619e3427,0x528c9ea0 },
  191614. { 0x5f26c577,0x1edc86b4,0x9438bd45,0xf8074708,0x792582a7,0x2dfe1013,
  191615. 0xde1e569f,0xe08eaca0,0x9a55a356,0x5f952efa,0xe4976216,0xa4d80b53,
  191616. 0xcd5d71f2,0xd2b65855,0x66cea3f0,0x246704bf,0x492323ca,0x193f641f,
  191617. 0x9adb1325,0xa681855c,0x2d19d652,0x86d522ce,0x5b82ed7b,0x53609f10,
  191618. 0x8e150d29,0x3b0f0094,0x0b13e891,0x23ad8bfb,0xf794b449,0xcbb1556c,
  191619. 0x738bcf57,0x200f9093 } },
  191620. /* 40 */
  191621. { { 0x8388387f,0xf9b22fc5,0x28e883c5,0xcf26f170,0xd1b7973c,0x447cab90,
  191622. 0xf6ec9171,0x8d5d4ea2,0xc30cdbc0,0x2e16f498,0x48623c2b,0xdc92910c,
  191623. 0x30dbc545,0xeb1491b0,0x14de21b0,0x631deb2e,0x2fe830f4,0x04a21066,
  191624. 0x379c1f3f,0xa4c6979c,0xfb06a795,0x8a732b68,0x1619dfa9,0x3a44327a,
  191625. 0x8dbe2c9b,0x91a307d3,0x03989fea,0x939bc8d2,0x0f4a331f,0x3daabaf2,
  191626. 0xdd0f55dc,0x5c307e98 },
  191627. { 0x35b233da,0xbbc4e0c4,0x22f6f985,0xe3d29085,0xa8b02468,0x99dd2d21,
  191628. 0xa96916e7,0x978f40e9,0x614bcced,0x0327d86c,0xb290762c,0x95e95502,
  191629. 0xa879f2ed,0x0ffd2197,0x50e0bd33,0xc4365137,0x0827c4c4,0x26c3148a,
  191630. 0x3fcfc0b2,0xc79812a8,0x31928589,0xc3d8d17e,0x8830f42d,0x8b572cfe,
  191631. 0x4b07f83f,0x7cd9ff92,0x0a51148f,0x331ca950,0x4c59f9ac,0xd0c53968,
  191632. 0xc1434785,0x1df16dfa } },
  191633. /* 41 */
  191634. { { 0x68bcacc3,0xcc7bb4ac,0x430f58cf,0x06ded34f,0xd461855a,0xc59f9f4f,
  191635. 0x45c9f0bc,0xf5491994,0x4375c892,0xdc5f7ec6,0x3c85983a,0x1b8708f1,
  191636. 0x82fcd087,0xb32a5cc4,0x2d6b4c0f,0xefdcdc35,0x8ac6fb2d,0x4bb24f04,
  191637. 0x33906471,0x5982d4f5,0xb83a3ac4,0x162eb52f,0x2337a223,0x7130df28,
  191638. 0xcbc3dbd3,0xdce7b802,0x2467ac0e,0x8b395959,0x1b56717e,0x21d3d2e8,
  191639. 0x46512617,0x729a7f50 },
  191640. { 0x8420f90a,0x874ed1aa,0x0fe4c855,0x6368e19e,0xb0be74af,0xb62d4aaa,
  191641. 0x8ca60ca9,0x76fcc480,0x7645a867,0xf310b5a5,0xddb1b24c,0x131bac9b,
  191642. 0x2dea5b44,0xef77d71d,0x72fcc64e,0x4706d210,0x673d77f0,0x29b92691,
  191643. 0xe89e0663,0x22e00bf3,0x74077d40,0x472d0cd3,0x829232e2,0x3e21040d,
  191644. 0x38dc8533,0x2f916dfb,0x14b8f667,0x48bbb59b,0xd44be19d,0x19de9f4a,
  191645. 0x232d9d5c,0x7f6d3649 } },
  191646. /* 42 */
  191647. { { 0x6e794819,0x3bd064de,0xf82ebda1,0x5a6b694e,0xb91e2804,0x1f017fe0,
  191648. 0x07a43cd2,0x190d31f3,0x630433e9,0x6c26f226,0x0abfdcb4,0xba488aa7,
  191649. 0xa46411c0,0x418d9085,0xbffb5880,0x1b934fe6,0xe200f849,0x75d1e237,
  191650. 0xa55413db,0xdf04d63f,0xe23b3f77,0xe216ed75,0x0f91bd30,0xa05866cb,
  191651. 0x7729c509,0x84c395d9,0x452ab2d7,0xec97e188,0x0093d686,0x8cb7c1f9,
  191652. 0x628f086c,0x2d032395 },
  191653. { 0x4a44b4c5,0xa81c9407,0xcc702c98,0xb9846879,0xceb0dc97,0xcb502287,
  191654. 0x6e3aa321,0x30301126,0xe4c256c2,0xc0ac8763,0xe55b4845,0x65034d20,
  191655. 0xf240f35b,0xaa96a040,0x7cf7eedc,0x046d26d3,0x3b810656,0x62a5a8e1,
  191656. 0x83d70c2b,0x86044b97,0x59e4da8f,0x2fbaff88,0x5457f5d1,0x929d901a,
  191657. 0xb531b757,0xd29e1eb2,0x9e4e9739,0x214dabdc,0x4eaa9bd9,0x5bd724fc,
  191658. 0x1ef9bb9b,0x734c12b3 } },
  191659. /* 43 */
  191660. { { 0x92f9b086,0x98fe3c2e,0xb3fd4544,0x4641b93e,0x5c02c65c,0x47ce208b,
  191661. 0xc4f03242,0x8a52dca1,0x679d29f6,0xb5ec17d9,0x9406f5f4,0x11d2fed0,
  191662. 0x0d9ba811,0x260f63dc,0x15472a3f,0xde2b056f,0x007290e6,0x1b170d9f,
  191663. 0xb6b5c8f9,0xa2e23e8d,0xcf34c3ee,0x345a2839,0x1b973ee2,0x9bdc5461,
  191664. 0xbb24d1c5,0x65bda6c2,0x3c6141a1,0x97d52ba3,0x9d2eb201,0x47bb1612,
  191665. 0x21fbe49f,0x7c558a87 },
  191666. { 0x3f350fec,0xb9485a52,0x6a38d4c0,0x016678c5,0x0d5aa64d,0x8ef346a2,
  191667. 0xd96da2e4,0xb85daa02,0x4f647b3c,0x845ec4ea,0x0d5e946c,0xc0d1a6ca,
  191668. 0x4fa9f4ab,0x41d8d1c1,0x9c8b1303,0x43972cc5,0x434ffbfb,0x67e1f48d,
  191669. 0x819d2318,0x350ce93a,0x6ddef23f,0x49f53090,0x200cf12c,0x3c2e6cf9,
  191670. 0x640432fc,0x42691cc1,0x72496b52,0xbfff74b4,0x020a97be,0x44527c9f,
  191671. 0x7b3c4348,0x34cd7dca } },
  191672. /* 44 */
  191673. { { 0x59e7fe87,0xf031761a,0x0047cd72,0xb1eae31a,0xfae30f62,0x27902e68,
  191674. 0xb71db143,0xa666f48d,0x0e0038f4,0x75ee6678,0x02bdd76d,0x3b45ac67,
  191675. 0xa0d6cd5c,0x0d2fb828,0x9d8c5b11,0x27ce7f1d,0x120b5e96,0x141fe0e4,
  191676. 0xb9267c37,0x95a1b984,0xd60312cd,0x5206e589,0xda549356,0x1867342e,
  191677. 0x070c74ac,0x374520b9,0x9557b0b3,0x2703cbb5,0xa6ed8c14,0xf621f59c,
  191678. 0xabf7b887,0x7ceb1cc2 },
  191679. { 0xdb7fd65b,0x0647a5bb,0x36c9457c,0xd8d45cc0,0x9e12718a,0xc6da99db,
  191680. 0xe93a7fb1,0xed1dbbf4,0xbd1566a1,0x4512c95c,0xdbc0c919,0x4861ba00,
  191681. 0x9e7f5269,0x3c6cc298,0x0941aaae,0x67196150,0xc8c538e3,0xbfcf5d0f,
  191682. 0xa25a551f,0xad6e9929,0x17ca0f26,0x90710985,0xfa89ef7e,0x743b78ea,
  191683. 0x71ab4549,0x39d5ea31,0xe6d1c36d,0x7442f3f3,0x059d568d,0x25a683e0,
  191684. 0x227ced5c,0x1f629a99 } },
  191685. /* 45 */
  191686. { { 0xe45a1c3e,0x8925ddac,0x41f7545f,0x72d29365,0x37e7f828,0x45622fcb,
  191687. 0x3e4c79d2,0x88234513,0x9c2645d6,0x5dffaf84,0x994802b9,0x3078f4dd,
  191688. 0x9d339fa0,0x566927f0,0x9fd91dcc,0x9a500a1e,0x0ab0abd7,0xce008180,
  191689. 0x8194e5df,0xd97135a3,0x98adf088,0x9e876307,0x9a45a2a7,0x3baf01b8,
  191690. 0x788b4399,0x6fed6154,0xe77a997d,0x980e5722,0x2a378eed,0xaac90ffa,
  191691. 0x8bd805a2,0x4a75fda2 },
  191692. { 0x55e74cbc,0xd09a8fbb,0xfab18f25,0x737738ce,0x9764ec3a,0x0fc23ad6,
  191693. 0xe7e0ad31,0xc5a7d35b,0xe481cc9b,0xe75e068e,0x3d4aec34,0xf0c2ea99,
  191694. 0x0d4a63c4,0xf1324fe8,0x99b0592c,0x5dbb7c16,0xa7e0f46b,0x442d674d,
  191695. 0xa300faea,0x5a5d66c7,0x3333ac83,0xe83dc821,0x8c408496,0x70ef812e,
  191696. 0x99ef5fc1,0x96e1dcb6,0x1734e862,0x6e2b771b,0x583507d8,0x04629cdc,
  191697. 0x23d8179a,0x5819f9ae } },
  191698. /* 46 */
  191699. { { 0x6aa78811,0xd9969121,0x2103e7c3,0xf64ee8f4,0x22b9e698,0xddf01070,
  191700. 0x4f582cde,0xe6001f9e,0x2ecfac1a,0x24a608af,0x06393009,0x6ef4c784,
  191701. 0xebf72911,0x5262eae6,0x8c4ee5a0,0xddbd0af5,0xecd87bc7,0x875aff90,
  191702. 0x6f24f114,0x2fddb34c,0xe865f172,0x48104281,0x886c1b9a,0x95692426,
  191703. 0x9ef4231f,0x6f5f3208,0xd0a7e82e,0xaf587acf,0x9ac395c8,0xd6571917,
  191704. 0x1364a750,0x7459603c },
  191705. { 0xf41ae519,0x1c2475bf,0x4af8f251,0x34401fb1,0xaefb2c3d,0x70ddfcd2,
  191706. 0x51cdaf08,0x9b2d385b,0x8208bb19,0x8531c256,0x4c33f3f6,0x16c89df6,
  191707. 0x24571769,0xc23cfa99,0x86d010ba,0x2339b51e,0x22638313,0x08db0e8d,
  191708. 0x00fedeb7,0xf769e179,0xa3687ef1,0x3fd96dcb,0x91476475,0xcd046b23,
  191709. 0x0c45c8dd,0xf3ff2064,0xb8343d78,0xefd167bd,0x4b77ee90,0x493ccb6d,
  191710. 0xb3cf7b45,0x33025513 } },
  191711. /* 47 */
  191712. { { 0x35eaaca1,0x36f00469,0x89119102,0x0c384b75,0xe6d2954c,0xcb375665,
  191713. 0xb1e9d6d7,0xcb9199b9,0xc29c2757,0x75852349,0xb8e738d0,0x89cbd1ba,
  191714. 0x5923a427,0x9b8dbe90,0x18fe1889,0xa237793e,0xa742e083,0xa4271757,
  191715. 0x4eebd613,0x8c4979d2,0xd4f2cf77,0x40325054,0x958705de,0xa3b8a091,
  191716. 0x33d999ba,0x1b191bd9,0x3b0fee1e,0xbafefba4,0x3facdf14,0xb3bad184,
  191717. 0x4387561c,0x9328adb0 },
  191718. { 0xf906b872,0xabe84e80,0x78262665,0x705523a0,0x3398ccf7,0xd89c6a7e,
  191719. 0xf55b5323,0x2fab551d,0x0554dea8,0xa0578eca,0x375589cd,0xef26523d,
  191720. 0x864ad750,0xd8fd6242,0x178fe1fe,0x93f27fc5,0x9df87422,0x7b3e6f30,
  191721. 0x3750d054,0x2862e49e,0x5dc038a1,0x7d90c6b2,0x84db682b,0xc1a1ae22,
  191722. 0x9881930a,0x47f3dab7,0xbaf3e0a4,0x30e6bd52,0xf62d25c5,0x0680025b,
  191723. 0xadd0d5e7,0x0aa1f3cf } },
  191724. /* 48 */
  191725. { { 0x22a10453,0xa9822190,0x2a03a10b,0xdd1eb91c,0x96646f3b,0xafbb5d95,
  191726. 0xf38b6fc6,0xa58de344,0xb8cfca1d,0xce47c3e5,0x0f70da04,0xfcd8e16d,
  191727. 0xda262ed6,0xac44349b,0xc56e2f8e,0x9320d87b,0x19138e58,0x9ce3ea08,
  191728. 0xa2b236c0,0xa5862dff,0x8e7efb0d,0x6b0f9a5c,0x16ac78eb,0x4b53432b,
  191729. 0x709b51af,0x6ff43105,0x8f519628,0x08e236f8,0xeed403ad,0x1f93f176,
  191730. 0x9636545e,0x559337e0 },
  191731. { 0xd8fd807a,0x30ddf738,0xab131222,0xf4e0ec9d,0x625afbc3,0x14a2f4db,
  191732. 0x9f12f895,0xd5b70604,0xac3044fd,0xb46f3c23,0xf540148f,0x1b232d1f,
  191733. 0x39b4e554,0x61b458f5,0x0dd70b75,0xf694b24a,0x289581d9,0x0fc64299,
  191734. 0xee5fe22d,0xc05d49be,0x6a18bf63,0x7af3447f,0x7f1929d6,0xe96a1dc2,
  191735. 0xc1551e8c,0x6afe6028,0x2b5d4fa2,0x27dacaf3,0x545c2cb4,0x4a1631bc,
  191736. 0xb0c914d3,0x930070f9 } },
  191737. /* 49 */
  191738. { { 0x69a9bc05,0xd2f32c5e,0x589c4b73,0x0a5c19c6,0x94665f9c,0x095c9e5e,
  191739. 0xbcfb4c39,0x8ab0f293,0x1ddb7c31,0xb9070877,0x66b38048,0x894e9658,
  191740. 0x606bd9bd,0xf19a90cf,0xb6fd2d69,0xcc1d58df,0x461d8a69,0x886dcc4e,
  191741. 0xf9ce4831,0xc455c277,0x765f8a82,0x749a5996,0xc3badc8d,0x2ffc668c,
  191742. 0x9112cdab,0x38018396,0xb243c7cb,0xa98795c3,0x010a2224,0x8775f310,
  191743. 0x587b5e14,0x043a2141 },
  191744. { 0x3a873752,0x7bbe9dbc,0x2f442fee,0xee1493f4,0xc18c2181,0x981ca2c8,
  191745. 0xe29769e7,0x00ce3090,0xde768c5f,0xb4626ac8,0x34d7677e,0x33e9ce46,
  191746. 0xe0fa94e6,0xf89c2cad,0x41f5b5bf,0x04f5cc11,0x2228c12c,0x2565f736,
  191747. 0x0c05cce5,0xf1bf706a,0xbe487c4f,0x5d07ffff,0xa499f1a4,0x3ec43c09,
  191748. 0x98d94800,0x4f4e79bb,0x073f12f8,0x8a335a16,0x0f970d6d,0x4bb5eaf7,
  191749. 0xf24d0ae8,0x18d0747b } },
  191750. /* 50 */
  191751. { { 0x84601faf,0x58d3c77c,0xaf1c1f72,0xc9465be2,0xd116d806,0xff626798,
  191752. 0xd5b0d93c,0x3996c0c6,0x5ec6723a,0x2fa1ad75,0x03ba5349,0x966a8144,
  191753. 0x2ac34d8a,0xdc4c9422,0xed675865,0xddf471de,0x953d528f,0xd8aca597,
  191754. 0x24ebf67d,0xb2e463b5,0x7e25b4d3,0x25824871,0x43159daa,0x23c5adba,
  191755. 0x83357540,0x5458f9c6,0xf938b1a6,0xcf685da7,0xcefed231,0x981a4fda,
  191756. 0x08bb5e59,0x711093ed },
  191757. { 0x401f161a,0x12aa3fc6,0x974c5e87,0xf7358560,0x17b5df82,0x4aa252fb,
  191758. 0xa48e6299,0xb0b82b07,0x29dd847d,0x00234157,0x4529c5a6,0xf1e54d00,
  191759. 0x6d98f538,0xcc1c539e,0x28d3abcb,0x36162b53,0x2a84f0cd,0x75a37938,
  191760. 0x4dee7484,0xf717a81b,0x4c23bf1b,0x16cf35fb,0x787e8b3e,0x7fd1c29f,
  191761. 0x59b79ab0,0xb7da7e68,0x85f6c60b,0x072100a0,0xe7ed48b5,0x31840159,
  191762. 0x4d9c97d4,0x17898bda } },
  191763. /* 51 */
  191764. { { 0xae1b8cf8,0xcd8483d8,0xe9a28856,0x323d4b42,0x204a4bc2,0x7633584f,
  191765. 0xca7a69fa,0x4e0b2228,0xf757bab2,0x8afbda8b,0x6cc5f9ca,0x85b24088,
  191766. 0xd41a95c3,0x47fb4813,0xc2aabe6b,0x3f1bc53c,0x1ad1599d,0xf22cda3f,
  191767. 0xc31ea9b1,0x1b2ec081,0x01614ac1,0x048f304b,0xc6afa7ab,0xce31cee9,
  191768. 0x4140dc3d,0x55af7633,0xdce8abba,0x84b7ab37,0xc7cf3efe,0x50de7648,
  191769. 0x15356ab2,0x73a88dcf },
  191770. { 0x06e83b39,0x3f868288,0x9f44037d,0x477a4413,0x17dbc841,0xf9058b0f,
  191771. 0x54d17549,0x2db64f4f,0xf2307ffe,0xa23cea6a,0x4f126261,0x393efd55,
  191772. 0x10f37f26,0x2f4e658a,0xf4ee1e35,0xa4437ce3,0xa93cde8b,0x64ef42a7,
  191773. 0x939aa901,0x1debc9f4,0x3d7b5cd4,0x44223d6a,0xf88a3acc,0x789a6a11,
  191774. 0x2c608a2d,0x56fb9df8,0xbbf56c06,0xe79db8e3,0x668fa300,0x73c56af2,
  191775. 0xae396a1e,0x52f32b17 } },
  191776. /* 52 */
  191777. { { 0xe714f71a,0x56f524c1,0x9add8519,0xc1be1262,0x65cadbe3,0xad9189d8,
  191778. 0x5a0fb649,0xd88bf5c8,0x21d192d9,0x9efa6a92,0x6f724b6f,0xe3fe8389,
  191779. 0xb250119c,0xec3fae24,0x2ae0d3c0,0x4b6af9f6,0xd619624d,0x8fceba0b,
  191780. 0x2fdb6e3a,0x7dc3092b,0x3263cd29,0xc91da376,0xf95c43bd,0x30c0761e,
  191781. 0xcdeb44d9,0x89136400,0x43c0d31d,0xfd7dce84,0x9871899f,0x78fec3b1,
  191782. 0xefdf58c1,0x79e14d28 },
  191783. { 0x9bb40c55,0xe3822235,0x0ed07a42,0x0a27202d,0x4838c1f4,0x48e6c1a9,
  191784. 0xd864a78e,0x2b5f24a7,0x0c6c55c9,0x7e7f140a,0xce12d508,0xe62c104a,
  191785. 0xc11b1e10,0x9b0a1a7e,0xafbb3dd5,0xfd8a275f,0x9a3b6b30,0xdff354fe,
  191786. 0x46602a01,0x5a105d9e,0x93bb65f7,0x3d371b4d,0x0f82fdeb,0xda5cbf0b,
  191787. 0xde468545,0x4601229b,0xc73d517e,0x505e10b9,0x672ff492,0x77cfa541,
  191788. 0x99566ce2,0x0d8ec28a } },
  191789. /* 53 */
  191790. { { 0xcbeee995,0x014cf73e,0xd491e80c,0xb2eb88bc,0xd9aba5d4,0x615a6cad,
  191791. 0x9304c84d,0x2f7d4633,0x8ab03c9a,0xba0501d2,0x91babb94,0xc8f723de,
  191792. 0x50405772,0xc885f977,0xc7fcb094,0xb5e1d2b3,0xdf96c71a,0x61ee7995,
  191793. 0x3464499e,0xb8c8daab,0x5f607932,0xdb425ddd,0xb1243587,0x70251ca1,
  191794. 0x9fc74340,0x26d7d3be,0xc902ac89,0x8c179310,0x4559a74f,0x72522c15,
  191795. 0xc3734afc,0x86001e27 },
  191796. { 0xe7693947,0x13b00ba5,0x012c062b,0x6478641e,0xe85490a8,0xe1a438e0,
  191797. 0xd9574d5e,0x5173dbbf,0x9bd3ba61,0x9532eb8c,0x5f3ea075,0x1f41bcb8,
  191798. 0x8cbb92b9,0xac1cc247,0x1ef901b4,0x0f34648e,0xd2b3b2ee,0xdd929d1e,
  191799. 0xc3d75bfc,0x470f1eab,0x139cf4d2,0x5cdbc6f7,0xf0424953,0xcd86454d,
  191800. 0x47fcb383,0x1e079812,0x17df930c,0xb9f209b4,0x114ebc00,0x4225fc31,
  191801. 0x347946c1,0x020591cb } },
  191802. /* 54 */
  191803. { { 0x275e0af4,0xe3003721,0xe78a4a4b,0x721141ef,0xd1757485,0x666cfcf6,
  191804. 0x168e659e,0x5fa1d737,0x0e2842ee,0x263e3e54,0x948bd5f6,0xadecc3d4,
  191805. 0x246b104a,0x019de03d,0xf343d818,0xf8a9e903,0x5b0c0d31,0xcb57ba4a,
  191806. 0x51e2765f,0x8246c506,0x6519bf67,0x80c5751f,0xf2119a01,0x5f05c200,
  191807. 0x7821d4f4,0x7e6487b8,0x261c3a06,0x262f94aa,0x72146052,0x56cfe489,
  191808. 0xa1df05ef,0x5119985f },
  191809. { 0xb18586c0,0x5819497d,0xc6eeaa62,0x004415d6,0x97cda28b,0x7c6a46b6,
  191810. 0x7c194594,0x9a149b28,0x4ed3a506,0xb56369fa,0x43c94cb4,0x7092aa66,
  191811. 0xa9e9eee2,0x55bce73a,0x77893509,0x34bb2870,0x06eb5326,0x8af95fb0,
  191812. 0x9638f485,0x87cd0323,0x5ba75bf8,0x29376268,0x9d42d581,0xf32d6f3d,
  191813. 0x65c6d64d,0xa4cad574,0xb2cded41,0x985f50fb,0x9006a067,0xcf34ce0e,
  191814. 0x58a57f9a,0x59eaf265 } },
  191815. /* 55 */
  191816. { { 0x6ec3876f,0x7b407efb,0xf0f48648,0x780c6123,0xbf893039,0x2abb56ff,
  191817. 0x45a91ab0,0x9592eaa0,0x78811b82,0xce5b84d7,0x1f9f3fc9,0x86a71a34,
  191818. 0xf0e7e13b,0xc17fdd86,0x655a0880,0x88ed8297,0x81d5e666,0x75d6dc74,
  191819. 0x1d171797,0xeffc9df6,0xe3f79e1f,0x36ad4c8d,0x2046192e,0xdb15317d,
  191820. 0x274fda62,0x78c9fa7a,0x82dd9914,0x04ec924f,0x3a64971c,0x059d1e38,
  191821. 0x2620bbfb,0x3b4450ea },
  191822. { 0xc776dcdb,0x3db7a955,0x81c8ba47,0x35c4a57c,0x505760fb,0xae285003,
  191823. 0xb3aec353,0xe3e80691,0x47117be5,0x380335be,0x056ccf61,0xe1c47e3a,
  191824. 0x33977916,0x253cfdeb,0xf5cb7ee1,0x3decdfba,0x7cf4b704,0xf3c9794f,
  191825. 0x9ff81462,0x2401680c,0xbe3daa9f,0x4e440e11,0x69f91d8a,0xc5d04377,
  191826. 0xcb5e9c5d,0x4106c7a8,0x33b7d24d,0x191909a1,0x3764b4a2,0xe893c838,
  191827. 0xc429b614,0x4a7fe30c } },
  191828. /* 56 */
  191829. { { 0x2455c7c5,0xe78f3a70,0x70157754,0x5b7636e8,0x7623262c,0xf32c4524,
  191830. 0x1bc780c7,0x2c98b11e,0x915ed877,0xd48eaeac,0x199265f4,0xbb04d3c0,
  191831. 0xcfa5200f,0x6b52b19b,0x93ea3fe8,0xc46a0981,0xba758059,0xd82c733d,
  191832. 0x1896aacc,0xd324bbd6,0xce8ecd51,0xac09a2fc,0x02fc44b3,0x529918fd,
  191833. 0xaaa1784b,0xf0c45e4a,0xfe22085c,0x35626340,0xc50c7d61,0x53cbb676,
  191834. 0x65126b23,0x83fa1ea3 },
  191835. { 0x10ccc646,0x60ac86da,0x7b0451e9,0x2ce0637f,0x8a088610,0xbbbcf630,
  191836. 0x20349982,0x23c19019,0xfc0bcda0,0x707fc39c,0x1bd4fd7d,0x7f4d1f15,
  191837. 0x44713bbb,0xd6a64e74,0xc5ac9e60,0x57bdc676,0x37b61169,0x456c5303,
  191838. 0xdcf40a1d,0xd3451396,0x4997d2c7,0xf3edec25,0xc2c4a739,0x534ae9a4,
  191839. 0x6a6ad2e2,0x1401397e,0x23e95f81,0x20769d4d,0xde98fabf,0xcee007c6,
  191840. 0x931c51e0,0x61409779 } },
  191841. /* 57 */
  191842. { { 0x15156623,0x3ddb32db,0xab7a67c2,0x68137fbc,0x6f19e3c2,0x26011f50,
  191843. 0x89924c61,0x34218b02,0xc6804c1c,0x492a0b0f,0xafaae6a7,0xd65be706,
  191844. 0x0d01be61,0x3b13d23e,0xf87f4c69,0x44545b47,0x04dc1aa3,0xd42236e2,
  191845. 0x3c5161ec,0x6135261d,0xbd88bc07,0x1eb46a63,0x1599d720,0x78c6d836,
  191846. 0x69baf0f3,0xf6955fe1,0x17072820,0x467eebd6,0x3e3a340a,0x2f1b8a2a,
  191847. 0x2d0b5f88,0x636dac76 },
  191848. { 0xb4c80af3,0x94280db9,0x4e3892ab,0x9a189cd1,0xd1477ddc,0x26e702e0,
  191849. 0x68f9f14f,0xe91aee38,0x80baa0b2,0x2864f63a,0x8b714a29,0xacd81f73,
  191850. 0xc5fe7cb6,0x30e1b870,0xb10837fd,0x883ea1c3,0x6b20489f,0x2da27953,
  191851. 0x58a2da5f,0x3aeb2a68,0x03a8fa14,0xe2330bf2,0xdc70b1c4,0xb5c488b5,
  191852. 0x299678f4,0x0a78c4d9,0x25df675c,0x233bd098,0x7b67d368,0x37b5c076,
  191853. 0x4d0bef3f,0x2f6dbdfe } },
  191854. /* 58 */
  191855. { { 0x2e4da7c7,0x2f8472fd,0xae677932,0x708cfc91,0x3dc268e2,0x364af08a,
  191856. 0x799a2424,0x0f10dfe0,0x71d58bff,0xef912d58,0x988962e6,0x6bf35dfc,
  191857. 0x5f47ea0a,0x28b96fa9,0xaad308c1,0x734a79ea,0x9f437bba,0x95730337,
  191858. 0x6cf54f75,0x002cbd8e,0xe7632eec,0x47606dcf,0x53193104,0x404b5ecb,
  191859. 0x0acf729d,0x0ae0897c,0x3bddf1de,0x89628b86,0xf87d7448,0xeced154e,
  191860. 0x458d5d4e,0x5cb6e197 },
  191861. { 0x008c75ed,0x98cef197,0xf6eeaaf8,0x7cf49d3e,0x1875e96d,0x1d6f9e02,
  191862. 0xdd9b0d8a,0xfcec2cfe,0xb9576daa,0x38a61cfe,0x36a7dbb8,0x10003f39,
  191863. 0x23b814f4,0xb37c3868,0xb80e3153,0x9fb66dcb,0x059847a8,0x9e7e2eba,
  191864. 0x35a72770,0xa4ec63fd,0xfc9e0ed0,0x311f3d91,0xd515baa4,0x3c1dc094,
  191865. 0xa08cd4e3,0x75a06ebc,0x2ed5eeaa,0xab617238,0xe1f52c1f,0x2e82bbb0,
  191866. 0x5175d6e5,0x2149d630 } },
  191867. /* 59 */
  191868. { { 0x5f9311f6,0xee1a8e6f,0xbabc1f85,0xc97e3c9f,0xb494209a,0x4fa7c52e,
  191869. 0x19774fe1,0x04c2f51c,0x8555844f,0x5cefd122,0xb5873ab3,0xb53862a3,
  191870. 0xcbed19fc,0x768efdd6,0xee58469a,0xcdc12479,0x3d80c09c,0x11237e31,
  191871. 0xc044c28c,0xdd74a290,0xbd47e287,0x9ee6517a,0xad0ffeef,0xc2421228,
  191872. 0x818d281f,0x4273088f,0x43ec0de1,0xebc744bc,0xb415bd73,0x5b26eccf,
  191873. 0xcb07c26c,0x14e2f350 },
  191874. { 0x4216946b,0x548d2a10,0x7a4bd92d,0x6e801f07,0x43695160,0x5996d0a3,
  191875. 0x63a197c9,0x0f1b5c2f,0x061f77c9,0x79da3c4f,0x93ff7b22,0x1c1cd634,
  191876. 0xa234123f,0x5e61b650,0xf284033c,0x826b34c5,0xc2f34214,0x718b90e8,
  191877. 0xae806ec5,0xa5f35620,0xe324a9b4,0xa2fae345,0x8b53cb51,0x8c0bb95e,
  191878. 0xf9965778,0xc94f6ac2,0x6b9def32,0x07ec607d,0xd0ed8f27,0x63bf1dba,
  191879. 0xdcb61e4f,0x58537e02 } },
  191880. /* 60 */
  191881. { { 0x64f80ba2,0x1f64b064,0x0559a45b,0xe8e055e7,0xf1f4b634,0xc3262b34,
  191882. 0xde8c8482,0xef4f7d5f,0xc30c780a,0x9d55dea0,0xcfa1e693,0x1740afb9,
  191883. 0x7460c34b,0x2cfe6a66,0x1187c1ee,0xf6695941,0x5f974d94,0x1382f277,
  191884. 0x004549eb,0x1ca0ace4,0xbabded02,0xf8244b3f,0x4e3653ea,0xc36f4d06,
  191885. 0xc55c5f83,0xeab9f0dc,0xacebce90,0xd93b9cef,0x19061425,0x16658e72,
  191886. 0x82d7970d,0x4857835f },
  191887. { 0xd2576210,0xdcd525bc,0xd51b5443,0x9f378aa7,0x1bd83994,0xfe97bf17,
  191888. 0xf38ac621,0x930d0f63,0x818408cc,0xaf8f2c17,0x260f53f6,0x2692c87e,
  191889. 0xdb0a75e4,0x0ee45407,0xffdb1b37,0x0ec47ae5,0x7aa6a44b,0x769129dc,
  191890. 0x2e40b75d,0xb6f932b2,0x95ef3b77,0xe06764d0,0x68bc63e8,0x28fd47f5,
  191891. 0x9c0014c0,0xd1810494,0xd7995d8e,0x90e2d3fd,0x6c2a85af,0xeb39a05d,
  191892. 0xa21f3128,0x6c0277bd } },
  191893. /* 61 */
  191894. { { 0xb509e7ef,0xe41b7086,0x3d7f9f91,0x8842ec7b,0x5526b88b,0xcd285f94,
  191895. 0x051dd0ab,0x6e44e064,0x774f1ceb,0x90198c10,0x123e661b,0x6ecabe98,
  191896. 0x32f647d9,0x44811136,0x26c52aee,0x1dd82b45,0x939dc9d5,0xd650907f,
  191897. 0xfcd455bf,0xbd5eeef2,0x8d2e5d7c,0x7815a4dd,0x88bc9f2a,0x5ad4ec92,
  191898. 0x57a3b322,0xc6f10d0b,0x20b9cbdb,0xe8d0c1e7,0x9b774ee8,0x5a0b071a,
  191899. 0xf22fcf8f,0x3067bc9a },
  191900. { 0xb7ca9326,0xe0e589f2,0xb1224f63,0x17a106fd,0x747a57bd,0xb2354521,
  191901. 0x62b0882e,0x2614982d,0x4391ffcf,0x7f3af544,0xa84e440d,0x1aaa337b,
  191902. 0x941bb071,0x28ea37b0,0x2e4a7f54,0xa957dcb4,0x1a6ad5fb,0xe7ab662c,
  191903. 0xf7c36a20,0xd135e381,0x9baa0b6b,0x42e7980c,0x94e4671f,0x4237030c,
  191904. 0x8b0922e3,0x24cc63ff,0x445a589f,0xd10d5279,0xa870ff6c,0xbb99d316,
  191905. 0xa996c195,0x390c83ca } },
  191906. /* 62 */
  191907. { { 0xffc4a73f,0x50d3fa82,0x3bd53303,0x2665d635,0x264bb77d,0x80a06f8a,
  191908. 0x22d73d84,0x81c04a6e,0x0323b8aa,0x2409cff5,0x8c4c4d5a,0x31dce217,
  191909. 0x0c0f9c19,0x374aa80e,0x00186bb8,0x0b25a387,0xaaf1487f,0xd0b77a10,
  191910. 0xab498de1,0x15f39ad5,0x1aa0c116,0x92e32da6,0x96e25ce8,0x228e3dbd,
  191911. 0x5e8646d1,0xb57c88dc,0x267b1c68,0x672b1164,0x600bdec5,0x5d0d807f,
  191912. 0x223e573a,0x3ea4007d },
  191913. { 0xa595d0a3,0xd76debd0,0xaff0b3b4,0xa6bd76cb,0x9b1bdb97,0xbf2c154f,
  191914. 0x4c714c71,0x62b19ab4,0x221af663,0xc9bf33b9,0x8c941ef6,0x23d87c49,
  191915. 0xd79f0f6d,0x255804c3,0x2a7acbc1,0x6f1a1005,0x550528af,0x5dab79d9,
  191916. 0xc8d16213,0xfd77a6f0,0xde5e1029,0x40508b6d,0xf95da12b,0xd95ac0f2,
  191917. 0x758a8ba1,0x8860af71,0x7160c8fb,0x0b194c83,0xce004d34,0xa40e6c80,
  191918. 0x6b14aaa0,0x09f82a17 } },
  191919. /* 63 */
  191920. { { 0xc21366dc,0x60abe588,0xaf75daf9,0x729c0a4f,0xacb93ed4,0x70501fd9,
  191921. 0x87a16d70,0xb97e744e,0x98e7361b,0xa42e0a7a,0x28b54cf3,0x1acdaff2,
  191922. 0xb7bd9078,0xf087ccbb,0x663250e7,0xda6f3983,0xbaf07c09,0x66d693ee,
  191923. 0x8cbaf157,0x79baf4c3,0xdfca99d0,0x5a984e07,0xf26d8dab,0xab4d3247,
  191924. 0x7eba36f9,0x4d0be701,0x0e8dd216,0x37bb9e65,0x531c4f03,0x72aa4e24,
  191925. 0xb753d85a,0x77d1e984 },
  191926. { 0xd8e62367,0xd9373239,0xb9820cf1,0x3361848b,0x5a9c97c4,0x00c7e344,
  191927. 0x14f960fc,0x9a0ec9ae,0x740474b5,0xcf41f0cf,0xece065d5,0xa5eede8f,
  191928. 0x9e808610,0xb1de5a4e,0xae0cf75d,0x17c44ae4,0x6b148d0b,0x2fa56323,
  191929. 0xd29ff2dc,0x64fa740f,0x88cb212e,0xc605eb8a,0x6a863016,0xf2c771ad,
  191930. 0x607b4c17,0x6d6112e7,0x40d49785,0xfe90ec07,0xe256e0e5,0x599be18b,
  191931. 0xca54adb0,0x4e6eabec } },
  191932. /* 64 */
  191933. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  191934. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  191935. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  191936. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  191937. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  191938. 0x04ecf056,0x325d2796 },
  191939. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  191940. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  191941. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  191942. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  191943. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  191944. 0xe32a79d3,0x19d48546 } },
  191945. /* 65 */
  191946. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  191947. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  191948. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  191949. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  191950. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  191951. 0xb4e453b0,0x1b3ace6c },
  191952. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  191953. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  191954. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  191955. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  191956. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  191957. 0x192f0a14,0x538ec33e } },
  191958. /* 66 */
  191959. { { 0xa19b56cf,0x193496fe,0x7bb99acd,0x663d77f4,0x57d0a881,0x8f04afa8,
  191960. 0x082835fd,0xcced3da2,0x5d82cec7,0x7e21faed,0xf8009c85,0x6e175b99,
  191961. 0x2d05a307,0xd9c6e31b,0x81487d82,0x96948d4a,0xd46f6655,0x86ebd3f2,
  191962. 0x773ccc49,0x86851aa8,0x8b1640a6,0x3e220f22,0x41a20b75,0x9f06e3a8,
  191963. 0x90ac0a6f,0x2cfffe5e,0x8ebeb3fb,0xf5a9b1da,0x6e08e2c9,0x2587d997,
  191964. 0x03e9f401,0x6fd60298 },
  191965. { 0x8eb7516a,0x54709f8d,0xbdc598ab,0x83058a74,0x87e801ce,0xd234dd98,
  191966. 0xd17b8a96,0xfd0f9d90,0x6e90f6ab,0xaa1e549f,0x5a7ed55b,0x2496ff80,
  191967. 0x6c254c19,0x0d9f657a,0xb8962575,0x3cdea49c,0x2dff27de,0xb685a3f0,
  191968. 0xdb8bc04b,0x3c50e7fd,0x987236b0,0x904ff0ff,0xbb0d5055,0x494298fd,
  191969. 0xe14be8d0,0x34b3386d,0x7c3d30d6,0x7ad34e9c,0xe159fdd9,0x1f2b32bd,
  191970. 0xc761e5c0,0x84cfa23c } },
  191971. /* 67 */
  191972. { { 0x8b99b964,0x13bc11eb,0x58e2fc47,0x8e280c0a,0xd4c9a54b,0x870fbc49,
  191973. 0xbf6e20fa,0x37a334a2,0xd7c88cfa,0xee583d0d,0xef4af1da,0x05e029a8,
  191974. 0x0c2ef8a6,0x6d55e234,0x209e9b62,0x61b6fdfe,0xbb8e080f,0x3b1dad26,
  191975. 0x9392fc1a,0x5adbc162,0x0aae3f4e,0x02ac0fe6,0xc2bf4d5b,0x8d99801a,
  191976. 0xc282fed2,0x2333f93f,0xb52db33f,0x16dcb10c,0xc55752e7,0x09f90f84,
  191977. 0xc84a0d8e,0x287d4c51 },
  191978. { 0x0e9867da,0x5fa58201,0x1a874cda,0x614589b3,0xfbdee22e,0x005e27c5,
  191979. 0xe612bda8,0xe357fef5,0x2d3635f9,0x4e0dbedf,0x6f125a86,0x62be70e4,
  191980. 0x0d94a2e5,0xa09b9884,0x28b5e5d1,0x7eb99a15,0x751028b5,0x21b9416e,
  191981. 0xe06d2cc4,0x1b137fd7,0xfea09845,0x6fa1f517,0xffcecbd7,0x3ba1e966,
  191982. 0x832f453e,0xd4c89a4a,0xeca68fa1,0x07b1e2af,0x4bd395a3,0xd0fb4453,
  191983. 0xd8ef9e13,0x0132a3dc } },
  191984. /* 68 */
  191985. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  191986. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  191987. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  191988. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  191989. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  191990. 0xb6f8aa25,0x13cbee76 },
  191991. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  191992. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  191993. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  191994. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  191995. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  191996. 0xe02e8967,0x4e0a1ada } },
  191997. /* 69 */
  191998. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  191999. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  192000. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  192001. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  192002. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  192003. 0x9f99c999,0x733e30d9 },
  192004. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  192005. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  192006. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  192007. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  192008. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  192009. 0xb79a5c0c,0x56facb39 } },
  192010. /* 70 */
  192011. { { 0xa3018bfa,0x019165a2,0x9ffad984,0x100c6b24,0x55341a9b,0xbbf1b1f6,
  192012. 0x25dc4cc9,0xe6bd1d97,0x2bfffe60,0x52850ed5,0x7e5509ab,0x24e992cc,
  192013. 0x4ceb59f1,0xff6c502e,0x1aa7d148,0x2f0b3573,0xe7e3aa46,0xe90c1ddd,
  192014. 0xd1142880,0xbaec9f45,0x65be5dd5,0x475cfd26,0x1febce13,0x83abb14e,
  192015. 0x80942d30,0x6aba4829,0x297e82c8,0x1e1b235d,0x50d8218d,0xb771cdbe,
  192016. 0xd94d6cbb,0x88599266 },
  192017. { 0x155ccaf2,0x08847290,0x7c5b773e,0x8679ebc7,0xb2dd08ed,0xa88b2dd1,
  192018. 0x87d475db,0x960a180e,0x6694d02a,0x80fdb6b7,0x3f3f9e96,0x3e8758c9,
  192019. 0x4ad836c4,0xbda3f6fa,0x32fb387d,0x9400c581,0x2550200f,0x25a78542,
  192020. 0x776ecf18,0x2a97c351,0x566db59a,0x03ebf46e,0x26545eda,0x4743a280,
  192021. 0xcf74ab44,0xed169d84,0x88cb3f69,0xbaab931d,0xd8257196,0x70ae932c,
  192022. 0xa0c09719,0x797224a6 } },
  192023. /* 71 */
  192024. { { 0x441f3567,0x632923f8,0x2e24bf1d,0xc11c3168,0xb7671fff,0x4b97726b,
  192025. 0x7a5e1a22,0x601746a7,0x3addb417,0x53dddea0,0x7f59b846,0x57867a3c,
  192026. 0x56cd7ff7,0xb012a987,0xf19ba9a8,0x1bd5fec9,0xf8306748,0x750379a2,
  192027. 0xab8c05d1,0x7763445d,0x7903f42a,0x5d7f441b,0xa903e46d,0xc011674d,
  192028. 0xadd126c1,0x1b1d3c4d,0x61455b40,0xa2752aac,0x555c356e,0x4da42a68,
  192029. 0xd820852c,0x3ff09c15 },
  192030. { 0xf9cb7784,0x4c0a1bce,0x2422f305,0xaec539bc,0x0c414aa7,0x5f40f9fd,
  192031. 0xffd42bc4,0xd3aa316c,0x2f358e15,0x42f5a4c3,0xd6e27682,0x00bdcd9e,
  192032. 0xf8a5ecee,0x069f789f,0x05e14f5d,0x8078018e,0x8b40c741,0x2bb3e493,
  192033. 0x7917f72d,0x5dbc8c1d,0xcc57150c,0xe0eea664,0xc3fa8920,0xa25ecc5a,
  192034. 0x1c797164,0x3c21b0f5,0x634ad16b,0x8f09a2f2,0x58391d9a,0x8e730fc5,
  192035. 0x4fdfae4c,0x47ef1805 } },
  192036. /* 72 */
  192037. { { 0x3da285e4,0x9965f3d1,0x3a01e3f4,0xba7d4dba,0x61214ad0,0x4738413a,
  192038. 0x22397549,0xd3b7d535,0x5a730b92,0xa53dbdcf,0x332d165d,0x3130d92b,
  192039. 0x82f97ef4,0x44a28541,0x44dce1b6,0xbf62221c,0x7e2a0ec9,0xbba13858,
  192040. 0xcbfad998,0x33f32c8d,0xb5fed44b,0x409e5f3f,0xc66217bb,0x5c328c65,
  192041. 0xfcdf71a9,0xb00db69f,0xb8920788,0xa23c2a21,0x3ae6464b,0xf8ab28e6,
  192042. 0xb8de0861,0x1a6b6e9c },
  192043. { 0x06af77aa,0xaf6ec2b6,0xa887f065,0x2e60f5cd,0x9f498c56,0x87d21400,
  192044. 0xfcbaaf4b,0xdb595b59,0x271ab855,0x0fb592a1,0xd4349b0c,0xa0ce10e5,
  192045. 0x887d8c9c,0x9d6187d8,0x154bd6db,0x03ee95f9,0x5d06c999,0x8fe53213,
  192046. 0xfb6a64d0,0xf4a7bc30,0x66a4cb60,0x3d22af0d,0x5d37367c,0x16952cef,
  192047. 0x997d8e55,0x6f0ea734,0x731732d0,0xb447c70f,0xa9cb3942,0x00ab3034,
  192048. 0x28510fd0,0x79dd0180 } },
  192049. /* 73 */
  192050. { { 0x3ac7424e,0x04e0033a,0x60fda4d0,0xdb06b688,0xbcb772fb,0x236a9766,
  192051. 0xf297cda4,0x294a8e2b,0xdb013c6e,0x4b0aab85,0x8723a3ad,0x3d2aec98,
  192052. 0x13c84a6b,0x0cae32cd,0x70ec169e,0x21888f5e,0x42a88262,0x739633bd,
  192053. 0x7b60d9b8,0x68ac792e,0x10769fe1,0x89f2b722,0xd24bed34,0x8f3fcfe6,
  192054. 0xa3eb24aa,0xd35efb88,0x484c706b,0xddecfa3f,0x929ece0d,0x7cc119a9,
  192055. 0x8d405436,0x87e5ad45 },
  192056. { 0x7d1000a7,0xba99aa9d,0xae823833,0x8b94affc,0xdfb83dc5,0xc8229628,
  192057. 0x845a418d,0x2f59fe11,0x5d417054,0xa8b970f8,0x72b71581,0x8918c265,
  192058. 0xc0d1dd17,0xe4ef477d,0x3afad7c0,0xb50b4cf3,0x01870a5b,0x21baea79,
  192059. 0xbb3a2868,0xc77087f9,0x124a59cd,0x7857531e,0x57f43239,0xed74c26f,
  192060. 0x0164c94a,0xd5f5ae25,0xf094bf74,0x6608b7e2,0xfdceea32,0xf4cdb5ba,
  192061. 0x990cc045,0x0b712519 } },
  192062. /* 74 */
  192063. { { 0x88d5c64d,0x5a290ca1,0xa7492534,0x0596d749,0x2a00e925,0xa04b0d3d,
  192064. 0xcaf7b66b,0x082cd02c,0xecdded83,0x912b50c2,0xff31646e,0x813ce9de,
  192065. 0xc75fff95,0x62ae70c7,0x7e2a4615,0x6f6852e0,0x03804fd1,0x320fd7d0,
  192066. 0x8218e8d9,0xb1a2a4dd,0xafc645d7,0x4918a6fb,0xe8d9fdbe,0xfb080fa1,
  192067. 0x4470b6ee,0x33d4d08a,0x6d974ef7,0xd2ba2077,0x69dae5d2,0x8ecb95a7,
  192068. 0x7d69596d,0x7a3f423a },
  192069. { 0x9a929387,0x362d2ca6,0xcb1c1fff,0xabdb7581,0x7e51b6cb,0xd892ec9f,
  192070. 0x3a4e131f,0xee8d8632,0x5bd87561,0x4680e3f1,0xd4e7e732,0xe3a597e1,
  192071. 0x5581fefe,0x3cc72b7c,0xca8cae0b,0xf3e77f8a,0x5e2fd4af,0xfcc7d7dc,
  192072. 0x21355b79,0xdd3a4552,0xa2c07177,0x546b24f2,0x0689621f,0x415b532d,
  192073. 0x3f78163e,0x2be9af51,0x33d7ed21,0x27d63b9b,0x96802943,0xab019ef2,
  192074. 0x1623faf4,0x2da5fc55 } },
  192075. /* 75 */
  192076. { { 0xc8a5c600,0x62429cf3,0x3fe33e7c,0xa7a80c22,0x0a57ddcb,0x9ffda740,
  192077. 0x925b0c74,0xd1ae156d,0x6b100eb0,0x097a43f9,0xef943c81,0x169e945c,
  192078. 0x1128cf24,0xa1f734e5,0x419f0133,0x04387c4a,0x01044024,0xc007868b,
  192079. 0x90359cf2,0xe5416abf,0x478d54e3,0xf9c76fee,0x42a2173e,0x66219da6,
  192080. 0x9fe30141,0x61e03156,0x93ef247e,0xa0ff5ce3,0x072b6592,0x811792ba,
  192081. 0x70c854d3,0x855f0219 },
  192082. { 0x847314c4,0x61fbfb6c,0xeb45b96a,0x97906155,0x6ba2afac,0x7102e146,
  192083. 0xab949781,0xed51f975,0xc110c4fe,0x9d2f5b17,0xaff57667,0x7ac8ce70,
  192084. 0x6eb244e7,0xe7366a21,0x551c65c7,0xdd1bbcec,0xe1a859de,0xb525060a,
  192085. 0x8ba7d2e7,0x7a048174,0xab8ea8c4,0xe1a2c541,0x6fdff078,0x6e7824c3,
  192086. 0x14874b04,0x79b49fc7,0x06b1f733,0x22ae337f,0x6f8fe6cf,0x1c352192,
  192087. 0x525d0797,0x292236cf } },
  192088. /* 76 */
  192089. { { 0x7d8b29dc,0xcdb8d80a,0x08ea648a,0xd17a2024,0xae92be91,0x7db12c5e,
  192090. 0xfda72fbc,0x1f347d18,0x9e760c6f,0x11374b40,0xd8e38d91,0x7361e8f1,
  192091. 0x739ac1f4,0x7714be9d,0xb4df5c4e,0xc1f9701c,0x6f72cae1,0xd9138ed8,
  192092. 0x6ad180c4,0x1c7fe1f7,0x9e2dbf9c,0xf8c185be,0x7c70c44d,0x835db269,
  192093. 0xb0d15b5f,0xf997cfea,0x61e6545e,0x5101445a,0x25184e5e,0x16b06884,
  192094. 0x7521e7aa,0x7cfac359 },
  192095. { 0x3c0bc53a,0x81182167,0x7e751367,0x84b5ede3,0xa3657a18,0x3ca255fd,
  192096. 0xba1fdd98,0x096abbf4,0xc5da77d8,0x9ce8369f,0xaab342c5,0xf27b9ae7,
  192097. 0x972059f1,0x06c91bd6,0x914ecfe9,0xee0dab30,0x93f53f12,0xbb647fbb,
  192098. 0xffa57e0e,0x30c38a7a,0x9f2ad607,0x517d06ef,0xbb99dcc9,0x49728d87,
  192099. 0x446080a1,0xb0034af1,0x12b9c17d,0xcc810c3f,0x772a22a0,0x7225f14f,
  192100. 0x1ddf82bd,0x6ce3dc7f } },
  192101. /* 77 */
  192102. { { 0xa4397830,0xc07cd835,0xf4733306,0x4dd9290c,0x29989e8c,0xdd35d3a8,
  192103. 0x563d8152,0x79902559,0xe87de61b,0xf278d911,0x1024e35c,0x9c7340c7,
  192104. 0x4a0d0e59,0x2d444461,0xf32626a1,0x63e7608f,0xc4c9baa9,0x627a37e9,
  192105. 0x76fffd25,0x0c56dc51,0xcef2a1cd,0xcb6defc8,0xefc559d9,0xcbcc0d56,
  192106. 0x041cb692,0xe45f3fc5,0xe5161e09,0xcd05c239,0x5c3b559c,0x2a731ee9,
  192107. 0xa3d0a16d,0x85151122 },
  192108. { 0x86ff19e2,0x782d0335,0x1da28603,0xc2c60daa,0x557c7eed,0xb2e78cfe,
  192109. 0x1bc4e8b0,0xa8f6f984,0x3df35c67,0xcc1f9b4b,0x4764462a,0x96e13603,
  192110. 0x7c7ae0b0,0xbf910b97,0x51435956,0x27c7f305,0xf631eae5,0xc14db15c,
  192111. 0x7e69b34c,0xa51d6142,0x5fc12ff2,0xdec82851,0xfb887162,0xfcceae13,
  192112. 0xde1488bd,0xda332ac1,0x2ee3e74c,0xa20374e2,0xf0ae069c,0x597ea1a1,
  192113. 0x77bdec04,0x8b1159f2 } },
  192114. /* 78 */
  192115. { { 0x2f961d30,0x4af71a44,0x7ac7248f,0xbdf968a8,0xb1a906cd,0xd32df87c,
  192116. 0x04abf925,0x00c10e26,0xb9f04d4c,0xb8711759,0x939705da,0x00d54e60,
  192117. 0xc9f80849,0xf7587433,0x6a7a2375,0x2e9abade,0x94ac17ac,0x5676d478,
  192118. 0xc202d99c,0x4ca0525b,0xabfae73d,0x95b8bcad,0x3405991b,0x2371ed38,
  192119. 0x458a99c3,0x2b69e47a,0x2b78c866,0x7cac0b18,0xe0232c7c,0x6ceaa79b,
  192120. 0x588f7459,0x0bd86433 },
  192121. { 0x7e734189,0xdea1a8b4,0xcfe5fa17,0x52c5ac88,0x11437664,0x444a4d4e,
  192122. 0xaf9e9750,0xc2522308,0xd30c6b3b,0x78b1d0c3,0x4c6df477,0x2edae5f0,
  192123. 0x2ee88dd7,0x53131d9a,0xacc93e34,0xc4e380ee,0xa8db0e8e,0xd499b1ac,
  192124. 0x7f5d49d7,0x77348c16,0x1556ccd7,0xc9663257,0x2611d13d,0x65ce0e8c,
  192125. 0xb5a2fdcc,0x2c95fe66,0x8658faa1,0x26698832,0x31c32c98,0xda87d1f4,
  192126. 0xfcd91907,0x46650598 } },
  192127. /* 79 */
  192128. { { 0x6b4a5efa,0x4c6c13cc,0x1d07b265,0xc481989b,0x8bdc69c0,0x10b966ce,
  192129. 0x2c2531d4,0xf54cfaa2,0xcad0a100,0xcb5f1808,0xee5da449,0xbeb52538,
  192130. 0xbedd83cc,0xa6240085,0xd6255c78,0xe792dacf,0x2062058f,0x88371906,
  192131. 0xed1658c1,0x96615e83,0x7d28d542,0x4b549b27,0x83b75df3,0xeaf127db,
  192132. 0x17fbb942,0x4f60df6d,0xf6f7c930,0xd08631db,0x6018789f,0x17c38f98,
  192133. 0xb9a9280c,0x0c43574a },
  192134. { 0x1d20cad0,0x76eb324c,0x8c61108a,0x90decb09,0x6f06d36d,0xa6e9d39c,
  192135. 0xbc0da197,0x6cd978ba,0x507ac5ce,0x5948b1c0,0xc5497eb5,0x2bd47164,
  192136. 0x4d5914e3,0x2a9c4c0f,0xa759f03c,0x772c5046,0x69ac847e,0xe7d7328a,
  192137. 0x3048b330,0xa8d57d0c,0x40f7bace,0xe60034e0,0xa85f1790,0x823d9193,
  192138. 0x5c859736,0xa6e9b66c,0x679e1022,0x22ca2c7a,0x09023fa4,0x00e7a19c,
  192139. 0x2726d5b9,0x324999f1 } },
  192140. /* 80 */
  192141. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  192142. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  192143. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  192144. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  192145. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  192146. 0xf18c2b91,0x57ea2b4b },
  192147. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  192148. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  192149. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  192150. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  192151. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  192152. 0xea7935c9,0x60480b46 } },
  192153. /* 81 */
  192154. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  192155. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  192156. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  192157. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  192158. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  192159. 0x9a8f88cc,0x0774a0d3 },
  192160. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  192161. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  192162. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  192163. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  192164. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  192165. 0x2432014b,0x08151954 } },
  192166. /* 82 */
  192167. { { 0xfb7b2108,0xf9236d89,0xad75f9aa,0x3ecc83cc,0xb4e1da11,0xf7c72b15,
  192168. 0x0315c362,0x552aeaef,0xf272fe3f,0x11e140ed,0x87843ee8,0x99d79bf6,
  192169. 0x1d9bb25b,0xce6b54fd,0x5b1bad74,0xb20b0e21,0x5b84c90d,0x54a0214f,
  192170. 0xfca6cec9,0x459bbf52,0x9e4df76f,0xe363c48d,0xd64cf17e,0x3045f84e,
  192171. 0xf62ada48,0x8402a167,0x6a74ca01,0x2c9e1bf3,0xf691c42d,0xe8cf9d41,
  192172. 0xc2c4b874,0x5abf2178 },
  192173. { 0xf3b3bccd,0x4777966b,0xbe3e0caa,0x0047e0f0,0x8c7d5043,0xcb8383b3,
  192174. 0x946fd5fc,0xe77e3baf,0xe9ec0e87,0x79baa785,0xc8a18d25,0xd83c557c,
  192175. 0x25befcfe,0x9b96e5af,0x98c71b61,0x4f05d15e,0x77e62da1,0x081f991a,
  192176. 0xcbaa3821,0x1c6ec781,0xe54d9bfb,0x7522f65d,0x44ed1430,0xf5d05573,
  192177. 0x95cafdda,0x3035b31f,0x6378f5bf,0x47e67f43,0x5270b9d9,0x029f7cad,
  192178. 0x4d916a48,0x15ad1587 } },
  192179. /* 83 */
  192180. { { 0xaa588ae4,0x00de2ece,0xa371a232,0x552ebc58,0x71230444,0xd00ea934,
  192181. 0xe4b1832d,0xafbfa67d,0xb689e843,0x29216341,0x61f4e2e8,0x1f96bbbd,
  192182. 0x04c29dc5,0x95420684,0x42317fd1,0xc7fe3827,0x63483162,0xe0a0aec6,
  192183. 0x0700184f,0xfc2b94d1,0xfe1fbd85,0x07219973,0xfb074352,0x648b6ab1,
  192184. 0xc46e5392,0x23bbdaad,0x00fa56ff,0x0db8dd1f,0x866725f6,0x104815eb,
  192185. 0x52e81963,0x3f9c4cca },
  192186. { 0x32ce637e,0xff36b297,0xf5d25cdd,0x81a15f2d,0x8b02ad97,0x1a1d052d,
  192187. 0xcfbab3e9,0x2e5f3bbc,0x614eeb75,0x60d2cbd7,0xcd5a793a,0xd4491843,
  192188. 0xcdba2144,0x2242cf75,0x88b99766,0xa20705e7,0xec77e132,0x64e12cc0,
  192189. 0xb61a9b05,0xb1c14df6,0x74825b5a,0x8fd97f04,0x3da31223,0x95604821,
  192190. 0x4d30c70d,0xde486727,0x1c12ee69,0xbcab8f15,0x668d893d,0x5dc638b4,
  192191. 0x223f574b,0x6479dad6 } },
  192192. /* 84 */
  192193. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  192194. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  192195. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  192196. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  192197. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  192198. 0xf0860497,0x1fe09f94 },
  192199. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  192200. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  192201. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  192202. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  192203. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  192204. 0xdb62526a,0x4de95786 } },
  192205. /* 85 */
  192206. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  192207. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  192208. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  192209. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  192210. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  192211. 0xe636980c,0x1c94418b },
  192212. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  192213. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  192214. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  192215. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  192216. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  192217. 0xb55235ba,0x611bfbb2 } },
  192218. /* 86 */
  192219. { { 0xf00ad2a1,0xbdbaa55e,0x14a290d7,0x29efa85e,0xe92b1694,0x3b4a4768,
  192220. 0x11ec8130,0x67111bcd,0x88bd27b2,0x0e425702,0xd9a03c06,0xf28cf2a3,
  192221. 0xf318884a,0xbb7c8d2d,0xe3aaeb20,0xe2ea1462,0x43b85d77,0x33535804,
  192222. 0x554ee9bd,0x81ee4482,0xe6aa198f,0xeb2eee9e,0xc26c5944,0x7a5aa804,
  192223. 0x82ab167c,0xa0ef2da5,0x02fe21a5,0x5a2ab476,0x3370298e,0x169cb3b8,
  192224. 0x0eb3aa8d,0x86e6c544 },
  192225. { 0x0b793d9b,0xede03321,0x1ddb5ece,0xf79fade1,0x68930b64,0xf73fda92,
  192226. 0xfe4fd1b2,0x06aad97d,0x92a4dc88,0x073a5b1d,0xbc976d75,0x8af8cbd8,
  192227. 0x63ce26c0,0x60b4abb1,0xdcb1fb06,0x9c8300a9,0xda95b3d3,0x335a594c,
  192228. 0xb37eac87,0x1f97d7d4,0x20eefaab,0xa3d2eba2,0xf3e828c8,0x3258c906,
  192229. 0x85ab7781,0xc832616f,0x8c28b617,0x72597192,0x3233b82d,0xcd7196bc,
  192230. 0x19fa126d,0x83867eb9 } },
  192231. /* 87 */
  192232. { { 0x22474edb,0x774fe73e,0x1a84e1ae,0x2a766394,0x9c6dd6e3,0x270329ad,
  192233. 0x14f8bf5d,0x00c4a415,0xd2267b90,0x3ce2ea37,0x11d24fae,0x12753015,
  192234. 0x263a1b78,0x7c14d854,0x1ae0b206,0x20c8401b,0x081f49fc,0xf32a011b,
  192235. 0x959c6df8,0x1e8123fb,0x800e1d06,0xa328dc7c,0x24259a9a,0x5876a378,
  192236. 0xb7ef6c37,0x23ada8b5,0xa93d4c9f,0x023f6b6e,0xffb6389f,0x89f5414d,
  192237. 0xe628b39e,0x4b26bba2 },
  192238. { 0x5d318454,0xd30b1cb4,0xd7436cb6,0x123b749f,0x568a7461,0x3110c726,
  192239. 0x1c84fd1e,0xc85de123,0x08403d55,0xa5f8d6e6,0x9b1fabf8,0x395b6e13,
  192240. 0x3cfedce0,0xfe6d68c3,0x94b91110,0x1d90381f,0x2dcc6eb7,0xf0a8ea81,
  192241. 0x7e90ca2b,0x59e80413,0xc8a25c5a,0xbeb5fc07,0x5d84663c,0x009c253a,
  192242. 0x910b6a7c,0x00b15073,0x4108f8d5,0x8607da4c,0xcb901e65,0x02c3d9c3,
  192243. 0x2c9615c6,0x4d697bc5 } },
  192244. /* 88 */
  192245. { { 0xefa8fb40,0xe0db1ef0,0x5ba3989c,0x29021c5b,0x809d19df,0xa8d6fb15,
  192246. 0x4c1219e1,0x6b787b73,0x14ef05e2,0x6417e168,0x8f9796e2,0x449342db,
  192247. 0xbf84421b,0x2f878a5e,0xe94a4536,0xe71916d7,0xae119693,0x9818bba3,
  192248. 0x5768804e,0xec674be9,0xf8424f8a,0x0a26074c,0x466ce6ab,0xdbc93b9d,
  192249. 0xc920078b,0xb3f15a98,0x3870f1a3,0x9d10fd0d,0xe4e785a7,0xa61241d9,
  192250. 0xe6c8cd80,0x76ca87a1 },
  192251. { 0xe02e48b7,0x4357fb56,0xcc09e9c6,0xfbd14b13,0x24069cf0,0xdb5f2435,
  192252. 0x2c3b01a9,0xf878165c,0xe6956dad,0xe549e7c4,0xbbd60b68,0xf2fe9538,
  192253. 0x059dc653,0x952f856b,0xb377fe9b,0xd3f60225,0xbfe908c4,0x6a0c7328,
  192254. 0xbc8f5f2d,0xce6aa2d3,0x24425050,0xf7213443,0x3d3b3ce5,0x17e1266a,
  192255. 0xc1677512,0x75b5e43f,0x37fb894a,0x15927062,0x2be3e375,0x15260753,
  192256. 0x6da3b7be,0x27e7f2c6 } },
  192257. /* 89 */
  192258. { { 0xe6a15883,0x638f65ad,0x66afdb33,0xd4a7e68c,0xd3f12de5,0x6207b6ab,
  192259. 0x37b87810,0x1c6ff950,0x64acf6d3,0xc0d44cb2,0xf2be78c2,0x163ac601,
  192260. 0x1636980e,0x1c63cc5a,0x95c9349b,0x3e92cfe8,0x41ec7220,0x7738e0d8,
  192261. 0x2d5fa961,0x6169d764,0xc3e028e9,0x2aa776c1,0xb16d5409,0x93dc5646,
  192262. 0x706df4d9,0xa0b27fb5,0xce9c6b97,0x9e991170,0x53c85f40,0xea8e42be,
  192263. 0x83246528,0x02e96437 },
  192264. { 0xae78ea1f,0x91540add,0x7b670e96,0x51a1b74d,0xf7006826,0xf9936441,
  192265. 0x7d7520c7,0x8f97d6ea,0x69ce12e1,0x0faa6a02,0x79208342,0x2590aca8,
  192266. 0x75614436,0x7a483863,0xf381408f,0x07c6149e,0xd7853406,0x733bf584,
  192267. 0x9abbb6f7,0x8761b010,0xf528a09a,0xe4eb249f,0x2e00ae3c,0x08781ed8,
  192268. 0x2178effa,0x864c1b25,0x9d513a7e,0xcc1e62a2,0x1919062f,0xedb8b94e,
  192269. 0x4f16527d,0x739f53da } },
  192270. /* 90 */
  192271. { { 0x924adc5f,0x7a5f4a88,0xa818f56d,0x95646c16,0x7795f954,0x0ec49129,
  192272. 0xd19c5400,0x2b48753d,0x205912b4,0x16fa236b,0xe87a4946,0x6b3d65f3,
  192273. 0x045fd066,0xa7174a01,0x12a5e140,0xb6350313,0xa96b8623,0xa79c4b44,
  192274. 0x9ab003d5,0x7a339d65,0x3826f31a,0xc72f30c6,0x6f7090cd,0xb4e7390c,
  192275. 0x906ebe24,0x59ac6c36,0xbba4505a,0x39a7f06d,0xc58c413a,0x839991e1,
  192276. 0xa20e0e84,0x020c23ff },
  192277. { 0xafc74661,0x120e4ada,0x277fc065,0x37bbcf63,0xb6dce799,0x41049cf6,
  192278. 0x7b161ba1,0x5b8d6b53,0xa9610fb2,0x22218431,0xdfdde769,0xde9ec9d1,
  192279. 0x42d80630,0xd32bfa4d,0x6244df4b,0x3885702a,0x45592dfb,0xcdedd1ed,
  192280. 0xfb4e01b8,0x0e1df45b,0x86e215b0,0x8f4bded2,0x6a937e6a,0x80935487,
  192281. 0x8130f723,0x415278ba,0x38a821f8,0xc6dc4692,0xfd8b4f8a,0x2207b119,
  192282. 0xf9269cef,0x76e7bf53 } },
  192283. /* 91 */
  192284. { { 0x27ebd187,0x5f128428,0xb65aadbb,0x8d3320ab,0x72258695,0xb042765a,
  192285. 0x8f0986ab,0xda3f33f9,0xaebff503,0x411807a7,0x825f71a5,0x25c776ca,
  192286. 0xff7df24b,0xc0de7bed,0x165f1fb4,0xda8b0f42,0x731f3ae3,0x5f3ff737,
  192287. 0x193e0a52,0x4cd1d7e7,0xb6b3ba46,0x8df84aa3,0xaa1f3782,0xba84b897,
  192288. 0xe7733ac7,0x6e7960cc,0x50981a21,0x4d46d6ab,0x7cbb80ed,0x1ec12c25,
  192289. 0x2b96ef09,0x79e7ad27 },
  192290. { 0x8f30caae,0x3cd970dc,0x0a6ebef4,0x85cabcf1,0xc714616d,0x63c1863e,
  192291. 0x519e3a98,0x1c50db0b,0x64cb13d6,0xf39b8963,0x22547b69,0xdf67d81f,
  192292. 0xd67db0cc,0x7157abb9,0x889491b7,0xccca25ba,0x7a27e0dc,0xf689207c,
  192293. 0x0fd43281,0x34ae8fbe,0x5720ec09,0xa5d91f73,0xcdfd7bed,0xb2f61909,
  192294. 0x4a039e32,0x1ec10232,0xdb0d8fdc,0xd3c3d65e,0x4fe5005d,0x32c916c8,
  192295. 0x4c0bea94,0x7f8c37ac } },
  192296. /* 92 */
  192297. { { 0x43ac05e5,0x33ec1e54,0xcd8d3825,0xda4a4da4,0x88bf9e2b,0x86d88c0b,
  192298. 0xb53811dc,0x34d71dd0,0xa3c3aba4,0x655040d2,0xb61611be,0x2bc40949,
  192299. 0x279a4fa0,0x1c2d426e,0x3b065ac3,0x535a5aa2,0xc52ea890,0xdaa8a32f,
  192300. 0x9fddad22,0x5a5deca7,0x2ab3b26f,0x911f05fd,0xf37cd81e,0x5dace7db,
  192301. 0x90d16b8c,0x0e0e44e7,0xe4f5894e,0x15e68aed,0xfc92a74f,0xafe04999,
  192302. 0x970e7c2f,0x1d7703aa },
  192303. { 0x3f0062a9,0xa8a4c81d,0xd96a20ba,0xe31eb2b8,0x864bd101,0x66dd98df,
  192304. 0x4413b614,0xba05f592,0xe9a555f8,0x51a67a0d,0x2e4b52d1,0xacc2f097,
  192305. 0x7184ab23,0xab5daaec,0x7c7f691b,0xce08b43e,0x76c427f4,0x520e530b,
  192306. 0xe423ebdc,0x7d352069,0x34df14ce,0x6b5e39e8,0x446305ac,0x3dcbf295,
  192307. 0xfe34cdc1,0x682cb2e1,0x111f5afb,0xd4ac45d1,0x47f296f9,0xc5ef63cd,
  192308. 0x93c20871,0x0a2c40ec } },
  192309. /* 93 */
  192310. { { 0xaf5747db,0x09bc384f,0xc06ab86b,0x3bad6086,0x9e7c1547,0xa406882e,
  192311. 0x55977abf,0x2d5326d1,0xda81deb0,0x063a9a05,0x524b6111,0x9a86e4a7,
  192312. 0x4ab2eb90,0x1402f87a,0xd5c600ba,0x7d0721d4,0xf289fdbf,0x1a2fd9a9,
  192313. 0xecde6f07,0xf5dce66d,0xdab9fa73,0x62171277,0x6c474bab,0x6d2dc49f,
  192314. 0x76eed033,0xdc017e1f,0x4da825d3,0xb97175c0,0x54b05e43,0x6c297e3d,
  192315. 0x56c9c87e,0x2efb4546 },
  192316. { 0x8b21c064,0xa4712b00,0x4a70629e,0xd186fe42,0x9b74f0af,0x6435b340,
  192317. 0x7ec9e629,0x6965aa43,0xc4c60d08,0xdda14673,0xbf3057aa,0x0b656670,
  192318. 0x3ce86f60,0x7f05e840,0x04401a16,0xc05073a9,0x294e607e,0x16b1e638,
  192319. 0x69cf7046,0x20783252,0xe8ce7d3a,0x2941141b,0x7577053d,0xd38ad8d3,
  192320. 0xcaa6630d,0xdba68fb3,0xe9504350,0xecbeaff1,0x1d2d760b,0x9f5166d5,
  192321. 0x462891e4,0x337532ce } },
  192322. /* 94 */
  192323. { { 0x3a00bb9b,0x3f111853,0x45f66685,0x2d2ffbae,0xd4aee24d,0x9ae11a85,
  192324. 0x0341856e,0x18ba1e1b,0x2731349f,0xa9ac8178,0x545715b5,0xc13dfd4a,
  192325. 0x5daad2ea,0xa5f7423c,0x535b76a7,0x30a483b9,0xff873e9b,0x92e9ada4,
  192326. 0x723a1055,0x15662d84,0x8edac4e0,0xb935497b,0x39d8fa70,0x61b6441a,
  192327. 0x40d1589f,0x1541d756,0xf0a05f0a,0x62994237,0x6bb28908,0xfd8b0034,
  192328. 0xd4cd32bf,0x192a2b5d },
  192329. { 0x365ced07,0x63576628,0x05de1d1f,0x029f32fb,0xbf40a7aa,0x6d17b9bc,
  192330. 0x9bb50a47,0x1b1b2a08,0x795a6278,0x9389abbb,0xb34fc19b,0x52cff60f,
  192331. 0x387d8739,0xf3ab9492,0x6920ccd6,0xa8f053e6,0x63a9b4f0,0x3ef2dd4b,
  192332. 0x51e82129,0x9ab0ede1,0x0838bfa1,0xafba0c0b,0x9ffc11be,0x2bd5a7ac,
  192333. 0x95cc0878,0x058bfd95,0xf8c2f0c6,0x686d48a3,0x1d9b31ba,0xc33abaaf,
  192334. 0x3bc0c268,0x632e2289 } },
  192335. /* 95 */
  192336. { { 0x15a1ccca,0x1c851d20,0x7e522bc3,0x4efe290c,0x18eab053,0x0b741d55,
  192337. 0xbc85e217,0xae656197,0x01cf8b29,0xae13141e,0x66948478,0x2e2cb593,
  192338. 0xc31bd8ae,0xeb57bb0f,0xc264e788,0xdecef5d6,0x9cb96d86,0x6fa856cc,
  192339. 0x279183da,0x2db16813,0x383d796a,0xf03f3820,0x1d0c6fed,0x58a456ff,
  192340. 0x8a6abd9b,0x25589805,0x83f96f19,0x339f52c5,0xda7e9ea7,0xcf6ded8f,
  192341. 0x5d1ccd45,0x68c3d9c1 },
  192342. { 0xe6b392b7,0x67e26265,0x775d9509,0xcec1d9bf,0xd76514f7,0xe16abcd4,
  192343. 0x0de72e1c,0xd86f59b2,0x1adfb033,0xa66e43cd,0x05e457cc,0xdb344340,
  192344. 0x5681daa2,0xb67a7916,0xf0114731,0xc32e7bab,0xd3b1e961,0x066fe16e,
  192345. 0xf63d26e6,0x924e298e,0x541add6d,0x9bea0dd8,0x9982f971,0xef9500df,
  192346. 0xc5f076ac,0x5c876e63,0xb23d396b,0x55e12ae5,0x2ec6747a,0x09efbb36,
  192347. 0x233286a5,0x8f2055ee } },
  192348. /* 96 */
  192349. { { 0xb82c1af0,0x4a4ab9e3,0xf2cae264,0xfc65e9e7,0x60187d46,0x4feaac0a,
  192350. 0xe393b363,0x27d3f335,0x819bacce,0x9c9f7c00,0xb8aa6611,0x3f7418b5,
  192351. 0x372aae95,0xffa94557,0x8db38589,0x937d7804,0x6f1fbc1c,0xd10c86df,
  192352. 0xa2f0a0ce,0x48aebd89,0x367439eb,0xae5d5fa2,0x3f17d2d8,0x103a6a0b,
  192353. 0x411d9894,0xf233f68a,0x218b67a2,0x7fece8b3,0x2319bf06,0x0422540f,
  192354. 0x340d322e,0x1292c8c9 },
  192355. { 0x0386463d,0xf5eb5587,0x0371d97f,0xd4bbc2b2,0x0b819c5a,0x1b364571,
  192356. 0xcf04ad41,0x0cbb42d6,0x66939ec1,0x5d819c76,0xa01847e7,0x8745ac13,
  192357. 0x1c7232e4,0x4f704b02,0xacb05780,0x2c9e58a0,0xb561e295,0x9523b8b3,
  192358. 0x79f9ba35,0x3384df00,0x1eaa9628,0x78231fc2,0x8aea2b90,0xa2eac54f,
  192359. 0x30d1c263,0x8075ed77,0xfb339000,0xacb44ed5,0xf011293a,0x92546ac2,
  192360. 0xeb821764,0x7c78762b } },
  192361. /* 97 */
  192362. { { 0x067902b6,0xb8f7d6fb,0xd1735980,0xb2823a43,0x59741ddd,0x062cfb12,
  192363. 0x4033f95c,0x6e391b07,0x68589b8c,0x3831d0a3,0x522290f2,0xe3474d49,
  192364. 0x222e1f3a,0x4dab14d6,0x53f08d39,0x8f00fcde,0x707f28f5,0x559917ae,
  192365. 0x068e607c,0x166aa0ba,0xd7e1f824,0x602713e7,0x4d6a328f,0x7c255540,
  192366. 0x9890cd2a,0x0d2e3264,0xeca0b20a,0xf2207944,0x52f4e09c,0x5c98dc07,
  192367. 0xd84de81d,0x69403504 },
  192368. { 0xe5407206,0xf8b7b366,0x0d88fa8c,0x1ecf54cf,0xf7272e6f,0x6fefe548,
  192369. 0x81ab4468,0xd6531372,0x4e474408,0x52cb5f0e,0x6490737f,0x9e426b3a,
  192370. 0x4980d071,0x2576c19b,0x0f272caf,0x91f34628,0x468f31c9,0x78e60a4f,
  192371. 0x90844d89,0x8776a329,0xb951582b,0x8a55700c,0x14b1adbf,0xab1af365,
  192372. 0xfbd343ef,0x22ebff92,0xb7d81f34,0x32f9fb01,0xba6b30e1,0xad850e06,
  192373. 0xbc5f9546,0x6da9e027 } },
  192374. /* 98 */
  192375. { { 0x5c9490ce,0x21eee4c2,0x0df68381,0xa96ec4a3,0xa4a9368e,0xe6c607e0,
  192376. 0x4bc262f3,0xd8b0492a,0x460c34ff,0x0846a210,0x28df33cd,0xf7ff7a64,
  192377. 0x21827612,0x10c55044,0x149bcd01,0x9d25fce9,0xcfc613dc,0x725611cd,
  192378. 0x97f51ce5,0x159f7e88,0x4e8c08b5,0x3fa3bf31,0x75e7538f,0xea156115,
  192379. 0x91c84020,0xd1e0a951,0xcf02ad0a,0x0d2268ba,0x058b8e5f,0xa04c6ac4,
  192380. 0xb3515912,0x773b40b9 },
  192381. { 0x3631cfd2,0x00ff2cdc,0x807737bc,0x14c4c2d3,0x338a5270,0xd600616a,
  192382. 0xb32cabde,0xd0e3306d,0xa70b17ca,0x336738ea,0x79f353ee,0xf2f4aa8d,
  192383. 0x576f3ad3,0x712f6ad9,0x89b2bce0,0xe4279852,0xda92ca30,0x05d8f94d,
  192384. 0xd8492dd9,0x9891d475,0x4d15e4bd,0x3e06a5ca,0x254eabbd,0x4725d4eb,
  192385. 0xc0ed513c,0x31394ace,0xbbfaae6c,0x7e0f9859,0x833fd137,0xdc125546,
  192386. 0xc56c4f75,0x12b46385 } },
  192387. /* 99 */
  192388. { { 0x932951de,0x810dbebd,0x5aa69c94,0x96959d42,0xecb2f08d,0x5fc49c04,
  192389. 0x2250b82c,0xac74f0cc,0x3aec4e1d,0x96a439a5,0x90499acd,0xc33cab9a,
  192390. 0x54d9b3af,0x2fccde66,0x3863ae8b,0xf4af285c,0x46febf88,0x2373373e,
  192391. 0x3c9ab7ed,0x751d672c,0xfe12020c,0xc1c51130,0x52f3e56e,0xad82402f,
  192392. 0xa4a64a81,0x3489ab7a,0xd9f163f2,0x0a1fb661,0x0e553317,0x17c69be1,
  192393. 0x7d88d417,0x61c1935e },
  192394. { 0x3492ae43,0x2e722d9b,0x0538f05a,0x1ef89d95,0x200aab63,0xae77e588,
  192395. 0xeba4b117,0x2872c120,0x3a461cb8,0x5c2432c8,0xcb938f26,0x315b3434,
  192396. 0x8c4c7dc0,0x05bf2ac5,0x596b378d,0xd2e501dd,0xcb890c30,0xa8506c9f,
  192397. 0x7c361f0c,0x3d0af461,0x5a35cbae,0x21f7b718,0xf3fc0138,0xbd1035f1,
  192398. 0x8b248edf,0x74628af5,0x48c9cae0,0x8d6421d0,0x2ca18773,0x75e3da39,
  192399. 0x71d3db94,0x27ad0df2 } },
  192400. /* 100 */
  192401. { { 0x305b5aed,0x9e3bda79,0x5998d6a7,0x2c67d4a4,0x0f7eb700,0xc855e1d3,
  192402. 0x147d1c44,0xc18a7e9e,0xc89540ed,0x3ea99618,0x7e6bfd20,0xa53be20a,
  192403. 0xecc14437,0xc9487e64,0x34ef85c6,0x72979207,0xd5e1ebd5,0xfa0d4e71,
  192404. 0x4d48d6b6,0xfda2b1e6,0x66e200d4,0x782a1e05,0x5a5366a1,0x2a3c70da,
  192405. 0x1a473738,0xfe3fbd2b,0x7fe020e8,0xd7ef8c06,0xeacfb665,0xec686fde,
  192406. 0x6dd1542f,0x5d9b5e27 },
  192407. { 0xcb3e472e,0x3637c5a5,0x30a1405e,0x2153d927,0xb4498558,0x009992e5,
  192408. 0xf39a0851,0x18f00ccd,0xb5c6c560,0x26237c11,0x1343540e,0x418ed408,
  192409. 0x7e7f3184,0xfef7cbf0,0xbf48576b,0xecd92366,0xbc94c91a,0x1b75be1a,
  192410. 0x4a162276,0x8e1778de,0xc5c6bcb8,0xc52e57d3,0x5ab71858,0x5cc382c7,
  192411. 0x3f6e39f9,0xe12c2c28,0xd62735fc,0x4c7e0ef2,0x835a5996,0xe071deb1,
  192412. 0xcbb8c766,0x24f891cd } },
  192413. /* 101 */
  192414. { { 0x6778c1e2,0x24ef60bf,0x00d5be5c,0xff49c03d,0x2f01a09f,0xec11986e,
  192415. 0xae096e58,0x59a728a4,0x7077984c,0xaabbcedb,0x870ca5a5,0xfb473bd2,
  192416. 0x4de30e3d,0x8c928c61,0x4f67abca,0x3fae7f9a,0xec21a9cf,0x83c2b2eb,
  192417. 0x9cd9b5de,0xafa70d62,0xc60b18df,0xadeaea59,0x4049b54c,0xd5fef7be,
  192418. 0x6dd310e3,0xfceebc76,0x8f6321cc,0x7748efe3,0x18ee8af5,0xfe9c32b1,
  192419. 0xd42df612,0x863ac3cf },
  192420. { 0xb85a2fe2,0x0a36fca7,0xee429dc6,0xf3e70d08,0x141c3944,0x8c9ba209,
  192421. 0x67272a0a,0x306a8106,0xf968bd06,0xe69a1555,0x153c603d,0xb86f7e47,
  192422. 0xef56e4fa,0x9706614a,0x98780b4c,0xc0dc36b8,0x3a1d3263,0x43657fe2,
  192423. 0x435522c9,0x01f97a86,0xedfef679,0xd91897f6,0x6daa17a0,0xebbe31d4,
  192424. 0x85accfbd,0x6f179100,0x8f9fc1de,0xe0da6e32,0xe1e7142c,0x1c9d53db,
  192425. 0x8b86725a,0x3e3f1b1e } },
  192426. /* 102 */
  192427. { { 0x7b7fbf05,0xb7ea15c0,0x1f1a3882,0x992f11b6,0xd1dcd1bc,0xc9ddd95a,
  192428. 0xad0f7e8b,0x31f5b7fa,0xfca7ab79,0x2936e5eb,0x19a55be6,0x30f417dc,
  192429. 0x43cde554,0x1f6f4e43,0x82f044bf,0x971f5e65,0x4288c408,0x73c3b8e4,
  192430. 0xb807f575,0x61aac59f,0x818b58f0,0xa64ee2dd,0x97a3b0d3,0x6f7a0a60,
  192431. 0x0394b058,0x8b85ecc8,0xbfb3517d,0x9a059474,0xa79c3f06,0x89ad5977,
  192432. 0x700a8025,0x81208ed8 },
  192433. { 0x14c4ce37,0x10935099,0xa1aa48a6,0xf34bb843,0x580d58e8,0x86007024,
  192434. 0xb375b8ba,0x6db42c49,0xed3bde83,0xac365524,0x649233b6,0x5521e1b4,
  192435. 0x64dd946f,0xbc7cc5d5,0xbfb5b6ae,0x9c14b035,0x0146c1a3,0x7f22ba18,
  192436. 0x872214f5,0x0b62fbbc,0xb4921764,0x3acfd7f7,0xcb4d6df1,0x5ff10da1,
  192437. 0x62600a91,0x660e2620,0x81d9167f,0x7ac7da9d,0xb6e7a199,0x6e8e260c,
  192438. 0x80deb3c2,0x44383fb8 } },
  192439. /* 103 */
  192440. { { 0xe44f9af6,0xe107f01d,0x8cb1fa1c,0x36381a4d,0xfb7dd493,0xe65be3ec,
  192441. 0x26a8839f,0xd0b8435a,0x3ec789d8,0xee60f915,0x2bcc5e1f,0xe25fea50,
  192442. 0x7e44a81c,0x0477c0c5,0x230ba5b8,0x349e9f83,0xde180dd9,0xdd42f32f,
  192443. 0x64a3d11c,0x8b039eaf,0xbeb7083a,0x80ef884e,0xf12742cb,0x288e60c4,
  192444. 0x720a0262,0x44156cc5,0x7253b77f,0xcd547de6,0xa6013a59,0x9829a6ec,
  192445. 0x0d548445,0x8aee708f },
  192446. { 0x32c54409,0x18f22d9c,0x75ebaac4,0xa9ebfa46,0x86284981,0x90e2e928,
  192447. 0x6b3a8e0c,0xd0201f6f,0xbd77641e,0xc973016c,0x70170575,0xf926f2f0,
  192448. 0xfec0ce01,0x4984048f,0xf319d304,0xbf696211,0xc91a88c4,0x74b5c844,
  192449. 0xe0030a82,0x4c40fbce,0xe4f6d521,0xbed67525,0x29d67d1e,0xaf7e47cc,
  192450. 0xc21d3536,0xfa307db8,0xbbb29405,0x56b6c46a,0x033e805f,0xf059a7e3,
  192451. 0x6096a5a0,0x970f61fe } },
  192452. /* 104 */
  192453. { { 0x1bec8e4a,0x1bc53d23,0x35a6034c,0x8809ac14,0x509e464d,0x4ee081da,
  192454. 0x8a488235,0x496ae1fd,0x325864b6,0xa1ae9863,0x74cd069f,0xbaca13e9,
  192455. 0xb1d8a6b4,0x3738cc58,0xe76b9da4,0x5fa71f58,0xc7eb16fb,0xc919be88,
  192456. 0xad4e429d,0xf5c8f13f,0x2499f9ed,0x4583b671,0xa10d8bd7,0xbce20115,
  192457. 0x5790bb7e,0xf66d7605,0x482b78dd,0x9316aede,0x75f855fa,0xe0d8fb2d,
  192458. 0x5a7dcca7,0x404b5b94 },
  192459. { 0x517a15c7,0xf9ee682a,0xef880202,0xaae4cfbc,0x5106a354,0xcee2c139,
  192460. 0x170febe7,0x5de60192,0x73d0c54b,0x589e39fd,0x8c9092b7,0x195c7135,
  192461. 0x0a7bfe5f,0xcb7ed53f,0xf61cc979,0x2bd9242a,0x5395f7d9,0x8d2ef16c,
  192462. 0x70b32f09,0x0d4ac1ca,0x52d185c1,0xa587526d,0x942d6195,0x2932b04a,
  192463. 0xa500b0ac,0xfe25a979,0x562fd230,0x5fa1f4ae,0x20da253c,0x60f55af2,
  192464. 0x83146002,0x7faa11b5 } },
  192465. /* 105 */
  192466. { { 0x6e402149,0xb0ba4f0c,0x963cc119,0x3584cc1d,0xa6527476,0x7740dc1a,
  192467. 0xc95715f2,0x3f77ff75,0x3f89fb0e,0xb2f234ad,0xef9be3ff,0x55159032,
  192468. 0x04237e82,0xfc9fb21d,0xa153ed93,0xeb2eff38,0x10041d13,0x89d53ae0,
  192469. 0x7f1bd828,0xcf2e545b,0x43953ea5,0xdd4a27ce,0xd85e75c8,0x00d2e5d4,
  192470. 0x241be1c3,0xeb93ed62,0x0242032d,0x1e53f25f,0xc3a4e701,0xb9957636,
  192471. 0xed98febf,0x14b63a52 },
  192472. { 0x71c43336,0x7610b553,0x23a4824b,0x19dfd4a6,0x0286051b,0x7b97a2e0,
  192473. 0x8f5f1edb,0x86abbb9c,0x9b67daad,0x67a57d77,0xcd5ffafb,0x8ace506d,
  192474. 0x89ac3c63,0x85da9f95,0x75a3d150,0x081cbaa8,0xe9346ed2,0x03353d8f,
  192475. 0xa1f9a02d,0xb2ab61f1,0x3a659c71,0xb0cb0937,0x4f5df8a1,0xb7e0e30b,
  192476. 0xeb7d5a1d,0x77c4c741,0x728e5cf0,0x8f046c9c,0xf7c171ac,0x32dd0bc7,
  192477. 0x836d2655,0x02485873 } },
  192478. /* 106 */
  192479. { { 0x75a4cd8d,0xcd40dd23,0x97bcba78,0x132ca433,0x258d61f5,0x30c5cd84,
  192480. 0xda1e8e68,0x0a7ec059,0x1d65d40a,0x07a8f171,0xf4350d76,0x869e655e,
  192481. 0x5983ae42,0xb98ce6f0,0x9d8bebd0,0x7b61391d,0xb1ba5d49,0x3a529e25,
  192482. 0x1f6b2cf6,0x46f732e9,0x3fa3b629,0xbd66ec6a,0xc3ef0ed2,0x397950ec,
  192483. 0x5f08b476,0xee9008cb,0x965a0e2e,0xfd6be425,0x1177bc87,0x78ed513c,
  192484. 0xfe512dae,0x6798cedf },
  192485. { 0x1b97c5c6,0x49e3f8fd,0x78c3b33f,0x39fbab3e,0x40f595ba,0x44274412,
  192486. 0x5d7d4376,0x174225b9,0x79c44777,0x880b3fcc,0x3296b245,0xdc3aca83,
  192487. 0x1734e184,0x55913df7,0x9c934472,0xa4db23d3,0xd1420a11,0xcebb3733,
  192488. 0xf3608bdc,0xb9d20cf9,0x30cfe13f,0xa618acf6,0x5f30874c,0x75f06b31,
  192489. 0x9f0005a5,0x506efe7f,0x01bfc9db,0x8aaea78c,0xf78e7c41,0xf9179255,
  192490. 0x52e96395,0x3ea7aed2 } },
  192491. /* 107 */
  192492. { { 0x5b06ae25,0x98617e04,0xcb5750ef,0xbcac148d,0x604c2ba2,0x91ea2f0e,
  192493. 0x76b78975,0x00c19f6b,0x651da181,0x79b9b6d0,0xc945705b,0xf3225beb,
  192494. 0x5c005bf1,0x30b435f3,0xbc24d86d,0x440b4482,0xd6373777,0x2b8f0996,
  192495. 0x1c44b4dc,0x65fd6c56,0x30906999,0xe9405ee6,0x08aa1ec1,0x19ff0924,
  192496. 0x3d2f2895,0xeef3246a,0xbc746797,0x016c3765,0xd0705f7e,0x62d2569f,
  192497. 0x05250044,0x6a8ad39c },
  192498. { 0x46be7282,0xe45f020d,0x21380f12,0x9405afed,0xd5da6ad0,0x4cdca5bd,
  192499. 0x7f8be61e,0xc2d6f184,0x596b8178,0x20132953,0x7a8df954,0x8d3b1e7b,
  192500. 0x39572b4d,0x757c61bb,0x80cc3b56,0xd749b57b,0x37b3ffec,0x9590ff93,
  192501. 0x145dc94d,0x39bbb653,0x2335e573,0x70c1c606,0xf763feba,0x9c2e72d7,
  192502. 0xcc61b732,0x4768e424,0xaa73f2ca,0x777d2fa6,0xc5cb58cd,0xdee4dbaa,
  192503. 0x9cfae1aa,0x1a181179 } },
  192504. /* 108 */
  192505. { { 0x77575ed0,0x6f6ff62f,0x7d1da99b,0x18f14fa9,0x69efd7f6,0x2e72aefb,
  192506. 0xddc28633,0xc45ab4cb,0x586c5834,0xb0e20d48,0x39775dd8,0xd397011a,
  192507. 0xf4134498,0x0130c808,0xf5115ed8,0x2d408eba,0x0260ded9,0xc506a05c,
  192508. 0x19cab911,0x9e5b7362,0xe8693a86,0x4cf508c6,0xcc773617,0x4e71245f,
  192509. 0x95d89ca3,0x2f71aa1f,0x607bbc98,0x4bba7c6a,0x212b7fd2,0xf3a515e7,
  192510. 0x9230f5a8,0x7d2ddc75 },
  192511. { 0x4ed2cae8,0x3d05816d,0xb9c00377,0x4cf6bc7d,0x646b08d4,0xc23e98e6,
  192512. 0x4b9c0180,0xf9ee6c61,0xef9179c1,0xe11c9a13,0x8ed9688a,0xa5b6147e,
  192513. 0xd06670a7,0x7afeb648,0x17685275,0xd670333c,0x75f9e8f2,0xa89dd969,
  192514. 0x37a68ade,0xbb57228d,0x454cb186,0x21a05d5e,0x063dd550,0x4810158f,
  192515. 0x4cb6caf3,0x92dd4f08,0x7854abe7,0x70c4d852,0x6e729d76,0x845969dc,
  192516. 0xb1bf40ba,0x5a52f87a } },
  192517. /* 109 */
  192518. { { 0x09ecacbd,0xed019e91,0x7b89bdea,0x6544023d,0x5707371e,0x7cc51f0b,
  192519. 0x16c8e217,0x14832b04,0x81259ab5,0xb1aa6682,0x23e361d4,0x6e100f92,
  192520. 0xe3a95c2a,0xe593eee9,0x16c10e26,0x699b6bbd,0x9473a13f,0xad487873,
  192521. 0xb274987c,0xf1c14dc5,0x2559e2e9,0x57dc0075,0xc3d47ad2,0x8449849d,
  192522. 0xdd527793,0x83df278a,0xeefd5b99,0x770e3ec8,0x76bd02a0,0x2ae58446,
  192523. 0x3e705ffe,0x17f02764 },
  192524. { 0x29abea1f,0xdda4010d,0x2407ac4c,0x636b9695,0x0433218b,0x96a60129,
  192525. 0x163d534a,0xf221fc3b,0xccc20565,0x05ba15be,0x96285577,0x1238e54d,
  192526. 0x878804d3,0x1b144257,0xa89a9fe4,0x96fbf304,0x4be642b1,0xc8a7f06c,
  192527. 0x6e2b085e,0xdd1a20e8,0xff4a591d,0x8f7f27c2,0xa4a343b8,0xc17b0753,
  192528. 0xbb173d4d,0x684b1e88,0x3dc07bbe,0x3accea44,0x4c441d77,0xdb15c88d,
  192529. 0x53e5957e,0x0ef0309a } },
  192530. /* 110 */
  192531. { { 0xfa8e5b60,0x4fc25721,0x691c0bb2,0x646938ad,0x0b0a2248,0xe46d4b76,
  192532. 0x7de16877,0x863f9ac2,0x2721c630,0x503bb6ef,0x0b67fb02,0xf8c199df,
  192533. 0xe07abd39,0x78c1ed72,0xb32f0dda,0xcf9deb7b,0x6c3c89f3,0xaff726f0,
  192534. 0x1972225a,0xb7008b2d,0x4f145f5c,0x8f5a6117,0x457c4f37,0x4e0e6f8c,
  192535. 0x1c453c64,0x8bbdaa44,0xa6e92c80,0x57be326d,0x5d773561,0xa9bc3fd9,
  192536. 0xbb37b72a,0x3d3b6cc6 },
  192537. { 0x9722c880,0x6e6f12cc,0x286b6889,0x3a1b6ae7,0xad2fafec,0xba1cc09b,
  192538. 0x43bb8bef,0xad64ad7a,0x97c3f4c3,0xa5af6a00,0xc353a91b,0x2afcb0d9,
  192539. 0x69ccbf6b,0xca13fcab,0xf2abc190,0x699a1391,0x23a247e5,0x2dbd5542,
  192540. 0x95488d9a,0xe206180f,0x1244cc3c,0xba9e7bff,0x87d3a365,0x29297abe,
  192541. 0xfa4ca5e2,0x4054fa38,0x67be1b6c,0xb390623d,0x78f41a44,0x1fa67c57,
  192542. 0xc7b544e7,0x2e946e43 } },
  192543. /* 111 */
  192544. { { 0xc60934ae,0x2980fddf,0x164206d1,0x2c3e7eff,0x416ed75a,0xf75e7f96,
  192545. 0x5cd0b2dc,0xfac60cf3,0x1faad87b,0xddc4bece,0x9849e5dd,0x753fa87c,
  192546. 0x2c1bf1ae,0xc5d516a3,0x14732b4b,0x565dbea8,0xce48696b,0x007ebe3a,
  192547. 0xcdb97694,0x40ca74d6,0x65e4e7be,0x3f5cd270,0x3aac4ebc,0x74847c01,
  192548. 0x43d6c3a1,0x6762e034,0x467a076a,0x690d8c95,0x1eda677d,0x768d78d6,
  192549. 0x0181d8c2,0x0997ce55 },
  192550. { 0x965a0b81,0x9297746c,0xe5e12dfa,0x48b58be6,0x715f437f,0x5573b3c4,
  192551. 0xb565c459,0xe425e907,0x1582797c,0x4f43f512,0x8ea5474f,0xe5dafa6f,
  192552. 0x13de04ac,0x2aeb8fbe,0xe8a07c83,0xed7f95f0,0x662c09fe,0x3e012a6e,
  192553. 0xc742cf17,0xbf96e9b8,0xe28a1c45,0x8ea5759a,0x5cf4e2f3,0x475941b4,
  192554. 0xf901a019,0x7dd3c02d,0x70916b2e,0xe7a4deea,0x2fa9b988,0x50b272b5,
  192555. 0xd0917fe6,0x96f9f09f } },
  192556. /* 112 */
  192557. { { 0x2c310a96,0x78e8aac4,0xf7a2a734,0x32a98303,0x23962207,0xc46ca83d,
  192558. 0xd9541280,0xad131e6e,0x2cabe911,0x5791fc5e,0x841b6c68,0x50cb77eb,
  192559. 0x3d3c8878,0xaff93dea,0xf1007bce,0x06541f1d,0x55cdf1fd,0x4ee729c2,
  192560. 0x323e3972,0xe0f71317,0xad4d08c1,0xa2de7a41,0xa35e22bf,0xa9912abf,
  192561. 0x89b03325,0xa050122b,0x06514d4e,0x8b9e51f4,0x79d3e0ab,0x423c7aad,
  192562. 0x40b8fea5,0x71998e26 },
  192563. { 0xceb6ed78,0x40140fcd,0x18534516,0x653cf377,0xe8d60dcc,0x0450b65a,
  192564. 0x9dac55f8,0xce6c1a76,0xae05686c,0x8a96a92d,0x12712562,0x2fe44762,
  192565. 0xa4f39425,0x747bcb50,0xfc531fc2,0xf0ec6ff2,0x10fe9ff0,0xc97c3447,
  192566. 0x9c792cff,0xfb488783,0x026fb019,0x552c5248,0xd804c290,0x4001a29c,
  192567. 0x35c8ca73,0x742b5ad8,0x6ee5dfa0,0xc3781f17,0x3dfa4ab1,0xca6b85f0,
  192568. 0x0b0d32ac,0x8389941a } },
  192569. /* 113 */
  192570. { { 0xde067dff,0xc0f062a2,0xbcb80162,0xd4f32690,0x0707a2bd,0x98cd990d,
  192571. 0xfae4a391,0x5afc63b8,0xb32ad814,0x684f1b7b,0xf199dfb1,0xb0a2dce2,
  192572. 0x48f25848,0x2260e17f,0xc2d5e862,0x7393db00,0x338cf171,0x9e88f854,
  192573. 0x02acf522,0x00679429,0x6835af3d,0x19157cb8,0xb8a2614c,0x2faa6f92,
  192574. 0x134ec46c,0x04ff95f5,0xfb7a8135,0xcf00626e,0xb37a4704,0x454b3d05,
  192575. 0x2694ec25,0x1fbfda31 },
  192576. { 0xc8f69c77,0xfdebb657,0xa3df88fa,0x92a8278b,0xc1fb78b4,0x463b5571,
  192577. 0x11c71a33,0xd2066a1a,0x089958b0,0x10c88143,0xcf9d67a6,0xb975c7e0,
  192578. 0x73037b8f,0xdaa5d208,0x40bf5861,0x5ee5005d,0x7dba69a9,0x300e6ce7,
  192579. 0xc962cc74,0x893c3cb3,0x4cf84055,0x0ac98629,0x225c9d70,0x0a7ef63a,
  192580. 0xb91e47e8,0xfe184869,0x8c2f84be,0x1b9d7deb,0xc0e278bf,0x67788915,
  192581. 0xc426f19e,0x4f9488ca } },
  192582. /* 114 */
  192583. { { 0xdd51b8ce,0x610dfcd4,0x36230e80,0x08579278,0x36599562,0xedc7ff1c,
  192584. 0xe2cae877,0x905ead4b,0xe7967608,0xa1c325d9,0xbd38926c,0x3e39eddd,
  192585. 0x5f6f0a4e,0xda92c868,0xf47a0fa4,0xe16f800a,0xe5f60aab,0x50b4db5b,
  192586. 0x983853d3,0x3665412f,0x9b79789c,0x64b62250,0x4e0e72b2,0xea560058,
  192587. 0xe555c2bb,0xabbd4901,0x17292e11,0x378419a7,0xe174218f,0x6e0b5aaa,
  192588. 0x8f796b92,0x688e0684 },
  192589. { 0x313b8f64,0xcdfef641,0x942c7462,0xaef11b7b,0x5c0d8abd,0x067cfb77,
  192590. 0xaf4041a9,0x608ea5f0,0x6935210f,0x23d5bd82,0x27917a08,0x5ab904fc,
  192591. 0x45d22d21,0x85dbb1fe,0x4d36159f,0xc3d5e509,0x1d39b8f2,0xaebb528e,
  192592. 0xf44acef0,0xdd5ca828,0x20c57a54,0x24209adf,0x78f95f44,0x5742b433,
  192593. 0xa9337d37,0xd11fa7d9,0xc64cfdb7,0xd66a0c09,0x9bb817ec,0x56e55b8f,
  192594. 0xe4c41265,0x1723c7e3 } },
  192595. /* 115 */
  192596. { { 0xdc8b43f3,0x9a6486d8,0x26409e68,0xfc3e0e61,0xd9b46003,0x1889c437,
  192597. 0x6284ec7b,0x3a850335,0x6a9dbaea,0x5a3665c4,0xe978933c,0x7bf6941d,
  192598. 0x69341490,0x1ed5a510,0x8cb8002d,0x664a7b7a,0x60ed0a59,0x603f76e4,
  192599. 0x1f4ebf27,0xc3e06ba3,0xf2c38a7f,0x296ced41,0xcf1db08a,0x2ac18f79,
  192600. 0xcde7a3b6,0xc919e882,0xdbf68b06,0x15e77d29,0x4e947cb5,0x21978baa,
  192601. 0x7630993a,0x84bf542b },
  192602. { 0xe364f21e,0xc1decda9,0x012e557e,0x0d6cf345,0x588f90e1,0xba246848,
  192603. 0xe3b104b8,0x9f6dda4b,0xe3aef57a,0x6bf7a346,0xe8327ea9,0x210299fe,
  192604. 0xda95e6c7,0xaa99f487,0xd2cdf645,0x24ff813e,0x8bd414b8,0xd1dbb2d2,
  192605. 0xcafa1a61,0x065101af,0x9cdebda4,0x7d9f4b9a,0xe41039e4,0xaf41b395,
  192606. 0xc50adf42,0xe3e9e6ba,0x341e9e49,0x4f2133ae,0xcb157f23,0x4968c0f3,
  192607. 0xda068153,0x383f827b } },
  192608. /* 116 */
  192609. { { 0x6583ff4c,0x2ec46a21,0x4ad709e7,0x4e645a29,0xc04ca12a,0xdc66e9cf,
  192610. 0x9160a7e5,0x82f128f4,0x569c762e,0xbfb227b1,0xc2edb8e7,0xf80c7963,
  192611. 0x49a0f688,0xa7dafe06,0x2d14b8cc,0xb7e41754,0x86de40be,0x3a0c5c53,
  192612. 0x1db79331,0xf0d05286,0xfbfe071b,0xb902ce69,0x210e9903,0x61e46956,
  192613. 0xf703ebb8,0xfaef874e,0xdd5f78b6,0xf668947e,0x5af5ea3a,0x6fe86547,
  192614. 0x43f94625,0x3b121f15 },
  192615. { 0x659275e9,0x5b26e847,0x6d0fce50,0x47581cfd,0x8aa3f1ef,0x55f5cbfd,
  192616. 0xe484e60e,0x1e7be315,0xfe9698e4,0xd8f1a20f,0x7ab04784,0x25d46da9,
  192617. 0x834cdb3e,0xa526db75,0x8d08a009,0x1fd408d9,0x5b5ca816,0xfc004b20,
  192618. 0x65e4bbe8,0x5b3e3bb3,0x759bb6ef,0xf50cc125,0xc2fac737,0xf05fa817,
  192619. 0xd273951a,0x9ee102d2,0xfecb3367,0x2a8e540b,0x2a6a515f,0x673446fb,
  192620. 0x37290c83,0x5505e1d1 } },
  192621. /* 117 */
  192622. { { 0xd15e68a6,0x0c3014a1,0x64dd35e5,0x6f9f0b26,0x03ad67f9,0x18c3742d,
  192623. 0xd2c14484,0x74818c0e,0x0d41a3cb,0xc5181169,0xc49f3e9e,0x65c8c83f,
  192624. 0x2c279386,0x9b260c61,0xced04e9c,0xf6086fae,0xfd7c4758,0xa7b2cceb,
  192625. 0x90297fd8,0x4b3c3133,0x09701ac8,0xca8264e8,0x508b3762,0x9f976a87,
  192626. 0x983a8dfe,0x5d582714,0xd9d598e9,0x350d2669,0x0f6fd348,0x85cb89cb,
  192627. 0xa574317c,0x617d80d4 },
  192628. { 0x70022b67,0x4cef267e,0x3768b94a,0x80536bb5,0xd2784462,0x3153a566,
  192629. 0x38243919,0x49054d44,0x5df78c4a,0x8d11e172,0xd5a1e35a,0x9b252a71,
  192630. 0x8171e31d,0x07866c80,0x1b38a00e,0x0a8501db,0xce770236,0x2ed932b8,
  192631. 0x8edaf7d0,0xa2d77609,0xb93006e9,0x3aee5dab,0xbbfeb036,0xfaffc8c4,
  192632. 0x4e21b38b,0x077b9678,0xdca8e069,0x491fc59f,0x0e938471,0x3f624f55,
  192633. 0x7cd1780b,0x5156f508 } },
  192634. /* 118 */
  192635. { { 0x0206e8d0,0x58234e22,0x7f15af32,0xf5f6f5d4,0xd638950f,0xafab7289,
  192636. 0x7d4495f4,0x66ec4d09,0x68da80a9,0xad890c5d,0x64f8a36b,0xe4aa0920,
  192637. 0x0f4d5c5f,0x799e257e,0x24495e31,0x44c677ae,0xa5b8e352,0x720387b3,
  192638. 0x75a287b9,0x703790f4,0xc3c1f2f7,0x54895cc5,0x41a7fa41,0xb8680f9b,
  192639. 0xb00b008b,0xfcd47458,0xba6473cb,0x149cc838,0xac9be19a,0x78ed5f7a,
  192640. 0xb33765ba,0x5254599c },
  192641. { 0xa21b54c4,0x08739679,0xb6497d9d,0x029ece2a,0xc8488640,0xf14f1a92,
  192642. 0xe9fa79d9,0xae48dcff,0x46c208db,0x14b911c2,0xdae3f69e,0x5ab0fbf2,
  192643. 0xd1edb838,0x180ac87e,0x188586bb,0x146fd718,0x5467cbd0,0x210eb654,
  192644. 0x1667cfee,0xaa239408,0xb73d1a60,0xdb125c1a,0x881c1cbe,0xde685300,
  192645. 0x37c30232,0xfe34c713,0x6f3c8d18,0xc6c6070e,0xb4af4e83,0x07e365ba,
  192646. 0xdcf82b45,0x22f0a7ed } },
  192647. /* 119 */
  192648. { { 0xea7f1b7f,0xe262791f,0xdcff09d4,0x9c3d8c5d,0x39c7dc58,0x86c2a9c3,
  192649. 0x4276e8c0,0x4dad4017,0xe9fe1d56,0x0a918f59,0x2aa810c9,0xb8d79670,
  192650. 0x4aa5cdc4,0xeb7a8836,0xe7afa72e,0xfc4c23bb,0x4ac86908,0x4dbb5c9e,
  192651. 0x6a0c7e6f,0x37e39013,0x49c218d2,0x855d7001,0x94b324a2,0xe475bc67,
  192652. 0x6287a071,0xc98a8dc6,0x5fb4323c,0x395a299b,0x0c0389e9,0xe186c3ee,
  192653. 0x16734c46,0x79f81e6f },
  192654. { 0x364f3c4e,0x83f2c1f3,0x1367e14b,0x536b2ac5,0x5933e43d,0x44a6dcfc,
  192655. 0x10d961fe,0x34e59475,0x7e3f2aae,0x08234ece,0xbdea7f25,0xcb92e00a,
  192656. 0xa791a124,0x1efba4f0,0x1192d53a,0xc2086fd2,0xb51c8af6,0xfec0d0fc,
  192657. 0xdc0f1b5f,0x48d1b2ca,0x812dbe19,0xb07a388f,0xdedbdd45,0x40873a6a,
  192658. 0xd702589a,0xbc2a1268,0x17e27b64,0xbbf6e3a8,0x6d386e85,0x73ee5663,
  192659. 0x9de7c000,0x442ecd37 } },
  192660. /* 120 */
  192661. { { 0x8a2f90a6,0xb4cd1ae6,0x6f5ad0cc,0xf277d41d,0x401d4b8e,0x6a3828c4,
  192662. 0xd8376631,0xe817a134,0xf5e1124b,0x142b758d,0xfd6b95e4,0x25fbc69d,
  192663. 0xd74a9e3e,0xa30c9f5f,0xd89663ce,0x5ac0f163,0x0ce6386d,0x32a9eef7,
  192664. 0xd8ed5544,0x7a690ea5,0x9889427a,0x5de23ff0,0xeaaced58,0x75ad36a5,
  192665. 0xd3e18465,0x3514a6c1,0x7f093910,0x3d9162c3,0xe33d56e8,0x5c10add9,
  192666. 0x06aa691e,0x85176b73 },
  192667. { 0x28a21e38,0xa32110fa,0x5773d538,0x97b6379d,0x2d020dc4,0xd3697bbf,
  192668. 0x961833cd,0x59177593,0xe5fa8516,0x6d7045fa,0x786ab5d2,0x3390f29a,
  192669. 0xdc4f5b70,0xac0bda30,0xdcc615c6,0xcca0240a,0xc5146d91,0x8e1f1702,
  192670. 0xa72cef87,0xceb472d0,0x0b669ba1,0x84840708,0x7e61aa0a,0x79b08f9d,
  192671. 0x4669560b,0x388160be,0x948eb71e,0x23935c2d,0x9431590c,0xd7fd83c0,
  192672. 0x6e5768b3,0x8ab154bb } },
  192673. /* 121 */
  192674. { { 0x353c4a96,0x28686003,0x905cd835,0x4e5c60e8,0x8f66f8cc,0xbd591364,
  192675. 0x9faccf9e,0xb6b80b98,0xe32639e5,0xbc1c1fae,0x278aadeb,0x2f6396d2,
  192676. 0x1898202d,0x00a796d0,0x3a474835,0x18ab548f,0xb31b0e3e,0xacd056c3,
  192677. 0x0164512d,0x15ba68dd,0x4b03f3bc,0x203836d9,0xd8f206c5,0xd64eca6b,
  192678. 0x9f1779b6,0x931a361e,0x52ab34a8,0xd82690fc,0x92922e22,0x342bb8e0,
  192679. 0xe00b02a9,0x1bfcdd84 },
  192680. { 0x75a365d9,0x310b9a43,0x08d8fb03,0xd4ade15e,0xd742df83,0x9c9753d7,
  192681. 0xde318742,0xcf7309d4,0x3360ace0,0x1228e212,0xf7669643,0x1043d238,
  192682. 0xf90f5a53,0xfc2adbed,0x7b5f9397,0x41d64cb7,0xc446d010,0x5200b30a,
  192683. 0x231720fe,0xc3c8642d,0xb9aa2075,0xfcc0122d,0x041eae47,0x856e3b12,
  192684. 0x68c876a4,0x45864455,0x233606b1,0x1a1c7842,0x227757bf,0x9b766d1f,
  192685. 0xf7b9d4f1,0x25b78a3b } },
  192686. /* 122 */
  192687. { { 0x156707ce,0x90835718,0x4314f90a,0x9bdc2398,0x8be57dbd,0x017c885a,
  192688. 0xad63a4b8,0xd4bba225,0x15aacffd,0x5ce71b86,0x72954722,0x5f266475,
  192689. 0x4f0ad3dd,0x0a80f1f7,0xfc352ed7,0x010538a3,0x4203c6ca,0xf8a64045,
  192690. 0x330c73b4,0x2b2c7a88,0x02dcac1b,0xb3433ee6,0xed2b17c7,0x2e0499cf,
  192691. 0xbd6329c7,0x9f8681a4,0x36fadc37,0x38979946,0x92b7895b,0xdc5650c8,
  192692. 0x65a51cf0,0x70ab9570 },
  192693. { 0x7b585d93,0x46778ec4,0xa633fe4e,0xca6d3610,0x4ea0311a,0x21da154e,
  192694. 0xbd64002f,0xaf22190b,0xd91cb7a9,0x9e633ac7,0xee6837d7,0xed13c31f,
  192695. 0x1616ee8a,0xda4a07d7,0x3afcd616,0xd78a2732,0xba14d694,0xc06696e5,
  192696. 0x4df58420,0x733754d7,0x2778e3c9,0xe85e504e,0x55b5a5c2,0x3055aa0c,
  192697. 0x8a3acb5c,0x313df538,0x2a088eda,0x5896acb5,0x84c85dde,0xfc8842a0,
  192698. 0x51dde6be,0x5fec9f79 } },
  192699. /* 123 */
  192700. { { 0xfe519f99,0x5ebc2c7c,0xe5410353,0xe396bd80,0x8a3988f3,0xaded9402,
  192701. 0xd601bda1,0x1c03b735,0x14ce64ac,0xfd302036,0x01240290,0x5837ebe9,
  192702. 0xa554097d,0xcaaea1a3,0xb0b88139,0xdce73d25,0xecb090b9,0x35ed412b,
  192703. 0xd63dab3c,0x99029ff7,0x062db071,0x555437d9,0x42a4c11d,0x277d2f56,
  192704. 0x24fc9109,0x477fa645,0x2799254d,0x7b12e9b7,0xd84c618c,0x7ad2ae22,
  192705. 0xce8ed195,0x0a8d5663 },
  192706. { 0x0a21fde1,0x43ac5163,0x6903d849,0xcfcf5dd6,0x5fdd6281,0x6d2499ee,
  192707. 0x77a49a34,0x4dedc6f0,0x2875c06f,0x46bda2c0,0x347b8046,0xd0e0e0f6,
  192708. 0x5e67836f,0x1058169b,0xde8a8042,0xc961912a,0xa93b3d32,0xdf3fea0a,
  192709. 0x0c576bc5,0x9f138edb,0xd8d37e47,0x7971ad6e,0xcce5e7cb,0xeab85739,
  192710. 0x1d202b40,0x88a4b434,0xe3a1fd26,0x5d842557,0xb3a86f91,0x872fabd5,
  192711. 0x6aa4629f,0x95b93493 } },
  192712. /* 124 */
  192713. { { 0x99f951de,0x9998a701,0xf058db45,0x8fade596,0xf3d03dd3,0x4d479c1e,
  192714. 0x33b141d3,0x6e928d5d,0xacfe8a40,0x9a465800,0xc1cefa3d,0xd108ad2f,
  192715. 0xe013726e,0x64b96921,0x8e83bb9f,0xb9b6a6b6,0x1242e544,0x29f1e6dc,
  192716. 0x2f65966b,0xd3f8f676,0x5e105b41,0xa34dd096,0x16011e1c,0xd4e9139a,
  192717. 0x2515541b,0xeea4dc68,0xc822166d,0x6f8030ac,0x31d16124,0xbdc7ae1d,
  192718. 0x621afa7d,0x2e25ef51 },
  192719. { 0xdd8e7357,0x2533cf8f,0xeaceddb8,0x333ba218,0x0784d2ac,0x68e3e31d,
  192720. 0xf2804ae2,0x1c927f36,0x77e7ad7e,0x01433d22,0x587f78a0,0x0b401cf0,
  192721. 0xaa0027ae,0x9dfcf036,0x1d9a46b5,0xc9e46c8b,0x1f288d32,0xaa6de486,
  192722. 0x1b8a043d,0xdd56da2f,0xf2d0bb56,0x346230e5,0x19defb56,0x19f0b6e4,
  192723. 0x21d2c874,0x55ec37cd,0xb70e45b3,0x3dbf0397,0xac7ce852,0xf0862a8d,
  192724. 0xe141f3d6,0x87979ea7 } },
  192725. /* 125 */
  192726. { { 0x7f1c747f,0x9b7e7b3f,0xc6e63369,0x151a4c1d,0xb372dba0,0x4273ff70,
  192727. 0xd3ee54fe,0xca6d2234,0xd33cae0f,0x12fc8e0c,0x5dd6f10c,0x27328538,
  192728. 0xf01a9cf9,0xc86f3fbd,0xe36cae91,0x5322677f,0x2fefea44,0x39a70033,
  192729. 0xce8af217,0x2c9ca328,0xf6a731f4,0xc0256776,0x66a96813,0xc687b3df,
  192730. 0x8db2eda8,0x194aab12,0xeec4febd,0xde30dc5a,0x979241b2,0xc052236a,
  192731. 0xc23d4c16,0x3ec98802 },
  192732. { 0x4072f74d,0x0f9e760c,0xab594059,0xe78eb0de,0xc9b009c2,0xdb3dea40,
  192733. 0x38b59ae5,0x47e875f0,0x2b4daa06,0xf40eb436,0x090f3788,0x9a6a4f92,
  192734. 0xedbfaf8b,0xefebe9af,0x9867e256,0xf87f96a5,0x75ab6aeb,0x1e6fed23,
  192735. 0x3fdb13cb,0x17f2782a,0x70fa2621,0x5102c71e,0xfd4c0dbe,0x5d2b06ec,
  192736. 0x30347297,0x537cc268,0x2b67e780,0x8dbf5e2b,0xba25da32,0x2f633f3a,
  192737. 0xefaec914,0x3e9315e8 } },
  192738. /* 126 */
  192739. { { 0x239a9ea9,0x9255cfa5,0x0be33a62,0x20f3c690,0x9cb642bd,0x759eeb4b,
  192740. 0x00bae718,0x3316c546,0xf3410f84,0x874a76d5,0x90f129b6,0x123b502e,
  192741. 0x12851f1c,0xadc8f9a8,0x1b62408c,0xf57b764a,0x1a80777b,0x116ec01f,
  192742. 0x1f0ddc5c,0x746ecef2,0xe5a6a5a7,0x3c49d47c,0x06e955ba,0x1e15dbe7,
  192743. 0xb45d79b0,0x629c0c79,0x778d1087,0x11278308,0x8c6a22d7,0x22585dc7,
  192744. 0x0a682791,0x2ed02a0d },
  192745. { 0x4daa2682,0x53043416,0x01359625,0x0e26d32b,0xbd867097,0x449c834a,
  192746. 0xee77ae2e,0x11a19d2b,0x3af6c169,0x39bd529a,0x5cd61054,0x36cca5c0,
  192747. 0xdc6c0fe1,0x6370a59b,0xb93d5135,0xca420d27,0x554c451a,0xd8730d45,
  192748. 0x96cdebf2,0xebd258c9,0xa50f9a05,0x0cb1b990,0x7b0f0151,0x69a8c97a,
  192749. 0x11d217e1,0x2cc36d34,0x752f75e8,0xf117688a,0xa09b2a61,0x1db01394,
  192750. 0xa9efd7dd,0x14627844 } },
  192751. /* 127 */
  192752. { { 0x232803cf,0x6bca3aed,0x9a96ff34,0xc1e4398b,0x74ab788b,0xcaf6757f,
  192753. 0x7e68c04d,0xc3a53e00,0x5cb7cd20,0x5f969c19,0xdc068bca,0xf28b65a6,
  192754. 0x1d863032,0xe3ca01d3,0x87808e14,0x9b733b81,0xefe618be,0xb5d704d9,
  192755. 0xb01b946d,0x276f3542,0xfbedddbf,0xe057e19e,0x903275ce,0x7d182f2b,
  192756. 0x880f7bc6,0x3cdc5f77,0x78476c14,0xd6f03d3f,0xa9ba5072,0x035f5557,
  192757. 0xb4029628,0x7acb57b6 },
  192758. { 0x44e6b07c,0xd2413569,0xe1c7345d,0x451c4cc9,0xe273b9fb,0x407444d8,
  192759. 0xb88e34fc,0xfe496079,0xf152776d,0x77d184cf,0xc742299c,0x6d1033b9,
  192760. 0x77bf2897,0x29a0a684,0xee8f0420,0x59ffdf10,0x44bb56d6,0x4e17146c,
  192761. 0xfb9ae855,0x831d06c2,0xd93e7cd5,0xb2cb82db,0x3c96b607,0x83381c46,
  192762. 0x7549e2a8,0x06aed251,0x774a21d4,0xef97891c,0x8675fbdd,0xae9807c7,
  192763. 0x6363516c,0x6a5a05b9 } },
  192764. /* 128 */
  192765. { { 0x6a8f4f33,0x92e71ea6,0x4dea8f4a,0xf2fc6fc6,0xfee88461,0xd356252c,
  192766. 0x08954d08,0x59b0a83e,0x468ab766,0x5bd68c23,0x900f8d04,0x40281357,
  192767. 0x52b867ae,0x181c19c0,0x18764c41,0x986a5169,0x13575d24,0xcb01dfae,
  192768. 0x593677b7,0x17269ae5,0x46dc9b19,0xf6d17025,0xc40097c8,0x8de68499,
  192769. 0x259c407b,0x76df0032,0x17d29d8b,0x4091aad9,0x4a7ab5f6,0xa7f46d21,
  192770. 0x70ece48c,0x688054b4 },
  192771. { 0x51a5b86c,0xf0d168aa,0x95777247,0x2437e4d8,0xf1720329,0xae844076,
  192772. 0x9647a54e,0x0a7ac87d,0x0405622c,0x1e597a4b,0xf0a79f2f,0xedefe5c6,
  192773. 0x4d55156d,0xaf3ef0c2,0xef047cf6,0x917fb04e,0x54b62137,0x3792799f,
  192774. 0x314be0b8,0x875ea32f,0x0c466b0c,0xe157c65b,0x7e218978,0xd28c90ce,
  192775. 0xcde587af,0xb90fc3ba,0x8b877bed,0xdd32d71c,0xca8e10cd,0x3b432200,
  192776. 0xd94f6e53,0x0021f419 } },
  192777. /* 129 */
  192778. { { 0x43519d26,0x2191122c,0x40a51845,0xbdafac1d,0x548bb89f,0xcc6f71e9,
  192779. 0x16844bf9,0x9ef3375c,0x178e8d55,0xe7789f79,0x1f8be1c5,0x04f599b6,
  192780. 0x2cbbde40,0x8088c99a,0x893206c9,0x8939a260,0xfcd30851,0xa1ae4bff,
  192781. 0xe08feafe,0x664cb3fe,0xff14aabc,0x61f38099,0x2a841ef9,0x0d8394cc,
  192782. 0x17f01db6,0x75fad8ad,0x6debb773,0x6fc34576,0xa4252512,0x1e716b05,
  192783. 0x29e1ed9f,0x79855880 },
  192784. { 0x95106473,0xa2cb3aaa,0x5a61da04,0x95fafa41,0x539563c0,0xfd3c9362,
  192785. 0x95312b87,0xbaa48091,0xbf885c76,0x6c7e7582,0x230c78d5,0x70f6dab6,
  192786. 0x7747440d,0x8ce3051c,0xffdb6186,0x6dbebd14,0x190e4096,0xb0e041fa,
  192787. 0x6ee62e2a,0xba10c466,0x74f333d6,0x93d57e2a,0xfe7b9b66,0x006aadc4,
  192788. 0x06d2837d,0xfaf72f6c,0x910741ea,0x318cc5e6,0x65692477,0x9c502609,
  192789. 0x1d0fb08d,0x95d823c3 } },
  192790. /* 130 */
  192791. { { 0x140528a5,0x6aeebd86,0x53979bc8,0xf268c2ba,0x4ec144ab,0xb1bc9b8a,
  192792. 0x82a7d7ed,0x1efabb0d,0x4e0118d8,0xf12c70d1,0xa1c1558e,0x31607168,
  192793. 0xe4b7e73e,0x33e428b7,0x83aec9dd,0x63176637,0xe12ac35c,0x5172ffbe,
  192794. 0xbc17b2a4,0x37df0bfb,0x741f812a,0x4212f870,0xe2888f9c,0x3dcecbdb,
  192795. 0x756ca55d,0xa9dc15aa,0xb9028e41,0xf31918ec,0x6aeadb03,0x7ede0285,
  192796. 0x78654f54,0x0e2708d5 },
  192797. { 0xcde20f88,0x2270cc53,0x5f5b1039,0x9338272c,0x5dcb1dbf,0x5042e19e,
  192798. 0xb72d74c1,0x4b3de219,0x2aaaaa55,0x16c49a8b,0xbba86ba6,0x008443e5,
  192799. 0x20cf1695,0xee6bcd72,0xa89abd11,0x59ffac6b,0xf115639d,0x2831217b,
  192800. 0xf34cba52,0xe4d28af2,0x0727a906,0xf27f03e7,0x69017766,0x6842c79f,
  192801. 0x7a81123e,0xcb3469bd,0xa42973b8,0x48c0f346,0x23990dbd,0xfc5784a6,
  192802. 0xfb299678,0x0d3dab3b } },
  192803. /* 131 */
  192804. { { 0xce29c3cc,0x8f8376e6,0xf016cbc6,0xcb0507ec,0x5e394ce1,0xdebff996,
  192805. 0x73c50d41,0x24fc526f,0x2d16ce3d,0x4edd5a54,0x91c13141,0xbb37bdd9,
  192806. 0xe33a8606,0xe3442ef2,0xc0629da8,0x2ae90337,0x592ab331,0x57faec64,
  192807. 0xd82b857b,0x1a938997,0xa3373176,0xad6c8cb9,0x9086751f,0x82595de2,
  192808. 0x18c17196,0xa81e97fb,0xbf697357,0xe4f48a13,0x5cb89f69,0xa1387c2e,
  192809. 0x5874b426,0x530b4eeb },
  192810. { 0xbab7b5ae,0xe9f275a1,0x03a57bf4,0xbb69dc4d,0xa45c505b,0xc974dc4a,
  192811. 0x416ac402,0x726369f3,0xaed985dc,0x735e4e78,0xcdd446a1,0x0548d879,
  192812. 0x9e16b02a,0x84ceb069,0x789b11a6,0xf73f6fa4,0xb2a4e784,0x6aa0c41f,
  192813. 0x93a9b697,0xb1f76902,0xf03a8ab2,0x814cce00,0x844d66c1,0x64cb255b,
  192814. 0x30952201,0xb794e7d6,0x3da32271,0xe052d4e4,0x08b6a4d9,0x5278b2e7,
  192815. 0x80c6577f,0x90942552 } },
  192816. /* 132 */
  192817. { { 0x0d5b4c2f,0xd269a14d,0x5c8a649c,0x2b8fc59b,0xb0e37d4a,0x95becb3a,
  192818. 0x9111037e,0xfda1a768,0x94e35322,0x5810e05a,0xa178fafc,0xa24dcc12,
  192819. 0x8e3dce62,0x5c2c63b2,0x9452c444,0x995c3f17,0x42d45161,0x35330ec3,
  192820. 0xb4ef8129,0xa025a60a,0x8bae9c13,0x85493252,0xe2e3caf8,0x25d1a606,
  192821. 0x3649bf47,0xd44091ab,0x704ec5f1,0xc7d0afbf,0xbd8b3333,0x27bd1d62,
  192822. 0xcfe616f5,0x50570111 },
  192823. { 0xf534356b,0xd0084ace,0x4b4b0fbc,0x9df1de05,0xcee04dc1,0x021afe05,
  192824. 0x361b78e1,0x64bde688,0xef78d38b,0xa324fcc7,0xeb0a5e4e,0xfeb372ce,
  192825. 0x65811996,0xef04fcb3,0x5eb0ab4e,0x7dce5d50,0x238c586e,0x1e29b588,
  192826. 0xbcd80037,0xde5e3197,0x4806b9cf,0x8bf5e451,0xd18e67ab,0x4330968b,
  192827. 0xf9f63fad,0x26a7d04e,0xb5c18bb4,0xa1c7f123,0x25dce22c,0x485b8482,
  192828. 0xd540e79f,0x8ff0b36f } },
  192829. /* 133 */
  192830. { { 0x3ff42cff,0x99f2e2f4,0x1c35317c,0xa3c19f9d,0xaba1b545,0xdb749392,
  192831. 0x4afa9a32,0x84232b05,0xd7dcd436,0x0b855d46,0x45cf9915,0x8ac35e20,
  192832. 0xf001a218,0xd7cf22c7,0xed408305,0x057d35ae,0x553ccfcd,0x25a4a519,
  192833. 0x93e2b939,0x5e565793,0x3422ec27,0xa20332b0,0x3ac53958,0x9b09005e,
  192834. 0x79e9b163,0x628051a3,0xfc6618d6,0xb4a0dc09,0x6748e7af,0x9e0e857f,
  192835. 0xc577d63e,0x71b28eee },
  192836. { 0x99726bf8,0x4942b0cd,0x1c208f3c,0x1290a3b9,0xb0598eaa,0xfd7290e7,
  192837. 0xa25a9128,0xc6a7791f,0xc037d7da,0x2d33db24,0x70e2837b,0xc21efeb0,
  192838. 0xe3dae2a0,0xbf70d96e,0x85076027,0x43ed8191,0x4d4ad7e3,0x4aeb0aa8,
  192839. 0xe8c5b74c,0xbc75101f,0xad26ebdd,0xdbfb2a6e,0x6b78aa4e,0xba812068,
  192840. 0xe1159848,0xc94aa8f2,0x3eba5c4e,0x0d10d9db,0x6318295a,0xce7fec47,
  192841. 0x330d925a,0x7294711a } },
  192842. /* 134 */
  192843. { { 0x32bbd495,0xfce45904,0xbe54973f,0x330f4dd1,0x5d9c3f4e,0x006bee1d,
  192844. 0x59ba7204,0x40ee6078,0x42c2c768,0xc194fd3f,0xe9fe88be,0xa0e76b12,
  192845. 0xec2b0210,0x17cddddb,0x00811ec7,0x689d436b,0x284be9e4,0xa6a6ba37,
  192846. 0x007d4114,0xabc395b2,0x0f11e744,0xf8cdf9f3,0xe9396402,0xc5febec8,
  192847. 0xeeb46285,0x8a751743,0xc6e0d137,0x99bf8782,0xbeb292e3,0x3965e170,
  192848. 0x5801fd5f,0x001c39d8 },
  192849. { 0xda4a0912,0xf4805cb9,0x4410bca4,0xd27cb76a,0xec71d65b,0xef3dcb8e,
  192850. 0x4816849a,0x780fbb2b,0xa8b24635,0xef6a7026,0x12c44e68,0x15625c88,
  192851. 0x4d7a74a8,0x624c232c,0x4b1631e4,0x81a77037,0xdb917c2e,0x04e4f7f1,
  192852. 0x1f61ed95,0x1d0465fd,0xcbde6e3d,0xb1048049,0xd7131fcf,0x637ce0c1,
  192853. 0x8ada4715,0x22e4dbc2,0xace99726,0xf7530c5c,0xee287450,0xa0160dcc,
  192854. 0xbb91af13,0x9132e670 } },
  192855. /* 135 */
  192856. { { 0x7996099d,0x8057efe2,0xa06e608c,0xb72344db,0xd0958588,0xeb4a8740,
  192857. 0x79e5aee9,0xe53daf06,0x908a2fad,0xc9560a9a,0x107e706a,0x7f4be131,
  192858. 0x2830246a,0x6d5f3d9b,0x27cca3e6,0xa5f8e8da,0x4c28f292,0xeb51dca6,
  192859. 0xf31dfd78,0x4cfa310e,0x2ca073e5,0x92e0c7c2,0xa40da683,0x102f1694,
  192860. 0x750d38fc,0x16bb07cc,0xbadae035,0x703e83e2,0xb4d3c9dd,0xea93c066,
  192861. 0x79940ed1,0x7d0b03e5 },
  192862. { 0x4dd94c63,0x5fe7ea30,0x738b0b3a,0x57ef01c5,0xa14e6b4b,0x9534a78c,
  192863. 0xa5353276,0x07622cde,0x7c22d006,0xaf696a07,0x7d46b209,0x733c1886,
  192864. 0x626c2b4a,0x9654ccbb,0xa84f3c4c,0xa098d3a1,0x2d734b74,0x3596f9ed,
  192865. 0x5d551c90,0xdfd3021a,0x1ec5123f,0xe2ba7d2f,0xb2c1aa39,0xf9726925,
  192866. 0xf8eb2927,0xd2e75d0e,0x19192a6f,0xfaba712e,0x9b83e50e,0xa606b43a,
  192867. 0xdab5de60,0x31b1782f } },
  192868. /* 136 */
  192869. { { 0x4034db92,0x878dba45,0x8f34dc4d,0xa3977901,0xdf754c33,0x8d004f2e,
  192870. 0xcd563a88,0xeaa5954a,0xbb5ffad1,0xa29d6c89,0xb0d8bdb8,0xa8adf655,
  192871. 0x8cdbdb47,0xf7fb842d,0x80d3205b,0xb72e3a03,0x7cac7ca9,0xc335b0b2,
  192872. 0xd8a5475d,0xffc60bcb,0xeba4d25f,0x736f7719,0x0c50fca6,0x3d901c38,
  192873. 0x80c01900,0x1fdacf7b,0x5681f84d,0x75cf658f,0x5cefbbc1,0x57a7e634,
  192874. 0x3e07ed1f,0x6fc0fbe5 },
  192875. { 0xb81b0e5f,0x496d116b,0x2ac853b8,0xd82dd2a5,0x327387f0,0x357e22d4,
  192876. 0xba912c59,0x3e332a84,0x49d5dcc1,0x8b71c643,0x438d85d3,0x0c982ee9,
  192877. 0xbf7fcd4e,0x90b9553c,0x38fed5e3,0x2cb39bbc,0x5ac42903,0xa2c67c9c,
  192878. 0xbf07da55,0xebf21217,0xa0b9e4ee,0x55ac05ad,0x8ee9e0c6,0x10bb12c2,
  192879. 0x48bb6e3f,0x5cf3aee5,0x8b046e91,0x4ae7269c,0xaa0e553f,0xcb266012,
  192880. 0xa94c8fc8,0x701935a1 } },
  192881. /* 137 */
  192882. { { 0xa4626dea,0xde58d41d,0x15b9039f,0x25ef66ca,0x3164e65b,0x99a810a4,
  192883. 0x748cfccf,0x9fe6daad,0x2f142fa9,0x7ab9a6bd,0x5d471796,0xa4cba168,
  192884. 0x6bc3a39b,0x12d30b36,0x8bf45076,0x1f46a5dc,0x1421ac0e,0xb868e529,
  192885. 0x59bba1c4,0x7a686206,0xda698b90,0x2b4b552e,0xe5453707,0x5039dcd4,
  192886. 0x9e90165f,0x42a07a9e,0xd7d45dfc,0xa838fff3,0x3b5ceb30,0x41991e5a,
  192887. 0x969ca600,0x6c961ec8 },
  192888. { 0xc4e7eb46,0x703bdc1b,0x596c7b48,0xd6bac557,0x66afd74d,0x4f9917cd,
  192889. 0x656ce6f3,0x56355105,0x32497175,0x3d1fb50c,0x63effb2d,0xfda6783e,
  192890. 0xeefaa2bd,0xbd79f1f3,0x17af9ef7,0xa4efbe54,0x5a55b7a4,0x6cef6462,
  192891. 0x1a713304,0x116f3238,0xb95625a3,0xdb2a2a7f,0x0b027e96,0x6a0aa43a,
  192892. 0x4832b3bc,0x458fe5d2,0x5adfaac0,0x523418df,0xc49e7f9a,0xc05a89cb,
  192893. 0x69e24b53,0x830883d8 } },
  192894. /* 138 */
  192895. { { 0x02557389,0x959b1c62,0xadefc0bc,0x5fe5ce97,0x8330f383,0x893bbe7f,
  192896. 0x16cfb81e,0x27e0c6af,0xd04428fd,0x6f64e65b,0xb79e6182,0x53de9245,
  192897. 0x487e11ca,0x08a313c1,0x445bce93,0x65cec3b9,0xd67ed49e,0x33bc0314,
  192898. 0x30782352,0x69f36b24,0x93ad31d2,0xd78e5daf,0xc780890c,0xf2682b70,
  192899. 0x9e45efe9,0x7015c34f,0xe6cbafea,0x135d4ba4,0x7e3fcc6c,0x43a378a4,
  192900. 0x96638f8c,0x2376f97f },
  192901. { 0xae575b99,0x0a6e1ec0,0x81b970dc,0x7e14cb4f,0xd3a73947,0xf00a3824,
  192902. 0xfb235a9d,0x0b4b9c81,0x5bf62944,0x8d15115f,0x1e165d7a,0xcfd35b43,
  192903. 0xb2ee3e3b,0x5d12fea2,0xf5182e7b,0x629984a6,0xc365d08e,0x4e43e2f3,
  192904. 0x30f36e72,0x99327091,0xfd345401,0x698b4a00,0xbaf96dce,0x23c4fd0e,
  192905. 0x23675554,0xa60ba0ae,0xb0325784,0x51bdac2d,0x215464a1,0x8ab4190a,
  192906. 0x6bf10296,0x8c461661 } },
  192907. /* 139 */
  192908. { { 0x2d1f36a5,0xeffca258,0x894c5f2d,0x0eded2b2,0x43ced84f,0x35a5cdb8,
  192909. 0xdb0e3b9b,0x290f8982,0x0719a112,0xcce0eaf0,0x39a362d6,0xd0e657e4,
  192910. 0x62697e47,0x5516a55d,0x8e636514,0x269e1f77,0xd50269bc,0x5e3dedcb,
  192911. 0x441c57c5,0xecec2300,0xc705578d,0xdb83f31c,0x1e489eab,0x1bdefb73,
  192912. 0x395fcdb4,0x20b678cf,0xff9db001,0x908cf91c,0x55f52cc8,0xcbebc6f4,
  192913. 0xb4c61162,0x155ea622 },
  192914. { 0x876fa42e,0x94be2f1f,0x7fadeee7,0xab5e8749,0x38c865af,0x692e70f5,
  192915. 0xdf8059b0,0x16e99b84,0x8b5a7ac9,0x0ceb606e,0x2d463d2b,0xced23357,
  192916. 0x2a9a09a0,0x2d0f2623,0x3861fbdf,0x2529998c,0xc1be310b,0x711888a7,
  192917. 0x0d8aade3,0x9b1229c5,0x3b13533d,0xdbcf9b78,0xff029708,0x3ca746f8,
  192918. 0xda83ef88,0xa5a013a1,0x4ab28444,0x8e904d18,0xbcbd4aba,0x2fe84b3d,
  192919. 0x259058c3,0x8f570f24 } },
  192920. /* 140 */
  192921. { { 0x2ca9c508,0xdeb66c8a,0x69d6b780,0x2dc5bec2,0x88ead600,0x16d61266,
  192922. 0x49d72614,0x61841b97,0xce472e6f,0x41e40e6c,0x1fa7a876,0xada24264,
  192923. 0xcc3997a0,0x45b9fd33,0x7c15dcf4,0xb25e8fa9,0x12e9629d,0x0124ceb2,
  192924. 0x7db3d956,0x3a8c72c6,0x7c1a7844,0x8e2ded2b,0x6dd027ff,0x94ab09c6,
  192925. 0x7e7a2bc6,0xf89a057d,0xcf70c763,0xad8bf226,0xc8a26212,0x4cb268e7,
  192926. 0xb2c44c1d,0x3d171e87 },
  192927. { 0x8ce49820,0x382ac16e,0xc0c44dc9,0x24ee45e2,0x73e858c4,0x0ec67912,
  192928. 0x46327cf9,0x918cb25c,0xc6159c1f,0x43e3876b,0x37545cb3,0xb6b6e0e0,
  192929. 0x5d12347e,0x64b839ab,0xa300d541,0x72e09274,0x881c1169,0x26ab28e6,
  192930. 0xeb75a843,0x4a580fff,0x359120df,0x0a5802ca,0x3209f4a3,0x7fee82d0,
  192931. 0x8e6a9380,0xb518016b,0xc2ee11ca,0xb99c6c70,0xab9d4ec7,0x16105af1,
  192932. 0x34cd9004,0x234e98f8 } },
  192933. /* 141 */
  192934. { { 0x14db9cda,0xff435208,0x96adec90,0x99cfdc47,0xaf458b6d,0x843aaa6f,
  192935. 0x743eaa31,0x3f1f7415,0x61735d81,0x915e192e,0x0ac595d5,0x3441a22d,
  192936. 0xc044bc8d,0x704bbf67,0xbe23a236,0x2f960471,0x15d1d557,0xcc326388,
  192937. 0x76b1dd94,0x9410230b,0x0c1c8a67,0xf2e5439f,0x833c910d,0x56b141ac,
  192938. 0x865b84df,0x467c999f,0x21f02b7b,0x1b0251fa,0x96216950,0xde5b5260,
  192939. 0xce3a1e93,0x6a2130e3 },
  192940. { 0x4b3ca1a7,0xd21b67a0,0x00c0ce80,0xaf42ed53,0x932cf07a,0x22ccd368,
  192941. 0x5c25c35a,0x36523a81,0x8dd04d06,0xecdd3958,0xb2f93a3b,0x73da3502,
  192942. 0xd5e5b530,0x4c5e0c3c,0x13268777,0xef9f5486,0x1e742292,0xed87fefc,
  192943. 0xa24e5ede,0x6d9ac29e,0x33849f1a,0x08abc9f0,0x40f23905,0xb09b2292,
  192944. 0x7f934353,0x6791072c,0xe6aeb550,0x102a6381,0x96feb870,0x3ee07409,
  192945. 0x9c4d2830,0x34f06faa } },
  192946. /* 142 */
  192947. { { 0x2348f005,0x869dc79f,0xdf4920b1,0x9b5c5d71,0x6dee64a4,0xfd1b57ca,
  192948. 0xe82a4fb4,0x21b7f734,0xb9578366,0x637cb834,0x7d287d96,0xc934101b,
  192949. 0x0392ecab,0x1590f8ac,0x7f75f4e3,0x280dc373,0x6a61ac62,0x8b36f50f,
  192950. 0xa65568da,0x74f58304,0xd930870a,0x80d792a9,0xfc8895cc,0x6d17b192,
  192951. 0x4914939f,0x498392fa,0xd41d5b9e,0xaf36027d,0x5caa82b5,0x452d79e2,
  192952. 0xf4115d1a,0x764d47b1 },
  192953. { 0xa2ee8b9c,0x5df22303,0x85dfcd48,0x1b9f72d3,0x10813a37,0x6b42b983,
  192954. 0x3de741f5,0xe28c523b,0xf303bb5b,0x0857625a,0xac9bf9af,0x926f299a,
  192955. 0x0d445b34,0x21beac08,0xd6ba2c0e,0x6a523a02,0x7fce2864,0xe302a1b1,
  192956. 0xe300c1ea,0x4516a235,0x7b4a9311,0x4543736a,0xc0cc89f7,0xd3c0b9e8,
  192957. 0x40ed88de,0x0481904f,0x3cb7fc70,0x4f269b56,0x321b9738,0x09a1d53a,
  192958. 0x230a3810,0x1c0dd9c3 } },
  192959. /* 143 */
  192960. { { 0xc46a7d9a,0xffaa1f67,0xbedf91cc,0x64743334,0x47a42f2e,0x45833a74,
  192961. 0x241ffaa9,0x67980051,0x335efe6b,0x70979a84,0xf08b2403,0x5f0613f5,
  192962. 0x64f211dc,0x6bb22fcd,0xa0572cfc,0xe1b8b2a3,0x7950a14a,0x19e0eb41,
  192963. 0x3eb6cd4c,0xe634bb29,0x470a25ff,0x31a04b25,0xa3d15a0a,0xa41f7ac9,
  192964. 0xbf2fede9,0xefed85ec,0x81b94a00,0x1f581f5f,0x9ef4a15c,0xaa3996b0,
  192965. 0xb06041bc,0x52d8be39 },
  192966. { 0xfd631a2f,0xbd1536f6,0xb351a8dc,0x91fae7f0,0x9b126212,0xd1a590c7,
  192967. 0x2bd0f435,0x52d4875f,0x92b0ea70,0x9aedb6d3,0xb83ab89e,0x0bd0abdc,
  192968. 0x89fe192c,0x827a1062,0x102a0bda,0x6566a960,0xce036814,0xda083037,
  192969. 0x58639405,0x30bed79f,0xdbca8df9,0x972019b6,0xefdaa3f5,0x89201286,
  192970. 0x5236b892,0xb337b996,0x28fc2e73,0x11d3e38e,0x880e8da3,0x70787f41,
  192971. 0xdae4a45d,0x6cff6367 } },
  192972. /* 144 */
  192973. { { 0xf89a8bb4,0xbd3d0433,0x93b98f71,0x42144c33,0x03470a2d,0x82b616c8,
  192974. 0xe5da089e,0x98fcc757,0x7bf5fda6,0x542354ef,0x9ebd34cc,0x1885c253,
  192975. 0xbec5dd0d,0x2e20b285,0x782a1bca,0xe71bbbe1,0x9b854ef0,0x959ded30,
  192976. 0x8997fa6a,0x17249979,0xd81f3c45,0x50cf8fa8,0x60c11152,0xa9a3b517,
  192977. 0xecf845ea,0xc9b0ef7d,0xb9fed11b,0xc9339e23,0x28256080,0xc93e9c5c,
  192978. 0x613ec1e7,0x1d2c8217 },
  192979. { 0x987cfc93,0x7381347d,0xf187f810,0x047603bb,0x1250ca31,0x3fa6bc9d,
  192980. 0xbb055bf3,0x480091e0,0x3a3af87c,0xbdf95f1a,0x140540ab,0xe2687770,
  192981. 0xd7fe045b,0x998df730,0xb723bc2d,0xb398135f,0x15ebec46,0xac230f8c,
  192982. 0x5f5561c0,0xe08e1830,0xda60a47f,0x7c0fbf4c,0xe16d4bfc,0x06e95c24,
  192983. 0x74617e92,0x74163495,0x4ae0c20e,0x39719869,0x2131e2b6,0xfe269312,
  192984. 0x0a537722,0x25486e36 } },
  192985. /* 145 */
  192986. { { 0x53572806,0x618795ca,0x656968e1,0xb2c89449,0x3fb323ae,0x149c2c97,
  192987. 0x409bc7d6,0xfb15de26,0xc79121b3,0xa90cda72,0x204cabbb,0x6d2fa14e,
  192988. 0x91604125,0xcbcda6f7,0xb435f947,0x25086261,0xc282eb10,0xdb686c38,
  192989. 0xf1a791cb,0x51016d62,0x61a2266c,0x6b1c7ed1,0x271d74a6,0x26780666,
  192990. 0x824287a4,0xb5ffeda1,0xbbe4f0f3,0xcbe503ff,0xb9482a74,0xd7f7f0be,
  192991. 0x088493f1,0x751b2358 },
  192992. { 0xe9c9be68,0xd597b9d6,0x67d10c6c,0x1794b5c4,0x7762b2f4,0xa88cdc3d,
  192993. 0xa1b44e11,0x6d94a63a,0xaaa8eca8,0xfb0bbbb9,0xc963d87f,0xf4b0f2d0,
  192994. 0x5dc7075d,0xb753062c,0x49933989,0xfed726ac,0x57f9ccde,0x5da60638,
  192995. 0x75f8c766,0x221c392a,0x5dc672ca,0xcd264d95,0xb66ecc8d,0x7004ff22,
  192996. 0x18a458ba,0xfb1aa9ae,0x8babd653,0xea9644df,0x2ba0de7c,0xa9378e80,
  192997. 0xca2c6c75,0x144cc12d } },
  192998. /* 146 */
  192999. { { 0x2989aa3a,0x593a0a1d,0x59e6e64d,0xd83f2283,0xd32e732e,0xe938b0cb,
  193000. 0x3c3cb249,0xf4c464c5,0xf89ea6ac,0x9750a5f8,0x346cfc32,0x467e5bbf,
  193001. 0x37b2b809,0xc9bfab9d,0x3b339c6d,0xf8eb7453,0x3b766dee,0x3fe01fbe,
  193002. 0xef6aea27,0xb3154254,0x7be61b10,0x555c3df2,0xdd818488,0x70fb6d81,
  193003. 0xbbe714f9,0xda1af3a4,0x9d18f693,0x575f2017,0x2465b839,0xdc08fc6b,
  193004. 0x6b84a951,0x874ecf33 },
  193005. { 0xbbb3f6be,0x624af83e,0x08bb423d,0xf578fbb9,0xd7873527,0x5623b0ba,
  193006. 0xa62e0442,0xc3659bd8,0xfe236f79,0x2903b167,0xe53f26a6,0x55a430c6,
  193007. 0x3ad712cf,0x222547ae,0x76eb272b,0xb73890d7,0x3d628df9,0x95b4f70b,
  193008. 0x53eae4ac,0x9f0e13b0,0xe7f2174e,0x5b4f5138,0x98dbae17,0x75482cf9,
  193009. 0x44518480,0x2b69bbde,0xcafef15c,0x4f279652,0xb6bcaf19,0xa0a3ef2b,
  193010. 0xce4c634f,0x31fb8581 } },
  193011. /* 147 */
  193012. { { 0x615cd607,0x398306d1,0xaa32c3a6,0x680c9faa,0x7779131d,0xe87a705b,
  193013. 0x36708b00,0x1031013a,0x9445297f,0x814fa0e1,0xa6a79b56,0x70c5583a,
  193014. 0x4b16bed4,0x03039cbf,0xaaaaf8d3,0x18a7ca8d,0x5cdb68a5,0xf33159e7,
  193015. 0xd23814fa,0xdea0e738,0x8d0f4f9f,0xeb352718,0xdcdff032,0xb0b76609,
  193016. 0x3d48338b,0x65ba8ea9,0x55dd507a,0x18044d82,0x4a4a50b4,0x844a223e,
  193017. 0x18e19e54,0x98323000 },
  193018. { 0x57f3d5a6,0x28a21027,0x6e8cadcd,0xffce5648,0x02551f3b,0x9590381b,
  193019. 0x935ebdf1,0xb26cc64f,0xc083aa6e,0x60611291,0x88e4cf41,0xcd988a66,
  193020. 0xdd53b1b5,0x581c3f73,0x77fc621d,0x78c804a9,0xfadca2fa,0x31874330,
  193021. 0xc83ccf02,0xf7008da4,0xa79a4707,0xc4122a1d,0x4a915eb5,0x9a8e0d3f,
  193022. 0xd0123660,0xa2de157d,0x65ead2a0,0x45ef43b2,0x188db285,0xd0a22ade,
  193023. 0x922e0caa,0x8abbe39e } },
  193024. /* 148 */
  193025. { { 0x3a2d2f01,0xb4446905,0x5dc6685c,0xd27c3193,0x1d74a027,0x6a908bbf,
  193026. 0x5b50ec1d,0x01da350f,0x3f3c2e26,0x1d3dd45e,0xb836ee92,0xf66e11d0,
  193027. 0x474b979c,0x7e03908f,0x98b87834,0x19e7c5b9,0xbd3d1de9,0xa741d3fe,
  193028. 0x1ef6059b,0x63c68e8d,0x3674e247,0x9b9ff939,0x3e7e67f6,0x1d7d53e7,
  193029. 0xaee9e248,0x698dc326,0xb3bd984c,0x52f23eda,0x6f8fe8a7,0xf95e31b0,
  193030. 0xc3d0ba95,0x0f15b4d0 },
  193031. { 0x790a8d85,0x8f2f6635,0xe2595af1,0x51bffbae,0x24b51287,0xd15b7ec6,
  193032. 0x3234715d,0x7639b6ab,0x2bc5441d,0x0cdd5299,0xf6d05833,0x54800ea4,
  193033. 0xf6d6e360,0x21efd752,0x19290613,0xc0b7ffe5,0xeea898cd,0xb68a5825,
  193034. 0x22982266,0xecedba92,0xbbd06bb2,0x678a91b0,0x4bb6b0cb,0xb2436dc0,
  193035. 0xcaf8ea98,0xcf7a99e7,0x71aa05bb,0xb92d0e6e,0xf5993eb1,0xbf8d0471,
  193036. 0x20385ddb,0x515db378 } },
  193037. /* 149 */
  193038. { { 0x6f5bef22,0xee43eaaa,0x20348712,0x952d2698,0x7a3af6c6,0x1e4c484e,
  193039. 0x9a8c9403,0x18d434c6,0x5001899a,0x63e5d741,0xfe8ea40c,0x5238dbbc,
  193040. 0x96798721,0xca6cc8d2,0x04acbde8,0x73db6aee,0xb7f993ce,0xbf69328d,
  193041. 0xad45e334,0xa3f79bbf,0x7c1f1630,0x8c51ec93,0x9b00a6de,0x4907325f,
  193042. 0x12d82bc3,0x49e6acb4,0x0ec59fc9,0x5901b36d,0x9cf34e3b,0xcb09b710,
  193043. 0x1abf4c02,0x2de0487e },
  193044. { 0x8dd9d484,0x18b722f3,0x7c77bacc,0x83349393,0x93d92b8a,0x58dbb8f1,
  193045. 0x8e3fac25,0x80d78d50,0x745f4a7d,0xf0500981,0x877cc29d,0xd072bfed,
  193046. 0xc30a89f8,0x67abf8f2,0x9a0820d7,0x92c567ea,0x8a3a5738,0x425ab12e,
  193047. 0xf055521b,0xc162faeb,0xb94ea5e9,0xee1c4f26,0x3d71e546,0x1e414994,
  193048. 0x43e8be1d,0x258183b8,0xef9eae0b,0x44917c82,0x73874a30,0x6813a457,
  193049. 0xcc42f86e,0x6f6ac071 } },
  193050. /* 150 */
  193051. { { 0x4dd6e3b1,0xd38822ad,0xad620869,0xfc78e1cc,0x2cacde80,0xe7843845,
  193052. 0xa8469fe3,0x121cc14a,0xe67e8ef2,0x8e8f3da7,0x4d347448,0xdb83d16e,
  193053. 0x798631f4,0x3ba1dd98,0x0a4c4c17,0xdfab5977,0x3edc701f,0x1f0a1306,
  193054. 0x6cd8ff28,0x4649d601,0xbcc55bc9,0x2267230b,0x5760412a,0x02a19c60,
  193055. 0x328faef6,0xc719d5f1,0xf67eaad9,0x27cb969e,0x719bafb5,0xf342530e,
  193056. 0xff5a82cb,0x6e2c24cc },
  193057. { 0xadaf8793,0x6313024b,0x035c948e,0x944bccf1,0x953500bf,0xe9a066b7,
  193058. 0x1d116765,0x7991a946,0x9fd93c78,0x95addb2e,0xe92e5495,0x05d2c037,
  193059. 0x9f03e5cf,0xcb145b18,0x95aa1f72,0x81ae48ca,0x135a6e4f,0x203f2702,
  193060. 0x49b2a7d5,0x2bcef5a2,0x02d7f2a3,0x0687a900,0x6c6745b0,0x2f7d3228,
  193061. 0x86507305,0x3da8a875,0x2e8dc58f,0xbe38b884,0xdbf11185,0x6b48bf34,
  193062. 0x97c08f91,0x5af7fd0d } },
  193063. /* 151 */
  193064. { { 0xf4a224a5,0x55f9b950,0xcc50273a,0x41904574,0x643f1fd5,0x34f81330,
  193065. 0x0e50f783,0x996801bb,0x89581712,0x866d7403,0xa4091d36,0xdb9a405d,
  193066. 0x16a46fe7,0xf1e379df,0x83bf9168,0x8d04a93f,0x32b20bca,0xae4c8335,
  193067. 0xf72a1c10,0x99d334b1,0xd8195db4,0x8fbc9977,0xfba14b5d,0xcaeb3dff,
  193068. 0x76daf476,0x60fef022,0xdb5b72f4,0x4b948dfe,0xb6dfb062,0x5185c925,
  193069. 0x9609d4ae,0x27a9c381 },
  193070. { 0xf12a93af,0x73c37346,0x5536634d,0x028b707c,0x498193d1,0x8efa58d5,
  193071. 0xef21b69d,0x4f83a5cc,0xa788a0e2,0x05cbb0a3,0x65b13c98,0x01031781,
  193072. 0x2b73784c,0xfea20e58,0xe50361f2,0xdf9713a0,0xd0cc22d9,0x31449a0f,
  193073. 0x7c5e2e1b,0x183752e7,0xb67044cf,0x6e44d6bd,0x733e177a,0x012dde95,
  193074. 0x08ee2c23,0x68b49669,0x1f5f1949,0xd9bb0541,0x6acd886f,0x95182c71,
  193075. 0xfbde9244,0x1c690694 } },
  193076. /* 152 */
  193077. { { 0x3a880026,0x5db67d17,0x125d95f2,0x89c4f0a0,0x3f6cb7a4,0x29050551,
  193078. 0x5cbbdca5,0x3eb231d1,0x972bcbd3,0xf8cffc99,0xad55a03a,0xcb4ef4d4,
  193079. 0x22867c2f,0x944d47ca,0x0ead1aa5,0x96d88548,0xcbc8b045,0x76a57cf8,
  193080. 0x005e55a0,0xdfe5844b,0x1d18a097,0x5e9e7e19,0x52923c74,0x957a26e8,
  193081. 0x7f5db339,0xd0867b79,0x63bed0c8,0x2553408e,0x689ad23c,0x1596e5d5,
  193082. 0xa504c339,0x7b8c13d6 },
  193083. { 0x52fb6901,0x2fc43aad,0x16ca253b,0x1c0313f9,0x515aadc6,0x1475830a,
  193084. 0x7f577dc2,0xc93d1926,0xf723c0dd,0x26e52e8e,0x3eb9f6da,0x2f1e0eb8,
  193085. 0xf180376d,0x9979de82,0xb0834939,0x43e28ecb,0xa39c38e7,0x9a2d51dc,
  193086. 0xa8e3f6b5,0x6e6063a9,0x4b9b3270,0x4cf1da3a,0xd2f8915d,0x6e5348a2,
  193087. 0x50507912,0x5e75e3e0,0x20d383fa,0xaeffce57,0x8fd2fb29,0x1d6d53cc,
  193088. 0x696f4cd0,0x0e3c3ef6 } },
  193089. /* 153 */
  193090. { { 0x21ee1d83,0x3bc337c1,0x787b7788,0x97e08f6d,0x138fa4ce,0xbf709fcc,
  193091. 0xa0348e58,0xbaf77647,0xa55e672d,0x04f8babc,0x7d5ec5dd,0x0ed2919d,
  193092. 0x33e99218,0x8ce64bff,0x24b059af,0xac09fc57,0xdc5e32ba,0x506831f9,
  193093. 0x465af6a9,0x26a22677,0xc97f1ff8,0x3c5efe66,0xbc6087fd,0x1515e0d6,
  193094. 0xaa8edc6b,0xb1a39c5e,0x0e79ed29,0x3dd816bb,0xbc3788b8,0x6cc13769,
  193095. 0xc092a51c,0x463098e3 },
  193096. { 0xc8bd0fa7,0x3a6408c7,0xce6bde49,0xd1764311,0x283ef7be,0xe315e108,
  193097. 0x99b5d938,0x8213cc77,0x45a49a6b,0xaf7f1581,0xe529e4d1,0xd00fdb0f,
  193098. 0xce66c9d6,0x55d38f77,0x1bd4b952,0xb4f7ccc0,0xaf71f986,0x8d975b49,
  193099. 0xcd64d00a,0x12b59fcb,0xa5a3bad7,0x1860e504,0x2b5c89f1,0x6d976044,
  193100. 0x7a3e231f,0xfed0c659,0x178cba92,0x58114c33,0x6698e11e,0xe2e74c06,
  193101. 0xa348b85a,0x7f8fd093 } },
  193102. /* 154 */
  193103. { { 0xc19428af,0xf24592ca,0x3a308665,0x192a1c81,0xe30bbd7f,0x42589812,
  193104. 0x836c6bb9,0x10db0723,0x598e4987,0x9c7a41e9,0x6ead6f4b,0x8aff179e,
  193105. 0x75862c44,0x70f8f9b9,0x6f21983e,0x6b3b0237,0x98e65152,0x25d83e9b,
  193106. 0xd751218a,0x3b2d26a8,0x9d6f1da6,0x9508281a,0xa5a81f74,0x8df78d05,
  193107. 0xe4687471,0xd79ee559,0x6787d8cc,0x2060ca57,0xa8476c95,0x427a84ff,
  193108. 0xe6435131,0x87b64c51 },
  193109. { 0x4b30d3c4,0x87f46f65,0x23b4ef14,0xcdec4c5c,0x63ca4d68,0xb3b74766,
  193110. 0xcf3fb56d,0x1df34269,0x0fd7d46a,0xd4f139c4,0x6a69a8bd,0xa3b7c7c7,
  193111. 0xcbadd7d2,0xee56b4c9,0xac942334,0xb28ff342,0x786f1da3,0x0046fdfa,
  193112. 0xb700c82e,0xce5d149c,0x50966597,0xca30ef81,0xfcff4bdd,0x44a20609,
  193113. 0x44925268,0x0f2f65e7,0xd4021f38,0xe5b6552c,0x042dbbd0,0x77ea9c2a,
  193114. 0xd9c062f5,0x8c95267c } },
  193115. /* 155 */
  193116. { { 0x5fc1abb1,0x6655032e,0x12fe4743,0x2215af54,0x29f05ef5,0xfd657560,
  193117. 0xdc191be9,0xb0e73325,0xc08639b0,0x7ab3c65e,0x1c3e6673,0x67507f51,
  193118. 0xc8615555,0x638befc3,0x42f0c4ad,0x5d0188cf,0xd896186d,0x843a301c,
  193119. 0xb2c6741e,0x045603f7,0xfa3cd1d0,0xf7545c0c,0x4a40672e,0xf612affd,
  193120. 0x45b9e8dd,0x56197c9f,0x87922d74,0xb453237d,0x4b2d59bf,0xbf132e3a,
  193121. 0xb84a6a16,0x8afa1b73 },
  193122. { 0xe793ac70,0x6b3596ea,0xeef6dd10,0x4c94ef8e,0x70422e40,0x926b4fa2,
  193123. 0xe9e5d763,0xc8c71dce,0xf512aadf,0x352fcb70,0xa883975f,0x1b7ba138,
  193124. 0x058c3b13,0x57991390,0x97740fd1,0x9692092a,0x160b0697,0x19ad945b,
  193125. 0x10837ab2,0xbc634388,0xf174bb71,0x76ee11c4,0xab1b80eb,0x6111bfc1,
  193126. 0x70ec458a,0xbc82bac8,0x312d3325,0xeee60127,0xb240adc8,0xb4118b1a,
  193127. 0x2b5a093c,0x67211191 } },
  193128. /* 156 */
  193129. { { 0xf55cf9bf,0x91e99306,0xa46b96d9,0x9b045308,0x9e7a65df,0xae3c1e1d,
  193130. 0xc731bcbb,0x453cb151,0xa4d58a61,0x14be5227,0x97c74cc2,0x39dac922,
  193131. 0x822e00d6,0x4d0f7a45,0xc62b03df,0xafeb1d51,0xbaa18b2d,0xbb1dc3a4,
  193132. 0xdf2b74f0,0x7f3c7178,0x896b6a33,0xfcd328a6,0x1dce055f,0xe95ed454,
  193133. 0x6a4e2b87,0x97fbc76b,0xfa59dce9,0xe5ec67f1,0xcc0367c1,0x052368ac,
  193134. 0x54e4a3fe,0x7c863916 },
  193135. { 0xca7388cf,0x55e94b5e,0xc0335d38,0x17cc0a60,0x616f85ba,0x9b69b78b,
  193136. 0x10122980,0x705d02ef,0x1cfd0a79,0x565a6e80,0x7d1ee352,0xeb74a96d,
  193137. 0x427b9dad,0x5c8832ed,0xe6d5330f,0x96ea8528,0x18d24ee8,0x30d8862b,
  193138. 0x9ff939f7,0x9cd38ed5,0x01060252,0x690fc9a2,0x2303b3ff,0xc62d88b8,
  193139. 0xdd52b469,0xfc42d7a4,0x8cad2d93,0x06f8dfa2,0x60920438,0x50236090,
  193140. 0xfce855ad,0x32582758 } },
  193141. /* 157 */
  193142. { { 0x359e8c60,0xeb20e45f,0x364ca186,0xc71bb8a5,0xdff8e110,0x02b15071,
  193143. 0x4c93e578,0x074e91d3,0xb829d0d8,0xc0326e00,0x626a83fa,0x3c192258,
  193144. 0xfb29a09e,0x387a64d5,0xe5ac5c82,0xcaaa3d34,0xada2da29,0x8ed685e5,
  193145. 0xeb29650e,0x92720267,0x763802f3,0xf7184b19,0xdf6b1aea,0x23f5dd0e,
  193146. 0x25e6125d,0xbe1fa347,0x0c872a1a,0xd6287f9d,0xac57c3af,0x49aa93d2,
  193147. 0x5bda7656,0x1a4e6a71 },
  193148. { 0x554d1267,0x1a126ede,0x1cd02b48,0x37f94533,0xce31fb1d,0xd70af04c,
  193149. 0x097dc012,0xcf410b0b,0x36c7b6c5,0x930e1d17,0xc6891085,0x902fee41,
  193150. 0x79fb638f,0x349ba4a7,0xacd6f8df,0xa16c5821,0x2e076ace,0xfb3b83c1,
  193151. 0xe501d14d,0x6b8d033b,0x20f2d2da,0x0593d452,0x99df1880,0x3752526d,
  193152. 0x9feb33a6,0xca32351c,0x1f6ef456,0xd91343bc,0x35b9dc8a,0xc74857db,
  193153. 0x85b4e832,0x856a7c93 } },
  193154. /* 158 */
  193155. { { 0x0d0a5583,0xa007d002,0xeda4658a,0x2f1301dd,0x34d939be,0x91c07964,
  193156. 0xa70c0836,0xa0cb6780,0xbe81e540,0xc0b4df95,0x5d4ac8b8,0x6cbbcd34,
  193157. 0x54756239,0x57c52ed0,0x1805ceb6,0xcac2dca4,0x79344255,0x915ee6ab,
  193158. 0x24c9a2a6,0x366def31,0x8c12c674,0xbd3b962f,0x7dbb7c3b,0xaab64f1b,
  193159. 0xe22bb95b,0x3c0e4553,0xc4c63b74,0x2408feba,0x2a4da631,0x3ca77312,
  193160. 0xc636da40,0x62889084 },
  193161. { 0x8cb8d208,0xa457fd53,0x543f06d4,0x7a8f8009,0xf2eff2ab,0xb66de154,
  193162. 0xf72517e7,0xfddb28eb,0xf9389d2c,0x0149fe66,0xd85b88ce,0x79e8773f,
  193163. 0x0ba543f7,0x452e090b,0xb0b03fc0,0xdeb9b5cf,0x6c5ed77b,0x3113448a,
  193164. 0x8ffc0372,0x3609f3cf,0x5c1b4c4a,0x2bc9c46d,0x8fa59be9,0xe66f3bf3,
  193165. 0xcdb02691,0x1396bf5f,0x009f88f9,0xf1ec59d4,0x2ad9dfe3,0xc2903456,
  193166. 0x5ada4d58,0x79d8122c } },
  193167. /* 159 */
  193168. { { 0xaa529507,0x14d4e4ce,0x74655d00,0x056a0814,0x4f0fc474,0xc0d30a38,
  193169. 0x3443cb8e,0x8a8203ea,0x97f1728d,0x33c62fb0,0xb520ef52,0x8a38dcfd,
  193170. 0x7cac9d3e,0xa0f90d5d,0x873cea50,0x28a7b0bf,0x6c6c41cb,0xd115ae3a,
  193171. 0xa13812c1,0xa35171da,0x624d507e,0x25d4bba5,0x7e98f42f,0x91dad289,
  193172. 0x96a41371,0xffd6b1e9,0xb69e5b77,0xd46c2125,0x20c4f707,0xc7d2b424,
  193173. 0x8142557a,0x2ab3af95 },
  193174. { 0x6a5372a6,0x86ca074c,0x56292ba7,0x728fb83e,0x77741cf5,0x745596dc,
  193175. 0x520ef49d,0x70b4cea1,0x61e46472,0x1472fe34,0x3fb8ac5d,0xf4d6bd66,
  193176. 0xc10bc071,0x46e52cc9,0x371a3461,0x28794efe,0x276fe877,0xa4850718,
  193177. 0x9bef5ab4,0xedad5773,0x3f15c815,0x24c2d9ff,0x8f8395c3,0x188950e5,
  193178. 0x80b6a855,0xbae40996,0x8a8803e1,0x4f53e22c,0x039d25ee,0xaf233f61,
  193179. 0x250409ca,0x07db2c35 } },
  193180. /* 160 */
  193181. { { 0x037d4703,0xc7f3b8db,0xc5f488b9,0xe83708df,0x8471d402,0x1fba830f,
  193182. 0x5a2faae9,0xa55ee8d2,0x5404fc1e,0xc2e5bf10,0xaa2d5651,0x647d5027,
  193183. 0x7ebaf5f9,0x37a53c0c,0x95b30abf,0x7adf0bb2,0xd64c93ba,0x5a62e1fe,
  193184. 0xe2ef4a78,0x7ffc18c0,0x4d2cd04f,0x139dd9d9,0x5ea0af02,0x253fbab7,
  193185. 0x0fef9acf,0x7c8100ea,0xc8615aa7,0x74c5384d,0x9fe52069,0xcb28682d,
  193186. 0xcf7dd759,0x08b6ca8f },
  193187. { 0x036c3b5a,0xe04e5bea,0x7f9f2b4b,0x38726102,0x29797c0f,0xa9fca570,
  193188. 0x82879ea3,0x1656180b,0x607f0ddf,0x153389bb,0x67b0e087,0x99a1223c,
  193189. 0x9d897fc7,0x0d1808ec,0x916edf19,0x9470711a,0x07217118,0xf8f52f2b,
  193190. 0xd18888b6,0x5d8b29ff,0x4cc6f900,0xef1e22c5,0xeb24877f,0xc4036165,
  193191. 0x35479525,0xfda95233,0x6861468a,0xd622a421,0x74faba08,0x5d043b07,
  193192. 0x0d31a7d2,0x2c337b02 } },
  193193. /* 161 */
  193194. { { 0xea22fa65,0x7b2305bc,0xd159f63a,0xbe183ef4,0x3f35923f,0x3473d87d,
  193195. 0xc11d7753,0xb27fb306,0x2a054cff,0x702e7e6b,0xaf185619,0x3ce9f97c,
  193196. 0x4e7d51c5,0x83550243,0xf356ac5b,0xa63e3d82,0xd7645131,0x867b7caa,
  193197. 0xa671fc9d,0xee85e6af,0x2b07cd77,0x3b985ede,0xffda5193,0x07d598b0,
  193198. 0xa942dc36,0xb10eca39,0x506218a9,0x17f3dcee,0x06b7d5ca,0x3d94e8d1,
  193199. 0xed8831c9,0x509b2634 },
  193200. { 0x48caed54,0xb1b9414e,0xcbf51e97,0x77a78c6c,0x4de9b258,0xa4688c8d,
  193201. 0x91ee3d78,0x0024137c,0xe30ee64c,0xa68f9234,0x88190d78,0x573255bc,
  193202. 0xba80690b,0x41e8e05f,0xec354f4c,0x50038d84,0xdfa52816,0xb18f02d6,
  193203. 0xccb63fda,0xc47f9007,0xe98ae455,0x29d480fb,0x5d0e319d,0x4ac45d22,
  193204. 0x026db719,0xd06f3575,0x2c3587b9,0x733b9e20,0x2c317727,0x22483992,
  193205. 0x54bb8752,0x1592d5a7 } },
  193206. /* 162 */
  193207. { { 0xcf7453f0,0x5778d9a2,0xed83c1f0,0xaffb899a,0xe0a82ba7,0xae6506d3,
  193208. 0xea3d5081,0x32c84e1a,0x810aa38b,0x9ad528c0,0xbd37d041,0xb1fdb020,
  193209. 0xd06ce41f,0x78d6cbe1,0x2e74b7f6,0xd287f0f0,0xc43bb022,0xf5cd2575,
  193210. 0xf81a71b3,0x6d28f2f3,0xc633e7f4,0xe65bb1f5,0xc4fc580e,0x32e5fc1c,
  193211. 0xbb7b07a5,0xcd55539f,0xc3caaf3a,0xb5a94471,0x4cc22d2d,0xb958bdf4,
  193212. 0x77a2777c,0x1614bdbd },
  193213. { 0xed0ab04d,0x4c1f0230,0x6e2082ea,0xae347b00,0xc42c5b5f,0x9f10bc63,
  193214. 0xde019935,0xb0539e6f,0x65dd0825,0xd89bd4e7,0xbbceda16,0x92260fef,
  193215. 0xe62aca32,0x8aaa755c,0x5ec82c5f,0xed762fa9,0x18650768,0x99e64c01,
  193216. 0xc92e348c,0x57dd6245,0x31ea6d68,0x0db88a77,0x07b44736,0xef0012ab,
  193217. 0x171d70fe,0xb9356b94,0x03f891b0,0xe68b0628,0xb79c20a2,0x3a54a53a,
  193218. 0xb00b0728,0x489656c7 } },
  193219. /* 163 */
  193220. { { 0x71353c25,0xe43649ba,0x13f67e24,0x517f27a1,0x1c1eb9e3,0x10bd333a,
  193221. 0x78e29bf9,0x94e1c05c,0x4743f15d,0x84fe7d97,0x90da2df0,0x9c874908,
  193222. 0x53673be1,0x82403fa7,0x1baea1b1,0x7ebf5db4,0x24180ead,0xcfe0ae35,
  193223. 0xc2f50c3f,0x1d15873f,0x70661cd9,0x16851ad6,0xa51e8c2c,0x802968d9,
  193224. 0xe0161099,0xe7d1a9cd,0xa8a7ea56,0x2b153c89,0x06e3c498,0x6d41b789,
  193225. 0xd6769dcb,0x082bb2e9 },
  193226. { 0xc4d6615f,0x6180ef46,0x01b9829c,0xfc629dc1,0x0fb264ca,0xde222ec0,
  193227. 0x10ecc2c4,0xc5457e06,0x1eea2c4d,0x95ce599f,0x8f9c5b2c,0x0433fa72,
  193228. 0xcd6310f9,0xee035462,0xce2e2253,0x84c57c3b,0x96d87e44,0x6c8ec31a,
  193229. 0xa452c5a7,0x30bfe393,0xa047b235,0xc592b140,0xc018545e,0x7bd8be18,
  193230. 0x5c178c46,0x794e0107,0x2e23005b,0x48471946,0x622a54f3,0x2665e237,
  193231. 0x901c9042,0x36451a46 } },
  193232. /* 164 */
  193233. { { 0x19893e71,0x17802d18,0x539a2082,0xa1765d8b,0x2302ecfc,0xfc6aea01,
  193234. 0x365bf59d,0x8d4cf51b,0x0d232a80,0x87741d72,0x18e80427,0xac343eb3,
  193235. 0xe74739ec,0x553ecb2f,0x1a8b07ca,0xaeca79a8,0x56f4ab3a,0x089ff322,
  193236. 0x3fa1d1f7,0x5e95d729,0xf62a9a16,0x260569ae,0xaa08ddc2,0x5e776232,
  193237. 0x1b7bb54a,0x93fabec3,0x743d56e7,0x48a20956,0xeb0ebeff,0x749cdb12,
  193238. 0x69b8fcf1,0x705307a4 },
  193239. { 0xe488310b,0x7a8e4c04,0x5325cd7b,0x12726e32,0x4983efac,0x5d0fd8b0,
  193240. 0x02ddb913,0x796e552c,0x77b9685c,0x0eeca3f7,0xb15f24a3,0x9b766e89,
  193241. 0x48efc979,0x7c2736d6,0xa8021c6c,0x3d619685,0xa0b2f1ea,0xfe33e278,
  193242. 0xb676d6b0,0x95c69879,0x1af4e0be,0xa0747319,0x36c4ee55,0xa2fab5f1,
  193243. 0x59e5f3b9,0x6938b8ff,0x39cafe6e,0x1e114da4,0x6a6ad120,0xc9595ec3,
  193244. 0x57e62aec,0x80f79bd0 } },
  193245. /* 165 */
  193246. { { 0x60af09b3,0x3cef42a7,0x933dfe14,0x3c016ebd,0xed85eaa8,0x720cf1e0,
  193247. 0xceaa3bc9,0xd4f5e99f,0xb7106f97,0x7216b9d2,0xc9668ad2,0x65f34c36,
  193248. 0x5b0c651f,0xa8fb82bc,0xf2fda4de,0x20f42f1c,0xd21f659e,0xeb31ab2c,
  193249. 0xa13d1618,0xb7a776c7,0x38662be5,0xec441022,0xcad08e0b,0xc825da70,
  193250. 0x022c0180,0x99299079,0x2aef9ffd,0x7623bda0,0xf5c58b50,0xde84f4f3,
  193251. 0xd824ff19,0x5f5a5da4 },
  193252. { 0x7e8311dc,0x5737257e,0x466cf136,0xdef94f51,0xb05ca21a,0xa73e1645,
  193253. 0x02e4ab37,0x38ea9b3c,0x8579165b,0x7760eac9,0xc24b01a4,0xdffdd047,
  193254. 0x3fb95584,0x188d4fd1,0x25548bda,0xfaac38b8,0x59e9dcac,0x1a79a6f0,
  193255. 0x09a2700f,0x983f720f,0xfb8a7e48,0x8cbba554,0x47a1fad5,0x38a19968,
  193256. 0x5abd6b5e,0x11856547,0xf3716ec2,0x75113d31,0x4212907b,0x1391e781,
  193257. 0x0dc15889,0x5319c801 } },
  193258. /* 166 */
  193259. { { 0x6b61c3af,0x2320136e,0x07b4bb68,0x1d40f2de,0x380c97f0,0x651dee7f,
  193260. 0x6a8c313a,0xa978ba70,0x2011ca10,0x22c587d6,0xab1f445b,0x48bba218,
  193261. 0xe50444e6,0x8c5eaf07,0x442fccf9,0x5549f02a,0x3d80493d,0x2564746f,
  193262. 0x79c04591,0x42d24f61,0xabdc8887,0x1600fa18,0xded38f8f,0x5cb8600a,
  193263. 0x923aeb46,0xa4bf9b90,0x1e1c578a,0xd63fee35,0xebb9ea14,0xf3c9c5ac,
  193264. 0xf11a4ff0,0x3d13314d },
  193265. { 0xb4513d1e,0xe5cc662d,0xd55952bd,0xde78a8c5,0xe7f86d0a,0xe8a37a3f,
  193266. 0x7a04f0c5,0xca2d12a4,0x2e25d06c,0x4c6696e4,0xb2136071,0x52614698,
  193267. 0x89f6e1cb,0xf4d2701b,0x80efd95e,0xaafd6177,0xc5bb6907,0xe6d73ac4,
  193268. 0x420db35a,0x49e874ac,0xf2751fa0,0x11631de4,0xa1fa2edd,0xb29f7336,
  193269. 0xb7fd794d,0x4c406864,0xe22f92a6,0x73cb21d3,0x2043cc76,0xeae904e6,
  193270. 0xb322c6ad,0x67f28a9f } },
  193271. /* 167 */
  193272. { { 0xca148ab5,0x7c17b258,0xb3c60051,0xb9a1976f,0xc8f28df9,0xea260698,
  193273. 0xe8d45017,0x87b2cc74,0x0578a422,0x37257329,0x17bec732,0x81d5ee25,
  193274. 0x1d48bbc4,0xd7411fcf,0x487f5cfe,0x46217e6b,0x41eb8e1b,0xcb007ac5,
  193275. 0xe05a00c8,0xc41c57a6,0xd2f9fa99,0x1f954d2b,0x40941cad,0x370bd5db,
  193276. 0x3829509d,0xe487879c,0x5ceca5ee,0x4c137552,0xfd3efb9e,0xe8ef7fa4,
  193277. 0x1bd1bdb2,0x5ff09174 },
  193278. { 0x579c6632,0x791912a4,0xb8a20815,0xbb19a44f,0x535639d3,0xf4f97b84,
  193279. 0xbc3c9bce,0xe57e2bcb,0xf19e6410,0x122b3f2b,0x1357d9ad,0x1f0189da,
  193280. 0x79e5ff66,0x675573bb,0xef2f3c4c,0x444e5c98,0x04d10731,0xd6f61e20,
  193281. 0xac75d635,0x0dfa366f,0x2c854f23,0x9fc47c86,0x0ad0850b,0xc04ae43e,
  193282. 0x2f720c32,0x5ce94f64,0xa753bc9d,0x67efae65,0xb0373a63,0xc27d30d3,
  193283. 0x29721646,0x6681013a } },
  193284. /* 168 */
  193285. { { 0xe84509df,0x1385d913,0xcf339376,0xe978bedd,0x3423a148,0x2df425d3,
  193286. 0xee8cb579,0x43fa0ae3,0x31c4553c,0xf015369d,0xdfbf1d48,0x05cf08bb,
  193287. 0x9444244a,0xadff4be6,0xa35dda33,0x01635f81,0xe76fab7c,0x085c8949,
  193288. 0x16737783,0x4bd7fcde,0xa254f8d2,0xfd8cb52c,0x413ec985,0x62168a66,
  193289. 0x7a9026cc,0xf2db9741,0x50e1e1b7,0x3962ee56,0xd3beffde,0xbee0a346,
  193290. 0x0bdfab1f,0x3b35b72f },
  193291. { 0x535c3749,0xbff8de9f,0x8add9c48,0x23c1f20f,0xc8f8f663,0xa975b37b,
  193292. 0xe8f3ae49,0x2529e475,0x1d5e2628,0xc32f10d5,0x67862f1d,0x5ac0d297,
  193293. 0x854cbe36,0x13c79338,0x4b67e462,0x48f004ef,0xe5d10ee1,0xfa37a150,
  193294. 0xd28288a0,0x4974778d,0xcfb73f4d,0x96830a66,0x07804952,0x9f444013,
  193295. 0x9760b694,0x8233c709,0x25b75c99,0x8340cca5,0xc771f99c,0x3f62e40b,
  193296. 0xcd95c685,0x47d0a1eb } },
  193297. /* 169 */
  193298. { { 0x652811f1,0x266f4fff,0x62ef3002,0xeaacaa93,0x50cba0ca,0x6c387a55,
  193299. 0x007f5467,0xa350142a,0x202f2673,0xc7fd102a,0x33dc6e65,0x5daee570,
  193300. 0x064a63d9,0x60682ec3,0x462b251e,0x46cf0bb0,0x5da936e7,0x0e030ca5,
  193301. 0x434265b5,0xc87a60f2,0x69b4e8f5,0x9637b2bb,0x7ad7770a,0x601fb58c,
  193302. 0xed3a15a6,0x1f2147f6,0x2995e961,0x05b47d5e,0x83213a16,0xcb0ca9b3,
  193303. 0x4995a85c,0x8f4b614a },
  193304. { 0x4b4eb3c1,0x5aa8ec19,0x20323a70,0x8c549ac4,0x4f6cc6aa,0x00d49322,
  193305. 0x45f9a5a3,0x0e53b9bb,0x0897abbb,0xe46ef110,0xd7acd7d0,0xfe873e57,
  193306. 0x0f7cb588,0x7cfccfe5,0xc85557d1,0x0ea53d65,0x7288f2e2,0xfdd9eb44,
  193307. 0xc0eb68a8,0xab2dedfa,0x08603a0c,0x58221470,0x00feb06c,0x69464689,
  193308. 0x25e5caac,0x804cf5bf,0x9fc91ae9,0xd8559858,0x73c45eae,0xed9378b1,
  193309. 0x524c9801,0x8f942d02 } },
  193310. /* 170 */
  193311. { { 0x8e845808,0x1f1ec302,0xb77abfc5,0xc302bffa,0xf8d97dc7,0x26afd4b9,
  193312. 0x3aac594b,0x3d3a83c4,0x674d94dc,0xe3b74bd1,0xcaa5911c,0x4464b737,
  193313. 0x871c2cd2,0x62925773,0x3b4440fe,0x419f2485,0xe052ad7d,0xdda6a0f3,
  193314. 0x846c86c0,0x645280d6,0xf8324f42,0xa25689fa,0x07cf117a,0xc74ad1e8,
  193315. 0x8ddc9db7,0x5626dea0,0x966fc85d,0x52620373,0xf3b1eb53,0xe0ad57c3,
  193316. 0x949c1acb,0x38300252 },
  193317. { 0x5e744723,0xa0ef5a40,0x1ae08481,0xdb5bcf75,0xfec1f76f,0xabfad8cc,
  193318. 0xfab37fc6,0xfba5d831,0xc8fedb78,0xbe39e248,0xad93f310,0xa5cfad5f,
  193319. 0x913d5c24,0x747fdb1e,0x4518b7f5,0x052a47c9,0x7cfb4327,0x9e208d6c,
  193320. 0x70e538be,0xb135cb9c,0x5bb17916,0x36352759,0x5b3106c7,0xa2c07880,
  193321. 0xc209bb06,0xd2d42a06,0xd3c504ad,0xb525b471,0x822ce034,0xc9f4b368,
  193322. 0xeb4185a5,0x15f18796 } },
  193323. /* 171 */
  193324. { { 0x0aee4684,0x094dea06,0x7cdbdbc8,0x42b21f06,0xb1931319,0xa439e149,
  193325. 0x81a7dba6,0xea4bdd41,0x3c2ae80f,0xc6213706,0x12823dc2,0xb58b0967,
  193326. 0x832611b1,0x7443d515,0x13c20384,0x2e16f831,0x2bd992d2,0x0ce204d6,
  193327. 0xf419388b,0x499dbcd6,0x1d3778c7,0x492ded1d,0xc5ddae73,0x9d5bd74f,
  193328. 0x994b6259,0xd4813d52,0x0e86ca68,0x191d9cf6,0xf3e9c2ac,0x562179ea,
  193329. 0x9fee1238,0x6146f1f3 },
  193330. { 0x078e2aa6,0xbd06d33e,0x9dee9265,0x693af7f7,0xdaa40e84,0xd56e0f81,
  193331. 0x9b9a407e,0x05fbbb88,0xede99519,0xdcf44adc,0x092dba39,0x7f71f8d3,
  193332. 0x4231774b,0x675b5da5,0xa5f605eb,0x7456a251,0x87a39a9e,0x9031d4af,
  193333. 0x05b474bd,0xdb430006,0xb665aa91,0xbda5dbf2,0x6631eeb4,0x5d1a3df5,
  193334. 0x62377c58,0x028149ef,0x685d0bff,0x2e1af4e9,0x82a465de,0xe0ea0875,
  193335. 0x06bd0050,0x95543f9e } },
  193336. /* 172 */
  193337. { { 0x85d7c6ef,0xf7cbc6f4,0x63b1bc24,0xcad8084d,0xbf8cba62,0xdf90ce88,
  193338. 0xb455c192,0x98e4b686,0x774fc6ed,0x6146b8d5,0x7ae20077,0x70e2389e,
  193339. 0x61c22529,0x5241c479,0x3884e5f5,0x7d221510,0x17e28273,0xd6d20ce2,
  193340. 0x4f2674f8,0xe3119f51,0x70c011db,0x85459055,0xfcfb760e,0xdfab75d9,
  193341. 0x9e8c2a19,0x9546362a,0x4a7d4b27,0x4b6d3f8a,0xee5d698c,0xa5c87104,
  193342. 0x2ba296ff,0x6db43478 },
  193343. { 0x5c3f0d95,0x06486493,0x4e748895,0x8917db82,0x6b2f3e44,0xf73fdf62,
  193344. 0x2b7f574b,0xc60edc54,0xaf732723,0xbe1c09a2,0x7cad114c,0x7d34669d,
  193345. 0x321aaff9,0x9646600a,0xed0cd61c,0xb94e2bba,0xdec4750e,0x866e1a41,
  193346. 0xb1a89f58,0xa1be990d,0xf2759693,0xc39e4d6c,0xc0e0dddf,0x11cfb780,
  193347. 0xd99c8a41,0xf0afcd7f,0x6e1c3050,0xcebffadb,0x96d2c6e4,0x4f3981b0,
  193348. 0x2ae27a94,0x07a791e7 } },
  193349. /* 173 */
  193350. { { 0x1e9f0300,0xe70e9047,0xbccdf904,0xe0253ad9,0xff053078,0x51c0289d,
  193351. 0xae893462,0xf1ef092e,0xa4846845,0x2c90a91a,0xf1dad4b4,0x1946eda0,
  193352. 0x33df67b2,0xf07650f3,0x0b15a014,0xc6e988db,0xb542f0f9,0x72e0c66e,
  193353. 0xe0c0378f,0x5d4b6311,0xae86950d,0x548badaa,0xb35f1c8f,0x6801638d,
  193354. 0x944d1ad4,0x129e3216,0x40471d32,0x9951bac8,0x85e94dde,0x03cc29f3,
  193355. 0x4543ecac,0x6d6acc2e },
  193356. { 0x57b2d299,0xeb999e95,0xe3d721cd,0x3a2bcd9b,0xbb4cb444,0x2e60384f,
  193357. 0xdc060faa,0xae177709,0x8c987cde,0x74f0e6d3,0x1076fbed,0x9a237cf8,
  193358. 0x7983fbff,0x69af1513,0x323f9584,0x6c3f7a1d,0x6db64398,0x3e21cacf,
  193359. 0x96703d92,0x7cd8134f,0xb8393f76,0x0755898f,0x2e825222,0x1b5b28bc,
  193360. 0x7924aa7c,0xb78799c1,0x81427a8a,0x1db378f2,0xff289492,0xd5a451b1,
  193361. 0x3d3c46ee,0x79d18212 } },
  193362. /* 174 */
  193363. { { 0x109d5589,0x1a3edff9,0x029b4499,0xded52eb4,0xb4b54adf,0x13eb9d30,
  193364. 0xa27bff67,0x4f9214c1,0x67f0f460,0x4c817ee7,0xc3a50e28,0xbadf8d83,
  193365. 0x94026237,0xc5dc03c9,0x966647c1,0x5f29581b,0x8a0687f3,0x10b6a089,
  193366. 0x31634517,0xae787cec,0x62e75188,0x2001dba5,0x45e2c3fb,0x55d4e1a7,
  193367. 0xb67d3395,0xbfcacdeb,0xbc6842ee,0xa1a0af9c,0x3e88580b,0x50590a2b,
  193368. 0xa784cdc8,0x73104491 },
  193369. { 0x2648d676,0x44ca2cdf,0x4f1b12b1,0x9a85eca5,0x2980e1eb,0x1b9dac94,
  193370. 0x1ac8aa89,0xf30d3709,0xc719e195,0x73072ab7,0x2f703797,0xba518c82,
  193371. 0xac0067f6,0xac090e14,0x8dcd2927,0x0e6cfc70,0x21e7da63,0x4f5889e2,
  193372. 0x8371c7c6,0xb4aaa40b,0x8f7878c9,0x1f9dabe2,0xd84caf3f,0xf78aed6b,
  193373. 0x9e0e1d92,0x3c39dd07,0x122424dc,0x680be5fb,0x0bdc0099,0xf41b214d,
  193374. 0x5180c54f,0x6a8f8fc9 } },
  193375. /* 175 */
  193376. { { 0x53235132,0x62a1ed63,0x59dba88b,0x1db233f1,0x291efdd8,0x85625452,
  193377. 0xb25111ae,0xc7505297,0x1d701bd8,0xb5921af9,0x9774f45d,0xb4d05d72,
  193378. 0xf18e73ff,0x6e3d4c5e,0x899b3038,0x897d985f,0xc89b1558,0x8a9c30fb,
  193379. 0x4d13181c,0x3c92d1a3,0x2223320e,0x292e86ba,0x01ceed02,0xcf2454c2,
  193380. 0x583f309f,0x27a45f74,0xad0fd1a3,0x75a6102c,0xcb9c7538,0xdb4f45d2,
  193381. 0xdb283fd7,0x4752d8c1 },
  193382. { 0xd5dff4d5,0x514d6cea,0x45a827f4,0x74cd5fdb,0x4fc7135e,0x1070a60c,
  193383. 0x1be5778e,0xdec0bb78,0x58dc6b08,0x271e12cd,0x54bc2496,0xb765089b,
  193384. 0x619098ac,0x6ddf2c63,0x67528832,0xfd6ebac6,0xc2508af1,0xeaa2d025,
  193385. 0x4dcfc1f0,0x13c2cda8,0x45510be0,0x1c7836a8,0x1a886801,0x3904688d,
  193386. 0xafaf2545,0x643132aa,0x2830a88d,0x49685577,0x8744b470,0x569491ca,
  193387. 0x75fb8552,0x3a6518f3 } },
  193388. /* 176 */
  193389. { { 0x224042a0,0xaaa8ed50,0x2452f1e6,0x6cb4e3b0,0x768211d8,0xedca5f4c,
  193390. 0xef4d5d3f,0x4e0fe3f9,0x522d46e5,0x33a8e2a4,0xf1446775,0x5998e21f,
  193391. 0xf592d01b,0x1496c50e,0x83a67739,0x69104c2f,0x472bbf00,0x28670bcb,
  193392. 0x503177bd,0x8ea883b2,0x7d2712a2,0xc5d8bc05,0xb439c994,0x41ef9317,
  193393. 0xdcda1aff,0x9801d3a8,0x7038f6fb,0xd686eeb5,0xfbfbf820,0xe80c5cd0,
  193394. 0xedc25817,0x540ac363 },
  193395. { 0xfe7f43df,0xa71969a9,0x2c1b9e4c,0xe6653808,0x859c2917,0xad9677d8,
  193396. 0x96aa4404,0xbaca9545,0xff1297da,0x0e9d855f,0x22aea7de,0x1f61897b,
  193397. 0x36f13f8e,0x96edccfd,0x16e200df,0x627d3070,0xc98988a4,0x729f0736,
  193398. 0x97f231d2,0x95e25e60,0xf6048752,0xaf7f221b,0x4019b299,0xd6682609,
  193399. 0x26b4b1d9,0x1d99de09,0x1acdd7a3,0xec47cf66,0x6ebe15e9,0x4de9f2b3,
  193400. 0xfa16974f,0x17db32ec } },
  193401. /* 177 */
  193402. { { 0x6cf40599,0x75ef6919,0x00c020ea,0x7ea10dfb,0xfcaaf679,0x3da5ae7b,
  193403. 0x88ddd678,0x0d663ca3,0x255bcfcd,0x5a21f8fe,0xe344bc7e,0xe9c3f538,
  193404. 0x548e0632,0x35f62b1d,0x43c6e64d,0x654f2425,0x26993627,0xc755a7a6,
  193405. 0xb0f41324,0xa3b7c5f7,0x3a2180f3,0x05697f79,0x1e81675b,0x6cf85fb1,
  193406. 0xe53428f5,0x6d3cdb35,0x52d28b02,0xe3aa1591,0xf7a3fb78,0xa8470255,
  193407. 0xa194445d,0x460bd01b },
  193408. { 0xc24d8077,0xbc34dc23,0x4c720d2c,0x82f4b580,0x6f5d1ffe,0xa29da911,
  193409. 0x92783ce2,0x578af520,0xb5904af3,0xe29f51ab,0xf7aa1190,0x46c570d7,
  193410. 0x571bddf0,0x4a522fba,0xae89bb51,0xbf4e2a06,0x59f3444d,0x799b35cc,
  193411. 0x26cc2557,0xc3028367,0xafcec177,0x94a4e985,0x7c36cbd0,0xadaf7dcb,
  193412. 0x75d39077,0xed31b787,0x2d3e24bc,0x52d6904f,0x1f95421b,0xc5ca2669,
  193413. 0x1734878d,0x7d342c3c } },
  193414. /* 178 */
  193415. { { 0x11fd127f,0xe5cf2c0a,0x119e4c5e,0x66d36bb8,0x6ef56ac3,0x621ab252,
  193416. 0xe5430675,0x30cfeaee,0xac3e9619,0x2ede27d2,0xf8fce671,0x6413513a,
  193417. 0x075f4c3d,0x6159c61b,0x59069d98,0xd447efe9,0xea76aea9,0xaf8d6f68,
  193418. 0x0f5bd164,0xac5dc61b,0x1e88bb98,0xdbab446e,0x1ba92320,0x618b8b16,
  193419. 0x78989865,0xa0eafb3c,0xc08b7e82,0x0c7abcc2,0x20d160bb,0x10f09b6e,
  193420. 0x8e4c63a7,0x5be0afa6 },
  193421. { 0x1bbbf49c,0x82ab6d38,0x8c0703fe,0x3e09ce49,0xe10f4263,0xeca58b5d,
  193422. 0xda5a4532,0xd9cc6581,0xf618f7b7,0x07e18876,0x250f7fe7,0x0419a5e3,
  193423. 0xde6b86be,0xbb1a9e90,0x37359169,0x584a7deb,0x5149db2c,0x38eb3489,
  193424. 0xb0ebabb8,0x14546a33,0xc2f88a92,0x0067f0b0,0x0a2db019,0xbde0dfe7,
  193425. 0xc63e6f3e,0xba51b06c,0xe9206fad,0xa19127b9,0xfe80dc0a,0xe4eb5e87,
  193426. 0xd4de30ae,0x1e6fccf5 } },
  193427. /* 179 */
  193428. { { 0xaa8ac924,0xb57dff66,0xc298b3e8,0x06e9ad31,0x65fb080c,0xd140e329,
  193429. 0x1d95c93f,0x7dab211d,0x8a180caa,0x6d68d842,0xa20ded69,0x1a929408,
  193430. 0x38df461f,0xa8151753,0x60eae932,0xff5604ae,0x7dae4c0b,0x901b9e49,
  193431. 0xde262e89,0x4573a97f,0xf1084983,0xed69d9a4,0x64724f1d,0x8ffa022f,
  193432. 0xea85a15f,0xd5f1c2e4,0x01453794,0x4c626ce9,0xbf0907dd,0x80440cd6,
  193433. 0x5ddaa837,0x4522d461 },
  193434. { 0xebfbe7c5,0x8895f079,0x84ef3446,0x30ea1ded,0xd4a1ab96,0x716a9eb6,
  193435. 0x50a30c68,0x1a4a5d22,0x0043bbaa,0x5a16631c,0x5010e5f5,0xbd107502,
  193436. 0x3d8c0556,0xbffe3e9d,0x07772419,0x31b30b18,0x84b82297,0x90ff7ef0,
  193437. 0xf21a18c3,0x00c37d75,0x565bb8f8,0x18d0a635,0x45e3bceb,0xbac1da2a,
  193438. 0x23f0b08d,0x1c38e90c,0x5fbc5ac5,0xf1ba1aa2,0xdda71fc6,0x09d5256b,
  193439. 0x6d7e40ba,0x346501a9 } },
  193440. /* 180 */
  193441. { { 0xcc2b0f1d,0x86be448c,0xac4c3703,0xe3eb45c9,0x9fc96bbf,0x5387f65d,
  193442. 0x5ae27fda,0xcef3c4e9,0x1bc18089,0xa008f776,0x22ca18a1,0xf374a084,
  193443. 0x53b73371,0xee882842,0x7cc09354,0xcb6fc6d8,0x61496d6b,0x8489ec1b,
  193444. 0x49e325c4,0xa92c29b9,0x7bdec166,0x15c6ca52,0xdcea2813,0x95444eee,
  193445. 0x3a21154f,0x34683eb3,0xd39061cf,0x8fb26f98,0x06c940bb,0xc3b08aa8,
  193446. 0xe554c96d,0x7c1d42cf },
  193447. { 0xdc110aa7,0x766e703f,0xf362e378,0xab7b79d7,0x5aadca3c,0xd259c75d,
  193448. 0x60be3373,0x2a6eca79,0x06c4e8ff,0xf4744a4b,0xf3b705bf,0xb2842cce,
  193449. 0xae304b53,0x1a3af5aa,0x1b2d31b8,0x7bbfa201,0x4bee88d9,0xc4ba6eba,
  193450. 0x565cb839,0x2d3565ce,0xdaf7ece8,0x24808696,0xe6959745,0x2c7ccce7,
  193451. 0xe94f9837,0xefd6eb3c,0x3811a326,0x0a33b4cf,0xfffa93a6,0x14203f43,
  193452. 0x73c31d90,0x031e9828 } },
  193453. /* 181 */
  193454. { { 0x765a17ff,0x4fefecfc,0xd1290a65,0xa09f3888,0x938da038,0xbf265c46,
  193455. 0xa169ad46,0x4bb6145d,0x23a62fe8,0x33cf8214,0xabc860a5,0x562df571,
  193456. 0x815c38c4,0xbf2a90fa,0x17eda875,0x45ba1d6e,0x946fa5e1,0x799d881a,
  193457. 0xb90f5a3b,0x6c1be784,0xb10ff52a,0x0910a37c,0xa4f4fd36,0xc38c1fe4,
  193458. 0x8e2d3ba0,0xc3180fc5,0xb17a6187,0x3e2ff050,0x943a35c2,0x3a00059b,
  193459. 0xa28cc51c,0x494d3645 },
  193460. { 0x4ba021f8,0x398426b6,0x796deb6c,0xd14c9083,0x7e36c762,0x6d2e5395,
  193461. 0x751cf216,0x8f556eca,0x19b24a19,0xdaca1e00,0x4b20c2ae,0x47887da4,
  193462. 0xff41a733,0x93ed4ccd,0x5c7c0cd7,0x8d717c44,0x91bf7009,0xcc48634a,
  193463. 0x3b59bbaf,0xa1f146f9,0xe5624f15,0xdd38bb39,0x303f8443,0x96d41aad,
  193464. 0x4bf104fc,0x6b670f03,0x29706582,0x0503f9ed,0xb34200f5,0x768e1f47,
  193465. 0xbbd4c6f3,0x3cfdcc5e } },
  193466. /* 182 */
  193467. { { 0xb523e13d,0x536c2a86,0x2920d0a0,0x1014a458,0xe7571296,0x3d52b478,
  193468. 0x7eb51bea,0x05746066,0x87b0e919,0x709f7861,0x686888e8,0x028aed88,
  193469. 0xd94afcd4,0x79a809d7,0xe2129af3,0x50c6032f,0x983c4082,0x75e4be72,
  193470. 0x7ab3be8e,0x98331bbb,0xb618c728,0xd31a032c,0x3f59c4a4,0x36dd85a1,
  193471. 0xed4f61e2,0xdbece345,0x1e571715,0xba7aaccd,0x64a1ebd7,0x138c58da,
  193472. 0x3d1aeea1,0x89296d0f },
  193473. { 0xcca82c97,0xb165288f,0x1427e8dc,0x26c6c12d,0x4c3edda9,0x66a94f07,
  193474. 0xeaa01ebe,0x94600e1e,0x30f5e86d,0x14abce7c,0xcb456a31,0x741d7020,
  193475. 0x279f42c2,0xab05aa13,0xd4238468,0x70b60faf,0x318d39e6,0xa18efec1,
  193476. 0x8920b318,0xeb07f1ac,0xd8399e03,0x01e3cba8,0x3c81a301,0x65f8932e,
  193477. 0xccc667d8,0xae8bca7d,0xa268607c,0xcee1ae79,0xcac0a12c,0x3182e64c,
  193478. 0x2b1a4c54,0x9233a2f7 } },
  193479. /* 183 */
  193480. { { 0x0acbee17,0x717e8df6,0x5c24fcdc,0x0f0959c2,0xe54ffcb0,0x46f09887,
  193481. 0xd285116b,0xb993deca,0xbba1fa51,0x0bfaa4f8,0xd0f2183e,0x9c9249ef,
  193482. 0x96847779,0xf93cb358,0x2322d421,0x284bfb7f,0xd42af009,0x40cc709a,
  193483. 0x9bb1d615,0xc69f2274,0x717c3c6a,0x76f50b3a,0xbb9c5eeb,0x8b21e985,
  193484. 0xa4783b5f,0x58fb19ae,0x52e1c3e7,0x04c86b9b,0xf2971ac8,0xaca59092,
  193485. 0x21ed8291,0x2bb26a69 },
  193486. { 0x15f81416,0x98a34435,0xaaff5bb4,0x086e72e7,0x0317261c,0x3d1f64de,
  193487. 0x5c0a1cfe,0x31c0786c,0xb3683401,0x542ea4d8,0x1a39b4cd,0x2f77273a,
  193488. 0xcbef27f1,0x14fe7ee1,0x16bb27dc,0xee7fc09e,0x410e5dc7,0xc0dccc17,
  193489. 0x1943b3dd,0xa3466742,0x3f31c1b7,0x92934b60,0xc22c1070,0x0186ded9,
  193490. 0x799f966b,0xa37ee8ba,0x249b0893,0x0f3bfcb4,0x2e92d4de,0xbae61447,
  193491. 0xe196eb08,0x937cb3f8 } },
  193492. /* 184 */
  193493. { { 0x16fbfdce,0x57c0e77c,0xc98d4cc0,0xea034cc9,0x42572d20,0xe7606d72,
  193494. 0x0019a83c,0x9861b55c,0xf1597162,0x80ba2803,0x05a0fd7b,0x0f4141dd,
  193495. 0x4b0daaa2,0x8865913b,0xaa3848ec,0xe6685746,0x3e0485d2,0x16d15a5a,
  193496. 0x3b6905dd,0x81c0c774,0x818af2ba,0xcec31b7d,0xd2b74b78,0x80d8f194,
  193497. 0x543e2f28,0xca659db2,0x9fb07c1c,0x31b83a7d,0x1f1048c0,0x86537fdc,
  193498. 0x78586a11,0x4d57bb07 },
  193499. { 0x53b396b6,0xbc4b768a,0x93b51dac,0xbc8b24c4,0xa30ae1b3,0x33e511eb,
  193500. 0x945147c5,0x893bbd95,0x179fe3ce,0x6cc86031,0x3f920bd4,0x34b0a167,
  193501. 0x6b256160,0xb32912eb,0x9d168d83,0xbc69a2a4,0xef0dd128,0xb4949e7a,
  193502. 0x872699e1,0x2613419a,0xbf21376b,0x06c58477,0xa4f97147,0xe55b1909,
  193503. 0x7b9b745f,0x63d6eb75,0x08df3c85,0xb5365b29,0x55fcfae3,0x0e257e43,
  193504. 0x979f2aa8,0x1067c118 } },
  193505. /* 185 */
  193506. { { 0x32bf8883,0xc8455084,0x6fd06667,0x4755286a,0x77c2335d,0xd70b0f8f,
  193507. 0x2f4a2c94,0x678e60da,0xd118acf5,0xa468d8ac,0xbf5b90d9,0xce93830b,
  193508. 0xed4e9104,0xea4b1c74,0x27776ea4,0xac67316d,0x361bab12,0xb98ad75c,
  193509. 0x99122451,0xc323d482,0x530a43ae,0x26440220,0x3292d5a5,0x3a44532e,
  193510. 0x5fecf1bc,0xdb48694b,0xc667b8b8,0xe4e0516e,0xa4306ade,0xb3aa595f,
  193511. 0xf34e9725,0x7e4f7091 },
  193512. { 0xb7f70919,0x3f3816e9,0x16b003f5,0x765216ed,0x778c99e5,0x46c6cff4,
  193513. 0x30a51810,0xe6a5abe8,0x45e728db,0xef6f49e6,0xcaccefd6,0x6fdd73ea,
  193514. 0x8c37f3f7,0xec394e6f,0xb6407fc3,0x73320802,0x96625cbd,0x988e8f7a,
  193515. 0x7cabfb00,0x83292363,0x407f359a,0x258ba9df,0xccbfae50,0xff01aee5,
  193516. 0xfe251813,0xfbeaeace,0x83f1cba1,0x9c69f161,0x9eadcdb5,0x512c58ad,
  193517. 0x6ccce8bd,0x2ae49cd4 } },
  193518. /* 186 */
  193519. { { 0xc40849f2,0x1239b0e3,0xa441098c,0x5136a4cd,0xe547f649,0x61535a99,
  193520. 0x7a9bbac6,0x92e4bdc4,0x53547af6,0x195a1646,0x8b47a74a,0x85ecb319,
  193521. 0x9de6a2b2,0x278553fc,0x0e2ba52d,0x471c038a,0x35bcba93,0x12ba1b88,
  193522. 0x6f31eca2,0xd4bf50da,0x802b32c6,0xd146e3f6,0x3c64c8c4,0x0c9c0131,
  193523. 0xeed21297,0xad30f12d,0x9c68530f,0x9b75bffb,0x8918de51,0x23c0ad3e,
  193524. 0xa73771b7,0x180e9d52 },
  193525. { 0x29ab77b0,0xc316542f,0xf7aee628,0xdd411d9c,0x353c2f40,0x044c0685,
  193526. 0x4b0ae4cf,0x638dc7e4,0x95fc266f,0xa0924185,0xfd2feb7d,0x639da671,
  193527. 0x5ea39798,0x56858ed5,0x58f3832a,0x7a694f31,0xd316d831,0xa94233c6,
  193528. 0x30a35a7b,0x2fcacb26,0xf1ff713b,0xfef8f7dd,0x59eee2f3,0x8b9b4525,
  193529. 0x156d064a,0xd1b4f91b,0x2f5cfcfc,0x177866c2,0x3777eb41,0x12bc2566,
  193530. 0xd8ab85b4,0x21ca6f3c } },
  193531. /* 187 */
  193532. { { 0xa3e66635,0x0e162b13,0x2a9f76af,0x1ef20a2b,0x46db3356,0xab473a30,
  193533. 0x7802bb8d,0x0840bd77,0xa699b44c,0x5b6baf5e,0x1b2207f1,0xc6e11900,
  193534. 0x790b0105,0xe5de16a9,0xdb67f004,0x22b12f15,0x8a025d25,0x185fad45,
  193535. 0xdf0a1142,0xbccf6953,0xf45034c0,0x4c42129b,0x1c277bff,0x0f740400,
  193536. 0x280a9e18,0x6e440b4c,0x842aa2b4,0x767de8f5,0x05e8d94f,0x3de20ab8,
  193537. 0x20227635,0x5aff5859 },
  193538. { 0xa8458e40,0x805acd20,0x149732bd,0x5a5557d8,0x5f1ca72d,0xc7074131,
  193539. 0x952b5323,0x7f2e269c,0x6494fadf,0x5c592556,0x1a7d2666,0x153b7acd,
  193540. 0x86fe2865,0xa6df063d,0x57d53b6b,0x1e91db13,0xe93ead01,0x9195bb89,
  193541. 0x2963bfe6,0x3d71e1af,0x88278886,0xfab2b9c2,0x3b859b6f,0x77836692,
  193542. 0xf7029dd1,0x6e695174,0x7b984561,0xc7987876,0x5907d849,0x64fb4f1d,
  193543. 0x88d8a977,0x3eab7e1c } },
  193544. /* 188 */
  193545. { { 0x52e5718b,0xc73a94b6,0xf4cee1e9,0xe3aefa54,0x553eedea,0x654e9e63,
  193546. 0x5f3aca1a,0xf2541e1b,0x0d083316,0xd7129489,0xfb7f950e,0x7965af63,
  193547. 0xc74e3e4a,0xd8fc9e0d,0xeaf79ebc,0xb4ee48d2,0x8b7787e6,0xa458a86a,
  193548. 0xf7cceaf0,0xd8c7621f,0xdf67980d,0x8228eeff,0xf9106727,0x210d4742,
  193549. 0xb07e3629,0x91f63501,0x7971e29d,0x441761c6,0x03a3b8a5,0xc0ccc65f,
  193550. 0x38e09544,0x3491da4f },
  193551. { 0xcb062eae,0x6706d046,0x5d08776d,0xee7db735,0x292315d2,0x80de8052,
  193552. 0xc402bbdb,0x40785662,0x26ed3337,0x5f93525c,0x7d568ed3,0x6cea14d6,
  193553. 0x66888b1e,0x916a1189,0x5dc71675,0x0fbd5205,0xe4575df2,0x833d1077,
  193554. 0xec092335,0x4e93100a,0x6cd85389,0x2f9e1d01,0x43226368,0xeebd3725,
  193555. 0x1ba4cfd7,0x401d172b,0x574c5838,0x377dab9d,0x80d517de,0xaeaa6958,
  193556. 0x6ad15a18,0x0c843dfd } },
  193557. /* 189 */
  193558. { { 0xc9373300,0x455811ff,0x99fdc300,0x1c39332a,0x353cb655,0xe19bb81c,
  193559. 0x96a83d27,0x774b924a,0xb2ee3f1a,0xcbfc8fcb,0x010d56c7,0xaf278ec4,
  193560. 0xe0abaf79,0x6fde682f,0x7339aebf,0x7566d072,0x71205db6,0xbd35ad5d,
  193561. 0x7051c9d0,0xb5bbe694,0xd3a3067c,0x577db480,0x572d7530,0x2c70ff54,
  193562. 0xe06d853d,0xe8615aec,0x05abfb5d,0x71999ccb,0xea0a8ed7,0xeeefc96b,
  193563. 0x35f6df69,0x2dcc469d },
  193564. { 0xc65f0e77,0xcca6cd06,0xbd71b14a,0xddcc7980,0x3c93cc00,0xb6221f8b,
  193565. 0xae8cbf57,0xddfcd5b3,0x76f8e63f,0xbc92973f,0x06e132b7,0xe9848a34,
  193566. 0xd51ec9e2,0x4cc59a03,0x3a33081a,0x9c9d32bb,0x80e8466b,0x00121052,
  193567. 0x1bbe7295,0xc2b0032a,0x24938448,0xdbfc6572,0xb6bba0ff,0xe972a0ce,
  193568. 0xc0a94802,0xf60c0a4f,0x599d8bc7,0xf62c41cc,0x312da0b8,0x820c96ee,
  193569. 0xcdbdf9fc,0x5a1a65db } },
  193570. /* 190 */
  193571. { { 0x42485684,0xbfba691a,0x29c470c9,0x613116b9,0xe62a0519,0xb4b01971,
  193572. 0x5ff499da,0xf3245aa6,0xa5238eff,0xc2ef87f4,0xcc9d5515,0xc16dc6ba,
  193573. 0x2dbdacac,0x5a7f227e,0xa9bbaecb,0x8dedaac4,0x2e7c9885,0xff308a6d,
  193574. 0xe6895593,0x4c6f2fc2,0x177e0611,0x3655f285,0x300b1bee,0xa63e8d06,
  193575. 0x13c17b54,0xbed0ce79,0xc4974262,0xca4abe35,0xbc4e4037,0xf4b44a17,
  193576. 0xefe5fbd9,0x5ae95099 },
  193577. { 0x804f7455,0x122e5ee7,0x22066682,0x341a4997,0x7795e333,0x97d24c31,
  193578. 0xe48efced,0x12f4123c,0x19fbc21c,0xe8738d92,0x0663a3ae,0xbb3bdc61,
  193579. 0x8593a6db,0x3603d8c2,0xe3c1ac75,0x926227f2,0x5eaae519,0xfea92ac0,
  193580. 0xfd6812ac,0x5b596f0b,0xfc2a82dc,0x3ce7e844,0x63522b27,0x3840481a,
  193581. 0x52867895,0x836088b1,0x26588688,0x21ffb7cc,0x2f4a7cac,0x0ca33161,
  193582. 0xa3edd298,0x4110667e } },
  193583. /* 191 */
  193584. { { 0xc2d04b63,0x81830357,0xf4929a18,0x3fc5a34d,0x22d195df,0xc73bf6da,
  193585. 0xcb432473,0x14df2f89,0xe997f138,0x345afe5c,0x8b9604f4,0xd8e3f5f9,
  193586. 0x50c10ae5,0xad7942e9,0xeed25ff3,0xcefd5447,0x0e73c0cc,0xbf68e51e,
  193587. 0xab54fa4c,0x5b1ad591,0x12b61c8c,0x8bbc1105,0xb5abf760,0xbb932913,
  193588. 0x01e79649,0xdb1231be,0x040ccbe7,0xd0a83e91,0x90a96db9,0x3dde426f,
  193589. 0x34df11ea,0x1cceb645 },
  193590. { 0x0c6d0f55,0x2d210c4f,0x9c673c9d,0x6cadf61b,0xa9ce3fbb,0xdd7f9919,
  193591. 0x93b063e4,0x135f494c,0x145a93be,0x580bdb3c,0x0f52ef7c,0x4d872332,
  193592. 0x8814bb6a,0x74d876e8,0xc7a97dee,0x4f6f723a,0x3e3cd833,0x7de2b8f0,
  193593. 0xae720270,0x6162f082,0xddfa486e,0xe88ec2d4,0x8d3a17c6,0xd965c859,
  193594. 0x3980171a,0x62e59e54,0xbbef6b22,0x0ab6285d,0x4d48b203,0x3cf45195,
  193595. 0x4ea25ea3,0x1f175233 } },
  193596. /* 192 */
  193597. { { 0x3467ea91,0x808a765b,0xfd2d9c45,0x3f4632ee,0x9cf2bc6f,0x7b75dc6d,
  193598. 0x359813ae,0xefc8d240,0xe44cbd8d,0x23ecb209,0x21525622,0x59ba10e3,
  193599. 0x3f1ee19a,0xfa14d934,0xfb0c48f7,0xdf97c21b,0xea30d437,0xc4e62890,
  193600. 0x651475c2,0xb286e2a4,0x126672a5,0x291f01e4,0x31aab3b8,0x9c6fda5c,
  193601. 0xe17d22ec,0xb7277a5a,0x914f0bad,0xbd88ed83,0x6a2392e1,0xd0b05d1b,
  193602. 0x65893c2b,0x4cb8af90 },
  193603. { 0xbb4b1953,0xa2b02057,0xf597f6ee,0x4ce08b44,0x5e6412c8,0x854f5d9b,
  193604. 0xb3cd4919,0x1913262d,0x6e42bb5d,0x902762e4,0xd78e7f60,0x8355c8e6,
  193605. 0x38b6c16c,0x8efaa824,0xe550f618,0xd0173790,0xe57d778e,0x118af462,
  193606. 0x715b4714,0xa16ad5e8,0x41dea4f9,0x900596c3,0x280ca610,0x2a957c32,
  193607. 0x374c65a1,0x2faee800,0x50080414,0xdb105127,0xff080fa1,0x8c1db931,
  193608. 0xd79878fc,0x486a5c25 } },
  193609. /* 193 */
  193610. { { 0x941b4f36,0x0521e213,0xf803b4f9,0xbaacfb14,0x52a54ba8,0xfdf1e22e,
  193611. 0x8fe4796c,0xacfabbba,0x58dbacb6,0xae0788db,0xc19dfa51,0xdf98d736,
  193612. 0x35a716ee,0x155c286a,0x9c86461b,0xbe7d4676,0x63a64a5e,0x50b6380f,
  193613. 0x9f609262,0x14b41914,0xa2dfc5b3,0x0919a7d0,0xcef466ac,0xc454da55,
  193614. 0x6986aaec,0x93fa4a24,0x71a49ced,0x5090b171,0xc1fa75ad,0x602f1d6c,
  193615. 0x78e4c054,0x5d269f89 },
  193616. { 0x14920419,0x3a74030c,0x90968739,0x0845d868,0xeeb70fa6,0x81b994c4,
  193617. 0xd9fc5bcb,0xabcaa06d,0xf58f8f2d,0x06539427,0xb1dc52aa,0x35c85f67,
  193618. 0x2c911baa,0x5a7d8d72,0xaec2d834,0x4041005c,0x7a8e5347,0xb5868a44,
  193619. 0x8de512c3,0x04ee180b,0x211168eb,0x4daa66e5,0x2317cd8a,0xc0bd5dab,
  193620. 0x61164df6,0xa1d4185d,0x1dbad7c9,0xacedca26,0x09b02683,0x0fe4b5ac,
  193621. 0x26d9550f,0x8ac9995a } },
  193622. /* 194 */
  193623. { { 0x2640a39d,0xb2c8dc9b,0xede0c9f9,0x21ff0b38,0xa1ecba0a,0x74f469bd,
  193624. 0x080d0417,0x8a902ccd,0xf4994604,0xe956fa32,0x9776ab15,0x348f85cf,
  193625. 0x0066f492,0xc21fc6ee,0xfeeef367,0x35b1ebfe,0x4613e5ed,0x7804581c,
  193626. 0xea6ba071,0xcbdfe8e6,0x950d73ed,0xddfcaa32,0x1da48889,0xc9747936,
  193627. 0xdbaffbd1,0xce867c8c,0x1cbaeae7,0xd267431f,0x897912c8,0x68255045,
  193628. 0xd7ea1e4d,0x0c7c1ddc },
  193629. { 0x1ce963a7,0x53aa30cc,0xc4c5fade,0x7352f64c,0x2828afbf,0x2b9aa2f8,
  193630. 0xca212107,0x64273c56,0x85a576dc,0xaadd7654,0x90b5c77c,0x6196ac3e,
  193631. 0xd1aaf39b,0x20d43e9f,0xcd05cbc4,0xfc392062,0x4c0ff2fd,0x14163872,
  193632. 0x2ae821e6,0xcf32b8d8,0x3fa7a3f0,0x5f58f943,0xf644ca92,0xaebf1d2d,
  193633. 0x1918a75f,0x0c061563,0x6b876118,0x7989b5ed,0xad412441,0xbf342445,
  193634. 0x1df633ab,0x24ffc9ae } },
  193635. /* 195 */
  193636. { { 0x93c7cb2b,0x89fcdc05,0x590053fb,0xc1243b95,0x6182343c,0x601debcf,
  193637. 0x66c18a63,0x364546ef,0xec913287,0xa5290701,0xf9788c31,0xc35b8026,
  193638. 0x92d1f7d7,0x852b862a,0x0aa79728,0x1809cb05,0xa3cb2005,0x897d467c,
  193639. 0x9ef5b946,0xf20c77c0,0xf2241984,0xc3372c42,0xf35bb206,0xda053e0d,
  193640. 0xa9c140b5,0xbc26c6d0,0xcb56fb33,0x61cfcc0c,0x299b3968,0x1c3cf9ef,
  193641. 0x40621ba4,0x89e4d3d1 },
  193642. { 0xa45a9be3,0xd35e80e7,0x07356fbd,0xc4daa578,0xb967bc2f,0x0186d62e,
  193643. 0x47cd16e3,0xa702679e,0x5f30ce9b,0xca2f1c02,0x1f864f50,0xf1205b46,
  193644. 0x85061d66,0x7fd6d797,0x8a08809e,0x47edc4f6,0x9a4d3ae2,0x5dac0449,
  193645. 0x6d1f9da8,0xf844664a,0xd7a83a71,0x9f30ce84,0xeaac33f1,0xe9382bac,
  193646. 0x948622ab,0x1f033831,0xf7681eb2,0xb037a4ba,0x99a1b5c7,0xd156a908,
  193647. 0xe6f1d0fb,0x675d3e6f } },
  193648. /* 196 */
  193649. { { 0x707193e5,0xd9767ffd,0x810358e5,0xe478aa91,0x328d8ef7,0x5634f9ff,
  193650. 0x6dbbd9a7,0x913a0ee8,0x7e215686,0x379b2968,0x89d9da38,0x903f410a,
  193651. 0x1b1334d2,0xd9f8d7b9,0xbd82efb5,0x9fe74229,0x3803c778,0xdb568b62,
  193652. 0xd3d25344,0x93e9a350,0x724497e8,0x559c35b0,0xa169e23b,0xc472d436,
  193653. 0xcc5b4c69,0x09864632,0x83c7f531,0x9f6d759d,0x1e497888,0xa91cf1db,
  193654. 0x60af1a4b,0x5f7f92fe },
  193655. { 0x0545167e,0xf18a1cc6,0xaffa88e0,0x55ee2e02,0x432a7bcf,0x24cdff51,
  193656. 0xa7510866,0x7382da42,0x40511af7,0xe894c11f,0x2aaf1423,0xaa4e4e31,
  193657. 0xf63dd2ae,0x8c3d36f0,0xd7660635,0xfc5c9550,0x37ea7eab,0x01253731,
  193658. 0x39b950f6,0x2a5cd598,0x40e63442,0x95a0f601,0xf2ac7045,0x905e238e,
  193659. 0x446b0f73,0x44bacc0e,0xc448578a,0x4cd4206e,0xa5bd7803,0x367b1aaa,
  193660. 0x0a2b458d,0x25beced9 } },
  193661. /* 197 */
  193662. { { 0x0c33a8fb,0x079a7382,0x0f25dc1d,0xcfbf6cd1,0xc6d482b6,0x4ffc73f8,
  193663. 0x07bf844a,0x3e51f18c,0x599162f0,0xa7651236,0x14013811,0xac59a74e,
  193664. 0xe55018a0,0x957a6865,0xe3ca09b1,0xe1ec51bd,0xa960253f,0xbc0c7eb3,
  193665. 0x7de03f84,0xe83bfd14,0x52fbdb09,0xc0540ed1,0xcea15ec1,0x6ba52edd,
  193666. 0x4b261307,0xf3d30ed5,0xe8397206,0x9bd7bae8,0x096373aa,0xf20d8692,
  193667. 0xc3b0bf63,0x0a616a4b },
  193668. { 0x6e1339c9,0x2075f3ed,0xbf8b00a6,0x7afaa072,0xbccd9b47,0xdfafec82,
  193669. 0x00ca54c7,0x4713158f,0x38bc31ae,0x449102f1,0x310dfc8a,0xaf98f158,
  193670. 0x59e954d4,0xc9ef2075,0xc527a0c4,0xe8021af9,0x7a192023,0x6e801277,
  193671. 0x7fb02377,0x635f538c,0xe8c9e951,0x5df1974f,0x15cc9097,0x0287faed,
  193672. 0xf7a5115c,0xfa0728f0,0x0fac623d,0x90dbfbe6,0x0311ba09,0xa8d40fd4,
  193673. 0x07c6464c,0x876d154e } },
  193674. /* 198 */
  193675. { { 0xc2d3ea8a,0xd3a4d6d2,0xa842600e,0x36be681b,0xe4070672,0xc53f100d,
  193676. 0x6a7d7a7b,0xe3e5b6fe,0x5d5e1a83,0x6e6994f9,0x76097c2a,0x07cacd22,
  193677. 0xa6791011,0x12d98dba,0x102e0e24,0xddfc4461,0xd493272a,0x4815dbc2,
  193678. 0xa9436696,0x7e38e64b,0x32b2bf90,0x4960eb1a,0xd928e28b,0xda457525,
  193679. 0x2a077c9e,0x72f75b39,0x7fd61d00,0x27760cbb,0x0f4b1456,0xaf235d1b,
  193680. 0xe76d1700,0x3040c23b },
  193681. { 0x4efa9a70,0xb10dc55b,0x53e86610,0xd4de414f,0x09f8a27f,0x3d95c113,
  193682. 0x06661d3c,0x505109a5,0x60eb513e,0xcaa2994a,0x1e7d338b,0x3ee41537,
  193683. 0x4651e71f,0x4fd145fc,0xcbc313b4,0x51bbf838,0x1eb92150,0xb039e078,
  193684. 0x14bf5ac7,0xe8696b44,0x8be0d48c,0x2d667188,0xdd8f2b6f,0xbe93b2f5,
  193685. 0xeb8a7f8a,0xc1dfd1e7,0x90f751c5,0x862b3dd9,0xa32a74be,0x1eb1ad58,
  193686. 0x1ebbc9a2,0x5486d79a } },
  193687. /* 199 */
  193688. { { 0xa1359e13,0xcb2e34ff,0x28196051,0x202d8dbf,0x23564b5e,0xe95e023d,
  193689. 0x42f6ac12,0xfb1340b6,0xb653725d,0x543ba852,0x8d2466ad,0x81aedcd6,
  193690. 0x547c728b,0xbf780224,0x9569fb65,0x559f8a11,0xdfb22ec9,0x505b7a62,
  193691. 0x9eed5e52,0x07107540,0x299f6f11,0x9c899288,0x3db6f8c7,0xa7d69261,
  193692. 0xb3ca79a9,0x30eb7fb3,0xfb2160b0,0xcab99bb8,0xd28b409a,0xd2012568,
  193693. 0x5ac45f8b,0x380f1b0f },
  193694. { 0xe6a0068f,0xc0b99e6b,0xc8a73753,0x4b67cf2a,0xb2faeb7c,0xa6c9a548,
  193695. 0x340260c3,0x7f417f99,0xcc0f739e,0x8ee56855,0x780949da,0xf08b510f,
  193696. 0x8d5c6eff,0xb1770fc2,0xfd96a7bb,0xb4f5abee,0xf2665a2a,0xa07b1136,
  193697. 0xb601dcf9,0x2fb380a4,0x162becc6,0xcc803614,0xee6b83b3,0x3498fb96,
  193698. 0xa8c17eeb,0xea9b0fd6,0xa177efc2,0x5834b5ba,0x5b110b3e,0x929044f5,
  193699. 0xebd7285e,0x4abedded } },
  193700. /* 200 */
  193701. { { 0x700ef376,0x3355e1b9,0x66cdabff,0xd56e5d9a,0x47e87646,0xb3dc2575,
  193702. 0x00f79369,0x28f44b8a,0xa0c52e29,0x08c32b1e,0x3729b392,0x5a78de12,
  193703. 0xb26d239d,0x4184519a,0xe0ce4a6b,0x23f6b4b7,0xacb2a9f9,0x235f6f8a,
  193704. 0xe2064a59,0xbb8bc454,0x1bf3062e,0x37efd034,0x94dff6f9,0x6bac683b,
  193705. 0x8aa7fa06,0xc3364b1e,0xce0b3745,0x0616772a,0xd1e3fb0f,0x46f08d08,
  193706. 0x18e132d3,0x6a20abb3 },
  193707. { 0x6a85cbc7,0xea831016,0x934f9aa7,0xd0990946,0xe778f1b3,0xc2211088,
  193708. 0x2247b799,0x7ea4ff8f,0x454484ce,0xb3171d71,0x4f98c364,0x29403949,
  193709. 0x97df1458,0x5da911f3,0x09439116,0xa6b58093,0x174238bc,0x75f9509a,
  193710. 0x8209758d,0xfeb51821,0xa47925d0,0xae0c6021,0xaf8a315e,0x0e946694,
  193711. 0x6bad04b7,0xae7af8a3,0xf072447d,0x44c15e7f,0xa5456ffe,0x5184668a,
  193712. 0xbf36b977,0x45e353a7 } },
  193713. /* 201 */
  193714. { { 0x93092f71,0x76056764,0xf5b92d71,0xeb66b6c2,0xe2c8b6c5,0x9db3149b,
  193715. 0x20c0363e,0xf62f583a,0x03cd7097,0x688acd33,0xebb916ac,0x85d0c0f8,
  193716. 0x84c19b0e,0x1bf7462c,0x7c4a6ad1,0xc76ed5f9,0xd119f369,0xec8b88ba,
  193717. 0xebe50b83,0x59b8371b,0x866706a6,0x0cc69508,0xf8373d2c,0x531c75a3,
  193718. 0x2a5a02fb,0x4e1cd3a3,0xda39a1d0,0xe8274778,0x75da333e,0xedfc5bbb,
  193719. 0xca79bd36,0x15941f24 },
  193720. { 0xa77dd512,0x42e8c0f8,0x1dc365f6,0xa91b59a7,0x08753862,0xe80d14cd,
  193721. 0xd272faca,0x1624230d,0x4027cb5a,0xeea3ec16,0xc1ef9f03,0xc1700b59,
  193722. 0x0da3148d,0xd411c127,0xc4181af1,0x801ee448,0x9e3a900b,0xedf28559,
  193723. 0x0d09affd,0x5d67b0bd,0x8b370024,0xd839df96,0xe6f836b8,0x3b6307e0,
  193724. 0xbd3201c9,0x5382e588,0x7a1d02bb,0x636d8a6b,0x968641e9,0x70b7db76,
  193725. 0x118fad03,0x6d17c34a } },
  193726. /* 202 */
  193727. { { 0xc181c99b,0xcf608841,0xc87bdcaf,0xb65dc901,0x3720dabe,0xb460b447,
  193728. 0x5377515b,0x4c79c396,0x0a96c277,0xd447f22e,0x2ac0f440,0x0d952130,
  193729. 0xc90583ad,0x8330b26b,0x928904a0,0xe25e977a,0x85c50b18,0x1deaffd9,
  193730. 0xa5ad5f6a,0xcf4dbcb7,0xc8a37ed5,0xcbcd0019,0x1e9850b6,0x7846dd90,
  193731. 0xb0b8e605,0x1ac8194a,0x34132f90,0xb9728571,0xf56ee28b,0x4ce9f149,
  193732. 0x3e9e1d4e,0x1ab9b5a4 },
  193733. { 0x314fa7a3,0x206dab92,0x478ff963,0xcc4af0f0,0x904d9fdb,0x4cce1713,
  193734. 0x12c045fe,0xac20a2eb,0xfd8f6d7d,0x44fc5478,0xca7b6ffa,0x886e72c5,
  193735. 0x6fd6f758,0x7fa4529b,0x92a820d5,0x4df1d1b1,0x2789f149,0x3d812f9f,
  193736. 0xaabb53d2,0x9842f083,0x2a03ab32,0x2648539b,0xb1512502,0x631ce090,
  193737. 0x731f6bd5,0xe1294d15,0x9436e634,0xb229361d,0x3ca966af,0x8c4281c4,
  193738. 0xc21ab3ed,0x24b34956 } },
  193739. /* 203 */
  193740. { { 0x659824e2,0x49bdcb86,0x4e13e74c,0x6dc4ce48,0x6bbe1eea,0xa4c01a26,
  193741. 0x1e3ec457,0x47b2b8e7,0x2f5a8e4b,0x7e8b15e0,0xe333530d,0xe81eb6e6,
  193742. 0x17a45202,0xacba369e,0xd70e4c9f,0x81241431,0x3e12beb8,0xc190af4b,
  193743. 0x11f486fd,0x53270523,0x29fb2bce,0x9f6c41e1,0xb70f6c08,0xbe6287eb,
  193744. 0x3feb4477,0x1479850a,0x9bcf18bb,0xfcfdfb11,0xda80d040,0x925c292f,
  193745. 0x7e3c5bf9,0x212d65e5 },
  193746. { 0xca15cf08,0x23adb386,0x81e172eb,0x4dfa4ac4,0x4d42d0c0,0x9d1dbf93,
  193747. 0x74404dc7,0xd9cf6073,0xe932bfcd,0x60508441,0x1c682a98,0x9ae910ca,
  193748. 0x41ac1cc0,0x9528fc18,0xdbbed630,0xe6a120ae,0x30ccf250,0x94e0e1ec,
  193749. 0xe58bbf2f,0xfe84ba54,0x9faa4415,0xc66d0b4f,0xecee7ce5,0x0c58f1e7,
  193750. 0x6fa6873a,0x7a1d43eb,0x399f1348,0x96c6c5a0,0xe6727ab7,0xe6ef9aaa,
  193751. 0x9a5c2447,0x66afa554 } },
  193752. /* 204 */
  193753. { { 0xc980e91d,0xda5aaba8,0x6ac98efa,0xa93cf509,0x8da32662,0xb0990e0a,
  193754. 0x0081453e,0x01d21530,0x3d71de84,0x2bb0d33e,0x3e19a012,0x465f6d80,
  193755. 0x78a838e7,0x5902ff4c,0x1931348c,0x74e2afb7,0x9cfb057b,0xa4932757,
  193756. 0x3ad03f8f,0x761ea642,0x58ffa40a,0xb7d4c245,0x77a87e30,0xb5e9c0d9,
  193757. 0xc9c84d26,0xd1c5edba,0x3d1963a0,0xeca8839a,0xebf6bf0d,0xbc6f2f35,
  193758. 0x0d58abdf,0x01ef0631 },
  193759. { 0x3ecdcbb0,0x2bf90316,0x27c1c955,0x19e2d728,0x9575c930,0x9e527030,
  193760. 0x96983930,0x0dc1c5a9,0x7cd082df,0xef9f80ff,0xdf97e051,0xcd915075,
  193761. 0x9cc61b55,0xf286fffe,0x80f24cc4,0x352db38f,0x36523ae3,0xed9b99ec,
  193762. 0x10b104a9,0x109a8ca8,0x305203ad,0xc2700fe7,0x769400f5,0x2a2ee24e,
  193763. 0xee0c452c,0xd595d399,0xf7f02a41,0x0ab75d6a,0x0db730b7,0x34108099,
  193764. 0x5e8d1202,0x0e4f5ffd } },
  193765. /* 205 */
  193766. { { 0x0ff14c38,0xbd1c6444,0xaece11f2,0x9a5b59fa,0x22af6330,0xaa4605a7,
  193767. 0x82af24ee,0xddc9f65a,0xeb9a1159,0xf4ee4bfe,0x74e84eaf,0x2463d076,
  193768. 0x0e0baace,0x88cbe1e0,0xd5fabdcb,0x7ca568ea,0xc57eb99d,0xbd80d524,
  193769. 0xe9be9873,0x9c46572c,0x7300b85e,0x918a1dcd,0x40f54176,0x49221312,
  193770. 0xb5b14236,0xf7e324ff,0x2434f16a,0x40dda501,0xa133d97c,0x08833421,
  193771. 0x0876f020,0x33d41161 },
  193772. { 0x9878e5ec,0x7531a36b,0x46918232,0x5de3e321,0xd0a30464,0xd15f9a33,
  193773. 0xaa173659,0x734c1b87,0xf925d4fe,0xac2094a2,0xc262b0f4,0x43c965a1,
  193774. 0x447d5cbc,0x759c903e,0x05239300,0x92af215e,0x1f593f34,0xfffb6d5f,
  193775. 0xc3cddb5f,0x65943b4b,0xbfdd5408,0x9d03a29c,0x198d76c0,0x8f7cda6b,
  193776. 0xc0f27b59,0xc0790a22,0x8cb58ccf,0xba557a84,0x76c54fdc,0x5922052d,
  193777. 0x47b6b466,0x2d3de7aa } },
  193778. /* 206 */
  193779. { { 0x65add3b7,0xaade7462,0xabf24c2a,0xe5888f35,0xe1a57d93,0xd41549ca,
  193780. 0x2c76f7bf,0x0e22e18e,0xbe3202b3,0x67f288ea,0x1d1d0f0a,0xb79a66ba,
  193781. 0x2881ad18,0x0e0ab749,0xc7adb0e9,0x7d424086,0x2842132f,0x870c32c5,
  193782. 0x58f9a09e,0x858477f1,0xec025589,0x422a9372,0xa5098777,0xbe428c5c,
  193783. 0x57660058,0x45b79564,0x957f37cf,0x6c7fc631,0xd6316289,0x8b7023dd,
  193784. 0x5b1c12a6,0x47003bb6 },
  193785. { 0xc91c1c96,0xd99401c1,0x27a12970,0xaa5dcdf9,0xc3c29107,0x3ab92e17,
  193786. 0xa3fe4710,0x26fce8f7,0x4ee998ee,0xb0d09d5e,0x8e3a41f8,0xafa62204,
  193787. 0xa26ca506,0xb1c012a5,0x99b57252,0x2c6f734c,0x512f7fe1,0x1093d79f,
  193788. 0xacee19a6,0x2f30906e,0x056d1ea6,0x6bff8381,0xeff35f21,0x61c75856,
  193789. 0xc1ad2224,0x6e07e978,0x6b20fde8,0x2cca6ca1,0x633fe81b,0xab4d6d2d,
  193790. 0xb06a2ce6,0x73dff504 } },
  193791. /* 207 */
  193792. { { 0xd8e20fb8,0x8b615805,0x82b533f0,0x7c6873e4,0x56a854ca,0x5205f001,
  193793. 0xcb369211,0x87fec6ac,0xc7f092b7,0x1fa3c0ec,0xe845fe4c,0x5b36647e,
  193794. 0xf8b1f112,0xd4781e85,0x8b0f1a6f,0xc6526839,0xdcb8eb92,0xceeb8c6c,
  193795. 0x8e5f6d52,0x133f0ead,0xc8d934dc,0x31883e23,0x428ac45a,0x214ed5bd,
  193796. 0xdbbfca85,0xf77ca492,0x07e5ae13,0xdf4113fe,0x72ab05fb,0x63e4a0d2,
  193797. 0x7148f535,0x7544d0b7 },
  193798. { 0x80797ace,0x4fe8d134,0xaf86d97e,0x216d6aa0,0xef5a68fc,0xdbf0a688,
  193799. 0x9f9b2684,0x18b26f45,0x8999d2fc,0x52fefcfa,0x62423955,0xd5af8d82,
  193800. 0xf63a3780,0x8f123469,0xdcd4feaf,0x2933454f,0xa73b5d09,0xba8018b7,
  193801. 0xe5552c18,0x9af1f276,0xff26bb1c,0xc5d4773d,0x06dd4f44,0x9ef49410,
  193802. 0x5f39ba49,0xad8f12f9,0xf66ca4f2,0x5767f6dc,0x7922f59a,0xba8773f1,
  193803. 0xc1e42d49,0x220081ea } },
  193804. /* 208 */
  193805. { { 0xba37a0ba,0x3043d573,0xdd176df6,0x05a431bc,0xc42070f7,0x03322cfc,
  193806. 0x67c2d109,0x5cabd30e,0xcbf8bcfa,0x362c95de,0x7787b10b,0xd767d277,
  193807. 0x6ec05e64,0x612c915e,0xce69c30e,0x9e669631,0x682e2635,0x27c9dd8f,
  193808. 0x95ffcc38,0x79021f12,0x8a2adca2,0x06a8ee79,0x4b5d500a,0x8e00e784,
  193809. 0x8d80d6c5,0x87746fc7,0x915f10cc,0x246053be,0x219f6fd8,0x844e328b,
  193810. 0x11bd3733,0x620541ac },
  193811. { 0x509e5a29,0x0f7fd382,0xb432531e,0x8748d7d0,0xcd3883b9,0x8f749354,
  193812. 0x8bfbb17a,0xc6b8ac74,0x05f2d2c5,0xa4616a66,0x1bcb1b83,0xb3d96625,
  193813. 0x2fee265a,0xcf753104,0xdb225058,0xc70d73fb,0xf0c2d556,0x1211d434,
  193814. 0x54b259b3,0x862061d8,0xc42b3f7d,0xffe4606d,0xe86a4949,0x4c5c8585,
  193815. 0x160eedac,0x04ddcc8b,0x568e2420,0x1804ce67,0x42141656,0x91f3855a,
  193816. 0xf932be97,0x7f378198 } },
  193817. /* 209 */
  193818. { { 0xdfa6639a,0x9a374bda,0x02ab7391,0x0cbd48d4,0x47031e2d,0x5c5ef236,
  193819. 0xd0599d1f,0xb49ee2bc,0xe0d38443,0xd285eb60,0x269392e8,0xdbbea92f,
  193820. 0xb8bc538f,0x91455fbf,0xe469b768,0xae259ff1,0x41de5682,0xc1cecb1f,
  193821. 0x9952d1ae,0xc876f071,0xe7bf7446,0x1ce25181,0x282ad2f1,0xcb93ad86,
  193822. 0x6ba4ef67,0x8fa3cd31,0xe507aa3e,0xfce68a04,0xa61bb608,0xced74170,
  193823. 0xf6ac10d0,0x6de716b3 },
  193824. { 0x172d6dc5,0xd4e58d04,0x6397c65c,0xbed2cde6,0x0c9eb4e8,0x7ae77e18,
  193825. 0x75fa2edb,0x56275468,0xa91e6738,0x4b30324e,0x235c8b2e,0x6023a856,
  193826. 0xa8f92887,0x9df6d6c2,0xf6f5e8b5,0xec2c185f,0x3ad5748a,0x7892e12b,
  193827. 0xd54aefbc,0x7aebb4f2,0xee868821,0x14915448,0xb1d9bd5b,0xa26c5f71,
  193828. 0x2ff00df7,0xe5ccd166,0xb95b1dee,0xebc99f17,0x3fe1f774,0x90983616,
  193829. 0xbb3d25b0,0x51f90830 } },
  193830. /* 210 */
  193831. { { 0xf2922461,0x49376fa1,0x1650d0d1,0xdbb1b1c3,0x0dd8608d,0x92b91c33,
  193832. 0x36b89906,0x3e612c4b,0xdf560052,0xe1977b0b,0x636a2545,0xf8afff70,
  193833. 0x11723d8e,0xcda7d278,0x81bde7ba,0x0b0bc4bb,0xed2a578e,0x3cb080b2,
  193834. 0x171b2e02,0x5bda0d0d,0x941bb9ae,0xf6df38cf,0xc14a65c5,0x85dd81db,
  193835. 0xc19dd98e,0x7f98c82d,0x52206f93,0xc613747f,0x5f5bbe78,0x9e13a2c2,
  193836. 0x0aa34be7,0x5eed218e },
  193837. { 0x01d4dc0b,0xe1565754,0xf566bb07,0xa1ae5f27,0xb82225d5,0xe985ebeb,
  193838. 0x1189ec6b,0x5f3ad21c,0xecce4d9d,0x17da518c,0xd6b65b59,0xc84a2d3e,
  193839. 0x8ffa771c,0x7f988175,0x2ac69a7a,0x50d6ae12,0xc6e6846d,0xcb7f30b1,
  193840. 0x5bd0bb13,0x8c023a60,0xd73f2407,0x9a10fecd,0xe5f0a996,0x8c5158cc,
  193841. 0xbd8f5806,0xd26bf615,0x915a46e1,0xaf32ea87,0x0287d308,0xeaf74e81,
  193842. 0xa6264254,0x8c14ba06 } },
  193843. /* 211 */
  193844. { { 0xb17ee201,0x0c877895,0x88e57a77,0xc05aa471,0x97822456,0x19c3e763,
  193845. 0xc9c3ba1d,0x0be6f8c0,0xb4389ebe,0xfe85f4ff,0x0ce7fbb6,0x538bccce,
  193846. 0x65266c64,0x876eab2a,0xcf9a3842,0x5c9ac690,0xccc8f981,0x9f5cf3b1,
  193847. 0x9cf687de,0xfa17be6a,0x83835c15,0xfcfc10fc,0x150ef2eb,0x086b0fdb,
  193848. 0x884a52e6,0x9f97ecd9,0xb0cd1eb8,0x416e6fa2,0x3ecc03ba,0xe2bd1599,
  193849. 0xeabb165e,0x645c0a5d },
  193850. { 0x50aa7e31,0xd94c4205,0x2f851da5,0xaec8df0c,0x3c726e6a,0x99646909,
  193851. 0x2619bf9a,0x72dbdc36,0xe253fbd5,0x1b4260e0,0x8c709e06,0x97c259fb,
  193852. 0xcddaec5b,0xfabf7cbb,0xe4b703e9,0xb4d5e8b1,0x0734efdd,0x1b06e56e,
  193853. 0x1f55f8a5,0x02d4a4f9,0x3f565c8d,0x7f8608ba,0x816d1d94,0x822f47d2,
  193854. 0x5ce7b136,0x0cc36156,0x31d04242,0xe46ee5ef,0x683567f6,0xb2a65f70,
  193855. 0xd2fa6c91,0x27e9ff40 } },
  193856. /* 212 */
  193857. { { 0xd7e952e7,0x75251893,0xc735bf18,0x15b30583,0x96fe0491,0x732b5992,
  193858. 0x806d2fca,0x27451858,0x1b885ed9,0x71ab76a0,0x6d9f55ec,0xbdce9d97,
  193859. 0x48f2ba9c,0x3da60b20,0x592b132b,0x6977c086,0x099051d7,0xb6dca9cb,
  193860. 0xd188ae25,0xd9c2ab23,0xe20aaf3d,0x9f469f3f,0x5aad74d0,0xdbd1f7cf,
  193861. 0x22a9eb3b,0x3d5efe5c,0x137010c4,0x8c5edfa2,0x57870260,0xada2217b,
  193862. 0x3dac9776,0x4feee567 },
  193863. { 0xb5d3d780,0x30e18d52,0x07166744,0x4dadb5d3,0x5a742156,0x320d386e,
  193864. 0x8d6bbb86,0x5d8c290e,0x2d263dd1,0x981a4323,0x98984636,0x33d0e7ca,
  193865. 0xa519acb1,0x5138784d,0xdddc81ff,0x832e3fab,0x3199a43a,0xfc278594,
  193866. 0x32743163,0x5b4cabcf,0x74f94fa7,0x9fa010bd,0x5694a627,0xc28a743d,
  193867. 0xcb657a24,0xc1d2a888,0xe86a25ea,0x7eef2503,0x04c561ff,0xed11a5d3,
  193868. 0x9c9ede0e,0x4fe818e7 } },
  193869. /* 213 */
  193870. { { 0x7fc1c7ff,0x00252c9d,0x9fa89ad1,0xa9bd419d,0x4064e9cc,0xc93a124a,
  193871. 0x43942ecc,0x384cbcb8,0x8749695b,0x004c21fd,0x421165bf,0x69c81d9f,
  193872. 0xdde01102,0xe2325628,0x5a9b004d,0xec937457,0xf6dcfc21,0xfb3346bf,
  193873. 0x4d372c7d,0xac4da64b,0xf20494e2,0xcecb7ad3,0xe867c150,0x562c41b5,
  193874. 0xc2b723d8,0x299395ce,0x7ee53231,0xc91adfc5,0xf10b6597,0xe06f1161,
  193875. 0xb74d3ffc,0x81915529 },
  193876. { 0x6ed9d4ee,0x8ec12431,0x689aff01,0x3dffa154,0x2a89a3f4,0x4aba349f,
  193877. 0xd467efb2,0x2db1e8e2,0x039102e2,0x18dea354,0xe52f082b,0x422ab853,
  193878. 0xed36dd47,0x7130a2c1,0x0295d1ee,0xca60e86d,0x7c7f5ad3,0xe6ac6808,
  193879. 0xde864658,0x0f83cecf,0x461d1265,0x72e66c21,0xbd385099,0xfeef4150,
  193880. 0xa6632289,0x0f183f3a,0x792dc795,0x275454be,0x11367702,0x2744c11b,
  193881. 0xe8ea6ef3,0x7d06bcc7 } },
  193882. /* 214 */
  193883. { { 0x7090212f,0x89285942,0x5521e844,0x691b7d4c,0xbe2dbb92,0x4c038422,
  193884. 0xbd81f880,0x317721ed,0xac89bc36,0xc136cbee,0x7b8f004d,0x4f71b60b,
  193885. 0x4e218ab8,0x269132d0,0xe6cc814d,0xb0e2496e,0x75fadc15,0x0b2ce317,
  193886. 0x66d223c5,0x82e3c084,0x4c612f8b,0x9721caa6,0xa4b65355,0x59a751eb,
  193887. 0xc7d3d9d1,0x3433aad5,0xe80d4246,0x1e61b9d2,0xfc673caa,0x149f655f,
  193888. 0xd0f9cb92,0x48b52b99 },
  193889. { 0xefdc05be,0xa3915399,0x13e095e9,0xde70db18,0xcddb3fda,0x447862e9,
  193890. 0x1a009451,0xa2b03162,0x23920ea3,0x4b27980c,0xa23b8feb,0xac5394f1,
  193891. 0x3e5616d4,0x163f7256,0xb714219a,0xaa0ff93f,0x93d62474,0xd26f96d2,
  193892. 0x7dcfe276,0xdd212ea8,0x47038d15,0xab27bf2f,0xf418168e,0xe58c8325,
  193893. 0xb32a989a,0xe3704222,0xbfc9f13b,0xa3694390,0x0d0684ad,0xf16e2606,
  193894. 0x9d8c76ec,0x17c0de87 } },
  193895. /* 215 */
  193896. { { 0xdcc01958,0xbca5f453,0x1ce88393,0x7d945954,0x561f5b6d,0x5e6350a1,
  193897. 0x7e2d36bc,0x291c3c86,0xa5ac3a6c,0xf6c7ed84,0xd98006cd,0x7913c40b,
  193898. 0x5671ec3b,0xf78bb087,0xb43e89a9,0x1c928f6e,0xae1ea1ed,0xfdf28df3,
  193899. 0xb924b2b5,0x62bba5b1,0x1a116e05,0x491d2705,0x167ed3e3,0x08ec02b7,
  193900. 0x5bc0b046,0xe291cf7b,0x8c5d7f59,0x30e50169,0xf5c799b7,0x0c7c350d,
  193901. 0x0ac6e1d7,0x6862b9e2 },
  193902. { 0x9ffa1f64,0x56c6f4e7,0xa1e24349,0xfed6a91a,0xcdb75232,0xe9a0ee0c,
  193903. 0x0322d607,0xbfc90b37,0x462fef87,0x29480ad2,0xc2bfcf34,0xfc214969,
  193904. 0xa539e38f,0x6e5211e0,0x12a5149c,0x2a59ec26,0xd706b532,0x195fe212,
  193905. 0xe99c8429,0xf77fb108,0x5dc80482,0x74ceaea3,0xbd92d298,0xa5a6030b,
  193906. 0xaaea15ee,0xad42dca5,0x4987109c,0xd6ac3bc7,0x290af649,0xc64e1c40,
  193907. 0x51f8de6c,0x5093fa2d } },
  193908. /* 216 */
  193909. { { 0x4c2d553b,0xc4cf3280,0x3b966c29,0xdc1abe22,0x2296914a,0x556a549c,
  193910. 0x999976c9,0xd8c9f8b5,0x776e83f3,0xc22c57bd,0x7c85ec57,0x4f2942ab,
  193911. 0x6e2c61f5,0xef3407e5,0xf213db48,0xf005e8ca,0xf32698c7,0x470c853d,
  193912. 0xcac0a54b,0xe6f488d7,0x60b7501e,0xb6bd6bed,0x714a4bd9,0xf0103106,
  193913. 0x6e098894,0x5285bc3b,0xf5f92a00,0xec06741a,0xef7ef24a,0x32f16426,
  193914. 0x6c77a438,0x12f9c44d },
  193915. { 0x83313a1c,0x1951e964,0x33c58b37,0x98edd3da,0xc7ac4044,0x4edbbf52,
  193916. 0x0dcb5ee8,0x866ca6f7,0x6dd422f8,0xec0ae8f5,0x0661ec2e,0x1077bc54,
  193917. 0xd422523c,0x6d39913a,0x58e7cb3e,0xd105e1e8,0xc979bb45,0x47c9397f,
  193918. 0x0997b592,0x3221d4a9,0xe8952fe7,0x0ef628a3,0x4e946241,0xd08d5827,
  193919. 0x59780f40,0x64cbed0f,0x08e110ec,0x13d7c227,0x7679b1a3,0xd186d866,
  193920. 0x26ae1d18,0x02f75e4e } },
  193921. /* 217 */
  193922. { { 0x47f307d7,0x1b637ebf,0xd0141477,0x6b644a6a,0x2e05a80c,0x82a33d65,
  193923. 0xfed07b31,0xc8f1a0f3,0x3696e597,0xc09ee7f9,0xc7ffc01e,0xcdaa7ec3,
  193924. 0xf8f373b9,0x549f88fe,0xc3bb8989,0xc88d1961,0xdfcaa7b7,0xd92a4fe9,
  193925. 0x3ae4ab20,0x12ff9ee2,0xf5ecb1a5,0xf5aea641,0xe32fb47d,0xe769237f,
  193926. 0x25d085c0,0x96a5c420,0x26c755a2,0xdc912558,0x9bce9723,0x580b985f,
  193927. 0x63961941,0x72b1b566 },
  193928. { 0x790e5558,0x9d708a08,0x0689af80,0x98536041,0x42313b5f,0xe85e7b8a,
  193929. 0x55a49d1a,0xe6ba1292,0xac371b0b,0x5e76c4b0,0x938e6e19,0x58504f39,
  193930. 0x60ae9a21,0x8dd41422,0x968485ce,0xd8b04e9b,0x887efe43,0xf94c4ba5,
  193931. 0xf11c5e73,0x11268e67,0xcf6b99c4,0x92623e28,0x7a0a9662,0xf2d0aaa8,
  193932. 0x4ca02ed3,0xb266772a,0x2d63b551,0x68ee8e4e,0x2e78b5b5,0xcdebb299,
  193933. 0xe17225ad,0x5df19216 } },
  193934. /* 218 */
  193935. { { 0x8df2e7e3,0x20027e1e,0xd8da07de,0xb183cc68,0x4b4ae694,0xce35ba69,
  193936. 0x3ca62e88,0x896d97df,0x52efed2c,0x3de4713b,0x26bd084f,0xd006c40e,
  193937. 0xfc81923b,0x1e9b71bb,0x1aacc6b0,0x9991c7b6,0x8f656840,0x650c9364,
  193938. 0x87f47524,0x138561d1,0xbffd3ca2,0x610f2b11,0xfa191418,0x96915faf,
  193939. 0x955e5309,0x8f1236de,0xa1872d79,0x613cbeea,0x66a2a48b,0x7f7b44ea,
  193940. 0xe0a89c32,0x452265c2 },
  193941. { 0x25430010,0x4ad5ec79,0xebd090c0,0xcac786ff,0x20a9d3f5,0xa5f9f4ff,
  193942. 0xa3edc65f,0xfcbf4112,0x0cf3eb11,0x8824839c,0x8aa5b700,0xb8dd6d4e,
  193943. 0xb7568ab8,0xe2271dfd,0xb744560e,0xe43ec373,0x1cf75296,0x78eaf926,
  193944. 0x3fa96d9b,0x1809ae0e,0xdc25dfd5,0x0b312d2d,0x6bab7711,0x6b8f78b4,
  193945. 0xb5ecf1e4,0x069efc8d,0x609fecaa,0xc1952bae,0x5f4dbde1,0x43e302ed,
  193946. 0x1e078555,0x14b02bf9 } },
  193947. /* 219 */
  193948. { { 0xb87e5b57,0x2c71c768,0xf531a557,0x0bcc78f7,0xf7597dc8,0x4ff93f8b,
  193949. 0x139e175f,0xb28e026d,0xcb94ca6c,0x6b83b727,0x0079f7fc,0x2eafe3b2,
  193950. 0xcf3bd170,0x2aca54de,0x6af0dc6c,0x17c4133c,0xccf5e35e,0xbea1e665,
  193951. 0x345505c6,0xa6691a48,0xe6100b89,0x2633abd0,0xc17d0388,0x966c6706,
  193952. 0x1a0cf90c,0x7aefffbe,0xd0add64c,0x4d847be7,0xaea2aa46,0xd49bcdfb,
  193953. 0x2cc7d0a5,0x85e07e74 },
  193954. { 0x0bc25bca,0x23aae0a6,0xe44f64ec,0x6e8e55f1,0xb607b773,0xe1e696d8,
  193955. 0xd3005909,0xaa90a746,0x2cbc4990,0x072b1ccd,0xc68e2f5d,0x0d0fe6c6,
  193956. 0x53e28ec9,0x920ec5f0,0xf0040cc1,0x79b21fb4,0xfcc4a2c7,0xa7375bd3,
  193957. 0xe1bac7dd,0xf5f5def9,0x35c0f8d3,0xdc315d79,0x2cacd318,0x7117c170,
  193958. 0xe926f71c,0x6f2823c4,0xed02f39a,0x38db58bb,0x7db69323,0xe5b49231,
  193959. 0x8d49f430,0x0964039f } },
  193960. /* 220 */
  193961. { { 0x56999eba,0x21774f16,0xb1de6305,0x3d8ee287,0xde0b2669,0xd81af726,
  193962. 0x3f8942a1,0x37446939,0xea03e13c,0xbcf6b615,0x94e273cf,0xd30c0c35,
  193963. 0xc6725c56,0x4fd33a56,0xa8be97a2,0xa57534ad,0x7c22a251,0x799242a6,
  193964. 0x9d0c5c49,0x4e51bdb5,0xc6a42768,0xd7cd76cc,0xd426bf59,0x914097ac,
  193965. 0x66e9beb2,0x59404a2c,0x5c96e3e9,0x4738fe98,0xaad666d0,0xbcbb3e0e,
  193966. 0x63bc5e56,0x626b0fd2 },
  193967. { 0xe1a1ec42,0x47217dba,0xab5acc50,0xaa6ae7db,0x865331d1,0xb7e1ab1e,
  193968. 0x3d30126f,0xb8453070,0xdee61851,0x280649e0,0xea689544,0x8806f4a3,
  193969. 0xcb56f632,0x4bbe43ad,0xbcaff94f,0x036b9bda,0xbd0637be,0x0d941e65,
  193970. 0x686f3abb,0x82179d44,0xaad6afd6,0x1486912c,0xff7e1534,0x9a3b891e,
  193971. 0xeb86fd96,0x88c426ce,0x117928c3,0xb56e6a81,0x96399e00,0x933e7135,
  193972. 0xa17b6ac1,0x09bbddd9 } },
  193973. /* 221 */
  193974. { { 0xe4fd3673,0x75e39c1d,0xa65c8e07,0xf880d9d1,0x7289c7fe,0x4725c1dc,
  193975. 0x3529d200,0x5b6735ee,0x3c747af3,0xc1f8f2ed,0x912efdf5,0x5cf3998f,
  193976. 0x49859c39,0xed722618,0x0e69795d,0x23793a2f,0x86b1d2a7,0x8a6ab8d6,
  193977. 0x22a882e4,0x00c815de,0xf9db8d7e,0xbe77d6fc,0x02267547,0x0886fb32,
  193978. 0x49c10edc,0xb62687d4,0x7c83ed4c,0x9f1c3e17,0x5af366ea,0xe6d5d7f0,
  193979. 0xd1efad24,0x2eaa01b8 },
  193980. { 0x1f357c74,0x5e47fb70,0xa9e3b794,0x93085c4a,0x6e85a905,0x4f098733,
  193981. 0xbe0244c9,0xf53808ff,0xa3b5660d,0x91dddf93,0xf3b95ed6,0x8b76377b,
  193982. 0xbb3920d4,0x91b911b7,0x86a13cf3,0x7ccf08bf,0xea018e58,0x53ed8f97,
  193983. 0x78c55194,0xb1ea4343,0xe0d2d5a6,0x8e6adde9,0x9b96259a,0xfc2b248f,
  193984. 0xeef17ddd,0x96ebceae,0x557f9c85,0xf694b443,0x07d5bba8,0x48cd150f,
  193985. 0xb4c1986b,0x02d31de9 } },
  193986. /* 222 */
  193987. { { 0xde79499d,0xa6bb9e1e,0xfd0fc2ad,0xf6ca8ff8,0x1a7d9356,0xbec0f8e8,
  193988. 0xe8f06327,0xbc3d1c9f,0x3b300beb,0x805c7217,0x413c181b,0x00420a08,
  193989. 0xf0ca9d01,0x9e9a167e,0x1aeeddd6,0x076c909d,0x8e3a8a72,0x64a1997f,
  193990. 0xa77b429e,0x3ce7f7a7,0x5c94d3e9,0xaac0fbf4,0xe6d48407,0xf37694a7,
  193991. 0xa91921e7,0xf56679e2,0xee1dbbd6,0xf23fe0f3,0xcbf9fa99,0xc7917566,
  193992. 0xe0f4d765,0x965860f2 },
  193993. { 0x7fa5f79c,0xe734702b,0x5af2d26d,0x930bd426,0x6c73e0ce,0x45bd8b98,
  193994. 0x4ee44a2d,0x7dbe7bed,0x956c8a1a,0xc129e024,0x77cdf80e,0x6fdc05ac,
  193995. 0x589ca59b,0x70a6ba2b,0x999825af,0xfc484021,0x7a23f0b6,0x1d284b54,
  193996. 0x28a0a8af,0xb1da10a4,0x2b2af6d8,0xb1eb1b31,0x33935ee3,0xf051443a,
  193997. 0x8effa6ec,0x7a07eb26,0xd662654c,0x16ee4086,0x4549ee4c,0x7a7bc501,
  193998. 0x1fa98a52,0x65081032 } },
  193999. /* 223 */
  194000. { { 0xb67ed9b2,0x49f0e460,0xc36d93d2,0x0cda0fd0,0x88c75e1c,0xbb5963e9,
  194001. 0x614bc0c9,0x757bbe93,0x9a768605,0x9a9b8801,0x48edc544,0xa8b7e2af,
  194002. 0xb51a5985,0x9e77ed9e,0xebbf024c,0xdd025274,0x1545c636,0x598b6288,
  194003. 0x4800dba0,0x39bdaed0,0x81e2a23a,0x7fc20139,0x550cb4f2,0xdc66fd5c,
  194004. 0xb52068c7,0xad27032f,0x8169fa15,0xc9a0bcae,0x3a7ca8a2,0x60606f21,
  194005. 0x9862652f,0x98295046 },
  194006. { 0x2e11c128,0x3e374600,0x0e6dca7e,0x80dfae5d,0xd9552264,0xe44016e2,
  194007. 0x880b7143,0xf65f88f2,0x526b881c,0xca3d28d4,0xdfb86afe,0xf9c59dd1,
  194008. 0x4c74f958,0x548860c2,0x9cb69f4f,0xd06ea43c,0x7334ecec,0x5343c9ae,
  194009. 0x35329713,0x5cc2ccd6,0x5f3a6c0c,0xa95ff403,0xb372653b,0x2e01a1cc,
  194010. 0xa250523d,0x31510fdf,0xa6227eb2,0xeee538e2,0xca23cd10,0xeadfc8a0,
  194011. 0x3e78f54b,0x4b7e6e1b } },
  194012. /* 224 */
  194013. { { 0xdb5f928b,0x79c9076f,0xb7347cec,0xe6250bb6,0xac00ec41,0x54b67798,
  194014. 0x9d9619c7,0x900d20ba,0x59e4343f,0xed42c0d0,0x451935d7,0x3df39e85,
  194015. 0x64f701ce,0x26391182,0xe1f87aac,0xce8f2554,0x65f91aaa,0xfddd6789,
  194016. 0xa324539f,0x96cd163f,0x4bace995,0x5c815f2c,0xa94f9ea5,0xd78c8c2a,
  194017. 0xef24e455,0x7ab2aff4,0x1cddc26a,0xf0ed6409,0x00ca2822,0x954a420b,
  194018. 0xd3297658,0x0611c4c5 },
  194019. { 0xa9e81829,0xf192001c,0x08a282cc,0xded33320,0x8f9ded9b,0x0bfd7de1,
  194020. 0xb7889003,0x6793ac0d,0x3577a5dd,0xbb00d91d,0x802d3c2b,0xe17a23a7,
  194021. 0xfb549014,0xff95f88c,0xc71b6e07,0x7cd1bf4b,0x23588c8b,0x2e3b24a0,
  194022. 0xa4112076,0x9b5335b8,0xc4056d30,0x2481c05e,0xe916a1b5,0x55c7410c,
  194023. 0x850179f4,0xbbe03271,0xb3cd1208,0x15e6c177,0x90cbfe50,0x509a24c0,
  194024. 0x1c108566,0x82079529 } },
  194025. /* 225 */
  194026. { { 0x1c7d353e,0x5d2d3cff,0x7de0ce3b,0xd5e7eccd,0x6ca87635,0xb4b1075f,
  194027. 0x25f9ad3e,0xda8404e0,0x205cb5ae,0x6b963e89,0x09f221a1,0x9e5ee0d8,
  194028. 0xea41aca4,0xd64c85d9,0x34442a34,0x6a46c4e9,0x3cf655a4,0xac6ff97e,
  194029. 0xe5417d7c,0x76565c1e,0xeebf9c4c,0x681009a9,0x88da6388,0x95b61d39,
  194030. 0xf6b472c6,0x6402b46a,0x0b7f1171,0x1fde5165,0xbe0c05e3,0x94f8f273,
  194031. 0xa88344a7,0x7487b036 },
  194032. { 0x9c3e2370,0xa860e575,0xf8048719,0x19d58193,0xa6e2f9aa,0x3a0dbf3c,
  194033. 0x6144719b,0xb6c7e959,0xdeffec21,0xa9049c74,0x3f50cebf,0x8ba064b2,
  194034. 0x49a1de15,0xb12822c0,0xb1d527f2,0xb654b7d9,0x0ffd0430,0xc470859d,
  194035. 0x4f05446b,0x37c74a67,0xa3add995,0xe553251b,0xe33533b5,0x4a3ed6cb,
  194036. 0x27e419ce,0x2f2f44d0,0xa5d1b979,0x2d84ee82,0xdb6fa69f,0xcc76b123,
  194037. 0x21fa3bdd,0x834f85c5 } },
  194038. /* 226 */
  194039. { { 0x2ce9b31a,0x329347c1,0xfe3fb3b7,0x1d88522a,0x52ff90fd,0x4bcefb4d,
  194040. 0x2b1a081d,0x53b17386,0x2a411f08,0x538c11ba,0x141b603a,0x7895b93c,
  194041. 0xb10bd741,0x2993b9aa,0x09912986,0xccbbd046,0xeea0aba5,0x669fafb0,
  194042. 0x35661897,0xd4844622,0x367ffa54,0x4a63b89c,0x1c3478da,0xcbad5d1d,
  194043. 0xaa6034f7,0xc5339227,0xe61b1391,0x0e6d705f,0xf74ff515,0xdd14b660,
  194044. 0x5332b54c,0x639d8b0a },
  194045. { 0x162217cd,0xfa423162,0x811c28e6,0x2e0e4a2a,0x21766dc0,0x68d9ce18,
  194046. 0x046a06ef,0x51263739,0xdde92101,0x44eea231,0x114298d3,0x0607c8f2,
  194047. 0x63d957e9,0x27f272ba,0xa5e8cae1,0xe7ce80cc,0x24f7a63f,0x5816ebe2,
  194048. 0x89673e34,0x4dece5a7,0x536babd4,0x13756a22,0xe3bf77af,0x644d61ae,
  194049. 0x2bcf98bc,0x60b2bf6e,0x29fa962c,0x3b0b59f3,0xabb50023,0xb0769a1a,
  194050. 0x0c75402c,0x40903136 } },
  194051. /* 227 */
  194052. { { 0x1670433f,0x84d2873a,0x25493dfc,0xc9394df6,0x80fcf89e,0xeb05a19a,
  194053. 0xdb297616,0xe39e4310,0xd9e63046,0x50742dc9,0x1de9ca9e,0xf31ad8c8,
  194054. 0xfb7b1d0d,0x86aabf94,0x1b3c82d1,0x36cda27a,0x39702d84,0xfb1a2ef4,
  194055. 0x46081299,0x280bfddc,0xd2396238,0xe4b2b48d,0x7b3c9353,0x2db2c2f3,
  194056. 0x12fb8a69,0xd5b5b317,0x08180474,0xf9b87a3b,0x1e952578,0xd8590986,
  194057. 0xf37a2bc8,0x80668eed },
  194058. { 0xb39a0249,0xe2edcd35,0xb2f8aeae,0xaf230cd4,0x7223df05,0x295b15e4,
  194059. 0xe0e937f4,0xbb66982a,0x8cbc9162,0x019d2b72,0xcf49dca1,0x5c512ae9,
  194060. 0x630f07b4,0x11b491a7,0xa03874e9,0x48d4f34c,0x44cb7433,0xc1fd0ea6,
  194061. 0xf95b30c3,0x13f79ae1,0xed8b60ac,0x40362d4d,0x61ead81c,0x9e8314ff,
  194062. 0x498c3d28,0xed600dd4,0xc2521702,0x5fcb1c19,0x3a9c1f33,0x592329fc,
  194063. 0x1bde6ce9,0x04677548 } },
  194064. /* 228 */
  194065. { { 0x39233c96,0xee3de56e,0x80737eaf,0x868c409c,0x201abc68,0xacae11bd,
  194066. 0x2b486205,0x0f2cea9b,0x6f19056c,0xe32387e1,0xa5dc2a41,0xea75365a,
  194067. 0x12b4be86,0x76c29acc,0x8d63294d,0xa01fcab7,0x0cab9f24,0x81dbe88b,
  194068. 0xf414c054,0x76646e5b,0xcb96b7aa,0xfe111893,0x7664e097,0xb649f5b1,
  194069. 0x53fcf5a9,0xa196422e,0x0b7ff634,0x5978c9bd,0x3c229895,0xb5feb38e,
  194070. 0x0833c456,0x038a49fb },
  194071. { 0x13e93257,0x35e3818c,0xa612741b,0x14cebc9d,0x7caac06b,0x4f6e9249,
  194072. 0x3daa1116,0x82278e33,0x4de2034a,0xe7cc565e,0x0a1ba630,0xbb7dc95f,
  194073. 0x66956fbd,0x81dd9f23,0xbb132dd6,0xc63e6319,0xfc241337,0x6e22b022,
  194074. 0x7e8beb1c,0x23848193,0xd8c938ac,0x83b1994d,0xa6bb5644,0xb54cfaca,
  194075. 0x06f91807,0x1a7cd44e,0xa8f8d9f3,0x1dd439bb,0x7f74a8e6,0x660c2a78,
  194076. 0x121b5660,0x4bb76e22 } },
  194077. /* 229 */
  194078. { { 0xe6354817,0x7a151e8a,0xf038b438,0x33d494ea,0x85958986,0x4c86c688,
  194079. 0x1dcbac12,0x72153827,0xc0edad06,0xf487af8c,0xe500e5d6,0xad33051f,
  194080. 0xd6e47f55,0x0a711b1b,0x8c746ad5,0xa68709a7,0x6402f35e,0x27f17262,
  194081. 0xfb30c130,0xc6d08efa,0xc06c7497,0x9ef1c041,0xdcc3e2da,0xd0c74ece,
  194082. 0x092e1073,0x30c5f96e,0x2aa12b74,0x0f1393cf,0x2107eb02,0x24584016,
  194083. 0x7b76f98b,0x8843d25f },
  194084. { 0xedb2a83e,0x4e1501dc,0x2bb8d724,0xbcfe8fb0,0xd925df62,0x09020659,
  194085. 0x42ab6fc3,0x3c715dcf,0xa0f09dfd,0x73c05055,0xe3590aea,0x126745d8,
  194086. 0x76ff749e,0x5382f4d8,0xa920c663,0xfc69feef,0x9fd711ca,0xde160211,
  194087. 0x9075c4d5,0x4219c3bd,0x3ded6bf2,0x3800cbd1,0x6263a116,0x8c7ea0eb,
  194088. 0x7d264c37,0x35bd7958,0x7159c98c,0x56e22e45,0xfa7373b5,0x71bf2a2d,
  194089. 0x8935c949,0x0503f939 } },
  194090. /* 230 */
  194091. { { 0x71dad4f6,0x65addc66,0x024bea1b,0x238e4889,0xf605d3dd,0xfb76c8e2,
  194092. 0xb0d96b89,0x13d5f5de,0x6601b2cb,0xe0b5ba35,0x83e3d254,0xe37d491d,
  194093. 0x240c8ea7,0xe8860423,0xe91c99ba,0x374182f3,0xa87ad919,0x26c2caf9,
  194094. 0xf574f295,0x4b13040a,0x944000a3,0x5b9bced1,0x06df42e7,0x4ccc57be,
  194095. 0x4bd1089d,0x22e8ec50,0xdddbb500,0x0c53177a,0x9ecfeadb,0x690d31d2,
  194096. 0x176668f9,0x735778fe },
  194097. { 0x843c1137,0x0f86ee3e,0x3f0b73cd,0x3c1c42fa,0x8ab20e3a,0x0e75679d,
  194098. 0x16242fae,0x6f95f1f4,0x39b092e4,0x7b88e11c,0x4c236ac0,0x1629403e,
  194099. 0x2dac02e6,0x66105f41,0x862e0632,0x74dc28a7,0xf3b23c8d,0x2118ffb2,
  194100. 0x0745ffbf,0x1182417c,0x4c05711e,0x49b55a04,0xcefbe4de,0x2c665b74,
  194101. 0x97bf7107,0x1cc4c01d,0xc54f0676,0xb2ca06da,0x7450d0f8,0xfc599daa,
  194102. 0x1a3182a1,0x52e637a6 } },
  194103. /* 231 */
  194104. { { 0x6bebc6db,0x481700f1,0xf9503d92,0x4a6b45db,0x5d153919,0xc715cd3c,
  194105. 0xe5ad2abc,0x942a1c05,0xab7b466f,0x36a82433,0xba13918b,0xba413bed,
  194106. 0x90f4e6ce,0x698a5624,0xf3f1f3ca,0xbb720da6,0x63471ab3,0x2116d41d,
  194107. 0x303d3609,0xe00d2227,0x463ba69e,0x7fd4cc00,0x62845fd1,0xac609e4d,
  194108. 0x80adc9c7,0x63603b2c,0x45fafbca,0xbf16fc9a,0xc4bc94ab,0x41007f7f,
  194109. 0xa74b1698,0x7c916b4f },
  194110. { 0x78bac2d4,0xc1026f91,0x2601a875,0x8a2e8098,0x0073d640,0xad2f276e,
  194111. 0xfcc1fb88,0x443610c4,0xca6b291f,0x5727b822,0x88ec60fc,0x0645532c,
  194112. 0xed9ad48b,0x51e48899,0xf543f103,0x841b48b5,0xd591ceeb,0xa6ccb1be,
  194113. 0x9dcf5a8b,0xfc4adf0f,0xb347ddb4,0x3a7ca020,0xcb44c521,0xaa1accc2,
  194114. 0x0527c0c4,0x773b6828,0x7023cf50,0xaa374c10,0x6b74c926,0x733d1000,
  194115. 0x77a8d07c,0x1ff3916f } },
  194116. /* 232 */
  194117. { { 0xf997939d,0xaa218fe4,0x791583b3,0x3d4dfbbb,0x87f7560b,0xb3a7b5da,
  194118. 0x5da92c98,0xa9c02801,0x46666f4a,0xe1eb4aad,0x14ce9dd7,0x2eb17a51,
  194119. 0xef8f3076,0xf46a66a4,0x810e546e,0x900b45c6,0x4baf04dd,0xf7af2258,
  194120. 0x5c84d42f,0x3cc1c872,0x8e4c83de,0x3093f225,0x170d88b2,0x62fade41,
  194121. 0xac076e44,0xe19612e4,0x32dd141b,0xf48d7346,0x925e34da,0xc1b1f759,
  194122. 0x072b90c9,0x19ed1a56 },
  194123. { 0x6c735473,0x9cf7fcde,0x6003bc3e,0xaab88e67,0xfb199bb8,0x12187cbc,
  194124. 0x9accccbd,0xbb730441,0xb0f65459,0x214aff3c,0x6f926282,0x6aec81a3,
  194125. 0x9f9d20b8,0xaa82cb32,0x5773cc90,0x82f3f90f,0xf62257e1,0x4af60e6b,
  194126. 0xbd4762df,0xf18b44bf,0xdb970753,0x3948b129,0x7c22c18e,0xc6e920e9,
  194127. 0x57be97ad,0x393d6208,0x46b637f9,0xe8d7382c,0xf1fed1d5,0xf6625ccb,
  194128. 0x68681599,0x6f31e0f9 } },
  194129. /* 233 */
  194130. { { 0x82b8f204,0xc45afe55,0xd358b54a,0xac0441b6,0xacd5f5ed,0x7213e7bf,
  194131. 0x139bcd93,0x1914c70b,0x96dbcbb0,0x714b4581,0x1ed35d21,0xe9297d35,
  194132. 0x6a3e1f20,0x8f640837,0x2f3cd705,0x150a8a9d,0xdcdd9f6d,0xfb36e801,
  194133. 0x5cf56d82,0x5a54eb65,0x92aa5a21,0x7610500c,0x3b089f03,0xd10d0ae2,
  194134. 0xc42b66e8,0x491b2079,0x0eee8d48,0x4af1ae3d,0x41556f45,0x137e4c28,
  194135. 0x63d8a7e6,0x875e3308 },
  194136. { 0xaf6c0acc,0xdc80fddc,0xbb1e7c08,0xd5ad1e66,0x828585ad,0xdc717ae1,
  194137. 0x275c7da6,0xbdc54340,0xd26b9e15,0xf4b4c852,0x6a05fa50,0x5f0a1fbf,
  194138. 0x817bcb32,0xc6f81e47,0x70ff2e1d,0x2cbd4328,0x67c7f7fc,0x8a249016,
  194139. 0xb585a6c4,0xd045acb7,0x4666c057,0x2e972ad4,0xe6d7d63d,0xc74d87cf,
  194140. 0x0e274144,0xf7067d87,0x8b2584ae,0xb2ca157a,0x75f0fdeb,0x495c5bfb,
  194141. 0xf386e009,0x5abb0581 } },
  194142. /* 234 */
  194143. { { 0xf0c97f57,0x8be62d2b,0x962f28c7,0x0fe04871,0x47b50abb,0xc548a467,
  194144. 0x44fa09ed,0xf6b26e03,0xab05a96e,0xfd44c6e3,0x70e6ae82,0xedb0032c,
  194145. 0xd7e4899d,0x28bd402b,0x9b7c11c2,0x43f2e963,0xce913716,0x0ec3fc0e,
  194146. 0x02fd0f8c,0x769b8bc9,0x7cabc3ac,0x9d9cb3aa,0x06924cc9,0xe88a8892,
  194147. 0x42609014,0xa51461aa,0x962e79e0,0xc7f4aa8b,0x8b1b3e80,0x4ef0210a,
  194148. 0x1bfee4bc,0x70544680 },
  194149. { 0x121901c1,0xfab3d713,0xfead54aa,0xe90a2627,0xbc08ba23,0x64f6d285,
  194150. 0x36ec227e,0x8d993015,0x06c191ab,0x99a16ab9,0xf649ce2c,0x86b1cf5b,
  194151. 0x66be3a80,0x59206759,0xccba2cf0,0x18836279,0xeff53486,0x2c157b87,
  194152. 0x4b223af2,0xbfac9896,0x0aae7a57,0xcd0fd4f0,0x63218a80,0xdaddb940,
  194153. 0xdf88f14e,0x3844bb79,0xb71ed9fd,0xc1b3e3d4,0xd6205036,0x6c634a13,
  194154. 0xb8680a6b,0x6f56aecf } },
  194155. /* 235 */
  194156. { { 0xd9205c5d,0xb01dc803,0x67123929,0x68955f7d,0x9d9b6565,0x3debbffd,
  194157. 0xd3b1acfe,0xb844395e,0x6094eeff,0x04328b21,0x22991feb,0x6631ffa8,
  194158. 0x190dd075,0x0dde66e6,0xe8577c05,0x75b03c55,0x91722407,0x6c91ce5f,
  194159. 0x8ebb3a3f,0x9a288a40,0x058a1396,0x1d376f8a,0x9a6e0676,0xf3a59457,
  194160. 0x7b71d288,0x103029c5,0xb44c30c0,0x0843f428,0x730e0b9c,0xd8e6aff8,
  194161. 0x4ed644ad,0x7b6be811 },
  194162. { 0x3d3aa54e,0x3ec38e4a,0xd83d509a,0x10233943,0x243955e2,0xf84aa621,
  194163. 0xf51d3d44,0x29104717,0x7eca4e37,0x62d2442c,0x85fa55de,0x8c5a523d,
  194164. 0x851da1b5,0xc6f5ccda,0x20001468,0x044bcaa8,0xe01702e0,0xf7501e68,
  194165. 0xe6a0acec,0xf0819359,0xac0ef0b2,0x33dda6ad,0xfd964f01,0x97aeedc8,
  194166. 0x530b90d8,0x48dacd0e,0xb84122eb,0x4c5fad6f,0xd700a1de,0x2284ec1e,
  194167. 0xdbca5474,0x86f9a835 } },
  194168. /* 236 */
  194169. { { 0x450cc69f,0x0e1d9055,0xc9edf98f,0x50eb14bc,0xee7eba01,0x1bb94e77,
  194170. 0x998f8e53,0x5f7a6737,0x1b16eef0,0x588384e3,0xd85c5e15,0xbb928723,
  194171. 0xcbd952aa,0xfe51e345,0x7e241674,0xc5d0ee28,0x100182f0,0xfdc146ef,
  194172. 0xe7f5be2c,0x0f739e92,0xb656bd3e,0x501ab3af,0x5168e289,0xb1552dde,
  194173. 0xb8ee104a,0x940dfe31,0xc4304475,0x42923603,0xc460a913,0x9306f114,
  194174. 0x03b51f86,0x5bfa9faf },
  194175. { 0x107b258e,0x2a23f52c,0xd66341dc,0x989e82bb,0x823cff1a,0x54a3ced8,
  194176. 0x719b491f,0xf45b7794,0x2433dfb8,0x898c2218,0xc49250ee,0x0f9dd91c,
  194177. 0x4fa17655,0x50c2a2ae,0x2c327f45,0xf7aa1ce4,0x583b1e41,0x13a15ad6,
  194178. 0xa1bfad9e,0x9aa0d5a5,0x8e1fbdcd,0x9b1caa28,0x915f7f87,0xaf9283b6,
  194179. 0x87e81a1e,0xc10e4e0c,0x1080d296,0x04fdca56,0x12755bd8,0x6acc9616,
  194180. 0x828feeda,0x1b1266aa } },
  194181. /* 237 */
  194182. { { 0x774ee49c,0x4ebc0a00,0xcb6237d7,0x776f6852,0x5df938a3,0xfc0544ac,
  194183. 0xb6fbfbbd,0xc3388ec8,0x745f2eae,0x84ac8bcd,0xb1ece937,0xa9c56609,
  194184. 0x7de8fa13,0x656fb6ac,0xa532b871,0x5f8ded74,0xaa889f09,0xab0d428b,
  194185. 0x10b7aec2,0x43b27f28,0xfeecb34c,0x26426e1e,0x9e89c2db,0x44431b6b,
  194186. 0x39211090,0xaac4bc5d,0x4fd81058,0x926f7368,0x471ef60e,0x452fa691,
  194187. 0x218d7a23,0x33517fdb },
  194188. { 0x593c4a36,0xa9c33f46,0x36b1a9ee,0xac69d718,0x4277beec,0x55a20c1d,
  194189. 0x7e4f179c,0x3e8ca24e,0xd46d88a2,0x57373369,0x730702f8,0x71ceb1cc,
  194190. 0x35eed574,0x8b184d97,0x0704cec2,0x7f4517a2,0xd7062a53,0x7f129d18,
  194191. 0xb1d77e1c,0x07a4571b,0x8350d8b2,0x774ac309,0x61fab8ef,0x27b2919f,
  194192. 0xb5dd801b,0xa7c4cc13,0x1434591f,0xe7e6255b,0x5a3592b3,0x349937b8,
  194193. 0x30c77549,0x31fac63d } },
  194194. /* 238 */
  194195. { { 0x04913fb6,0x2ee8cf1b,0x1769a6b3,0x7e401350,0x783e61f0,0x790ebb71,
  194196. 0xe27f2ffe,0x1e5107f9,0xedaf89bf,0x124ba67f,0xe58de68d,0x189200e1,
  194197. 0x6df5abee,0x962732a3,0xacbeb4aa,0x72cc37cf,0xe93c5a76,0xb0c5fa96,
  194198. 0xde63393b,0x4c2a317c,0x830b2d6c,0x97f65e67,0x1be5b96a,0x4afc3504,
  194199. 0x730ce66d,0x0bf40a60,0x9340d84f,0x96a1ba79,0x07626b08,0x3ee18254,
  194200. 0x7ab0cbf5,0x01db35db },
  194201. { 0xac0efee2,0x6e0fbc2d,0xd71dbb45,0x8406ebcd,0x19b69abe,0xe72bde3e,
  194202. 0x37e01822,0x49cb7e61,0x11458b4c,0xcbb8c01c,0x687c5d63,0x420b4847,
  194203. 0x454c6776,0x1847dfa1,0xd1839d18,0xbede911d,0x278df046,0x1b9dc9c9,
  194204. 0x881a336c,0x294bd62b,0x93e77adc,0x7f096879,0x43ce3ba7,0x7ac90665,
  194205. 0x7764eefc,0x148695fd,0x9ac465cf,0xe0c20f0b,0xa6e2cdb1,0x636e8d28,
  194206. 0xd755341d,0x7b6ba98c } },
  194207. /* 239 */
  194208. { { 0xc1881ab4,0xcb1d9e03,0xb3168c88,0x19c25d55,0x282364ce,0xa82d3d47,
  194209. 0xf161aa24,0x95994390,0xe1ebb2c9,0x7838bc00,0xbdec7a75,0x8fd5dfcc,
  194210. 0x4ff7220a,0x4dd203c2,0x0efeff48,0x5ec173b3,0x16428b35,0x99f1d2b3,
  194211. 0x056e813f,0xc06bd9e5,0xc0b319f1,0x929172ba,0xfd223b15,0x6ae0e384,
  194212. 0x98d091ed,0xbd01059e,0xa654648e,0x6b3168e4,0x3375e798,0x2211447f,
  194213. 0x71eb4508,0x47e81019 },
  194214. { 0xbc8c290d,0x7045d45a,0x810fb33a,0xa33d1355,0x46fbbf2f,0x2baf0092,
  194215. 0x385c7cd9,0xacff3f1b,0xe161985c,0xc5b150ec,0x2a888748,0xc6ee0a7f,
  194216. 0x5e88dcc8,0x9d888c8e,0xccb86443,0x4dd735f2,0x3c40f6f2,0xcc1e13b7,
  194217. 0xf3fed691,0xfc3a25ff,0x257ee5c7,0x4cb43b17,0xf32db135,0xaa654f93,
  194218. 0x02dff2d3,0x44f58d0a,0xa8ca6394,0x78e3f188,0xf3e86697,0x39646cce,
  194219. 0xe0dce87b,0x785b1902 } },
  194220. /* 240 */
  194221. { { 0xa92f9a20,0xfcce2361,0x9d64540e,0xb7bdca87,0x1d00d7c5,0xd4739a85,
  194222. 0x2e97c926,0x067ac8dc,0x78da6a8b,0x2aea3ffe,0x63c51b69,0x6828bf54,
  194223. 0x7155141a,0x76f1c479,0x3977d810,0xf4bcbef6,0x541bce7a,0x75bc4949,
  194224. 0xd17041a5,0xe01f4066,0x87755eaf,0xd282d5bd,0x59e7ae80,0x6e2107dd,
  194225. 0x382ab36f,0xaa56e166,0xb9d1d634,0x65ee8ef6,0xce4ed844,0x99a2160a,
  194226. 0xb7712c27,0x6557c367 },
  194227. { 0xd75b6e52,0x561b0268,0x118d0e89,0xb0813640,0x6a2eb1ae,0xcff53330,
  194228. 0x6d090894,0x4e462226,0xb5fc1d48,0xbb351227,0x57a3062d,0x9365ea07,
  194229. 0xd66e2dc5,0x4caca37b,0xb9095887,0x220d7d23,0x8c4473bf,0x9c0fd393,
  194230. 0x6787da4f,0xadff370a,0xd057f4b8,0xef0aebcc,0x1173f33a,0x205e744c,
  194231. 0x925a26b4,0xb8d1f0a5,0x722fbbfd,0xa9364f49,0x8227d284,0xc891ae77,
  194232. 0xa0e08ab4,0x15c40d04 } },
  194233. /* 241 */
  194234. { { 0x2a0e18d1,0x9baf169a,0x4c0327c2,0x9971c017,0x7bc262ce,0xd81a323f,
  194235. 0x818ff379,0x2099db8d,0x4cd3c330,0x663f663d,0x011a0553,0xef5325c3,
  194236. 0xf980a470,0x9cd70bdc,0x1c9ed070,0xe64452d1,0xac676e13,0xafbf43f4,
  194237. 0xae85c2a5,0x97bec0a6,0x470490c4,0x2faae550,0x491e6ba9,0x0ab97a87,
  194238. 0xaafa9914,0x4055f537,0x36726557,0xfc95adbb,0xd119d6bf,0x646343b9,
  194239. 0x9d341e37,0x788e94a0 },
  194240. { 0x9c53461a,0x053a6fe5,0x08e3b6ed,0x75ec897e,0x0768d939,0xa8f5d2f3,
  194241. 0xcc213d4f,0x9bd6bff6,0x05b0147c,0x590c7b41,0x7c7b8169,0x20a3628b,
  194242. 0x5bce78e9,0xc66a086e,0x4dec1d8f,0x3dd4d282,0xc19dcce9,0x890acf44,
  194243. 0xd8435a7e,0x6632d875,0xea6381b2,0x590167c1,0xf0dcc128,0xb2259797,
  194244. 0x46f8d463,0x91a612b4,0xc15efa39,0x42185d78,0x119f6788,0xdf55ec37,
  194245. 0x780dea93,0x91b19cc6 } },
  194246. /* 242 */
  194247. { { 0xcb5d8b80,0xebf2709d,0xfc35660e,0x03b96182,0x055ef969,0xb873d991,
  194248. 0xe47c4342,0xd1ea4b4d,0xd54f8867,0xcc4b9244,0xfd8d77ef,0x93b1a2ca,
  194249. 0xe8c1f563,0x068d24e7,0x49973056,0x5f5fabb6,0x0542374f,0x83248c50,
  194250. 0x3f38e913,0xc36de2b5,0x7bb680be,0xed07e8eb,0xd8f313b5,0x964813d7,
  194251. 0xafd2d392,0x7bb6a069,0x0848a31a,0xc06d848e,0xe4f0c325,0x6867fb2f,
  194252. 0x067343af,0x3c2ba834 },
  194253. { 0x9d3ad63b,0xab62d775,0x59e0eb1f,0x3f9cab97,0x3885e117,0x70332a63,
  194254. 0xe20b2f9e,0xf22cafce,0x49eca947,0xb529ba7e,0x6228d88d,0x24954216,
  194255. 0x39239561,0x80ea23ec,0xd4370644,0x1b8907e7,0x563e4e44,0x4b7fa455,
  194256. 0xb2a4b0fa,0xcca9829e,0x48060792,0xd0a720a4,0x246991ce,0x8ccdda0c,
  194257. 0x348d086b,0x37a2325b,0xf60aee13,0x566ed509,0x147f253f,0x3d30e091,
  194258. 0xc1073bd8,0x1fa627a5 } },
  194259. /* 243 */
  194260. { { 0x42478fd4,0xa11222a2,0x670b2000,0xacf4c6f1,0x8359c6de,0xf71bb04f,
  194261. 0x7b93cdbc,0x618e2829,0x230db60b,0x96e1bae3,0x965b3b29,0xf17fd3b4,
  194262. 0xbc7055dd,0xa58639c6,0x4b817d7f,0xc3ea92ed,0xd23b08a4,0x9082b2a6,
  194263. 0xdc17010e,0x8471228a,0x20e89d97,0x753b9e46,0x03ff77c9,0xcf7e4f97,
  194264. 0x2bbe60e5,0x6c3f8245,0xb80e017d,0x9e432cbc,0xc0a45edb,0x150a5acd,
  194265. 0x4798743e,0x67b8bd05 },
  194266. { 0xf4797cf7,0xe66079b4,0xd03fde02,0xe31c998a,0x54caaef1,0x5aa3763a,
  194267. 0xf7649711,0x64d9a1fe,0xaf29b1a7,0x7ce0dc73,0xfb66ca93,0x6661b083,
  194268. 0x32fb6a78,0xbf4d74fe,0xdf00a561,0x25f6ef09,0x831d1159,0x2bc4383f,
  194269. 0x536bde37,0x6d5cc10c,0x882cc65b,0xd4945f9f,0x451a99b8,0x81f48f13,
  194270. 0x6bac11a4,0x140161cd,0xf18a4a0a,0x9d94d4ed,0xa467a824,0x65363165,
  194271. 0xa4c9aedf,0x74297aa9 } },
  194272. /* 244 */
  194273. { { 0xe21124ba,0xc49758a4,0xa87ffbd2,0x99bd8198,0x3d6638a8,0x45fbcdd1,
  194274. 0x15f7bf76,0x94645ff8,0xc4e6d57e,0x5fa6736f,0x92e61db9,0x1eae6475,
  194275. 0xcbdf944a,0x79575c0c,0x25b31d74,0xa3d13047,0x4cab5ae6,0x7881df22,
  194276. 0x1a2887f2,0x8dbfd299,0xa26ac459,0x23d07590,0xd8661d4a,0x2e589852,
  194277. 0x8a0140f7,0x37b5c13b,0x3fb3782a,0x0f94199e,0x1bc14e90,0x722aa059,
  194278. 0xd55bbb12,0x89aab7ba },
  194279. { 0xd656bdc7,0x8b345a96,0xe176cd3b,0x43bdc8af,0x32d64c43,0xd69518b6,
  194280. 0x79b82b41,0xfcf364a7,0xffb0cf82,0x907b344e,0x5101287b,0xf3d0c83c,
  194281. 0x34cd90ef,0xe9f26a59,0x07082b5c,0xe5f5aaf2,0xece7c165,0x4eb72c75,
  194282. 0xbe986cd6,0xe9590a81,0xff1536aa,0xfeef498f,0xa8263d5e,0x04560243,
  194283. 0x54ae872b,0x940be14f,0xe3207686,0xbee7bcc9,0xc1bc4d7a,0xd496a27d,
  194284. 0x5940ab46,0x002dc297 } },
  194285. /* 245 */
  194286. { { 0xb69d60c3,0xee533937,0xfe972755,0x260be552,0xc0c725a6,0xb11fb78d,
  194287. 0xcab2e7c2,0x6982c27e,0xee2322cb,0x4bceedd9,0x122704f7,0x952b19ed,
  194288. 0x854a6165,0x2df4c285,0x7b192485,0xba40b5bf,0x0119f52a,0xfcbca950,
  194289. 0xe5add86f,0x7467d1cb,0xd9d0f2c1,0x9bf536fb,0xb8d4ebc9,0x3c296e34,
  194290. 0x05a81317,0x0495f8f4,0x73335f76,0x8c59e8d6,0xe0542122,0x0b53d324,
  194291. 0x3c3bda73,0x4d564535 },
  194292. { 0x7e5c0877,0x7322f800,0x0ca9a764,0x481b43e6,0xa2c12716,0x231f4f4b,
  194293. 0xed3136c2,0x09596857,0x38db30de,0xae826322,0x99908ebc,0x652fad40,
  194294. 0xaf0d231e,0x0b8d1814,0x09cbc349,0x2680c54b,0x4bf3bf8e,0xfd4562f3,
  194295. 0x092b595f,0x2985090b,0x5e15fc34,0xe6f39ca4,0xbc378168,0x70175191,
  194296. 0x845a4a87,0x906944b3,0x82a1541a,0xacc6d74a,0xb155c8b4,0xadc9bab3,
  194297. 0x77306c62,0x1f2f89ce } },
  194298. /* 246 */
  194299. { { 0x9affefdf,0x8253ef41,0x4cf9256b,0x05d7ece5,0xb444e483,0x377002f2,
  194300. 0xcba5471f,0xb189755f,0xd5cbe015,0xc88483cb,0x6a0b8429,0x254f7c69,
  194301. 0x61f3f61d,0x18850bd4,0x0a247157,0x7ba21089,0xd92eeb0d,0x35abbc2e,
  194302. 0x965dec89,0xfb56cabe,0xbc55684a,0x9da23724,0x6a7a7492,0xd8ba396f,
  194303. 0x2ef4ba46,0xfcb90db7,0x9909b27a,0xdd234fe0,0x76f4366e,0xbdf3c164,
  194304. 0x17e50d47,0x09c8097f },
  194305. { 0x60050c07,0x6a04b140,0x43a8e37e,0xc29e8318,0xbb55e41f,0xcb9429b2,
  194306. 0x2ce60e3a,0xed2fea5a,0xdb9d82f4,0xdc7b1ff3,0x687d37fa,0x48ebecc3,
  194307. 0xecb07539,0x79153e32,0x57075692,0x6a60054f,0x800759ba,0x3871cd0c,
  194308. 0x30922df1,0x17a7386f,0x83357b7c,0x4e9fc59e,0x39415186,0x1d26b3a9,
  194309. 0xd34db889,0x912a0222,0x59fcdb71,0x6672fcf4,0x44ff3036,0x5a3f268d,
  194310. 0x6911e16c,0x6f113ed3 } },
  194311. /* 247 */
  194312. { { 0x1836f1c9,0x52a9df59,0x4232307d,0xfa6519f5,0x5ded285a,0x8406c701,
  194313. 0xaf627f75,0x0a1545ca,0xace0417d,0xae1111ee,0xa6113443,0xfb28bdf6,
  194314. 0x52dbcbcb,0xde9ef0ab,0x7813e658,0xe9dc181b,0x99127225,0x0b1dabdb,
  194315. 0x22814c59,0x5f0598e3,0xd934ee7e,0x5c3b966e,0xb99ba4bf,0x4eb84eda,
  194316. 0x3c1b55e7,0xb2919a34,0x94aa860f,0xa9addb49,0xf6811ff6,0x1b7220df,
  194317. 0xd1a183e2,0x6636a23b },
  194318. { 0x20587283,0xdf5d5a2d,0xef07fc5d,0x0b3822c9,0x0ef6de38,0x1786bd55,
  194319. 0x25d1671d,0x163cf907,0x1cdb1def,0x74bf971f,0x0842fc4a,0x5749e830,
  194320. 0x27f854f7,0x0e2edbc7,0xbce24acb,0xbb27bbda,0x05bed08d,0xc1b19cec,
  194321. 0xf7c904bc,0xaada123e,0xd89982db,0x02429f1b,0x65f6e632,0x49d3616e,
  194322. 0xee59fd32,0xa3789fa8,0xfe9f29f5,0x160ba3ba,0xaf5378a0,0x0f2d3b61,
  194323. 0x73c2a6f8,0x7aeecc76 } },
  194324. /* 248 */
  194325. { { 0xdc43b0db,0xf3a4757c,0x98119cad,0x3d8a4e85,0x4616c156,0xf8095bf6,
  194326. 0x4f533e97,0x3e2a07bc,0x39cfc5ad,0xa9824367,0xcd68052c,0x18a6ba3a,
  194327. 0x8a1cec66,0xbd60e590,0x02b1b695,0xae3841a5,0x190a195b,0x986dff12,
  194328. 0xad31fd9b,0x2df2beac,0xcc728f7b,0x7d893224,0x0cf0a992,0xc38ea738,
  194329. 0x586a44ea,0xa8439a80,0x1615f03c,0xede7f7f0,0x27a1f885,0x48249908,
  194330. 0xb78a7645,0x28ec4006 },
  194331. { 0xa2fe0009,0xe1820c2e,0xf13874e9,0xe11ba5d2,0xc524db52,0x97522454,
  194332. 0x7fede529,0x4d477426,0x9b2500d4,0x01d3419a,0x1869244b,0xce08a492,
  194333. 0xdd1be1b9,0xba169023,0x32a301e0,0x242c3e54,0x70906788,0x9b56f7ba,
  194334. 0xc74a8cc4,0xf0ad2a09,0xd76f9439,0x99cd1841,0x621fb60e,0xeddafe0b,
  194335. 0xbc397634,0x056bee54,0xff7f0a84,0x4653f860,0x2011c0af,0x6bd4876f,
  194336. 0x0c9525c3,0x134f4cc7 } },
  194337. /* 249 */
  194338. { { 0xe938dff4,0x9621a3ec,0x486a79a3,0x7d101a7b,0xde950537,0xf2c4ef97,
  194339. 0xe65d87db,0xf3184099,0x373b8cfa,0xb89c7ffb,0xe842916e,0x68baa505,
  194340. 0x4ebea764,0xa790fd09,0xe592892b,0x679df6d4,0xfcfed741,0x2023331c,
  194341. 0x9880ff21,0x0bf4efd2,0xd0344501,0x7ca78ddd,0x342858c8,0x2cb09ecb,
  194342. 0x2575487a,0x9e5eb6dc,0xebcb0491,0x50675a15,0x7381d471,0x09d2e74f,
  194343. 0x83d3d6f4,0x6ea37829 },
  194344. { 0x4e5cc40a,0xc65c094b,0x1af37dfb,0x7a2e3f6a,0xf9026e44,0xef677e9d,
  194345. 0x93880f53,0xb7878c95,0x7f644aa9,0x4aa30b07,0x2f208c3c,0xa0c51683,
  194346. 0x658d663b,0x7c0277ae,0xae1d9130,0xef0b3c38,0x695c3ea4,0x302f37a7,
  194347. 0x6a0c5e0d,0xe004c1c5,0x20cbcf9f,0x9fd495c4,0x568a0e7c,0x706d5b9d,
  194348. 0x59286454,0x8b225dff,0x8d9a709c,0x527d4465,0x87c08d68,0x47c558da,
  194349. 0xbb4ef07d,0x606ee6e6 } },
  194350. /* 250 */
  194351. { { 0x57c621f6,0x02d99fc7,0x7fe83d48,0x292e40c1,0x9ef199b0,0x1bdfc7a1,
  194352. 0xe62c7666,0x78a04102,0xe6738753,0x16cda370,0x1e3a65af,0xbc81974d,
  194353. 0xf78fe209,0x19742048,0xbf5981c6,0xc83a058a,0x9c89702d,0xf26b2434,
  194354. 0x9d1a678a,0x988b2f1e,0xff29ae29,0x472bf9b0,0x1d7cf5ec,0xa143e398,
  194355. 0xb268ddd8,0x9c9d7e45,0x5fc4ff76,0x166cda55,0xa4aa7673,0x6044cdf0,
  194356. 0xe9148707,0x49dba6f7 },
  194357. { 0xa758e37a,0x20e47fb2,0x2d8eaf66,0xaf6b31d7,0x6f9c2210,0x352ad5f9,
  194358. 0x90efc32b,0x0093f727,0x41e4b264,0x435c99dc,0x05b15795,0xbfa878e0,
  194359. 0x0e673575,0x99c520a4,0x87eea759,0xca682594,0xf12a348b,0x029f7b81,
  194360. 0x2aa2ce35,0xa547cc18,0xead5e2c5,0xa11d874b,0x55682cdf,0x9af0349b,
  194361. 0x8bbe8e66,0xf86ebfea,0xf55394ab,0x3dab8782,0xebc8eb8f,0x458bf797,
  194362. 0x9b7de78c,0x4890a7a4 } },
  194363. /* 251 */
  194364. { { 0x8da995f6,0xd7299689,0xec6156ef,0xd39eaae7,0x356a82d5,0x6959040c,
  194365. 0xc135bcfe,0xb2046b21,0x0f595c78,0xea720b64,0xe7c5fb40,0x02824efa,
  194366. 0x0edb3bfc,0x97d8fd4c,0x79f24ebe,0x12f02905,0x187ea6b9,0x16fc47cf,
  194367. 0x789d5c23,0xc219fd27,0x89263ecc,0x233a6b6c,0x8b6d30a6,0x823634b2,
  194368. 0xc9b33680,0xca352e25,0x40c77456,0x9388d6ca,0x3c92065b,0xf8e55b0b,
  194369. 0x02439a76,0x5c17474b },
  194370. { 0x8aaccab5,0xd888e7c2,0xaaced05b,0x18027836,0xccec0f65,0x185b877d,
  194371. 0x125c2882,0x93cadc1c,0x67fdc54c,0x45df540a,0xc2788a33,0x4f3c86e2,
  194372. 0xe3a0fa2c,0x3e874469,0x273983cf,0xc59daa47,0x4a96d8a5,0x3063c48b,
  194373. 0xc2e58915,0xc38d2bcf,0x84e428c3,0x90e78b87,0xf0c4fd53,0x900a292c,
  194374. 0x941e6005,0xb7f92db7,0x6ca53a1c,0x95679241,0xb1ab0fa7,0x35f6f31d,
  194375. 0x7b58408c,0x5d675eb4 } },
  194376. /* 252 */
  194377. { { 0x870c6025,0xaeee1a77,0x91a2dfca,0xfc4a23b7,0x386b64c4,0x7b0e60c4,
  194378. 0xe5ae72b1,0xd5d5b17d,0x9eefa212,0x6dfc88ac,0xd4038b96,0x4feaefbe,
  194379. 0x8e2d2ecc,0x099ac356,0x012af207,0x548ea612,0x89c31218,0x4ffed9db,
  194380. 0xe0e67331,0x1c1e91c4,0xaf8300e0,0x009bb64f,0x6773c3be,0x8780501c,
  194381. 0xc08219fa,0xe0cd6ede,0xf81b06ff,0x7c055e07,0xe080b36f,0x82b63f9c,
  194382. 0x0a9feca3,0x02fccbaf },
  194383. { 0xb47cac61,0x9991d4d1,0xab86e12c,0x2e9d1687,0x2b94f042,0x8c6855ec,
  194384. 0x48e648e5,0xca400519,0xef89ac57,0x9ba91fb2,0x1be792cd,0x4f419206,
  194385. 0xbd0f1e15,0x82d221cb,0xfc444019,0x062eb13b,0x99790fdc,0xf3a97c32,
  194386. 0x6067a64b,0x4e796d94,0x6d23775a,0xc46dd300,0xed7f0f23,0x8672c4d5,
  194387. 0x3b4f63d7,0x821851dc,0xd26273f2,0x50a3ae0c,0xeac60f6f,0x800e58fc,
  194388. 0x13845545,0x56f1e456 } },
  194389. /* 253 */
  194390. { { 0x32c24f3b,0x01ccb3f6,0x06d817e6,0x99eb1c7f,0x6aa26776,0x8dc640bb,
  194391. 0x0845d5e0,0x7838affe,0xf81a79a8,0xf34fecb1,0x3e6819b0,0x6a2e282d,
  194392. 0x8237a4b8,0xc4b977ce,0x87636439,0x0f46b3db,0x97970497,0xa465f540,
  194393. 0x8791be43,0xd7e08762,0x34198ec6,0x00220b6c,0x093d94bb,0x57b38637,
  194394. 0x29d690b2,0x84012e16,0x20aad1a4,0x02ec9db5,0x85dc34e3,0xafee2fc6,
  194395. 0x25500cf8,0x911d1936 },
  194396. { 0xf5e5af5b,0x13b1bd58,0x7b6a22a7,0xa7ca263b,0xf3af2adc,0xab6bec4d,
  194397. 0xa04420bd,0x16651e59,0x4ba36c11,0x3b448b3b,0xff424310,0x3c62bfcd,
  194398. 0xf1a96cbb,0xde15c4a5,0xe4d1f980,0xbe0ad8a1,0x36673a3a,0x812bd14e,
  194399. 0x9212acdd,0x40303af6,0x576095ce,0x8f6dab9c,0x107f5ca5,0x7df1882a,
  194400. 0x8896a3b0,0xb903e63c,0xd863b3f0,0xf5048544,0xc09887de,0x5e5019b9,
  194401. 0xa0f53865,0x2be744fe } },
  194402. /* 254 */
  194403. { { 0x5b50f324,0x054cd05f,0x1ea3c7a2,0xb9b1eb24,0x7ff8e6b7,0x4a858a5c,
  194404. 0xec040882,0xd83902fe,0xd0cba9bd,0x72b26494,0xb29c9e1e,0xd0176f90,
  194405. 0xcebadb81,0x05d4eb02,0x372b8bfc,0x874405b1,0x79ead190,0x5c412881,
  194406. 0xec2b48cd,0xd44a3dd3,0x3f4d5033,0x84499a77,0x564c3a09,0xb37b38cd,
  194407. 0xf42e803b,0x80e99497,0xb8f518b2,0xc07b47a0,0x3568fde4,0xc710e3c5,
  194408. 0xcead0e7a,0x735f542f },
  194409. { 0x38380039,0xcaa9a171,0xf74d19c8,0xadfafe17,0xccbc1a8b,0x92d4393e,
  194410. 0xfe029705,0x3c5dbf39,0x930e9b36,0x4552b5ab,0x2afd494a,0x7ee63032,
  194411. 0x3f02ac43,0x826a9ad7,0x99356298,0x98c53562,0x7342bb39,0x0c869f87,
  194412. 0xe4f9b79a,0xd7510020,0xd34789a9,0x6361d1a4,0xcfa85637,0xf0ded5ba,
  194413. 0x88ac07e4,0x407ee73f,0x09ef1cbd,0xfac7d03f,0x4d475bad,0x25d697cb,
  194414. 0x14bd399e,0x1e984c9d } },
  194415. /* 255 */
  194416. { { 0x4850c817,0xc76d0561,0x3489812d,0xb08a5b19,0x5e58cbbe,0x7273d154,
  194417. 0x4be61e5a,0x8900b5fa,0xd7aeb8e1,0xaa088691,0xd35a3d4b,0xe66666af,
  194418. 0x57ec7d3d,0x38a2c199,0x668d6f5c,0xa0648e8f,0x7adc1746,0x1f9fc92c,
  194419. 0x843065c3,0x23a116c0,0x61e6ae69,0x36370a20,0x2aa47e73,0x626c3736,
  194420. 0xdeff6d84,0x540c25f2,0xcdbed2d4,0x9804824c,0x039a9492,0x4b5bfce0,
  194421. 0x76942e01,0x6c474a56 },
  194422. { 0x7d88e3a1,0x3aeb9a41,0xc484742a,0x105d3c88,0x3fe61131,0xe59de8d1,
  194423. 0x1a869e8b,0x148f5b6b,0xaa75d90a,0x7a8abc59,0x62146013,0x2f0c9bc7,
  194424. 0xc3824cd9,0x43faa747,0x6a5d0b92,0x81763a18,0x9bcbaebc,0xbbc341bc,
  194425. 0xf745d1dd,0xe1813160,0xb75ce5f4,0xa53ce52d,0xd50de4c2,0x15eae66c,
  194426. 0x75d7656d,0x5ed8996c,0xc4ca552a,0xe4ff5711,0x3c5305b4,0x215e985a,
  194427. 0xfa1ba2ce,0x6b258954 } },
  194428. };
  194429. /* Multiply the base point of P1024 by the scalar and return the result.
  194430. * If map is true then convert result to affine coordinates.
  194431. *
  194432. * Stripe implementation.
  194433. * Pre-generated: 2^0, 2^128, ...
  194434. * Pre-generated: products of all combinations of above.
  194435. * 8 doubles and adds (with qz=1)
  194436. *
  194437. * r Resulting point.
  194438. * k Scalar to multiply by.
  194439. * map Indicates whether to convert result to affine.
  194440. * ct Constant time required.
  194441. * heap Heap to use for allocation.
  194442. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  194443. */
  194444. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  194445. int map, int ct, void* heap)
  194446. {
  194447. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  194448. k, map, ct, heap);
  194449. }
  194450. #endif
  194451. /* Multiply the base point of P1024 by the scalar and return the result.
  194452. * If map is true then convert result to affine coordinates.
  194453. *
  194454. * km Scalar to multiply by.
  194455. * r Resulting point.
  194456. * map Indicates whether to convert result to affine.
  194457. * heap Heap to use for allocation.
  194458. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  194459. */
  194460. int sp_ecc_mulmod_base_1024(const mp_int* km, ecc_point* r, int map, void* heap)
  194461. {
  194462. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194463. sp_point_1024* point = NULL;
  194464. sp_digit* k = NULL;
  194465. #else
  194466. sp_point_1024 point[1];
  194467. sp_digit k[32];
  194468. #endif
  194469. int err = MP_OKAY;
  194470. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194471. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  194472. DYNAMIC_TYPE_ECC);
  194473. if (point == NULL)
  194474. err = MEMORY_E;
  194475. if (err == MP_OKAY) {
  194476. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  194477. DYNAMIC_TYPE_ECC);
  194478. if (k == NULL)
  194479. err = MEMORY_E;
  194480. }
  194481. #endif
  194482. if (err == MP_OKAY) {
  194483. sp_1024_from_mp(k, 32, km);
  194484. err = sp_1024_ecc_mulmod_base_32(point, k, map, 1, heap);
  194485. }
  194486. if (err == MP_OKAY) {
  194487. err = sp_1024_point_to_ecc_point_32(point, r);
  194488. }
  194489. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194490. if (k != NULL)
  194491. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  194492. if (point != NULL)
  194493. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  194494. #endif
  194495. return err;
  194496. }
  194497. /* Multiply the base point of P1024 by the scalar, add point a and return
  194498. * the result. If map is true then convert result to affine coordinates.
  194499. *
  194500. * km Scalar to multiply by.
  194501. * am Point to add to scalar mulitply result.
  194502. * inMont Point to add is in montgomery form.
  194503. * r Resulting point.
  194504. * map Indicates whether to convert result to affine.
  194505. * heap Heap to use for allocation.
  194506. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  194507. */
  194508. int sp_ecc_mulmod_base_add_1024(const mp_int* km, const ecc_point* am,
  194509. int inMont, ecc_point* r, int map, void* heap)
  194510. {
  194511. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194512. sp_point_1024* point = NULL;
  194513. sp_digit* k = NULL;
  194514. #else
  194515. sp_point_1024 point[2];
  194516. sp_digit k[32 + 32 * 2 * 5];
  194517. #endif
  194518. sp_point_1024* addP = NULL;
  194519. sp_digit* tmp = NULL;
  194520. int err = MP_OKAY;
  194521. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194522. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  194523. DYNAMIC_TYPE_ECC);
  194524. if (point == NULL)
  194525. err = MEMORY_E;
  194526. if (err == MP_OKAY) {
  194527. k = (sp_digit*)XMALLOC(
  194528. sizeof(sp_digit) * (32 + 32 * 2 * 5),
  194529. heap, DYNAMIC_TYPE_ECC);
  194530. if (k == NULL)
  194531. err = MEMORY_E;
  194532. }
  194533. #endif
  194534. if (err == MP_OKAY) {
  194535. addP = point + 1;
  194536. tmp = k + 32;
  194537. sp_1024_from_mp(k, 32, km);
  194538. sp_1024_point_from_ecc_point_32(addP, am);
  194539. }
  194540. if ((err == MP_OKAY) && (!inMont)) {
  194541. err = sp_1024_mod_mul_norm_32(addP->x, addP->x, p1024_mod);
  194542. }
  194543. if ((err == MP_OKAY) && (!inMont)) {
  194544. err = sp_1024_mod_mul_norm_32(addP->y, addP->y, p1024_mod);
  194545. }
  194546. if ((err == MP_OKAY) && (!inMont)) {
  194547. err = sp_1024_mod_mul_norm_32(addP->z, addP->z, p1024_mod);
  194548. }
  194549. if (err == MP_OKAY) {
  194550. err = sp_1024_ecc_mulmod_base_32(point, k, 0, 0, heap);
  194551. }
  194552. if (err == MP_OKAY) {
  194553. sp_1024_proj_point_add_32(point, point, addP, tmp);
  194554. if (map) {
  194555. sp_1024_map_32(point, point, tmp);
  194556. }
  194557. err = sp_1024_point_to_ecc_point_32(point, r);
  194558. }
  194559. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194560. if (k != NULL)
  194561. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  194562. if (point)
  194563. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  194564. #endif
  194565. return err;
  194566. }
  194567. #ifndef WOLFSSL_SP_SMALL
  194568. /* Generate a pre-computation table for the point.
  194569. *
  194570. * gm Point to generate table for.
  194571. * table Buffer to hold pre-computed points table.
  194572. * len Length of table.
  194573. * heap Heap to use for allocation.
  194574. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  194575. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  194576. */
  194577. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  194578. void* heap)
  194579. {
  194580. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194581. sp_point_1024* point = NULL;
  194582. sp_digit* t = NULL;
  194583. #else
  194584. sp_point_1024 point[1];
  194585. sp_digit t[5 * 2 * 32];
  194586. #endif
  194587. int err = MP_OKAY;
  194588. if ((gm == NULL) || (len == NULL)) {
  194589. err = BAD_FUNC_ARG;
  194590. }
  194591. if ((err == MP_OKAY) && (table == NULL)) {
  194592. *len = sizeof(sp_table_entry_1024) * 256;
  194593. err = LENGTH_ONLY_E;
  194594. }
  194595. if ((err == MP_OKAY) && (*len < (int)(sizeof(sp_table_entry_1024) * 256))) {
  194596. err = BUFFER_E;
  194597. }
  194598. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194599. if (err == MP_OKAY) {
  194600. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  194601. DYNAMIC_TYPE_ECC);
  194602. if (point == NULL)
  194603. err = MEMORY_E;
  194604. }
  194605. if (err == MP_OKAY) {
  194606. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 5 * 2 * 32, heap,
  194607. DYNAMIC_TYPE_ECC);
  194608. if (t == NULL)
  194609. err = MEMORY_E;
  194610. }
  194611. #endif
  194612. if (err == MP_OKAY) {
  194613. sp_1024_point_from_ecc_point_32(point, gm);
  194614. err = sp_1024_gen_stripe_table_32(point,
  194615. (sp_table_entry_1024*)table, t, heap);
  194616. }
  194617. if (err == 0) {
  194618. *len = sizeof(sp_table_entry_1024) * 256;
  194619. }
  194620. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194621. if (t != NULL)
  194622. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  194623. if (point != NULL)
  194624. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  194625. #endif
  194626. return err;
  194627. }
  194628. #else
  194629. /* Generate a pre-computation table for the point.
  194630. *
  194631. * gm Point to generate table for.
  194632. * table Buffer to hold pre-computed points table.
  194633. * len Length of table.
  194634. * heap Heap to use for allocation.
  194635. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  194636. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  194637. */
  194638. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  194639. void* heap)
  194640. {
  194641. int err = 0;
  194642. if ((gm == NULL) || (len == NULL)) {
  194643. err = BAD_FUNC_ARG;
  194644. }
  194645. if ((err == 0) && (table == NULL)) {
  194646. *len = 0;
  194647. err = LENGTH_ONLY_E;
  194648. }
  194649. if ((err == 0) && (*len != 0)) {
  194650. err = BUFFER_E;
  194651. }
  194652. if (err == 0) {
  194653. *len = 0;
  194654. }
  194655. (void)heap;
  194656. return err;
  194657. }
  194658. #endif
  194659. /* Multiply the point by the scalar and return the result.
  194660. * If map is true then convert result to affine coordinates.
  194661. *
  194662. * km Scalar to multiply by.
  194663. * gm Point to multiply.
  194664. * table Pre-computed points.
  194665. * r Resulting point.
  194666. * map Indicates whether to convert result to affine.
  194667. * heap Heap to use for allocation.
  194668. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  194669. */
  194670. int sp_ecc_mulmod_table_1024(const mp_int* km, const ecc_point* gm, byte* table,
  194671. ecc_point* r, int map, void* heap)
  194672. {
  194673. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194674. sp_point_1024* point = NULL;
  194675. sp_digit* k = NULL;
  194676. #else
  194677. sp_point_1024 point[1];
  194678. sp_digit k[32];
  194679. #endif
  194680. int err = MP_OKAY;
  194681. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194682. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  194683. DYNAMIC_TYPE_ECC);
  194684. if (point == NULL) {
  194685. err = MEMORY_E;
  194686. }
  194687. if (err == MP_OKAY) {
  194688. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap, DYNAMIC_TYPE_ECC);
  194689. if (k == NULL)
  194690. err = MEMORY_E;
  194691. }
  194692. #endif
  194693. if (err == MP_OKAY) {
  194694. sp_1024_from_mp(k, 32, km);
  194695. sp_1024_point_from_ecc_point_32(point, gm);
  194696. #ifndef WOLFSSL_SP_SMALL
  194697. err = sp_1024_ecc_mulmod_stripe_32(point, point,
  194698. (const sp_table_entry_1024*)table, k, map, 0, heap);
  194699. #else
  194700. (void)table;
  194701. err = sp_1024_ecc_mulmod_32(point, point, k, map, 0, heap);
  194702. #endif
  194703. }
  194704. if (err == MP_OKAY) {
  194705. err = sp_1024_point_to_ecc_point_32(point, r);
  194706. }
  194707. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  194708. if (k != NULL)
  194709. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  194710. if (point != NULL)
  194711. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  194712. #endif
  194713. return err;
  194714. }
  194715. /* Multiply p* in projective co-ordinates by q*.
  194716. *
  194717. * r.x = p.x - (p.y * q.y)
  194718. * r.y = (p.x * q.y) + p.y
  194719. *
  194720. * px [in,out] A single precision integer - X ordinate of number to multiply.
  194721. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  194722. * q [in] A single precision integer - multiplier.
  194723. * t [in] Two single precision integers - temps.
  194724. */
  194725. static void sp_1024_proj_mul_qx1_32(sp_digit* px, sp_digit* py,
  194726. const sp_digit* q, sp_digit* t)
  194727. {
  194728. sp_digit* t1 = t;
  194729. sp_digit* t2 = t + 2 * 32;
  194730. /* t1 = p.x * q.y */
  194731. sp_1024_mont_mul_32(t1, px, q, p1024_mod, p1024_mp_mod);
  194732. /* t2 = p.y * q.y */
  194733. sp_1024_mont_mul_32(t2, py, q, p1024_mod, p1024_mp_mod);
  194734. /* r.x = p.x - (p.y * q.y) */
  194735. sp_1024_mont_sub_32(px, px, t2, p1024_mod);
  194736. /* r.y = (p.x * q.y) + p.y */
  194737. sp_1024_mont_add_32(py, t1, py, p1024_mod);
  194738. }
  194739. /* Square p* in projective co-ordinates.
  194740. *
  194741. * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2
  194742. * py' = 2 * p.x * p.y
  194743. *
  194744. * px [in,out] A single precision integer - X ordinate of number to square.
  194745. * py [in,out] A single precision integer - Y ordinate of number to square.
  194746. * t [in] Two single precision integers - temps.
  194747. */
  194748. static void sp_1024_proj_sqr_32(sp_digit* px, sp_digit* py, sp_digit* t)
  194749. {
  194750. sp_digit* t1 = t;
  194751. sp_digit* t2 = t + 2 * 32;
  194752. /* t1 = p.x + p.y */
  194753. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  194754. /* t2 = p.x - p.y */
  194755. sp_1024_mont_sub_32(t2, px, py, p1024_mod);
  194756. /* r.y = p.x * p.y */
  194757. sp_1024_mont_mul_32(py, px, py, p1024_mod, p1024_mp_mod);
  194758. /* r.x = (p.x + p.y) * (p.x - p.y) */
  194759. sp_1024_mont_mul_32(px, t1, t2, p1024_mod, p1024_mp_mod);
  194760. /* r.y = (p.x * p.y) * 2 */
  194761. sp_1024_mont_dbl_32(py, py, p1024_mod);
  194762. }
  194763. #ifdef WOLFSSL_SP_SMALL
  194764. /* Perform the modular exponentiation in Fp* for SAKKE.
  194765. *
  194766. * Simple square and multiply when expontent bit is one algorithm.
  194767. * Square and multiply performed in Fp*.
  194768. *
  194769. * base [in] Base. MP integer.
  194770. * exp [in] Exponent. MP integer.
  194771. * res [out] Result. MP integer.
  194772. * returns 0 on success and MEMORY_E if memory allocation fails.
  194773. */
  194774. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  194775. {
  194776. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  194777. !defined(WOLFSSL_SP_NO_MALLOC)
  194778. sp_digit* td;
  194779. sp_digit* t;
  194780. sp_digit* tx;
  194781. sp_digit* ty;
  194782. sp_digit* b;
  194783. sp_digit* e;
  194784. #else
  194785. sp_digit t[4 * 2 * 32];
  194786. sp_digit tx[2 * 32];
  194787. sp_digit ty[2 * 32];
  194788. sp_digit b[2 * 32];
  194789. sp_digit e[2 * 32];
  194790. #endif
  194791. sp_digit* r;
  194792. int err = MP_OKAY;
  194793. int bits;
  194794. int i;
  194795. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  194796. !defined(WOLFSSL_SP_NO_MALLOC)
  194797. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 32 * 2, NULL,
  194798. DYNAMIC_TYPE_TMP_BUFFER);
  194799. if (td == NULL) {
  194800. err = MEMORY_E;
  194801. }
  194802. #endif
  194803. if (err == MP_OKAY) {
  194804. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  194805. !defined(WOLFSSL_SP_NO_MALLOC)
  194806. t = td;
  194807. tx = td + 4 * 32 * 2;
  194808. ty = td + 5 * 32 * 2;
  194809. b = td + 6 * 32 * 2;
  194810. e = td + 7 * 32 * 2;
  194811. #endif
  194812. r = ty;
  194813. bits = mp_count_bits(exp);
  194814. sp_1024_from_mp(b, 32, base);
  194815. sp_1024_from_mp(e, 32, exp);
  194816. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  194817. sp_1024_mul_32(b, b, p1024_norm_mod);
  194818. err = sp_1024_mod_32(b, b, p1024_mod);
  194819. }
  194820. if (err == MP_OKAY) {
  194821. XMEMCPY(ty, b, sizeof(sp_digit) * 32);
  194822. for (i = bits - 2; i >= 0; i--) {
  194823. sp_1024_proj_sqr_32(tx, ty, t);
  194824. if ((e[i / 32] >> (i % 32)) & 1) {
  194825. sp_1024_proj_mul_qx1_32(tx, ty, b, t);
  194826. }
  194827. }
  194828. }
  194829. if (err == MP_OKAY) {
  194830. sp_1024_mont_inv_32(tx, tx, t);
  194831. XMEMSET(tx + 32, 0, sizeof(sp_digit) * 32);
  194832. sp_1024_mont_reduce_32(tx, p1024_mod, p1024_mp_mod);
  194833. XMEMSET(ty + 32, 0, sizeof(sp_digit) * 32);
  194834. sp_1024_mont_reduce_32(ty, p1024_mod, p1024_mp_mod);
  194835. sp_1024_mul_32(r, tx, ty);
  194836. err = sp_1024_mod_32(r, r, p1024_mod);
  194837. }
  194838. if (err == MP_OKAY) {
  194839. err = sp_1024_to_mp(r, res);
  194840. }
  194841. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  194842. !defined(WOLFSSL_SP_NO_MALLOC)
  194843. if (td != NULL) {
  194844. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  194845. }
  194846. #endif
  194847. return err;
  194848. }
  194849. #else
  194850. /* Pre-computed table for exponentiating g.
  194851. * Striping: 8 points at a distance of (128 combined for
  194852. * a total of 256 points.
  194853. */
  194854. static const sp_digit sp_1024_g_table[256][32] = {
  194855. { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  194856. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  194857. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  194858. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  194859. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  194860. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  194861. 0x00000000, 0x00000000 },
  194862. { 0x335c1685, 0x170a46d2, 0xe1007a58, 0xeac9e971, 0x43ca4a73,
  194863. 0x40e8f3df, 0x82642475, 0x2646f815, 0xb36576d1, 0x3af49bb4,
  194864. 0x72bf1afb, 0xd89e2d14, 0x2fd151e6, 0x27be882c, 0x8f88717c,
  194865. 0xaddedc85, 0x16ac6c6f, 0xd6d859bf, 0x2d8eae58, 0x0e741a1b,
  194866. 0x61c1f30d, 0x6faf7a00, 0x9b67e096, 0x66dbd09a, 0x7d3b4f7d,
  194867. 0x21f11c06, 0xc727c98e, 0x6152ba02, 0xe86cb221, 0xafd58891,
  194868. 0x6bd3baf4, 0x59e93c6a },
  194869. { 0x71dd4594, 0xe54dd36f, 0x00aef1e6, 0xbbc9cc9f, 0xa19f6530,
  194870. 0x9ea5a44e, 0x3f520928, 0x8588aa99, 0x8f5c1418, 0x9753794c,
  194871. 0xc11399fa, 0x118bd792, 0xf5cb6ab5, 0xb9bd3afd, 0x2ecb9652,
  194872. 0x813d1cb2, 0x40389813, 0xfd456267, 0x4ac8431c, 0x51f7119b,
  194873. 0x0a180eb6, 0xdd9f6a91, 0x9f7bfa2e, 0x13946d17, 0x50a9d0d9,
  194874. 0x16f18631, 0x6f8373d3, 0x5f19c20d, 0x9b6a52b9, 0xbe85ac6a,
  194875. 0x74f62e03, 0x63ef187b },
  194876. { 0x016f45e7, 0x7c376b7f, 0x2bec82f8, 0x1c1bdb57, 0xce429b60,
  194877. 0x7392f741, 0xc7afd81d, 0x6fdbf0a2, 0x7241098b, 0xbda41b1f,
  194878. 0xbb60f8cf, 0x5b407474, 0xb330bc4d, 0x933e0d41, 0x733fa3be,
  194879. 0xae182830, 0x0f5c6cd1, 0xa0ed299b, 0x3f9860c8, 0x7ff3354e,
  194880. 0x15559c41, 0xb1360986, 0x129f85cb, 0xab0cb63c, 0x47685fbe,
  194881. 0x682ecc49, 0xeb199633, 0x505e8ec2, 0xddac2cda, 0x90dcc794,
  194882. 0xf192da23, 0x4fe6791c },
  194883. { 0x05e8733c, 0x94a423d5, 0x1d5717c1, 0xcc845e65, 0xe961b322,
  194884. 0x237c7e88, 0xdb4181cc, 0x0c4471c6, 0x713bd721, 0x00c875e2,
  194885. 0xb2c17b09, 0x9dfde9ed, 0xe88ceaf6, 0x430a6de5, 0x7b81cea6,
  194886. 0xaaa7a61a, 0x233f98d5, 0xea52d026, 0x60689a9a, 0xb55efdd0,
  194887. 0x5cac4aab, 0x30cfa7ce, 0x8e950761, 0xfa4db114, 0x4e9a1e52,
  194888. 0x309570c4, 0x1a040170, 0x18c21f61, 0xbe78d9d2, 0x555d1ffe,
  194889. 0x561db297, 0x04482a18 },
  194890. { 0x73d486d8, 0xe7758ac2, 0x61cdc1e7, 0x8169f946, 0x2188ab4f,
  194891. 0x723c99fc, 0xf3373630, 0xa0e54f02, 0xbd8c2260, 0x560bee25,
  194892. 0x4531bc60, 0x28fc307c, 0x7e44feb5, 0xd6f21f1a, 0x57128d37,
  194893. 0xc8e4499c, 0xd7b2ea45, 0x963b053e, 0x32a3d222, 0x40c27a04,
  194894. 0x35459668, 0x5b51854d, 0xd73557e9, 0x66e1a49f, 0x8692077a,
  194895. 0x0d267fd9, 0xe7342702, 0xfa1350d3, 0x68ccdb44, 0x1a9c3f25,
  194896. 0xdedbf89f, 0x833a0ff8 },
  194897. { 0xab376b76, 0xa8c419c7, 0x27d0f0cc, 0x3b7294f3, 0xa90c514d,
  194898. 0xe56bb9e2, 0xa62575a6, 0x931ba51e, 0x098c0a88, 0x56fee07b,
  194899. 0xb4c16a2a, 0x04be5aee, 0xe6eb260b, 0xe513350b, 0xa1d5c270,
  194900. 0x339edad6, 0xe9dbadd1, 0xf366ed59, 0x2dd06ec0, 0x4213be88,
  194901. 0xcb1187db, 0x22d639c8, 0xd8a1058a, 0x1fec95e1, 0xa2b744f1,
  194902. 0x03f73ea6, 0xf4f05c0c, 0x741fd51a, 0x85f811a0, 0x2e2df95a,
  194903. 0xeb24965f, 0x692b3ce3 },
  194904. { 0xd2a127b4, 0x0ce6cb72, 0x8f92816f, 0x66a46ea5, 0x47a37616,
  194905. 0x43ecf463, 0xe0ab96ee, 0x163d9a01, 0xb2edbe8c, 0xc8145c6d,
  194906. 0x4de4e665, 0x2f426cae, 0x74e252f9, 0x174d0b40, 0x7d2af831,
  194907. 0x54c240d7, 0x3d652936, 0x581fa397, 0xa09d4695, 0x05b9491c,
  194908. 0x5452643c, 0x8c4e8533, 0xd4128327, 0x32d64331, 0x70361f25,
  194909. 0x64479038, 0x89ef09f2, 0x774191b1, 0x81de5fe0, 0xc0cf0aaf,
  194910. 0xf40042d6, 0x333e430a },
  194911. { 0xcf26d3b7, 0x5df04de4, 0xb53f79be, 0x57a77306, 0x1808b664,
  194912. 0xa4013c5f, 0x85037360, 0xef291ea4, 0x0b061037, 0x1ffc9d7d,
  194913. 0x65c913bb, 0xd9d04dd9, 0xf13b8587, 0x948a37af, 0xfe3ee755,
  194914. 0xb5443483, 0x04631386, 0x3fc21e74, 0xcddeb58c, 0xb3a104e5,
  194915. 0x6572cd52, 0x94fe1862, 0x15aaa408, 0xeb9a71a1, 0x459ea462,
  194916. 0x8adc6fe5, 0x4aeb02a3, 0xbb18d175, 0x2f7791d1, 0xae127636,
  194917. 0xd6bbd708, 0x10e8b31d },
  194918. { 0x3ed9f1af, 0xb87f03e5, 0x56676166, 0x03ad2477, 0x74ce15b8,
  194919. 0x38dcd630, 0x26b1e85b, 0x1877e2b0, 0x1af99c15, 0xb1654d17,
  194920. 0x9382547a, 0x9782e9e4, 0x26d55ef5, 0x6dc7fc7c, 0x2fbeb54c,
  194921. 0x9038f95d, 0x036c0357, 0xfe590dfe, 0x4fdc3f7f, 0xcfcb6eae,
  194922. 0xf35e1a88, 0xcb1fbc54, 0xda0a5568, 0x3c8e1db2, 0x5b6f5557,
  194923. 0x9a87393f, 0xe7ac0a06, 0x38646b32, 0x2a8495ab, 0xfd261c83,
  194924. 0x0cdcc4bc, 0x6485524c },
  194925. { 0xc4a6ff2a, 0x1abfb3e2, 0x35a6428a, 0x2aa03fba, 0x89aff742,
  194926. 0x884227f0, 0xba5dbd93, 0x2337883a, 0xd2a182cb, 0x38186ae9,
  194927. 0x49a01f05, 0xb9f0764d, 0x917b1e7a, 0x92411feb, 0x570cbb5b,
  194928. 0x700b1903, 0xb914be7c, 0x5d5181d5, 0x1981182d, 0x135c4437,
  194929. 0x574b9997, 0x32758d24, 0x632d28b2, 0xa650a8f5, 0xfa383f09,
  194930. 0x24078bac, 0x00a33d80, 0x6546a60c, 0x2df8b449, 0xa4061c7a,
  194931. 0xf234563c, 0x1f76f3f2 },
  194932. { 0x44c436b0, 0x9aa2c143, 0x1f69c87a, 0x79070556, 0x5f6db2df,
  194933. 0x35f3117b, 0xed56ba82, 0x85761f41, 0x7d0afa48, 0xf831464f,
  194934. 0x3adce71e, 0xa99f2915, 0x116b7488, 0xb27bf693, 0x9bb9443a,
  194935. 0xa98a5a8c, 0x2ee5fde8, 0x7f878026, 0x1812acb7, 0x3a6f93dd,
  194936. 0xdc84bc92, 0xaf92a4cc, 0xf1d4995a, 0x3c2562af, 0x04ed899d,
  194937. 0xfd9fc33c, 0x4ed2a538, 0xc028ca94, 0x049ea726, 0xd0f367bb,
  194938. 0x3d108e05, 0x04924ffb },
  194939. { 0xc673562f, 0x06548e3d, 0xe2eae48c, 0xd3b33025, 0x5e1c6977,
  194940. 0xe61fd32b, 0x6ebe557b, 0x424e2064, 0x41d6e18e, 0x767391c0,
  194941. 0x14d7e95b, 0x4b8ebb8e, 0x20991b8c, 0x4ae8b7d4, 0xe01290d3,
  194942. 0xf8a0df66, 0x925e5f4e, 0xc97e24a3, 0x1508272a, 0x79a7b2cb,
  194943. 0x25072661, 0xb40b072e, 0x9062fa49, 0xdad9e182, 0xf3c53bce,
  194944. 0x8780a784, 0x9f142799, 0x58a82b76, 0xc1468426, 0x08cd849c,
  194945. 0xc380ae35, 0x4dfce809 },
  194946. { 0xd527b780, 0x45069cb2, 0x977930dd, 0xd52da015, 0xe27d0263,
  194947. 0x10cc600b, 0xbb2d1b2b, 0x34102c26, 0x554adf3c, 0x4c652623,
  194948. 0x45f0ff47, 0xd6891382, 0xca916e7c, 0x83fa8cc5, 0xd15c8d8a,
  194949. 0x1e10f139, 0x81dc56b3, 0xf173dc2e, 0x5c4ed9ba, 0x7fcecb04,
  194950. 0x47d01228, 0x307fd7d8, 0x9f3a532f, 0x24a57153, 0xe2153c22,
  194951. 0x59e9e81d, 0xe428a408, 0xc562595d, 0x9339bd23, 0xdc7daff8,
  194952. 0xb8a06802, 0x0d075908 },
  194953. { 0xde085f2a, 0x870af2a7, 0xbe99b2e5, 0x88fcd24f, 0x59ca413b,
  194954. 0x88c0d261, 0x8559f851, 0x1f02a2e4, 0xf622da0d, 0x83b96021,
  194955. 0x6dca3615, 0x5c05c2f5, 0x7910c682, 0x0148cf1c, 0x272695be,
  194956. 0x392f2896, 0xa8d64ef6, 0x883d0bb5, 0x1cfcbc52, 0xef0d2244,
  194957. 0x526117e5, 0xf5dafcec, 0xf04928e9, 0xb68612b9, 0x393f2e2a,
  194958. 0x283f744d, 0x700c1151, 0xfbeed7ed, 0xa4360dfe, 0xf2cde215,
  194959. 0x2f08535a, 0x24fa961c },
  194960. { 0x616df7f6, 0x0767db3f, 0xfbd90326, 0x643057d8, 0x6e82d544,
  194961. 0x174daa90, 0x689643db, 0x2284f345, 0xcc89a060, 0x18b191df,
  194962. 0xd6c27d12, 0xbab46af4, 0xc9895145, 0x5a57f486, 0xcc942f9e,
  194963. 0xc03214e9, 0x41950158, 0x273e1c8f, 0x39ad43ab, 0x8ceb759f,
  194964. 0xe50ee173, 0x5e1b8b7f, 0x8f4d7d4e, 0xf635b1fc, 0x755603f3,
  194965. 0x8eff77e3, 0x7752fa60, 0x201f61d1, 0x4a6fb6e1, 0x94d7a03d,
  194966. 0xfc4f0114, 0x371cc23d },
  194967. { 0xda90c351, 0x289b115d, 0x364d9c06, 0x6d196ebf, 0xf650b31b,
  194968. 0x77a89202, 0x6f57642f, 0xcc28c164, 0x08100127, 0xdc4f7e36,
  194969. 0xdc4c807b, 0x8836cd08, 0xe00240f2, 0x1280f156, 0x99cb3953,
  194970. 0x3f9a6d78, 0x3a802038, 0x40a494d3, 0xe87d3474, 0x45697e91,
  194971. 0x26dde24a, 0x70d97d07, 0x7640c30e, 0x06f6a58d, 0x5ba6e6c6,
  194972. 0x03c2c0e8, 0xf1bc13e8, 0x330f6a7a, 0xc9f4d78f, 0x3e602e4f,
  194973. 0x0c80fb7f, 0x92b6bca0 },
  194974. { 0x5f00822e, 0x2e3d5c83, 0xb8b16f12, 0x0e825712, 0x92b0a330,
  194975. 0x81c329c4, 0xa7cc1954, 0x6b4e32ad, 0x1bb1413f, 0x0bee9cee,
  194976. 0x4a92ca27, 0xedfb7baa, 0xea3b9153, 0xcd472afa, 0x00f0c0f9,
  194977. 0xe8f09e7e, 0x5cdebb70, 0xa4e1d872, 0x4a9b63b6, 0xfe2bae08,
  194978. 0x3fd58f65, 0xf40141b8, 0xa3b62759, 0xd7ec5eda, 0x790e3088,
  194979. 0x9aaf6e67, 0x1f277e31, 0x215ad830, 0xcf33871c, 0xe7db4b98,
  194980. 0x4f02f89d, 0x71ff62c9 },
  194981. { 0x2a4a84d9, 0xaa4c7102, 0x5ebc71e6, 0xe2ee4acd, 0xf1cd6578,
  194982. 0x3b11a8a5, 0xfff120a5, 0x83f5ef9f, 0x09e65033, 0xa4c598e1,
  194983. 0xca044180, 0xe1e9f990, 0xf59828c1, 0x8b832d46, 0x33af536b,
  194984. 0x753f28a0, 0xb6d4f68a, 0x92edc4b1, 0x72ccd1f0, 0xedde692a,
  194985. 0xd2226432, 0xd3aa0f7d, 0xa3d2661c, 0x38dbb63e, 0xfdc37dda,
  194986. 0xf1e19fc6, 0x84ef6b4c, 0x6c18b350, 0xdf1bba69, 0xe6a83fe9,
  194987. 0x5f958273, 0x40fd47e7 },
  194988. { 0x267140a4, 0x5b88b746, 0xeab6f2fb, 0x6dbbfc1e, 0x69862548,
  194989. 0xdd9ec88e, 0x2eb6efc2, 0x69beeba1, 0x8ac8ff88, 0xcfc2214a,
  194990. 0xb5a21950, 0x95d5c96e, 0x4171fb69, 0x93389c05, 0x1b468337,
  194991. 0x2d85d452, 0x4113425c, 0x14d68a08, 0xec6c2174, 0xe52c0139,
  194992. 0xf730084d, 0x20cf0b97, 0x1f578aa3, 0x1ac16a26, 0xf9b6ae43,
  194993. 0x18b9fab3, 0xd854a695, 0x68d82111, 0xdffbe286, 0x0b334d98,
  194994. 0xe639338c, 0x5b1c1157 },
  194995. { 0x72b6bb8f, 0x90edaab1, 0x02fc92c2, 0x8dc64ed2, 0xfe694c73,
  194996. 0xf42ba3c5, 0xcb54dce4, 0x316dc65f, 0x632420dc, 0xcb2d66a3,
  194997. 0x056dcf94, 0x16e706e7, 0xa4f32c9d, 0x2809c764, 0xea6edca8,
  194998. 0xab18d830, 0x81c65f57, 0x4fd1ace6, 0x7da12c10, 0x1f91651c,
  194999. 0xc7791a48, 0x0ac3bd66, 0x785e67a3, 0xb6ad1cf4, 0xda0fd591,
  195000. 0xe4d3fc44, 0x6e1c6344, 0xce164801, 0x33e50ab3, 0x84de9cb8,
  195001. 0xa756eef4, 0x963ab83a },
  195002. { 0xdf4ea5a3, 0x944b47d8, 0x5cfe45fe, 0x96568815, 0x8a3c3564,
  195003. 0xd16e7d58, 0xe7c99e15, 0x84e55b3e, 0xf55071bc, 0x3fee204d,
  195004. 0x04057dce, 0x71006f29, 0xbba75570, 0xfe8c390d, 0x3319adac,
  195005. 0x3645bcb6, 0x7c20bfd8, 0x8189e8b0, 0x7d7d9578, 0x8e550969,
  195006. 0xb99f4e3b, 0x037d1321, 0xa60cfb6a, 0x011b2521, 0x837382da,
  195007. 0x66594aaa, 0x83c1dc07, 0xc89b91fd, 0x076b9884, 0x6b82b899,
  195008. 0xbe45c558, 0x443480fc },
  195009. { 0x9114221a, 0xf8ffffb4, 0x3e857a7a, 0x4aec4f2e, 0x0fa54787,
  195010. 0x42e2d0e4, 0xd6f96152, 0xef3e6b31, 0xfbfe9b77, 0xb2296537,
  195011. 0xfb43a86a, 0xc2a9d0f2, 0x24572ac6, 0x241284ed, 0xe721ba7b,
  195012. 0xa3868917, 0xc117a78d, 0xdbef7c00, 0xd31605ac, 0x38149071,
  195013. 0x065a8ee9, 0xc2dada9e, 0xc442be82, 0xd5b138d8, 0xf6d72b58,
  195014. 0x9b6c224b, 0x8eb03e6d, 0xb9d355cf, 0xa1700371, 0xab6d1eb0,
  195015. 0xcffaa7eb, 0x97118a88 },
  195016. { 0xcdecb5d8, 0xbf9c59a2, 0xa93a6866, 0x8083c81b, 0x04774fbf,
  195017. 0x24e0dd81, 0xa02070b4, 0xe779a3ca, 0x0fbfb781, 0x9d352fbb,
  195018. 0x3ef2a1c4, 0xa8b0d820, 0x14b3e501, 0xb858637b, 0x8a882ff2,
  195019. 0x5ba70a49, 0x3b06efa5, 0xa2730083, 0x102fee2a, 0xa42c02f4,
  195020. 0x8a0223a5, 0xe4e76299, 0x85c3fc72, 0xdba2ba26, 0xfe52eae7,
  195021. 0x554fe763, 0x270f45f6, 0x30b5405a, 0xa573387c, 0xd56a177a,
  195022. 0x4b71fa82, 0x17c0778d },
  195023. { 0x2735e37b, 0x0e6dff1d, 0x656ec572, 0xc9884e56, 0x9ebba978,
  195024. 0xa2f5ac9d, 0xba09f3c4, 0x40fa4518, 0xf5b04377, 0x8c3fa177,
  195025. 0x967a2eca, 0xa1a1decd, 0x0528bd40, 0x768bca70, 0x18691c4a,
  195026. 0xf224952b, 0xe86d5fd5, 0x16e12c45, 0x37859a6a, 0x7a0d9157,
  195027. 0xa0ffce0e, 0x723f4309, 0xa96cc9a3, 0x5a8db79b, 0x1ad23a38,
  195028. 0x6dd12ae0, 0xe2bf5d84, 0x9ffec3a1, 0xa452ed66, 0xd6ce84e1,
  195029. 0x571fe4c6, 0x1219d5c8 },
  195030. { 0x262969eb, 0x43eaa67f, 0x2f03e773, 0x3a3ab39d, 0x57bb0909,
  195031. 0xe6127e51, 0x8d150274, 0x0f82b0ed, 0xe580bdbd, 0xffffcad8,
  195032. 0xa9743e6b, 0x51d3d075, 0x8bac11d6, 0x1484bdb1, 0xeb24c388,
  195033. 0x95cd9990, 0x7fac67c6, 0x216a61d0, 0xa04e6b87, 0x4308f762,
  195034. 0xcba57cc8, 0x2865dd61, 0xd234a07a, 0x3c296b0d, 0x3a0793f9,
  195035. 0x76f92839, 0x0be29ece, 0x70b57e1f, 0x7e626f42, 0x1314a82f,
  195036. 0xd657f230, 0x2c8d7ab2 },
  195037. { 0x0825e4d6, 0x67cf5892, 0x6ef83b44, 0xdf51eaa5, 0x1310108d,
  195038. 0x63e665d8, 0x8dd0963f, 0x229f89f5, 0x9df6436a, 0x8c4b14dd,
  195039. 0xd45ebba7, 0x99dae469, 0x5a4df381, 0x118aab77, 0x29e37feb,
  195040. 0xda8978bd, 0xaca2d7ef, 0x69ced5aa, 0xc67d6a8a, 0x6c98d05d,
  195041. 0x77f84a34, 0x7474bf0d, 0xed8cd59a, 0xd4428b2e, 0xd1d398fb,
  195042. 0xb0fd1cd5, 0x94a20b11, 0x596013db, 0x1b404c44, 0x96eb705a,
  195043. 0x4b09d958, 0x2299d277 },
  195044. { 0xc64397e6, 0x5b9cd58d, 0xbf6dd31e, 0xac198f1e, 0x3e9f1db2,
  195045. 0x5866d8e1, 0x8fcdc68c, 0x405ae287, 0xe53c01fd, 0xa4b280cd,
  195046. 0x411db5f6, 0xdc963f2d, 0xbec4f8a0, 0xed5d5189, 0x916ee98b,
  195047. 0x336fd13d, 0x042df48e, 0x6925b1b3, 0xace0074e, 0x0cf56291,
  195048. 0x25317e95, 0xe8d38b48, 0x821c446b, 0xc7ad1d2b, 0xf0b65934,
  195049. 0x71c44135, 0x52ca0d50, 0x971b736f, 0x27b46c26, 0xaf9ffa57,
  195050. 0x1936618e, 0x21ac6779 },
  195051. { 0x2d7fbcd2, 0xab420e3f, 0x97bdfc18, 0x12722473, 0x4df5d4b4,
  195052. 0x492033f8, 0x3807b7d3, 0x6fcd4236, 0xb33c3625, 0xdfc19b09,
  195053. 0xa0f22814, 0x13d6f375, 0x037c19b8, 0x70978a59, 0x0ff27b9c,
  195054. 0x4f398997, 0x615a4389, 0xfc0e1a45, 0x3e602f74, 0xffa3496a,
  195055. 0xb261ca1c, 0xc3f1c431, 0xee0164cd, 0x612211db, 0xe7f7be9f,
  195056. 0x30463ee4, 0x92c2e1bb, 0x015f7e78, 0x24483a56, 0x663d88d6,
  195057. 0x0e62d9d8, 0x0e8ec1e7 },
  195058. { 0x8a0878dd, 0xa88ccc29, 0x6640071a, 0x99ac175d, 0xa5173617,
  195059. 0x90344820, 0xdd58a315, 0x316d023e, 0x88d221a1, 0x30785bd4,
  195060. 0x959c48e3, 0xb74b3de7, 0x4c67a771, 0x42ee0382, 0xe0b91453,
  195061. 0x59ef6cdd, 0x9b237e91, 0x7830ae28, 0x495d8325, 0xe1847a4c,
  195062. 0xd0773666, 0x67b1217e, 0xa294a325, 0x58192c86, 0x864d8326,
  195063. 0x76aa0f56, 0xf4b13e5b, 0xe2a2bd12, 0x1b6b73fd, 0xd850c1c0,
  195064. 0x5d103635, 0x653a795f },
  195065. { 0x50dcb199, 0xcfe28985, 0x7fa02b60, 0xb35b8e5e, 0xc97603d0,
  195066. 0xbca7d7c3, 0x27f131b5, 0xb0e5288d, 0xe2b12d52, 0x3aa704de,
  195067. 0x1db725c7, 0xe206b1d8, 0xc5d1b113, 0x0b12839a, 0xdb45d763,
  195068. 0x14f970cb, 0xb2125e8e, 0xc997f93e, 0xee7daa26, 0xbd75739c,
  195069. 0x1fef20e9, 0x46ecbd3f, 0x7c6a42b1, 0xf994a114, 0x27fb0fd1,
  195070. 0xd289eb4f, 0x9a40da4b, 0x11186d31, 0xfb9d7976, 0x083f65a5,
  195071. 0xd444675e, 0x30dfc47b },
  195072. { 0x9eaadfe8, 0xbcfc5ae2, 0xb4d4e812, 0x25027e54, 0x8b533561,
  195073. 0xab0702df, 0x56a6a214, 0xa2b9c204, 0x3059068e, 0xb1a3df7a,
  195074. 0x9883110f, 0xa3514b21, 0xc4b78e1c, 0xb7be2336, 0x3e2f6984,
  195075. 0x17073ce6, 0x2ddf7ac6, 0x86e114a6, 0x07d7c3c8, 0x276192bf,
  195076. 0xeb1ae289, 0x5da69e0b, 0x25184939, 0x983af175, 0x407a3aa0,
  195077. 0x9ac52a4d, 0xae0fe218, 0x1535c7da, 0x397f2501, 0xe16fe872,
  195078. 0x54c212cf, 0x572a591f },
  195079. { 0x09a5553a, 0x49668419, 0x327733bc, 0x3f054318, 0x3eefd690,
  195080. 0xf9ceb4b2, 0xf22126d4, 0xbd3cbf9b, 0x2fed9578, 0x6d9671c0,
  195081. 0xca0306d8, 0xbba597ce, 0x3d674fe5, 0xb705ed61, 0x67f33f76,
  195082. 0xf1d3622b, 0x11cb8c31, 0x15bcf3c6, 0xe53d1aa9, 0xa38467dc,
  195083. 0xf908ab43, 0x902fe929, 0x8d15767a, 0x6e3e499d, 0x90afd07b,
  195084. 0x8142db5c, 0x6c8b190e, 0x120c6fbc, 0x24919a4e, 0x80c86553,
  195085. 0xd8c82c3c, 0x65c2cbe1 },
  195086. { 0xa660bb63, 0x684cda20, 0x86e86245, 0x27dc3b0a, 0x6ba0eed7,
  195087. 0x76472cf6, 0x679dd158, 0x79c162e5, 0x08452d44, 0xb6884277,
  195088. 0x413f579e, 0x829bc6b3, 0x95011770, 0x92ea15ec, 0x47738183,
  195089. 0x5e34e300, 0x73e1d2f1, 0x8c3ca349, 0x229bd3de, 0xa5c4f1dc,
  195090. 0x94ef7ed3, 0x783eff1b, 0xdfae7a1a, 0x46db738d, 0x1a099852,
  195091. 0x4353d72e, 0xa0dcf4ab, 0x2533ad58, 0x0e7888b9, 0xd8055016,
  195092. 0x3ba77f66, 0x831440d5 },
  195093. { 0xf611b2da, 0xf43e2e32, 0xd0fa46ac, 0x5d066e29, 0x820b3c0d,
  195094. 0xe897f3e8, 0x1d3e44f0, 0xc45c28e6, 0xdfd27a66, 0x929d7f66,
  195095. 0x101e8517, 0x735b860a, 0x3de078dd, 0xea3fce98, 0x638ce11a,
  195096. 0xc9977db5, 0x48536b3b, 0x0488382f, 0x64cadfc6, 0x7e0c7a3c,
  195097. 0x82147b71, 0x3cd17f7f, 0x1b411e3e, 0xe95663cc, 0x985fb46d,
  195098. 0x5739ac8f, 0xbcf119ca, 0x385399cd, 0xe15a2815, 0x4a985a70,
  195099. 0x6d5f4566, 0x504c3a8a },
  195100. { 0xb8fa53c7, 0x00b55283, 0x509474e3, 0x985cff38, 0x437ce25f,
  195101. 0x234d241c, 0xe5a129ed, 0x29832430, 0xaabcc674, 0x6ad38956,
  195102. 0x7ee81ee1, 0xa2dc001d, 0x670b2702, 0x4c23c6b6, 0xa6e8a3bb,
  195103. 0xb35e567e, 0xa69673ea, 0xbc70b3ce, 0xe6e28eac, 0x85a7a9c3,
  195104. 0x5537b7da, 0x2ae684de, 0x6de937dc, 0x5ecac3e5, 0xf8430422,
  195105. 0xbf2ea6c9, 0x77fdc520, 0x38caf7d0, 0x69f56add, 0xc27af0b1,
  195106. 0xc71d21d2, 0x496e4699 },
  195107. { 0x9fa93467, 0xba14fc82, 0x0eb2a614, 0xc2e37684, 0x4833e09b,
  195108. 0x659bcfaf, 0x3686bdcc, 0xbc859752, 0x81f3216a, 0x40bfd080,
  195109. 0x17c081b8, 0xc463bda6, 0xbb04793b, 0xbd01fa86, 0x2cd640c5,
  195110. 0x5a21ece6, 0x2203d5c4, 0x97bf6a54, 0x951167b7, 0xceb40edc,
  195111. 0x765ba268, 0xd67aacaf, 0xaeab51f9, 0x8ba0d9e9, 0xb0d6863a,
  195112. 0xc14b215e, 0xe5f06952, 0x354cdcdb, 0xcb3744b5, 0x4f2b5ccf,
  195113. 0x13037fe8, 0x13389173 },
  195114. { 0x45003cd1, 0xee680640, 0x44ae2ac6, 0xfdac17bc, 0xde8e5314,
  195115. 0x4bcd419f, 0xc7cea95c, 0x81e34eb9, 0x38f37e01, 0xbb57762d,
  195116. 0x260990c8, 0xecc4cfb0, 0x50a34a7b, 0x0bc493f9, 0x543304ef,
  195117. 0x68074172, 0x6bc8aa2a, 0xaec0fcb2, 0x3b45fea5, 0x9e7a9b46,
  195118. 0x55fbdbac, 0x4bb2952e, 0x0485dff4, 0x50f0c0a6, 0x4dea4796,
  195119. 0x02c5104d, 0x695e3a02, 0xd2cefa09, 0x6da1f345, 0x4c8102b4,
  195120. 0xf3833fbd, 0x422eb573 },
  195121. { 0xa6ad3f47, 0xac592eb6, 0x9714ba0e, 0xb0861f6d, 0x07281459,
  195122. 0x57c1e919, 0x64ea5803, 0xcf7c94e2, 0x54b12723, 0x725376ac,
  195123. 0xdafb736a, 0xf2a6ba41, 0xcba03cdc, 0xc89e8920, 0x5b0fd3ad,
  195124. 0xf2e20cb4, 0xd66059fe, 0x26ea5a54, 0x889df8bc, 0xee63fa8b,
  195125. 0x66a3f2bf, 0x40f1c7e1, 0x747312e1, 0x09febc9c, 0x727999ff,
  195126. 0x7d19b9c2, 0xb7fd2b05, 0xa9fbbb4c, 0xa0da2dc6, 0xcfba27d7,
  195127. 0x2c252582, 0x368541cf },
  195128. { 0x22799d37, 0x510d3c9e, 0xacfa333a, 0x1b677de5, 0x080f795b,
  195129. 0x4e6ae18f, 0xafc8dfc2, 0x69b53c2a, 0x0e842dc2, 0x797541b6,
  195130. 0xac067fe8, 0xd5a6f2af, 0xbd07d877, 0xd0208a03, 0x654be2f2,
  195131. 0x34b473f0, 0xf515e23e, 0xe67c102a, 0x2ac1af48, 0xb00dbf9d,
  195132. 0xb6a13d00, 0xe264fa41, 0x97e94c11, 0x1669786a, 0x86a586f4,
  195133. 0x09d8cf2d, 0xc7f927e9, 0x073bf869, 0x2241a566, 0xb8977880,
  195134. 0x22261334, 0x59a5bf59 },
  195135. { 0x81347191, 0xe9d1c91e, 0xeb969972, 0x186c1abc, 0xa9d46a7f,
  195136. 0x07888767, 0xdaa7d397, 0xda93cfcc, 0xd91b9aa0, 0x08bee9f1,
  195137. 0xf8dd3c6c, 0x8267fd78, 0x94228100, 0xf93860d0, 0xdadb47fb,
  195138. 0x6a6a71aa, 0xa6156f8a, 0x9caa06b7, 0x39848bc9, 0xaa1b05e0,
  195139. 0x2aaa9135, 0x36ddc237, 0xb13f3bd1, 0x77e7e079, 0x4acc5f4d,
  195140. 0x8d0b5cbe, 0x984cfd36, 0x04da45f8, 0xd3d3e0f8, 0xf14ef618,
  195141. 0x43eb799c, 0x467564c1 },
  195142. { 0xb6fff5d7, 0x8d725904, 0x92dc4752, 0x037f33af, 0x6d20b8aa,
  195143. 0x9095d575, 0x43baec39, 0x32235fc1, 0x68a2b9b0, 0xa2feb4af,
  195144. 0x94d35c61, 0x61c50318, 0xea877486, 0xac92b6a2, 0x011bc6f3,
  195145. 0x8eb48b15, 0xc79edcb2, 0xa28fe128, 0xa5d2a006, 0x9f71bc0c,
  195146. 0x2f15b850, 0xf3167732, 0x7a036218, 0xfe8d728c, 0x4f81e09e,
  195147. 0x068f39cb, 0x7b7c50d9, 0x1773f016, 0xed6a1e03, 0x0d0f7adb,
  195148. 0x4ee984d5, 0x8a0dee16 },
  195149. { 0x47366e6f, 0x504991bf, 0xe86c3005, 0xb8084d9f, 0xa40cce36,
  195150. 0x14c4c751, 0x3f1961e2, 0xbbb46aa6, 0x40445e43, 0x56a785f9,
  195151. 0xc91e215f, 0xdb8d1b57, 0xc7ee808d, 0x6a8e453e, 0xbbaa1e8c,
  195152. 0xc0367ef8, 0xe3e18109, 0x310d91f1, 0x7e20a2c3, 0xf97cfd0e,
  195153. 0x554cc277, 0xf1e80c84, 0x7b628403, 0xe89bbc1d, 0x3fe0a17c,
  195154. 0x7778a966, 0xc1f00073, 0x9e9db19f, 0xb6f6bed2, 0x2ce7fe7d,
  195155. 0xee97ce23, 0x7b04b5d2 },
  195156. { 0x82c5faf8, 0x5b546bc7, 0x8eb81097, 0x1a734c5e, 0xe77851e0,
  195157. 0x3d566861, 0xe956d51f, 0x833a1013, 0xc3c3c37c, 0xc7351731,
  195158. 0xe0c148ec, 0x607738fb, 0xe1bbef41, 0x2ec6f0bb, 0xcfa51857,
  195159. 0x0aa2ac6e, 0x66e3adf0, 0x072902d7, 0xc622d6e3, 0xcd4d5089,
  195160. 0xa6dd802f, 0x3ae21b23, 0x33886372, 0xe5465a55, 0xa8d81822,
  195161. 0xd85119a0, 0x3786977a, 0x4f14d032, 0x9c7b272c, 0x515b081c,
  195162. 0xc99be31c, 0x1c6a95a4 },
  195163. { 0xc2821363, 0xa6b14ad5, 0x4d17de1c, 0x829c1823, 0xccade848,
  195164. 0xaef5d2c4, 0x82489e27, 0xf412ab39, 0xf081d927, 0x92c9c098,
  195165. 0x75cbad1f, 0x6f87bdf4, 0x1a1d9fb1, 0xf4aadab8, 0xb75f3b76,
  195166. 0x475a7923, 0xdbbba8fe, 0x99dd0ad6, 0x4b70ab45, 0x836f6164,
  195167. 0x34bd9af1, 0x2a464881, 0xba9abda3, 0x5c91226e, 0xe65625fb,
  195168. 0x4cec8709, 0x0818e4be, 0xd4b3919e, 0x14f6879c, 0xa5c09c84,
  195169. 0x30a864c9, 0x72708a02 },
  195170. { 0xf34a466c, 0x4f33c0b1, 0x7f9d45ba, 0xa1bae09c, 0x0e28785c,
  195171. 0xd70f0fee, 0x90880881, 0x824c7146, 0xbb043da3, 0xe2416c2a,
  195172. 0xcec6f432, 0x733da713, 0xc9793e1c, 0x2b590649, 0xb35c9365,
  195173. 0xdb62d5b0, 0x3e5c1b2a, 0x355eb6e2, 0xbb16b515, 0xcfe8b5ce,
  195174. 0xf709691c, 0x9e081869, 0x61a85bd5, 0xc865f9fb, 0xfae103f7,
  195175. 0xf169d3cc, 0x73467e9d, 0x9525c473, 0x43695113, 0x7db55c0b,
  195176. 0x73265d21, 0x7491c74c },
  195177. { 0x80d2b94d, 0x312ed5bf, 0xba4b260b, 0x1b8ac633, 0xd62219a1,
  195178. 0xac86c58c, 0xaeb82c8e, 0x317ccf6b, 0x59ef9ced, 0x2dfb29ee,
  195179. 0xe42bcd5a, 0xdaa7d898, 0x5974b201, 0x93e295c8, 0xd9fc5adc,
  195180. 0x69e75784, 0x012aa3ba, 0xd6c4709f, 0xc85d3cb9, 0x1fda9f37,
  195181. 0xd3dd4abd, 0xe5487e25, 0x0b3ba22e, 0x00fd4b01, 0xc6e8dcbb,
  195182. 0xcb591493, 0xbce68664, 0xb7329fab, 0x68906b76, 0x6829d1c2,
  195183. 0x74176841, 0x8bcfd3e5 },
  195184. { 0xd3c8c314, 0x06882734, 0x11870833, 0x95f0b2f1, 0xc068ba16,
  195185. 0xb937f7c3, 0x77924787, 0x5365e0d8, 0x1f992227, 0x15527e5e,
  195186. 0x27dffd4f, 0x0a069648, 0x2f586389, 0xd58b3df2, 0x6af20ead,
  195187. 0x83446b89, 0x50746257, 0x09d7970b, 0x4022a691, 0xd9e8d206,
  195188. 0x671ec379, 0xd1e5f8af, 0x057fe91e, 0x6f542509, 0x52890418,
  195189. 0xf14dda81, 0x1db932ad, 0xbd78010e, 0x905a9378, 0x3e18d1e4,
  195190. 0xbd37ab49, 0x53cadcf7 },
  195191. { 0x5e53d0ff, 0x1bb5edf7, 0x888abf67, 0xd886606c, 0x12206d15,
  195192. 0x6491b0f8, 0xe22b6a33, 0xb3018345, 0xb173b317, 0xaba6794b,
  195193. 0x7dc9e595, 0x8c1e5867, 0x239624d1, 0x4e106482, 0xda55dd53,
  195194. 0x61752e59, 0x9e42879c, 0x018b4eab, 0x491f2bed, 0xcaf6784b,
  195195. 0x1e79429e, 0x3dcdb9d2, 0x10f26224, 0x36941485, 0xa650ec5c,
  195196. 0x106f190a, 0xb69a9760, 0x7542a5ae, 0xc32d1046, 0x69bd75e9,
  195197. 0xbf8c62b1, 0x90849964 },
  195198. { 0x5a93c661, 0xb1390cf6, 0x9db5f056, 0x18486264, 0xa51a1788,
  195199. 0x92a93a9d, 0x6772de9a, 0x1b0cbb8f, 0x7c71487c, 0x6e67febd,
  195200. 0x4e62423e, 0xf9b4382d, 0xbb5a42f8, 0x96fda50e, 0x6089a4f2,
  195201. 0xc921b337, 0x875ec516, 0x49d32d7b, 0xc410124b, 0xbd86d2ca,
  195202. 0xc421fb7a, 0xf6862209, 0xf6b7de33, 0x3e1949ab, 0xe93c9268,
  195203. 0xcdee18f0, 0x08dc4cc0, 0xd4edbd5e, 0x73580d22, 0xc2b75be4,
  195204. 0x468cd7e8, 0x3d7f6ffa },
  195205. { 0xdffbd5d1, 0xea7b290c, 0x970338df, 0x9d759da6, 0x90feedc9,
  195206. 0x56680b08, 0x42dce68e, 0xbc690af5, 0xb2ae4d82, 0x8519df2b,
  195207. 0x7f195b60, 0x5612467f, 0xd83c21f4, 0x659a342c, 0x55651633,
  195208. 0x55771bf5, 0x548ba562, 0x5fc68935, 0x9492f23a, 0xb5419203,
  195209. 0x9c9c6017, 0x567528e3, 0x511e6019, 0x3f064ed4, 0x1d16a555,
  195210. 0x303f9eb9, 0x2254abee, 0x3e18c4fd, 0xfd434e7c, 0x40994d6f,
  195211. 0x6dde74e6, 0x8fb12d3f },
  195212. { 0x293cb7a4, 0x6c6381a2, 0xb87b7e4d, 0x453e09f0, 0x078ac3ef,
  195213. 0x4f212823, 0x578cae91, 0xe89ffad0, 0x716ba4dd, 0x4a2b696a,
  195214. 0xf6f580a0, 0x14681a14, 0x4c2f1307, 0x1358f97b, 0x2932fb89,
  195215. 0x87896996, 0x268a5af7, 0x29dd850a, 0xfe239f83, 0xaf771f6d,
  195216. 0x4f47499d, 0x5f20fd2e, 0x867ca0e9, 0x9b643e77, 0x375981ec,
  195217. 0xe7858ecd, 0x19ab1c97, 0xbe946a59, 0x06ff3453, 0x4f9303a2,
  195218. 0x75d237b1, 0x3fcc6731 },
  195219. { 0xdf21f920, 0x509debd5, 0xc1401b90, 0xfaf70e1f, 0x95a64aaf,
  195220. 0x2429cbfd, 0x2c37a122, 0xf2120855, 0x7deb926b, 0x1d4c93f4,
  195221. 0x9fb3f1dc, 0x12f3e4c0, 0x5b51bc46, 0x56085a59, 0xf10fdbd2,
  195222. 0x2a2f5d62, 0xdf0cb3c2, 0x60dd62cf, 0x6b0f254b, 0x154424a3,
  195223. 0x564612b7, 0xc3a5a05d, 0xa1f5249c, 0xbebe30cf, 0x7e62a188,
  195224. 0x24ec6903, 0xaf429939, 0x75f0fbac, 0xb3fa8685, 0xd41345dc,
  195225. 0xc7151c34, 0x645146fd },
  195226. { 0xba1924f9, 0xecec633a, 0x006326e1, 0xbba6f136, 0x7e50fc17,
  195227. 0x203757ac, 0xef3d8e00, 0xca531919, 0x51dc5a74, 0x9545a6aa,
  195228. 0xd31412b8, 0x6e21d58f, 0x7bb1d000, 0x01bc3005, 0x6ed1a9c3,
  195229. 0xf1789c69, 0x9858fa48, 0x7af2d35f, 0x8197be85, 0x434d09b9,
  195230. 0x29aa265d, 0x1dc07755, 0xc058fa80, 0xcad03be7, 0x54ba14ce,
  195231. 0x92d70a9f, 0x6c050a74, 0x6dc78505, 0x4d005dda, 0x2a7ca4a9,
  195232. 0xabfb9f2e, 0x448d3d72 },
  195233. { 0x29b33989, 0xdc56f145, 0xa9ae815a, 0x868351bc, 0x4b074414,
  195234. 0xb3f45613, 0x3cd9f33b, 0x955ce42a, 0x5ff6e4a3, 0x13ade4ec,
  195235. 0xa50eaa91, 0xd3aac715, 0x5666efdf, 0x0c61ec99, 0xf6a4470a,
  195236. 0x108a28b8, 0xe54844c9, 0x402ef584, 0xd0e2f337, 0xb825b162,
  195237. 0xb46f7cbc, 0x3dcd131f, 0x96f2fd89, 0x208178ec, 0x25928c78,
  195238. 0x4d8c5d67, 0x9963c459, 0x285a33df, 0xd92a309f, 0x72497175,
  195239. 0xcb7019a5, 0x76881479 },
  195240. { 0x91767eed, 0xba43a114, 0x92bf65db, 0x5e11b9ad, 0x03a5e21a,
  195241. 0xe8a22ce0, 0x2a335415, 0x63604421, 0x4a9ead62, 0xc2c563b4,
  195242. 0xa0b2aee5, 0x4bc06264, 0x8bf2e1d7, 0x75b8d575, 0xd08a265d,
  195243. 0x1cff0ee7, 0xb0b712a7, 0x17914e1d, 0x4b18692d, 0xc35925d0,
  195244. 0x56cce815, 0xde253f4c, 0x9fff0e3a, 0xa479241c, 0xddabed19,
  195245. 0x50b9d06e, 0x59fae506, 0x67135260, 0x532ce180, 0xf37600fb,
  195246. 0x5e5a8626, 0x670eb01c },
  195247. { 0x73cdbb43, 0xdf73c0af, 0x7f2431ad, 0xcf08ecc5, 0x2a1a3845,
  195248. 0x91780541, 0x9224ddf1, 0x69a104f2, 0xbeac7eff, 0x4352f38d,
  195249. 0x7c2d1322, 0xfc3b3b4e, 0xb5e4b476, 0xa69e9430, 0x975a46f0,
  195250. 0x7d932340, 0x5d64eece, 0x8093899e, 0xdb2345e9, 0x7b821250,
  195251. 0x7f4b796b, 0x23552932, 0x4bb90b1f, 0x2ee9cc15, 0x9112f7d6,
  195252. 0x1fa9c8f5, 0x1cbaae32, 0x2d0f2f98, 0x0075166a, 0xb77f0366,
  195253. 0x635dff27, 0x504852e7 },
  195254. { 0xa2f392fa, 0x2f0f3ce5, 0xec6c9078, 0x326c076a, 0x84baaaf6,
  195255. 0xad01de92, 0xcbe8e993, 0xb01b16d3, 0x2d950908, 0x71305c24,
  195256. 0x3853af38, 0xc66fd617, 0xd3c429a0, 0x7735140e, 0x1fabf027,
  195257. 0x8a31b12a, 0x058b3177, 0xa0530002, 0xa9c7deb9, 0xabffd9fc,
  195258. 0xe8667d30, 0xd05ef69b, 0xe9a9e13f, 0x2f3a7308, 0xb91eae9c,
  195259. 0x3f4c9a19, 0x618ce6c4, 0x50d0cee7, 0x5240f8b0, 0xfb24dc40,
  195260. 0xf7e90cc4, 0x992fe151 },
  195261. { 0x38f197aa, 0x4454db31, 0x87872f98, 0xa4ded69d, 0x44f0a828,
  195262. 0x97b427b0, 0xa31e48c6, 0x9821e1ae, 0xdd98efec, 0xe38cb09f,
  195263. 0x480cb3ae, 0x20b84fa8, 0x47475573, 0xba5bb4a8, 0xcd50e96b,
  195264. 0xa9be080a, 0xef103550, 0xc4451e9c, 0xc441325c, 0x626ee75f,
  195265. 0x38a5e33d, 0x6eea5e98, 0xa2b0abd2, 0x7321beb9, 0x9b6082a9,
  195266. 0xca92e484, 0x992bcc2a, 0x1dc8168a, 0x9c8eb9fb, 0x134ecf4b,
  195267. 0x4c5b71e0, 0x5a68bfa8 },
  195268. { 0xff0a2bfb, 0xb4ff3b45, 0x5502f8b0, 0xd105fff9, 0x5b1c0c26,
  195269. 0x14de5885, 0x0d3b9d04, 0xed16865b, 0x026d3917, 0x2f5a2453,
  195270. 0xf4db3c0e, 0x6a22f493, 0xe2418f2e, 0x4871548a, 0x509bef61,
  195271. 0x6ab363a8, 0xb8cbbbec, 0x91ca1e3a, 0x4011a396, 0x71e0dc98,
  195272. 0x0d5ca577, 0xff982e0a, 0x81897bc1, 0xeb40b045, 0x085ad5e7,
  195273. 0x4bc24a46, 0xa6337b7c, 0xd15c8fa0, 0xbef1628f, 0x56ce6ef7,
  195274. 0x9f5ef439, 0x78acfdf9 },
  195275. { 0xf8520189, 0x45bf7f15, 0xc77f61c4, 0x954202a0, 0xdfa22e1b,
  195276. 0x39edc6b9, 0x1f4a3487, 0xd2d60267, 0x4814cc52, 0xcd933929,
  195277. 0x05e9f123, 0xde76a124, 0xae36b6f7, 0xe2306ea0, 0xb83a58e0,
  195278. 0x53815218, 0xa041231a, 0x9862bb76, 0xbf31be71, 0xe8da253c,
  195279. 0x37de861f, 0x2dfc5332, 0x90ae4890, 0xf25c93f6, 0x8baa6ed2,
  195280. 0x66bcb8f0, 0x908b4a29, 0x6f10ae0f, 0xb061c949, 0x8cb4b48c,
  195281. 0xd075a366, 0x0ad92d73 },
  195282. { 0xc2ca548a, 0xbfb95fed, 0x80cd89ab, 0x4778c620, 0x3466c280,
  195283. 0xbe99154b, 0xd4be8902, 0xea3be093, 0x13e681ed, 0x847b7995,
  195284. 0x02f40161, 0xf22a8f4b, 0x4aeb7fe8, 0x3ef2cb4d, 0xb3aed5f6,
  195285. 0x9adc5151, 0x98c31163, 0xec1ccfd1, 0xa3d7d88f, 0xdc2ac17b,
  195286. 0x46421097, 0x08fa64d3, 0x94b90bcf, 0x5ebf80b7, 0x0b50a9eb,
  195287. 0x1b78b4ba, 0x279aa66b, 0x1a4fe934, 0x075b3ced, 0x8ef4dcaf,
  195288. 0x70a6e9ae, 0x95bbd8a0 },
  195289. { 0xe614bbd0, 0x59f92495, 0xb823e363, 0x7567a887, 0xfc1bd6a7,
  195290. 0xe247c9ec, 0x8e835c42, 0x2bfaaf47, 0xaade066a, 0x314ef4e0,
  195291. 0x5c16d336, 0x072baa63, 0xe2f0e389, 0xfa429c71, 0xbd07d90f,
  195292. 0xcac1e5d0, 0x514f5c04, 0x69ff35ea, 0xc0554ec1, 0x893053fc,
  195293. 0x2a35947f, 0xab1d86b7, 0x2aebe487, 0xe29fb060, 0xdfb9cf21,
  195294. 0xa0a10d6d, 0xf20dfcf5, 0xad147059, 0xb8867a2a, 0x480dc66f,
  195295. 0xc125a919, 0x375a884f },
  195296. { 0x1217f7ea, 0x178cbe2e, 0x875c6dab, 0x1a161e2a, 0x1bdb1a54,
  195297. 0xf7707ec0, 0xe4fd73ca, 0x678864a0, 0xd13a0d86, 0xbaebc664,
  195298. 0xc8d30668, 0x40325f99, 0x2f1c5950, 0xb93ed9c9, 0x541e0667,
  195299. 0xfdf36763, 0xb91a6763, 0xfd97fbb0, 0x6079c9a0, 0x26aa69ea,
  195300. 0x1eaa8c47, 0xc7303c80, 0xafa63c55, 0xdec75c81, 0x4fd12adb,
  195301. 0x01cdcde2, 0x1968838a, 0x9fe0dda7, 0x38415379, 0x66bb093b,
  195302. 0x08cb84ec, 0x268d818b },
  195303. { 0x41580555, 0x73dae358, 0x473d103b, 0x4fc32e67, 0xbeccc1ab,
  195304. 0x240c1013, 0xb24ee9de, 0xda4099f2, 0x9fa8e066, 0x37b0cb5b,
  195305. 0x6438d7ee, 0xb5ae04e4, 0x2b720140, 0x7f7d3164, 0x339e4a78,
  195306. 0x86ef4edb, 0x3a7d8375, 0xa5e77eed, 0xbd707c2e, 0x883fad37,
  195307. 0x0f979189, 0x816b633a, 0x2e7a208e, 0xe24c028a, 0x4435516a,
  195308. 0x1171fe3c, 0x4f5f2bf5, 0x3eb93b33, 0x01b53a56, 0x8419ed4b,
  195309. 0x056ca44b, 0x8b02735c },
  195310. { 0xe1019195, 0xb89bb464, 0xf3fc28c1, 0x1de4c026, 0x2bfc3b21,
  195311. 0xac120e6e, 0x91bdf92f, 0xec71bc5a, 0x0d995bc9, 0x485d7ab4,
  195312. 0xe6491ffe, 0x97c6768e, 0xafbce265, 0xd9552d19, 0x8e1b76c2,
  195313. 0xbae6c7fe, 0xd7e3ad1b, 0x167d8281, 0x5e989734, 0x3e149af9,
  195314. 0x8a0c8182, 0xd1f0024c, 0xc3006c0d, 0xf571ffdb, 0x58773d4c,
  195315. 0xb32ecf7e, 0xfd3540d8, 0x5822a782, 0x04365042, 0x5ab45c3f,
  195316. 0x4b4d85fe, 0x400e3aa0 },
  195317. { 0x5e46e4a2, 0x47321649, 0x24136074, 0x37a2ed64, 0xc60ec77d,
  195318. 0x659223b1, 0xe5e0ac2e, 0x5e13aac3, 0xc5107ab7, 0xda17c41b,
  195319. 0x73c253db, 0x65b22ec9, 0xa5012296, 0xff3867b8, 0x0621a99b,
  195320. 0xfed660d5, 0xc89fc3f5, 0xa3c28506, 0xf16451a7, 0x3ed350b9,
  195321. 0x67cb586f, 0x27c3e032, 0x967185b1, 0xc807c779, 0x4a13009b,
  195322. 0x09c157d4, 0xadaf1f4d, 0x362f7647, 0xf3a6a198, 0x4a42b9ac,
  195323. 0x8da6e039, 0x131c3da2 },
  195324. { 0xa7da83ba, 0x4a785ff1, 0xd04f4436, 0xf415b425, 0xec03f812,
  195325. 0x7c0899bd, 0x80f5f4a2, 0xc58d411a, 0xfda251b9, 0x3d32d610,
  195326. 0xcd3b2f32, 0x99bb4504, 0xf4c2083c, 0x198c444b, 0x730e83fd,
  195327. 0x60c261af, 0xcb02db90, 0x060ca4df, 0x9df1e7c8, 0x0ff7838b,
  195328. 0xc4c690c9, 0x6b79cf97, 0x5d75f154, 0x131514d7, 0x1cb0e8ff,
  195329. 0xa7c074f1, 0xb2c17615, 0xb920aac1, 0x44aa0ff0, 0xde8098ad,
  195330. 0x34545ce9, 0x71d1a46a },
  195331. { 0xfa1b382e, 0x76178f76, 0x772dda0d, 0xa0d8ecc3, 0xc5d4d130,
  195332. 0xaa5aab2a, 0x8d72622c, 0x27d38ba4, 0xca3bed06, 0xc5410db6,
  195333. 0x793ceccf, 0xf637a588, 0x6e65e3d7, 0x1f65dafd, 0x60a45641,
  195334. 0xc3b44a85, 0x4f78540b, 0x0f47b3a8, 0x5e4d60f6, 0x824fdadd,
  195335. 0x17d3b6d5, 0xd8ccf90c, 0x325fc13a, 0x008eabdf, 0x3648fab9,
  195336. 0x3e90d716, 0x24c52d4b, 0x3964ff3a, 0x533d0acb, 0xb95cc416,
  195337. 0x1167f521, 0x6cd2699f },
  195338. { 0x12f4f3ac, 0x2d8c0b3b, 0x99d1bdfb, 0xb03dcfe2, 0x30f37326,
  195339. 0x540034f8, 0x7c5a8c82, 0x22dd6893, 0xcd8f1442, 0xeb7093d0,
  195340. 0x585742f2, 0x892795a7, 0x087adadd, 0xe15f282c, 0x16ab7b5e,
  195341. 0x7bbdc749, 0xa58acbb4, 0xd30fe40b, 0xe2bac39b, 0x0de417eb,
  195342. 0xc61a04bc, 0x4b4b19a6, 0xf2735569, 0x9338c34d, 0x30ab196f,
  195343. 0xe8f03742, 0x6c88c965, 0xfa2efcb8, 0xc7eeb826, 0x19eee274,
  195344. 0xda345dc2, 0x327c063f },
  195345. { 0x5b47cd53, 0xab399eff, 0x1943aefe, 0xbbe9869d, 0x1402a866,
  195346. 0xe64ecc7b, 0xb1c25a16, 0xc3e7c2aa, 0x022de271, 0xc4216b79,
  195347. 0x366d6a5f, 0xe58dfcc8, 0xda813336, 0xd159509e, 0x130bfb7c,
  195348. 0x370400f2, 0x93b48780, 0x1be4e059, 0x39f3cd22, 0x0623a1fe,
  195349. 0xeecb4f87, 0x72aa22b2, 0x6c27b83b, 0x1af4c496, 0xda5fa5bf,
  195350. 0x7a42a94b, 0x48b01af2, 0x9afba822, 0x3670112c, 0xeb6b9d2a,
  195351. 0xc0df6856, 0x020f19d1 },
  195352. { 0xa4dbba20, 0x37051a86, 0xdb1de5c5, 0xb618ebc6, 0xe6525840,
  195353. 0x9a780a19, 0xd2bccc4d, 0x9440302d, 0x10285a24, 0xe9ff023d,
  195354. 0x3a486268, 0x3b937ee3, 0x4cd61147, 0xe37ee2f2, 0xa3d057cf,
  195355. 0x79fbbfd3, 0xccddefce, 0x5fba16d3, 0x5b231727, 0x916058ec,
  195356. 0x720c3adb, 0x47699ebe, 0x8b4f6bba, 0x26274386, 0xf18a0770,
  195357. 0x54b0092a, 0xacca1160, 0x99d090eb, 0x0c888f60, 0xf757e1ff,
  195358. 0xb0050544, 0x79e72720 },
  195359. { 0x2820a239, 0x632acf25, 0xaae6b310, 0xb1a3974e, 0x48c0a1df,
  195360. 0xd61fd6ba, 0x5a3ee7aa, 0xd2453c39, 0xb980446d, 0x548455a0,
  195361. 0xde16676f, 0x9f29d97b, 0x789375a1, 0xf252ca0c, 0x7743a985,
  195362. 0xe961af3e, 0x66cdbd8d, 0x70c79c56, 0xcbc538f9, 0x14a3854e,
  195363. 0xa126851c, 0x58daa73a, 0x2a9f558c, 0xe9b5bb45, 0xfbd15e05,
  195364. 0x37af7f83, 0x38a1939d, 0xa4487927, 0x9511a056, 0xe428b2b5,
  195365. 0x7015846d, 0x001d3ce3 },
  195366. { 0xe145b1d7, 0xd6be36b9, 0x009c5664, 0xf3e3938a, 0xe7c0f6db,
  195367. 0x2e562e7d, 0xc343f539, 0x951044e6, 0xd90897b1, 0xa5ab62b8,
  195368. 0x512f797c, 0xb1a1f70b, 0x750f28e4, 0x91cdd754, 0xffb8165d,
  195369. 0xb4c80e2f, 0x594d02b3, 0x65ed39c7, 0x56833edc, 0xcc12a49d,
  195370. 0xf3693a18, 0xe73694bc, 0xfcd2c404, 0x34cc134a, 0x11d40194,
  195371. 0x071bd5fc, 0xfc585e46, 0x05759047, 0x790b7a04, 0xb3280360,
  195372. 0x40afc684, 0x4bb8c6fc },
  195373. { 0xfd0f8796, 0x3120e2dd, 0xb133c9de, 0x6968a40d, 0xa9369c6e,
  195374. 0xfea366c0, 0x6007273b, 0x37e5b6d6, 0x8cb81439, 0x39e4ecf0,
  195375. 0x9febc005, 0x487fe9cd, 0x0199b53c, 0xeb8af444, 0x293519eb,
  195376. 0x2f124e3b, 0xc82c9c16, 0x860c218a, 0x709dc590, 0xacd1d6f2,
  195377. 0x36d50529, 0x5696d545, 0x59120bfc, 0xc03f5df9, 0x10ffa690,
  195378. 0x99a3e88d, 0x6c432827, 0xd4f9cfa5, 0x9a135d89, 0x2e8fea9e,
  195379. 0xb6a77e78, 0x3699a881 },
  195380. { 0x1eb1c64d, 0x5bca3372, 0xf1d28154, 0xe9cf3a2d, 0x6537106f,
  195381. 0xb7e2e9b3, 0x4f7cbf4d, 0x06c17151, 0x2058b37f, 0xcbde416e,
  195382. 0x8834e9c5, 0x82c53a7e, 0xe9ac3a75, 0x94dbdfe2, 0xc5e67c02,
  195383. 0x795ec6cb, 0x1426a80d, 0x8c23c25f, 0x6a8d4f9f, 0xee2cd20d,
  195384. 0xd3b7c235, 0x838daa54, 0x3d7a4d52, 0xb9e08ec0, 0x781cb473,
  195385. 0xca9475e9, 0x5ec31caa, 0x7271f39e, 0x82535187, 0x1df08e9f,
  195386. 0x208aff8b, 0x4f3a4b03 },
  195387. { 0x1ed095f8, 0x0f7b8107, 0xda226d4e, 0x23e37fa6, 0xafb36d1d,
  195388. 0x8b0f9852, 0x07d8e311, 0xb114634e, 0xe3e0f16e, 0xb9634a97,
  195389. 0x421eec37, 0x2454bb9c, 0xd72b21c1, 0xb4ecd5db, 0x6df20d7c,
  195390. 0xf9603868, 0xdf86e0a2, 0x9f5359fd, 0x5ac488aa, 0xc43d54fa,
  195391. 0xd1049df4, 0x56d714ab, 0xb020607a, 0x13152b3e, 0x7a02325e,
  195392. 0x49be1c18, 0x52ae84db, 0x44f24f4a, 0x0b5a7b80, 0x9e525c03,
  195393. 0xa6d179fd, 0x6d874446 },
  195394. { 0xbe9a42f5, 0xd29d07aa, 0x3781ccc8, 0x1fd5316c, 0x9dc69ea1,
  195395. 0x71a75a6d, 0x88fee91a, 0x4e19e0df, 0xf8d44f12, 0x99c2b4dc,
  195396. 0x31ae94e4, 0x05f6df92, 0xcf28ccc2, 0x27fba876, 0xf57f7ceb,
  195397. 0x6e1a0f01, 0xf3fd3b74, 0xe03f1f34, 0x42c1d213, 0xa0edc4a7,
  195398. 0x7deb8580, 0x5caac270, 0xaf0848bc, 0x0f5d791f, 0x07ac759d,
  195399. 0x17f514ad, 0x904fc531, 0x95a39734, 0x7bb70f3d, 0x95a4aca9,
  195400. 0xff9c5609, 0x3cf384c9 },
  195401. { 0xce1fc9e3, 0x700506ba, 0x676b0399, 0x49721742, 0xe72bf7b3,
  195402. 0x2b4a1b8d, 0x79b209f7, 0xca8602a8, 0xce26a8e1, 0x90580b90,
  195403. 0xfe24f39a, 0x1ef339b7, 0x629362e1, 0xb6c5d991, 0x577b24f4,
  195404. 0x51174e1a, 0x05e451e9, 0xf380fcb5, 0x148321bd, 0xf4d97afb,
  195405. 0x747e5d2a, 0x099806bb, 0xbe99a608, 0x85525d65, 0xd455e820,
  195406. 0x264828d9, 0xd8560a65, 0x8c8c5405, 0x71030770, 0x3c67e73c,
  195407. 0xee73df26, 0x2b248850 },
  195408. { 0x8541159f, 0x2173cde6, 0x4fb410b2, 0x78224c18, 0x1f2ca1c7,
  195409. 0x07a28619, 0xa8b23e40, 0x52c207d6, 0xa6b2344a, 0x071a0210,
  195410. 0xb5ed2945, 0xdb0e587c, 0x810fcc6c, 0x6c56b8ef, 0x62d843b9,
  195411. 0x1248c58f, 0x74c66975, 0x4b90363d, 0xe66c66f6, 0x6348f7f2,
  195412. 0xc126bcbe, 0xb2f9d441, 0x73ce49e8, 0xac07f2a3, 0xe81b0df0,
  195413. 0x52486758, 0x1d4621d1, 0xa108b54d, 0x74414a1c, 0x17261ece,
  195414. 0x6a3ac215, 0x938b3bcc },
  195415. { 0xe4ded340, 0xa9e4a16b, 0x80e88036, 0x8e65fb2a, 0xdcd73acb,
  195416. 0x97089606, 0xaaa657a9, 0x1c3a0434, 0x49101b06, 0xf304fc58,
  195417. 0xda0bb64c, 0xe60fb61a, 0xf5542df5, 0x818c2aec, 0x56f76d5f,
  195418. 0x74020576, 0x92533d97, 0xb566b790, 0x74d6eb5f, 0xae4655e5,
  195419. 0xa55b44b7, 0x60f7a1b5, 0x93747ea5, 0x7970179b, 0xf2dace56,
  195420. 0x8ae7e0e8, 0x84e83c06, 0x98474607, 0x15307341, 0x24e8c9ed,
  195421. 0xd9e89d6b, 0x6cff58a5 },
  195422. { 0x03e51f68, 0x508c01b0, 0x1d2fe7d6, 0xe1d1f225, 0x09bd8805,
  195423. 0xf7998d0b, 0x03e415b7, 0x255e907a, 0x607d9798, 0xd148467d,
  195424. 0x9b453896, 0x055c3b1e, 0x809f50f4, 0x35001013, 0xd0233fdc,
  195425. 0xfbbb2fa6, 0xff1820b8, 0x0b680b0a, 0x38d317e0, 0xb1d404dc,
  195426. 0xccc8c7df, 0x133d5444, 0x6ec13f84, 0x7fa847e6, 0x046e2e48,
  195427. 0xc33f83d8, 0x4863b3ac, 0x3c627fc5, 0xeb936af7, 0x5f67f8aa,
  195428. 0x31b79327, 0x5fe4ac8f },
  195429. { 0x8b6f401e, 0x581aa4bf, 0xad5c7ed4, 0x05db12a3, 0x6fb07b4a,
  195430. 0x7b018726, 0x9c22bcd4, 0xfdd11f04, 0x69371c95, 0x5454a7d4,
  195431. 0x99a46eaf, 0x066c55fb, 0x7fef96d0, 0x18637c7c, 0x6b83e95c,
  195432. 0xbafc1d34, 0x00bb42dc, 0x55c38593, 0x34e7e712, 0xdd8dec2b,
  195433. 0xb184cee8, 0x69c9cfb0, 0x49a27864, 0x8dcc0c42, 0x2010f2e7,
  195434. 0x290d95f2, 0x6977a420, 0x86e254c9, 0xeb2abdad, 0x20931c89,
  195435. 0x121c0548, 0x81377164 },
  195436. { 0x9c5a8edf, 0x6266b25e, 0x1078a7ad, 0x6e1388c2, 0x4876eedf,
  195437. 0x5f02737d, 0x62744617, 0x242fa7f9, 0xb385382a, 0x3e2cfbd9,
  195438. 0x02f71bef, 0xbadad7b1, 0x677d0a92, 0x562abcfa, 0x51fdff34,
  195439. 0x573ebd17, 0x7c250c78, 0xd7f65852, 0xc47ca896, 0xe0cf16ee,
  195440. 0x67622c9e, 0x8ccd79b0, 0xf8f2c075, 0x31fc5882, 0xa6008515,
  195441. 0x9232b37e, 0x82e8c5ba, 0x4d7bb361, 0xd2f146fe, 0xbf24735c,
  195442. 0x9cd2db98, 0x79c280ee },
  195443. { 0xf2b48122, 0xbdcc8203, 0xb04ac48e, 0xa8c04916, 0x9fc4885e,
  195444. 0xacf064dc, 0x82c1001c, 0xab838997, 0x676de250, 0x7339e721,
  195445. 0x8e1ab820, 0x17aa5aea, 0x6bc14b2e, 0x24d28ca0, 0x816b6230,
  195446. 0x570c5bb7, 0xcee6b606, 0x6c51235c, 0x183eae42, 0x1b2bf89f,
  195447. 0x9c66274b, 0x3e3af3c6, 0xb51e38bc, 0xe0b04426, 0x73e40e3b,
  195448. 0x26dbc58e, 0xb5be5be4, 0x3f9dd578, 0x52c8f408, 0x9fd9f791,
  195449. 0xa9e3ff4f, 0x758073a4 },
  195450. { 0x8691ca22, 0x7d27b057, 0x13a2a1b6, 0xf206bfd6, 0xac795413,
  195451. 0xe84bd385, 0x75536607, 0xc5d18a2a, 0xc8a0e24c, 0x2e166de7,
  195452. 0x3c474dbd, 0x56d5750c, 0x1366843a, 0xdef444c1, 0xcf4b8432,
  195453. 0x14646e53, 0xa9fd9783, 0x4bc0d030, 0x297ee203, 0xbda4c824,
  195454. 0xfd7be6c7, 0x3d0b10bf, 0x08c7f3ff, 0x2d216476, 0xb4fd4c45,
  195455. 0x06e52599, 0x49e9e104, 0xfbab9fa1, 0x8661d32d, 0x9342a7fa,
  195456. 0xfaf66aa8, 0x3f3e3458 },
  195457. { 0x951597aa, 0x51ec35af, 0x49df64eb, 0xb677d4ac, 0x9bf4eff5,
  195458. 0x0276cd9c, 0x515a2935, 0x423eca49, 0xfd9bb9c3, 0x8a696553,
  195459. 0xede1f09c, 0xf99ee9df, 0x199e5f98, 0xb8fa2956, 0x35292c32,
  195460. 0xb7638758, 0xfc40e81b, 0x8734eddc, 0x65457d95, 0xd82d5e9f,
  195461. 0x30c78d2b, 0xc8ee323e, 0xc1433d67, 0xe77b2e4c, 0x3c8314ae,
  195462. 0x56d9f807, 0x2a0e2f63, 0x441eede2, 0x6c48295e, 0x1e9e17ed,
  195463. 0x34c294ef, 0x640d20c4 },
  195464. { 0x3284d513, 0x4e9a0b8e, 0xf315053a, 0x074c3545, 0x45acd52a,
  195465. 0xb36e7407, 0x1de50db7, 0xd80bdcfc, 0x2549fc46, 0x8d9d47dc,
  195466. 0x303f07a8, 0x29b6ef13, 0x6d4ad4c2, 0x4e461aca, 0xfc9f1b73,
  195467. 0xca8e351d, 0x57460e65, 0x8bc4094d, 0x0f32d367, 0xb6302b33,
  195468. 0x285742e8, 0x69a074b6, 0x876c29c3, 0xdfe52b11, 0x912bd17a,
  195469. 0xf39e4609, 0x349aa639, 0x8ee40d66, 0xc72e05c1, 0xb968902a,
  195470. 0xc0d92816, 0x0f9c1ca8 },
  195471. { 0x67433df3, 0x1ebbaab3, 0x15d3628c, 0xb6aa5347, 0x97f0c5cc,
  195472. 0x13a320d8, 0x65e408f9, 0x72c918cb, 0xd5373451, 0x4b638854,
  195473. 0x0b4dca09, 0x731399a3, 0x0a3b1326, 0xcf256730, 0x6608b388,
  195474. 0x5ea60dfa, 0x7b290dfd, 0x58ad74b0, 0xd7694f9b, 0x83202789,
  195475. 0xb6630fb1, 0x48593db8, 0xc65e3eaf, 0x3db47f70, 0x3e7263f8,
  195476. 0x63949c91, 0xe6e6ff33, 0x9b9acec6, 0x098a8240, 0x34bd9ba7,
  195477. 0x45d36ec5, 0x7e31c12f },
  195478. { 0x0dfd2dd7, 0xbe281d68, 0x24ab61d8, 0x1efacb00, 0x94431f97,
  195479. 0xb9c3005f, 0x959cb3bc, 0x660c8dfa, 0xcffbb406, 0xfdd5fc30,
  195480. 0x7969a10d, 0x7a4631be, 0xde13fd1b, 0x336e309e, 0xfc947076,
  195481. 0x76b3bfad, 0xdcc72223, 0xfa91925d, 0x156c4ee1, 0x741f0d73,
  195482. 0x0e2b3747, 0x4f64ee41, 0xefc4d93c, 0x86be92d3, 0xfc4fbb2e,
  195483. 0xc53b7e03, 0x337ca1bb, 0xac196cf5, 0x7e23ba60, 0x4de41a30,
  195484. 0x326d5357, 0x1a219c45 },
  195485. { 0xaa4db0bc, 0xfdcf7ef8, 0x7b6c9963, 0x2e231806, 0x3d8a192f,
  195486. 0xc2639067, 0xffdc7771, 0xc0cec2e2, 0xa2fc0edb, 0x997c8e35,
  195487. 0x82cc6043, 0x78e10ec1, 0x2b0c8120, 0xfd0de2cb, 0x69e57f8e,
  195488. 0x4d6c457f, 0x5b53f1c3, 0x953e69b2, 0xc4f89cb8, 0x422a330a,
  195489. 0x95566be6, 0x92ff2329, 0x437442d1, 0x73cd502d, 0xbea69403,
  195490. 0xf04ce590, 0xf8030662, 0x6ac1537e, 0xb6d0bf93, 0xe02bcf77,
  195491. 0xbc90192f, 0x17aaa999 },
  195492. { 0x8e55db2e, 0x0d3d5643, 0x3b946851, 0x835dee43, 0x5b88462f,
  195493. 0x1a1440e5, 0xea17e27c, 0xa6ff3b35, 0xdd95f7a9, 0x23f99c36,
  195494. 0xbdd672cf, 0x7217fdd9, 0xdd2045c0, 0xf400ac1e, 0x4ff06b25,
  195495. 0x94b55c87, 0x0e4a49be, 0x0a44a0e5, 0xb43b6813, 0xe8925e91,
  195496. 0x214f96c5, 0x78bedde1, 0x0f97fa97, 0x0f456a4c, 0xa5bfd267,
  195497. 0xa28fd86b, 0xbe7608ef, 0x3b4b2d8f, 0x226474bc, 0xfbd5ff8c,
  195498. 0xa5f3b24a, 0x6b282af0 },
  195499. { 0x6341a595, 0x78fc025f, 0xa445e28c, 0x591c38d6, 0xeb446842,
  195500. 0x72bd6e3d, 0x75547833, 0x3f9466d3, 0x083e16c4, 0x911414d3,
  195501. 0x95a7acb4, 0x145d9466, 0x8fd2fb64, 0x102ddf09, 0x0bfd87b1,
  195502. 0x2a2b2d2d, 0x59455088, 0x69e9be5c, 0xa80245de, 0xee378bf4,
  195503. 0xb2306b0e, 0x80b0bd68, 0xc2be9f3d, 0x76a545c6, 0x4802c245,
  195504. 0x429d167b, 0x2b412dfb, 0x13e64427, 0xee8d9762, 0xb664f529,
  195505. 0x54706ebf, 0x6d4f5d23 },
  195506. { 0x00ba9f88, 0x35c8f2b6, 0x7bb6d0bf, 0xfdc807e0, 0xb3b81e5b,
  195507. 0x0a126d42, 0xa7ac781e, 0x335ce6ce, 0xf37dcba6, 0x3e308e6f,
  195508. 0x63c96487, 0x028dca62, 0x8818434d, 0x72eba57e, 0x79b78a26,
  195509. 0xa9e3d59f, 0x2f07aea3, 0xd2f0a7dd, 0x24d05f74, 0xe0fe4678,
  195510. 0x0116deb6, 0xb2085170, 0x58f37580, 0x9c2a5e92, 0x74070bb3,
  195511. 0xe78bd7a5, 0xb9977d90, 0x551fc872, 0x40db81b4, 0x6eda93c4,
  195512. 0xd65d34ad, 0x4aaf0b4f },
  195513. { 0x3514c7af, 0x9bef2506, 0xbc181ead, 0xb09e7dad, 0x8fa3ec58,
  195514. 0xef3cae87, 0x173b8685, 0xd8dbfab5, 0x921d32dd, 0xb2490fc0,
  195515. 0x8bd9c466, 0x4eef386b, 0xa061dbdb, 0xc1cdd52f, 0x25bc04db,
  195516. 0x64de989a, 0x85728636, 0x06f9836b, 0x8be44aa0, 0x11a5a804,
  195517. 0x097018c7, 0x16dede4e, 0xb2c11fb1, 0x72aec577, 0xa721ecd9,
  195518. 0x144dade1, 0xd6ebf3a9, 0xf99c526b, 0x1c2e14d7, 0xa1d4165b,
  195519. 0x82bc6337, 0x8b2cbd39 },
  195520. { 0x8a52e991, 0x28ec1bf2, 0xcf9d42ec, 0x0ba202f6, 0xc634ea45,
  195521. 0x8307d130, 0xc5762b9c, 0x3fc257b3, 0x487c2a2d, 0xbd3298d1,
  195522. 0xa319488a, 0xca14f1a7, 0x06ba06d2, 0xc70ca93b, 0xee405e89,
  195523. 0x9aa3f4b3, 0x35deeae7, 0xcc64eeb3, 0x03bf1d4c, 0xd155f578,
  195524. 0x45616bfd, 0x041ec0b5, 0x086e33f6, 0x23df80e6, 0xf0243cf5,
  195525. 0x399a79c8, 0x874ccd58, 0x86c2824e, 0x8fc5c831, 0x220eeaec,
  195526. 0x7dbe3670, 0x57e28304 },
  195527. { 0xfbcdf666, 0x6e60b698, 0x8bebb1d2, 0xbdd06a99, 0x80498436,
  195528. 0x4044adba, 0x522bc88d, 0xd76bf75e, 0x28423b20, 0x655c4b9b,
  195529. 0x53398a72, 0x65c0f492, 0x0ca37601, 0x76d4f2b7, 0x2030fa5a,
  195530. 0x46989925, 0xb6054705, 0x96b37e87, 0x53de1b2f, 0xef96f731,
  195531. 0xad54ef05, 0x5ecbbc8c, 0xa93617b0, 0xeb289d0a, 0x7cba217d,
  195532. 0x3ac0fbd5, 0x19d4a2d7, 0xd0d3cb56, 0xc91d6063, 0xe8bee9d4,
  195533. 0x696ffda6, 0x4f12e037 },
  195534. { 0x15f1a610, 0x4ccfa422, 0x3786519a, 0x804a5c55, 0x73838134,
  195535. 0x1246a454, 0x4b284e2a, 0xfa15b484, 0x146d1320, 0x36464c65,
  195536. 0x70a8a0fa, 0xfb6ba88c, 0x93c4804e, 0x74e7cee7, 0xb95ae16a,
  195537. 0x8c34d22c, 0xf9c1d4dd, 0x9d9ed89f, 0x32025371, 0x61a0866d,
  195538. 0x9bd6444a, 0x45b232b2, 0xf277bab1, 0xf888e92c, 0xa9448b02,
  195539. 0x73e69c6e, 0x5b521ecb, 0x1a496ea9, 0x5858afb2, 0xa8f78ea7,
  195540. 0xb1266f91, 0x83d2333e },
  195541. { 0x67b478d7, 0x1c633288, 0x50a2fc9c, 0xa1ee1ae1, 0x18d2241b,
  195542. 0x05b6ab30, 0x893cd696, 0x69f1f288, 0xa8117a87, 0x159d6660,
  195543. 0x70e73d77, 0xe8120119, 0x93f55f0a, 0x528fef00, 0xd854dfb2,
  195544. 0xb3978db8, 0xf45d9fbb, 0xd6b43ef6, 0xd5bee397, 0x17de4bfe,
  195545. 0x6bf76dad, 0xa01e0f59, 0x3d40754c, 0x28b2280e, 0xf8e86ef3,
  195546. 0x8edb6122, 0xb7d1e586, 0x8226b6af, 0x2f40a55b, 0x46353215,
  195547. 0xc5a31621, 0x7362f13e },
  195548. { 0x73c0c430, 0x792eb27c, 0xa51c3657, 0x8cc0a65f, 0xd2194f1b,
  195549. 0x50a5cece, 0x814b4947, 0x18945688, 0x4b6fbbf4, 0xbbf0a81a,
  195550. 0xf0aa8608, 0x376f4f58, 0x3987795e, 0xd9361d68, 0xe3a8d0d5,
  195551. 0xb6510cd8, 0xb6c1a455, 0x63e2fdbf, 0xaec891f9, 0x2c91154e,
  195552. 0xff568f64, 0x0eb1e715, 0x2f2b399e, 0xe7af9cd7, 0x89f0bf0b,
  195553. 0x1fc39bac, 0x90983695, 0xf0861d92, 0xda0a20a8, 0xd9b16f02,
  195554. 0xa38c0ead, 0x2f10693f },
  195555. { 0x0c06ded2, 0x07a6ce91, 0x2fd9087b, 0xf974842f, 0xa9f635a6,
  195556. 0xe468bfd6, 0x1ed60626, 0x04b61891, 0x369ee548, 0x1fb2f89f,
  195557. 0xdc96a201, 0x9cbd1113, 0x10d633ac, 0x6759acfe, 0x8faa629e,
  195558. 0x64ba66fc, 0x47f38283, 0xa686ae49, 0xd59cda99, 0x828c3a05,
  195559. 0x08ea2f6e, 0x7c7afb14, 0xaf3953c8, 0x2551c8e4, 0x9daa9e4f,
  195560. 0x5b53d279, 0xad6f1940, 0x1eff68d4, 0x96437cdb, 0x2775dbdd,
  195561. 0x4fe7a043, 0x985f83e4 },
  195562. { 0xeaf45294, 0x89603c16, 0xc24b5751, 0x70131160, 0x39d6b52d,
  195563. 0x4c112018, 0xed943340, 0x7079cf02, 0x74f41b68, 0x0c5b028b,
  195564. 0x9c8ac1e1, 0x3dc3f076, 0xf8b24f0e, 0x5ac5eea3, 0xe34c5c22,
  195565. 0xee6684ba, 0x9abc452a, 0xa5259e63, 0xe9df45cc, 0xb07d2cd1,
  195566. 0x1a443cfa, 0x07019c93, 0x92c003b3, 0x68fddaa9, 0x0d8cbc2e,
  195567. 0x2d9f179c, 0x1e781ca7, 0xbbf15a6f, 0x50dcc799, 0x54d779d5,
  195568. 0x0fe962f1, 0x0c88e540 },
  195569. { 0xe8f44357, 0x84f71a6a, 0x3a3cab6a, 0xf75b4bf6, 0x5aebc680,
  195570. 0x334c9d9e, 0x8a753ef2, 0xcecaf084, 0x075e3c8e, 0xe28014c1,
  195571. 0xf74f8d3a, 0xbb9d5a38, 0xb80e32ae, 0x75988464, 0xf2bc3792,
  195572. 0x7b328e6f, 0xeed0e197, 0xebbb1faf, 0x5a33065a, 0x674eac95,
  195573. 0x922dbce8, 0x8c19fd8f, 0x987b907a, 0x8c17ae85, 0x3b3a2cd7,
  195574. 0x89f33627, 0xfa87772f, 0xebaea019, 0x3a25ced6, 0x4e5de499,
  195575. 0xaf110715, 0x8e2560b8 },
  195576. { 0x3141aba6, 0x56d3746c, 0xbab2cf9e, 0x45a1079f, 0x9cdd27c7,
  195577. 0xb6382831, 0x9dfd950e, 0x22237632, 0x3a9408ff, 0x1e0b15cd,
  195578. 0xb1160118, 0x49a80200, 0xa383bba7, 0x2719db5d, 0x651046d5,
  195579. 0x6078340a, 0x97523b1f, 0x8929d4de, 0x8e0a28ab, 0x4040345c,
  195580. 0x0adf09c7, 0x61275ac2, 0x2331d611, 0xb41ab265, 0x5391ca50,
  195581. 0x230cc77c, 0x8f922315, 0x88be0c92, 0x92fd9a29, 0xfef3d92b,
  195582. 0x8324f2e5, 0x59005f22 },
  195583. { 0x3c4c1c74, 0x6bb1750c, 0xe966fb79, 0xbe73aac0, 0x66c5973f,
  195584. 0x85a75d92, 0x3a8656b6, 0x8c97f932, 0x50446cde, 0x2b7043b1,
  195585. 0x3ff3897f, 0x548916f7, 0xb18b72b2, 0x913dd01c, 0x488c0de6,
  195586. 0xd0a751f1, 0x8558ca58, 0x19175714, 0x44a663da, 0x97714301,
  195587. 0xb0e08618, 0x2df190ac, 0xf39ead9c, 0x0080fc0c, 0x17382da1,
  195588. 0x0085ac6e, 0x3262a338, 0xe9791851, 0xb43bae8d, 0xe4495936,
  195589. 0xd783df6e, 0x57a78e26 },
  195590. { 0x40dbddd8, 0x161b346f, 0x9410c3ac, 0x2b49a927, 0x1886cf3b,
  195591. 0x8c542783, 0x33b93deb, 0x72df3232, 0x40df579d, 0x9c8d59f5,
  195592. 0xc20ef500, 0xe5d7a67d, 0x67f08643, 0xc46b3918, 0xad96adc3,
  195593. 0xecfa2445, 0x0c4544d0, 0x658f589b, 0xe08417d7, 0xe6ec9301,
  195594. 0xc454e288, 0x6ca5ef6a, 0xac0f462d, 0x4191048f, 0x08d8a036,
  195595. 0x852407d8, 0xf6d35b7e, 0xb4c533a7, 0x8f6ada87, 0x3251e412,
  195596. 0x81c472e8, 0x1ca370c5 },
  195597. { 0xa801b68a, 0x94bd5171, 0xfd1998b3, 0x7312879c, 0x41163202,
  195598. 0x4905aabf, 0xf5b01fdb, 0xb5fe87f4, 0x9cda128b, 0x78de523a,
  195599. 0xc7bd31f7, 0x0bf161a1, 0x23904c35, 0xb5decfd0, 0xe188f12d,
  195600. 0x224b2882, 0xf99dae74, 0x0dd2801d, 0x08cd1cd2, 0xcad467b5,
  195601. 0xc0867e39, 0x6c311c3d, 0x2b425072, 0x71a11720, 0x2efd9003,
  195602. 0x83bf464e, 0x1dbd3b03, 0x53d0448a, 0xe6265baa, 0x32db52f4,
  195603. 0x4c33ac79, 0x2584b34c },
  195604. { 0x2aeec688, 0x3cb86389, 0x45fbe523, 0xa5e740ba, 0xfd60b5f8,
  195605. 0x422e71f7, 0x4874913d, 0x455d185c, 0xfa17d80d, 0x04c2bb36,
  195606. 0xac054524, 0x3f271854, 0xa8b9a657, 0x76dd3045, 0x62ee7cc8,
  195607. 0x2e42c3e1, 0x4df6c7d0, 0x00266706, 0xdc7cb488, 0x5927dd51,
  195608. 0x187897e0, 0x6b3faabe, 0xf2d5737c, 0xfe6ad22e, 0xff51a9ff,
  195609. 0xafb60269, 0x69807baa, 0xe1c83545, 0x951ca49a, 0xacddb6ff,
  195610. 0x3f9ab085, 0x7e811374 },
  195611. { 0x830a88b1, 0xad722a8b, 0xce1117e1, 0x91918ea8, 0x0409b47d,
  195612. 0x3e02d0b8, 0x6c46d1d3, 0xb53812d3, 0xe589669c, 0x2fd09db0,
  195613. 0x15b0cd5e, 0x9845cd06, 0x2386c453, 0x0c1c155a, 0xf5ff43cb,
  195614. 0xda774de5, 0xe391c0cd, 0xbb076b98, 0x5004f286, 0x97d71eff,
  195615. 0xaeec0bfe, 0x23e0b46c, 0x32a1ad94, 0xe4538667, 0x396da422,
  195616. 0xfe0c9f81, 0x63db2bfe, 0x6376c1a2, 0xba56fa91, 0x001c7918,
  195617. 0xdf8485a6, 0x436b8c64 },
  195618. { 0x8ab764bc, 0x88117e9d, 0xa077df84, 0xdfa61e94, 0x0c18eebd,
  195619. 0x5a7765d3, 0xfc9451dc, 0x548916af, 0x071a347a, 0x01a52e33,
  195620. 0xb23b41df, 0x633b95de, 0x43c8c286, 0xdd7d68c9, 0x18d97068,
  195621. 0xe4f9d41e, 0x8c92799d, 0x79908b90, 0xd47394a3, 0xe614148e,
  195622. 0xcd51e53f, 0xe5018517, 0x0243dcb6, 0x5060075e, 0x17954405,
  195623. 0xe5dcde62, 0x537da5ff, 0x6f7c90e1, 0x0768cb66, 0x1df7aae4,
  195624. 0x6dbe95e1, 0x5266ca9e },
  195625. { 0x1386b3db, 0x84ddee6d, 0x7c38e540, 0xf9e4af5a, 0xeb04f49d,
  195626. 0xb3418440, 0xfde5a4fd, 0x2138a1e8, 0x30257cfc, 0x3e6e6924,
  195627. 0x19fd70c1, 0x3519c6e3, 0x86c31ff0, 0x8f34e174, 0x940ce1e8,
  195628. 0xf1e298fd, 0x14960d7c, 0x6fb8cb1d, 0x2b2f3bff, 0x207c1347,
  195629. 0x146ef8ff, 0x899a20b4, 0x7bd3e220, 0x7dec362b, 0x626bea27,
  195630. 0xa975044e, 0x4fb4cb67, 0x0f32b449, 0x1fc6703a, 0xc17a0920,
  195631. 0x9cd84a2b, 0x41f325b9 },
  195632. { 0xce2843a4, 0x312ed513, 0x00728afc, 0xe748498e, 0x4d864ce5,
  195633. 0xa8ef2822, 0xa620083b, 0x34064704, 0x4bed338d, 0x5905e1d9,
  195634. 0x063e7b38, 0x2a578cb5, 0x289e7bb9, 0x98276d96, 0xf17b7341,
  195635. 0xdfe2dc47, 0x1dac8944, 0x5923521f, 0x23400aa7, 0x3db6d28d,
  195636. 0xa761ba43, 0xc647705e, 0x9bfd07dd, 0x8947ba6d, 0x242ca8fd,
  195637. 0x00f2e3ac, 0xeb8c3468, 0x49ef4670, 0xd9aa18fd, 0x7db3d37b,
  195638. 0xe58cea9e, 0x56b30fb6 },
  195639. { 0xcd80a428, 0x07ecdcaa, 0x8732c891, 0x7af922dc, 0x3ada441f,
  195640. 0x20d88798, 0x924b008a, 0x3bed9a44, 0xb2e81c3a, 0x2123533c,
  195641. 0x65f807d3, 0xc34e4075, 0x1f2faecb, 0x0bfaefa5, 0xade8a88d,
  195642. 0x78b634a5, 0x94392a91, 0xc4e0b7f8, 0x90bb1cd8, 0x30922377,
  195643. 0xf87204ae, 0xdea9b4fa, 0x85d3cd83, 0x3edf81f5, 0xc6523a79,
  195644. 0x58f88c51, 0x17c0d969, 0xe472fb8b, 0xdccf7f07, 0x899081e5,
  195645. 0x58bdd146, 0x1353cc57 },
  195646. { 0x39bf6e18, 0x28a56497, 0x649b89c7, 0x59e8b5a2, 0xdce8b8e7,
  195647. 0x8d9434a0, 0x2047040c, 0xd935bf51, 0x6a7b8e82, 0x2ab3a164,
  195648. 0x27f81294, 0xf1583ed6, 0x72d67297, 0x8416a7e0, 0xcd39e42b,
  195649. 0x49685d86, 0x958ddbad, 0x8a797fc7, 0x155ce6de, 0xa558f928,
  195650. 0xf8a36235, 0x75f4e570, 0x52877ae5, 0xbc69cfc0, 0xa6b16ebd,
  195651. 0x8f4193a9, 0xbb1cc1f1, 0x8d1df43c, 0x5a21e789, 0x723a830e,
  195652. 0xf451df58, 0x3ec2185d },
  195653. { 0x1f0bc2d7, 0xb9d4c7d7, 0x6e51d412, 0x6982c6cc, 0xa09f80f6,
  195654. 0x92e02d93, 0x047ae09c, 0xb7dd2d25, 0x37f351f9, 0x3503149f,
  195655. 0xc77850be, 0x69d49ce1, 0x12f0d2c8, 0x60242acb, 0x7bc28b9d,
  195656. 0xba188c56, 0x06bc0550, 0x8e406121, 0x8d7d4329, 0xb0d84b1f,
  195657. 0xd38951e0, 0xb4a67ae7, 0x8bc97607, 0xb527c57b, 0x5497aa72,
  195658. 0xbc93c5f3, 0x39bdd666, 0x5f1de8cc, 0xe9d447a3, 0x3087dc5c,
  195659. 0xa211abe5, 0x89b356b6 },
  195660. { 0xdfdcc837, 0xed6db0af, 0xa871b7a9, 0x0fb80baa, 0x1c1d4b72,
  195661. 0x413abfc9, 0xadac9e5c, 0xf5b56bf7, 0x8b8657a3, 0x5664a2da,
  195662. 0x0e41d94e, 0x11b04f72, 0x37433658, 0x63e11d26, 0xf426daea,
  195663. 0xee628ece, 0xcb162dc2, 0x011619c9, 0x87648643, 0x9cf5817f,
  195664. 0x5584bc86, 0xe1bb9702, 0x00bf7928, 0x2cc27cef, 0xdc60eee5,
  195665. 0x4ef3a80e, 0x87adc2f9, 0x7e1202be, 0x8a0d4f52, 0x656f18e0,
  195666. 0x57c5d126, 0x39c4f10d },
  195667. { 0xe88aecd3, 0xb3a9b68c, 0xa518aa9d, 0x555b0918, 0x4bd4ee54,
  195668. 0xedc1cdad, 0x02068d84, 0x79b68b67, 0x811ac72d, 0x7dac80d0,
  195669. 0xa81a0a78, 0x6d1e6d35, 0x3bd16283, 0xc841e9ea, 0x894c4444,
  195670. 0xa7bc1775, 0xf1aa1202, 0xf2b63725, 0xc7d4c556, 0xbec7767e,
  195671. 0xd46ff51b, 0x2817ebb3, 0x73f7e339, 0xfde5be8d, 0x5aed24c4,
  195672. 0x44c6c977, 0xb6e579cf, 0x0b9a1707, 0x9069fbcc, 0xcff16478,
  195673. 0x49152b00, 0x414b542d },
  195674. { 0x606e173b, 0x33c31e58, 0x90e6713a, 0x5b7f4e1b, 0xdebb20af,
  195675. 0x425fb512, 0x05120e70, 0xc788c617, 0x9013e4ec, 0x3ef05602,
  195676. 0x81c6e6d7, 0x9f9d35ac, 0x9450690a, 0xe131e88f, 0x44af082e,
  195677. 0x708f9b32, 0x1ba2aea9, 0xb2e4d66c, 0x740db29c, 0xaf1f4a6e,
  195678. 0xd1843007, 0x74ab9248, 0xed556a6c, 0x13338ef8, 0x270d17a6,
  195679. 0xf48e623e, 0x9608f5bf, 0x3c7362fa, 0x444e8515, 0x43977874,
  195680. 0xe00b8b2a, 0x52678d6a },
  195681. { 0xdf36aeb4, 0x5dff1c59, 0xa92bc0ab, 0x52d6653c, 0x927a5f81,
  195682. 0x0e03f496, 0x2dfd491f, 0x8509d414, 0xa571f89b, 0x258c2c52,
  195683. 0x93334485, 0x2bd61804, 0x3f7d9e09, 0x1a33e94f, 0x2c1bf906,
  195684. 0xfab418d3, 0x5aa5695c, 0xf39c490e, 0xf6d2d7ff, 0x0e41196e,
  195685. 0x0f7948a9, 0x3ecd4075, 0xd3053b4f, 0x4b58f9b2, 0x5d9974c9,
  195686. 0xb8ee842a, 0xbf22f682, 0x23a59c1d, 0xc8efcea6, 0x045ac614,
  195687. 0xc10ceedd, 0x7040ba5b },
  195688. { 0x515a1a96, 0x2c364f81, 0x184327e0, 0x31a63503, 0x1ad93d4f,
  195689. 0x0a096650, 0x273b6173, 0x9d7694f1, 0xd2cda9d2, 0x8886d876,
  195690. 0x2814c177, 0x1e01a742, 0x8667696b, 0x3492276b, 0x5b25f006,
  195691. 0x2fd4f0c6, 0xfb294c4a, 0x6527349f, 0xde1d336f, 0xc1fe0d8a,
  195692. 0xe7e3860e, 0xaf9a23e8, 0xb774c31e, 0x97d2b721, 0x4365784a,
  195693. 0xfac3e582, 0x70f4eaa3, 0xff2dff4e, 0xfe873248, 0x3d281e1a,
  195694. 0x0bd1c9c1, 0x9043a6d6 },
  195695. { 0x766c7937, 0x1511a0fe, 0xabbc3be3, 0x1b2ded5c, 0xe00888ac,
  195696. 0x2ac160cc, 0x616200f3, 0x928754bd, 0x34a2ea06, 0xb801c83d,
  195697. 0x9cbe106f, 0x8ad7a03a, 0xcedfcd94, 0x996b0822, 0xe4069880,
  195698. 0xc3c3463a, 0xf597f663, 0xfb12ea4d, 0x40c92af9, 0x2c8d3834,
  195699. 0x4e8da154, 0x79bc85c6, 0xdb4e801a, 0x95771fa2, 0x1e3579b2,
  195700. 0x7bd2c138, 0xffaad078, 0xe45c75df, 0xb73eac46, 0xb0760a3c,
  195701. 0x3a125f35, 0x26362b48 },
  195702. { 0xeefc3e89, 0x25c68d28, 0x69e9ee71, 0x2d0ee877, 0xaf5e4b75,
  195703. 0x8b07bb86, 0xcb86b333, 0xdb709072, 0xff552bac, 0xfd3d20ea,
  195704. 0x4c0da1e9, 0xa5eeb2b1, 0x44f97145, 0x391f688a, 0x1e06d485,
  195705. 0x21fbd310, 0xbea9cd49, 0x45e4f2a5, 0xa7bf21da, 0x7b60d464,
  195706. 0x054d5471, 0x193f88c8, 0xbee0f2e9, 0x5ace53d1, 0xc1439273,
  195707. 0x92c26563, 0x96c6b5ee, 0x9c86e0b2, 0x09ff59ba, 0x452fe231,
  195708. 0x555c935e, 0x2e952b20 },
  195709. { 0xd75f886e, 0x2a846bca, 0xd43dfc58, 0xe68a5dbe, 0x007b1b86,
  195710. 0x103e45b6, 0x355ff2b5, 0x580e2ec9, 0xa263ecc9, 0xbc702f26,
  195711. 0x181e5e33, 0x2835b386, 0x6c122076, 0x025113ec, 0x7fbd856d,
  195712. 0xa5c26e3a, 0x9d6ebcb1, 0x8ef83fb3, 0xa44d2fa8, 0x7aaa53f2,
  195713. 0x53b1fa97, 0x7c14ef33, 0x17559a30, 0xff604a11, 0xb09377e0,
  195714. 0x2bcd96b0, 0xdb2f0273, 0xa5c14896, 0xeb53ef06, 0x1c0a84c9,
  195715. 0x30378e4b, 0x1236d017 },
  195716. { 0xc084373b, 0xd7481c8f, 0x646097ae, 0x29ae4768, 0x613bc34b,
  195717. 0x1300dfa0, 0x934bc2b0, 0x3712714c, 0x0e2be7e2, 0x86524629,
  195718. 0xed010800, 0x554fbb9f, 0x42314576, 0xf0ec0b38, 0x330a3282,
  195719. 0x65baf594, 0x706ef817, 0x3bdde1a8, 0xba7530e9, 0x7d2c727d,
  195720. 0x74cc95cb, 0xbb0c5d66, 0x2438906d, 0xb3fcd365, 0xd14658f3,
  195721. 0x19881941, 0x6c97f0e9, 0xe616f555, 0x4b9ec7ea, 0x353c2d85,
  195722. 0x620cb56e, 0x02a48014 },
  195723. { 0x506ccd38, 0x11d6d23d, 0x9059baa6, 0x229a1c54, 0x69d011c5,
  195724. 0x717c9c27, 0xd828937d, 0xe87e1b46, 0x83835083, 0xf5d63bbb,
  195725. 0xaadac258, 0xf0a7b427, 0x9f154d1f, 0x99ab26bd, 0x8ec955fd,
  195726. 0xdec0ffbf, 0x49fcb880, 0xee957c67, 0x1e0114de, 0x32395dee,
  195727. 0x369f46c7, 0x192a64b7, 0x91eb2599, 0x43044660, 0xa2e8c3da,
  195728. 0xbe2da887, 0xc3556d18, 0xa44e2c25, 0xb55f75f3, 0x31390414,
  195729. 0x8f217fe0, 0x1d8bde6f },
  195730. { 0xa2028924, 0x03cd39f8, 0xb06ecb9f, 0x6e54f19c, 0xd6f05846,
  195731. 0x862bbcb7, 0x5a060776, 0xdbe06716, 0xb10fec10, 0x9397c97a,
  195732. 0x6f1bb65c, 0xf4213826, 0xa672ba38, 0x414deccb, 0xf88b05e6,
  195733. 0x594d4d43, 0xac94d4d1, 0x7993f57a, 0xbfb17638, 0x74fc2a6a,
  195734. 0xb6fc655a, 0xd8196b5b, 0xee8d2139, 0xdc375c84, 0x360d3a26,
  195735. 0xb9b00a02, 0xdeb93b87, 0xb36ed35c, 0xcc83209e, 0xf565b28b,
  195736. 0xc61013c1, 0x349c6943 },
  195737. { 0x4de6c88a, 0xd1b39444, 0x4700207e, 0xd5c2c471, 0x21c2b780,
  195738. 0xb6f458a2, 0x0850993e, 0x749f7564, 0xbaef0c18, 0x400ba579,
  195739. 0x737c70f0, 0x2d742938, 0x21467ebf, 0xc5a8e2ec, 0x5337f453,
  195740. 0x243a666e, 0xed0bd50a, 0xc991f1c7, 0xf4bd1f91, 0x3a7f3e90,
  195741. 0x5f0e129b, 0x96089e8a, 0x07389635, 0xd0d3a177, 0x27182ac9,
  195742. 0x9cf842d5, 0x0817c5c2, 0x21195299, 0x87255769, 0xa32f327e,
  195743. 0x89c2d8fa, 0x056587ab },
  195744. { 0x1ce4733d, 0x008562ed, 0x98e51444, 0x5faff7cb, 0xa9ab46b9,
  195745. 0x5f03021f, 0xb61a8c13, 0x89494c5e, 0x36b35976, 0x57c95036,
  195746. 0x2ac2d2f6, 0x6be84c8f, 0x9bd2703e, 0x0e5b34d8, 0x7e872abb,
  195747. 0xc4ad918f, 0xc4052ee1, 0xc2a89e9f, 0x3190b51e, 0xc2caee3f,
  195748. 0x6fff254f, 0x58fd1437, 0x883e0972, 0x6f3c0d68, 0x0fb15438,
  195749. 0x63d0a0e9, 0xf6caae00, 0xc438764b, 0x3f1d0f6c, 0x815f1565,
  195750. 0xb86cdbde, 0x1b87f2ed },
  195751. { 0x2b0b15b1, 0x35792bbb, 0xce6ba779, 0xa3e4b5a7, 0xdd8f3779,
  195752. 0xfbacffd9, 0xc298d1ef, 0x005450bd, 0xc47031c6, 0x0e3f5556,
  195753. 0x95d68066, 0x0770f07a, 0x2d1052c2, 0xce3e84e0, 0x7aa8cc54,
  195754. 0xb050791e, 0xba3223a3, 0x4d621e73, 0x39632990, 0x87b9b94d,
  195755. 0x7eb8056d, 0x8df9cb47, 0xedfca0cc, 0xe2430de8, 0x9712a0ca,
  195756. 0x374bf416, 0x88848a99, 0xbe3f3c77, 0xc4a3e59e, 0xb22b87b1,
  195757. 0x3e95bc23, 0x8e0227c4 },
  195758. { 0x3210964d, 0x000e22a8, 0xff056eeb, 0xdccd5df5, 0xdaf1ead7,
  195759. 0x02173a1f, 0x67cdcae3, 0xd02833e0, 0x8bdcc90c, 0x1cc574cb,
  195760. 0x3224b4f5, 0x86eca714, 0xbb3f8298, 0xd00e603a, 0x0c1a8deb,
  195761. 0xb98ece1b, 0x378c261d, 0x228a46e4, 0xa6165e5d, 0xc6f9dd0d,
  195762. 0x4b7ef0e2, 0xb3ae3899, 0xbda9f306, 0x3a3c16b3, 0x38a084db,
  195763. 0x5e9a26d3, 0x5394e950, 0x528e5993, 0x4ea206bc, 0x848ecb11,
  195764. 0x40545d6e, 0x14b15ab5 },
  195765. { 0x664c59a2, 0x0f6d86c9, 0x60fd7aa5, 0x3dfe2be1, 0x9072cb8e,
  195766. 0x33f9b569, 0x8176a7e0, 0x5f2325d9, 0x4587080b, 0x79a0d4e7,
  195767. 0x0d5d4e05, 0xa4ee0def, 0xc87b28e1, 0xc0ad9ffa, 0x3f09b4ee,
  195768. 0xd6f18d2f, 0x292e9d87, 0xcc896ae7, 0x6094763c, 0xca88953d,
  195769. 0x18fbf9fa, 0xdbee97a8, 0x4b63d701, 0xdf20e0e9, 0x47ea722f,
  195770. 0xcbba6e30, 0x612b571f, 0xce57e1ca, 0x009a55f5, 0x1e16ac76,
  195771. 0xc4389e2e, 0x742bbed8 },
  195772. { 0xc1dc2c73, 0x23ea86dc, 0xc1643abf, 0x4bbbfd5b, 0x24d8ca1f,
  195773. 0x07f8fa1f, 0x8cb5cac7, 0xde68a6e0, 0x54e66a7d, 0x7d54c64b,
  195774. 0xa9b7ad78, 0x789dba22, 0xe364ab94, 0x4d88d540, 0x1f72e011,
  195775. 0xc8c2e02d, 0x46e2a278, 0x4c826057, 0x4b187c7d, 0xe6c35bb3,
  195776. 0xeb8fe0c9, 0xed8b3dfe, 0x7d11e415, 0xb6bc34e8, 0xb865c7f9,
  195777. 0xb3908bbf, 0xe1ecc17c, 0x717d1ce6, 0xf7cdd69b, 0x151e3308,
  195778. 0xb5c94124, 0x97bd5a14 },
  195779. { 0x81e82861, 0xe01c62fe, 0xdd42c40e, 0x703d4b6d, 0xe65e91e5,
  195780. 0x7e52e55b, 0x5abbbfdd, 0xb8b49374, 0xc72a45f4, 0xb4f15f52,
  195781. 0x550f29d8, 0xce8435a8, 0x582de75f, 0x9df76b9b, 0xa20c8b96,
  195782. 0x52e84c5f, 0x0a8a0af4, 0xaf77d2d1, 0xca6013c3, 0x0389bbd8,
  195783. 0x26f8305f, 0xb0d9b9ba, 0x0cec8b9a, 0xf053e848, 0xffabda18,
  195784. 0x4d63367a, 0xa6424c2a, 0x50f53be4, 0x864fba2e, 0xf892c58c,
  195785. 0x48cc5469, 0x317c6d31 },
  195786. { 0x2cb7d42b, 0x0c3525b0, 0x310facae, 0x55240bc9, 0xff20408f,
  195787. 0x8d5d2022, 0xe0c10ea0, 0x6b01402f, 0x718eb23d, 0x7fbef68a,
  195788. 0x41252a19, 0xa0146b5a, 0x110e0d6e, 0x59afce48, 0x022de181,
  195789. 0xe9a1d27f, 0xdc3f49da, 0x6db96d16, 0xefbe4008, 0xfc1ae3f5,
  195790. 0xeccbc11c, 0xf9d70641, 0x525f8636, 0x49022279, 0xc2763c30,
  195791. 0x3769796a, 0x1d90630b, 0x9cc3483c, 0xee3d3f17, 0x451651f0,
  195792. 0x9da0b8fd, 0x6ae59739 },
  195793. { 0xbff4d2ee, 0x57b13bc7, 0x30b173d8, 0x20754229, 0x0794936c,
  195794. 0xb6254bd5, 0x5efd55be, 0x1d5f232a, 0x4e0c3389, 0xc06f4a85,
  195795. 0x8e61f944, 0xcf2c5b59, 0xfd5f87b7, 0xc564861f, 0x5a2afa4c,
  195796. 0xee261fb1, 0x2d97a774, 0xb0ff7226, 0xd6cf007a, 0x1a89ae22,
  195797. 0xd346f214, 0x28880534, 0x97b6497e, 0x8fe73bff, 0xfa2afffc,
  195798. 0x8a8595b2, 0xf151a726, 0x9ef9cf3e, 0xe744b82b, 0xa84ee5f1,
  195799. 0xbc63fe72, 0x6649048d },
  195800. { 0x1e8b760d, 0x91b7bb78, 0x25aadaa0, 0xd47b0bd8, 0xfab5226f,
  195801. 0x81493d9f, 0xbffc148e, 0x4a6dd226, 0xa29be3db, 0x5a032f8a,
  195802. 0x34b0ab0b, 0x318dbc70, 0x7d654868, 0xdcccbfb5, 0x9c581e46,
  195803. 0x8506ab37, 0x2830ece2, 0x09136a6e, 0xcf6c80c7, 0x48b79356,
  195804. 0xef6b1e86, 0xfa176377, 0x83f0f1c9, 0x2c9c1cc1, 0x16abeddd,
  195805. 0x96f0526d, 0xa93b0de4, 0x3e0e98e2, 0x0f13873a, 0x6f2d7ada,
  195806. 0xf3fa49ec, 0x4eb93b5c },
  195807. { 0xe11fae32, 0xbd89f7e5, 0xc4023f51, 0xd13d74f5, 0x491c3f6f,
  195808. 0x1b0014df, 0x555279b7, 0x1d849a57, 0x05ba0068, 0xbb9e8897,
  195809. 0xc13ca2ca, 0x82222419, 0xfd33676f, 0xafbbb685, 0x75878a2a,
  195810. 0x931c3f52, 0xef3d5173, 0x12aeefef, 0xbd8a6878, 0x189a5cc8,
  195811. 0xd99f0c16, 0x82cffdb3, 0xa19d48b6, 0xbf565406, 0xe9c6c4e0,
  195812. 0x5605e223, 0x86804172, 0x53e781de, 0xc7001cc8, 0xcdf5c90b,
  195813. 0x7c043f68, 0x2b582d93 },
  195814. { 0x81abc2ae, 0xa1165c82, 0xe2b69eca, 0xa73380f5, 0x07fff66f,
  195815. 0xc097b3d2, 0x54776506, 0x5d603826, 0xb57fa21c, 0xdcbac9f3,
  195816. 0xc98dbdd5, 0x78750db4, 0xd9eff32a, 0x85e21103, 0x2f11c41c,
  195817. 0xceed172c, 0x9e348c09, 0xa8e39264, 0x831eddfb, 0x71cb936b,
  195818. 0xf50864a3, 0x915c3d06, 0xe93acfcd, 0xfe8e33cd, 0xb3f2f7aa,
  195819. 0x4bee10d7, 0xeb7cee9a, 0xc1d8eb48, 0xfa574afd, 0x4fa49ce3,
  195820. 0x862db4c0, 0x78615109 },
  195821. { 0x7ae72c21, 0x3fe3f480, 0xfd0f0da5, 0x631aa144, 0xf8c3a454,
  195822. 0xc76ee1e8, 0x51b4f1ab, 0x379ae094, 0xd7cdbb24, 0x2a3a4397,
  195823. 0x82bd5fcd, 0x7a14cffe, 0xf427ef5a, 0xbbe4ed12, 0x284d3ccf,
  195824. 0x9b0a43ee, 0x8eec6e1e, 0x57b78b93, 0x67b8e87b, 0x18d404e4,
  195825. 0x34374c20, 0x0c8adc05, 0x5428deb5, 0x64373605, 0xc3afa2cf,
  195826. 0xb4d80ec0, 0x3aa956f9, 0x6d51f93c, 0x84161c68, 0x9f9a28ab,
  195827. 0x6bc9c025, 0x540b6bb7 },
  195828. { 0x321d315d, 0x04e1734c, 0xd86e05d0, 0x4ef56612, 0xbba8cd81,
  195829. 0xeafae145, 0xacdc789a, 0x1fb07a49, 0x5877570f, 0x6a21e9ad,
  195830. 0xb9bc53de, 0x2e4a837e, 0x1d6298eb, 0x436db293, 0xea362f45,
  195831. 0x43afbc78, 0xaabf6585, 0x2a973d97, 0x0c924d60, 0xdce7dabe,
  195832. 0x7cadf0e9, 0xf69d98f0, 0x75020538, 0xe0b505a1, 0x4461cd29,
  195833. 0x3db7d1a3, 0x5e20e818, 0xe1c28776, 0x52dd50f6, 0x2ca25867,
  195834. 0x92e0388c, 0x897cab14 },
  195835. { 0x0d8bab8a, 0x59ed3813, 0xa438200a, 0xc11d364c, 0x40581415,
  195836. 0x0687bf2c, 0x7ac89674, 0x86ad0d3a, 0xb97411a0, 0x44928105,
  195837. 0xf383371c, 0x74984b11, 0x0d1a831e, 0x70d2ed84, 0x6c912fe0,
  195838. 0xd883628b, 0x14fa88d2, 0x44f8f7fb, 0xcf0ac93e, 0x564f2a4d,
  195839. 0xa6c24fa6, 0x82f629aa, 0xbf6cd949, 0xab906ba3, 0x20a5182d,
  195840. 0x2c822e67, 0x30eb93a5, 0x2ff47dac, 0xfff673aa, 0xdc62c4a4,
  195841. 0x476b0ec5, 0x64b00763 },
  195842. { 0xb3c9a404, 0x1e3f533e, 0xb7ef9952, 0xb1db7f73, 0x6c253693,
  195843. 0xc7f13e29, 0x0738eed4, 0x7ce7f4c4, 0xce26cad0, 0xccfd3b33,
  195844. 0x01ec5cf1, 0xd8784935, 0xdc084e01, 0x3f8fc09d, 0xc39b5acf,
  195845. 0x217cab32, 0x9ef5551c, 0x42daf0bb, 0xe1217a95, 0xfbc76f56,
  195846. 0xc237002a, 0x80178b12, 0xb070a293, 0x0b52c39f, 0x576ca964,
  195847. 0xe3925153, 0x19d68e36, 0x25559424, 0x09e50e84, 0x291fb82c,
  195848. 0x6618ed8c, 0x7dd22ea6 },
  195849. { 0x49cbb3bf, 0x7ffe844b, 0x5562fb25, 0xde0cc704, 0x9f5a845a,
  195850. 0x1e6ee537, 0xe51277fc, 0x956d7f26, 0x30635718, 0x2c75d4b9,
  195851. 0x96957f34, 0x39a14892, 0x82e5742b, 0x8cf4eb32, 0x83247b72,
  195852. 0x6b0d3ddd, 0x201a4237, 0x67a9f633, 0x1414a485, 0x416403c1,
  195853. 0xb6f6a916, 0x60afd447, 0xdac6f790, 0x95f94930, 0xbd3b9d82,
  195854. 0x685ff94b, 0x51cadf0f, 0x5c8f98fc, 0xb13b7489, 0x9559c88a,
  195855. 0x5f18fcc8, 0x31377c66 },
  195856. { 0x7dcfb35f, 0x35c5de09, 0x01cc36f8, 0x2dccca9f, 0x7576cb63,
  195857. 0x7e93e85d, 0xf7b4b375, 0x0c2dd48a, 0xb09a19b5, 0x9d95cd4f,
  195858. 0x71bfe607, 0x752ed159, 0x2596dad2, 0x439880cf, 0x69e90a6f,
  195859. 0xe52efb53, 0x03d3e60a, 0x44097663, 0xa95070e0, 0xfcf364fa,
  195860. 0x05624dd2, 0xd8f993b6, 0x00d5e467, 0xb35a9824, 0x0c8f4524,
  195861. 0xe289d024, 0x648a0179, 0xef45423c, 0x587edabd, 0x3a5fd695,
  195862. 0xa11e5271, 0x3dacc50c },
  195863. { 0x6499ae4c, 0xcb3e4f94, 0x7053c527, 0xa46dcbe1, 0xbe782e8a,
  195864. 0x807f5ce9, 0xd8481e45, 0xb6c64d28, 0xaa286fd0, 0xf35e4518,
  195865. 0xdf1cdb49, 0xf7b7b9ba, 0xaec23eaf, 0xf3fb6210, 0xb9bfd2fb,
  195866. 0x0a9ba385, 0x8807f3a0, 0xe51a0d53, 0xb17b2842, 0x7ab24404,
  195867. 0xf9dd9f0a, 0x6fd57687, 0xf3e9df64, 0xcd1efdb4, 0x60df194d,
  195868. 0x5dd2df7a, 0xe069df05, 0xbed3f2c3, 0x23248a31, 0x469b7561,
  195869. 0x694744f7, 0x866949e1 },
  195870. { 0x3f4ab07a, 0x3a9a0da5, 0xf54a6fbf, 0x2cd6f333, 0xb23cf290,
  195871. 0x0c92e921, 0x848e3d58, 0xc9581c3e, 0xd3b218ab, 0x93af1fbd,
  195872. 0x066cb4d7, 0x38598ea1, 0x990c03a0, 0x5001394e, 0x7d0877b5,
  195873. 0x3b664b1e, 0xd74c7091, 0xd79db1bb, 0x4e2d5dd0, 0x852d4435,
  195874. 0x3329db82, 0x0d2b841b, 0x7b96d480, 0xfa844eb0, 0xc295dc46,
  195875. 0x37a50569, 0x94f7ec4e, 0xc2d38373, 0x5b083177, 0xdc3884ff,
  195876. 0x8b1fa598, 0x574352b8 },
  195877. { 0x0d5d7ce9, 0xed2193f7, 0x0b487eaf, 0x3c19fd26, 0x7be65fd0,
  195878. 0x7c44ab59, 0x78270d56, 0xdd9da860, 0xbaa70198, 0x8a84ec00,
  195879. 0x285985df, 0x2ec27e49, 0xde2028d8, 0x996ccaf0, 0x61c2201d,
  195880. 0x4e7648c7, 0x091c19eb, 0xa96335bc, 0xf0d6782b, 0x253a3a69,
  195881. 0xd2946493, 0x3f204340, 0x099f6873, 0x444521a1, 0x6996011a,
  195882. 0x5fcbcc09, 0xf853a94e, 0x3884d5d8, 0xd3b6a3a1, 0x2418c624,
  195883. 0x06ae3c4f, 0x3e431af2 },
  195884. { 0x83d381f1, 0xf967d939, 0xd0c033c3, 0x36501aae, 0x54410768,
  195885. 0xbf3af4d0, 0x5093a6d3, 0xa86d1598, 0xd92f2900, 0x43ae0741,
  195886. 0x36f0b755, 0xfeb2afa6, 0xaa456d6f, 0xd090a6a3, 0xaefdb646,
  195887. 0x336a4fda, 0x1a942f7d, 0xfd1bfe44, 0x851ee41e, 0x7fc2a3ed,
  195888. 0x11e935c5, 0x4f1c9686, 0x53bbb343, 0xcd577666, 0xad896c2a,
  195889. 0xf26931ba, 0x86bbfa41, 0x8a0fbbd1, 0xa203cef1, 0x1c3d7d82,
  195890. 0xe2664d35, 0x6dad3f15 },
  195891. { 0x12ec35a1, 0xd1940b7d, 0xe7dfb128, 0x6219c5b6, 0xf13321d5,
  195892. 0x2cc278c6, 0x33c58eb6, 0x5e76904a, 0xd9903c43, 0x15090f55,
  195893. 0xc3d96a19, 0x061bc926, 0x8c0acba7, 0x974a9f03, 0x7198b21b,
  195894. 0x7a414021, 0xf8958c6f, 0xb069599d, 0xbebd0129, 0x517f2f1d,
  195895. 0xdf3a8dc3, 0x1109a613, 0x672375c5, 0x08e58448, 0x9383d2d3,
  195896. 0x56590ba4, 0x0bff837c, 0xfc3ee7c6, 0x27d2d55f, 0xc87a5390,
  195897. 0x5f517a3f, 0x2438e9d4 },
  195898. { 0x8815af3c, 0xc4a45308, 0xf3c9bed5, 0xe55f1a32, 0x97b65ddf,
  195899. 0xaef1cdc9, 0x12e51eb5, 0x61c61d94, 0xe63f2490, 0xbd0dac54,
  195900. 0xd0b3e231, 0x6f14429c, 0xf1da6010, 0xf737c3c2, 0x6bbc4fb1,
  195901. 0x7150e04b, 0x1be281cb, 0x205b4c89, 0xd7701f5b, 0xf1b4633c,
  195902. 0x2a513490, 0x8b33ef46, 0x68f1f7f2, 0xddb47c73, 0xbd416b67,
  195903. 0xf4ada511, 0xff795bb3, 0x9d2a97cd, 0x96200e67, 0x00a8b7b2,
  195904. 0xafe30e01, 0x13f39011 },
  195905. { 0x7bd0c827, 0x3dd296ef, 0x4a29ff46, 0x506110f3, 0x1c9a515a,
  195906. 0xf8793068, 0x268bca77, 0xde8d8045, 0x998045df, 0xcbb83024,
  195907. 0x68c0e584, 0x3f90d710, 0x263b6062, 0x2a838ca8, 0x535c5d0b,
  195908. 0x293bb5e7, 0x56415110, 0xceea99d5, 0x1bbda005, 0xfe311ad0,
  195909. 0xa4d8d018, 0x2497e0bf, 0x1cf2b866, 0x33dd77a0, 0xd8c4ba8b,
  195910. 0xbc075b73, 0x722b7bc9, 0x298466d4, 0xcbda1b0b, 0x17a7ce24,
  195911. 0x680703b6, 0x458d4b6b },
  195912. { 0x4d54d8b2, 0x8a26a20e, 0x4d320a0d, 0x05a5696e, 0xf994f700,
  195913. 0x698b5858, 0x2f6549a8, 0x7a4adc3c, 0x3694d00d, 0x1812e819,
  195914. 0x730402bd, 0x46b9b000, 0xa1b36410, 0xe10a1449, 0x99230220,
  195915. 0xeae95ea5, 0x1b4820c3, 0x3efc2e9b, 0x85c9eb8a, 0xfe5b5cb5,
  195916. 0x97847064, 0x21ae0319, 0x8f27d49f, 0x68ef0b70, 0x2f72556b,
  195917. 0x3259ef18, 0x624db01a, 0x00ae0457, 0x5668f95c, 0x628e3b06,
  195918. 0xb6fbbf91, 0x5f13f5fa },
  195919. { 0x3a9b0dc6, 0x7c6ed9ae, 0x6f883ec8, 0xaea1bde9, 0xea8b3677,
  195920. 0xea66bf88, 0x9a66e3ab, 0xdefa6abc, 0x68217ffd, 0xc4d3317b,
  195921. 0x290df05c, 0xf741c8f2, 0x7d11674e, 0x1f0fdf17, 0xc35989ca,
  195922. 0xfdf0ece7, 0x6b9c482d, 0x0eed92df, 0x55bf1ca7, 0x73713e66,
  195923. 0x25cec99c, 0x90acb290, 0xe803e69c, 0x37c9e3a2, 0x17713a1a,
  195924. 0x7c0a3c53, 0x6f5a174d, 0x350dc565, 0x05f802f6, 0x11625a44,
  195925. 0xa37ba4a2, 0x2196495d },
  195926. { 0x13142680, 0x00cb2fd3, 0x65d14cf4, 0xab9e91d7, 0xdfe2669e,
  195927. 0xc6a0ceab, 0x0ae22bc5, 0xbeefce58, 0xcb6ec250, 0x3c2b7986,
  195928. 0xd738f1ff, 0x84adb1a2, 0x516ec8ec, 0x9709bc28, 0x8e8f7db5,
  195929. 0xf3693129, 0x95b197f9, 0xc48efc6b, 0x9aaaa404, 0x9ff10952,
  195930. 0x144154b0, 0x2c3c8cbd, 0x427f3435, 0x33ef7bc3, 0xd21897c1,
  195931. 0x04a17940, 0x6ce548a0, 0x5aa0c47d, 0x3d56fa62, 0x2971cea7,
  195932. 0x04475f08, 0x93ad0eb0 },
  195933. { 0x988a9963, 0x7a0b6967, 0x6515e8dd, 0x61e477f7, 0x3b6b50f2,
  195934. 0x6274e386, 0xd33922de, 0x63a9b8d5, 0x687a5b3d, 0x3c38d3fb,
  195935. 0x1302e323, 0x18f6f09c, 0xe02fcccf, 0x254c05c3, 0x26e662f7,
  195936. 0xc04ed0b7, 0x143fe079, 0x1d5646b8, 0xc9016c8c, 0xef8a9448,
  195937. 0xf823d797, 0xe5674c4b, 0xbccde451, 0x0586f72f, 0x4417eade,
  195938. 0xc5fc88d5, 0x576e588d, 0x2b952209, 0x5844d1f9, 0x4408dd42,
  195939. 0xea41c034, 0x73f8c3f0 },
  195940. { 0x5df763dd, 0x89534fc8, 0x3ac71836, 0x3b1427f3, 0x6e8f15a0,
  195941. 0x0db5be17, 0xcb20888e, 0x1d390944, 0x857caea6, 0x7804c9ad,
  195942. 0x519f7bf3, 0xaa584428, 0x293aa8cf, 0x626eecf1, 0xea36a015,
  195943. 0x749e0d98, 0x3321edcd, 0xefff6dae, 0x28b791cc, 0x963deea6,
  195944. 0x2d16e361, 0xa14e0552, 0xb15ae206, 0xa2e058fc, 0xfca325e4,
  195945. 0x0f268745, 0x21341a8a, 0x7cf9d407, 0x7caa51b8, 0xdfed25d9,
  195946. 0xadbedd75, 0x0108ae39 },
  195947. { 0xa9e88f63, 0x54d178f3, 0xab0c7325, 0xaa05b11e, 0xe261d8a6,
  195948. 0x773a53e6, 0x8d0b91c8, 0x24db7dae, 0xe9bb004d, 0xde10b073,
  195949. 0x54e3090b, 0xfc8befe7, 0x0cc69c89, 0x16af0599, 0x9d59511a,
  195950. 0xddc83803, 0x46c5dafc, 0xc3f65b99, 0x1ee0a599, 0xfbbe4be8,
  195951. 0xfb3a9b17, 0x88891e36, 0x445dad00, 0x0c9aad75, 0xd5097e1f,
  195952. 0xdffc46ab, 0xac85a4e1, 0x8848089b, 0xa0c45233, 0x348bb42f,
  195953. 0xeb13c1df, 0x807c06d8 },
  195954. { 0x98ee0ef6, 0x00a969ec, 0x8bb7b7af, 0xba9d5483, 0xa02f8fdb,
  195955. 0x24484c92, 0x8b70557c, 0x7bdb201a, 0x60ad1af2, 0xe59343e4,
  195956. 0x998c95fb, 0x53a9a942, 0xda861d3b, 0x974db3de, 0xed399c0e,
  195957. 0xce1525c9, 0xf72109bd, 0x89b56881, 0x998211a4, 0x08ff7d15,
  195958. 0xef0f275a, 0x5df76b3a, 0xfa2f358b, 0x93f180f7, 0xc39b0634,
  195959. 0xaac4ffcf, 0x17583b53, 0x2692c626, 0xb55399fc, 0xb2fdfa36,
  195960. 0x99607a61, 0x16424c6c },
  195961. { 0xdd2744a9, 0x5dd65c55, 0xfe3af418, 0x2544c1c2, 0xefe8b089,
  195962. 0x32c82e99, 0xa9df691a, 0x30b7ab25, 0x9be99674, 0x98384550,
  195963. 0xcaf2d122, 0xbcecd258, 0xbcc77272, 0x88ae4098, 0x4b8efa0c,
  195964. 0xd4396141, 0xed64d12c, 0x44ff67b9, 0x2e7f3404, 0xa9e655e4,
  195965. 0x45b0e9eb, 0x3d16fc45, 0xf03ded28, 0x474a3e14, 0xacccb85c,
  195966. 0xa3c9adff, 0x7253a51b, 0x3dfe6bc1, 0xfb5831b1, 0xdddaf4b9,
  195967. 0xa4f4478a, 0x5544e602 },
  195968. { 0xbaa80b4f, 0x897c5313, 0x63bdc8ef, 0x0122716f, 0x7b42c5a8,
  195969. 0xae2742db, 0x0883308c, 0xe9d9e1e9, 0x2d341ab1, 0x352c8c3f,
  195970. 0xed945870, 0x163d0500, 0xc290d9d8, 0x8349dd73, 0x1f6c7d29,
  195971. 0x2053c5e0, 0xcb42033c, 0x83107446, 0x09d09af1, 0x76c88bd2,
  195972. 0xb2794681, 0xd0f70e6e, 0x19b1b540, 0x720b59de, 0x22994b43,
  195973. 0x80b7ecdc, 0x2dec53cf, 0xc1a4cdce, 0x1ed60f42, 0xdd7d3edd,
  195974. 0xe241d261, 0x5735995c },
  195975. { 0xa0237056, 0xdc4ba3fb, 0x33ab3388, 0x6856c164, 0x271ec612,
  195976. 0xc01eebbd, 0xe3031bec, 0xabdeb033, 0x6118a1f5, 0x4eee4419,
  195977. 0x5b600f33, 0xec497421, 0x08868773, 0x1b7185cf, 0x7c1b7dfd,
  195978. 0x7b0c46cd, 0x4a4c5e89, 0xd143b2da, 0xbb1ff94d, 0xdb9a5984,
  195979. 0xc9cf3465, 0xac3904e4, 0xeace64c9, 0xf8729bc0, 0x768ad99a,
  195980. 0x5cc22821, 0x8a9540c2, 0xbbd3b081, 0x049a6917, 0xe468ed5f,
  195981. 0x3ec45ef0, 0x885486df },
  195982. { 0x4bdff464, 0x6a942c93, 0x25a7b451, 0x3db2719f, 0x325be324,
  195983. 0xccb0070b, 0x19fe3339, 0x2055a31b, 0x241ee8ff, 0xaca69ae8,
  195984. 0x55ef8def, 0x7607dd08, 0x1a1b73c6, 0x9e24960f, 0x71d36810,
  195985. 0xbcb0e8a2, 0x6885e6b9, 0x29e11aa2, 0x185eae19, 0x98b5d0ab,
  195986. 0x0f81f91c, 0x1a0b96e4, 0x994fc503, 0x4d0e8bcf, 0xf119d6e0,
  195987. 0x33d81697, 0xaaa4ce0c, 0x29083287, 0xc91ff9d7, 0xc5dd4d3e,
  195988. 0xd4ab962d, 0x31cecfe8 },
  195989. { 0xfc8b21e8, 0x437bfd9a, 0xb19436df, 0xe5dd32b3, 0x921c36a0,
  195990. 0xfe5902d4, 0xa3d0fa90, 0x8e9de84d, 0x5bb523bd, 0x9663e6ad,
  195991. 0xaecd6975, 0x9800a23f, 0xb4fbb59c, 0x1009c0d9, 0xc9d20ff1,
  195992. 0x839aa7bd, 0xecd6fa3d, 0xf502f66d, 0xc5516ca9, 0x480ed4fb,
  195993. 0x6c742ac4, 0x65ffa5f6, 0xff3252f8, 0x2b7c7945, 0x75d9cb3d,
  195994. 0x72fefc05, 0xd6d6f1d2, 0x11b0863b, 0x9a6a4ec3, 0x5d8f3cf0,
  195995. 0xda2547b3, 0x6961b46a },
  195996. { 0xcb35e2ac, 0xd07b587e, 0x57af14d9, 0x1ed5546b, 0xdb28a04c,
  195997. 0xeca17a5b, 0x709d54f0, 0xa1f91d44, 0x9c6f400e, 0xa6e719fd,
  195998. 0xfb8ce190, 0x4e4b88ed, 0x246e3fd2, 0xf9781edd, 0xb655af5d,
  195999. 0xd67120e6, 0x93413ca7, 0xda782d1d, 0x9707fa21, 0x697e20a2,
  196000. 0x54e84123, 0x1eb51f32, 0x36051f9f, 0x2e254d9e, 0x73ce5be9,
  196001. 0xddaec42b, 0xcd3f794f, 0x89a9a32e, 0x0781aad9, 0x1964e22f,
  196002. 0x53755212, 0x6a63a90c },
  196003. { 0x3d7acbbb, 0x76554e00, 0xb74f6108, 0x2c01668a, 0x388c519b,
  196004. 0xe4a29672, 0x3eb94d4f, 0x01667714, 0x0cd6d2f6, 0x086a3cdf,
  196005. 0x7b370f7f, 0xf8658021, 0x5a4d3e7c, 0x658880c1, 0x5ba3f4a1,
  196006. 0xd6ed5816, 0x5ca471dd, 0xabcc7813, 0xe844a576, 0x809bf074,
  196007. 0x6ea502ea, 0xa53a81b3, 0x0e021ed3, 0xc20b9307, 0x8617f165,
  196008. 0x8c27f892, 0x8235cd0b, 0xa5476446, 0x82552961, 0xffc89ffd,
  196009. 0xd151d90e, 0x51ed4a22 },
  196010. { 0x449701b4, 0x37d6963a, 0xbb27caf2, 0xea8d91a3, 0xb572965f,
  196011. 0x3ef9be15, 0xdb50bf7d, 0x75a7a055, 0xce643b9b, 0xfd67480e,
  196012. 0x6ceb5d5e, 0xf2a60d2d, 0x5ed7c897, 0x68fc320c, 0x28ce685f,
  196013. 0x41c53cf6, 0x7106615e, 0x0e29711f, 0x23500ecc, 0x7a872138,
  196014. 0x6c29fe48, 0xaf0a9260, 0xe1ef9712, 0x93df3f2a, 0xd2d169bf,
  196015. 0x0d5f6fb1, 0x74a9793c, 0xeb7afe26, 0xe9f49256, 0x4173d94a,
  196016. 0x2b8b5ce5, 0x2d6951bc },
  196017. { 0x904e222e, 0xdd007d9f, 0x86f4e109, 0x333f248f, 0x8f429eee,
  196018. 0xd4994e8b, 0xcfc77518, 0x29573415, 0x0b0f42f1, 0x6e7fea3a,
  196019. 0xc2743519, 0xc795cb7d, 0x711e71a0, 0x820a8f66, 0x2b874f55,
  196020. 0x83d95d9c, 0xe70e1627, 0xd4b64d78, 0x8b92a742, 0x924353f5,
  196021. 0x447b5e6d, 0x322048b1, 0xbcf931a0, 0x0bad730c, 0xa7af2268,
  196022. 0x75c4d089, 0xb83b93f9, 0x464904c1, 0x165b3aee, 0xa24eba02,
  196023. 0xe08cc5f0, 0x65c48e78 },
  196024. { 0xde222c22, 0x1a1c73ce, 0xfcea23b4, 0x5683d8cd, 0xb2143b06,
  196025. 0x0301cb14, 0x59fcec77, 0x284adf8f, 0x31204cef, 0xfb1c581c,
  196026. 0x94735107, 0xf54d3eee, 0x4d3188c0, 0xdbf67f0b, 0x10f18d12,
  196027. 0x76a3f2d1, 0x07d3e013, 0x3809fa28, 0x25e7ece0, 0xf06f0a46,
  196028. 0xb2895d2e, 0xd82867ed, 0x08b0553a, 0xe106f489, 0xef245445,
  196029. 0xe2280fa6, 0xa8d9a3cb, 0x402d5785, 0xd438ba2d, 0xf63dd9ff,
  196030. 0x7a6b226f, 0x36b5cd2c },
  196031. { 0x545679a7, 0x87ff4e20, 0x4520c750, 0x64d80b41, 0x9b459cd8,
  196032. 0x90a357fa, 0xc85af1a3, 0xa19eaf39, 0x8d935a5e, 0x0d475d79,
  196033. 0x781a678a, 0x74501983, 0x0cc2e810, 0x74839779, 0x2f412244,
  196034. 0xc6a21d11, 0x36a51a37, 0x8d0e85f9, 0xeaa74df8, 0xff50151e,
  196035. 0x93cf99c4, 0x14e182a7, 0x376a9ab6, 0x45593df1, 0x522389ff,
  196036. 0x18f73caf, 0xf7445e8a, 0xd27cc960, 0x39a51dc8, 0x0692f4c5,
  196037. 0xdb39bfd8, 0x08d7c144 },
  196038. { 0x3ecca773, 0x809c0d96, 0xd48c2156, 0x87ea9192, 0xdb6bd641,
  196039. 0xf0eccd74, 0x2a678cdf, 0x77312374, 0xd1587b7e, 0x7a966d8b,
  196040. 0x6130a4c6, 0xf3c1a101, 0x5fce17bd, 0x7cc6e838, 0xa8de7aa4,
  196041. 0x95e95bb8, 0x898308e3, 0x3fe1e8b5, 0xe347694a, 0x0197243e,
  196042. 0xbb0cd2bf, 0xf3fe9c42, 0x0f9b2b49, 0xb5905264, 0xc7367d1f,
  196043. 0x4c385e8b, 0xb5ee147b, 0x1d3050ae, 0x04004ad9, 0x8e2c3879,
  196044. 0xbab70202, 0x5f2aa8ee },
  196045. { 0x1266524b, 0xe208d464, 0xd0a19f66, 0xb7bf3880, 0xda106ebf,
  196046. 0xa5aa685e, 0xe642dd46, 0x0a69e8d3, 0xc682e4d6, 0xef349c61,
  196047. 0x0fcb534c, 0x26f6ee3b, 0x05eb67b8, 0x7daba127, 0x18be05f6,
  196048. 0x2babb27e, 0x8e2d85d1, 0x959afcba, 0xe2d9d386, 0xedcf2d1a,
  196049. 0x1ea6f06e, 0x59dc52e6, 0x866e5ae8, 0xc28278b4, 0x02bcd3c7,
  196050. 0xd9ff0340, 0x784be82f, 0xe884ac76, 0x83c9f224, 0xa3164980,
  196051. 0xb46ff949, 0x62501a98 },
  196052. { 0xad264086, 0x563f7d9a, 0xa5e0e4bd, 0xca6a33db, 0x8c8d3d67,
  196053. 0xe8253002, 0x46e64b19, 0xa288dac8, 0x20aa4536, 0xfa3c9197,
  196054. 0xed553eac, 0x8130c9b0, 0x2ea8abd3, 0x622806e0, 0xceccfe77,
  196055. 0x52fbf54d, 0x4f0d1b70, 0xbd9a8e31, 0xd59b1741, 0x519d2133,
  196056. 0x9a6fea8a, 0xfd74101c, 0xb5c4eb10, 0xd1acf7a0, 0x91f9da5e,
  196057. 0x78499b73, 0xc0dea586, 0xabaa4c49, 0xa1f3531a, 0xcc9c5f73,
  196058. 0xfd3fc665, 0x497b15fe },
  196059. { 0xf45568e9, 0x8a56cbaa, 0xc7192a6f, 0xf491a0fe, 0x9ab2539a,
  196060. 0xdbb03dd3, 0x4ac37da9, 0xc86522f8, 0x02a0f5b4, 0x8c8cdba2,
  196061. 0xa29c539f, 0x8109fc75, 0xca90f02e, 0x9cd06d31, 0x3e216dbf,
  196062. 0x8f31f044, 0xba3ebd91, 0x99aa68ac, 0x42c007f4, 0x2a80d0d2,
  196063. 0x86a9b7ce, 0xdd8dffbf, 0xd6308edc, 0x405d3e84, 0x068012ca,
  196064. 0xdafa33fe, 0xedea1071, 0xc2eebd13, 0x2ff637e6, 0xb7ae7e5c,
  196065. 0x9e514cb7, 0x18d46a6c },
  196066. { 0xa78b7802, 0x868cbb22, 0x497cbaf4, 0x0745ddb2, 0x42ae8add,
  196067. 0xc4eb2f3e, 0xb4ceb4e4, 0xac0abcda, 0xa325fd40, 0x2e0d8325,
  196068. 0x13ac7345, 0x6cfe0571, 0xb14171b9, 0x7407a788, 0x6da7a52b,
  196069. 0x70eb0603, 0xd85176ac, 0xab0b36f9, 0x7c2954f3, 0x14109d29,
  196070. 0xdcd705ad, 0x370de9c8, 0x7bb5e751, 0x3f0db5cd, 0xa06e708c,
  196071. 0x45f93d41, 0x7e93050d, 0x10d54f8a, 0x5a38fef9, 0x69e6f8e4,
  196072. 0xd3f62e40, 0x55044601 },
  196073. { 0x06cb9cc9, 0xd1c5c910, 0x41d00014, 0x542074d7, 0x11236fb8,
  196074. 0x7cd8663e, 0x29ad5f82, 0x39721ffe, 0x2951fc83, 0x1d21fbfa,
  196075. 0x400d144f, 0x1cde06e7, 0x91792e6b, 0x9042596b, 0x29ad5166,
  196076. 0x3365c8e5, 0x9aeefe98, 0xe2220e85, 0x70c2aee3, 0xbcb53189,
  196077. 0x9ff100bc, 0x477ca3db, 0xf532973f, 0x27074176, 0x9a2bd01b,
  196078. 0xa12118ac, 0x3dd79f93, 0xf3425209, 0xc6f5d7db, 0x563a8ff7,
  196079. 0xd7b0ec4f, 0x0da313fc },
  196080. { 0x15aa2557, 0x37125a8c, 0x00893e9c, 0xca21d70c, 0x67b8a823,
  196081. 0x48713994, 0x7cb0042a, 0x0d3e9a74, 0xc9e2ce18, 0x2d2bf4ff,
  196082. 0x049aeac2, 0xd5531a0d, 0xf03d0660, 0x4d29a616, 0x1f1b7f00,
  196083. 0x473d50d6, 0xca3de50c, 0x3af0ecbb, 0x09c28f27, 0xe2959bea,
  196084. 0xf8704664, 0x6d7c2ea0, 0x731083ef, 0xadfae4e1, 0x941c2554,
  196085. 0x50940c26, 0xa1162d03, 0x44167410, 0x1e82290e, 0x620230d8,
  196086. 0xdb414acc, 0x63630be8 },
  196087. { 0x8a7d2e41, 0xbf8d5222, 0xeb62f879, 0x49e75823, 0x6c402d89,
  196088. 0x1b4d33dd, 0xde2c59ad, 0x883e04d6, 0x49b9dc38, 0xbf3f38f4,
  196089. 0xb4b70c4c, 0x9d997d18, 0x13cea045, 0x1f69b20c, 0x58e2606d,
  196090. 0xca3d7025, 0x261d1b79, 0x3d4fd977, 0x5a1436fa, 0x56aeafa8,
  196091. 0xbb443c07, 0x369b3e98, 0xe558f6be, 0xfce5186c, 0xf8ac8f89,
  196092. 0xeb0cd478, 0xd5e5aa72, 0x68074f37, 0x68544eb0, 0x295845c0,
  196093. 0xf16688ed, 0x306a9871 },
  196094. { 0x634ec136, 0xbc451e9d, 0x0e6f658f, 0x1edf27ca, 0xc0db4120,
  196095. 0xa9be0152, 0xc5bfee67, 0x87b6ef20, 0x9a2d6023, 0x35283238,
  196096. 0xc7afb899, 0x60e564d8, 0x0ac9c2de, 0x4af22bc0, 0x82a9d22b,
  196097. 0x28e6f631, 0xf532701b, 0xc075c701, 0x82075f91, 0xf6d418f8,
  196098. 0x1beaa511, 0xf9fa628d, 0x6e72a13d, 0x551e7a17, 0x77f4c01c,
  196099. 0x9306215b, 0x93c9d588, 0x71aba731, 0x58e57cd4, 0x6443ebe0,
  196100. 0xe8103e37, 0x2833ac41 },
  196101. { 0x8da5ec5c, 0x7e564b86, 0x1c08db24, 0xac3d9da8, 0x8c57a728,
  196102. 0x9d7c1f0b, 0x9d343dc2, 0x3512afe7, 0xfdc60339, 0xb438e4cf,
  196103. 0xdcfa1941, 0x7d5a2700, 0x27320449, 0xd5f323f8, 0x1393c6e6,
  196104. 0x1b87a58e, 0x04baa431, 0xecb68bd1, 0x4722b4d7, 0xc09c1c5a,
  196105. 0x206b5faa, 0xf42faa97, 0x9976327e, 0xe1dcbcd6, 0x087787d9,
  196106. 0x655ba9e4, 0xde5c0191, 0xbd59c757, 0x0bcf3538, 0x673020ed,
  196107. 0xa49d6303, 0x120cd454 },
  196108. { 0xcab0f9ee, 0xebfdb8f4, 0x2cce58ee, 0xbc003ef0, 0x5a8d0665,
  196109. 0x9b6a6841, 0x9b957774, 0x642ed3a6, 0x4721ab5c, 0x3de487f0,
  196110. 0x21a4f0d3, 0xef2ff380, 0x29dbddcd, 0xbd16f558, 0x0e93dff2,
  196111. 0x2ef05b4b, 0x0bc9aec1, 0xde1faa12, 0xd467fa92, 0x66dae2c2,
  196112. 0x5eb33e34, 0x758daf64, 0x8f0103cb, 0xa67ad9f6, 0x9be02430,
  196113. 0x151f693a, 0xeb4054bc, 0xd5698496, 0x7019336e, 0x8ef1677e,
  196114. 0x7fdeea3e, 0x021cfd16 },
  196115. { 0xdf5c36f3, 0x5c73715f, 0xd64ad254, 0x703bde37, 0xf2cf7713,
  196116. 0x55368d10, 0x0f3993c8, 0x1e5ec7b7, 0x304ae4ca, 0xfdb16776,
  196117. 0x3d3bb18b, 0x0d8f717e, 0x66343d5a, 0x5267073f, 0x156008b5,
  196118. 0xfaeb52ef, 0x224a470f, 0xb97ad5f9, 0xed2ab51a, 0xaf86e391,
  196119. 0x9974302c, 0xdc0c7e57, 0xfd0ae28a, 0xc88fa817, 0xbf8ed59c,
  196120. 0x807c22df, 0xeb128bb6, 0x5dedc231, 0xa20595a3, 0x71edcd9c,
  196121. 0xc73cf78e, 0x07265b46 },
  196122. { 0xbd66232f, 0x73dd99f0, 0xc4027716, 0xc59aaf89, 0x5b860fc4,
  196123. 0xaf826dfa, 0x7a943f3b, 0x239ea8aa, 0x523c428d, 0x0e0e1b1a,
  196124. 0x6973b95a, 0x55ea0e3a, 0x2557753b, 0xea399caa, 0x06957b1f,
  196125. 0xf8adf72f, 0x3bd34302, 0x0389f341, 0xf8a43a97, 0x333f27d0,
  196126. 0xadaf796f, 0xcd9c0c08, 0x49c12aa2, 0x6dcca49b, 0x7a0ac6e9,
  196127. 0xdd88deee, 0x0644080e, 0x8f47575d, 0x0cc2f4bd, 0x6e9d667d,
  196128. 0x31d1496c, 0x36c5754b },
  196129. { 0xf323d84b, 0x9120046e, 0x7e789c4f, 0xa6991122, 0x921b8055,
  196130. 0x4b0eaf4e, 0x8079974e, 0x6339844a, 0x740f8c79, 0xc905466a,
  196131. 0xcd6def49, 0x1c18d0f7, 0x4b23e4ba, 0x5297da6b, 0xc41800c5,
  196132. 0x1c09dff3, 0x37ef6777, 0x6c49075b, 0x50513ded, 0xa94c3a40,
  196133. 0x6b0b1705, 0x3d6742e9, 0xc48af5ae, 0xc0784494, 0xc95822de,
  196134. 0x40c01532, 0xc164d94f, 0xa2ddade5, 0xa2975eb5, 0xfc8a8ac9,
  196135. 0x1946944e, 0x06fbf861 },
  196136. { 0x3f45aa97, 0x2d65338e, 0x1d040feb, 0xd83b58c8, 0x0fdef8b9,
  196137. 0x05fef59b, 0xe4d7417c, 0x7beb071a, 0xb30a1a23, 0x982b61f5,
  196138. 0xfb65bd03, 0x4c5f2a2a, 0x5cbf6bf3, 0xe40abc9d, 0xf06612a5,
  196139. 0x422c326d, 0x9571ae28, 0xc921e69d, 0x23d3434e, 0x7c88b10b,
  196140. 0x9da07933, 0x96d2e957, 0x3619cf4d, 0x833d46a1, 0xd95eefa1,
  196141. 0xd9d19653, 0xa03e8f0e, 0x2a7d8411, 0x04bb5ab1, 0x5e642953,
  196142. 0x1f0fa9ea, 0x5e9ca0fd },
  196143. { 0x197c5dc4, 0x5bd54571, 0xe78a95a2, 0xe2da40bf, 0xffdb0eb2,
  196144. 0x65fb9efc, 0x0d17467c, 0xe952dc2c, 0xc758c6a3, 0xc1fc9c7b,
  196145. 0xd4034a9a, 0xfc79562c, 0x61f64b56, 0x26e36fbe, 0x1e84728b,
  196146. 0x6adc4b9e, 0xa8f9ac8a, 0x7f165fd3, 0x03e3e013, 0x7bc93a45,
  196147. 0x656478e3, 0xeacc5513, 0x064ddc77, 0xd3391717, 0x76936914,
  196148. 0x75b318dc, 0x362424a6, 0x69b1f1c7, 0x49955f34, 0x8cc2045b,
  196149. 0xc6836af8, 0x940622b3 },
  196150. { 0x0d997973, 0x4710ccb7, 0xd3f8f115, 0x3b29625d, 0x5b97abd5,
  196151. 0x8cf0c4d5, 0x673e14a5, 0xc6321e0a, 0x3d262246, 0x0541af9d,
  196152. 0x6fc83b11, 0xde6d8754, 0xf01652a4, 0x47e97da8, 0xad9802b6,
  196153. 0x0f82b3a6, 0xae9c44b2, 0x69aa4075, 0xced2bf77, 0xaf3f5de2,
  196154. 0x497a40da, 0x1ef1ea8a, 0x3c23ba9c, 0x2e0f8608, 0xf190a2c8,
  196155. 0xd8a998a4, 0xcfde3368, 0xe2b49c8c, 0xbde6bd71, 0xb9f49824,
  196156. 0x785bedb6, 0x80bb1664 },
  196157. { 0xfd145cb5, 0x05e575fe, 0xac5e6883, 0x155ee561, 0x8793b273,
  196158. 0x461e70cf, 0x133b2338, 0x9f1553de, 0xa2a7ba07, 0x2fb9e0c3,
  196159. 0x3e7086fa, 0xc3bfd6a8, 0x8bb4cb93, 0xb6ba8500, 0x76f82dbd,
  196160. 0x0b66d789, 0x54eb49ff, 0x7d5a6ff6, 0x1f20b322, 0xcd65d237,
  196161. 0x54e29cdc, 0x79ea49c2, 0xcb118ff9, 0x64975963, 0xcc58000b,
  196162. 0x969598dd, 0x110c779c, 0x95107918, 0x63b85a35, 0xedfc1548,
  196163. 0x41212350, 0x077ba5ea },
  196164. { 0xcdd86f61, 0x0b3a38d3, 0x0502a0ab, 0x43121445, 0x806d0272,
  196165. 0x1912edc5, 0x8a32f10f, 0x01dc1f98, 0x0e80c760, 0xbb1d31d1,
  196166. 0xf464e8b3, 0xd46ec7e5, 0x9abf49ee, 0xd569af36, 0x2cdade77,
  196167. 0x9d286ea7, 0x45ad5920, 0x2be7020d, 0x6299ae7f, 0xabe5236e,
  196168. 0xd3f55c07, 0xc93179bd, 0x52350e80, 0x8138995a, 0xaff07586,
  196169. 0x0901265c, 0xf4739653, 0x5b3c81b2, 0x9bc77d21, 0xbaf7581d,
  196170. 0x4591a2e2, 0x6b2006df },
  196171. { 0x965b1bc1, 0xb2fe50a8, 0x962bb4fd, 0x931f536a, 0x000e7f99,
  196172. 0xd5718d33, 0x53d5125e, 0x84728f25, 0xd2125caf, 0x4f8a6184,
  196173. 0x357f679e, 0x54f1a701, 0x1531c05a, 0x70a9f40c, 0x6fa8b775,
  196174. 0x10d0cb97, 0x9dc12ce9, 0xb476f41e, 0x2755f894, 0x5c8d7a75,
  196175. 0x625741a4, 0xd6c12e10, 0xc917b16c, 0x262a6fb8, 0x38d6b0a0,
  196176. 0x24d116e6, 0x32c38e83, 0x849540c0, 0x66868afc, 0x855b911c,
  196177. 0xbd26b550, 0x53217ea6 },
  196178. { 0x259f52b4, 0xfc840473, 0xe621146c, 0x968da9cb, 0xcacbd26e,
  196179. 0x964eb85e, 0xe4a54344, 0xab7daa2d, 0x381a4ff7, 0x6dc3b848,
  196180. 0x41c815ef, 0xa07a96b3, 0xc3d4b1e1, 0xc4fae9e8, 0x42ce9ea8,
  196181. 0x0f938d1e, 0x35cc052f, 0xa727dacc, 0xe9a06f07, 0xc81e01c9,
  196182. 0x4a6d65a1, 0xa9e08dcb, 0x6044a9a6, 0xf8e2d173, 0xf2bd295b,
  196183. 0x99893dd0, 0xf9781b12, 0xa08d3379, 0x61830ac2, 0x64bd6001,
  196184. 0xd9adbeef, 0x0386931e },
  196185. { 0xd09885a5, 0xd0d7abb3, 0xe355bb07, 0xed9d2b67, 0x536ebaed,
  196186. 0x3bc238cf, 0x699ce4d6, 0x61ca2e78, 0x111594cd, 0x354ff447,
  196187. 0x03316ad2, 0x55cbe709, 0x49fff5c4, 0x418679fd, 0x0f9c6c40,
  196188. 0x75bacd75, 0x2972721a, 0x677edc88, 0xe5ef502f, 0x82596887,
  196189. 0xbf320e0e, 0x459e9367, 0x8bbdccb2, 0x81ce36ef, 0xb766863d,
  196190. 0x1ba097fc, 0xd58c6db8, 0xcd3a21d6, 0xb4a8748b, 0x0e4967cd,
  196191. 0x15041c20, 0x2caaf749 },
  196192. { 0x6ed20424, 0x44f98006, 0x22471545, 0xb3e4ea23, 0x781a8c86,
  196193. 0x268ed1a5, 0x7ae5b70b, 0x48d0ab75, 0x356d3982, 0x6ca8b320,
  196194. 0x2df31fa4, 0x9ce8e681, 0xd925dcf2, 0xb909d232, 0xf56723de,
  196195. 0x302c8f78, 0xabac96f9, 0x11725d69, 0x57d1a170, 0x656a47ca,
  196196. 0xc18a2be7, 0x6bb5d511, 0xad50d9d9, 0xb56e45f1, 0x70b05518,
  196197. 0x36e886e2, 0x09d8ff91, 0xc7c71f3d, 0x9350361e, 0x65a1bbe2,
  196198. 0x45fe3bd8, 0x86d7f532 },
  196199. { 0xb0bf719a, 0x99f16eb6, 0x8bc3d913, 0xb6975098, 0x26cd01b4,
  196200. 0xfae50e52, 0x90898d1c, 0xd3e3ac54, 0x887ec666, 0x4da3b9db,
  196201. 0xfbea45b8, 0x58300644, 0x8355b058, 0x369f3bd9, 0x579bcc13,
  196202. 0x0fb239a8, 0x6e2bd811, 0x4f5b4539, 0x24198fd2, 0x007f3baf,
  196203. 0x8837d51d, 0x68a676db, 0xeae75b16, 0x68eeea62, 0x3db6083c,
  196204. 0x5ffe5f94, 0x7d836c5a, 0x52c94d0f, 0xcbc1ff85, 0x5a4c3c6f,
  196205. 0x86c0b4dd, 0x682a55e3 },
  196206. { 0x587495aa, 0xc8f235a4, 0x34c7245d, 0x2276026c, 0xb75a46e3,
  196207. 0xd6ae0cc5, 0xecc3e5e7, 0x890d3965, 0x14296629, 0x1b13342f,
  196208. 0x8a877227, 0xc89927e6, 0x2324a68b, 0x1543f27e, 0x49cdc21a,
  196209. 0x6c447684, 0x1452d0ac, 0x9bc7fd4f, 0xff4b045c, 0x2cc30a31,
  196210. 0x852f7611, 0x415d46a0, 0xc6fdd7a6, 0xad737052, 0x7b4c7c91,
  196211. 0xdcecc3ab, 0x7688d70c, 0xd2cdf01b, 0xe40d3905, 0x054f2542,
  196212. 0xfefe4dcd, 0x02227fa6 },
  196213. { 0xb751948b, 0x1805efd9, 0xfdfd225d, 0x8efeed46, 0x4f2c8b22,
  196214. 0xcb128e09, 0x96f7c5e5, 0x9d1090bf, 0xb4cbeca0, 0x0959d044,
  196215. 0x8e08cb04, 0x21c955f9, 0x68fa4fce, 0xbc1f279d, 0x0710ae9a,
  196216. 0xb021e14e, 0x881167f4, 0x64d16e9f, 0xbbc9f1a5, 0xf5a5c22e,
  196217. 0xe3420eea, 0x5f3716df, 0xd5c4e843, 0x971eb915, 0x28ffba81,
  196218. 0x64fc55fc, 0x7dd37578, 0x3427e54d, 0x15ebc7d0, 0x446e6a62,
  196219. 0x29269778, 0x547e249a },
  196220. { 0xa1ffda27, 0x4706868a, 0x7955cf50, 0xb4e6cdcc, 0x0a63f3d8,
  196221. 0xf65151e1, 0x9de5e70a, 0x5b4127ea, 0xf9342823, 0x3d2c09ba,
  196222. 0xaa2f7d51, 0x18c99d83, 0xddeec025, 0xa0c5bb1d, 0x03dcf1ce,
  196223. 0x7ffddf84, 0x616fdeda, 0xe57e4d29, 0x7932a1f0, 0xd2456569,
  196224. 0x3191d4e3, 0x7475e0e8, 0xc220218b, 0x3479bea1, 0x8bcb2505,
  196225. 0xfceb5c90, 0x3c6132e6, 0x1c685cea, 0xbfe6c1eb, 0xc42dc745,
  196226. 0xd2b08eea, 0x45a41cc0 },
  196227. { 0x4dbbf0e1, 0x3ea9b2c7, 0xa17cf70e, 0x41ff962f, 0x5eeb4c66,
  196228. 0xdc1ea758, 0xa9beb17e, 0x4f5412d2, 0xa285741a, 0x2c9e4f52,
  196229. 0x984fd11f, 0x93df7da4, 0x0df3184e, 0xb2afbddc, 0x2421e375,
  196230. 0x96323d25, 0x49df781e, 0xc87be1e4, 0x3d589bea, 0x145601ed,
  196231. 0x28fff6dd, 0x0f0bd9bd, 0x8a0f298c, 0x2d3259d4, 0xd88e6944,
  196232. 0x362d7a77, 0xb6ac2af6, 0xa84c06b6, 0xd087da02, 0xba850ac9,
  196233. 0x42ee40c8, 0x128763c9 },
  196234. { 0xacbac178, 0x29a80f07, 0x34b08f6e, 0x7cc20044, 0x70feded2,
  196235. 0xe9631d14, 0x86615767, 0xb2115da3, 0xcb088548, 0x7c75f5c4,
  196236. 0x9a2e8e03, 0x5b29d213, 0x8b881752, 0xfe9fda66, 0xc1de7ebc,
  196237. 0x3f1d8d88, 0x03218123, 0xb476565e, 0xb1c995f3, 0x07365561,
  196238. 0xb13eb71b, 0x2160cb18, 0x99b3a0eb, 0x7e8da513, 0xb20fcd74,
  196239. 0x5e8ca1f9, 0xb4126d72, 0x6a7e0067, 0x68bb637f, 0x1e8204b7,
  196240. 0xfc4f74d2, 0x75e96bcc },
  196241. { 0x0d19716e, 0x189d1fdc, 0x7c384525, 0xdf585058, 0xea987d2a,
  196242. 0x64a846d1, 0x6c07150f, 0x12b6bf83, 0x4d6fd5b7, 0x91d85d46,
  196243. 0x4f53f55f, 0xa9788836, 0x81509129, 0x60083bd8, 0xea876f48,
  196244. 0xa7672683, 0xc15b2489, 0xe80b2e7a, 0x42d1d992, 0x985ef8d2,
  196245. 0xcf3de492, 0x9c57b029, 0xb1487627, 0xfe02f83c, 0x8ae5b687,
  196246. 0xaeba4fe4, 0x5d6b8196, 0x8a86f09b, 0xa16e523d, 0xd88f566b,
  196247. 0xba268949, 0x309a6e9a },
  196248. { 0xbdfbe97a, 0xef27ee50, 0xb8c50c4d, 0x1a5fe70f, 0x7fe09f5c,
  196249. 0xcc7beb01, 0xbed36cc5, 0x8fa15a85, 0x7550ed3a, 0xc0c3acdb,
  196250. 0xeb908681, 0xc581ef87, 0xc49d5ccb, 0xa15b3362, 0x1fa264e8,
  196251. 0x0fbb1714, 0x8e1eee88, 0x267f8d8f, 0x21c2b63d, 0xd31ccfd6,
  196252. 0x53be7efd, 0x924dbe7d, 0xdb2a358a, 0xd42e877f, 0x75d68ac1,
  196253. 0xcf9673c7, 0x714fea55, 0xe35978fd, 0x5769b202, 0xeeb36653,
  196254. 0xd7593789, 0x0458258a },
  196255. { 0xa042dbdf, 0x5df71a74, 0x5779dfa2, 0x2d405857, 0x0d2e6657,
  196256. 0x0e66cba7, 0xca2e892e, 0x285d6745, 0x0f0e6b5f, 0xf56a8def,
  196257. 0xa30767c3, 0xe0ee851d, 0x43346b9c, 0x98c05658, 0xd6b3c742,
  196258. 0xb35fce26, 0x39777e00, 0xc0895bff, 0xe7b6d886, 0x83c8f6a6,
  196259. 0x4f02904b, 0xbee14843, 0x2e84ec34, 0x7f74915b, 0x96d10991,
  196260. 0xbaaf663c, 0xe41facc0, 0x004b8757, 0x6f86c029, 0xa2b880e5,
  196261. 0x95b77358, 0x53f4a3e0 },
  196262. { 0x89fc48e7, 0x11bb08ce, 0xafab5aeb, 0xba60c577, 0xa0c1cb5a,
  196263. 0xf06bcbf8, 0x79757cb6, 0x7d2efaea, 0x76319160, 0xe26d90b1,
  196264. 0x2b77b7a9, 0x42aa1ab6, 0x285df2bf, 0x38eec0cd, 0xf3a8f7f0,
  196265. 0xd35947f5, 0xfc1cb5b5, 0x97c8dc0e, 0xc45845cf, 0xfeb8cca0,
  196266. 0x249e26f2, 0x16e8d989, 0x483ed89a, 0x7c264e6d, 0x51d91073,
  196267. 0x13a3f145, 0x305e99f0, 0x8501562e, 0x6908d563, 0xaaf98d74,
  196268. 0xd723d236, 0x0a99e653 },
  196269. { 0xabbc0559, 0x23536f46, 0x9aa1a160, 0xc163067b, 0x0c1681b5,
  196270. 0x229fd229, 0x1378e907, 0x61254be1, 0xab793a2d, 0xc60ff57a,
  196271. 0x466552db, 0xa6f2df8b, 0x8c170a36, 0x9ad31893, 0x29b74d9a,
  196272. 0xc5cd9abe, 0xf7848523, 0xcf747273, 0x0d0e3063, 0xc126a93a,
  196273. 0x4248e3d8, 0xfe2021e3, 0x8323ddfa, 0xd97343ee, 0x332639e7,
  196274. 0x9f768775, 0x75325548, 0x9650fc31, 0x3eebf7ea, 0xb595dbd1,
  196275. 0x010fcbc0, 0x3a95cb45 },
  196276. { 0x39d7ff2e, 0x954e68cb, 0xc1d5c48f, 0x8dd1cb4b, 0x7169438a,
  196277. 0x02a92c77, 0x91cad8ce, 0x7965c0b0, 0x32cd08d2, 0x0c5798ab,
  196278. 0xa6902bda, 0x1a5bc3c3, 0x5186d218, 0x545d0925, 0xd27e64db,
  196279. 0xf0077cdb, 0x8cd092da, 0x0157caa4, 0x24532ab3, 0x2a2fa3a0,
  196280. 0x41ccaba3, 0xa5fb639b, 0x4744aee6, 0x01702dc1, 0xcdba93da,
  196281. 0x485bb436, 0x329784f1, 0x93597f66, 0xdad672c3, 0x5d713c1d,
  196282. 0x030b7245, 0x366d222e },
  196283. { 0x573ea5b2, 0xd50b4875, 0xa90da44d, 0x0fce401b, 0x7a1a0310,
  196284. 0x7b53fa65, 0xcf114460, 0x722a80a5, 0xa538bf49, 0x0b8ebf05,
  196285. 0xd32acd21, 0xae141147, 0x7b5ad07d, 0x6692712c, 0x3f48ca07,
  196286. 0x6dc5fee7, 0x2b8a78d8, 0x98ed1499, 0xdd2f1759, 0x4e8b3145,
  196287. 0x5f971b8e, 0x43408de1, 0xadf1b368, 0x055ea6dd, 0xe5932b7e,
  196288. 0x4bb76e73, 0xd30893fd, 0x44287153, 0x0661bfda, 0x173dccd2,
  196289. 0x79defd25, 0x9072ba99 },
  196290. { 0x9620ea39, 0x474de4dd, 0xc831cee8, 0xfbf1649f, 0xcd3a9c43,
  196291. 0x0b0e8bb1, 0x3f3df1d5, 0x6a38286f, 0x8f0ec9b3, 0x4ed072b3,
  196292. 0x729c09e3, 0xa6e4c987, 0x8ad12242, 0xea3e8ac6, 0xfbdfa5ba,
  196293. 0x6ae0e22b, 0xb0a0f592, 0x56171ecf, 0x6b871f8d, 0x33b2886d,
  196294. 0x35e11bda, 0x6b19bea9, 0x7f0f153f, 0x4d815a40, 0x7d6c02ee,
  196295. 0x7e608d97, 0xb6a88f46, 0x7e8f23d9, 0x439d1654, 0x26ac9652,
  196296. 0x35546c29, 0x8d92c6bd },
  196297. { 0xabeb0ff7, 0xb3e0d7ce, 0x3e0e42f8, 0xfbe35254, 0xde808499,
  196298. 0x57d1b226, 0x1cd44bc3, 0x9ece2e1f, 0x435cfee1, 0x1245adbc,
  196299. 0xf93f581c, 0x874ee840, 0xbda0b947, 0x916a779c, 0xfa57ae0a,
  196300. 0xabcc815a, 0xf0a621b0, 0x97adec2d, 0x81f90bdc, 0xbe6a502b,
  196301. 0x53bde63d, 0x54bf9de1, 0x78884c25, 0xa88fdabf, 0xcbbb5470,
  196302. 0x30aa52b1, 0x29053ef5, 0xf805396c, 0x8dd827ea, 0x8d43d898,
  196303. 0x5c1ae5c0, 0x4e4bec17 },
  196304. { 0xfcc09676, 0xbf8483a2, 0x19ea9a94, 0x457c4a3f, 0xd702a5dd,
  196305. 0xa6852ef3, 0x843fe7d8, 0xe7915fd2, 0x16e35158, 0x644bba98,
  196306. 0x9ed746f0, 0x8d1b95d0, 0xb90af0b5, 0x47704581, 0xd4fd135e,
  196307. 0x0bd4bc6b, 0xb4e833a5, 0xa6dce067, 0xff56a9a1, 0x2c0e8f30,
  196308. 0xec2c63fe, 0xa9c80800, 0x98f508a8, 0x449c20a5, 0x3292813a,
  196309. 0x02b94cb3, 0xec7e81a2, 0x647e3d28, 0xb4877677, 0x72e67d1a,
  196310. 0x6f9ded24, 0x7a4aa3f5 },
  196311. { 0xe27a0045, 0x559ef1ba, 0xb242cb50, 0xdc812d4f, 0x39cf8d24,
  196312. 0x23a478e4, 0x9b3f9c54, 0x97544fc5, 0xaffa1fcf, 0x5ac68132,
  196313. 0x34a2c83b, 0x74f8fee0, 0xcd3f4bb7, 0x96cc640f, 0xb0512ea6,
  196314. 0x775dce9d, 0xcdce381e, 0x67dca19d, 0xa9d3fe55, 0xc1eeb3f3,
  196315. 0x1a19274f, 0x38e0bf42, 0x28d69b12, 0x15992fb4, 0x9fd09df8,
  196316. 0x48fcebde, 0xb41ab5df, 0xdc9dfa4f, 0xc0a269c5, 0x0cbd7dc8,
  196317. 0xf7f0ade1, 0x60282a7b },
  196318. { 0xdceea2e7, 0x7c07e538, 0x3c42061d, 0x38a322c8, 0x4f1f6516,
  196319. 0x676828f9, 0xc7776a10, 0xf21b69fb, 0xb5e6b405, 0xc63a3417,
  196320. 0x91a7b642, 0x4c99f258, 0x2cad1440, 0x38692ca8, 0x00869bcd,
  196321. 0xf1e82ffe, 0x16fe466a, 0xc30b714e, 0x19019138, 0x5fb742f9,
  196322. 0x0fa516ae, 0xe90166d0, 0xd8c73a43, 0x5550f7ac, 0xfbc5c372,
  196323. 0x2d6a407d, 0x68cc39ed, 0xe47a7539, 0x4a5fbe70, 0x3fd286d9,
  196324. 0x23c6b942, 0x5f4ae9c7 },
  196325. { 0x53f4d561, 0xd96a2dda, 0x16da1992, 0x286d45d0, 0xfdd4b051,
  196326. 0x449a01fb, 0x9f2195ea, 0x25488a0d, 0xa37661b3, 0xc4151b0a,
  196327. 0xf9e5ee02, 0xb98c471e, 0xa8658817, 0xa4bca86e, 0x7a68fc0a,
  196328. 0xbbcadb87, 0x6b7366a9, 0x88b34649, 0x15661c2d, 0x32ee98d4,
  196329. 0xc901420c, 0xf5b3b4c6, 0x2f2752af, 0xa2352735, 0x510e4d9c,
  196330. 0x2f64ce73, 0xaca4aa80, 0x939a7f26, 0x401aa503, 0x9cd3e291,
  196331. 0xdc46afd2, 0x92a01423 },
  196332. { 0x1c2f7dbd, 0xe9f24be1, 0xb7d527fa, 0xda8c900f, 0x8648f128,
  196333. 0x963e25bb, 0x48141941, 0x9ab713e2, 0x7a6756fb, 0xe87f7d01,
  196334. 0x058d90bd, 0x274dd85e, 0x82566abd, 0x823fee7a, 0x74240195,
  196335. 0x9f6230d7, 0xacb5e46e, 0x04579f2c, 0x16a4c87e, 0x2a226263,
  196336. 0xd99b0857, 0x9ca19a43, 0xe488789e, 0x86dc2ba3, 0x9406c3bd,
  196337. 0xf960b5b9, 0x8960957e, 0x6f2c428b, 0x161c515b, 0x90748706,
  196338. 0xaa88cb9b, 0x0fc8fe1e },
  196339. { 0xfeb90f2d, 0x68ae1bed, 0xa48b1559, 0xf393bb3c, 0xf64e9635,
  196340. 0x2be62f9c, 0xf8be75c2, 0x354c2410, 0x5e6f7529, 0xbd7ea703,
  196341. 0x162cab31, 0xc264868e, 0xc860f3ff, 0xb1391e70, 0x1d89837e,
  196342. 0xdf367c75, 0x2bf32941, 0xe150b6b4, 0x78c1318f, 0x95e8f46e,
  196343. 0xa2c4b160, 0x2b3f1dab, 0x701afbf3, 0xc6ccf5ce, 0x5e8874c5,
  196344. 0x3ad27530, 0x5dc6dcbe, 0x39285e51, 0xd99892dd, 0x3c954d86,
  196345. 0xdfd3789f, 0x2d0ba862 },
  196346. { 0xb472e1af, 0xeacd8ee8, 0xb76abbcc, 0xeb354eae, 0xd0d93fbd,
  196347. 0x9b520bf8, 0xfe6fc706, 0xfccd60d7, 0xa4ee2f39, 0xa9353dde,
  196348. 0x9a81e51e, 0x5eb0925e, 0xd1366777, 0xee334da1, 0xd5354d69,
  196349. 0xc1d28c9f, 0x92a5ed54, 0xb9771755, 0xb7f70d81, 0x5d3e367f,
  196350. 0xa933ae7a, 0x7be7eeca, 0xe23cfbb7, 0x264cf1f9, 0x89497681,
  196351. 0x0d129f4a, 0x09b6235b, 0x705375a4, 0x48a376da, 0xccf64c75,
  196352. 0x4d41dbfc, 0x963c8712 },
  196353. { 0xde36a814, 0xbae290cb, 0x733b12b5, 0x9bdb0195, 0xf77fe0e1,
  196354. 0x0ebad867, 0x29720cea, 0x0a7d19fd, 0x9029ec72, 0x434d7651,
  196355. 0xbb51911e, 0x856aff17, 0xd80a7f60, 0xd0a25d9a, 0xf848c106,
  196356. 0xffca86af, 0x43ad749c, 0x53e8bdf9, 0xe3e696bb, 0xfb9e0284,
  196357. 0xeeee4215, 0x3eb6630a, 0x2ecf3c63, 0x9d8fbb9e, 0x4e00c0c0,
  196358. 0x71da4ffa, 0x5d57beac, 0xb296be59, 0xa8cec7ef, 0x1751fbad,
  196359. 0xff55d7bd, 0x2d03eb3c },
  196360. { 0x04f2ec1d, 0xeb16925f, 0x0d147ee2, 0xa878f276, 0xaad9d9e0,
  196361. 0x442df604, 0x3f71035b, 0x891df44b, 0x8cb95d5b, 0xc28272b3,
  196362. 0x5ee8ed23, 0x6f14efb5, 0x13b0f3e3, 0xf3c4460f, 0x6bd7335e,
  196363. 0x889f9bd7, 0xf755ba6e, 0x889ee771, 0xed219b6c, 0x626984fe,
  196364. 0xec2ee411, 0x2d44c737, 0x63efcd37, 0xb94385a2, 0x6637826b,
  196365. 0xd909321b, 0x3ee6b7a7, 0xc24f8a79, 0xa7cf61b7, 0xa3ca8d24,
  196366. 0xc54bacd9, 0x842e40c1 },
  196367. { 0xa661d843, 0x5a268ed6, 0x4f5b30cd, 0x02328cca, 0x1311e177,
  196368. 0x16e6fed1, 0xc6695967, 0x690decb4, 0x57b2e280, 0xbdac5bf6,
  196369. 0x1efe42d0, 0x827f82ca, 0xca5fca2f, 0xc554ec0a, 0xdde45506,
  196370. 0xac5276c1, 0xe3077513, 0xb7f4cb08, 0xcc8797cc, 0x8caf6d9a,
  196371. 0x0d9332d2, 0xd5964814, 0x285a409f, 0xcc6ae297, 0x6223d093,
  196372. 0x7773c2a5, 0x5128fc09, 0x2d5266ac, 0xbc31fe6c, 0xa596b7cb,
  196373. 0xcac91328, 0x0e63319a },
  196374. { 0xf0360ac2, 0xb5cd2fad, 0x285e605a, 0x86b660de, 0xe25b9b14,
  196375. 0x82c6cf10, 0xaa9ac554, 0x9d5fa38d, 0x526c070e, 0x3dfcf1b8,
  196376. 0x3fccc52d, 0x0379a96b, 0x0bfcc7f5, 0xe3659c29, 0x69d3e6a1,
  196377. 0x5b1a3db5, 0x9b7b42d5, 0xb41528b5, 0x9c22a006, 0x934defa4,
  196378. 0x9b4ce3b6, 0x90f38018, 0xb3abaf32, 0xb073bc04, 0xff8389e2,
  196379. 0x27a5a222, 0xffa5a35b, 0x0b7a9d51, 0x28e1a7c2, 0x4939ecef,
  196380. 0x1872705a, 0x88839da2 },
  196381. { 0x701ce29a, 0x56b66c30, 0x58981d50, 0x3acaf126, 0x105f9f21,
  196382. 0xd4dafc0c, 0x373e3d13, 0xfee571e6, 0xfa2ee3ca, 0xe7269c86,
  196383. 0xdd20385a, 0xf5cca64a, 0x3000e9ac, 0x217f2757, 0x0e7273ef,
  196384. 0xc934db47, 0x355b6776, 0x4294f4f7, 0x6fc05180, 0x1faa36b9,
  196385. 0xb052190b, 0x8f88b1db, 0xe9eaef52, 0x35791b90, 0xdb681b90,
  196386. 0xf37fb2eb, 0x4415c369, 0x39d0a51d, 0x1d2e21c9, 0xfc59cca7,
  196387. 0xa1f50c26, 0x64128cfe },
  196388. { 0xe8f5b0b5, 0xf03678a2, 0xd340f059, 0x5c7e249c, 0x93ca7cec,
  196389. 0x41440441, 0xbc83af98, 0x075ca346, 0xfaa8bbb0, 0xf39f0033,
  196390. 0xf38230f7, 0x3d18f0ed, 0xd448f345, 0x78dff00c, 0xd51aa475,
  196391. 0x849228c0, 0x30c928d1, 0xdd4e2708, 0x8f12cfd3, 0xc66ba686,
  196392. 0x88b3a206, 0x091049db, 0x016dae01, 0xd865d059, 0xe253e37d,
  196393. 0x4599e905, 0x7ce9871b, 0x322cf0c2, 0x174a132e, 0x014f54da,
  196394. 0xbdabcbda, 0x93634a09 },
  196395. { 0xa9a2e304, 0x62826b27, 0xc1a4c124, 0xc57e1866, 0x22381710,
  196396. 0x913ab832, 0xa9847cfe, 0x7e9b6b85, 0x2b5f46fd, 0x29655cf1,
  196397. 0x8038e66d, 0x7295572b, 0x6fa95eab, 0xe4cba601, 0xb9deda81,
  196398. 0xbbc11071, 0x3f1cf61e, 0x97f0009a, 0x373e0cfb, 0x5372777b,
  196399. 0xd139d63b, 0x302f909c, 0x4f87d78e, 0x1ed672da, 0xb4048763,
  196400. 0x362077a3, 0x9dcc22b2, 0xc408c32d, 0x26deeee7, 0x4b4c5bf2,
  196401. 0xbc06357e, 0x266cb467 },
  196402. { 0xb56363e8, 0x6faa4154, 0x3c1aa4db, 0x4b4fd078, 0x2b9e6597,
  196403. 0x14358dde, 0xfa004b84, 0x5b34ae3e, 0xf19911a6, 0xcf44b2ec,
  196404. 0xa536bf78, 0x55caa833, 0x8870dc95, 0x606e1eb9, 0x09f3511d,
  196405. 0xe3c3287d, 0x9d5cf364, 0x68b2f4eb, 0x63ab8c9e, 0xc154e892,
  196406. 0xc36ab611, 0x1548828e, 0xa1b7d120, 0x0932bfcb, 0x5315b8d7,
  196407. 0x7ee7b5bc, 0xf7473ac1, 0x782fd0d1, 0x3c8f2af3, 0xbcb029a8,
  196408. 0x52454ee1, 0x4b1d5a1b },
  196409. { 0x63d52c0c, 0x12fe5174, 0x188c099d, 0x3735525e, 0x360e3956,
  196410. 0x5c621563, 0xacfa5a43, 0x88b3f1ca, 0x797e8107, 0x90123a0a,
  196411. 0xb15e080a, 0xba31f6b5, 0xfca3dada, 0xd7de5e12, 0x0df511c8,
  196412. 0x3287361b, 0x65757d4e, 0x7cc800d4, 0x5207ec91, 0x10810f3d,
  196413. 0x30eea0e3, 0x0d4e56f1, 0x3ea5a2ec, 0xbbf7ee13, 0xbe6abbd0,
  196414. 0x6fc07762, 0x120bf619, 0xc831fdce, 0xb622d42a, 0xe07439fa,
  196415. 0x508e4b27, 0x8186b93f },
  196416. { 0x09312867, 0xc619d154, 0xbfaf7db4, 0x7e042c05, 0x1f5f5dda,
  196417. 0xc1cf1668, 0xa4fc3d82, 0x50aa5057, 0xce68b8fe, 0xed30ed65,
  196418. 0xbeb4d644, 0xecb01c0b, 0x831c0497, 0x7b5dc444, 0x9b7d9b1c,
  196419. 0x351e6a00, 0xd9477c91, 0x4bb863b9, 0x05d4110a, 0xaba65891,
  196420. 0x43580b7a, 0x30086cf4, 0x90be357e, 0xb139c076, 0x27b5214e,
  196421. 0x12bfff1a, 0x22c3ab57, 0x79cfc6d7, 0xf34a9bfa, 0x4743de57,
  196422. 0xc9ee2b2a, 0x0bf97e97 },
  196423. { 0xdda19e96, 0x96ec4ec8, 0x6c306e8b, 0x54ce18ea, 0x65f6918a,
  196424. 0x7e83612b, 0x0d9a0d99, 0x1ac6f68b, 0x62fdcc09, 0x98a697a4,
  196425. 0x95bc3e13, 0x65ce25f1, 0xb3939730, 0x1896ecda, 0x32f12806,
  196426. 0x9eb81a0f, 0x1d2dc7df, 0xd3d7416e, 0xad473599, 0xe22c7976,
  196427. 0x9f5ef439, 0x3de37a9a, 0x9e69d94e, 0x6b7ac0ab, 0x0a9d0bc8,
  196428. 0xe6bfa9e0, 0x5676f120, 0x576a870d, 0xfeaac23f, 0x3bd91bb4,
  196429. 0x3e40aabb, 0x8fe5482c },
  196430. { 0xce9a4d1e, 0x85ae67c2, 0x4f1d2038, 0x4c3eb803, 0x25d06192,
  196431. 0x5c6c8f3a, 0x308fb41c, 0x803de0ad, 0xe71c294e, 0x9961f5bc,
  196432. 0xf02eb0da, 0xdc62078d, 0xb64ae8b6, 0xc87ef515, 0x50b4d18f,
  196433. 0x69679f1e, 0x52199f43, 0xc5c009a1, 0x0f640a5f, 0xa7d484be,
  196434. 0x23dab566, 0x4c918bb1, 0x64275d2c, 0xa67c114c, 0xcad2ded6,
  196435. 0x95a913b9, 0x6b4b5c8d, 0x189ed18b, 0xb42d3bf6, 0x4aeb6206,
  196436. 0xbbc8bc3f, 0x3928c669 },
  196437. { 0xdacb4b64, 0xde4bea4a, 0xf26179a1, 0x03f62a44, 0x7a9112a4,
  196438. 0xf3aac94e, 0xd36f331e, 0x90448fbd, 0x407b85c4, 0x426042bc,
  196439. 0x2121b77b, 0x5ad8a596, 0x67cee984, 0x31674a4f, 0x4e3b2f0d,
  196440. 0x7fae8bbe, 0xa7c930eb, 0x681df6dd, 0xc259d0d4, 0xadeefa98,
  196441. 0xbea1c1fd, 0x1b14d9e6, 0x21d405d1, 0x3baadc8b, 0x73892754,
  196442. 0xf01dff93, 0xf071cde4, 0x81c35b3e, 0x9150d0d9, 0x1704d2e1,
  196443. 0x355134f6, 0x6ccc888f },
  196444. { 0x7ad7504c, 0xf8d36f0e, 0xf7959ddd, 0xbca3265f, 0xfede67aa,
  196445. 0x0dcd1ede, 0xbaebf32f, 0x1276f4ce, 0x014edcfc, 0x6825a6e6,
  196446. 0x99ad8eb7, 0x0b8c1a82, 0x09b8ce1e, 0x312024a9, 0x9cbd351a,
  196447. 0xcb8fd98b, 0xfab1e8be, 0xa4841378, 0x3973cacf, 0x17ed0f5d,
  196448. 0x259d5254, 0xa17e1484, 0x74b91393, 0x53d5b843, 0x1aca3ce9,
  196449. 0x8f792b21, 0xc8c0f815, 0x035ff110, 0xad4ed7bd, 0x6afa6357,
  196450. 0xb26faef9, 0x2f151980 },
  196451. { 0x29d2d439, 0x0c8631da, 0xbc039955, 0x121fbbc2, 0x6c05b75b,
  196452. 0x3e5a9792, 0xb6ce47ec, 0x6d6cf4c0, 0x9d88c658, 0xbaaa1767,
  196453. 0xf3355a17, 0x031db9e7, 0x0aef5a85, 0x8381e3d8, 0x15a31bdf,
  196454. 0xc71db290, 0x9498fd7d, 0x638f6b74, 0x13beeef6, 0x44edf3f9,
  196455. 0xf4ab67b3, 0xe6173271, 0xfd22df11, 0x3a202c70, 0x205c4e92,
  196456. 0xf7be0389, 0xa8eb9920, 0x1c219085, 0xbeb54aaa, 0x6c805ce8,
  196457. 0x0ac58d65, 0x354b05b7 },
  196458. { 0x7a9170e9, 0x7171e236, 0x4cad50cd, 0x01eec42d, 0x3cddccfb,
  196459. 0xffbe824f, 0xa66cae1a, 0xa73e8ce3, 0x965c7d01, 0xb7138a7f,
  196460. 0x5c3d971e, 0x00058e3f, 0x2ff0a72b, 0x52591ac3, 0xbbbce76f,
  196461. 0xa32fb5bc, 0xa9f81a18, 0xf3241ab8, 0xeca68630, 0xf31d3332,
  196462. 0x4482f13b, 0x847af9fc, 0xa4681be2, 0x6196e217, 0xe55efcf9,
  196463. 0x9938f932, 0x70acc705, 0x3e7dacb8, 0xcf09fac2, 0xd41be893,
  196464. 0xae3523a1, 0x48dc55c4 },
  196465. { 0xa5092193, 0x8e623826, 0x6898970c, 0xe46ec362, 0x25c9eb41,
  196466. 0x2f1356af, 0x83c7d245, 0x41780640, 0x97d00e38, 0x982def67,
  196467. 0xa512151c, 0x382eb6e7, 0x8af58869, 0x154e1077, 0x8a51cf02,
  196468. 0x18707075, 0x71313c58, 0xcdeba9f7, 0xba155904, 0x5d67b973,
  196469. 0x1d0d7b3a, 0x851c9f4b, 0x8b8af2cd, 0x19f29d71, 0x986b8d62,
  196470. 0xcb94ccff, 0xb93b9c33, 0x8725e24b, 0x66e38c68, 0x405ce4c5,
  196471. 0x0b6dc021, 0x5f6a8edd },
  196472. { 0x8f9a8690, 0x83704ca5, 0x2f76a407, 0x3f369766, 0x69201028,
  196473. 0xfbc12d8c, 0xbce3a4cf, 0x4cd58f16, 0x04aab26d, 0x7804664a,
  196474. 0x4ea457a8, 0x005cfbba, 0xb8a59794, 0x537951b3, 0x4fe1f739,
  196475. 0x4ca2b9e4, 0xdf325797, 0xe4428acd, 0x0ea243db, 0x648da342,
  196476. 0xf43ce01e, 0xcce6562b, 0xf27db490, 0x840f0421, 0x8bfb7cf0,
  196477. 0x156ccb70, 0x5a8797d3, 0x9b33480d, 0x9eb814bb, 0x2e12e07a,
  196478. 0xca7f87ac, 0x1ca65072 },
  196479. { 0x2b9d25a0, 0xfbb321cf, 0x40a746db, 0x66affdca, 0x59e368b5,
  196480. 0xc1c1530e, 0x7d80068f, 0x56ed1ea4, 0x5647dd68, 0x9b74d8fe,
  196481. 0x89b78da8, 0x1d96b507, 0x8bbe3391, 0x39b75243, 0x0d858c5f,
  196482. 0xef8d443e, 0x9646aa34, 0x4dd2db49, 0xe667543c, 0x7fad3bd1,
  196483. 0x68980985, 0xd0d710c0, 0x49facaba, 0x9f7aff32, 0x14f9a192,
  196484. 0x055dec1c, 0x1fb307a1, 0xaca66399, 0x35ffff64, 0xac44fd91,
  196485. 0xcbad3cee, 0x462cafb6 },
  196486. { 0xde3237dd, 0x1660a647, 0x82b87404, 0x95f735cc, 0xddfa55f8,
  196487. 0xf7879f59, 0x726b914a, 0x15ef043e, 0x1c93e298, 0x1875393d,
  196488. 0x6ef18331, 0xa1a2be74, 0x25a9a12b, 0x4e7e8dfc, 0xa9c3917f,
  196489. 0xdfefc97d, 0x0a2ebe41, 0xbc875d03, 0xa732d1cc, 0x0f75d235,
  196490. 0xd9baa6d3, 0x06fee7fe, 0x65f48576, 0xaa784fab, 0x513f83c0,
  196491. 0x23155e22, 0x3e8f9d13, 0xd2fb7718, 0xb546eafd, 0x2a291503,
  196492. 0x6cd93608, 0x1293c98c },
  196493. { 0x49d53b77, 0x72781251, 0x96eafac7, 0xa6ab403d, 0x4a36b711,
  196494. 0xb7d7c7db, 0x87e771c1, 0x8238c708, 0x33b37522, 0x495f6abf,
  196495. 0x8c87530d, 0xb0b0289c, 0xe77b111a, 0xca83cb86, 0xa1bd189e,
  196496. 0xbe1c0fb8, 0x1ae9d7c7, 0x58cfb2fb, 0x4940c3e8, 0xd05c23c5,
  196497. 0x74ad9107, 0x16e79e41, 0x064e7142, 0xa0a47f05, 0xfdfd614f,
  196498. 0xc6929cd4, 0x3946988b, 0xedb2584c, 0xe46f8fb1, 0x73e4b5f3,
  196499. 0x68ea94ba, 0x53b79aa1 },
  196500. { 0x44bbb6a1, 0x216fafce, 0x67821728, 0xd3a5bba0, 0xa9dd939a,
  196501. 0xef1e4b30, 0xf19efafe, 0x022eaf3d, 0x7b4ec014, 0xfed5abce,
  196502. 0x512c6738, 0x64968ee6, 0x29fe89a2, 0x23119869, 0x47397c05,
  196503. 0x0d539d8d, 0x234596c4, 0x6400bc54, 0x5346611d, 0xb9287f58,
  196504. 0xc9d5da0f, 0x04099903, 0xc83af2a8, 0xe5ef4997, 0x328151e1,
  196505. 0xc89dc01b, 0x58401104, 0x150fb4a9, 0xf3872c9d, 0x40a6f7d5,
  196506. 0x56c2e833, 0x8290d6d1 },
  196507. { 0xd8546946, 0xf84637c6, 0x69ec57fa, 0xda134a39, 0xd789007e,
  196508. 0xd42359a4, 0x0dc7b809, 0xb42557fe, 0x2d6784a9, 0xe62ae52d,
  196509. 0x0bcadb5f, 0xa2714ca6, 0x33aafca5, 0xcc208de6, 0xed967811,
  196510. 0x2380ed5c, 0xdb321660, 0x6e6b55e9, 0xa675235a, 0x1bead02c,
  196511. 0xb33fa0e1, 0x51cc6ef9, 0xf06a2a08, 0xfd223e26, 0xec47b3cf,
  196512. 0x00f332e1, 0xa0aa984e, 0x459f297b, 0xee952e14, 0x6fa1d969,
  196513. 0x304fabb0, 0x506ef1ab },
  196514. { 0x35bff163, 0x11b4eb27, 0xea9fa984, 0x7130b96f, 0x9deb27ce,
  196515. 0x66aceb3f, 0x9dd1c3d5, 0xa2daf1a5, 0xa73075aa, 0xf5090a7e,
  196516. 0xe3071b58, 0x36a6af39, 0xdf73ad9c, 0xa28d633d, 0xbdc89a16,
  196517. 0xdd354cac, 0xd4dcbc3c, 0xdfea3423, 0x379d92d1, 0x6eec74d2,
  196518. 0x8eed6765, 0xe14a456f, 0xfa8feb1f, 0xfabe7743, 0xb98fcbc7,
  196519. 0x1404ccf8, 0xf71a706e, 0x6ccd2fbf, 0x4d85c678, 0xdaaf3fdb,
  196520. 0x15200344, 0x415b7dbf },
  196521. { 0x7d8377a7, 0x97010586, 0xcb803272, 0x068a3d68, 0xf03a4c32,
  196522. 0xfd67d289, 0x93c8f290, 0x4bc7095d, 0xe9e5a2b8, 0x712fa13c,
  196523. 0x0feb9f3b, 0xfc6ac6c6, 0x6e0e54c2, 0x0cda36d9, 0x86320a01,
  196524. 0x45499751, 0x97f00f11, 0xf9318c91, 0xe6936508, 0x01dc4c3f,
  196525. 0x85f068aa, 0x769a2ef9, 0xa2b5511c, 0x3522cef0, 0xb4122e05,
  196526. 0x006965ed, 0xc175d43f, 0xfce0fafc, 0xec831d59, 0x525dc9bd,
  196527. 0xaf58879d, 0x1ec314f1 },
  196528. { 0x2c8310c2, 0x0663feef, 0x457e3f74, 0xaa7e14da, 0xe5346887,
  196529. 0x392b10fc, 0x637ec2c5, 0xcde4a38f, 0xb542f8df, 0x50773320,
  196530. 0xf7de1711, 0x341302f9, 0xae4b9bc6, 0x018b1c63, 0xdd2f9e6f,
  196531. 0xf001c46e, 0x26eccfa0, 0xd3bb0a97, 0x7746e0c7, 0xa931b99d,
  196532. 0xf5875aec, 0xe0c8b6f7, 0x96939c82, 0xbb32f17c, 0x3de5a664,
  196533. 0x765135d2, 0x52abfa6b, 0x71936cb4, 0x2dc105de, 0xad5cc08f,
  196534. 0x7fff5788, 0x17e91d12 },
  196535. { 0xb7e051ca, 0xbe92ced3, 0x19c776d4, 0xc644d4fd, 0x0086784b,
  196536. 0xc8ab4b52, 0xce9d6b31, 0x3ea66227, 0xd289e9c7, 0x395249a3,
  196537. 0xd12a19ee, 0x54509e65, 0x8c365aec, 0xa7bd4692, 0x77963e0e,
  196538. 0x354997e4, 0xb599732d, 0x0d765957, 0x91d4a3b6, 0x99584aeb,
  196539. 0x1deb3e28, 0x6e653ea4, 0x572571df, 0xca7c98ed, 0xb18ae1f9,
  196540. 0xf301a38f, 0x63f7b97e, 0x1629f7c2, 0xafc4a0d5, 0xdf242282,
  196541. 0x3ddd0c01, 0x118f3b4b },
  196542. { 0x7ad4762b, 0x74a0a0a8, 0x8c58d175, 0x1aef84da, 0x4cf76d86,
  196543. 0x16ff4960, 0x7e60d98b, 0xc0be8786, 0x3ecc1dba, 0x83637ffb,
  196544. 0x5dd6147a, 0xc244a609, 0x5b0846e5, 0xa3e17834, 0xe77a4c05,
  196545. 0x735eb686, 0xdf758695, 0x5bc18b4f, 0x1bdfe52f, 0x15618d0b,
  196546. 0x00715ba1, 0x878ecc0d, 0xc2dd617f, 0x1dbdbd1a, 0x21b61710,
  196547. 0x21d2b631, 0x44f593c2, 0x22ce8a79, 0x44f17024, 0x3b9b536a,
  196548. 0x8d03e727, 0x01d0a67c },
  196549. { 0x1e46533c, 0x7b964236, 0xfb88c2ae, 0xe9477990, 0xa42c4a18,
  196550. 0x019b5d16, 0xd83c7a45, 0x7135e81d, 0x4cb663e3, 0x74a69bdd,
  196551. 0xe76c0d63, 0x7b67ecdb, 0x11e68da6, 0x03d54521, 0xd2e8650a,
  196552. 0x596cceb5, 0x2af03b37, 0xcd572dfd, 0xfabd5952, 0x52364ba1,
  196553. 0xb4ed8569, 0x7f47d456, 0xc950d5d4, 0x5ad8b572, 0x486e2f84,
  196554. 0xcadd2dfa, 0xc56bb044, 0xdd527b43, 0x997c08e6, 0xc9adba24,
  196555. 0x7da6320f, 0x1b625b06 },
  196556. { 0x4fd8446d, 0x44dfaa7b, 0xaf6febeb, 0xc01b2f01, 0xfe8838b5,
  196557. 0xbf444388, 0xbba9758b, 0xf33c434f, 0x87156bc9, 0x2b971cba,
  196558. 0x1f49098b, 0x6b245e5c, 0x2b41c5dd, 0x87dcb534, 0x34d852d7,
  196559. 0xdb1f80c6, 0x2433da34, 0x6d6e3258, 0x3f7df0c2, 0xf6682065,
  196560. 0x360cb365, 0xc4ca567c, 0x9826656a, 0x321faac2, 0xbf069768,
  196561. 0x13f5ca6f, 0xa7076639, 0x15397921, 0x8400736e, 0xbdf14328,
  196562. 0x19fc948d, 0x333eca96 },
  196563. { 0xac775d81, 0x23337948, 0xd41dbbca, 0x38c2518f, 0xbcfce948,
  196564. 0x623c7a4f, 0x54703fe7, 0xaad36236, 0x13fb3b5b, 0x2b3a13a4,
  196565. 0x7f5c01f0, 0x5db3565a, 0x52359661, 0xd72408dc, 0x1d616e91,
  196566. 0x5a17f8e5, 0xcb25b999, 0x90c16eeb, 0x3393743e, 0xf35e8cf1,
  196567. 0xe54b64a7, 0x987da74a, 0x65cd449d, 0x557b322a, 0x37e7b15d,
  196568. 0x765082a5, 0xf2cd134f, 0x4d25c742, 0x4ccf0746, 0xae9d9c07,
  196569. 0x8728d135, 0x72fc2110 },
  196570. { 0xf96004c8, 0xa906b203, 0x458055ff, 0xd83f95cf, 0x55f35909,
  196571. 0xd77d5867, 0xe550c8ee, 0x4a9ea6fb, 0x55a06081, 0x91c8cca9,
  196572. 0xbce82062, 0x4a1fee78, 0x9a3df85e, 0xeb9ade06, 0x7d3de666,
  196573. 0xfbbdcf0c, 0x5d336d51, 0x228a391b, 0x5c2ffc3c, 0x760f8d28,
  196574. 0x2f7b165b, 0x1ee48de3, 0x56177040, 0x03803d84, 0x9deff9a0,
  196575. 0xe573f648, 0xa17e35a4, 0xe1a2738e, 0x8840a6c6, 0x238ef17c,
  196576. 0xb11ed92d, 0x480946f8 },
  196577. { 0xfd71f119, 0x84c747a8, 0x53eb3695, 0x19e65c5e, 0x6298587a,
  196578. 0x0e2f6786, 0xab18d6f4, 0x48a48899, 0xc630b8c0, 0xa1a99024,
  196579. 0x2caaf892, 0x84975096, 0xe20fd624, 0xc8869aba, 0x6c2b7dd4,
  196580. 0x3b72b04d, 0x0992f7d0, 0xe2775eb6, 0x7d06e684, 0x0089c06e,
  196581. 0xe4bbd007, 0xcb3b4361, 0x4ba846e4, 0xa1ae666b, 0x46464d9e,
  196582. 0xc01c2eb2, 0xc1f8539f, 0xf86f2be6, 0xcf68afc7, 0x16e8e8ae,
  196583. 0xc7386902, 0x8dab61fd },
  196584. { 0xd54d1d45, 0x42a5c903, 0xff4f9ba2, 0xacd4297e, 0x34d478b4,
  196585. 0x2d88b520, 0x08c4621a, 0x35b2ba2b, 0x34865402, 0xd3d239bb,
  196586. 0x911f32e6, 0x1de76aed, 0x3f06fdc2, 0x877f8bcf, 0x9ec51502,
  196587. 0x802714c1, 0xa590700d, 0xa10444eb, 0x31dcc957, 0x8694229f,
  196588. 0xb8169fed, 0x5ece77ab, 0x2caf080e, 0x55be8a15, 0xcbd7cef1,
  196589. 0x3eb21b14, 0x67b97ee1, 0x9def7ad1, 0x118f690c, 0xe03ca879,
  196590. 0xf99b29e7, 0x6f77e62d },
  196591. { 0xe40bbf59, 0xa271bded, 0x6401aad6, 0x177ba453, 0x73541cd1,
  196592. 0x1755e035, 0x4b71b02f, 0x3465b466, 0xa813359f, 0x22eb7113,
  196593. 0x6f38eac7, 0x9792a8fd, 0xff3bf3b5, 0x11aa012f, 0xf85c3fbf,
  196594. 0x99aafabf, 0x06c0cc42, 0x91e0a2ef, 0x773b7b3a, 0x314d5d57,
  196595. 0xd669840a, 0xae5e2e76, 0x2e5a8be6, 0x86136073, 0xc1cf5580,
  196596. 0xee6d7578, 0x68bed102, 0x2344e00f, 0x8184f0eb, 0x799d7886,
  196597. 0xc3d2cf80, 0x63819c91 },
  196598. { 0x7884b073, 0xca5392e1, 0xeb1267ea, 0x9ec3a1fc, 0x907038a7,
  196599. 0x3d07f5f0, 0xe4c47b70, 0xcb2ac07c, 0x1bf96b91, 0xf96664ee,
  196600. 0x2aea4fbf, 0xebf57589, 0xfade6500, 0x5aabf391, 0x171d1204,
  196601. 0xc5b3376f, 0xa0d3d81a, 0x1ff60c51, 0x976a844b, 0x10b2cfe7,
  196602. 0xbda6125a, 0xe131cc9a, 0x4ebd453e, 0xe0fc16d3, 0x504b6bc1,
  196603. 0xc0d0319a, 0x0a2f8cab, 0xe43a0be7, 0x55e49b47, 0xc80afeec,
  196604. 0x8265d7ee, 0x67d48d12 },
  196605. { 0xea2d56d6, 0x068d59a7, 0x27480a63, 0xd71abd0e, 0xae7366cd,
  196606. 0x6bd11db0, 0x07204ebc, 0xfbb639ca, 0xf77e6293, 0x89a242e7,
  196607. 0x75ba8c3d, 0xdee7ca2b, 0x64a2f9a8, 0x472ddc3d, 0x7561a010,
  196608. 0x84229df4, 0xc5b649d4, 0x95f62c85, 0x4dc927cd, 0xfdd56b1b,
  196609. 0x5ee60596, 0xfe8bb120, 0xabf29401, 0x3efcaa50, 0x10d1c184,
  196610. 0xd4900d0f, 0x28b01df5, 0x2cf113a9, 0x1f0e43f5, 0xa3d7ebc3,
  196611. 0xe8384dc7, 0x27950e38 },
  196612. { 0xe1d0fa79, 0xeab21ff0, 0x048b5de9, 0x4b9fd033, 0x2fe374cb,
  196613. 0x4c934689, 0x4eb21f6b, 0xbb4827fa, 0xa925e7e7, 0x46716f79,
  196614. 0x7dd4c531, 0x1442bf36, 0xd2e96ddf, 0x2073954c, 0x8502aa89,
  196615. 0x4e0141ae, 0x8eef6cc9, 0x8ee00e1a, 0x5880cdaf, 0x55ce8491,
  196616. 0x69628046, 0xff3aba5c, 0x5d15dfbf, 0x335cc4f8, 0x9f684f25,
  196617. 0xa7f0440c, 0xbb1e5bd8, 0xae80453f, 0xff2225ab, 0xa1c99813,
  196618. 0x79b25d71, 0x54ff7884 },
  196619. { 0xde40b068, 0x27c6ee30, 0xe6f3a51e, 0x9226465b, 0xfa3b21f6,
  196620. 0xe24a4604, 0xc0418115, 0x50a5a5ad, 0x8df90d2b, 0xe3285441,
  196621. 0xdcb0c00f, 0xbb74e58f, 0x4a2c08e3, 0xc68f1b3b, 0x0ccd9ec9,
  196622. 0x339df081, 0xb786ea9f, 0x915362dc, 0xc955aead, 0x28945e31,
  196623. 0x8b6a6c6b, 0xd6a2c01d, 0x3678a427, 0x069e82dc, 0x28c9302c,
  196624. 0x17875500, 0x9fa101e6, 0x8acda965, 0xee30b286, 0x4e4e4573,
  196625. 0x3f1830fe, 0x8adbad85 },
  196626. { 0x0969d524, 0x060ae11f, 0xf39bcc79, 0xf42fdaf7, 0x7cc1fcc2,
  196627. 0x3cec6766, 0xe2336d4f, 0x456b9cf2, 0x8e1c0f7f, 0x6aa1f5de,
  196628. 0x0984fb0e, 0xcdbc2ad2, 0x1b464b28, 0x4090cfa6, 0x1243f3ef,
  196629. 0x40d86f30, 0xcd5e87e7, 0x95b16ccc, 0x3026cd41, 0x403f168c,
  196630. 0x816c0730, 0xdbe386cb, 0x58407a1d, 0x14eb86f3, 0x1717e1af,
  196631. 0xf588b4f8, 0x66cbc96c, 0xb75c41a6, 0x027e71c1, 0xf342c1aa,
  196632. 0xc0945e5f, 0x73930036 },
  196633. { 0x22cdaf42, 0x954f757d, 0xf4181aab, 0x788b591d, 0xf5514f25,
  196634. 0x8b986819, 0xf18fd5bc, 0x69642e08, 0x022ceb91, 0x92b305d1,
  196635. 0x6a4f6985, 0x1715903e, 0x61179cae, 0x4bd7d69d, 0xd29c01aa,
  196636. 0xdacdfd5d, 0xd91108cc, 0x705ddd5a, 0x64ac8f15, 0x434ac7b1,
  196637. 0xb524632f, 0x61a514e1, 0x731fc447, 0x45b9e61b, 0xe0961b31,
  196638. 0xcf561348, 0x73eaf223, 0x9c28a967, 0xaa7c99d3, 0x5bd10182,
  196639. 0xe42965e2, 0x8bc6ec4a },
  196640. { 0xe7f2a32b, 0xd096e5c0, 0x09388a30, 0xff54800c, 0x401e360c,
  196641. 0x06fe437c, 0xbb6054a6, 0x6655fc9c, 0x8457aa6e, 0x510e1860,
  196642. 0x2b29b2b7, 0xa0acfca2, 0x51b7da61, 0x732483e3, 0x6be6c8ca,
  196643. 0xe31471ee, 0x8b65c9a1, 0xe565431c, 0x48d65cbb, 0xfc9ac3b9,
  196644. 0xae9b2aa8, 0xd308fc21, 0xaa60aa6a, 0xd6a7df0d, 0x982fc0d4,
  196645. 0x2844d96a, 0x5847a4d7, 0xab012c2c, 0xdceb8955, 0x2b3c8f71,
  196646. 0xbe9c7e15, 0x8e85437d },
  196647. };
  196648. /* Perform the modular exponentiation in Fp* for SAKKE.
  196649. *
  196650. * Base is fixed to be the g parameter - a precomputed table is used.
  196651. *
  196652. * Striping: 128 points at a distance of 8 combined.
  196653. * Total of 256 points in table.
  196654. * Square and multiply performed in Fp*.
  196655. *
  196656. * base [in] Base. MP integer.
  196657. * exp [in] Exponent. MP integer.
  196658. * res [out] Result. MP integer.
  196659. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  196660. * and MEMORY_E if memory allocation fails.
  196661. */
  196662. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  196663. {
  196664. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  196665. !defined(WOLFSSL_SP_NO_MALLOC)
  196666. sp_digit* td;
  196667. sp_digit* t;
  196668. sp_digit* tx;
  196669. sp_digit* ty;
  196670. #else
  196671. sp_digit t[4 * 2 * 32];
  196672. sp_digit tx[2 * 32];
  196673. sp_digit ty[2 * 32];
  196674. #endif
  196675. sp_digit* r = NULL;
  196676. unsigned char e[128];
  196677. int err = MP_OKAY;
  196678. int i;
  196679. int y;
  196680. (void)base;
  196681. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  196682. !defined(WOLFSSL_SP_NO_MALLOC)
  196683. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 32 * 2, NULL,
  196684. DYNAMIC_TYPE_TMP_BUFFER);
  196685. if (td == NULL) {
  196686. err = MEMORY_E;
  196687. }
  196688. #endif
  196689. if (err == MP_OKAY) {
  196690. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  196691. !defined(WOLFSSL_SP_NO_MALLOC)
  196692. t = td;
  196693. tx = td + 4 * 32 * 2;
  196694. ty = td + 5 * 32 * 2;
  196695. #endif
  196696. r = ty;
  196697. (void)mp_to_unsigned_bin_len(exp, e, 128);
  196698. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  196699. y = e[112] >> 7;
  196700. y |= (e[96] >> 7) << 1;
  196701. y |= (e[80] >> 7) << 2;
  196702. y |= (e[64] >> 7) << 3;
  196703. y |= (e[48] >> 7) << 4;
  196704. y |= (e[32] >> 7) << 5;
  196705. y |= (e[16] >> 7) << 6;
  196706. y |= (e[0] >> 7) << 7;
  196707. XMEMCPY(ty, sp_1024_g_table[y], sizeof(sp_digit) * 32);
  196708. for (i = 126; i >= 0; i--) {
  196709. y = (e[127 - (i / 8)] >> (i & 0x7)) & 1;
  196710. y |= ((e[111 - (i / 8)] >> (i & 0x7)) & 1) << 1;
  196711. y |= ((e[95 - (i / 8)] >> (i & 0x7)) & 1) << 2;
  196712. y |= ((e[79 - (i / 8)] >> (i & 0x7)) & 1) << 3;
  196713. y |= ((e[63 - (i / 8)] >> (i & 0x7)) & 1) << 4;
  196714. y |= ((e[47 - (i / 8)] >> (i & 0x7)) & 1) << 5;
  196715. y |= ((e[31 - (i / 8)] >> (i & 0x7)) & 1) << 6;
  196716. y |= ((e[15 - (i / 8)] >> (i & 0x7)) & 1) << 7;
  196717. sp_1024_proj_sqr_32(tx, ty, t);
  196718. sp_1024_proj_mul_qx1_32(tx, ty, sp_1024_g_table[y], t);
  196719. }
  196720. }
  196721. if (err == MP_OKAY) {
  196722. sp_1024_mont_inv_32(tx, tx, t);
  196723. sp_1024_mont_mul_32(r, tx, ty, p1024_mod, p1024_mp_mod);
  196724. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  196725. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  196726. err = sp_1024_to_mp(r, res);
  196727. }
  196728. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  196729. !defined(WOLFSSL_SP_NO_MALLOC)
  196730. if (td != NULL) {
  196731. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  196732. }
  196733. #endif
  196734. return err;
  196735. }
  196736. #endif /* WOLFSSL_SP_SMALL */
  196737. /* Multiply p* by q* in projective co-ordinates.
  196738. *
  196739. * p.x' = (p.x * q.x) - (p.y * q.y)
  196740. * p.y' = (p.x * q.y) + (p.y * q.x)
  196741. * But applying Karatsuba:
  196742. * v0 = p.x * q.x
  196743. * v1 = p.y * q.y
  196744. * p.x' = v0 - v1
  196745. * p.y' = (px + py) * (qx + qy) - v0 - v1
  196746. *
  196747. * px [in,out] A single precision integer - X ordinate of number to multiply.
  196748. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  196749. * qx [in] A single precision integer - X ordinate of number of
  196750. * multiplier.
  196751. * qy [in] A single precision integer - Y ordinate of number of
  196752. * multiplier.
  196753. * t [in] Two single precision integers - temps.
  196754. */
  196755. static void sp_1024_proj_mul_32(sp_digit* px, sp_digit* py,
  196756. const sp_digit* qx, const sp_digit* qy, sp_digit* t)
  196757. {
  196758. sp_digit* t1 = t;
  196759. sp_digit* t2 = t + 2 * 32;
  196760. /* t1 = px + py */
  196761. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  196762. /* t2 = qx + qy */
  196763. sp_1024_mont_add_32(t2, qx, qy, p1024_mod);
  196764. /* t2 = (px + py) * (qx + qy) */
  196765. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  196766. /* t1 = py * qy */
  196767. sp_1024_mont_mul_32(t1, py, qy, p1024_mod, p1024_mp_mod);
  196768. /* t2 = (px + py) * (qx + qy) - (py * qy) */
  196769. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  196770. /* px = px * qx */
  196771. sp_1024_mont_mul_32(px, px, qx, p1024_mod, p1024_mp_mod);
  196772. /* py = (px + py) * (qx + qy) - (py * qy) - (px * qx) */
  196773. sp_1024_mont_sub_32(py, t2, px, p1024_mod);
  196774. /* px = (px * qx) - (py * qy)*/
  196775. sp_1024_mont_sub_32(px, px, t1, p1024_mod);
  196776. }
  196777. #ifndef WOLFSSL_SP_SMALL
  196778. /*
  196779. * Convert point from projective to affine but keep in Montgomery form.
  196780. *
  196781. * p [in,out] Point to convert.
  196782. * t [in] Temporary numbers: 2.
  196783. */
  196784. static void sp_1024_mont_map_32(sp_point_1024* p, sp_digit* t)
  196785. {
  196786. sp_digit* t1 = t;
  196787. sp_digit* t2 = t + 2 * 32;
  196788. sp_1024_mont_inv_32(t1, p->z, t2);
  196789. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  196790. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  196791. sp_1024_mont_mul_32(p->x, p->x, t2, p1024_mod, p1024_mp_mod);
  196792. sp_1024_mont_mul_32(p->y, p->y, t1, p1024_mod, p1024_mp_mod);
  196793. XMEMCPY(p->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  196794. }
  196795. #endif /* WOLFSSL_SP_SMALL */
  196796. /*
  196797. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  196798. * double P.
  196799. *
  196800. * Calculations:
  196801. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  196802. * r.x = l * (p.x + q.x * p.z^2) - 2 * p.y^2
  196803. * r.y = 2 * p.y * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  196804. * v* = v*^2 * r*
  196805. * p'.x = l^2 - 8 * p.y^2 * p.x
  196806. * p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4
  196807. * p'.z = 2 * p.y * p.z
  196808. *
  196809. * @param [in,out] vx X-ordinate of projective value in F*.
  196810. * @param [in,out] vy Y-ordinate of projective value in F*.
  196811. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  196812. * @param [in] q ECC point - second point on E(F_P^2).
  196813. * @param [in] t SP temporaries (6 used).
  196814. */
  196815. static void sp_1024_accumulate_line_dbl_32(sp_digit* vx, sp_digit* vy,
  196816. sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  196817. {
  196818. sp_digit* t1 = t + 0 * 32;
  196819. sp_digit* pz2 = t + 2 * 32;
  196820. sp_digit* rx = t + 4 * 32;
  196821. sp_digit* ry = t + 6 * 32;
  196822. sp_digit* l = t + 8 * 32;
  196823. sp_digit* ty = t + 10 * 32;
  196824. /* v = v^2 */
  196825. sp_1024_proj_sqr_32(vx, vy, t);
  196826. /* pz2 = p.z^2 */
  196827. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  196828. /* t1 = p.x + p.z^2 */
  196829. sp_1024_mont_add_32(ty, p->x, pz2, p1024_mod);
  196830. /* l = p.x - p.z^2 */
  196831. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  196832. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  196833. sp_1024_mont_mul_32(t1, l, ty, p1024_mod, p1024_mp_mod);
  196834. /* l = 3 * (p.x^2 - p.z^4) */
  196835. sp_1024_mont_tpl_32(l, t1, p1024_mod);
  196836. /* t1 = q.x * p.z^2 */
  196837. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  196838. /* t1 = p.x + q.x * p.z^2 */
  196839. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  196840. /* r.x = l * (p.x + q.x * p.z^2) */
  196841. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  196842. /* r.y = 2 * p.y */
  196843. sp_1024_mont_dbl_32(ry, p->y, p1024_mod);
  196844. /* ty = 4 * p.y ^ 2 */
  196845. sp_1024_mont_sqr_32(ty, ry, p1024_mod, p1024_mp_mod);
  196846. /* t1 = 2 * p.y ^ 2 */
  196847. sp_1024_div2_32(t1, ty, p1024_mod);
  196848. /* r.x -= 2 * (p.y ^ 2) */
  196849. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  196850. /* p'.z = p.y * 2 * p.z */
  196851. sp_1024_mont_mul_32(p->z, p->z, ry, p1024_mod, p1024_mp_mod);
  196852. /* r.y = p'.z * p.z^2 */
  196853. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  196854. /* r.y = p'.z * p.z^2 * q.y */
  196855. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  196856. /* v = v^2 * r */
  196857. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  196858. /* Double point using previously calculated values
  196859. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  196860. * ty = 4 * p.y^2
  196861. * p'.z = 2 * p.y * p.z
  196862. */
  196863. /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */
  196864. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  196865. /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */
  196866. sp_1024_div2_32(t1, t1, p1024_mod);
  196867. /* p'.y = 4 * p.y^2 * p.x */
  196868. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  196869. /* p'.x = l^2 */
  196870. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  196871. /* p'.x = l^2 - 4 * p.y^2 * p.x */
  196872. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  196873. /* p'.x = l^2 - 8 * p.y^2 * p.x */
  196874. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  196875. /* p'.y = 4 * p.y^2 * p.x - p.x' */
  196876. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  196877. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l */
  196878. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  196879. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4 */
  196880. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  196881. }
  196882. #ifdef WOLFSSL_SP_SMALL
  196883. /*
  196884. * Calculate gradient of line through C, P and -C-P, accumulate line and
  196885. * add P to C.
  196886. *
  196887. * Calculations:
  196888. * r.x = (q.x + p.x) * c.y - (q.x * c.z^2 + c.x) * p.y * c.z
  196889. * r.y = (c.x - p.x * c.z^2) * q.y * c.z
  196890. * v* = v* * r*
  196891. * r = p.y * c.z^3 - c.y
  196892. * c'.x = r^2 + h^3 - 2 * c.x * h^2
  196893. * c'.y = r * (c'.x - c.x * h^2) - c.y * h^3
  196894. * c'.z = (c.x - p.x * c.z^2) * c.z
  196895. *
  196896. * @param [in,out] vx X-ordinate of projective value in F*.
  196897. * @param [in,out] vy Y-ordinate of projective value in F*.
  196898. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  196899. * to.
  196900. * @param [in] p ECC point - point on E(F_p^2) to add.
  196901. * @param [in] q ECC point - second point on E(F_P^2).
  196902. * @param [in] qx_px SP that is a constant value across adds.
  196903. * @param [in] t SP temporaries (6 used).
  196904. */
  196905. static void sp_1024_accumulate_line_add_one_32(sp_digit* vx, sp_digit* vy,
  196906. sp_point_1024* c, sp_point_1024* p, sp_point_1024* q, sp_digit* qx_px,
  196907. sp_digit* t)
  196908. {
  196909. sp_digit* t1 = t;
  196910. sp_digit* t2 = t + 2 * 32;
  196911. sp_digit* rx = t + 4 * 32;
  196912. sp_digit* ry = t + 6 * 32;
  196913. sp_digit* h = t + 8 * 32;
  196914. sp_digit* r = t + 10 * 32;
  196915. /* r.x = (q.x + p.x) * c.y */
  196916. sp_1024_mont_mul_32(rx, qx_px, c->y, p1024_mod, p1024_mp_mod);
  196917. /* t2 = c.z^2 */
  196918. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  196919. /* t1 = q.x * c.z^2 */
  196920. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  196921. /* t1 = q.x * c.z^2 + c.x */
  196922. sp_1024_mont_add_32(h, t1, c->x, p1024_mod);
  196923. /* r = p.y * c.z */
  196924. sp_1024_mont_mul_32(ry, p->y, c->z, p1024_mod, p1024_mp_mod);
  196925. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  196926. sp_1024_mont_mul_32(t1, h, ry, p1024_mod, p1024_mp_mod);
  196927. /* r = p.y * c.z * c.z^2 = p.y * c.z^3 */
  196928. sp_1024_mont_mul_32(r, ry, t2, p1024_mod, p1024_mp_mod);
  196929. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  196930. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  196931. /* t1 = p.x * c.z^2 */
  196932. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  196933. /* h = c.x - p.x * c.z^2 */
  196934. sp_1024_mont_sub_32(h, c->x, t1, p1024_mod);
  196935. /* c'.z = (c.x - p.x * c.z^2) * c.z */
  196936. sp_1024_mont_mul_32(c->z, h, c->z, p1024_mod, p1024_mp_mod);
  196937. /* r.y = (c.x - p.x * c.z^2) * c.z * q.y */
  196938. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  196939. /* v = v * r */
  196940. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  196941. /* Add p to c using previously calculated values.
  196942. * h = c.x - p.x * c.z^2
  196943. * r = p.y * c.z^3
  196944. * c'.z = (c.x - p.x * c.z^2) * c.z
  196945. */
  196946. /* r = p.y * c.z^3 - c.y */
  196947. sp_1024_mont_sub_32(r, r, c->y, p1024_mod);
  196948. /* t1 = r^2 */
  196949. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  196950. /* t2 = h^2 */
  196951. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  196952. /* ry = c.x * h^2 */
  196953. sp_1024_mont_mul_32(ry, c->x, rx, p1024_mod, p1024_mp_mod);
  196954. /* t2 = h^3 */
  196955. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  196956. /* c->x = r^2 + h^3 */
  196957. sp_1024_mont_add_32(c->x, t1, t2, p1024_mod);
  196958. /* t1 = 2 * c.x * h^2 */
  196959. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  196960. /* c'.x = r^2 + h^3 - 2 * c.x * h^2 */
  196961. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  196962. /* ry = c'.x - c.x * h^2 */
  196963. sp_1024_mont_sub_32(t1, c->x, ry, p1024_mod);
  196964. /* ry = r * (c'.x - c.x * h^2) */
  196965. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  196966. /* t2 = c.y * h^3 */
  196967. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  196968. /* c'.y = r * (c'.x - c.x * h^2) - c.y * h^3 */
  196969. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  196970. }
  196971. /*
  196972. * Calculate r = pairing <P, Q>.
  196973. *
  196974. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  196975. *
  196976. * @param [in] key SAKKE key.
  196977. * @param [in] p First point on E(F_p)[q].
  196978. * @param [in] q Second point on E(F_p)[q].
  196979. * @param [in] r Result of calculation.
  196980. * @return 0 on success.
  196981. * @return MEMORY_E when dynamic memory allocation fails.
  196982. * @return Other -ve value on internal failure.
  196983. */
  196984. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  196985. {
  196986. int err = MP_OKAY;
  196987. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  196988. !defined(WOLFSSL_SP_NO_MALLOC)
  196989. sp_digit* td = NULL;
  196990. sp_digit* t;
  196991. sp_digit* vx;
  196992. sp_digit* vy;
  196993. sp_digit* qx_px;
  196994. #else
  196995. sp_digit t[6 * 2 * 32];
  196996. sp_digit vx[2 * 32];
  196997. sp_digit vy[2 * 32];
  196998. sp_digit qx_px[2 * 32];
  196999. sp_point_1024 pd;
  197000. sp_point_1024 qd;
  197001. sp_point_1024 cd;
  197002. #endif
  197003. sp_point_1024* p = NULL;
  197004. sp_point_1024* q = NULL;
  197005. sp_point_1024* c = NULL;
  197006. sp_digit* r = NULL;
  197007. int i;
  197008. err = sp_1024_point_new_32(NULL, pd, p);
  197009. if (err == MP_OKAY) {
  197010. err = sp_1024_point_new_32(NULL, qd, q);
  197011. }
  197012. if (err == MP_OKAY) {
  197013. err = sp_1024_point_new_32(NULL, cd, c);
  197014. }
  197015. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197016. !defined(WOLFSSL_SP_NO_MALLOC)
  197017. if (err == MP_OKAY) {
  197018. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 9 * 32 * 2, NULL,
  197019. DYNAMIC_TYPE_TMP_BUFFER);
  197020. if (td == NULL) {
  197021. err = MEMORY_E;
  197022. }
  197023. }
  197024. #endif
  197025. if (err == MP_OKAY) {
  197026. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197027. !defined(WOLFSSL_SP_NO_MALLOC)
  197028. t = td;
  197029. vx = td + 6 * 32 * 2;
  197030. vy = td + 7 * 32 * 2;
  197031. qx_px = td + 8 * 32 * 2;
  197032. #endif
  197033. r = vy;
  197034. sp_1024_point_from_ecc_point_32(p, pm);
  197035. sp_1024_point_from_ecc_point_32(q, qm);
  197036. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  197037. }
  197038. if (err == MP_OKAY) {
  197039. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  197040. }
  197041. if (err == MP_OKAY) {
  197042. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  197043. }
  197044. if (err == MP_OKAY) {
  197045. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  197046. }
  197047. if (err == MP_OKAY) {
  197048. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  197049. }
  197050. if (err == MP_OKAY) {
  197051. XMEMCPY(c, p, sizeof(sp_point_1024));
  197052. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  197053. vx[0] = 1;
  197054. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  197055. sp_1024_mont_add_32(qx_px, q->x, p->x, p1024_mod);
  197056. for (i = 1020; i >= 0; i--) {
  197057. /* Accumulate line into v and double point. */
  197058. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  197059. if ((i > 0) && ((p1024_order[i / 32] >> (i % 32)) & 1)) {
  197060. /* Accumulate line into v and add P into C. */
  197061. sp_1024_accumulate_line_add_one_32(vx, vy, c, p, q, qx_px, t);
  197062. }
  197063. }
  197064. /* Final exponentiation */
  197065. sp_1024_proj_sqr_32(vx, vy, t);
  197066. sp_1024_proj_sqr_32(vx, vy, t);
  197067. /* Convert from PF_p[q] to F_p */
  197068. sp_1024_mont_inv_32(vx, vx, t);
  197069. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  197070. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  197071. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  197072. err = sp_1024_to_mp(r, res);
  197073. }
  197074. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197075. !defined(WOLFSSL_SP_NO_MALLOC)
  197076. if (td != NULL) {
  197077. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  197078. }
  197079. #endif
  197080. sp_1024_point_free_32(c, 1, NULL);
  197081. sp_1024_point_free_32(q, 1, NULL);
  197082. sp_1024_point_free_32(p, 1, NULL);
  197083. return err;
  197084. }
  197085. #else
  197086. /*
  197087. * Calculate gradient of line through C, P and -C-P, accumulate line and
  197088. * add P to C.
  197089. *
  197090. * Both C and P have z ordinates to use in the calculation.
  197091. *
  197092. * Calculations:
  197093. * r.x = (q.x * c.z^2 + c.x) * p.y * c.z - (q.x * p.z^2 + p.x) * c.y * p.z
  197094. * r.y = (p.x * c.z^2 - c.x * p.z^2) * q.y * p.z * c.z
  197095. * v* = v* * r*
  197096. * h = p.x * c.z^2 - c.x * p.z^2
  197097. * r = p.y * c.z^3 - c.y * p.z^3
  197098. * c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2
  197099. * c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3
  197100. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  197101. *
  197102. * @param [in,out] vx X-ordinate of projective value in F*.
  197103. * @param [in,out] vy Y-ordinate of projective value in F*.
  197104. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  197105. * to.
  197106. * @param [in,out] p ECC point - point on E(F_p^2) to add.
  197107. * @param [in,out] q ECC point - second point on E(F_P^2).
  197108. * @param [in,out] t SP temporaries (6 used).
  197109. * @param [in,out] neg Indicates to use negative P.
  197110. * @return 0 on success.
  197111. * @return MEMORY_E when dynamic memory allocation fails.
  197112. * @return Other -ve value on internal failure.
  197113. */
  197114. static void sp_1024_accumulate_line_add_n_32(sp_digit* vx, sp_digit* vy,
  197115. const sp_point_1024* p, const sp_point_1024* q,
  197116. sp_point_1024* c, sp_digit* t, int neg)
  197117. {
  197118. sp_digit* t1 = t;
  197119. sp_digit* t2 = t + 2 * 32;
  197120. sp_digit* rx = t + 4 * 32;
  197121. sp_digit* ry = t + 6 * 32;
  197122. sp_digit* h = t + 8 * 32;
  197123. sp_digit* r = t + 10 * 32;
  197124. /* h = p.z^2 */
  197125. sp_1024_mont_sqr_32(h, p->z, p1024_mod, p1024_mp_mod);
  197126. /* rx = q.x * p.z^2 */
  197127. sp_1024_mont_mul_32(rx, q->x, h, p1024_mod, p1024_mp_mod);
  197128. /* rx = q.x * p.z^2 + p.x */
  197129. sp_1024_mont_add_32(t2, rx, p->x, p1024_mod);
  197130. /* c.y = c.y * p.z */
  197131. sp_1024_mont_mul_32(t1, c->y, p->z, p1024_mod, p1024_mp_mod);
  197132. /* r.x = (q.x * p.z^2 + p.x) * c.y * p.z */
  197133. sp_1024_mont_mul_32(rx, t2, t1, p1024_mod, p1024_mp_mod);
  197134. /* c.y = c.y * p.z^3 */
  197135. sp_1024_mont_mul_32(c->y, t1, h, p1024_mod, p1024_mp_mod);
  197136. /* t2 = c.z^2 */
  197137. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  197138. /* t1 = q.x * c.z^2 */
  197139. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  197140. /* t1 = q.x * c.z^2 + c.x */
  197141. sp_1024_mont_add_32(t1, t1, c->x, p1024_mod);
  197142. /* c.x = c.x * p.z^2 */
  197143. sp_1024_mont_mul_32(c->x, c->x, h, p1024_mod, p1024_mp_mod);
  197144. /* r = p.y * c.z */
  197145. sp_1024_mont_mul_32(r, p->y, c->z, p1024_mod, p1024_mp_mod);
  197146. if (neg) {
  197147. /* r = -p.y * c.z */
  197148. sp_1024_mont_sub_32(r, p1024_mod, r, p1024_mod);
  197149. }
  197150. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  197151. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  197152. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  197153. sp_1024_mont_sub_32(rx, ry, rx, p1024_mod);
  197154. /* t1 = p.x * c.z^2 */
  197155. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  197156. /* h = p.x * c.z^2 - c.x * p.z^2 */
  197157. sp_1024_mont_sub_32(h, t1, c->x, p1024_mod);
  197158. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z */
  197159. sp_1024_mont_mul_32(t1, h, c->z, p1024_mod, p1024_mp_mod);
  197160. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z */
  197161. sp_1024_mont_mul_32(c->z, t1, p->z, p1024_mod, p1024_mp_mod);
  197162. /* r.y = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z * q.y */
  197163. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  197164. /* r = p.y * c.z^3 */
  197165. sp_1024_mont_mul_32(t1, r, t2, p1024_mod, p1024_mp_mod);
  197166. /* r = p.y * c.z^3 - c.y * p.z^3 */
  197167. sp_1024_mont_sub_32(r, t1, c->y, p1024_mod);
  197168. /* v = v * r */
  197169. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  197170. /* Add p to c using previously calculated values.
  197171. * h = p.x * c.z^2 - c.x * p.z^2
  197172. * r = p.y * c.z^3 - c.y * p.z^3
  197173. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  197174. */
  197175. /* t1 = r^2 */
  197176. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  197177. /* t2 = h^2 */
  197178. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  197179. /* ry = c.x * p.z^2 * h^2 */
  197180. sp_1024_mont_mul_32(ry, rx, c->x, p1024_mod, p1024_mp_mod);
  197181. /* t2 = h^3 */
  197182. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  197183. /* c'.x = r^2 - h^3 */
  197184. sp_1024_mont_sub_32(c->x, t1, t2, p1024_mod);
  197185. /* t1 = 2 * c.x * p.z^2 * h^2 */
  197186. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  197187. /* c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2 */
  197188. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  197189. /* ry = c.x * p.z^2 * h^2 - c'.x */
  197190. sp_1024_mont_sub_32(t1, ry, c->x, p1024_mod);
  197191. /* ry = r * (c.x * p.z^2 * h^2 - c'.x) */
  197192. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  197193. /* t2 = c.y * p.z^3 * h^3 */
  197194. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  197195. /* c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3 */
  197196. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  197197. }
  197198. /*
  197199. * Perform n accumulate doubles and doubles of P.
  197200. *
  197201. * py = 2 * p.y
  197202. *
  197203. * For each double:
  197204. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  197205. * double P.
  197206. *
  197207. * Calculations:
  197208. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  197209. * r.x = l * (p.x + q.x * p.z^2) - py^2 / 2
  197210. * r.y = py * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  197211. * v* = v*^2 * r*
  197212. * p'.x = l^2 - 2 * py^2 * p.x
  197213. * py' = (py^2 * p.x - p'.x) * l - py^4 (= 2 * p'.y)
  197214. * p'.z = py * p.z
  197215. *
  197216. * Finally:
  197217. * p'.y = py' / 2
  197218. *
  197219. * @param [in,out] vx X-ordinate of projective value in F*.
  197220. * @param [in,out] vy Y-ordinate of projective value in F*.
  197221. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  197222. * @param [in] q ECC point - second point on E(F_P^2).
  197223. * @param [in] n Number of times to double.
  197224. * @param [in] t SP temporaries (6 used).
  197225. */
  197226. static void sp_1024_accumulate_line_dbl_n_32(sp_digit* vx, sp_digit* vy,
  197227. sp_point_1024* p, const sp_point_1024* q, int n, sp_digit* t)
  197228. {
  197229. sp_digit* t1 = t + 0 * 32;
  197230. sp_digit* pz2 = t + 2 * 32;
  197231. sp_digit* rx = t + 4 * 32;
  197232. sp_digit* ry = t + 6 * 32;
  197233. sp_digit* l = t + 8 * 32;
  197234. sp_digit* ty = t + 10 * 32;
  197235. int i;
  197236. /* py = 2 * p.y */
  197237. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  197238. for (i = 0; i < n; i++) {
  197239. /* v = v^2 */
  197240. sp_1024_proj_sqr_32(vx, vy, t);
  197241. /* pz2 = p.z^2 */
  197242. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  197243. /* t1 = p.x + p.z^2 */
  197244. sp_1024_mont_add_32(t1, p->x, pz2, p1024_mod);
  197245. /* l = p.x - p.z^2 */
  197246. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  197247. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  197248. sp_1024_mont_mul_32(ty, l, t1, p1024_mod, p1024_mp_mod);
  197249. /* l = 3 * (p.x^2 - p.z^4) */
  197250. sp_1024_mont_tpl_32(l, ty, p1024_mod);
  197251. /* t1 = q.x * p.z^2 */
  197252. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  197253. /* t1 = p.x + q.x * p.z^2 */
  197254. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  197255. /* r.x = l * (p.x + q.x * p.z^2) */
  197256. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  197257. /* ty = py ^ 2 */
  197258. sp_1024_mont_sqr_32(ty, p->y, p1024_mod, p1024_mp_mod);
  197259. /* t1 = py ^ 2 / 2 */
  197260. sp_1024_div2_32(t1, ty, p1024_mod);
  197261. /* r.x -= py ^ 2 / 2 */
  197262. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  197263. /* p'.z = py * pz */
  197264. sp_1024_mont_mul_32(p->z, p->z, p->y, p1024_mod, p1024_mp_mod);
  197265. /* r.y = p'.z * p.z^2 */
  197266. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  197267. /* r.y = p'.z * p.z^2 * q.y */
  197268. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  197269. /* v = v^2 * r */
  197270. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  197271. /* Double point using previously calculated values
  197272. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  197273. * ty = py^2
  197274. * p'.z = py * p.z
  197275. */
  197276. /* t1 = py^2 ^ 2 = py^4 */
  197277. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  197278. /* py' = py^2 * p. x */
  197279. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  197280. /* p'.x = l^2 */
  197281. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  197282. /* p'.x = l^2 - py^2 * p.x */
  197283. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  197284. /* p'.x = l^2 - 2 * p.y^2 * p.x */
  197285. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  197286. /* py' = py^2 * p.x - p.x' */
  197287. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  197288. /* py' = (p.y^2 * p.x - p'.x) * l */
  197289. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  197290. /* py' = (p.y^2 * p.x - p'.x) * l * 2 */
  197291. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  197292. /* py' = (p.y^2 * p.x - p'.x) * l * 2 - p.y^4 */
  197293. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  197294. }
  197295. /* p'.y = py' / 2 */
  197296. sp_1024_div2_32(p->y, p->y, p1024_mod);
  197297. }
  197298. /* Operations to perform based on order - 1.
  197299. * Sliding window. Start at bottom and stop when bottom bit is one.
  197300. * Subtract if top bit in window is one.
  197301. * Width of 6 bits.
  197302. * Pairs: #dbls, add/subtract window value
  197303. */
  197304. static const signed char sp_1024_order_op[] = {
  197305. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  197306. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  197307. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  197308. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  197309. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  197310. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  197311. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  197312. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  197313. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  197314. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  197315. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  197316. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  197317. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  197318. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  197319. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  197320. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  197321. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  197322. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  197323. -3, 1,
  197324. };
  197325. /*
  197326. * Calculate r = pairing <P, Q>.
  197327. *
  197328. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  197329. *
  197330. * Sliding window. Start at bottom and stop when bottom bit is one.
  197331. * Subtract if top bit in window is one.
  197332. * Width of 6 bits.
  197333. *
  197334. * @param [in] pm First point on E(F_p)[q].
  197335. * @param [in] qm Second point on E(F_p)[q].
  197336. * @param [in] res Result of calculation.
  197337. * @return 0 on success.
  197338. * @return MEMORY_E when dynamic memory allocation fails.
  197339. */
  197340. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  197341. {
  197342. int err;
  197343. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197344. !defined(WOLFSSL_SP_NO_MALLOC)
  197345. sp_digit* td = NULL;
  197346. sp_digit* t;
  197347. sp_digit* vx;
  197348. sp_digit* vy;
  197349. sp_digit (*pre_vx)[64];
  197350. sp_digit (*pre_vy)[64];
  197351. sp_digit (*pre_nvy)[64];
  197352. sp_point_1024* pre_p;
  197353. #else
  197354. sp_digit t[6 * 2 * 32];
  197355. sp_digit vx[2 * 32];
  197356. sp_digit vy[2 * 32];
  197357. sp_digit pre_vx[16][64];
  197358. sp_digit pre_vy[16][64];
  197359. sp_digit pre_nvy[16][64];
  197360. sp_point_1024 pre_p[16];
  197361. sp_point_1024 pd;
  197362. sp_point_1024 qd;
  197363. sp_point_1024 cd;
  197364. #endif
  197365. sp_point_1024* p = NULL;
  197366. sp_point_1024* q = NULL;
  197367. sp_point_1024* c = NULL;
  197368. sp_digit* r = NULL;
  197369. int i;
  197370. int j;
  197371. err = sp_1024_point_new_32(NULL, pd, p);
  197372. if (err == MP_OKAY) {
  197373. err = sp_1024_point_new_32(NULL, qd, q);
  197374. }
  197375. if (err == MP_OKAY) {
  197376. err = sp_1024_point_new_32(NULL, cd, c);
  197377. }
  197378. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197379. !defined(WOLFSSL_SP_NO_MALLOC)
  197380. if (err == MP_OKAY) {
  197381. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 56 * 32 * 2 + 16 * sizeof(sp_point_1024), NULL,
  197382. DYNAMIC_TYPE_TMP_BUFFER);
  197383. if (td == NULL) {
  197384. err = MEMORY_E;
  197385. }
  197386. }
  197387. #endif
  197388. if (err == MP_OKAY) {
  197389. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197390. !defined(WOLFSSL_SP_NO_MALLOC)
  197391. t = td;
  197392. vx = td + 6 * 32 * 2;
  197393. vy = td + 7 * 32 * 2;
  197394. pre_vx = (sp_digit(*)[64])(td + 8 * 32 * 2);
  197395. pre_vy = (sp_digit(*)[64])(td + 24 * 32 * 2);
  197396. pre_nvy = (sp_digit(*)[64])(td + 40 * 32 * 2);
  197397. pre_p = (sp_point_1024*)(td + 56 * 32 * 2);
  197398. #endif
  197399. r = vy;
  197400. sp_1024_point_from_ecc_point_32(p, pm);
  197401. sp_1024_point_from_ecc_point_32(q, qm);
  197402. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  197403. }
  197404. if (err == MP_OKAY) {
  197405. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  197406. }
  197407. if (err == MP_OKAY) {
  197408. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  197409. }
  197410. if (err == MP_OKAY) {
  197411. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  197412. }
  197413. if (err == MP_OKAY) {
  197414. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  197415. }
  197416. if (err == MP_OKAY) {
  197417. /* Generate pre-computation table: 1, 3, ... , 31 */
  197418. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  197419. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  197420. pre_vx[0][0] = 1;
  197421. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  197422. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  197423. /* [2]P for adding */
  197424. XMEMCPY(c, p, sizeof(sp_point_1024));
  197425. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  197426. vx[0] = 1;
  197427. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  197428. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  197429. /* 3, 5, ... */
  197430. for (i = 1; i < 16; i++) {
  197431. XMEMCPY(&pre_p[i], &pre_p[i-1], sizeof(sp_point_1024));
  197432. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  197433. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  197434. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  197435. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  197436. q, &pre_p[i], t, 0);
  197437. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i], p1024_mod);
  197438. }
  197439. j = sp_1024_order_op[0] / 2;
  197440. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  197441. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  197442. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  197443. /* Accumulate line into v and double point n times. */
  197444. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  197445. sp_1024_order_op[1], t);
  197446. for (i = 2; i < 290; i += 2) {
  197447. j = sp_1024_order_op[i];
  197448. if (j > 0) {
  197449. j /= 2;
  197450. /* Accumulate line into v and add P into C. */
  197451. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  197452. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  197453. t, 0);
  197454. }
  197455. else {
  197456. j = -j / 2;
  197457. /* Accumulate line into v and add P into C. */
  197458. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  197459. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  197460. t, 1);
  197461. }
  197462. /* Accumulate line into v and double point n times. */
  197463. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  197464. sp_1024_order_op[i + 1], t);
  197465. }
  197466. /* Final exponentiation */
  197467. sp_1024_proj_sqr_32(vx, vy, t);
  197468. sp_1024_proj_sqr_32(vx, vy, t);
  197469. /* Convert from PF_p[q] to F_p */
  197470. sp_1024_mont_inv_32(vx, vx, t);
  197471. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  197472. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  197473. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  197474. err = sp_1024_to_mp(r, res);
  197475. }
  197476. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197477. !defined(WOLFSSL_SP_NO_MALLOC)
  197478. if (td != NULL) {
  197479. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  197480. }
  197481. #endif
  197482. sp_1024_point_free_32(c, 1, NULL);
  197483. sp_1024_point_free_32(q, 1, NULL);
  197484. sp_1024_point_free_32(p, 1, NULL);
  197485. return err;
  197486. }
  197487. #endif /* WOLFSSL_SP_SMALL */
  197488. #ifdef WOLFSSL_SP_SMALL
  197489. /*
  197490. * Generate table for pairing.
  197491. *
  197492. * Small implementation does not use a table - returns 0 length.
  197493. *
  197494. * pm [in] Point to generate table for.
  197495. * table [in] Generated table.
  197496. * len [in,out] On in, the size of the buffer.
  197497. * On out, length of table generated.
  197498. * @return 0 on success.
  197499. * LENGTH_ONLY_E when table is NULL and only length returned.
  197500. * BUFFER_E when len is too small.
  197501. */
  197502. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  197503. word32* len)
  197504. {
  197505. int err = 0;
  197506. if (table == NULL) {
  197507. *len = 0;
  197508. err = LENGTH_ONLY_E;
  197509. }
  197510. else if (*len != 0) {
  197511. err = BUFFER_E;
  197512. }
  197513. (void)*pm;
  197514. return err;
  197515. }
  197516. /*
  197517. * Calculate r = pairing <P, Q>.
  197518. *
  197519. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  197520. *
  197521. * Small implementation does not use a table - use the normal implementation.
  197522. *
  197523. * @param [in] pm First point on E(F_p)[q].
  197524. * @param [in] qm Second point on E(F_p)[q].
  197525. * @param [in] res Result of calculation.
  197526. * @param [in] table Precomputed table of values.
  197527. * @param [in] len Length of precomputed table of values in bytes.
  197528. * @return 0 on success.
  197529. * @return MEMORY_E when dynamic memory allocation fails.
  197530. */
  197531. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  197532. mp_int* res, const byte* table, word32 len)
  197533. {
  197534. (void)table;
  197535. (void)len;
  197536. return sp_Pairing_1024(pm, qm, res);
  197537. }
  197538. #else
  197539. /*
  197540. * Calc l and c for the point when doubling p.
  197541. *
  197542. * l = 3 * (p.x^2 - 1) / (2 * p.y)
  197543. * c = l * p.x - p.y
  197544. *
  197545. * @param [out] lr Gradient result - table entry.
  197546. * @param [out] cr Constant result - table entry.
  197547. * @param [in] px X-ordinate of point to double.
  197548. * @param [in] py Y-ordinate of point to double.
  197549. * @param [in] t SP temporaries (3 used).
  197550. */
  197551. static void sp_1024_accum_dbl_calc_lc_32(sp_digit* lr, sp_digit* cr,
  197552. const sp_digit* px, const sp_digit* py, sp_digit* t)
  197553. {
  197554. sp_digit* t1 = t + 0 * 2 * 32;
  197555. sp_digit* t2 = t + 2 * 2 * 32;
  197556. sp_digit* l = t + 4 * 2 * 32;
  197557. /* l = 1 / 2 * p.y */
  197558. sp_1024_mont_dbl_32(l, py, p1024_mod);
  197559. sp_1024_mont_inv_32(l, l, t);
  197560. /* t1 = p.x^2 */
  197561. sp_1024_mont_sqr_32(t1, px, p1024_mod, p1024_mp_mod);
  197562. /* t1 = p.x - 1 */
  197563. sp_1024_mont_sub_32(t1, t1, p1024_norm_mod, p1024_mod);
  197564. /* t1 = 3 * (p.x^2 - 1) */
  197565. sp_1024_mont_dbl_32(t2, t1, p1024_mod);
  197566. sp_1024_mont_add_32(t1, t1, t2, p1024_mod);
  197567. /* t1 = 3 * (p.x^2 - 1) / (2 * p.y) */
  197568. sp_1024_mont_mul_32(l, l, t1, p1024_mod, p1024_mp_mod);
  197569. /* t2 = l * p.x */
  197570. sp_1024_mont_mul_32(t2, l, px, p1024_mod, p1024_mp_mod);
  197571. /* c = t2 = l * p.x - p.y */
  197572. sp_1024_mont_sub_32(t2, t2, py, p1024_mod);
  197573. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  197574. XMEMCPY(cr, t2, sizeof(sp_digit) * 32);
  197575. }
  197576. /*
  197577. * Calc l and c when adding p and c.
  197578. *
  197579. * l = (c.y - p.y) / (c.x - p.x)
  197580. * c = (p.x * c.y - cx * p.y) / (cx - p.x)
  197581. *
  197582. * @param [out] lr Gradient result - table entry.
  197583. * @param [out] cr Constant result - table entry.
  197584. * @param [in] px X-ordinate of point to add.
  197585. * @param [in] py Y-ordinate of point to add.
  197586. * @param [in] cx X-ordinate of current point.
  197587. * @param [in] cy Y-ordinate of current point.
  197588. * @param [in] t SP temporaries (3 used).
  197589. */
  197590. static void sp_1024_accum_add_calc_lc_32(sp_digit* lr, sp_digit* cr,
  197591. const sp_digit* px, const sp_digit* py, const sp_digit* cx,
  197592. const sp_digit* cy, sp_digit* t)
  197593. {
  197594. sp_digit* t1 = t + 0 * 2 * 32;
  197595. sp_digit* c = t + 2 * 2 * 32;
  197596. sp_digit* l = t + 4 * 2 * 32;
  197597. /* l = 1 / (c.x - p.x) */
  197598. sp_1024_mont_sub_32(l, cx, px, p1024_mod);
  197599. sp_1024_mont_inv_32(l, l, t);
  197600. /* c = p.x * c.y */
  197601. sp_1024_mont_mul_32(c, px, cy, p1024_mod, p1024_mp_mod);
  197602. /* t1 = c.x * p.y */
  197603. sp_1024_mont_mul_32(t1, cx, py, p1024_mod, p1024_mp_mod);
  197604. /* c = (p.x * c.y) - (c.x * p.y) */
  197605. sp_1024_mont_sub_32(c, c, t1, p1024_mod);
  197606. /* c = ((p.x * c.y) - (c.x * p.y)) / (c.x - p.x) */
  197607. sp_1024_mont_mul_32(c, c, l, p1024_mod, p1024_mp_mod);
  197608. /* t1 = c.y - p.y */
  197609. sp_1024_mont_sub_32(t1, cy, py, p1024_mod);
  197610. /* l = (c.y - p.y) / (c.x - p.x) */
  197611. sp_1024_mont_mul_32(l, t1, l, p1024_mod, p1024_mp_mod);
  197612. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  197613. XMEMCPY(cr, c, sizeof(sp_digit) * 32);
  197614. }
  197615. /*
  197616. * Calculate vx and vy given gradient l and constant c and point q.
  197617. *
  197618. * l is a the gradient and is multiplied by q->x.
  197619. * c is a the constant that is added to the multiplicative result.
  197620. * q->y is the y-ordinate in result to multiply.
  197621. *
  197622. * if dbl
  197623. * v* = v*^2
  197624. * r.x = l * q.x + c
  197625. * r.y = q->y
  197626. * v* = v* * r*
  197627. *
  197628. * @param [in,out] vx X-ordinate of projective value in F*.
  197629. * @param [in,out] vy Y-ordinate of projective value in F*.
  197630. * @param [in] l Gradient to multiply with.
  197631. * @param [in] c Constant to add with.
  197632. * @param [in] q ECC point - second point on E(F_P^2).
  197633. * @param [in] t SP temporaries (3 used).
  197634. * @param [in] dbl Indicates whether this is for doubling. Otherwise
  197635. * adding.
  197636. */
  197637. static void sp_1024_accumulate_line_lc_32(sp_digit* vx, sp_digit* vy,
  197638. const sp_digit* l, const sp_digit* c, const sp_point_1024* q,
  197639. sp_digit* t, int dbl)
  197640. {
  197641. sp_digit* rx = t + 4 * 2 * 32;
  197642. /* v = v^2 */
  197643. if (dbl) {
  197644. sp_1024_proj_sqr_32(vx, vy, t);
  197645. }
  197646. /* rx = l * q.x + c */
  197647. sp_1024_mont_mul_32(rx, l, q->x, p1024_mod, p1024_mp_mod);
  197648. sp_1024_mont_add_32(rx, rx, c, p1024_mod);
  197649. /* v = v^2 * r */
  197650. sp_1024_proj_mul_32(vx, vy, rx, q->y, t);
  197651. }
  197652. /* Operations to perform based on order - 1.
  197653. * Sliding window. Start at bottom and stop when bottom bit is one.
  197654. * Subtract if top bit in window is one.
  197655. * Width of 6 bits.
  197656. * Pairs: #dbls, add/subtract window value
  197657. */
  197658. static const signed char sp_1024_order_op_pre[] = {
  197659. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  197660. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  197661. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  197662. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  197663. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  197664. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  197665. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  197666. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  197667. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  197668. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  197669. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  197670. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  197671. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  197672. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  197673. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  197674. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  197675. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  197676. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  197677. -3, 1,
  197678. };
  197679. /*
  197680. * Generate table for pairing.
  197681. *
  197682. * Calculate the graident (l) and constant (c) at each step of the way.
  197683. * Sliding window. Start at bottom and stop when bottom bit is one.
  197684. * Subtract if top bit in window is one.
  197685. * Width of 6 bits.
  197686. *
  197687. * pm [in] Point to generate table for.
  197688. * table [in] Generated table.
  197689. * len [in,out] On in, the size of the buffer.
  197690. * On out, length of table generated.
  197691. * @return 0 on success.
  197692. * LENGTH_ONLY_E when table is NULL and only length returned.
  197693. * BUFFER_E when len is too small.
  197694. * MEMORY_E when dynamic memory allocation fauls.
  197695. */
  197696. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  197697. word32* len)
  197698. {
  197699. int err = 0;
  197700. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197701. !defined(WOLFSSL_SP_NO_MALLOC)
  197702. sp_digit* td = NULL;
  197703. sp_digit* t;
  197704. sp_point_1024* pre_p;
  197705. #else
  197706. sp_digit t[6 * 2 * 32];
  197707. sp_point_1024 pre_p[16];
  197708. sp_point_1024 pd;
  197709. sp_point_1024 cd;
  197710. sp_point_1024 negd;
  197711. #endif
  197712. sp_point_1024* p = NULL;
  197713. sp_point_1024* c = NULL;
  197714. sp_point_1024* neg = NULL;
  197715. int i;
  197716. int j;
  197717. int k;
  197718. sp_table_entry_1024* precomp = (sp_table_entry_1024*)table;
  197719. if (table == NULL) {
  197720. *len = sizeof(sp_table_entry_1024) * 1167;
  197721. err = LENGTH_ONLY_E;
  197722. }
  197723. if ((err == MP_OKAY) &&
  197724. (*len < (int)(sizeof(sp_table_entry_1024) * 1167))) {
  197725. err = BUFFER_E;
  197726. }
  197727. if (err == MP_OKAY) {
  197728. err = sp_1024_point_new_32(NULL, pd, p);
  197729. }
  197730. if (err == MP_OKAY) {
  197731. err = sp_1024_point_new_32(NULL, cd, c);
  197732. }
  197733. if (err == MP_OKAY) {
  197734. err = sp_1024_point_new_32(NULL, negd, neg);
  197735. }
  197736. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197737. !defined(WOLFSSL_SP_NO_MALLOC)
  197738. if (err == MP_OKAY) {
  197739. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 32 * 2 + 16 * sizeof(sp_point_1024), NULL,
  197740. DYNAMIC_TYPE_TMP_BUFFER);
  197741. if (td == NULL) {
  197742. err = MEMORY_E;
  197743. }
  197744. }
  197745. #endif
  197746. if (err == MP_OKAY) {
  197747. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197748. !defined(WOLFSSL_SP_NO_MALLOC)
  197749. t = td;
  197750. pre_p = (sp_point_1024*)(td + 6 * 32 * 2);
  197751. #endif
  197752. sp_1024_point_from_ecc_point_32(p, pm);
  197753. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  197754. }
  197755. if (err == MP_OKAY) {
  197756. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  197757. }
  197758. if (err == MP_OKAY) {
  197759. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  197760. neg->infinity = 0;
  197761. c->infinity = 0;
  197762. /* Generate pre-computation table: 1, 3, ... , 31 */
  197763. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  197764. /* [2]P for adding */
  197765. sp_1024_proj_point_dbl_32(c, p, t);
  197766. /* 1, 3, ... */
  197767. for (i = 1; i < 16; i++) {
  197768. sp_1024_proj_point_add_32(&pre_p[i], &pre_p[i-1], c, t);
  197769. sp_1024_mont_map_32(&pre_p[i], t);
  197770. }
  197771. k = 0;
  197772. j = sp_1024_order_op_pre[0] / 2;
  197773. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  197774. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  197775. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x, c->y, t);
  197776. k++;
  197777. sp_1024_proj_point_dbl_32(c, c, t);
  197778. sp_1024_mont_map_32(c, t);
  197779. }
  197780. for (i = 2; i < 290; i += 2) {
  197781. j = sp_1024_order_op_pre[i];
  197782. if (j > 0) {
  197783. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  197784. pre_p[j/2].x, pre_p[j/2].y, c->x, c->y, t);
  197785. k++;
  197786. sp_1024_proj_point_add_32(c, c, &pre_p[j/2], t);
  197787. sp_1024_mont_map_32(c, t);
  197788. }
  197789. else {
  197790. XMEMCPY(neg->x, pre_p[-j / 2].x, sizeof(pre_p->x));
  197791. sp_1024_mont_sub_32(neg->y, p1024_mod, pre_p[-j / 2].y,
  197792. p1024_mod);
  197793. XMEMCPY(neg->z, pre_p[-j / 2].z, sizeof(pre_p->z));
  197794. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  197795. neg->x, neg->y, c->x, c->y, t);
  197796. k++;
  197797. sp_1024_proj_point_add_32(c, c, neg, t);
  197798. sp_1024_mont_map_32(c, t);
  197799. }
  197800. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  197801. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x, c->y, t);
  197802. k++;
  197803. sp_1024_proj_point_dbl_32(c, c, t);
  197804. sp_1024_mont_map_32(c, t);
  197805. }
  197806. }
  197807. *len = sizeof(sp_table_entry_1024) * 1167;
  197808. }
  197809. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197810. !defined(WOLFSSL_SP_NO_MALLOC)
  197811. if (td != NULL) {
  197812. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  197813. }
  197814. #endif
  197815. sp_1024_point_free_32(neg, 1, NULL);
  197816. sp_1024_point_free_32(c, 1, NULL);
  197817. sp_1024_point_free_32(p, 1, NULL);
  197818. return err;
  197819. }
  197820. /*
  197821. * Calculate r = pairing <P, Q>.
  197822. *
  197823. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  197824. *
  197825. * Sliding window. Start at bottom and stop when bottom bit is one.
  197826. * Subtract if top bit in window is one.
  197827. * Width of 6 bits.
  197828. * Pre-generate values in window (1, 3, ...) - only V.
  197829. * Table contains all gradient l and a constant for each point on the path.
  197830. *
  197831. * @param [in] pm First point on E(F_p)[q].
  197832. * @param [in] qm Second point on E(F_p)[q].
  197833. * @param [in] res Result of calculation.
  197834. * @param [in] table Precomputed table of values.
  197835. * @param [in] len Length of precomputed table of values in bytes.
  197836. * @return 0 on success.
  197837. * @return MEMORY_E when dynamic memory allocation fails.
  197838. */
  197839. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  197840. mp_int* res, const byte* table, word32 len)
  197841. {
  197842. int err = 0;
  197843. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197844. !defined(WOLFSSL_SP_NO_MALLOC)
  197845. sp_digit* td = NULL;
  197846. sp_digit* t;
  197847. sp_digit* vx;
  197848. sp_digit* vy;
  197849. sp_digit (*pre_vx)[64];
  197850. sp_digit (*pre_vy)[64];
  197851. sp_digit (*pre_nvy)[64];
  197852. #else
  197853. sp_digit t[6 * 2 * 32];
  197854. sp_digit vx[2 * 32];
  197855. sp_digit vy[2 * 32];
  197856. sp_digit pre_vx[16][64];
  197857. sp_digit pre_vy[16][64];
  197858. sp_digit pre_nvy[16][64];
  197859. sp_point_1024 pd;
  197860. sp_point_1024 qd;
  197861. sp_point_1024 cd;
  197862. #endif
  197863. sp_point_1024* p = NULL;
  197864. sp_point_1024* q = NULL;
  197865. sp_point_1024* c = NULL;
  197866. sp_digit* r = NULL;
  197867. int i;
  197868. int j;
  197869. int k;
  197870. const sp_table_entry_1024* precomp = (const sp_table_entry_1024*)table;
  197871. if (len < (int)(sizeof(sp_table_entry_1024) * 1167)) {
  197872. err = BUFFER_E;
  197873. }
  197874. if (err == MP_OKAY) {
  197875. err = sp_1024_point_new_32(NULL, pd, p);
  197876. }
  197877. if (err == MP_OKAY) {
  197878. err = sp_1024_point_new_32(NULL, qd, q);
  197879. }
  197880. if (err == MP_OKAY) {
  197881. err = sp_1024_point_new_32(NULL, cd, c);
  197882. }
  197883. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197884. !defined(WOLFSSL_SP_NO_MALLOC)
  197885. if (err == MP_OKAY) {
  197886. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 56 * 32 * 2, NULL,
  197887. DYNAMIC_TYPE_TMP_BUFFER);
  197888. if (td == NULL) {
  197889. err = MEMORY_E;
  197890. }
  197891. }
  197892. #endif
  197893. if (err == MP_OKAY) {
  197894. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197895. !defined(WOLFSSL_SP_NO_MALLOC)
  197896. t = td;
  197897. vx = td + 6 * 32 * 2;
  197898. vy = td + 7 * 32 * 2;
  197899. pre_vx = (sp_digit(*)[64])(td + 8 * 32 * 2);
  197900. pre_vy = (sp_digit(*)[64])(td + 24 * 32 * 2);
  197901. pre_nvy = (sp_digit(*)[64])(td + 40 * 32 * 2);
  197902. #endif
  197903. r = vy;
  197904. sp_1024_point_from_ecc_point_32(p, pm);
  197905. sp_1024_point_from_ecc_point_32(q, qm);
  197906. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  197907. }
  197908. if (err == MP_OKAY) {
  197909. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  197910. }
  197911. if (err == MP_OKAY) {
  197912. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  197913. }
  197914. if (err == MP_OKAY) {
  197915. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  197916. }
  197917. if (err == MP_OKAY) {
  197918. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  197919. }
  197920. if (err == MP_OKAY) {
  197921. /* Generate pre-computation table: 1, 3, ... , 31 */
  197922. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  197923. pre_vx[0][0] = 1;
  197924. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  197925. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  197926. /* [2]P for adding */
  197927. XMEMCPY(c, p, sizeof(sp_point_1024));
  197928. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  197929. vx[0] = 1;
  197930. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  197931. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  197932. /* 3, 5, ... */
  197933. for (i = 1; i < 16; i++) {
  197934. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  197935. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  197936. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  197937. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  197938. q, p, t, 0);
  197939. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i],
  197940. p1024_mod);
  197941. }
  197942. XMEMCPY(c->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  197943. c->infinity = 0;
  197944. j = sp_1024_order_op_pre[0] / 2;
  197945. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  197946. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  197947. k = 0;
  197948. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  197949. /* Accumulate line into v and double point. */
  197950. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  197951. precomp[k].y, q, t, 1);
  197952. k++;
  197953. }
  197954. for (i = 2; i < 290; i += 2) {
  197955. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  197956. precomp[k].y, q, t, 0);
  197957. k++;
  197958. j = sp_1024_order_op_pre[i];
  197959. if (j > 0) {
  197960. j /= 2;
  197961. /* Accumulate line into v. */
  197962. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  197963. }
  197964. else {
  197965. j = -j / 2;
  197966. /* Accumulate line into v. */
  197967. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  197968. }
  197969. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  197970. /* Accumulate line into v and double point. */
  197971. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  197972. precomp[k].y, q, t, 1);
  197973. k++;
  197974. }
  197975. }
  197976. /* Final exponentiation */
  197977. sp_1024_proj_sqr_32(vx, vy, t);
  197978. sp_1024_proj_sqr_32(vx, vy, t);
  197979. /* Convert from PF_p[q] to F_p */
  197980. sp_1024_mont_inv_32(vx, vx, t);
  197981. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  197982. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  197983. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  197984. err = sp_1024_to_mp(r, res);
  197985. }
  197986. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  197987. !defined(WOLFSSL_SP_NO_MALLOC)
  197988. if (td != NULL) {
  197989. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  197990. }
  197991. #endif
  197992. sp_1024_point_free_32(c, 1, NULL);
  197993. sp_1024_point_free_32(q, 1, NULL);
  197994. sp_1024_point_free_32(p, 1, NULL);
  197995. return err;
  197996. }
  197997. #endif /* WOLFSSL_SP_SMALL */
  197998. /* Returns 1 if the number of zero.
  197999. * Implementation is constant time.
  198000. *
  198001. * a Number to check.
  198002. * returns 1 if the number is zero and 0 otherwise.
  198003. */
  198004. static int sp_1024_iszero_32(const sp_digit* a)
  198005. {
  198006. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  198007. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  198008. a[16] | a[17] | a[18] | a[19] | a[20] | a[21] | a[22] | a[23] |
  198009. a[24] | a[25] | a[26] | a[27] | a[28] | a[29] | a[30] | a[31]) == 0;
  198010. }
  198011. #ifdef HAVE_ECC_CHECK_KEY
  198012. /* Read big endian unsigned byte array into r.
  198013. *
  198014. * r A single precision integer.
  198015. * size Maximum number of bytes to convert
  198016. * a Byte array.
  198017. * n Number of bytes in array to read.
  198018. */
  198019. static void sp_1024_from_bin(sp_digit* r, int size, const byte* a, int n)
  198020. {
  198021. int i;
  198022. int j = 0;
  198023. word32 s = 0;
  198024. r[0] = 0;
  198025. for (i = n-1; i >= 0; i--) {
  198026. r[j] |= (((sp_digit)a[i]) << s);
  198027. if (s >= 24U) {
  198028. r[j] &= 0xffffffff;
  198029. s = 32U - s;
  198030. if (j + 1 >= size) {
  198031. break;
  198032. }
  198033. r[++j] = (sp_digit)a[i] >> s;
  198034. s = 8U - s;
  198035. }
  198036. else {
  198037. s += 8U;
  198038. }
  198039. }
  198040. for (j++; j < size; j++) {
  198041. r[j] = 0;
  198042. }
  198043. }
  198044. /* Check that the x and y oridinates are a valid point on the curve.
  198045. *
  198046. * point EC point.
  198047. * heap Heap to use if dynamically allocating.
  198048. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  198049. * not on the curve and MP_OKAY otherwise.
  198050. */
  198051. static int sp_1024_ecc_is_point_32(const sp_point_1024* point,
  198052. void* heap)
  198053. {
  198054. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  198055. sp_digit* t1 = NULL;
  198056. #else
  198057. sp_digit t1[32 * 4];
  198058. #endif
  198059. sp_digit* t2 = NULL;
  198060. sp_int32 n;
  198061. int err = MP_OKAY;
  198062. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  198063. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 4, heap, DYNAMIC_TYPE_ECC);
  198064. if (t1 == NULL)
  198065. err = MEMORY_E;
  198066. #endif
  198067. (void)heap;
  198068. if (err == MP_OKAY) {
  198069. t2 = t1 + 2 * 32;
  198070. sp_1024_sqr_32(t1, point->y);
  198071. (void)sp_1024_mod_32(t1, t1, p1024_mod);
  198072. sp_1024_sqr_32(t2, point->x);
  198073. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  198074. sp_1024_mul_32(t2, t2, point->x);
  198075. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  198076. (void)sp_1024_sub_32(t2, p1024_mod, t2);
  198077. sp_1024_mont_add_32(t1, t1, t2, p1024_mod);
  198078. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  198079. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  198080. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  198081. n = sp_1024_cmp_32(t1, p1024_mod);
  198082. sp_1024_cond_sub_32(t1, t1, p1024_mod, 0 - ((n >= 0) ?
  198083. (sp_digit)1 : (sp_digit)0));
  198084. sp_1024_norm_32(t1);
  198085. if (!sp_1024_iszero_32(t1)) {
  198086. err = MP_VAL;
  198087. }
  198088. }
  198089. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  198090. if (t1 != NULL)
  198091. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  198092. #endif
  198093. return err;
  198094. }
  198095. /* Check that the x and y oridinates are a valid point on the curve.
  198096. *
  198097. * pX X ordinate of EC point.
  198098. * pY Y ordinate of EC point.
  198099. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  198100. * not on the curve and MP_OKAY otherwise.
  198101. */
  198102. int sp_ecc_is_point_1024(const mp_int* pX, const mp_int* pY)
  198103. {
  198104. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  198105. sp_point_1024* pub = NULL;
  198106. #else
  198107. sp_point_1024 pub[1];
  198108. #endif
  198109. const byte one[1] = { 1 };
  198110. int err = MP_OKAY;
  198111. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  198112. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), NULL,
  198113. DYNAMIC_TYPE_ECC);
  198114. if (pub == NULL)
  198115. err = MEMORY_E;
  198116. #endif
  198117. if (err == MP_OKAY) {
  198118. sp_1024_from_mp(pub->x, 32, pX);
  198119. sp_1024_from_mp(pub->y, 32, pY);
  198120. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  198121. err = sp_1024_ecc_is_point_32(pub, NULL);
  198122. }
  198123. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  198124. if (pub != NULL)
  198125. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  198126. #endif
  198127. return err;
  198128. }
  198129. /* Check that the private scalar generates the EC point (px, py), the point is
  198130. * on the curve and the point has the correct order.
  198131. *
  198132. * pX X ordinate of EC point.
  198133. * pY Y ordinate of EC point.
  198134. * privm Private scalar that generates EC point.
  198135. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  198136. * not on the curve, ECC_INF_E if the point does not have the correct order,
  198137. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  198138. * MP_OKAY otherwise.
  198139. */
  198140. int sp_ecc_check_key_1024(const mp_int* pX, const mp_int* pY,
  198141. const mp_int* privm, void* heap)
  198142. {
  198143. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  198144. sp_digit* priv = NULL;
  198145. sp_point_1024* pub = NULL;
  198146. #else
  198147. sp_digit priv[32];
  198148. sp_point_1024 pub[2];
  198149. #endif
  198150. sp_point_1024* p = NULL;
  198151. const byte one[1] = { 1 };
  198152. int err = MP_OKAY;
  198153. /* Quick check the lengs of public key ordinates and private key are in
  198154. * range. Proper check later.
  198155. */
  198156. if (((mp_count_bits(pX) > 1024) ||
  198157. (mp_count_bits(pY) > 1024) ||
  198158. ((privm != NULL) && (mp_count_bits(privm) > 1024)))) {
  198159. err = ECC_OUT_OF_RANGE_E;
  198160. }
  198161. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  198162. if (err == MP_OKAY) {
  198163. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  198164. DYNAMIC_TYPE_ECC);
  198165. if (pub == NULL)
  198166. err = MEMORY_E;
  198167. }
  198168. if (err == MP_OKAY && privm) {
  198169. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  198170. DYNAMIC_TYPE_ECC);
  198171. if (priv == NULL)
  198172. err = MEMORY_E;
  198173. }
  198174. #endif
  198175. if (err == MP_OKAY) {
  198176. p = pub + 1;
  198177. sp_1024_from_mp(pub->x, 32, pX);
  198178. sp_1024_from_mp(pub->y, 32, pY);
  198179. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  198180. if (privm)
  198181. sp_1024_from_mp(priv, 32, privm);
  198182. /* Check point at infinitiy. */
  198183. if ((sp_1024_iszero_32(pub->x) != 0) &&
  198184. (sp_1024_iszero_32(pub->y) != 0)) {
  198185. err = ECC_INF_E;
  198186. }
  198187. }
  198188. /* Check range of X and Y */
  198189. if ((err == MP_OKAY) &&
  198190. ((sp_1024_cmp_32(pub->x, p1024_mod) >= 0) ||
  198191. (sp_1024_cmp_32(pub->y, p1024_mod) >= 0))) {
  198192. err = ECC_OUT_OF_RANGE_E;
  198193. }
  198194. if (err == MP_OKAY) {
  198195. /* Check point is on curve */
  198196. err = sp_1024_ecc_is_point_32(pub, heap);
  198197. }
  198198. if (err == MP_OKAY) {
  198199. /* Point * order = infinity */
  198200. err = sp_1024_ecc_mulmod_32(p, pub, p1024_order, 1, 1, heap);
  198201. }
  198202. /* Check result is infinity */
  198203. if ((err == MP_OKAY) && ((sp_1024_iszero_32(p->x) == 0) ||
  198204. (sp_1024_iszero_32(p->y) == 0))) {
  198205. err = ECC_INF_E;
  198206. }
  198207. if (privm) {
  198208. if (err == MP_OKAY) {
  198209. /* Base * private = point */
  198210. err = sp_1024_ecc_mulmod_base_32(p, priv, 1, 1, heap);
  198211. }
  198212. /* Check result is public key */
  198213. if ((err == MP_OKAY) &&
  198214. ((sp_1024_cmp_32(p->x, pub->x) != 0) ||
  198215. (sp_1024_cmp_32(p->y, pub->y) != 0))) {
  198216. err = ECC_PRIV_KEY_E;
  198217. }
  198218. }
  198219. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  198220. if (pub != NULL)
  198221. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  198222. if (priv != NULL)
  198223. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  198224. #endif
  198225. return err;
  198226. }
  198227. #endif
  198228. #endif /* WOLFSSL_SP_1024 */
  198229. #endif /* WOLFSSL_HAVE_SP_ECC */
  198230. #endif /* WOLFSSL_SP_ARM_THUMB_ASM */
  198231. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH | WOLFSSL_HAVE_SP_ECC */